如何搭建并运行以太坊(Ethereum)私有链

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zg_hover/article/details/82080958

概述

本文讲述了如何通过以太坊源码搭建一个以太坊私链,并通过控制台来操作该私有链。

搭建以太坊私有链

注意:搭建私有链关键是编写创世块的配置文件,在创始块的配置文件中定义了区块链中第一个区块的内容,完成创始块的配置文件后,需要执行初始化操作,初始化操作会把创始块的信息写入到区块链中,初始化完成后即可启动自己的私有链。

下载并编译以太坊客户端geth

  1. 下载源码
    通过以下命令下载并编译go-ethereum源码
cd $GOPATH/src/github.com/
git clone https://github.com/ethereum/go-ethereum.git
cd go-ethereum
make

编译完成后会看到一个geth命令,该命令就是以太坊的客户端命令。可以通过该命令来加入以太坊公链。

编辑创始块的配置文件

  • 创建工作目录
# 创建一个工作目录
mkdir geth
cd geth
touch gensis.json
  • 编辑创始块配置文件的内容:
{
    "config": {
        "chainId": 20,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
    "alloc": {
        "0xeb680f30715f347d4eb5cd03ac5eced297ac5046": {
            "balance": "100000000000000000000000000000000"
        }
    },
    "coinbase": "0x0000000000000000000000000000000000000000",
    "difficulty": "0x01",
    "extraData": "0x777573686f756865",
    "gasLimit": "0xffffffff",
    "nonce": "0x0000000000000001",
    "mixhase": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "timestamp": "0x00"
}
  • 配置文件的参数说明
参数 参数说明
chainId 指定独立的区块链网络id
homesteadBlock 若该值设置为0,标识使用的第2个版本
eip155Block eip是ethereum improvement proposal的缩写,你的链不会因为这些提议分叉,所以设置为0即可。
eip158Block 同上
mixhash 与nonce配合用于挖矿,有上一个区块链的一部分生成的哈希值。注意它和nonce必须要满足区块链黄皮书中说的条件。
nonce 一个用于挖矿的64位随机数
difficulty 设置当前区块链的难度
alloc 给某个账户预分配以太坊币
coinbase 旷工的账号
timestamp 创世块的时间戳
parentHash 上一个区块的hash值。创世块的为0
extraData 32bytes大小的任意数据,每个区块都有,由miner来决定是否要在里面填什么。
gasLimit 设置消耗gas的总量限制。用来限制包括区块和的交易信息的总和。私有链可以填最大。

初始化

  • 创建一个目录:
cd geth
mkdir db
  • 执行初始化命令:
geth --datadir "./db" init gensis.json

执行初始化后的目录结构如下:

geth/
├── db
│   ├── geth
│   │   ├── chaindata
│   │   │   ├── 000001.log
│   │   │   ├── CURRENT
│   │   │   ├── LOCK
│   │   │   ├── LOG
│   │   │   └── MANIFEST-000000
│   │   └── lightchaindata
│   │       ├── 000001.log
│   │       ├── CURRENT
│   │       ├── LOCK
│   │       ├── LOG
│   │       └── MANIFEST-000000
│   └── keystore [error opening dir]
└── gensis.json

启动节点并开始挖矿

./bin/geth --datadir "./db" --rpc --rpcaddr=0.0.0.0 --rpcport 8545 --rpccorsdomain "*" --rpcapi "eth,net,web3,personal,admin,shh,txpool,debug,miner" --nodiscover --maxpeers 30 --networkid 1981 --port 30303 --mine --minerthreads 1 --etherbase "0xeb680f30715f347d4eb5cd03ac5eced297ac5046" console

通过以上参数,节点启动后,就开始挖矿了,若看到一个锤子一样的图标,就表示挖矿成功了。

...
> INFO [08-26|14:49:18.407] Successfully sealed new block            number=23 hash=e4c0e2…34dfd6 elapsed=6.649s
INFO [08-26|14:49:18.407] ? block reached canonical chain          number=18 hash=eeda03…d7d0a5
INFO [08-26|14:49:18.407] ? mined potential block                  number=23 hash=e4c0e2…34dfd6
INFO [08-26|14:49:18.407] Commit new mining work                   number=24 uncles=0 txs=0 gas=0 fees=0 elapsed=113.932µs
> miner.stopINFO [08-26|14:49:21.381] Successfully sealed new block            number=24 hash=905523216891 elapsed=2.973s
INFO [08-26|14:49:21.384] ? block reached canonical chain          number=19 hash=347b2e…3e0b67
INFO [08-26|14:49:21.384] ? mined potential block                  number=24 hash=905523216891
INFO [08-26|14:49:21.384] Commit new mining work        
...

通过命令stop来停止挖矿:

miner.stop()
  • 命令行参数说明:
参数名 参数说明
identity 区块链的标识,随便填写,用于标识目前网络的名字
datadir 指明当前区块链私钥和网络数存放的位置
port 指定以太坊网络监听的端口,默认为:30303
rpc 开启http-rpc服务,可以进行智能合约的部署和调试
rpcaddr 指定http-rpc服务监听的地址,默认为loclhost
rpcapi 设置允许连接的rpc客户端,一般为:db,eth,net,web3
rpcport 指定http-rpc服务监听端口,默认为8545
networkid 指定以太坊网络id,其实就是区块链网络的身份标识,公有链为1,测试链为3,默认启动为1
etherbase 指定矿工的账号
mine 开启挖矿,默认为CPU挖矿
minerthreads 指定挖矿的线程数
nodicover 关闭自动连接节点,但可手动添加节点。在搭建私有链时,为避免其他节点接入,可用该命令。
maxpeers 设置允许最大连接节点数,默认为25
console 启动命令行模式,可以在geth中执行命令

通过attach命令连接到已经启动的节点中,并进入javascript控制台,命令如下:

geth --datadir "./db" attach ipc:./db/geth.ipc

直接启动节点和控制台

  • 启动控制台
    通过以下命令来启动一个节点和控制台
geth --datadir "./db" --networkid 1980 console

这样就启动了一个javascript控制台,通过该控制台,我们可以输入命令。
在该控制台内置了一些对象,通过这些对象我们可以很方便的与以太坊进行交互,这些内置对象包括:

  • eth: 提供了操作区块先关的方法
  • net:提供查看p2p网络状态的方法
  • admin:提供了管理节点相关的方法
  • miner:提供启动和停止挖矿的方法
  • personal:提供管理账户的方法
  • txpool:提供查看交易内存池的方法
  • web3:包含一些单位换算的方法

总结

本文描述了如何通过go-ethereum来搭建一个以太坊私有链。有利私有链,我们就可以模拟转账,或进行智能合约的编写和调试了。

猜你喜欢

转载自blog.csdn.net/zg_hover/article/details/82080958