ZooBC 维基
集成

MetaMask 与以太坊式访问

以太坊密钥可以控制一个 ZooBC 账户,其地址就是该密钥普通的 0x… 地址(账户类型 4,见 密钥与账户类型)。MetaMask 不需要了解任何关于 ZooBC 的信息:它签署一笔普通的以太坊交易,这笔交易装在一笔 ZooBC 交易中传送,并由每个节点检查。账户持有的是真正的 ZBC。这里不涉及跨链桥和封装币,也没有额外的密钥。

转账如何进行

  1. MetaMask 签署一笔普通的以太坊转账:EIP-1559、EIP-2930 或带 EIP-155 的传统格式,访问列表为空。
  2. 这笔已签名的以太坊交易被放入一笔 ZooBC SendZBC 的消息字段中,该 SendZBC 从发送方的 0x 账户发往接收方的 0x 账户。
  3. 每个节点解析这笔以太坊交易,从签名中恢复出签名者,并要求三件事:签名者是发送账户,以太坊的 to 地址是接收方,且金额与 ZBC 数额一致。

在这条路径上,节点检查的是以太坊签名,而不是 ZooBC 自己的交易摘要。被携带的交易最多可占用 4,096 字节的消息空间。

MetaMask 签署一笔以太坊交易,8545 端口上的适配器把它封装进 SendZBC 的消息字段,每个节点检查签名者、接收方和金额
MetaMask 签署一笔以太坊交易,8545 端口上的适配器把它封装进 SendZBC 的消息字段,每个节点检查签名者、接收方和金额

每个节点中的适配器

每个节点都内嵌一个以太坊 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 把 1 ZBC 计为 10^18 wei,ZooBC 计为 10^8 个原子单位;500,000,000,000,000,000 wei 除以 10^10 得到 50,000,000 个原子单位,即 0.5 ZBC
MetaMask 把 1 ZBC 计为 10^18 wei,ZooBC 计为 10^8 个原子单位;500,000,000,000,000,000 wei 除以 10^10 得到 50,000,000 个原子单位,即 0.5 ZBC

把以太坊地址链接到账户组

网页钱包在转账之外也会用到 MetaMask。它通过 eth_requestAccounts 和 personal_sign 请 MetaMask 签署一份同意书,把该以太坊地址链接到一个账户组中。

还有比特币式适配器

节点还包含一个 Bitcoin Core 风格的 RPC 适配器。它默认关闭,启用后监听 8332 端口,并需要由节点运营者设置的凭据。

另见