Author

Topic: Валидация транзакций в составе блока (Read 2901 times)

member
Activity: 148
Merit: 45
https://bitaps.com/
Спасибо!!!  Я недосмотрел в файле interpretator.cpp  что там не только код функции Evalscript но и она имеет входения в другие функции том файле.
legendary
Activity: 3108
Merit: 1359
Выполнение скриптов и проверка результата делается функцией VerifyScript. Причем не напрямую, а через обертку, реализующую многопоточность. И не всегда, а только если блок новее последнего чекпоинта.

https://github.com/bitcoin/bitcoin/blob/master/src/main.cpp#L1808

Если итогом выполнения скрипта не стало true значение наверху стека, то блок не пройдет проверку и будет отклонен, как бы ни ухитрялись. Вызывается это всё при выполнении ConnectBlock, то есть уже после успешного выполнения проверок, не зависящих от контекста. Таких, как проверки merkle root, формата транзакций или корректности сумм.
legendary
Activity: 1260
Merit: 1019
Где я ошибаюсь ? это же неможет быть правдой? Smiley
Правдой быть не может.
Но код клиента такой ебанутый, что мне тошно на него смотреть.
С вероятностью 99.999999% ты чего-то недосмотрел. Но может ты и прав.
member
Activity: 148
Merit: 45
https://bitaps.com/
Сегодня ковырял исходники 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  этого незаметят

Где я ошибаюсь ? это же неможет быть правдой? Smiley




  
  

Jump to: