Интересное поведение теперь ... Я могу послать монеты из блока генеза, но они никогда не подтверждают.
Да, я не думаю, что добавление к пулу памяти собирается помочь с тем, что вы пытаетесь сделать.
Пул памяти для операций, которые еще не в блоках. Когда новая транзакция будет создана, она будет передана узлам в сети и хранятся в их пулов памяти. Горнодобывающие узлы используют пул памяти, чтобы найти сделки для включения в добываемых блоках. Сделка генезис блок не действительно принадлежит там, так как он уже является частью блока (а также, так как это сделки coinbase).
Вам нужно добавить транзакцию к набору неизрасходованных выходов транзакций. Я не знаю точно, как сделать это правильно, но критический фрагмент кода, кажется, вызов SetCoins в CTransaction :: UpdateCoins (). Вы могли бы быть в состоянии сделать это следующим образом:
вид CCoinsViewCache (* pcoinsTip, правда);
view.SetCoins (txNew.GetHash (), CCoins (txNew, 0));
view.Flush ();
Я рекомендовал бы поставить этот код там, где создается блок генеза: в main.cpp, в InitBlockIndex (), внутри "если (! fReindex)", В самом конце. Я не могу гарантировать, что он будет работать, но это могло бы. Убедитесь, что вы начинаете с новой директории данных.
Для того, чтобы сделать работу индексированиями этого, я думаю, вы также должны будете делать то же самое в CBlock :: ConnectBlock в этом особом случае для блока генеза:
// Особый случай для блока генеза, пропуская соединение своих операций
// (его coinbase является unspendable)
если (GetHash () == hashGenesisBlock) {
CCoinsViewCache viewTmp (вид, правда);
viewTmp.SetCoins (VTX [0] .GetHash (), CCoins (VTX [0], 0));
viewTmp.Flush ();
view.SetBestBlock (pindex);
pindexGenesisBlock = pindex;
возвращает истину;
}
Или, может быть, вы можете просто удалить частный случай, и пусть остальные функции запуска, но я не знаю, если какие-либо из остальной части коды в этой функции будет создавать проблемы.