¿Cómo generar el resumen de una transacción de bitcoin sin procesar para verificar la firma de una entrada específica?

Estoy escribiendo un proceso independiente que necesita verificar que un UTXO conocido sea parte de una nueva transacción con una firma válida.

Entradas [ UTXO, transacción sin procesar, input_number ]

¿Cómo verifico la firma para esta entrada específica?

Según tengo entendido, dependiendo del SIGHASH, necesitaría analizar toda la transacción y reemplazar/eliminar algunos datos. Sin embargo, los bytes de longitud parecen hacer que todo el proceso sea extremadamente complejo.

¿Una transacción de segwit hace que todo sea más fácil? ¿O todavía hay bytes que deben eliminarse según SIGHASH?

En otros comentarios. en general, ¿las API que devuelven "transacciones sin procesar" ya no tendrán los datos de firma para las transacciones segwit? ¿O están todas añadidas al final?

Respuestas (1)

Sin embargo, los bytes de longitud parecen hacer que todo el proceso sea extremadamente complejo.

No muy complejo. Aquí hay una parte de mi código para generar resumen para transacciones estándar que no son segwit y entradas sighash_all (no necesito y no he probado otros tipos de hash).

const MyKey32 Transaction::getDigest ( const int n, const QByteArray& scr ) const
{
  MyByteArray data;                                 // create empty array
  MyStream stream ( s );                            // source transaction is a stream
  data.putInt32 ( stream.readU32 ( ) );             // version
  data.putVarInt ( stream.readVar ( ) );            // input count
  for ( int i ( 0 ); i < inputs; i++ )              // copy all inputs
  {
    data.putArray ( stream.readAdvance ( 36 ), 36 );// copy 32 byte hash as is + copy 4 bytes index
    data.nop ( stream.skipVarData ( ) );            // skip original script and do nothing
    data.putPrefixedCond ( i ^ n, scr );            // script replacement: empty or given in param
    data.putInt32 ( stream.readU32 ( ) );           // sequence
  }
  data.putVarInt ( stream.readVar ( ) );            // output count
  for ( int i ( 0 ); i < outputs; i++ )             // copy all outputs byte-by-byte
  {
    data.putInt64 ( stream.readU64 ( ) );
    data.putPrefixed ( stream.readVarData ( ) );
  }
  return data
      .putInt32 ( stream.readU32 ( ) )              // lock
      .putInt32 ( SIGHASH_ALL )                     // append hashcode
      .sha256d ( );                                 // double-sha256
}
Sí, estoy de acuerdo en que este caso base es simple. ¡Y yo también solo uso transacciones no segwit sighash_all codificadas en QT! sin embargo, mi problema es tratar de probar que un UTXO conocido ya se "gastó". Quiero hacer esto fuera de línea, sin acceso a la red Bitcoin. Una cadena de bytes firmada que contiene mi UTXO en el resumen se considera "gastada". Esta es la pieza final de mi código de intercambio atómico personalizado en una nueva cadena de bloques.