go-ethereum 私有链搭建指南

以太坊

Ethereum工具说明

  1. 1、以太坊客户端

    以太坊客户端用于接入以太坊网络,进行账户管理、交易、挖矿、智能合约相关的操作。目前有多种语言实现的客户端,常用的有 Go 语言实现的 go-ethereum 客户端 Geth,支持接入以太坊网络并成为一个完整节点,也可作为一个 HTTP-RPC 服务器对外提供 JSON-RPC 接口。

    其他的客户端有:

    • Parity:Rust 语言实现;

    • cpp-ethereum:C++ 语言实现;

    • ethereumjs-lib:JavaScript 语言实现;

    • Ethereum(J):Java 语言实现;

    • ethereumH:Haskell 语言实现;

    • pyethapp: Python 语言实现;

    • ruby-ethereum:Ruby 语言实现;

  2. 2、智能合约编译器 
    以太坊支持两种智能合约的编程语言:Solidity 和 Serpent。Serpent 语言面临一些安全问题,现在已经不推荐使用了。Solidity 语法类似 JavaScript,它编译器 solc 可以把智能合约源码编译成以太坊虚拟机 EVM 可以执行的二进制码。 
    现在以太坊提供更方便的在线 IDE —— Remix https://remix.ethereum.org 使用 Remix,免去了安装 solc 和编译过程,它可以直接提供部署合约所需的二进制码和 ABI。

  3. 3、以太坊钱包 
    以太坊提供了图形界面的钱包 Ethereum Wallet 和 Mist Dapp 浏览器。钱包的功能是 Mist 的一个子集,可用于管理账户和交易;Mist 在钱包基础上,还能操作智能合约。为了演示合约部署过程,本文使用了 Geth console 操作,没有用到 Mist,当然,使用 Mist 会更简单。

Ethereum搭建篇

1、centos7服务器并下载git、wget、vim、gcc-c++、ntp组件、nodejs以及添加epel第三方安装源

yum update -y && yum install git wget bzip2 vim gcc-c++ ntp epel-release nodejs cmake -y

2、下载最新golang并安装

wget https://storage.googleapis.com/golang/go1.9.4.linux-amd64.tar.gz  
tar zxvf go1.9.linux-amd64.tar.gz  
mv go /usr/local/  
--配置环境变量
echo "export GOROOT=/usr/local/go" >> /etc/profile  
echo "export PATH=$PATH:/usr/local/go/bin" >> /etc/profile  
source /etc/profile

3、获取go-ethereum源码并编译

git clone https://github.com/ethereum/go-ethereum.git  
cd go-ethereum  
make all  
--配置环境变量
echo "export PATH=$PATH:/app/go-ethereum/build/bin" >> /etc/profile  
source /etc/profile

4、安装cmake:智能合约编译solc需cmake编译

wget https://cmake.org/files/v3.9/cmake-3.9.2.tar.gz 
tar -xzvf cmake-3.9.2.tar.gz  
cd cmake-3.9.2  
./bootstrap && make && makeinstal

5、启动网络时间同步

systemctl enable ntpd  
systemctl start ntpd

6、开启防火墙并开放端口

systemctl start firewalld
--geth会用到8078和30303端口
firewall-cmd --zone=public --add-port=8087/tcp --permanent  
firewall-cmd --zone=public --add-port=30303/tcp --permanent

7、geth私有的创世纪的配置文件:genesis.json,该文件描述了如何初始化一个私有的gethereum

[root@localhost chain]#vim genesis.json 

{  
  "nonce": "0x0000000000000042",  
  "timestamp": "0x00",  
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",  
  "extraData": "0x00",  
  "gasLimit": "0x80000000",  
  "difficulty": "0x400",  
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",  
  "coinbase": "0x2D356ee3F5b8718d8690AFCD31Fe2CB5E602677e",  
  "alloc": {},  
  "config": {  
    "chainId": 15,  
    "homesteadBlock": 0,  
    "eip155Block": 0,  
    "eip158Block": 0  
  }  
}

各个参数的含义如下:

  • chainId :指定了独立的区块链网络 ID。网络 ID 在连接到其他节点的时候会用到,以太坊公网的网络 ID 是 1,为了不与公有链网络冲突,运行私有链节点的时候要指定自己的网络 ID。不同 ID 网络的节点无法相互连接。

  • mixhash:与nonce配合用于挖矿,由上一个区块的一部分生成的hash。注意他和nonce的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。.

  • nonce: nonce就是一个64位随机数,用于挖矿,注意他和mixhash的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。

  • difficulty: 设置当前区块的难度,如果难度过大,cpu挖矿就很难,这里设置较小难度

  • alloc: 用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以我们不需要预置有币的账号,需要的时候自己创建即可以。默认为空即可

  • coinbase: 矿工的账号,随便填

  • timestamp: 设置创世块的时间戳

  • parentHash: 上一个区块的hash值,因为是创世块,所以这个值是0

  • extraData: 附加信息。【注意】新版本该值需要为16进制数据,以0x 开头

  • gasLimit: 该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大。

8、创建私有网络的gethereum

[root@localhost chain]# geth --datadir "/app/ethbase/chain" init genesis.json  
INFO [04-16|00:31:17] Maximum peer count                       ETH=25 LES=0 total=25
INFO [04-16|00:31:17] Allocated cache and file handles         database=/app/ethbase/chain/geth/chaindata cache=16 handles=16
INFO [04-16|00:31:17] Writing custom genesis block 
INFO [04-16|00:31:17] Persisted trie from memory database      nodes=0 size=0.00B time=7.338µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [04-16|00:31:17] Successfully wrote genesis state         database=chaindata                         hash=fd4230…1c2289
INFO [04-16|00:31:17] Allocated cache and file handles         database=/app/ethbase/chain/geth/lightchaindata cache=16 handles=16
INFO [04-16|00:31:17] Writing custom genesis block 
INFO [04-16|00:31:17] Persisted trie from memory database      nodes=0 size=0.00B time=1.658µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [04-16|00:31:17] Successfully wrote genesis state         database=lightchaindata                         hash=fd4230…1c2289

初始化成功后,会在数据目录{dataDir} 中生成 geth  keystore (存储加密后的账户信息)两个文件夹,目录结构如下:

.(root)
├── chain
│   ├── geth
│   │   ├── chaindata
│   │   │   ├── 000001.log
│   │   │   ├── CURRENT
│   │   │   ├── LOCK
│   │   │   ├── LOG
│   │   │   └── MANIFEST-000000
│   │   └── lightchaindata
│   │       ├── 000001.log
│   │       ├── CURRENT
│   │       ├── LOCK
│   │       ├── LOG
│   │       └── MANIFEST-000000
│   └── keystore
└── genesis.json

9、启动默认的geth开发环境并验证

[root@localhost chain]# geth --dev console 2>> geth_dev_log  
Welcome to the Geth JavaScript console!

instance: Geth/v1.8.4-unstable-60516c83/linux-amd64/go1.9.4
coinbase: 0x028ea13948b027918a2dbb2f03f280058873b71b
at block: 0 (Thu, 01 Jan 1970 08:00:00 CST)
 datadir: 
 modules: admin:1.0 clique:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 shh:1.0 txpool:1.0 web3:1.0

>

验证成功日志
[root@localhost chain]# tail -f geth_dev_log  -n 300
INFO [04-16|00:34:43] Maximum peer count                       ETH=25 LES=0 total=25
INFO [04-16|00:34:45] Using developer account                  address=0x028EA13948B027918a2DBb2f03f280058873B71B
INFO [04-16|00:34:45] Starting peer-to-peer node               instance=Geth/v1.8.4-unstable-60516c83/linux-amd64/go1.9.4
INFO [04-16|00:34:45] Writing custom genesis block 
INFO [04-16|00:34:45] Persisted trie from memory database      nodes=12 size=2.25kB time=22.25µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [04-16|00:34:45] Initialised chain configuration          config="{ChainID: 1337 Homestead: 0 DAO: <nil> DAOSupport: false EIP150: 0 EIP155: 0 EIP158: 0 Byzantium: 0 Constantinople: <nil> Engine: clique}"
INFO [04-16|00:34:45] Initialising Ethereum protocol           versions="[63 62]" network=1
INFO [04-16|00:34:45] Loaded most recent local header          number=0 hash=3f4d84…d3eb3b td=1
INFO [04-16|00:34:45] Loaded most recent local full block      number=0 hash=3f4d84…d3eb3b td=1
INFO [04-16|00:34:45] Loaded most recent local fast block      number=0 hash=3f4d84…d3eb3b td=1
INFO [04-16|00:34:45] Starting P2P networking 
INFO [04-16|00:34:45] started whisper v.6.0 
INFO [04-16|00:34:45] RLPx listener up                         self="enode://67736492edb441ec9cb7159644348dd696e949725f3b87e5d5cb6f8270fbded53be619a4f57a831babb61908e48d493f61a1c9baaf2de2753babe6eac57abd5e@[::]:34732?discport=0"
INFO [04-16|00:34:45] IPC endpoint opened                      url=/tmp/geth.ipc
INFO [04-16|00:34:45] Transaction pool price threshold updated price=18000000000
INFO [04-16|00:34:45] Etherbase automatically configured       address=0x028EA13948B027918a2DBb2f03f280058873B71B
INFO [04-16|00:34:45] Starting mining operation 
INFO [04-16|00:34:45] Commit new mining work                   number=1 txs=0 uncles=0 elapsed=68.3µs
WARN [04-16|00:34:45] Block sealing failed                     err="waiting for transactions"
INFO [04-16|00:40:36] IPC endpoint closed                      endpoint=/tmp/geth.ipc
INFO [04-16|00:40:36] whisper stopped 
INFO [04-16|00:40:36] Blockchain manager stopped 
INFO [04-16|00:40:36] Stopping Ethereum protocol 
INFO [04-16|00:40:36] Ethereum protocol stopped 
INFO [04-16|00:40:36] Transaction pool stopped

启动私有链节点

1、初始化完成后,就有了一条自己的私有链,之后就可以启动自己的私有链节点并做一些操作,在终端中输入以下命令即可启动节点:

geth --identity "k13chain"  --rpc  --rpccorsdomain "*" --datadir "/app/ethbase/chain" --port "30303"  --rpcapi "db,eth,net,web3" --networkid 89898 console

参数说明如下:

  • identity :指定节点 用于标示目前网络的名字;

  • rpc :表示开启 HTTP-RPC 服务;

  • init :指定创世块文件的位置,并创建初始块

  • rpcport :指定 HTTP-RPC 服务监听端口号(默认为 8545);

  • rpcapi: 设置允许连接的rpc的客户端,一般为db,eth,net,web3

  • datadir :指定区块链数据的存储位置;

  • port :指定和其他节点连接所用的端口号(默认为 30303);

  • networkid: 设置当前区块链的网络ID,用于区分不同的网络,是一个数字

  • nodiscover :关闭节点发现机制,防止加入有同样初始配置的陌生节点。

  • maxpeers : 如果你不希望其他人连接到你的测试链,可以使用maxpeers 0。反之,如果你确切知道希望多少人连接到你的节点,你也可以通过调整数字来实现。

  • rpccorsdomain : 这个可以指示什么URL能连接到你的节点来执行RPC定制端任务。务必谨慎,输入一个特定的URL而不是wildcard ( * ),后者会使所有的URL都能连接到你的RPC实例。

  • console:启动命令行模式,可以在Geth中执行命令

注意:如果想将Ubuntu作为永久区块链节点使用,当使用nohup命令时,Geth启动参数console必须去掉,否则Geth会自动停止。

2、启动完成之后进入控制台,这是一个交互式的 JavaScript 执行环境,在这里面可以执行 JavaScript 代码,其中 > 是命令提示符。在这个环境里也内置了一些用来操作以太坊的 JavaScript 对象,可以直接使用这些对象。这些对象主要包括:

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

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

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

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

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

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

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


发表评论