编辑: 645135144 | 2019-07-02 |
len(DPoSNodes) / 2,则将自己收到的区块和签名广播给其他节 点. 当一个节点收到两个不同的打包节点的区块和签名之后,将两个不同的区 块和签名发送给所有其他节点, 所有节点放弃当前区块,进入下一个区块的打包 并对当前打包节点的作恶行为进行记录. 区块的校验与投票 在每个区块头上, 都会有区块 body 的Hash 校验值, 节点可以向其他节点获 取区块 body,对body 进行处理之后,对当前打包的区块进行投票,所有节点都 会把区块的校验结果进行签名,发送给满足 (currentIndex - miningIndex + len(DPoSNodes)) % len(DPoSNodes) <
len(DPoSNodes) /
2 条件的节点进行唱票.当 任何一个节点收到超过半数对同一个区块的投票之后即可认为当前的区块可写 入区块链中, 并将区块和投票结果发送给所有的节点, 所有节点对区块进行记录. 如果投票的数量不足半数则在一定时间内停止唱票, 将自己的唱票结果发送给其 他节点, 所有节点在收到其他节点的投票结果之后对结果进行合并,判断最后的 投票结果并执行响应的操作. 节点宕机 当一个节点超过一定时间没有出块,当前轮的下一个节点会在 3*interval/2 的时间点开始打包下一个区块,进入下一个区块的打包流程.同理,如果连续节 点宕机,判断当前节点是否需要打包的条件是 currentTime - lastBlockTime >
(2*(currentIndex - LastIndex)+1)*interval/2,一旦满足当前条件,则当前节点开始 打包.如果是最后 n 个区块连续宕机,则按照当前轮的最后一个区块的 hash 值 判断下一轮的顺序,按照递增每个区块加一个出块 interval 的算法进行计算,判 断当前打包的节点并进行打包. 当超过 n/2 的节点宕机的时候,所有节点会自 动停止出块,直到超过 1/2 的节点存活. 上面的容错算法可以保障在少于 n/2 的节点宕机或者叛变的情况下, 系统不 会出现分叉,是一种用计算资源换容错性的方案. 最好情况下:消息复杂度 O(n^2), 时间复杂度 O(1) 最差情况下:消息复杂度 O(n^2), 时间复杂度 O(n) EKT 的主链共识机制为 DPoS,但是其他主链可以通过 EKT 提供的 多链多 共识 机制,自由的定制其他共识机制,比如 POW、POS 等.
四、多链架构 EKT 设计了一套独特的多链架构.在这套多链架构中,除了 EKT 的主链外 还支持多条并行的主链. 每条主链中都会有一个主币.不同的主链可以采用不同 的共识机制,默认的共识机制为 DPoS. 开发者可以通过主链提供的 Consensus 接口创建并完成自己节点的部署. 1. 设计思想 在去中心化的网络里,为了提升安全性必然会牺牲系统的整体效率.CAP 理 论是分布式系统被讨论的最多的理论.其中 C 代表一致性 (Consistency),A 代表 可用性 (Availability),P 代表分区容错性 (Partition tolerance).CAP 理论告诉我们 C、A、P 三者不能同时满足,最多只能满足其中两个.以数据库系统为例,关系 型数据库选择了 C 和A, NoSQL 选择了 A 和P.对区块链来说,由于区块链 建立在一个不可信的网络节点上,导致在同一时间节点,各个服务器上的数据很 难保证完全一致,所以区块链首先放弃了 Consistency.区块链上的数据最终是 一致的, 比特币通过引入了最长链算法,即所有网络里的节点都只认可最长的那 条链.再来看 CAP 理论中的另外两个 Availability 和Partition tolerance.首先, 区块链中的节点通过 P2P 来进行通信,所有的节点地位一致,都可以对外提供 服务,所以 Availability 是有保证的.其次,由于引进了共识算法以及最长链算 法,最终 Partition tolerance 的问题也得到了解决.所以区块链实现了 AP 优先 和数据的最终一致性. 在目前成熟的区块链项目里,比特币系统的 TPS 平均为 7. 以太坊的 TPS 平均为 10~20. 为什么区块链的 TPS 无法达到同样选择 AP 的NoSQL 一样高的 TPS 呢?对区块链来说,TPS=每个区块包含的交易的数量/区块生产间隔时间.如 果想要提高系统的 TPS,就需要提高区块的大小或者缩短区块生产的间隔时间. 以比特币来说,由于比特币采用的是 UTXO 模型,使用 Merkle 树把交易信息 打包到区块,树的深度是 log(n).如果增加区块大小,会给节点的磁盘带来很大 的负担.而如果缩短区块生产间隔时间,在节点数量非常多的情况下,POW 的 共识算法也会影响不同节点区块链数据的最终一致性. EKT 的解决方案是多链多共识机制.对实时性要求比较高的区块链应用,可 以采用 DPoS 共识机制.对去中心化要求比较高的区块链应用可以采用 POW 算法.不同的链之间数据是隔离的,互不影响.既增加了安全性,又提高了应用 的性能. 2. 账户体系 EKT 主链会提供不同的加密算法供用户使用.在EKT 主链中,每个用户可 以提交公钥以及主链支持的加密算法申请个性化的地址.由于 EKT 公链中的用 户地址不是通过公钥计算出来的,而是通过申请得到的.用户可以更换地址背后 所对应的公私钥对. 如果用户更换了自己的公私钥对,那主链以外的其他主链该 如何校验用户的签名信息呢?有两种方法可以实现:第一种是如果对安全性要求 不是太高,那可以同步主链区块,使用最新的区块来校验用户的公钥,即使同步 主链区块略微延时几个区块也不影响.如果用户更新了私钥以后,使用新的私钥 对消息进行签名时, 其他主链校验不通过时该怎么办?这时可以使用第二种方法: 其他主链通过 RPC 调用 EKT 主链的校验方法. 将地址、 消息和签名发送到主链 的节点,节点验证后返回处理结果.一般情况下,如果有(1+n/2)个节点校验通过 则可以视为整体验证通过. 3. 资产转移 在EKT 系统中, 不同主链资产的交易和转移是非常简单的. 假设用户 A 和 用户 B 分别拥有 Token T1 和Token T2,其中 T1 和T2 分别是不同主链的资 产. 我们将操作用户 A 转账一定数量的 T1 给用户 B 定义为 Tx1, 将操作用户 B 转账一定数量的 T2 给用户 A 定义为 Tx2,这个时候 Tx1 是在 Token T1 所在的 主链上进行的,Tx2 是在 Token T2 所在的主链上进行的,手续费分别为两个链上 的主币.由于所有的链共享了同一套用户系统,所以 EKT 天然支持资产的跨链 转移. 一个 Token 只能在一条链上进行打包, 资产转移更改的是当前 Token 打包 的链.一般来说,在EKT 上进行跨链资产转移主要出于以下几个原因:当前主 链网络比较拥堵、想更换其他主链的共识协议、当前区块的交易费用过高、想自 己创建一条链成为主币等等. 资产转移时需要指定转移的高度和目标链,资产转 移之后也就遵循新的主链的共识机制.