
O objetivo do Axiom é fornecer uma plataforma de mídia social completamente anônima, descentralizada e resistente à censura. Para tornar isso possível, a arquitetura é estritamente dividida entre o protocolo e os clientes. Este repositório define o protocolo e o contrato inteligente e uma estrutura de dados padronizada em uma rede Ethereum Layer 2.
42161https://arb1.arbitrum.io/rpc (ou qualquer endpoint Alchemy/Infura personalizado)0xc11CFf8111e8b1F055eba095Efb679a38Abe6b63(Nota: A Axiom usa uma arquitetura de Proxy Atualizável UUPS. Todas as interações dos clientes devem sempre ser direcionadas a este endereço de Proxy, nunca ao contrato de implementação subjacente).
Os clientes nunca devem tentar ler as postagens do protocolo diretamente das variáveis de estado do contrato inteligente (como preservar gás é uma prioridade, o conteúdo não é armazenado no estado). Em vez disso, os clientes devem indexar os eventos da blockchain.
Para publicar dados no Protocolo, os clientes devem enviar uma transação on-chain chamando a função publishAxiom no contrato Proxy.
O objetivo da Axiom é fornecer uma plataforma de mídia social completamente anônima, descentralizada e resistente à censura.
Para tornar isso possível, a arquitetura é estritamente dividida: a base (o protocolo) e os clientes (o software). Este repositório define essa base—um contrato inteligente e uma estrutura de dados padronizada em uma rede Ethereum Layer 2.
O protocolo estabelece a base da plataforma:
A Axiom é projetada para permitir a verdadeira liberdade de expressão para usuários em países onde a comunicação é restrita. O protocolo distingue três níveis de segurança. Ele assume que os usuários sabem qual nível de segurança é apropriado para sua situação específica.
Para todos os níveis, o Onion Routing (por exemplo, Tor) é estritamente obrigatório. Comunicar-se com provedores RPC comerciais (como Infura ou Alchemy) vaza o endereço IP do remetente em texto puro. Para fechar vulnerabilidades de OPSEC potencialmente fatais para dissidentes, os clientes são obrigados a rotear transações para os nós RPC exclusivamente através da rede Tor.
Para mensagens no Nível 3, todos os clientes devem aderir estritamente aos seguintes padrões criptográficos para garantir interoperabilidade e evitar comprometer a segurança.
A Axiom utiliza uma entrega de payload híbrida (Divisão ABI). Para evitar que o contrato inteligente tenha que descompactar formatos de dados caros, os dados são separados antes da transmissão:
uint8 _level) e o vetor de inicialização (bytes _iv) são passados como parâmetros diretos para o contrato inteligente, pois ele os necessita para aplicar suas regras de segurança.A Axiom usa letras únicas como chaves para economizar bytes. O autor (msg.sender) e o timestamp (block.timestamp) são omitidos, pois o contrato inteligente extrai esses valores de forma à prova de adulteração.
t (Tipo): Inteiro. O tipo de ação.c (Conteúdo): String/Bytes. O texto, nome ou texto cifrado.h (Hashtags/Tags): Array. Opcional. Usado para categorização (subcanais).m (Dica de Mensagem): Bytes (comprimento de 2). Apenas Nível 3. Um hash HMAC de 2 bytes usado para agrupamento difuso (fuzzy bucketing).r (Resposta a): Bytes. Opcional. O hash da transação de uma postagem referenciada.t Field)0 = Atualização de Perfil (Vincula o endereço da carteira a um nome legível no campo c)1 = Postagem (Mensagem padrão)2 = Resposta (r requer o hash da postagem original)3 = Curtir (r requer o hash da postagem)4 = Descurtir (Reverte o Tipo 3)5 = Retweet / Repostagem (r requer o hash da postagem)6 = Desfazer Retweet (Reverte o Tipo 5)h Field)c). Para observadores externos, as tags são, portanto, completamente invisíveis (Roteamento Escuro).m Field)Como as tags são criptografadas no Nível 3, os clientes teoricamente precisam tentar descriptografar cada mensagem individual (Descriptografia de Tentativa). Para evitar sobrecarga de CPU, a Axiom usa Dicas de Mensagem:
HMAC-SHA256(AES_Key, IV) e coloca os primeiros 2 bytes como campo m no payload CBOR.A Axiom lida com a identidade com total transparência: O endereço da carteira L2 (msg.sender) é a única identidade social e financeira. O protocolo transfere a responsabilidade pela OPSEC financeira inteiramente para o usuário (por exemplo, o uso de mixers e pontes para adquirir tokens de gás anonimamente).
A ação de atualização de perfil (t: 0) comporta-se de forma diferente dependendo do nível de segurança escolhido:
@Dissidente99).A Axiom depende de validação on-chain com complexidade O(1). Para manter os custos de gás no mínimo absoluto, o contrato inteligente realiza apenas verificações criptográficas básicas. Todas as validações de conteúdo intensivas em recursos são transferidas para os clientes (Camada 2).
O contrato atua como um segurança incorruptível. Se um payload não aderir às regras estritas, a transação é revertida.
// 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=Nova, 1=CaminhoA(Nivel1), 2=CaminhoB(Nivel2/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, "Nivel invalido");
uint8 requiredPath = (_level == 1) ? 1 : 2;
uint8 currentPath = walletPath[msg.sender];
if (currentPath == 0) {
require(msg.value >= entryFee, "Anti-Sybil: Taxa de entrada insuficiente");
walletPath[msg.sender] = requiredPath;
} else {
require(msg.value == 0, "Taxa ja paga");
require(currentPath == requiredPath, "Violacao de OPSEC: Carteira esta contaminada");
}
if (_level == 3) {
require(_iv.length == 12, "Nivel 3 requer estritamente um IV de 12 bytes");
} else {
require(_iv.length == 0, "Niveis 1 e 2 requerem estritamente IV vazio");
}
emit AxiomPost(msg.sender, _level, _iv, _cbor, block.timestamp);
}
function withdraw() external onlyOwner {
payable(owner()).transfer(address(this).balance);
}
}
Se uma postagem violar as regras do protocolo, o cliente deve descartá-la silenciosamente (Drop Local).
c) das mensagens de Nível 2. Se URLs, endereços IP ou tags típicas de mídia forem detectados, a postagem é completamente bloqueada.A Axiom é implantada em uma rede Ethereum Layer 2 (L2) (por exemplo, Arbitrum Nova).
Para evitar sobrecarregar dispositivos móveis (vida útil da bateria, limitações de armazenamento, limites do WebAssembly para Argon2id), a Axiom impõe uma arquitetura de cliente de alto desempenho:
Os clientes não baixam todo o estado da blockchain. Eles filtram pelo evento AxiomPost do contrato inteligente, que contém todos os dados necessários em texto puro (Remetente, Nível, IV, CBOR, Timestamp).
Como os nós Ethereum eventualmente descartarão dados históricos (eventos com mais de 365 dias) de acordo com o EIP-4444, o protocolo recomenda que Axiom Cores locais sirvam como arquivos descentralizados, armazenando os bancos de dados permanentemente.
Para ilustrar como a arquitetura funciona na prática, aqui está uma execução completa do ciclo de vida.
Cenário: Alice quer postar a mensagem "Reunião às 20h" no subcanal "AxiomDev". O grupo concordou previamente offline com a senha "Secret123".
O Axiom Core de Alice lida com o trabalho computacional pesado:
0x12ab34cd56ef789012ab34cd).m: "0xa1b2").Como o nível e o IV são passados diretamente para o contrato, eles são excluídos do objeto CBOR.
Representação JSON Interna:
{
"t": 1,
"c": "0x8a4f...",
"h": ["0x9b5e..."],
"m": "0xa1b2"
}
Este JSON é comprimido em um array de bytes CBOR bruto (0xa3617401...) para economizar gás.
Alice aciona a função do contrato. Importante: A chamada é estritamente roteada através do Tor!
(Exemplos para L3 e L1:)
// Exemplo 1: Cliente chamando o Contrato Inteligente para uma postagem criptografada de Nível 3
await axiomContract.publishAxiom(
3, // _level: 3
"0x12ab34cd56ef789012ab34cd", // _iv: string hex de 12 bytes necessária
"0xa3617401616358208a4f..." // _cbor: string hex CBOR compactada
);
// Exemplo 2: Cliente chamando o Contrato Inteligente para uma postagem pública de Nível 1
await axiomContract.publishAxiom(
1, // _level: 1
"0x", // _iv: array de bytes estritamente vazio
"0xa361740161634c48656c6c6f204178..." // _cbor: string hex CBOR compactada
);
O contrato inteligente então emite o evento:
Event: AxiomPost(Sender: 0xAlice..., Level: 3, IV: 0x12ab..., CBOR: 0xa361..., Timestamp: 1710425890)
O Axiom Core de Bob está ouvindo a blockchain e recebe o evento.
Nível 3 e descompacta o CBOR para acessar o conteúdo, as tags e a dica m.m em relação às senhas armazenadas de Bob.