在我的服務中接受 ERC20 代幣的最佳方式
我需要允許使用者在我的服務中存入和提取 ERC20 代幣,我想知道實現它的最佳方式是什麼。我的想法是為每個使用者生成一個賬戶,當使用者存款時,將該存款轉發到具有合併餘額的主賬戶。當使用者需要提款時,金額從主賬戶發送。
- 這是儲存 ERC20 代幣的最佳方法嗎?
- 如何在不呼叫代幣合約的情況下檢測使用者存款 (即不消耗gas)?我不介意掃描區塊鏈以查看是否有存款,但我不確定如何檢測它們。
謝謝
我的想法是……當使用者存款時,將該存款轉發到具有合併餘額的主賬戶。
使用此模型,您將自己設置為交易所;你的使用者沒有儲存所有代幣的“熱錢包”的私鑰,你有。然後,您最好擁有非常徹底的安全措施,以確保您為他們持有的這些資金的安全。
如何在不消耗氣體的情況下檢測使用者存款?
使用該
web3.js
實用程序,呼叫web3.eth.call()
命令會呼叫智能合約上的方法,而無需使用 gas。只有不更新區塊鏈狀態的方法才能以這種方式使用(其他方法需要呼叫web3.eth.sendTransaction()
和使用氣體;相關問題)。因此,您可以手動查詢智能合約以告知該代幣給定地址的目前餘額。
為了實時檢測代幣的移動,當它們發生時,ERC20 代幣都會在代幣移動時發出一個
Transfer
事件。使用 web3.js 的過濾選項,您可以只查詢這些事件並在它們發生時獲得回調因此,至於“這是正確的方法嗎”,這取決於您實際使用您網站上的這些令牌做什麼。如果您的使用者以某種代幣向您付款以換取您在您的網站上提供的某些服務(他們正在失去代幣的所有權,而網站正在獲得它們),還有一些額外的選項讓他們“付費”輸入令牌並將其取出,那麼處理此問題的最佳方法是讓您的站點向傳入使用者提供一個(新)接收地址,您的站點具有該地址的私鑰。指示使用者使用
approve()
代幣合約上的方法,允許接收地址為他們轉移部分資金。當他們表明已經完成時,呼叫該allowance()
函式來驗證這是真的。然後您的網站可以呼叫transfer()
將使用者的代幣轉移到自身的功能(將花費您一點燃料)。但是,如果您想使用給定的令牌作為您網站上的成員資格證明(令牌充當公司的股份;使用者保留他們的所有權,而您只是在跟踪誰是已知成員) ,那麼您的網站只需要從傳入使用者那裡收集地址資訊(要求他們從他們的帳戶中籤署一條消息),並使用該
balanceOf()
功能來檢查他們擁有多少給定令牌。