Solidity

如何在契約中驗證 ERC-20 付款?

  • July 5, 2018

我正在編寫一個智能合約,只要請求該功能的使用者支付了正確的金額,它就會做一些事情。如果金額以 ETH 為單位,我可以使用如下簡單的 require 語句輕鬆做到這一點:

function doSomething() public payable {
   require(msg.value == 1 ether);  // make sure they paid
   // if they paid, proceed with the action
}

但是,如果我想接受其他 ERC-20 代幣而不是 ETH,我不確定我將如何在我的合約中做到這一點(即,無需執行我自己的單獨伺服器來監聽區塊鏈並梳理個別交易)。

由於所有 ERC-20 代幣轉移都發生在特定代幣的合約內(而不是在我的智能合約的方法內),我的合約如何知道或驗證這一點:

  1. 已轉移正確的金額。
  2. 金額是從地址 A 轉出的。
  3. 金額已轉至地址 B。

其中 A 是我的智能合約,B 是使用者。

一些 ERC20 代幣具有approvetransferFrom功能。在這些情況下,您可以讓使用者approve在您的合約中添加一些代幣。然後,他們可以在您的合約中呼叫一個函式,該函式將呼叫transferFrom令牌合約。

這要求使用者至少執行兩項交易:一項呼叫approve代幣合約,另一項呼叫合約中的函式,該函式又將呼叫transferFrom代幣合約。

如果 ERC20 代幣沒有approvetransferFrom,你需要一個單獨的伺服器來監聽區塊鏈並呼叫你的合約。

在我看來,ERC20 的想法很糟糕,它並不是為處理這種情況而設計的。這就是為什麼還有其他代幣標準,例如 ERC223:https ://github.com/Dexaran/ERC223-token-standard

如果 ERC223 代幣被轉移到您的合約中,代幣合約將呼叫tokenFallback您合約中的函式。這使得轉移、驗證和您的合約邏輯可以在 1 筆交易中發生。

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