P2PK P2PKH,MS,P2SH,OP_RETURN 等的区别
1.P2PK pay_to_public_key
pubkey script:
<pubkey> OP_CHECKSIG
signature script: [sig]
2. P2PKH pay_to_public_key_hash
pubkey script:
OP_DUP OP_HASH160 hash(pubkey) OP_EQUALVERIFY
signature script:
[sig] <pubkey>
3.P2SH pay_to_script_hash
pubkey script:
OP_HASH160 hash(Redeem script) OP_EQUAL
signature script:
此处和上面两个都不一样,解锁需要分成两部
第一步: 验证 redeem script hash 值是否正确,也就是将redeem script 作为数据放到栈上,然后执行 OP_HASH160,如果为真才会执行第二步,否则失败
第二步:执行redeem script, 将signature script+redeem script 一起执行,如果为真则成功,否则交易失败
4.P2WPKH pay_to_witness_public_key_hash
pubkey script:
0 HASH160(public key)
解锁脚本 signature script(scriptSig):
空
还增加了一个 witness 字段,用于验证交易合法性
witness:
如果按照前面的验证规则,所有的隔离见证交易都是合法的,所以这是一个软分叉.
5. P2WSH pay_to_witness_script_hash
pubkey script:
0 SHA256(redeem script)
scriptSig: 空
witness:
矿工如何区分交易类型?
主要是根据 pubkey script 的模式进行匹配,不同的模式匹配不同的验证规则.尤其是隔离见证部分.
scriptSig包含什么内容?
没看源码,纯属个人猜想.
一个 tx 的结构如下:
type MsgTx struct {
Version int32
TxIn []*TxIn
TxOut []*TxOut
LockTime uint32
}
// TxIn defines a bitcoin transaction input.
type TxIn struct {
PreviousOutPoint OutPoint
SignatureScript []byte
Witness TxWitness
Sequence uint32
}
// TxOut defines a bitcoin transaction output.
type TxOut struct {
Value int64
PkScript []byte
}
签名放在 TxIn 中,因此签名应该是对hash(Version,LockTime, current TxIn(exclude signature script),all TxOut)) 进行签名.
这样狂购可以验证交易,但是不能修改交易. 至于 TxID 为什么会变,是否因为 TxIn以及 TxOut 的顺序可以被矿工调整?