出于兴趣想在自己的机器上搭建一个以太坊的私有链,为了达到多个节点的效果,我在自己的机器上装了一个虚拟主机(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怎么运行的。
更多区块链文章: