网络知识 娱乐 区块链ETH--Geth与私链搭建

区块链ETH--Geth与私链搭建

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
  • 有一个类似配置文件的初始创世区块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"
}

在这里插入图片描述

交易成功!