在本地主机搭建私有链
这篇文章我们将介绍如何在一台 Windows 系统的电脑上搭建私有链。
安装节点
首先安装 Neo-CLI,并将节点文件复制为 4 份,文件夹名分别命名为 node1、node2、node3、node4。
安装过程请参考 Neo 节点的安装部署 。
安装插件
要使节点达成共识,需要安装 SimplePolicy 插件启用共识策略。
-
下载 SimplePolicy 插件并解压。
-
将文件夹 Plugins 拷贝四份,分别放置到四个节点文件夹中。
创建钱包文件
-
运行Neo-CLI ,使用命令
create wallet <path>
创建四个不同的钱包文件,为示例说明,这里命名为 1.json、2.json、3.json、4.json,钱包密码分别设置为1、2、3、4 -
记录屏幕中显示的每个钱包的公钥(pubkey)以备后用。
-
将钱包文件分别放置于四个节点的文件夹中。
修改 config.json
在每个节点下的 config.json 文件中进行如下修改:
-
设置每个端口不重复且不被其它程序占用。
-
设置 UnlockWallet 下的参数
Path
为钱包文件名,Password
为钱包密码。 -
设置
StartConsensus
和IsActive
为true
。
可参照下面的配置:
node1/config.json
{
"ApplicationConfiguration": {
"Paths": {
"Chain": "Chain_{0}",
"ApplicationLogs": "ApplicationLogs_{0}"
},
"P2P": {
"Port": 10001,
"WsPort": 10002
},
"RPC": {
"Port": 10003,
"SslCert": "",
"SslCertPassword": ""
},
"UnlockWallet": {
"Path": "1.json",
"Password": "1",
"StartConsensus": true,
"IsActive": true
}
}
}
node2/config.json
{
"ApplicationConfiguration": {
"Paths": {
"Chain": "Chain_{0}",
"ApplicationLogs": "ApplicationLogs_{0}"
},
"P2P": {
"Port": 20001,
"WsPort": 20002
},
"RPC": {
"Port": 20003,
"SslCert": "",
"SslCertPassword": ""
},
"UnlockWallet": {
"Path": "2.json",
"Password": "2",
"StartConsensus": true,
"IsActive": true
}
}
}
node3/config.json
{
"ApplicationConfiguration": {
"Paths": {
"Chain": "Chain_{0}",
"ApplicationLogs": "ApplicationLogs_{0}"
},
"P2P": {
"Port": 30001,
"WsPort": 30002
},
"RPC": {
"Port": 30003,
"SslCert": "",
"SslCertPassword": ""
},
"UnlockWallet": {
"Path": "3.json",
"Password": "3",
"StartConsensus": true,
"IsActive": true
}
}
}
node4/config.json
{
"ApplicationConfiguration": {
"Paths": {
"Chain": "Chain_{0}",
"ApplicationLogs": "ApplicationLogs_{0}"
},
"P2P": {
"Port": 40001,
"WsPort": 40002
},
"RPC": {
"Port": 40003,
"SslCert": "",
"SslCertPassword": ""
},
"UnlockWallet": {
"Path": "4.json",
"Password": "4",
"StartConsensus": true,
"IsActive": true
}
}
}
修改 protocol.json
在每个节点下的 protocol.json 文件中,对以下参数进行修改,并保证所有节点的配置一致。
-
Magic :私有链 ID,可设置为 [0 - 4294967295] 区间内的任意整数。
-
StandbyValidators :备用共识节点的公钥,这里输入 4 个钱包的公钥。
-
SeedList :种子节点的 IP 地址和端口号,IP 地址设置为 localhost,端口为 config.json 中配置的 4 个 P2P Port。
可参照下面的配置:
{
"ProtocolConfiguration": {
"Magic": 123456,
"AddressVersion": 23,
"SecondsPerBlock": 15,
"StandbyValidators": [
"037ebe29fff57d8c177870e9d9eecb046b27fc290ccbac88a0e3da8bac5daa630d",
"03b34a4be80db4a38f62bb41d63f9b1cb664e5e0416c1ac39db605a8e30ef270cc",
"03cc384ca982168bf6f08922d27c8acc4357d52a7e8ad8281d4af6683e6f63e94d",
"03da4ed85a991134bf45592a5b04d6d71399f23a85843f43e6ac1a5d30f5473711"
],
"SeedList": [
"localhost:10001",
"localhost:20001",
"localhost:30001",
"localhost:40001"
],
"SystemFee": {
"EnrollmentTransaction": 10,
"IssueTransaction": 5,
"PublishTransaction": 5,
"RegisterTransaction": 100
}
}
}
创建快捷启动
为了方便启动私链,创建一个记事本文件,输入 dotnet neo-cli.dll /rpc
然后重命名为 1Run.cmd。将其复制到 4 个节点目录下。
到此,私有链已经搭建完成了,所有修改过的文件结构如下
├─node1
│ 1.json
│ 1Run.cmd
│ config.json
│ protocol.json
│
├─node2
│ 1Run.cmd
│ 2.json
│ config.json
│ protocol.json
│
├─node3
│ 1Run.cmd
│ 3.json
│ config.json
│ protocol.json
│
└─node4
1Run.cmd
4.json
config.json
protocol.json
启动私有链
进入每个节点目录,双击 1Run.cmd
,当共识过程如图所示,表示私链成功建立:
如果关闭所有窗口,将停止私有链。
提取 NEO 和 GAS
在 Neo 网络的创世块中存放着 1 亿份 NEO,当私链搭建起来后,GAS 也将伴着新区块的生成而生成。你可以使用 Neo-CLI 或 Neo-GUI 从多方签名合约中提取出这部分 NEO 和 GAS 以便内部开发测试使用。
从 Neo-CLI 提取
为方便操作,我们需要再准备一个普通节点接入私链,然后从该节点提取 NEO/GAS。
安装和配置普通节点
-
复制前面步骤中配置好的任意一个共识节点文件,命名为 node0
-
配置 config.json 文件:
-
设置每个端口不重复且不被其它程序占用。
-
设置 UnlockWallet 下的参数
Path
和Password
为空。 -
设置
StartConsensus
和IsActive
为false
。
-
-
将之前创建的四个钱包文件复制到 node0 根目录下。
-
运行普通节点,打开一个钱包并输入命令
show state
查看节点状态。如果高度发生变化且连接数不为0,则表示节点已接入私链。
4 个共识节点需要关掉一个,普通节点才能接入。
创建多方签名地址
-
在普通节点上打开任意钱包
-
使用命令
import multisigaddress m pubkeys
创建一个多方签名地址:-
m
: 设置最小签名数 3 -
pubkeys
: 四个共识节点的钱包公钥(配置在StandbyValidator
里 )
四个钱包中都必须创建多方签名地址才能成功完成转账交易的签名。
-
-
输入
list asset
, 可以看到账户里出现了 1 亿 NEO
提取 NEO 到普通地址
接下来我们将 NEO 从合约地址转入普通地址:
-
输入命令
send <id|alias> <address> <value>
将 NEO 转入目标地址。 -
复制 SignatureContext 内容并关闭钱包。
-
打开多方签名中的第二个钱包。
-
使用步骤 2 中复制的内容输入命令
sign <jsonObjectToSign>
-
复制 Signed Output 内容并关闭钱包。
-
打开第三个钱包重复前面的签名步骤,然后就可以使用
relay <jsonObjectToSign>
广播交易完成签名。 -
输入
list asset
查看钱包资产,可以看到 NEO 已经转入。
NEO 转出后 GAS 状态变为可提取,使用命令 show gas
可以查看可提取的 GAS 数量。参考前面提取 NEO 进行的多方签名操作,提取 GAS 到目标地址即可。
从 Neo-GUI 提取
安装并配置 Neo-GUI
-
从 Github 上下载 Neo-GUI 并解压。
-
修改 Neo-GUI 配置文件 protocol.json 使其连接到私有链中:
-
StandbyValidators
:将前面创建的四个钱包的公钥填写在这里。 -
SeedList
:将四台虚拟机的 IP 地址填写在这里,端口号保持不变。
-
-
配置 config.json 文件,设置端口与其它四个节点端口不冲突。如果端口冲突,Neo-GUI 将无法与 Neo-CLI 同时运行。
运行 Neo-GUI,打开任意钱包,如果左下角有连接数不为零,而且一直在同步区块,表示该客户端已经成功地连接到了私有链中。
创建多方签名地址
在 Neo-GUI 中依次打开四个钱包,进行以下操作:
-
右键单击账户页面空白处,选择
创建合约地址
->多方签名
在每个钱包里添加多方签名地址。 -
输入四个钱包的公钥,设置最小签名数量为 3(共识节点数量 / 2 + 1),点击
确定
。 -
点击
钱包
->重建钱包索引
。
四个钱包都要添加多方签名地址,否则签名会失败。
你将看到合约地址中出现了 1 亿 Neo,如图所示。
提取 Neo 到标准地址
进行如下操作,将 Neo 从合约地址转到标准地址中:
-
打开四个钱包中的任意一个,点击
交易
->转账
。 -
输入要转入的标准地址,将 1 亿 Neo 转到这个地址中。
-
系统会提示“交易构造完成,但没有足够的签名”,将代码复制下来。
-
打开第二个钱包,点击
交易
->签名
。 -
粘贴刚才复制的代码,点击
签名
, 然后将生成的代码复制下来。 -
打开第三个钱包,点击
交易
->签名
,粘贴刚才复制的代码,点击签名
。这时窗口中显示
广播
按钮,代表交易已经签名完成,达到多方签名合约要求的最少签名数量,可以广播。 -
点击
广播
完成转账交易。等待片刻后将看到 1 亿 Neo 成功转入了标准地址。
提取 GAS 到标准地址
打开要转入 GAS 的钱包账户,点击 高级
-> 提取 NeoGas
-> 全部提取
。
GAS 有两种状态,可提取和不可提取。当账户中的 NEO 花费后(即转出),其产生的 GAS 会转变成可提取状态。你可以通过给自己转账将 GAS 变为可提取状态,即使钱包里只有一个地址也可以。
接下来的操作与转账 Neo 类似,将没有足够签名的代码复制下来,依次打开第二个和第三个钱包,完成交易签名和广播。提取成功后如下图所示。