JavascriptでEthereumのアドレスからトランザクションを取得する
12003 ワード
正攻法
直近のブロックから、アドレスのトランザクション数が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
Author And Source
この問題について(JavascriptでEthereumのアドレスからトランザクションを取得する), 我々は、より多くの情報をここで見つけました https://qiita.com/snst-lab/items/1c8bf4aafacda41a9c20著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .