Solana是一种高性能区块链平台,旨在支持dApps,并以其速度和可扩展性而闻名。它通过独特的共识机制和架构设计实现这一目标。本文将以太坊作为比较对象,简要介绍Solana智能合约编程模型的特点。
智能合约在以太坊上运行,它是位于以太坊上特定地址的一系列代码和数据。它也是一个以太坊帐户,称为合约帐户。合约帐户有余额,可以作为交易对象,但无法被人操控,被部署在网络上作为程序运行。
而在Solana上运行的可执行代码被称为链上程序,它们能够解释每笔交易中发送的指令。这些程序可以直接部署到网络核心作为原生程序,或由任何人发布为SPL程序。
指令是Solana链上程序的特有名词。链上程序由指令组成,是执行特定操作的最小单位。每笔Solana交易中都包含一个或多个指令。指令指定了要执行的操作,包括调用特定链上程序、传递账户和输入列表,并提供字节数组。指令有计算限制,因此链上程序应该被优化为使用少量计算单元,或将昂贵的操作分成多个指令。
原生程序是提供验证节点所需功能的程序,其中最著名的是System Program,它负责管理创建新账户以及在两个账户之间转账SOL。
SPL程序定义了一系列链上活动,包括代币的创建、交换、借贷,以及创建质押池、维护链上域名解析服务等。其中,SPL Token Program用于代币操作,而Associated Token Account Program等则常用于编写其他定制程序。
Solana的智能合约和以太坊的智能合约都是指运行在区块链上的代码。它们的叫法不一样,但是指的是同一概念。就像张三、李四、王麻子都是人名一样,我们需要考察其他方面来评估他们的素质。
Solana和以太坊都是基于账户模型的区块链,但Solana提供了一套不同于以太坊的账户模型,以不同的方式存储数据。在Solana中,账户可以保存钱包信息和其他数据,包括Lamports(账户余额)、Owner(账户所有者)、Executable(是否为可执行账户)和Data(账户存储的数据)。每个账户都指定一个程序作为其所有者,以区分账户用作哪个程序的状态存储。这些链上程序是只读或无状态的,程序账户(可执行账户)只存储BPF字节码,不存储任何状态,程序会将状态存储在其他独立账户(不可执行账户)中,即Solana的编程模型将代码和数据解耦。
而以太坊账户主要是EVM状态的引用,其智能合约既存在代码逻辑,又需要存储用户的数据。这通常被认为是EVM历史遗留的设计缺陷。
不要小看这一区别!Solana智能合约在根本上比具有耦合编程模型的区块链(如以太坊)更难攻击。在以太坊中,智能合约的拥有者是一个全局变量,与智能合约一一对应。因此,调用某个函数可能直接改变合约的拥有者。而在Solana中,智能合约的拥有者是与账户关联的数据,而不是全局变量。一个账户可以有多个拥有者,而不是一对一关联。攻击者要利用智能合约的安全漏洞,不仅需要找到有问题的函数,还需要准备正确的账户来调用该函数。这一步骤并不容易,因为Solana智能合约通常涉及多个输入账户,并通过约束条件来管理它们之间的关系。从准备正确的账户到发动攻击的过程足够让安全监控人员可以在攻击之前主动检测到创建与智能合约相关的虚假账户的可疑交易。
以太坊的智能合约就像是一个使用唯一密码的保险库,你只要得到了这个密码,就能获得完整的所有权。而Solana的则是一个有很多个密码的保险库,但想要获取权限,你不但要想办法搞到密码,还要弄清楚这个密码对应的编号,才能把锁打开。
Solana上开发智能合约的主要编程语言是Rust。由于其性能和安全特性,Rust适用于区块链和智能合约的高风险环境。Solana还支持C、C++和其他语言。官方提供了Rust和C的SDK来支持开发链上程序。开发者可以使用工具将程序编译成Berkley Packet Filter(BPF)字节码,然后部署到Solana链上,通过Sealevel并行智能合约运行时来执行智能合约的逻辑。
由于Rust语言本身上手难度高,并不是为区块链开发定制,导致很多需求需要重复造轮子、代码冗余。许多新创造的专用于区块链开发的编程语言是基于Rust的,如Cairo(Starknet)和Move(Sui、Aptos)。
而以太坊智能合约主要使用Solidity语言开发。由于语法相对简单以及开发工具更加成熟,通常认为以太坊的开发体验更简单爽快,而Solana的开发上手难度更高。尽管现在Solana很火,但事实上以太坊的开发者数量仍然远多于Solana。
特定路况下,顶级赛车没有改装车跑得快。Rust就像顶级赛车,有力地保证了Solana的性能和安全性,但并非为链上程序开发而生,反而增加了开发难度。采用基于Rust、为链上开发定制语言的公链则相当于改装了这辆赛车,使其更适应路况。在这一点上,Solana处于劣势。
总结一下,Solana的智能合约编程模型是创新的。它提供了一种无状态的智能合约开发方法,使用Rust作为主要编程语言,并采用将逻辑与状态分离的架构。这为开发人员构建和部署智能合约提供了强大的环境,确保安全性和性能,但开发难度较大。对于寻求创建高性能dApps的开发人员来说,Solana仍然是目前的理想选择。
参考链接:
https://solana.com/docs
https://ethereum.org/en/developers/docs
https://www.anchor-lang.com/