Wiki di ZooBC
Integrazioni

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

  1. MetaMask firma un normale trasferimento Ethereum: EIP-1559, EIP-2930 o legacy con EIP-155, con una access list vuota.
  2. La transazione Ethereum firmata viene inserita nel campo messaggio di un SendZBC ZooBC dall'account 0x del mittente all'account 0x del destinatario.
  3. 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 to sia 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.

MetaMask firma una transazione Ethereum, l'adattatore sulla porta 8545 la racchiude nel campo messaggio di un SendZBC, e ogni nodo verifica firmatario, destinatario e importo
MetaMask firma una transazione Ethereum, l'adattatore sulla porta 8545 la racchiude nel campo messaggio di un SendZBC, e ogni nodo verifica firmatario, destinatario e importo

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.

MetaMask conta 1 ZBC come 10^18 wei, ZooBC come 10^8 unità atomiche; 500.000.000.000.000.000 wei divisi per 10^10 danno 50.000.000 di unità atomiche, 0,5 ZBC
MetaMask conta 1 ZBC come 10^18 wei, ZooBC come 10^8 unità atomiche; 500.000.000.000.000.000 wei divisi per 10^10 danno 50.000.000 di unità atomiche, 0,5 ZBC

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.

Vedi anche