在以太坊项目实际开发中,我们必须要有一个测试环境,因为产品环境是需要消耗GAS的。因此我们希望在测试环境测试无误之后再发布到产品环境以太坊链上去。
本篇教程讲述如何搭建本地的测试链。
本篇的主要参考内容来自于: https://medium.com/compound-finance/the-beginners-guide-to-using-an-ethereum-test-network-95bbbc85fc1d 以及 https://karl.tech/intro-guide-to-ethereum-testnets/
Testnets
以太坊的测试网络环境被称为Testnets
,拥有几乎和以太坊等效的功能。因此可以在Testnets上开发和测试自己的智能合约,测试发币等等,作为上链前的评估环境。
目前Testnets环境有不少,受到开发者喜爱的主要有以下三种:
- Ropsten: 一个POW的区块链,非常类似于以太坊,你可以很轻松的进行挖矿操作。
- Kovan: 一个POA的区块链,不能挖矿,需要申请。
- Rinkeby: 一个POA的区块链,不能挖矿,需要申请。
以上项目属于公共的Testnets
,可以无需本地搭建直接使用,参考对应的文档接入即可,也可以使用Geth
命令行工具连接到这些公共Testnets网络中。
下面我们要介绍的是需要自己DIY的Testnets项目,适用于本地小规模测试,或者没有外网访问的测试环境中,就是ganache-cli项目。
ganache-cli
曾经这个项目被称为testrpc
,现在已经增强了功能,并且重命名为ganache-cli
,也由etherenum项目组迁移到了truffle项目组的名下,作为truffle框架下的一个子项目。
安装它需要使用npm
:
$ npm install -g ganache-cli
快速启动只需要空参运行ganache-cli
即可:
$ ganache-cli
Ganache CLI v6.1.6 (ganache-core: 2.1.5)
Available Accounts
==================
(0) 0x721e4416f6290230274be32f3d68e8194403f5de (~100 ETH)
(1) 0xefbd7fd54126b3a755cce16ab80b6f018eb2cc4a (~100 ETH)
(2) 0x3af60c2747c737b37a49cbdaf6d4e3f80794cbcf (~100 ETH)
(3) 0x35456a4255a0e8d2525ffd2eccd16e88b8242de7 (~100 ETH)
(4) 0xba6b44714329f4578d785b6132e942b8f920ca07 (~100 ETH)
(5) 0xfbb8c6da1c3bcfb7e285210f2404364112877a1b (~100 ETH)
(6) 0x33e90bf0bc85d18f1fd104aaae22722ab046cfc4 (~100 ETH)
(7) 0x88a7e5c3ebd8c36f84dded2b7e15a59473153cf3 (~100 ETH)
(8) 0xe025cdf4066b6d8079438dd9eb9d8a30f82a7f1d (~100 ETH)
(9) 0x5da32eb8ca2c8fd14c745776633924e4d87cfbe4 (~100 ETH)
Private Keys
==================
(0) 0x7a11088361c7cad64acadce8deaae666a6721d02837523663cb46683b4ed7cda
(1) 0x3619c935a7f965449a0104935e4e631cba9077c0783cbf77fe0c5f92fd8bb763
(2) 0x9ac7a2914d651ef3afba681c1c2035909ae6ca93b86ee8fa367b0373c63f9379
(3) 0x7e4651e35c7e9956e7a18eb4f721fad81a0e608736cda6bdfee6a5ff9ee8b99d
(4) 0x11f3144b6f041601e80bfeb6fab4b74caff28fd9fb1cdbf3435967deee308592
(5) 0xf747fbd7e8e85fbf76d6f7c8eb4244d3b72655d5e86648daab6d020f98a0a251
(6) 0x065d754b60b856a42a6418e13fb625632122433d9b3263b686265fb67cfc550b
(7) 0x2857ecc4b378de190265245825dc42443370262c119b894dc61f88564d491252
(8) 0xa86da3e1e8fc33bbd4fcfab2461af10e7d6eaa16002fb9db582aedf8ff92881c
(9) 0x4a50bb4a4d4d29df2e894ad9d18086e079b7a3e8b8e4960649c5043268e73ae5
HD Wallet
==================
Mnemonic: hip achieve device country identify gun drive nest danger run outside window
Base HD Path: m/44'/60'/0'/0/{account_index}
Gas Price
==================
20000000000
Gas Limit
==================
6721975
Listening on 127.0.0.1:8545
可以看到默参运行会直接创建10个钱包账户,初始化一些以太币,并且有非常多的Gas和足够的Gas Limit,通常来说也足够运行智能合约的测试了。
更多可用参数可以参考ganache-cli --help
的输出,可能比较有用的是持久化钱包(--db
参数)和监听0.0.0.0
(--host
参数),以便组建以太坊Testnets。比如这样:
# 在某一台主机(我这里是192.168.31.100)上运行
$ mkdir -p ganache_db # 数据库目录必须事先创建,否则程序运行报错
$ ganache-cli -h 0.0.0.0 --db ganache_db/
....
HD Wallet
==================
Mnemonic: crucial peanut biology duck casino safe laugh crowd over enrich crane turkey
Base HD Path: m/44'/60'/0'/0/{account_index}
Gas Price
==================
20000000000
Gas Limit
==================
6721975
Listening on 0.0.0.0:8545
我们以某一台主机为master,监听0.0.0.0
,运行ganache-cli
,其他参数全都默认。在另一台主机再启动一个ganache-cli
,指明从master节点上进行fork:
$ mkdir -p ganache_db
$ ganache-cli -h 0.0.0.0 -f http://192.168.31.100:8545 --db ganache_db/
...
Gas Price
==================
20000000000
Gas Limit
==================
6721975
Forked Chain
==================
Location: http://192.168.31.100:8545
Block: 0
Network ID: 1531668183776
Time: Mon Jul 16 2018 00:25:09 GMT+0900
Listening on 0.0.0.0:8546
最后出现了Forked Chain
字样,这样就可以在多个节点上部署区块链,模拟区块链的网络环境。
启动模拟环境之后,使用metamask就可以连接到测试网络上,测试交易了,可以参考官方文档进行操作: https://truffleframework.com/docs/advanced/truffle-with-metamask
大概的步骤如下:
启动ganache-cli之后,在终端输出可以看到类似于这样的字样:
HD Wallet
==================
Mnemonic: hard verb crunch rare direct universe mean gold claw need neutral carry
Base HD Path: m/44'/60'/0'/0/{account_index}
按照metamask网站的链接,安装chrome或firefox插件之后,打开插件图标,经过一系列的Accept操作之后,进入页面,选择Localhost 8545
(如果修改过默认监听端口,那么请使用最后的Custom RPC):
然后选择Import Existing DEN
(因为ganache-cli已经帮我们初始化好了账户,不用自己重新创建了)。在弹出界面中钱包种子填入终端上的Menmonic
,初始化密码自己填一个,满足8位即可:
之后就可以看到简单的钱包账户界面了:
通过Import Account
功能就可以导入其他创建好的账户了:
同样账户的私钥已经打印到终端上了,直接用就可以了。