Truffle-Migration

無需連結即可部署松露

  • December 11, 2018

我正在部署兩個契約,其中一個依賴於另一個契約,而且它們通過 import 語句依賴於許多其他契約。但是,儘管在我的部署腳本中我沒有包含任何link語句,但我的所有測試都通過了。

為什麼它在沒有連結的情況下工作,我應該在部署到實時網路之前添加連結語句嗎?

這是我的 .sol 文件中的內容:

pragma solidity ^0.4.18;
import '../node_modules/zeppelin-solidity/contracts/token/StandardToken.sol';
import '../node_modules/zeppelin-solidity/contracts/math/Math.sol';
import '../node_modules/zeppelin-solidity/contracts/math/SafeMath.sol';
import '../node_modules/zeppelin-solidity/contracts/ownership/Ownable.sol';

contract NppToken is StandardToken, Ownable {...}

contract CrowdSale is Ownable {
 NppToken private token;
...
}

這是我的遷移文件:

var NppToken = artifacts.require("./NppToken.sol");
var CrowdSale = artifacts.require("./CrowdSale.sol");

module.exports = function(deployer, network, accounts) {
 deployer.deploy(NppToken);
 deployer.deploy(CrowdSale, NppToken.address);
};

你的契約繼承是什麼樣的?Link 用於連結已部署在網路上的庫,請參見此處。但是,如果您沒有連結庫,而只是繼承了類似的東西SafeMath.solOwnable.sol那麼這就是為什麼您可以使用它們的程式碼並且您的測試正在通過的原因。

呼叫聲明為 的庫函式internal,例如上面的那些,SafeMath不需要Math呼叫合約連結到庫合約,因為它們將在編譯期間被複製到呼叫合約的字節碼中。

呼叫聲明為publicexternal將要求呼叫合約連結到庫合約的呼叫庫函式,deployer.link()在 Truffle 中使用,因為它們不會被複製到呼叫合約中。他們將生活在一個單獨的圖書館契約中。

注意我沒有在private這裡討論函式,因為它們不能從另一個合約中呼叫。

最終,對於您的程式碼,無需為實時部署添加連結語句。請注意,對於在 Truffle 中連結的所有方法,testrpc 和 live nets 的部署腳本應該是相同的。

有關更多資訊,請參閱有關庫的 Solidity 文件

引用自:https://ethereum.stackexchange.com/questions/37200