学习使我快乐番外篇九:关于子链(4)
今天本小白学习小虎总的系列文章——子链实现三部曲,具体为子链创建过程、子链刷新过程和选择子链节点。本小白不懂技术,只能看个大概了。
子链创建过程
子链创建的前提条件是已经创建子链的协议合约,子链创建必须设置以下参数:
1、所采用的协议
2、子链的SCS个数[min,max],选择总节点数的千分比
3、子链刷新周期
4、子链逻辑代码Funccode
子链的具体创建流程,分为如下四个步骤:
1、DAPP部署者在v-node端部署一个全局的子链合约,设置Funccode;
2、DAPP部署者调用RegisterOpen,允许SCS进来注册。同时调用V-node代码,如果检测到相连的scs符合要求,向scs推送一个enroll 的message;
3、SCS节点发起一个对子链合约的RegisterAsSCS的调用,来确认参与这个子链;
4、DAPP部署者调用RegisterClose,关闭注册,V-node在执行时,判断条件是否满足。如果满足,v-node向scs推送一个newSubchain msg。SCS端触发一系列的初始化操作,完成subchain的设置。 如果条件不满足,DAPP部署者重新发起这个过程。
值得注意的是,在这篇文章的描述中,子链的英文是subchain,而在最近的专访以及文章中,子链对应的英文是microchain。文中用图示给出了子链的创建过程。
子链刷新过程
子链的刷新,即子链的flush过程,即子链通过定期与母链进行数据/哈希值的同步,使子链得到母链的最终确认,达到最终共识的过程。子链刷新的参数在subchainbase.sol中定义,包括刷新周期、刷新id索引、刷新过期数值等。
子链进行刷新的具体过程如下:
1. 刷新周期到的时候,SCS节点调用子链合约的createProposal,发起一个刷新请求交易flushTX;
2. V-node接受到flushTX后,处理相应的逻辑,并将推送消息到相应的scs node,告知有新的proposal;
3. 如果SCS node发现没有问题,它们不需要反应;
4. 如果SCS node发现这个proposal有问题,它可以发起一个新的proposal,并通过TX调用DisbuteProposal,之后触发v-node将推送消息到相应的scs node。一旦SCS节点收到消息,那么所有的SCS必须响应,一个SCS只能对其中的一个进行投票(由智能合约保证);
5. 最初发起proposal和发起disbute的SCS节点设置timer,在指导的时间内,获得投票的结果。如果得票超过50%,那么这个节点就发起一个TX来调用子链合约的Approval function;
6. 合法的proposal被接受,并被记录到区块链中,错误的proposal和所有对错误的proposal进行投票的人将被扣掉相应的保证金。
值得注意的是,子链向母链的刷新过程,只是将哈希值传输到母链并进行确认,子链自身的数据仍保存在SCS节点上。
选择子链节点
子链节点的选择通过三个步骤实现:
1. 子链设定一个需要选择的SCS节点数范围[min,max]。然后调用子链协议合约的getSelectionTarget(),根据当前的注册的SCS总数,得到一个selection target。
2. V-node比较子链地址和与自己相连的SCS地址的距离,如果小于selection target,则通知SCS。
3. SCS得到register的通知,必须主动调用子链的RegisterAsSCS来确定自己参与到该子链。
通过以上的选择过程,可以实现:
1. 选择的过程是随机的
2. SCS的选择根据当前的SCS节点总数自动调整
3. SCS的显示确认保证SCS的liveness
这样的选择方式,保证了子链节点的稳定性和安全性,子链节点的IP和端口是保密的,极大提升了攻击难度,增加了子链运行的可靠性。
以上就是本小白今天的学习内容,技术文章看的还是晕晕乎乎的,希望以后可以看懂哈。