Gruppi di account
Un gruppo di account è un unico account raggiungibile a molti indirizzi. Un wallet su telefono, un hardware wallet e un wallet Ethereum da browser possono esserne tutti membri, e un pagamento a uno qualsiasi di loro finisce in un unico saldo condiviso. Un membro, il controller, gestisce il gruppo e decide che cosa può spendere ciascuno degli altri membri. Questo rende possibili account di famiglia e aziendali, con un limite di spesa per ogni persona o dispositivo.
Un account, molti indirizzi
Il saldo del gruppo, i suoi token e tutto ciò che possiede risiedono su un indirizzo di gruppo senza chiave, derivato dalla transazione che ha fondato il gruppo:
group address = 00000000 ‖ SHA3-256( "ZBC-GROUP" ‖ founding transaction hash )
Nessuno ne detiene una chiave. Ogni indirizzo membro rimanda a esso: un pagamento a un membro qualsiasi viene accreditato al gruppo, e chiedere il saldo di un membro qualsiasi restituisce quello del gruppo. Ogni indirizzo mantiene il proprio nonce.
Un gruppo contiene fino a 100 indirizzi, controller compreso. I membri possono essere di qualsiasi tipo di chiave in grado di firmare (ZooBC, Bitcoin, Ethereum, Solana e gli altri; vedi chiavi e tipi di account), e anche un account multifirma può essere un membro.
Entrare
Solo il controller collega un nuovo indirizzo, con LinkAccount, e solo con il consenso di quell'indirizzo: una firma su un digest legato alla catena con il tag «ZBC-GROUP-LINK», valida al massimo per 5.760 blocchi (un giorno) in avanti e utilizzabile una sola volta. Il consenso può essere la firma dell'indirizzo stesso, la soglia di firme di un account multifirma o un personal_sign di Ethereum.
Entrare trasferisce nel gruppo tutto ciò che l'indirizzo possiede, fino a 1.000 elementi: il suo saldo, i token, i token emessi, i dataset, i file, i trigger, le pianificazioni, le offerte, gli ordini, le sponsorizzazioni e le registrazioni di nodi e servizi.
Tra gli indirizzi che non possono entrare ci sono:
- un indirizzo di gruppo;
- un indirizzo che appartiene già a un gruppo, perché ogni indirizzo può far parte di un solo gruppo;
- un indirizzo con una politica di ripartizione;
- una chiave attiva di nodo, gateway, relay o nodo di archivio;
- l'autorità di release.
Uscire e cedere il controllo
Un membro esce con UnlinkAccount e non porta via nulla: l'indirizzo riparte come account nuovo e vuoto. Tutto ciò che ha portato resta al gruppo.
Il controller non può uscire prima di aver ceduto il controllo. TransferGroupControl passa il controllo a un altro membro, che deve acconsentire con una firma con il tag «ZBC-GROUP-CONTROL»; il vecchio controller diventa allora di sola ricezione.
Permessi
Un nuovo membro è di sola ricezione: può ricevere pagamenti per il gruppo e può uscire, ma non può spendere. Il controller cambia questa situazione con SetMemberPermissions:
- bit 0: il membro può spendere ZBC;
- bit 1: il membro può spostare i token del gruppo (richiede anche il bit 0);
- un limite in ZBC per periodo, con un periodo da 1 a 2.102.400 blocchi (un anno); un limite pari a 0 significa nessun limite.
Un limite di 5 ZBC ogni 5.760 blocchi, per esempio, è un tetto di spesa giornaliero di 5 ZBC.
Alcune azioni spettano solo al controller: LinkAccount, SetMemberPermissions, TransferGroupControl, SetSplitPolicy e SetTransactPolicy. La politica di ripartizione di un gruppo si applica al denaro inviato a qualsiasi membro (vedi politiche di ripartizione e di transazione).
Come vengono fatti rispettare i limiti
Il limite di un membro è una regola di consenso, non un'impostazione del wallet:
- all'ammissione, un nodo calcola il massimo di ZBC che la transazione potrebbe prelevare dal gruppo (l'importo, la commissione, un eventuale deposito di sopravvivenza, e la commissione e il canone di un escrow) e la rifiuta se supera ciò che resta nella finestra del membro, tenendo conto delle altre transazioni in sospeso del membro;
- quando viene eseguita la transazione di un membro con limite, viene eseguita all'interno di un savepoint: la catena misura quanto ha davvero perso il saldo del gruppo e, se supera il limite, la transazione viene annullata;
- un blocco che contiene una transazione di un membro non consentita non è valido su nessun nodo.
Ogni membro ha il proprio posto secondo la regola di una transazione per account per blocco, perché ciascuno firma con il proprio indirizzo.
Token e canone
Un token emesso da un membro appartiene al gruppo, e qualsiasi membro abilitato a inviare per il gruppo può in seguito coniarlo (vedi coniare e bruciare token).
Il gruppo paga il canone degli account come qualsiasi account, più un canone di archiviazione sul suo record: 96 byte e l'indirizzo del controller, più 40 byte e l'indirizzo di ogni membro. I membri non pagano alcun canone proprio. Un gruppo che non riesce a pagare viene sciolto, e i suoi spiccioli rimasti vanno al pool di longevità (vedi ZBC non viene mai bruciato).