8 _1 B5 W" T. N4 b
为什么会有遗漏呢,主要是因为构建交易的时候,to地址是一个合约,而且这个合约不是erc20的合约,而是一个普通合约,这个合约地址会去调用erc20的合约;这用导致input字段的函数不是transfer了,而是普通合约的函数,如下图;% g1 E* V! G- d
/ k8 m4 z6 S, p) f1 k
那应该如何检测erc20标准的token交易呢,根据erc20标准可知,有交易发生必然会触发Transfer事件,所以,我们去监测transfer事件,如何监测呢,这个在receipt的logs中,topics[0]都是事件的keccka的hash结果;topics[1]topics[2]分别是from和to;address是合约地址;data是交易额;rre. j& D2 O3 j3 r5 S7 o2 c
3 ?3 J% T0 N2 X- L7 e/ W; @5 m
最后记录一下erc20的标准吧;. N; |" I- q# E0 \
; K8 Z8 y( p' F. V
以太坊的出现使得大家可以很方便的以太坊上发行自己的代币,这些代币都遵循ERC20协议(现已有ERC23协议)。智能合约编程支持合约的继承(类似面向对象语言中类的继承和接口的实现),因此ERC20协议可以定义为一个接口。/ M. U- f6 ^" ?
# i5 V6 D2 k2 }
- contract ERC20 {
- function totalSupply() constant returns (uint totalSupply); //获取总的发行量3 c. p- I( v' R5 g4 X6 ^, |
- function balanceOf(address _owner) constant returns (uint balance); //查询账户余额* T2 k7 P% g: a3 o7 D
- function transfer(address _to, uint _value)returns(bool success); // 发送Token到某个地址(转账)7 K2 \; y9 T7 F
- 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数量- o. w, U* m* K8 } \3 f
- event Transfer(address indexed _from, address indexed _to, uint _value);//transfer方法调用时的通知事件
- event Approval(address indexed _owner, address indexed _spender, uint _value); //approve方法调用时的通知事件
- }