在以太坊下搭建了私有链

Posted by 土猪 on December 5, 2017

出于兴趣想在自己的机器上搭建一个以太坊的私有链,为了达到多个节点的效果,我在自己的机器上装了一个虚拟主机(VM),这样我的主机是windows操作系统,另一个虚拟机是ubundu,这样我一台机器就可以玩两个节点。在网上搜了很久,找到了一个靠谱的方法。

第一步,到我的ubundu上安装geth客户端,官方指南是

https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum

我执行了如下命令:

sudo apt-get update

sudo apt-get installsoftware-properties-common

sudo add-apt-repository -y ppa:ethereum/ethereum

sudo add-apt-repository -y ppa:ethereum/ethereum-dev

sudo apt-get update

sudo apt-get install ethereum

然后验证一下安装是否成功,输入:

geth

第二步,到我的主机windows机器上安装geth客户端

到这里来下载文件:

https://geth.ethereum.org/downloads/

选择其中的Geth 1.7.3 for Windows,下载后安装。

这样下载安装后,就是命令行界面。

到这里下载和安装图形化界面的以太坊:

https://github.com/ethereum/mist/releases/

第三步,准备创世块文件

配置创世块是为了区分公有链,同一个网络中,创世块必须是一样的,否则无法联通,此方法在windows和Ubuntu下通用。

新建文件genesis.json,输入如下内容并保存

{

"nonce":"0x0000000000000042",

"mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",
"config": {
    "chainId": 17,
    "homesteadBlock": 0,
    "eip155Block": 0,
    "eip158Block": 0
},

"difficulty": "0x4000",

"alloc": {},

"coinbase":"0x0000000000000000000000000000000000000000",

"timestamp": "0x00",

"parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",

"extraData": "0x00",

"gasLimit":"0xffffffff"

}

mixhash 与nonce配合用于挖矿,由上一个区块的一部分生成的hash。
nonce nonce就是一个64位随机数,用于挖矿,注意他和mixhash的设置需要满足以太坊的的条件。
difficulty 设置当前区块的难度,如果难度过大,cpu挖矿就很难,这里设置较小难度
alloc 用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以我们不需要预置有币的账号,需要的时候自己创建即可以。
coinbase 矿工的账号,随便填
timestamp 设置创世块的时间戳
parentHash 上一个区块的hash值,因为是创世块,所以这个值是0
extraData 附加信息,随便填,可以填你的个性信息
gasLimit 该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大。

以太坊的公有链创世块早已存在,并且以p2p的方式下载到每个节点中,咱们这个测试用的私链,需要 人工把genesis.json这个创世块文件拷贝到三个节点的geth运行目录下,需要同样的文件,内容不能改动。

第四步,启动私有链节点

构建私有链 ,需要在Geth启动时加入一些参数,Geth参数含义如下:

identity 区块链的标示,随便填写,用于标示目前网络的名字
init 指定创世块文件的位置,并创建初始块
datadir 设置当前区块链网络数据存放的位置
port 网络监听端口
rpc 启动rpc通信,可以进行智能合约的部署和调试
rpcapi 设置允许连接的rpc的客户端,一般为db,eth,net,web3
networkid 设置当前区块链的网络ID,用于区分不同的网络,是一个数字
console 启动命令行模式,可以在Geth中执行命令

4.1 先到我的ubundu上启动链:

我就在当前目录下创建数据存放地址,初始化创世块:

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

geth --identity"chenlocus"  --rpc  --rpccorsdomain "*" --datadir  "./chain" --port "33333"  --rpcapi "db,eth,net,web3"  --networkid 95518 console

看到 [::]:33333和Welcome to the Geth JavaScript console!的提示,说明已经启动成功

启动成功,在光标地方可以使用以太坊的命令行。

4.2 接着到我自己的主机上启动私有链,先初始化创世块和区块链数据存放地址:

geth --datadir ".\chain" init genesis.json

再启动链:

geth --identity "chenlocus" --rpc --rpccorsdomain "*" --datadir ".\chain" --port "33333" --rpcapi "db,eth,net,web3" --networkid 95518 console

4.3 创建第一个账号:

在geth的命令行模式下,在我的主机节点上创建一个账户:

personal.newAccount()

在我的主机节点上打开Ethereum图形界面,在右上角会有一个‘private-net’,说明私有链被识别出来了。

点击’launch application‘进入,main account就是我们刚才在命令行模式下创建的账户:

4.4 连接其它节点

在我的主机输入这个命令:

admin.nodeInfo

这是我主机自己的节点,记录下enode的信息:

enode://91f55eae577877b448329ff7f6e028dabd360702e4abd1e25232640e52c5738dfeb78b1b3e3a3df86cbe3fa5050f0d7bc874c24ea31e40af9a47bd9c59a1d41f@[::]:33333

把[::]改成主机ip地址,变成:

enode://91f55eae577877b448329ff7f6e028dabd360702e4abd1e25232640e52c5738dfeb78b1b3e3a3df86cbe3fa5050f0d7bc874c24ea31e40af9a47bd9c59a1d41f@[172.17.123.58]:33333

在我的ubundu节点的命令行中输入:

admin.addPeer(‘enode://91f55eae577877b448329ff7f6e028dabd360702e4abd1e25232640e52c5738dfeb78b1b3e3a3df86cbe3fa5050f0d7bc874c24ea31e40af9a47bd9c59a1d41f@[172.17.123.58]:33333’)

输入admin.peers会显示出新添加的节点:

如果想体验一下发财的乐趣,就用miner.start()命令挖矿,你会看到main account上以太坊数量剧增,从此走向人生巅峰,人生不也是那样的,最终都会归零,用miner.stop()停止挖矿。

下次我打算在上面部署些智能合约玩玩,看看ICO怎么运行的。

更多区块链文章:


支付宝打赏

您的打赏是对我最大的鼓励!