Сегодня ковырял исходники bitcoind, пытался найти где при добавлении блока происходит исполнение скрипта транзакции
1. Делаем поиск функции которая исполняет скрипт
https://github.com/bitcoin/bitcoin/search?utf8=%E2%9C%93&q=EvalScript src/script/interpreter.cpp здесь находится сам код функции
используется только в этих 2 файлах
src/policy/policy.cpp
src/script/sign.cpp
2. Смортим sign.cpp
Evalscript -> CombineSignatures -> /src/bitcoin-tx.cpp: MutateTxSign -> MutateTx -> CommandLineRawTx -> main далее совпадений нет, сдесь явно нет пути вызовов при добавлении блоков или транзакций
3. Смотрим policy.cpp
Evalscript -> AreInputsStandard -> /src/main.cpp: AcceptToMemoryPool
AcceptToMemoryPool :
src/main.cpp
src/wallet/wallet.cpp -> CommitTransaction - здесь реализация локального кошелька. исполнение скрипта происходит при создании своей транзакции
src/rpcrawtransaction.cpp -> sendrawtrnsaction - здесь рпс функционал, послать сырую транзакцию
src/txmempool.cpp -> нет вызова, участвует в коментарии
Остается только src/main.cpp
AcceptToMemoryPool -> ProcessMessage при обработке соощения tx, то есть поступление отдельной транзакции из сети и добавления ее в пул
AcceptToMemoryPool -> DisconnectTip
DisconnectTip -> InvalidateBlock сделать блок невалидным и транзакции из блока вернуть в пул при возрате исполняются проверки и скрипты
DisconnectTip -> ActivateBestChainStep :
// Disconnect active blocks which are no longer in the best chain.
bool fBlocksDisconnected = false;
while (chainActive.Tip() && chainActive.Tip() != pindexFork) {
if (!DisconnectTip(state))
return false;
fBlocksDisconnected = true;
}
сдесь в случае если образовался орфан мы из этого орфана выкидываем транзы обратно в пул со всеми проверками
Больше никаких связей с функцией исполнения скрипта нет
Из этого я могу сделать вывод что в случае если приходит новый блок и он в своем составе содержит транзакцию которой у нас нет в мемпуле то мы добавляем эту транзакцию в составе
данного блока в blockchain без исполнения sigscript + Pubkeyscript.
Следовательно мы добавляем транзакцию с потенциально невалидным скриптом. К примеру несходится сигнатура и мы тратим чужую монету и создаем свою.
Следовательно непорядочный майнер может это осуществить и вся сеть примет этот блок так как реальное исполнение скрипта непроизошло и ноды с bitcoind этого незаметят
Где я ошибаюсь ? это же неможет быть правдой?