区块链 —— 从零搭建以太坊私有链网络

本文的安装环境是在ubuntu 16.04 位上。假定你已经搭建好了ubuntu环境。

第一部分:下载Ethereum Wallet

以太坊官网这样介绍Ethereum Wallet的。

The  Ethereum Wallet  is a gateway to decentralized applications on the Ethereum blockchain. It allows you to hold and secure ether and other crypto-assets built on Ethereum, as well as write, deploy and use smart contracts. 大致的意思是以太坊钱包是通往以太坊区块链上创建去中介化的应用程序的一道大门。它可以允许你持有以及保护以太币和构建于以太坊之上的其他密码资产,也可以创建,部署以及使用智能合约。

现在开始吧!

步骤1:进入以太坊项目官网https://www.ethereum.org/ 找到以太坊钱包下载处。

图 1 以太坊钱包下载处

第二步:点击See all versions,弹出图2的界面。

图 2 同意界面  

点击SURE I UNDERSTAND AND AGREE,表示我同意。同意之后,我们选择符合自己的安装版本,如图3所示。

图 3 下载lunux32版本

点击第二条,开始下载。如图4所示。

图 4 下载进度

下载完成后,压缩包位于下载目录。如图5所示。

图 5 文件所在目录

进入下载目录,对其解压缩。命令是unzip Ethereum-Wallet-linux32-0-8-8.zip。如图6所示。解压缩完成后,多了一个目录,如图7所示。

图 6 解压缩过程

图 7 解压缩后的目录

到此,关于Ethereum Wallet的下载、解压缩部分就告一段落。我们进入第二部分。

第二部分:安装Geth(从ppa直接安装)

Geth是以太坊官方旗舰客户端,使用Go语言开发的。代码托管在Github上https://github.com/ethereum/go-ethereum/  

本文采用Geth的官方安装指令,我们采用从PPA中安装。安装指令如图8所示。

图 8 从PPA中的安装指令

四条指令顺序执行完(第一条是安装必要的工具包;第二、三条是添加以太坊的源,最后是安装go-ethereum),我们用命令“geth help”测试Geth是否安装成功。如图9所示。

图 9 部分命令行选项

这里罗列出了很多的命令行选项。更多命令行选项见https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options

当然你也可以直接运行geth命令。但是这会连接到以太坊公有链。如图10所示。

图 9 运行geth命令后的部分截图

本文是搭建私有链,这里就不进行同步公有链。若是你不小心打了这条命令,你可以关闭 终端,删除/home/ubuntu/.ethereum目录。

还是回到搭建私有链上来。安装 Geth成功后。接下来你需要一下四步就可以搭建私有链。

1、定制创世文件

2、定制数据目录

3、定制网络ID

4、(建议)禁用节点发现

我们先来看第一小步:定制创世文件

创世区块是整个区块链的开端——第一个区块,编号是0,也是唯一一个没有前驱指向的区块。协议必须确保没有其他节点会认同你的区块链版本,除非他们拥有同样的创世区块。因此你可以创造出任意多的私有测试网络。

首先,你得创建私有网络的创世状态,这种状态是所有节点得认同的,这是由一个小小的JSON文件组成的。我们不妨取名为gzugenesis.json。我们新建一个目录,取名为PrivateEtherNet。如图10所示。

图 10 创建PrivateEtherNet目录

切换到上述目录下,创建创世文件gzugenesis.json。如图11所示。

图 12 创世文件gzugenesis.json

ps:这里最好将难度设小一点,要是普通PC机的话,一两百就好。因为这样产生区块的时间短。

创建完gzugenesis.json文件后,在启动节点之前,我们得用这个创世文件初始化每一个Geth节点。命令是:geth init PrivateEtherNet/gzugenesis.json 

如图13所示。图 13 初始化一个创世区块

这一步之后,我们发现/home/ubuntu目录下多了一个目录.ethereum。这里面存放区块链数据。我们可以进入到该目录下(/home/ubuntu/.ethereum),键入tree命令(ps:若提示未安装程序"tree",可以使用sudo apt install tree安装!)。我们可以看到如图14的目录结构。

图 14 /home/ubuntu/.ethereum的目录结构

ps:keystore目录下是存放钥匙文件(keyfiles)的,keyfile中是一些JSON格式的数据,有账户口令加密了的私钥密文,还有账户地址等。因为此时还未创建账户,所以为空(没有keyfile文件)。

现在我们启动一个私有链节点。

我们用命令geth --networkid=5 console启动一个geth节点。其中--networkid是以太坊选项,console是启动一个交互式JavaScript环境,可以在Geth中执行命令(ps:这两个命令在图9都可以查到用法)。如图15所示。

图 15 启动一个私有链节点

看到Welcome to the Geth JavaScript console!的提示,说明启动成功!

此时我们再查看存放区块链数据的默认目录,如图16所示。

图 16 启动私有链节点之后的/home/ubuntu/.ethereum目录结构

ps:每当你想要访问自己的定制链时,你得用定制的(私)链命令启动一个自己的geth实例。比如,当我们关掉启动节点,浪了一个寒假回来想继续在私链上做实验,我们还得用geth –networked=5 console启动geth实例。如果我们仅仅在终端输入geth,它并不会记住我们已经设置的其他标志。

现在我们已经运行了一个geth节点,接下来进入第三部分。

第三部分:创建帐户和挖矿

记住:在挖矿之前,需创建帐户!否则直接上来就miner.start()会报错!

这里我们有两种方式。

第一种方式是运行Ethereum Wallet。对!就是最先下载的那个软件。

我们切换到图7所示的解压缩目录下,双击etherwallet,如图17所示。

图 17 双击ethereumwallet应用程序

弹出如图18的界面。

图 18 正在启动Ethereum Wallet

启动完成后,如图19所示。

完成启动后的钱包界面

正常启动的话,界面上面会显示PRIVATE-NET。

现在我们就可以创建账户了!

点击ADD ACCOUNT,出现如图所示的界面。

创建帐户界面

两次输入账户口令后,创建了一个账户。如图所示。

创建帐户完成后的界面

我们可以看到,新创建的帐户余额为零。

我们不妨再次查看一下keystore目录下,就发现原本空空如也的keystore目录下多了一个文件。这个文件就是钥匙文件(keyfile)。

文档的目录结果如图所示。

图钥匙文件内容

不难看出,这是一个JSON格式的文本,包括账户地址,使用的加密算法aes-128,私钥密文(ciphertext)等。

此时我们也可以在JS控制台下查看账户:命令是eth.accounts。如图所示。

图 26 返回的帐户列表

现在我们可以开始挖矿了(ps:这里挖的只是测试币而已,不能再生产环节使用。包括上面的账户地址也不能在以太坊公有链使用,即接受真正的以太币。)

命令是miner.start()。如图27所示。

图 27 执行挖矿命令后的屏

我们会发现在在.ethereum的同级目录里会产生一个.ethash文件。

我们可以在文件系统中看一下,如图28所示。

图 28 文件系统中的模样

完成生成DAG之后,就开始正式挖矿!如图29所示。

图 29 挖矿ing

一挖而不可收拾!想停止挖矿怎么办?直接输入miner.stop()就搞定!不用管屏幕没有提示符,直接输就是!

第一种方式创建账户以及挖矿就讲到这里。

开始讲第二种,直接在JS控制台下使用命令!命令怎么打?

很简单!personal.newAccount()就可以了!输入完这条命令后会提示输入两次口令(passphrase)(ps:口令你得记住!)。如图30所示。

图 30 JS控制台下创建帐户

使用eth.accounts命令,我们可以看到返回了一个账户列表。如图31所示。

图 31 帐户列表

现在我们也发现keystore目录下有两个文件了。如图32所示。

图 32 最新的/home/ubuntu/.ethereum目录结构

我们也可以发现Ethereum Wallet上也多了一个账户,即账户2(ACCOUNT 2)。如图33所示。

图 33 以太坊钱包中的帐户界面

此时,如果我们还用miner.start()开始挖矿的话,并不是将测试币往账户列表中第二个地址中挖,而还是往账户列表中第一个地址挖。怎么办呢?

我们只需要把第二个账户地址设为etherbase(etherbase及时接受奖励的地址)就行!

命令是miner.setEtherbase(personal.listAccounts[1])。如图34所示。

图 34 设置帐户成功

返回为true,设置成功,现在就可以开始挖矿了。

同样的命令miner.start()

一眨眼的功夫,第二个账户50个测试币手动擒来,有点像三国演义中关羽温酒斩华雄。这都得益于创世文件中难度值的设置。但是随着挖矿的继续进行,后来你会明显,出块时间会变长!如图35所示。

图 35 帐户2的余额

总结一下,本文主要带领大家完成了Ethereum Wallet的下载和启动!最重要的是完成了Geth下搭建以太坊私有链网络的过程,其中主要有四步:1、定制创世文件; 2、定制数据目录(本文采用默认目录);3、定制网络ID(本文将网络id设置为5);4、(建议)禁用节点发现(本文未涉及此步骤),感谢微博cybermaster的分享

ps:安装客户端也可以选择从源码进行编译安装。

1、安装Go语言环境

Go语言环境可以访问golang.org网站下载二进制压缩包安装(安装命令省略)。注意不推荐通过包管理器安装,版本往往比较旧。

安装完成后,可以使用go version命令验证安装是否成功。

2、下载和编译Geth

用以下命令安装C的编译器:

$ apt-get install -y build-essential

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

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

编译安装(编译速度还挺快,秒级)

$ cd go-ethereum

$ make geth

安装成功后,注意提示(Run “/home/ubuntu/go-ethereum/build/bin/geth”),见下图:

这意味着编译生成的geth可执行文件位于/home/ubuntu/go-ethereum/build/bin/目录下,我们可以切到此目录下运行(./geth --help)或者运行/home/ubuntu/go-ethereum/build/bin/geth --help。

进一步补充;(默认情况下,本地拷贝与最新的代码同步,这可能是go-ethereum的一个不稳定或是beta版本。在编译这些代码之前,签出发布标签(realease tag)以选择某一特定版本(a specific version)。 这将通过一个关键的标签标记,让本地拷贝与代码仓库的特定快照同步。开发者用标签来标记代码的特定发行版本号。首先,要找到可用的标签,可以通过git tag命令(进入到go-ethereum目录下,再git tag)。列出的标签是go-ethereum的所有发行版本。按照约定,带有rc后缀的是预发行版本,可以用来测试。没有后缀的稳定版本可以直接在产品环境上运行。从git tag列出的版本中(如下图(部分截图)),选择最新的稳定版,可以通过git checkout xx版本来实现切换,再make geth,生成可执行文件geth。最后运行:build/bin/geth version可以看到稳定版本)。

推荐阅读更多精彩内容