Cómo obtener el valor Z, también conocido como Hash, de las salidas que se firmarán

Entiendo que "OP_CHECKSIG" hace esto, pero no puedo ver cómo recrearlo. Probé SHA1 y SHA256 de parte de la información en una transacción de bitcoin dada, pero no me dio valores confirmados de Z. ¿Puede alguien seleccionar una transacción, decirme cuál es y mostrarme lo que necesito para cortar y pegar? en una calculadora SHA1 para obtener el valor Z real?

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.

Respuestas (1)

0) leer ¿Cómo redimir un Tx básico?

1) tome su transacción como una matriz de bytes

2) reemplazar todos los guiones de entrada por guiones vacíos

3) reemplace un script de entrada por el original "OP_DUP OP_HASH160..."

4) agregar "tipo de código hash" SIGHASH_ALL

5) tomar sha256 (sha256 (datos))

eso es todo

Echa un vistazo a mi código

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
}
Eso me ayuda un poco, pero un ejemplo de una transacción existente me permitiría (y otros, supongo) entenderlo mejor. Además, ¿está seguro de que eso da como resultado lo que se conoce como el valor "Z" en la ecuación?
Sí, estoy seguro de que este método funciona. Esta es una parte de un programa que busca claves privadas comprometidas. Los resultados (no recientes) están aquí bitcointalk.org/index.php?topic=461351.msg6408633#msg6408633 () Puedo ayudarte más pero no gratis.
¿Hay, por casualidad, un sitio web en el que simplemente pueda pegar algo y me dará este hash? Demasiados pasos para este proceso están actualmente más allá de mí.