Как PoW, решенный в miner.cpp, передается в main.cpp в исходном коде?

Согласно моему пониманию кодовой базы биткойнов, следующие события происходят после того, как мы решаем доказательство работы.

  1. В miner.cpp, как только поток майнера решает новое доказательство работы (PoW), ProcessBlockFoundв основном уведомляет других через сигнал BlockFound.
  2. BlockFoundсигнальные вызовы ResetRequestCount, которые в основном сбрасывают вход mpRequestCountчерез wallet.hфайл validationInterface.h.
  3. (Отсутствует логика)
  4. Новый NetMsgType::INVвыдается из main.cppв SendMessages/ ProcessMessagesко всем пирам.
  5. Эти сообщения в конечном итоге отправляются всем одноранговым узлам через логику сетевых сокетов.net.cpp

Мне не хватает основной части логики кода между шагами 2 и 4. Может ли какой-нибудь эксперт помочь мне понять, какая предыстория происходит после шага 2?

Ответы (1)

Если вы прочитаете несколько строк после сигнала BlockFound, то увидите:

CValidationState state;
if (!ProcessNewBlock(state, chainparams, NULL, pblock, true, NULL))
    return error("BitcoinMiner: ProcessNewBlock, block not accepted");

https://github.com/bitcoin/bitcoin/blob/v0.12.0rc2/src/miner.cpp#L373-L375

Здесь собственно и начинается обработка. ProcessNewBlockопределяется в main.cpp.

Я думаю, вы неправильно поняли мой вопрос. ProcessNewBlockв основном работоспособность проверяет блок, сохраняет на диск и снова активирует лучшую цепочку. Мой вопрос: где логика, которая фактически отправляет хэш другим узлам? Логика майнинга находится в miner.cppлогике отправки main.cpp. Где-то я пропустил, где он выбирает информацию о новом добытом блоке и отправляет «Эй! У меня есть новое» или сообщение INV