《锋哥论道区块链》之四区块链1.0之比特币--交易(Transa
1.【原文】
31.png
我们将一枚电子货币(an electronic coin)定义为一串数字签名。每一位所有者通过对前一次交易和下一位拥有者的公钥(Public key) 签署一个随机散列(hash)的数字签名,并将这个签名附加在这枚电子货币的末尾的方式就算将电子货币发送给了下一位所有者。而收款人通过对签名进行检验,就能够验证该链条的所有者。
该过程的问题在于,收款人将难以检验,之前的某位所有者,是否对这枚电子货币进行了双重支付。通常的解决方案,就是引入信得过的第三方权威,或者类似于造币厂(mint)的机构,来对每一笔交易进行检验,以防止双重支付。在每一笔交易结束后,这枚电子货币就要被造币厂回收,而造币厂将发行一枚新的电子货币;而只有造币厂直接发行的电子货币,才算作有效,这样就能够防止双重支付。可是该解决方案的问题在于,整个货币系统的命运完全依赖于运作造币厂的公司,因为每一笔交易都要经过该造币厂的确认,而该造币厂就好比是一家银行。
我们需要收款人有某种方法,能够确保之前的所有者没有对更早发生的交易实施签名。为了达到目的,实际上我们需要关注的只是于本交易之前发生的交易,而不需要关注这笔交易发生之后是否会有双重支付的尝试。为了确保某一次交易是不存在的,那么唯一的方法就是获悉之前发生过的所有交易。在造币厂模型里面,造币厂获悉所有的交易,并且决定了交易完成的先后顺序。如果想要在电子系统中排除第三方中介机构,那么交易信息就应当被公开宣布(publicly announced),我们需要整个系统内的所有参与者,都有唯一公认的历史交易序列。收款人需要确保在交易期间绝大多数的节点都认同该交易是首次出现。
2.比特币交易构成
(1)比特币交易简介及分类
交易(Transaction)是比特币系统的信息载体,最小单元。而块(Block)就是将这些基础单元打包装箱,贴上封条,并串联起来。巨大算力保障了块的安全,也就保障了单个交易的安全。交易(transaction)有三种常见类型:生成交易(Generation TX),合成地址交易(Script Hash TX),通用地址交易(Pubkey Hash TX)。该分类并非严格意义的,只是根据交易的输入输出做的简单区分。
1)Generation TX
每个Block都对应一个生成交易(Generation TX),该类交易是没有输入交易的,挖出的新币是所有币的源头。
2)Script Hash TX
该类交易目前不是很常见,大部分人可能没有听说过,但是非常有意义。未来应该会在某些场合频繁使用。该类交易的接受地址不是通常意义的地址,而是一个合成地址,以3开头(对,以3开头的也是比特币地址!)。三对公私钥,可以生成一个合成地址。在生成过程时指定n of 3中的n,n范围是[1, 3],若n=1,则仅需一个私钥签名即可花费该地址的币,若n=3,则需要三把私钥依次签名才可以。
3)Pubkey Hash TX
该类是最常见的交易类型,由N个输入、M个输出构成。
(2)基本交易类型
有了比特币地址,其实也就是Public Key Hash,就有了一个最常见的交易类型,叫做P2PKH(Pay to Public Key Hash),付款给对方的Public Key Hash。
另外一个交易类型,就是P2SH(Pay to Scirpt Hash),后面会专门讲述。
(3)交易(transaction)数据结构
交易中存放的是货币所有权的流转信息,所有权登记在比特币地址上(Public Key)。这些信息是全网公开的,以明文形式存储(比特币系统里的所有数据都是明文的),只有当需要转移货币所有权时,才需要用私钥签名来验证。交易(transaction)的数据结构如下:
lock_time是一个多意字段,表示在某个高度的Block之前或某个时间点之前该交易处于锁定态,无法收录进Block。关于lock_time取值及含义如下:
值 含义
0 立即生效,代表这笔交易不会积压,节点收到这笔交易之后,立即会进入Memory Pool,之后开始打包
< 500000000(5亿) 含义为Block高度,处于该Block之前为锁定(不生效)
= 500000000(5亿) 含义为Unix时间戳,处于该时刻之前为锁定(不生效)
若该笔交易的所有输入交易的sequence字段,均为INT32最大值(0xffffffff),则忽略lock_time字段。否则,该交易在未达到Block高度或达到某个时刻之前,是不会被收录进Block中的。
(4)locktime与sequence number
Locktime在(3)交易(transaction)数据结构已经介绍,不做过多介绍!
sequence number:
LockTime是Transaction级别的,每个Transaction有1个LockTime字段;Sequence Number呢,是Input级别的,1个Transaction里面多个Input,每个都对应1个Sequence Number,所以它的粒度比LockTime要细。
Sequence Number是个整数,什么意思呢?
原理和LockTime类似,也是把交易Hold在那,等到该Input所引用的交易(也就是上1个交易的UTXO)所在的Block,其后面跟随了sequence number个Block之后,该交易才能被打包,被广播进区块链网络。说通俗点,就是上1个Block要足够成熟,后面跟了很多个块之后,该Block里面的UTXO才能被花出去。
从上面的解释可以看出,LockTime和sequence number,都是一个Time Lock。要把当前的交易Hold在那,等到时间成熟了再能打包进区块链。两者都是关于时间的,但有一个很大差别:
LockTime :绝对时间,用的是整个区块链的长度或者时间戳来表达的。
sequence number : 相对时间,当前交易所引用的UTXO所在的块,后面追加了多少个块。