
Цель Axiom — предоставить полностью анонимную, децентрализованную и устойчивую к цензуре платформу социальных сетей. Для этого архитектура строго разделена на протокол и клиенты. Данный репозиторий определяет протокол, смарт-контракт и стандартизированную структуру данных в сети Ethereum Layer 2.
42161https://arb1.arbitrum.io/rpc (или любой кастомный Alchemy/Infura endpoint)0xc11CFf8111e8b1F055eba095Efb679a38Abe6b63(Примечание: Axiom использует UUPS Upgradeable Proxy архитектуру. Все взаимодействия клиентов должны всегда направляться на этот адрес прокси, а не на нижележащий контракт реализации).
Клиентам никогда не следует пытаться читать посты протокола напрямую из переменных состояния смарт-контракта (поскольку сохранение газа является приоритетом, содержимое не хранится в состоянии). Вместо этого клиенты должны индексировать события блокчейна.
Чтобы опубликовать данные в протоколе, клиенты должны отправить транзакцию, вызывающую функцию publishAxiom на прокси-контракте.
Цель Axiom — предоставить полностью анонимную, децентрализованную и устойчивую к цензуре платформу социальных сетей.
Чтобы сделать это возможным, архитектура строго разделена: основа (протокол) и клиенты (программное обеспечение). Этот репозиторий определяет эту основу — смарт-контракт и стандартизированную структуру данных на сети Ethereum Layer 2.
Протокол закладывает основу платформы:
Axiom спроектирован для обеспечения истинной свободы слова для пользователей в странах, где коммуникация ограничена. Протокол различает три уровня безопасности. Предполагается, что пользователи знают, какой уровень безопасности подходит для их конкретной ситуации.
Для всех уровней использование луковой маршрутизации (например, Tor) строго обязательно. Взаимодействие с коммерческими RPC-провайдерами (такими как Infura или Alchemy) раскрывает IP-адрес отправителя в открытом виде. Чтобы закрыть потенциально опасные для жизни уязвимости OPSEC для диссидентов, клиенты обязаны направлять транзакции к RPC-узлам исключительно через сеть Tor.
Для сообщений на Уровне 3 все клиенты должны строго соблюдать следующие криптографические стандарты для обеспечения совместимости и предотвращения компрометации безопасности.
Axiom использует гибридную доставку полезной нагрузки (ABI Split). Чтобы смарт-контракту не приходилось распаковывать дорогостоящие форматы данных, данные разделяются перед передачей:
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 зашифрованы, клиентам теоретически приходится пытаться расшифровать каждое сообщение (пробное дешифрование). Чтобы предотвратить перегрузку ЦП, Axiom использует подсказки сообщений:
HMAC-SHA256(AES_Key, IV) и помещает первые 2 байта как поле m в полезную нагрузку CBOR.Axiom обрабатывает идентификацию с полной прозрачностью: Адрес кошелька L2 (msg.sender) является единственной социальной и финансовой идентичностью. Протокол полностью возлагает на пользователя ответственность за финансовую OPSEC (например, использование миксеров и мостов для анонимного приобретения токенов на газ).
Действие по обновлению профиля (t: 0) ведёт себя по-разному в зависимости от выбранного уровня безопасности:
@Dissident99).Axiom полагается на ончейн-проверку с сложностью O(1). Чтобы поддерживать затраты на газ на абсолютном минимуме, смарт-контракт выполняет только базовые криптографические проверки. Все ресурсоёмкие проверки содержимого выносятся на сторону клиентов (Layer 2).
Контракт действует как неподкупный вышибала. Если полезная нагрузка не соответствует строгим правилам, транзакция отменяется (revert).
// 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-адреса или типичные медиа-теги, пост полностью блокируется.Axiom развёрнут в сети Ethereum Layer 2 (L2) (например, Arbitrum Nova).
Чтобы избежать перегрузки мобильных устройств (время автономной работы, ограничения хранилища, ограничения WebAssembly для Argon2id), Axiom поддерживает высокопроизводительную архитектуру клиента:
Клиенты не загружают всё состояние блокчейна. Они фильтруют событие AxiomPost смарт-контракта, которое содержит все необходимые данные в открытом виде (Отправитель, Уровень, IV, CBOR, Временная метка).
Поскольку узлы Ethereum со временем будут отбрасывать исторические данные (события старше 365 дней) в соответствии с EIP-4444, протокол рекомендует, чтобы локальные Axiom Core служили децентрализованными архивами, сохраняя базы данных постоянно.
Чтобы проиллюстрировать, как архитектура работает на практике, вот полный проход по жизненному циклу.
Сценарий: Алиса хочет опубликовать сообщение "Встреча в 20:00" в подканале "AxiomDev". Группа ранее договорилась офлайн о пароле "Secret123".
Axiom Core Алисы выполняет вычислительно сложную работу:
0x12ab34cd56ef789012ab34cd).m: "0xa1b2").Поскольку уровень и IV передаются напрямую в контракт, они исключаются из объекта CBOR.
Внутреннее представление JSON:
{
"t": 1,
"c": "0x8a4f...",
"h": ["0x9b5e..."],
"m": "0xa1b2"
}
Этот JSON сжимается в сырой массив байтов CBOR (0xa3617401...) для экономии газа.
Алиса вызывает функцию контракта. Важно: вызов строго направляется через Tor!
(Примеры для L3 и L1:)
// Пример 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
);
Затем смарт-контракт генерирует событие:
Event: AxiomPost(Sender: 0xAlice..., Level: 3, IV: 0x12ab..., CBOR: 0xa361..., Timestamp: 1710425890)
Axiom Core Боба прослушивает блокчейн и получает событие.
Level 3 и распаковывает CBOR, чтобы получить доступ к содержимому, тегам и подсказке m.m по сохранённым паролям Боба.