Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
  大家都有转过账,每笔交易是这样的:张三账上减¥200,李四账上加¥200。% x1 J7 R2 @# _
/ Q2 H9 `! Y5 d9 l! L0 R
  在比特币区块链中,交易不是这么简单,交易实际是通过脚本来完成,以承载更多的功能个,这也是为什么比特币被称为是一种“可编程的货币”。
& j) [; U' K. l7 x3 G* j! N
) \; C4 h; b6 L4 V  本文就来分析一下交易是如何实现可编程的。
, o1 J7 m# O! |+ H' g' e: m& r! n( e1 R6 ~, P; b
  未花费的交易输出(UTXO)4 ]+ |3 P$ Y) [  L7 ^

1 I, z* d: T. g5 A) d4 I  先引入一个概念:未花费的交易输出——UTXO(Unspent Transaction Output)/ ^6 o$ G! v* v4 T2 R+ J4 ?

- h8 F: a2 M2 p3 ~/ B& T" Q  其实比特币的交易都是基于UTXO上的,即交易的输入是之前交易未花费的输出,这笔交易的输出可以被当做下一笔新交易的输入。3 {2 `" x* X2 D) q/ M6 U$ a) Z7 W

' c0 b: d0 n2 t) ?. ^1 G  挖矿奖励属于一个特殊的交易(称为coinbase交易),可以没有输入。" a3 g/ d1 p( z) g  ?* u

( h/ O5 N' e0 p* g' @' |6 m# P9 n  UTXO是交易的基本单元,不能再分割。
* F& h5 }3 j9 r: W& X2 Z
% g7 W3 x$ u0 A1 s$ \4 X  在比特币没有余额概念,只有分散到区块链里的UTXO) O3 N* K& B2 v4 x, p. a
' A- J3 D' p* S3 F& ^
  随着钱从一个地址被移动到另一个地址的同时形成了一条所有权链,像这样:& W$ ^9 p* H, |" z% k

% v" v, V& r5 c* U  比特币脚本# _$ M% x" P( D* S7 e! p, k" k

! k0 {6 p: `& S4 N+ g" S4 m3 I) I  比特币交易是首先要提供一个用于解锁UTXO(用私钥去匹配锁定脚本)的脚本(常称为解锁脚本:Signature script),这也叫交易输入,
8 B" _8 j+ j/ c) E$ F# G
7 L6 q  Y2 Q8 I- E7 K* H; ?( U  交易的输出则是指向一个脚本(称为锁定脚本:PubKey script),这个脚本表达了:谁的签名(签名是常见形式,并不一定必须是签名)能匹配这个输出地址,钱就支付给谁。
# s. x2 F4 m; |3 H8 b3 _
: Y- R9 ]$ N& W9 D1 o" `* _' J( X: h  每一个比特币节点会通过同时执行这解锁和锁定脚本(不是当前的锁定脚本,是指上一个交易的锁定脚本)来验证一笔交易,脚本组合结果为真,则为有效交易。# g# H& t& I. M& C2 g) Y" |' x1 n- M
  F6 G  M% V3 r7 _4 J& t' ]
  当解锁版脚本与锁定版脚本的设定条件相匹配时,执行组合有效脚本时才会显示结果为真- E6 n7 d- A7 F( k
! u$ ^& K5 ?+ G0 i/ c" H
  如最为常见类型的比特币交易脚本(支付到公钥哈希:P2PKH(Pay-to-Public-Key-Hash))组合是这样:
, v5 a: @7 \* Z# W1 p1 `: I. s
# X# q" W+ S4 [4 W% o  g  常见交易脚本验证过程
* ]" W8 j/ z9 G
) a: U* d5 \, A  n/ [! k  比特币交易脚本语言是一种基于逆波兰表示法的基于栈的执行语言(不知道逆波兰和栈的同学去翻大学数据结构课本,你也可跳过这个部分)。
! [* `' t: f' B' S- Y0 S( ~2 m% z. R" [9 y! T
  比特币脚本语言包含基本算数计算、基本逻辑(比如if…then)、报错以及返回结果和一些加密指令,不支持循环。想了解更多语言细节可参考:比特币脚本
# M( C! t9 v/ n5 v  Z7 {( ?
5 E" X" m/ X8 U2 y# n  脚本语言通过从左至右地处理每个项目的方式执行脚本。
6 s0 @) ~- L. Z  ]; r% o
3 u2 o  B9 V8 L2 R7 j; L  f) f. p  下面用两个图说明下常见类型的比特币交易脚本验证执行过程:/ U4 S: {/ _. C9 h
1 b7 W) ]2 M$ w6 s0 b
  上图为解锁脚本运行过程(主要是入栈)6 t2 M/ r: A  o7 c. p

: ]1 ]3 c1 X, I4 I  上图为锁定脚本运行过程(主要是出栈),最后的结果为真,说明交易有效。
# d. q8 D9 Y0 b5 g* }. }/ _7 X6 a9 ^4 p7 G5 O6 K- W& h% l
  交易分析
. C5 }7 `; z) F) i4 L% m  S( n
' q5 p- ~1 R; M4 k  实际上比特币的交易被设计为可以纳入多个输入和输出。6 m3 L8 D! _3 Q. n+ y) x
" i! _% U, N4 b3 C0 `
  交易结构3 i. f8 z- W& w8 d! Y9 Z$ r

  c0 g) m& B  j, W9 W  我们来看看完整的交易结构,
# @% I7 o6 p  F( @7 H  H- V1 I
% V! b3 }' u; T1 S+ @4 G1 i# z2 w3 D  交易的锁定时间定义了能被加到区块链里的最早的交易时间。在大多数交易里,它被设置成0,用来表示立即执行。: H% w% ?  ^& |* g
5 V8 Z0 ]+ x1 ~7 ^. X5 j- [: ~
  如果锁定时间不是0并且小于5亿,就被视为区块高度,意指在这个指定的区块高度之前,该交易不会被包含在区块链里。
0 N+ j5 [( q. Z: N" c
& ~; K: l( n6 \  x0 ?' W  如果锁定时间大于5亿,则它被当作是一个Unix纪元时间戳(从1970年1月1日以来的秒数),并且在这个指定时间之前,该交易不会被包含在区块链里。. u. Q0 L1 x; X$ }
3 n) G4 i7 f- k3 ~% H0 Y3 ^
  交易的数据结构没有交易费的字段,交易费通过所有输入的总和,以及所有输出的总和之间的差来表示,即:. f! a$ ~6 B% U' X

) D! ~1 w( ^6 k3 Y  交易费 = 求和(所有输入) - 求和(所有输出)
% t7 D6 |, j; p) m1 J$ k' K% Q
- A; O% z$ ?2 e8 H0 f% W  交易输入结构& D: s# d! `. s6 c% R9 ^0 G

9 g% N$ r4 k3 n  刚刚我们提过输入需要提供一个解锁脚本,现在来看看一个交易的输入结构:( B+ t  e, g/ o) i

8 Z0 n  }$ ]2 a+ Y( F  我们结合整个交易的结构里看输入结构就是这样子:# ]! Q* ~7 I* p! X* g% `
4 ]) u/ J$ `2 o
  交易输出结构
8 J3 {1 `6 H8 S
) b0 n% Z1 b5 X4 P0 B1 w' ]  刚刚我们提过输出是指向一个解锁脚本,具体交易的输出结构为:
  ]! W- V2 U% }
; x! W, _2 Q/ H8 x0 H: M  我们结合整个交易的结构里看输出结构就是这样子:2 {4 V! S: v! V# r

2 U- C, L3 W8 R" F0 q  交易哈希计算3 J. }, |3 K" F& e/ ~

( x( G2 }9 X! ]$ y% H' G  在比特币区块结构Merkle 树及简单支付验证分析 讲到区块结构,区块结构包含多个交易的哈希。
# c9 Q* w# p* e/ U7 W! B$ m7 [- R/ b) V& I5 P5 `
  那么交易哈希是怎么计算的呢?# o9 i, \5 b( C2 [6 d- _) g
: f6 C) [# P( i! f
  交易结构各字段序列化为字节数组
8 E- V+ z; p6 J* y0 b
% w4 w. q$ |" ~3 m3 v  把字节数组拼接为支付串0 d) G# d; O5 T) d1 y
2 w% P$ k) ?3 @- w0 [2 e
  对支付串计算两次SHA256 得到交易hash
5 u+ b: l, Q8 a& z1 |+ f0 `5 b
9 Q( J" U+ v7 u$ O5 X, z  了解详情可进一步参考如何计算交易Hash?及如何创建Hash?7 W2 K$ }3 M( A" A5 l/ p8 F

9 Z8 U# w" F3 A. C  现在是不是对完整的交易到区块有了更清晰的认识。
3 X& \' a$ D9 A* K1 C* E
9 n7 J; V- t1 t% N7 l  智能合约雏形 - 应用场景说明/ |' s+ ?& f5 I
2 g7 p3 c0 Z, l. q
  由于交易是通过脚本来实现,脚本语言可以表达出无数的条件变种。2 i: w3 `  n7 a+ s# ~, U

" Q$ b' n& F$ v2 n0 a, Y% R5 U  比特币的脚本目前常用的主要分为两种,一种是常见的P2PKH(支付给公钥哈希),另一种是P2SH(Pay-to-Script-Hash支付脚本哈希)。
0 w+ g* N+ M: o0 r' u# F) x& M" E3 }( P% r' r# a
  P2SH支付中,锁定脚本被密码学哈希所取代,当一笔交易试图支付UTXO时,要解锁支付脚本,它必须含有与哈希相匹配的脚本。, j; K. Q$ s" y
3 ?' a2 S% U" O0 v7 z& B! r
  这里不展开技术细节,下面说明一些应用场景,以便大家有更直观的认识。
2 [' a% ]: S+ M* a" z5 T' `* j
# @6 w7 G6 ]' H' N  多重签名应用8 n5 ]8 ~; v$ D

* d) j- C+ G. i1 c* A8 g  合伙经营中,如只有一半以上的的股东同意签名就可以进行支付,可为公司治理提供管控便利,同时也能有效防范盗窃、挪用和遗失。
5 d4 y. m% r  Z  P2 b
% ?5 i  q" |" F9 x( }  用于担保和争端调解,一个买家想和他不认识或不信任的某人交易,在一般情况交易正常进行时,买家不想任何第三方参与。那交易双方可以发起支付,但如果交易出现问题时,那第三方就可以根据裁定,使用自己的签名和裁定认可的一方共同签名来兑现这笔交易。) ?4 M4 U8 Y* X& L5 q6 G
4 x; a4 B$ |+ L* {' I5 h, u' M
  保证合同
& |+ K6 L8 u+ v2 b6 r
1 h$ S' r1 K: g, V+ e  保证合同是建造公众商品时的集资办法,公众商品是指一旦建成,任何人都可以免费享受到好处。标准的例子是灯塔,所有人都认同应该建造一个,但是对于个人航海者来说灯塔太贵了,灯塔同时也会方便其他航海者。9 F% T1 S4 `7 ?; C8 F+ B
6 J( T( u: X+ [' r$ ^" ^$ X
  一个解决方案是向所有人集资,只有当筹集的资金超过所需的建造成本时,每个人才真正付钱,如果集资款不足,则谁都不用付钱。2 n0 W6 Z* b" @
! @' ~) f( Z. ^8 F
  依靠预言
) `' D; \; Z$ z9 c5 h. n" Q# _. D8 ?( Y
  假如老人想让他孙子继承遗产,继承时间是在他死后或者在孙子年满18岁时(也是一个带锁定时间交易),无论哪个条件先满足,他的孙子都可以得到遗产。
5 U1 S. R, e5 ~" X% ^6 G6 H$ X( y8 @
  因为比特币节点可依靠预言对死亡条件进行判断,预言是指具有密钥对的服务器,当用户自定义的表达式被证明是真的,它能按照要求对交易签名。! _1 D4 ^% k/ `3 o, M5 Z. r
7 s% W  @% k& j% I( q& H$ ~$ Q
  相信随着区块链的普及,会对未来的交易模式和商业结构带来巨大的影响。不过由于比特币的脚本语言不是图灵完备的,交易模式依旧有限,以太坊就是为解决这一问题而出现,后面我们会有大量介绍以太坊的文章。. {) M+ j( D- ?3 O7 A% p

) X) T' Q8 k1 S8 p' a2 }  P  参考文献 & 补充阅读
5 T' @+ p0 N& }' @. J, w0 e! D- E/ t6 z3 m
  精通比特币) T/ o$ C1 s8 M$ c0 a$ e: h2 h3 m7 a

% W2 W& U7 m7 V2 l8 _& ^& }  廖雪峰的深入理解比特币交易的脚本% _0 N! K7 @2 r' p" n3 E) Q* p
2 g# t1 r/ a+ L. E, j1 g* e4 N
  比特币合同
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    12