创建两个账号,用来挖矿

mkidr node1 && mkidr node2 && mkdir bootnode
geth --datadir=node1 account new
geth --datadir=node2 account new

创建genesis.json文件,在alloc中将上面创建的两个地址写入

{
  "config": {
    "chainId": 12345,
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip155Block": 0,
    "eip158Block": 0,
    "byzantiumBlock": 0,
    "constantinopleBlock": 0,
    "petersburgBlock": 0,
    "istanbulBlock": 0,
    "berlinBlock": 0,
    "ethash": {}
  },
  "difficulty": "0",
  "gasLimit": "0",
  "alloc": {
    "16377128c9d0770b38Af7E13F1cBb03684969B62": { "balance": "10000000000000" },
    "7393355d3CE4DEC885f0E370C91D7A08F4902A32": { "balance": "10000000000000" }
  }
}

初始化节点

geth --datadir=node1 init config/genesis.json
geth --datadir=node2 init config/genesis.json

创建启动节点

bootnode --genkey=bootnode/boot.key
# 需要先启动一下,拿到enode地址
bootnode --nodekey=bootnode/boot.key

通过bootnode --nodekey=/root/boot.key可以得到一个地址,传入到下面的--bootnodes参数中,如enode://fd600f37d41648934cacbf827a223c3877804e777e963230ae614efe212d0e9537fbf397ece3e583af9258e578a37069127428d27410494671c7fc950497037d@127.0.0.1:0?discport=30301,需要把其中的IP地址替换成正常的bootnode的IP地址

创建docker-compose.yaml文件

version: '3'

services:
  eth-elb:
    image: nginx:1.21.5
    container_name: eth-elb
    restart: always
    privileged: true
    ports:
      - 9315:9315
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/log:/var/log/nginx
    networks:
      woneth_net:
        ipv4_address: 172.25.0.10

  bootnode:
    image: ethereum/client-go:alltools-stable
    container_name: bootnode
    restart: always
    privileged: true
    volumes:
      - ./bootnode:/root
    command: bootnode -addr=172.25.0.3:30301 --nodekey=/root/boot.key
    networks:
      woneth_net:
        ipv4_address: 172.25.0.3

  eth01:
    image: ethereum/client-go:alltools-stable
    container_name: eth01
    restart: always
    privileged: true
    volumes:
      - ./node1:/data
    command: geth --datadir=/data --networkid=1024 --http --http.addr 0.0.0.0 --http.port 8546 --http.api admin,eth,miner,net,txpool,personal,web3,debug --http.corsdomain '*' --bootnodes=enode://fd600f37d41648934cacbf827a223c3877804e777e963230ae614efe212d0e9537fbf397ece3e583af9258e578a37069127428d27410494671c7fc950497037d@172.25.0.3:30303?discport=30301
    networks:
      woneth_net:
        ipv4_address: 172.25.0.2

  eth02:
    image: ethereum/client-go:alltools-stable
    container_name: eth02
    restart: always
    privileged: true
    volumes:
      - ./node2:/data
    command: geth --datadir=/data --networkid=1024 --mine --miner.etherbase '0x7393355d3CE4DEC885f0E370C91D7A08F4902A32' --miner.gasprice 0 --miner.gastarget 470000000000 --http --http.addr 0.0.0.0 --http.port 8546 --http.api admin,eth,miner,net,txpool,personal,web3,debug --http.corsdomain '*' --bootnodes=enode://fd600f37d41648934cacbf827a223c3877804e777e963230ae614efe212d0e9537fbf397ece3e583af9258e578a37069127428d27410494671c7fc950497037d@172.25.0.3:30303?discport=30301
    networks:
      woneth_net:
        ipv4_address: 172.25.0.5

networks:
  woneth_net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.25.0.0/16



nginx 配置信息

upstream eth_http_elb {  
   server 172.25.0.5:8545;  
   server 172.25.0.2:8545 ;  
}  
  
upstream eth_ws_elb {  
   server 172.25.0.5:8546;  
   server 172.25.0.2:8546 ;  
}  
  
map $http_upgrade $connection_upgrade {  
    default upgrade;  
    '' close;  
}  
  
server {  
   listen 9315;  
   location / {  
       proxy_set_header Host $host;  
       proxy_pass http://eth_http_elb;  
   }  
}  
  
server {  
   listen 9316;  
   location / {  
       proxy_set_header Host $host;  
       proxy_pass http://eth_ws_elb;  
       proxy_http_version 1.1;  
       proxy_set_header Upgrade $http_upgrade;  
       proxy_set_header Connection $connection_upgrade;  
   }  
}

链浏览器器

docker run --rm -p 5000:80 --name otterscan -d --env ERIGON_URL="http://127.0.0.1:9315" otterscan/otterscan