这篇文章参考区块链技术指南。但原文是Happy flow。这里把我安装过程中碰到的坑也都记录下来。这里使用的是Ubuntu 14.10。这是以太坊推荐的版本。

最近在研究区块链。打算先搭建一个测试环境开始运行。这里记录整个搭建过程,供后来人参考。 整体上,分为三个步骤,安装相关软件,初始化系统,建立集群,以及最后一步,挖矿。 我们采用的是以太坊,相对其他区块链,这是一个成熟的环境。 虽然近期有硬分支的事件,对企业应用来说,功能上还算是比较完善的。

一、安装部署

1.安装 Go 环境

如果机器无法上外网,还得配置一下代理。 Centos配置代理的方式网上很多,这里不介绍。 golang最新版本是1.10.3,从golang.org下载。

  curl -O https://storage.googleapis.com/golang/go1.10.3.linux-amd64.tar.gz
  tar -C /usr/local -xzf go1.10.3.linux-amd64.tar.gz
  mkdir -p ~/go; echo "export GOPATH=$HOME/go" >> ~/.bashrc
  echo "export PATH=$PATH:$HOME/go/bin:/usr/local/go/bin" >> ~/.bashrc
  source ~/.bashrc

2.安装 ethereum

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

在执行 sudo add-apt-repository -y ppa:ethereum/ethereum的时候碰到这个问题:

  root@ubuntu-KVM:~# sudo add-apt-repository -y ppa:ethereum/ethereum
  Cannot add PPA: 'ppa:ethereum/ethereum'.
   Please check that the PPA name or format is correct.

按照Ask Ubuntu 的意见,修改为:

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

3.安装 solc 编译器


  sudo add-apt-repository ppa:ethereum/ethereum-qt
  sudo add-apt-repository ppa:ethereum/ethereum
  sudo apt-get update
  sudo apt-get install cpp-ethereum

同样的,如果碰到PPA Name错误的警示,则执行如下操作:


  sudo -E add-apt-repository ppa:ethereum/ethereum-qt
  sudo -E add-apt-repository ppa:ethereum/ethereum
  sudo apt-get update
  sudo apt-get install cpp-ethereum

这样相关软件已经安装完毕。

4. 从源码安装

下载和编译 Geth 用以下命令安装 C 的编译器。

$ apt-get install -y build-essential

下载选定的 go-ethereum 源码版本,如最新的社区版本:

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

编译安装 Geth。

$ cd go-ethereum
$ make geth

安装成功后,可用 build/bin/geth –help 查看各命令和选项。例如,用以下命令可查看 Geth 版本为 1.8.11-unstable。

[jigsaw@kube01 cocolian]$ geth version
Geth
Version: 1.8.11-unstable
Git Commit: e8ea5aa0d59a722df616bc8c8cffacadd23c082d
Architecture: amd64
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.10.2
Operating System: linux
GOPATH=/home/jigsaw/go
GOROOT=/usr/local/go

说明安装完成

二、搭建私链

1.启动geth服务


  geth --datadir "/root/chain" console

其中 datadir用于指定数据目录。这个目录不能够预先创建,否则命令会失败。 执行结果如下:

Image of Start Geth

2.创建账号

执行之后,进入geth的交互模式。 接着建立一个账号,然后退出。 这个账号用于执行创世操作。 然后exit退出

> personal.newAccount("密码");
 "0xea5c99831c2e4a0e094facdbac1befcf6c92e543"
> exit

3.创建创世区块

编译创建创世区块所需要的脚本, 注意alloc下的key需要和上述的账号保持一致。

  {
  "alloc": {
      "0xea5c99831c2e4a0e094facdbac1befcf6c92e543": {
      "balance": "1000"
    }
  },
 
  "nonce": "0x0000000000000042",
  "difficulty": "0x020000",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x0000000000000000000000000000000000000000",
  "timestamp": "0x00",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "CNNMoney Jack Ma interview: Wars start when trade stops, 20160902",
  "gasLimit": "0xffffffff"
  }

各个参数的含义如下:

创建数据存放地址并初始化创世块

geth  --datadir "/root/chain" init genesis.json 

执行结果如下: Image of creating genesis

4.启动私链

执行如下脚本

geth --identity "phoenix"  --rpc  --rpccorsdomain "*" --datadir "/root/chain" --port "30303"  --rpcapi "db,eth,net,web3" --networkid 98888 console

各参数说明如下:

此外,还可以使用如下参数:

启动后界面如下,光标停留在最后的命令行上,可以执行以太坊命令。 可以看到Listening on [::]:30303Welcome to the Geth JavaScript console!的提示,说明已经启动成功

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

执行结果如下: Image of startup

5.查看节点信息

常用命令:

执行:

> admin.nodeInfo

得到当前节点信息如下:


{
  enode: "enode://dfd047d64a3d8c9d9c2834bc8c3bbf41a79e6797956fa99469b872d97a7978e4e7a6d9605ec6e77164515f6f09d979999ca3ef91eebcd2a6c91ebdfe167de094@[::]:30303",
  id: "dfd047d64a3d8c9d9c2834bc8c3bbf41a79e6797956fa99469b872d97a7978e4e7a6d9605ec6e77164515f6f09d979999ca3ef91eebcd2a6c91ebdfe167de094",
  ip: "::",
  listenAddr: "[::]:30303",
  name: "Geth/v1.5.0-unstable/linux/go1.5.1/phoenix",
  ports: {
    discovery: 30303,
    listener: 30303
  },
  protocols: {
    eth: {
      difficulty: 131072,
      genesis: "0xaab381212b8108c488c8d21c06042a9081b94bfb87665110520d3c295626e79b",
      head: "0xaab381212b8108c488c8d21c06042a9081b94bfb87665110520d3c295626e79b",
      network: 98888
    }
  }
}

注意enode节点,这是当前节点的标识。 后续会用到这个值。

6.查看账户信息

在创建创世节点时,我们创建了个默认账户。可以通过如下命令查看账户余额。


> eth.accounts
["0x4b691e86c622127ed8e1d49899ad8c1d19834327"]
> primary=eth.accounts[0]
"0x4b691e86c622127ed8e1d49899ad8c1d19834327"
> balance = web3.fromWei(eth.getBalance(primary), "ether");
20

配置第二台私链服务器

第二台私链服务器,需要把第一台的步骤基本都要重复一遍。两台服务器配置一样才可以通讯。 需要改变的地方是:

  1. 第三步创建genesis.json的时候,完全使用第一台服务器的配置,不要用新建的account来创建。

  2. 需要将第一台服务器添加到静态节点列表中。

7.添加静态节点列表

在{datadir}下添加文件 static-nodes.json,内容如下:

[
"enode://dfd047d64a3d8c9d9c2834bc8c3bbf41a79e6797956fa99469b872d97a7978e4e7a6d9605ec6e77164515f6f09d979999ca3ef91eebcd2a6c91ebdfe167de094@第一个节点的IP地址:30303"
]

执行如下脚本启动节点:

geth --identity "phoenix"  --rpc  --rpccorsdomain "*" --datadir "/root/chain" --port "30303"  --rpcapi "db,eth,net,web3" --networkid 98888 console

启动成功后,查看当前连接的节点:


> admin.peers
[{
    caps: ["eth/62", "eth/63"],
    id: "dfd047d64a3d8c9d9c2834bc8c3bbf41a79e6797956fa99469b872d97a7978e4e7a6d9605ec6e77164515f6f09d979999ca3ef91eebcd2a6c91ebdfe167de094",
    name: "Geth/v1.5.0-unstable/linux/go1.5.1/phoenix",
    network: {
      localAddress: "10.15.244.204:56808",
      remoteAddress: "10.15.244.203:30303"
    },
    protocols: {
      eth: {
        difficulty: 131072,
        head: "0xaab381212b8108c488c8d21c06042a9081b94bfb87665110520d3c295626e79b",
        version: 63
      }
    }
}]

挖矿

激动人心的时刻到了。 作为一个伪金融圈人士,最大的梦想,古时候叫拥有一个聚宝盆,现在叫拥有一个印钞权,在数字货币时代,叫拥有一个挖矿机。 自己搭建的区块链,想怎么挖就怎么挖吧。

私链启动起来之后,挖矿其实很简单了。 首先必须保证的有一个账号:


> eth.accounts
["0x1b39aa2446de648dd6928a759c542690cc32757b"]
> eth.getBalance(eth.accounts[0]).toNumber();
0

账号里没钱。 那就开始挖吧。挖矿其实很简单,一个命令就开始了。默认的,挖到的钱,都放在当前账号中。如果有多个账号,默认的放到第一个账号中。 在geth环境下,运行:


> miner.start();

或者运行命令行:


geth --mine --minerthreads=4

minerthreads用来指定运行的线程数。默认为当前CPU的核数。 如果有多个账号,可以指定挖矿收入放到第几个账号,注意编号是从0开始的:


miner.setEtherbase(eth.accounts[0])

或者命令行执行:


geth --etherbase 0 --mine  2>> geth.log // 0 is index: first account by creation order OR
geth --etherbase '0x1b39aa2446de648dd6928a759c542690cc32757b' --mine 2>> geth.log

半小时后,查看下账户余额:


> eth.getBalance(eth.accounts[0]).toNumber();
1.5971875e+21

话说, e+21,那是多大的数字啊??一辈子还没见过这么多钱。 头条的同学们,记得帮忙点赞啊。


感谢您对本文的关注,如需要及时收到凤凰牌老熊的最新作品,或者有相关问题探讨,请扫码关注“凤凰牌老熊”的微信公众号,在公众号里留言或者回复,可以尽快处理,谢谢。

本文欢迎转载,转载时请注明本文来自 微信公众号“凤凰牌老熊”。