这篇文章深入探讨了 Solana 上的闪电贷实现方式,重点介绍了如何利用指令自省(Instruction Introspection)和指令系统变量(Instructions Sysvar)实现“预读”机制。文章还详细列出了一个关键的安全检查清单,以防范还款欺骗等风险。

Solana 上的闪电贷:实现与安全
概述:
闪电贷是 DeFi 的基石。在本文中,我们将探讨如何在 Solana 上使用指令自省(Instruction Introspection)来实现闪电贷,如何通过 Instructions Sysvar 实现“前瞻”机制,以及为防止还款欺骗(repayment spoofing)我们必须验证的关键安全检查清单。
闪电贷是一种无抵押贷款,仅存在于单个交易的生命周期内。
核心不变性原则很简单:交易必须在借贷池的保险库(vault)满足 final_balance >= initial_balance + fee 的条件下完成。否则,交易将回滚(reverts)。
在 EVM 上,闪电贷使用回调(callbacks)。合约将资金发送给借款人合约,触发该合约中的一个特定函数,并等待借款人合约返还资金。
Solana 的运作方式不同。由于 Solana 的跨程序调用(Cross Program Invocation, CPI)深度限制(目前上限为 4)及其严格的前置账户要求,这种回调实现是不切实际的。
Solana 不使用回调,而是使用指令自省(Instruction Introspection)。它利用了 Instructions Sysvar (Sysvar1nstructions11111...),这是一个内置系统账户,提供了整个交易的只读视图。
通过访问此账户,程序可以有效地“前瞻”扁平化的指令序列。它可以在释放资金之前,验证同一交易中稍后是否已经捆绑了一个有效的还款指令。

Solana 交易中的指令序列。
为了执行这种链上“前瞻”,程序可以使用 sysvar::instruction 模块中的两个核心函数:
load_current_index_checked:这会获取当前正在执行指令(即“借款”指令)的索引。
load_instruction_at_checked:使用上述索引。我们可以向前循环并加载每个后续指令的数据。
指令加载后,我们必须对其进行验证,以确保它不是恶意的。

找到还款指令只是第一步。如果你正在构建或审计 Solana 闪电贷,仅仅找到指令是不够的——你必须深入检查其内容,以防止还款欺骗。
CPI 守卫:确保程序不是通过跨程序调用(CPI)被调用的。检查 Current Stack Height == 1 以确认指令正在交易的顶层执行,而不是嵌套在另一个程序的 CPI 调用中。
程序 ID 和鉴别器:确保指令确实属于你的程序,并与 8 字节的 PAYBACK 鉴别器(discriminator)匹配。
严格账户验证:验证指令的账户与预期的保险库账户完全匹配。
金额验证:确保还款金额 >= 借款金额 + 费用。
全局状态锁(重入守卫):在借款阶段设置一个 is_flashloan_active 标志。这可以防止指令级别的重入(reentrancy),确保攻击者在贷款偿还之前无法读取或操纵被扭曲的池状态。
借款-还款配对:确保每个借款指令恰好映射到一个唯一的还款指令。如果没有这一点,攻击者可能会捆绑两次借款但只还款一次——一个简单的向前扫描会将单个还款匹配到第一次借款,从而使第二次借款实际上是免费的。
总结:Solana 闪电贷使用指令自省进行前瞻。找到还款指令只是第一步——如果没有严格的验证,还款就可能被欺骗。
感谢你的阅读!希望它为你带来了价值。如果你有任何反馈、问题或见解,请随时在评论中分享。关注我,获取更多技术深度探讨和智能合约审计内容。🚀
- 原文链接: x.com/4lifemen/status/20...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!