Hyperledger Burrow初体验

os:ubuntu18.04
burrow:v0.30.2
npm:3.5.2
solc:0.6.4
go:1.14

下载、编译Burrow

git clone https://github.com/hyperledger/burrow.git
cd burrow
git checkout v0.30.2
make build
cp bin/burrow .

需要修改下Makefile才能编译通过,部分代码样式有问题 check不能通过
build: check build_burrow 修改成 build: build_burrow

burrow子命令

❯ ./burrow --help

Usage: burrow [--version] [--directory=<working directory>] COMMAND [arg...]

The EVM smart contract machine with Tendermint consensus

Options:
  -v, --version     Print the Burrow version
  -C, --directory   Change directory before running

Commands:
  start             Start a Burrow node
  spec              Build a GenesisSpec that acts as a template for a GenesisDoc and the configure command
  configure         Create Burrow configuration by consuming a GenesisDoc or GenesisSpec, creating keys, and emitting the config
  keys              A tool for doing a bunch of cool stuff with keys
  explore           Dump objects from an offline Burrow .burrow directory
  deploy            Deploy and test contracts
  natives           Dump Solidity interface contracts for Burrow native contracts
  vent              Start the Vent EVM event and blocks consumer service to populated databases from smart contracts
  dump              Dump chain state to backup
  tx                Submit a transaction to a burrow node
  restore           Restore new chain from backup
  accounts          List accounts and metadata
  abi               List, decode and encode using ABI

生成配置

./burrow spec -p1 -f1 | ./burrow configure -s- > burrow.toml

相当于

./burrow spec --participant-accounts=1 --full-accounts=1 > genesis-spec.json
./burrow configure --genesis-spec=genesis-spec.json > burrow.toml

–participant-accounts=1=>p1
–full-accounts=1=>f1

burrow.toml

BurrowDir = ".burrow"

[GenesisDoc]
  GenesisTime = 2020-04-01T01:43:22Z
  ChainName = "BurrowChain_FAB3C1"
  [GenesisDoc.Params]
    ProposalThreshold = 3
  [GenesisDoc.GlobalPermissions]
    [GenesisDoc.GlobalPermissions.Base]
      Perms = "send | call | createContract | createAccount | bond | name | proposal | input | batch | hasBase | hasRole"
      SetBit = "root | send | call | createContract | createAccount | bond | name | proposal | input | batch | identify | hasBase | setBase | unsetBase | setGlobal | hasRole | addRole | removeRole"

  [[GenesisDoc.Accounts]]
    Address = "36B2954A8683E779B0B719E24327FD0B0ADCB004"
    PublicKey = "{\"CurveType\":\"ed25519\",\"PublicKey\":\"A0BBD9E544023C67C4B02F9A41A3F4F36490848221F5508C7D3B4187A81AF37A\"}"
    Amount = 99999999999999
    Name = "Full_0"
    [GenesisDoc.Accounts.Permissions]
      [GenesisDoc.Accounts.Permissions.Base]
        Perms = "root | send | call | createContract | createAccount | bond | name | proposal | input | batch | identify | hasBase | setBase | unsetBase | setGlobal | hasRole | addRole | removeRole"
        SetBit = "root | send | call | createContract | createAccount | bond | name | proposal | input | batch | identify | hasBase | setBase | unsetBase | setGlobal | hasRole | addRole | removeRole"

  [[GenesisDoc.Accounts]]
    Address = "3123B63BF27A838CE693CADE22485049C2CCD6AA"
    PublicKey = "{\"CurveType\":\"ed25519\",\"PublicKey\":\"957B6147025782295EEB3DE1935089C54B2A0A04DDABBD69049BF678ED5BA784\"}"
    Amount = 9999999999
    Name = "Participant_0"
    [GenesisDoc.Accounts.Permissions]
      [GenesisDoc.Accounts.Permissions.Base]
        Perms = "send | call | name | proposal | input | hasRole"
        SetBit = "send | call | name | proposal | input | hasRole"

  [[GenesisDoc.Validators]]
    Address = "36B2954A8683E779B0B719E24327FD0B0ADCB004"
    PublicKey = "{\"CurveType\":\"ed25519\",\"PublicKey\":\"A0BBD9E544023C67C4B02F9A41A3F4F36490848221F5508C7D3B4187A81AF37A\"}"
    Amount = 9999999999
    Name = "Full_0"

    [[GenesisDoc.Validators.UnbondTo]]
      Address = "36B2954A8683E779B0B719E24327FD0B0ADCB004"
      PublicKey = "{\"CurveType\":\"ed25519\",\"PublicKey\":\"A0BBD9E544023C67C4B02F9A41A3F4F36490848221F5508C7D3B4187A81AF37A\"}"
      Amount = 9999999999

[Tendermint]
  Enabled = true
  Seeds = ""
  SeedMode = false
  PersistentPeers = ""
  ListenHost = "0.0.0.0"
  ListenPort = "26656"
  ExternalAddress = ""
  AddrBookStrict = false
  Moniker = ""
  IdentifyPeers = false
  AuthorizedPeers = ""
  CreateEmptyBlocks = "5m"

[Execution]
  TimeoutFactor = 0.33
  CallStackMaxDepth = 0
  DataStackInitialCapacity = 1024
  DataStackMaxDepth = 0

[Keys]
  GRPCServiceEnabled = true
  AllowBadFilePermissions = false
  RemoteAddress = ""
  KeysDirectory = ".keys"

[RPC]
  [RPC.Info]
    Enabled = true
    ListenHost = "0.0.0.0"
    ListenPort = "26658"
  [RPC.Profiler]
    Enabled = false
    ListenHost = "0.0.0.0"
    ListenPort = "6060"
  [RPC.GRPC]
    Enabled = true
    ListenHost = "0.0.0.0"
    ListenPort = "10997"
  [RPC.Metrics]
    Enabled = false
    ListenHost = "0.0.0.0"
    ListenPort = "9102"
    MetricsPath = "/metrics"
    BlockSampleSize = 100
  [RPC.Web3]
    Enabled = true
    ListenHost = "0.0.0.0"
    ListenPort = "26660"

[Logging]
  Trace = false
  NonBlocking = false
  [Logging.RootSink]
    [Logging.RootSink.Output]
      OutputType = "stdout"
      Format = "json"

启动Burrow

需要制定验证者,可以是序号(burrow.toml配置文件的validator),也可以是验证者address

nohup ./burrow start --validator=0  >burrow.log 2>&1 &

交易

SENDER=36B2954A8683E779B0B719E24327FD0B0ADCB004
RECIPIENT=3123B63BF27A838CE693CADE22485049C2CCD6AA
AMOUNT=10
./burrow tx formulate send -s $SENDER -t $RECIPIENT -a $AMOUNT > tx.json

生成的配置tx.json

{
  "SendTx": {
    "Inputs": [
      {
        "Address": "36B2954A8683E779B0B719E24327FD0B0ADCB004",
        "Amount": 10
      }
    ],
    "Outputs": [
      {
        "Address": "3123B63BF27A838CE693CADE22485049C2CCD6AA",
        "Amount": 10
      }
    ]
  }
}

提交交易,会返回交易的hash

./burrow tx commit --file tx.json
B19F0824DECBDD2FEE43CB31438FA744A54F4EDEB81A1C856666EF44046C6AC7

再看看日志,有记录这笔交易

{"caller":"execution.go:228","component":"Executor","height":1,"log_channel":"Info","message":"Executing transaction","run_call":false,"run_id":"b93fc996-73bc-11ea-891b-c683e38da786","scope":"executor.Execute(tx txs.Tx)","time":"2020-04-01T02:02:51.254874625Z","tx":"TxEnvelope{Signatures: 1, Tx: Tx{ChainID: BurrowChain_FAB3C1-CC46B1; TxHash: B19F0824DECBDD2FEE43CB31438FA744A54F4EDEB81A1C856666EF44046C6AC7; Payload: {\"ChainID\":\"BurrowChain_FAB3C1-CC46B1\",\"Type\":\"SendTx\",\"Payload\":{\"Inputs\":[{\"Address\":\"36B2954A8683E779B0B719E24327FD0B0ADCB004\",\"Amount\":10,\"Sequence\":1}],\"Outputs\":[{\"Address\":\"3123B63BF27A838CE693CADE22485049C2CCD6AA\",\"Amount\":10}]}}}}","tx_hash":"B19F0824DECBDD2FEE43CB31438FA744A54F4EDEB81A1C856666EF44046C6AC7"}
{"ExecuteTx":"tx_hash:B19F0824DECBDD2FEE43CB31438FA744A54F4EDEB81A1C856666EF44046C6AC7","caller":"app.go:195","component":"ABCI_App","height":1,"log_channel":"Info","message":"Execution success","node_info":"Burrow_0.30.2_BurrowChain_FAB3C1-CC46B1_ValidatorID:36B2954A8683E779B0B719E24327FD0B0ADCB004","run_id":"b93fc996-73bc-11ea-891b-c683e38da786","scope":"abci.NewApp","time":"2020-04-01T02:02:51.255223345Z"}
{"caller":"execution.go:228","component":"Executor","height":2,"log_channel":"Info","message":"Executing transaction","run_call":true,"run_id":"b93fc996-73bc-11ea-891b-c683e38da786","scope":"executor.Execute(tx txs.Tx)","time":"2020-04-01T02:02:51.267540673Z","tx":"TxEnvelope{Signatures: 1, Tx: Tx{ChainID: BurrowChain_FAB3C1-CC46B1; TxHash: B19F0824DECBDD2FEE43CB31438FA744A54F4EDEB81A1C856666EF44046C6AC7; Payload: {\"ChainID\":\"BurrowChain_FAB3C1-CC46B1\",\"Type\":\"SendTx\",\"Payload\":{\"Inputs\":[{\"Address\":\"36B2954A8683E779B0B719E24327FD0B0ADCB004\",\"Amount\":10,\"Sequence\":1}],\"Outputs\":[{\"Address\":\"3123B63BF27A838CE693CADE22485049C2CCD6AA\",\"Amount\":10}]}}}}","tx_hash":"B19F0824DECBDD2FEE43CB31438FA744A54F4EDEB81A1C856666EF44046C6AC7"}
{"ExecuteTx":"tx_hash:B19F0824DECBDD2FEE43CB31438FA744A54F4EDEB81A1C856666EF44046C6AC7","caller":"app.go:218","component":"ABCI_App","height":1,"log_channel":"Info","message":"Execution success","node_info":"Burrow_0.30.2_BurrowChain_FAB3C1-CC46B1_ValidatorID:36B2954A8683E779B0B719E24327FD0B0ADCB004","run_id":"b93fc996-73bc-11ea-891b-c683e38da786","scope":"abci.NewApp","time":"2020-04-01T02:02:51.267838691Z"}

智能合约

ADDRESS 替换成toml文件中GenesisDoc.Accounts中的ADDRESS

ADDRESS=7CEDE838329CDE8C8302AC31EEBAF0EEA4BE61E5
./burrow deploy --address $ADDRESS  tests/jobs_fixtures/app06-deploy_basic_contract_and_different_solc_types_packed_unpacked/deploy.yaml

执行后,报错了,缺少soc

log_channel=Info message="Using chain" Chain=127.0.0.1:10997 Signer=
log_channel=Info message="Loading Playbook File."
log_channel=Info message="Loading playbook file" path=/root/burrow/tests/jobs_fixtures/app06-deploy_basic_contract_and_different_solc_types_packed_unpacked filename=/root/burrow/tests/jobs_fixtures/app06-deploy_basic_contract_and_different_solc_types_packed_unpacked/deploy.yaml
log_channel=Info message="*****Executing Job*****" JobName=defaultAddr Type=Account
log_channel=Info message="Setting Account" account=7CEDE838329CDE8C8302AC31EEBAF0EEA4BE61E5
log_channel=Info message="*****Executing Job*****" JobName=deployStorageK Type=Deploy
log_channel=Info message="Contract path" path=storage.sol
ERROR: exec: "solc": executable file not found in $PATHlog_channel=Info message="JOBS THAT FAILED" count=1
log_channel=Info message="Playbook result" jobNo=0 file=tests/jobs_fixtures/app06-deploy_basic_contract_and_different_solc_types_packed_unpacked/deploy.yaml error="exec: \"solc\": executable file not found in $PATH" time=3.589948ms

安装一下,再部署

sudo add-apt-repository ppa:ethereum/ethereum
sudo add-apt-repository ppa:ethereum/ethereum-dev
sudo apt-get update
sudo apt-get install solc

组建私有网络

先杀掉我们上一步实验启动的burrow进程killall burrow,否则端口会起冲突

生成配置

执行下面的命令后,会生成两个配置文件burrow000.toml burrow001.toml

./burrow configure -s- --pool

burrow000.toml

ValidatorAddress = "74E0EBA611656F201DC1BF1A5FA695D12AC749E6"
BurrowDir = ".burrow000"

[GenesisDoc]
  GenesisTime = 2020-04-01T02:12:40Z
  ChainName = "BurrowChain_B8849F"
  [GenesisDoc.Params]
    ProposalThreshold = 3
  [GenesisDoc.GlobalPermissions]
    [GenesisDoc.GlobalPermissions.Base]
      Perms = "send | call | createContract | createAccount | bond | name | proposal | input | batch | hasBase | hasRole"
      SetBit = "root | send | call | createContract | createAccount | bond | name | proposal | input | batch | identify | hasBase | setBase | unsetBase | setGlobal | hasRole | addRole | removeRole"

  [[GenesisDoc.Accounts]]
    Address = "74E0EBA611656F201DC1BF1A5FA695D12AC749E6"
    PublicKey = "{\"CurveType\":\"ed25519\",\"PublicKey\":\"EA73778BD492EDBA48D9BF162A26C942D98B7ECB60FCDBC8D2ED7079E7D89859\"}"
    Amount = 99999999999999
    Name = "Full_0"
    [GenesisDoc.Accounts.Permissions]
      [GenesisDoc.Accounts.Permissions.Base]
        Perms = "root | send | call | createContract | createAccount | bond | name | proposal | input | batch | identify | hasBase | setBase | unsetBase | setGlobal | hasRole | addRole | removeRole"
        SetBit = "root | send | call | createContract | createAccount | bond | name | proposal | input | batch | identify | hasBase | setBase | unsetBase | setGlobal | hasRole | addRole | removeRole"

  [[GenesisDoc.Accounts]]
    Address = "BFC51FC41F4550162E2FF355F571132D6213769C"
    PublicKey = "{\"CurveType\":\"ed25519\",\"PublicKey\":\"16FB8331816E6C79447BE7C2BA0EEECEF2D6FE0597773AD4C8B21563DB94D668\"}"
    Amount = 99999999999999
    Name = "Full_1"
    [GenesisDoc.Accounts.Permissions]
      [GenesisDoc.Accounts.Permissions.Base]
        Perms = "root | send | call | createContract | createAccount | bond | name | proposal | input | batch | identify | hasBase | setBase | unsetBase | setGlobal | hasRole | addRole | removeRole"
        SetBit = "root | send | call | createContract | createAccount | bond | name | proposal | input | batch | identify | hasBase | setBase | unsetBase | setGlobal | hasRole | addRole | removeRole"

  [[GenesisDoc.Validators]]
    Address = "74E0EBA611656F201DC1BF1A5FA695D12AC749E6"
    PublicKey = "{\"CurveType\":\"ed25519\",\"PublicKey\":\"EA73778BD492EDBA48D9BF162A26C942D98B7ECB60FCDBC8D2ED7079E7D89859\"}"
    Amount = 9999999999
    Name = "Full_0"

    [[GenesisDoc.Validators.UnbondTo]]
      Address = "74E0EBA611656F201DC1BF1A5FA695D12AC749E6"
      PublicKey = "{\"CurveType\":\"ed25519\",\"PublicKey\":\"EA73778BD492EDBA48D9BF162A26C942D98B7ECB60FCDBC8D2ED7079E7D89859\"}"
      Amount = 9999999999

  [[GenesisDoc.Validators]]
    Address = "BFC51FC41F4550162E2FF355F571132D6213769C"
    PublicKey = "{\"CurveType\":\"ed25519\",\"PublicKey\":\"16FB8331816E6C79447BE7C2BA0EEECEF2D6FE0597773AD4C8B21563DB94D668\"}"
    Amount = 9999999999
    Name = "Full_1"

    [[GenesisDoc.Validators.UnbondTo]]
      Address = "BFC51FC41F4550162E2FF355F571132D6213769C"
      PublicKey = "{\"CurveType\":\"ed25519\",\"PublicKey\":\"16FB8331816E6C79447BE7C2BA0EEECEF2D6FE0597773AD4C8B21563DB94D668\"}"
      Amount = 9999999999

[Tendermint]
  Enabled = true
  Seeds = ""
  SeedMode = false
  PersistentPeers = "tcp://[email protected]:26656,tcp://[email protected]:26657"
  ListenHost = "127.0.0.1"
  ListenPort = "26656"
  ExternalAddress = ""
  AddrBookStrict = false
  Moniker = "BurrowChain_FAB3C1-CC46B1_Node_36B2954A8683E779B0B719E24327FD0B0ADCB004"
  IdentifyPeers = false
  AuthorizedPeers = ""
  CreateEmptyBlocks = "5m"

[Execution]
  TimeoutFactor = 0.33
  CallStackMaxDepth = 0
  DataStackInitialCapacity = 1024
  DataStackMaxDepth = 0

[Keys]
  GRPCServiceEnabled = true
  AllowBadFilePermissions = false
  RemoteAddress = ""
  KeysDirectory = ".keys"

[RPC]
  [RPC.Info]
    Enabled = true
    ListenHost = "127.0.0.1"
    ListenPort = "26758"
  [RPC.Profiler]
    Enabled = false
    ListenHost = "0.0.0.0"
    ListenPort = "6060"
  [RPC.GRPC]
    Enabled = true
    ListenHost = "127.0.0.1"
    ListenPort = "10997"
  [RPC.Metrics]
    Enabled = false
    ListenHost = "127.0.0.1"
    ListenPort = "9102"
    MetricsPath = "/metrics"
    BlockSampleSize = 100
  [RPC.Web3]
    Enabled = true
    ListenHost = "127.0.0.1"
    ListenPort = "26860"

[Logging]
  Trace = false
  NonBlocking = false
  [Logging.RootSink]
    [Logging.RootSink.Output]
      OutputType = "file"
      Format = "json"
      Path = "burrow000.log"

burrow001.toml

ValidatorAddress = "BFC51FC41F4550162E2FF355F571132D6213769C"
BurrowDir = ".burrow001"

[GenesisDoc]
  GenesisTime = 2020-04-01T02:12:40Z
  ChainName = "BurrowChain_B8849F"
  [GenesisDoc.Params]
    ProposalThreshold = 3
  [GenesisDoc.GlobalPermissions]
    [GenesisDoc.GlobalPermissions.Base]
      Perms = "send | call | createContract | createAccount | bond | name | proposal | input | batch | hasBase | hasRole"
      SetBit = "root | send | call | createContract | createAccount | bond | name | proposal | input | batch | identify | hasBase | setBase | unsetBase | setGlobal | hasRole | addRole | removeRole"

  [[GenesisDoc.Accounts]]
    Address = "74E0EBA611656F201DC1BF1A5FA695D12AC749E6"
    PublicKey = "{\"CurveType\":\"ed25519\",\"PublicKey\":\"EA73778BD492EDBA48D9BF162A26C942D98B7ECB60FCDBC8D2ED7079E7D89859\"}"
    Amount = 99999999999999
    Name = "Full_0"
    [GenesisDoc.Accounts.Permissions]
      [GenesisDoc.Accounts.Permissions.Base]
        Perms = "root | send | call | createContract | createAccount | bond | name | proposal | input | batch | identify | hasBase | setBase | unsetBase | setGlobal | hasRole | addRole | removeRole"
        SetBit = "root | send | call | createContract | createAccount | bond | name | proposal | input | batch | identify | hasBase | setBase | unsetBase | setGlobal | hasRole | addRole | removeRole"

  [[GenesisDoc.Accounts]]
    Address = "BFC51FC41F4550162E2FF355F571132D6213769C"
    PublicKey = "{\"CurveType\":\"ed25519\",\"PublicKey\":\"16FB8331816E6C79447BE7C2BA0EEECEF2D6FE0597773AD4C8B21563DB94D668\"}"
    Amount = 99999999999999
    Name = "Full_1"
    [GenesisDoc.Accounts.Permissions]
      [GenesisDoc.Accounts.Permissions.Base]
        Perms = "root | send | call | createContract | createAccount | bond | name | proposal | input | batch | identify | hasBase | setBase | unsetBase | setGlobal | hasRole | addRole | removeRole"
        SetBit = "root | send | call | createContract | createAccount | bond | name | proposal | input | batch | identify | hasBase | setBase | unsetBase | setGlobal | hasRole | addRole | removeRole"

  [[GenesisDoc.Validators]]
    Address = "74E0EBA611656F201DC1BF1A5FA695D12AC749E6"
    PublicKey = "{\"CurveType\":\"ed25519\",\"PublicKey\":\"EA73778BD492EDBA48D9BF162A26C942D98B7ECB60FCDBC8D2ED7079E7D89859\"}"
    Amount = 9999999999
    Name = "Full_0"

    [[GenesisDoc.Validators.UnbondTo]]
      Address = "74E0EBA611656F201DC1BF1A5FA695D12AC749E6"
      PublicKey = "{\"CurveType\":\"ed25519\",\"PublicKey\":\"EA73778BD492EDBA48D9BF162A26C942D98B7ECB60FCDBC8D2ED7079E7D89859\"}"
      Amount = 9999999999

  [[GenesisDoc.Validators]]
    Address = "BFC51FC41F4550162E2FF355F571132D6213769C"
    PublicKey = "{\"CurveType\":\"ed25519\",\"PublicKey\":\"16FB8331816E6C79447BE7C2BA0EEECEF2D6FE0597773AD4C8B21563DB94D668\"}"
    Amount = 9999999999
    Name = "Full_1"

    [[GenesisDoc.Validators.UnbondTo]]
      Address = "BFC51FC41F4550162E2FF355F571132D6213769C"
      PublicKey = "{\"CurveType\":\"ed25519\",\"PublicKey\":\"16FB8331816E6C79447BE7C2BA0EEECEF2D6FE0597773AD4C8B21563DB94D668\"}"
      Amount = 9999999999

[Tendermint]
  Enabled = true
  Seeds = ""
  SeedMode = false
  PersistentPeers = "tcp://[email protected]:26656,tcp://[email protected]:26657"
  ListenHost = "127.0.0.1"
  ListenPort = "26657"
  ExternalAddress = ""
  AddrBookStrict = false
  Moniker = "BurrowChain_FAB3C1-CC46B1_Node_36B2954A8683E779B0B719E24327FD0B0ADCB004"
  IdentifyPeers = false
  AuthorizedPeers = ""
  CreateEmptyBlocks = "5m"

[Execution]
  TimeoutFactor = 0.33
  CallStackMaxDepth = 0
  DataStackInitialCapacity = 1024
  DataStackMaxDepth = 0

[Keys]
  GRPCServiceEnabled = true
  AllowBadFilePermissions = false
  RemoteAddress = ""
  KeysDirectory = ".keys"

[RPC]
  [RPC.Info]
    Enabled = true
    ListenHost = "127.0.0.1"
    ListenPort = "26759"
  [RPC.Profiler]
    Enabled = false
    ListenHost = "0.0.0.0"
    ListenPort = "6060"
  [RPC.GRPC]
    Enabled = true
    ListenHost = "127.0.0.1"
    ListenPort = "10998"
  [RPC.Metrics]
    Enabled = false
    ListenHost = "127.0.0.1"
    ListenPort = "9103"
    MetricsPath = "/metrics"
    BlockSampleSize = 100
  [RPC.Web3]
    Enabled = true
    ListenHost = "127.0.0.1"
    ListenPort = "26861"

[Logging]
  Trace = false
  NonBlocking = false
  [Logging.RootSink]
    [Logging.RootSink.Output]
      OutputType = "file"
      Format = "json"
      Path = "burrow001.log"

启动第一个节点

nohup ./burrow start --config=burrow000.toml >/dev/null 2>&1 &

启动第二个节点

nohup ./burrow start --config=burrow001.toml >/dev/null 2>&1 &

检查是否连接成功

curl -s 127.0.0.1:26758/consensus
curl -s 127.0.0.1:26758/consensus
curl -s 127.0.0.1:26759/consensus
{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "round_state": {
      "height": "2",
      "round": "0",
      "step": 2,
      "start_time": "2020-04-01T02:21:10.589956473Z",
      "commit_time": "2020-04-01T02:21:10.259956473Z",
      "validators": {
        "validators": [
          {
            "address": "74E0EBA611656F201DC1BF1A5FA695D12AC749E6",
            "pub_key": {
              "type": "tendermint/PubKeyEd25519",
              "value": "6nN3i9SS7bpI2b8WKibJQtmLfstg/NvI0u1weefYmFk="
            },
            "voting_power": "9999999999",
            "proposer_priority": "0"
          },
          {
            "address": "BFC51FC41F4550162E2FF355F571132D6213769C",
            "pub_key": {
              "type": "tendermint/PubKeyEd25519",
              "value": "FvuDMYFubHlEe+fCug7uzvLW/gWXdzrUyLIVY9uU1mg="
            },
            "voting_power": "9999999999",
            "proposer_priority": "0"
          }
        ],
        "proposer": {
          "address": "BFC51FC41F4550162E2FF355F571132D6213769C",
          "pub_key": {
            "type": "tendermint/PubKeyEd25519",
            "value": "FvuDMYFubHlEe+fCug7uzvLW/gWXdzrUyLIVY9uU1mg="
          },
          "voting_power": "9999999999",
          "proposer_priority": "0"
        }
      },
      "proposal": null,
      "proposal_block": null,
      "proposal_block_parts": null,
      "locked_round": "-1",
      "locked_block": null,
      "locked_block_parts": null,
      "valid_round": "-1",
      "valid_block": null,
      "valid_block_parts": null,
      "votes": [
        {
          "round": "0",
          "prevotes": [
            "nil-Vote",
            "nil-Vote"
          ],
          "prevotes_bit_array": "BA{2:__} 0/19999999998 = 0.00",
          "precommits": [
            "nil-Vote",
            "nil-Vote"
          ],
          "precommits_bit_array": "BA{2:__} 0/19999999998 = 0.00"
        },
        {
          "round": "1",
          "prevotes": [
            "nil-Vote",
            "nil-Vote"
          ],
          "prevotes_bit_array": "BA{2:__} 0/19999999998 = 0.00",
          "precommits": [
            "nil-Vote",
            "nil-Vote"
          ],
          "precommits_bit_array": "BA{2:__} 0/19999999998 = 0.00"
        }
      ],
      "commit_round": "-1",
      "last_commit": {
        "votes": [
          "Vote{0:74E0EBA61165 1/00/2(Precommit) AC20689E6673 3F18B4554714 @ 2020-04-01T02:21:10.156997478Z}",
          "Vote{1:BFC51FC41F45 1/00/2(Precommit) AC20689E6673 EA6A5F6E53E0 @ 2020-04-01T02:21:09.951555109Z}"
        ],
        "votes_bit_array": "BA{2:xx} 19999999998/19999999998 = 1.00",
        "peer_maj_23s": {}
      },
      "last_validators": {
        "validators": [
          {
            "address": "74E0EBA611656F201DC1BF1A5FA695D12AC749E6",
            "pub_key": {
              "type": "tendermint/PubKeyEd25519",
              "value": "6nN3i9SS7bpI2b8WKibJQtmLfstg/NvI0u1weefYmFk="
            },
            "voting_power": "9999999999",
            "proposer_priority": "-9999999999"
          },
          {
            "address": "BFC51FC41F4550162E2FF355F571132D6213769C",
            "pub_key": {
              "type": "tendermint/PubKeyEd25519",
              "value": "FvuDMYFubHlEe+fCug7uzvLW/gWXdzrUyLIVY9uU1mg="
            },
            "voting_power": "9999999999",
            "proposer_priority": "9999999999"
          }
        ],
        "proposer": {
          "address": "74E0EBA611656F201DC1BF1A5FA695D12AC749E6",
          "pub_key": {
            "type": "tendermint/PubKeyEd25519",
            "value": "6nN3i9SS7bpI2b8WKibJQtmLfstg/NvI0u1weefYmFk="
          },
          "voting_power": "9999999999",
          "proposer_priority": "-9999999999"
        }
      },
      "triggered_timeout_precommit": false
    },
    "peers": [
      {
        "node_address": "dcee77e2804156971bab6f9ca741f3b14c8ed32b@[email protected]:26656",
        "peer_state": {
          "round_state": {
            "height": "2",
            "round": "0",
            "step": 1,
            "start_time": "2020-04-01T02:21:10.25925951Z",
            "proposal": false,
            "proposal_block_parts_header": {
              "total": "0",
              "hash": ""
            },
            "proposal_block_parts": null,
            "proposal_pol_round": "-1",
            "proposal_pol": "__",
            "prevotes": "__",
            "precommits": "__",
            "last_commit_round": "0",
            "last_commit": "xx",
            "catchup_commit_round": "-1",
            "catchup_commit": "__"
          },
          "stats": {
            "votes": "2",
            "block_parts": "1"
          }
        }
      }
    ]
  }
}#
发布了35 篇原创文章 · 获赞 3 · 访问量 4073

猜你喜欢

转载自blog.csdn.net/kk3909/article/details/105238967