公共信息放在创世区块里面,同时对创世区块进行哈希,来到下一个区块,我们再对下一个区块进行哈希,并且做一轮门限签名,就是阈值签名,我们收集到足够多的签名,把它们合在一起,得到一个集体签名,这样就得到下一个区块。如此反复,我们就可以把区块链进行下去。 但是,造成的结果就是,我们不光有随机数序列的 Chain,还有 Block Chain,这个 Block Chain 记录了 DKG 所需要的一些消息,以及 DKG 运算的一些结果。 我们假如说在一定的区间运行一整套 DKG,然后新加入的节点在这时候可以报名之类的,运行完出来一个结果,这个结果包括了下一个区间所需要的节点列表,它们各自的公钥,还有集体公钥,这个结果我们把它交给 Summary Block。 实际上我们可以看到 Summary Block 会经过一个门限签名,这个签名所需要用的公钥是上一个区间用的公钥。我们这个区间 Summary Block 会有之后区间运行所需要的公钥,意味着运行一次 DKG 加入了新节点,这个公钥可能就发生了改变。私钥显然是发生了改变,因为有新的节点加入,公钥也发生了改变,我们就说下一个区间是用新的公钥来进行验证签名的。 如此反复我们就得到了每一个区间的 DKG,每一个都有 Summary Block。需要验证 Summary Block,我们必然需要知道上一个区间的公钥是正确的,我们就需要验证上一个区间的 Summary Block,这样它们之间形成了一个链条,这个链条也是追溯到最开始的创世区块,所以我们并没有解决我们想要解决的问题,虽然说做了一些强化,但是没有从根本性上解决,我们还是需要保持历史节点,至少是 Summary Block 的历史节点。 这个怎么办呢?通过研究,我们发现有一种新的算法能够在运行 DKG 的时候不改变它集体的公钥。 这个算法大概的意思:假如说我们这边有一个节点发生故障导致它丢失了,我们加入一个新的节点,已有的这三个节点还是保留它各自的密钥,有它各自的秘密,可以把这些秘密通过零知识证明,不暴露它的秘密。可以做一些 reshare,可以分成四份,这四份再组合在一起。这三个节点都把自己的秘密分四份,四份重新组合一下,又得到了四个节点的私钥和节点的公钥,它们就可以用节点的私钥来做签名。 (责任编辑:admin) |