Solidity

將智能合約功能限制為只能從特定智能合約呼叫?

  • October 22, 2022

我有 2 個智能合約:A& BB有一個onlyA()我想要的只能 A呼叫的函式。以下是我的方法:

  • 使 B Ownable,然後將onlyOwner()修飾符添加到onlyA().
  • 添加 in 的介面,B以便A可以從 sayA呼叫函式。onlyA()``callMe()
  • 部署後轉移Bto的所有權。A
  • 現在,使用者可以呼叫callMe().

我的案例:

我正在建構一個協議智能合約 ( A),它有一個 NFT 合約 ( B) 連結到它。我不希望任何人直接從中鑄造 NFT B,而只能通過呼叫mintNFT()協議智能合約 ( A) 中的一個函式onlyA()來呼叫B內部鑄造 NFT 的函式。

Protocol.mintNFT() -> NFT.onlyA() -> ERC721._mint()

所以我正在考慮使用我列出的上述方法。但是我必須將我的 NFT 智能合約的介面添加到我不想做的協議合約中。在我看來,這就像一種反模式。添加這樣的介面被認為是不好的做法?

對於與上面列出的方法不同的方法的任何建議,我將不勝感激。此外,也歡迎對我的協議智能合約的整體重新設計提出任何建議。

更新:

由於這兩個合約是同一個項目的一部分,我也想知道在協議合約中簡單地導入 NFT 合約而不是定義 NFT 介面。哪一個是更好的方法,明智的氣體和 Solidity 最佳實踐?

使 B 可擁有,然後將 onlyOwner() 修飾符添加到 onlyA()。

您可以創建一個新的修飾符來限制函式,以便只有 A 可以呼叫它,並在 B 的建構子中傳遞 A 的地址,無需使用 ownable。喜歡

contract B {
address addressA;

modifier onlyACanCall() {
   require(msg.sender == addressA);
}
constructor(address _A) {
   addressA = _A;
}
function onlyA() external onlyACanCall {
   // ... 
}
}

但是我必須將我的 NFT 智能合約的介面添加到我不想做的協議合約中

這在智能合約中極為常見,為什麼要避免呢?

使 B 可擁有,然後將 onlyOwner() 修飾符添加到 onlyA()。

您可以創建一個新的修飾符來限制函式,以便只有 A 可以呼叫它,並在 B 的建構子中傳遞 A 的地址,無需使用 ownable。喜歡

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