MetaMask 与以太坊式访问
以太坊密钥可以控制一个 ZooBC 账户,其地址就是该密钥普通的 0x… 地址(账户类型 4,见 密钥与账户类型)。MetaMask 不需要了解任何关于 ZooBC 的信息:它签署一笔普通的以太坊交易,这笔交易装在一笔 ZooBC 交易中传送,并由每个节点检查。账户持有的是真正的 ZBC。这里不涉及跨链桥和封装币,也没有额外的密钥。
转账如何进行
- MetaMask 签署一笔普通的以太坊转账:EIP-1559、EIP-2930 或带 EIP-155 的传统格式,访问列表为空。
- 这笔已签名的以太坊交易被放入一笔 ZooBC SendZBC 的消息字段中,该 SendZBC 从发送方的 0x 账户发往接收方的 0x 账户。
- 每个节点解析这笔以太坊交易,从签名中恢复出签名者,并要求三件事:签名者是发送账户,以太坊的
to地址是接收方,且金额与 ZBC 数额一致。
在这条路径上,节点检查的是以太坊签名,而不是 ZooBC 自己的交易摘要。被携带的交易最多可占用 4,096 字节的消息空间。
每个节点中的适配器
每个节点都内嵌一个以太坊 JSON-RPC 适配器。它默认启用(eth_rpc_enabled),默认监听节点本机(回环地址)的 8545 端口,并同样通过回环地址转发到节点的 API。它回应 MetaMask 这类钱包发出的调用:
- 链与节点:
eth_chainId、net_version、web3_clientVersion、eth_syncing、eth_mining、eth_hashrate、eth_coinbase、eth_accounts; - 状态:
eth_blockNumber、eth_getBalance、eth_getTransactionCount、eth_getCode、eth_call; - 手续费:
eth_estimateGas、eth_gasPrice、eth_maxPriorityFeePerGas; - 交易与区块:
eth_sendRawTransaction、eth_getTransactionReceipt、eth_getTransactionByHash、eth_getBlockByNumber、eth_getBlockByHash。
封装由 eth_sendRawTransaction 完成。它在两个类型 4 账户之间构建一笔 SendZBC,把金额设为以 wei 计的数值除以 10^10;手续费取 gasLimit × gasPrice 除以 10^10,低于节点的手续费下限时提高到该下限;并把原始以太坊交易放进消息中。
链 ID 由链的创世哈希派生,因此每条 ZooBC 链都呈现自己的 ID。当 eth_rpc_chain_id 设为 0 时,适配器这样计算:
chain id = (0x0883 << 16) | first two bytes of the genesis hash
从 wei 到原子单位
MetaMask 按 18 位小数计数:它把显示的一枚币视为 10^18 wei。ZooBC 按 8 位计数:1 ZBC 等于 10^8 个原子单位(ZBC 币及其单位)。因此一个原子单位等于 10^10 wei,而 1 ZBC 在 MetaMask 中显示为 10^18 wei。
除法以全精度进行;小于一个原子单位的余数会被舍弃,超出有符号 64 位金额范围的数值会被拒绝。节点的检查和适配器使用同一种换算,因此两者始终一致。
把以太坊地址链接到账户组
网页钱包在转账之外也会用到 MetaMask。它通过 eth_requestAccounts 和 personal_sign 请 MetaMask 签署一份同意书,把该以太坊地址链接到一个账户组中。
还有比特币式适配器
节点还包含一个 Bitcoin Core 风格的 RPC 适配器。它默认关闭,启用后监听 8332 端口,并需要由节点运营者设置的凭据。