1. 引言
前序博客有:
- zkMove——针对Move合约生态的zkVM
定位为高性能L1的Aptos和Sui,均采用Move合约编程语言。Solana也定位为高性能L1,但其采用Rust合约编程语言。本文重点对比Sui/Move和Solana/Rust合约编程语言。【Aptos/Move为不同的Move变种,有细微的差别。不过只要原生支持Move bytecode,则所有主要Move优势适于所有Move变种。】
2. Solana编程模型
Solana的智能合约编程模型是基于programs和accounts。Solana中,通常将智能合约称为“programs”。
- 1)programs(智能合约):定义交易中调用该program的处理逻辑。可在program调用中传入任意参数。program本身是stateless的,无法维护、读写任意状态。将program+account结合,可维护、读写状态。program调用由clients发起(通常是由web apps发起,也可自己手动发起直接调用)。
- 2)accounts:主要用于存储program state。programs会读写accounts,相应的数据可跨交易留存。每个account由其address(即为某Ed25519密钥对的公钥)唯一标识。accounts具有指定大小,且可存储任意数据。
此外,还有与每个account相关联的metadata,其中包含有关account的重要信息。program本身(可执行文件)也存储在account中,并具有address(称为program ID)。没有固有的结构来解释数据——从运行时的角度来看,它只是一个指定大小的字节数组。
可将Solana的account space看成是a global key-value store,其中key为account address,value为account data。program会对该key-value store进行读写。- account会维护balance和data,其中data为指定长度的byte数组。
- account具有“owner” field,owner为the Public Key of the program that governs the state transitions for the account。
Solana中的program是无状态的,需依赖account中的data数组来实现state transition:
- 1)Programs can only change the data of accounts they own.
- 2)Programs can only debit accounts they own.
- 3)Any program can credit any account.
- 4)Any program can read any account.
program分为:
- System Program
- User-defined Program:名为“Loader Program”的System program会加载user-defined program,并将相应account中的data标记为executable。
默认情况下,所有的accounts初始owner都为System program:
- 1)System Program is the only program that can assign account ownership.
- 2)System Program is the only program that can allocate zero-initialized data.
- 3)Assignment of account ownership can only occur once in the lifetime of an account.
注意:Solana中,client在发起program call时,需提前指定该调用中所访问的accounts,并确定是读还是读写相应的account。这对交易处理性能来说至关重要。由于runtime现在知道了每笔交易总哪些accounts会被modify,可规划可并行执行的non-overlapping transactions,从而保证数据一致性。这也是Solana具有高吞吐量的关键原因之一。所谓的“EVM doesn’t scale”,是指EVM无法对交易进行并行处理。更多关于Solana交易处理runtime可参看Anatoly Yakovenko 2019年博客Sealevel — Parallel Processing Thousands of Smart Contracts。
2.1 Solana安全模型
2.1.1 account ownership
Solana的account具有ownership的概念。每个account严格有且仅有一个program拥有。即意味着只有拥有该account的program才可对其进行修改。其它program无法对该account修改。account ownership信息存储在account的metadata中,且无法由user programs修改。
参考资料
[1] Klas 2022年9月博客 Smart Contract Development — Move vs. Rust
[2] 2022年9月 twitter Smart Contract Development — Move vs. Rust
[3] Klas 2022年7月博客 Solana for Non Smart Contract Developers