这个怎么办呢?通过研究,我们发现有一种新的算法能够在运行 DKG 的时候不改变它集体的公钥。 这个算法大概的意思:假如说我们这边有一个节点发生故障导致它丢失了,我们加入一个新的节点,已有的这三个节点还是保留它各自的密钥,有它各自的秘密,可以把这些秘密通过零知识证明,不暴露它的秘密。可以做一些 reshare,可以分成四份,这四份再组合在一起。这三个节点都把自己的秘密分四份,四份重新组合一下,又得到了四个节点的私钥和节点的公钥,它们就可以用节点的私钥来做签名。 把这些签名合在一起,需要验证集体签名所需要的集体公钥,它跟以前是一模一样的,也就是说集体公钥是没有发生变化的。虽然我们又运行了一次 DKG,虽然我们加入了新的节点,但是我们保证了公钥的不变性。这就解决了刚才谈到的问题,即 Summary Block 需要保持它的历史区块的问题。即只需要一个公钥,就不需要保存历史记录了。 具体到实现上还是有一些新的问题。从节点的角度来说,新节点的加入,它要产生下一个区块的话,就需要知道前一个区块的哈希,所以就需要和其他节点交互,得到前一个区块,比如在 203 的区块高度,我们发现做今后的计算我们不需要高度 200 以前的数据,我们只需要高度 200 以后的数据,假设这中间数据的依赖关系已经可以做到这点,就是说 200 以前我们可以完全丢掉,这时候在 200 这个高度我们就可以对 200 高度的这些区块,这些状态和它一起打个包,把这个包做一个签名,得到了集体签名之后,这个包就可以用来给新加入的节点。 它只需要验证一下这个包是可信的,再跟其它的节点同步一下,我们把从这个包到目前最新的区块重新同步到新的节点上来,这个新的节点就可以加入接下来的计算了。 通过这样一个方式,我们能够对 DKG 的算法进行一些改进,加入零知识证明和 resharing 的方法,我们就可以丢弃历史包袱。 我们来看一下这个技术在 Internet Computer Blockchain 架构里面的具体应用。 (责任编辑:admin) |