以太坊搭建私有链

本文是在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了。

 

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

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值