Как получить значение Z, также известное как хэш выходов, которые нужно подписать

Я понимаю, что это делает "OP_CHECKSIG", но я не понимаю, как его воссоздать. Я попробовал SHA1 и SHA256 некоторой информации в данной биткойн-транзакции, но это не дало мне подтвержденных значений Z. Может ли кто-нибудь выбрать транзакцию, сказать мне, какая это и показать мне, что мне нужно вырезать и вставить в калькулятор SHA1, чтобы получить фактическое значение Z?

The hash value of TX 9ec4bc49e828d924af1d1029cacf709431abbde46d59554b62bc270e3b29c4b1 is supposed to be z = c0e2d0a89a348de88fda08211c70d1d7e52ccef2eb9459911bf977d587784c6e and also z = 17b0f41c8c337ac1e18c98759e83a8cccbc368dd9d89e5f03cb633c265fd0ddc but I do not see how the z values ​​are achieved.

Ответы (1)

0) читать Как выкупить базовый Tx?

1) возьмите вашу транзакцию как массив байтов

2) заменить все входные скрипты на пустые скрипты

3) заменить один входной скрипт на оригинальный "OP_DUP OP_HASH160..."

4) добавить "тип хэш-кода" SIGHASH_ALL

5) взять ша256 (ша256 (данные))

вот и все

Посмотрите на мой код

const MyKey32 Transaction::getRawHash ( const int n, const QByteArray& scr ) const
{
  MyByteArray ret;                                    // create empty array
  Stream stream ( s );
  ret.putInt32 ( stream.readU32 ( ) );                // version
  ret.putVarInt ( stream.readVar ( ) );               // input count
  for ( int i ( 0 ); i < inputs; i++ )                // copy all inputs
  {
    ret.append ( stream.readHash ( ) );
    ret.putInt32 ( stream.readU32 ( ) );
    stream.skipVarData ( );                            // skip original script
    ret.putPrefixed ( i == n ? scr : QByteArray ( ) ); // !!! script replacement
    ret.putInt32 ( stream.readU32 ( ) );
  }
  ret.putVarInt ( stream.readVar ( ) );                // output count
  for ( int i ( 0 ); i < outputs; i++ )                // copy all outputs byte-by-byte
  {
    ret.putInt64 ( stream.readU64 ( ) );
    ret.putPrefixed ( stream.readVarData ( ) );
  }
  ret.putInt32 ( stream.readU32 ( ) );                 // lock
  ret.putInt32 ( SIGHASH_ALL );                        // !!! append hashcode
  return MyKey32 ( ret.constData ( ), ret.size ( ) );  // create hash256 of array
}
Это немного помогает мне, но пример существующей транзакции позволит мне (и, как я полагаю, другим) понять ее лучше всего. Кроме того, вы уверены, что это приводит к тому, что в уравнении называется значением «Z»?
Да, я уверен, что этот метод работает. Это часть программы, которая ищет скомпрометированные закрытые ключи. Результаты (не свежие) здесь bitcointalk.org/index.php?topic=461351.msg6408633#msg6408633 () Я могу помочь вам больше, но не бесплатно.
Нет ли случайно веб-сайта, на который я мог бы просто вставить что-нибудь, и он даст мне этот хэш? Слишком много шагов в этом процессе в настоящее время мне не по силам.