Solidity

如何在 Mist 中分別編譯相互依賴的合約?

  • December 7, 2016

我正在處理這個 Solidity 範例,使用 geth 控制台和/或 Mist 的編譯器:

contract InfoFeed {
   function info() payable returns (uint ret) { return 42; }
}

contract Consumer {
 InfoFeed feed;
 function setFeed(address addr) { feed = InfoFeed(addr); }
 function callFeed() { attribut = feed.info.value(10).gas(800); }  
}

如果,在 Mist 編譯器中,我只包括:

contract Consumer {
 InfoFeed feed;
 function setFeed(address addr) { feed = InfoFeed(addr); }
 function callFeed() { attribut = feed.info.value(10).gas(800); }  
}

例如,如果我要依賴其他人(有)提供(d)InfoFeed的程式碼,這將是有道理的,我得到以下編譯錯誤消息:

Identifier not found or not unique.
 InfoFeed feed;
 ^------^

**請問如何單獨編譯*消費者?***我查看的教程包含相互依賴的合約的程式碼位,但沒有告訴我如何編譯它們。

一些工具在連結儲存在不同文件中的合約方面很聰明,但是當它呼叫其他人的合約時,你只需要編譯你想要呼叫的合約的函式定義(函式名、參數、返回值)即可。您必須已經知道這些資訊,否則您將不知道如何編寫程式碼來呼叫它。最簡單的事情就是將其粘貼在定義呼叫合約的文件頂部。

所以在這裡你可以這樣做:

contract InfoFeed {
   function info() payable returns (uint ret) { }
}

contract Consumer {
 InfoFeed feed;
 function setFeed(address addr) { feed = InfoFeed(addr); }
 function callFeed() { attribut = feed.info.value(10).gas(800)(); }  
}

請注意,我return 42;取消了該info()功能。編譯器不需要這些資訊來編譯Consumer。它也不需要您不會呼叫的函式的任何定義。

您呼叫的契約名稱也無關緊要。有些人喜歡將這些存根合約重命名為InfoFeedAPI,但您可以將其命名Bob為編譯器會關心的所有內容。

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