Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
  大家都有转过账,每笔交易是这样的:张三账上减¥200,李四账上加¥200。
0 U5 C, `% q. V) I% ?
9 z; u) I0 C: B3 [: }8 q$ v  在比特币区块链中,交易不是这么简单,交易实际是通过脚本来完成,以承载更多的功能个,这也是为什么比特币被称为是一种“可编程的货币”。$ W, H  e5 i: p1 r

- ]. }# x% }$ f  本文就来分析一下交易是如何实现可编程的。
" z; w" n' T$ C" S
7 ~; M- U: w/ P5 |0 Q  未花费的交易输出(UTXO)& {9 y- L9 C/ `+ i; M

7 {6 X: g* O+ @: m% x% B  先引入一个概念:未花费的交易输出——UTXO(Unspent Transaction Output)6 Z" r' {$ ~, ?' B4 M8 Q& s' q1 a! s$ E

) x  _+ b4 H  U: y  其实比特币的交易都是基于UTXO上的,即交易的输入是之前交易未花费的输出,这笔交易的输出可以被当做下一笔新交易的输入。
. }  |6 @0 S' B& k, t. p$ ~. ~/ ?2 U  U9 Y& y0 b
  挖矿奖励属于一个特殊的交易(称为coinbase交易),可以没有输入。
9 X* ?7 D- `" o, ]; \# f9 X* E4 ^- n( Y8 T2 f/ `+ f
  UTXO是交易的基本单元,不能再分割。
' f1 w' s# Q/ Y- B" i$ ^; _  L; n: c! G% |0 x8 E
  在比特币没有余额概念,只有分散到区块链里的UTXO
- a6 E. ]/ G" w
' p) {7 e2 O* O# D+ V$ y  随着钱从一个地址被移动到另一个地址的同时形成了一条所有权链,像这样:8 Y' {/ ^; Z9 [! a0 ^" k

. p+ ?2 X/ @' L1 h5 x) |  比特币脚本
) [/ ~% e8 `+ `! ~" ~0 w
/ Q# ~. q4 S$ S( A8 o9 g2 O' v  比特币交易是首先要提供一个用于解锁UTXO(用私钥去匹配锁定脚本)的脚本(常称为解锁脚本:Signature script),这也叫交易输入,
- u* P5 K( `5 e: u1 y/ \0 H; p" i' x" i
  交易的输出则是指向一个脚本(称为锁定脚本:PubKey script),这个脚本表达了:谁的签名(签名是常见形式,并不一定必须是签名)能匹配这个输出地址,钱就支付给谁。
, c$ E, `: S3 c8 q
; `" D" d, g& e* w6 R9 f  每一个比特币节点会通过同时执行这解锁和锁定脚本(不是当前的锁定脚本,是指上一个交易的锁定脚本)来验证一笔交易,脚本组合结果为真,则为有效交易。
* \2 h% e6 q9 e9 ~9 {) A
- u$ \8 h$ U, R  当解锁版脚本与锁定版脚本的设定条件相匹配时,执行组合有效脚本时才会显示结果为真
, u6 U; t. ~2 p" M  _2 C* J% e; O% n
  如最为常见类型的比特币交易脚本(支付到公钥哈希:P2PKH(Pay-to-Public-Key-Hash))组合是这样:
5 {  J! l# y7 @" r, ^2 l* T) m7 B
4 ?% [0 u8 ~( o/ g: j  常见交易脚本验证过程7 L' c  z+ ]2 g% C) E( u
8 y0 h; N- C7 H, H
  比特币交易脚本语言是一种基于逆波兰表示法的基于栈的执行语言(不知道逆波兰和栈的同学去翻大学数据结构课本,你也可跳过这个部分)。" @9 y/ j! _, j" b
/ L$ [( }0 J; Y3 p6 ]
  比特币脚本语言包含基本算数计算、基本逻辑(比如if…then)、报错以及返回结果和一些加密指令,不支持循环。想了解更多语言细节可参考:比特币脚本
4 ~5 ~& R. G! {3 s: @/ J- M9 y, w. |; Y( ]
  脚本语言通过从左至右地处理每个项目的方式执行脚本。
' W6 Y5 w# W0 I8 Z' t' |8 P: l" c7 H9 F) x% G
  下面用两个图说明下常见类型的比特币交易脚本验证执行过程:- \3 v, _4 R, r; x4 a

" p# b9 Q5 K& ]6 ~7 e! ~6 S  上图为解锁脚本运行过程(主要是入栈)+ R5 r1 c2 B, M) S2 e3 {: U! t
  g# t& y) _0 V/ Q$ o' R, `9 p6 k( C
  上图为锁定脚本运行过程(主要是出栈),最后的结果为真,说明交易有效。" n/ E+ o! x6 w/ H
- p6 ?% s* z! K1 O
  交易分析1 b  C9 m* o5 N9 E& u; k* ~

$ r& U) M3 l! ~& x% V, d( `  实际上比特币的交易被设计为可以纳入多个输入和输出。0 b1 K1 B! \1 B: I0 z! l
* ?) x4 j4 y2 J0 u$ m6 I
  交易结构% t  E4 L- k9 d) b

3 _' C+ I$ B' f+ R  我们来看看完整的交易结构,+ N4 i# N4 G# w, h3 H- ]
7 W. |+ H. \& a3 y! E" n# I
  交易的锁定时间定义了能被加到区块链里的最早的交易时间。在大多数交易里,它被设置成0,用来表示立即执行。
: n# D1 X) q( k) n. _+ w- e5 \+ |2 O% q, ]" _( M
  如果锁定时间不是0并且小于5亿,就被视为区块高度,意指在这个指定的区块高度之前,该交易不会被包含在区块链里。
: T0 }: [/ A( ~8 ]7 k& z" s% {3 P0 }
  如果锁定时间大于5亿,则它被当作是一个Unix纪元时间戳(从1970年1月1日以来的秒数),并且在这个指定时间之前,该交易不会被包含在区块链里。
1 O' L& l+ J6 a  J- l: [
  l+ k+ j# `3 R) G/ e  交易的数据结构没有交易费的字段,交易费通过所有输入的总和,以及所有输出的总和之间的差来表示,即:
: e8 A) Z2 P4 o! ]2 ~
$ o, d# |. z3 B& v  交易费 = 求和(所有输入) - 求和(所有输出)
5 ?, H- F7 f1 y, g( Y: V
0 t  O0 a9 u! \, |  交易输入结构
% x" e" n/ S! [; R4 Y" p0 J& F2 M3 k  ]6 g  c7 a
  刚刚我们提过输入需要提供一个解锁脚本,现在来看看一个交易的输入结构:1 G2 b8 I3 L6 Z. k. b- N* A

6 v" n. H6 Y# f! K0 V& ?9 Y  我们结合整个交易的结构里看输入结构就是这样子:
6 }. v- l0 {/ c4 M* W
! _; k  E9 {% h4 f: x" m  交易输出结构
0 M6 O9 B$ [7 w' s3 x+ J7 d5 O8 p& Y$ B0 l
  刚刚我们提过输出是指向一个解锁脚本,具体交易的输出结构为:
. m6 w( d* i) m
$ Y4 G# U- I' P' `/ O8 L- x* {! i  我们结合整个交易的结构里看输出结构就是这样子:2 M! Y; n0 L! G* Q: N8 F

, m( z7 d$ w! W0 _  交易哈希计算  ]7 d4 U$ A( n' w  D6 ?* V8 Z, A

2 V# ^$ r& o+ M5 P1 {2 I  在比特币区块结构Merkle 树及简单支付验证分析 讲到区块结构,区块结构包含多个交易的哈希。
# w3 {6 ?, p% b3 o  P3 }# d. j
& c- |! X+ Y4 [. @+ c6 W5 W  那么交易哈希是怎么计算的呢?
/ W4 |; t% M. P6 |  ~4 T4 f5 f1 N. |  Q4 S$ @& V- W' g! Y* M& f
  交易结构各字段序列化为字节数组
; D4 I( J+ `0 O! k0 a4 z1 y3 A% X; x4 z, |) S5 s% o
  把字节数组拼接为支付串
$ j4 q. W" U& O$ K% W$ E+ ~) E' t
, y) M4 a- i4 C& ~8 r  对支付串计算两次SHA256 得到交易hash
$ \7 F' H2 v4 [, ~! V" i2 b7 \5 p, X; c( T# d$ Z, m
  了解详情可进一步参考如何计算交易Hash?及如何创建Hash?6 y0 ^. p- k. k$ R0 R

' f: d+ }! z7 m4 P  现在是不是对完整的交易到区块有了更清晰的认识。
3 i3 ?/ T# W. V
: H" w, y8 \& ^1 r: S" Z4 g$ O: t  智能合约雏形 - 应用场景说明
* [; C9 Q/ Q& v# |; Z% n) _5 f. M! X2 U4 z. P
  由于交易是通过脚本来实现,脚本语言可以表达出无数的条件变种。9 Q7 h8 a1 I+ e0 z( O
7 a1 F3 T) v7 s8 U- p' S
  比特币的脚本目前常用的主要分为两种,一种是常见的P2PKH(支付给公钥哈希),另一种是P2SH(Pay-to-Script-Hash支付脚本哈希)。
5 N- l7 e' A( e+ ^/ }. _3 _; k0 C/ R4 l5 M/ O* v# _: {" Q" `- t
  P2SH支付中,锁定脚本被密码学哈希所取代,当一笔交易试图支付UTXO时,要解锁支付脚本,它必须含有与哈希相匹配的脚本。
  z9 k2 q3 ^9 |/ v
! c; U6 n  y' p, r, ~  这里不展开技术细节,下面说明一些应用场景,以便大家有更直观的认识。
) a3 F0 u6 ]$ D$ |7 \4 {; F8 X( O* l) L6 h  y* @8 o! z
  多重签名应用, H- B) A& ~$ }

6 V0 ~5 S" u7 F9 \  合伙经营中,如只有一半以上的的股东同意签名就可以进行支付,可为公司治理提供管控便利,同时也能有效防范盗窃、挪用和遗失。% ]# ]% f" `" Z. M1 |# q

2 v  l7 I' R( H$ i* m) i  用于担保和争端调解,一个买家想和他不认识或不信任的某人交易,在一般情况交易正常进行时,买家不想任何第三方参与。那交易双方可以发起支付,但如果交易出现问题时,那第三方就可以根据裁定,使用自己的签名和裁定认可的一方共同签名来兑现这笔交易。
0 k0 E5 a9 r; |- w& j( s4 }% I9 r. k- e8 q9 i5 b
  保证合同5 P! m8 [8 }$ g; i
  k4 C" Y+ z2 M  [) }
  保证合同是建造公众商品时的集资办法,公众商品是指一旦建成,任何人都可以免费享受到好处。标准的例子是灯塔,所有人都认同应该建造一个,但是对于个人航海者来说灯塔太贵了,灯塔同时也会方便其他航海者。4 d! Q6 N! Y8 E6 c- o+ ]4 J
6 F' F- ]+ X* ^: H
  一个解决方案是向所有人集资,只有当筹集的资金超过所需的建造成本时,每个人才真正付钱,如果集资款不足,则谁都不用付钱。, w- j8 C( G) d$ [$ S- i( U
( R7 K" x2 v& m' ^
  依靠预言
" b+ I& Z9 `* l- _0 O( `
; s" {) x' j" Z" R- y! G* ?  假如老人想让他孙子继承遗产,继承时间是在他死后或者在孙子年满18岁时(也是一个带锁定时间交易),无论哪个条件先满足,他的孙子都可以得到遗产。
+ `; a" ^; m7 A9 C* t) p( O* O  Q; x% w/ G. j
  因为比特币节点可依靠预言对死亡条件进行判断,预言是指具有密钥对的服务器,当用户自定义的表达式被证明是真的,它能按照要求对交易签名。
/ q  l+ V& C4 }6 x
' u: e& r3 p9 P) _  相信随着区块链的普及,会对未来的交易模式和商业结构带来巨大的影响。不过由于比特币的脚本语言不是图灵完备的,交易模式依旧有限,以太坊就是为解决这一问题而出现,后面我们会有大量介绍以太坊的文章。  U: l. s! x! K6 f

1 H8 o' r; j; {  参考文献 & 补充阅读
, ^$ ^# H( Q$ z. X$ ?; B
$ E- N  `' h3 v$ |3 \; C5 |% F! q1 B  精通比特币
+ ^9 E  R/ u$ o! V
# S. P. g" C  l* U9 R+ O9 H  廖雪峰的深入理解比特币交易的脚本4 i7 C, X) P- e
9 S. Z, ~# H4 q) l- L
  比特币合同
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    12