节点 API
每个 ZooBC 节点都提供一个公共 HTTP API。钱包、区块浏览器、命令行工具和任何网页都通过它读取链并提交交易。读取不需要密钥、账户或 API 密钥,而且 API 会回应托管在任何地方的页面。写入只需要一笔由发送方签名的交易。
基本情况
- 位置:默认在 8080 端口上提供普通 HTTP/1.1,
/api/v1/下有一百多个路由。节点还在/和/wallet提供网页钱包。 - 节点上没有 TLS:公共网站通过网关以 HTTPS 访问 API,网关还会在节点前面放置一个归档服务,用于深远的历史。
- 向所有页面开放:每个响应都带有
Access-Control-Allow-Origin: *,浏览器的 OPTIONS 检查会立即得到回应,因此任何域名上的页面都能调用这个 API(用一个 HTML 页面构建应用)。 - 以读取为主:除八个路由外,其余都是无需认证的读取。提交交易不需要 API 密钥,因为交易自带签名。
- 按客户端地址限制:默认每分钟 300 个写请求(超出后节点返回 429,并带有 Retry-After 头);除非运营者设置了限制,否则读取不受限。
可以读取什么
| 领域 | 示例 |
|---|---|
| 节点与链 | /api/v1/node/info(含 genesis_hash 和 signing_version)、/api/v1/blockchain/rules |
| 账户 | /accounts/:address(余额、可花费余额、锁定的质押)、/history、/transactions、/movements、/datasets、/escrows、/group、/pubkey |
| 交易 | /transactions/:hash/status |
| 节点注册表 | /nodes?status=all、/nodes?status=queued |
| 服务注册表 | /registry/gateways、/registry/archivals、/registry/relays |
| 发布版本 | /release/list、/release/authority |
| 应用 | /apps、/apps/open、/apps/pool、/apps/stats、/apps/:id |
| 跨链桥 | /bridge/coins、/bridge/withdrawals/:hash |
| 脊链 | /spine/blocks/:height |
第二列中的所有路径都位于 /api/v1/ 之下。/movements 列出账户余额的每一次变动及其原因,包括支付的租金和赢得的奖励。/pubkey 仅凭地址就能返回原生账户的公钥。自 0.5.8 版本起,链的路由会报告 finalized_height,每笔交易会带一个 finalized 标志,在一个经联署的脊链区块覆盖其所在区块后被设置(最终性与回滚)。
任何人都可以这样查询任何地址。链记录的是密钥而不是姓名,因此 ZooBC 上的隐私来自地址的使用方式,而不是来自隐藏的余额(账户与地址)。
提交交易
客户端构建交易的字节,使用从 /api/v1/node/info 读到的 genesis_hash,用发送方的密钥签署链绑定摘要(签署交易),然后把结果提交到 POST /api/v1/transactions。不需要任何 SDK:有 Ed25519、SHA3-256 和创世哈希就够了。
节点返回 HTTP 202,意思是“已接受”而不是“已完成”,并返回交易的哈希。随后客户端轮询 /api/v1/transactions/<hash>/status,其状态依次经过:
staging,然后是mempool,此时交易在等待进入区块;- 一旦被打包进区块,变为
confirmed,并附带区块高度; - 或者,如果被拒绝,变为
rejected,并附带原因和所处阶段;如果节点不知道这笔交易,则为not_found(404)。
按每 15 秒一个区块计算,每隔几秒轮询一次就足够了。在凭一笔付款交付货物之前,要等待确认,最好等到最终确定标志。
如果回复丢失,就重新发送完全相同的已签名字节。哈希是根据这些字节计算的,因此已经持有该交易的节点(即使这笔交易已被打包进区块)会再次返回 202,并标记为重复,而交易只会执行一次。用新的时间戳重新签名会产生一笔不同的交易,重复付款正是这样发生的。
签名请求与取消
少数请求带有自己的签名:对 METHOD:PATH:TIMESTAMP:BODY 的 Ed25519 签名,有效期 300 秒。在 5 分钟内有 20 次签名认证失败的客户端会被锁定 300 秒。待处理的交易可以用一个签名的 DELETE 请求从某个节点的交易池中撤回(签名消息与加密消息)。
节点的其他接口
- 8001 端口:节点之间的点对点网络。
- 8545 端口:以太坊式 JSON-RPC 适配器,默认只在节点本机上,供 MetaMask 使用。
- 8332 端口:Bitcoin Core 风格的 RPC 适配器,默认关闭,需要运营者自己设置的凭据。