1.私有链(私有网络)搭建
在做一些测试工作的时候, 为了方便控制以及更快的进入真正的测试工作,可能需要搭建一个私有的以太坊网络.而以太坊节点之间能够互相链接需要满足1)相同的协议版本2)相同的networkid,所以搭建私有网络最方便的方法就是通过geth命令中的--networkid选项,设置一个与主网不同的networkid(主网的networkid为1),这也是官方推荐的方法.
1.1 go-ethereum安装与配置
我们在A主机上安装配置go-ethereum,具体安装配置略。
1.2创世块的创建
创世区块是整个区块链的开端——第一个区块,编号是0,也是唯一一个没有前驱指向的区块。每个区块链都从创世区块开始。协议必须确保没有其他节点会认同你的区块链版本,除非他们拥有同样的创世区块。因此你可以创造出任意多的私有测试网络。我们在Geth安装目录(C:\Program Files\Geth)下创建创世块文件xfli.json.(文件的必须以.json结尾)。写入如下内容并保存
{
"config": {
"chainId": 10,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc" : {},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x02",
"extraData" : "0x1985",
"gasLimit" : "0x2fefd8",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
创世块文件内容解析:
Mixhash:与nonce配合用于挖矿,由上一个区块的一部分生成的hash。注意他和nonce的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。.
Nonce****:nonce就是一个64位随机数,用于挖矿,注意他和mixhash的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。
Difficulty****:设置当前区块的难度,如果难度过大,cpu挖矿就很难,这里设置较小难度.数值越大难度越大。
Alloc****:用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以我们不需要预置有币的账号,需要的时候自己创建即可以。
Coinbase****:矿工的账号,随便填
Timestamp****:设置创世块的时间戳
parentHash****:上一个区块的hash值,因为是创世块,所以这个值是0
extraData****:附加信息,随便填,但必须是16进制形式。
gasLimit****:该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大。区块gas limit是单个区块允许的最多gas总量,以此可以用来决定单个区块中能打包多少笔交易。例如,我们有5笔交易的gas limit分别是10、20、30、40和50.如果区块gas limit是100,那么前4笔交易就能被成功打包进入这个区块。矿工有权决定将哪些交易打包入区块。所以,另一个矿工可以选择打包最后两笔交易进入这个区块(50+40),然后再将第一笔交易打包(10)。如果你尝试将一个会使用超过当前区块gas limit的交易打包,这个交易会被网络拒绝,你的以太坊客户端会反馈错误"交易超过区块gas limit"。
注:上述的0x 表示是16进制
1.3创建数据块存放位置及初始化创世块
通过如下命令创建一个使用这个创世块的数据库(通过--datadir指定),这将为您的链条导入并设置规范的创世块。
geth --datadir "%cd%\chainblock" init xfli.json
在geth目录下执行上述命令,将会在geth安装目录下创建存放数据块文件夹chainblock。注:%cd%为当前目录。
如果在1.2中创世块创建中xfli.json的内容不符合规范,在本处执行的时候可能会出错:
(1)Fatal: invalid genesis file: missing 0x prefix for hex data:这个错误信息意思很明白,就是你的json文件中,对于16进制数据,需要加上0x前缀
(2)Fatal: invalid genesis file: hex string has odd length: 从v1.6开始,设置的十六进制数值,不能是奇数位, 比如不能是0x0,而应该是0x00。
(3)Fatal: failed to write genesis block: genesis has no chain configuration :这个错误信息,就是说,你的json文件中,缺少config部分。看到这个信息,我们不需要把geth退回到v1.5版本,而是需要加上config部分。
(4)Error: invalid sender undefined: 这个错误不会导致初始化失败,但是会在以后的转账(eth.sendTransaction),或者部署智能合约的时候产生。解决方法就是chainId 不能设置为0。 如果你完全按照github上给的官方配置文件,就会产生这个错误。
1.4启动区块链节点
geth --identity "xfli_etherum" --rpc --rpcaddr "IP(A)" --rpccorsdomain "*" --datadir "%cd%\chainblock" --rpcapi "db,eth,net,web3" --networkid 1985 console
当出现welcome to the geth javascript console!则表示成功启动了节点。我们对上述的操作命令做简单介绍:
--identity:对节点进行命名。这会为你的节点设置一个身份,使之更容易在端点列表中被辨认出来。
--rpc:启用HTTP-RPC服务器,可以激活你节点上的RPC界面。它在geth中通常被默认激活。
--rpcaddr:HTTP-RPC服务器接口地址(默认值:“localhost”)
--rpccorsdomain:允许跨域请求的域名列表(逗号分隔)(浏览器强制),*表示不限制
--datadir:我们创建的私有链的区块数据库路径
--rpcapi:这个命令可以决定允许什么API通过RPC进入。在默认情况下,geth可以在RPC激活web3界面。
重要信息:请注意在RPC/IPC界面提供API,会使每个可以进入这个界面(例如dapp's)的人都有权限访问这个API。注意你激活的是哪个API。Geth会默认激活IPC界面上所有的API,以及RPC界面上的db,eth,net和web3 API。
--networkid:指定私有网络的id,私有链取一个大于4的随意的值。
其他参数:
--nodiscover:使用这个命令可以确保你的节点不会被非手动添加你的人发现。否则,你的节点可能被陌生人的区块链无意添加,如果他和你有相同的初始文件和网络ID。
--maxpeers 0:如果你不希望其他人连接到你的测试链,可以使用maxpeers 0。反之,如果你确切知道希望多少人连接到你的节点,你也可以通过调整数字来实现。
启动了节点后,就进入了geth命令行模式,当我们退出geth后,则节点私有网路断开,如果下次我们还要连接到私有网络,还需要安装上面来启动节点网络。
1.5在私有链上挖矿
现在我们可以开始挖矿了(ps:这里挖的只是测试币而已,不能在生产环节使用。包括上面的账户地址也不能在以太坊公有链使用,无法接受真正的以太币。)
挖矿命令:
miner.start():表示将使用服务器的所有cpu进行挖矿
miner.start(n):表示将使用服务器的n核cpu进行挖矿
停止挖矿命令:
miner.stop()
注:上述命令是在geth控制台上使用。当挖矿开始后,屏幕一直处于信息状态,如果要停止,直接输入miner.stop()就搞定!不用管屏幕没有提示符,直接输就是!
网友评论