Skip to main contentA-REX Foundation

Ajuda · 38

Verificar que as informações de um lote não foram alteradas

Cada versão das informações de um lote tem uma impressão digital gravada no registro. Qualquer pessoa pode recalculá-la a partir das informações publicadas e comparar, sem conta e sem depender da A-REX.

Quando um lote é registrado, a A-REX publica as informações dele (produto, quantidade, código do lote, origem, datas) e grava uma impressão digital delas no registro. A impressão digital é um código curto calculado a partir do conteúdo exato: mude uma letra ou um dígito e ela deixa de coincidir. Assim, um comprador, um auditor ou uma autoridade pode conferir, sem conta e sem depender da A-REX, que as informações que lê são as que a sua empresa registrou, e desde quando.

A impressão digital mostra que as informações não foram alteradas depois de registradas. Ela não mostra que o que foi declarado é verdade: o registro guarda quem declarou o quê, e quando.

O que a impressão digital cobre

  • Todos os campos das informações publicadas do lote, exatamente como foram registrados.
  • Uma única versão. Uma correção publica uma nova versão com a sua própria impressão digital, gravada com a correção; a versão anterior e a impressão digital dela continuam registradas e ainda podem ser conferidas. Veja Corrigir as informações de um lote.
  • Não os arquivos dos certificados: cada um tem a sua própria impressão digital. Veja Certificados.

Onde o console a mostra

  1. Abra o lote em Lotes.
  2. Abra Detalhes técnicos no fim da página do lote. O valor longo que começa com 0x, logo acima de Abrir o registro público, é a impressão digital gravada para o lote.
  3. Abrir o registro público abre as informações publicadas, que qualquer pessoa pode ler. O endereço web termina com a mesma impressão digital.

Proprietários e administradores também a encontram em Lotes (técnico), na página de cada lote.

Como qualquer pessoa confere

  1. Baixe as informações publicadas do endereço público, o que Abrir o registro público abre. Elas não contêm dados pessoais.
  2. Coloque-as na forma padrão, a forma canônica da RFC 8785: os campos numa ordem fixa e sem espaços a mais, para que as mesmas informações sempre deem o mesmo texto.
  3. Calcule a impressão digital desse texto com o método keccak-256.
  4. Compare com a impressão digital gravada para o lote. O mesmo valor significa que as informações são as registradas. Qualquer outro valor significa que a cópia difere do que foi registrado.

Os seus desenvolvedores ou auditores podem fazer isso com poucas linhas de código; a próxima seção mostra como.

Para desenvolvedores e auditores

Esta seção usa termos técnicos. A impressão digital é o metadataHash do batch, exibido como Hash dos metadados em Detalhes técnicos: o keccak256 da serialização canônica RFC 8785 (JCS) do documento de metadados, calculado sobre os bytes UTF-8 (AREX-CORE §3.5). O documento é servido em GET /m/{empresa}/{metadataHash}.json na API da A-REX, o uri do batch na chain, assim que o batch está no registro (rascunhos respondem 404). A resposta é o próprio texto canônico, legível a partir de qualquer origem.

Em JavaScript (Node 18 ou posterior), com o pacote canonicalize (RFC 8785) e viem:

import canonicalize from 'canonicalize';
import { keccak256, toBytes } from 'viem';


const url = 'https://API_HOST/m/fazenda-boa-vista/0x5c1e…9a2b.json'; // Abrir o registro público
const recorded = '0x5c1e…9a2b';                                 // Hash dos metadados do lote


const doc = await (await fetch(url)).json();
const computed = keccak256(toBytes(canonicalize(doc)));
console.log(computed === recorded.toLowerCase() ? 'inalterado' : 'diferente');

Com ethers v6 o último passo fica keccak256(toUtf8Bytes(canonicalize(doc))). Canonicalizar importa quando você confere uma cópia que foi reformatada (indentada, chaves reordenadas): o arquivo publicado já é canônico, então os bytes dele, como estão, dão o mesmo valor.

Na linha de comando, com o cast do Foundry:

curl -s "https://API_HOST/m/fazenda-boa-vista/0x5c1e…9a2b.json" -o lot.json
cast keccak "$(cat lot.json)"

Para comparar com o próprio registro em vez de com o que o console mostra, leia o batch no contrato do token (Contrato do token, ID do token e Rede em Detalhes técnicos):

cast call "$TOKEN" "batchOf(uint256)((address,uint64,uint8,bytes32,bytes32,uint64,uint64,bytes32,bytes32,string))" "$TOKEN_ID" --rpc-url "$RPC_URL"

O nono valor da tupla é metadataHash e o décimo é uri. Depois de uma correção, batchOf devolve a versão corrigida, e cada evento BatchMetadataUpdated(id, metadataHash, uri) registra uma versão. Os documentos declaram schemaVersion 1.0.0, 1.1.0 ou 1.2.0 (a A-REX escreve 1.2.0); a conferência é a mesma para todos. Validar o documento contra o esquema é outra etapa: qualquer validador de JSON Schema 2020-12 com schema/batch-metadata.schema.json do padrão, ou POST /v1/metadata/validate com uma chave de API.