以太坊开发干货拿走不谢|区块链课堂

本文翻译自CyberMiles的核心开发人员Timothy McCallum在Medium上发布的文章

原文链接:https://medium.com/cybermiles/running-a-quick-ethereum-private-network-for-experimentation-and-testing-6b1c23605bce


背景

本文将一步步阐述如何在Ubuntu 16.04 LTS安装轻便的以太坊私网。在这里“轻便”是指一个私人以太坊网络能快速地创建块的间隔。前提是要有一个准备好的,只用于做快速实验和测试的私人测试床。简单来说,就是一个完全由你掌控,并且能够快速挖矿的私人以太坊网络。当然了,交易上来说,以太坊私网不受保护且不能保证安全。但是因为这个网络没有投入真实的钱(除了实验和测试的结果),所以不用担心。当然了,它应该在正确配置的防火墙下运行。

以太坊网络解释

  • 主链

点对点的各个节点如果想要在同一个网络上互动,它们必须有一个相同的协议版本以及正确的网络ID。为了让节点可以连接到以太坊主链,只需要简单地创建以太坊网络就可以了。

 

从实验和测试的角度出发,使用以太坊主链有两个缺点。首先当然是使用默认的网络设置来创建以太坊将会导致你的节点端下载整个以太坊区块链。这将会需要大量时间以及有很大的本地储存空间。其次,任何在主链上的活动都需要“gas”。虽然gas是可获得的,但前提是你必须购买或存入一定的ETH到账户中。你可能不想在一个简单的实验和测试中花钱。那么如何运行你的测试网络呢?

 

  • 测试网络

 

还有其他的方法来创建你的以太坊节点。如果说你想要没有ETH却能参与网络,提高一定灵活性,你可能会想要使用一个像Ropsten这样的以太坊测试网络。Testnet ETH不用花钱就可以使用,这解决了一大难题。但是,如果使用Ropsten作为测试网,你需要下载Ropsten 测试网区块链,这需要相当长的时间,和相当多的本地磁盘空间。

 

  • 私有网络

 

最后一个选择是运行你自己的私人以太坊网络。一个私有网络不需要本地储存并且可以在没有使用真实货币购买ETH的情况下进行操作。那么到底是什么构成了私人以太坊网络?

“如果节点没有连接到主链上的节点,以太坊网络就会是一个私网。在这种情况下,私有仅意味着储藏或隔离,而不是被保护或安全。”【1】

 

如上所述,在以太坊GitHub页面,私网络既不受保护也无法保证安全。另外,设置一个专用网络需要一点额外的配置。你可以通过在正确配置的防火墙安全网络下,简单地运行私人以太坊网络来缓解安全问题。除了安全之外,剩下的就是如何执行额外的配置(我们将在下面详细介绍)。


在Ubuntu16.04上安装

 

  • 整理环境

首先,我们将执行一些一般的整理环境操作处理并下载一些其他的软件。

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install -y build-essential
sudo apt-get install git
cd ~
git clone https://github.com/ethereum/go-ethereum.git

  • Go 1.9.3        

在整理基本的开发环境之后,请改变你的主目录以及下载Go 1.9.3。

cd ~
wget https://dl.google.com/go/go1.9.3.linux-amd64.tar.gz

你可以使用如下sha256sum命令通过Go网站来实时验证你的下载。

sha256sum go1.9.3.linux-amd64.tar.gz

解压 Go,键入以下命令(使用sudo)

sudo tar -C /usr/local -xzf go1.9.3.linux-amd64.tar.gz

确保GO路径的设置是你的用户文档。将以下的代码添加到~/.profile文档的尾部。

export PATH="$PATH:/usr/local/go/bin"

注销,然后重新登录(或重新启动),以确保PATH环境变量已激活。要测试go的路径和版本,请使用以下两个命令:

which go
/usr/local/go/bin/go
go version
go version go1.9.3 linux/amd64

  • 以太坊开采难度降低

 

正如前面所讨论的这将是一个私人专属的测试网络,因此我们不希望以太坊的安装需要不断调整挖矿的难度,我们要的是最快的挖掘速度。


静态地设置开采难度值为1(最低的开采难度值),我们需要运行以下命令,打开consensus.go源代码(我们已经在如上开发环境整理环节处,fetched过了)

cd ~
gedit go-ethereum/consensus/ethash/consensus.go

在298行周围你会看到一个叫CalcDifficulty的函数。下面的图像展示了这个函数如何通过调用三个方法中的任意一个来调整挖矿难度。(分别是边疆,宅基地或拜占庭相关难度调整)。

如果你把CalcDifficulty函数中所有的语句都替换成一行返回语句,如下图所示,开采难度将在持续基准上保持在尽可能低的难度水平。

  • 构建Go Ethereum

我们已经修改了源代码,所以我们现在通过运行以下命令来构建Go Ethereum(源)

cd ~
cd go-ethereum
make geth

  • 配置和运行去以太坊

以下内容将帮助学习如何配置和运行以太坊私网。


  • 网络ID

如果在默认模式下启动,网络ID为1,代码会自动连接到以太坊主链。

另外,可以使用Go Ethereum来传输网络ID。

显然,为了保证您的最大利益,保证其他节点都能连接到你的私人以太坊网络,你需要:

a)使用正确配置的防火墙来保护你的网络

b)针对你的网络选择一个未被占用的网络ID

我们今天将使用15来作为网络ID。

 

  • 帐户

过一会儿,我们将使用一次性机制来为我们的账户提供资金。在使用这个机制之前,我们需要:

  1. 为以太坊建立一个数据目录

  2. 创建新的账户以及

  3. 保存这些帐户详细信息,以便在今后的步骤中使用。

cd ~
mkdir gethDataDir
geth account new --datadir ~/gethDataDir

建议您运行“geth account new…”命令(如上所示)至少两次。这将为您提供至少两个可以免费存储和提取ETH的账户。

 

  • 创世块

 

如果在默认状态下首次运行以太坊,区块链将在主链的第一个区块:“硬编码”的创世块开始。寻找到下一个点并且将其区块链的内容同步到以太坊实例中来保证你运行的是最新的内容。同步的抑或最新的内容,就意味着所有从创世块和后来同步更新的,甚至是最近的区块内容都会被你储存在本地。

 

以太坊的区块链大小约45GB,这对我们的测试来说是有困难的。这是我们选择运行自己的私有网络的原因之一。

 

为了运行我们自己的网络,我们将创建自己的创世块。为此,我们创建了一个文件,如下面,并genesis.json命名保存到最近创建的路径~ / gethDataDir。

{
	"config": {
		"chainId": 15,
		"homesteadBlock": 0,
		"eip155Block": 0,
		"eip158Block": 0
	},
	"difficulty": "1",
	"gasLimit": "2100000",
	"alloc":{
	        "yourNewlyCreatedAccountAddressMustGoHere": {
			"balance": "300000"
		},
		"yourNewlyCreatedAccountAddressMustGoHere": {
			"balance": "400000"
		},
		"yourNewlyCreatedAccountAddressMustGoHere": {
			"balance": "500000"
		}
	}
}

注意:你必须粘贴你新创建的帐户地址在“alloc”部分,然后在“alloc/balance”部分(如上图)输入相应内容。

注意:“chainid”部分是故意设置为15(我们的私人networkid)

 

  • 初始化区块链

 

键入下面的初始化命令,这将参考创世块,为我们的专用网络初始化一个新的区块链

cd ~/gethDataDir
geth --datadir ~/gethDataDir/ init genesis.json


  • 启动以太坊

 

键入以下命令启动以太坊。请注意,在我们的genesis.json文件里networkid(15)和“chainid”必须是相同的。

cd ~
geth --datadir ~/gethDataDir --networkid 15

 

上面的命令将启动我们的以太坊私人网络,产生一个进程间通信(IPC)的端点。

连接到IPC端点(启动和使用控制台)

 

如果我们打开一个新的终端,键入以下命令,然后我们可以使用Go Ethereum(Geth)的JavaScript 的API和我们的以太坊私网了

cd ~
geth attach ipc:gethDataDir/geth.ipc

以下命令将:

  1. 列出我们最近创建的以太坊帐户

  2. 显示我们的账户余额

  3. 显示我们的Coinbase地址(即奖励收到的地址)和

  4. 显示我们的开采状况(真/假)

web3.eth.accounts
web3.eth.getBalance(web3.eth.accounts[0])
web3.eth.getBalance(web3.eth.accounts[1])
web3.eth.getBalance(web3.eth.accounts[2])
web3.eth.coinbase
web3.eth.mining

  • 挖掘以太坊私网

如上的Geth的实例不是为了展示如何挖矿。所以为了挖掘以太坊私网你需要:

  1. 按“Ctrl + C”在主窗口停止原来的geth的实例

  2. 通过在控制台中输入exit断开与IPC的连接。

  3. 键入以下命令:

cd ~
geth --mine --minerthreads=1 --datadir ~/gethDataDir --networkid 15

请注意,我们提供的具体参数,如datadir和networkid。这些都是为了确保使用正确的帐户和网络进行挖掘。

从输出中可以看到,我们现在每隔几秒钟就挖掘和密封打包新的块。

 

如果我们打开一个新标签,重新连接到控制台,我们就可以看到,因为采矿作业的成功,Coinbase账户的余额已明显增加。

注意我们访问Coinbase账户的余额的两种不同的方式。首先通过获取和使用的帐户的地址明确,其次通过嵌套两则web3命令(通过使用Coinbase账户地址作为参数来使用getBalance函数)。

 

结论

从这一刻起,您就可以创建交易、编写智能契约和配置越来越多的节点来加入您的私有网络。这些额外的任务超出了这篇文章的范围,但是它们将在其他的帖子中详尽阐述,所以请关注Timothy McCallum追踪更新内容吧。

 

参考文献

[ 1 ]https://github.com/ethereum/go-ethereum/wiki/private-network