《区块链开发指南》一一1.4 脚本系统

简介:

本节书摘来自华章计算机《区块链开发指南》一书中的第1章,第1.4节,作者:申屠青春 主编 宋 波 张 鹏 汪晓明 季宙栋 左川民 编著更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.4 脚本系统

比特币在交易中使用脚本系统,与FORTH(一种编译语言)一样,脚本是简单的、基于堆栈的,并且是从左向右处理的,它特意设计成非图灵完整的形式,没有LOOP语句。
一个脚本本质上是众多指令的列表,这些指令记录在每个交易中,若交易的接收者想花掉发送给他的比特币,那么这些指令就是描述接收者是如何获得这些比特币的。一个典型的发送比特币到目标地址D的脚本,要求接收者提供以下两个条件,才能花掉发给他的比特币:
1)一个公钥,当进行散列生成比特币地址时,生成的地址是嵌入在脚本中的目标地址D。
2)一个签名,用于证明接收者保存了与上述公钥相对应的私钥。
脚本可以灵活地改变花掉比特币的条件,举个例子,脚本系统可能会同时要求两个私钥或几个私钥,或者无需任何私钥等。
如果联合脚本中未导致失败并且堆栈顶元素为真(非零),则表明交易有效。原先发送币的一方,控制脚本运行,以便比特币在下一个交易中使用。想花掉币的另一方必须把以前记录的运行为真的脚本,放到输入区。
堆栈保存着字节向量,当用作数字时,字节向量被解释成小尾序的变长整数,最重要的位用于决定整数的正负号。比如,0x81代表-1,0x80则是0的另外一种表示方式(称之为负0)。正0用一个NULL长度向量表示。字节向量可以解析为布尔值,这里False表示为0,True表示为非0。
1.4.1 脚本特点
表1-4至表1-12是脚本的所有关键字列表(命令/函数),一些更复杂的操作码已被禁用,不再考虑,因为钱包客户在这些操作码的程序实现上可能有Bug,如果某个交易使用了这些操作码,那么其将会使比特币块链产生分叉。我们提到脚本的时候,通常省略了这些把数字压入堆栈的关键字。
image

image
image

image

image

image

算术逻辑的输入仅限于有符号32位长整数,但输出有可能会溢出。如果任何命令的输入值其长度超过4字节,那么脚本必须中止和失败返回。如果在交易中出现了标记为已禁用的操作码,也必须终止和失败返回。
image
image

image

image

1.4.2 脚本运行过程
在这里,我们先讨论单输入单输出的比特币交易,因为这样描述起来更为方便,而且不会影响对脚本的理解,以下面的一个交易Hash值为例:
9c50cee8d50e273100987bb12ec46208cb04a1d5b68c9bea84fd4a04854b5eb1
这是一个单输入单输出交易,下面来看下我们要关注的数据。
Hash:

9c50cee8d50e273100987bb12ec46208cb04a1d5b68c9bea84fd4a04854b5eb1

对于输入交易,需要关注如下值。
前导输入的Hash:

437b95ae15f87c7a8ab4f51db5d3c877b972ef92f26fbc6d3c4663d1bc750149
输```  
入脚本scriptSig:

3045022100efe12e2584bbd346bccfe67fd50a54191e4f45f945e3853658284358d9c062ad02200121e00b6297c0874650d00b786971f5b4601e32b3f81afa9f9f8108e93c752201038b29d4fbbd12619d45c84c83cb4330337ab1b1a3737250f29cec679d7551148a

对于输出交易,需要关注如下值。
转账金额:0.05010000 btc
输出脚本scriptPubKey:

OP_DUP OP_HASH160 be10f0a78f5ac63e8746f7f2e62a5663eed05788 OP_EQUALVERIFY OP_CHECKSIG

假设Alice是转账发送者,Bob是接受者。那么输入交易表明了Alice要动用的比特币的来源,交易输出表明了Alice要转账的数额和转账对象——Bob。那么,有读者可能会问,数据中的输入脚本和输出脚本是不是就是题和解?答对了一半!
在Bitcoin Wiki中提到:原先发送币的一方,控制脚本运行,以便比特币在下一个交易中使用。想花掉币的另一方必须把以前记录的运行为真的脚本,放到输入区。
换句话说,在一个交易中,输出脚本是数学题,输入脚本是题解,但不是这道数学题的题解。我开始看Wiki的时候,在这里遇到了一些障碍,没法理解输入脚本和输出脚本的联系。但是在考虑到交易间的关系之后,就明白了。
假设有这么一系列交易,如图1-7所示。

图![image](https://yqfile.alicdn.com/0b71bb6f7f88c33b4bdc1f475be8ce7b5e11243b.png)
1-7 三对交易示范图
那么,这一系列交易具有如下特征。
三个交易都是单输入单输出交易。
每个输入交易输出交易中,都包含对应的脚本。
交易a为Alice转账给Bob;交易b为Bob转账给Carol;交易c为Carol转账给Dave。
当前交易的输入都引用前一个交易的输出,如交易b的输入就是引用交易a的输出。
按照之前的说法,交易a中的输出脚本就是Alice为Bob出的数学题。那么,Bob想要引用交易a输出交易的比特币,就要解开这道数学题。题解是在交易b的输入脚本里给出的!Bob解开了这道题,获得了奖金,然后在交易b中为Carol出一道数学题,等待Carol来解……
所以说,在图1-8中相同颜色的输出和输入才是一对题和解。
![image](https://yqfile.alicdn.com/3c9c39e7970b8c365ba92e83651c0448c6e55485.png)

图1-8 输入输出一一对应图
**1.4.3 脚本操作码解读**
要理解比特币脚本,先要了解堆栈,这是一个后进先出(Last In First Out)的容器,脚本系统对数据的操作都是通过它完成的。比特币脚本系统中有两个堆栈:主堆栈和副堆栈,一般来说主要使用主堆栈。下面就来列举几个简单的例子,看下指令是如何对堆栈进行操作的。
常数入栈:指把一段常数压入到堆栈中,这个常数成为栈顶元素,如图1-9所示。
OP_DUP:复制栈顶元素,如图1-10所示。
![image](https://yqfile.alicdn.com/f8cd6edb4af042c98ec4c262f9576eb92ea8de74.png)
        
    图1-9 常数入栈    图1-10 复制栈顶元素
OP_EQUALVERIFY:用于检查栈顶两个元素是否相等,如图1-11所示。
**1.4.4 脚本执行过程**
Alice在转账给Bob的时候,输出交易中给出了Bob的钱包地址(等价于公钥Hash),当Bob想要转账给Carol的时候,他要证明自己拥有与这个钱包地址对应的私钥,所以在输入交易中给出了自己的公钥及使用私钥对交易的签名。下面来看个实例。

交易a:?
9c50cee8d50e273100987bb12ec46208cb04a1d5b68c9bea84fd4a04854b5eb1
交易b:?
62fadb313b74854a818de4b4c0dc2e2049282b28ec88091a9497321203fb016e

交易b中有一个输入交易引用了交易a的输出交易,它们的脚本是一对题与解。
题:交易a的输出脚本,若干个脚本指令和转账接收方的公钥Hash。

OP_DUPOP_HASH160be10f0a78f5ac63e8746f7f2e62a5663eed05788OP_EQUALVERIFY OP_CHECKSIG

解:交易b的输入脚本,这么一长串只是两个元素,签名和公钥(sig & pubkey)。

3046022100ba1427639c9f67f2ca1088d0140318a98cb1e84f604dc90ae00ed7a5f9c61cab02210094233d018f2f014a5864c9e0795f13735780cafd51b950f503534a6af246aca301 03a63ab88e75116b313c6de384496328df2656156b8ac48c75505cd20a4890f5ab

下面来看下这两段脚本是如何执行完成解题过程的。
首先执行的是输入脚本。因为脚本是从左向右执行的,那么先入栈的是签名,随后是公钥。接着,执行的是输出脚本。从左向右执行,第一个指令是OP_DUP——复制栈顶元素(如图1-12所示)。
OP_HASH160用于计算栈顶元素Hash,得到pubkeyhash,如图1-13所示。
然后将输出脚本中的公钥Hash入栈,为了与前面计算中所得到的Hash区别开来,这里称它为pubkeyhash',如图1-14所示。
![image](https://yqfile.alicdn.com/17ff1a4e5781efa8a9cc3f8c87c42a3d913d3af8.png)

OP_EQUALVERIFY则会检查栈顶前两个元素是否相等,如果相等则继续执行,否则中断执行,返回失败,如图1-15所示。
OP_CHECKSIG使用栈顶前两个元素执行签名校验操作,如果相等,则返回成功,否则返回失败,如图1-16所示。
![image](https://yqfile.alicdn.com/b552582ed5a1a721dff201d2cf22fb0b8fbb5874.png)
        
    图1-15 检查Hash值是否相等    图1-16 返回结果
这样一串指令执行下来,就可以验证这道数学题是否做对了,也就是说,验明了想要花费钱包地址中比特币的人是否拥有对应的私钥。上面的执行过程是可以在脚本模拟器中进行的,并且能够看到每一步执行的状态。
相关文章
|
7月前
|
存储 安全 数据管理
新型数据库技术:基于区块链的分布式数据存储系统
传统数据库系统面临着中心化管理、数据安全性和可信度等方面的挑战。本文介绍了一种基于区块链技术的新型数据库系统,通过分布式存储和去中心化的特性,提高了数据的安全性和可信度,同时实现了高效的数据管理和共享。该系统在多个领域如金融、医疗和物联网等具有广阔的应用前景。
|
机器人 区块链
区块链数字货币量化交易系统机器人开发合约源码定制详情
event BuyOrderPlaced(address user, uint256 price, uint256 amount); event SellOrderPlaced(address user, uint256 price, uint256 amount);
|
7月前
|
存储 供应链 安全
构建未来:智能合约在区块链生态系统中的关键作用
【5月更文挑战第30天】 随着区块链技术的迅猛发展,智能合约已成为推动这一领域创新的核心机制。本文深入探讨了智能合约的技术基础、运作原理及其在各行各业中的应用潜力。我们将分析智能合约如何提高交易效率,减少法律纠纷,并为分布式应用(DApps)提供坚实的基础。文章还将讨论智能合约面临的挑战与未来的发展方向,为读者提供一个全面且深入的视角,以理解这一变革性技术如何塑造数字经济的未来。
|
7月前
|
机器学习/深度学习 自动驾驶 物联网
未来技术的脉动:区块链、物联网和虚拟现实的革新之旅基于深度学习的图像识别技术在自动驾驶系统中的应用
【5月更文挑战第28天】 随着科技的不断进步,新兴技术如区块链、物联网(IoT)和虚拟现实(VR)正在重塑我们的世界。本文将深入探讨这些技术的发展趋势,以及它们在各个行业中的创新应用。区块链技术以其不可篡改和去中心化的特性,正在金融、供应链管理和身份验证等领域引领一场变革。物联网通过智能设备和系统的互联互通,实现数据的高效流通,推动智慧城市和智能家居的发展。而虚拟现实技术则通过沉浸式体验,改变教育、医疗和娱乐等行业的服务模式。这些技术的融合与创新,预示着一个更加智能、互联和虚拟的未来。 【5月更文挑战第28天】 随着人工智能技术的飞速发展,深度学习已经成为推动自动驾驶系统革新的核心力量。本文
|
7月前
|
存储 算法 安全
区块链系统开发技术规则分析
区块链核心技术包括:1) 哈希算法,利用单向函数将任意数据转化为固定长度代码,确保安全验证;2) 非对称加密,使用公钥和私钥一对进行加密解密,保证信息安全;3) 共识机制,如PoW、PoS、DPoS等,实现快速交易验证和确认;4) 智能合约,自动执行的可信代码,一旦编写即不可更改,用于自动化交易;5) 分布式存储,将数据分散存储在网络各处,涵盖结构化、非结构化和半结构化数据。
|
6月前
|
供应链 区块链
基于区块链的供应链管理追溯系统研究
基于区块链的供应链管理追溯系统研究
|
7月前
|
存储 安全 数据管理
新一代数据库技术:融合区块链的分布式存储系统
传统数据库技术在面对日益增长的数据量和复杂的数据管理需求时显现出局限性。本文介绍了一种新一代数据库技术:融合区块链的分布式存储系统。通过将区块链技术与传统数据库相结合,实现了数据的分布式存储、安全性和透明度,以及去中心化的特性。这一技术的应用将极大地推动数据库系统的发展,为数据管理带来全新的解决方案。
|
7月前
|
存储 安全 数据管理
新一代数据库技术:融合区块链的分布式数据存储系统
传统数据库系统面临着数据安全性、可信度和去中心化等挑战,而区块链技术的兴起为解决这些问题提供了新的思路。本文介绍了一种新一代数据库技术,将区块链技术与传统的分布式数据存储系统相融合,实现了更高水平的数据安全性和可信度,以及去中心化的优势。通过结合区块链的不可篡改性和分布式存储系统的高性能,这一新型数据库技术将在未来的数据管理领域发挥重要作用。
|
7月前
|
人工智能 供应链 区块链
移动应用开发的未来:跨平台框架与原生系统的融合区块链技术在供应链管理中的应用探索
【5月更文挑战第27天】随着移动设备的普及,移动应用开发已成为软件工程的一个关键领域。本文探讨了移动应用开发的当前趋势,特别是跨平台开发框架的兴起以及它们如何与原生移动操作系统交互。文章分析了跨平台工具如React Native、Flutter和Xamarin的优缺点,并讨论了它们在性能、用户体验和开发效率方面的权衡。此外,文章还预测了未来移动应用开发可能面临的挑战和机遇,包括人工智能、物联网和5G技术的融合。 【5月更文挑战第27天】 随着数字化转型的深入,区块链技术已从金融领域扩展到多个行业,其中供应链管理成为其创新应用的热点。本文将探讨区块链如何提升供应链透明度、优化流程并增强安全性。
|
监控 算法 测试技术
量化交易软件开发 | 搭建区块链数字货币量化交易系统规则解析
在数字货币领域,量化交易已经成为投资者获取稳定收益的一种重要策略。而开发一款高效可靠的量化交易软件,则是实现量化交易的关键。本文从零开始,以搭建区块链数字货币量化交易系统为主题,从理论框架、领域案例和工作流程三个角度出发,为您详细介绍量化交易软件开发的过程。