Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
  大家都有转过账,每笔交易是这样的:张三账上减¥200,李四账上加¥200。
( |& t; d5 \# w2 _. e$ Z2 B/ N* f7 j; `$ F! d& X7 A
  在比特币区块链中,交易不是这么简单,交易实际是通过脚本来完成,以承载更多的功能个,这也是为什么比特币被称为是一种“可编程的货币”。
% [4 Q+ O; X; m9 F+ {
& [% Q/ t" c+ q4 E' l6 v" a  本文就来分析一下交易是如何实现可编程的。
! Z8 Q* g+ K, m( p, z6 H
2 Z0 `/ P* p. v, t1 P  未花费的交易输出(UTXO)
4 y$ @" ]) l1 B0 t' Q- l
/ o. S. [0 q  ^) G2 T" }  先引入一个概念:未花费的交易输出——UTXO(Unspent Transaction Output)4 |& ~* k! i8 b' l
8 j. I4 O, S, g
  其实比特币的交易都是基于UTXO上的,即交易的输入是之前交易未花费的输出,这笔交易的输出可以被当做下一笔新交易的输入。
+ u" E4 O1 ^5 O3 L- a9 |# r, N2 G% h
  挖矿奖励属于一个特殊的交易(称为coinbase交易),可以没有输入。% L- U- F- ~" n3 M

* m% c* y8 _9 t8 j! V# [- O5 E  UTXO是交易的基本单元,不能再分割。) {$ u8 [* [6 p# E8 t+ F$ V! I

. K: O* |  [! |* M- L  在比特币没有余额概念,只有分散到区块链里的UTXO1 E2 ^: _4 Q7 U' y0 o' P2 u' Z% s2 {
+ g$ E* K7 h% H4 S) }7 i' n
  随着钱从一个地址被移动到另一个地址的同时形成了一条所有权链,像这样:
, `- y; k1 }* o5 ^. l4 _/ _, e
# C* v+ v) y4 Q; Q6 G5 t  比特币脚本* u& @$ u2 j7 d5 ]- b
4 F$ _  V- [+ K+ n: j( u
  比特币交易是首先要提供一个用于解锁UTXO(用私钥去匹配锁定脚本)的脚本(常称为解锁脚本:Signature script),这也叫交易输入,( \" X8 m3 T$ b" {  ~* a# n
" b3 E2 g8 Q2 P: ^; ^! \2 K2 B
  交易的输出则是指向一个脚本(称为锁定脚本:PubKey script),这个脚本表达了:谁的签名(签名是常见形式,并不一定必须是签名)能匹配这个输出地址,钱就支付给谁。+ R+ U7 a, k# R9 ~, x$ O' M+ A

" O  ^; U. W/ C. N7 P  每一个比特币节点会通过同时执行这解锁和锁定脚本(不是当前的锁定脚本,是指上一个交易的锁定脚本)来验证一笔交易,脚本组合结果为真,则为有效交易。0 x& \& ^, R; g! _

0 l: Y/ Y* o8 V  当解锁版脚本与锁定版脚本的设定条件相匹配时,执行组合有效脚本时才会显示结果为真" e+ D% W$ e7 C# t5 c. i1 X3 k
  Y2 P( v( u! S3 p+ o7 y+ `
  如最为常见类型的比特币交易脚本(支付到公钥哈希:P2PKH(Pay-to-Public-Key-Hash))组合是这样:
. k% P9 v8 |& O! n/ m+ }$ E( e$ ~$ B8 A
  常见交易脚本验证过程: Z6 f8 Y# c4 p2 g* X: l+ x! a
  q# I: N4 _: W. y5 T' M2 F
  比特币交易脚本语言是一种基于逆波兰表示法的基于栈的执行语言(不知道逆波兰和栈的同学去翻大学数据结构课本,你也可跳过这个部分)。/ I' B8 ^! J9 X  B; Q4 n

  g9 Z+ v6 v, w8 ]+ u: J5 P  比特币脚本语言包含基本算数计算、基本逻辑(比如if…then)、报错以及返回结果和一些加密指令,不支持循环。想了解更多语言细节可参考:比特币脚本
( T$ l: G. a, P5 t3 z7 w  t
- j4 P( D; ^; G6 v* R8 z- Z  脚本语言通过从左至右地处理每个项目的方式执行脚本。- D# H. D+ m' i+ ~! Z+ X: }
& z* l- D# ]- Y
  下面用两个图说明下常见类型的比特币交易脚本验证执行过程:( n9 O1 j! d0 t) G

. h, \) j* E8 J3 z7 C) A, [  上图为解锁脚本运行过程(主要是入栈)
/ i* C: n6 \/ B! k, P2 [* ]' j
/ r) W! i+ [4 M% n; g/ R  上图为锁定脚本运行过程(主要是出栈),最后的结果为真,说明交易有效。
/ G+ Q6 ^: W! \, n. N! Q' G( z
: w  u2 B6 t6 J  `9 X$ Q  交易分析
- T5 t2 P* m* A7 k5 Z# J
6 o9 k/ o# z" O& \- ]& O  [  实际上比特币的交易被设计为可以纳入多个输入和输出。
/ X2 V+ m& a; w8 n/ ]# ^! [1 k! ^& b
  交易结构1 u- m7 [8 ?6 v

' }8 J1 _, k2 p, b1 i5 S  我们来看看完整的交易结构,4 q/ r7 B( S3 W" Z" }
2 ?! @; B5 F1 Z2 ~' w) D
  交易的锁定时间定义了能被加到区块链里的最早的交易时间。在大多数交易里,它被设置成0,用来表示立即执行。
& f5 V$ Y6 a5 I: G# \6 W
7 D; W- s9 B8 N  如果锁定时间不是0并且小于5亿,就被视为区块高度,意指在这个指定的区块高度之前,该交易不会被包含在区块链里。
: R! |7 e  @* g0 [- y0 L
8 Y) X" n* r) a9 b# e; X4 a) c2 Z7 d2 X  如果锁定时间大于5亿,则它被当作是一个Unix纪元时间戳(从1970年1月1日以来的秒数),并且在这个指定时间之前,该交易不会被包含在区块链里。
9 \/ f! r' F) m" |9 o/ B
" B3 N4 H; O0 S  交易的数据结构没有交易费的字段,交易费通过所有输入的总和,以及所有输出的总和之间的差来表示,即:
9 S8 T. {9 f8 |( C! j' z
9 o) A" w' ]' R# W9 _, Q  交易费 = 求和(所有输入) - 求和(所有输出)# {/ d* z. I3 s6 Y
6 b0 l( i7 g! ?8 z& S' x2 l* L
  交易输入结构
6 ~2 }: R5 W9 K2 U' G8 b' G; j; s' S
  刚刚我们提过输入需要提供一个解锁脚本,现在来看看一个交易的输入结构:
: U. Q5 y  R3 V& j) V1 u9 i5 A" o- _* ^  ?8 T3 F' o% A
  我们结合整个交易的结构里看输入结构就是这样子:
- J* g8 x6 M" H, e! W! L* P' r2 v( q+ H* A/ I
  交易输出结构
3 [# o3 n1 j+ C7 n1 i, m
% g. }! D; ]9 `3 v) ^6 h1 ^' G  m: O  刚刚我们提过输出是指向一个解锁脚本,具体交易的输出结构为:9 \0 _# l5 B6 ~+ D* e
8 v- G; ^4 L: m3 a0 u" K# H! r7 r
  我们结合整个交易的结构里看输出结构就是这样子:. t5 c% Y& i2 y8 ~/ x
) @5 H+ E6 T: E# w& {; `/ R1 y
  交易哈希计算) B# U- r' q0 s# s0 Q

% ?6 P: g( l3 H+ ?1 l; d  在比特币区块结构Merkle 树及简单支付验证分析 讲到区块结构,区块结构包含多个交易的哈希。
$ b- F* y; R( I  I! D0 m  |: O  w9 Y/ D, c2 f$ P0 F4 t# s+ s
  那么交易哈希是怎么计算的呢?
  k) ]* H+ O( N8 W4 t# b8 ]+ f
0 Y; K* V. c+ W; b, W8 y3 n& Z: s  交易结构各字段序列化为字节数组
/ x5 r9 U1 d: _# M3 B' [3 Z: U
6 c* R9 g% [% ?+ n: O  把字节数组拼接为支付串" i) }! w8 T& E  o
8 O. }! ]3 C2 d& P% `
  对支付串计算两次SHA256 得到交易hash) N' m  m& \* T5 b8 l

4 z3 `- d6 s# w4 X8 v, G2 W  了解详情可进一步参考如何计算交易Hash?及如何创建Hash?4 E! A% ~7 q+ c7 v

) `1 _6 m0 R. A% J: w  c7 p  现在是不是对完整的交易到区块有了更清晰的认识。
; h6 a+ J8 b) {. f" |$ O4 o4 u3 K/ Z; U6 S- _/ X3 [: b
  智能合约雏形 - 应用场景说明
( U/ c) X* Y  \) p9 Y$ W
' Y- \; i/ ~, d' K  由于交易是通过脚本来实现,脚本语言可以表达出无数的条件变种。8 E7 \) E2 T3 \; o# t! L& O' f
* h6 R' ?- N/ `- e, k! L
  比特币的脚本目前常用的主要分为两种,一种是常见的P2PKH(支付给公钥哈希),另一种是P2SH(Pay-to-Script-Hash支付脚本哈希)。
6 L( z7 p, V" R; I0 v+ T* Y/ _* A7 O* \$ f8 H' y
  P2SH支付中,锁定脚本被密码学哈希所取代,当一笔交易试图支付UTXO时,要解锁支付脚本,它必须含有与哈希相匹配的脚本。
3 |  e5 m8 ^) Y* ~
' M1 ~1 a4 a! H$ q6 ?- L, g" a% M  这里不展开技术细节,下面说明一些应用场景,以便大家有更直观的认识。
& Y2 |$ v( `( p2 e* o* V& h
3 S% Y( s4 q' N8 U  多重签名应用# f" C, L/ [( J8 p
$ f$ c$ y( T. e" X
  合伙经营中,如只有一半以上的的股东同意签名就可以进行支付,可为公司治理提供管控便利,同时也能有效防范盗窃、挪用和遗失。
4 Y! u/ c# R7 w) y3 y$ Q$ \. ]$ h( N3 M& w/ X
  用于担保和争端调解,一个买家想和他不认识或不信任的某人交易,在一般情况交易正常进行时,买家不想任何第三方参与。那交易双方可以发起支付,但如果交易出现问题时,那第三方就可以根据裁定,使用自己的签名和裁定认可的一方共同签名来兑现这笔交易。
9 G$ V9 D7 H& D! r1 T
0 B0 N4 V6 X- E  P  保证合同
7 |) d  m5 s: O9 q/ b1 b  p0 U  ^4 V
  保证合同是建造公众商品时的集资办法,公众商品是指一旦建成,任何人都可以免费享受到好处。标准的例子是灯塔,所有人都认同应该建造一个,但是对于个人航海者来说灯塔太贵了,灯塔同时也会方便其他航海者。
9 I# x7 B* p" X( W& W# m7 g' I4 }1 \: v- k; y' E- {# J% m  e' X
  一个解决方案是向所有人集资,只有当筹集的资金超过所需的建造成本时,每个人才真正付钱,如果集资款不足,则谁都不用付钱。
. f/ P  J$ ?  a' U6 H& @6 c% L8 x  @$ L
  依靠预言
- Y! D8 u  N! \2 ]* D6 ?
, j" e3 f& G1 ?$ j' R! I, s  假如老人想让他孙子继承遗产,继承时间是在他死后或者在孙子年满18岁时(也是一个带锁定时间交易),无论哪个条件先满足,他的孙子都可以得到遗产。
) }4 r( l  _2 }3 j0 v
3 x$ G( N8 o$ K- J, n# F  因为比特币节点可依靠预言对死亡条件进行判断,预言是指具有密钥对的服务器,当用户自定义的表达式被证明是真的,它能按照要求对交易签名。
; r) t8 u: o4 H3 g- I5 ~1 h  Q" K0 b
  相信随着区块链的普及,会对未来的交易模式和商业结构带来巨大的影响。不过由于比特币的脚本语言不是图灵完备的,交易模式依旧有限,以太坊就是为解决这一问题而出现,后面我们会有大量介绍以太坊的文章。
6 ^8 f7 o7 B9 I, n" v. Y
4 ?% d$ j- I/ Q2 o0 a) K2 S( _1 {  参考文献 & 补充阅读
" E/ @, t8 ]% H5 y( }  h
3 y3 h7 F' y5 y) k9 C0 P2 x  精通比特币
: y) I, u, ^9 R9 r) c- n1 y# Y7 u* ]6 o4 R" x" y- k
  廖雪峰的深入理解比特币交易的脚本
. D2 P% ^) @8 H+ C. r4 ?/ ?) ^% n
( S2 _/ I0 t. O- {2 _  比特币合同
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    12