Title: Валидация транзакций в составе блока Post by: bitaps on October 24, 2015, 05:17:15 PM Сегодня ковырял исходники 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 этого незаметят Где я ошибаюсь ? это же неможет быть правдой? :) Title: Re: Валидация транзакций в составе блока Post by: amaclin on October 24, 2015, 05:41:58 PM Где я ошибаюсь ? это же неможет быть правдой? :) Правдой быть не может.Но код клиента такой ебанутый, что мне тошно на него смотреть. С вероятностью 99.999999% ты чего-то недосмотрел. Но может ты и прав. Title: Re: Валидация транзакций в составе блока Post by: Balthazar on October 24, 2015, 05:46:58 PM Выполнение скриптов и проверка результата делается функцией VerifyScript. Причем не напрямую, а через обертку, реализующую многопоточность. И не всегда, а только если блок новее последнего чекпоинта.
https://github.com/bitcoin/bitcoin/blob/master/src/main.cpp#L1808 Если итогом выполнения скрипта не стало true значение наверху стека, то блок не пройдет проверку и будет отклонен, как бы ни ухитрялись. Вызывается это всё при выполнении ConnectBlock, то есть уже после успешного выполнения проверок, не зависящих от контекста. Таких, как проверки merkle root, формата транзакций или корректности сумм. Title: Re: Валидация транзакций в составе блока Post by: bitaps on October 24, 2015, 06:08:07 PM Спасибо!!! Я недосмотрел в файле interpretator.cpp что там не только код функции Evalscript но и она имеет входения в другие функции том файле.
|