Tracciabilità dell'olio, passo passo

5. Modelliamo il lotto

Obiettivo: Scrivere la struttura minima di un lotto in Solidity: dati, fasi e un token per ogni 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

  1. import: prende la base ERC-721 dalla libreria OpenZeppelin (installata con npm i @openzeppelin/contracts).
  2. enum Fase: le quattro fasi in ordine; internamente valgono 0, 1, 2, 3.
  3. struct Lotto: la scheda di un lotto. nBottiglie parte da 0 e si imposta all'imbottigliamento.
  4. _ultimoId conta i lotti; _lotti è un elenco che collega ogni numero di token alla sua scheda.
  5. Il constructor dà un nome e un simbolo al token.
  6. creaLotto: aumenta il contatore, salva la scheda, e con _mint crea 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

Per approfondire