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

原创 2018年04月16日 14:47:54

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 大家一起交流

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

精通比特币(读后总结)

精通比特币1. 术语: 内容 区块: 一个区块就是若干交易数据的集合,它会被标记上时间戳和之前一个区块的独特标记。 区块头经过哈希运算后会生成一份工作量证明,从而验证区块中的交易。有效的区块经过全...
  • yyxyong
  • yyxyong
  • 2017-09-01 11:39:07
  • 1835

精通比特币-第5章 交易

5.1 简介 比特币交易是比特币系统中最重要的部分。根据比特币系统的设计原理,系统中任何其他的部分都是为了确保比特币交易可以被生成、能在比特币网络中得以传播和通过验证,并最终添加入全球比特币交易总账...
  • AMDS123
  • AMDS123
  • 2017-06-20 00:48:53
  • 2248

《精通比特币》常用术语

本文记录了《精通比特币》一书中的常用术语。 比特币地址     比特币地址是一串由数字和字母组成的字符串,以“1”开头。     BIP     BIP(bitcoi...
  • sanshamo
  • sanshamo
  • 2017-12-19 10:54:00
  • 116

比特币交易(Transaction)的输入与输出

比特币通过“挖矿”机制保证了不能任意造币。通过分布式网络和HashCash机制解决双重支付问题。事实上比特币系统中不存在独立的电子货币,而只存在交易单(账单),货币值是依附于交易单存在的,所以比特币中...
  • taifei
  • taifei
  • 2017-06-26 13:11:55
  • 1757

如何快速理解比特币交易的工作过程

原文链接:点击打开链接 所谓比特币交易就是从一个比特币钱包向另一个中转账,每笔交易都有数字签名来保证安全。一个交易一旦发生那么就是对所有人都公开的,每个交易的历史可以最终追溯到相应的比特币最...
  • qq_26376175
  • qq_26376175
  • 2017-10-27 11:34:12
  • 12781

比特币源码解析(5) - 数据结构 - 交易

交易(transaction)是比特币甚至所有区块链中最核心的数据结构之一,可以说其他所有的模块都是为交易服务的,包括交易的产生、广播、共识、存储等等,所以我们首先从交易出发,然后逐步延伸到其他的部分...
  • u012183589
  • u012183589
  • 2017-09-01 12:01:44
  • 6336

比特币源码解读二

上次我们把bitcoind.cpp的大概流程过了一下,我们今天说下细节的内容。我们打开bitcoind.cpp文件,我们继续看AppInit()函数。因为这个函数非常重要,包含了对客户端各种功能的初始...
  • wolfoxkao
  • wolfoxkao
  • 2017-12-04 14:57:43
  • 133

精通比特币-第8章 挖矿与共识

8.1 简介 挖矿是增加比特币货币供应的一个过程。挖矿同时还保护着比特币系统的安全,防止欺诈交易,避免“双重支付”,“双重支付”是指多次花费同一笔比特币。矿工们通过为比特币网络提供算力来换取获得比特...
  • AMDS123
  • AMDS123
  • 2017-06-29 23:06:29
  • 4426

5分钟看懂比特币

5分钟看懂比特币   本文是我参加大华ShareOrOut俱乐部发布的原创文章,本文不为大而全,只为了让读者更快速的理解比特币的一些基本原理。由于能力知识有限,如果有错误之处,还请指出,谢谢! 何...
  • wangsir1988
  • wangsir1988
  • 2016-08-28 00:57:46
  • 3529
收藏助手
不良信息举报
您举报文章:《精通比特币》研读记录(二)-交易
举报原因:
原因补充:

(最多只允许输入30个字)