Finden Sie eine CTransaction von einem Prevout im Bitcoin-Quellcode

Ich versuche, diese Funktion zu finden:CTransaction getTxFromPrevout(COutPoint prevo);

Die Idee ist ... wenn eine neue Transaktion validiert werden soll, wird sie alle durchlaufen tx.vin[i].prevoutund auf Geldmittel prüfen ( utxo).

Also möchte ich das finden und identifizieren, CTransaction txdas tx.vout(vom Typ vector<CTxOut>) ein beliebiges iElement hat, so dass es sich CScriptum eine normale Zahlung ( tx.vout[i].scriptPubKey.IsNormalPayment() == true) handelt und das tx.vout[i].scriptPubKeyeine Übereinstimmung für das enthältprevo

Wenn ich einen webbasierten Explorer verwende, kann ich die nehmen prevound den Hash daraus extrahieren, dann im Web nach der suchen tx... aber das hilft mir nicht, da ich dies innerhalb des Codes selbst verwenden möchte, indem ich hinzufüge diese neue Funktion. Ich habe versucht, dem Code in einem Explorer zu folgen, und er verwendet die RPC-API, und es war nicht einfach, ihm zu folgen.

Was ich denke, ist, dass es eine utxoDatenbankstruktur oder -klasse geben sollte, die das Crawlen erleichtert. Wenn ich annehme, dass es eine solche Klasse mit dem Namen gibt UTxODatabase- von der ich weiß, dass es keine gibt, aber stellen Sie sich vor, dass es eine gibt -, dann würde die Funktion, die ich codieren muss, so aussehen:

CTransaction UTxODatabase::getTxFromPrevout(COutPoint prevo);

/**************************************************** /

BEARBEITEN 1: Ich habe dies ganz am Ende der Funktion CheckTransaction() eingefügt, inmain.cpp

BOOST_FOREACH (const CTxIn& txin, tx.vin){ std::cout << "txin.prevPubKey.ToString(): " << txin.prevPubKey.ToString() << std::endl;

Dann habe ich die Brieftasche ausgeführt und die für jedes txin angezeigte Ausgabe war nur: txin.prevPubKey.ToString:, ohne prevPubKeyDaten. Ich bin wirklich verwirrt darüber.

prevPubKeyMein Gedanke war, dass ich, wenn ich in der Lage bin, diese s von der zu erhalten CTxIn, auch in der Lage sein werde, die zu verfolgen utxo. txinAber warum sollte es zu diesem Zeitpunkt keine Informationen über dieses Mitglied der geben ?

Es gibt eine utxo-Datenbank Siehe CCoinsViewKlasse in coins.h, die Funktion virtual bool GetCoin(const COutPoint &outpoint, Coin &coin) const;(oder eine ihrer Überladungen) könnte das tun, was Sie brauchen.
Ich bin verwirrt über diesen virtualQualifizierer ... die Hauptfunktion, auf die Sie mich verwiesen haben, war: bool CCoinsView::GetCoins(const uint256& txid, CCoins& coins) const { return false; } ... sie gibt nur falsch zurück. Das scheint auf dem richtigen Weg zu sein, aber ... und wahrscheinlich sollte eine der anderen Implementierungen funktionieren ... wie diese: bool CCoinsViewBacked::GetCoins(const uint256& txid, CCoins& coins) const { return base->GetCoins(txid, coins); }Aber die Wahrheit ist, ich bin mir nicht sicher, wie ich es benutzen soll. Könnte so etwas sein?CTransaction CCoinsViewBacked::getTxFromPrevout(COutPoint prevo);

Antworten (1)

Ich denke, was Sie wollen, ist diese Funktion zu verwenden:

bool CCoinsViewMemPool::GetCoin(const COutPoint &outpoint, Coin &coin) const

Die Definition finden Sie hier: https://github.com/bitcoin/bitcoin/blob/v0.17.0.1/src/txmempool.cpp#L885

Es wird das CoinObjekt setzen, das Sie als Argument übergeben. Ein Anwendungsbeispiel finden Sie bool CheckSequenceLocks(const CTransaction &tx, int flags, LockPoints* lp, bool useExistingLockPoints)unter https://github.com/bitcoin/bitcoin/blob/v0.17.0.1/src/validation.cpp#L364

Dies soll "Zugriff auf alle Coins bieten, die entweder nicht in der * base CCoinsView, ausgegeben werden oder aus einer Mempool-Transaktion stammen".

OP fragt nach der Transaktion, nicht nur nach UTXO. Das ist einfach nicht möglich, es sei denn, Sie haben txindex=1und keinen Schnitt.
Da habe ich das falsch verstanden.
Tatsächlich kann OP verwirrt sein und nicht die vollständige Transaktion für seinen Zweck benötigen.
Einverstanden! Ich brauche vielleicht nicht die ganze Transaktion ... aber zumindest möchte ich in der Lage sein, die Adresse zu validieren / zu vergleichen / zu überprüfen, auf die jeder utxozeigt.