主页 > imtoken钱包官网 > 比特币脚本原理

比特币脚本原理

imtoken钱包官网 2023-01-17 08:08:28

一个简单的程序可以在比特币系统上运行,编写程序的语言称为比特币脚本。理解比特币脚本是理解比特币交易如何被锁定和解锁的基础。本节将介绍比特币脚本的基本原理以及最常用的加锁和解锁脚本的逻辑。

基本原则

比特币脚本是一种功能少的编程语言,在满足比特币系统正常运行需求的同时,最大限度地提高了安全性。

比特币脚本不完整。所谓图灵不完备,是指缺少当代语言的一些必要特征,比如循环。但是,有限的功能也将系统的攻击区域最小化,例如,防止有人使用无线环路在系统上植入炸弹。

比特币的原理及其应用

比特币脚本是一种基于堆栈的语言。将堆栈想象成几本书堆叠在一起。 push操作相当于添加一本书,pop操作相当于拉出一本书。每次执行top操作,每个操作对应一个opcode,简称opcode。

简而言之,比特币脚本是一种图灵不完备的基于堆栈的语言。

你好世界

让我们运行一个最简单的比特币脚本,这样我们才能真正理解基于堆栈的执行过程。

比特币的原理及其应用

比如我们要判断2+3是否等于6,写成比特币脚本,

2 3 OP_ADD 6 OP_EQUAL

这里的OP_ADD是一个操作码,可以将两个内容都出栈,然后将两者之和压入栈中。 OP_EQUAL 还将弹出堆栈中的两个项目。如果两者相等,则结果为 true ,否则为 false ,结果也将被压入堆栈。程序将从左到右依次执行。比如上面的代码执行时,2和3会依次压入栈中,3会在栈顶。接下来,OP_ADD 将从堆栈中弹出 2 和 3比特币的原理及其应用,然后将 5 压入堆栈。现在堆栈中只有一个 5。代码继续执行,6会被压入栈中,这样栈中就有两个内容,所以OP_EQUAL可以同时弹出6和5,然后将比较结果false push入栈。

这样比特币的原理及其应用,当代码执行时,栈中只剩下一项,false。

比特币的原理及其应用

锁定和解锁脚本

比特币交易也是通过执行比特币脚本来完成的。交易将对应两个脚本,一个锁定脚本 scriptPubKey 和一个解锁脚本 scriptSig 。

scriptPubKey 是用于锁定的脚本。要查看特定的交易数据,

{
  "version": 1,
  "locktime": 0,
  "vin": [
    {
      "txid": "7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18",
      "vout": 0,
      "scriptSig" : "3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813[ALL] 0484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf",
      "sequence": 4294967295
    }
  ],
  "vout": [
    {
      "value": 0.01500000,
      "scriptPubKey": "OP_DUP OP_HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 OP_EQUALVERIFY OP_CHECKSIG"
    },
    {
      "value": 0.08450000,
      "scriptPubKey": "OP_DUP OP_HASH160 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 OP_EQUALVERIFY OP_CHECKSIG",
    }
  ]
}

比特币的原理及其应用

可以看到scriptPubKey是交易输出vout的一项。该脚本的功能是锁定比特币。接收方必须满足锁定脚本中的条件才能花费这个输出,也就是花费这次转给他的比特币。对应的scriptSig为解锁脚本,其作用是满足scriptPubKey中提出的条件,才能花费输出。

scriptSig 包含两件事:一是数字签名,二是公钥。只有正确地提供了这两者,才能满足锁定脚本中的条件。锁脚本scriptPubKey中包含的长随机数是公钥的哈希值,俗称比特币地址。 OP_DUP 是一个操作码,它复制堆栈上的顶部项目并将结果推回堆栈。 OP_HASH160 是另一个操作码,它从堆栈中取出顶部项目并对其进行哈希处理,如下所示:

A = RIPEMD160(SHA-256(X))

A 是哈希运算的结果,X 是栈顶元素。如果 X 是公钥,那么 A 就是比特币地址。

比特币的原理及其应用

OP_EQUALVERIFY 会将加锁脚本中公钥的哈希值与解锁脚本中公钥经过上述双重哈希运算后得到的结果进行比较。如果两者相同,那么代码会继续执行,也就是转到OP_CHECKSIG这一步。这一步的作用是检查解锁脚本中的数字签名是否与公钥匹配,将比较结果为真入栈。数字签名由公钥对应的私钥生成,可以体现资金的使用权。

总结

简而言之,Bitcoin Script 是一种简单的基于堆栈的脚本语言,主要用于服务于比特币交易的过程。其中,涉及到的最重要的两个脚本是加锁脚本scriptPubKey和解锁脚本scriptSig。

参考: