教程网

您现在的位置是: 首页 > 项目

怎么用NEO节点搭建私有链?NEO节点搭建私有链教程

怎么用NEO节点搭建私有链?NEO节点搭建私有链教程
怎么用NEO节点搭建私有链?这是很多人都关心的问题,今天就这个问题我们来探究一下!NEO私有链的部署至少需要4台服务器才能取得共识,每台服务器对应一个共识节点,每台服务器上有

怎么用NEO节点搭建私有链?这是很多人都关心的问题,今天就这个问题我们来探究一下!NEO私有链的部署至少需要4台服务器才能取得共识,每台服务器对应一个共识节点,每台服务器上有一个NEO钱包文件。

配置虚拟机

NEO 私有链的部署至少需要 4 台服务器才能取得共识,每台服务器对应一个共识节点。为了演示,我在 Azure 上创建了 4 台 Windows 虚拟机,大小为 Standard DS1 v2 (1 核心,3.5 GB 内存),你也可以在局域网中或虚拟机中部署私有链。

创建好后,要开通 10331-10334 端口,具体方法为在系统的 防火墙 高级设置 入站规则 中新建规则,然后添加端口 10331-10334.

NOTE

如果你在云服务器上创建的虚拟机,还要登录虚拟机的管理后台,设置网络安全组 Azure 上的设置方法为:网络 入站端口规则添加端口 10331-10334.

创建好虚拟机后,将四台虚拟机的 IP 地址保存下来以备后用。

安装 NEO 节点

参考 NEO 节点的安装部署安装NEO节点。

安装插件

要使节点达成共识,需要安装 SimplePolicy 插件启用共识策略,详细信息请参考 安装插件。

创建钱包

我们首先创建 4 个钱包文件,依次为 1.json - 4.json,这一步在 PC 版钱包和命令行钱包都可以创建,下图是在命令行客户端创建钱包文件的截图。

创建好钱包后将 4 个钱包的公钥保存下来(保存到一个 txt 文件中即可)以备后用。直接复制上面的公钥或者用 CLI 命令 中的 list key 命令查看公钥再复制均可。

然后将 4 个钱包分别复制到 4 个虚拟机的节点目录下。

修改节点的配置文件

打开节点的配置文件 protocol.json 。

首先修改 Magic 值,Magic 用于识别消息的来源网络,指定不同的 Magic 确保 NEO 区块链中的不同网络信息在传输过程中不会发送到其它网络。

NOTE

Magic 的类型为 uint,所以注意所填写的数值要在 [0 - 4294967295] 区间内。

然后修改 StandbyValidators,将第三步记下来的 4 个公钥填写在这里。

最后修改 SeedList,将第一步记下来的 IP 地址填写在这里,端口号保持不变,例如我修改成下面的配置。

{

"ProtocolConfiguration": {

"Magic": 123456.

"AddressVersion": 23.

"SecondsPerBlock": 15.

"StandbyValidators": [

"03072384ece95c4febe7211ee4833cd36cdf0f255ec5263b28a4be1f2af7a3d7f3",

"0208da33cee651a4dc119654b5b8067ade533e39e63a8b4fdbd160d97f80c4cfb4",

"026f0af815d5c3895205e9f54b9402329f3ecc4d249fc0c8500e9b3ea8a3ec9d5b",

"03b4e070988627e2a5710b2c8c79f0f0be18821e1af5875b7beeb3fa8a921cde3f"

],

"SeedList": [

"13.75.112.62:10333",

"137.116.173.200:10333",

"168.63.206.73:10333",

"137.116.171.134:10333"

],

"SystemFee": {

"EnrollmentTransaction": 10.

"IssueTransaction": 5.

"PublishTransaction": 5.

"RegisterTransaction": 100

}

}

}

最后将修改过的 protocol.json 复制到 4 个节点的客户端目录下,替换之前的 protocol.json 的文件。

为了更方便地打开钱包,开启共识,建议修改每个节点下的 config.json 文件,替换其中的这一部分

"UnlockWallet": {

"Path": "1.json",

"Password": "11111111",

"StartConsensus": true,

"IsActive": true

}

其中 Path 是钱包名称,Password 是钱包密码,修改成你自己的钱包名称和密码就可以,其余两个不变。

然后在 4 台虚拟机上依次输入以下命令启动节点,这时程序会自动打开钱包并开启共识。

启动节点:dotnet neo-cli.dll

如果上述操作成功,可以运行show state来查看节点状态。若高度发生变化,则说明共识过程正常。4个节点的共识过程如图所示

4 个节点即使关掉一台依然可以达成共识,如图所示

提取 NEO、NeoGas

安装 PC 版客户端(Neo-GUI),修改配置文件 protocol.json 使其连接到私有链中。

打开钱包,如果左下角有连接数不为零,而且一直在同步区块,表示该客户端已经成功地连接到了私有链中。

在 PC 版客户端中打开钱包 wallet1.db3.添加多方签名地址,输入 protocol.json 中的 4 个公钥,设置最小签名数量为 3(共识节点数量 / 2 + 1),你就会看到在合约地址中有 1 亿的 NEO 了,如图所示。

NOTE

4 个钱包都要添加多方签名地址,否则下一步会提示签名失败

下面我们要将该 NEO 从合约地址转到标准地址中,打开 4 个钱包中的任意一个,点击 交易 转账 输入一个标准地址,将 1 亿 NEO 转到这个地址中。

然后系统会提示“交易构造完成,但没有足够的签名”,然后将代码复制下来,打开第二个钱包,点击 交易 签名 粘贴刚才复制的代码,点击 签名, 然后将代码复制下来,打开第三个钱包,点击 交易 签名 粘贴刚才复制的代码,点击 签名,这时你会发现窗口中出现了一个广播 按钮,代表交易已经签名完成(达到多方签名合约要求的最少签名数量)可以广播,点击 广播 后转账交易开始广播,约 15 秒后转账成功。

提取 NeoGas 的操作方法也类似,点击 高级 提取 NeoGas 提取 ,(记得这时所在的钱包 X,下文会用到),如图所示

接下来的操作与转账 NEO 类似,将没有足够的签名的代码复制下来,打开第二个钱包,点击 交易 签名 粘贴刚才复制的代码,点击 签名, 然后将代码复制下来,打开第三个钱包,点击 交易 签名 粘贴刚才复制的代码,点击 签名,点击 广播 后提取 NeoGas 的交易开始广播,约 15 秒后提取成功。

提取成功后 NeoGas 会进入到你发起提取 NeoGas 的交易所在的钱包(即上方的 X 钱包)的第一个标准地址,如图所示

这样就完成了!以上就是怎么用NEO节点搭建私有链?的相关介绍,你学会了吗?

Neo网络节点是什么?Neo网络节点分为两种,一种为共识节点,另一种为普通节点。相对于普通节点,共识节点将参与共识过程并且有机会成为议长主持新区块的生成。

接下来,我将通过源码分析来介绍如何通过Neo的服务器注册议员。源码中,每轮共识开始时会调用ConsensusContext.cs中的Reset方法,在重置共识时会调用Blockchain.Default.GetValidators()来获取议员列表,跟进去这个GetValidators()源码:

源码位置:

neo/Implementations/BlockChains/LevelDB/LevelDBBlockChain.cs

发现这里调用了内部的GetValidators(IEnumerable others)方法。再看这个内部的GetValidators方法:

源码位置:

neo/Core/BlockChain.cs

我把第一个foreach循环中的代码都删了,因为明显传进来的others参数为0.所以循环体里的代码根本不会有执行的机会。这个方法的返回值是result,它值的数据有两个来源。第一个是pubkeys,pubkeys来自于本地缓存中的议员信息,这个信息是在同步区块链时保存的,即只要共识节点开始接入区块链网络进行区块同步,就会获得议员信息。而如果没有缓存议员信息或者缓存的议员信息丢失,就会使用内置的默认议员列表进行共识,之后再在共识过程中缓存议员信息。第二种的使用内置默认议员列表是直接将配置文件protocol.json中的数据读取到StandbyValidators字段中。

接下来主要介绍第一种途径。GetValidators方法的第二行调用了GetStates,并且传入类的类型是ValidatorState,这个方法位于LevelDBBlockChain.cs文件中,完整代码如下:

源码位置:

neo/Implementations/BlockChains/LevelDB/LevelDBBlockChain.cs

可以看到这里是直接从leveldb的数据库中读取的议员数据。即在读取数据之前,需要先创建/打开数据库,这部分的操作可以参考neo-cli项目,这个项目就在MainService类的OnStart方法中传入了数据库地址。当然这只是从数据库中获取议员信息,向数据库中存入议员信息的工作主要由LevelDBBlockChain.cs文件中的Persist(Block block) 方法负责,这个方法接收一个区块类型作为参数,主要工作是将同步到的区块信息解析保存。涉及到议员信息的关键代码如下:

源码位置:

neo/Implementations/BlockChains/LevelDB/LevelDBBlockChain.cs/Persist

通过调用GetAndChange方法将获取到的议员账户添加到数据库缓存中。

确定议长

共识节点通过调用ConsensusService类中的Start方法开始参与共识。在Start方法中,先注册消息接收、数据保存等事件通知,然后调用InitializeConsensus开启共识,接收一个名为「视图编号」的整形参数。当传入的视图编号为0时,即一轮新共识需要重置共识状态。重置共识状态的代码如下:

源码位置:

neo/Consenus/ConsensusContext.cs

在代码中我添加了详尽的注释,确定议长的算法是当前区块高度+1 再减去当前的视图编号,结果mod上当前的议员人数,结果就是议长的下标。议员自己的编号则是自己在议员列表中的位置,因为这个位置的排序是根据每个议员的权重,所以理论上每个议员的编号在所有的共识节点都是一致的。在共识节点中,除了在共识重置时会确定议长外,每次更新本地视图时也会重新确定议长:

源码位置:

neo/Consensus/ConsensusContex.cs

议长发起共识

议长在更新完视图编号后,如果当前时间距离上次写入新区块的时间超过了预定的每轮共识的间隔时间(15s)则立即开始新一轮的共识,否则等到间隔时间后再发起共识,时间控制代码如下:

源码位置:

neo/Consensus/ConsencusService.cs/InitializeConsensus

议长进行共识的函数是OnTimeout,由定时器定时执行。下面是议长发起共识的核心代码:

源码位置:

neo/Consencus/ConsensusService.cs/OnTimeOut

议长将本地的交易生成新的Header并签名,然后将这个Header发送PrepareRequest广播给网络中的议员。

议员参与共识

议员在收到PrepareRequest广播之后会触发OnPrepareReceived方法:

源码位置:

neo/Consensus/ConsensusService.cs

议员在收到议长共识请求后,首先使用议长的公钥验证收到的共识信息,验证通过后将议长的签名添加到签名列表中。然后从内存中缓存,将议长Header交易哈希列表中的交易添加到context里。

这里需要讲一下从内存中添加交易信息到context中的方法 AddTransaction。这个方法在每次添加交易之后都会比较当前context中的交易笔数是否和从议长那里获取的交易哈希数相同,如果相同而且记账人合约地址验证通过,则广播自己的签名到网络中,这部分核心代码如下:

源码位置:

neo/Consensus/ConsensusService.cs/AddTransaction

所有的议员都需要同步各个共识节点的签名,所以议员节点也需要监听网络中其他节点对议长共识信息的响应并记录签名信息。在每次监听到共识响应并记录了收到的签名信息之后,节点需要调用CheckSignatures方法对当前收到的签名信息是否合法进行判断,CheckSignatures代码如下:

源码位置:

neo/Consensus/ConsensusService.cs

CheckSignatures方法里首先是对当前签名数的合法性判断。也就是以获取的合法签名数量需要不小于M。M这个值的获取在ConsensusContext类中:

这个值的获取涉及到Neo共识算法的容错能力,公式是

以太坊本地私有链开发环境搭建!通过本文所述方法和项目中的脚本,我们可以快速的搭建好自己的私链进行开发测试。

仓库中包含的工具有:

一个测试账户导入脚本,在首次部署时将五个测试账户私钥导入以太坊节点。

一个genesis.json配置文件,为对应的五个测试账户提供初始资金(以太币),方便开发测试。

一个快速启动私有链节点并进入交互模式的脚本。

一个合约样例:contracts/Token.sol。这是一个使用合约语言Solidity编写的智能合约。Token合约的功能是发行一种token(可以理解为货币,积分等等),只有合约的创建者有发行权,token的拥有者有使用权,并且可以自由转账。

测试账户私钥是放在Github上的公开数据,千万不要用于正式环境中或者公有链上。如果在测试环境之外的地方使用这些私钥,你的资金将会被窃取!

准备

在本地安装好go-ethereum和solc, 可以执行geth和solc命令。如果操作系统是ubuntu, 安装官方的ethereum安装包即可。

将本仓库通过git clone命令下载到本地。

安装expect,工具脚本用它来自动化一些过程。例如在ubuntu上: sudo apt-get install expect

启动geth

进入本仓库目录: cd ethereum-bootstrap

导入测试账户私钥: ./bin/import_keys.sh

启动私有链节点: ./bin/private_blockchain.sh. 启动成功后可以看到类似如下输出:

此时以太坊交互式控制台已经启动,我们可以开始测试和开发了。

注意:工具脚本假设你的geth安装在默认位置, 可以直接通过geth执行。如果geth命令安装在非标准的位置,可以设置GETH环境变量指定geth可执行文件的路径。例如:

GETH=/some/weird/dir/geth ./bin/import_keys.sh

使用以太坊控制台编译和部署智能合约

在contracts目录下有一个智能合约样例文件Token.sol, 通过Solidity语言实现了基本的代币功能, 合约持有者可以发行代币, 使用者可以互相转账.

 1/3    1 2 3 下一页 尾页