搭建以太坊私有链集群

配置环境

使用docker并下载必要的文件

  1. FROM ubuntu:16.04
  2.  
  3. RUN apt-get update \
  4. && apt-get install -y software-properties-common \
  5. && add-apt-repository -y ppa:ethereum/ethereum \
  6. && apt-get update \
  7. && apt-get install -y ethereum
  8. COPY genesis.json /code/genesis.json

其中genesis.json内容如下:

  1. {
  2. "alloc": {
  3. },
  4. "config": {
  5. "chainId": 15,
  6. "homesteadBlock": 0,
  7. "eip155Block": 0,
  8. "eip158Block": 0
  9. },
  10. "nonce": "0x000000000000002a",
  11. "difficulty": "0x001000",
  12. "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  13. "coinbase": "0x0000000000000000000000000000000000000000",
  14. "timestamp": "0x00",
  15. "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  16. "extraData": "0x",
  17. "gasLimit": "0x2fefd8"
  18. }

启动2个docker容器

  1. $ docker run -it -p 8545:8545 --name eth_node_1 ymer/ethernum-env:v1
  2. $ docker run -it -p 8546:8545 --name eth_node_2 ymer/ethernum-env:v1

启动之后结果如

  1. $ docker ps
  2. 072c1b740f62 ymer/ethernum-env:v1 "/bin/bash" 5 seconds ago Up 9 seconds 0.0.0.0:8547->8545/tcp eth_node_3
  3. 65606d9f0257 ymer/ethernum-env:v1 "/bin/bash" About a minute ago Up About a minute 0.0.0.0:8546->8545/tcp eth_node_2

查询节点对应的IP地址

  1. $ docker inspect 072c1b740f62 --format='{{.NetworkSettings.IPAddress}}'
  2. 172.17.0.2
  3. $ docker inspect 65606d9f0257 --format='{{.NetworkSettings.IPAddress}}'
  4. 172.17.0.3

纪录下查询的信息:

节点 IP地址 映射端口 容器ID
eth_node_1 172.17.0.2 8545 4cd4
eth_node_2 172.17.0.3 8546 f5d2

启动以太坊私链

首先进入docker容器

执行

  1. $ geth init genesis.json`

创建钱包

创建初始节点钱包,用于接收记账奖励,每个节点都需要创建。节点记账(挖矿)程序运行前,必须先建立初始的钱包,用于接收记账奖励,否则会无法启动记账程序。

执行命令

  1. $ geth account new
  2. Address: {acdc8e98d388aae78f2d5937878ad2332297d1c7}

同时再创建一个用户钱包,稍后将用于本节点钱包转账以及不同节点间钱包转账。

在另一个节点上执行同样操作

查看本节点所有账户

  1. $ geth account list
  2. Account #0: {6e56cfd8ca3299abd5604fb7135b79017d72d543} keystore:///root/.ethereum/keystore/UTC--2018-07-30T11-29-23.969093600Z--6e56cfd8ca3299abd5604fb7135b79017d72d543
  3. Account #1: {e1ebed71951203a7079813dacf7ee3af297630b0} keystore:///root/.ethereum/keystore/UTC--2018-07-30T11-31-21.448019100Z--e1ebed71951203a7079813dacf7ee3af297630b0

开始挖矿

节点1上执行

  1. # geth --identity="NODE_1" --networkid="500" --verbosity=1 --mine --minerthreads=1 --rpc --rpcaddr 0.0.0.0 console
  2. Welcome to the Geth JavaScript console!
  3.  
  4. instance: Geth/NODE_1/v1.8.12-stable-37685930/linux-amd64/go1.10
  5. coinbase: 0xacdc8e98d388aae78f2d5937878ad2332297d1c7
  6. at block: 0 (Thu, 01 Jan 1970 00:00:00 UTC)
  7. datadir: /root/.ethereum
  8. modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
  9.  
  10. >
参数 说明
--identity 每个节点必须唯一
--networkid 在集群里面保持一致,所有的节点都相同
--verbosity 有几个级别0=silent, 1=error... (default: 3)
--mine 开始启动记账(挖矿)程序
--rpc 允许RPC
--rpcport 指定的RPC端口号,演示保持一样,宿主机映射不一样

节点2上执行

  1. geth --identity="NODE_2" --networkid="500" --verbosity=1 --mine --minerthreads=1 --rpc --rpcaddr 0.0.0.0 console

执行完之后,开始挖矿

  1. > miner.start()
  2. null
  3. > eth.blockNumber
  4. 10
  5. > eth.blockNumber
  6. 13

miner.start()返回null,但是使用eth.blockNumber可以看到区块在不断增加

 

配置节点集群

查询节点信息IPC RPC 参数

所有的节点都开始记账(挖矿)程序后,我们就需要配置集群的节点信息,让2个节点能够互相发现,并同步信息。

在节点1中

  1. > admin.peers
  2. []
  3. > admin.nodeInfo.enode
  4. "enode://1c0d3449857f252750945372bf510201b415b2c27999fc462849f6283fd4c7440903049651865bd11d83844cf323cbfd92fcae961c29153a36f894c34899167b@[::]:30303"

将末尾的 [::]替换为我们的内网IP地址,前面有记录,172.17.0.2 
然后在node2中执行:

  1. > node1 = "enode://1c0d...4899167b@172.17.0.2:30303"
  2. > admin.addPeer(enode1)

节点1同样操作,在节点1中添加节点2 
然后在节点1中执行:

  1. > admin.peers
  2. [{
  3. caps: ["eth/63"],
  4. id: "3d3be057a31d376dddf9a3e8749c8f4639e6dfa748677f7dab86bb369d11b826c84d22641efedf240dc68539390ddb6806e05b16a3d20f13caf27d2b7e040f7a",
  5. name: "Geth/NODE_2/v1.8.12-stable-37685930/linux-amd64/go1.10",
  6. network: {
  7. inbound: false,
  8. localAddress: "172.17.0.2:41518",
  9. remoteAddress: "172.17.0.3:30303",
  10. static: true,
  11. trusted: false
  12. },
  13. protocols: {
  14. eth: {
  15. difficulty: 51633962,
  16. head: "0x92c9c8e402d0e8d9693de8361cc69e3b902e7e941772038e246abdaeac4919f9",
  17. version: 63
  18. }
  19. }
  20. }]

如果节点1中执行> exit ,再次进入挖矿后,需要重新添加。 
就是说如果节点1退出挖矿,那么节点2的admin.peers 将为空

删除链

  1. $ geth removedb

 

钱包转账

查询初始钱包余额

  1. > eth.accounts
  2. ["0xa3782d7c6fe47e612db307e48a75fb2e745d9369", "0x13b49f82f4147c7763d4e765250a9875e449e763"]
  3. > node1_w1 = eth.accounts[0]
  4. > eth.getBalance(node1_w1)
  5. 3.013125e+21
  6. > web3.fromWei(eth.getBalance(node1_w1))
  7. 3037.03125
  8. > node1_w2 = eth.accounts[1]
  9. > web3.fromWei(eth.getBalance(node1_w2))
  10. 0

其中,node1_w1是挖矿所得,node1_w2是用户账户。

 

节点内转账

  1. > eth.sendTransaction({from: node1_w1, to: node1_w2, value: web3.toWei(4, "ether")})
  2. "0x6a4d4d1f2eee528560e363b543921f1167ad54af70091b9f7d218a29ce8320a6"

如果报错,需要解锁

  1. > personal.unlockAccount('0xa3782d7c6fe47e612db307e48a75fb2e745d9369', "123", 300)

123是创建账户的密码

查看挂起的交易:

  1. > eth.pendingTransactions
  2. [{
  3. blockHash: null,
  4. blockNumber: null,
  5. from: "0xa3782d7c6fe47e612db307e48a75fb2e745d9369",
  6. gas: 90000,
  7. gasPrice: 18000000000,
  8. hash: "0x6a4d4d1f2eee528560e363b543921f1167ad54af70091b9f7d218a29ce8320a6",
  9. input: "0x",
  10. nonce: 0,
  11. r: "0xdf10f9d5caae629041afdf70fb1dabd66bf9c2508419a305558ce0d0607e4e1e",
  12. s: "0x32a359378297b19d86d883f019be6c0785c7d0e4576f69e55a1bed0104f4cd11",
  13. to: "0x13b49f82f4147c7763d4e765250a9875e449e763",
  14. transactionIndex: 0,
  15. v: "0x42",
  16. value: 4000000000000000000
  17. }]

如果转账结束:

  1. > eth.pendingTransactions
  2. []
  3. > eth.getTransaction("0x6a4d4d1f2eee528560e363b543921f1167ad54af70091b9f7d218a29ce8320a6")
  4. {
  5. blockHash: "0xff907d2dedd7529050bb38dd7373b6cb6e4aedda027690a94ca3eb4ead9dfa0d",
  6. blockNumber: 349,
  7. from: "0xa3782d7c6fe47e612db307e48a75fb2e745d9369",
  8. gas: 90000,
  9. gasPrice: 18000000000,
  10. hash: "0x6a4d4d1f2eee528560e363b543921f1167ad54af70091b9f7d218a29ce8320a6",
  11. input: "0x",
  12. nonce: 0,
  13. r: "0xdf10f9d5caae629041afdf70fb1dabd66bf9c2508419a305558ce0d0607e4e1e",
  14. s: "0x32a359378297b19d86d883f019be6c0785c7d0e4576f69e55a1bed0104f4cd11",
  15. to: "0x13b49f82f4147c7763d4e765250a9875e449e763",
  16. transactionIndex: 0,
  17. v: "0x42",
  18. value: 4000000000000000000
  19. }

节点间转账

通过地址:

  1. > eth.sendTransaction({from: '0xa3782d7c6fe47e612db307e48a75fb2e745d9369', to: '0xdc3b1bc884bca283368f14ee7f577bf777bea464', value: web3.toWei(15, "ether")})

 

阅读更多

更多精彩内容