Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

以太坊中ERC20交易的检测

李悔之2015
208 0 0
开发中遇到了token交易的检测问题,之前的做法是依靠交易中的input字段,如果有支持erc20标准的token交易,则input字段必然会有transfer函数的消息;如下图;根据input字段判断之后,在获取交易的Receipt,根据log字段进行进一步解析。后来发现这么搞会有问题,会遗漏erc20的交易。
' Y0 n3 z/ ^) r* P- C' }6 V6 Q; Y$ L3 g" ]; s8 R, c7 D$ @' B
    为什么会有遗漏呢,主要是因为构建交易的时候,to地址是一个合约,而且这个合约不是erc20的合约,而是一个普通合约,这个合约地址会去调用erc20的合约;这用导致input字段的函数不是transfer了,而是普通合约的函数,如下图;7 |  q3 [/ t  E  Z' w' x/ B

0 I% U* t) _9 h    那应该如何检测erc20标准的token交易呢,根据erc20标准可知,有交易发生必然会触发Transfer事件,所以,我们去监测transfer事件,如何监测呢,这个在receipt的logs中,topics[0]都是事件的keccka的hash结果;topics[1]topics[2]分别是from和to;address是合约地址;data是交易额;rre1 z% S! h+ M8 J" g" I5 s
' m( ?  v" v7 |0 Q% U* a0 q
    最后记录一下erc20的标准吧;9 c; {' S; r. k+ H# ?7 O

8 W+ A0 W, q# l    以太坊的出现使得大家可以很方便的以太坊上发行自己的代币,这些代币都遵循ERC20协议(现已有ERC23协议)。智能合约编程支持合约的继承(类似面向对象语言中类的继承和接口的实现),因此ERC20协议可以定义为一个接口。
0 t) v. N" A2 r3 a0 p: K: J) E( v, u, E) \4 v0 d& C: ]
  1. contract ERC20 {* \# \7 ], Y+ E7 h2 l5 e1 \
  2.         function totalSupply() constant returns (uint totalSupply);         //获取总的发行量+ v$ w, d5 D/ s# r7 k$ H: c2 ]: K
  3.         function balanceOf(address _owner) constant returns (uint balance); //查询账户余额
    ; O" s4 G( H6 ^0 h0 {9 ?
  4.         function transfer(address _to, uint _value)returns(bool success); // 发送Token到某个地址(转账)
    9 P! P+ G: o% T" }; b
  5.         function transferFrom(address _from, address _to, uint _value) returns (bool success); //从地址from 发送token到to地址( J( d& g+ H$ }7 E! `
  6.         function approve(address _spender, uint _value)returns(bool success);//允许_spender从你的账户转出token
    . f* c' m7 _! `; J& Q
  7.         function allowance(address _owner, address _spender) constant returns (uint remaining);//查询允许spender转移的Token数量
    : F9 T9 l' z( Y& @0 G% ]# U
  8.         event Transfer(address indexed _from, address indexed _to, uint _value);//transfer方法调用时的通知事件
    % p0 ]. m, q9 [) A9 ?9 s
  9.         event Approval(address indexed _owner, address indexed _spender, uint _value); //approve方法调用时的通知事件+ l2 f8 c. W3 t& t7 X
  10. }
复制代码
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

李悔之2015 初中生
  • 粉丝

    1

  • 关注

    0

  • 主题

    13