What is the process of decoding the P2SH address?
We have this information so far.

Let's run through an example tx bea1e7ae7ecdc502215717f30d62a12085bb2866d8db730dfb626b60c337534c

The hex script (for the first output) is: 514104398184a2cef0d7b73ed7a3a1d4ad16296c3c6986bed0bd72775060aae9891979eaea1efb28d7eb1da3304ec38a98b42086e3be2ceba82b0e932128ec422a6fc2210250504b2d4245544120506565722d506565722d6e6574776f726b2062657461212102553432353135362e31323234202020202020202020202020202020202020202053ae

script decode gives:

    "asm" : "1 04398184a2cef0d7b73ed7a3a1d4ad16296c3c6986bed0bd72775060aae9891979eaea1efb28d7eb1da3304ec38a98b42086e3be2ceba82b0e932128ec422a6fc2 0250504b2d4245544120506565722d506565722d6e6574776f726b206265746121 02553432353135362e313232342020202020202020202020202020202020202020 3 OP_CHECKMULTISIG",
    "reqSigs" : 1,
    "type" : "multisig",
    "addresses" : [
    "p2sh" : "3KQYMMqMBTv8254UqwmaLzW5NDT879KzK8"

Can we break this script down?

  • I don't believe you can "decode" a script hash. You just have to provide a matching script which when hashed equals the hash provided.
    – Snowman
    Sep 3, 2016 at 1:01
  • can we derive the p2sh address from the script? I can do it using pybitcointools, but i want to know the steps involved
    – Albert s
    Sep 3, 2016 at 2:32
  • p2sh address = Base58Check(SHA256(RIPEMD160(script)))
    – Snowman
    Sep 3, 2016 at 2:40

2 Answers 2


Here is the example of the transaction from the question

the redeem script is: 514104398184a2cef0d7b73ed7a3a1d4ad16296c3c6986bed0bd72775060aae9891979eaea1efb28d7eb1da3304ec38a98b42086e3be2ceba82b0e932128ec422a6fc2210250504b2d4245544120506565722d506565722d6e6574776f726b2062657461212102553432353135362e31323234202020202020202020202020202020202020202053ae

to derive the P2SH address we do the following:
using PHP:

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

ripemd160 the resulting hash

RIPEMD160: c25497b8a9bcc393f47abd19a435d1af440916ac

prepend "05" and hash twice

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

first 4 bytes is the chscksum

checksum: 479ce4ef

compose the address as:

base58-encode: [one-byte version][20-byte hash][4-byte checksum]

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

base58 encode

base58: 3KQYMMqMBTv8254UqwmaLzW5NDT879KzK8

and we get the correct P2SH address: 3KQYMMqMBTv8254UqwmaLzW5NDT879KzK8


To compute the 1 of 3 multisig address for the example above, one grabs the 3 public keys from the asm field and simply performs this bx operation:

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


Here is where bitcoin-explorer (bx) wiki page details for script-to-address can be found.

Be sure the public keys are in the same order; otherwise, multisig addresses computed will be different. (May be why current multisig transactions need to be signed in the proper order.) Also, notice the 1st public key is uncompresses (is longer) while the other 2 are compressed (shorter).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.