以太坊搭建私有链

版权声明:转载请注明文章出处 https://blog.csdn.net/zhj_fly/article/details/78057528

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了。


另外需要注意的是:在账户中以太币转移时,挖矿不能停止,否则转移不会成功。

(目前只会这些,以后再补充)

猜你喜欢

转载自blog.csdn.net/zhj_fly/article/details/78057528