Tracciabilità dell'olio, passo passo

7. I documenti fuori dalla catena

Obiettivo: Capire perché sulla catena va solo l'impronta del documento e come ricalcolarla per controllare.

Il notaio non conserva nel registro il tuo contratto di 40 pagine: ci scrive il numero, la data e un sigillo. Se qualcuno cambia il contratto, il sigillo non corrisponde più.

Perché non mettere il PDF sulla catena

Scrivere sulla catena costa e ogni dato resta per sempre visibile a tutti. Un PDF o una foto sono pesanti, e possono contenere informazioni che non vogliamo rendere pubbliche. Sulla catena mettiamo allora solo l'impronta, 32 byte (tipo bytes32), mentre il file sta sul server del progetto (il backend).

Come si calcola

import { createHash } from "node:crypto";
import { readFileSync } from "node:fs";

// 1. Il file resta sul server: qui lo leggiamo come sequenza di byte.
const byte = readFileSync("referto.pdf");

// 2. L'impronta sha256 sono 32 byte: li scriviamo come 64 caratteri esadecimali.
const impronta = "0x" + createHash("sha256").update(byte).digest("hex");

console.log(impronta); // questo valore (bytes32) va nel contratto come docHash

Riga per riga

  1. Le prime due righe prendono due strumenti già inclusi in Node.js: uno per l'impronta, uno per leggere i file.
  2. readFileSync legge il PDF e lo trasforma in byte.
  3. createHash("sha256") prepara il calcolo, update gli dà i byte, digest("hex") restituisce il risultato in lettere e numeri.
  4. Davanti mettiamo 0x perché così il contratto riconosce un valore bytes32.

La stessa funzione serve alla verifica: chiunque scarichi il documento può rifare il calcolo.

// Ricalcolo: l'impronta del file scaricato deve essere uguale a quella sulla catena.
function documentoIntegro(fileBytes, docHashSullaCatena) {
  const ora = "0x" + createHash("sha256").update(fileBytes).digest("hex");
  return ora === docHashSullaCatena.toLowerCase();
}

Riga per riga

  1. La funzione riceve i byte del file scaricato e l'impronta letta sulla catena.
  2. Ricalcola l'impronta con lo stesso metodo.
  3. Restituisce vero solo se le due coincidono; con toLowerCase() ignoriamo le differenze tra maiuscole e minuscole.

Nella demo il backend calcola l'impronta all'arrivo del file (massimo 5 MB, solo PDF, JPG o PNG), la salva nel suo archivio e la scrive sulla catena come docHash. Alla verifica la pagina pubblica confronta le due impronte per ogni documento.

Un dettaglio utile: l'impronta prova che il file non è cambiato dopo la registrazione, non che il contenuto fosse vero.

Prova tu

Salva un file di testo qualunque, calcolane l'impronta con lo script qui sopra, poi cambia una lettera nel file e ricalcola. Confronta le due impronte con la funzione documentoIntegro.

Cosa hai imparato