-
比特币交易结构
meta data:"result": { "txid": "921a...dd24", "hash": "921a...dd24", "version": 1, "size": 226, "locktime": 0, "vin": [{ "txid": "c0cb...c57b", "vout": 0, "scriptSig": { "asm": 3045...0018, "hex": 4830...0018 }, }], "vout": [{ "value": 0.22684000, "n": 0, "scriptPubKey": { "asm": "DUP HASH160 628e...d743 EQUAILVERIFY CHECKSIG", "hex": 76a9...88ac, "reqSigs": 1, "type": "pubkeyhash", "address": ["19z8LJkNXLrTv2QK5jqTncJCGUEEfpQvSr"] } },{ "value": 0.53756644, "n": 1, "scriptPubKey": { "asm": "DUP HASH160 da7d...2cd2 EQUAILVERIFY CHECKSIG", "hex": 76a9...88ac, "reqSigs": 1, "type": "pubkeyhash", "address": ["1LvGTpdyeVLcLCDK2m9f7Pbh7zwhs7NYhX"] } }], "blockhash": "0000000000000000002c510d...5c0b", "confirmations": 23, "time": 1530846727, "blocktime": 1530846727 }- 交易结构元数据中各字段含义:
- txid: 交易ID
- hash: 当前交易的哈希
- version: 比特币协议版本
- size: 交易大小
- locktime: 0-立即生效
vin: 交易输入(数组)- txid: 币的来源的交易哈希值
- vout: 币的来源交易中的几个输出
scriptSig: 输入脚本(证明你有权利花这个钱,后文用input script代替)
vout: 交易输出(数组)- value: 输出金额(1比特币=10的8次方聪
satoshi) - n: 这个交易里的第几个输出
scriptPubKey: 输出脚本(后文用output script代替)- asm: 脚本内容(包含操作)
- reqSigs: 该输出需要多少个签名才能兑现
- type: 输出类型
- address: 输出地址
- value: 输出金额(1比特币=10的8次方聪
- blockhash: 当前交易所在区块的哈希
- cnfirmation: 该交易已有多少个确认信息
- time: 交易产生的时间
- blocktime: 区块产生的时间
- 交易结构元数据中各字段含义:
-
输出输出脚本的几种形式:
P2PK(Pay to Public Key) 输出脚本里直接给出收款人的公钥- 输入输出脚本形式:
- input script:
- PUSHDATA(Sig)
- output script:
- PUSHDATA(PubKey)
- CHECKSIG
- input script:
- 输入输出脚本形式:
P2PKH(Pay to Public Key Hash) 输出脚本里并不直接给出收款人的公钥,给出的是公钥的哈希,输入脚本则既要给出签名,也要给出公钥- 输入输出脚本形式:
- input script:
- PUSHDATA(Sig)
- PUSHDATA(PubKey)
- output script:
- DUP
- HASH160
- PUSHDATA(PubKeyHash)
- EQUALVERIFY
- CHECKSIG
- input script:
- 输入输出脚本形式:
P2SH(Pay to Script Hash) 输出脚本给出的不是收款人的公钥的哈希,而是收款人提供的一个赎回脚本的哈希;将来花这个钱时输入脚本里要给出redeemScript(这个赎回脚本的具体内容),同时还要给出让赎回脚本能够正确运行所需要的签名- 输入输出脚本形式:
- input script:
- ...
- PUSHDATA(Sig)
- ...
- PUSHDATA(serialized redeemScript)
- output script:
- HASH160
- PUSHDATA(redeemScriptHash)
- EQUAL
- input script:
- 进一步说明:
- input script要给出一些签名(数目不定)及一段序列化的redeemScript,验证分两步:
- 验证序列化的redeemScript是否与output script中的哈希值匹配
- 反序列化并执行redeemScript,验证input script中给出的签名是否正确
- redeemScript的形式:
- P2PK形式
- P2PKH形式
- 多重签名形式
- input script要给出一些签名(数目不定)及一段序列化的redeemScript,验证分两步:
- 赎回脚本实例一:用P2SH实现P2PK
- redeemScript:
- PUSHDATA(PubKey)
- CHECKSIG
- input script:
- PUSHDATA(Sig)
- PUSHDATA(serialized redeemScript)
- output script:
- HASH160
- PUSHDATA(redeemScriptHash)
- EQUAL
- redeemScript:
- 赎回脚本实例二:用P2SH实现多重签名
- redeemScript:
- M
- PUSHDATA(pubKey_1)
- PUSHDATA(pubKey_2)
- ...
- PUSHDATA(pubKey_N)
- N
- CHECKMULTISIG
- input script:
- x
- PUSHDATA(Sig_1)
- PUSHDATA(Sig_2)
- ...
- PUSHDATA(Sig_M)
- PUSHDATA(serialized RedeemScript)
- output script:
- HASH160
- PUSHDATA(redeemScriptHash)
- EQUAL
- redeemScript:
- 输入输出脚本形式:
Proof of Burn销毁比特币,如果有一个交易的输入指向这个输出,执行到return时都会返回错误,所以这个output再无法被花出去,其对应的UTXO也就可以被剪枝了,无需保存- output script:
- RETURN
- ... [zero or more ops or text]
- 应用场景
- 有些小的币种要求销毁一定数量的比特币才能够得到这个币种(即
AltCoin(Alternative coin)) - 往区块链里写入一些内容(return之后可以放永久保存的内容,比如知识产权的哈希值,既没有泄漏内容,也可用于日后纠纷时证明,证明你在某个时间点已经知道某个知识了)。这个场景和coinbase域相似,但coinbase的方法只有获得记账权的那个节点才能用
- 有些小的币种要求销毁一定数量的比特币才能够得到这个币种(即
- output script: