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


正攻法

直近のブロックから、アドレスのトランザクション数が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