由于在调研Algorand共识,所以最近阅读和测试相关的链实现,此篇将主要讲解kaleido的私链部署测试。
由于相关项目基本已经很久不更新,文档社区匮乏,只能阅读代码,反向推出运行参数和步骤。
编译源代码
参考《kaleido 编译与测试》,执行编译相关子程序
make all
最终kaleido\build\bin
会生成genesis
程序,下面会用到
genesis.json创建
启动私链,首先需要准备bios节点配置
阅读相关代码(github)
可以使用genesis
程序进行生成,首次直接运行genesis
后
Hint: You must make a minerkey before making genesis.
提示需要先生成minerkey
,继续跟进
阅读相关代码(github)
makeMinerKeyCommand = cli.Command{
Action: utils.MigrateFlags(makeMinerKey),
Name: "makeminerkey",
Usage: "Generates a miner key for mining",
ArgsUsage: " ",
Flags: []cli.Flag{
utils.DataDirFlag,
utils.MinerStakeOwnerFlag,
utils.MinerKeyCoinbaseFlag,
utils.MinerKeyStartFlag,
utils.MinerKeyLifespanFlag,
},
Category: "MINER COMMANDS",
Description: `
The makeMinerKey command generates a miner key for mining.
If the key already exists, just return it.
可以使用kalgo
加上参数makeminerkey
进行生成,参考有限文档例子如下
mkdir $PWD/data
export KALEIDO_HOME=$PWD/data
echo $KALEIDO_HOME
./kalgo makeminerkey \
--miner.stakeowner 0x48F155527f25EB1d4cb2aa32b7e84692AA0025C0 \
--minerkey.coinbase 0x48F155527f25EB1d4cb2aa32b7e84692AA0025C0 \
--minerkey.start 1
0x48F155527f25EB1d4cb2aa32b7e84692AA0025C0
修改为自己的地址
执行生成后,返回
MinerKey: 0x39fb25e90000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000006400000000000000000000000048f155527f25eb1d4cb2aa32b7e84692aa0025c003ada2cdce38f8fd0aafbaf5542a03a78b90b93ce594e0568760ba952e2b1f534566f9bde28e7b7d6ba8a369e0a4a6b419b12b86cb577c374cd257ef0a5a5645
Details:
miner = 0x48F155527f25EB1d4cb2aa32b7e84692AA0025C0
coinbase = 0x48F155527f25EB1d4cb2aa32b7e84692AA0025C0
start = 1
end = 1000000
lifespan = 100
vrfVerifier = 0x03ada2cdce38f8fd0aafbaf5542a03a78b90b93ce594e0568760ba952e2b1f53
voteVerfier = 0x4566f9bde28e7b7d6ba8a369e0a4a6b419b12b86cb577c374cd257ef0a5a5645
GenesisStorage:
0xf542409778bcdead44d9b45f4b07b70b047acb90dcda73c55b6b72088ca2fefd = 0x48f155527f25eb1d4cb2aa32b7e84692aa0025c0000000640000000000000001
0xf542409778bcdead44d9b45f4b07b70b047acb90dcda73c55b6b72088ca2fefe = 0x03ada2cdce38f8fd0aafbaf5542a03a78b90b93ce594e0568760ba952e2b1f53
0xf542409778bcdead44d9b45f4b07b70b047acb90dcda73c55b6b72088ca2feff = 0x4566f9bde28e7b7d6ba8a369e0a4a6b419b12b86cb577c374cd257ef0a5a5645
以上仅为测试数据,对于自己相关私有数据请注意保管
由于cmd/genesis/main.go
和consensus/clique/clique.go
已写死了0x0e09768B2B2e7aa534243f8bf9AFdC145DdA8EDa
为测试数据,所以我们可以修改对应代码,也可以拿测试地址生成minerkey
,然后生成genesis.json
然后再手动修改对应的地址和数据。
切记替换地址时,(github)
contracts.MinerAddress: {
Balance: common.Big0,
Code: common.FromHex(contracts.MinerBinRuntime),
Storage: map[common.Hash]common.Hash{
common.HexToHash("0x06ff3c55f357d4545a14dcc167670bf1dcc8bb45dcd90fa4a085a02a39da3a8a"): common.HexToHash("0x45ec182edc6774c9a2926172f1fd996e59b58ced000000640000000000000001"),
common.HexToHash("0x06ff3c55f357d4545a14dcc167670bf1dcc8bb45dcd90fa4a085a02a39da3a8b"): common.HexToHash("0xf88a8d844c217531a38d6019ea671652340fe0d899996250bccce13af99933de"),
common.HexToHash("0x06ff3c55f357d4545a14dcc167670bf1dcc8bb45dcd90fa4a085a02a39da3a8c"): common.HexToHash("0x6e8f4a7c7651766722dd7fb9d7a97cd28678a1cefb12631580a7ffe90a910b8f"),
},
},
Storage
中的数据,要替换成上面执行kalgo makeminerkey
返回的数据中的GenesisStorage
对应的数据,不然检查不通过(github)会报bad signature
此时按照常规eth启动步骤执行即可,细节不再单独讲解
./kalgo --datadir ./data init genesis.json
./kalgo --config geth.toml --nodiscover
./kalgo attach ipc:./data/geth.ipc
添加新节点
同上为新节点创建minerkey
mkdir $PWD/data
export KALEIDO_HOME=$PWD/data
echo $KALEIDO_HOME
./kalgo makeminerkey \
--miner.stakeowner 0xbb93FcC2bB90D46255c43DD398A1A372E12bE6Aa \
--minerkey.coinbase 0xbb93FcC2bB90D46255c43DD398A1A372E12bE6Aa \
--minerkey.start 1
返回
MinerKey: 0x39fb25e900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064000000000000000000000000bb93fcc2bb90d46255c43dd398a1a372e12be6aa474d81ab830043ccdd099147b7b90f073d8b2bda52892d40e8601cfcfbb03a2e35c6ae655cecc87a4c977435e36c8d88ea2950e1cec425e42909b934adbc1de8
Details:
miner = 0xbb93FcC2bB90D46255c43DD398A1A372E12bE6Aa
coinbase = 0xbb93FcC2bB90D46255c43DD398A1A372E12bE6Aa
start = 1
end = 1000000
lifespan = 100
vrfVerifier = 0x474d81ab830043ccdd099147b7b90f073d8b2bda52892d40e8601cfcfbb03a2e
voteVerfier = 0x35c6ae655cecc87a4c977435e36c8d88ea2950e1cec425e42909b934adbc1de8
GenesisStorage:
0x3a624f62c38b6bf3cf93859680439fb3332269b77ec12e8e022bf7be4a569857 = 0xbb93fcc2bb90d46255c43dd398a1a372e12be6aa000000640000000000000001
0x3a624f62c38b6bf3cf93859680439fb3332269b77ec12e8e022bf7be4a569858 = 0x474d81ab830043ccdd099147b7b90f073d8b2bda52892d40e8601cfcfbb03a2e
0x3a624f62c38b6bf3cf93859680439fb3332269b77ec12e8e022bf7be4a569859 = 0x35c6ae655cecc87a4c977435e36c8d88ea2950e1cec425e42909b934adbc1de8
mkdir -p ./data/kalgo/minerkeys
cp ~/.kaleido/kalgo/minerkeys/0xbb93FcC2bB90D46255c43DD398A1A372E12bE6Aa-0-1000000.bin ./data/kalgo/minerkeys
./kalgo makeminerkey \
--miner.stakeowner 0x10210572d6b4924Af7Ef946136295e9b209E1FA0 \
--minerkey.coinbase 0x10210572d6b4924Af7Ef946136295e9b209E1FA0 \
--minerkey.start 9500
mkdir -p ./data/kalgo/minerkeys
cp ~/.kaleido/kalgo/minerkeys/0x10210572d6b4924Af7Ef946136295e9b209E1FA0-0-1000000.bin ./data/kalgo/minerkeys
myaddr = '0x10210572d6b4924Af7Ef946136295e9b209E1FA0';
hash = eth.sendTransaction({
from: myaddr,
to: '0x1000000000000000000000000000000000000002',
gas: 200000,
gasPrice: 20000000000,
data:
'0x39fb25e9000000000000000000000000000000000000000000000000000000000000251c000000000000000000000000000000000000000000000000000000000000006400000000000000000000000010210572d6b4924af7ef946136295e9b209e1fa04141f8e905b628d3657b151a62c1414c4cc4f554d24bc16971c8233b761879d09b8f95e47a6f9662b78198c45ff986153c1e3316ede5cbfae09c6f927d374bd2'
});
admin.sleepBlocks(2);
eth.getTransactionReceipt(hash);
personal.importRawKey("8d91c6c7a494a4373...0715","j7OseEMVQ3Trna6gWdkp")
personal.unlockAccount("0x10210572d6b4924Af7Ef946136295e9b209E1FA0","j7OseEMVQ3Trna6gWdkp",0)
nohup ./kalgo --config geth.toml --networkid 1001 --unlock "0x10210572d6b4924Af7Ef946136295e9b209E1FA0" --password ./password --mine --miner.stakeowner "0x10210572d6b4924Af7Ef946136295e9b209E1FA0" --nodiscover --etherbase 0 --verbosity 4 2>> ./geth.log &
personal.unlockAccount("0xf8329ea42489c2164f44a81deb3be22c2c456109","j7OseEMVQ3Trna6gWdkp",0)
eth.sendTransaction({from: "0xf8329ea42489c2164f44a81deb3be22c2c456109", to: "0x10210572d6b4924Af7Ef946136295e9b209E1FA0", value: web3.toWei(25000000, 'ether')})
admin.addPeer("enode://e20d5cb1c726bb5f8bcc5c3b91255e7fcf459add7584cf6becbb99715f2f84334f14233843bb50ce68c71c4f1b6cfeaff3294cec85a488f363428476010651b1@172.31.204.223:32668?discport=0")
admin.addPeer("enode://95b41257c7da4bd0a98e81cb636b833c36693a3ab76ff55987663455b186dac96437d785b7bb6c5d5335bae91402f227d99a395c1dfe31663a891eb6e5d90140@172.31.204.224:32668?discport=0")
./kalgo --datadir ./data init genesis.json
./kalgo --config geth.toml --nodiscover
./kalgo attach ipc:./data/geth.ipc
参考
https://docs.kaleidochain.io