在本地主机搭建私有链
这篇文章我们将介绍如何在一台 Windows 系统的电脑上搭建私有链。
#
安装节点首先安装 Neo-CLI,并将节点文件复制为 4 份,文件夹名分别命名为 c1、c2、c3、c4。
安装过程请参考 Neo 节点的安装部署。
#
创建钱包文件使用 Neo-CLI 或 Neo-GUI 创建四个不同的钱包文件,命名为 1.json、2.json、3.json、4.json,分别放置于四个节点的文件夹中。
#
修改 config.json在每个节点下的 config.json 文件中进行如下修改:
设置每个端口不重复且不被其它程序占用。
设置 UnlockWallet 下的参数
Path
为钱包文件名,Password
为钱包密码。设置
StartConsensus
和IsActive
为true
。Network
为私有链 ID,可设置为 [0 - 4294967295] 区间内的任意整数。StandbyCommittee
是委员会成员节点的公钥,票数前4的即为共识节点,这里可以输入 4 个钱包的公钥。SeedList
为种子节点的 IP 地址和端口号,IP 地址设置为 localhost,端口为 4 个节点的P2P
Port。
可参照下面的配置:
c1/config.json
{ "ApplicationConfiguration": { "Logger": { "Path": "Logs", "ConsoleOutput": true, "Active": true }, "Storage": { "Engine": "LevelDBStore", "Path": "Data_LevelDB_{0}" }, "P2P": { "Port": 21333, "WsPort": 21334 }, "UnlockWallet": { "Path": "1.json", "Password": "1", "IsActive": true }, "PluginURL": "https://github.com/neo-project/neo-modules/releases/download/v{1}/{0}.zip" }, "ProtocolConfiguration": { "Network": 5943216, "MillisecondsPerBlock": 15000, "MaxTraceableBlocks": 2102400, "ValidatorsCount": 7, "StandbyCommittee": [ "03bf333ec238acd25f22d533748426a72f6c266bd2681000ac2bf3061fc79c6625", "02c2a4c3598467125522ff25995bce99c8bc898c3dc23381642586d0f172957ba7", "02577e88f8b1b9b5bfb355c76ac258f1fdf9f51e5312c542dff507e967cc7078ec", "03a40348cd681c79ff2f88ea632fa89945cffa70dd960edd8f897e4f41cb20896c" ], "SeedList": [ "localhost:21333", "localhost:22333", "localhost:23333", "localhost:24333" ] }}
c2/config.json
{ "ApplicationConfiguration": { "Logger": { "Path": "Logs", "ConsoleOutput": true, "Active": true }, "Storage": { "Engine": "LevelDBStore", "Path": "Data_LevelDB_{0}" }, "P2P": { "Port": 22333, "WsPort": 22334 }, "UnlockWallet": { "Path": "2.json", "Password": "1", "IsActive": true }, "PluginURL": "https://github.com/neo-project/neo-modules/releases/download/v{1}/{0}.zip" }, "ProtocolConfiguration": { "Network": 5943216, "MillisecondsPerBlock": 15000, "MaxTraceableBlocks": 2102400, "ValidatorsCount": 7, "StandbyCommittee": [ "03bf333ec238acd25f22d533748426a72f6c266bd2681000ac2bf3061fc79c6625", "02c2a4c3598467125522ff25995bce99c8bc898c3dc23381642586d0f172957ba7", "02577e88f8b1b9b5bfb355c76ac258f1fdf9f51e5312c542dff507e967cc7078ec", "03a40348cd681c79ff2f88ea632fa89945cffa70dd960edd8f897e4f41cb20896c" ], "SeedList": [ "localhost:21333", "localhost:22333", "localhost:23333", "localhost:24333" ] }}
c3/config.json
{ "ApplicationConfiguration": { "Logger": { "Path": "Logs", "ConsoleOutput": true, "Active": true }, "Storage": { "Engine": "LevelDBStore", "Path": "Data_LevelDB_{0}" }, "P2P": { "Port": 23333, "WsPort": 23334 }, "UnlockWallet": { "Path": "3.json", "Password": "1", "IsActive": true }, "PluginURL": "https://github.com/neo-project/neo-modules/releases/download/v{1}/{0}.zip" }, "ProtocolConfiguration": { "Network": 5943216, "MillisecondsPerBlock": 15000, "MaxTraceableBlocks": 2102400, "ValidatorsCount": 7, "StandbyCommittee": [ "03bf333ec238acd25f22d533748426a72f6c266bd2681000ac2bf3061fc79c6625", "02c2a4c3598467125522ff25995bce99c8bc898c3dc23381642586d0f172957ba7", "02577e88f8b1b9b5bfb355c76ac258f1fdf9f51e5312c542dff507e967cc7078ec", "03a40348cd681c79ff2f88ea632fa89945cffa70dd960edd8f897e4f41cb20896c" ], "SeedList": [ "localhost:21333", "localhost:22333", "localhost:23333", "localhost:24333" ] }}
c4/config.json
{ "ApplicationConfiguration": { "Logger": { "Path": "Logs", "ConsoleOutput": true, "Active": true }, "Storage": { "Engine": "LevelDBStore", "Path": "Data_LevelDB_{0}" }, "P2P": { "Port": 24333, "WsPort": 24334 }, "UnlockWallet": { "Path": "4.json", "Password": "1", "IsActive": true }, "PluginURL": "https://github.com/neo-project/neo-modules/releases/download/v{1}/{0}.zip" }, "ProtocolConfiguration": { "Network": 5943216, "MillisecondsPerBlock": 15000, "MaxTraceableBlocks": 2102400, "ValidatorsCount": 7, "StandbyCommittee": [ "03bf333ec238acd25f22d533748426a72f6c266bd2681000ac2bf3061fc79c6625", "02c2a4c3598467125522ff25995bce99c8bc898c3dc23381642586d0f172957ba7", "02577e88f8b1b9b5bfb355c76ac258f1fdf9f51e5312c542dff507e967cc7078ec", "03a40348cd681c79ff2f88ea632fa89945cffa70dd960edd8f897e4f41cb20896c" ], "SeedList": [ "localhost:21333", "localhost:22333", "localhost:23333", "localhost:24333" ] }}
note
如果安装了 RpcServer 插件,需要修改插件的 config.json 中的端口号,使其互不相同,且与节点的 config.json 中端口号也互不相同。
#
安装共识插件下载 共识插件(DBFTPlugin), 并放入四个节点 CLI
根目录的Plugins
目录下。修改其配置文件config.json
:
- 将
Network
与私有链config.json
中的Network
设为相同数值。 AutoStart
:设为true
以方便在启动 CLI 时自动开启共识。
可参照下面的配置:
Plugins/DBFTPlugin/config.json
{ "PluginConfiguration": { "RecoveryLogs": "ConsensusState", "IgnoreRecoveryLogs": false, "AutoStart": true, "Network": 5943216, "MaxBlockSize": 262144, "MaxBlockSystemFee": 900000000000 }}
#
创建快捷启动为了方便启动私链,创建一个记事本文件,输入以下命令:
start cmd /k "cd c1 &&ping localhost -n 3 > nul&& dotnet neo-cli.dll"start cmd /k "cd c2 &&ping localhost -n 3 > nul&& dotnet neo-cli.dll"start cmd /k "cd c3 &&ping localhost -n 3 > nul&& dotnet neo-cli.dll"start cmd /k "cd c4 &&ping localhost -n 3 > nul&& dotnet neo-cli.dll"
然后重命名为 Run.cmd。将其复制到 4 个节点目录外的同级目录下。
到此,私有链已经搭建完成了,所有修改过的文件结构如下
├─Run.cmd|├─c1│ 1.json│ config.json│├─c2│ 2.json│ config.json│├─c3│ 3.json│ config.json│└─c4| 4.json| config.json
#
启动私有链进入每个节点目录,双击 Run.cmd
,如果控制台打印出共识信息并且区块高度增长表示私链成功搭建:
如果关闭所有窗口,将停止私有链。
#
提取 NEO 和 GAS在 NEO 网络的创世块中存放着 1 亿份 NEO 和 3 千万 GAS,当私链搭建起来后,GAS 也将伴着新区块的生成而生成。你可以使用 Neo-CLI 从多方签名合约中提取出这部分 NEO 和 GAS 以便内部开发测试使用。
#
从 Neo-CLI 提取#
创建多方签名地址启动私链。
复制一个共识节点作为外部节点来进行操作,同时复制4个共识节点钱包到该节点根目录并关闭或删除共识插件。
创建admin钱包,在节点中使用命令
import multisigaddress m pubkeys
,创建一个多方签名地址。这里设置最小签名数 m 为 3,pubkeys 为四个共识节点的公钥(见 config.json)。例如:
import multisigaddress 3 03bf333ec238acd25f22d533748426a72f6c266bd2681000ac2bf3061fc79c6625 02c2a4c3598467125522ff25995bce99c8bc898c3dc23381642586d0f172957ba7 02577e88f8b1b9b5bfb355c76ac258f1fdf9f51e5312c542dff507e967cc7078ec 03a40348cd681c79ff2f88ea632fa89945cffa70dd960edd8f897e4f41cb20896c
分别打开钱包
1.json
,2.json
,3.json
重复第三步导入多签地址。输入命令
list asset
,可以看到合约地址中出现了 100,000,000 NEO 和 30,000,000 GAS。
note
至少3个共识钱包创建多方签名地址才能成功完成转账交易的签名。
#
提取 NEO/GAS 到普通地址接下来我们将 NEO 从合约地址转入普通地址:
打开第一个钱包(1.json)使用命令
send <id|alias> <address> <value>
将 NEO 转入admin 钱包地址。复制 SignatureContext 内容并关闭钱包。
打开第二个钱包(2.json)。
使用步骤 2 中复制的内容输入命令
sign <jsonObjectToSign>
复制 Signed Output 内容。
打开第三个钱包(3.json)重复前面的签名步骤,然后就可以使用
relay <jsonObjectToSign>
广播交易完成签名。输入
list asset
查看钱包资产,可以看到 NEO 已经转入。
参考前面提取 NEO 进行的多方签名操作,同样可以提取 GAS 到目标地址。