Bitcoin Forum
June 15, 2024, 11:13:47 AM *
News: Voting for pizza day contest
 
   Home   Help Search Login Register More  
Pages: [1]
  Print  
Author Topic: Валидация транзакций в составе блока  (Read 2886 times)
bitaps (OP)
Member
**
Offline Offline

Activity: 148
Merit: 45

https://bitaps.com/


View Profile WWW
October 24, 2015, 05:17:15 PM
 #1

Сегодня ковырял исходники 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




  
  


amaclin
Legendary
*
Offline Offline

Activity: 1260
Merit: 1019


View Profile
October 24, 2015, 05:41:58 PM
 #2

Где я ошибаюсь ? это же неможет быть правдой? Smiley
Правдой быть не может.
Но код клиента такой ебанутый, что мне тошно на него смотреть.
С вероятностью 99.999999% ты чего-то недосмотрел. Но может ты и прав.
Balthazar
Legendary
*
Offline Offline

Activity: 3108
Merit: 1359



View Profile
October 24, 2015, 05:46:58 PM
Last edit: October 24, 2015, 06:03:41 PM by Balthazar
 #3

Выполнение скриптов и проверка результата делается функцией VerifyScript. Причем не напрямую, а через обертку, реализующую многопоточность. И не всегда, а только если блок новее последнего чекпоинта.

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

Если итогом выполнения скрипта не стало true значение наверху стека, то блок не пройдет проверку и будет отклонен, как бы ни ухитрялись. Вызывается это всё при выполнении ConnectBlock, то есть уже после успешного выполнения проверок, не зависящих от контекста. Таких, как проверки merkle root, формата транзакций или корректности сумм.
bitaps (OP)
Member
**
Offline Offline

Activity: 148
Merit: 45

https://bitaps.com/


View Profile WWW
October 24, 2015, 06:08:07 PM
 #4

Спасибо!!!  Я недосмотрел в файле interpretator.cpp  что там не только код функции Evalscript но и она имеет входения в другие функции том файле.

Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!