主页 > imtoken怎么用 > 从 BTC Script 到 Subscript:智能合约语言分析

从 BTC Script 到 Subscript:智能合约语言分析

imtoken怎么用 2023-02-09 06:26:14

Extropy Institute网站对智能合约的定义是广义的:允许用户定义所需交易逻辑的代码程序,几乎存在于所有的区块链系统中,包括最知名的比特币,以及以太坊、Hyperledger、Parity、Zcash , ETC。

从编程语言性能或运行环境的角度,智能合约可分为三种类型:脚本型、图灵完备型和可验证合约型。

比特币系统可以允许通过编写基于堆栈的操作代码(Opcode)来实现简单的交易逻辑,例如更改花费比特币的前提条件。 这个系统被称为比特币脚本系统。 以太坊提供了一个基于图灵完备语言的智能合约平台,也是最早的图灵完备智能合约。

以太坊系统提供以太坊虚拟机(EVM),合约代码运行在EVM内部。 以太坊用户用特定语言编写智能合约代码,编译成 EVM 字节码运行。 Hyperledger 提供了另一种图灵完备的智能合约,它在 Docker 容器环境中运行语言无关的智能合约,即智能合约代码可以用任何编程语言编写,然后通过编译器编译并打包到 Docker 镜像中被容器化为操作环境。

随着Polkadot链系统的发展,开发者设计了一种新的跨链互操作智能合约的开发语言。 例如,波卡的TrustBase项目提供了基于Substrate框架并兼容WebAssembly(WASM)虚拟机的智能合约开发系统,并自主研发了一种新的易用语言Subscript来开发波卡原生的完整智能合约。

本文将梳理比特币、以太坊和波卡区块链中智能合约的主流开发语言。 从最初的比特币脚本语言到今天的 Subscript,读者可以一窥智能合约语言的发展历程。

1. 比特币脚本语言

这是一种基于堆栈的反向波兰简单执行语言,用于编写比特币交易中未花费交易输出(UTXO)的锁定脚本(LockingScript)和解锁脚本(UnlockingScript)。 锁定脚本决定花费输出所需的条件,解锁脚本用于在UTXO上满足锁定脚本所确定的条件,解锁并支付。 执行一笔交易时,同时执行每笔UTXO的解锁脚本和锁定脚本,根据执行结果(true/false)判断交易是否满足支付条件。

比特币脚本语言设计的非常简单,类似于嵌入式设备,只能在有限的范围内执行,可以做比较简单的处理。 脚本指令称为操作码,分为常量、流控、栈操作、算术运算、位操作、密码操作、保留字等。后面提到的OP-DUP就属于栈操作指令。 Script是一种非图灵完备的语言,所包含的操作码没有循环和复杂的流控功能,只能执行有限的次数,避免了因编写和编写上的疏忽造成的死循环或其他类型的逻辑炸弹其他原因。 比特币脚本有限的执行环境和简单的执行逻辑有利于验证可编程货币的安全性,可以防止脚本漏洞被恶意攻击者利用。

比特币系统处理的大部分交易费用是“Payment to Public Key Hash (P2PKH)”脚本锁定的输出,即锁定脚本包含一个公钥(比特币地址)的哈希值,被解锁通过包含公钥和对应私钥创建的数字签名的脚本进行验证。 例如,用户A向用户B支付一笔交易,锁定脚本可以表示为:

OP_DUPOP_HASH160<BPublicKeyHASH>OP_EQUALVERIFYOP_CHECKSIG

其中,BPublicKeyHASH为用户B的公钥哈希值。 用户B解锁交易时,使用包含B的数字签名和公钥的解锁脚本:

<BSignature><BPublicKey>

比特币系统中的节点将解锁脚本和锁定脚本结合起来形成一个验证脚本:

<BSignature><BPublicKey>OP_DUPOP_HASH160

<B PublicKeyHASH> OP_EQUALVERIFYOP_CHECKSIG

合约机和非合约机的区别_btc合约玩法_移动合约机刷机影响合约吗

验证脚本入栈执行,输出结果决定交易的有效性。

2. 以太坊图灵完备语言

由于比特币等脚本语言不具备图灵完备性btc合约玩法,所编写的智能合约交易模式非常有限,只能用于虚拟货币应用。 因此,Vitalik Buterin 推出了支持图灵完备语言的以太坊智能合约平台。 以太坊为智能合约提供专用的开发语言,大多数其他系统或平台使用通用编程语言。

目前,以太坊提供两种编程语言:Serpent 和 Solidity。 Solidity 在语法上类似于 JavaScript,也是以太坊官方推荐的智能合约编程语言。 有详细的开发文档; Serpent 与 Python 类似,具有简洁的特点。 以太坊曾经提供 Mutan 和 LLL 语言。 Mutan 是一种类似于 C 的高级语言,但该语言在两年前停止维护; LLL 语言已被废弃,官方代码库已无法访问。

2.1 Solidity语言

Solidity 是一种“面向合约”(或面向对象)的高级编程语言,专为编写运行在 EVM 上的智能合约而设计。 它的语法接近 JavaScript,支持强类型、继承、库和用户定义类型。 但是Solidity也有自己独特的语言特点:

1)一种特殊的数据类型---地址。 运行在以太坊上的智能合约被视为一个特殊的账户——合约账户,类似于外部账户,合约账户也由一个20字节的地址定位。 因此,Solidity语言旨在定义合约地址的Address。

2)灵活的变量声明。 在作用范围内,定义语句与状态变量的调用之间没有绝对的顺序关系,定义语句可以在调用语句之后。

3)两种数据存储方式:Memory(内存型)和Storage(持久型)。 内存类似于其他高级语言的变量存储方式,用完即被回收。 默认函数参数是内存类型; 但是区块链上有很多状态需要永久记录,状态变量默认保存为Storage类型。 用户编程时,也可以通过关键字灵活地手动指定数据的存储方式。

4)数字货币支付属性。 Payable关键字使其能够在代码层支持以太坊等数字货币的支付和收款操作,使合约能够接受交易并持有一定数量的货币。

5) 支持回滚的异常机制。 对于异常事件,不是让程序去捕获和处理,而是触发回滚对应代码的自动处理,从而保证合约中状态数据的一致性和合约执行的原子性。

6)严格控制能见度。 函数和状态变量的可见性定义有四种,分别为External、Internal、Public和Private,用于限制函数或状态变量在合约内外和继承关系中的调用和访问权限。 Solidity还支持一些针对智能合约特性的特有变量btc合约玩法,作用于全局命名空间,主要用于获取区块链的相关信息,如表1所示。

移动合约机刷机影响合约吗_btc合约玩法_合约机和非合约机的区别

2.2 蛇语

合约机和非合约机的区别_移动合约机刷机影响合约吗_btc合约玩法

Serpent 的设计与 Python 非常相似。 它是一种用于编写智能合约的高级语言。 它具有低级语言高效易用的编程风格和智能合约的特性。 最新版本的编译器是用 C++ 编写的,旨在更广泛地嵌入到客户端程序中。 尽管 Serpent 与 Python 相似,但也有许多不同之处:

1)Serpent的值不能大于2256,否则会溢出;

2)Serpent不支持Decimal值类型;

3)Serpent不支持List、Dictionary等高级特性;

4)Serpent没有第一类函数的概念。 虽然可以在合约中定义函数,也可以调用自己的函数,但是在调用过程中,变量(Storage类型除外)并不是永久存在的;

5)与Solidity类似,Serpent支持持久化存储变量的概念,即Storage variables;

6) 与Solidity类似,Serpent可以使用extern语句调用其他合约,或者调用其他合约的函数;

7)Serpent作为一种运行在区块链上的编程语言,也支持表1中的特殊变量。

2.3 可验证语言契约

Pact 语言类似于 Haskell 语言,用于编写直接在 Kadena 区块链上运行的智能合约。 主要用于对安全性和效率要求高的商业交易。

Pact 智能合约由三部分组成:表格、密钥集和模块。 分别负责合约数据存储、合约授权校验和合约代码编码。 该语言的主要特点是:该语言的逻辑结构是图灵不完备的,不支持循环和递归; 代码是人类可读的,并嵌入在区块链上运行; 支持基于组件的设计和导入; 它支持keyrow和columns数据库模式; 支持类型推断; 支持密钥轮换; 支持与工业数据库集成。 Pact语法设计类似于LISP语言,代码结构便于语法树的快速分析和执行。 下面是一段计算平均值的函数代码:

(defunaverage(ab)

“取平均 aandb”

(/(+ab)2))

btc合约玩法_移动合约机刷机影响合约吗_合约机和非合约机的区别

代码定义了 average 函数,用于计算两个数的平均值。 此语法功能使计算机能够更快地执行代码。

2.4 超级账本智能合约语言

Hyperledger智能合约Chaincode一般用Golang编写,也支持其他编程语言,如Java Go,由Robert Griesemer、Rob Pike和Ken Thompson于2007年底开发,最终于2009年11月开源. 它是一种图灵完备的语言。 . 每个 Go 程序都是由包组成的,执行总是从主包开始。 Go语言具有以下特点:

1)具有良好的并发机制,程序可以充分利用多核和联网的机器。 Go语言引入了goroutines来实现并发,使用消息传递来共享内存。

2) 设计简单。 代码风格简洁,格式统一,可读性和可维护性高。 该语言只有 25 个关键字,但它可以支持其他编程语言所支持的大部分特性,例如继承、重载、对象等。

3) 嵌入式C语言支持。 该语言可以直接包含C语言代码,利用现有丰富的C库。

4)错误处理。 Go语言使用三个关键字来处理异常错误,区别于Java语言的Try-Catch模块,可以大大减少处理异常的代码量。

5) 支持自动垃圾回收。 Go语言中不需要delete关键字,也不需要free方法显式释放内存。

2.5 TrustBase 智能合约语言

TrustBase平行链的开发语言Subscript是为WASM设计的原生智能合约语言,可以支持任何兼容Substrate架构的智能合约开发平台开发Polkadot原生智能合约。

同时,TrustBase平行链开发了支持Subscript语言的IDE和测试工具。 Subscript 提供以下开发工具来构建完整的合约开发生态:

1)Subscriptworkbench:基于浏览器的IDE开发环境;

2)Subscriptonechain:TrustBase合约链;

3)SubscriptTempest:智能合约测试验证框架;

移动合约机刷机影响合约吗_btc合约玩法_合约机和非合约机的区别

Subscript 使用基于账户的方式以交易的形式存储数据和部署合约。 部署的智能合约有一个状态租金,当租金用完时合约将被暂停。 这种设计非常契合波卡智能合约跨链执行的生态。

基于 Subscript 开发的智能合约可以升级,类似于 Solidity 合约。 合约库函数以合约语言实现(as implementation),包括基本密码学函数、链上信息(随机数、区块高度、区块时间等)、智能合约操作(转账、调用其他合约) ,调用链上的模块)。

由于 Subscript 语言具有更易理解的语义,有利于开发者利用图灵完备的灵活性,使得基于 Subscript 开发的智能合约将具有更少的安全漏洞。

Subscript 从 API 到语法都是为 WASM 设计的。 整体使用严格的类型和语言检查,并提供通用功能支持第三方库的封装。 具体实现如下:

一种。 静态语法检查。 与动态类型运行环境的 TypeScript 不同,Subscript 在编译时有严格的静态语法检查,避免了无法有效提前编译 TypeScript 的动态特性。 通过分配或推断某些类型,编译器能够从执行开始就产生可预测的性能,同时保持生成的 WASM 目标代码较小。

b. 严格型。 Subscript 中的底层类型是为 WASM 标准设计的,使用 WASM 特定的整数和浮点类型。 允许开发者在处理数值类型时实现指定数值的理想类型。

C。 低级访问支持。 智能合约与沙箱外环境交互时,可以传递的参数仅限于基本整数类型。 下标提供了可用于定义外部接口类型的完整语法。 Subscript还自带指令函数,可以访问WASM底层,提供整数运算、虚拟机栈访问、内存加载等操作。

d. 范式支持。 Subscript 能够定义泛型来支持代码复用,通过泛型定义了一系列可复用的库函数。

在库函数方面,Subscript提供了丰富的库函数供开发者调用。 库函数分为标准库、核心库、扩展库三部分。

2.5.1 下标库函数

Subscript标准库包括基本数学运算、数组运算、字符串处理、内存访问等功能; Subscript核心库(CoreLib)可以通过合约代码中的函数直接访问,例如:

1.包含基本密码功能,blake2b、sha3、sha256

2. 链上信息(随机数、区块高度、区块时间等)

3、智能合约转账、调用其他合约、调用链上其他模块(XCMP跨链消息、质押、治理等)

合约机和非合约机的区别_移动合约机刷机影响合约吗_btc合约玩法

下标扩展库(SupportLib)是一个模块化的合约库函数集合,包括很多常用的合约模板。 通过扩展库中的合约模板,开发者可以自动集成目前广泛使用的合约功能,增强合约的安全性,避免基础功能的重复开发。 扩展库中包含的合约函数有:

1. ERC20兼容合约,提供兼容ERC20接口的代币库函数;

2. ERC721兼容合约,支持创建非同质代币;

3、权限控制合约使用合约基类为扩展合约提供基于账户的权限控制功能;

4.代理合约,通过抽象合约接口实现合约的可升级功能;

5. 治理合约,通过投票提供链上治理;

6. 多签合约可以支持多种账户格式的多签地址合约。

3. 波卡跨链智能合约语言对比

由于 Subscript 是专门为 Polkadot 跨链智能合约生态开发的语言,所以将 Subscript 与 Parity 的 rust-based ink 进行比较再合适不过了! 语言。 相比之下,Subscript 提供了更易用的特性:

1)Web开发者无需rust开发基础即可快速上手;

2) 与JavaScript良好的互操作性,便于与Dapp集成; 与javascript的交互在于使用方便; javascript、typescript测试合约接口,模拟合约行为。

3) 简单易用的开发环境支持,可以基于已有的jsIDE进行部署和测试。

表2比较了文本中出现的所有语言特征

移动合约机刷机影响合约吗_btc合约玩法_合约机和非合约机的区别

除了表中列出的共同特性外,Subscript 语言还兼容基于 Polkadot Substrate 框架的 WASM 虚拟机。 与 Solidity 的 EVM 兼容性不同,WASM 对 Polkadot 的碎片化多链结构具有更好的向后兼容性。 使用 Subscript 语言开发 Polkadot 智能合约的开发者不会有类似以太坊智能合约平台的历史包袱。 随着未来波卡平行链生态的丰富,这将变得至关重要。

四。 结论

本文作者从比特币脚本语言入手,阐述了智能合约开发语言的发展历程,分析了波卡跨链智能合约语言Subscript的特点。 2020年9月,Subscript语言完成前期开发调试,获得Web3 Foundation Grant认证。 可以看出,随着不同区块链赛道的发展,特别是波卡跨链智能合约赛道的出现,符合赛道要求的新语言将会被更多的开发者尝试和使用。