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?
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
}
jaybny