15分钟建立你的私人区块链

大家也许还对节点如何挖矿运作、如何执行交易…等等,感到难以理解。身体力行也许是可以让人最快理解的方式,就让我们来试着建立一个私人以太坊,更进一步了解这个生态圈的运作方式

看完这篇文章你可以了解到以下几点:
1)如何建立一个私人的以太坊(建立于AWS linux)
2)如何用挖矿赚取回报
3)帐号之间如何进行汇款交易

*了解以上项目只需要花你15分钟的时间*

第一步:登入AWS帐号,并启动一台EC2主机

重点1:选择Ubuntu OS 作为安装的linux 版本

重点2:Instance Type选择至少t2.medium以上规格(相关文章指出此规格以上比较能让以太坊正常运作,在这里先不讨论主机规格会对节点造成的影响)

重点3:设置正确的TCP port (节点之间预设互相Peering的Port是30303,故要设定一port range或单一port皆可)

重点4:储存好key pair 并launch instance

第二步:安装以太坊节点

重点1:开启你电脑里的Terminal软体(中文是"终端机")并使用上一步骤产生的key pair登入aws主机(本登入步骤只适用Mac使用者,如果你是Windows使用者,建议使用PuTTY软体)

使用Terminal进入存放key pair的指令可用: cd 
以我自己为例:cd /Users/ryanhu/Documents/Ethereum

重点2:安装节点所需的相关软体

输入以下4个指令

*此处安装的是PPA(Personal Package Archive) 版本以太坊节点。有开发测试所需要的软体,且预设不会与整个以太坊同步,可大大降低安装时间*

$ sudo apt-get install software-properties-common 
$ sudo add-apt-repository -y ppa:ethereum/ethereum 
$ sudo apt-get update 
$ sudo apt-get install ethereum

输入以下指令以产生一Genesis.json 档案(此档案用于初始化节点)

$ sudo vim Genesis.json

复制贴上下方json 文字于Genesis.json 里并存档(相关设定参数暂不讨论,会再另起文章详细说明,此时只需先记住此节点chainId 设定是885(你可变更为任意数字) )

*复制好json 文字后可用:i 指令(分号+i+enter)让vim 模式变成编辑模式,此时再用ctrl + v 即可贴上*

*贴上后再用:wq 指令(分号+w+q+enter)存档并离开vim 编辑模式*

{ 

"config": { 

"chainId": 885 , 

"homesteadBlock": 0 , 

"eip155Block": 0 , 

"eip158Block": 0

 }, 

"nonce": "0x0000000000000042", 

"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", 

"difficulty" : "0x200", 

"alloc": {},"coinbase": "0x0000000000000000000000000000000000000000", 

"timestamp": "0x00", 

"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", 

"gasLimit": "0xffffffff", 

"alloc": { 

} 

}

使用geth 指令及Genesis.json 档案,开始初始化节点

$ sudo geth init Genesis.json

第三步:开始测试节点

重点1:进入geth console 模式

如果此时你不是管理者身份,无法使用指令,会出现permission denied 的错误讯息,所以请先用以下指令切换成管理者身份

$ sudo -s

用geth console 指令进入节点的指令模式。nodiscover 表示不搜寻其它节点与不与其它节点沟通

$ geth --nodiscover console

重点2:替此节点新增第一个帐号

> personal.newAccount()

输入此指令后,会被要求替此帐号设定密码。密码设定完成后,即会产生第一组的public address,也就是所谓的创始帐号

用此指令查看一下第一组address 里有多少ether

> web3.fromWei(eth.getBalance(eth.accounts[0]), "ether")

虽然一开始创始帐号里是没有钱的,但是我们仍然还是有2种方式可以让此帐号里有ether:

  1. 在设定Genesis.json 时,指定一笔金额给创始帐号(之后的文章会详细解说)
  2. 自己挖矿(本教学的其中一个目的,故我们一开始先不给创始帐号任何ether)

重点3:开始挖矿啦!

为了让挖矿过程中的每个步骤都一目了然,我们先用以下指令离开指令模式

> exit

然后使用以下指令重新进入指令模式。此指令的用意在于让geth 的每一步骤都输出到process.log 这个档案里

$ geth --nodiscover console 2>> process.log

这时侯再请打开另一个Terminal 视窗,然后同样登入此aws instance,并输入以下指令。此指令可让你随时查看最新的log

$ tail -f process.log

于指令视窗输入以下指令,开始挖矿!

> miner.start()

此时可于log 视窗看出正在为创世区块产生DAG(Directed Acyclic Graph 算法,也就是以太坊目前所使用的按术)


等待几分钟后,节点就会开始进行挖矿

经过几分钟的挖矿,一但有区块被挖取完毕,此时用指令再次查看帐号余额会发现已经有ether 在内

挖矿测试完毕。此时可用以下指令让节点停止挖矿

> miner.stop()

第四步:新增另一个节点,用于测试帐号之间的交易

重点1:重覆以上的第一步(登入AWS帐号,并启动一台EC2主机)及第二步(安装以太坊节点)

*于第二步安装节点时,Genesis.json 里的chain id 仍需指定为885。故于此教学,直接复制第一个节点的Genesis.json 的内容即可*

重点2:也在第2个节点里创立一个新的帐号

重点3:让此2节点互相关联(Peering)

可以分别在两个节点视窗输入以下指令,查看目前有哪些节点与自己Peering

> admin.peers

可以看得出来2个节点的结果均显示为空,没有任何的节点与之相关联

开始关联2个节点

用以下指令在“第1个节点”取得节点资料

> admin.nodeInfo.enode

*enode 指的就是Ethereum node*

以我的例子来说,第1个节点的资料长这样

“enode://ddbae8da7bbcc5002341e919d05a88707dc15ea13ed5638c1297d8c6f744bb2232f7e0900833f0f2646ee7a97db011af83e8df3203fadec550779813dcb3a102@[::]:30303?discport=0”

此时请打开“第2个节点”的视窗,并依照你自己的节点资料,输入如下指令

> admin.addPeer("enode://ddbae8da7bbcc5002341e919d05a88707dc15ea13ed5638c1297d8c6f744bb2232f7e0900833f0f2646ee7a97db011af83e8df3203fadec550779813dcb3a102@123.456.789.888:30303?discport=0")

*把[::] 换成第1个节点的IP,port 用30303。此处范例我的IP是123.456.789.888*

*此指令的用意,是要告诉第2个节点让它去Peering 第1个节点*

*可以在aws instance 的页面找到第1个节点的IP*

此时再分别去2个节点视窗输入以下指令,可以看出目前2个节点已互相关联(只需要作1次,让Node 2 peering Node 1 即可)

> admin.peers

重点4:开始让2个节点互相转帐吧

目前只有第1个节点有ether 所以我们先打开节点1 的视窗,然后再次输入以下指令确认一下ether 金额

> web3.fromWei(eth.getBalance(eth.coinbase), "ether")

输入以下指令解锁创始帐号(需先输入密码解锁帐号,否则无法转帐)

> personal.unlockAccount(eth.coinbase)

输入以下指令让Node 1 的创始帐号转帐400 ether 给Node 2 的创始帐号(请更换成你自己Node 2的创始帐号)

> eth.sendTransaction({from: eth.coinbase, to: "0x504008e1d457B7DAa4F247F51e7Bcc1F209E017e", value: web3.toWei(400, "ether")})

忘了自己Node 2的创始帐号是什么吗?进到节点2 后,可以输入以下指令查询

> eth.coinbase

还记得我们刚才有开了个可以监看所有步骤的log 视窗吗?打开它,你可以看到转帐的指令有确实送出

但此时仍然尚未转帐成功,可以到节点2 去查看ether 余额,仍然是为0

为什么呢?因为目前2个节点都没有启动矿工挖矿,所以交易转帐不会被确认,节点2 自然也就收不到应该有的ether

再次用以下指令让节点开始挖矿吧(此时不论用节点1或节点2启动挖矿都能够确认完成交易,但为了证明ether是由节点1转帐过去,故我们仍然是由节点1来进行挖矿)

> miner.start()

过一点时间后(我大概等不到30秒) 再去查看节点2 的余额

以上就是本次的教学文章,有任何问题欢迎提出批评指教

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

相关文章阅读