Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
  大家都有转过账,每笔交易是这样的:张三账上减¥200,李四账上加¥200。
1 N0 E1 z4 M0 L/ S  Y# w* S9 l  F! Q( r- C, o" x0 L/ |
  在比特币区块链中,交易不是这么简单,交易实际是通过脚本来完成,以承载更多的功能个,这也是为什么比特币被称为是一种“可编程的货币”。
* W' N; V6 L( @* F1 u$ N  N9 Q) q3 [% z8 h. l
  本文就来分析一下交易是如何实现可编程的。
/ j- @, x# P: c! y
# @! W# m8 F+ C  未花费的交易输出(UTXO)
8 u" {( b6 k& L' Z1 C& d2 b
  b4 U$ C# F3 d: F  先引入一个概念:未花费的交易输出——UTXO(Unspent Transaction Output)
9 |! Q* K6 M, j- {* r5 B% g% ]3 c& m9 U( U$ i* g- H
  其实比特币的交易都是基于UTXO上的,即交易的输入是之前交易未花费的输出,这笔交易的输出可以被当做下一笔新交易的输入。: p; F; l4 J3 _
+ {* X* M4 h6 H3 c* G* A
  挖矿奖励属于一个特殊的交易(称为coinbase交易),可以没有输入。( V, F0 a9 V5 b4 }
% [  ^2 I1 {; V3 S
  UTXO是交易的基本单元,不能再分割。1 T# V; f9 a2 F9 P  V* u4 }* S7 V

" W" P1 @& E, ^3 I0 i  在比特币没有余额概念,只有分散到区块链里的UTXO
6 x) }' Z+ x6 i- K2 n& J: N( \$ [. z. ~  _
5 u" E! p! j, o2 N/ }  随着钱从一个地址被移动到另一个地址的同时形成了一条所有权链,像这样:
7 J! `: {3 s; r. K, t4 H0 W# c
6 E  C" l( G: `) ^9 y# _# Z  比特币脚本
1 O" A) v/ H" O9 G, i! t: m# P9 d! F; `4 a% |3 X0 l5 {
  比特币交易是首先要提供一个用于解锁UTXO(用私钥去匹配锁定脚本)的脚本(常称为解锁脚本:Signature script),这也叫交易输入,% m7 m  h6 O4 F6 S
: s8 ~4 z1 z' D/ k3 A& Y
  交易的输出则是指向一个脚本(称为锁定脚本:PubKey script),这个脚本表达了:谁的签名(签名是常见形式,并不一定必须是签名)能匹配这个输出地址,钱就支付给谁。
" \1 u/ h* Z( i* J# a, b. ]+ |! D
  每一个比特币节点会通过同时执行这解锁和锁定脚本(不是当前的锁定脚本,是指上一个交易的锁定脚本)来验证一笔交易,脚本组合结果为真,则为有效交易。4 P6 D8 H5 R0 J& b6 P  {5 S+ j0 f

8 V+ ]/ j. U; r6 _! \- K  当解锁版脚本与锁定版脚本的设定条件相匹配时,执行组合有效脚本时才会显示结果为真" D( `9 j# t. H  c; R

) ]' P+ X" F3 w* n# I5 W! q  如最为常见类型的比特币交易脚本(支付到公钥哈希:P2PKH(Pay-to-Public-Key-Hash))组合是这样:
+ b: y% H& Z7 @7 {3 f0 L2 ^8 c' X, q" m) z+ z2 l0 w7 W: Z
  常见交易脚本验证过程
0 h4 q8 n( O5 J8 O4 K& s' X8 C. A; g: U: s2 j: ~: U6 T
  比特币交易脚本语言是一种基于逆波兰表示法的基于栈的执行语言(不知道逆波兰和栈的同学去翻大学数据结构课本,你也可跳过这个部分)。
+ X3 z  ]0 p% S3 p1 R% ^8 r. K# y! [
  比特币脚本语言包含基本算数计算、基本逻辑(比如if…then)、报错以及返回结果和一些加密指令,不支持循环。想了解更多语言细节可参考:比特币脚本5 G) g7 s  C. Z, b0 Y
2 ^! r  ~) k4 B* x+ a' `6 c# f/ x; C4 C
  脚本语言通过从左至右地处理每个项目的方式执行脚本。. `" j: F$ i% \, c5 M# l: T

6 e) Z. x! h# @2 M- q) Y& |  下面用两个图说明下常见类型的比特币交易脚本验证执行过程:
& l0 S6 S- ?& w/ S6 \& t) C4 m. S8 N3 v
  上图为解锁脚本运行过程(主要是入栈)
" J" f! r; N- N5 n6 i2 O* G" Y: ^" P0 c, Z
  上图为锁定脚本运行过程(主要是出栈),最后的结果为真,说明交易有效。
; A/ n% u# h( ^8 H+ j7 x2 n4 e) X/ @
  交易分析
  v9 U, L! F" D) n
1 `  r# G! k# q* y  d: N" k  实际上比特币的交易被设计为可以纳入多个输入和输出。
  U, c+ }1 v0 l; D2 Y
# `, F; S6 a# `, i4 w, g) b  交易结构
4 M2 S7 p1 l* B- F1 E: A; r  N0 ]9 I5 ~
9 C3 w* S7 V7 `# v5 S  我们来看看完整的交易结构,
2 _! q' A! @  M7 k; z0 u: O8 l- X, z% z
  交易的锁定时间定义了能被加到区块链里的最早的交易时间。在大多数交易里,它被设置成0,用来表示立即执行。
. m6 h% F) Y* |1 ~/ I: H4 _( o( h+ L' B
  如果锁定时间不是0并且小于5亿,就被视为区块高度,意指在这个指定的区块高度之前,该交易不会被包含在区块链里。
. {9 j8 V0 z3 A! u- A7 A' }: k0 q* q* b, a) N8 c/ F- C$ P( K
  如果锁定时间大于5亿,则它被当作是一个Unix纪元时间戳(从1970年1月1日以来的秒数),并且在这个指定时间之前,该交易不会被包含在区块链里。  c% I% {7 S# ]. H" I2 T3 |; d

$ k. _! ]- I" J: s  交易的数据结构没有交易费的字段,交易费通过所有输入的总和,以及所有输出的总和之间的差来表示,即:
4 x# M& Z  x+ |* y2 n4 p# B& |/ B4 P  X
  交易费 = 求和(所有输入) - 求和(所有输出)
5 y' s9 ?) h( \+ q. J& k* C. O* b2 E* ]* `$ S7 `* d+ y; C6 P
  交易输入结构) K+ L9 M. \3 j. }, {9 J+ {0 H

* Y8 h4 a* X7 J5 C  刚刚我们提过输入需要提供一个解锁脚本,现在来看看一个交易的输入结构:
& \% \; I3 C( E$ \. T
7 G9 l: c% G5 t: H( j, a  我们结合整个交易的结构里看输入结构就是这样子:
  d; E6 }" W4 B7 E8 M
5 O1 q6 @9 q$ f% i9 z, p" j" n  交易输出结构
* s8 }( e4 j/ X& \, _8 L8 z$ U9 O1 T" u5 `: o" ~3 y
  刚刚我们提过输出是指向一个解锁脚本,具体交易的输出结构为:
, b6 b7 R0 _) y7 _# N9 g) @" Y- I  A0 d* K+ g( u, q& `
  我们结合整个交易的结构里看输出结构就是这样子:3 |8 q; L. M' V! l9 ^8 d0 A" @4 V6 D$ k

- W2 Q7 r5 M& P& I/ j  z  交易哈希计算& P* V3 W5 h, @! O/ k( C) |
7 r4 |% U2 _6 G5 T$ K
  在比特币区块结构Merkle 树及简单支付验证分析 讲到区块结构,区块结构包含多个交易的哈希。
- A" Q& P. z! N& b/ \- C
5 O4 j' N) `9 s0 C0 R  那么交易哈希是怎么计算的呢?% `) k. a, |  I1 B

7 I' w. M+ C8 T+ k3 M; ~  交易结构各字段序列化为字节数组2 X3 D" B( u/ [  z* E$ m

, @5 j0 ]. M  x$ x& S8 \  把字节数组拼接为支付串# J. S# e* E  _

5 [: w$ v$ S  h; C* r+ e  对支付串计算两次SHA256 得到交易hash3 j5 R5 s7 P$ b$ t

" m3 N/ J& D/ p) Y/ n  了解详情可进一步参考如何计算交易Hash?及如何创建Hash?
5 \! k/ i' V; C: V- p0 y9 ~1 Y3 L
0 d7 f) y, {0 c0 ]- j  现在是不是对完整的交易到区块有了更清晰的认识。8 `; @5 Q4 \* X# X

$ m, U! C4 W) O6 S/ U3 ]5 P4 V  智能合约雏形 - 应用场景说明* m+ u( z& R# u- ~& F9 }

1 Y8 w$ I8 E, ^& ?. E4 j  由于交易是通过脚本来实现,脚本语言可以表达出无数的条件变种。# N  b7 d3 w/ v4 ^
( C9 _7 B" B8 S  [! T! X# K
  比特币的脚本目前常用的主要分为两种,一种是常见的P2PKH(支付给公钥哈希),另一种是P2SH(Pay-to-Script-Hash支付脚本哈希)。
  y) s! C) D% w- ?( J- H& b: S% A6 N: u* j$ Y4 T6 J9 N
  P2SH支付中,锁定脚本被密码学哈希所取代,当一笔交易试图支付UTXO时,要解锁支付脚本,它必须含有与哈希相匹配的脚本。4 n5 Y) \6 O% n
/ k4 X7 a# y, u3 |1 r
  这里不展开技术细节,下面说明一些应用场景,以便大家有更直观的认识。# V! ]$ u! I' d# o
$ L" E  b$ U  Y6 H, L/ E
  多重签名应用
- h! g$ N2 L6 Z: f9 S! w9 ^) Q. L
1 d: M# D$ W8 Q8 I1 N! ?2 R! c. x  合伙经营中,如只有一半以上的的股东同意签名就可以进行支付,可为公司治理提供管控便利,同时也能有效防范盗窃、挪用和遗失。+ ^  ]' ]4 Y7 u# B- d& E

- B/ [# F$ D" K; v! m+ u  用于担保和争端调解,一个买家想和他不认识或不信任的某人交易,在一般情况交易正常进行时,买家不想任何第三方参与。那交易双方可以发起支付,但如果交易出现问题时,那第三方就可以根据裁定,使用自己的签名和裁定认可的一方共同签名来兑现这笔交易。, a1 y2 N& l. }  n$ `

, D! t9 ]/ j- e, r  保证合同
: P+ ^* a% H6 A; s1 U5 F
" r, j9 V2 l) m* A& w  保证合同是建造公众商品时的集资办法,公众商品是指一旦建成,任何人都可以免费享受到好处。标准的例子是灯塔,所有人都认同应该建造一个,但是对于个人航海者来说灯塔太贵了,灯塔同时也会方便其他航海者。+ ~- G( ~4 d& x" U( _6 E' a# u
* x* n' H7 R/ w: v- B
  一个解决方案是向所有人集资,只有当筹集的资金超过所需的建造成本时,每个人才真正付钱,如果集资款不足,则谁都不用付钱。
: T' c/ v! D) y, U0 t2 J: x) t
2 ^1 r, b  n0 ]* I# {  依靠预言( x9 x# s' c# k0 b

, C- i; X6 e" \9 _) C* w* ]  假如老人想让他孙子继承遗产,继承时间是在他死后或者在孙子年满18岁时(也是一个带锁定时间交易),无论哪个条件先满足,他的孙子都可以得到遗产。
1 F: w4 R% Q0 o# |& @* j8 Y6 u5 p4 m! u- D( @- n$ G6 O
  因为比特币节点可依靠预言对死亡条件进行判断,预言是指具有密钥对的服务器,当用户自定义的表达式被证明是真的,它能按照要求对交易签名。
! x8 \. G3 \5 k
4 ?! G& `# K6 c8 h" i  A! n/ Y! R  相信随着区块链的普及,会对未来的交易模式和商业结构带来巨大的影响。不过由于比特币的脚本语言不是图灵完备的,交易模式依旧有限,以太坊就是为解决这一问题而出现,后面我们会有大量介绍以太坊的文章。
, r3 i+ r; x' h- [+ V+ [$ _6 d, ?* J. X
  参考文献 & 补充阅读/ Q4 o' ~, \* m8 p, c1 g) l

, T2 b0 i" q" l& o/ d8 Y( F  精通比特币
; a1 W9 h/ \& A, v1 g9 c& Z! i/ h8 X( g" [  q" l8 A1 g
  廖雪峰的深入理解比特币交易的脚本. A6 T5 X  s" G. K
3 h( s) d- M# Y4 c# E+ H( K3 b
  比特币合同
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    12