Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

正攻法

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

https://ethereum.stackexchange.com/questions/2531/common-useful-javascript-snippets-for-geth

https://etherscan.io/apis#transactions

snst-lab
エンジニアになりたい公務員。アウトプットを維持するためにQiitaを始めました。 小ネタが多いですが、よかったら、どんどんダメ出し等レビューお願いします!
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away