ETH客户端Geth(Go-Ethereum)
- 软件应用程序,实现以太坊规范并通过p2p网络与其他以太坊客户端进行通讯,如果不同的以太坊客户端符合参考规范和标准化通信协议,则可以进行相互的操作
- 以太坊是一个开源项目,由黄皮书正式规范定义,出来各种以太坊改进提案之外,此正式规范还定义了以太坊客户端的标准行为
- 因为以太坊有明确的正式规范,以太坊客户端有了许多独立开发的软件实现,他们之间又可以彼此交互
基于以太坊规范的网络
- 各种基于以太坊规范的网络,符合以太坊黄皮书中定义的形式规范,但他们之间可能相互也可能不相互操作
- 虽然大多数在协议级别兼容,但这些网络通常具有特殊要求,以太坊客户端软件的维护人员,需要进行微小的更改以支持每个网络的功能或属性
概念
全节点
整个主链的副本,存储并维护链上的所有数据,并随时验证新区块的合法性,可以帮助新节点获取区块数据,并提供所有交易和合约的独立验证
缺点:耗费巨大成本,第一次下载往往需要几天才能完全同步,必须及时维护、升级并保持在线状态以同步区块
开发不需要运行全节点,可以使用测试网络节点代替,本地私链,或者使用服务商基于云的以太坊客户端
下图为2018运行全节点的要求,目前要求会更高
远程客户端
metamask,不存储区块链本地副本或验证块和交易,一般只提供钱包功能,可以创建和广播交易
轻节点
保存当前状态,可以对块和交易进行验证
公共测试网络全节点
优点
- 一个testnet节点需要同步和存储更少的数据(约10GB)具体取决于不同网络
- 一个testnet节点一般可以在几个小时内完全同步
- 部署合约可以使用测试以太
- 测试网络也有公共区块链,有许多其他用户
缺点
- 测试以太没有价值,无法测试交易对手的安全性,因为没有任何利害关系
- 测试网络上的测试无法涵盖所有真实主网特征。例如,交易费用虽然是发送交易所必需的,但由于gas免费,testnet上不予考虑,不会像主网一样拥挤
本地私链
优点
- 磁盘上几乎没有数据,也不同步别的数据,是一个完全干净的环境
- 无需获取测试以太,可任意分配,随时自己挖矿
- 没有其他用户,没有任何外部干扰
缺点
- 没有其他用户意味着与公链的行为不同,交易不存在空间或交易顺序的竞争
- 没有矿工意味着挖矿更容易,因此无法测试公链上发生的某些情况
- 没有其他合约,意味着需要部署测试的所有内容,包括所有的依赖项和合约库
搭建
安装
注意环境要求Go
方法一:apt-get
Linux-ubantu
sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum
方法二:源码安装
1.克隆GitHub
git clone https://github.com/ethereum/go-ethereum.git
2.构建Geth
cd go-ethereum
make geth
可以看见编译的各个组件,直到它生成geth可执行文件:
make 运行构建脚本 --运行makefile里面的脚本文件
可能出现报错:
文件格式报错因为是dos
解决:
:set ff=unix
补充:
这里建议将geth添加至环境变量,这样下面使用就可以直接使用geth
//将go-ethereum复制到/usr/local
sudo cp -r go-ethereum /usr/local
//将 geth 添加到环境变量中 vi ~/.bashrc
export PATH="$PATH:/usr/local/go-ethereum/build/bin"
export PATH="$PATH:/usr/local/go/bin"
source ~/.bashrc
3.查看geth version 确保在真正运行之前安装正常
./build/bin/geth version
启动节点同步
geth --datadir ./data
指定同步数据存储的路径目录,data没有的话会自动创建
注意:不带参数默认启动主网,启动的是全节点(慢),从附近全节点同步数据
- starting peer-to-peer node 启动p2p节点
- 写主网初始block
- 30303监听端口号
- IPC:进程间调用-外部访问接口
启动参数
只下载区块头和区块体,但不会执行验证所有的交易,节省了许多交易验证时间
geth --datadir .--syncmode fast
还有light模式只同步最终状态,更加快速
geth --testnet --datadir .--syncmode fast
Ropsten 这个是默认的主测试网络
详解数据文件目录
data
- geth
- chaindata-区块数据(全节点该处数据会很大)
- nodekey:节点唯一编号,可用于节点发现
- nodes:节点信息存储
- triecache:变长编码前缀(一种编码方式)
- keystore-加密后的私钥
搭建私有链
新建建一个文件
mkdir ~/myETH
加入配置文件(创世区块设置)
vi ~/myETH/genesis.json
{
"config": {
"chainId": 7
},
"difficulty": "2000",
"gasLimit": "2100000",
"alloc": {}
}
- chainId:唯一链ID(主网ID为1,测试网为3,最好不要重复)
- difficulty:难度设置
- gasLimit:区块gas上限
- alloc:创世时,一开始的代币分配(非必须)
初始化
cd myETH/
geth --datadir . init genesis.json
注意:这里的路径选项要根据当前的路径位置决定
启动
geth --datadir . --networkid 7
启动成功!
命令行交互
- JavaScript控制台
- 控制台内嵌许多js对象,web3是其中js的一个较大的对象
启动链,同时启动控制台
geth --datadir . --networkid 7 console
重定向日志输出
geth --datadir . --networkid 7 console 2>output.log
动态跟踪
tail -f output.log
可以分开控制台和输出,避免输出影响命令输入
创建账户
personal.newAccount()
查询账户
eth.accounts
eth.getBalance(eth.accounts[0])
挖矿
miner.start(1)
miner.stop()
注意:开始挖矿之后要等待一定的时间之后才能够产生新的区块,要等待一下
Looking for peers是在寻找周围的peer
查看当前区块
eth.blockNumber
交易
首先创建两个账户尝试转账交易
核心命令:
eth.sendTransaction({from:eth.accounts[0], to:eth.accounts[1], value:"50000"})
以太为单位:web3.toWei(10,‘ether’)
错误:会显示账户为解锁,没有权限
personal.unlockAccount(eth.accounts[0])
//输入密码
eth.sendTransaction({from:eth.accounts[0], to:eth.accounts[1], value:"50000"})
>>显示交易哈希
eth.getBalance(eth.accounts[1])
>>仍然为0,需要挖矿确认
miner.start(1)
miner.stop()
eth.getBalance(eth.accounts[1])
>>50000,转账成功
常见错误:
原因:由于创世初始文件配置不全,修改配置即可
{
"config": {
"chainId": 7,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc" : {},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x2",
"extraData" : "",
"gasLimit" : "0xffffffff",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
交易成功!
|