
Axiom의 목표는 완전히 익명적이고, 탈중앙화되어 있으며, 검열에 저항하는 소셜 미디어 플랫폼을 제공하는 것입니다. 이를 가능하게 하기 위해 아키텍처는 프로토콜과 클라이언트로 엄격하게 분할됩니다. 이 저장소는 이더리움 레이어 2 네트워크 상에서 프로토콜, 스마트 계약, 그리고 표준화된 데이터 구조를 정의합니다.
42161https://arb1.arbitrum.io/rpc (또는 사용자 정의 Alchemy/Infura 엔드포인트)0xc11CFf8111e8b1F055eba095Efb679a38Abe6b63(참고: Axiom은 UUPS 업그레이드 가능한 프록시 아키텍처를 사용합니다. 모든 클라이언트 상호 작용은 항상 이 프록시 주소로 이루어져야 하며, 기본 구현 계약으로는 절대 안 됩니다).
클라이언트는 절대 스마트 계약 상태 변수에서 직접 프로토콜 게시물을 읽으려 해서는 안 됩니다 (가스 절약이 우선이므로 콘텐츠는 상태에 저장되지 않습니다). 대신, 클라이언트는 블록체인 이벤트를 인덱싱해야 합니다.
프로토콜에 데이터를 게시하려면 클라이언트는 프록시 계약에서 publishAxiom 함수를 호출하는 온체인 트랜잭션을 제출해야 합니다.
Axiom의 목표는 완전히 익명이고 분산화된 검열 저항 소셜 미디어 플랫폼을 제공하는 것입니다.
이를 가능하게 하기 위해 아키텍처는 엄격하게 나뉩니다: 기반(프로토콜)과 클라이언트(소프트웨어). 이 저장소는 그 기반, 즉 이더리움 레이어 2 네트워크 상의 스마트 계약과 표준화된 데이터 구조를 정의합니다.
프로토콜은 플랫폼의 기반을 구축합니다:
Axiom은 통신이 제한된 국가의 사용자에게 진정한 표현의 자유를 가능하게 하도록 설계되었습니다. 프로토콜은 세 가지 보안 수준을 구분합니다. 사용자가 자신의 특정 상황에 적합한 보안 수준을 알고 있다고 가정합니다.
모든 수준에 대해, Onion 라우팅(예: Tor)은 엄격히 필수입니다. 상용 RPC 제공업체(예: Infura 또는 Alchemy)와 통신하면 발신자의 IP 주소가 평문으로 누출됩니다. 반체제 인사에게 생명을 위협할 수 있는 OPSEC 취약점을 막기 위해, 클라이언트는 트랜잭션을 Tor 네트워크를 통해서만 RPC 노드로 라우팅해야 합니다.
레벨 3 메시지의 경우, 모든 클라이언트는 상호 운용성을 보장하고 보안을 손상시키지 않기 위해 다음 암호화 표준을 엄격히 준수해야 합니다.
Axiom은 하이브리드 페이로드 전달(ABI 분할)을 사용합니다. 스마트 계약이 비싼 데이터 형식을 풀어야 하는 것을 방지하기 위해 데이터는 전송 전에 분리됩니다:
uint8 _level) 및 초기화 벡터(bytes _iv)는 스마트 계약에 직접 매개변수로 전달되며, 계약이 보안 규칙을 적용하는 데 필요합니다.Axiom은 바이트를 절약하기 위해 단일 문자를 키로 사용합니다. 작성자(msg.sender) 및 타임스탬프(block.timestamp)는 스마트 계약이 어쨌든 변조 방지 방식으로 이러한 값을 추출하므로 생략됩니다.
t (Type): 정수. 동작 유형.c (Content): 문자열/바이트. 텍스트, 이름 또는 암호문.h (Hashtags/Tags): 배열. 선택 사항. 분류(하위 채널)에 사용됨.m (Message Hint): 바이트(길이 2). 레벨 3 전용. 퍼지 버케팅에 사용되는 2바이트 HMAC 해시.r (Reply-To): 바이트. 선택 사항. 참조된 게시물의 트랜잭션 해시.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바이트를 CBOR 페이로드의 m 필드로 배치합니다.Axiom은 완전한 투명성으로 신원을 처리합니다: L2 지갑 주소(msg.sender)는 유일한 사회적 및 금융 신원입니다. 프로토콜은 금융 OPSEC에 대한 책임을 전적으로 사용자에게 이전합니다(예: 믹서 및 브리지를 사용하여 익명으로 가스 토큰 확보).
프로필 업데이트 동작(t: 0)은 선택한 보안 수준에 따라 다르게 동작합니다:
@Dissident99로 공개 평판 구축).Axiom은 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)을 스캔합니다. URL, IP 주소 또는 일반적인 미디어 태그가 감지되면 게시물이 완전히 차단됩니다.Axiom은 이더리움 레이어 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...)로 압축됩니다.
Alice가 계약 함수를 트리거합니다. 중요: 호출은 엄격히 Tor를 통해 라우팅됩니다!
(L3 및 L1 예제:)
// 예제 1: 암호화된 레벨 3 게시물을 위한 스마트 계약 호출
await axiomContract.publishAxiom(
3, // _level: 3
"0x12ab34cd56ef789012ab34cd", // _iv: 12바이트 16진수 문자열 필요
"0xa3617401616358208a4f..." // _cbor: 압축된 CBOR 16진수 문자열
);
// 예제 2: 공개 레벨 1 게시물을 위한 스마트 계약 호출
await axiomContract.publishAxiom(
1, // _level: 1
"0x", // _iv: 엄격히 빈 바이트 배열
"0xa361740161634c48656c6c6f204178..." // _cbor: 압축된 CBOR 16진수 문자열
);
스마트 계약은 이벤트를 방출합니다:
Event: AxiomPost(Sender: 0xAlice..., Level: 3, IV: 0x12ab..., CBOR: 0xa361..., Timestamp: 1710425890)
Bob의 Axiom Core는 블록체인을 수신하고 이벤트를 받습니다.
Level 3을 감지하고 CBOR을 풀어 콘텐츠, 태그 및 힌트 m에 접근합니다.m을 Bob의 저장된 비밀번호와 확인합니다.