Web3开发者必修课:智能合约语言全面解析

Web3开发者的自我修养——智能合约语言

基本介绍

智能合约是一种在区块链平台上运行的自动化执行协议,它使得合约双方能够在无需中间人或信任第三方的情况下直接进行可信交易,这些交易可追踪且不可逆转。智能合约当中内含了代码函数,亦能与其他合约进行交互,当预定义的条件得到满足时,智能合约会自动执行合约中指定的代码函数。

智能合约概念最早由计算机科学家Nick Szabo在上世纪90年代提出,但直到以太坊区块链的出现,智能合约才开始实现广泛应用。以太坊于2015年推出,支持智能合约的部署和执行,与比特币主要用于加密货币的简单交易不同,能够使用其图灵完备编程语言在以太坊平台上构建去中心化应用,因此被誉为第二代区块链。

智能合约语言是用于编写智能合约的编程语言,编译成字节码后在区块链智能合约平台的虚拟机上执行,实现预定逻辑的代码。一个智能合约语言需要能够使开发者以安全、高效的方式表达合约的规则,并通常提供一系列用于处理区块链事务和状态的工具和抽象。

Web3 开发者的自我修养——智能合约语言

智能合约语言

智能合约开发者中大多数都在以太坊以及兼容EVM的区块链上进行开发,而Solana是非EVM兼容区块链生态中开发者最多的,Move则是专门为安全地开发区块链智能合约而构建的。

虽然还有许多其他公链有专门的智能合约语言,例如TON/FunC、Cardano/Plutus、ICP/Motoko、Flow/Cadence、Starknet/Cairo等,但过于碎片化。

因此本文将智能合约语言按照EVM系、Solana系和Move系进行分类介绍。

EVM系

EVM是以太坊的核心,负责运行智能合约和处理交易。以太坊协议规定了一种运行在EVM之上的字节码,并在其之上构建了中间语言Yul和Yul+,在中间语言之上再次构建了Solidty/Vyper/Fe等高级语言,高级语言面向前端用户降低智能合约的开发难度。采用多级分层的好处是中间语言既适合于翻译到机器语言,又适合全程序优化,易于手动检查,进行形式化验证等检查,但是分层越多保证可证可信的成本就会更高,每一层都需要做对应的验证,当然越底层的语言由于更简单所以验证成本更低。

在以太坊以及兼容EVM的区块链上,开发者可以使用不同的高级编程语言,目前最受欢迎和维护得最好的语言是Solidity和Vyper,此外还可以选择Yul、Yul+、Fe和Huff。

Solidity最早是由以太坊CTO Gavin Wood于2014年提出,后期则以Christian Reitwiessner所领导的以太坊团队接手开发。Solidity作为一种面向对象的编程语言,深受C++、Python和JavaScript的影响,并且专为EVM而设计。Solidity为了代码重用,智能合约被视为类对象,利用了多重继承。特别地,Solidity规定了一种应用程序二进制接口(ABI)标准来与其合约交互。目前,Solidity ABI被视为EVM DSL的事实标准。

Vyper则由以太坊创始人之一Vitalik Buterin的团队开发,旨在作为Solidity的替代选择,于2017年推出。Vyper是一种面向合约的类似于Python的编程语言,也是为EVM设计的。Vyper针对安全性、可读性、审计能力和Gas效率进行了优化。Vyper不采用面向对象模式,也不能使用内联汇编。

Yul是一种具有高级控制流和大量抽象的汇编语言,是Solidity工具链的一部分。Yul中的大多数功能在Solidity中使用内联汇编块公开,可以利用Solidity不支持的功能,并自定义存储、内存和calldata。Yul+是Yul的扩展,可以视为对Yul的实验性升级。

Fe是一种类似Rust的高级语言,于2021年1月发行。Fe不使用面向对象的模式,而是通过基于模块的系统重用代码,在模块内声明变量、类型和函数,可以以类似于Rust的方式进行导入。

Huff是一种汇编语言,具有手动堆栈控制和对EVM指令集的最小化抽象。通过「#include」指令,编译时可以解析任何包含的Huff文件,从而实现代码重用。

在以太坊上,基于Solidity开发的智能合约占绝大多数,大约90%,是第二名Vyper的十倍,而Fee由于起步更晚,鲜有开发者使用。Yul和Yul+一般作为Solidity的内联汇编块,允许对EVM指令集进行低级别访问,通常用于Gas优化。Huff比Yul/Yul+更底层,可以手动操作堆栈和调用EVM指令,通常用于Gas极限优化。

Web3 开发者的自我修养——智能合约语言

Solana系

Solana因其PoH(Proof of History)机制以及低延迟高吞吐量而闻名,是最著名的"以太坊杀手"之一。Solana也是过去一年市值和生态发展最快的公链之一,催化了其开发者社区的显著增长。

Solana将智能合约称为链上程序(Program),主要采用Rust语言编写,但与其他采用Rust语言的公链不同,Solana并不使用WASM runtime,Solana有自己独特的虚拟机SVM和字节码SBF。

SVM是在Solana网络上运行智能合约和处理交易的runtime,关键组件是Sealevel。Sealevel通过允许多个智能合约同时运行而不会影响彼此的性能,从而在Solana runtime中实现并行处理。Solana的智能合约指定了在运行时将读取或写入哪些状态(账户),这使得没有冲突的交易可以并行执行,同时保证数据一致性。

SBF基于eBPF,前身是BPF(Berkeley Packet Filter,伯克利包过滤器),原本是用于网络数据包的高效过滤,eBPF提供更丰富的指令集,允许在不改动源码的情况下对操作系统内核进行动态干预和修改其行为,具有高性能、安全和可移植性。SBF相对于eBPF,使用了一个自定义验证器,不仅会验证程序需要确定程序在一定数量的指令内终止(也就是著名的停机问题),还会检查指令是否正确以及是否有越界跳转。除了验证器之外,还解决了一些对于编译智能合约来说有点问题的eBPF细节。

LLVM(Low Level Virtual Machine)是现代化的编译架构和工具链,编译器可以将Rust翻译成中间语言LLVM IR,之后再由LLVM IR利用后端翻译成目标平台的eBPF。理论上,只要支持编译成LLVM IR的程序语言都可以编写Solana智能合约,但实际上Solana Labs对Rust和eBPF LLVM后端进行了多项更改,其中一些更改本质上不是上游(Rust和LLVM)可用的。Solana合约开发目前只支持Rust和Solang。

Rust由Mozilla主导开发,于2011年推出,语法上与C++类似,是一种为性能和安全,尤其是安全而设计的通用的静态编译型语言,并不限于智能合约程序。与Solidity相比,Rust是一种低级(low-level)、多范式的编程语言,性能高且内存安全。Rust官方的编译器为rustc,rustc对Rust源码进行词法分析、语法分析、语义分析,最终将代码编译为LLVM IR。

Solang由Hyperlege Labs主导开发,于2023年推出,是Solana和Polkadot的基于LLVM架构的Solidity的编译器,支持使用Solidity编写智能合约,但实际语法为了与Solana和Polkadot的体系结构保持一致做了一些改动。Solang的目的是简化开发人员向Solana或Polkadot的过渡,并扩大Solidity的开发范围。

Rust是Solana官方主要支持的语言,稳定性更强;Solang主要优势在于其与Solidity语言的兼容性。

Web3 开发者的自我修养——智能合约语言

Move系

Move是一种新的智能合约编程语言,于2019年推出,最初是为Meta的Diem区块链项目而开发的。Move旨在解决资产和交易中的安全性问题,使得资产和交易能够被严格定义和控制,其语言特点是:

  1. 一等资源类型的保护(Frist Class Resources):一等资源类型首先是一种变量类型,然后规定这种类型的变量:不能被复制;不能被隐式地销毁;只能在不同程序地址上"Move";

  2. 灵活性:Move字节码可以直接执行,也可以调用其他已发布的Modules代码,可以在一个交易中调用多个程序,能够灵活的实现在一笔交易中给多人转账;

  3. 安全、可验证性:Move编码系统为资源提供了针对性的安全保护。Move资源不可复制,重复使用或销毁。一个资源类型仅能被定义其类型的模块创建或销毁。Move虚拟机将通过静态字节码验证,并拒绝未通过字节码验证的的程序运行,以此确保其安全性。

在Diem项目解散之后,其创始团队出走分别创立的Aptos与Sui,也将Move作为核心智能合约语言。Aptos继承了Diem Move(Core Move),Sui则通过自身定制版本的Sui Move来编写其智能合约。

在Move中,每个智能合约都是一个模块,由函数和结构定义组成,结构在函数中实例化,可以通过函数调用传递给其他模块。Sui Move相比于Core Move,采用了一种基于对象的数据模型,Sui中存在三种不同类型的对象,分别是拥有者对象,共享对象和不可更改对象。Sui的并行化策略与Solana相似,交易也需要指定操作哪些对象,这种设计使得Sui可以有效地处理并发交易,实现无需传统区块链所需的全局排序的并行处理能力。

Move的编译器、验证器以及虚拟机都是从头设计的。其中验证器是Move的核心安全机制之一,用于维护Move以资源为中心的编程模型。Move的验证器是一个静态分析工具,分析Move字节码并确定是否遵守所需的类型、内存和资源安全规则,所有上传到链上的模块都需要通过验证器。

相比于Solidity等语言,Move是一种对形式化验证友好的语言,比如不支持动态指派(dynamic dispatch)等特性,所有合约路径都可以在编译期就确定,而无需在合约执行时才确定需要执行的函数,可以充分的进行分析和验证。

Move还有一个用于智能合约的形式化验证工具,称为Move Prover。开发者需要针对智能合约编写验证条件(以断言的形式),Move Prover会在后台将这些验证条件转换为SMT公式,然后使用SMT求解器进行检查。

Web3 开发者的自我修养——智能合约语言

智能合约开发工具

对于想入门Web3或者想学习以太坊及其他兼容EVM的区块链的合约开发者而言,Solidity都是不二之选。并且由于Solidity的流行,开发工具也更加成熟,代表有:

  • Hardhat是一个编译、部署、测试和调试以太坊应用的开发环境。帮助开发人员管理和自动化构建智能合约和DApps过程中固有的重复性任务,并围绕这一工作流程轻松引入更多功能;

  • OpenZeppelin提供开源的OpenZeppelin Contracts,用Solidity编写,用于构建安全的智能合约。OpenZeppelin Contracts使

此页面可能包含第三方内容,仅供参考(非陈述/保证),不应被视为 Gate 认可其观点表述,也不得被视为财务或专业建议。详见声明
  • 赞赏
  • 4
  • 分享
评论
0/400
Fork大叔vip
· 1小时前
代码出身的养崽达人 看谁都想套利
回复0
ApeWithNoFearvip
· 23小时前
智能合约搞不定 这可咋混!
回复0
无常损失爱好者vip
· 23小时前
智能合约牛p个毛...其实就是个代码块
回复0
0xOverleveragedvip
· 07-12 17:14
不玩虚拟币 只交易期货 高杠杆才有意思
回复0
交易,随时随地
qrCode
扫码下载 Gate APP
社群列表
简体中文
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)