Solidity
將智能合約功能限制為只能從特定智能合約呼叫?
我有 2 個智能合約:
A
&B
。B
有一個onlyA()
我想要的只能A
呼叫的函式。以下是我的方法:
- 使 B Ownable,然後將
onlyOwner()
修飾符添加到onlyA()
.- 添加 in 的介面,
B
以便A
可以從 sayA
呼叫函式。onlyA()``callMe()
- 部署後轉移
B
to的所有權。A
- 現在,使用者可以呼叫
callMe()
.我的案例:
我正在建構一個協議智能合約 (
A
),它有一個 NFT 合約 (B
) 連結到它。我不希望任何人直接從中鑄造 NFTB
,而只能通過呼叫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。喜歡