树莓派Ubuntu22.04系统搭建Geth私有链(局域网)

5,692 阅读4分钟

安装Geth

  • (注意:版本为1.9.10,不同版本的geth命令行参数会有所不同)
# 1. 下载源代码:
wget https://github.com/ethereum/go-ethereum/archive/refs/tags/v1.9.10.tar.gz

# 2. 解压源代码并编译
tar -xvf v1.9.10.tar.gz
cd go-ethereum-1.9.10

# 3. 编译源代码
make geth

测试并启动Geth私链

  • 将编译好的geth复制到系统环境中:
    sudo cp ./build/bin/geth /usr/local/bin
    
  • 测试geth是否安装成功:
    geth --help
    

编辑创世块 genesis.json

  • genesis.json 中config里面的参数需要完整,启动geth后查看eth.chainId(),看是否与config中的一致。

    {
      "config": {
              "chainId": 1818,
              "homesteadBlock": 0,
              "eip150Block": 0,
              "eip155Block": 0,
              "eip158Block": 0,
              "ByzantiumBlock": 0,
              "constantinopleBlock": 0, 
              "petersburgBlock": 0
      },
      "alloc": {
          "0xbdda794a097b41309700fdc5bdba880a7763c738": {
                "balance": "100"
            }
      },
      "coinbase": "0x0000000000000000000000000000000000000000",
      "difficulty": "0x2",
      "extraData": "",
      "gasLimit": "0xffffffff",
      "nonce": "0x0000000000000042",
      "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
      "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
      "timestamp": "0x00"
    }
    
  • 参数说明:

    • chainId:区块链的ID,geth命令中networkid需要与chainId保持一致,在epi155协议中用到,进行重放保护
    • networkid:区分网络,使相同值的网络才可以连接
    • homesteadBlock:Homestead 硬分叉区块高度,指定从哪个区块开始实施Homestead 硬分叉
    • eip155Block:指明从那个节点开始实现eip155协议,详情ethereum/EIPs-155 Simple replay attack protection 35,36
    • eip158Block:指明从那个节点开始实现eip158协议,详情看ethereum/EIPs-158 State clearing 被EIP-161取代
    • ByzantiumBlock:指明什么时候实现拜占庭分叉
    • constantinopleBlock:(同拜占庭)
    • petersburgBlock:(同拜占庭)
    • coinbase:挖矿后获得奖励的账户地址
    • difficulty:挖矿难度
    • gasLimit:一个区块中的gas消耗上限,限制区块能包含的信息总和
    • nonce:随机值
    • alloc:预设一个账号以及账号的以太币数量
    • extraData:附加信息,最多32字节
    • mixhash:一个256位的哈希证明,与nonce一起验证本区块的有效性
    • parentHash:前一个区块的hash值

Geth区块链初始化

# init是初始化命令,--datadir指定数据存储目录
geth init genesis.json --datadir ./data

启动Geth私链

geth --datadir ./data --networkid 10086 --port 30303 --rpc --rpcaddr "0.0.0.0" --rpcport 8545 --rpcapi 'db,net,eth,web3,personal' --rpccorsdomain '*' --ws --wsaddr "0.0.0.0" --wsport 8546 --allow-insecure-unlock console 2>>1.log
  • 参数说明

    • datadir:指定之前初始化的数据存储目录
    • networkid:设置为与chainId相同的值,代表加入哪个网络
    • port:P2P端口,节点之间互相通信的端口
    • rpc:开启远程调用服务
    • rpcaddr:指定HTTP-RPC服务地址,设置为0.0.0.0可以使局域网中其他主机能够访问,方便主机与树莓派进行联调
    • rpcport:远程服务的端口,默认8545
    • rpcapi:远程服务提供的远程调用函数集
    • rpccorsdomain:指定可以接收请求来源的域名列表
    • ws:启动websocket RPC服务
    • wsaddr:WS-RPC服务监听地址,为了方便调用也设置为0.0.0.0
    • wsport:WS-RPC监听端口,默认为8546,不能与rpcport重复
    • allow-insecure-unlock:允许在geth命令窗口中解锁账户
    • console:进入管理台
    • 2>>1.log:Unix系统下的重定向,将Geth产生的日志输出重定向到1.log中,注意>>两边是没有空格的,否则log仍然会打印在终端,并且不显示console控制台
  • 可以将geth启动命令写进一个shell脚本中,方便启动geth或者修改启动参数

#!/bin/bash
geth --datadir ./data --networkid 10086 --port 30303 --rpc --rpcaddr "0.0.0.0" --rpcport 8545 --rpcapi 'db,net,eth,web3,personal' --rpccorsdomain '*' --ws --wsaddr "0.0.0.0" --wsport 8546 --allow-insecure-unlock console 2>>1.log

image.png

Geth基础使用

查看账户

# 获取区块中的账户列表
> eth.accounts
["0xbdda794a097b41309700fdc5bdba880a7763c738"]

创建账户

# 使用密码生成一个新的账户
> personal.newAccount("123")

查看余额

> eth.getBalance(eth.accounts[0])
> eth.getBalance(eth.accounts[1])

挖矿

# 挖矿可以使coinbase对应的账户增加资产,可以将pending状态的交易打包完成
> miner.start(1);admin.sleepBlocks(10);miner.stop()

解锁账户

# 解锁账户需要填入对应的密码,转账前需要将进行转账的账户地址进行解锁
> personal.unlockAccount(eth.accounts[1], "123")

转账

# 执行完转账操作后需要进行挖矿,将交易打包进区块中
> eth.sendTransaction({from:eth.accounts[0], to: eth.accounts[1], value:web3.toWei(1)})