一、安装geth客户端

geth是以太坊的官方客户端,它是一个命令行工具,提供很多命令和选项,可以运行以太坊节点、创建和管理账户、发送交易、挖矿、部署智能合约等。
geth客户端可使用三种方法进行安装:

  • 源码编译安装
  • 直接下载可执行文件

一、源码编译安装

在前面Go语言学习笔记章节中详细介绍了Go语言开发环境的搭建,搭建好Go语言开发环境之后,我使用的是ubuntu系统搭建,通过

git clone https://github.com/ethereum/go-ethereum.git

没有安装git的需要先安装git,Ubuntu下使用sudo apt-get install git安装。

下载以太坊源码,源代码需要放在之前Go语言开发环境设置的$GOPATH/src目录下。

cd go-ethereum
make geth

make会执行build目录下的编译脚本,会在** go-ethereum/build/bin**目录下编译生成geth程序。

二、直接下载可执行文件

直接只用命令:

sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum

或者去官网国内镜像下载适合你系统版本的压缩包,解压缩后直接运行就可以。

二、搭建私有链

一、私有网络初始化启动

如果不加任何参数直接运行 geth ,会自动连接到以太坊公网,此时会开始同步区块,在Linux系统中,区块数据默认存储在~/.ethereum中。

在以太坊的共有链上部署智能合约、发起交易需要花费以太币。而通过修改配置,可以在本机搭建一套以太坊私有链,因为与公有链没关系,既不用同步公有链庞大的数据,也不用花钱购买以太币,很好地满足了智能合约开发和测试的要求,开发好的智能合约也可以很容易地切换接口部署到以太坊公有链上。

下面开始建立私有以太坊网络:

mkdir private-geth
cd private-geth

建立创世纪区块文件,是一个json格式的文件:
在创世纪区块的json文件中填入以下内容, 并保存:

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

初始化创世纪节点,并设置data目录:

geth --datadir ./data init genesis.json
以太坊私有网络集群搭建

创世纪节点文件参数说明:

alloc:用来预设置账号以及账号的 ether 数量。因为私有链挖矿比较容易,所以我们不需要预设置账号。比如,{“0x880004bb64282fb01a3a2500ddf1f4bb5ad4b64a”:{“balance”:“100000000000000000000000000000”}}
nonce:一个64位随机数,用于挖矿。
mixhash:和 nonce 配合用于挖矿,由上一个区块的一部分生成的 hash。
difficulty:设置当前区块的难度,如果难度过大,cpu挖矿就很难,所以这边设置的很小,不要跟自己过不去嘛。
coinbase:默认挖矿的矿工账号。
timestamp:设置创世块的时间戳。
parentHash:上一个区块的hash值,因为是创世块,所以值是0。
extraData:附加信息,随便填。
gasLimit:设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和。因为我们是私有链,所以可以写的大一些,方便开发测试。

初始化后目录结构为:
以太坊私有网络集群搭建
其中keystore目录用来保存账户信息,geth目录用来保存区块信息。

启动节点, 加上console 表示启动后,启用命令行:

geth --datadir ./data/00 --networkid 15 console
networkid表示网络id,主网络为1
以太坊私有网络集群搭建

现在私有网络就搭建成功,下面就可以在这个刚刚搭建出来的私有以太坊网络中执行挖矿操作了。

二、挖矿

挖矿首先必须有一个账户,输入下面的命令,查看当前node中的所有账户:

# 查看一下系统有的用户
> eth.accounts
[]

# 查看详细的用户信息
> personal

# 创建两个账号用于转账,或者使用 personal.newAccount() 也会提示输入密码
> personal.newAccount('123456')
> personal.newAccount('123456')

> eth.accounts
["0x18a6581a285f40ac3faaa646e13d7c6dd87276f4", "0x2455572ef500cf8634a4090d6d6096c588013e2a"]
# 此时可以看下 keystore 目录,多出了两个文件,也就是我们刚才创建的两个账户**(丢了它,你就等于丢了币)

账号创建好了,但是一开始账号都没有 ether,这时就需要挖矿获取币了。
使用miner.start()命令开启挖矿,默认挖出的 ether 是存到 eth.coinbase 账户中的,也就是第一个账户。

# 查看账号1下的余额
> eth.getBalance(eth.accounts[0])

# 查看coinbase账号
> eth.coinbase
0x18a6581a285f40ac3faaa646e13d7c6dd87276f4

# 如果想要把挖到的矿存入其他账户,可以使用
> miner.setEtherbase(eth.accounts[1])
true

开始挖矿,我们先把coinbase改成账号1
> miner.setEtherbase(eth.accounts[0])
true

# 如果出现 miner.start() 直接返回 null 的情况,请先查看是否还未创建过账户。
> miner.start(1)
INFO [05-31|19:57:17] Updated mining threads                   threads=0
INFO [05-31|19:57:17] Transaction pool price threshold updated price=18000000000
INFO [05-31|19:57:17] Starting mining operation
INFO [05-31|19:57:17] Commit new mining work                   number=12 txs=0 uncles=0 elapsed=194.667µs
INFO [05-31|19:57:19] Successfully sealed new block            number=12 hash=82d29d…65290c
INFO [05-31|19:57:19]  mined potential block                  number=12 hash=82d29d…65290c
INFO [05-31|19:57:19] Commit new mining work                   number=13 txs=0 uncles=0 elapsed=159.066µs
INFO [05-31|19:57:19] Successfully sealed new block            number=13 hash=e91844…e962a6
INFO [05-31|19:57:19]  mined potential block                  number=13 hash=e91844…e962a6
等到 percentage 达到100就能挖出来了,请耐心等待~,出现小锤头的时候意味着你挖到了!

# 已经挖到了,我们先暂停挖矿,注意:输入的字符会被挖矿刷屏信息冲掉,没有关系,只要输入完整的miner.stop()之后回车,即可停止挖矿。正在执行的挖矿进程不会立即暂停,仍然会等到当前完整快写完后才会暂停
> miner.stop()
true

然后查看账户余额
> eth.getBalance(eth.accounts[0])
112000000000000000000
# 不要被这个零的个数吓到,这里默认显示的以 wei 为单位的,而 1 ether = 10^18 wei,所以我们转换一下单位立马就清晰了,

> web3.fromWei(eth.getBalance(eth.accounts[0]), 'ether')
112
# 嗯,其实我们目前就挖了112个ether

三、转账

在转账前,我们需要先解锁账号

> personal.unlockAccount(eth.accounts[0])

# 我们先转8个ether给账号2
> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(8,'ether')})

INFO [03-12|20:24:15] Submitted transaction      fullhash=0x996a3037b75585415ece5b1dc28181833691760176b3f24066c93e7093a967e5 recipient=0x29a079BdbC6D4d122178FBe01558E5DF2D008523

我们可以看到目前只是向区块链提交了这笔转账交易,谁来执行这笔交易呢?矿工。我们还是得开启挖矿模式,把这笔转账交易执行掉。然后我们再来看看好朋友的账户里面有多少 ether 了,

> miner.start(1)
# 持续几秒
> miner.stop()

# 然后查看账号2的余额,已经有余额
> eth.getBalance(eth.accounts[1])
8000000000000000000

四、连接到其他节点

以太坊节点之间能够互相链接需要满足两个条件:

  • (1)相同的协议版本;
  • (2)相同的networkid,所以搭建私有网络最方便的方法就是通过geth命令中的–networkid选项,设置一个与主网不同的networkid(主网的networkid为1),这也是官方推荐的方法。

为了在本地网络运行多个以太坊节点的实例,必须确保一下几点:

  1. 每个实例都有独立的数据目录(–datadir)
  2. 每个实例运行都有独立的端口.(eth和rpc两者都是)(–port 和 --rpcprot)
  3. 在集群的情况下, 实例之间都必须要知道彼此.
  4. 唯一的ipc通信端点,或者禁用ipc.

节点之间相互连接有三种办法:

  • 使用admin.addPeer添加;
  • 通过bootnodes选项;
  • 通过static-nodes.json文件添加。

一、通过admin.addPeer添加

首先在节点一上查看enode信息:

admin.nodeInfo
enode: “enode://5b3b7c5d65a4cf3e65875b15cd14a1abdc30f94931e67e68bf606941cc1630624[email protected][::]:61910”,

然后在节点二上执行admin.addPeer添加节点一:

admine.addPeer(“enode://5b3b7c5d65a4cf3e65875b15cd14a1abdc30f94931e67e68bf606941cc1630624[email protected][::]:61910”)
true

返回true就说明执行成功,我们可以通过admin.peers查看新增的节点信息,同步操作是异步的,可能不能立马看到节点一的信息。
以太坊私有网络集群搭建

连接成功后,两个节点都可以通过admine.peers查看到对方的节点信息,节点二就会开始同步节点一的区块,同步完成后,任意一个节点开始挖矿,另一个节点会自动同步区块,向任意一个节点发送交易,另一个节点也会收到该笔交易。

二、通过bootnodes 添加

启动节点的时候指定–bootnodes选项连接到其他节点。
可以先启动一个节点,通过admin.nodeInfo查看 enode信息,其他节点启动的时候添加配置 --bootnodes “enode://5b3b7c5d65a4cf3e65875b15cd14a1abdc30f94931e67e68bf606941cc1630624[email protected][::]:61910” 可以都和这个节点形成连接,从而相互之间相互连接。
如节点一启动:

geth --datadir ./data/01 --networkid 15 --ipcdisable --port 61910 --rpcport 8200 --bootnodes “enode://5b3b7c5d65a4cf3e65875b15cd14a1abdc30f94931e67e68bf606941cc1630624[email protected][::]:61910” console

三、通过static-nodes.json文件

节点data的所在路径(刚才启动时–datadir路径),默认:

Mac: ~/Library/Ethereum
Linux: ~/.ethereum
Windows: %APPDATA%\Ethereum

在此目录下创建名为:static-nodes.json的文件。
文件内容及格式如下:

[
"enode://91922b12115c067005c574844c6bbdb114eb262f90b6355cec89e13b483c3e466[email protected]120.27.164.92:13333"
"enode://6427b7e7446bb05f22fe7ce9ea175ec05858953d75a5a6e4f99a6aec0779a8bd6[email protected]121.201.14.181:30303",
"enode://91922b12115c067005c574844c6bbdb114eb262f90b6355cec89e13b483c3e466[email protected]120.27.164.92:13333",
"enode://3dde41a994b3b99f938f75ddf6d48318c78ddd869c70b48d00b922190bb434fc5[email protected]207.226.141.212:30303",
"enode://7ab8fa90b204f2146c00939b8474549c544caa3598a0894fa639a5cdbd992cbc6[email protected]121.201.24.236:30303",
"enode://db81152a8296089b04a21ad9bf347df3ff0450ffc8215d9f50c400ccf8d189631[email protected]139.198.1.244:30303",
"enode://68dd1360f0a4ac362b41124692e31652ffe26f6f06a284ca11f3b514b3968594a[email protected]113.106.85.172:30303",
"enode://58f6b6908286cefe43c166cfc4fed033c750caa1bc3f6e1e1e1507752c0b91248[email protected]45.113.71.186:30303",
"enode://87190a01c02cafb97e7f49672b4c3be2937cf79c3969e0b8e7b35cac28cebfbda[email protected]119.29.207.90:30303",
"enode://d1fdd05a62fd9544eeb455e4f4d4bd8bb574138d82d8f909f3041d0792e3401f8[email protected]120.26.129.121:30303",
"enode://a1e9cf99eca94590ae776c8dd5c6c043a8c1f0375e9e391c9fb55133385bf453a[email protected]182.254.209.254:30303",
"enode://562796b19d43d79dfb6160abd2d7bb78a2f2efd9501a0a767c00677e0fb3a4407[email protected]121.40.199.54:30303",
"enode://fa2c17dcc83a6e2825668210abf7480452de4b13d8bdea8f301c3b603701918bc[email protected]120.26.124.58:30303",
"enode://0b331b27e2976d797aed1d1464ac483a7f262860334cb5737a01a0188da08d792[email protected]47.89.49.61:30303",
"enode://fd2a5d30e4f3917ee640876cc57d72a8bf5ecf049e9106c95e60cf306dd7a5dd6[email protected]121.201.29.82:30303",
"enode://0d1b9eed7afe2d5878d5d8a4c2066b600a3bcac2e5730586421af224e93a58cd0[email protected]209.9.106.245:30303"
]

static-nodes.json的文件中的节点将组网形成集群。

以太坊客户端默认启动连接的节点数位11-13个,如果觉得不够,可以使用在启动时增加启动参数 –maxpeers 100命令,让连接启动节点数增加到100上限,当然,也会大量消耗你的硬盘和CPU。

相关文章: