脚本的工作原理
脚本是一种类Forth、基于栈操作、逆波兰式、图灵不完整语言。
先看看基于堆栈操作、逆波兰式系统什么套路。
加法操作
逆波兰式中3+4长成34+的样子。下面执行加法操作。

第一步:把3推进堆栈
第二步:把4推进堆栈
第三步:添加完成,先弹出4,然后是3。
第四步:3、4相加,结果是7,推上堆栈。
用脚本表示,过程长这样:
OP_3 OP_4 OP_ADD
只是外观发生变化,其余操作跟上图一样。“OP_”前缀是脚本语言特点。
比特币脚本加法、检查操作
假设想做2 + 3 = 5。
逆波兰语式中,长成23 + 5 =。
脚本表示法中,长这样:
OP_2 OP_3 OP_ADD OP_5 OP_EQUAL


若在EQUAL中使用后缀VERIFY会怎样? 意思是,OP_EQUAL变成 OP_EQUALVERIFY。
添加后缀VERIFY后,TRUE或FALSE就不推到堆栈上了。 若TRUE,脚本继续执行;若FALSE,停止执行。
操作码后添加“VERIFY”时就会发生这种情况。
最后再举个例子:
脚本中的简单复制
举这个例子是为了介绍一个非常重要的操作码,DUP,又称复制。
假设想推个数字进堆栈然后复制,看看弹出的两个数字是否相同。
需要使用此脚本:
OP_5 OP_DUP OP_EQUALVERIFY

希望你看懂了比特币脚本怎么处理计算的。 接下来,看看交易的执行。
锁定&解锁游戏
比特币交易可以理解成不停的上锁、开锁。 使用scriptPubKey锁定UTXOs的同时交易输入中包含scriptSig。 或者说用scriptPubKey上锁是为了让scriptSig能解锁。
能说的更乱一点么?
说,Alice给Bob发比特币的想法一直没停。
Bob的地址所有人可见,那么Alice直接把BTC发到这个地址上,但是有个条件:只有Bob本人才能提出地址中的BTC。
下面后退一步,回顾些基础概念。
比特币中所有人有俩钥匙:
私钥
公钥
从私钥导出公钥。
想收钱,至少有个地址吧。公钥先过一道SHA-256,再过一道RIPEMD-160哈希算法,就是地址了。
注:两道加密算法后的输出是个160位的哈希值。
行了,Alice可以把BTC发到Bob的公共地址了,然后附个条件,Bob证明自己是自己了才能从地址里提取BTC。
Bob用自己的数字签名来解锁BTC,这个签名是从Bob私钥导出的。
或者干脆这么理解Alice&Bob之间的BTC交易:
说Alice给Bob寄了个密码箱,箱子里边有钱,只有Bob的签名才能开锁。
好了,回到脚本。
Alice给Bob发的BTC自带scriptPubKey,scriptPubKey中有Bob的地址。
Bob用自己的scriptSig签名解锁BTC, scriptSig包括Bob签名和公钥。
这套动作的代码长这样:
scriptPubKey = OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG
scriptSig =
为解锁BTC,Bob进行一波scriptSig和scriptPubKey的串联操作,大概其长这样:

Image Credit: CryptoCompare
下面看看脚本如何让Bob能访问自己的这笔资金,脚本现在长这样:
OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG.
解锁/验证过程的脚本实现
代码现在看起来这样:




OP_CHECKSIG弹出和,检查公钥和签名是否有效。
整个过程完成后,Bob就可以解锁交易拿BTC了。
以上,是比特币交易全过程。
希望你没有中途暴走。
这也是比特币交易最常见的类型:P2PKH,即付款给公钥哈希。
有没有觉得CHECKSIG运算符有点神奇?什么情况?
下面有请比特币身后的密码学。
未完待续
网友评论