Solana 中的程序是什么?
在 Solana 中,程序(在其他链上称为智能合约)构成了所有链上活动的基础。任何开发人员都可以在 Solana 网络上编写和部署程序。从去中心化金融 (DeFi) 和非同质化代币 (NFT) 到社交媒体、区块链游戏,链上的一切都是由 Solana 程序驱动的。
Solana 的项目类型
一般来说,Solana 程序可以分为两种类型:
链上程序:这些是部署在 Solana 上的用户编写的程序,由开发人员针对 Solana 网络上的特定业务场景开发。它们可以通过升级权限进行升级,通常由部署程序的账户或其他指定账户持有。
原生程序:这些程序集成在 Solana 的核心模块中。它们提供验证器节点运行所需的基本功能。原生程序只能通过网络内的软件更新进行升级。常见的原生程序包括系统程序、BPF加载程序、投票程序和Solana 程序库 - SPL 。系统程序负责管理新账户的创建以及两个账户之间的 SOL 转移。Solana SPL程序定义了一系列链上活动,包括代币创建、交换、借贷、创建质押池、维护链上域名解析服务等。
Solana 程序的特点
Solana 程序模型的一个显著特点是代码和数据分离。程序存储在程序账户中,这些账户是无状态的,这意味着它们内部不存储任何状态。然而,它们是可执行的(executable ),并执行相应的逻辑。相反,它们操作所需的所有数据都存储在单独的数据账户中,这些账户在交易中作为对程序账户的引用传递。
Solana 中程序和状态分离的设计是许多进入 Solana 生态系统的以太坊开发人员最大的困惑之一。然而,这种设计带来了显着的好处:
- 程序可以独立于状态进行开发、测试、部署和升级,从而增强程序的可重用性和可扩展性。相比之下,在以太坊中,智能合约和状态紧密绑定在一起,升级合约是一项具有挑战性的任务,通常需要通过代理模式采用间接方式来实现逻辑和状态分离。在以太坊中,在新的智能合约中添加新变量时必须小心避免存储布局冲突和覆盖旧变量。
- 由于状态数据作为账户存储在网络上,因此可以方便地进行分片和并行处理,从而提高 Solana 网络的吞吐量和效率。
Solana 设计中程序和状态的分离提高了程序的可重用性和可扩展性,增强了网络的吞吐量和效率,使升级和维护更加容易。
如何编写程序
我们来看一个简单的 Solana 程序,这是一个用 Rust 编写的 hello-world 程序,用于记录一条简单的消息。通常,该程序写在lib.rs文件中:
// Importing dependencies for Solana programs2use solana_program::{ account_info::AccountInfo, entrypoint, entrypoint::ProgramResult, pubkey::Pubkey, msg }; // Program entry point11 entrypoint!(process_instruction); // Instruction processing logic pub fn process_instruction( program_id: &Pubkey, accounts: &[AccountInfo], instruction_data: &[u8] ) -> ProgramResult{ msg!("Hello, world!"); Ok(()) }
每个程序都有一个入口点,类似于Rust 中的main函数,指令执行从这里开始( process_instruction )。参数必须包括:
- program_id : pubkey (程序ID,程序的地址)
- accounts : AccountInfo数组,表示该指令涉及的账户集合。
- instructions_data :一个字节数组,表示该指令所需的参数。在本例中,它没有被使用。
在实际项目中,大多数程序都遵循模块化架构,以便功能划分更加清晰。典型的结构包括:
最近,Anchor已成为广受欢迎的 Solana 程序开发框架。它通过减少样板代码并简化序列化和反序列化来简化程序创建。在接下来的部分中,我们将专门介绍 Anchor。