手把手教你搭建以太坊私有链

一、准备工作
本教程所用环境: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

三、小结
本教程是用动手实践方式让你认识以太坊,要知教程操作背后的原理,建议阅读文章 《深入浅出比特币的交易和挖矿》,原理上比特币和以太币是相通的。
想进一步学习以太坊,推荐网站: https://ethfans.org/

你可能感兴趣的:(区块链)