在进行以太坊的应用开发时,因为手续费令人吃不消,也会暴露自己正在开发中的项目,因此开发上我们会另外架设以太坊的私链。

以太坊私有链的架设算是相当简单,初学者可能比较难理解不同节点的角色,在建链时产生疑惑,以下会用尽量用最简单的方法,引导建链的过程。

以下都是在Ubuntu 16.04上实作,并在本机上架设两个以太坊私有链节点。

Node A

我们先以A 节点的角色操作,建立第一个区块链节点。

创建私有链资料夹

A节点的私有链的资料都会储存到该资料夹中。

mkdir private-chain-A cd private-chain-A

下载Geth

依据作业系统下载geth tools并解压缩至资料夹中:https://geth.ethereum.org/downloads/

新建帐号

用下列指令新建帐号,预设会帐号存到~/.ethereum/keystore,--datadir可将帐号存在设定的资料夹。

#创建帐号 geth account new --datadir ./#读取帐号 geth account list --datadir ./

产生genesis.json

接着启动puppeth照着指示一步一步产生genesis.json

1. Please specify a network name to administer (no spaces, hyphens or capital letters please) 请输入你的网络名称(不可用空白、连接号或大写)2. What would you like to do 2设定新的genesis3. What would you like to do 1新建新的genesis4. Which consensus engine to use 2 Clique - proof-of-authority5. How many seconds should blocks take (default = 15) 产生一个区块需要几秒6. Which accounts are allowed to seal (mandatory at least one) 指定那些帐号可以授权封装。7. Which accounts should be pre-funded 那些帐号可以得到Ether8. Should the precompile-addresses (0x1 .. 0xff) be pre-funded with 1 wei precompile-addresses需要被分配到1wei吗 (预设yes)9. Specify your chain/network ID if you want an explicit one (default = random) 输入chain/network ID,预设随机10. What would you like to do 2 Manage existing genesis (管理现在的genesis) 2 Export genesis configurations (输出genesis)11. Which folder to save the genesis specs into (default = current) 将genesis存到哪个资料夹(预设当下)

puppeth会产生多个genesis ,可以删除-harmony.json的genesis

初始化geth

geth init --datadir ./ .json

启动前准备

建议先了解geth的Command-Line-Options 新建pwd.txt解锁你的帐户。

echo > pwd.txt # 为帐号设定的密码

启动geth

我们会启动web socket,需要rpc的话,自行加入参数,启动前有两个参数要先改。

: 刚刚输入的network id : 新建的帐号

nohup geth --networkid --datadir ./ --ws --wsapi eth,personal,web3,miner --wsport 8547 --wsorigins "*" --wsaddr 0.0.0.0 --unlock --password pwd.txt &>output &

Node B

再来以B节点的角色操作,建立第二个区块链节点。

创建私有链资料夹

B节点的私有链的资料都会储存到该资料夹中。

mkdir ~/private-chain-B cd ~/private-chain-B #复制genesis到节点B cp ~/private-chain-A/private.json ./

初始化geth

geth init --datadir ./ private.json

产生B节点的enode

在启动节点B的geth前,我们一定要加入static nodes才会找到其他节点,所以要使用bootnode产生可用的enodeURL,首先我们产生nodekey并放入geth资料夹中,再来产生enodeid,最后加上IP和port就是一个完整的enodeURL了。

PS. geth预设port为30303 ,由于在同一台机器上,必须要避开相同的port,因此我们使用port 30304。

cd geth# geneate nodekey bootnode -genkey nodekey# get enode id enodeid=`bootnode -nodekey nodekey -writeaddress`# get enode URL, IP=127.0.0.1, port=30304 enodeUrl="enode://$enodeid@127.0.0.1:30304" echo $enodeUrl

$enodeUrl先保留着,等等在A节点加入B节点到私有链时就会用到了。

启动节点B的Geth

请参考节点A,geth预设port为30303 ,由于在同一台机器上,必须要避开相同的port,--port要改为30304,--wsport改为8548,也没有unlock account,因为密钥在节点A的资料夹,在B节点无法解密,如需要可以复制到节点B。

nohup geth --networkid 5566 --datadir ./ --port 30304 --ws --wsapi eth,personal,web3,miner --wsport 8548 --wsorigins "*" --wsaddr 0.0.0.0 &>output &

启动后,我们要用A节点将B节点加入私有链的网络中。

操作私有链节点

连入A节点

cd ~/private-chain-A#方法一 geth attach ./geth.ipc#方法二 geth attach ws://127.0.0.1:8547

用A节点将B节点加入私有链

geth attach ./geth.ipc#可以看到现在节点是空的 > admin.peers []#加入节点,请将上面的产生出来的$enodeUrl贴上去,记得要加双引号。 > admin.addPeer("enode://105a34aa34dfc0eb1a5bb8ac79d647733857796345e6d3045e86f7b6aafb450cff81020c344990bfc8c4ad0052441a45a50ba0c930edb0da528e77330b7ef6ec@127.0.0.1:30304") true#连线成功,现在多了B节点资讯 > admin.peers [{ caps: ["eth/63"], enode: "enode://105a34aa34dfc0eb1a5bb8ac79d647733857796345e6d3045e86f7b6aafb450cff81020c344990bfc8c4ad0052441a45a50ba0c930edb0da528e77330b7ef6ec@127.0.0.1:30304", id: "5191c0e1f276805155070835216595c28aa50c1ea2a87d2224ab86e5c0cc73e1", name : "Geth/v1.8.27-stable-4bcc0a37/linux-amd64/go1.11.9", network: { inbound: false, localAddress: "127.0.0.1:52038", remoteAddress: "127.0.0.1:30304", static: true, trusted: false }, protocols: { eth: { difficulty: 1, head: "0x863dd154027e417359f6b41ddf7cb073269fb78cf6a9c5b723e01bcc1a89841c", version: 63 } } }]

挖矿

在连入A节点后,可以开启挖矿

miner.start() miner.stop()

查询帐户Ether

web3.fromWei(web3.eth.getBalance(web3.eth.accounts[0]), 'ether').toFixed(2);

结语

以上就是以太坊私有链的建链过程,不会太复杂,但需要清楚了解目前进行到步骤。