Solidity
如何在契約中驗證 ERC-20 付款?
我正在編寫一個智能合約,只要請求該功能的使用者支付了正確的金額,它就會做一些事情。如果金額以 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 代幣轉移都發生在特定代幣的合約內(而不是在我的智能合約的方法內),我的合約如何知道或驗證這一點:
- 已轉移正確的金額。
- 金額是從地址 A 轉出的。
- 金額已轉至地址 B。
其中 A 是我的智能合約,B 是使用者。
一些 ERC20 代幣具有
approve
和transferFrom
功能。在這些情況下,您可以讓使用者approve
在您的合約中添加一些代幣。然後,他們可以在您的合約中呼叫一個函式,該函式將呼叫transferFrom
令牌合約。這要求使用者至少執行兩項交易:一項呼叫
approve
代幣合約,另一項呼叫合約中的函式,該函式又將呼叫transferFrom
代幣合約。如果 ERC20 代幣沒有
approve
和transferFrom
,你需要一個單獨的伺服器來監聽區塊鏈並呼叫你的合約。在我看來,ERC20 的想法很糟糕,它並不是為處理這種情況而設計的。這就是為什麼還有其他代幣標準,例如 ERC223:https ://github.com/Dexaran/ERC223-token-standard
如果 ERC223 代幣被轉移到您的合約中,代幣合約將呼叫
tokenFallback
您合約中的函式。這使得轉移、驗證和您的合約邏輯可以在 1 筆交易中發生。