你也可以构建私有区块链网络

这是我如何构建私有区块链网络的一篇文章,你也可以。没有什么比自己构建区块链更能帮助理解区块链了。以下是我们将在这篇文章中完成的内容:

下图我们以前可能见过,但基本上以太坊区块链网络只是很多EVM(以太坊虚拟机)或连接到每个其他节点的“节点”来创建网格。每个节点都运行整个区块链的副本,并竞争挖掘下一个区块或验证交易。无论何时添加新块,区块链都会更新并传播到整个网络,以使每个节点同步。

要成为以太坊网络中的节点,你的计算机必须下载并更新整个以太坊区块链的副本。为了实现这一点,以太坊提供了你可以下载的工具,连接到以太坊网络,然后与之交互。这些工具是:

  • Geth:“……如果你有网络开发的经验并且有兴趣为dapps建立前端,你应该试试Geth。”
  • Eth:“……如果你想通过并行运行两个不同的实现来增加安全性或者认真对待GPU挖掘,那么C++写的“Eth”客户端就适合你。”
  • Pyethapp:“……如果你是一个Python开发人员想要构建去中心化的应用程序或者对以太坊感兴趣的研究或学术目的,这是一个伟大的客户端。”

这些工具中的每一个最终都将为我们提供对控制台的访问:一个JavaScript环境,其中包含我们以后需要的所有主要功能,因此无论你选择使用哪种工具来设置区块链,我们都应该最终付诸控制台。

我只是选择了Geth,因为我对Web开发有一些了解。本文的其余部分假设我们正在使用Geth与以太坊网络进行交互。

Geth是一个命令行界面(CLI)工具,它与以太坊网络通信,并充当你的计算机,其硬件和其余以太坊节点或网络计算机之间的链接。

如果某个块被另一个节点挖掘,你的Geth程序将提取它,然后将新信息传递到你的GPU或CPU上以更新区块链。有了Geth,你可以:

  • 我的以太(以太是为以太坊网络提供gas的加密货币)。
  • 在地址之间转移资金。
  • 创建智能合约并向他们发送交易。
  • 探索块历史等等。

好的,让我们安装Geth

这是如何在Mac上安装Geth的说明。我只是使用Homebrew,这使得安装Geth(真的很简单)非常简单。如果你有一台Mac但没有Homebrew,你应该先安装它。

Windows和Linux用户:

这里是适用于Windows和Linux的最新稳定二进制文件供下载。这是你下载后要做的事情

一旦安装了Geth,你就可以在技术上连接到主要或公共以太坊区块链网络并运行完整的以太坊节点。但是我们现在还不想这样做,因为如果你正在阅读这篇文章,你很可能没有以太(以太坊的加密货币)——如果没有以太,你就无法在主区块链上做太多事情。

如果你没有以太开始怎么办?

我也没有,但以太坊可以让你创建自己的“私人”区块链网络,类似于主网络的开发/暂存版本。从功能的角度来看,此专用网络与主要的以太坊链完全相同,除了此网络上部署的任何交易和智能合约只能由连接到此专用网络的节点访问。这就是我们要做的——我们将创建一个私有区块链。

创建一个私有的以太坊区块链

Geth使你能够设置“私有”或“testnet”以太坊区块链。这是学习在互联网上听到和阅读的区块链概念的最佳方式。你可以构建智能合约,使交易成为去中心化分布式应用程序——无需真正的以太。你实际上可以创建自己的以太(只能在你的私有网络上使用的假以太),为你的帐户预分配以太,然后使用它来进行交易,转移或部署智能合约。

区块链和创世纪块

正如你现在可能知道的那样,区块链只不过是一个数字分类账,其中交易按时间顺序和公开记录。这些交易以块的形式记录,分布式网络中的节点竞争以找到下一个有效块。 一旦找到有效的块,它就被添加到区块链中,并且该信息被中继到网络。然后,每个节点都将其区块链更新为最新副本。

每个区块链都以Genesis Block开始,这是链中的第一个区块,0区块——唯一没有前任的区块。

为了创建我们的私有区块链,我们将创建一个创世块。为此,我们将创建一个自定义的Genesis文件,并要求Geth使用该genesis文件创建我们自己的genesis块,这反过来将成为我们自定义私有区块链的开始。

这是Genesis文件的样子:

1
2
3
4
5
6
7
8
9
10
11
12
{
"config": {
"chainId": 987,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"difficulty": "0x400",
"gasLimit": "0x8000000", //set this really high for testing
"alloc": {}
}
}

这就是属性的意思……

1
2
3
4
5
6
config:配置块定义我们的自定义链的设置,并具有创建私有区块链的某些属性。
- chainId :标识我们的区块链,主要的以太坊链有自己的ID,但我们会将它设置为我们私有链的唯一值。
- homesteadBlock:Homestead是以太坊平台的第二个主要版本,也是以太坊的第一个生产版本。它包括几个协议更改。由于我们已经在Homestead版本,因此该属性为0。- eip155Block/eip158Block:Homestead版本发布时带有一些向后不兼容的协议更改,因此需要硬分叉。通过以太坊改进提案(EIPs)提出的这些协议变更/改进。然而,我们的链条不会因为这些变化而难以分解,所以保留为0。
- difficulty:此值用于控制区块链的块生成时间。难度越高,Miner在发现有效块时必须执行的统计更多计算。在我们的测试网络中,我们将保持此值低以避免在测试期间等待,因为需要生成有效块来执行交易处理区块链。
- gasLimit:此值指定每块的“gas”支出的当前链范围限制。gas是以太坊在交易过程中消耗的燃料。我们将在这种情况下将此值标记得足够高,以避免在测试期间受到限制。
- alloc:这是你可以创建你的钱包并用假ether预填充的地方。但是对于这篇文章,我们将在本地快速挖掘我们的以太,所以我们不使用这个选项。

此时,让我们继续创建我们的CustomGenesis.json文件。我只是使用文本编辑器并将其存储在我的计算机上的文件夹中。

下一个打开终端并假设你已经安装了Geth,只需运行此代码段即可:

1
2
3
geth — identity “yourIdentity”
— init /path_to_folder/CustomGenesis.json
— datadir /path_to_your_data_directory/ACPrivateChain

此代码段指示Geth使用你创建的CustomGenesis.json文件作为自定义区块链的第一个块。然后,我们还指定一个数据目录,用于存储我们的私有链数据。Geth将为你创建数据目录。只需选择一个与公共以太坊链文件夹分开的位置(如果有的话)。

在终端窗口上运行此代码段后,你应该看到Geth连接到genesis文件并提供相同的确认。

创建一个将共享此区块链的专用网络

好的,所以在这一点上我们已经建立了私有区块链的最初阶段。接下来,我们将启动我们的专用网络,以便我们可以挖掘将添加到我们的专用链的新块。

为此,请在终端上运行此命令:

1
geth --datadir /path_to_your_data_directory/ACPrivateChain --networkid 9876

此片段告诉geth启动我们的专用网络并使用我们刚刚指定的目录来访问我们的私有区块链详细信息。

请注意,我们还指定了一个名为networkid的参数。这标志着你的以太坊网络的身份。我们在这个例子中使用了9876,但你应该用你选择的随机数替换它来创建你自己的网络并防止其他人无意中连接到你的网络。

Main Ethereum网络的networkid=1。以下是网络ID和相应网络的列表

1
2
3
4
5
6
7
8
9
0: Olympic, Ethereum public pre-release testnet
1: Frontier, Homestead, Metropolis, the Ethereum public main network
1: Classic, the (un)forked public Ethereum Classic main network, chain ID 61
1: Expanse, an alternative Ethereum implementation, chain ID 2
2: Morden, the public Ethereum testnet, now Ethereum Classic testnet
3: Ropsten, the public cross-client Ethereum testnet
4: Rinkeby, the public Geth Ethereum testnet
42: Kovan, the public Parity Ethereum testnet
7762959: Musicoin, the music blockchain

无论如何,一旦你在终端上运行命令——你的专用网络将上线。这是我的终端在运行代码段后显示的内容。

另一件重要事情。每次你想要访问你的私人链时,你必须按原样按顺序运行这两个片段,因为Geth不记得你的私有区块链网络的参数。因此,我建议你保存下面的设置步骤,以便稍后访问。

1
2
3
4
#1 
geth — identity “yourIdentity” — init /path_to_folder/CustomGenesis.json — datadir /path_to_your_data_directory/YOUR_FOLDER
#2
geth --datadir /path_to_your_data_directory/ACPrivateChain --networkid YOUR_NETWORK_ID

如果你已经跟着这一点,你有一个私人区块链,一个私人网络启动并运行!现在,我们可以通过帐户开始与我们的私人区块链和私人网络进行互动。

创建外部拥有帐户(EOA)

我们现在将创建一个帐户来操纵我们的区块链网络。如果你一直关注这个系列,我们在上一篇文章中讨论过帐户。

打开第一个geth实例后,打开另一个控制台/终端并键入以下内容:

1
geth attach /path_to_your_data_directory/YOUR_FOLDER/geth.ipc

这会将你的第二个控制台连接到第一个终端窗口上运行的Geth实例(确保它实际运行)。你应该得到一个像这样的Javascript控制台:

一旦你有了javascript控制台,你就可以创建一个帐户了。

1
personal.newAccount()

系统将要求你设置密码,然后生成新帐户。简单!

现在,将此帐户保存为#,因为你经常需要它。另外,请记住密码,因为你需要它来访问你的帐户。

接下来,使用以下代码行检查此帐户有多少以太网:

1
eth.getBalance("ENTER_YOUR_ACCOUNT_NUMBER_HERE")

这就是我得到的:

你的余额应为0。这是正确的,因为当你第一次创建一个帐户时你不会有任何以太。

有两种方法可以让以太进入你的帐户,或者有人向你发送一些,或者你挖掘交易区块并依次获得以太奖励。

既然你现在独自一人在你的私人网络中,你现在唯一的选择是挖掘一些区块并获得奖励。

我们的帐户中有一些以太

在真实或主要以太坊区块链中挖掘是相当困难的,并且需要专用硬件,例如专用GPU。但是,对私有链中的块进行挖掘很容易,因为我们在创建文件中指定难度级别非常低,还记得吗?我们可以使用以下代码简单地开始挖掘:

1
miner.start()

此时,如果你查看正在运行Geth实例的其他控制台,你将看到矿工成功挖掘的块。给它10-15秒并再次检查你的余额。

哇噢!你的新帐户中会出现大量以太币。

(记住这是假的以太,你不能使用这个以太网在主以太网网络上进行交易)但是你可以用它来测试区块链的几个功能,包括转账,部署合约等。

最后,使用miner.stop()脚本停止挖矿。

恭喜!

你刚刚建造了你的第一个私人以太坊区块链并开采了一些以太!很多细节,但我希望其中一些有意义,并让你更清楚地了解区块链的工作原理。

======================================================================

分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:

  • EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。
  • java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
  • python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
  • php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。
  • 以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。
  • java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。
  • php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
  • tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。

汇智网原创翻译,转载请标明出处。这里是原文你也可以构建一个私有区块链