42161https://arb1.arbitrum.io/rpc(或任何自定义的 Alchemy/Infura 端点)0xc11CFf8111e8b1F055eba095Efb679a38Abe6b63(注意:Axiom 采用 UUPS 可升级代理架构。所有客户端交互必须始终指向此代理地址,而绝不能指向底层实现合约。)
客户端绝不应尝试从智能合约状态变量中直接读取协议帖子(因为优先考虑节省 Gas,内容不存储在状态中)。相反,客户端必须索引区块链事件。
要向协议发布数据,客户端必须提交一笔链上交易,调用代理合约上的 publishAxiom 函数。
Axiom 的目标是提供一个完全匿名、去中心化且抗审查的社交媒体平台。
为了实现这一点,架构严格划分:基础层(协议)和客户端(软件)。此代码仓库定义了该基础层——一个部署在以太坊 Layer 2 网络上的智能合约和一个标准化的数据结构。
该协议确立了平台的基础:
Axiom 旨在让通信受限国家的用户真正实现言论自由。协议区分三种安全级别。它假设用户知道哪种安全级别适合他们的具体情况。
对于所有级别,洋葱路由(例如 Tor)是严格强制要求的。与商业 RPC 提供商(如 Infura 或 Alchemy)通信会以明文方式泄露发送者的 IP 地址。为了关闭持不同政见者可能面临的致命 OPSEC 漏洞,客户端必须通过 Tor 网络将交易路由到 RPC 节点。
对于级别 3 的消息,所有客户端必须严格遵守以下加密标准,以确保互操作性并避免损害安全性。
Axiom 采用混合负载交付(ABI 拆分)。为了避免智能合约解包昂贵的数据格式,数据在传输前被分离:
uint8 _level) 和初始化向量 (bytes _iv) 作为直接参数传递给智能合约,因为合约需要它们来执行其安全规则。Axiom 使用单字母作为键以节省字节。作者 (msg.sender) 和时间戳 (block.timestamp) 被省略,因为智能合约会以防篡改的方式提取这些值。
t(类型):整数。操作的类型。c(内容):字符串/字节。文本、名称或密文。h(标签/话题标签):数组。可选。用于分类(子频道)。m(消息提示):字节(长度为 2)。仅限级别 3。 用于模糊分桶的 2 字节 HMAC 哈希值。r(回复至):字节。可选。被引用帖子的交易哈希。t 字段)0 = 资料更新(将钱包地址链接到字段 c 中的可读名称)1 = 帖子(标准消息)2 = 回复(r 需要原始帖子的哈希)3 = 喜欢(r 需要帖子的哈希)4 = 取消喜欢(撤销类型 3)5 = 转发/转帖(r 需要帖子的哈希)6 = 取消转发(撤销类型 5)h 字段)c) 一样被加密。因此,对于外部观察者来说,标签是完全不可见的(暗路由)。m 字段)由于级别 3 的标签是加密的,理论上客户端必须尝试解密每一条消息(试解密)。为了防止 CPU 过载,Axiom 使用消息提示:
HMAC-SHA256(AES_Key, IV),并将前 2 个字节 作为字段 m 放入 CBOR 负载中。Axiom 以完全透明的方式处理身份:L2 钱包地址 (msg.sender) 是唯一的社会和金融身份。 协议将金融 OPSEC 的责任完全转移给用户(例如,使用混币器和跨链桥来匿名获取 Gas 代币)。
资料更新操作 (t: 0) 根据所选安全级别表现不同:
@Dissident99)。Axiom 依赖于 O(1) 复杂度的链上验证。为了将 Gas 成本保持在绝对最低水平,智能合约仅执行基本的加密检查。所有资源密集型的内容验证都被卸载到客户端(Layer 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)。如果检测到 URL、IP 地址或典型的媒体标签,该帖子将被完全屏蔽。Axiom 部署在以太坊 Layer 2(L2)网络上(例如 Arbitrum Nova)。
为了避免使移动设备过载(电池寿命、存储限制、Argon2id 的 WebAssembly 限制),Axiom 强制采用高性能的客户端架构:
客户端不会下载整个区块链状态。它们会过滤智能合约的 AxiomPost 事件,该事件包含所有必要数据(发送者、级别、IV、CBOR、时间戳)。
由于根据 EIP-4444,以太坊节点最终会丢弃历史数据(超过 365 天的事件),协议建议本地 Axiom Core 作为去中心化归档,永久存储数据库。
为了说明该架构在实际中的运作方式,这里提供一个完整的生命周期演练。
场景: Alice 想在子频道 "AxiomDev" 中发布消息 "Meeting at 8 PM"。该群组此前在离线状态下商定了密码 "Secret123"。
Alice 的 Axiom Core 负责处理计算密集型任务:
0x12ab34cd56ef789012ab34cd)。m: "0xa1b2")。由于级别和 IV 直接传递给合约,因此它们被排除在 CBOR 对象之外。
内部 JSON 表示:
{
"t": 1,
"c": "0x8a4f...",
"h": ["0x9b5e..."],
"m": "0xa1b2"
}
此 JSON 被压缩为原始 CBOR 字节数组(0xa3617401...)以节省 Gas。
Alice 触发合约函数。重要提示:该调用严格通过 Tor 路由!
(级别 3 和级别 1 的示例:)
// 示例 1:客户端调用智能合约发布加密的级别 3 帖子
await axiomContract.publishAxiom(
3, // _level: 3
"0x12ab34cd56ef789012ab34cd", // _iv: 需要的 12 字节十六进制字符串
"0xa3617401616358208a4f..." // _cbor: 压缩后的 CBOR 十六进制字符串
);
// 示例 2:客户端调用智能合约发布公开的级别 1 帖子
await axiomContract.publishAxiom(
1, // _level: 1
"0x", // _iv: 严格空字节数组
"0xa361740161634c48656c6c6f204178..." // _cbor: 压缩后的 CBOR 十六进制字符串
);
智能合约随后发出事件:
事件:AxiomPost(发送者: 0xAlice..., 级别: 3, IV: 0x12ab..., CBOR: 0xa361..., 时间戳: 1710425890)
Bob 的 Axiom Core 正在监听区块链并收到该事件。