《精通比特币》研读记录(二)-交易

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ChSaDiN/article/details/79960531

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。

PS:他们的作用都是用来定义“使用某交易输出必要满足的使用规则或者条件”。

P2PKH

  1. P2PKH(Pay to Public Key Hash),大部分交易都是该类型。
  2. 比特币的交易验证依赖于脚本CScript,它可以分为两类:一个锁定脚本和一个解锁脚本。在交易输出中为锁定脚本,在交易输入中为解锁脚本。
  3. 其中每个指令的结果都是入栈或者出栈。而付费的人(消耗UTXO)需要把自己的私钥签名和完整的公钥作为脚本指令的前缀,也当做两条指令处理。

  4. 脚本的执行过程(摘自验证签名脚本):

    假设,有两个交易:
    交易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的公钥HashPubKeyHash入栈,此时栈中有2个公钥哈希。
  • OP_EQUALVERIFY:比较栈顶两个Pk Hash是否一样,验证地址拥有者的初步合法性。如果不通过那么吧False压入栈顶!(即对比两个地址是否一样)
  • OP_CHECKSIG:验证私钥和公钥是否匹配。(OP_CHECKSIG 的验证过程比较复杂,详见这里
总结:

P2PKH交易标准,使用者只需要提供自己私钥的签名和自己的公钥即可证明“交易输出”的所有权。

P2PK

首先,与P2PKH相比,P2PK从名字缩写看少了个HP2PKH在锁定脚本中暴露的是公钥的哈希-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
总结:
  1. 作为支付方,需要获得被支付者的至少N个公钥,才能进行支付(脚本锁定)。
  2. 对于被支付者,有利于将多个秘钥分到不同人的手中,避免独权。

P2SH(Pay-to-Script-Hash)

虽然多重签名十分强大,但也有一些缺点:
1. 在给Bob支付之前,支付者必须知道Bob的至少M个公钥(即Bob需要将至少M个公钥给到别人)。
2. 多个公钥会导致解锁脚本长度增大,增加交易成本。
3. 未消耗的资金,都会作为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))

总结:
  1. P2SH中,锁定脚本中使用脚本Hash的形式来取代MS原本中多公钥的形式。
  2. P2SH中,锁定脚本相比MS降低了内容的大小,也直接降低了所有节点存储UTXO的大小。
    P2SH有点:
    • 在交易中,复杂脚本简化为脚本哈希取代,使得解锁脚本变短。
    • 脚本

P2SH 地址

P2SH的另一个重要特征是,它能将脚本哈希编译为一个地址(详见BIP0013)。


PS: 人多力量大,欢迎各位喜欢比特币区块链技术的同学加群:683746794 大家一起交流

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页