LoginSignup
1
0

More than 5 years have passed since last update.

JavascriptでEthereumのアドレスからトランザクションを取得する

Last updated at Posted at 2018-07-16

正攻法

直近のブロックから、アドレスのトランザクション数が0になるか、Balanceが0になるまでトランザクションを取得し続けます。

function getTransactionHistory(address){
        const web3 = new Web3(new Web3.providers.HttpProvider([任意のイーサリアムノード]));
        const currentBlock = web3.eth.blockNumber;
        var transactionList = [];
        var transactionCount = web3.eth.getTransactionCount(address, currentBlock);
        var balance = web3.eth.getBalance(address, currentBlock);           
        for (var i=currentBlock; i >= 0 && (transactionCount > 0 || balance > 0); --i) {
            var block = web3.eth.getBlock(i, true);
            if (block && block.transactions) {
                block.transactions.forEach(function(e) {
                    if (address == e.from && e.from != e.to) {
                        balance += e.value;
                        transactionList.push({'blockNumber':i,'from':e.from,'to':e.to,'amount':e.value.toString(10)})
                        --transactionCount;
                    }
                    if (address == e.to) {
                        if (e.from != e.to)
                        balance -= e.value;
                        transactionList.push({'blockNumber':i,'from':e.from,'to':e.to,'amount':e.value.toString(10)})
                    }
                });
            }
        }
        return transactionList;
}

 infura.ioのノードで試しましたが、リクエスト過多で固まってしまいました・・・

妥協策

邪道とは思いましたが、諦めてEtherscanから取得したら現実的に動いてくれました。

function getTransactionHistory(address){
      const web3 = new Web3(new Web3.providers.HttpProvider([任意のイーサリアムノード]));
      const currentBlock = web3.eth.blockNumber;
      const reqBody = {
        'module':'account',
        'action':'txlist',
        'address':address,
        'startblock':0,
        'endblock':currentBlock,
        'page':1,
        'offset':10, //取得するトランザクションの最大数
        'sort':'asc',
        'apikey':'[EtherscanのAPI KEY]'
      }
      const res = $.ajax({
          url: 'https://api.etherscan.io/api',
          type: "GET",
          dataType: "json",
          data: reqBody,
          async:false,
      }).responseText;

      return JSON.parse(res).result;
}        

参考URL

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0