建立私有以太坊测试网络
由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!
我想在正式版发布之前,先体验一下以太坊智能合约,不想花真金白银。幸运的是,以太坊的设计使得搭建新网络,尤其是与主网完全独立的私有网络,变得非常容易。我将在这里尝试解释一些入门步骤,既是为了我自己,也是为了帮助其他想要以简单安全的方式体验以太坊智能合约的人。
注:目前有一些项目允许一键搭建私有以太坊网络,例如Ganache。我不会讨论这些项目,因为我想更深入地了解其底层原理。
我们需要什么?
盖斯
Geth代表“Go Ethereum”,是一个用 Go 语言编写的以太坊协议全节点实现。它是最初的三个实现之一(另外两个是 C++ 和 Python)。Geth 允许我们从所谓的“创世文件”搭建测试网。首先,让我们安装它。像我这样的 macOS 用户可以通过 Homebrew 轻松安装:
brew install geth
安装好 Geth 之后,我们需要设置创世文件。
创世纪文件
创世文件是一个 JSON 配置文件,Geth 使用它来创建创世区块。该区块的目的是定义游戏规则,其内容大致如下(感谢pyethapp):
{
"nonce": "0x0000000000000042",
"difficulty": "0x200",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
"gasLimit": "0x1388",
"alloc": {
"3282791d6fd713f1e94f4bfd565eaa78b3a0599d": {
"balance": "1337000000000000000000"
},
"17961d633bcf20a7b029a7d94b7df4da2ec5427f": {
"balance": "229427000000000000000"
}
}
}
它设定了一些非常重要的基本值,例如起始值difficulty和难度gas limit。在工作量证明(PoW)的意义上,难度决定了每个后续哈希的熵,或者更简单地说,决定了解决下一个区块并猜测起始值和结束值组合所需的计算能力mixhash。nonce我们希望测试网上的难度足够低,这样我们就可以只用一台笔记本电脑“挖矿”,而无需等待或熔断内存。
另一方面,我们希望 gas 值gas limit足够高,以便能够处理任意复杂度的操作,而无需从头开始重新初始化网络。然而,在智能合约正式上线之前,务必密切关注操作消耗的 gas 量,因为在主网上,这代表着真金白银。
该alloc对象是可选的,但它允许设置初始数量的钱包,每个钱包都有自己的余额。不过,您也可以省略此步骤,因为稍后您可以在 Mist 中轻松创建钱包。
其余的值基本上都是零,或者是一些初始随机哈希值,你不用太在意。只需复制一个类似这样的示例,调整难度和 gas 上限,然后从那里开始即可。如果你想更深入地了解每个属性的含义,我发现这个回答非常详尽。
薄雾
Mist是一款图形用户界面 (GUI) 的以太坊 DApp 浏览器,内置 Geth 节点和以太坊钱包管理器。如果您之前只使用过以太坊钱包,那么 DApp 浏览器的概念乍一看可能会有些复杂。除了管理钱包之外,Mist 还充当着事实上的 DApp 商店,用户可以在这里发现并体验已开发的 DApp,例如 CryptoKitties、Augur 和 Bancor 等。最重要的是,Mist 支持创建、部署和执行智能合约。这正是我们使用它的主要目的。
初始化网络
首先,我们来初始化网络。我们需要一些初始文件夹结构,可能如下所示:
mytestnet/
- chaindata/
- genesis.json
当然,目录和配置文件的命名完全取决于您。重要的是要将存储区块链的文件夹与创世文件分开。记住这一点,进入该mytestnet目录,并执行以下命令:
geth --datadir=.chaindata init genesis.json
Geth 将初始化区块链并自动关闭自身。区块链初始化完成后,您可以启动一个 Geth 实例并保持其运行:
geth --datadir=.chaindata
Geth 会连接并保持服务器运行。你需要注意的是连接过程的最后一行,它应该类似于这样:
INFO [07-29|09:53:20.327] IPC endpoint opened url=/path/to/my/testnet/.chaindata/geth.ipc
.ipc下一步我们将使用该文件将 Mist 连接到该系统。
启动喷雾
关于 Mist 需要注意一点。它自带 Geth 版本,如果你的机器上没有运行其他 Geth 版本,它会自动启动。这可能会导致 Mist 尝试连接到主网并开始下载真正的以太坊区块链副本。我们需要阻止这种情况发生。因此,我们将从命令行启动 Mist,并指向.ipcGeth 实例打开的文件:
/Applications/Mist.app/Contents/MacOS/Mist --rpc /path/to/my/testnet/.chaindata/geth.ipc
完成一些设置后,Mist 即可启动。无论您之前是否在创世文件中为某些地址分配了 ETH,您都将无法访问这些地址。您需要创建一个新的钱包并挖矿获取一些 ETH。
设置好第一个钱包后,不妨也挖一些 ETH。假设你设置的初始difficulty值足够低,这应该是一个相当快速简单的过程。打开一个新的标签页,启动第二个 Geth 实例,就像这样:
geth attach /path/to/my/testnet/.chaindata/geth.ipc
它会启动一个控制台,您可以在其中输入以下命令:
miner.setEtherbase("the_address_of_your_wallet");
miner.start(1); // # of parallel threads.
// To stop the miner, type miner.stop()
不久之后,Mist 会开始显示您钱包中 ETH 的数量不断增加。
作为练习,尝试通过 Mist 向您创建的另一个钱包发送一些 ETH。为了确认交易,您需要立即启动挖矿程序,并保持其运行直到所有确认都完成。通常情况下,Mist 的响应速度足以实时显示此过程。但有时,Mist 可能会无响应或与套接字断开连接。如果发生这种情况,只需重启 Mist 即可恢复正常运行。
今天就到这里。在后续文章中,我将讨论如何在我们新的私有测试网上创建和部署一个简单的智能合约。敬请期待。
这篇文章最初发表在我的博客上。
文章来源:https://dev.to/preslavrachev/setting-up-a-private-ethereum-test-network-b12

