使用DBFT共识算法

使用共识算法dbft的DApp是src/coin3。 DBFT例子,我们使用了BuckyCloud开发的下一代P2P协议,而不是使用TCP协议。由于使用了BDT协议,因此在BlockChain运行之前需要先启动一个超级节点(SuperNode, SN)。BDT协议请参考:https://buckycloud.com/bdt.html

此外,DBFT协议的特性,挖矿节点出块的时间与上一个块之间的时间间隔有时序关系。为了快速测试,建议下面两个步骤顺序同步操作:

  • 创建创世块
  • 启动超级挖矿节点

src/coin3/chiain/config.json里配置了超级挖矿节点:

{
    "handler":"./handler.js",
    "type": {
        "consensus":"dbft",
        "features":[]
    },
    "global": {
        "minValidator": 1,
        "maxValidator": 21,
        "reSelectionBlocks": 5,
        "blockInterval": 10,
        "minWaitBlocksToMiner": 1,
        "systemPubkey": "0309d4c1abb011bcbeabd46cdfbd19eb734c7110e6d94cb08d2418ac1251f0421f",
        "superAdmin": "13CS9dBwmaboedj2hPWx6Dgzt4cowWWoNZ",  //  超级挖矿节点,也就是miner1
        "agreeRateNumerator": 2,
        "agreeRateDenominator": 3
    }
}

src/coin3/chain.json里,我们配置了两个挖矿节点的启动参数:

"miner1":{
        "program": "chain_host",
        "args":[
            "miner",

            "--genesis", "./data/coin3/genesis",
            "--dataDir", "./data/coin3/miner1",
            "--minerSecret", "e109b61f011c9939ac51808fac542b66fcb358f69bf710f5d11eb5d1f3e82bc3",

            "--net", "bdt", 
            "--host", "127.0.0.1", 
            "--port", "12312",
            "--peerid", "13CS9dBwmaboedj2hPWx6Dgzt4cowWWoNZ",
            "--sn", "SN_PEER_DBFT@127.0.0.1@12405@12406",
            "--bdt_log_level", "info",

            "--rpchost", "localhost",
            "--rpcport", "18089",

            "--loggerConsole",
            "--loggerLevel", "debug",
            "--feelimit", "10"
        ]
    },
    "miner2":{
        "program": "chain_host",
        "args":[
            "miner",

            "--genesis", "./data/coin3/genesis",
            "--dataDir", "./data/coin3/miner2",
            "--minerSecret", "c07ad83d2c5627acece18312362271e22d7aeffb6e2a6e0ffe1107371514fdc2",

            "--net", "bdt", 
            "--host", "127.0.0.1", 
            "--port", "12313",
            "--peerid", "12nD5LgUnLZDbyncFnoFB43YxhSFsERcgQ",
            "--sn", "SN_PEER_DBFT@127.0.0.1@12405@12406",
            "--bdt_log_level", "info",

            "--rpchost", "localhost",
            "--rpcport", "18089",

            "--loggerConsole",
            "--loggerLevel", "debug",
            "--feelimit", "10"
        ]
    },

从配置里,也可以看到BDT相关的参数配置。src/coin3/chain.json里也添加了启动超级节点(SN)的配置:

"startSN":{
    "program": {
        "windows":  "./node_modules/.bin/startSN.cmd",
        "linux": "./node_modules/.bin/startSN"
    },
    "args":[
        "peerid=SN_PEER_DBFT",
        "out_host=127.0.0.1",
        "tcpPort=12405",
        "udpPort=12406"
    ]
}

最后,配置了一个按顺序一次性执行创建创世块以及启动超级挖矿节点:

"fastStart":{
    "type":"group",
    "groups":[
        {
            "session": "create",   // 创建创世块
            "sync": true           // 通过sync字段可以指定是否同步执行
        },
        {
            "session": "miner1",   // 启动超级挖矿节点1
            "sync": true          // 异步执行
        },
    ]
}

下面是构建基于DBFT的BlockChain的操作步骤:

  1. gulp build
  2. 单独打开一个终端,启动超级节点:node run.js -chain coin3 -session startSN
  3. 单独打开一个终端,按顺序一次性执行创建创世块、启动两个挖矿节点:node run.js -chain coin3 -session fastStart
    • 观察并等待data/coin3/miner1/Block下有两个Block数据后再执行下一个步骤
  4. 单独打开一个终端,启动另一个挖矿节点:node run.js -chain coin3 -session miner2
  5. 单独打开一个终端,启动交互式钱包客户端:node run.js -chain dbft -session wallet
  6. 在wallet的交互式命令行里,注册miner2,加入参与dbft的共识算法:
    chain.register('12nD5LgUnLZDbyncFnoFB43YxhSFsERcgQ', '1');
    

results matching ""

    No results matching ""