Solidity

介面中列出的功能是否必須與契約中的功能完全相同?

  • December 23, 2020

在solidity 0.7.x 中,我在契約中創建了一個interface契約AB以允許契約中的契約B呼叫功能A

contract A {
 function transfer(address recipient, uint256 amount) public override returns (bool) {
       //definition goes here
   }
}

在契約B中,介面是:

interface A {
   function transfer(address recipient, uint256 amount) external returns (bool) //changed public to external and removed override
}

這個介面的定義正確嗎?我曾經將函式定義複製並粘貼到interface. 但是,有一些錯誤要求刪除overrideexternal改為使用。我不太明白是什麼導致了錯誤。

列出的功能是否必須完全相同。

不,界面必須相同,而不是功能相同。您遇到了細微的差別。將介面視為從功能設計中出現的東西可能會有所幫助,但它肯定不是唯一的東西,因為有程式碼。這不能反過來工作。無法從介面推斷出完整的功能。函式定義中有一些在介面描述中不需要的東西。因此,從函式開始時,請使用減法過程刪除不需要描述介面的所有內容。

改用外部

對。根據定義,介面是外部的,因此這顯然是介面描述的一部分。public執行其他內部操作,例如使其對繼承契約的契約可訪問和可寫。這些內部問題與界面無關,因此public不屬於那裡。

在實現合約中,public確實會產生一個external功能作為一籃子功能的一個組成部分。因此,external對實現級public函式將生成的介面的正確描述是正確的。

要求刪除覆蓋

另一個內部問題。它告訴編譯器“我知道”該函式簽名與已經看到的另一個函式相同。這對於介面的描述並不重要。

自定義修飾符

您還會發現自定義修飾符不屬於。例如,onlyOwner選取在函式內執行但該程式碼與 ABI 無關的程式碼,因此您需要從介面描述中去除類似的修飾符。

純粹的、查看的、應付的

這些編譯器級別的“修飾符”在介面描述中很重要,因此它們保留了下來。

使困惑?

作為一般的啟發式方法,不會出現在表面區域的 ABI 描述中的任何interface {內容對於相同區域的描述都是重要的。因此,如果它影響 ABI,它會保留,以最簡單的可描述方式 ( external, payable, view) 並且如果它是內部的 ( onlyOwner) 將其刪除。

核實

編譯器提供了一個簡單的方法來確認介面是否正確組合。你應該使用它。

contract A is AInterface {

如果介面中有沒有在合約中實現的功能,合約將不會部署。您可以將其解釋為不匹配。

希望能幫助到你。

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