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
- Abra o lote em Lotes.
- 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. - 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
- 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.
- 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.
- Calcule a impressão digital desse texto com o método keccak-256.
- 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.