Smart contract in Solidity per la tracciabilita industriale
Perche la blockchain per la tracciabilita
In una filiera industriale i dati passano tra molti attori: fornitori, produttori, logistica, clienti. Garantire che un dato non sia stato alterato a posteriori e una sfida. La blockchain offre un registro distribuito e immutabile: una volta scritto, un record non puo essere modificato senza che la manomissione sia evidente. Gli smart contract in Solidity permettono di codificare le regole di business direttamente sulla catena.
Un primo smart contract di tracciabilita
Immaginiamo di voler registrare i passaggi di un lotto di produzione. Ecco un contratto minimale:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract Tracciabilita {
struct Evento {
string fase; // es. "produzione", "collaudo", "spedizione"
address operatore;
uint256 timestamp;
string datiHash; // hash dei dati di dettaglio
}
mapping(bytes32 => Evento[]) private storico;
event EventoRegistrato(bytes32 indexed lotto, string fase, address operatore);
function registra(bytes32 lotto, string calldata fase, string calldata datiHash) external {
storico[lotto].push(Evento({
fase: fase,
operatore: msg.sender,
timestamp: block.timestamp,
datiHash: datiHash
}));
emit EventoRegistrato(lotto, fase, msg.sender);
}
function eventi(bytes32 lotto) external view returns (Evento[] memory) {
return storico[lotto];
}
}
Ogni evento registra chi ha agito (msg.sender), quando (block.timestamp) e un hash
dei dati di dettaglio, che restano off-chain per ragioni di costo e privacy.
On-chain e off-chain: il pattern dell'hash
Scrivere grandi quantita di dati sulla blockchain e costoso e sconsigliato. Il pattern corretto e:
- salvare i dati completi in un sistema off-chain (database o storage);
- calcolare l'hash crittografico (es.
keccak256) di quei dati; - scrivere solo l'hash sulla blockchain.
Per verificare l'integrita basta ricalcolare l'hash dei dati off-chain e confrontarlo con quello on-chain. Se coincidono, i dati non sono stati alterati.
function verifica(string calldata dati, string calldata hashAtteso) public pure returns (bool) {
return keccak256(bytes(dati)) == keccak256(bytes(hashAtteso));
}
Controllo degli accessi
In un contesto industriale non tutti devono poter scrivere. Si introduce il controllo dei ruoli:
mapping(address => bool) public autorizzati;
address public admin;
modifier soloAutorizzati() {
require(autorizzati[msg.sender], "Operatore non autorizzato");
_;
}
constructor() {
admin = msg.sender;
autorizzati[msg.sender] = true;
}
Considerazioni sui costi e sulla sicurezza
- Gas: ogni scrittura ha un costo. Minimizzare i dati on-chain e ottimizzare le strutture e fondamentale.
- Immutabilita del codice: un bug in un contratto deployato non si corregge facilmente. Servono audit accurati e pattern di upgradeability (proxy).
- Reentrancy e overflow: vanno gestiti con le best practice e le librerie consolidate.
Conclusione
Gli smart contract in Solidity portano garanzie di integrita e trasparenza che i sistemi tradizionali non offrono. In MUSTNODE sviluppiamo soluzioni blockchain per la tracciabilita industriale, integrandole con i sistemi gestionali esistenti e curando sicurezza e auditing del codice.