Decodificación de direcciones P2SH

¿Cuál es el proceso de decodificación de la dirección P2SH?
Tenemos esta información hasta ahora.

Veamos un ejemplo tx bea1e7ae7ecdc502215717f30d62a12085bb2866d8db730dfb626b60c337534c

El script hexadecimal (para la primera salida) es:514104398184a2cef0d7b73ed7a3a1d4ad16296c3c6986bed0bd72775060aae9891979eaea1efb28d7eb1da3304ec38a98b42086e3be2ceba82b0e932128ec422a6fc2210250504b2d4245544120506565722d506565722d6e6574776f726b2062657461212102553432353135362e31323234202020202020202020202020202020202020202053ae

la decodificación del script da:

{
    "asm" : "1 04398184a2cef0d7b73ed7a3a1d4ad16296c3c6986bed0bd72775060aae9891979eaea1efb28d7eb1da3304ec38a98b42086e3be2ceba82b0e932128ec422a6fc2 0250504b2d4245544120506565722d506565722d6e6574776f726b206265746121 02553432353135362e313232342020202020202020202020202020202020202020 3 OP_CHECKMULTISIG",
    "reqSigs" : 1,
    "type" : "multisig",
    "addresses" : [
        "1TestLVFK8DsRYFQkDDwvfsPHqUqWPBe7",
        "1H16KgZg3wHgApvHvZkSocxN6ibzNT9Cc7",
        "1N31mRc4tiGumXdRmb1Bzk9BoG4Bc7Ctbi"
    ],
    "p2sh" : "3KQYMMqMBTv8254UqwmaLzW5NDT879KzK8"
}

¿Podemos desglosar este guión?

No creo que puedas "decodificar" un hash de script. Solo tiene que proporcionar un script coincidente que, cuando se convierte en hash, es igual al hash proporcionado.
¿Podemos derivar la dirección p2sh del script? Puedo hacerlo usando pybitcointools, pero quiero saber los pasos a seguir
dirección p2sh = Base58Check(SHA256(RIPEMD160(script)))

Respuestas (2)

Aquí está el ejemplo de la transacción de la pregunta.

el script de canje es:514104398184a2cef0d7b73ed7a3a1d4ad16296c3c6986bed0bd72775060aae9891979eaea1efb28d7eb1da3304ec38a98b42086e3be2ceba82b0e932128ec422a6fc2210250504b2d4245544120506565722d506565722d6e6574776f726b2062657461212102553432353135362e31323234202020202020202020202020202020202020202053ae

para derivar la dirección P2SH hacemos lo siguiente:
sha256(redeemScript)
usando PHP:

$sha256= hash('sha256',hexStringToByteString($redeemScript));
SHA256: 8b1c6ece53385d6ae3cf3c40fc6239389a7006d9f46047d5d67c3fa78dd2afcc

ripemd160 el hash resultante

$ripemd160=hash('ripemd160',hexStringToByteString($sha256));
RIPEMD160: c25497b8a9bcc393f47abd19a435d1af440916ac

anteponer "05" y hash dos veces

$hashTwice = hash('sha256',hexStringToByteString (hash('sha256',hexStringToByteString ("05" .  $ripemd160))));
double hash: 479ce4efc25c4195ef3cc015d74c45034a2c72f21e322ba30f5c26d872e58b38

primeros 4 bytes es el chscksum

$checksum=substr($hashTwice,0,8);
checksum: 479ce4ef

componer la dirección como:

codificación base58: [versión de un byte] [hash de 20 bytes] [suma de comprobación de 4 bytes]

$addr= "05" . $ripemd160 . $checksum;
address: 05c25497b8a9bcc393f47abd19a435d1af440916ac479ce4ef

codificación base58

$p2sh=base58_encode($to_encode);
base58: 3KQYMMqMBTv8254UqwmaLzW5NDT879KzK8

y obtenemos la dirección P2SH correcta: 3KQYMMqMBTv8254UqwmaLzW5NDT879KzK8

Para calcular la dirección multisig 1 de 3 para el ejemplo anterior, uno toma las 3 claves públicas del campo asm y simplemente realiza esta operación bx:

% bx script-to-address -v 5 "1 [ 04398184a2cef0d7b73ed7a3a1d4ad16296c3c6986bed0bd72775060aae9891979eaea1efb28d7eb1da3304ec38a98b42086e3be2ceba82b0e932128ec422a6fc2 ] [ 0250504b2d4245544120506565722d506565722d6e6574776f726b206265746121 ] [ 02553432353135362e313232342020202020202020202020202020202020202020 ] 3 checkmultisig"

3KQYMMqMBTv8254UqwmaLzW5NDT879KzK8

Aquí es donde se pueden encontrar los detalles de la página wiki de bitcoin-explorer (bx) para script-to-address .

Asegúrese de que las claves públicas estén en el mismo orden; de lo contrario, las direcciones multisig calculadas serán diferentes. (Puede ser por eso que las transacciones multisig actuales deben firmarse en el orden correcto). Además, observe que la primera clave pública se descomprime (es más larga) mientras que las otras 2 están comprimidas (más cortas).