Ich bin mir sicher, dass diese Frage schon einmal gestellt wurde, aber ich habe kein Ergebnis gefunden, das meinem Problem geholfen hat.
Wie kann ich die Transaktionen (ein- und ausgehend) für ein bestimmtes Konto abrufen? Ich benutze nodejs und web3?
Mit dieser Zeile erhalte ich die Anzahl der gesendeten Transaktionen:
web3.eth.getTransactionCount(accounts[i])
Also sollte zumindest web3 etwas über die Kontoaktivität wissen.
Gibt es eine einfache Möglichkeit, die Transaktionen meiner Konten abzurufen? Oder habe ich da was übersehen? Muss ich die gesamte Blockchain blockweise durchsuchen, um meine Transaktionen zu erhalten?
Einfache Transaktionen werden nicht indiziert. Sie müssen also entweder über alle Blöcke iterieren, eine Art Off-Chain-Index verwenden (z. B. etherscan.io ) oder selbst einen erstellen und verwenden.
Sie können beispielsweise diesen heuristischen Ansatz verwenden, ohne die gesamte Kette verarbeiten zu müssen
var myAddr = '0xbb9bc244d798123fde783fcc1c72d3bb8c189413';
var currentBlock = eth.blockNumber;
var n = eth.getTransactionCount(myAddr, currentBlock);
var bal = eth.getBalance(myAddr, currentBlock);
for (var i=currentBlock; i >= 0 && (n > 0 || bal > 0); --i) {
try {
var block = eth.getBlock(i, true);
if (block && block.transactions) {
block.transactions.forEach(function(e) {
if (myAddr == e.from) {
if (e.from != e.to)
bal = bal.plus(e.value);
console.log(i, e.from, e.to, e.value.toString(10));
--n;
}
if (myAddr == e.to) {
if (e.from != e.to)
bal = bal.minus(e.value);
console.log(i, e.from, e.to, e.value.toString(10));
}
});
}
} catch (e) { console.error("Error in block " + i, e); }
}
Wie funktioniert es?
Unter Verwendung der verfügbaren Informationen über den aktuellen Status (Anzahl der "Von"-Transaktionen und des aktuellen Saldos) geht es in der Zeit zurück, bis mindestens so viele "Von"-Transaktionen gefunden wurden, und geht dann weiter zurück, bis der Saldo erreicht ist 0
.
Die inhärente Einschränkung besteht darin, dass Transaktionen mit dem Wert 0 vor der Einzahlung auf das Konto nicht gefunden werden.
Vertragsereignisse hingegen werden indiziert . Wenn Sie also einen Smart Contract entwickeln, können Sie davon Gebrauch machen.
Verwenden der web3 1.0.0-API:
web3.eth.getPastLogs({fromBlock:'0x0',address:'0x9e3319636e2126e3c0bc9e3134AEC5e1508A46c7'})
.then(res => {
res.forEach(rec => {
console.log(rec.blockNumber, rec.transactionHash, rec.topics);
});
}).catch(err => console.log("getPastLogs failed", err));
Oder über JSON RPC eth_getLogs .
Dieses Skript hat eine getTransactionsByAccount
. Sie müssen es ändern, indem Sie web3 voranstellen, zum Beispiel use web3.eth.blockNumber
statt just eth.blockNumber
(was in der Geth-Konsole funktioniert, da die Geth-Konsole das web3-Objekt enthält).
Oben werden die einfachen Transaktionen angegeben, und es ist mehr Arbeit erforderlich , um interne Transaktionen zu erhalten .
Gibt neben dem Kommentar von @Tjaden web3.eth.getTransactionCount(account)
nur die Anzahl der Transaktionen an, die von stammen account
.
web3
sollte das einzige Objekt sein, das Sie brauchen; die anderen Variablen werden an die getTransactionsByAccount
Funktion übergeben.check etherscan.io
api können Sie alternativ einfach eine Liste aller Transaktionen erhalten
Die passende Antwort zum Datum:
class TransactionChecker {
constructor(address) {
this.address = address.toLowerCase();
this.web3 = new Web3("https://mainnet.infura.io/v3/60968ff3b2f84a0ebdff7a993f4d080b");
}
async checkBlock() {
let block = await this.web3.eth.getBlock('latest');
let number = block.number;
let transactions = block.transactions;
//console.log('Search Block: ' + transactions);
if (block != null && block.transactions != null) {
for (let txHash of block.transactions) {
let tx = await this.web3.eth.getTransaction(txHash);
if (this.address == tx.to.toLowerCase()) {
console.log("from: " + tx.from.toLowerCase() + " to: " + tx.to.toLowerCase() + " value: " + tx.value);
}
}
}
}
}
var transactionChecker = new TransactionChecker('0x69fb2a80542721682bfe8daa8fee847cddd1a267');
transactionChecker.checkBlock();
Ausgabe:
from: 0x240946ca5418ba362e9011d6454ff858adc0e0ae to: 0x2c334d73c68bbc45dd55b13c5dea3a8f84ea053c value: 2000000000000000000
from: 0x410282b6e53c0d48007ace4874b6afa6754425f7 to: 0xe6c46e42256703de29e37b01a246e11a5b102c6b value: 450000000000000000
from: 0xffc5e446d5f32f7c8479b5eae4271751dacd45b8 to: 0x7a250d5630b4cf539739df2c5dacb4c659f2488d value: 1000000000000000000
from: 0xd8376d071c27582fb15c6a9a46eaf23e6adaf76e to: 0x7a250d5630b4cf539739df2c5dacb4c659f2488d value: 2000000000000000000
from: 0x7f5896c91a1bf9e94d4d81b142daa61d50c8eecb to: 0xba2eac592746fc7427247b591507dac51c51a500 value: 0
from: 0x02314d41f62e62c02b8cbd036334573db1334f11 to: 0x4d62c46898bdcd6b14118646ed1401336c9a47b3 value: 0
from: 0x9cc53c6f67332f7c4aa5a56f83121e51d30c5923 to: 0x0a331b3de09c986eaaf967d8b493b816cb7902e8 value: 296699999999999940
from: 0xc09e7e05da6b021d881b0e3ec580307c40102e2d to: 0xaf4afb03963f3f5f87a3e20a0f9191270c7b3436 value: 638368162441200000
from: 0x32be343b94f860124dc4fee278fdcbd38c102d88 to: 0xa910f92acdaf488fa6ef02174fb86208ad7722ba value: 1487418725338565767
from: 0x343b18bf65d9d2a64bb763246e207d2d303328bf to: 0xdac17f958d2ee523a2206206994597c13d831ec7 value: 0
from: 0x343b18bf65d9d2a64bb763246e207d2d303328bf to: 0xdac17f958d2ee523a2206206994597c13d831ec7 value: 0
from: 0xcb0249c85ba9b6e32d79adaae2f9660ae0dfbefc to: 0x239220734954c95c852f0fc059ec783a3f0e283c value: 1000000000000000
Ich weiß, es ist zu spät, um diese Frage zu beantworten. Aber ich hoffe es konnte anderen helfen.
Sie können Transaktionen nicht direkt mit web3 und JSON-RPC auflisten. Um eine Liste von Transaktionen mit einer Adresse zu erhalten, müssen Sie ganze (oder einen Teil davon) Blöcke der Ethereum-Blockchain scannen, um sie zu finden.
Sie könnten es erraten! Es ist ziemlich zeitintensiv!
Um dieses Problem zu lösen, benötigen Sie einen Block-Indexer oder einen Block-Explorer. Sie indizieren alle Blockchain-Daten in unterschiedlicher Form und Reihenfolge. Sie verwenden einen Block-Explorer wie „Etherscan“ oder setzen einen Open-Source-Indexer wie „Blockscout“ ein.
Sie bieten Ihnen eine hilfreichere API (im Vergleich zu ETH RPC). Sie müssen mit der Methode „txlist“ im Modul „Konto“ interagieren.
Überprüfen Sie die Trust Wallet
API https://api.trustwalletapp.com/transactions?address=0x9f8284ce2cf0c8ce10685f537b1fff418104a317&limit=5&startBlock=4386700&endBlock=4747999 . Dokumente sind hier verfügbar https://github.com/TrustWallet/trust-ray/wiki/API
Ich habe diese Methode 'web3.eth.getTransactionsByAccount' in meiner Konsole nicht gefunden. Wie ich sehe, gibt es keine direkte Möglichkeit, Transaktionen nach Kontoadresse abzurufen. Vielleicht sollten Sie die gesamte Blockchain auf Ihre Weise crawlen, oder Sie können die API eines Drittanbieters verwenden.
web3.eth.getTransactionCount("0x8fFcABE2D92A76286b58f6C286980877C3C2C5C6")
.then((b=console.log)=>{
console.log(b)
for(var i=0;i<b;i++){
web3.eth.getBlock(b-i).then((Block)=>
{
a =[
Block.hash
]
console.log(a);
var iterator =a.values()
for (let elements of iterator) {
web3.eth.getTransactionFromBlock(elements).then(console.log)
}
});
}
});
Tjaden Hess
Kevin Duong
Ank_247shbm