問題
當我運作
truffle test
的時候,有點驚訝地發現測試過程裡并不需要啟動ganache-cli指令行程式。翻看了truffleframework的文檔也是含糊其辭,倒是處處暗示必須使用Ganache或者
Truffle Develop
作為測試的運作時。
是以我開始動手做試驗。
試驗
先去測試檔案xxContractTest.js中使用
console.log(accounts)
列印輸出accounts。重複運作測試後,結果始終是一緻,如下:
[ '0x627306090abaB3A6e1400e9345bC60c78a8BEf57',
'0xf17f52151EbEF6C7334FAD080c5704D77216b732',
'0xC5fdf4076b8F3A5357c5E395ab970B5B54098Fef',
'0x821aEa9a577a9b44299B9c15c88cf3087F3b5544',
'0x0d1d4e623D10F9FBA5Db95830F7d3839406C6AF2',
'0x2932b7A2355D6fecc4b5c0B6BD44cC31df247a2e',
'0x2191eF87E392377ec08E7c08Eb105Ef5448eCED5',
'0x0F4F2Ac550A1b4e2280d04c21cEa7EBD822934b5',
'0x6330A553Fc93768F612722BB8c2eC78aC90B3bbc',
'0x5AEDA56215b167893e80B4fE645BA6d5Bab767DE' ]
複制
而且測試中列印出了運作時的網絡始終是test,如下:
$ truffle test
Using network 'test'
複制
我對這個網絡比較困惑,原因是該項目的配置檔案
truffle.js
并沒有聲明名稱為test的網絡。是以我需要更多的資訊,通過幫助指令
./node_modules/.bin/truffle help test
,得知了一下可選參數:
Usage: truffle test [<test_file>] [--compile-all] [--network <name>] [--verbose-rpc] [--show-events]
Description: Run JavaScript and Solidity tests
Options:
<test_file>
Name of the test file to be run. Can include path information if the file does not exist in the
current directory.
--compile-all
Compile all contracts instead of intelligently choosing which contracts need to be compiled.
--network <name>
Specify the network to use, using artifacts specific to that network. Network name must exist
in the configuration.
--verbose-rpc
Log communication between Truffle and the Ethereum client.
--show-events
Log all contract events.
複制
其中
--network <name>
引起了我的注意。我開始試驗不同網絡,比如:
truffle test --network develop
,結果有點意外:
Using network 'develop'.
Contract: xxContract
[ '0x627306090abaB3A6e1400e9345bC60c78a8BEf57',
'0xf17f52151EbEF6C7334FAD080c5704D77216b732',
'0xC5fdf4076b8F3A5357c5E395ab970B5B54098Fef',
'0x821aEa9a577a9b44299B9c15c88cf3087F3b5544',
'0x0d1d4e623D10F9FBA5Db95830F7d3839406C6AF2',
'0x2932b7A2355D6fecc4b5c0B6BD44cC31df247a2e',
'0x2191eF87E392377ec08E7c08Eb105Ef5448eCED5',
'0x0F4F2Ac550A1b4e2280d04c21cEa7EBD822934b5',
'0x6330A553Fc93768F612722BB8c2eC78aC90B3bbc',
'0x5AEDA56215b167893e80B4fE645BA6d5Bab767DE' ]
複制
前後對比,不難發現,兩次輸出的賬戶是一緻的。我稍微思考了一下,覺得是這可能是
truffle test
的fallback機制,因為配置檔案
truffle.js
确實沒有任何設定develop的網絡。
供開發測試用的是local網絡,配置如下,是以我重新針對該網絡運作測試。
local: {
host: '127.0.0.1',
port: 8545,
network_id: '*'
}
$ truffle test --network local
複制
此時運作出錯,錯誤是連接配接不上Ethereum Client,這是符合期望的行為。
Could not connect to your Ethereum client with the following parameters:
- host > 127.0.0.1
- port > 8545
- network_id > *
Please check that your Ethereum client:
- is running
- is accepting RPC connections (i.e., "--rpc" option is used in geth)
- is accessible over the network
- is properly configured in your Truffle configuration file (truffle-config.js)
Truffle v5.0.5 (core: 5.0.5)
Node v10.15.3
複制
那麼,究竟Truffle test的fallback機制是怎樣的呢?我們需要去源碼中尋找答案。
解釋
Truffle的指令組織,結構比較簡單,可以快速定位到檔案,如:trufflesuite/truffle/packages/truffle-core/lib/commands/test.js。其fallback機制集中在run方法中。
if (config.networks[config.network]) {
Environment.detect(config, environmentCallback);
} else {
var ipcOptions = {
network: "test"
};
var ganacheOptions = {
host: "127.0.0.1",
port: 7545,
network_id: 4447,
mnemonic:
"candy maple cake sugar pudding cream honey rich smooth crumble sweet treat",
gasLimit: config.gas,
noVMErrorsOnRPCResponse: true
};
Develop.connectOrStart(ipcOptions, ganacheOptions, function(
started,
disconnect
) {
ipcDisconnect = disconnect;
Environment.develop(config, ganacheOptions, environmentCallback);
});
}
});
複制
Develop.connectOrStart(...)
方法其實和執行
truffle develop
是相同的操作。是以不難知道,
truffle test
是通過
truffle develop
啟動新的節點,然後設定了一系列可用的accounts。
為了進一步驗證材料,可以驗證下助記詞
candy maple cake sugar pudding cream honey rich smooth crumble sweet treat
是否會産生上述的十個賬号位址。
驗證的方式很簡單,拷貝助記詞黏貼到線上bip39網站裡,選擇ETH-Ethereum作為Coin,然後觀察輸出的位址,确認确實符合期望。
bip39
address
2019-04-02