46

Istanbul BFT解读(中)

 3 years ago
source link: https://learnblockchain.cn/article/1470
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Istanbul BFT实战

前端时间写了Istanbul BFT的一些原理,以及逻辑详情。今天想写一篇实战的技术文章,所以底层原理就不赘述了。

1、构建节点身份参数,以及创始区块

  • 下载并编译istan...

Istanbul BFT实战

前端时间写了Istanbul BFT的一些原理,以及逻辑详情。今天想写一篇实战的技术文章,所以底层原理就不赘述。下一篇我们将介绍Istanbul BFT的信息存储。

1、构建节点身份参数,以及创始区块

  • 下载并编译istanbul-tools工具
// 参考文档https://github.com/getamis/istanbul-tools
git clone https://github.com/getamis/istanbul-tools.git
cd /Path/to/your/istanbul-tools/
make istanbul
  • 利用istanbul-tools生成节点参数以及创始区块

执行:

./build/bin/istanbul setup --num 4 --nodes --verbose

生成:

validators
{
        "Address": "0x4b143cd4ddd264fe472b0b308fa968523f2b5c8b",
        "Nodekey": "9e9adc3b2d801fbb3410e4c50067c513cad247c7c8ef82c491aebbe8693576be",
        "NodeInfo": "enode://af0b65802b745c10fcc476f42e41084b62f1208f56a6e2a32f3104a0ff8751d394a784caec321edd9b9cf5e4bb70da2a73d74f00284fea42900361ec9f87ccff@0.0.0.0:30303?discport=0"
}
{
        "Address": "0x11bc449be1cad5b68f0b7a9a207142b2306a3ff8",
        "Nodekey": "46e79f8da7d4e7462df73b812e6f5db10f7b7525bed38b4347dad9edadc3b503",
        "NodeInfo": "enode://ca75f485e1f3f98d6f6e0c75535134376312a2454946ad283f3aba6000faba41adf20a50f9d286f237fcb5495863b5e07470fc9acff4ff3e40a1766ce87e27bf@0.0.0.0:30303?discport=0"
}
{
        "Address": "0xb9e292fffa811ec765e9b716d86f9f985870c688",
        "Nodekey": "216b99fd388a26d90de92ca6c45df8c07138f13413f4946986d49c4cf50593d1",
        "NodeInfo": "enode://bc3ab0eb5efe336151c57e361bd0c59fe23b391bdbec1dd55c5952156f7bdc089cb7293cc2ac11f52b8f9727dc1d27001f159ed6c8d4391850670ac5c537adb5@0.0.0.0:30303?discport=0"
}
{
        "Address": "0x35187775b6ef2597b32b93548546560de65ef4f5",
        "Nodekey": "24e86c4df24c1842b4a0a97ce234e6d87f632c18c2a7db0586d77b0bba5a9ae0",
        "NodeInfo": "enode://518e07daa6b546a417e105c8a66905bf78b0d7c7784e120e5e9a30a9dbdb2de3c9fcb55685cee2405e434553ef0b0e43cb462c494388cf1b2d49532ccadbba12@0.0.0.0:30303?discport=0"
}



static-nodes.json
[
        "enode://af0b65802b745c10fcc476f42e41084b62f1208f56a6e2a32f3104a0ff8751d394a784caec321edd9b9cf5e4bb70da2a73d74f00284fea42900361ec9f87ccff@0.0.0.0:30303?discport=0",
        "enode://ca75f485e1f3f98d6f6e0c75535134376312a2454946ad283f3aba6000faba41adf20a50f9d286f237fcb5495863b5e07470fc9acff4ff3e40a1766ce87e27bf@0.0.0.0:30303?discport=0",
        "enode://bc3ab0eb5efe336151c57e361bd0c59fe23b391bdbec1dd55c5952156f7bdc089cb7293cc2ac11f52b8f9727dc1d27001f159ed6c8d4391850670ac5c537adb5@0.0.0.0:30303?discport=0",
        "enode://518e07daa6b546a417e105c8a66905bf78b0d7c7784e120e5e9a30a9dbdb2de3c9fcb55685cee2405e434553ef0b0e43cb462c494388cf1b2d49532ccadbba12@0.0.0.0:30303?discport=0"
]



genesis.json
{
    "config": {
        "chainId": 2017,
        "homesteadBlock": 1,
        "eip150Block": 2,
        "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
        "eip155Block": 3,
        "eip158Block": 3,
        "istanbul": {
            "epoch": 30000,
            "policy": 0
        }
    },
    "nonce": "0x0",
    "timestamp": "0x5f65a55d",
    "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000f89af854944b143cd4ddd264fe472b0b308fa968523f2b5c8b9411bc449be1cad5b68f0b7a9a207142b2306a3ff894b9e292fffa811ec765e9b716d86f9f985870c6889435187775b6ef2597b32b93548546560de65ef4f5b8410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0",
    "gasLimit": "0x47b760",
    "difficulty": "0x1",
    "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365",
    "coinbase": "0x0000000000000000000000000000000000000000",
    "alloc": {
        "11bc449be1cad5b68f0b7a9a207142b2306a3ff8": {
            "balance": "0x446c3b15f9926687d2c40534fdb564000000000000"
        },
        "35187775b6ef2597b32b93548546560de65ef4f5": {
            "balance": "0x446c3b15f9926687d2c40534fdb564000000000000"
        },
        "4b143cd4ddd264fe472b0b308fa968523f2b5c8b": {
            "balance": "0x446c3b15f9926687d2c40534fdb564000000000000"
        },
        "b9e292fffa811ec765e9b716d86f9f985870c688": {
            "balance": "0x446c3b15f9926687d2c40534fdb564000000000000"
        }
    },
    "number": "0x0",
    "gasUsed": "0x0",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}

2、生成节点数据

用之前生成好的 geneis.json (创始区块配置文件)生成节点数据库

build/bin/geth  --datadir "node1" init "genesis.json"
build/bin/geth  --datadir "node2" init "genesis.json"
build/bin/geth  --datadir "node3" init "genesis.json"
build/bin/geth  --datadir "node4" init "genesis.json"

下图展示了 node1 生成后的效果,node1文件夹中包含了 keystoregeth (存储链上数据)目录: AnENBjj.png!mobile

3、启动节点

build/bin/geth --identity "validator1" --datadir "node1" --nodekeyhex "9e9adc3b2d801fbb3410e4c50067c513cad247c7c8ef82c491aebbe8693576be" --mine --debug --metrics --syncmode="full" --istanbul.blockperiod 5 --gasprice 0 --port 30303 --nat any console

build/bin/geth --identity "validator2" --datadir "node2" --nodekeyhex "46e79f8da7d4e7462df73b812e6f5db10f7b7525bed38b4347dad9edadc3b503" --mine --debug --metrics --syncmode="full" --istanbul.blockperiod 5 --gasprice 0 --port 30304 --nat any console

build/bin/geth --identity "validator3" --datadir "node3" --nodekeyhex "216b99fd388a26d90de92ca6c45df8c07138f13413f4946986d49c4cf50593d1" --mine --debug --metrics --syncmode="full" --istanbul.blockperiod 5 --gasprice 0 --port 30305 --nat any console

build/bin/geth --identity "validator4" --datadir "node4" --nodekeyhex "24e86c4df24c1842b4a0a97ce234e6d87f632c18c2a7db0586d77b0bba5a9ae0" --mine --debug --metrics --syncmode="full" --istanbul.blockperiod 5 --gasprice 0 --port 30306 --nat any console

下图展示了启动 node1 后的效果: RzAB3qv.png!mobile

4、链接节点

节点的通过 enode 进行 p2p 链接,每个节点 至少 链接一个其他节点,节点取得串起来后,会通过p2p机制互相进行链接。

// 在每个节点的命令行中输入以下指令
admin.addPeer("anotherNode'sEnode")
// enode在第1步时已经生成,也可以在节点的控制台用命令行显示
admin.nodeInfo.enode

下图展示了node2添加node1节点: 3uYniuz.png!mobile

查看本节点的 enode 以及 链接的节点 ve22aeb.png!mobile

当有 2f+1 个节点串起来后,便会正常出块 q2aAbyb.png!mobile

5、节点可扩展性

Istanbul BFT可通过节点提议来进行添加或去除 validator ,当有 超过一半 的节点投票后, 再经过一个区块 结果便会生效。

5.1 添加 validator

针对新的validator节点,参考之前的1-3步,分别为:1、生成节点配置;2、生成节点数据;3、启动节点。操作略。

之前的4个节点中至少3个节点(既超过一半节点)执行以下:
istanbul.propose("newValidatorAddress", true)

添加绑定地址为 0x216b593dc69068f56ba3a37823b7fa622b843a05 的validator后,会成为一个candidate: EnYZF3q.png!mobile 当有 超过半数 节点propose此candidate后,会多出一个validator: euUvqye.png!mobile

5.2 去除 validator

istanbul.propose("newValidatorAdd", false)

具体查看方式,参考上一步。

Istanbul BFT实战

前端时间写了Istanbul BFT的一些原理,以及逻辑详情。今天想写一篇实战的技术文章,所以底层原理就不赘述。下一篇我们将介绍Istanbul BFT的信息存储。

1、构建节点身份参数,以及创始区块

  • 下载并编译istanbul-tools工具
// 参考文档https://github.com/getamis/istanbul-tools
git clone https://github.com/getamis/istanbul-tools.git
cd /Path/to/your/istanbul-tools/
make istanbul
  • 利用istanbul-tools生成节点参数以及创始区块

执行:

./build/bin/istanbul setup --num 4 --nodes --verbose

生成:

validators
{
        "Address": "0x4b143cd4ddd264fe472b0b308fa968523f2b5c8b",
        "Nodekey": "9e9adc3b2d801fbb3410e4c50067c513cad247c7c8ef82c491aebbe8693576be",
        "NodeInfo": "enode://af0b65802b745c10fcc476f42e41084b62f1208f56a6e2a32f3104a0ff8751d394a784caec321edd9b9cf5e4bb70da2a73d74f00284fea42900361ec9f87ccff@0.0.0.0:30303?discport=0"
}
{
        "Address": "0x11bc449be1cad5b68f0b7a9a207142b2306a3ff8",
        "Nodekey": "46e79f8da7d4e7462df73b812e6f5db10f7b7525bed38b4347dad9edadc3b503",
        "NodeInfo": "enode://ca75f485e1f3f98d6f6e0c75535134376312a2454946ad283f3aba6000faba41adf20a50f9d286f237fcb5495863b5e07470fc9acff4ff3e40a1766ce87e27bf@0.0.0.0:30303?discport=0"
}
{
        "Address": "0xb9e292fffa811ec765e9b716d86f9f985870c688",
        "Nodekey": "216b99fd388a26d90de92ca6c45df8c07138f13413f4946986d49c4cf50593d1",
        "NodeInfo": "enode://bc3ab0eb5efe336151c57e361bd0c59fe23b391bdbec1dd55c5952156f7bdc089cb7293cc2ac11f52b8f9727dc1d27001f159ed6c8d4391850670ac5c537adb5@0.0.0.0:30303?discport=0"
}
{
        "Address": "0x35187775b6ef2597b32b93548546560de65ef4f5",
        "Nodekey": "24e86c4df24c1842b4a0a97ce234e6d87f632c18c2a7db0586d77b0bba5a9ae0",
        "NodeInfo": "enode://518e07daa6b546a417e105c8a66905bf78b0d7c7784e120e5e9a30a9dbdb2de3c9fcb55685cee2405e434553ef0b0e43cb462c494388cf1b2d49532ccadbba12@0.0.0.0:30303?discport=0"
}

static-nodes.json
[
        "enode://af0b65802b745c10fcc476f42e41084b62f1208f56a6e2a32f3104a0ff8751d394a784caec321edd9b9cf5e4bb70da2a73d74f00284fea42900361ec9f87ccff@0.0.0.0:30303?discport=0",
        "enode://ca75f485e1f3f98d6f6e0c75535134376312a2454946ad283f3aba6000faba41adf20a50f9d286f237fcb5495863b5e07470fc9acff4ff3e40a1766ce87e27bf@0.0.0.0:30303?discport=0",
        "enode://bc3ab0eb5efe336151c57e361bd0c59fe23b391bdbec1dd55c5952156f7bdc089cb7293cc2ac11f52b8f9727dc1d27001f159ed6c8d4391850670ac5c537adb5@0.0.0.0:30303?discport=0",
        "enode://518e07daa6b546a417e105c8a66905bf78b0d7c7784e120e5e9a30a9dbdb2de3c9fcb55685cee2405e434553ef0b0e43cb462c494388cf1b2d49532ccadbba12@0.0.0.0:30303?discport=0"
]

genesis.json
{
    "config": {
        "chainId": 2017,
        "homesteadBlock": 1,
        "eip150Block": 2,
        "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
        "eip155Block": 3,
        "eip158Block": 3,
        "istanbul": {
            "epoch": 30000,
            "policy": 0
        }
    },
    "nonce": "0x0",
    "timestamp": "0x5f65a55d",
    "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000f89af854944b143cd4ddd264fe472b0b308fa968523f2b5c8b9411bc449be1cad5b68f0b7a9a207142b2306a3ff894b9e292fffa811ec765e9b716d86f9f985870c6889435187775b6ef2597b32b93548546560de65ef4f5b8410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0",
    "gasLimit": "0x47b760",
    "difficulty": "0x1",
    "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365",
    "coinbase": "0x0000000000000000000000000000000000000000",
    "alloc": {
        "11bc449be1cad5b68f0b7a9a207142b2306a3ff8": {
            "balance": "0x446c3b15f9926687d2c40534fdb564000000000000"
        },
        "35187775b6ef2597b32b93548546560de65ef4f5": {
            "balance": "0x446c3b15f9926687d2c40534fdb564000000000000"
        },
        "4b143cd4ddd264fe472b0b308fa968523f2b5c8b": {
            "balance": "0x446c3b15f9926687d2c40534fdb564000000000000"
        },
        "b9e292fffa811ec765e9b716d86f9f985870c688": {
            "balance": "0x446c3b15f9926687d2c40534fdb564000000000000"
        }
    },
    "number": "0x0",
    "gasUsed": "0x0",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}

2、生成节点数据

用之前生成好的 geneis.json (创始区块配置文件)生成节点数据库

build/bin/geth  --datadir "node1" init "genesis.json"
build/bin/geth  --datadir "node2" init "genesis.json"
build/bin/geth  --datadir "node3" init "genesis.json"
build/bin/geth  --datadir "node4" init "genesis.json"

下图展示了 node1 生成后的效果,node1文件夹中包含了 keystoregeth (存储链上数据)目录: AnENBjj.png!mobile

3、启动节点

build/bin/geth --identity "validator1" --datadir "node1" --nodekeyhex "9e9adc3b2d801fbb3410e4c50067c513cad247c7c8ef82c491aebbe8693576be" --mine --debug --metrics --syncmode="full" --istanbul.blockperiod 5 --gasprice 0 --port 30303 --nat any console

build/bin/geth --identity "validator2" --datadir "node2" --nodekeyhex "46e79f8da7d4e7462df73b812e6f5db10f7b7525bed38b4347dad9edadc3b503" --mine --debug --metrics --syncmode="full" --istanbul.blockperiod 5 --gasprice 0 --port 30304 --nat any console

build/bin/geth --identity "validator3" --datadir "node3" --nodekeyhex "216b99fd388a26d90de92ca6c45df8c07138f13413f4946986d49c4cf50593d1" --mine --debug --metrics --syncmode="full" --istanbul.blockperiod 5 --gasprice 0 --port 30305 --nat any console

build/bin/geth --identity "validator4" --datadir "node4" --nodekeyhex "24e86c4df24c1842b4a0a97ce234e6d87f632c18c2a7db0586d77b0bba5a9ae0" --mine --debug --metrics --syncmode="full" --istanbul.blockperiod 5 --gasprice 0 --port 30306 --nat any console

下图展示了启动 node1 后的效果: RzAB3qv.png!mobile

4、链接节点

节点的通过 enode 进行 p2p 链接,每个节点 至少 链接一个其他节点,节点取得串起来后,会通过p2p机制互相进行链接。

// 在每个节点的命令行中输入以下指令
admin.addPeer("anotherNode'sEnode")
// enode在第1步时已经生成,也可以在节点的控制台用命令行显示
admin.nodeInfo.enode

下图展示了node2添加node1节点: 3uYniuz.png!mobile

查看本节点的 enode 以及 链接的节点 ve22aeb.png!mobile

当有 2f+1 个节点串起来后,便会正常出块 q2aAbyb.png!mobile

5、节点可扩展性

Istanbul BFT可通过节点提议来进行添加或去除 validator ,当有 超过一半 的节点投票后, 再经过一个区块 结果便会生效。

5.1 添加 validator

针对新的validator节点,参考之前的1-3步,分别为:1、生成节点配置;2、生成节点数据;3、启动节点。操作略。

之前的4个节点中至少3个节点(既超过一半节点)执行以下:
istanbul.propose("newValidatorAddress", true)

添加绑定地址为 0x216b593dc69068f56ba3a37823b7fa622b843a05 的validator后,会成为一个candidate: EnYZF3q.png!mobile 当有 超过半数 节点propose此candidate后,会多出一个validator: euUvqye.png!mobile

5.2 去除 validator

istanbul.propose("newValidatorAdd", false)

具体查看方式,参考上一步。

本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

  • 发表于 24分钟前
  • 阅读 ( 9 )
  • 学分 ( 0 )

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK