Contract-Development

如何實現安全性以只允許我的 dApp 與我的智能合約互動?

  • March 3, 2022

我正在開發一個基於登錄的元遮罩使用者獲取 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);

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