Я пытаюсь придумать эту функцию: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
данных. Я действительно смущен этим.
Я думал, что если я смогу получить эти prevPubKey
s из CTxIn
, то я смогу отследить utxo
. txin
Но почему на том этапе не было информации об этом члене группы ?
Я думаю, что вы хотите использовать эту функцию:
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
, либо являются выходами любой транзакции мемпула».
txindex=1
нет обрезки.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);