大家也许还对节点如何挖矿运作、如何执行交易…等等,感到难以理解。身体力行也许是可以让人最快理解的方式,就让我们来试着建立一个私人以太坊,更进一步了解这个生态圈的运作方式
看完这篇文章你可以了解到以下几点:
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:
在设定Genesis.json 时,指定一笔金额给创始帐号(之后的文章会详细解说) 自己挖矿(本教学的其中一个目的,故我们一开始先不给创始帐号任何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 的余额
以上就是本次的教学文章,有任何问题欢迎提出批评指教
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。