Вернуться   Биткоин Форум > Разработка и Техническое Обсуждение
3 января 2016, 10:55:20 AM   # 1
 
 
Сообщения: 1862
Цитировать по имени
цитировать ответ
по умолчанию Re: Почему я не могу использовать отрицательное значение для OP_CHECKLOCKTIMEVERIFY

Взлом Биткоин адресов.
500 Биткоинов взломаны в "мозговом кошельке" с паролем "bitcoin is awesome"
Адрес кошелька: 14NWDXkQwcGN1Pd9fboL8npVynD5SfyJAE
Приватный ключ: 5J64pq77XjeacCezwmAr2V1s7snvvJkuAz8sENxw7xCkikceV6e
подробнее...


Всем кто хочет заработать Биткоины без вложений - рекомендую сайт http://bitcoin-zarabotat.ru
Я тестирую P2SH выкупить скрипт, который выглядит следующим образом:

Код:
OP_DUP
OP_SHA256
<секретный хэш>
OP_EQUAL
OP_IF
OP_DROP
OP_DUP
OP_HASH160
<Открытый ключ хэш-1>
OP_EQUALVERIFY
OP_CHECKSIG
OP_ELSE
<значение CLTV>
OP_NOP2
OP_DROP
OP_DUP
OP_HASH160
<публичный ключ хэш-2>
OP_EQUALVERIFY
OP_CHECKSIG
OP_ENDIF

Я получил его на работу, используя -regtest (после того, как много отвода вокруг, как представляется, что "coinbase" TXS не может отправить P2SH адрес без завинчивания сценария scriptPubKey) с помощи <значение CLTV> из 0x7F (блок 127) и CLTV искупит работает отлично (в том, что он не выкупит, пока вы не сгенерировали 127 блоков).

Но если я изменю <значение CLTV> до 0xff (для блока 255) неожиданно интерпретатор скриптов жалуется на "Отрицательная Locktime",

Так как именно я должен сказать, что это блок 255?

(И в соответствии с документацией Locktime является значением без знака, так почему же OP_CHECKLOCKTIMEVERIFY чтения подписанного значения?)
CIYAM сейчас офлайн Пожаловаться на CIYAM   Ответить с цитированием Мультицитирование сообщения от CIYAM Быстрый ответ на сообщение CIYAM


Как заработать Биткоины?
Без вложений. Не майнинг.


3 января 2016, 2:55:05 PM   # 2
 
 
Сообщения: 1246
Цитировать по имени
цитировать ответ
по умолчанию Re: Почему я не могу использовать отрицательное значение для OP_CHECKLOCKTIMEVERIFY

Получил 1806 Биткоинов
Реальная история.





Вы пробовали дополняя его с 0-х?
achow101 сейчас офлайн Пожаловаться на achow101   Ответить с цитированием Мультицитирование сообщения от achow101 Быстрый ответ на сообщение achow101

3 января 2016, 3:01:08 PM   # 3
 
 
Сообщения: 1862
Цитировать по имени
цитировать ответ
по умолчанию Re: Почему я не могу использовать отрицательное значение для OP_CHECKLOCKTIMEVERIFY

Вы пробовали дополняя его с 0-х?

Пока нет - но я думал, что заполнение нулями будет падать нарушение правила о том, что подтолкнули данные должны быть минимальными (как я прочитал, изучая делать это P2SH материал).

EDIT: Я попытался изменить 0x017f к 0x02ff00, но тогда, когда я пытаюсь и выкупить (после 255 блоков) я получаю следующее сообщение об ошибке:
Код:
ошибка: {"код": -26,"сообщение":"64: неимперативная-скрипт-проверить-флаг (Нет ошибок)"}

Какая странная ошибка смотрит (но ошибка тем не менее).
CIYAM сейчас офлайн Пожаловаться на CIYAM   Ответить с цитированием Мультицитирование сообщения от CIYAM Быстрый ответ на сообщение CIYAM

3 января 2016, 3:17:30 PM   # 4
 
 
Сообщения: 1246
Цитировать по имени
цитировать ответ
по умолчанию Re: Почему я не могу использовать отрицательное значение для OP_CHECKLOCKTIMEVERIFY

Вы пробовали дополняя его с 0-х?

Пока нет - но я думал, что заполнение нулями будет падать нарушение правила о том, что подтолкнули данные должны быть минимальными (как я прочитал, изучая делать это P2SH материал).

EDIT: Я попытался изменить 0x017f к 0x02ff00, но тогда, когда я пытаюсь и выкупить (после 255 блоков) я получаю следующее сообщение об ошибке:
Код:
ошибка: {"код": -26,"сообщение":"64: неимперативная-скрипт-проверить-флаг (Нет ошибок)"}

Какая странная ошибка смотрит (но ошибка тем не менее).

Хорошо, таким образом, может быть 0 набивки делает скрипт нестандартный. Скрипт проверяет нормально, поэтому вам не имеют ошибок, поэтому я предполагаю, что это просто не проходит проверку стандартности, вероятно, из-за 0 набивкой.
achow101 сейчас офлайн Пожаловаться на achow101   Ответить с цитированием Мультицитирование сообщения от achow101 Быстрый ответ на сообщение achow101

3 января 2016, 3:18:24 PM   # 5
 
 
Сообщения: 1862
Цитировать по имени
цитировать ответ
по умолчанию Re: Почему я не могу использовать отрицательное значение для OP_CHECKLOCKTIMEVERIFY

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

Так что - возвращается на круги своя - как получить OP_CHECKLOCKTIMEVERIFY понять блок 255?
CIYAM сейчас офлайн Пожаловаться на CIYAM   Ответить с цитированием Мультицитирование сообщения от CIYAM Быстрый ответ на сообщение CIYAM

3 января 2016, 3:24:16 PM   # 6
 
 
Сообщения: 1246
Цитировать по имени
цитировать ответ
по умолчанию Re: Почему я не могу использовать отрицательное значение для OP_CHECKLOCKTIMEVERIFY

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

Так что - возвращается на круги своя - как получить OP_CHECKLOCKTIMEVERIFY понять блок 255?

Я не могу помочь вам, но вы, вероятно, можете найти его в коде. Locktime в сценарии OP_CLTV является CScriptNum так оно подписано. Вот код для CScriptNum: https://github.com/bitcoin/bitcoin/blob/595f93977c5636add1f4f2e64cd2d9b19c65a578/src/script/script.h#L194.
achow101 сейчас офлайн Пожаловаться на achow101   Ответить с цитированием Мультицитирование сообщения от achow101 Быстрый ответ на сообщение achow101

3 января 2016, 3:26:00 PM   # 7
 
 
Сообщения: 1862
Цитировать по имени
цитировать ответ
по умолчанию Re: Почему я не могу использовать отрицательное значение для OP_CHECKLOCKTIMEVERIFY

Я не могу помочь вам, но вы, вероятно, можете найти его в коде. Locktime в сценарии OP_CLTV является CScriptNum так оно подписано. Вот код для CScriptNum: https://github.com/bitcoin/bitcoin/blob/595f93977c5636add1f4f2e64cd2d9b19c65a578/src/script/script.h#L194.

Да - я проверил исходный код, и это то, что сбивает с толку меня.

Если nLockTime беззнаковым (который все docco и исходный код, который я смотрел на показывает, что это такое), то почему на земле OP_CHECKLOCKTIMEVERIFY ожидает подписанное значение?
CIYAM сейчас офлайн Пожаловаться на CIYAM   Ответить с цитированием Мультицитирование сообщения от CIYAM Быстрый ответ на сообщение CIYAM

3 января 2016, 3:29:44 PM   # 8
 
 
Сообщения: 1246
Цитировать по имени
цитировать ответ
по умолчанию Re: Почему я не могу использовать отрицательное значение для OP_CHECKLOCKTIMEVERIFY

Я не могу помочь вам, но вы, вероятно, можете найти его в коде. Locktime в сценарии OP_CLTV является CScriptNum так оно подписано. Вот код для CScriptNum: https://github.com/bitcoin/bitcoin/blob/595f93977c5636add1f4f2e64cd2d9b19c65a578/src/script/script.h#L194.

Да - я проверил исходный код, и это то, что сбивает с толку меня.

Если nLockTime беззнаковым (который все docco и исходный код, который я смотрел на показывает, что это такое), то почему на земле OP_CHECKLOCKTIMEVERIFY ожидает подписанное значение?

Честно говоря, я понятия не имею. Все, что я мог бы найти то, что фактическое nLockTime в передадите (не в скрипте OP_CLTV) должно быть unsiged. Я не знаю, почему он будет подписан на OP_CLTV. Привести его в вопросе о GitHub, вы получите больше ответов таким образом.
achow101 сейчас офлайн Пожаловаться на achow101   Ответить с цитированием Мультицитирование сообщения от achow101 Быстрый ответ на сообщение achow101

3 января 2016, 3:37:56 PM   # 9
 
 
Сообщения: 1862
Цитировать по имени
цитировать ответ
по умолчанию Re: Почему я не могу использовать отрицательное значение для OP_CHECKLOCKTIMEVERIFY

Честно говоря, я понятия не имею. Все, что я мог бы найти то, что фактическое nLockTime в передадите (не в скрипте OP_CLTV) должно быть unsiged. Я не знаю, почему он будет подписан на OP_CLTV. Привести его в вопросе о GitHub, вы получите больше ответов таким образом.

Да - это, кажется, основные разработчики не заморачиваться с этим форумом сейчас (не могу винить их - это в основном только рекламные сиг сообщения нонсенс в любом случае).

https://github.com/bitcoin/bitcoin/issues/7275

EDIT: Похоже, что я нашел ошибку.
CIYAM сейчас офлайн Пожаловаться на CIYAM   Ответить с цитированием Мультицитирование сообщения от CIYAM Быстрый ответ на сообщение CIYAM

3 января 2016, 5:28:44 PM   # 10
 
 
Сообщения: 314
Цитировать по имени
цитировать ответ
по умолчанию Re: Почему я не могу использовать отрицательное значение для OP_CHECKLOCKTIMEVERIFY

OP_CHECKLOCKTIMEVERIFY проверяются в EvalScript () в И / скрипт / interpreter.cpp

В нижней части цитируемого кода говорится в комментариях, что в редких случаях, когда аргумент может быть < 0 из-за какой-то арифметика делается первым, вы всегда можете использовать.

0 MAX CHECKLOCKTIMEVERIFY

Я думаю, что останавливает SCRIPT_ERR_NEGATIVE_LOCKTIME об ошибке, показанное в красном цвете.



https://github.com/bitcoin/bitcoin/blob/master/src/script/interpreter.cpp#L340-L380

котировка
            случай OP_CHECKLOCKTIMEVERIFY:
            {
                если (! (флаги & SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY)) {
                    // не включено; рассматривать как NOP2
                    если (флаги & SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS) {
                        вернуть set_error (serror, SCRIPT_ERR_DISCOURAGE_UPGRADABLE_NOPS);
                    }
                    ломать;
                }

                если (stack.size () < 1)
                    вернуть set_error (serror, SCRIPT_ERR_INVALID_STACK_OPERATION);

                // Обратите внимание, что в другом месте числовые опкоды ограничены
                // операнды в диапазоне от -2 ** 31 + 1 до 2 ** 31-1, однако это
                // законно опкоды для получения результатов, превышающих что
                // ассортимент. Это ограничение реализуется CScriptNum-х
                // по умолчанию предел 4 байта.
                //
                // Если мы сохранили до этого предела мы имеем проблему год 2038,
                // даже если поле nLockTime в сделках
                // самих uint32, который только становится бессмысленным
                // после 2106 года.
                //
                // Так как частный случай, мы говорим CScriptNum принять до
                // до 5 байт bignums, которые хорошо до 2 ** 39-1, хорошо
                // за пределы самого поля nLockTime 2 ** 32-1.
                Const CScriptNum nLockTime (stacktop (-1), fRequireMinimal, 5);

                // В редких случаях, когда аргумент может быть < 0 из-за
                // некоторые арифметические делается первым, вы всегда можете использовать
                // 0 MAX CHECKLOCKTIMEVERIFY
.
                если (nLockTime < 0)
                    вернуться set_error (serror, SCRIPT_ERR_NEGATIVE_LOCKTIME);

                // На самом деле сравнивать указанное время блокировки с транзакцией.
                если (! checker.CheckLockTime (nLockTime))
                    вернуть set_error (serror, SCRIPT_ERR_UNSATISFIED_LOCKTIME);

                ломать;
            }
хныкать сейчас офлайн Пожаловаться на хныкать   Ответить с цитированием Мультицитирование сообщения от хныкать Быстрый ответ на сообщение хныкать

3 января 2016, 5:37:38 PM   # 11
 
 
Сообщения: 1862
Цитировать по имени
цитировать ответ
по умолчанию Re: Почему я не могу использовать отрицательное значение для OP_CHECKLOCKTIMEVERIFY

0 MAX CHECKLOCKTIMEVERIFY

Да - я читал, что в коде - но как именно ты это делаешь?
CIYAM сейчас офлайн Пожаловаться на CIYAM   Ответить с цитированием Мультицитирование сообщения от CIYAM Быстрый ответ на сообщение CIYAM

3 января 2016, 5:51:15 PM   # 12
 
 
Сообщения: 314
Цитировать по имени
цитировать ответ
по умолчанию Re: Почему я не могу использовать отрицательное значение для OP_CHECKLOCKTIMEVERIFY

0 MAX CHECKLOCKTIMEVERIFY

Да - я читал, что в коде - но как именно ты это делаешь?


Не могли бы вы использовать после нажатия op _ max ноль в стек, а затем использовать OP_NOP2? Если возвращает op _ max больший из двух верхних позиций, то я предполагаю, что он будет возвращать ноль, а не отрицательное значения.

0xa4 Возвращение op _ max больший из двух верхних элементов

Я Googled примеров того, как использовать этот код, но ничего не нашел.
хныкать сейчас офлайн Пожаловаться на хныкать   Ответить с цитированием Мультицитирование сообщения от хныкать Быстрый ответ на сообщение хныкать

3 января 2016, 5:55:35 PM   # 13
 
 
Сообщения: 1862
Цитировать по имени
цитировать ответ
по умолчанию Re: Почему я не могу использовать отрицательное значение для OP_CHECKLOCKTIMEVERIFY

Не могли бы вы использовать после нажатия op _ max ноль в стек, а затем использовать OP_NOP2? Если возвращает op _ max больший из двух верхних позиций, то я предполагаю, что он будет возвращать ноль, а не отрицательное значения.

Это не кажется мне правильным - лично я думаю, что есть ошибка с тем, как OP_CHECKLOCKTIMEVERIFY работает.

Я сообщил об этом здесь: https://github.com/bitcoin/bitcoin/issues/7275 и кажется, что основные разработчики согласны, что-то не так.

К сожалению, эта проблема может быть родовой один (что без знака значение не может быть использовано в сценариях Bitcoin).
CIYAM сейчас офлайн Пожаловаться на CIYAM   Ответить с цитированием Мультицитирование сообщения от CIYAM Быстрый ответ на сообщение CIYAM

3 января 2016, 7:09:34 PM   # 14
 
 
Сообщения: 314
Цитировать по имени
цитировать ответ
по умолчанию Re: Почему я не могу использовать отрицательное значение для OP_CHECKLOCKTIMEVERIFY



К сожалению, эта проблема может быть родовой один (что без знака значение не может быть использовано в сценариях Bitcoin).



В этом разговоре сип объясняет, как Bitcoin принимает значения без знака, а затем передает подпись непосредственно в OpenSSL, и OpenSSL только разбирает все как беззнаковые. Поэтому вы должны прочитать строку байт и, если это уже не нули, добавьте 0x00 байты.

https://download.wpsoftware.net/bitcoin/wizards/2013/03/13-03-11.log

котировка
19:00 < HM> как подписанные значения даже работы
19:00 < сипа> они хранятся в виде дополнения до 2
19:00 < сипа> так что если старший бит первого байта установлен, это отрицательное юдоль
19:00 < сипа> но OpenSSL просто разбирает все как беззнаковое

19:02 < HM> Конечно, но как эти сделки получить признание?
19:02 < сипа> потому что OpenSSL анализирует все как беззнаковое
19:02 < сипа> и каждый Bitcoin полный узел использует OpenSSL для анализа подписи

19:04 < сипа> Представьте, что вы хотите сохранить значение 0x9999
19:04 < сипа> поэтому положительное целое число 39321
19:04 < сипа> правильное кодирование МЭД 0x009999
19:05 < сипа> а 0x9999 интерпретируется как -26215


19:06 < сипа> проблема, потому что OpenSSL знает, что ожидает целое число без знака, даже если вы храните 0x9999, он будет интерпретировать это, как 39321, а не как -26215
19:06 < HM> как сошедшие кодировать совершенно разумный 2 байт без знака в 3 байта с 1 бесполезного 0x00 байт?
19:06 < сипа> потому что это не значение без знака
19:06 < сипа> МЭД не имеет тип целого числа без знака

19:09 < сипа> в любом случае: нижняя строка: каждая реализация _должны_ принимает 0x9999, как 39321, даже если соответствующий стандартам DER анализатор может интерпретировать это как отрицательное число, которое вызвало бы ECDSA отклонить подпись, как вне диапазона

19:12 < сипа> а в некотором смысле это имеет смысл: "ОК вы дать мне эту подпись * синтаксическая * ки, синтаксический правильно. подождите ... это значение R отрицательна? я не ожидал отрицательного числа здесь ... давайте предположим, что вы просто пропустили 0 байт перед"
19:13 < сипа> Единственная проблема заключается в том, что Bitcoin передает подпись непосредственно в OpenSSL


19:13 < HM> поэтому в основном вы должны прочитать строку байтов и, если это уже не нулями, добавьте 0x00 байт

Ваш последний комментарий на Github спрашивает, если 5 байт разрешены.

котировка
хорошо - но ваши изменения позволяют 5 байт?
(Если это произойдет, то я думаю, проблема будет решена)
мы, очевидно, нужно работать: 0x017f, 0x02ff00 и 0x03ffff00 по крайней мере,

Это говорит в комментарии здесь CScriptNum закодирован принимать до 5 байт bignums, которые хорошо до 2 ** 39-1, а за пределы самого поля nLockTime 2 ** 32-1.


https://github.com/bitcoin/bitcoin/blob/master/src/script/interpreter.cpp#L355-L358

котировка
               // Если мы сохранили до этого предела мы имеем проблему год 2038,
                // даже если поле nLockTime в сделках
                // самих uint32, который только становится бессмысленным
                // после 2106 года.
                //
               // Так как частный случай, мы говорим CScriptNum принять до
                // до 5 байт bignums, которые хорошо до 2 ** 39-1, хорошо
                // за пределы самого поля nLockTime 2 ** 32-1.

                Const CScriptNum nLockTime (stacktop (-1), fRequireMinimal, 5);
хныкать сейчас офлайн Пожаловаться на хныкать   Ответить с цитированием Мультицитирование сообщения от хныкать Быстрый ответ на сообщение хныкать

4 января 2016, 2:26:40 AM   # 15
 
 
Сообщения: 1862
Цитировать по имени
цитировать ответ
по умолчанию Re: Почему я не могу использовать отрицательное значение для OP_CHECKLOCKTIMEVERIFY

Проблема с добавлением нулевого байта заключается в том, что есть еще один чек, выдвигая байты, что вы подтолкнули "Минимальное количество возможно",

Так что в настоящее время не принимает 0x02ff00, который, как он, по-видимому, должны принять 255.

Проблема не будет влиять на mainnet, поскольку его блок номер будет отображаться как неотрицательные числа (и, вероятно, также не влияет на * значение Никса метки времени).
CIYAM сейчас офлайн Пожаловаться на CIYAM   Ответить с цитированием Мультицитирование сообщения от CIYAM Быстрый ответ на сообщение CIYAM

4 января 2016, 2:43:54 PM   # 16
 
 
Сообщения: 464
Цитировать по имени
цитировать ответ
по умолчанию Re: Почему я не могу использовать отрицательное значение для OP_CHECKLOCKTIMEVERIFY

Проблема с добавлением нулевого байта заключается в том, что есть еще один чек, выдвигая байты, что вы подтолкнули "Минимальное количество возможно",

Так что в настоящее время не принимает 0x02ff00, который, как он, по-видимому, должны принять 255.

Проблема не будет влиять на mainnet, поскольку его блок номер будет отображаться как неотрицательные числа (и, вероятно, также не влияет на * значение Никса метки времени).


02 FF 00 является кратчайшим представление 255 - таким образом, я предполагаю, что ошибка где-то в другом месте.
hhanh00 сейчас офлайн Пожаловаться на hhanh00   Ответить с цитированием Мультицитирование сообщения от hhanh00 Быстрый ответ на сообщение hhanh00

4 января 2016, 2:49:38 PM   # 17
 
 
Сообщения: 1862
Цитировать по имени
цитировать ответ
по умолчанию Re: Почему я не могу использовать отрицательное значение для OP_CHECKLOCKTIMEVERIFY

02 FF 00 является кратчайшим представление 255 - таким образом, я предполагаю, что ошибка где-то в другом месте.

Да - этот вопрос был помечен как ошибка на Github.
CIYAM сейчас офлайн Пожаловаться на CIYAM   Ответить с цитированием Мультицитирование сообщения от CIYAM Быстрый ответ на сообщение CIYAM



Как заработать Биткоины?

Bitcoin Wallet * Portefeuille Bitcoin * Monedero Bitcoin * Carteira Bitcoin * Portafoglio Bitcoin * Bitcoin Cüzdan * 比特币钱包

bitcoin-zarabotat.ru
Почта для связи: bitcoin-zarabotat.ru@yandex.ru

3HmAQ9FkRFk6HZGuwExYxL62y7C1B9MwPW