Cos’è questa pagina
Questa pagina è la “verifica rapida” pensata per il QR.
Il QR apre un link che include il tokenId (bytes32) nella querystring
(tipicamente ?t=0x...).
Obiettivo
- Mostrare uno snapshot on-chain (source of truth)
- Mostrare un riepilogo pubblico “leggibile” (da JSON)
- Gestire casi: inesistente / revocato / sostituito
Nota privacy
- Il riepilogo può contenere dati mascherati (parziali)
- La verifica hash completa (campi umani → hash) è su un’altra pagina
1) Come deve essere fatto il QR
Il QR deve puntare a un URL che include il tokenId in querystring
con parametro t (oppure tokenId).
Esempio
- https://.../verify_qr?t=0xaaaaaaaa...(64 hex)
Requisito tecnico: bytes32 valido
Formato accettato:
0x + 64 caratteri esadecimali
Esempio:
0x0123... (in totale 66 char)
2) Apertura da QR: cosa succede automaticamente
- Il browser (mobile o desktop) apre la pagina con ?t=....
- La pagina legge t e lo inserisce nel campo tokenId.
- Se è valido, avvia in automatico Carica riepilogo (dopo pochi ms).
- Se non è valido, la pagina resta “Pronta” e ti chiede di controllare il link.
Se arrivi senza QR
Puoi incollare manualmente il tokenId nel campo
e premere “Carica riepilogo”.
3) “Carica riepilogo”: cosa fa davvero (ordine corretto)
Questo bottone fa due cose, in un ordine preciso:
prima on-chain, poi JSON pubblico.
3.1 STEP A — Snapshot on-chain (source of truth)
- Controlla se il token esiste con tokenOwnerOf(tokenId).
- Se esiste, legge getCertificateData(tokenId).
- Legge anche:
- tokenMetadataFrozen(tokenId) (se disponibile)
- supersededBy(tokenId) (se disponibile)
- Popola la card Dati on-chain e aggiorna la pill in alto con lo stato.
3.2 STEP B — Riepilogo pubblico da JSON
- Chiama endpoint pubblico:
api/qr_cert_details_public.php?t=TOKEN
- Mostra i campi leggibili in Riepilogo.
- Se presenti, mostra i campi mascherati (es. azienda parziale, CF parziale, ecc.).
Perché prima on-chain e poi JSON?
Perché lo stato “vero” (valido/revocato/sostituito)
e le relazioni (supersededBy) devono arrivare dalla chain.
Il JSON è “solo presentazione pubblica”:
leggibile, mascherato, comodo per l’utente.
4) Interpretare lo stato (pill in alto + badges)
La UI deriva dallo status on-chain.
In pratica:
- Valido → pill verde / “Certificato valido (on-chain)”
- Revocato → pill rossa / “Certificato revocato (on-chain)”
- Sostituito → pill gialla / “Certificato sostituito (on-chain)”
4.1 Cosa significa “Metadata Frozen”
- Frozen: i metadati del token sono bloccati (immutabili)
- Unfrozen: metadati ancora modificabili
- N/D: il getter non è disponibile o errore RPC
5) Caso token sostituito: aprire il sostitutivo
Se il certificato è stato sostituito, il contratto può restituire un tokenId “nuovo”
tramite supersededBy(tokenId).
Cosa vedi nella pagina
- Nella tabella on-chain appare “Sostituito da (tokenId)”
- Compare il link “Apri certificato sostitutivo”
- Il link apre la stessa pagina con ?t=NUOVO_TOKEN
Nota importante
Se supersededBy è 0x00..00 (bytes32 zero),
la pagina mostra “Valido” nel campo “Sostituito da”.
6) Caso token inesistente (non mintato)
- La tabella on-chain mostra “Certificato inesistente (token non mintato)”
- La pill in alto va su errore
- Il riepilogo JSON non ha senso (ma puoi comunque vedere il tokenId inserito)
7) Sezione Explorer (Blockscout)
Per tokenId bytes32 spesso non c’è una pagina “instance” diretta.
Qui hai due azioni:
- Apri contratto: vai alla pagina del contratto su Blockscout
- Cerca tokenId: fa una ricerca globale del tokenId (abilitata solo se valido)
Perché “Cerca tokenId” può non trovarti una pagina dedicata
Perché molti explorer gestiscono bene i tokenId numerici,
ma con bytes32 spesso devi passare dalla ricerca o dagli eventi.
8) “Clear”
- Svuota tokenId
- Resetta “Dati on-chain” e “Riepilogo”
- Riporta la pagina a “Pronta”
Checklist rapida (mobile)
- 1 Inquadra il QR
- 2 Si apre la pagina con ?t=...
- 3 Attendi: parte “Carica riepilogo” in automatico
- 4 Leggi Dati on-chain (stato, date, hash, sostituzioni)
- 5 Leggi Riepilogo (campi pubblici/mascherati)
- 6 Se “Sostituito”: clicca “Apri certificato sostitutivo”