Home 比特币-脚本相关
Post
Cancel

比特币-脚本相关

这次来学习比特币脚本相关的概念。

本人知识有限,如有错误和疏漏,请务必指正,多谢。

前言

在介绍脚本之前,先简单说下自己对比特币所有权的理解。

经常所说的比特币钱包,容易引起一种误解,觉得比特币就像是现实的硬币一样,我们从一堆硬币里,抓一把硬币放到我们自己的钱包里,这样硬币就从那堆硬币中分离开了,他们有了新的位置(在我们的钱包里),硬币本身是不记名的,在我钱包里的硬币就是我的。

但是其实比特币不是这样的。

比特币其实更像是房产,比如开发商开发了一片住宅,我从开发商手中买了其中的几套房子,我将所有房子都换了锁,房子属于我,我可以使用房子,但是房子的位置没有变,还是在原来的地方。我也可以将房子转卖给其他人,他们换了锁,房子属于了他们,我的钥匙再也打不开房门,但是房子还是在那个地方。或者我也可以将房子分成隔间来卖,每个隔间都有自己的门锁,卖出去的隔间就换成买家自己的锁,他们就拥有这个隔间。

开发商就是矿工,他们的劳动创造了住宅,也就是比特币。我从开发商那买到了房子并换了锁,就是比特币交易到了我的名下。我拆分房子成隔间再卖给其他人,就是相当于比特币的交易和找零,买家获得了我的房子的一部分。

但是在这些过程中,房子始终在原来的位置上,也就是在区块链上,只是所有权在不断变更而已,这不像是现实的硬币的概念,比特币并没有被拿走。

既然比特币没有被拿走放到固定的钱包里,大家的比特币都在一个地方,那么比特币就得记名,要不就无法分辨比特币到底是谁的。。

这个记名机制,其实就是后面要说的脚本实现的,未花费的比特币就是 UTXO, UTXO 都包含一段脚本,这个脚本明确了币的所有权,这些信息都记录在了区块链上,无法篡改。

脚本

1. 介绍

先截取一段《精通比特币》中关于比特币脚本的介绍

1
2
3
4
5
6
7
比特币交易脚本语言,也称为脚本,是一种基于逆波兰表示法的基于堆栈的执行语言。如果这让您听起来似乎在胡言乱语,很有可能是您没学习过1960年的编程语言的缘故。脚本是一种非常简单的语言,这种语言被设计为能在有限的硬件上执行,这些硬件类似简单的嵌入式设备,如手持计算器。它仅需最少的处理即可,而且不能做许多现代编程语言可以做的事情。当涉及可编程的钱时,这是它的一个基于深思熟虑的安全特性。

比特币脚本语言被称为基于栈语言,因为它使用的数据结构被称为栈。栈是一个非常简单的数据结构,它可以被理解成为一堆卡片。栈允许两类操作:入栈和出栈。入栈是在栈顶部增加一个项目,出栈则是从栈顶部移除一个项目。

脚本语言通过从左至右地处理每个项目的方式执行脚本。数字(常数)被推送至堆栈,操作符向堆栈推送(或移除)一个或多个参数,对它们进行处理,甚至可能会向堆栈推送一个结果。例如,OP_ADD将从堆栈移除两个项目,将二者相加,然后再将二者相加之和推送到堆栈。

条件操作符评估一项条件,产生一个真或假的结果。例如,OP_EQUAL从堆栈移除两个项目,假如二者相等则推送真(表示为1),假如二者不等则推送为假(表示为0)。比特币交易脚本常含条件操作符,当一笔交易有效时,就会产生真的结果。

简单来说,脚本就是一种编程语言,来实现一些逻辑。

比特币的脚本是图灵非完备的,由于本身的刻意限制,只能实现一些基础功能,但是更安全。

1
比特币脚本语言包含许多操作,但都故意限定为一种重要的方式——没有循环或者复杂流控制功能以外的其他条件的流控制。这样就保证了脚本语言的图灵非完备性,这意味着脚本的复杂性有限,交易可执行的次数也可预见。脚本并不是一种通用语言,施加的这些限制确保该语言不被用于创造无限循环或其它类型的逻辑炸弹,这样的炸弹可以植入在一笔交易中,通过引起拒绝服务的方式攻击比特币网络。受限制的语言能防止交易激活机制被人当作薄弱环节而加以利用。

2. 使用

前面说了脚本是为了证明币的所有权,那么现在就来看看如何证明。

举个转账的例子,比如我给你转账,我知道你的地址,那么我就将比特币的所有权转给你的地址,注意,这里是地址,因为我只知道你的地址。但是其他人也知道你的地址啊,如果别人要用这笔钱怎么办?就得验证这个地址是你所有才行。这里就用到了脚本。

首先在转账给你的时候,在这些比特币上我加上了锁,这个锁只能由地址的所有者才能打开,这个锁就是锁定脚本

在你使用这个地址上的比特币的时候,你需要提供你是地址所有者的证明,这个证明包含你的公钥和一段你的私钥的签名数据,这个证明就是解锁脚本

注意啊,只有在你需要使用地址上的比特币的时候,才需要提供证明。

解锁脚本 + 锁定脚本,构成了一个完整的验证脚本,区块链上的矿工在打包数据的时候,验证交易的合法性的时候,就会执行这个验证脚本(执行过程可以看文尾的链接),如果验证脚本的返回真,那么交易就是合法的。

这种交易脚本类型是 P2PKH (Pay-to-Public-Key-Hash),需要先验证公钥的 hash(上图中的PubKHash,也就是比特币地址),比特币网络上的大多数交易都是这种交易。

3. 另一种交易脚本 P2SH

主要是用于多重签名的复杂脚本交易,将锁定脚本中的 PubKHash 替换为了 ScriptHash,主要是因为多重签名的时候,在锁定脚本中,会出现多个公钥 hash,会使锁定脚本很长,这有很多弊处。 更改为 P2SH 的优点:

  • 在交易输出中,复杂脚本由简短电子指纹取代,使得交易代码变短。
  • 脚本能被编译为地址,支付指令的发出者和支付者的比特币钱包不需要复杂工序就可以执行P2SH。
  • P2SH将构建脚本的重担转移至接收方,而非发送方。
  • P2SH将长脚本数据存储的负担从输出方(存储于UTXO集,影响内存)转移至输入方(仅存储于区块链)。
  • P2SH将长脚本数据存储的重担从当前(支付时)转移至未来(花费时)。
  • P2SH将长脚本的交易费成本从发送方转移至接收方,接收方在使用该笔资金时必须含有赎回脚本。

参考

精通比特币2

This post is licensed under CC BY 4.0 by the author.
Contents