Burrow私鍊搭建預研
1. 引言
1.1 目的
本文為Burrow私鍊搭建預研分析。
2.預研環境
- Go語言版本:1.11以上
- Goland安裝mod
-
https://goproxy.cn
-
- 執行指令
-
go mod vendor
-
- 安裝指令
go get github.com/hyperledger/burrow
cd $GOPATH/src/github.com/hyperledger/burrow
export GO111MODULE=on
make build
#burrow 可執行檔案預設在$HOME/go/bin下
3. 啟動一個單節點
3.1 編譯cmd檔案
3.2 建立burrow.toml檔案
# Read spec on stdin
burrow spec -p1 -f1 | burrow configure -s- > burrow.toml
3.3 建立創世檔案
# This is a place we can store config files and burrow's working directory '.burrow'
mkdir chain_dir && cd chain_dir
burrow spec --participant-accounts=1 --full-accounts=1 > genesis-spec.json
burrow configure --genesis-spec=genesis-spec.json > burrow.toml
3.4 啟動burrow
# To select our validator address by index in the GenesisDoc
# Or to select based on address directly (substituting the example address below with your validator's):
burrow start --address=9F50D730BD69A7258F5EA9DDD8A92B58FE763C7C
#位址需要在.key/data/下有賬号才行
3.5 如果要重置節點,隻需删除工作目錄即可
rm -rf .burrow
4. 發送一筆交易
4.1 建立部署檔案test.yaml,内容如下:
jobs:
- name: sendTxTest1
send:
destination: PUT_HERE_ONE_ACCOUNT_OF_YOUR_GENESIS
amount: 42
4.2 将test.yaml發送至單節點,并替換簽名位址$SIGNING_ADDRESS
SIGNING_ADDRESS=HERE_ONE_VALIDATOR_ADDRESS_OF_THE_GENESIS
burrow deploy --address BE584820DC904A55449D7EB0C97607B40224B96E test.yaml
4.3 輸出結果如下:
*****Executing Job*****
Job Name => defaultAddr
*****Executing Job*****
Job Name => sendTxTest1
Transaction Hash => 41E0C13D1515F83E6FFDC5032C60682BE1F5B19A
Writing [test.output.json] to current directory
5. 部署合約
5.1 檔案準備
- 部署合約需要solidity合約和deploy.yaml檔案,并且在同一目錄下,并沒有其他的yaml 和 sol檔案。
5.2 deploy.yaml 示例如下:
jobs:
- name: deployStorageK
deploy:
contract: storage.sol
- name: setStorageBaseBool
set:
val: "true"
- name: setStorageBool
call:
destination: $deployStorageK
function: setBool
data:
- $setStorageBaseBool
- name: queryStorageBool
query-contract:
destination: $deployStorageK
function: getBool
- name: assertStorageBool
assert:
key: $queryStorageBool
relation: eq
val: $setStorageBaseBool
# tests string bools: #71
- name: setStorageBool2
call:
destination: $deployStorageK
function: setBool2
data:
- true
- name: queryStorageBool2
query-contract:
destination: $deployStorageK
function: getBool2
- name: assertStorageBool2
assert:
key: $queryStorageBool2
relation: eq
val: "true"
- name: setStorageBaseInt
set:
val: 50000
- name: setStorageInt
call:
destination: $deployStorageK
function: setInt
data:
- $setStorageBaseInt
- name: queryStorageInt
query-contract:
destination: $deployStorageK
function: getInt
- name: assertStorageInt
assert:
key: $queryStorageInt
relation: eq
val: $setStorageBaseInt
- name: setStorageBaseUint
set:
val: 9999999
- name: setStorageUint
call:
destination: $deployStorageK
function: setUint
data:
- $setStorageBaseUint
- name: queryStorageUint
query-contract:
destination: $deployStorageK
function: getUint
- name: assertStorageUint
assert:
key: $queryStorageUint
relation: eq
val: $setStorageBaseUint
- name: setStorageBaseAddress
set:
val: "1040E6521541DAB4E7EE57F21226DD17CE9F0FB7"
- name: setStorageAddress
call:
destination: $deployStorageK
function: setAddress
data:
- $setStorageBaseAddress
- name: queryStorageAddress
query-contract:
destination: $deployStorageK
function: getAddress
- name: assertStorageAddress
assert:
key: $queryStorageAddress
relation: eq
val: $setStorageBaseAddress
- name: setStorageBaseBytes
set:
val: marmatoshi
- name: setStorageBytes
call:
destination: $deployStorageK
function: setBytes
data:
- $setStorageBaseBytes
- name: queryStorageBytes
query-contract:
destination: $deployStorageK
function: getBytes
- name: assertStorageBytes
assert:
key: $queryStorageBytes
relation: eq
val: $setStorageBaseBytes
- name: setStorageBaseString
set:
val: nakaburrow
- name: setStorageString
call:
destination: $deployStorageK
function: setString
data:
- $setStorageBaseString
- name: queryStorageString
query-contract:
destination: $deployStorageK
function: getString
- name: assertStorageString
assert:
key: $queryStorageString
relation: eq
val: $setStorageBaseString
5.3 solidity合約示例如下:
pragma solidity >=0.0.0;
contract SimpleStorage {
bool storedBool;
bool storedBool2;
int storedInt;
uint storedUint;
address storedAddress;
bytes32 storedBytes;
string storedString;
function setBool(bool x) public {
storedBool = x;
}
function getBool() view public returns (bool retBool) {
return storedBool;
}
function setBool2(bool x) public {
storedBool2 = x;
}
function getBool2() view public returns (bool retBool) {
return storedBool2;
}
function setInt(int x) public {
storedInt = x;
}
function getInt() view public returns (int retInt) {
return storedInt;
}
function setUint(uint x) public {
storedUint = x;
}
function getUint() view public returns (uint retUint) {
return storedUint;
}
function setAddress(address x) public {
storedAddress = x;
}
function getAddress() view public returns (address retAddress) {
return storedAddress;
}
function setBytes(bytes32 x) public {
storedBytes = x;
}
function getBytes() view public returns (bytes32 retBytes) {
return storedBytes;
}
function setString(string memory x) public {
storedString = x;
}
function getString() view public returns (string memory retString) {
return storedString;
}
}
4、因為需要編譯合約,我們采取solc binary編譯方式,以下是安裝過程:
首先安裝npm和node
一、第一種安裝方法(推薦)
#安裝nvm
[sudo] curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash
#激活nvm
[sudo] source ~/.nvm/nvm.sh
#安裝node
[sudo] nvm install node
#切換到該版本
[sudo] nvm use node
二、第二種安裝方法
#安裝nodejs
[sudo] yum install nodejs
#建立軟連接配接
[sudo] ln -s /usr/bin/nodejs /usr/bin/node
#安裝npm
[sudo] yum install npm
#安裝remix
[sudo] npm install remix-ide -g
[sudo] remix-ide
4、将合約部署至單節點
burrow deploy --address F71831847564B7008AD30DD56336D9C42787CF63 deploy.yaml
6. 添加驗證者
6.1 删除舊資料,建立新檔案
rm -rf .burrow* .keys*
burrow spec -f2 | burrow configure -s- --pool
6.2 啟動節點
burrow start --config=burrow000.toml
burrow start --config=burrow001.toml
6.3 删除節點
rm -rf .burrow00*
6.3 檢視狀态
curl -s 127.0.0.1:26758/consensus
6.4 向Burrow網絡發送交易
- 步驟内容和 4. 一樣,可參考
7. 綁定驗證器
7.1 先建立兩個賬戶,預先綁定一個驗證節點
burrow spec -v1 -r1 | burrow configure -s- --pool
7.2 啟動兩個節點
burrow start --config burrow000.toml &
burrow start --config burrow001.toml &
7.3 提前查詢一下鍊上的驗證節點
curl -s " localhost:26758 / validators ”
7.4 綁定第二個節點并出塊
burrow tx --config burrow001.toml formulate bond --amount 10000 | burrow tx commit
7.5 發送交易
burrow tx --config burrow001.toml formulate bond --source 8A468CC3A28A6E84ED52E433DA21D6E9ED7C1577 --amount 10000
7.6 再次查詢鍊上驗證節點
7.7 解綁驗證節點
burrow tx formulate unbond | burrow tx commit