найти CTransaction из предыдущего в исходном коде Биткойн

Я пытаюсь придумать эту функцию:CTransaction getTxFromPrevout(COutPoint prevo);

Идея в том, что... когда новая транзакция должна быть подтверждена, она проверит все ее tx.vin[i].prevoutи проверит наличие средств ( utxo).

Итак, я хочу найти и идентифицировать такой CTransaction txэлемент, который tx.vout(типа vector<CTxOut>) имеет любой iэлемент, такой, что это CScriptобычный платеж ( tx.vout[i].scriptPubKey.IsNormalPayment() == true), и tx.vout[i].scriptPubKeyв нем есть совпадение дляprevo

Если я использую веб-проводник, я могу взять prevoи извлечь из него хэш, а затем выполнить поиск в Интернете для tx... но это мне не поможет, так как я хочу иметь возможность использовать это в самом коде, добавляя эту новую функцию. Я попытался следовать коду в проводнике, и он использует API rpc, и это было нелегко.

Я думаю, что должна быть utxoструктура базы данных или класс, который облегчит обход. Если я предполагаю, что существует такой класс с именем UTxODatabase— я знаю, что его нет, но просто представьте, что он есть, — тогда функция, которую мне нужно закодировать, будет выглядеть так:

CTransaction UTxODatabase::getTxFromPrevout(COutPoint prevo);

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

РЕДАКТИРОВАТЬ 1: я поместил это в самый конец функции CheckTransaction(), вmain.cpp

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

Затем я запустил кошелек, и вывод, показанный для каждого txin, был просто: txin.prevPubKey.ToString:без каких-либо prevPubKeyданных. Я действительно смущен этим.

Я думал, что если я смогу получить эти prevPubKeys из CTxIn, то я смогу отследить utxo. txinНо почему на том этапе не было информации об этом члене группы ?

Существует база данных utxo. См. CCoinsViewкласс в coins.h, функция virtual bool GetCoin(const COutPoint &outpoint, Coin &coin) const;(или одна из ее перегрузок) может делать то, что вам нужно.
Я запутался в этом virtualквалификаторе... основная функция, на которую вы меня сослали, была: bool CCoinsView::GetCoins(const uint256& txid, CCoins& coins) const { return false; } ... она просто возвращает false. Кажется, это на правильном пути, хотя... и, вероятно, одна из других реализаций должна работать... как эта: bool CCoinsViewBacked::GetCoins(const uint256& txid, CCoins& coins) const { return base->GetCoins(txid, coins); }Но правда в том, что я не уверен, как ее использовать. Может быть что-то вроде этого?CTransaction CCoinsViewBacked::getTxFromPrevout(COutPoint prevo);

Ответы (1)

Я думаю, что вы хотите использовать эту функцию:

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

Вы можете найти определение здесь: https://github.com/bitcoin/bitcoin/blob/v0.17.0.1/src/txmempool.cpp#L885

Он установит Coinобъект, который вы передаете в качестве аргумента. Пример использования см. bool CheckSequenceLocks(const CTransaction &tx, int flags, LockPoints* lp, bool useExistingLockPoints)в https://github.com/bitcoin/bitcoin/blob/v0.17.0.1/src/validation.cpp#L364 .

Предполагается, что это «предоставит доступ ко всем монетам, которые либо не израсходованы в * base CCoinsView, либо являются выходами любой транзакции мемпула».

OP запрашивает транзакцию, а не только UTXO. Это просто невозможно, если у вас txindex=1нет обрезки.
Тогда я неправильно понял.
На самом деле, OP может быть сбит с толку и ему не нужна полная транзакция для его целей.
Согласованный! Мне может не понадобиться вся транзакция... но, по крайней мере, я хочу иметь возможность проверить/сравнить/проверить адрес, на который utxoуказывает каждый из них.