Geth--学习及记录
安装go环境
go下载及全局设置
wget https://dl.google.com/go/go1.20.5.linux-amd64.tar.gz
tar -C /usr/local -zxvf go1.20.5.linux-amd64.tar.gz
mkdir -p ~/go/src
echo "export GOPATH=$HOME/go" >> ~/.bashrc
echo "export PATH=$PATH:$GOPATH/bin:/usr/local/go/bin" >> ~/.bashrc
source ~/.bashrc
go version
Go和C的编译器
sudo apt-get install -y build-essential golang
geth源码下载及编译
geth源码下载
git clone https://gitee.com/james_xu/go-ethereum.git
geth源码编译
cd go-ethereum
make geth
验证是否成功
./build/bin/geth version #当前目录运行
全局设置
echo " export GETH=/home/xxx/go-ethereum" >> ~/.bashrc
echo " export PATH=$PATH:$GETH/build/bin" >> ~/.bashrc
source ~/.bashrc
geth version # 验证
genesis.json 讲解
config:这个字段包含了以太坊区块链的配置信息。
{
"config": {
"chainId": 0, //区块链的唯一标识符,用于识别不同的区块链网络,主网,测试网都有一个固定Id,network、chainID、创世区块配置都相同时,才是同一条链
"homesteadBlock": 0,//Homestead是以太坊的第一个正式版本,接下来的字段指定了以太坊网络中不同重要协议和硬分叉的激活区块号,
"eip150Block": 0,//包括Homestead、Byzantium、Constantinople和Petersburg等,它们分别引入了重要的特性和改进。
"eip155Block": 0,//不同高度执行不同协议,对应数值为协议生效块高度.
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"berlinBlock": 0,
"londonBlock": 0
},
"alloc": {},//用于指定在创世区块中预分配的以太币给哪些账户。在这里是空的,意味着没有为任何账户预分配以太币
"coinbase": "0x0000000000000000000000000000000000000000",//这是挖矿奖励的接收地址,通常是一个以太坊地址。在这里是一个全零地址,意味着挖矿奖励会被丢弃(burned)。
"difficulty": "0x20000",//挖矿难度系数,用于控制区块生成的速度。难度越高,挖矿需要的计算量越大
"extraData": "",//额外的数据字段,通常用于一些标记或特定信息。
"gasLimit": "0x2fefd8",//每个区块中所允许的Gas数量的上限,Gas用于支付交易费用
"nonce": "0x0000000000000042",//随机数,用于挖矿时的工作量证明(Proof of Work)算法
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",//和Nonce一样,用于挖矿时的工作量证明算法
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",//上一个区块的哈希值
"timestamp": "0x00" //区块的时间戳
}
ChainID参数常见值说明:
Ethereum主网(Mainnet):1
Ropsten测试网络:3
Rinkeby测试网络:4
Kovan测试网络:42
Binance Smart Chain主网:56
Binance Smart Chain测试网络:97
Huobi Eco Chain主网:128
Huobi Eco Chain测试网络:256 (来源:https://cloud.tencent.com/developer/article/2325458?areaId=106001)
私链搭建
创世块初始化
进入某个目录后,先定义自己的创世区块genesis.json,然后新建一个目录data0用来存放区块链数据
然后可以执行 geth 命令 init 初始化创世区块。
geth --datadir data0 init genesis.json
其中–datadir 表示指定目录存储数据,init读取genesis.json来将创世块入链,注意初始化两个节点的链时,–datadir需指定不同目录,且下面的命令–port也需不同
启动私链节点
geth --datadir data0 --networkid 10 --nodiscover console
常用参数(来源:以太坊客户端Geth命令用法-参数详解)
ETHEREUM选项:
--config value TOML 配置文件
--datadir “xxx” 数据库和keystore密钥的数据目录
--networkid value 网络标识符(整型, 1=Frontier, 2=Morden (弃用), 3=Ropsten, 4=Rinkeby) (默认: 1)
--testnet Ropsten网络:预先配置的POW(proof-of-work)测试网络
开发者(模式)选项:iuuuui开启挖矿。
--dev.period value 开发者模式下挖矿周期 (0 = 仅在交易时) (默认: 0)
API和控制台选项:
--rpc 启用HTTP-RPC服务器
--rpcaddr value HTTP-RPC服务器接口地址(默认值:“localhost”)
--rpcport value HTTP-RPC服务器监听端口(默认值:8545)
--rpcapi value 基于HTTP-RPC接口提供的API
--ws 启用WS-RPC服务器
网络选项:
--port value 网卡监听端口(默认值:30303)指定.ipc文件将要用到的端口。这就是使用web3.js库连接数据库的方式
--nodiscover 禁用节点发现机制(不希望节点在没有指定的情况下尝试连接到其它节点,不希望这些节点在没有告诉它们的情况下被发现)
矿工选项:
--mine 打开挖矿
--minerthreads value 挖矿使用的CPU线程数量(默认值:8)
--etherbase value 挖矿奖励地址(默认=第一个创建的帐户)(默认值:“0”)
--targetgaslimit value 目标gas限制:设置最低gas限制(低于这个不会被挖?) (默认值:“4712388”)
--gasprice value 挖矿接受交易的最低gas价格
--extradata value 矿工设置的额外块数据(默认=client version)
启动方式
1.Geth 控制台使用及 Web3.js 使用实战
2.geth启动方式及参数
本地测试
输入上面命令后,进入交互式的Javascript执行环境,在这可以使用一些命令来与区块链进行交互
命令主要包括:(来源:https://cloud.tencent.com/developer/article/1148994?areaId=106001)
eth:包含一些跟操作区块链相关的方法
net:包含以下查看p2p网络状态的方法
admin:包含一些与管理节点相关的方法
miner:包含启动&停止挖矿的一些方法
personal:主要包含一些管理账户的方法
txpool:包含一些查看交易内存池的方法
web3:包含了以上对象,还包含一些单位换算的方法
常用命令
eth.accounts: 返回节点控制的所有账户列表。
eth.getBlock(blockHash Or BlockNumber): 根据区块哈希或区块号返回区块的信息。
eth.getBlockNumber(): 返回当前最高区块号。
eth.getBalance(address Or eth.accounts[x]): 返回指定账户地址的余额。
eth.getGasPrice(): 返回当前 Gas 价格。
eth.coinbase:查看矿工的账户地址。
eth.blockNumber:查看区块高度。
personal.newAccount() 可不填参数。
personal.newAccount('xxx') 创建账户(参数为账户密码)。
personal.listAccounts 返回节点控制的所有账户列表。
miner.start([threads]): 开始挖矿,可选参数指定挖矿线程数。
miner.stop(): 停止挖矿。
miner.setEtherbase(address): 设置挖矿收益地址。
miner.getHashrate(): 返回当前挖矿速率。
miner.setGasPrice(gasPrice): 设置挖矿时的 gas 价格。
miner.setMiningBeneficiary(address): 设置挖矿受益地址。
web3.fromWei(eth.getBalance(eth.accounts[x]),'ether'):返回账户余额,getBalance()返回值的单位是wei,web3.fromWei()将返回值换算成以太币。
personal.unlockAccount(eth.accounts[1]),
或者 personal.unlockAccount(eth.accounts[0],"密码","时间(0表示长时间解锁)") 转账时需解锁账户
eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(10,'ether')}): 以太坊账户列表中索引为0的账户向索引为1的账户发送10个以太币的交易。
txpool.status:查看交易池中等待被打包的交易。
txpool.inspect.pending:看已提交但还未被处理的交易,pending表示已提交但还未被处理的交易。
eth.getBlock("pending",true).transactions:查看当前待确认交易。
admin.nodeInfo: 获取节点的信息,包括客户端版本、网络ID等。
admin.peers: 列出当前节点的对等节点(peers)信息,包括节点ID、网络地址等。
admin.addPeer(enode): 手动添加一个对等节点到节点的peer列表中。
admin.removePeer(enode): 从节点的peer列表中移除指定的对等节点。
admin.startRPC(host, port, cors, apis): 启动节点的RPC服务器,可以指定主机、端口、跨域资源共享规则和可用API列表。
admin.stopRPC(): 停止节点的RPC服务器。
admin.startWS(host, port, cors, apis): 启动节点的WebSocket服务器,可以指定主机、端口、跨域资源共享规则和可用API列表。
admin.stopWS(): 停止节点的WebSocket服务器。
admin.setSolc(path): 设置Solidity编译器的路径。
admin.datadir: 获取节点数据目录的路径。
注意:enode形式"enode://56ba1994b10f13e4120c6c5071xxxxx344215446ff078a839dc95fd24@127.0.0.1:30304?discport=0"
参考资料
1.Geth的安装并简单使用篇
2.linux下编译geth源码
3.如何在私有链上编写、部署与以太坊进行交互的智能合约
4.如何在10分钟内搭建一个以太坊私有链?
5.搭建以太坊私有链
6.以太坊创世区块
7.以太坊客户端Geth命令用法-参数详解
8.Go Ethereum