encuentre una CTransaction de un prevout en el código fuente de Bitcoin

Estoy tratando de llegar a esta función:CTransaction getTxFromPrevout(COutPoint prevo);

La idea es... cuando una nueva transacción está a punto de ser validada, revisará todas tx.vin[i].prevouty verificará los fondos ( utxo).

Así que quiero encontrar e identificar el CTransaction txtal que tx.vout(de tipo vector<CTxOut>) tenga cualquier ielemento tal que sea CScriptun pago normal ( tx.vout[i].scriptPubKey.IsNormalPayment() == true) y tx.vout[i].scriptPubKeytenga dentro una coincidencia para elprevo

Si uso un explorador web, puedo tomar prevoy extraer el hash de él, luego buscar en la web el tx... pero eso no me ayuda, ya que quiero poder usar esto dentro del código mismo, agregando esta nueva función. Intenté seguir el código en un explorador y usa la API de rpc, y no fue fácil de seguir.

Lo que estoy pensando es que debería haber una utxoestructura o clase de base de datos que facilite el rastreo. Si supongo que hay una clase así nombrada UTxODatabase, que sé que no la hay, pero imagínense que la hay, entonces la función que necesito codificar se vería así:

CTransaction UTxODatabase::getTxFromPrevout(COutPoint prevo);

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

EDIT 1: puse esto al final de la función CheckTransaction(), enmain.cpp

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

Luego ejecuté la billetera y el resultado que se muestra para cada txin fue solo: txin.prevPubKey.ToString:, sin ningún prevPubKeydato. Estoy realmente confundido acerca de esto.

Mi pensamiento era que si puedo obtener esos prevPubKeys del CTxIn, entonces podré rastrear el utxo. Pero, ¿por qué no habría información sobre ese miembro de la txinen ese momento?

Hay una base de datos utxo Ver CCoinsViewclase en coins.h, la función virtual bool GetCoin(const COutPoint &outpoint, Coin &coin) const;(o una de sus sobrecargas) podría hacer lo que necesita.
Estoy confundido acerca de ese virtualcalificador... la función principal a la que me hizo referencia fue: bool CCoinsView::GetCoins(const uint256& txid, CCoins& coins) const { return false; } ... simplemente devuelve falso. Esto parece estar en el camino correcto, aunque... y probablemente una de las otras implementaciones debería funcionar... como esta: bool CCoinsViewBacked::GetCoins(const uint256& txid, CCoins& coins) const { return base->GetCoins(txid, coins); }Pero la verdad es que no estoy seguro de cómo usarlo. ¿Podría ser algo como esto?CTransaction CCoinsViewBacked::getTxFromPrevout(COutPoint prevo);

Respuestas (1)

Creo que lo que quieres es usar esta función:

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

Puede encontrar la definición aquí: https://github.com/bitcoin/bitcoin/blob/v0.17.0.1/src/txmempool.cpp#L885

Establecerá el Coinobjeto que pase como argumento. Para ver un ejemplo de uso, bool CheckSequenceLocks(const CTransaction &tx, int flags, LockPoints* lp, bool useExistingLockPoints)consulte https://github.com/bitcoin/bitcoin/blob/v0.17.0.1/src/validation.cpp#L364

Se supone que esto "brinda acceso a todas las monedas que no se gastaron en el * base CCoinsView, o son salidas de cualquier transacción de mempool".

OP está solicitando la transacción, no solo el UTXO. Eso simplemente no es posible a menos que tengas txindex=1y no podes.
Entonces entendí mal.
En realidad, OP puede estar confundido y no necesitar la transacción completa para su propósito.
¡Acordado! Puede que no necesite toda la transacción... pero al menos quiero poder validar/comparar/verificar la dirección a la que utxoapunta cada uno de ellos.