5. Modelliamo il lotto
Da qui in poi costruiamo una versione piccola, che puoi scrivere in un pomeriggio. Servono Node.js, Hardhat e le librerie di OpenZeppelin. Il linguaggio si chiama Solidity.
Un contratto intelligente è come un distributore automatico: le regole sono dentro la macchina, e chiunque le usi le trova uguali.
Tre idee
Struct: una scheda con più campi (codice, cultivar, numero di bottiglie, richiamato). Enum: un elenco di valori possibili, qui le fasi. ERC-721: lo standard dei token "unici", dove ogni numero identifica un solo oggetto; noi usiamo un token per ogni lotto, così il lotto ha un proprietario e un numero.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
contract LottoMinimo is ERC721 {
enum Fase { Raccolta, Molitura, Analisi, Imbottigliamento }
struct Lotto {
string codice;
string cultivar;
uint32 nBottiglie;
bool richiamato;
}
uint256 private _ultimoId;
mapping(uint256 => Lotto) private _lotti;
constructor() ERC721("Lotto minimo", "LTT") {}
function creaLotto(string calldata codice, string calldata cultivar) external returns (uint256 id) {
id = ++_ultimoId;
_lotti[id] = Lotto(codice, cultivar, 0, false);
_mint(msg.sender, id);
}
}Riga per riga
import: prende la base ERC-721 dalla libreria OpenZeppelin (installata connpm i @openzeppelin/contracts).enum Fase: le quattro fasi in ordine; internamente valgono 0, 1, 2, 3.struct Lotto: la scheda di un lotto.nBottiglieparte da 0 e si imposta all'imbottigliamento._ultimoIdconta i lotti;_lottiè un elenco che collega ogni numero di token alla sua scheda.- Il
constructordà un nome e un simbolo al token. creaLotto: aumenta il contatore, salva la scheda, e con_mintcrea il token intestato a chi chiama (msg.sender).
Nel contratto completo di Pietre di Vita la scheda ha anche zona, data di raccolta, chili di olive e motivo del richiamo, e il codice del lotto viene controllato perché sia unico. La logica di base è questa.
Prova tu
Crea una cartella, esegui npx hardhat init (scegli progetto JavaScript), poi npm i @openzeppelin/contracts. Copia il codice in contracts/LottoMinimo.sol e lancia npx hardhat compile. Se vedi "Compiled ... Solidity files successfully" funziona.
Cosa hai imparato
- Un struct raccoglie i dati di un lotto in una scheda.
- Un enum elenca le fasi possibili in ordine.
- Con ERC-721 ogni lotto è un token con un numero e un proprietario.