Ricevute e topologia della rete
Una blockchain vive grazie ai suoi nodi che si passano blocchi e transazioni. Il Proof of Participation misura esattamente questo servizio. Quando un nodo registrato riceve dati da un altro nodo registrato, risponde con una ricevuta, una breve dichiarazione firmata con la sua chiave del nodo. La prova del lavoro arriva quindi dal peer che lo ha ricevuto, non dal nodo che lo rivendica. Nemmeno la scelta dei peer che contano spetta ai nodi: ogni 40 blocchi il protocollo rimescola il registro con il seed del blocco e assegna a ogni nodo i suoi peer prioritari.
Peer prioritari: la topologia
Il registro viene rimescolato una volta per periodo di 40 blocchi (topology_period_blocks), circa 10 minuti. Al primo blocco di un periodo, ogni nodo registrato riceve una chiave di ordinamento:
key = SHA3-256(seed of the period's first block (64 bytes)
‖ node id (8 bytes, little-endian)
‖ period height (8 bytes, little-endian)
‖ "zbc-topology-v2")
Ordinando il registro secondo queste chiavi si ottiene la lista rimescolata. A ogni nodo viene assegnata come peer prioritari una finestra di P nodi consecutivi di questa lista, dove P è max_assigned_peers: 12 su mainnet e 8 su devnet. La finestra del nodo in posizione i inizia alla posizione (i × P) mod L, dove L è la lunghezza della lista; la finestra contiene sempre P nodi interi, e i suoi punti di partenza vengono distanziati quando P e L hanno un fattore in comune. La relazione va in un solo senso: che A sia un peer prioritario di B non rende B un peer prioritario di A.
Poiché l'ordine dipende da un seed che nessuno di loro controlla, e cambia ogni 10 minuti, un gruppo di nodi in combutta non può organizzarsi per essere peer gli uni degli altri e garantire solo a vicenda. La velocità di connessione non ha alcun ruolo, e nessuno pubblica una lista di peer.
Che cosa dice una ricevuta
Una ricevuta è di 232 byte:
| Campo | Byte |
|---|---|
| chiave del nodo del mittente (il nodo che ha inviato i dati) | 32 |
| chiave del nodo del destinatario (il nodo che firma) | 32 |
| blocco di riferimento: l'ultimo blocco del destinatario, altezza | 4 |
| blocco di riferimento: hash | 32 |
| tipo di dato: 1 per un blocco, 2 per una transazione | 4 |
| hash del dato: quale blocco o transazione è stato ricevuto | 32 |
| l'ultima radice del lotto di ricevute del destinatario | 32 |
| la firma Ed25519 del destinatario sui 168 byte precedenti | 64 |
Solo i nodi registrati rilasciano e conservano ricevute, e solo per dati inviati da un altro nodo registrato. Un nodo non registrato può seguire e verificare la catena, ma non rilascia né guadagna ricevute. Una ricevuta non nomina alcuna catena, quindi, a differenza delle transazioni (vedi firme legate alla catena), non è legata a una catena.
Le ricevute non hanno nulla a che fare con le conferme del wallet o con i rimborsi delle commissioni, che sono normali registrazioni di transazioni e saldi.
Lotti e pubblicazione
Il mittente conserva le ricevute che guadagna. Per ogni altezza le raggruppa in un lotto di al massimo 1.000, ordinate per firma, sotto una radice di Merkle. Quando produce un proprio blocco, vi pubblica un campione delle sue ricevute, di due tipi: ricevute non collegate, mostrate così come sono, e ricevute collegate, mostrate con una prova di Merkle rispetto a una radice di lotto precedente. Il software di riferimento campiona ricevute di circa 40 blocchi prima; è un suo comportamento, non una regola di validità.
Che cosa verificano i validatori
Per ogni ricevuta pubblicata in un blocco, ogni nodo verifica quanto segue, dove n è il numero di nodi registrati:
- la firma del destinatario;
- che l'hash del blocco di riferimento sia il blocco di questa catena a quell'altezza;
- la sua età: una ricevuta scade dopo max(max(100, 2 × n) + 1,
receipt_lifecycle) blocchi, cioè 518.400 blocchi (circa 90 giorni) su mainnet; - dall'altezza 40, che il firmatario di una ricevuta non collegata fosse un peer prioritario del produttore del blocco nel periodo da cui proviene la ricevuta;
- dall'altezza 80, la prova di Merkle di ogni ricevuta collegata;
- il numero: al massimo 2 × min(n − 1, P) ricevute, e mai più di 200.
Alcune cose non sono regole di validità e non vanno lette come tali: i validatori non verificano che il mittente della ricevuta sia il produttore del blocco, che la ricevuta sia nuova, che il suo dato risalga a circa 40 blocchi prima, né che una radice collegata sia già comparsa sulla catena.
Dalle ricevute al punteggio
L'inoltro fa guadagnare ricevute, non punteggio. Il punteggio si muove solo quando il nodo pubblica le sue ricevute in un proprio blocco: mostrarne più di un pivot pari a circa la metà di quelle che potrebbe mostrare alza il punteggio, mostrarne meno lo abbassa. Nessun punteggio si muove prima dell'altezza 40. Vedi punteggio di partecipazione per i dettagli, e lotteria coinbase per come il punteggio si traduce in reddito.