以太坊私鏈測試,通過docker多節點本地部署挖礦、轉賬
)
1.準備geth工具
https://geth.ethereum.org/downloads/
geth --help
2.預先創建帳戶,初始化創始區塊
1. 創建密碼文件
> echo "111111" > .passwd
2. 爲node1創建帳戶
> for ((n=0;n<2;n++)); do geth account new --password .passwd --datadir ./node1; done
3. 爲node2創建帳戶
> for ((n=0;n<2;n++)); do geth account new --password .passwd --datadir ./node2; done
4.創建創世區塊 genesis.json
{
"config": {
"chainId": 150,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc": {},
"coinbase": "0x0000000000000000000000000000000000000000",
"difficulty": "0x20000",
"extraData": "",
"gasLimit": "0x2fefd8",
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
}
4.初始化鏈數據
> geth init --datadir ./node1 genesis.json
> geth init --datadir ./node2 genesis.json
節點 | 挖礦賬戶 | 資金賬戶 |
---|---|---|
node1 | 0xd8e6708334bdf3e9144a62859c99998caa7df32d | 0x23eaf35e78a350041cd56d88a04d7b77d45c9844 |
node2 | 0x4beff4fceff14ef1c24956fb81387d21f24ca04b | 0xae5ed5d1b2137ebc9304cff4cd6192bbb6ea965a |
3.配置Dockerfile
FROM golang:1.10-alpine as builder
RUN apk add --no-cache make gcc musl-dev linux-headers git
RUN git clone --depth 1 --branch release/1.8 https://github.com/ethereum/go-ethereum /go-ethereum
RUN cd /go-ethereum && make all
FROM alpine:latest
RUN apk add --no-cache ca-certificates
COPY --from=builder /go-ethereum/build/bin/* /usr/local/bin/
WORKDIR "/opt"
ENV coinbase=""
ENV datadir=""
CMD exec geth --datadir ./$datadir --verbosity=4 --rpc --rpcapi "eth,web3,personal,net,miner,admin,debug,db" --rpcaddr "0.0.0.0" --rpccorsdomain "*" --syncmode=full --mine --unlock $coinbase --password .passwd
EXPOSE 8545
EXPOSE 30303
4.配置docker-compose
version: "3"
services:
sealnode-1:
container_name: sealnode-1
hostname: sealnode-1
environment:
coinbase: d8e6708334bDF3e9144a62859C99998CAa7dF32D
datadir: node1
build:
context: .
ports:
- 8545:8545
- 30303:30303
volumes:
- .:/opt
networks:
- mynet
sealnode-2:
container_name: sealnode-2
hostname: sealnode-2
environment:
coinbase: 4bEfF4FceFf14Ef1C24956Fb81387D21f24CA04b
datadir: node2
build:
context: .
ports:
- 8546:8545
- 30304:30303
volumes:
- .:/opt
networks:
- mynet
networks:
default:
driver: bridge
mynet:
driver: bridge
5.啓動環境
當前目錄結構
├── .passwd
├── docker-compose.yaml
├── dockerfile
├── genesis.json
├── node1
│ ├── geth
│ ├── geth.ipc
│ └── keystore
└── node2
├── geth
├── geth.ipc
└── keystore
準備多個終端
終端1 掛起docker作爲日誌查看
>docker-compose up
終端2 進入geth控制檯
> docker-compose ps
> docker exec -it sealnode-1 /bin/sh
> geth attach node1/geth.ipc
終端3 改下容器ID重複步驟。
6.測試單節點挖礦+轉賬
#查看當前節點賬戶
> eth.accounts
#查看賬戶1的餘額(單位wei轉換爲Eth)
> web3.fromWei(eth.getBalance(eth.accounts[0]), "ether")
#查看賬戶2的餘額
> web3.fromWei(eth.getBalance(eth.accounts[1]), "ether")
#從賬戶1轉入3個ETH給賬戶2
> eth.sendTransaction({from:eth.accounts[0], to:eth.accounts[1], value:web3.toWei(3, "ether")})
#設置挖礦收益賬戶
> miner.setEtherbase(eth.accounts[0])
#挖礦
> miner.start()
#停止挖礦
> miner.stop()
7.綁定多節點
另起一終端查看容器的IP
>docker network ls
>docker network inspect testblock_mynet
可知node1爲172.18.0.3,node2爲172.18.0.2
回到原來的geth控制檯裏查看 節點唯一標誌
node1
> admin.nodeInfo.enode
"enode://53cb3c9cea25b8bc2c6a2deffdc96674a55dcbab658424dcb5da412c4cf2fe3fb443585be3d64169a061381fb8ef19fe47de7c0c59688d01e7e666cc43142357@127.0.0.1:30303"
node2
> admin.nodeInfo.enode
"enode://cae5cf06b4662cb5baaa7919a8ca715a3ed7d737a03c5241b181d6a6240747bf3325441050f871b18ae069e398ec9f720e368ecabfb328b51fb0436cb93446c7@127.0.0.1:30303"
任意綁定節點即可,這裏在node1綁定node2
>admin.addPeer("enode://cae5cf06b4662cb5baaa7919a8ca715a3ed7d737a03c5241b181d6a6240747bf3325441050f871b18ae069e398ec9f720e368ecabfb328b51fb0436cb93446c7@172.18.0.2:30303")
#查看綁定的節點
>admin.peers
#查看區塊高度一致,一致即完成節點同步。
>eth.blockNumber