智能合约安全新范式,超越 `require`和`assert`

本文介绍了智能合约安全的新范式——FREI-PI模式,强调超越简单的`require`和`assert`,通过关注协议级别的不变性来提升安全性。文章通过Euler Finance的攻击案例,解释了为何检查-生效-交互模式不足以确保安全,提出功能检查-生效-交互+协议不变性(FREI-PI)模式,强调以实体为中心的不变性管理和预言机安全。此外,文章讨论了Uniswap的安全性源于其简单的核心不变性,并提醒开发者重视核心不变性,确保其不被破坏。
摘要由CSDN通过智能技术生成

智能合约安全新范式,超越 require_assert

摘要

不要只为特定的函数写 require 语句;为你的协议写 require 语句。函数遵循检查(requirements)-生效(Effects)-交互(INteractions)+协议不变性(Invariants)或 FREI-PI 模式可以帮助你的合约更加安全,因为它迫使开发人员除了关注函数级别的安全之外,还要关注协议级别的不变性。

动机

2023 年 3 月,Euler Finance 被黑客攻击,损失 2 亿美元。Euler Finance 是一个借贷市场,用户可以存入抵押品并以其为抵押进行借款。它有一些独特的功能,实际上他们是一个可与 Compound Finance 和 Aave 媲美的借贷市场。
你可以阅读关于这个黑客的事后总结这里。它的主要内容是在一个特定的函数中缺少健康检查,允许用户打破借贷市场的基础不变性。

基础不变性(Fundamental Invariants)

大多数 DeFi 协议的核心都有一个不变性,即程序状态的一个属性,它被期望永远是真的。也可能有多个不变性,但一般来说,它们是围绕着一个核心思想建立的。这里是一些例子:

  • 如在借贷市场中:用户不能采取任何行动,使任何账户处于不安全或更不安全的抵押品仓位("更不安全"意味着它已经低于最低安全阈值,因此不能进一步提取)。
  • AMM DEX 中:x * y == k,x + y == k,等等。
  • 流动性挖矿抵押中: 用户应该只能提取他们存入的抵押代币数量。

Euler Finance 出错的地方不一定是他们增加了功能,没有写测试,或者没有遵循传统的最佳实践。他们对升级进行了审计,并有测试,但还是被漏掉了。核心问题是他们忘记了借贷市场的核心不变性(审计人员也是如此!)。
注:我不是要挑刺 Euler,他们是一个有才华的团队,但这是一个最近的案例。

问题的核心

你可能在想 “嗯,没错。这就是他们被黑的原因;他们忘了一个 require 语句”。是也不是。
为什么他们会忘记 require 语句呢?

检查-生效-交互 不够好

推荐给 solidity 开发者使用的一个常见模式是 Checks-Effects-Interactions(检查-生效-交互)模式。它对于消除与重入有关的错误非常有用,而且通常会增加开发人员去执行输入验证的的数量。但是,它容易出现只见树木不见森林的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值