Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
  大家都有转过账,每笔交易是这样的:张三账上减¥200,李四账上加¥200。
$ t1 }- N: S3 B
' ^7 R* t/ E3 r9 ?1 z  在比特币区块链中,交易不是这么简单,交易实际是通过脚本来完成,以承载更多的功能个,这也是为什么比特币被称为是一种“可编程的货币”。4 j% ^6 ]% \$ s
+ p* V( ]' \% h1 j6 A" u' O4 i
  本文就来分析一下交易是如何实现可编程的。
5 J; t, {, B! A5 a  Y  L) l7 A+ e, V
! B- p8 r: \5 H) \# p9 S" i( V  未花费的交易输出(UTXO)
8 v, p, h! a6 |% }6 O% h$ K4 h8 ~0 y, x7 J  J" G1 r
  先引入一个概念:未花费的交易输出——UTXO(Unspent Transaction Output)
- A1 d9 h+ K4 w9 I- E2 V8 N+ k7 \- F, t' _. e
  其实比特币的交易都是基于UTXO上的,即交易的输入是之前交易未花费的输出,这笔交易的输出可以被当做下一笔新交易的输入。! F7 s7 V* g7 N7 T: c4 F" d
  H( v8 v; p9 l9 o" F9 x  }. k
  挖矿奖励属于一个特殊的交易(称为coinbase交易),可以没有输入。
% J4 r+ u- f3 A* p" e
$ K. a$ P# v, l; o) M  b& E; g2 c9 D  UTXO是交易的基本单元,不能再分割。
7 a. F0 v9 y+ o; }+ M9 `- q" {- b. {6 i% d1 M, d# f
  在比特币没有余额概念,只有分散到区块链里的UTXO
& h: N2 }$ b/ d: Z
( j6 k9 V8 P/ U8 f& P: Z  随着钱从一个地址被移动到另一个地址的同时形成了一条所有权链,像这样:8 C/ L- k7 c% q% Y5 O; U
7 X% m, f  Z7 r& E" A2 t
  比特币脚本7 U- t* q8 n; Q! V) e% u
0 q1 ?7 P; H4 m7 N7 ]4 b9 }. z
  比特币交易是首先要提供一个用于解锁UTXO(用私钥去匹配锁定脚本)的脚本(常称为解锁脚本:Signature script),这也叫交易输入,6 i/ ]( N6 ]3 g# u4 N
/ O6 S% E8 j2 _# b3 X, O; W
  交易的输出则是指向一个脚本(称为锁定脚本:PubKey script),这个脚本表达了:谁的签名(签名是常见形式,并不一定必须是签名)能匹配这个输出地址,钱就支付给谁。
6 `/ C7 _  Q# n% _# U' i( c) c; V
7 z5 K' {0 T: E' i9 P- h4 \/ {/ K  每一个比特币节点会通过同时执行这解锁和锁定脚本(不是当前的锁定脚本,是指上一个交易的锁定脚本)来验证一笔交易,脚本组合结果为真,则为有效交易。
/ n- K' p& `4 V* {
6 T- a% [5 k7 u  当解锁版脚本与锁定版脚本的设定条件相匹配时,执行组合有效脚本时才会显示结果为真! ]% P. W9 n, ?; v& ]

% F/ r; u8 g" d. O/ p! u  如最为常见类型的比特币交易脚本(支付到公钥哈希:P2PKH(Pay-to-Public-Key-Hash))组合是这样:! _* g8 R! `+ W5 _# ^6 t1 f

: n4 q) r, l% x" }) R0 y6 v  常见交易脚本验证过程' y5 r; b  k! l* J$ G
. g, ^8 u6 k: i3 d* h
  比特币交易脚本语言是一种基于逆波兰表示法的基于栈的执行语言(不知道逆波兰和栈的同学去翻大学数据结构课本,你也可跳过这个部分)。
! v6 A0 f1 e/ l. X6 h! W" B; b+ V' T  M2 @
  比特币脚本语言包含基本算数计算、基本逻辑(比如if…then)、报错以及返回结果和一些加密指令,不支持循环。想了解更多语言细节可参考:比特币脚本5 H" p7 A( l% ?1 Y$ l& m! ?

# z! Q* T  B' ~+ w9 c# G( I  脚本语言通过从左至右地处理每个项目的方式执行脚本。
6 l# Q2 v0 n) p4 S/ f  f- l* o9 y1 V: e" O( D
  下面用两个图说明下常见类型的比特币交易脚本验证执行过程:/ n  d! ?0 L# |! q
1 Y$ V- T; P2 g, p
  上图为解锁脚本运行过程(主要是入栈)2 m' H* P! w  s$ {

2 `5 Q1 c! w( w. Y  上图为锁定脚本运行过程(主要是出栈),最后的结果为真,说明交易有效。+ x1 H! ?* [) p/ S
6 A/ E1 ^, H, V
  交易分析* n8 C. ?: d/ R/ O) \$ _

+ J. A  d/ g3 G+ u# b  实际上比特币的交易被设计为可以纳入多个输入和输出。* i- A( m* Y' p5 }+ q6 H& E/ z

3 @# q* k( [( S$ t& E9 x! S; |+ L' ^  交易结构9 P  T( ^6 f8 P$ [! t7 X  O

+ e( X/ m+ h8 U- N, e  l- t  我们来看看完整的交易结构,
1 `9 @: v' A/ [: n# M) s. V
. l" @' \% j( b1 Y- w  交易的锁定时间定义了能被加到区块链里的最早的交易时间。在大多数交易里,它被设置成0,用来表示立即执行。
. i7 l3 [% d2 g' s6 g* A4 P
" k! ^. ?/ r7 v/ t* d" d  如果锁定时间不是0并且小于5亿,就被视为区块高度,意指在这个指定的区块高度之前,该交易不会被包含在区块链里。
9 C1 y& s: f0 B9 ]& H( z7 Q9 N  Y( F3 B0 k# n
  如果锁定时间大于5亿,则它被当作是一个Unix纪元时间戳(从1970年1月1日以来的秒数),并且在这个指定时间之前,该交易不会被包含在区块链里。
5 M: ^+ T7 \1 Y" N! f3 a4 W) E; M0 A& T4 A! ?! p- s/ q  Y% Y3 j  F
  交易的数据结构没有交易费的字段,交易费通过所有输入的总和,以及所有输出的总和之间的差来表示,即:9 \' w" a4 }' p% d
6 P2 B' z, U4 j3 i& D8 c
  交易费 = 求和(所有输入) - 求和(所有输出)
0 f9 P* g- q! b  W* C8 h$ o% j( N$ T! X; M* X# o5 r3 e
  交易输入结构: }7 E) j4 I7 F/ u
4 ]2 s9 f; t% y
  刚刚我们提过输入需要提供一个解锁脚本,现在来看看一个交易的输入结构:
0 Q5 M8 a: N  S5 q( ], J
4 ^. Z: y4 V" `; v7 M: t4 R  我们结合整个交易的结构里看输入结构就是这样子:7 }6 w1 M4 [' O$ T
0 ]! I; h; q: e$ w% c/ w/ b* E/ ^
  交易输出结构
& H8 s) r9 b5 j- x; o5 D5 j
! i+ |" b: E2 Z# W& p  刚刚我们提过输出是指向一个解锁脚本,具体交易的输出结构为:
$ Q8 U" \& j7 U3 m) s8 Q+ _: Z# {( F/ ?" p& ^& A$ [
  我们结合整个交易的结构里看输出结构就是这样子:1 m. L) O/ y& J
' o/ O3 H; l* r6 g5 ^
  交易哈希计算+ i1 z! Z8 u* W$ Q5 G+ Z
" ^4 _5 Z7 K5 \8 P3 L4 L6 v2 g/ x% J" q
  在比特币区块结构Merkle 树及简单支付验证分析 讲到区块结构,区块结构包含多个交易的哈希。
( U, F8 @, K: B% J  z2 v4 @" z1 F3 d! v2 O/ ~: s/ o2 G
  那么交易哈希是怎么计算的呢?
/ f8 l4 Z& b4 F( ~
' ~8 F' x4 b1 ]( G  交易结构各字段序列化为字节数组. t* s% C8 Y2 X4 @& t/ o

1 E8 W1 _3 `" Q. f9 @9 X" {  把字节数组拼接为支付串
- y) {# Q1 l; |- p- P  `* Z4 X8 k
% c1 ]1 u  S2 ^  对支付串计算两次SHA256 得到交易hash) V$ f7 Q, [; a! S% t# ^8 \

/ a3 [/ S! g5 [! E( T7 i! u  Y9 }- ~  了解详情可进一步参考如何计算交易Hash?及如何创建Hash?  q7 N2 R6 b1 O

& K# P3 _6 U! x% c' F6 A  现在是不是对完整的交易到区块有了更清晰的认识。8 y" M/ o+ e! D7 J7 z
+ M: g6 z: k9 n+ `2 M
  智能合约雏形 - 应用场景说明
$ k/ r" b( y$ C5 w
; w1 j& `5 r2 u4 [5 I+ x  由于交易是通过脚本来实现,脚本语言可以表达出无数的条件变种。
5 m: ^1 V, o& l: v: Y+ y& p* Z
3 @/ d& r6 N: Z0 o" C4 O: Q  比特币的脚本目前常用的主要分为两种,一种是常见的P2PKH(支付给公钥哈希),另一种是P2SH(Pay-to-Script-Hash支付脚本哈希)。$ w  ]2 J# e) y0 C% _/ \" D

$ Q/ i" b1 Z3 d5 b! ~( G1 }  P2SH支付中,锁定脚本被密码学哈希所取代,当一笔交易试图支付UTXO时,要解锁支付脚本,它必须含有与哈希相匹配的脚本。
. p, Z, H; ~) k
2 Q3 z/ `0 {, }2 }; L3 s8 Z( X& ~# t  这里不展开技术细节,下面说明一些应用场景,以便大家有更直观的认识。  A; M  K8 |* F; [+ ^
, ?: q: f& d* P6 i. y2 W' S9 M
  多重签名应用
! ], z* a; f# y# v- U2 }: F7 D
% N- l9 p* z8 S& r2 m# _4 A  合伙经营中,如只有一半以上的的股东同意签名就可以进行支付,可为公司治理提供管控便利,同时也能有效防范盗窃、挪用和遗失。/ M# ]0 t9 J0 \! ]) r* o& f

- G9 _2 Y1 A7 d/ L7 O$ Y  用于担保和争端调解,一个买家想和他不认识或不信任的某人交易,在一般情况交易正常进行时,买家不想任何第三方参与。那交易双方可以发起支付,但如果交易出现问题时,那第三方就可以根据裁定,使用自己的签名和裁定认可的一方共同签名来兑现这笔交易。4 z: `. L. ]( N
. u+ c$ l8 p- @
  保证合同- v0 Y1 w" E' d( [

& [- E/ _$ R/ ^& S/ C) M  保证合同是建造公众商品时的集资办法,公众商品是指一旦建成,任何人都可以免费享受到好处。标准的例子是灯塔,所有人都认同应该建造一个,但是对于个人航海者来说灯塔太贵了,灯塔同时也会方便其他航海者。$ b( X' W! \/ S( ]& m

$ Q, C; l# w8 q  一个解决方案是向所有人集资,只有当筹集的资金超过所需的建造成本时,每个人才真正付钱,如果集资款不足,则谁都不用付钱。0 r8 f8 n) D( u$ `( L

- Y- D& v- b7 q4 q  依靠预言
& H' p  ~5 b. K+ v4 x
$ ?; {+ @! r1 ~- r1 b0 A0 a7 [& {  假如老人想让他孙子继承遗产,继承时间是在他死后或者在孙子年满18岁时(也是一个带锁定时间交易),无论哪个条件先满足,他的孙子都可以得到遗产。
$ h) ~, k; N' P2 E* O; x
4 x) F& j6 G# w  因为比特币节点可依靠预言对死亡条件进行判断,预言是指具有密钥对的服务器,当用户自定义的表达式被证明是真的,它能按照要求对交易签名。
3 p0 D/ u# Z" H2 O3 E6 B" \2 K& l7 b" z
  相信随着区块链的普及,会对未来的交易模式和商业结构带来巨大的影响。不过由于比特币的脚本语言不是图灵完备的,交易模式依旧有限,以太坊就是为解决这一问题而出现,后面我们会有大量介绍以太坊的文章。
5 q) N8 D6 [8 N8 ~1 A! n" Z6 V9 K% s$ `4 Z7 X# J  ~2 ?
  参考文献 & 补充阅读1 l: s# \+ V5 P+ P* ?

: [% ^2 k" t' N) w5 q  精通比特币
3 S; X- |6 \) O- M4 ~- b3 h. k7 y* M3 t7 ~
  廖雪峰的深入理解比特币交易的脚本
9 H4 ^" d7 A( o9 k) @2 ~8 ]' K6 ^
2 s9 q" h) w- R( J8 l  比特币合同
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    12