Реальная история.
Bhai Logon,
Я слышал много о malleated сделок в последнее время.
Я был ошеломлен, когда я увидел, что один из моих сделок
Вот был показан, как отсутствующие, хотя монеты были вычтены из моего бумажника. Позже я узнал, что через malleated сделка была подтверждена.
Допустим, вы посылаете монеты от А до B. Там мог Tx хэши, которые могли бы представить это, один с низким S подписи, а другой с высокой подписью S. Оба были признаны действительными и любой из двух может быть включен в блок. Но, после внедрения
BIP 62, только низкий S создается последними версиями Bitcoin ядра.
Я пытался читать на malleated сделок.
То, что я понимаю,
1) Есть некоторые части трансляции операции (в частности, часть подписи), которые могут быть изменены без шахтеров, отвергающих сделку
2) Это связано с высоким значением / ами низкой ами используемого в подписи
Скажем sigining функция е (п). Предположим, что в некоторой криптографической е (п) определяется как SQRT (п). Теперь, е (п) возвращает может быть либо 2 или -2, когда п = 4. Это ковкость.
Я немного технически оспорено и хотели бы получить помощь / указатели о том, как я могу имеющий молоточек транзакцию.
Следующая цитата объясняет, как вы можете это сделать в Bitcoin ...
Как определить, является ли он подписан с максимумами или нет?
Шаг 1: Найти подпись в scriptSig
В вашем примере формат:
Для того, чтобы визуально исследовать его, код ASM или блок-исследователь вашего выбора может помочь. Мне очень нравится этот один:
http://srv1.yogh.io/#tx:id:36d047abcb966f58aa668f050d60254730a3c07c9fd51e869e8b1a773c05d516Шаг 2: Разделить подпись на компоненты
С помощью
bitcoin.stackexchange.comОбратите внимание, что изображение также включает в себя "подпись типа хэш", Который не является частью кодирования DER, но, как правило, показаны на исследователей.
Шаг 3: Проверить, является ли значение S ниже кривой порядка
Для сравнения:
7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1 <- порядок п G
6a5611667d1eb147d6a7352cbf37a2ddec8d9b37fcad17a0c9a9c6caff287f24 <- значение S
В этом случае величина S действительно меньше, чем п, и, следовательно, это "низкий S",
В случае, если вы заинтересованы в
amaclinкод «s это здесь ...
статический BOOL Малл (Const QByteArray& д, Const сделка& ТХ, QByteArray& RET)
{
если (d.size () > 3000) // пропуском большой TXS
вернуться ложным;
если (tx.countInputs () < 1) // параноидально проверка
{Вернуться ложным; }
если (tx.countOutputs () < 1) // параноидально проверка
{Вернуться ложным; }
для (INT I (tx.countOutputs ()); --i >= 0; )
если (tx.isOutputP2SH (я)) // я не Malle Txs с p2sh выходами
вернуться ложным;
Const TxInput в (tx.getInput ((qrand () & 0xffff)% tx.countInputs ())); // принимать случайный ввод
Const QByteArray s0 (in.getScript ());
EvalScript ESCR (s0);
Const QList список (escr.evaluateInput ());
если (list.size ()! = 2)
{Вернуться ложным; }
Const MyByteArray сиг (list.at (0)); // взять подпись
символ BUF [64];
quint8 sighash;
если (! sig.signatureRS (ЬиЕ, &sighash))
{Вернуться ложным; } // не в состоянии разобрать
если (sighash! = SIGHASH_ALL)
{Вернуться ложным; }
Const MyKey32 г (BUF);
Const MyKey32 с (ЬиМ + 32);
QByteArray дер;
der.append ((символ) 0x30);
der.append ((символ) 0x00);
INT Len (0);
der.append ((символ) 0x02); Len ++;
если (r.at (0) == 0)
{Вернуться ложным; }
если ((r.at (0) & 0xFF) < 0x80)
{
der.append ((символ) 0x20); Len ++;
der.append (г); Len + = 32;
}
еще
{
der.append ((символ) 0x21); Len ++;
der.append ((символ) 0x00); Len ++;
der.append (г); Len + = 32;
}
QByteArray xder (дер);
Const MyKey32 сс (s.mirror ());
der.append ((символ) 0x02); Len ++;
если (ss.at (0) == 0)
{Вернуться ложным; }
если ((ss.at (0) & 0xFF) < 0x80)
{Вернуться ложным; }
еще
{
der.append ((символ) 0x21); Len ++;
der.append ((символ) 0x00); Len ++;
der.append (сс); Len + = 32;
}
der.data () [1] = Len;
der.append ((символ) 1); // SIGHASH_ALL
xder.append ((символ) 0x02);
если (s.at (0) == 0)
{Вернуться ложным; }
если ((s.at (0) & 0xFF) < 0x80)
{
xder.append ((символ) 0x20);
xder.append (ы);
}
еще
{Вернуться ложным; }
xder.data () [1] = Len - 1;
xder.append ((символ) 1); // SIGHASH_ALL
Const INT ЗШЗ (STRLEN (xder.toHex () .constData ()) / 2);
xder.prepend ((символ) ЗШЗ);
Const INT zsz1 (der.size ());
der.prepend ((символ) zsz1);
QString ул (d.toHex ());
если (str.indexOf (xder.toHex () .constData ()) <= 0)
{Вернуться ложным; }
Const INT поз (str.indexOf (xder.toHex () .constData ()) / 2);
Const INT SLEN (d.at (поз - 1));
xder.prepend ((символ) SLEN);
der.prepend ((символ) (SLEN + 1));
если (str.indexOf (xder.toHex () .constData ()) <= 0)
{Вернуться ложным; }
str.replace (xder.toHex () .constData (), der.toHex () .constData ()); // Malle ТХ!
RET = QByteArray :: fromHex (str.toLatin1 ());
возвращает истину;
}
Источник:
https://www.reddit.com/r/Buttcoin/comments/3okxo5/does_amaclin_need_some_btc_to_wreck_havoc/cvyfy53