关于智能合约:为什么 Solana 更安全?
虽然 Solana 的核心运行时仍在快速开发中,但其智能合约的设计已经相当稳定。在这篇文章中,从智能合约的角度解释为什么 Solana 比以太坊更安全。
在高层次上,有两个主要原因:
首先,Solana 的编程模型将代码和数据解耦。这很重要,因为它使 Solana 智能合约从根本上比具有耦合编程模型的区块链(如以太坊)更难攻击。
其次,Solana 的执行模型(尤其是各种执行约束的设计)排除了重入等一大类攻击;同时它允许比以太坊更透明的实时监控和更全面的安全防御。
1. 代码和数据解耦带来更好的安全性
考虑一个包含任意安全漏洞的智能合约,比如说,它有一个漏洞函数 X,允许攻击者更改智能合约的 owner
。在以太坊中,owner
是一个与智能合约一一关联的全局变量,调用 X 会直接改变 owner
。
在 Solana 中,owner
是与帐户相关联的一段数据,而不是与智能合约相关联的数据。并且 owner
不是全局的,但可以有许多帐户和 owner
。要更改 owner
,调用 X 时必须提供 正确 帐户。
换句话说,为了利用这个安全漏洞,攻击者不仅要找到有漏洞的函数 X,还要准备好调用 X 的 正确 帐户。
实际上,准备 正确 帐户并非易事,因为 Solana 智能合约通常处理多个输入帐户并通过约束来强制执行它们的“关系”,例如 account1.owner==account2.key
。攻击者必须准备好所有这些输入账户并满足它们的所有约束,这通常需要通过额外的交易来创建“假”账户(这个难度几乎不可能)。
重要的是,从“准备正确的账户”到“发起攻击”的差距允许安全监控器主动检测在攻击前创建与智能合约相关的“虚假”账户的可疑交易。
攻击 Solana 智能合约通常需要两个阶段:账户准备和攻击执行。第一阶段可以通过链上监控来检测,从而有时间限制第二阶段。
2. 约束执行带来更好的安全性
Solana 运行时在事务级别强制执行各种约束,例如:
- 不能超过 4 个级别的跨程序调用 (CPI)
- 会计规则,例如,只有账户的所有者可以更改账户的数据,并且只有当账户是可写且不可执行的
Solana 的 CPI 设计基本上消除了重入攻击的可能性。而以太坊依赖应用级状态来限制重入,这很容易出错。
3. 透明执行带来更好的安全性
日志记录可以实时观察智能合约的运行时行为,这是细粒度安全监视器的构建块。Solana 允许的链上日志记录比以太坊(msg!
vs emit
)多几个数量级。
以太坊上的日志记录很昂贵。单个日志记录操作 (emit
) 会花费数百甚至数千个 gas
(参见 doc)。
相比之下,Solana 上的日志记录很便宜(系统调用需要 100 个计算单元)。考虑到 1.4M
的最大计算预算,一个 Solana 事务可以允许数以万计的日志记录操作。
即使不考虑 gas 价格,以太坊智能合约由于其 gas 限制也无法进行大量日志记录(这解释了为什么在以太坊上很少进行日志记录)
与以太坊相比,密集的日志记录能力使 Solana 承诺采用更全面的安全防御来抵御攻击。