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"
}
}
}
]
}
}#