对于以太坊开发者来说,DApp开发时不能在主链上做测试,必须在测试链或者私有链上工作,今天学习下私有链的搭建。
创始区块
首先必须建立一个创始区块,是一个origin.json文件,名字随意,把以下内容复制进去,把文件放到磁盘上随意创建的一个目录里。
{
"nonce":"0x0000000000000042",
"mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",
"difficulty": "0x4000",
"alloc": {},
"coinbase":"0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x00000000",
"gasLimit":"0xffffffff",
"config":{
"chainId": 666,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
}
}
初始化
在存放origin.json文件的目录下 执行 geth --datadir "%cd%\data" init origin.json
--datadir 为指定私有链数据目录,执行完后当前目录下会生成data目录,data目录又包含geth和keystore目录,geth目录存储区块数据,keystore目录则保存账户信息,%cd% 为当前目录。
启动私有链
执行 geth --identity "mynode" --rpc --rpccorsdomain "*" --datadir "%cd%\data" --port "30303" --rpcapi "db,eth,net,web3" --networkid 1134 console
出现这行字 “Welcome to the Geth JavaScript console!” 就说明启动成功了。
启动节点
需重新启动节点时执行 geth --datadir "%cd%\data" --networkid 1134 console
挖矿
链上的交易、智能合约离不开一个东西,那就是挖矿,挖矿时你整个链运行的必要条件,但自己的私有链只有你一个节点,所以需要你袭击挖矿,打包交易,获的奖励。
执行步骤:
开始挖矿:miner.start()
结束挖矿:miner.stop()
区块参数
nonce 一个64位随机数,用于挖矿,注意他和mixhash的设置需要满足以太坊的Yellow paper,4.3.4. Block Header Validity,(44)章节所描述的条件。
mixhash 与nonce配合用于挖矿,由上一个区块的一部分生成的hash。注意他和nonce的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。.
difficulty 设置当前区块的难度,如果难度过大,cpu挖矿就很难,这里设置较小难度
alloc 用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以我们不需要预置有币的账号,需要的时候自己创建即可以。
coinbase 矿工的账号,随便填,因为当每挖到一个区块的时候,这个值会变成矿工的etherbase地址
timestamp 设置创世块的时间戳,一个unix的time()函数的输出值
parentHash 上一个区块的hash值,因为是创世块,所以这个值是0
extraData 32字节长度,可以为私有链留下一些信息,如你的姓名等,用以证明这个私有链是你创建的
gasLimit 一个区块所能消耗的gas上限,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大。
config 配置部分,确保某些协议升级立即可用。
命令参数
--identity "MyNode" 为你的节点设置一个ID。用于和你们的一系列同伴进行区分。
--rpc 在你的节点上激活RPC接口,这参数在geth中默认启用。
--rpcapi "db,eth,net,web3" 这个命令描述哪些接口可以通过RPC来访问,默认情况下,geth开启的是web3接口。
--rpcport "8086" 将端口号设置成8000以上的任何一个你网络中打开的端口。默认是8080。
--rpccorsdomainhttp://chriseth.github.io/browser-solidity/ 设置可以连接到你的节点的url地址,以执行RPC客户端的任务。最好不要使用通配符 * ,这样将允许任何url都可以链接到你的RPC实例。
--datadir "%cd%\chain" 私有链的数据目录,确保与公共以太坊链的数据目录区分开来。
--port "30303" 这是“网络监听的端口”,您可以用它手动的和你的同伴相连。
--nodiscover 添加这个参数,确保没有人能发现你的节点。不然的话,可能有人无意中会链接到你的私有区块链。
--maxpeers 0 使用maxpeers 0,如果你不希望其他人连接到您的测试链。当然,您也可以调整这个数,如果你知道有多少同伴会连接你的节点。
console 启动命令行模式,可以在Geth中执行命令
常遇错误
Fatal: invalid genesis file: missing 0x prefix for hex data:这个错误信息意思很明白,就是你的json文件中,对于16进制数据,需要加上0x前缀
Fatal: invalid genesis file: hex string has odd length: 从v1.6开始,设置的十六进制数值,不能是奇数位, 比如不能是0x0,而应该是0x00。
Fatal: failed to write genesis block: genesis has no chain configuration :这个错误信息,就是说,你的json文件中,缺少config部分。看到这个信息,我们不需要把geth退回到v1.5版本,而是需要加上config部分。
Error: invalid sender undefined: 这个错误不会导致初始化失败,但是会在以后的转账(eth.sendTransaction),或者部署智能合约的时候产生。解决方法就是chainId 不能设置为0。 如果你完全按照github上给的官方配置文件,就会产生这个错误。