Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
  大家都有转过账,每笔交易是这样的:张三账上减¥200,李四账上加¥200。
2 F  H1 H7 G9 d3 [' M: }" w& X& q5 ~) f4 w% t
  在比特币区块链中,交易不是这么简单,交易实际是通过脚本来完成,以承载更多的功能个,这也是为什么比特币被称为是一种“可编程的货币”。
2 X& L7 |- q2 I5 n. Z* ~
7 y$ _" N  @6 x  本文就来分析一下交易是如何实现可编程的。
2 I$ J; K$ \( P0 v9 m: z
* U  J7 Q1 \) M5 m& R9 Z) ^4 A  未花费的交易输出(UTXO)1 y" u; Q* }2 B- G# b

1 ~+ k+ B: `- f8 Z  _  先引入一个概念:未花费的交易输出——UTXO(Unspent Transaction Output), }& R' R" f2 o5 G
+ `; f/ S3 n8 C
  其实比特币的交易都是基于UTXO上的,即交易的输入是之前交易未花费的输出,这笔交易的输出可以被当做下一笔新交易的输入。
0 h$ d6 c. z6 ^  u' e1 V: U! I* E5 v: t
  挖矿奖励属于一个特殊的交易(称为coinbase交易),可以没有输入。; G0 w1 s8 P* n4 t- `6 v/ t

  G! n! F  B7 b  UTXO是交易的基本单元,不能再分割。% _! m! e) Y7 h4 P+ Q) J+ x& [

' u5 e9 s/ D' V( @8 C7 e  在比特币没有余额概念,只有分散到区块链里的UTXO
2 n8 j$ ]& J4 ~  X2 r" [" f: q4 `; X
  随着钱从一个地址被移动到另一个地址的同时形成了一条所有权链,像这样:- i& D: U+ A6 H* F
9 v& W$ h# l( v. `! N  @
  比特币脚本' G0 [0 z8 ?, L9 f7 C
/ J$ U; _4 y& F4 L5 F; |- B2 l, ]
  比特币交易是首先要提供一个用于解锁UTXO(用私钥去匹配锁定脚本)的脚本(常称为解锁脚本:Signature script),这也叫交易输入,  v& P; P" S6 T# k
: J( d* O9 L/ Z3 Q& p
  交易的输出则是指向一个脚本(称为锁定脚本:PubKey script),这个脚本表达了:谁的签名(签名是常见形式,并不一定必须是签名)能匹配这个输出地址,钱就支付给谁。* r) T4 j. j% D% `4 q! A2 ~

$ e  n2 Q' I% w' n: [  每一个比特币节点会通过同时执行这解锁和锁定脚本(不是当前的锁定脚本,是指上一个交易的锁定脚本)来验证一笔交易,脚本组合结果为真,则为有效交易。+ t9 C5 P( M8 f% Y8 Z
/ L+ M( L+ F; J! i3 b6 q
  当解锁版脚本与锁定版脚本的设定条件相匹配时,执行组合有效脚本时才会显示结果为真
& M. @# Q( R. o0 B" n/ d, t
$ }4 w. P- a' o) P  如最为常见类型的比特币交易脚本(支付到公钥哈希:P2PKH(Pay-to-Public-Key-Hash))组合是这样:  i/ l* `# [, O8 g% T3 ]
0 `/ }3 z. F, w# @# E: H- Q3 c
  常见交易脚本验证过程
; R' j& Z% ~  Z) ^, y
. c3 d) o) N/ V  比特币交易脚本语言是一种基于逆波兰表示法的基于栈的执行语言(不知道逆波兰和栈的同学去翻大学数据结构课本,你也可跳过这个部分)。# W6 D& X: A+ H- f

& H4 ?  @) B; _/ L& d, Z  比特币脚本语言包含基本算数计算、基本逻辑(比如if…then)、报错以及返回结果和一些加密指令,不支持循环。想了解更多语言细节可参考:比特币脚本" w8 @! g7 k- p" l6 K2 e- J
5 @5 o  Q- W  c& {+ w( G5 e5 P) J
  脚本语言通过从左至右地处理每个项目的方式执行脚本。
9 O! c) p3 V; y+ q
$ z( J& X& ^, w  下面用两个图说明下常见类型的比特币交易脚本验证执行过程:
! @0 c- `. Q! _( B5 m0 Q1 T1 M
  I+ H5 m. W8 p# B5 }* r; l4 @) Y. \  上图为解锁脚本运行过程(主要是入栈)3 p( r4 O/ E. V% V9 ]

" g  B- n9 Z9 W  上图为锁定脚本运行过程(主要是出栈),最后的结果为真,说明交易有效。2 a8 m5 O& e& [/ z
3 }6 E, O+ j9 Y* O4 h; z& X
  交易分析
! S% L  ]4 Q; u; X1 x; }6 R  ^9 Z* b: r& x1 `0 o0 [
  实际上比特币的交易被设计为可以纳入多个输入和输出。
) K1 |1 \3 s1 G
3 C- |1 c. Z9 k9 Y7 _. j$ Z/ v  交易结构3 ?3 x; X' p9 F& u: g: g- v

$ v5 \; m, V0 `. C- Z7 w0 D  我们来看看完整的交易结构,% S/ s5 s! _* n/ c" a3 K3 X

4 c  v6 K$ ]% J* h  交易的锁定时间定义了能被加到区块链里的最早的交易时间。在大多数交易里,它被设置成0,用来表示立即执行。) l, z( \. B/ W/ b: W# `

" M+ y- B# p% A% I  如果锁定时间不是0并且小于5亿,就被视为区块高度,意指在这个指定的区块高度之前,该交易不会被包含在区块链里。" Z6 I* _* ^) j1 V/ _; o
+ S5 z0 I2 Y3 ~! t7 U
  如果锁定时间大于5亿,则它被当作是一个Unix纪元时间戳(从1970年1月1日以来的秒数),并且在这个指定时间之前,该交易不会被包含在区块链里。+ i% A' }) l, r- G" T

2 R$ M. J2 h. w  交易的数据结构没有交易费的字段,交易费通过所有输入的总和,以及所有输出的总和之间的差来表示,即:
* y1 H$ ~& Y6 @5 `0 L% Z+ F/ O% ~4 n" h
  交易费 = 求和(所有输入) - 求和(所有输出)
1 {3 `  a. d/ |/ N- w8 k, @5 ^+ ~) |* ^% y4 y
  交易输入结构* F5 m0 v  M: r
1 d$ Y2 X# A- i
  刚刚我们提过输入需要提供一个解锁脚本,现在来看看一个交易的输入结构:
$ O8 ?( R9 Q- U0 q2 }3 u
( ^) z; d) e6 p/ Z9 {0 v  \  我们结合整个交易的结构里看输入结构就是这样子:9 {- d. Q$ W% {6 }+ o; }: i
* ]; X  I  Y8 D: w: P
  交易输出结构
- F9 ~8 x1 F. C) i; C1 c
6 f5 Y7 F" [/ o) n4 h) v. X  刚刚我们提过输出是指向一个解锁脚本,具体交易的输出结构为:& ]1 O  \4 H7 Q! C

7 d+ g5 h# r) I  我们结合整个交易的结构里看输出结构就是这样子:
: J: a" y7 l, @& `; ~- r8 r2 Q% r. A: b: L; o
  交易哈希计算1 \  f0 |6 u7 C0 Q

3 K/ b+ e* e& A/ f' E, Q: J  在比特币区块结构Merkle 树及简单支付验证分析 讲到区块结构,区块结构包含多个交易的哈希。2 u' j# `! `/ _% O/ `. [3 s8 I* t

) ], O; L; S) T$ I" {0 ^9 L  那么交易哈希是怎么计算的呢?# k9 Z, \; w* c# O  q4 ^+ G8 k
0 w4 W- E, p" R0 M5 O' @7 b
  交易结构各字段序列化为字节数组
, S7 R+ A$ l+ N7 H) w
" R( k$ n2 n1 k  [" _% K9 q  把字节数组拼接为支付串
' [4 M# F( t, ]$ F- }+ ^
8 ^% q! ]  n$ T; U) r) L: w  h+ H  对支付串计算两次SHA256 得到交易hash' ~" G$ G7 E5 \( Z/ h$ i2 O

1 P1 ?  H7 u( H0 n# d( ^! D7 ]9 a  了解详情可进一步参考如何计算交易Hash?及如何创建Hash?
1 f. R. A) |6 X
+ q5 N6 W; H  H' T& q* |4 l" H' ]  现在是不是对完整的交易到区块有了更清晰的认识。6 L# x' K: }3 X
% e) z5 e8 F5 w3 l
  智能合约雏形 - 应用场景说明
. }4 q* A4 h- G8 L5 c
& U$ t9 k; y4 Y' t  由于交易是通过脚本来实现,脚本语言可以表达出无数的条件变种。% x5 Z* K* k2 {9 u' v

4 L; G- Y9 c+ X+ H& m, U5 L  比特币的脚本目前常用的主要分为两种,一种是常见的P2PKH(支付给公钥哈希),另一种是P2SH(Pay-to-Script-Hash支付脚本哈希)。% p5 {+ w0 C& ]# h9 [

9 E, S$ B/ e4 y, e7 Y  P2SH支付中,锁定脚本被密码学哈希所取代,当一笔交易试图支付UTXO时,要解锁支付脚本,它必须含有与哈希相匹配的脚本。
6 I& d& g! j1 X, g; c8 a: B. ?! `4 w$ n# i+ |7 V# E
  这里不展开技术细节,下面说明一些应用场景,以便大家有更直观的认识。  p, D4 J/ A% k1 J+ A+ [6 G6 \! l
! ~# r2 K; }$ x5 Q
  多重签名应用
9 x: E+ f9 _# }( ~8 a' r8 {2 l9 {- w4 Q: G
  合伙经营中,如只有一半以上的的股东同意签名就可以进行支付,可为公司治理提供管控便利,同时也能有效防范盗窃、挪用和遗失。
8 K* N7 e: o) @  b% H5 o
. A3 s4 w( m0 ?, ]# }2 _  用于担保和争端调解,一个买家想和他不认识或不信任的某人交易,在一般情况交易正常进行时,买家不想任何第三方参与。那交易双方可以发起支付,但如果交易出现问题时,那第三方就可以根据裁定,使用自己的签名和裁定认可的一方共同签名来兑现这笔交易。
: z" @, ?, v" g8 i* ]6 Y4 _, A- Z4 Z
  保证合同0 E  O& w* V6 o  G6 }
: ?+ J+ R  w! t- N8 b: s
  保证合同是建造公众商品时的集资办法,公众商品是指一旦建成,任何人都可以免费享受到好处。标准的例子是灯塔,所有人都认同应该建造一个,但是对于个人航海者来说灯塔太贵了,灯塔同时也会方便其他航海者。- Q- z% G& I, ~9 @' Z
- m% E, n  _! ^3 N+ w# w* Z7 I
  一个解决方案是向所有人集资,只有当筹集的资金超过所需的建造成本时,每个人才真正付钱,如果集资款不足,则谁都不用付钱。
0 L' p% L% |5 \5 E, g
& M1 x" x, T4 F0 Q, V3 j4 |  依靠预言
3 \, k! T8 b# O# c, v- y& z4 X/ j* z5 C1 R0 v* J
  假如老人想让他孙子继承遗产,继承时间是在他死后或者在孙子年满18岁时(也是一个带锁定时间交易),无论哪个条件先满足,他的孙子都可以得到遗产。
& V+ n2 {8 C, C* ~1 F( D' |- T" U5 U* g4 W1 M- h( m  b/ P
  因为比特币节点可依靠预言对死亡条件进行判断,预言是指具有密钥对的服务器,当用户自定义的表达式被证明是真的,它能按照要求对交易签名。; `  `. N- A) Q

$ W7 y) C! l" }* |' w2 w% }  相信随着区块链的普及,会对未来的交易模式和商业结构带来巨大的影响。不过由于比特币的脚本语言不是图灵完备的,交易模式依旧有限,以太坊就是为解决这一问题而出现,后面我们会有大量介绍以太坊的文章。
7 Q% K) e1 d" e7 P$ w8 b, a4 F) P6 E; l- ?. E( P* G
  参考文献 & 补充阅读# X0 Q0 _" l5 ]

2 Y" m2 ]0 _8 I/ L4 F: e  精通比特币
/ X5 G+ I2 F! o& C+ U1 G1 X1 u
/ Z" H2 `4 X0 Q  廖雪峰的深入理解比特币交易的脚本, [3 g6 H" t* s& Y! E" W7 {# Y6 m

! g# }6 G2 ^3 _! m" O1 ]  比特币合同
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

恋爱的棉被缀 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    12