Rust 与 Solana 中的可见性及模块化复用

0xE 发布于 2025-03-24 阅读 2754

本文将探讨如何在 Rust 和 Solana 中实现类似 Solidity 的函数可见性,以及如何通过模块化复用来模拟“继承”。

本文将探讨如何在 Rust 和 Solana 中实现类似 Solidity 的函数可见性,以及如何通过模块化复用来模拟“继承”。Solidity 中有四种函数可见性:

  • public:合约内外均可访问。
  • external:仅限合约外部访问。
  • internal:合约内部及继承合约可访问。
  • private:仅限合约内部访问。

我们将在 Solana 中实现类似功能。


公共函数

之前教程中定义的所有函数默认是公共的:

pub fn my_public_function(ctx: Context<Initialize>) -> Result<()> {
    Ok(())
}

使用 pub 关键字标记函数为公共。在 #[program] 模块内,所有函数必须声明为 pub,否则无法编译。


无需区分 public 与 external

在 Solana 中,程序内部调用自身公共函数并不常见。因此,pub 函数更接近 Solidity 的 external 函数。若需在程序内部调用,建议将逻辑封装为私有函数,再由公共函数调用。


私有与内部函数

虽然 #[program] 模块内的函数必须是 pub,但文件或模块级别可以定义非 pub 函数。示例:

use anchor_lang::prelude::*;

declare_id!("F26bvRaY1ut3TD1NhrXMsKHpssxF2PAUQ7SjZtnrLkaM");

#[program]
pub mod func_test {
    use super::*;

    pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
        let u = get_a_num(); // 调用私有函数
        msg!("{}", u);
        Ok(())
    }
}

fn get_a_num() -> u64 { // 文件级私有函数
    2
}

#[derive(Accounts)]
pub struct Initialize {}

说明:get_a_num 未使用 pub,仅在文件内可见。

Rust 不是面向对象语言,没有 Solidity 的“类”概念,可见性通过模块系统管理,详见 Rust 文档 - 可见性与隐私

内部函数

内部函数在模块及其子模块或导入它的模块中可见:

use anchor_lang::prelude::*;

declare_id!("53hgft52DHUKMPHGu1kusuwxFGk2T8qngwSw2SyGRNrX");

#[program]
pub mod func_visibility {
    use super::*;

    pub fn initialize(_ctx: Context<Initialize>) -> Result<()> {
        some_internal_function::internal_function(); // 调用内部函数
        Ok(())
    }

    pub mod some_internal_function {
        pub fn internal_function() { // 模块内公开
            // 内部逻辑
        }
    }
}

mod do_something {
    use crate::func_visibility;
    pub fn some_func_here() {
        func_visibility::some_internal_function::internal_function();  // 外部访问
    }
}

#[derive(Accounts)]
pub stru...

剩余50%的内容订阅专栏后可查看

该文章收录于
Solana 学习开发之旅
39 订阅 38 篇内容

0 条评论