Come funziona la pagina “ChainIntegrate — dApp - Mint” (passo-passo)
Questa guida descrive in modo pratico cosa fa la pagina e in che ordine conviene usarla.
La logica chiave è: prima connetti il wallet, poi fai login con firma,
poi la UI abilita tutte le azioni owner-only (mint / setData / admin / freeze) solo se il wallet loggato
coincide con owner() del contratto (verifica server-side via RPC).
Gate: Wallet + Sessione + Owner
La pagina usa tre “semafori” (pill in alto) per decidere se i pulsanti sono attivi:
- Wallet connesso: hai un provider (
window.luksoowindow.ethereum) e un account selezionato. - Sessione autorizzata: dopo la firma, il server crea/valida una sessione (cookie) e la pagina la legge da
./api/status.php. - Owner del contratto: lato on-chain si confronta il tuo address con
owner().
Se non sei owner, anche con sessione ok, le funzioni owner-only ti daranno errore.
Chi fa cosa (browser / server / chain)
Connessione wallet, firma login, chiamate on-chain via ethers, gestione form, QR canvas, copia link.
Sessione, verify owner server-side, hashing “pepperato”, Pinata upload, storage JSON (summary + cleartext).
Endpoint citati dalla pagina (quelli importanti)
./api/nonce.php→ genera nonce per messaggio di login../api/login.php→ invia address/message/signature e apre sessione “pending”../api/verify_owner.php→ controlla via RPC che l’address loggato siaowner()../api/status.php→ la UI leggeauthe address sessione../api/hash_fields.php→ calcolatokenIde hash (pepper interno) server-side../api/pinata_upload.php→ carica PDF su Pinata e restituisce CID + URL../api/cert_summary_mint.php→ indice “operativo” (select list, status, ecc.)../api/cert_metadata_clear.php→ cleartext JSON (solo dati umani) legati al tokenId../api/clients_list.php→ lista clienti per la select “Mint To”.
La sequenza “giusta” per emettere un certificato
Qui sotto c’è la procedura completa, nell’ordine in cui evita più errori (tokenId sbagliato, hash mancanti, date non syncate, ecc.).
Connetti UP
Login (firma)
Inizializza
Genera tokenId (server-side)
Seleziona il destinatario (Mint To)
Mint (on-chain) + indice JSON
Compila i “dati umani” (manuale o da JSON)
Converti (server) → Hash
Documento: hash PDF + (opzionale) upload Pinata
Invia setCertificateData (on-chain) + salva cleartext
Revoke e Supersede
Queste azioni cambiano lo stato del certificato:
- Revoke: chiama
revoke(tokenId)e patcha lo store summary aRevoked. - Supersede: chiama
supersede(oldTokenId,newTokenId)e aggiorna lo store:- old →
Superseded+supersededBy=new - new →
supersedes=old
- old →
Freeze token metadata (REV2)
Qui la pagina usa la freeze “per token”:
freezeTokenMetadata(tokenId).
Serve a bloccare modifiche future su setCertificateData per quel token.
- Selezioni token dalla lista → compila
freeze_tokenId - Premi freeze → tx on-chain + salvataggio nello store summary (
tokenMetadataFrozen) - In lettura, la pagina prova a mostrare anche
tokenMetadataFrozen(tokenId)
metadataFrozen() (freeze “collezione”). Qui è freeze “token-level”.
Read: cosa mostra e da dove arriva
La sezione “Leggi certificato on-chain” fa una lettura completa dal contratto e (se possibile) arricchisce con cleartext dallo store server.
getCertificateData(tokenId) → hash + campi “numerici” + URI/status.
In più prova:
tokenMetadataFrozen(tokenId)metadataFrozen()supersededBy(tokenId)/supersedes(tokenId)
cert_metadata_clear.php?action=get → dati “umani” (ragione sociale, P.IVA, ecc.) salvati in JSON.
Se fallisce (non presente o non autorizzato), la UI lascia solo l’on-chain.
Perché esiste anche lo store “summary”?
- Per popolare le select (liste certificati) senza dover scansionare la chain.
- Per mostrare status “operativo” (Valid/Revoked/Superseded) e link di navigazione rapida.
- Per mantenere un indice coerente tra UI Admin / Freeze / Read.
Verify link e Verify QR: come vengono costruiti
Dopo aver ottenuto un tokenId valido (0x + 64 hex), la pagina genera due URL:
verify_link?t=<tokenId>→ pagina di verifica “link”verify_qr?t=<tokenId>→ pagina di verifica “QR”
(Se un giorno vuoi 100% self-hosted anche per il QR, basta sostituire quel pezzo con una lib JS embedded.)
Clear: cosa pulisce e cosa NON tocca
Il bottone Clear resetta i campi “operativi” (form, output, file picker, canvas QR), ma non disconnette wallet e non resetta provider/signer/contract.
- Non ti fa reinserire contract address e chainId
- Pulisce outputs:
out_mint/out_read/out_set/out_admin/out_meta - Pulisce select e tokenId in input
Problemi tipici e “diagnosi veloce”
- Bottoni disabilitati → controlla: pill wallet ok? pill sessione ok? (se no, rifai login)
- Errore owner-only → nello stato rapido
isOwnerdeve essere true - TokenId non valido → deve essere
0x+ 64 hex, tutto minuscolo/maiuscolo è indifferente - Date non passano → serve selezionare i campi
type=date(poi vengono convertiti in timestamp) - documentHash mancante → o lo incolli oppure fai “Calcola hash PDF”
- Liste vuote → lo store summary si popola solo dopo mint/set; usa “Carica lista” e verifica i PHP