原文:How To Write, Deploy, and Interact with Ethereum Smart Contracts on a Private Blockchain
作者:jack_schultz
翻译:无阻我飞扬
摘要:本文作者以极长的篇幅给出了在私有区块链上编写、部署以及与以太坊进行交互的智能合约的较为完整的代码、相关细节步骤、用户界面等。作者是希望借助他这篇文章,大家可以自行在私有以太坊区块链上编写并部署一个智能合约,以下是译文。
这里的规则是:如果通读本文,则必须自行在私有以太坊区块链上部署一个智能合约。Github上给出了所有我使用的代码,所以你没有理由不去做。
但是如果不遵守规则,只是想阅读一下而已,希望这有助于提供一个从无到有做出一个区块链应用程序的视角。
最后,你会创建出一个私有以太坊专用区块链,连接两个不同的节点作为peers,编写并编译一个智能合约,有一个允许用户提出问题的Web界面,在区块链上部署问题,然后让用户来回答。
如果感到困惑,遇到错误,或者想说点别的,那就写一篇评论,在Twitter上取得联系或发表意见。
这里是Github的repo,所以继续并fork它(如果不想复制粘贴所有的代码),如果有想要分享的更新,我会把它放到自述文件中。
私有区块链创建
要创建一个单独的节点,需要以下genesis.json
代码,它代表私有区块链上的初始块。
//genesis.json
{
"alloc": {},
"config": {
"chainID": 72,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"nonce": "0x0000000000000000",
"difficulty": "0x4000",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
"gasLimit": "0xffffffff"
}
如果希望对字段有一个完整的解释,看看这个堆栈溢出的解答。这个案例中的difficulty
是很低的,因为不希望在测试网络上等待很长的时间,区块才能被挖掘出来,然后gasLimit
的值高到允许区块中的一个节点可以完成的工作量能够处理每个交易。
去打开一个终端,确保geth
(以太坊客户端)以任何适用于你的操作系统的方式进行安装,然后cd
(dos命令)到保存genesis.json的文件夹。运行以下命令,将初始化该节点的区块链。
$ geth --datadir "/Users/USERNAME/Library/PrivEth" init genesis.json
-datadir指定区块链所有数据的位置。在Mac操作系统上,默认是 ~/Library/Ethereum目录。由于有多个节点在运行,所以不能让它们共享相同的数据文件夹,因此需要具体指定。Linux和Windows机器具有不同的默认datadir,所以请查看这些数据一般应该位于何处。
用genesis.json
文件运行完初始化命令之后,去检查那个--datadir
目录,会看到一堆文件,所以随意四处看看吧。现在没有必要,但是最终还是要去看看。
对于这样一个区块链,需要多个节点。要使区块链成为peers,它们需要拥有相同的创始文件。所以要从同一个目录运行和上面相同的命令,但是这次使用了不同的datadir
。
geth --datadir "/Users/USERNAME/Library/PrivEth2" init genesis.json
这里所有的代码,将在同一个目录下工作。代码是一样的,但是使用命令行选项,可以通过命令行参数区分这些进程。
初始化两个节点的链。
当通过一个不同的--datadir
运行geth
,无论从哪里运行命令,都将运行单独的节点。只要记得每次指定--datadir
,那么它就不会回到默认值。另外请注意,我更改了这些datadirs
的名称,所以会在屏幕截图中看到不同的名称。
打开控制台
到目前为止,已经做了三件事。1)在选择的工作目录中创建了一个genesis.json
文件,2)为一个节点选择一个目录存储区块链,并初始化第一个区块,3)为另外一个节点选择一个不同的目录存储区块链。很少的代码和一些命令。
下一步能够登录到每个节点的geth控制台。控制台将启动geth进程并运行它,也给了在终端上运行一些web3命令的方法。
geth --datadir "/Users/jackschultz/Library/EthPrivLocal" --networkid 72 --port 30301 --nodiscover console
这里还有更多的选择。
-networkid与genesis.json
文件中的类似,在这里所需要做的是确保不使用网络ID 1-4。
-port指定.ipc文件将要用到的端口。这就是使用web3.js库连接数据库的方式,默认端口是30303。所以将它保留在那个区域,但这是第一个节点,所以它的端口是30301。
nodiscover告诉geth最初不要找peers。这一点在这个案例中确实很重要。这是一个私有网络。不希望节点在没有指定的情况下尝试连接到其它节点,不希望这些节点在没有告诉它们的情况下被发现。
在第一个geth
节点运行的情况下,在有第二个—datadir
的不同终端运行相同的命令,节点在不同的端口上运行。
启动控制台。