隔离见证hash算法文档: https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki
# 数据组成
# 公钥
未压缩公钥:04 + X(32B) + Y(32B)
隔离见证需要的公钥为:03 + X(32B)
或者 02 + Y(32B)
# hash算法
# double sha256 (dSHA256)
- tx id id = sha256(sha256(data)) = dSHA256(data) 长度为32字节
- address checksum
# hash160
hash160(data) = ripemd160(sha256(data))
# address (pubkey-to-addr)
prefix: https://en.bitcoin.it/wiki/List_of_address_prefixes
# legacy address (pubkey-to-legacy-addr)
pubkey-hash = hash160(pubkey) script-pubkey = prefix + pubkey-hash encode58-check(data) = encode58(data + dSHA256(data)[0..3]) address = encode58-check(script-pubkey)
# segwit address (pubkey-to-segwit-addr)
pubkey-hash = hash160(pubkey) redeemScript = 0014 + pubkey-hash pubkey-to-addr(redeemScript)
# hash计算过程
要解析的交易id: fc2344f6c98cc19e5b3d7b716f9eaaeb21ab781393731652c710afd07a5505bf
原始数据内容参考:
https://tchain.btc.com/fc2344f6c98cc19e5b3d7b716f9eaaeb21ab781393731652c710afd07a5505bf.rawhex
# 组装 未签名 交易数据
nVersion: 01000000
txin: 03 373d0980f9293fc5864c02fa7946ab706a1f0a5c5aedb8ee3a7eaf4d17c65e5e 01000000 00 ffffff00
df618d78879c213bde156e3ee55d1abe1badf750828aa0587d4a6d7fd2a41df7 00000000 00 ffffff00
df618d78879c213bde156e3ee55d1abe1badf750828aa0587d4a6d7fd2a41df7 01000000 00 ffffff00
txout: 02 0084d71700000000 17a9145be3eb3165f9c7ad58d3f49dc7f253ac42499eef87
ebd4f20300000000 17a91481dd877be5b3b60e3b1ccf547785744345570b9387
nLockTime: 00000000
UTXO = 373d0980f9293fc5864c02fa7946ab706a1f0a5c5aedb8ee3a7eaf4d17c65e5e UTXO-INDEX = 01000000
OUT-VALUE = 0084d71700000000 OUT-SCRIPT = 17a9145be3eb3165f9c7ad58d3f49dc7f253ac42499eef87
# 计算hash
# 计算 input hash
hashPrevouts = dSHA256([UTXO + UTXO-INDEX] * n)
= dSHA256(373d0980f9293fc5864c02fa7946ab706a1f0a5c5aedb8ee3a7eaf4d17c65e5e 01000000
df618d78879c213bde156e3ee55d1abe1badf750828aa0587d4a6d7fd2a41df7 00000000
df618d78879c213bde156e3ee55d1abe1badf750828aa0587d4a6d7fd2a41df7 01000000)
= 6a59d58aabff920acf810aeca6359dbad8f0e07d9baa1dfdea7880843d44de72
# 计算 sequence hash
hashSequence = dSHA256([sequence] * n)
= dSHA256(01000000 00000000 01000000)
= 89974e58642dbbe1948159e6134c0b1f5b079893ab61cf02417f490cab69e052
# 计算 output hash
hashOutputs = dSHA256([OUT-VALUE + OUT-SCRIPT] * n)
= dSHA256(0084d71700000000 17a9145be3eb3165f9c7ad58d3f49dc7f253ac42499eef87
ebd4f20300000000 17a91481dd877be5b3b60e3b1ccf547785744345570b9387)
= 7162a64cfdd10579b3f3a33e73ae59213588794724897d6cfa18f3ccce398b7c
# 计算 hash preimage (for input 1)
For P2WPKH witness program, the scriptCode is 0x1976a914{20-byte-pubkey-hash}88ac
hash preimage =
nVersion: 01000000
hashPrevouts: 6a59d58aabff920acf810aeca6359dbad8f0e07d9baa1dfdea7880843d44de72
hashSequence: 89974e58642dbbe1948159e6134c0b1f5b079893ab61cf02417f490cab69e052
outpoint: 373d0980f9293fc5864c02fa7946ab706a1f0a5c5aedb8ee3a7eaf4d17c65e5e 01000000
scriptCode: 1976a914 {} 88ac
amount: {input amount}
nSequence: ffffff00
hashOutputs: 7162a64cfdd10579b3f3a33e73ae59213588794724897d6cfa18f3ccce398b7c
nLockTime: 00000000
nHashType: 01000000
sigHash = dSHA256(hash preimage)