Erc-20

授予合約使用 eth 的許可

  • September 15, 2022

既然 eth 沒有合約地址,那怎麼讓合約消費呢。例如 - 我提出了一個交換請求 - 例如,其金額為 10 eth,以美元計 - 合約可以花掉我的全部餘額(如果是惡意的)嗎?

預設情況下,您不能允許智能合約花費您的 ETH,但可以實施錢包智能合約,允許其他智能合約使用代表您持有的 ETH,如果您授予他們足夠的配額。這是一個可能看起來像的範例:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;

contract Wallet {
   // balances[owner]
   mapping(address => uint256) public balances;

   // allowances[owner][spender]
   mapping(address => mapping(address => uint256)) public allowances;

   function approve(address spender, uint256 amount) external  {
       allowances[msg.sender][spender] = amount;
   }

   function transferFrom(address from, address to, uint256 amount) external {
       assert(allowances[from][msg.sender] >= amount);
       allowances[from][msg.sender] -= amount;
       balances[from] -= amount;
       balances[to] += amount;

   }

   function withdraw(uint256 amount) external  {
       payable(msg.sender).transfer(amount);
   }

   receive() external payable {
       balances[msg.sender] += msg.value;
   }
}

我的契約不能花掉你所有的餘額,只有你發送給它的餘額。

如果你的錢包裡有 100 個 eth,你用 10 個 eth 創建了一個交易並簽署並發送給合約,那麼合約將只能花費這 10 個不再屬於你的 eth。合約將無法花費您剩餘的 90 eth,這是不可能的。只有持有您私鑰的人才能使用它。

如果你想讓一個合約花費你的 eth 數量,那麼你需要創建一個智能合約作為中間人,接收你的 eth(你發送的金額),它應該檢查sender請求是否這是您允許使用它的契約。

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