Cuando se firma una entrada segwit, la firma se comprometerá con el script testigo (o un script similar a p2pkh en el caso de p2wpkh). Esto se especifica en BIP143 :
- Para
P2WPKH
el programa testigo, elscriptCode
es0x1976a914{20-byte-pubkey-hash}88ac
.- Para
P2WSH
el programa de testigos,
- si
witnessScript
no contiene ningunoOP_CODESEPARATOR
, sescriptCode
serializawitnessScript
como scripts en su interiorCTxOut
.- si
witnessScript
contiene algunoOP_CODESEPARATOR
,scriptCode
es elwitnessScript
pero eliminando todo hasta e incluyendo el último ejecutadoOP_CODESEPARATOR
antes de que se ejecute el código de operación de verificación de firma, serializado como scripts dentro deCTxOut
. (La semántica exacta se demuestra en los ejemplos a continuación)
¿Cuál es la razón detrás de esto? ¿Por qué el hash no se compromete con el script pubkey como en los pagos heredados (p2pkh y p2sh)? Esta diferencia complica un poco el código de firma/verificación, así que supongo que debe haber alguna buena razón para ello.
Tal vez mi pregunta debería ser: ¿Por qué el hash se compromete con cualquier script para las entradas de segwit? En las firmas heredadas, poner scriptPubkey en scriptSig para la entrada actual es una forma (complicada, ver más abajo) de evitar la reutilización de firmas entre entradas. Pero en segwit, esto se logra con la outpoint
parte del algoritmo hash. Entonces, ¿no podríamos saltarnos la scriptCode
parte?
Me parece que hay otra razón por la que aplicamos hash al scriptPubkey para las firmas heredadas y al script testigo para las firmas segwit, ya que hay formas más sencillas de evitar la reutilización de firmas:
Solo estoy adivinando, pero al hacer que la transacción se confirme con scriptCode, nos aseguramos de que el firmante sepa qué script está firmando. Una billetera de hardware, por ejemplo, solo puede estar segura de que el punto de salida 1234...cdef:0 paga un script en particular si le damos la transacción que creó ese punto de salida (para que pueda cifrar esa transacción, verificar el txid, extraer el scriptPubKey , y compárelo con un script de testigo proporcionado). Debido a que una transacción (sin datos de testigos) puede tener un tamaño de casi un megabyte y una transacción de gasto puede referirse a miles de transacciones anteriores, creamos una situación en la que los dispositivos de bajos recursos, como las billeteras de hardware, tienen dificultades para verificar lo que están estoy firmando
Por el contrario, con BIP143, solo necesitamos decirle a la billetera cada uno de los códigos de script para los que se supone que debe firmar. BIP141 permite que sean de hasta 10 000 bytes, que es solo 1/100 del tamaño máximo de una transacción. La billetera puede examinar estos scriptCodes, asegurarse de que estén de acuerdo con lo que espera la billetera y comprometerse con ellos en su firma sabiendo que si la persona que les envió el scriptCode mintió sobre el scriptCode real, la firma no será válida.
Esta es la misma razón por la que el formato de firma BIP143 se compromete con el valor de cada entrada. Antes tenía que procesar transacciones anteriores para obtener sus montos de salida; ahora simplemente acepta los datos que recibe y los firma sabiendo que, si alguien le mintió sobre la cantidad, la firma no será válida.
kalle rosenbaum
David A. Harding
kalle rosenbaum
kalle rosenbaum