多重签名
多重签名账户是一个不受任何单一密钥控制的账户。它由一份参与方列表和一个阈值定义,只有当至少达到该数量的参与方签署了同一笔交易时才能花费:三选二、五选三,依此类推。参与方可以使用不同类型的密钥,因此一把 ZooBC 密钥、一把以太坊密钥和一把比特币密钥可以共用一个账户。
账户
多重签名账户由其阈值(从 1 到参与方数量)、一个 nonce 和参与方地址定义。它的地址是这些内容的哈希:
address = SHA3-256( threshold ‖ nonce ‖ count ‖ sorted participant addresses )
得到的结果被当作一个普通的类型 0 账户使用,因此它可以像任何地址一样接收 ZBC。没有人持有它的私钥,所以从中花费的唯一方式就是收集参与方的签名。
逐步花费
- 有人在一笔 MultiSignature 交易中提议一笔内部交易,例如一笔付款。内部交易是未签名的,其发送方是该多重签名账户。
- 参与方添加各自的签名,可以一次全部添加,也可以在后续的 MultiSignature 交易中添加,顺序不限。MultiSignature 交易体可以携带账户定义、内部交易和签名的任意组合,因此多笔这样的包装交易可以逐步凑成同一笔内部交易。
- 每个参与方用自己密钥类型的方案签署内部交易的链绑定摘要
SHA3-256("ZBC-TX" ‖ genesis hash ‖ inner bytes)(见 签署交易)。签名按内部交易的哈希存储。来自非参与方的签名,或无法通过验证的签名,根本不会被计入。 - 当有效签名达到阈值时,内部交易执行一次。由多重签名账户支付其手续费(至少为内部交易的下限),并且该内部交易被永久标记为已执行,因此永远不能被重放。
每笔 MultiSignature 包装交易的发送方,自行支付该包装交易的手续费。
不需要在链下构造联合签名,也不强制签名顺序:每把密钥各自用自己的方案单独签名。
它能做什么
内部交易可以是以下类型之一:
- Empty 或 SendZBC;
- 四种节点注册类型之一(注册、更新、移除和认领节点注册);
- SetSplitPolicy;
- 四种账户组类型之一(LinkAccount、UnlinkAccount、SetMemberPermissions 和 TransferGroupControl)。
因此,多重签名账户可以支付 ZBC、持有节点注册、用分账策略分享其收入,并参与账户组,但它不能直接发送代币。它可以凭达到阈值的签名同意加入一个组,就像单个密钥用自己的签名表示同意一样。
按照每个账户每个区块一笔交易的规则,内部交易执行时计入该多重签名账户。
谁有发言权
只有参与方的签名才算数。已注册节点不会替该账户签名;它们只是像检查其他任何签名一样检查参与方的签名。无论金额多大,ZooBC Foundation 对它也没有任何发言权。