Есть в биткоине такой адрес 15wJjXvfQzo3SXqoWGbWZmNYND1Si4siqV на котором лежит немножко, по курсу около 155 долларов.
Этот адресок примечателен тем, что он получается из компрессированного публичного ключа "020000000000000000000000000000000000000000000000000000000000000000". Для тех, кто не понял, компрессированный ключ - это когда координата "у" отбрасывается, а остается только координата х. И к ней добавляется либо двойка либо тройка - в зависимости от того, положительным ли был отброшенный игрек.
Если у вас есть компрессированный публичный ключ, то найти "у" в любой момент можно, решив уравнение относительно игрека: y^2 = x^3+7.
В данном случае вместо х подставляем 0, и получается y^2 = 7.
Речь идет о модулярной арифметике, само собой. И в данном случае все считается по модулю числа p=2^256 - 0x1000003d1, которое простое.
На сегодня весь софт колбасит это вычисление пользуясь правилом, что если нам нужен корень по модулю p, и при этом (p mod 4 == 3), то надо просто возвести в степень (p+1)/4 - и получишь результат!
И вроде бы наклевывается способ достать эти биткоины. Ведь то, что точки с координатой х=0 нету в поле - это непроверямо, и если мы найдем координату у, то такая точка будет лежать на эллиптической кривой. И все должно проканать. Нужную транзакцию просто набьем ручками...
Ага, не тут то было. Не работает.
Оказывается, в модулярной арифметике не из всех чисел можно извлечь корень квадратный. Впринципе, сейчас мне это уже очевидно. И 7 - это как раз такое число, из которого корень не извлекается. Когда мы возводим семерку в степень (p+1)/4, то получаетcя какое-то число. Если мы берем квадрат числа - то назад эта же семерка не получается %(, а выходит 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc28. И эта проверка есть в коде bitcoind: https://github.com/bitcoin/bitcoin/blob/master/src/secp256k1/src/field_impl.h#L133-L136
То есть, сначала взяли корень описанным способом - а потом возвели результат в квадрат и сравнили с исходным значением, убедившись, что все посчитано правильно. Если из числа можно извлечь квадрат - то оно и возведется в квадрат нормально.
По этой причине, не получается сделать такой биткоиновский скрипт, который прошел бы валидность. Да, я нашел публичный ключ, от которого хэш будет такой, как требует выходной скрипт. Но там на этот кошелек тип скрипта P2PKH (такой: https://learnmeabitcoin.com/technical/p2pkh ), для такого скрипта нужна еще и сигнатура, а валидную сигнатуру сделать неполучилось %((( А вот если бы там был тип транзакции P2SH вот такой https://learnmeabitcoin.com/technical/p2sh , то все получилось бы, скорей всего.
Теперь что касается 1FYMZEHnszCHKTBdFZ2DLrUuk3dGwYKQxh на котором 3.7btc (около 80тыс$ на сегодня). Я о нем писал ранее. Этот аддрес получается из массива длиной 1 байт, и этот байт равен нулю. Обычно же, аддреса делаются из массива 65 байт: четверка, символизирующая что указан игрек и по 32 байта на икс и игрек координату. Убедиться можно тут
http://gobittest.appspot.com/Address введя "00" в поле Public ECDSA Key.
Собственно, идея была в том, что нам на самом деле пофиг, есть ли точка в поле, потому что это непроверяемо. Лишь бы она лежала на кривой. Точка, которой нет в поле, но которая на кривой лежит, пройдет все тесты. То есть, получается нам нужно лишь подобрать сигнатуру подписи, которая совпадет по формулам проверки.
Означает ли это, что достать биткоины оттуда не выйдет? Нет, не означает. приватные ключи - 256 битные, а хеши публичных ключей - 160 битные. Это значит, что может быть около 2^96 публичных ключей которые подойдут. Это больше, чем атомов в солнечной системе. Среди них ну практически-наверняка будет такой, который в поле.
Этот адресок примечателен тем, что он получается из компрессированного публичного ключа "020000000000000000000000000000000000000000000000000000000000000000". Для тех, кто не понял, компрессированный ключ - это когда координата "у" отбрасывается, а остается только координата х. И к ней добавляется либо двойка либо тройка - в зависимости от того, положительным ли был отброшенный игрек.
Если у вас есть компрессированный публичный ключ, то найти "у" в любой момент можно, решив уравнение относительно игрека: y^2 = x^3+7.
В данном случае вместо х подставляем 0, и получается y^2 = 7.
Речь идет о модулярной арифметике, само собой. И в данном случае все считается по модулю числа p=2^256 - 0x1000003d1, которое простое.
На сегодня весь софт колбасит это вычисление пользуясь правилом, что если нам нужен корень по модулю p, и при этом (p mod 4 == 3), то надо просто возвести в степень (p+1)/4 - и получишь результат!
И вроде бы наклевывается способ достать эти биткоины. Ведь то, что точки с координатой х=0 нету в поле - это непроверямо, и если мы найдем координату у, то такая точка будет лежать на эллиптической кривой. И все должно проканать. Нужную транзакцию просто набьем ручками...
Ага, не тут то было. Не работает.
Оказывается, в модулярной арифметике не из всех чисел можно извлечь корень квадратный. Впринципе, сейчас мне это уже очевидно. И 7 - это как раз такое число, из которого корень не извлекается. Когда мы возводим семерку в степень (p+1)/4, то получаетcя какое-то число. Если мы берем квадрат числа - то назад эта же семерка не получается %(, а выходит 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc28. И эта проверка есть в коде bitcoind: https://github.com/bitcoin/bitcoin/blob/master/src/secp256k1/src/field_impl.h#L133-L136
То есть, сначала взяли корень описанным способом - а потом возвели результат в квадрат и сравнили с исходным значением, убедившись, что все посчитано правильно. Если из числа можно извлечь квадрат - то оно и возведется в квадрат нормально.
По этой причине, не получается сделать такой биткоиновский скрипт, который прошел бы валидность. Да, я нашел публичный ключ, от которого хэш будет такой, как требует выходной скрипт. Но там на этот кошелек тип скрипта P2PKH (такой: https://learnmeabitcoin.com/technical/p2pkh ), для такого скрипта нужна еще и сигнатура, а валидную сигнатуру сделать неполучилось %((( А вот если бы там был тип транзакции P2SH вот такой https://learnmeabitcoin.com/technical/p2sh , то все получилось бы, скорей всего.
Теперь что касается 1FYMZEHnszCHKTBdFZ2DLrUuk3dGwYKQxh на котором 3.7btc (около 80тыс$ на сегодня). Я о нем писал ранее. Этот аддрес получается из массива длиной 1 байт, и этот байт равен нулю. Обычно же, аддреса делаются из массива 65 байт: четверка, символизирующая что указан игрек и по 32 байта на икс и игрек координату. Убедиться можно тут
http://gobittest.appspot.com/Address введя "00" в поле Public ECDSA Key.
Собственно, идея была в том, что нам на самом деле пофиг, есть ли точка в поле, потому что это непроверяемо. Лишь бы она лежала на кривой. Точка, которой нет в поле, но которая на кривой лежит, пройдет все тесты. То есть, получается нам нужно лишь подобрать сигнатуру подписи, которая совпадет по формулам проверки.
Означает ли это, что достать биткоины оттуда не выйдет? Нет, не означает. приватные ключи - 256 битные, а хеши публичных ключей - 160 битные. Это значит, что может быть около 2^96 публичных ключей которые подойдут. Это больше, чем атомов в солнечной системе. Среди них ну практически-наверняка будет такой, который в поле.