如何實現安全性以只允許我的 dApp 與我的智能合約互動?
我正在開發一個基於登錄的元遮罩使用者獲取 json 資訊的 dApp。該資訊將傳遞給我的合約,以允許 mint 函式根據該值執行。
因此,例如,如果 info 值為 30,則將其發送到 mint 函式並基於數字 30,它以某種方式執行 mint 函式。-
function mint(uint256 amount, uint256 variable) public payable { }
我的問題是關於安全的。我怎樣才能防止人們使用他們自己的 dApp 等,用他們自己的變數來執行我的 mint 函式?
問題是變數很重要並且需要,所以我不希望其他人以某種方式將他們自己的變數傳遞給 mint 函式。我知道他們可以直接從 etherscan 進行鑄幣,但如果沒有我的 dApp,該變數基本上將為空,沒有它他們將無法鑄幣。
如何保護我的智能合約功能不被我自己以外的任何其他 dApp 或 js 項目使用?我希望其他人能夠在我的 dApp 上進行鑄幣,因此使用我的私鑰似乎不是正確的選擇。可能喜歡檢查智能合約中呼叫的 url?
編輯: 進一步澄清 - 我正在尋找一種方法讓我的契約可以檢查函式呼叫的來源。如果它不是來自我的網站,那麼它應該會失敗。我在想密碼學/簽名之類的東西?類似於鏈下白名單?是否可以使用從 dApp 發送到智能合約的散列或加密來控制對該函式的訪問,從而消除直接從 etherscan 使用該函式的能力?
理論上的例子——
struct verifyOrigin { bytes32 r; bytes32 s; uint8 v; } enum verifyType { Sig } bytes32 digest = keccak256( abi.encode(verifyType.Verified, msg.sender) ); require( _isVerified(digest, verifyOrigin), 'Invalid' );
如果你將你的函式聲明為 public,那麼任何人都可以使用你的 mint 函式。如果你想阻止其他使用者,那麼你可以在你的函式中使用修飾符。
試試這個 :
address owner ; mapping(address=>bool) private _mintable; constructor(){ owner = msg.sender; } modifier onlyOwner { require(msg.sender == owner); _; } function allowUser(address _user) public onlyOwner{ _mintable[_user] = true; } function mint(uint256 amount, uint256 variable) public payable { require(_mintable[msg.sender] == true , "You aren't allow to mint."); }
OpenZeppelin 對此具有出色的功能: https ://docs.openzeppelin.com/contracts/4.x/access-control#role-based-access-control
基於角色的訪問控制允許您定義角色,例如。普通使用者、主管或經理等。
bytes32 public constant BASIC_ROLE = keccak256("BASIC_ROLE"); bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE");
然後,您可以定義僅對某些角色可用的函式:
function mint(address to, uint256 amount) public onlyRole(ADMIN_ROLE) { _mint(to, amount); }
或者,您也可以使用函式中的
require
語句或if
條件來根據使用者所屬的組更改行為。授予和撤銷角色很簡單:
grantRole(BASIC_ROLE, msg.sender); renounceRole(BASIC_ROLE, msg.sender);