MetaMask y el acceso al estilo de Ethereum
Una clave de Ethereum puede controlar una cuenta de ZooBC cuya dirección es la dirección 0x… normal de esa clave (tipo de cuenta 4, véase claves y tipos de cuenta). MetaMask no necesita saber nada de ZooBC: firma una transacción de Ethereum normal, que viaja dentro de una transacción de ZooBC y que comprueba cada nodo. La cuenta contiene ZBC reales. No intervienen ningún puente, ninguna moneda envuelta ni ninguna clave adicional.
Cómo funciona una transferencia
- MetaMask firma una transferencia de Ethereum normal: EIP-1559, EIP-2930 o heredada con EIP-155, con una lista de acceso vacía.
- La transacción de Ethereum firmada se coloca en el campo de mensaje de un SendZBC de ZooBC desde la cuenta 0x del remitente hasta la cuenta 0x del destinatario.
- Cada nodo analiza la transacción de Ethereum, recupera su firmante a partir de la firma y exige tres cosas: que el firmante sea la cuenta que envía, que la dirección
tode Ethereum sea el destinatario y que el valor coincida con el importe en ZBC.
Por esta vía, el nodo comprueba la firma de Ethereum en lugar del propio resumen de la transacción de ZooBC. La transacción transportada puede ocupar hasta 4096 bytes de mensaje.
El adaptador de cada nodo
Cada nodo incorpora un adaptador JSON-RPC de Ethereum. Está activado por defecto (eth_rpc_enabled), escucha por defecto en el puerto 8545 de la propia máquina del nodo (loopback) y reenvía a la API del nodo, también por loopback. Responde a las llamadas que hace una billetera como MetaMask:
- cadena y nodo:
eth_chainId,net_version,web3_clientVersion,eth_syncing,eth_mining,eth_hashrate,eth_coinbase,eth_accounts; - estado:
eth_blockNumber,eth_getBalance,eth_getTransactionCount,eth_getCode,eth_call; - comisiones:
eth_estimateGas,eth_gasPrice,eth_maxPriorityFeePerGas; - transacciones y bloques:
eth_sendRawTransaction,eth_getTransactionReceipt,eth_getTransactionByHash,eth_getBlockByNumber,eth_getBlockByHash.
eth_sendRawTransaction hace el envoltorio. Construye un SendZBC entre las dos cuentas de tipo 4, fija el importe en el valor en wei dividido entre 10^10, toma la comisión de gasLimit × gasPrice dividido entre 10^10, elevada al suelo de comisión del nodo cuando es menor, y pone la transacción de Ethereum en bruto en el mensaje.
El id de cadena se deriva del hash del génesis de la cadena, así que cada cadena ZooBC presenta su propio id. Con eth_rpc_chain_id a 0, el adaptador calcula:
chain id = (0x0883 << 16) | first two bytes of the genesis hash
De wei a unidades atómicas
MetaMask cuenta 18 decimales: trata una moneda mostrada como 10^18 wei. ZooBC cuenta 8: 1 ZBC son 10^8 unidades atómicas (moneda ZBC y sus unidades). Por tanto, una unidad atómica son 10^10 wei, y 1 ZBC aparece en MetaMask como 10^18 wei.
La división se hace con precisión completa; cualquier resto menor que una unidad atómica se descarta, y un valor demasiado grande para un importe de 64 bits con signo se rechaza. La comprobación del nodo y el adaptador usan la misma conversión, así que siempre coinciden.
Vincular una dirección de Ethereum a un grupo de cuentas
La billetera web también usa MetaMask fuera de las transferencias. Con eth_requestAccounts y personal_sign pide a MetaMask que firme un consentimiento que vincula la dirección de Ethereum a un grupo de cuentas.
También un adaptador al estilo de Bitcoin
Los nodos incluyen además un adaptador RPC al estilo de Bitcoin Core. Está desactivado por defecto, escucha en el puerto 8332 cuando se activa y necesita unas credenciales fijadas por el operador del nodo.