Crear hash de script de Pay to Witness en Pay to Script Hash Address

Estoy tratando de generar una dirección compatible con segwit de múltiples firmas como un P2WSH anidado en BIP16 P2SH como se describe en BIP141. Básicamente, quiero construir una dirección P2WSH anidada en P2SH a partir de n claves públicas y las m requeridas para firmar un tx válido.

(m required, n public keys) -> base 58 bitcoin address

Estoy tratando de seguir los ejemplos provistos en Mastering Bitcoin para verificar los números que obtengo, pero definitivamente me estoy perdiendo algo. (Voy a vincular todas las secciones a las que hago referencia, pero no debería ser necesario ir y leerlas; con suerte, la falla en mi proceso será evidente para alguien).

  1. Él define un estándar P2SH 2-of-5 multisig: OP_2 key0 key1 key2 key3 key4 OP_5 OP_CHECKMULTISIGdonde las claves están

    04C16B8698A9ABF84250A7C3EA7EEDEF9897D1C8C6ADF47F06CF73370D74DCCA01CDCA79DCC5C395D7EEC6984D83F1F50C900A24DD47F569FD4193AF5DE762C587
    04A2192968D8655D6A935BEAF2CA23E3FB87A3495E7AF308EDF08DAC3C1FCBFC2C75B4B0F4D0B1B70CD2423657738C0C2B1D5CE65C97D78D0E34224858008E8B49
    047E63248B75DB7379BE9CDA8CE5751D16485F431E46117B9D0C1837C9D5737812F393DA7D4420D7E1A9162F0279CFC10F1E8E8F3020DECDBC3C0DD389D9977965
    0421D65CBD7149B255382ED7F78E946580657EE6FDA162A187543A9D85BAAA93A4AB3A8F044DADA618D087227440645ABE8A35DA8C5B73997AD343BE5C2AFD94A5
    043752580AFA1ECED3C68D446BCAB69AC0BA7DF50D56231BE0AABF1FDEEC78A6A45E394BA29A1EDF518C022DD618DA774D207D137AAB59E0B000EB7ED238F4D800
    

de los cuales el HASH160es 54c557e07dde5bb6cb791c7a540e0a4796f5e97e. Ok hasta ahora todo bien; Tengo el mismo valor que el libro.

  1. Luego analiza una transacción P2WSH y hace referencia al mismo script multisig

    Vimos este tipo de script en [p2sh]. En ese ejemplo, la empresa de Mohammed utilizó P2SH para expresar un script de varias firmas. Los pagos a la empresa de Mohammed se codificaron con un script de bloqueo como este: Ejemplo de script de salida P2SH

    HASH160 54c557e07dde5bb6cb791c7a540e0a4796f5e97e EQUAL
    

    y luego define el script de salida P2WSH

    Ejemplo de secuencia de comandos de salida P2WSH

    0 9592d601848d04b172905e0ddb0adde59f1590f1e553ffc81ddc4b0ed927dd73
    

    [...] el programa Segregated Witness consta de dos valores insertados en la pila: una versión testigo (0) y el hash SHA256 de 32 bytes del script de canje.

¿Cómo obtiene este script de salida P2WSH?

Si tomo el script P2SH de ejemplo, script.

HASH160(script) = 54c557e07dde5bb6cb791c7a540e0a4796f5e97e
SHA256(script) = a9b7b38d972cabc7961dbfbcb841ad4508d133c47ba87457b4a0e8aae86dbb89
SHA256(HASH160(script)) = 9796557ff06241ca75fdbc09359e9916186cb8398dc01fd58afc72a3ac86ce63

Ninguno de los cuales es igual al provisto:

9592d601848d04b172905e0ddb0adde59f1590f1e553ffc81ddc4b0ed927dd73

También intenté comprimir las claves públicas y todavía no pude obtener ese valor. Estoy bastante seguro de que sigue hablando del mismo ejemplo, porque continúa con

La empresa de Mohammed puede gastar la producción de P2WSH [...]

Si puedo averiguar el hash SHA256 de 32 bytes del script de canje, creo que estoy listo, porque en ese punto se puede calcular la dirección.

sha256_value = 9592d601848d04b172905e0ddb0adde59f1590f1e553ffc81ddc4b0ed927dd73
p2wsh_output = OP_0 + OP_32 + sha256_value
address = Base58(05 + HASH160(p2wsh_output))

Respuestas (2)

Este es de hecho un error en el libro: https://github.com/bitcoinbook/bitcoinbook/issues/440

Consulte esta diferencia para conocer los pasos correctos.

me parece que

... creando una salida Pay-to-Witness-Script-Hash (P2WSH) que se vería así : 0 9592d601848d04b172905e0ddb0adde59f1590f1e553ffc81ddc4b0ed927dd73...

significa que este hash es un ejemplo no derivado de los datos anteriores

Ok, genial, ¿estoy haciendo el resto de los pasos en ese momento? / ¿Existen otros vectores de prueba con los que pueda verificar? Entonces seria la direccion Base58(05 + HASH160(OP_0 + OP_32 + {sha256 standard p2sh scrit}))?
Creo que puede 'extraer' los 'vectores de prueba' de la cadena de bloques actual de bitcoin/testnet en lugar de verificar fuentes falsas de un libro :)
De acuerdo. Entonces, ¿el proceso es correcto?
Tampoco recibí 9592d6018...con los datos proporcionados, pero no dediqué mucho tiempo a esta pregunta. Puedo decir que hay muchas transacciones de este tipo en blockchain. por ejemplo, puede tomar el par testnet testnet.smartbit.com.au/tx/… y testnet.smartbit.com.au/tx/… e intentar obtener 1e8dda3...de5221038e81669c...