Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
  大家都有转过账,每笔交易是这样的:张三账上减¥200,李四账上加¥200。
; p6 Q! F' o7 ]- `
! ^( B( [$ U+ }1 m/ W, Q  在比特币区块链中,交易不是这么简单,交易实际是通过脚本来完成,以承载更多的功能个,这也是为什么比特币被称为是一种“可编程的货币”。
. n2 W9 S4 w: V7 b; B
; i$ B' j( _. w! F  本文就来分析一下交易是如何实现可编程的。1 H; }3 E; A( ^
# D+ a- c& N; Y  Z( X" ^# h+ M8 C
  未花费的交易输出(UTXO)3 f& v; e& A0 z. d

4 ~/ Y5 s2 y# _' q  先引入一个概念:未花费的交易输出——UTXO(Unspent Transaction Output)8 R5 f& f9 b" D1 ^# v( B1 t
2 e* p' j6 A6 Y2 ~# h8 V1 f6 E
  其实比特币的交易都是基于UTXO上的,即交易的输入是之前交易未花费的输出,这笔交易的输出可以被当做下一笔新交易的输入。
8 q8 `& |7 e$ P4 b! D" g+ b8 x* F) f; Z( ~: c) r
  挖矿奖励属于一个特殊的交易(称为coinbase交易),可以没有输入。; P3 O& L$ D  d- X6 b4 z( V: o
9 h( U6 n7 O5 N9 d
  UTXO是交易的基本单元,不能再分割。2 T9 P, J. E# t1 K4 Q1 _
: c$ I& |% k; \, o
  在比特币没有余额概念,只有分散到区块链里的UTXO
8 |6 N4 `* n& g; G' m/ |- l2 ~
5 M, e0 b: c9 Y- I' u1 r5 p5 E9 r  随着钱从一个地址被移动到另一个地址的同时形成了一条所有权链,像这样:) |- R# J4 s2 M5 Y  n

( z- L7 L* S4 @9 ~, m5 ]  比特币脚本
) P+ F) \* ^0 I% q1 v/ {6 b0 b2 z
, @/ N* {( u9 _9 n( x  比特币交易是首先要提供一个用于解锁UTXO(用私钥去匹配锁定脚本)的脚本(常称为解锁脚本:Signature script),这也叫交易输入,
5 d! W- _, \: n# ~) ^  H2 ?
% D3 Z/ H. ^% e: o: n1 S1 l  交易的输出则是指向一个脚本(称为锁定脚本:PubKey script),这个脚本表达了:谁的签名(签名是常见形式,并不一定必须是签名)能匹配这个输出地址,钱就支付给谁。" b) t7 I/ y5 I9 s9 @5 g$ f
$ k. w& O! i  I$ {, A' ]/ A
  每一个比特币节点会通过同时执行这解锁和锁定脚本(不是当前的锁定脚本,是指上一个交易的锁定脚本)来验证一笔交易,脚本组合结果为真,则为有效交易。
  w! p8 y& H+ W, a8 g3 N4 \2 P; Z& e4 |7 y- a3 b) x6 o+ g
  当解锁版脚本与锁定版脚本的设定条件相匹配时,执行组合有效脚本时才会显示结果为真. a$ y* p6 L8 }3 [% k0 _
) Q4 H& V# i# R  T0 Z
  如最为常见类型的比特币交易脚本(支付到公钥哈希:P2PKH(Pay-to-Public-Key-Hash))组合是这样:
0 L: Y( C$ i+ k1 |- J- j& f% \# H. C1 ~7 Q$ b; w+ D, f9 {
  常见交易脚本验证过程
1 j1 g. \* E3 i: y
& b! d) J3 l9 D# Y5 f  比特币交易脚本语言是一种基于逆波兰表示法的基于栈的执行语言(不知道逆波兰和栈的同学去翻大学数据结构课本,你也可跳过这个部分)。
8 X- l+ E% ?. b
- C; i' l  }2 t8 c. r( n  比特币脚本语言包含基本算数计算、基本逻辑(比如if…then)、报错以及返回结果和一些加密指令,不支持循环。想了解更多语言细节可参考:比特币脚本; j9 A( L; I. B7 I
4 S/ k+ J, \* V0 X3 S: O  m
  脚本语言通过从左至右地处理每个项目的方式执行脚本。
- B  h' v$ p9 s/ O0 y: y" f& V. E  N
  下面用两个图说明下常见类型的比特币交易脚本验证执行过程:
0 w( r2 X- e; I7 W  j8 p4 X; l4 h; f5 o( s. z) |% t! l
  上图为解锁脚本运行过程(主要是入栈)
2 c9 x; Q/ C" V2 ]% V5 \. U" ~3 D7 ^. v8 f. z+ j( h% g
  上图为锁定脚本运行过程(主要是出栈),最后的结果为真,说明交易有效。7 g7 O8 L& V+ w, _1 y# o

* {5 o* f4 F* b& t+ v  交易分析% K; Z+ X- b+ B
" X; }+ I" L8 F4 @1 ?  K
  实际上比特币的交易被设计为可以纳入多个输入和输出。" D( ~. l6 p4 R/ n8 b6 k' O* f% A+ \" f9 s

$ \- \+ s* k& `9 ~0 D# T! s  交易结构
  P, I; t6 [( T0 \2 V: j; t7 Y3 Y) O" X3 Z
  我们来看看完整的交易结构,
0 T/ ]8 L$ K9 I2 G# m4 E$ Y% k4 Y0 V6 n' F1 i
  交易的锁定时间定义了能被加到区块链里的最早的交易时间。在大多数交易里,它被设置成0,用来表示立即执行。
- g8 u, K2 X/ W' I) X3 H2 X8 i3 u; c- `/ w: ]
  如果锁定时间不是0并且小于5亿,就被视为区块高度,意指在这个指定的区块高度之前,该交易不会被包含在区块链里。
( R/ s# j/ S  b1 a. t4 z: P
$ L/ o9 g) r% _( U6 v% C. ]  如果锁定时间大于5亿,则它被当作是一个Unix纪元时间戳(从1970年1月1日以来的秒数),并且在这个指定时间之前,该交易不会被包含在区块链里。# ]) `/ Q# {4 ^

$ F; @7 B1 F+ d  交易的数据结构没有交易费的字段,交易费通过所有输入的总和,以及所有输出的总和之间的差来表示,即:8 ]. z+ N5 t9 o4 Y0 _
& }, r1 L2 s8 Q* G6 p: E' D; r
  交易费 = 求和(所有输入) - 求和(所有输出)7 |2 O  Y# A- K# A3 I# }

3 y9 w8 D/ ]  w/ j: _  交易输入结构9 k! Y; L% y- F/ Y3 v! l

5 R4 g( Z* N# e: X) ]  刚刚我们提过输入需要提供一个解锁脚本,现在来看看一个交易的输入结构:+ m- m* S+ Q& l/ d4 m' t( u3 T

+ u& q" T- ?0 s' W% A- @2 R8 m) D6 o  我们结合整个交易的结构里看输入结构就是这样子:
+ V! Y6 y* n6 Y- q4 B5 W; P6 }& Y
( U% ]6 ?' r2 y8 X; v& p" G  交易输出结构
( `( A& J5 c7 |0 ^5 n: Z+ w# S! }! V, ]+ D" M' Z0 E1 @
  刚刚我们提过输出是指向一个解锁脚本,具体交易的输出结构为:
) p% V( A* M. ^7 J6 g# f( ?4 O5 N9 N6 F! ~  S
  我们结合整个交易的结构里看输出结构就是这样子:
; D, H3 u6 c" W$ t' ?4 N
1 V# n1 ^4 p3 s: o% o& G  交易哈希计算% V% @5 ?8 D$ w1 a# z

2 A0 K/ S6 u" V6 A  在比特币区块结构Merkle 树及简单支付验证分析 讲到区块结构,区块结构包含多个交易的哈希。: F' K8 L5 c8 L3 O1 H$ L
( W' J) z% u6 v
  那么交易哈希是怎么计算的呢?% @6 f( c, N" g

) ]  r% s# R( t9 D  交易结构各字段序列化为字节数组
& _4 M% E6 l, \1 w+ x( b
: m) E1 _" V# i7 ^3 W. X  把字节数组拼接为支付串3 ^( Z2 Z* M8 E$ B$ V5 T6 D" h
. T4 ~' l# K  e+ T( w
  对支付串计算两次SHA256 得到交易hash5 W; q6 c0 F4 ~8 i6 b+ O

: [/ q& F1 w8 ~/ W3 f  了解详情可进一步参考如何计算交易Hash?及如何创建Hash?1 l, B! ]0 X0 V8 S3 A
. n7 T0 g6 c1 e# q+ D
  现在是不是对完整的交易到区块有了更清晰的认识。& p& ^( c/ A7 f- b1 \$ w+ b
2 q' Y- m) V6 u& T
  智能合约雏形 - 应用场景说明! k2 g. r* ^9 M4 ]! u# u+ ^

7 q1 W1 }& w: y" x0 c  由于交易是通过脚本来实现,脚本语言可以表达出无数的条件变种。
+ j# {" s$ I) Q8 s  ]9 H% P
% A6 y6 e; u& X4 O( y  比特币的脚本目前常用的主要分为两种,一种是常见的P2PKH(支付给公钥哈希),另一种是P2SH(Pay-to-Script-Hash支付脚本哈希)。( }& }; I: g6 A7 K3 V- c

0 @5 `7 b. ]& ]. ^: t/ S  P2SH支付中,锁定脚本被密码学哈希所取代,当一笔交易试图支付UTXO时,要解锁支付脚本,它必须含有与哈希相匹配的脚本。% c5 A4 V" d! U, \

! M. b  v" N) M- L% `  这里不展开技术细节,下面说明一些应用场景,以便大家有更直观的认识。
4 P; j8 Y7 g! ^5 j
# Z$ r6 V! R! ]* M! `0 d  多重签名应用- A" O$ G9 R! E* e
. u5 k% k& M# |6 f$ }: C6 X( K/ @4 B
  合伙经营中,如只有一半以上的的股东同意签名就可以进行支付,可为公司治理提供管控便利,同时也能有效防范盗窃、挪用和遗失。) E  ^, T0 m: @" f

: _( L$ T' w# [# r  用于担保和争端调解,一个买家想和他不认识或不信任的某人交易,在一般情况交易正常进行时,买家不想任何第三方参与。那交易双方可以发起支付,但如果交易出现问题时,那第三方就可以根据裁定,使用自己的签名和裁定认可的一方共同签名来兑现这笔交易。$ O" h4 l2 b" {, p0 o- X) p

% X' X% R) R' U. `, {  ?  保证合同$ P1 V$ P0 X  ~4 z0 C! b- r3 u
3 z0 {* Y# X' c3 L* U$ W
  保证合同是建造公众商品时的集资办法,公众商品是指一旦建成,任何人都可以免费享受到好处。标准的例子是灯塔,所有人都认同应该建造一个,但是对于个人航海者来说灯塔太贵了,灯塔同时也会方便其他航海者。
* I: b# l. j5 D( D  v0 P! s5 c+ p/ l- C& |) |
  一个解决方案是向所有人集资,只有当筹集的资金超过所需的建造成本时,每个人才真正付钱,如果集资款不足,则谁都不用付钱。
' T; t  @& H! \) R6 p5 S0 F) P5 l3 l8 N  N- {7 y7 j4 E/ n
  依靠预言2 J- ~8 F# S6 R+ a

7 A9 Y9 d; |9 Q8 l. @8 d. U  假如老人想让他孙子继承遗产,继承时间是在他死后或者在孙子年满18岁时(也是一个带锁定时间交易),无论哪个条件先满足,他的孙子都可以得到遗产。
. M+ S; O8 h& D& h6 H
( o- I2 y6 P* \& g6 T  因为比特币节点可依靠预言对死亡条件进行判断,预言是指具有密钥对的服务器,当用户自定义的表达式被证明是真的,它能按照要求对交易签名。+ `9 k0 ^8 r7 W9 C# C' @# L

$ |) p; I, y7 J1 w, E  相信随着区块链的普及,会对未来的交易模式和商业结构带来巨大的影响。不过由于比特币的脚本语言不是图灵完备的,交易模式依旧有限,以太坊就是为解决这一问题而出现,后面我们会有大量介绍以太坊的文章。
. A0 V5 v7 X2 U& ]  @; O! C) \
3 l& R' r6 C+ v! ~# {' f, I% V  参考文献 & 补充阅读" h' o8 Y6 O! |5 ?
( _. U: N: P  k4 i) T; L
  精通比特币" N" X) ^, ]7 J

  `4 z5 Q6 |/ l$ p5 ^2 _  廖雪峰的深入理解比特币交易的脚本
" P2 |$ c; S* t4 n  V1 ~* R( A3 Z8 l4 K2 G8 L" |2 Y6 g- `
  比特币合同
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    12