Solidity
如何在 Mist 中分別編譯相互依賴的合約?
我正在處理這個 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
為編譯器會關心的所有內容。