深入学习以太坊(以太坊客户端/搭建私链)

区块链

1. 以太坊客户端

  1. 定义:以太坊客户端是一个软件应用程序,它实现以太坊规范并通过p2p网络与其他以太坊客户端进行通信。
  2. 以太坊客户端规范由“黄皮书”规范定义。基于此规范的以太网客户端可以彼此交互。
  3. 多种客户端:

2. 基于以太坊规范的网络

  1. 存在各种基于以太坊规范的网络,这些网络基本符合以太坊“黄皮书”中定义的形式规范,但它们之间可能相互也可能不相互操作。
  2. 基于以太坊的网络:以太坊,以太坊经典,Ella,Expanse,Ubiq,Musicoin等

3. 以太坊全节点

  1. 全节点是整个主链的一个副本,存储并维护链上的所有数据,并随时验证新区块的合法性。
  2. 区块链的健康和扩展弹性,取决于具有许多独立操作和地理上分散的全节点。每个全节点都可以帮助其他新节点获取区块数据,并提供所有交易和合约的独立验证。
  3. 运行全节点耗费巨大的成本,包括硬件资源和带宽。
  4. 以太坊开发不需要在实时网络(主网)上运行的全节点。我们可以使用测试网络的节点来代替,也可以用本地私链,或者使用服务商提供的基于云的以太坊客户端;

4. 远程客户端和轻节点

  1. 远程客户端不存储区块链的本地副本或验证块和交易。这些可短短一般只提供钱包的功能,可以创建和广播交易。远程客户端可用于连接到现有网络,MetaMask就是一个这样的客户端。
  2. 轻节点不保存链上的区块历史数据,只保存区块链当前的状态。轻节点可以对块和交易进行验证。

5. go-ethereum安装(linux)

Geth是由以太坊基金会使用Go语言实现的

仓库地址:https://github.com/ethereum/go-ethereum

#注:需提前配置好go环境,版本要求>=1.7
git clone https://github.com/ethereum/go-ethereum.git

cd go-ethereum
make geth

geth --datadir ./data  #启动,指定数据路径

vim /etc/profile
#将geth的build/bin目录绝对路径添加到/etc/profile
source /etc/profile
#让配置生效

编译好后,如下图所示

截屏2022-02-13 下午8.31.15

在bin目录下为编译好后的工具截屏2022-02-13 下午8.32.16

6. 启动节点同步

geth --datadir . --syncmode fast
#不加的话,默认(不指明syncmode)全节点(full)同步,此命令使用fast,这种模式下,只会下载每个区块头和区块体,但不会执行验证所有的交易,直到所有区块同步完毕再去获取一个系统的状态。
geth --syncmode light
#只会去同步所有区块头,不去同步区块体、状态数据,仅在需要相应区块和状态数据时从网络上获取

7. 搭建以太坊私链

  1. 创建创世区块以及区块链的配置文件需要通过JSON文件进行创建,我们将其命名为genesis.json
    {
      "config":{
        "chainId": 15
      },
      "nonce": "0x000000000000002a",
      "difficulty": "0x020000",
      "gasLimit": "0x2fefd8",
      "alloc":{
            "0x6621622E9Cb64bC3015E069743b45c4749AbfECd": { 
            "balance": "1606938044258990275541962092341162602522202993782792835301376"
        }
      }
    }
    

    chainId设置链Id,注意区别已存在的主网,测试网等网络Id

    alloc 代表初始资产配置,在该区块链产生时,就预先赋予这些账户一定数额的WEI(不是ETH)

    nonce 预定一个随机数,这是一个与PoW 机制有关的值

    difficulty 定义了每次挖矿时,最终确定nonce 的难度

    gasLimit 规定该区块链中,gas 的上限

  2. 创建以配置文件作为创始块的区块链geth --datadir ./data init genesis.json
  3. 启动geth --datadir ./data --networkid 15启动界面展示截屏2022-02-13 下午9.59.07运行geth --datadir ./data --networkid 15 console进行交互

8. 控制台常用命令

eth包含一些跟操作区块链相关的方法;

net包含一些查看p2p网络状态的方法;

admin包含一些与管理节点相关的方法;

miner包含启动&停止挖矿的一些方法;

personal主要包含一些管理账户的方法;

txpool包含一些查看交易内存池的方法;

web3包含了以上对象,还包含一些单位换算的方法

personal.newAccount():创建账户;
personal.unlockAccount():解锁账户;
eth.accounts:枚举系统中的账户;
eth.getBalance():查看账户余额,返回值的单位是 Wei(Wei 是以太坊中最小货币面额单位,类似比特币中的聪,1 ether = 10^18 Wei);
eth.blockNumber:列出区块总数;
eth.sendTransaction({from:...,to:...,value:10000}): 发送交易;
eth.getTransaction():获取交易;
eth.getBlock():获取区块;
miner.start():开始挖矿;
miner.stop():停止挖矿;
web3.fromWei():Wei 换算成以太币;
web3.toWei():以太币换算成 Wei;
txpool.status:交易池中的状态;
admin.addPeer():连接到其他节点;

 

运行geth --datadir ./data --networkid 15 --http console使MetaMask本地可访问

Leave a Reply

Your email address will not be published.