区块见闻 区块见闻
Ctrl+D收藏区块见闻
首页 > 币安币 > 正文

WAS:从BTC脚本到Subscript:智能合约语言剖析_EOSKINGDOM

作者:

时间:

负熵学会网站对广义的智能合约是这样定义的:能够让用户自己定义所需交易逻辑的代码程序,几乎存在于所有区块链系统,包括最广为人知的比特币,以及以太坊、超级账本、Parity、Zcash等。

从编程语言表现或者运行环境考虑,智能合约可以分为脚本型、图灵完备型、可验证合约型三种。

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

以太坊系统提供以太坊虚拟机,合约代码在EVM内部运行。以太坊用户使用特定语言编写智能合约代码,并编译成EVM字节码运行。超级账本提供另一种图灵完备智能合约,它在Docker容器环境中运行语言无关的智能合约,即智能合约代码可以使用任何编程语言进行编写,之后被编译器编译并打包进Docker镜像,以容器作为运行环境。

随着波卡多链系统的发展,开发者针对跨链互操作的智能合约设计了新的开发语言。比如波卡的TrustBase项目提供了基于Substrate框架、兼容WebAssembly虚拟机的智能合约开发系统,并自主研发了全新的易用语言Subscript,开发波卡原生完备智能合约。

本文将对比特币、以太坊和波卡区块链中的智能合约主流开发语言进行梳理阐述。从最初的比特币脚本语言到如今的Subscript,读者得以窥见智能合约语言的发展脉络。

一、比特币脚本语言

这是一种基于堆栈的逆波兰式简单执行语言,它用于编写比特币交易中未花费交易输出的锁定脚本和解锁脚本。锁定脚本确定了花费输出所需要的条件,而解锁脚本用来满足UTXO上锁定脚本所确定的条件,解锁并支付。当一条交易被执行时,每个UTXO的解锁脚本和锁定脚本同时执行,根据执行结果来判定该笔交易是否满足支付条件。

比特币脚本语言被设计得非常简单,类似于嵌入式装置,仅可在有限的范围内执行,可做较简单的处理。脚本指令被称为操作码,分为常量、流程控制、栈操作、算术运算、位运算、密码学运算、保留字等。后文中提及的OP-DUP等属于栈操作指令。脚本是非图灵完备的语言,包含的操作码不具备循环和复杂的流控制功能,仅可执行有限的次数,避免了因编写疏忽等原因导致的无限循环或其他类型的逻辑炸弹。比特币脚本这种有限的执行环境和简单的执行逻辑,有利于对可编程货币的安全性进行验证,能够防止形成脚本漏洞而被恶意攻击者所利用。

彭博社:与去年11月加密高峰相比,加密领域七位亿万富翁总共损失约1140亿美元:6月14日消息,根据彭博亿万富翁指数,自去年11 月 9 日比特币达到近 69000 美元的历史新高到现在比特币及加密市场跌至近2年内最低,七位与加密货币相关的亿万富翁总共损失了1140亿美元。(彭博社)[2022/6/14 4:24:23]

比特币系统处理的大多数交易花费都是由“付款至公钥哈希”脚本锁定的输出,即锁定脚本中包含一个公钥的哈希值,解锁时通过包含公钥和对应私钥所创建的数字签名的脚本来验证。例如,用户A向用户B支付一笔交易,锁定脚本可以表示为:

OP_DUPOP_HASH160〈BPublicKeyHASH〉OP_EQUALVERIFYOP_CHECKSIG

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

〈BSignature〉〈BPublicKey〉

比特币系统中的节点把解锁脚本与锁定脚本组合,形成验证脚本:

〈BSignature〉〈BPublicKey〉OP_DUPOP_HASH160

〈BPublicKeyHASH〉OP_EQUALVERIFYOP_CHECKSIG

该验证脚本被放入堆栈中执行,输出结果决定着交易的有效性。

二、以太坊图灵完备型语言

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

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

调查:相比BTC,美国散户更看好ADA:金色财经报道,Voyager Digital的一份调查结果显示,相对于BTC,美国散户投资者更看好Cardano(ADA)。调查发现,31.8%的受访散户投资者称自己“最看好”ADA,而选择比特币的则为22.2%。上个月,ADA触及了1.48美元的历史高点,一度成为按市值计算的第三大加密货币。尽管如此,仍有80%的散户投资者计划在3月份购买更多的比特币。[2021/3/10 18:30:27]

2.1 Solidity语言

Solidity是一种“面向合约”的高级编程语言,它是专门为编写运行在EVM上的智能合约而设计的。其语法接近JavaScript,并且支持强类型、继承、库以及用户自定义类型。但Solidity也有其独特的语言特性:

1)特殊的数据类型———Address。运行在以太坊上的智能合约被当作一个特殊的账户———合约账户,类似于外部账户,合约账户也是由一个20字节的地址所定位。因此,Solidity语言设计了用于定义合约地址的Address。

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

3)两种数据存储方式:Memory和Storage。Memory类似其他高级语言的变量存储方式,使用完被回收。默认的函数参数即为Memory类型;然而,在区块链上有非常多的状态需要永久记录下来,状态变量默认保存为Storage类型。在用户编程过程中,也可以使用关键字灵活地手工指定数据的存储方式。

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

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

6)严格控制可见性。函数和状态变量共有4种可见性定义,即External,Internal,Public,Private,用来限制函数或状态变量在合约内外以及继承关系中的调用和访问权限。Solidity还支持一些针对智能合约特性的独特变量,它们作用于全局命名空间,主要用于获取区块链的相关信息,如表1所列。

分析 | ZkSystems:与WhatsApp、Telegram相比,DAPP几乎没有得到许多用户:据bitcoinexchangeguide报道,根据ZkSystems使用来自stateofthedapps的数据进行的研究,与WhatsApp、Telegram相比,DAPP几乎没有得到许多用户。该公司首席执行官Diana Rees称,只有10%的基于以太坊的DAPP拥有普通用户,并且不断用于金融交易。zkSystems进行的研究涉及1812个以太坊DAPP。与其他平台上的DAPP相比,基于以太坊的似乎表现不佳。由EOS运营的DICE每天拥有近50万笔金融交易。此外,DappRadar前十名中几乎所有有着大量交易的DAPP都在Tron网络上运行。[2019/2/9]

2.2Serpent语言

Serpent的设计非常类似于Python,它是一种专门编写智能合约的高级语言,具备低级语言高效易用的编程风格以及针对智能合约的特性。最新版本的编译器由C++语言编写,目的是能够更广泛地嵌入客户端程序。Serpent与Python之间虽然相似,但也有诸多不同之处:

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

2)Serpent不支持Decimal数值类型;

3)Serpent不支持List,Dictionary以及其他一些高级特性;

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

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

6)类似于Solidity,Serpent可以使用extern语句来调用其他合约,或从其他合约中调用函数;

研究显示:相比比特币 印度人对以太坊更感兴趣:据Quartz报道,免费互联网服务提供商Jana在其最新的主流移动报告显示,相比比特币,印度人对以太坊更感兴趣。在过去五个月中,以太坊占加密货币相关搜索的34.4% ,而比特币则只占4.5%。其它搜索量占比大的还有21.4%的NEM。Dash,NEO,Litecoin,Ripple和Monero也在榜单中。Quartz指出,Jana的统计数据是在分析该公司mCent浏览器手机app的加密货币搜索条件和交易所的访问次数之后得出的 ,因此可能并不完全代表整个加密货币市场的搜索。[2018/4/5]

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

2.3可验证型语言Pact

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

Pact智能合约由3部分构成:tables,Keysets,module。它们分别负责合约的数据存储、合约授权验证以及合约代码code。该语言的主要特点有:语言逻辑结构属于图灵非完备,不支持循环和递归;代码人工可读,并且嵌入式地运行于区块链上;支持组件化设计和导入;支持keyrow和列式数据库模式;支持类型推断;支持秘钥轮换;支持与工业数据库进行集成。Pact语法设计类似于LISP语言,代码结构利于快速分析和执行语法树。下面给出一段计算平均值的函数代码:

“taketheaverageaandb”

2))

代码定义了average函数,用于计算两个数的平均值。这种语法特点能够使计算机更加快速地执行代码。

2.4超级账本智能合约语言

超级账本智能合约Chaincode一般由Golang编写,同时也支持其他编程语言,如Java。Go是由RobertGriesemer,RobPike,Ken Thompson从2007年末主持开发,并最终于2009年11月开源的语言,属于图灵完备型。每个Go程序都是由包构成的,并且总是从main包开始执行。Go语言具有以下特点:

与欧元相比,比特币更受捷克人欢迎:据当地媒体报道,一项525人的新民意调查显示,捷克人更倾向于用加密货币来存储价值,而不是欧元。在被问及购买外国现金的打算时,一项调查显示,对购买比特币感兴趣的捷克人数是购买美元的两倍。[2018/2/26]

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

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

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

4)错误处理。Go语言使用3个关键字来处理异常错误,与Java语言的Try-Catch模块不同,能够大大减少处理异常的代码量。

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

2.5TrustBase智能合约语言

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

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

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

2)Subscriptonechain:TrustBase的合约链;

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

Subscript使用基于账户的方式进行数据的存储,并以交易的形式部署合约。已部署的智能合约带有状态租金,租金用完合约就会暂停。这种设计与Polkadot智能合约跨链执行的生态有很好的相性。

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

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

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

a、静态的语法检查。与针对动态类型运行环境的TypeScript不同,Subscript在编译时具有严格的静态语法检查,避免了无法提前有效编译TypeScript的动态特征。通过分配或推断确定的类型,编译器能够从执行开始就产生可预测的性能,同时保证所产生的WASM目标代码很小。

b、严格的类型。Subscript中的基础类型为WASM标准而设计,使用WASM特定的整数和浮点类型。在处理数值类型时允许开发人员实现制定数值的理想类型。

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

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

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

2.5.1Subscript库函数

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

1、包含基本的密码学函数,blake2b,sha3,sha256

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

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

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

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

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

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

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

5、治理合约,提供通过投票实现的链上治理

6、多签合约,能够支持多种账户格式的多签地址合约

三、波卡跨链智能合约语言对比

由于Subscript是针对波卡Polkadot跨链智能合约生态专门研发的语言,所以Subscript拿来与Parity基于rust开发的ink!语言进行比较最为合适。相比之下,Subscript提供了更加易用的特性:

1)无需rust开发基础,Web开发者可以快速入门;

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

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

表2对文中出现的所有语言特性进行对比

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

四、结语

本文笔者从比特币脚本语言开始,阐述了智能合约开发语言的发展历程,并剖析了波卡跨链智能合约语言Subscript的特性。2020年9月,Subscript语言陆续完成了前期的开发和调试,并获得了Web3基金会Grant认证。可以看出随着区块链不同赛道的发展,尤其是Polkadot波卡的跨链智能合约赛道的出现,与赛道要求适配的新生语言将被更多的开发者尝试与使用。

来源:金色财经

标签:SUBSEOSWAS区块链SUBS币EOSKINGDOMWasderwpc币区块链

币安币热门资讯
NEX:展望2021,HOP协议再起征途_Nexum

环视全球,科技革命和产业变革日新月异,数字经济是新兴技术和先进生产力的代表,把握数字经济发展大势,以信息化培育新动能,用新动能推动新发展,已经成为普遍共识.

区块链:币圈总裁:ETH强势拉伸 年内新高近在咫尺_WASABI价格

各位币友大家好,我是你们的老朋友——总裁跟着我的客户都是做了很久的,不是我带他们收获了多少,而是我用心在指导,毫无保留的教技术,经常熬夜盯盘.

BSC:珊珊说币:以太坊多头强势 后市仍有上行意图?_DIT

大家好,我是珊珊,专注BTC、ETH等数字货币领域的专业金融分析,持续更新认为会对您有用的最新数字货币行情及相关资讯。面对金融市场,没有难做的交易,只有看不懂的行情.

DAP:机构兴趣渐浓 比特币成第三拥挤的交易_比特币行情今日价格美金

比特币在2020年令人目眩的涨势吸引了职业投资者群体。根据美国银行在12月4日至12月10日期间进行的的调查,约有15%的基金经理表示,比特币是目前第三拥挤的交易,仅次于做多科技股和做空美元.

DAPP:相比起以太 Filecoin 是如何打造智能合约的?_PlayDapp

Filecoin区块链中的Actor等同于以太坊虚拟机中的智能合约。Filecoin虚拟机是负责执行所有参与者代码的系统组件。在FilecoinVM上执行参与者会产生GAS费用.

Filecoin:12.19 比特币行情走势分析_WFILMC价格

行情观点: 昨日上午给出行情分析建议反弹高空为主,给出的操作建议23000-23100附近分批空,目标21800-21700,止损23500,昨日大饼触及23278一线回调震荡下行.