MetaMask e accesso in stile Ethereum
Una chiave Ethereum può controllare un account ZooBC il cui indirizzo è il normale indirizzo 0x… di quella chiave (tipo di account 4, vedi chiavi e tipi di account). MetaMask non ha bisogno di sapere nulla di ZooBC: firma una normale transazione Ethereum, che viaggia dentro una transazione ZooBC e viene verificata da ogni nodo. L'account detiene ZBC reali. Non sono coinvolti né bridge, né monete wrapped, né chiavi aggiuntive.
Come funziona un trasferimento
- MetaMask firma un normale trasferimento Ethereum: EIP-1559, EIP-2930 o legacy con EIP-155, con una access list vuota.
- La transazione Ethereum firmata viene inserita nel campo messaggio di un SendZBC ZooBC dall'account 0x del mittente all'account 0x del destinatario.
- Ogni nodo interpreta la transazione Ethereum, ne recupera il firmatario dalla firma e richiede tre cose: che il firmatario sia l'account mittente, che l'indirizzo Ethereum
tosia il destinatario e che il valore corrisponda all'importo in ZBC.
Su questo percorso il nodo verifica la firma Ethereum al posto del digest della transazione proprio di ZooBC. La transazione trasportata può occupare fino a 4.096 byte di messaggio.
L'adattatore in ogni nodo
Ogni nodo incorpora un adattatore JSON-RPC per Ethereum. È attivo per impostazione predefinita (eth_rpc_enabled), resta in ascolto sulla porta 8545 della macchina del nodo (loopback) per impostazione predefinita, e inoltra le richieste all'API del nodo, sempre in loopback. Risponde alle chiamate che fa un wallet come MetaMask:
- catena e nodo:
eth_chainId,net_version,web3_clientVersion,eth_syncing,eth_mining,eth_hashrate,eth_coinbase,eth_accounts; - stato:
eth_blockNumber,eth_getBalance,eth_getTransactionCount,eth_getCode,eth_call; - commissioni:
eth_estimateGas,eth_gasPrice,eth_maxPriorityFeePerGas; - transazioni e blocchi:
eth_sendRawTransaction,eth_getTransactionReceipt,eth_getTransactionByHash,eth_getBlockByNumber,eth_getBlockByHash.
eth_sendRawTransaction si occupa di racchiudere la transazione. Costruisce un SendZBC tra i due account di tipo 4, fissa l'importo al valore in wei diviso per 10^10, ricava la commissione da gasLimit × gasPrice diviso per 10^10, portandola alla soglia minima del nodo se è più bassa, e mette nel messaggio la transazione Ethereum grezza.
Il chain id deriva dall'hash genesi della catena, quindi ogni catena ZooBC presenta il proprio id. Con eth_rpc_chain_id impostato a 0, l'adattatore calcola:
chain id = (0x0883 << 16) | first two bytes of the genesis hash
Dai wei alle unità atomiche
MetaMask conta 18 decimali: tratta una moneta visualizzata come 10^18 wei. ZooBC ne conta 8: 1 ZBC equivale a 10^8 unità atomiche (moneta ZBC e le sue unità). Un'unità atomica corrisponde quindi a 10^10 wei, e 1 ZBC appare in MetaMask come 10^18 wei.
La divisione viene fatta a precisione piena; l'eventuale resto inferiore a un'unità atomica viene scartato, e un valore troppo grande per un importo intero con segno a 64 bit viene rifiutato. La verifica del nodo e l'adattatore usano la stessa conversione, quindi concordano sempre.
Collegare un indirizzo Ethereum a un gruppo di account
Il wallet web usa MetaMask anche al di fuori dei trasferimenti. Con eth_requestAccounts e personal_sign chiede a MetaMask di firmare un consenso che collega l'indirizzo Ethereum a un gruppo di account.
Anche un adattatore in stile Bitcoin
I nodi includono anche un adattatore RPC in stile Bitcoin Core. È disattivato per impostazione predefinita, quando è attivo resta in ascolto sulla porta 8332, e richiede credenziali impostate dall'operatore del nodo.