Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

理解比特币脚本

一无所有977
156 0 0
其实我们可以这样看待比特币的交易:『交易的发起者悬赏若干比特币,在网络上贴出了一到数学题,谁解出了这道数学题,悬赏就归谁了』。 顺着这个思路,Alice对Bob的转账可以理解为『Alice把一道只有Bob才能解开的数学题发到网络上,Bob解出题并拿走了悬赏』。那么,每个交易数据中都会出现的『脚本』就是题和解,『脚本语言』就是用来描述题和解的工具。
% ?5 j/ {2 L" z: f0 ^『输入脚本』和『输出脚本』3 G1 ~% r4 Y$ N3 N
在这里我们先讨论单输入单输出的比特币交易,因为这样描述起来更方便且不影响对『脚本』的理解。+ R. g- c5 ^  |+ x6 q) k9 U5 ]6 ~
9c50cee8d50e273100987bb12ec46208cb04a1d5b68c9bea84fd4a04854b5eb1 这是一个单输入单输出交易,看下我们要关注的数据:! \4 E+ }) K# k$ m
Hash:( u. H: G- b: N. i- D
9c50cee8d50e273100987bb12ec46208cb04a1d5b68c9bea84fd4a04854b5eb1& G$ z: c* G+ ^5 J9 h
输入交易:! _( U6 {6 C! E/ u  z; H6 N" c' f
  前导输入的Hash:- ~  }. y2 N0 W, P
  437b95ae15f87c7a8ab4f51db5d3c877b972ef92f26fbc6d3c4663d1bc750149  b0 H0 i% x$ \! {/ w
  7 t3 X  M' Y+ r2 J1 H
  输入脚本 scriptSig:
; U* |" }9 B) n& d# f( O  3045022100efe12e2584bbd346bccfe67fd50a54191e4f45f945e3853658284358d9c062ad02200121e00b6297c0874650d00b786971f5b4601e32b3f81afa9f9f8108e93c7522014 b9 h5 u& S4 h# R1 G( w# k9 E" m7 z
  038b29d4fbbd12619d45c84c83cb4330337ab1b1a3737250f29cec679d7551148a
+ F7 Y6 u& A- A8 c7 h输出交易:
& e9 n8 |. s" S; c% J2 d  转账值:
9 c3 c2 q7 l" z: T  0.05010000 btc
! [6 I8 l8 B3 R9 P, z  输出脚本 scriptPubKey:( `/ M6 t$ _* b! ~2 O( ]; v, M& F; q
  OP_DUP OP_HASH160 be10f0a78f5ac63e8746f7f2e62a5663eed05788 OP_EQUALVERIFY OP_CHECKSIG4 q2 @- V5 N8 W5 n% T' _4 R9 w# g
假设Alice是转账发送者,Bob是接受者。那么『输入交易』表明了Alice要动用的比特币的来源,『输出交易』表明了Alice要转账的数额和转账对象——Bob。那么,你可能要问,数据中的『输入脚本』和『输出脚本』是不是就是题和解?对了一半!
! r. Q) `' w/ Q+ h9 ~/ j6 n在Bitcoin Wiki中提到:
7 z" ^) F$ u& B* p7 m- @* k% z* h原先发送币的一方,控制脚本运行,以便比特币在下一个交易中使用。想花掉币的另一方必须把以前记录的运行为真的脚本,放到输入区。
3 V" Y0 i; `6 k0 _1 v  ^换句话说,在一个交易中,『输出脚本』是数学题,『输入脚本』是题解,但不是这道数学题的题解。我开始看Wiki的时候,在这里遇到了一些障碍,没法理解『输入脚本』和『输出脚本』的联系。但是在考虑交易间的关系后,就明白了。
" G4 E# {0 ?* E# p( _3 J假设有这么一系列交易:
: x: A; `; e6 t' H; j! r" v" ]8 Q
8 z! e" d5 r; T7 B& E. ]5 @6 v8 q; X1.上图的三个交易都是单输入单输出交易
: z3 K! K$ a; ]( w. K5 l2.每个『输入交易』『输出交易』中,都包含对应的『脚本』
5 u( J) o7 n/ ~% G+ i3.交易a,Alice转账给Bob;交易b,Bob转账给Carol;交易c,Carol转账给Dave
/ z" U: g1 F( l% x: t" s: \6 B  F  y+ n4.当前交易的『输入』都引用前一个交易的『输出』,如交易b的『输入』引用交易a的『输出』
( r) k7 ?$ I/ ?- o& @# S$ ?按照之前的说法,交易a中的『输出脚本』就是Alice为Bob出的数学题。那么,Bob想要引用交易a『输出交易』的比特币,就要解开这道数学题。题解是在交易b的『输入脚本』里给出的!Bob解开了这道题,获得了奖金,然后在交易b中为Carol出一道数学题,等待Carol来解…
# Q+ q7 x5 K8 @& z9 v. b' W. |) B8 B9 @所以说,下图中相同颜色的『输出』和『输入』才是一对题和解:3 s/ {' z- T1 R0 p0 q
8 U9 A) s( h: d& P7 p! R8 s
脚本语言3 u( R% s0 f! Z3 a: _5 f5 }. E! p
Bitcoin Wiki给出的对脚本的解释:$ a6 V5 @2 O3 ~, t
比特币在交易中使用脚本系统,与FORTH(一种编译语言)一样,脚本是简单的、基于堆栈的、并且从左向右处理,它特意设计成非图灵完整,没有LOOP语句。2 E0 s. c9 [" P0 x
要理解比特币脚本,先要了解『堆栈』,这是一个后进先出(Last In First Out )的容器,脚本系统对数据的操作都是通过它完成的。比特币脚本系统中有两个堆栈:主堆栈和副堆栈,一般来说主要使用主堆栈。举几个简单的例子,看下指令是如何对堆栈操作的(完整的指令集在Wiki里可以找到):2 l# p1 ^6 W' y7 \2 J  r# T$ C

' F& d( u: Q. C" y* R( n标准交易脚本
, F7 R2 F% A* v( |也就是P2PKH(Pay To Public Key Hash),我们常用的转账方式。Alice在转账给Bob的时候,『输出交易』中给出了Bob的『钱包地址』(等价于『公钥哈希』);当Bob想要转账给Carol的时候,他要证明自己拥有这个『钱包地址』对应的『私钥』,所以在『输入交易』中给出了自己的『公钥』以及使用『私钥』对交易的签名。看个实例:
" Q6 p. _, x1 _交易a: 9c50cee8d50e273100987bb12ec46208cb04a1d5b68c9bea84fd4a04854b5eb1交易b: 62fadb313b74854a818de4b4c0dc2e2049282b28ec88091a9497321203fb016e
5 C# H7 f7 M2 e" |. a. v5 d交易b中有一个『输入交易』引用了交易a的『输出交易』,它们的脚本是一对题与解:( ?% X6 v* d7 `

! v$ m' |3 x+ F题:交易a的『输出脚本』,若干个脚本指令和转账接收方的『公钥哈希』& ~0 M" e8 w6 `) e" e) y
OP_DUP OP_HASH160 be10f0a78f5ac63e8746f7f2e62a5663eed05788 OP_EQUALVERIFY OP_CHECKSIG
. g4 p% M- V/ e! A解:交易b的『输入脚本』,这么一长串只是两个元素,『签名』和『公钥』(sig & pubkey)
& @- x/ D$ E* E$ ~5 y: `3046022100ba1427639c9f67f2ca1088d0140318a98cb1e84f604dc90ae00ed7a5f9c61cab02210094233d018f2f014a5864c9e0795f13735780cafd51b950f503534a6af246aca301' g3 m5 |& S5 N8 B& _6 K' ?7 c7 T
03a63ab88e75116b313c6de384496328df2656156b8ac48c75505cd20a4890f5ab
6 a* p' y. ~% A5 ]3 _4 E9 }9 K下面来看下这两段脚本是如何执行,来完成『解题』过程的。9 ~) u0 j3 c0 m' t. S
! N1 G( _$ c& h; B9 y+ V

6 q" y0 K1 P, X这样一串指令执行下来,就可以验证这道数学题是否做对了,也就是说验明了想要花费『钱包地址』中比特币的人是否拥有对应的『私钥』。上面的执行过程是可以在脚本模拟器中执行的,能够看到每一步执行的状态,感兴趣的童鞋可以尝试一下。* n  V7 W8 D8 ]( Q
其实除了标准的P2PKH交易脚本,还有P2SH的Multi-Sig脚本以及真正的『解谜交易』脚本,我们可以在今后接着讨论。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

一无所有977 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2