签名消息与加密消息
并非每个签名都需要一笔交易。签名消息可以证明你持有某个密钥,既不转移任何资金,也不支付手续费;加密消息则只让其接收方能够阅读。本页介绍这两者,以及节点 API接受的两种相关签名。
证明你控制某个地址
想确认你控制某个 ZooBC 地址的网站,会向你发送一个随机质询。你用 zbc-cli sign-message,或用公共命令行工具任一移植版中的同一功能对它签名,网站再根据你的地址检查签名。对于原生 ZBC_ 地址,地址本身就是公钥,因此不需要其他任何东西。发送一笔付款同样能证明控制权,但那是一笔交易,需要支付手续费。永远不要用把私钥交给别人的方式来代替。
这一方案称为 ZBC-MSG-v2。它用 Ed25519 签署:
SHA3-256("ZBC-MSG-v2" ‖ genesis hash ‖ message)
这个摘要中有两部分很重要:
- 标签。 交易是在另一个标签“ZBC-TX”下签署的。因此,消息签名永远不可能作为交易签名有效,交易签名也永远不可能作为消息签名有效。
- 创世哈希。 它把签名绑定到一个网络:为 devnet 签名的消息永远无法在 testnet 或 mainnet 上通过验证(链绑定签名)。
在一段过渡期内,工具的 verify-message 也接受不带链信息的旧形式 ZBC-MSG-v1(对“ZBC-MSG”和消息做 SHA3-256)。过渡期在工具中写定的截止时间结束;此后只有 ZBC-MSG-v2 能通过验证。
消息签名是公共工具以及采用它的服务之间的一项约定,而不是链的功能。链上不存储任何内容,节点也没有对应的端点。
加密消息
每笔交易都可以携带一条消息(交易信封)。普通消息最多 256 字节。加密消息以标记“ZBE1”开头,后接一个发给接收方密钥的 libsodium 密封盒(sealed box),只有接收方的私钥才能打开。加密消息最多可达 320 字节,其中最多留出 268 字节给文本。
只有消息被加密。交易的其余部分,例如发送方、接收方和金额,与其他任何交易一样公开。
签名的 API 请求
节点 API 的大部分是开放的读取,交易也不需要 API 密钥,因为它自带签名。在请求本身必须签名的地方,签名是对文本 METHOD:PATH:TIMESTAMP:BODY 的 Ed25519 签名,有效期 300 秒。在 5 分钟内有 20 次签名认证失败的客户端会被锁定 300 秒。
取消待处理的交易
正在节点交易池中等待的交易,可以用 DELETE /api/v1/transactions/pending/ 后接其哈希,从该节点撤回。该请求带有对以下内容的签名:
SHA3-256("ZBC-CANCEL" ‖ genesis hash ‖ transaction hash)
它只从该节点的交易池中移除这份副本。已经持有该交易的其他节点仍可能把它打包进区块,因此取消只是一个请求,而不是保证。