Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
  大家都有转过账,每笔交易是这样的:张三账上减¥200,李四账上加¥200。$ E9 L) U+ x6 i
, c+ G6 r3 r* X9 e+ ~4 l4 t. ?
  在比特币区块链中,交易不是这么简单,交易实际是通过脚本来完成,以承载更多的功能个,这也是为什么比特币被称为是一种“可编程的货币”。6 e- [6 ^( z: A8 `8 G
8 P6 F- \! U" m* G/ e+ u# R
  本文就来分析一下交易是如何实现可编程的。
' u, a% j% O8 r% \4 t+ u. V% y: U1 c' E' _
  未花费的交易输出(UTXO)3 P5 U; K$ M( X$ p
1 ^& w* V' c, Y8 G$ N+ C( a
  先引入一个概念:未花费的交易输出——UTXO(Unspent Transaction Output)
7 s2 k% }: S- C. m9 j
  ^& X: H4 _6 u7 G* I) H  其实比特币的交易都是基于UTXO上的,即交易的输入是之前交易未花费的输出,这笔交易的输出可以被当做下一笔新交易的输入。
+ H# m! S. d, O% t& U1 w% f
8 a' j1 h  f3 K9 E- U. E  挖矿奖励属于一个特殊的交易(称为coinbase交易),可以没有输入。2 q$ @: E3 d: f% z" F( d

  c& s4 F8 g, u. {. W. ?3 r( d  UTXO是交易的基本单元,不能再分割。
+ t  `8 I/ d3 j* V- i& f: b5 h2 @% u) [% K& M4 \+ K( F7 c
  在比特币没有余额概念,只有分散到区块链里的UTXO
! O5 b" i! G) _: ]9 {6 W3 M, P1 [) s4 @# p
  随着钱从一个地址被移动到另一个地址的同时形成了一条所有权链,像这样:
* u1 X9 d' l& Q. J) j: c, I2 o# O, k# _1 N
  比特币脚本
& S3 E% [- A6 Z% l- F: G! ~/ V8 o: [- x
  比特币交易是首先要提供一个用于解锁UTXO(用私钥去匹配锁定脚本)的脚本(常称为解锁脚本:Signature script),这也叫交易输入,
% K- u4 z) W6 r. x7 `  N% r' |$ }" _+ K8 e, S& X9 P
  交易的输出则是指向一个脚本(称为锁定脚本:PubKey script),这个脚本表达了:谁的签名(签名是常见形式,并不一定必须是签名)能匹配这个输出地址,钱就支付给谁。" G8 J9 l6 S4 o
+ N/ [& x$ c6 W: c8 l8 ^( N$ |
  每一个比特币节点会通过同时执行这解锁和锁定脚本(不是当前的锁定脚本,是指上一个交易的锁定脚本)来验证一笔交易,脚本组合结果为真,则为有效交易。' g4 A  i/ L( `$ H" F: v

* A8 r# Q! E! m+ \0 T  当解锁版脚本与锁定版脚本的设定条件相匹配时,执行组合有效脚本时才会显示结果为真" f+ C& H! v0 G+ M, |

( I7 |: o+ s5 r; `  如最为常见类型的比特币交易脚本(支付到公钥哈希:P2PKH(Pay-to-Public-Key-Hash))组合是这样:
" @4 j) }' Y. t, n" @# |
" X& v* w& s- i! L9 l) t/ M3 p7 N' u  常见交易脚本验证过程$ {$ J+ [/ I5 D9 r; E8 R
% i7 s# q1 _8 V- N; R! w
  比特币交易脚本语言是一种基于逆波兰表示法的基于栈的执行语言(不知道逆波兰和栈的同学去翻大学数据结构课本,你也可跳过这个部分)。
7 C0 {' a4 q, G& I0 N
* U% B5 I/ C/ m0 z6 h9 a  比特币脚本语言包含基本算数计算、基本逻辑(比如if…then)、报错以及返回结果和一些加密指令,不支持循环。想了解更多语言细节可参考:比特币脚本+ a' G; {' \. c/ ~

1 t7 C. N6 K4 ~# E! y% f, q  脚本语言通过从左至右地处理每个项目的方式执行脚本。# V3 Y3 v3 ~+ B0 r7 D4 @
: |% g! T. s8 g
  下面用两个图说明下常见类型的比特币交易脚本验证执行过程:
! |: z5 m, S2 S! a( L: [
' T6 X* Q0 u/ I% S; `  上图为解锁脚本运行过程(主要是入栈)7 L% A+ s/ B0 A8 a3 w

7 P. j4 z, G, o. C! f( d) S9 l# y  上图为锁定脚本运行过程(主要是出栈),最后的结果为真,说明交易有效。0 H+ H% {" T1 Z+ v
! \0 u6 A( a! N5 v  z
  交易分析. j6 _3 o, ]. P- i: @9 e
$ C6 C! |5 ~1 C2 B+ P4 H4 Z
  实际上比特币的交易被设计为可以纳入多个输入和输出。/ Y4 n2 S+ C. B' `7 g4 v/ I
! ^  E1 u5 P: D
  交易结构
& U5 H$ B1 N* x) R6 |
" ~% ]! U$ O$ h4 k6 l# y) {  我们来看看完整的交易结构,; Z( Y7 I4 v3 s( n/ v- j
" w& q9 c: q" F$ k& w3 i9 h% Q
  交易的锁定时间定义了能被加到区块链里的最早的交易时间。在大多数交易里,它被设置成0,用来表示立即执行。
1 O& F3 W) I0 m  L9 b: q1 `" S4 L% B/ v" d0 B9 R8 }! S" Q
  如果锁定时间不是0并且小于5亿,就被视为区块高度,意指在这个指定的区块高度之前,该交易不会被包含在区块链里。7 n9 D/ a) y' y, k; O" ?

* m( {  j- e7 X, a) p: g- G$ K  如果锁定时间大于5亿,则它被当作是一个Unix纪元时间戳(从1970年1月1日以来的秒数),并且在这个指定时间之前,该交易不会被包含在区块链里。
- |- s, X7 l4 @7 U" W7 Y0 D. T, G' E" }8 ~
  交易的数据结构没有交易费的字段,交易费通过所有输入的总和,以及所有输出的总和之间的差来表示,即:" D3 `& y& ?* X$ o

$ {& m% t$ k& }1 r8 |  交易费 = 求和(所有输入) - 求和(所有输出)  L4 l  c; Z$ I  _: r  T! N

# _  m& A  ]: X& U9 L9 G  交易输入结构
/ V0 u- L9 B7 V8 T6 u
0 q) t1 X! G& P( [8 ?  刚刚我们提过输入需要提供一个解锁脚本,现在来看看一个交易的输入结构:
& P  O2 a4 b# \  @# f
/ A  F% g, D4 ^  我们结合整个交易的结构里看输入结构就是这样子:2 v6 D# T  S; F% ]

+ A. t  E& m/ Q9 v' j6 i  交易输出结构
9 x0 Q( \& v9 M, ~7 Q
6 s2 l; n: Z2 m0 |/ H5 ]  刚刚我们提过输出是指向一个解锁脚本,具体交易的输出结构为:
8 {2 I. @* ^5 n
/ o; p3 S. k, j( @$ L/ ^  我们结合整个交易的结构里看输出结构就是这样子:- c, r' N, n: {# T
5 H" x5 t8 E6 A8 g0 e/ o, i1 {
  交易哈希计算
2 f5 v* }/ s# ]! @8 Q6 \4 {! c2 t
; G8 }4 ]5 z! g2 g# H( G  在比特币区块结构Merkle 树及简单支付验证分析 讲到区块结构,区块结构包含多个交易的哈希。! e: X$ T4 q( G' l
9 |' X8 X7 H+ s
  那么交易哈希是怎么计算的呢?
/ H/ u1 _4 n& N: m+ d9 l  p  a2 w7 j  B+ A; r9 `) d1 y
  交易结构各字段序列化为字节数组
# g0 V* G. C+ L: g
# n4 k( ?3 C0 z  把字节数组拼接为支付串
$ p5 g) [  L: t% ?
. A6 O0 _0 @5 d0 @" V/ E, d2 h  对支付串计算两次SHA256 得到交易hash* W8 u7 G- Q  z
3 g, q/ X+ F, v" S
  了解详情可进一步参考如何计算交易Hash?及如何创建Hash?
4 j, e6 ]2 `1 @' f9 X! L5 l; e& z! F8 Y& \3 w; A
  现在是不是对完整的交易到区块有了更清晰的认识。" s" J3 ]; G. J$ [) w' p
7 I5 Y5 v: u: c  h
  智能合约雏形 - 应用场景说明( |3 T% ~+ O; e/ x9 {/ c6 _

# f% u& h) L& W/ E* N' [  由于交易是通过脚本来实现,脚本语言可以表达出无数的条件变种。/ A# W( e* n+ V, Z
' ~2 a; f) W! o2 F- l/ }" m
  比特币的脚本目前常用的主要分为两种,一种是常见的P2PKH(支付给公钥哈希),另一种是P2SH(Pay-to-Script-Hash支付脚本哈希)。
' U2 X* T, ]) ]" k9 G3 P) c% ]* Q
' w  j2 b0 m7 b; S  P2SH支付中,锁定脚本被密码学哈希所取代,当一笔交易试图支付UTXO时,要解锁支付脚本,它必须含有与哈希相匹配的脚本。! ]9 S& |  u$ y1 a. E; @; R( G

8 H/ Z5 D& R  j, j) g  y9 }3 Q  这里不展开技术细节,下面说明一些应用场景,以便大家有更直观的认识。
7 }! e& Z# s- v$ p5 F: c) E: d+ O: A& a7 @# [; C* w
  多重签名应用
) A' ^* i/ g: g# j
; D+ ^. _  O5 L# P7 }  R  合伙经营中,如只有一半以上的的股东同意签名就可以进行支付,可为公司治理提供管控便利,同时也能有效防范盗窃、挪用和遗失。8 e7 P' s! G1 W8 `: G

6 r1 j# X! P7 ^5 C' G7 I8 |, F  用于担保和争端调解,一个买家想和他不认识或不信任的某人交易,在一般情况交易正常进行时,买家不想任何第三方参与。那交易双方可以发起支付,但如果交易出现问题时,那第三方就可以根据裁定,使用自己的签名和裁定认可的一方共同签名来兑现这笔交易。
6 r9 H/ ?# e% H7 u7 K
3 c1 l' h5 A2 F1 T* H  保证合同
6 L' z# X1 x* {) [9 T5 r/ X$ @; @$ Z( R9 w- d
  保证合同是建造公众商品时的集资办法,公众商品是指一旦建成,任何人都可以免费享受到好处。标准的例子是灯塔,所有人都认同应该建造一个,但是对于个人航海者来说灯塔太贵了,灯塔同时也会方便其他航海者。1 c3 `+ n0 L* U/ u% x

2 U! Y( y* ?" F0 W. s  一个解决方案是向所有人集资,只有当筹集的资金超过所需的建造成本时,每个人才真正付钱,如果集资款不足,则谁都不用付钱。2 p$ {" H- d# ~* `. H; |
! h* _% x& D, ^. f% b
  依靠预言) ^/ u' l  {' K; i" l7 `! H& n2 k* J
( T+ b2 c, C) _- g  f3 v0 @& z
  假如老人想让他孙子继承遗产,继承时间是在他死后或者在孙子年满18岁时(也是一个带锁定时间交易),无论哪个条件先满足,他的孙子都可以得到遗产。
& h6 E" n8 y1 k8 a) F% s6 B- Y7 O7 }$ Z  i# \8 O
  因为比特币节点可依靠预言对死亡条件进行判断,预言是指具有密钥对的服务器,当用户自定义的表达式被证明是真的,它能按照要求对交易签名。, z% x9 k6 p" D# Z, F. Z

3 C+ m! X8 l8 O: H  相信随着区块链的普及,会对未来的交易模式和商业结构带来巨大的影响。不过由于比特币的脚本语言不是图灵完备的,交易模式依旧有限,以太坊就是为解决这一问题而出现,后面我们会有大量介绍以太坊的文章。9 M* ]' |1 t2 K- J. L( O
0 H5 c% O, n& L% Q
  参考文献 & 补充阅读
7 i: [5 U5 e# x+ w$ x& Q; s
/ ]9 f0 c$ N1 n0 e/ ^  精通比特币, f  d: N! ]4 {! [5 L
4 Y  H: e0 D3 S8 B5 r
  廖雪峰的深入理解比特币交易的脚本, H. o5 i( r2 K. B

9 S  |  C( p$ m% r  ]% ?  比特币合同
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    12