Skip to content

RDPOS consensus algorithm

Achain edited this page Sep 29, 2017 · 1 revision

概览

所有区块链本质上都是一种由交易驱动的确定性状态机,共识算法(consensus)的目的就是为了商定确定性交易顺序, 过滤无效交易的过程,从而保护所有参与者的权益。

目前广泛应用的共识算法主要包括 : 工作证明(POW:Proof of Work), 股权证明(POS:Proof of Stake),实用拜占庭容错算法(PBFT:Practical Byzantine Fault Tolerance), 委任权益证明(DPOS:Delegated Proof of Stake)。任何共识机制都必须回答的问题包括但不限于:

    1. 谁应该生成下一个块 并更新到数据库?
    2. 何时应该生产下一个块?
    3. 哪些交易应该包含在块中?
    4. 协议的更改如何应用?

Achain 平台默认采用 RDPOS ( Result Delegated Proof of Stake )共识机制,该机制以健壮灵活的 DPOS 的算法为基础, 针对智能合约的执行结果状态(Result status),进化为独有的 RDPOS 共识机制。

RDPOS 实现

代理产块细节

每一个token持有者称之为 权益人(stakeholder),都有相应的投票权重。
这些权益人(stakeholder)会投票选举代理节点(delegate)。

代理节点根据权益人投票选举的结果(票数最高的前99位代理)依次轮流产块(block),
这个顺序是由所有代理节点共同决定,并保证无法被预知和篡改。
当一轮产块代理周期结束后,由 random_seed 来决定新一轮的代理产块顺序。

DPOS网络中, 默认 10S 钟产生一个块。在每一个产块周期(10s)内只有一个确定的产块代理产块。
当产块代理在其产块时间片内没有产块,那么该时间片就会被忽略,下一个产块代理在其时间片内会接着产块。

任何人都可以通过观察代理节点的参与度(participation rate)来监视网络的健康。积极参与产块的代理节点会因为提供产块服务而收获工资作为奖励,
,而对于产块失败或者不产块的代理,则会被惩罚, 这些代理不会收获工资,而且长期产块失败或者不产块则会被剔除代理行列。

在DPOS网络中,块(block)是一组交易数据的集合,块中还包含块的高度,前一个块的hash,后一个块的hash,签名,时间戳等参数。 
产块代理充当产块时写入签名和时间戳的角色,并验证交易 签名有效性和时间戳的正确性。

智能合约共识细节

智能合约是由图灵完备的合约语言(glua)编写,经过编译后存储到链上的一段可执行字节码,可以被外部触发调用。
在合约拟定者将合约注册到区块链上后,其他用户可以通过调用接口来参与合约。在合约语言正确表述合约内容的前提下,
在达到执行条件时,系统会按照合约代码的描述执行相应的操作。

1. 从交易的类型上来看,交易可以分为普通交易和合约交易。

    ```
    1)普通交易(非合约交易)
       普通交易在所有节点上验证方法一致,在所有的节点上达成共识。

    2)合约交易(合约原始交易/合约结果交易)
       合约交易分为合约原始交易以及合约结果交易。
       合约原始交易只有在受托人节点上验证会打开解释器进行验证,并产生结果交易;
       除了在交易创建的节点上,在进行交易创建的时候,其他情况下合约交易在普通节点上验证是不会执行解释器,只做基本验证。
       合约交易在受托人节点上达成解释器验证共识,并产生结果交易;在所有普通节点上达成结果交易共识。
    ```

2. 从交易的本质上来看,交易可以分为确定交易和不确定交易

    ```
    1) 确定交易(普通交易/合约结果交易):
        在一些交易中,如转账,用户可以明确的知道要执行的操作,这些交易的创建时会直接将要执行的操作执行存入交易中。
        受托人只需按照交易内容执行打包没有问题的交易即可

    2)非确定交易(合约原始交易):
        在另外一些交易中,如调用合约,调用者并不能预测合约会执行的操作,
        因此创建此种交易时仅保存用户请求,当受托人打包交易时,按照合约执行,
        将结果连同初始的请求一同打包成结果交易,结果交易可以认为是一个确定的交易。
    ```

3. 交易验证

    ```
    1)对于确定交易,验证分为两部分:
        签名验证: 
        在涉及操作资产时,如个人资产出账操作,需要确保交易发起者时该笔资产的
        所有人。系统在操作需要签名的资源时会检查交易中是否存在所需签名。
        
        执行验证:
        按照交易内容执行交易,在不存在逻辑冲突的情况下,如不从只有 20 余额的
        账户提 30 出来之类的操作,都可以通过验证。

    2)对于不确定交易,受托人在进行执行验证时会执行发起人的请求,根据当前链的状况生成可行的结果存入交易,
         用于标识发起人的操作的结果。
    ```

这里与 DPOS 的区别是,由谁进行智能合约执行的验证。DPOS 采用的是代理节点执行智能合约同产块节点的执行进行比对。 而 RDPOS 会根据产块节点当时打包结果的交易的状态 (即这里的 R-Result)来动态决定由代理或全体节点验证智能合约的。

针对特殊的智能合约,如智能合约执行时间较长,智能合约内部状态占用空间较大可采用不同的策略, 既能满足智能合约被快速验证的情况,也能保障智能合约结果交易过大导致交易无法被打包时,出块节点仅打包结果交易 Hash, 从而所有节点自行验证交易 Hash 的情况。

Clone this wiki locally