文章详细介绍了 Solana 区块链中缺少的一些功能,如 fallback
和 receive
函数、view
和 pure
函数,以及 Solidity 中的自定义修饰符和单位在 Rust 中的缺失。此外,文章还讨论了 Solana 中读取账户数据的方式和防止重入攻击的策略。
Solana 交易必须预先指定它将修改或读取的账户作为交易的一部分。如果“fallback”函数访问了一个不确定的账户,那么整个交易将失败。这将使用户不得不预测 fallback 函数将访问的账户。因此,直接不允许这种类型的函数更为简单。
Solidity 中的“view”函数通过两种机制保证状态不会改变:
纯函数更进一步,编译器会检查是否存在查看状态的操作码。
这些函数限制主要发生在编译器层面,而 Anchor 没有实现任何这些编译器检查。Anchor 并不是构建 Solana 程序的唯一框架。Seahorse 是另一个框架。也许其他框架会带有明确说明函数可以做什么和不能做什么的函数注解,但目前我们可以依赖以下保证:如果某个账户未包含在 Context 结构体定义中,该函数将不会访问该账户。
这并不意味着该账户完全无法被访问。例如,我们可以编写一个单独的程序来读取账户,并以某种方式将该数据转发给相关函数。
最后,Solana 虚拟机或运行时中没有 staticcall
这样的东西。
因为 Solana 程序可以读取传递给它的任何账户,所以它可以读取另一个程序拥有的账户。
拥有账户的程序不需要实现 view 函数来允许另一个程序查看该账户。web3 js 客户端或其他程序可以直接查看 Solana 账户数据。
这有一个非常重要的含义:
无法使用重入锁来直接防御 Solana 中的只读重入。程序必须为读者暴露一个标志,以知道数据是否可靠。
只读重入发生在受害合约访问显示被操纵数据的 view 函数时。在 Solidity 中,可以通过在 view 函数中添加 nonReentrant 修饰符来防御。然而,在 Solana 中,无法阻止另一个程序查看账户中的数据。
然而,Solana 程序仍然可以实现重入防护使用的标志。消费另一个程序账户的程序可以检查这些标志,以查看账户是否可能处于重入状态,从而不应被信任。
像 onlyOwner
或 nonReentrant
这样的自定义修饰符是 Solidity 的构造,而不是 Rust 中可用的功能。
由于 Solidity 与以太坊紧密相关,它有方便的像 ethers
或 wei
这样的关键字来衡量以太币。不出所料,LAMPORTS_PER_SOL
在 Rust 中没有定义,但让人有些惊讶的是,它在 Anchor Rust 框架中也没有定义。不过,它在 Solana web3 js 库中是可用的。
同样,Solidity 中有 days
作为 84,600 秒的方便别名,但在 Rust/Anchor 中没有这样的等价物。
这是下一个教程的主题。
请参阅我们的 Solana 开发课程 以获取下一章。
最初发布于 2024 年 3 月 1 日
- 原文链接: rareskills.io/post/solid...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!