惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LINUX DO - 最新话题
G
Google Developers Blog
J
Java Code Geeks
The GitHub Blog
The GitHub Blog
F
Full Disclosure
H
Help Net Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Vercel News
Vercel News
酷 壳 – CoolShell
酷 壳 – CoolShell
Recent Announcements
Recent Announcements
Help Net Security
Help Net Security
The Hacker News
The Hacker News
IT之家
IT之家
Y
Y Combinator Blog
Martin Fowler
Martin Fowler
L
Lohrmann on Cybersecurity
C
CERT Recently Published Vulnerability Notes
V
Visual Studio Blog
博客园 - 聂微东
Hacker News: Ask HN
Hacker News: Ask HN
H
Hacker News: Front Page
Know Your Adversary
Know Your Adversary
Security Latest
Security Latest
Security Archives - TechRepublic
Security Archives - TechRepublic
Simon Willison's Weblog
Simon Willison's Weblog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Troy Hunt's Blog
Last Week in AI
Last Week in AI
Schneier on Security
Schneier on Security
N
News and Events Feed by Topic
博客园 - 【当耐特】
有赞技术团队
有赞技术团队
AWS News Blog
AWS News Blog
Blog — PlanetScale
Blog — PlanetScale
博客园_首页
Google DeepMind News
Google DeepMind News
Cloudbric
Cloudbric
N
News | PayPal Newsroom
A
About on SuperTechFans
S
Schneier on Security
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Hugging Face - Blog
Hugging Face - Blog
M
MIT News - Artificial intelligence
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
雷峰网
雷峰网
T
The Exploit Database - CXSecurity.com
罗磊的独立博客
K
Kaspersky official blog
The Cloudflare Blog
I
Intezer

奶爸博客

哪吒监控破10k星,却曝出1年严重漏洞!AI安全威胁已不是隐患,而是现实危机 当 AI 接管了「活儿」,我们该如何接管「工作」? 2025 年终总结 CloudCode 云端多实例 OpenCode 管理工具 Bonds 个人关系管理工具 博客RSS订阅者跟踪/主题系统重构 博客评论语言自动检测及邮件阅读追踪 玩转Switch,派对与运动 玩转安卓TV,无广告畅快观影 玩转域名,如何选择和注册 玩儿 博客重建 · 开博寄语 Vibe coding 企业级智能合约管理实践 \u0026 AI 漫谈 闲聊第二次买房 惊事录:与优秀的人一同成长 2024 年终总结 自惭形秽 胜诉 · 还是起诉了 OCBC 关户提取资金及注册美区 PayPal 的妙招
Solana 合约开发
奶爸 · 2025-03-25 · via 奶爸博客

· 更新于 · v1 · 269 · 2


目录
  1. 1. 小提示 Tips
    1. 1.1. CPI 调用
    2. 1.2. Out of memory
    3. 1.3. PDA
  2. 2. 安全检查 Security Checklist
    1. 2.1. realloc 陷阱
    2. 2.2. bump 陷阱
    3. 2.3. writable 陷阱

最近进行了大量 Solana 智能合约开发,积累了一些经验,分享给大家。

小提示 Tips

CPI 调用

在进行 CPI 调用时可能会遇到 account infos 超出数量限制的问题,可以在 CPI 调用之前对 account infos 进行去重合并 AccountMeta 数据,instruction 的 accounts 还是传原始数量的 accounts,因为 CPI 调用的 keys 限制只针对于 account infos,去重后一般不会超限。

Out of memory

Solana VM 堆内存限制 32K,栈内存限制 4K。

当执行期间 program 报错 out of memory 一般是栈内存溢出,这种错误可以给你的 context 里面的 account 数据放到 box 里面讲内存转移到堆中,或者使用 anchor 0.31.0 开始有的 LazyAccount 来加载 account。

错误信息中含内存地址 0xfffff 之类的报错一般是堆内存溢出,这种错误只能重构合约,比如说你有个超大 account 需要加载,放到堆里也放不下,可以用 zero_copy 方案重构下。

可以着重注意用到 vec 的地方,可以确定长度的 vec 在初始化时就分配长度,避免 2 倍扩容。

PDA

PDA 是十分灵活的,任何属于当前 program 的 PDA 都可以在 program 内作为 signer 进行 CPI 调用。这里有一个特殊的点就是假设你需要通过 SystemProgram 通过代码而不是 anchor 来创建和初始化账户,你可将 pda 作为 new_account 并作为 signer 调用 SystemProgram::CreateAccount,而不是必须使用 anchor 来创建 PDA。

安全检查 Security Checklist

realloc 陷阱

PDA 账户每次增长的空间只能在 10240 内,我们在 realloc PDA 账户时可以从 10240 扩容到 20480,然后从 20480 扩容到 30720,这没关系,咱们的数据不会出现问题。但是不要忽略一点,如果账户被缩小呢?realloc 可以直接从 30720 降到 100,PDA 中储存的数据就会被回收,造成安全问题。所以在使用外部传入的 realloc::size务必小心

bump 陷阱

同样的 seeds 可以通过不同的 bump 创建出多个相同 seed 的账户,比如说 seed seed = ["nonce_used", order_id, [args.bump]] 可以通过计算出多个 seed 相同但是 bump 不同的账户来,如果你的合约中用的是外部传入的 bump 会导致你的一些以来这个 account 的逻辑有安全风险。在使用外部传入 bump务必小心。尽量不要外部传入 bump,除了每次运行时计算还可以使用自己存到合约中的通过 Pubkey::find_program_address 生成的 bump 来优化 gas。

writable 陷阱

即便你在合约里面没有将 account 标记为 account(mut) 但是在交易构造时传递的 AccountMeta 是可写的,且你的账户的 owner 是 signer,你的账户就会在执行时可写,所以如有必要检查你的 account 在 CPI 调用前后的变化。