了解以太坊和 Solana 智能合约之间的区别。
您可以在 Solana 区块链上编写和部署程序。 程序(在其他协议中也称为智能合约)是从 DeFi 和 NFT 到社交媒体和游戏等链上活动的基础。
- 程序处理从用户或其他程序收到的指令。
- 所有程序都不维护状态。换句话说,程序使用的数据通过指令发送到单独的账户。
- 该程序本身存储在一个executable已检查的帐户中。
- 所有程序均归 BPF Loader 所有,并由 Solana Runtime 执行。
- 开发人员通常使用 Rust 或 C++ 编写程序。不过,任何针对 LLVM 和 BPF 后端的语言都可以选择。
- 所有程序都有一个单独的入口点,在此进行指令处理(即process_instruction)。始终包含以下参数:
- program_id: pubkey,
- accounts: array,
- instruction_data: byte array
与大多数其他区块链不同,Solana 将数据和代码完全分离。程序与之交互的所有数据都存储在单独的账户中,并通过指令进行调用。
这种模式允许综合单一程序通过各种帐户运行,而无需额外部署。这种模式的一个常见示例可以在 Native 和 SPL 程序之间看到。
本机程序和 Solana 程序库 (SPL)
Solana 有许多程序可作为链上交互的核心构建块。
这些程序分为本机程序和 Solana 程序库 (SPL) 程序。
原生程序提供运行验证器所需的基础功能。其中最著名的程序之一是System Program
,负责管理新账户并在两个组之间转移 SOL。
SPL 程序支持各种链上活动,包括代币创建、兑换、借贷、权益池生成和链上名称服务。SPL 代币程序可以直接通过 CLI 调用。其他程序(如关联代币帐户程序)通常配置为自定义程序
编写程序
程序通常用 Rust 和 C++ 开发。但是,您可以使用任何针对 LLVM 和 BPF 后端的语言进行开发。Neon Labs 和 Solang 最近的努力使 EVM 兼容性成为可能,允许开发人员用 Solidity 编写程序。
大多数基于 Rust 的程序遵循以下架构:
文件 | 描述 |
---|---|
lib.rs |
注册模块 |
entrypoint.rs |
程序的入口点 |
instruction.rs |
程序 API,指令数据(反)序列化 |
processor.rs |
程序逻辑 |
state.rs |
程序对象,(反)序列化状态 |
error.rs |
程序特定错误 |
最近,Anchor 已成为一种程序开发框架。Anchor 减少了样板代码并简化了(反)序列化处理,类似于 Ruby on Rails,但适用于基于 Rust 的程序。程序通常在 Localhost 和 Devnet 环境中开发和测试,然后部署到 Testnet 和 Mainnet。
Solana 支持以下环境:
集群环境 | RPC 连接 URL |
---|---|
主网测试版 | https://api.mainnet-beta.solana.com |
测试网 | https://api.testnet.solana.com |
开发网 | https://api.devtnet.solana.com |
本地主机 | 默认端口:8899(例如,http://localhost:8899) |
一旦部署到环境,客户端就可以通过与每个集群的 RPC 连接与链上程序进行交互。
部署程序
开发人员可以通过 CLI 部署程序,如下所示:
solana program deploy <PROGRAM_FILEPATH>
程序部署后,会被编译为 ELP 共享对象(包括 BPF 字节码)并上传到 Solana 集群。除非程序被标记为可执行并分配给 BPF 加载器,否则它们都存在于帐户内。帐户的地址用作 program_id在所有交易中引用程序的地址。
Solana 支持多个 BPF 加载器,包括最近的可升级 BPF 加载器。BPF 加载器负责管理程序帐户,并通过客户端的 program_id 实现这一点。
所有程序都有一个单独的入口点,在此进行指令处理(即 process_instruction)。参数始终包括:
- program_id: pubkey
- accounts: array
- instruction_data: byte array
一旦调用,程序就会由 Solana Runtime 执行。
概括
- Solana 中的程序对应于 Solana 区块链上的“可执行账户”。
- 以太坊中的智能合约概念与 Solana 中的程序概念一致。
- Solana 允许任何人发行代币,而无需部署额外的合约。