MetaMask et l’accès de style Ethereum
Une clé Ethereum peut contrôler un compte ZooBC dont l’adresse est l’adresse 0x… ordinaire de cette clé (type de compte 4, voir les types de comptes). MetaMask n’a besoin de rien savoir de ZooBC : il signe une transaction Ethereum normale, qui voyage à l’intérieur d’une transaction ZooBC et que chaque nœud vérifie. Le compte détient de vrais ZBC. Aucun pont, aucune monnaie enveloppée ni aucune clé supplémentaire n’intervient.
Comment se déroule un transfert
- MetaMask signe un transfert Ethereum ordinaire : EIP-1559, EIP-2930 ou legacy avec EIP-155, avec une liste d’accès vide.
- La transaction Ethereum signée est placée dans le champ message d’un SendZBC ZooBC allant du compte 0x de l’expéditeur au compte 0x du destinataire.
- Chaque nœud analyse la transaction Ethereum, retrouve son signataire à partir de la signature et exige trois choses : que le signataire soit le compte expéditeur, que l’adresse Ethereum
tosoit le destinataire, et que la valeur corresponde au montant en ZBC.
Sur ce chemin, le nœud vérifie la signature Ethereum au lieu du condensé de transaction propre à ZooBC. La transaction transportée peut occuper jusqu’à 4 096 octets de message.
L’adaptateur intégré à chaque nœud
Chaque nœud intègre un adaptateur JSON-RPC Ethereum. Il est activé par défaut (eth_rpc_enabled), écoute par défaut sur le port 8545 de la machine du nœud elle-même (boucle locale) et transmet les requêtes à l’API du nœud, également par la boucle locale. Il répond aux appels que fait un portefeuille tel que MetaMask :
- chaîne et nœud :
eth_chainId,net_version,web3_clientVersion,eth_syncing,eth_mining,eth_hashrate,eth_coinbase,eth_accounts; - état :
eth_blockNumber,eth_getBalance,eth_getTransactionCount,eth_getCode,eth_call; - frais :
eth_estimateGas,eth_gasPrice,eth_maxPriorityFeePerGas; - transactions et blocs :
eth_sendRawTransaction,eth_getTransactionReceipt,eth_getTransactionByHash,eth_getBlockByNumber,eth_getBlockByHash.
eth_sendRawTransaction effectue l’encapsulage. Il construit un SendZBC entre les deux comptes de type 4, fixe le montant à la valeur en wei divisée par 10^10, calcule les frais à partir de gasLimit × gasPrice divisé par 10^10, relevés jusqu’au plancher de frais du nœud s’ils sont inférieurs, et place la transaction Ethereum brute dans le message.
L’identifiant de chaîne est dérivé du hachage de genèse de la chaîne, si bien que chaque chaîne ZooBC présente son propre identifiant. Lorsque eth_rpc_chain_id vaut 0, l’adaptateur calcule :
chain id = (0x0883 << 16) | first two bytes of the genesis hash
Des wei aux unités atomiques
MetaMask compte 18 décimales : il traite une pièce affichée comme 10^18 wei. ZooBC en compte 8 : 1 ZBC vaut 10^8 unités atomiques (pièce ZBC et ses unités). Une unité atomique vaut donc 10^10 wei, et 1 ZBC s’affiche dans MetaMask comme 10^18 wei.
La division est effectuée en pleine précision ; tout reste inférieur à une unité atomique est abandonné, et une valeur trop grande pour un montant signé sur 64 bits est refusée. La vérification du nœud et l’adaptateur utilisent la même conversion, si bien qu’ils concordent toujours.
Lier une adresse Ethereum à un groupe de comptes
Le portefeuille web utilise aussi MetaMask en dehors des transferts. Avec eth_requestAccounts et personal_sign, il demande à MetaMask de signer un consentement qui lie l’adresse Ethereum à un groupe de comptes.
Un adaptateur de style Bitcoin également
Les nœuds incluent aussi un adaptateur RPC de style Bitcoin Core. Il est désactivé par défaut, écoute sur le port 8332 lorsqu’il est activé, et nécessite des identifiants définis par l’opérateur du nœud.