介面中列出的功能是否必須與契約中的功能完全相同?
在solidity 0.7.x 中,我在契約中創建了一個
interface
契約A
,B
以允許契約中的契約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
. 但是,有一些錯誤要求刪除override
並external
改為使用。我不太明白是什麼導致了錯誤。
列出的功能是否必須完全相同。
不,界面必須相同,而不是功能相同。您遇到了細微的差別。將介面視為從功能設計中出現的東西可能會有所幫助,但它肯定不是唯一的東西,因為有程式碼。這不能反過來工作。無法從介面推斷出完整的功能。函式定義中有一些在介面描述中不需要的東西。因此,從函式開始時,請使用減法過程刪除不需要描述介面的所有內容。
改用外部
對。根據定義,介面是外部的,因此這顯然是介面描述的一部分。
public
執行其他內部操作,例如使其對繼承契約的契約可訪問和可寫。這些內部問題與界面無關,因此public
不屬於那裡。在實現合約中,
public
確實會產生一個external
功能作為一籃子功能的一個組成部分。因此,external
對實現級public
函式將生成的介面的正確描述是正確的。要求刪除覆蓋
另一個內部問題。它告訴編譯器“我知道”該函式簽名與已經看到的另一個函式相同。這對於介面的描述並不重要。
自定義修飾符
您還會發現自定義修飾符不屬於。例如,
onlyOwner
選取在函式內執行但該程式碼與 ABI 無關的程式碼,因此您需要從介面描述中去除類似的修飾符。純粹的、查看的、應付的
這些編譯器級別的“修飾符”在介面描述中很重要,因此它們保留了下來。
使困惑?
作為一般的啟發式方法,不會出現在表面區域的 ABI 描述中的任何
interface {
內容對於相同區域的描述都是重要的。因此,如果它影響 ABI,它會保留,以最簡單的可描述方式 (external
,payable
,view
) 並且如果它是內部的 (onlyOwner
) 將其刪除。核實
編譯器提供了一個簡單的方法來確認介面是否正確組合。你應該使用它。
contract A is AInterface {
如果介面中有沒有在合約中實現的功能,合約將不會部署。您可以將其解釋為不匹配。
希望能幫助到你。