Truffle

部署多個具有依賴關係的松露合約

  • May 28, 2021

假設我想遷移 2 個相互依賴的契約。這可以通過

var contract1 = artifacts.require("contract1");
var contract2 = artifacts.require("contract2");

module.exports = function(deployer) {
 deployer.deploy(contract1).then(function(){
       return deployer.deploy(contract2, contract1.address)
});
};

但是,如果我嘗試使用以下程式碼嵌套第三個契約,該契約依賴於前兩個契約:

var contract1 = artifacts.require("contract1");
var contract2 = artifacts.require("contract2");
var contract3 = artifacts.require("contract3");

module.exports = function(deployer) {
 deployer.deploy(contract1).then(function(){
       deployer.deploy(contract1, contract2.address).then(function(){
       return deployer.deploy(contract3, contract1.address, contract2.address)
       })
})};

然後truffle deploy在這個遷移文件上執行只部署第一個合約,而不是剩下的兩個。部署 3 個甚至最多 n 個合約的正確語法是什麼?有比這種醜陋的嵌套更好的方法嗎?

另一個問題,比如說需要為契約 3 計算一個額外的參數,那麼正確的語法是什麼?例如。我想做類似的事情

var contract1 = artifacts.require("contract1");
var contract2 = artifacts.require("contract2");
var contract3 = artifacts.require("contract3");
var someSol = artifacts.require("someSol.sol");

module.exports = function(deployer) {
 deployer.deploy(contract1).then(function(){
       deployer.deploy(contract1, contract2.address).then(function(){

       const someAddress = await someSol.foo(contract1.address, contract2.address);
       return deployer.deploy(contract3, contract1.address, contract2.address, someAddress)
       })
})};

非常感謝任何幫助

這是一個 JavaScript 問題。

更簡單的是使用 async/await 模式。這樣你就不需要嵌套承諾。

所以它可能看起來像這樣:

module.exports = function(deployer, network, accounts) {
   deployer.then(async () => {
       await deployer.deploy(A);
       await deployer.deploy(B, A.address);
       //...
   });
};

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