安装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
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)})