以太坊中的事件(Events)和日志(Logs)是两个比较让人困惑的概念,基本上算是同一个概念。
Solidity和web3.js中称为Events,以太坊黄皮书中称为Logs。以太坊通过Logs实现Events(事件)功能。智能合约代码通过Events将日志写入区块链中。
因此,我们可以通过以太坊的日志,查询token中某一地址的所有交易记录。
具体代码如下:
var Web3 = require('web3');
var request = require("request");
console.log(Web3.version);
var web3 = new Web3("https://mainnet.infura.io");
var abi = require("./rnt.json");
var address = "0xff603f43946a3a28df5e6a73172555d8c8b02386";
var contract = new web3.eth.Contract(abi,address); //合约实例
//查询合约名称
contract.methods.name().call().then(
function(result){
console.log(result);
}
);
//查询某一地址交易记录
contract.getPastEvents('Transfer', {
filter: {_from: '0x6cc5f688a315f3dc28a7781717a9a798a59fda7b'},
fromBlock: 230813,
toBlock: 'latest'
}, (error, events) => { console.log(events); });
示例代码我是以RNT这个token为例,RNT的合约信息可见:
https://etherscan.io/address/0xff603f43946a3a28df5e6a73172555d8c8b02386
- rnt.json是合约的abi信息
- 0xff603f43946a3a28df5e6a73172555d8c8b02386地址是合约地址
- 0x6cc5f688a315f3dc28a7781717a9a798a59fda7b地址是示例的交易地址
- 230813是区块的高度,要查询所有交易记录区块高度应该是0
示例代码使用了web3的getPastEvents方法,方法详情见:
https://web3js.readthedocs.io/en/1.0/web3-eth-contract.html#getpastevents
代码运行:
node tokenRecord.js
运行结果如下图:
运行结果
网友评论