使用 web3.js 接受 ERC20 代幣支付
我在交易網站上接受乙太坊和比特幣付款,並將使用者餘額保存在數據庫中。如果可能的話,我也希望能夠接收 ERC20 代幣(如 Bancor)。我沒有創建新的代幣合約,只是想接受它們作為付款。
作為網路上 90% 的答案,他們建議使用 web3.js 進行投票
filter
事件。Transfer(address,address,uint256)
如果我錯了,請糾正我,但是我將如何從該事件中獲得該付款的相應 TX?我對乙太坊和智能合約沒有深入的了解。
在查看來自 web3 的事件時,這是呼叫事件時獲得的結果格式:
{ address: '0x9c0ac1e0f0a8e0b01c7b652d5fbe094ddff48b81', blockNumber: 704227, transactionHash: '0x5887ba4e15d51e1cfddf626ecf416a0002085a1e0929fffe1f90ad69d5040081', transactionIndex: 0, blockHash: '0x5f485133ec662f556d88affccc18a358375de160178c6cf7cc0cec678d833a2a', logIndex: 0, removed: false, event: 'ExampleEvent', args: { argOne: BigNumber { s: 1, e: 0, c: [Array] }, argTwo: '0x374623456fa2' } }
所以你可以從 result.transactionHash 中獲取 TX
契約事件:
event ExampleEvent(uint argOne, bytes32 argTwo)
Web3 程式碼:
import exampleContractObject from 'path/to/ExampleContract.json' ExampleContract = web3.eth.contract(exampleContractObject.abi); contractInstance = ExampleContract.at('0x9c0ac1e0f0a8e0b01c7b652d5fbe094ddff48b81'); exampleEvent = contractInstance.ExampleEvent(); exampleEvent.watch((err, result) => { // Do something }
編輯:
ERC20 代幣的轉移事件如下所示:
{ address: '<contract_address>', blockNumber: <block_number>, transactionHash: '<transaction_hash>', transactionIndex: <tx_index_in_block, blockHash: '<block_hash>', logIndex: <log_index>, removed: <> , event: 'Transfer', args: { _from: <address>, _two: <address> , _value: <uint256>} }
要接受代幣作為付款,您只需要一個乙太坊帳戶。令牌可以發送到任何地址。要接收它們,擁有代幣的人只需在網路上的交易中發送它們。我假設部署合約來鑄造代幣的人可能還創建了一個前端使用者界面,用於訪問其代幣合約中的 transferTo() 函式。
所以基本上如果你想接受代幣作為付款,你所要做的就是發布你的乙太坊地址,它們就可以被發送。如果你想檢查你有多少代幣,你可以使用 etherscan.io,或者你可以在 Solidity 中編寫一些程式碼來檢查餘額。如果代幣符合 ERC20 標準,它將在合約中具有您應該能夠訪問的功能,該功能將顯示任何給定地址的代幣。要訪問該功能,您將需要部署它的團隊的契約 ABI,然後編寫一些 Solidity 程式碼。
如果您只對接受代幣支付感興趣,那麼擁有代幣的人只需將它們通過交易發送到您的帳戶,您就會收到它們。
過濾的東西是如果你試圖觀察區塊鏈的任何代幣轉移並在你的本地機器上保持平衡,或者使用 Metamask 或其他東西。如果您想將這些餘額保存在本地數據庫中,您可能需要編寫一些 Solidity 程式碼,然後獲取合約地址和 ABI 以便訪問它。
乾杯