本文讨论了以太坊智能合约与Solana程序之间的关键区别,特别是在代码与数据的耦合与解耦方面,并介绍了Solana程序中常见的两种安全漏洞。这些问题的存在使得Solana程序在性能与安全性之间面临挑战,同时提供了相关的解决建议和资源。
以太坊是一个众所周知的区块链,支持“图灵完备”的智能合约。Solana是一个快速增长的区块链,也支持智能合约——称为Solana程序,且在每秒交易量和成本方面似乎优于以太坊。
为什么Solana程序比以太坊智能合约更快?它们之间的关键区别是什么?本文解释了两者之间的一个基本差异,并说明了Solana程序中两个常见的安全陷阱。
在计算机程序中,总是有两件事:(1)代码——由计算机的CPU、GPU或其他计算单元执行的指令;(2)数据——传递给代码的输入或程序的状态,由代码处理。以太坊和Solana之间一个重要的区别是在智能合约中如何表示代码和数据。
在以太坊中,数据和代码是耦合在一起的。 以太坊中的智能合约包含代码和由代码处理的数据。例如,在下面用Solidity编写的Ownable合约中,状态变量_owner是数据,函数owner()是代码。这种耦合设计为编写智能合约提供了直观的方式,同时也使代码易于理解。然而,这使得以太坊难以实现高性能,因为每个智能合约只有一份状态副本,所有触及同一状态的交易必须按顺序执行。这正是Solana所解决的问题。
在Solana中,数据和代码是解耦的。 Solana程序仅包含代码,而不包含数据。所有数据作为输入提供给Solana程序。例如,在下面用Rust编写的Solana hello-world程序中,函数process_instruction是代码,而状态变量counter是账户的数据,由输入传递给该函数。
这种解耦设计使得实现高性能成为可能,因为它允许在不同输入上并行执行多个Solana程序的副本。换句话说,来自不同用户账户的交易可以并行运行到同一个Solana程序。这解释了为什么Solana可以实现惊人的50000 TPS。
然而,缺点是编写Solana程序比编写以太坊智能合约更困难,无论语言差异如何(例如,Rust与Solidity)。特别是,Solana程序开放了以太坊智能合约中不存在的新攻击面,因为输入账户可能不受信任。接下来,我们将说明Solana程序中两个常见的安全陷阱:_缺少所有者检查_和缺少签名检查。
在Solana中,由于所有账户在调用Solana程序时作为输入提供,用户可以提供任意账户,因此没有内置机制来阻止恶意用户用虚假数据这样做。因此,Solana程序必须检查输入账户的有效性。
我们使用Solana程序库中的函数process_set_lending_market_owner来说明这些检查的重要性。
来自Solana程序库的示例代码
上述函数用于将lending_market的所有者更新为new_owner。有两种类型的检查:所有者检查和签名检查。缺少其中任何一个可能导致函数暴露于攻击。
所有者检查(第178行):
第178行的所有者检查确保lending_market_owner_info账户是lending_market的当前所有者。如果这个检查被遗漏,那么一个不是所有者的用户也可能成功更改lending_market的所有者。
签名检查(第182行):
第182行的签名检查确保lending_market_owner_info账户(已经通过了第178行的所有者检查)具有签名。否则,如果这个检查被遗漏,攻击者可以简单地将有效的lending_market_owner_info作为输入提供给函数(因为攻击不需要为账户签名),然后将lending_market的所有者设置为攻击者选择的任何new_owner。
除了这两个检查之外,在Solana程序中还有其他几种常见陷阱。关于这些陷阱的总结可以在Neodyme近期的博客中找到。根据Neodyme,审计这些常见陷阱防止了价值十亿资产的损失。
X-Ray是一款新的安全工具,可以自动扫描Solana程序中的常见陷阱。
访问sec3的所有博客,请访问https://www.sec3.dev/blog
- 原文链接: sec3.dev/blog/from-ether...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!