Dopo aver consolidato l'ERP dell'ente di certificazione su Odoo, abbiamo esteso il sistema con la notarizzazione su blockchain, portando ogni certificato su una base di fiducia verificabile in modo indipendente.

First release: 2026
Tipologia: ente di certificazione e ispezione
ANCCP è un ente di certificazione e ispezione fondato nel 1992, con sede a Livorno. È specializzato nella verifica della conformità di prodotti industriali e sistemi di gestione aziendale: dai dispositivi di protezione individuale ai macchinari, dagli apparecchi a gas agli impianti. Affianca inoltre le imprese con audit e con la formazione professionale per auditor e ispettori. Oggi ANCCP opera in ambito nazionale ed europeo, e la fiducia riposta nei suoi certificati è il suo vero prodotto.
La nostra collaborazione con ANCCP era già partita da tempo. Come Odoo Gold Partner avevamo accompagnato l'ente nella migrazione e ottimizzazione del gestionale, dal passaggio a Odoo.sh fino allo sviluppo dei flussi su Odoo, con l'estensione delle anagrafiche, la customizzazione del CRM e, soprattutto, i template PDF dinamici per offerte, ordini e certificati. Quei template erano pensati per riportare in modo chiaro tutte le caratteristiche dei sistemi e dei prodotti certificati e restare compliant con la normativa. Quel lavoro è raccontato nel case study Da Odoo 17 a Odoo 18: migrazione e ottimizzazione dell'ERP per ANCCP.
Proprio da lì nasce il progetto che raccontiamo qui. Una volta che Odoo genera in autonomia il certificato, resta aperta una domanda che vale per qualunque ente di certificazione: come fa chi riceve quel documento a fidarsi che sia autentico e non sia stato modificato?
Un certificato ha valore solo se chi lo legge può fidarsi di ciò che c'è scritto. Per un ente di certificazione la difficoltà non sta nell'emettere il documento, cosa che Odoo faceva già. Sta nella fiducia esterna: mettere un terzo, che sia un cliente finale, un'autorità o un partner commerciale, nella condizione di verificare in autonomia che quel PDF sia proprio quello emesso da ANCCP e che nessuno ne abbia alterato una riga.
Abbiamo accolto la sfida partendo dalle sue criticità reali.
Il metodo tradizionale per verificare un certificato è contattare l'ente che lo ha emesso. È lento, non scala e concentra la fiducia in un unico punto. Serviva un meccanismo che permettesse a chiunque di verificare un documento in modo indipendente, in pochi secondi, anche senza alcun rapporto con ANCCP.
Un certificato contiene dati che non possono finire in chiaro su un registro pubblico e permanente. Qualunque soluzione che tocchi la blockchain doveva quindi tenere i contenuti sensibili off-chain e garantire fin dalla progettazione l'assenza di dati personali sulla catena.
Nel mondo reale i certificati non sono soltanto "validi". Vengono rinnovati alla scadenza del ciclo, sospesi in via temporanea, revocati in caso di errore o non conformità. Un sistema di verifica credibile non poteva limitarsi a dire "valido o non valido": doveva gestire l'intero ciclo di vita, dall'emissione al rinnovo, dalla sospensione alla riattivazione fino alla revoca, mantenendone tracciabile la storia in modo immutabile.
Abbiamo progettato e realizzato un'integrazione tra Odoo e la blockchain basata su un principio preciso: la notarizzazione. La blockchain agisce come un notaio digitale che non custodisce il documento, ma ne conserva una prova crittografica immutabile. Il certificato resta dentro Odoo e viene inviato al cliente; sulla catena finisce solo la sua "impronta".
Il cuore del sistema è il modo in cui calcoliamo l'impronta del certificato. Non basta un hash qualunque, perché doveva essere riproducibile e stabile nel tempo. Abbiamo quindi adottato un doppio hash, che combina due elementi complementari.
Il primo è il content hash, l'impronta SHA-256 dei byte esatti del PDF bloccato: qualsiasi rigenerazione, anche di un solo byte, produce un documento diverso e riconoscibile. Il secondo è il data hash, l'impronta SHA-256 di un oggetto JSON canonico che contiene i campi di business stabili del certificato, con chiavi ordinate, date in formato ISO-8601 e decimali fissi. Ancorando entrambe le impronte, la verifica copre sia il file esatto sia i dati strutturati che quel file rappresenta.
Le due impronte vengono registrate sulla catena insieme ai metadati temporali. Il documento vero, con i suoi contenuti, non lascia mai Odoo.
Su blockchain vive un registro sviluppato in Solidity, il CertificateRegistry, costruito e testato con Hardhat sulla base delle librerie OpenZeppelin. Ogni certificato è rappresentato da una struttura dati essenziale che tiene traccia dell'identificativo on-chain (derivato via keccak256 dal numero di certificato), delle due impronte, delle date di prima emissione, emissione corrente e scadenza, e dello stato.
Le operazioni sono controllate a livello di ruoli tramite il pattern AccessControl: solo un ruolo autorizzato (ISSUER_ROLE) può emettere, rinnovare, sospendere, riattivare o revocare un certificato, e ogni azione emette un evento tracciabile sulla catena. Lo storico completo delle operazioni vive infatti negli Events di Solidity, indicizzati e interrogabili off-chain a costo zero, così da non appesantire lo storage on-chain con array di cronologia.
Il ciclo di vita è gestito da una macchina a stati esplicita, con transizioni definite rigidamente per garantire la coerenza del registro:
Lo stato EXPIRED non viene scritto sulla catena, ma calcolato dinamicamente confrontando la data di scadenza con il timestamp del blocco. In questo modo non servono transazioni periodiche per aggiornare i certificati scaduti, con un risparmio netto di costi.
Per far dialogare il gestionale con la blockchain in modo sicuro e manutenibile, abbiamo articolato la soluzione su livelli con responsabilità ben separate: Odoo, un middleware, lo smart contract e il portale pubblico.
Al centro c'è un middleware dedicato, sviluppato in Python con FastAPI, che fa da orchestratore. Riceve le richieste autenticate da Odoo, calcola le impronte, costruisce, firma e invia le transazioni alla rete, gestisce i tentativi di reinvio e conserva una coda persistente per le transazioni pendenti. Per l'invio ci appoggiamo a un provider RPC (Alchemy come primario, con QuickNode come fallback), evitando di gestire un nodo in proprio.
Un principio ha guidato tutta l'architettura sul fronte della scrittura: il browser dell'utente non firma né invia mai una transazione. Le operazioni di emissione, rinnovo, sospensione e revoca passano sempre da Odoo e dal middleware, così che le chiavi API e la chiave di firma restino lato server e il traffico di scrittura resti server-to-server, a tutela della privacy degli utenti finali.
Abbiamo integrato la notarizzazione direttamente nel flusso di gestione certificati già esistente in Odoo, senza costringere l'operatore a uscire dal suo strumento di lavoro. Il giro è lineare: dall'ordine di vendita si emette il certificato, ereditandone automaticamente i dettagli.
La schermata dell'ordine di vendita con il pulsante Emetti certificato.
Il popup di emissione, che eredita cliente, settore, standard e accreditamento dall'ordine.
Una volta creato, il certificato entra nel registro. Da qui il modulo può notarizzarlo su blockchain: calcola le impronte, chiama il middleware e, a conferma avvenuta, salva sul record Odoo il transaction hash, il numero di blocco e lo stato della registrazione, con link diretto a Polygonscan per la verifica indipendente della transazione. La tracciabilità on-chain resta così legata al record gestionale.
La vista di dettaglio con il pannello "Notarizzazione Blockchain": rete, transaction hash, certificate hash, blocco e stato "Dati corrispondenti on-chain".
Il PDF generato, con impronta e QR code stampati sul documento.
Il dettaglio della transazione di emissione sulla blockchain.
La notarizzazione su catena è opzionale a livello di singolo certificato: l'ente può gestire internamente il proprio registro in Odoo e decidere, documento per documento, se ancorarne la prova sulla blockchain. Una dashboard dedicata restituisce lo stato del parco certificati (totali, validi, in scadenza, sospesi, revocati) con la distribuzione per stato e per standard.
La panoramica del registro con i contatori e i grafici di distribuzione.
Il punto di contatto con il mondo esterno è una web app standalone (Next.js / React). Chi riceve il certificato può verificarlo in tre modi: caricando il PDF, inserendo il numero identificativo del documento oppure scansionando il QR code stampato sul certificato.
Per questa operazione di sola lettura il portale interroga direttamente il registro on-chain tramite un endpoint RPC pubblico e in sola lettura. Non serve alcuna chiave privata né alcuna scrittura sulla catena, quindi non si presenta il rischio che riguarda invece le operazioni di emissione. Il portale restituisce un esito immediato e leggibile, verificato oppure sconosciuto o manomesso, e se il certificato è stato sospeso, revocato o è scaduto mostra l'avviso corrispondente insieme allo storico immutabile delle operazioni.
Il "Verdetto di Verifica" con esito, dettaglio della certificazione e audit del registro.
Un sistema che emette prove di autenticità va progettato assumendo che qualcuno proverà ad attaccarlo. La chiave di firma non viene mai memorizzata in chiaro: la sua custodia è affidata a un sistema di gestione delle chiavi (HSM o Cloud KMS), che restituisce la firma senza esporre mai la chiave privata. L'accesso alle operazioni di scrittura è protetto su due livelli, il controllo dei ruoli nello smart contract e l'autenticazione forte tra Odoo e il middleware. Le letture del portale di verifica, non toccando mai la chiave di firma, restano invece pubbliche e senza autenticazione, come deve essere per uno strumento aperto a chiunque.
Sul fronte della conformità, la scelta di fondo risolve alla radice il rischio sui dati personali: zero PII on-chain. Sulla catena finiscono solo impronte crittografiche, identificativi derivati e metadati temporali, mai i contenuti del certificato. Il documento vero resta in Odoo, off-chain.
La rete scelta per l'ancoraggio è Polygon PoS, una blockchain pubblica di livello Layer 2: mantiene la piena verificabilità pubblica tipica di una chain permissionless, con commissioni per transazione nell'ordine di pochi centesimi.
L'integrazione trasforma il certificato da documento "da verificare su fiducia" a documento verificabile in autonomia. I benefici concreti:
Per un ente di certificazione la posta in gioco non è tecnologica ma reputazionale: il valore di ANCCP coincide con la fiducia che il mercato ripone nei suoi documenti. Portare quella fiducia su una base verificabile in modo indipendente, senza chiedere a nessuno di credere sulla parola, è un salto che riguarda l'intero settore della certificazione e dell'ispezione, non solo un cliente.
Questo progetto mostra anche come intendiamo l'innovazione: non come tecnologia fine a se stessa, ma come estensione naturale di un sistema che già funziona. La blockchain qui non sostituisce Odoo, lo completa, aggiungendo il pezzo che mancava tra un certificato emesso e un certificato di cui ci si può fidare.
Gestisci documenti la cui autenticità deve poter essere dimostrata a terzi?
Prenota una consulenza personalizzata: capiamo insieme se ci sono i presupposti per portarli su una base verificabile.