Scopo della pagina “Verifica Certificato (Admin)”
La pagina Admin serve a leggere i dati di un certificato on-chain (LSP8) e verificare i campi umani confrontando
gli hash registrati nel contratto con gli hash calcolati lato server (pepperati). In più puoi confrontare l’hash del PDF locale
con documentHash.
Cosa ottieni
- Snapshot on-chain: owner, status, outcome, date, documentHash, documentURI
- Freeze metadata (REV2) via tokenMetadataFrozen(tokenId)
- Eventuale token sostitutivo (probe di più signature)
- Verifica OK/NO per i campi compilati
Prerequisiti
- Contract address corretto (REV2 consigliato)
- Wallet disponibile (UP Extension / EIP-1193)
- Login admin (cookie sessione) per usare lista e funzioni protette
1) Config iniziale
Controlla che i parametri siano corretti prima di iniziare.
1.1 Contract / ChainId / RPC
- Contract address: deve essere l’indirizzo del contratto LSP8 attivo che contiene getCertificateData.
- ChainId: in testnet LUKSO normalmente 4201.
- RPC URL: serve come fallback pubblico quando non è disponibile un provider wallet.
Tip: quando “non torna nulla”
- Contract errato (es. Rev1 vs Rev2)
- ChainId sbagliato
- RPC non raggiungibile
- tokenId non bytes32 (0x + 64 hex)
2) Wallet + Login Admin (consigliato)
Nella tua implementazione, diverse azioni richiedono sessione admin via cookie.
Quindi il flusso tipico è: Connetti wallet → Firma e Login.
2.1 Connetti wallet
- Clicca Connetti wallet.
- Seleziona l’account nel wallet.
- Vedrai la pill “Connessa … (da loggare)”.
2.2 Firma e Login
- Clicca Firma e Login.
- La pagina richiede un nonce al server, poi ti chiede una firma personal_sign.
- Il server verifica che il wallet sia autorizzato (admin/owner).
- Se OK: sessione attiva (cookie) + compaiono Carica lista e Logout.
Come capisco che sono davvero loggata?
- Pill “Loggata: 0x1234…abcd”
- Bottone “Carica lista” visibile
- Al refresh, la sessione può ripristinarsi automaticamente (API_STATUS)
3) Lista certificati (solo admin)
La lista viene caricata da un endpoint proxy protetto (es. cert_summary.php).
Se la lista è disponibile, puoi selezionare il certificato da un menu a tendina.
3.1 Carica lista
- Clicca Carica lista.
- Se tutto OK: il campo testo “Numero certificato” viene sostituito dalla select.
- Ogni riga mostra numero, stato, issuedAt e tokenId abbreviato (se presente).
Se la lista è vuota
- Indice certificati non popolato
- Endpoint proxy non sta leggendo il JSON atteso
- Sessione non valida (401/403)
4) Identificare il certificato
Puoi identificare un certificato in due modi: con il numero umano oppure incollando direttamente il tokenId bytes32.
Metodo A • Numero certificato (umano)
- Seleziona o digita: es. CI-2026-00017
- Clicca Calcola tokenId (usa endpoint hash pubblico)
- Il campo tokenId si compila
Metodo B • tokenId (bytes32)
- Incolla direttamente: 0x + 64 caratteri esadecimali
- Salta “Calcola tokenId”
- Vai subito su Leggi on-chain
5) Leggi on-chain (snapshot)
Leggi on-chain esegue: controllo esistenza token → lettura getCertificateData →
stato freeze metadata (se disponibile) → ricerca eventuale sostitutivo → abilita “Apri PDF” se c’è un URI valido.
5.1 Cosa vedi nella tabella “Dati on-chain”
- Owner da tokenOwnerOf(tokenId)
- Metadata freeze: Frozen / Unfrozen / N/D
- Stato certificato: Valido / Revocato / Sostituito
- Date: issuedAt, inspectionDate, validUntil
- documentHash + documentURI
5.2 Sostitutivo collegato
- La pagina prova più signature “candidate” per trovare il tokenId sostitutivo.
- Se trovato: appare un box evidenziato + una riga in tabella con tokenId e pulsante copia.
- Se lo stato è Revocato ma esiste sostitutivo: il box lo segnala.
Errore “token inesistente / non mintato”
Succede quando tokenOwnerOf(tokenId) revert:
- tokenId sbagliato
- tokenId calcolato con pepper/algoritmo diverso da quello usato al mint
- stai leggendo dal contratto sbagliato (Rev1 vs Rev2)
6) PDF: calcolo hash locale e confronto
Questo step è opzionale ma consigliato: carichi il PDF e calcoli SHA-256.
In verifica, l’hash calcolato viene confrontato con documentHash letto on-chain.
- Seleziona un file PDF.
- Clicca Calcola hash PDF.
- Il campo “Hash PDF” si riempie con 0x....
Quando “Apri PDF” compare?
Compare dopo la lettura on-chain se documentURI:
- è un ipfs://... oppure /ipfs/... oppure URL http(s)
- e sembra puntare a un PDF (o IPFS generico che puoi aprire)
7) Verifica (OK/NO) — confronto hash pepperati
Qui succede la parte “seria”: la pagina manda i campi umani a un endpoint che calcola gli hash pepperati server-side,
e li confronta con gli hash salvati nel contratto.
7.1 Regola semplice
- Se un campo umano è vuoto: viene segnato N/D e non influisce sul totale.
- Se un campo è compilato: deve combaciare (OK) oppure risulta NO.
- Il Numero certificato viene sempre verificato (serve per coerenza tokenId/certificateNumberHash).
7.2 Sequenza consigliata (per evitare falsi “NO”)
- Fai Leggi on-chain.
- Carica PDF e calcola hash (opzionale ma utile).
- Compila solo 2–3 campi umani che sei sicuro siano identici al dato “ufficiale”.
- Clicca Verifica (OK/NO).
- Se OK, aggiungi altri campi e ripeti.
Perché posso ottenere “NO” anche se “visivamente è uguale”?
- spazi extra (inizio/fine)
- maiuscole/minuscole se non normalizzi lato server
- formattazione P.IVA (IT... vs senza IT)
- differenze su accenti / caratteri speciali
- anno come "2019" vs "2019 " (spazio)
8) Clear, Logout e debug
8.1 Clear
- Pulisce input (numero, tokenId, PDF, campi umani) e risultati.
- Resetta snapshot e dettagli tecnici.
8.2 Logout
- Chiude la sessione (cookie) lato server.
- Nasconde “Carica lista” e torna in modalità input manuale.
8.3 Dettagli tecnici (hash)
- Il pannello “Dettagli tecnici” mostra un dump JSON utile per debug (chain + computed).
- Se qualcosa non quadra, è la prima cosa da guardare.
Mini checklist rapida (quando sei di fretta)
- OK Contract corretto (Rev2 se vuoi freeze per-token)
- OK Wallet connesso + login riuscito (pill “Loggata”)
- OK tokenId bytes32 corretto
- OK Leggi on-chain → poi verifica
- TIP Compila pochi campi alla volta per capire dove nasce un NO