一、准备工作
本教程所用环境:windows 7 64bits
安装geth:
https://ethfans.org/wikis/Ethereum-Geth-Mirror
二、搭建过程
1.启动私有链,创建帐户
cmd进入geth安装目录
geth --datadir chain1 --nodiscover console
进入geth控制台模式,其中chain1为帐户和区块数据目录
eth.accounts命令查看现有帐户,当前是空。
下面创建两个帐户,其中1234为密码:
personal.newAccount(“1234”)
“0xc9228294cc6bc3e3fcdba0f5d393d68f920c7789”
personal.newAccount(“1234”)
“0x5f0880e6c3507f609548732151a99f6ddc71cb95”
eth.getBalance
命令可以用于获取帐户余额,上述两个帐户目前余额都是0.
2.创建创世块
在geth目录下新建gensis.json文件,文件内容如下:
{
"alloc": {
"0xc9228294cc6bc3e3fcdba0f5d393d68f920c7789": {
"balance": "999000000000000000000"
}
},
"config":{
"chainId":10,
"homesteadBlock":0,
"eip155Block":0,
"eip158Block":0
},
"nonce":"0x0000000000000042",
"mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",
"difficulty": "0x2000",
"alloc": {},
"coinbase":"0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "",
"gasLimit":"0xffffffff"
}
注意:你需要修改上述alloc中的帐户地址,要用你自己机器上第一步骤中实际创建的帐户地址。
别看balance值有很多0,其实只有999个以太币。
各个参数的含义如下:
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的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大。
用如下命令创建创世块:
geth --datadir chain1 init genesis.json
出现错误提示如下:
Fatal: Failed to write genesis block: database already contains an incompatible genesis block
原因是前面启动私有链时候已经创建了默认的创世块。
我们需要先删除原来创世块,如下:
geth removedb --datadir chain1
然后再次执行如下命令,即可创建创世块成功。
geth --datadir chain1 init genesis.json
如下命令再次进入geth控制台
geth --datadir chain1 --nodiscover console
用eth.getBalance可以查看到帐户0现在的余额是999以太币。
eth.accounts
[“0xc9228294cc6bc3e3fcdba0f5d393d68f920c7789”, “0x5f0880e6c3507f609548732151a99f6ddc71cb95”]
eth.getBalance(eth.accounts[0])
999000000000000000000
web3.fromWei(eth.getBalance(eth.accounts[0]))
999
注:Wei是以太币的最小单位,web3.fromWei可以把Wei单位转换成以太币单位。
3.转账交易:从帐户0转10个以太币到帐户1
a0=eth.accounts[0]
“0xc9228294cc6bc3e3fcdba0f5d393d68f920c7789”
a1=eth.accounts[1]
“0x5f0880e6c3507f609548732151a99f6ddc71cb95”
personal.unlockAccount(a0,“1234”)
true
eth.sendTransaction({from:a0, to:a1, value:web3.toWei(10,“ether”)})
INFO [03-25|23:30:40] Submitted transaction fullhash=0x701113bdeaa9b14d424babf8d
x5f0880E6c3507F609548732151a99F6dDc71Cb95
“0x701113bdeaa9b14d424babf8df19852d26e9f23198aa5d7cd2c092581f666468”
注:付款帐户在转账前,需要用personal.unlockAccount命令进行解锁。
现在用eth.getBalance查两个帐户的余额,但遗憾地发现转账交易并未生效。
eth.getBalance(a0)
999000000000000000000
eth.getBalance(a1)
0
原因是交易需要矿工的参与,当前并无启动挖矿的节点。
4.挖矿
启动一个cmd新控制台来挖矿,用下面的命令来attach到已启动的私有链上
geth attach \\.\pipe\geth.ipc
miner.start()命令启动挖矿,在第一个cmd窗口会看到挖矿成功的信息。
INFO [03-25|23:36:30] Successfully sealed new block number=1 hash=232457…18534b
INFO [03-25|23:36:30]
miner.stop()命令停止挖矿。
此时再用eth.getBalance查两个帐户的余额,发现帐户1收到了10个以太币,你会奇怪地发现帐户0的余额反而增加了,那是因为挖矿奖励默认存入帐户0
三、小结
本教程是用动手实践方式让你认识以太坊,要知教程操作背后的原理,建议阅读文章
《深入浅出比特币的交易和挖矿》,原理上比特币和以太币是相通的。
想进一步学习以太坊,推荐网站: