天天看點

以太坊中ERC20交易的檢測

    開發中遇到了token交易的檢測問題,之前的做法是依靠交易中的input字段,如果有支援erc20标準的token交易,則input字段必然會有transfer函數的消息;如下圖;根據input字段判斷之後,在擷取交易的Receipt,根據log字段進行進一步解析。後來發現這麼搞會有問題,會遺漏erc20的交易。

以太坊中ERC20交易的檢測

    為什麼會有遺漏呢,主要是因為建構交易的時候,to位址是一個合約,而且這個合約不是erc20的合約,而是一個普通合約,這個合約位址會去調用erc20的合約;這用導緻input字段的函數不是transfer了,而是普通合約的函數,如下圖;

以太坊中ERC20交易的檢測

    那應該如何檢測erc20标準的token交易呢,根據erc20标準可知,有交易發生必然會觸發Transfer事件,是以,我們去監測transfer事件,如何監測呢,這個在receipt的logs中,topics[0]都是事件的keccka的hash結果;topics[1]topics[2]分别是from和to;address是合約位址;data是交易額;rre

以太坊中ERC20交易的檢測

    最後記錄一下erc20的标準吧;

以太坊的出現使得大家可以很友善的以太坊上發行自己的代币,這些代币都遵循ERC20協定(現已有ERC23協定)。智能合約程式設計支援合約的繼承(類似面向對象語言中類的繼承和接口的實作),是以ERC20協定可以定義為一個接口。 

contract ERC20 {

        function totalSupply() constant returns (uint totalSupply);         //擷取總的發行量

        function balanceOf(address _owner) constant returns (uint balance); //查詢賬戶餘額

        function transfer(address _to, uint _value)returns(bool success); // 發送Token到某個位址(轉賬)

        function transferFrom(address _from, address _to, uint _value) returns (bool success); //從位址from 發送token到to位址

        function approve(address _spender, uint _value)returns(bool success);//允許_spender從你的賬戶轉出token

        function allowance(address _owner, address _spender) constant returns (uint remaining);//查詢允許spender轉移的Token數量

        event Transfer(address indexed _from, address indexed _to, uint _value);//transfer方法調用時的通知事件

        event Approval(address indexed _owner, address indexed _spender, uint _value); //approve方法調用時的通知事件

}

以太坊中ERC20交易的檢測

繼續閱讀