酸饼博客
关注区块链技术应用与数字货币

区块链入门100问(17):如何理解比特币的脚本语言?

从《如何理解比特币交易的输入和输出的数据结构?》一节中可以知道,比特币交易的输入和输出都有脚本字段。其中交易输出的脚本是“锁定脚本”,交易输出的脚本是“解锁脚本”。

我们知道,每一笔交易输出都创造一笔“未花费输出”(UTXO)。UTXO是比特币交易的基本单位。

在交易输出中,通过锁定脚本将这笔输出产生的新UTXO锁定在目标地址上。这个地址的所有者,将来要花费这笔UTXO的时候,需要在新交易的交易输出里设置解锁脚本。打包、验证这笔交易的矿工,使用解锁脚本进行验证,并把解锁脚本的数据传给锁定脚本,进行指向,结果满足验证条件的时候,该交易被确定为合法交易。

锁定脚本和解锁脚本所使用的语言称为比特币的脚本语言。

比特币脚本语言有如下特点:
1. 图灵不完备,不能执行循环语句和条件跳转,但可以限制循环和递归,保证所写的程序是一定能停止。
2. 逆波兰表达式,从左到右执行。比如3+4写为:34+。
3. 基于栈的操作。栈是常见的一种数据结构,操作顺序是先进后出,或者后进先出。

比特币系统对脚本语言的操作类型进行了一些限制,这些限制编译为一个Standrand函数,该函数定义了的5种类型的标准交易。 这几种脚本类型分别是:P2PKH、P2PK、MS15、P2SH、OP_Return。

(1)P2PKH(Pay to Public Key Hash)
比特币网络的大多数交易都是P2PKH。该类交易都有一个锁定脚本,该锁定脚本通过公钥哈希来实现交易输出的锁定;在将来的交易种支付这笔未花费的交易输出的时候,通过输入公钥和公钥对应的私钥创建的签名来解锁。

假设 酸饼要向金刚转账一笔2BTC的资金,那么该笔交易的输出脚本为如下形式:
OP_DUP OP_HASH160 OP_EQUAL OP_CHECKSIG

其中的Pulbic Key Hash即是比特币地址。比特币地址通过公钥生成。

转账完成之后,资金转移到金刚的比特币地址上。将来金刚要使用这笔资金的时候,需要在交易输入的脚本里通过这样的解锁脚本来解锁:

将两个脚本结合起来,形成如下的组合脚本:
OP_DUP OP_HASH160
OP_EQUAL OP_CHECKSIG

脚本执行的过程是这样:
1. 将签名推入栈顶
2. 将公钥推入栈顶
3. DUP操作复制栈顶的元素(公钥),将结果推入栈顶
4. HASH160操作取出栈顶的公钥执行生成地址的过程,结果PubKH放入栈顶。
5. EQUAL操作取出栈顶的两个元素,分别是上一步的PubKH和解锁脚本种输入的Public Key Hash进行比较,如果不一致,校验不通过,程序执行结束;如果一致,将移除这两个元素,继续执行。
6. CHECKSIG核查解锁脚步种的签名和公钥的签名是否匹配。如果匹配,则在栈顶显示true结果,表示校验通过。
7.

P2PK、MS、P2SH、OP_Return这几个交易并不常见,在此不再赘述。OP_Return这种交易类型比较特殊,有一些比较有趣的使用场景,留待后面再进行介绍。

未经允许不得转载:酸饼 » 区块链入门100问(17):如何理解比特币的脚本语言?
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

留言联系关于酸饼