《精通比特币》研读记录(二)-交易
0x00 交易的锁定时间-LockTime
Locktime 有两个作用:1. 生效的最早时间。2. 生效的最早区块高度。
一笔交易,只有到达或者超过这个时间或者区块高度,交易才能被发送到网络和加入到链中进行验证。
LockTime = 0 ,表示立即可以发送到比特币网络进行验证,立刻生效。 0 < LockTime <= 5亿 ,表示区块的交易在指定LockTime高度之后的区块中生效。 LockTime > 5亿,表示一个从1970/01/01日起的时间戳,表示在该时间之后生效。
Locktime, also known as nLockTime from the variable name used in the reference client, defines the earliest time that a transaction is valid and can be relayed on the network or added to the block chain

0x01 比特币系统的常用的交易类型
为了让所有节点都能识别交易,因此将交易信息标准化是必不可少的,比特币的区块链主要支持以下五种交易标准:
P2PKH、P2PK、MS、P2SH和OP_Return。他们通用都用Script脚本语言来表达。
PS:五中不同交易认证的类型,是定义了一种“使用某交易输出的一种使用规则和条件”。
P2PKH
P2PKH(Pay to Public Key Hash),大部分交易都是该类型。
比特币的交易验证依赖于脚本CScript,它可以分为两类:一个锁定脚本和一个解锁脚本。在交易输出
中为锁定脚本,在交易输入
中为解锁脚本。
其中每个指令的结果都是入栈或者出栈。而付费的人(消耗UTXO)需要把自己的私钥签
名和完整的公钥
作为脚本指令的前缀,也当做两条指令处理。

脚本的执行过程(摘自验证签名脚本):
假设,有两个交易:
交易a(Alice 转给Bob 1比特币)
交易b(Bob 转给 Carol 0.5比特币)
-
交易a的『输出脚本』即
锁定脚本
,格式如下,其中be10f0a78f5ac63e8746f7f2e62a5663eed05788
为Bob的公钥Hash160编码格式OP_DUP OP_HASH160 be10f0a78f5ac63e8746f7f2e62a5663eed05788 OP_EQUALVERIFY OP_CHECKSIG
-
交易b的『输入脚本』即
解锁脚本
,格式如下:<Cafe Signature> <Cafe Public Key>
例如:
Bob的私钥签名Sig:3046022100ba1427639c9f67f2ca1088d0140318a98cb1e84f604dc90ae00ed7a5f9c61cab02210094233d018f2f014a5864c9e0795f13735780cafd51b950f503534a6af246aca301 Bob的公钥:03a63ab88e75116b313c6de384496328df2656156b8ac48c75505cd20a4890f5ab
两个脚本组合起来:
<Bob Sig> <Bob PubKey> OP_DUP OP_HASH160 <Bob PubKeyHash> OP_EQUAL OP_CHECKSIG
那么上述P2PKSH脚本的执行过程如下:

- Sig:把Bob的输入脚本的私钥生成的签名Sig入栈。
- PubKey:把Bob的输入脚本的公钥PubKey入栈。
- OP_DUP:把栈顶的
PubKey
复制一份在入栈。(此时栈中有2个PubKey
) - OP_HASH160:把栈顶的
PubKey
进行Hash160编码,得到此PubKey的公钥哈希Pk Hash
。 - PubKeyHash:把Bob的公钥Hash
PubKeyHash
入栈,此时栈中有2个公钥哈希。 - OP_EQUALVERIFY:比较栈顶两个Pk Hash是否一样,验证地址拥有者的初步合法性。如果不通过那么吧False压入栈顶!(即对比两个地址是否一样)
- OP_CHECKSIG:验证私钥和公钥是否匹配。(OP_CHECKSIG 的验证过程比较复杂,详见这里)
总结:
P2PKH交易标准,使用者只需要提供自己私钥的签名
和自己的公钥
即可证明“交易输出”的所有权。
P2PK
首先,与P2PKH
相比,P2PK
从名字缩写看少了个H
。P2PKH
在锁定脚本中暴露的是公钥的哈希-Public Key Hash
,而P2PK
模式在锁定脚本中暴露的直接是公钥-Public Key
。
其次,P2PK模式的验证过程更加简单。
- P2PK
锁定脚本
格式如下:<Bob Public Key> OP_CHECKSIG
- P2PK
解锁脚本
,更为简单只需一个私钥的签名:<Bob Signature>
两个脚本组合起来:
<Bob Signature> <Bob Public Key> OP_CHECKSIG
总结:
P2PK交易标准,使用者只需要提供私钥签名
即可证明“交易输出”的所有权。因使用者的公钥本身就暴露在锁定脚本中了。
MS(Multipart-Signature)
MS(BIP11)即多重签名脚本模式,他在锁定脚本中给了了N个公钥,要求至少提供M个私钥签名,才能解锁。
-
锁定脚本
格式:M <Bob Public Key 1> <Bob Public Key 2> ... <Bob Public Key N> N OP_CHECKMULTISIG
-
解锁脚本
格式:OP_0 <Bob Signature 1> <Bob Signature 2> <Bob Signature 3>...<Bob Signature M>
两个脚本组合起来:
OP_0 <Bob Signature 1> <Bob Signature 2> <Bob Signature 3>...<Bob Signature M> M <Bob Public Key 1> <Bob Public Key 2> ... <Bob Public Key N> N OP_CHECKMULTISIG
总结:
- 作为支付方,需要获得被支付者的至少N个公钥,才能进行支付(脚本锁定)。
- 对于被支付者,有利于将多个秘钥分到不同人的手中,避免独权。
P2SH(Pay-to-Script-Hash)
虽然多重签名十分强大,但也有一些缺点:
- 在给Bob支付之前,支付者必须�知道Bob的至少M个公钥(即Bob需要将至少M个公钥给到别人)。
- 多个公钥会导致
解锁脚本
长度增大,增加交易成本。 - 未消耗的资金,都会作为UTXO的记录在所有节点存储器中,这无会疑增负担。
P2SH正是为了解决这一实际难题而被引入的,它旨在使复杂脚本的运用能与直接向比特币地址支付一样简单.
即:1.降低Bob需要将至少M个公钥给到支付者 2. 解决减少“解锁脚本”的长度。3. 减少UTXO的大小 。
不含P2SH的复杂脚本
Locking Script | 2 PubKey1 PubKey2 PubKey3 PubKey4 PubKey5 5 OP_CHECKMULTISIG |
---|---|
Unlocking Script | Sig1 Sig2 |
P2SH复杂脚本
Redeem | Script 2 PubKey1 PubKey2 PubKey3 PubKey4 PubKey5 5 OP_CHECKMULTISIG |
---|---|
Locking Script | OP_HASH160 <redeem-script-hash> OP_EQUAL |
Unlocking Script | Sig1 Sig2 redeem script |
其中redeem-script-hash计算方式为:redeem-script-hash=RIPEMD160(Hash160(redeem-script))
总结:
- P2SH中,锁定脚本中使用
脚本Hash
的形式来取代MS原本中多公钥
的形式。 - P2SH中,锁定脚本相比MS降低了内容的大小,也直接降低了所有节点存储UTXO的大小。
P2SH有点:
- 在交易中,复杂脚本简化为脚本哈希取代,使得解锁脚本变短。
- 脚本
P2SH 地址
P2SH的另一个重要特征是,它能将脚本哈希编译为一个地址(详见BIP0013)。
PS:文章内容同步到本人CSDN博客
PS:人多力量大,欢迎各位喜欢比特币区块链技术的同学加群:683746794 大家一起交流