
هدف Axiom هو توفير منصة تواصل اجتماعي مجهولة تمامًا، لا مركزية، ومقاومة للرقابة. لجعل ذلك ممكنًا، يتم تقسيم البنية الهندسية بشكل صارم بين البروتوكول والعملاء. يحدد هذا المستودع البروتوكول والعقد الذكي وهيكل بيانات موحد على شبكة إيثريوم الطبقة الثانية.
42161https://arb1.arbitrum.io/rpc (أو أي نقطة نهاية مخصصة من Alchemy/Infura)0xc11CFf8111e8b1F055eba095Efb679a38Abe6b63(ملاحظة: يستخدم آكسيوم بنية وكيل قابل للترقية UUPS. يجب دائمًا توجيه جميع تفاعلات العميل إلى عنوان الوكيل هذا، وليس إلى عقد التنفيذ الأساسي).
يجب على العملاء أبدًا محاولة قراءة منشورات البروتوكول مباشرة من متغيرات حالة العقد الذكي (نظرًا لأن الحفاظ على الغاز هو أولوية، لا يتم تخزين المحتوى في الحالة). بدلاً من ذلك، يجب على العملاء فهرسة أحداث البلوكشين.
لنشر البيانات إلى البروتوكول، يجب على العملاء تقديم معاملة على السلسلة تستدعي دالة publishAxiom على عقد الوكيل.
هدف آكسيوم هو توفير منصة تواصل اجتماعي مجهولة بالكامل، لامركزية، ومقاومة للرقابة.
لجعل ذلك ممكنًا، تنقسم البنية بشكل صارم: الأساس (البروتوكول) والعملاء (البرمجيات). يحدد هذا المستودع هذا الأساس — عقد ذكي وهيكل بيانات موحد على شبكة طبقة ثانية من إيثريوم.
يؤسس البروتوكول أساس المنصة:
صمم آكسيوم لتمكين حرية التعبير الحقيقية للمستخدمين في البلدان التي يكون فيها الاتصال مقيدًا. يميز البروتوكول بين ثلاثة مستويات أمان. يفترض أن المستخدمين يعرفون مستوى الأمان المناسب لحالتهم الخاصة.
لجميع المستويات، يعد التوجيه البصلي (مثل Tor) إلزاميًا بشكل صارم. يؤدي التواصل مع مزودي RPC التجاريين (مثل Infura أو Alchemy) إلى تسريب عنوان IP للمرسل بنص عادي. لسد ثغرات OPSEC التي قد تهدد حياة المنشقين، يُطلب من العملاء توجيه المعاملات إلى عقد RPC حصريًا عبر شبكة Tor.
بالنسبة للرسائل في المستوى 3، يجب على جميع العملاء الالتزام الصارم بمعايير التشفير التالية لضمان قابلية التشغيل البيني وتجنب المساس بالأمان.
يستخدم آكسيوم تسليم حمولة هجين (تقسيم ABI). لمنع العقد الذكي من الاضطرار إلى فك تنسيقات البيانات المكلفة، يتم فصل البيانات قبل الإرسال:
uint8 _level) ومتجه التهيئة (bytes _iv) كمعاملات مباشرة إلى العقد الذكي، لأنه يحتاجها لفرض قواعده الأمنية.يستخدم آكسيوم أحرفًا مفردة كمفاتيح لتوفير البايتات. يتم حذف المؤلف (msg.sender) والطابع الزمني (block.timestamp)، حيث يستخرج العقد الذكي هذه القيم بطريقة مقاومة للتلاعب على أي حال.
t (النوع): عدد صحيح. نوع الإجراء.c (المحتوى): سلسلة/بايتات. النص أو الاسم أو النص المشفر.h (الوسوم/العلامات): مصفوفة. اختياري. يُستخدم للتصنيف (قنوات فرعية).m (تلميح الرسالة): بايتات (طول 2). للمستوى 3 فقط. تجزئة HMAC بطول 2 بايت تُستخدم للتجميع التقريبي.r (الرد على): بايتات. اختياري. تجزئة المعاملة لمنشور مشار إليه.t)0 = تحديث الملف الشخصي (يربط عنوان المحفظة باسم قابل للقراءة في الحقل c)1 = منشور (رسالة قياسية)2 = رد (r يتطلب تجزئة المنشور الأصلي)3 = إعجاب (r يتطلب تجزئة المنشور)4 = إلغاء الإعجاب (يلغي النوع 3)5 = إعادة تغريد / إعادة نشر (r يتطلب تجزئة المنشور)6 = إلغاء إعادة التغريد (يلغي النوع 5)h)c). بالنسبة للمراقبين الخارجيين، تكون الوسوم غير مرئية تمامًا (توجيه مظلم).m)نظرًا لأن الوسوم مشفرة في المستوى 3، يجب على العملاء من الناحية النظرية محاولة فك تشفير كل رسالة على حدة (فك تشفير تجريبي). لمنع زيادة تحميل وحدة المعالجة المركزية، يستخدم آكسيوم تلميحات الرسالة:
HMAC-SHA256(AES_Key, IV) ويضع أول 2 بايت كحقل m في حمولة CBOR.يتعامل آكسيوم مع الهوية بشفافية كاملة: عنوان محفظة L2 (msg.sender) هو الهوية الاجتماعية والمالية الوحيدة. ينقل البروتوكول مسؤولية OPSEC المالية بالكامل إلى المستخدم (مثل استخدام الخلاطات والجسور لشراء رموز الغاز بشكل مجهول).
يتصرف إجراء تحديث الملف الشخصي (t: 0) بشكل مختلف اعتمادًا على مستوى الأمان المختار:
@Dissident99).يعتمد آكسيوم على التحقق على السلسلة بتعقيد O(1). للحفاظ على تكاليف الغاز في أدنى حد مطلق، يقوم العقد الذكي فقط بإجراء فحوصات تشفير أساسية. يتم تفريغ جميع عمليات التحقق من المحتوى كثيفة الاستخدام للموارد إلى العملاء (الطبقة 2).
يعمل العقد كحارس غير قابل للفساد. إذا لم تلتزم الحمولة بالقواعد الصارمة، يتم إلغاء المعاملة.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
contract Axiom is Initializable, UUPSUpgradeable, OwnableUpgradeable {
uint256 public entryFee;
mapping(address => uint8) public walletPath; // 0=New, 1=PathA(Level1), 2=PathB(Level2/3)
event AxiomPost(address indexed sender, uint8 level, bytes iv, bytes cbor, uint256 timestamp);
/// @custom:oz-upgrades-unsafe-allow constructor
constructor() {
_disableInitializers();
}
function initialize() initializer public {
__Ownable_init(msg.sender);
entryFee = 0.0001 ether;
}
function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}
function publishAxiom(
uint8 _level,
bytes calldata _iv,
bytes calldata _cbor
) external payable {
require(_level >= 1 && _level <= 3, "Invalid level");
uint8 requiredPath = (_level == 1) ? 1 : 2;
uint8 currentPath = walletPath[msg.sender];
if (currentPath == 0) {
require(msg.value >= entryFee, "Anti-Sybil: Insufficient entry fee");
walletPath[msg.sender] = requiredPath;
} else {
require(msg.value == 0, "Fee already paid");
require(currentPath == requiredPath, "OPSEC Violation: Wallet is tainted");
}
if (_level == 3) {
require(_iv.length == 12, "Level 3 strictly requires a 12-byte IV");
} else {
require(_iv.length == 0, "Level 1 and 2 require strictly empty IV");
}
emit AxiomPost(msg.sender, _level, _iv, _cbor, block.timestamp);
}
function withdraw() external onlyOwner {
payable(owner()).transfer(address(this).balance);
}
}
إذا انتهك منشور قواعد البروتوكول، يجب على العميل تجاهله بصمت (إسقاط محلي).
c) لرسائل المستوى 2. إذا تم اكتشاف عناوين URL أو عناوين IP أو علامات وسائط نموذجية، يتم حظر المنشور بالكامل.تم نشر آكسيوم على شبكة طبقة ثانية من إيثريوم (L2) (مثل Arbitrum Nova).
لتجنب زيادة تحميل الأجهزة المحمولة (عمر البطارية، قيود التخزين، حدود WebAssembly لـ Argon2id)، يفرض آكسيوم بنية عميل عالية الأداء:
لا يقوم العملاء بتنزيل حالة البلوكشين بأكملها. يقومون بتصفية حدث AxiomPost الخاص بالعقد الذكي، والذي يحتوي على جميع البيانات الضرورية بنص عادي (المرسل، المستوى، IV، CBOR، الطابع الزمني).
نظرًا لأن عقد إيثريوم ستتخلص في النهاية من البيانات التاريخية (الأحداث الأقدم من 365 يومًا) وفقًا لـ EIP-4444، يوصي البروتوكول بأن تعمل نوى آكسيوم المحلية كأرشيفات لا مركزية، مخزنة قواعد البيانات بشكل دائم.
لتوضيح كيفية عمل البنية في الممارسة العملية، إليك استعراض كامل لدورة الحياة.
السيناريو: تريد أليس نشر الرسالة "Meeting at 8 PM" في القناة الفرعية "AxiomDev". وافقت المجموعة مسبقًا خارج الإنترنت على كلمة المرور "Secret123".
تتعامل نواة آكسيوم الخاصة بأليس مع المهام الحسابية الثقيلة:
0x12ab34cd56ef789012ab34cd).m: "0xa1b2").نظرًا لأن المستوى و IV يتم تمريرهما مباشرة إلى العقد، يتم استبعادهما من كائن CBOR.
التمثيل الداخلي لـ JSON:
{
"t": 1,
"c": "0x8a4f...",
"h": ["0x9b5e..."],
"m": "0xa1b2"
}
يتم ضغط هذا JSON إلى مصفوفة بايت CBOR خام (0xa3617401...) لتوفير الغاز.
تقوم أليس باستدعاء دالة العقد. مهم: يتم توجيه الاستدعاء بشكل صارم عبر Tor!
(أمثلة لـ L3 و L1:)
// Example 1: Client calling the Smart Contract for an encrypted Level 3 post
await axiomContract.publishAxiom(
3, // _level: 3
"0x12ab34cd56ef789012ab34cd", // _iv: 12 bytes hex string required
"0xa3617401616358208a4f..." // _cbor: packed CBOR hex string
);
// Example 2: Client calling the Smart Contract for a public Level 1 post
await axiomContract.publishAxiom(
1, // _level: 1
"0x", // _iv: strictly empty byte array
"0xa361740161634c48656c6c6f204178..." // _cbor: packed CBOR hex string
);
يقوم العقد الذكي بعد ذلك بإصدار الحدث:
Event: AxiomPost(Sender: 0xAlice..., Level: 3, IV: 0x12ab..., CBOR: 0xa361..., Timestamp: 1710425890)
نواة آكسيوم الخاصة بوب تستمع إلى البلوكشين وتستقبل الحدث.
Level 3 وتفك حزمة CBOR للوصول إلى المحتوى والوسوم والتلميح m.m بطول 2 بايت مقابل كلمات مرور بوب المخزنة.