区块链|以太坊搭建私有链

本文是在Windows上搭建私有链,如果要开发区块链,强烈强烈强烈建议在linux环境下,搭建过程与Windows类似,可以参考下文。
1、安装geth客户端
geth就是Go Ethereum,即用go语言实现的以太坊客户端。Geth是以太坊协议的具体落地实现,通过Geth,你可以实现以太坊的各种功能,如账户的新建编辑删除,开启挖矿,ether币的转移,智能合约的部署和执行等等。
下载地址:https://geth.ethereum.org/downloads/
安装指南:https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum
2、开始建链(参考区块链学堂)
step1:建立目录和genesis.json
我在E盘建立了tmpPrivate文件夹,在这个文件夹下建立genesis.json文件,用notepad++打开,写入一下内同:

{ "config":{ "chainId":15, "homesteadBlock":0, "eip155Block":0, "eip158Block":0 }, "nonce": "0x0000000000000042", "timestamp": "0x00", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x00", "gasLimit": "0x80000000", "difficulty": "0x400", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x3333333333333333333333333333333333333333", "alloc": {} }

参数说明:


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
附加信息,随便填,可以填你的个性信息
gasLimit
该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大。

可能出现的几个错误:


  • 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上给的官方配置文件,就会产生这个错误。
step2:创建创世区块

命令行进入tmpPrivate目录,输入

geth --datadir "./" init genesis.json

完成创世区块的创建,结果如下:


这个时候可以注意一下,此时当前目录下面会新增出两个文件夹geth和keystore:
geth中保存的是区块链的相关数据
keystore中保存的是该链条中的用户信息
step3:创建自己的私有链

执行一下命令,创建私有链:

geth -- datadir "./" --nodiscover console 2>>geth.log


参数:


–datadir 代表文件夹地址,
--nodiscover 表示私有链不要让公网上的节点发现
其中的代码 console 2>> geth.log 代表将控制台的一部分输出,输出到文件geth.log上去。
执行结果:

step4:在自己的私有链上创建账户。
输入 eth.accounts,返回[]

因为现在还没有用户,需要创建用户,执行

personal.newAccount("123")

就创建了一个用户,“123”指的是密码。

可以多执行几次这个命令,多生成几个用户。
结果:

step5:输出区块链的log
这里需要用到tail.exe这个东西,由于Windows没有,所以需要下载,下载后解压在C:\Windows\System32文件夹下即可。
再开一个命令行窗口,进入geth.log的目录,执行tail -f geth.log 可以持续看到日志内容的变化。
step6:开始挖矿
在第一个命令行窗口执行miner.start()命令,即开始挖矿(看网上执行这条命令后返回值是true,但我的返回值是null,但是最后也挖矿成功了。这里不懂)。然后看看第二个窗口中日志的变化。
日志中的部分内容:

第一次启动挖矿会先生成挖矿所需的DAG文件,这个过程有点慢,等进度达到100%后,就会开始挖矿,此时屏幕会被挖矿信息刷屏。

注意点:
1. 挖矿挖到的ether币会默认保在第一个账户中,即eth.acccounts[0]中。
2. 挖矿是执行智能合约的基础。如果停止挖矿的话,不仅以太币会停止生成,所有智能合约的调用也会不起作用。
3. 如果真的要停止挖矿,可以执行命令miner.stop()来停止挖矿
4. 按上面的命令,应该是可以实现以太坊挖矿的。如果不行的话,有可能就是之前有存在的链,此时应该删除之前的数据。在Windows下即删除ethash文件夹和里面的文件即可。
step7:查看挖到的以太币数量


acc0 = eth.accounts[0] eth.getBalance(acc0)

结果:


只要数量不为0,就说明已经挖矿成功。

step7:在两个账户之间转移以太币
先将两个账户表示出来(acc0之前已经写过了,可以不用再写)

acc0 = eth.accounts[0] acc1 = eth.accounts[1]

设置转移数量,比如转移0.01以太币(单位转换):
amount = web3.toWei(0.01)

开始转移:


eth.sendTransaction({from: acc0, to: acc1, value: amount})


但是可能会失败,类似以下图示:
区块链|以太坊搭建私有链
文章图片





这个是以太坊的一个保护机制,每隔一段时间账户就会自动锁定,这个时候任何以太币在账户之间的转换都会被拒绝,除非把该账户解锁.
这个时候我们就需要执行 personal.unlockAccount(acc0) 并输入密码来解锁acc0才可。
然后重新执行

eth.sendTransaction({from: acc0, to: acc1, value: amount})

这条命令。

这个时候再查看acc1的账户,以太币数量就不为0了。

另外需要注意的是:在账户中以太币转移时,挖矿不能停止,否则转移不会成功。
(目前只会这些,以后再补充)

    推荐阅读