Skip to main content
QUICK REVIEW

[论文解读] Flint for Safer Smart Contracts

Franklin Schrans, Daniel Hails|arXiv (Cornell University)|Apr 13, 2019
Blockchain Technology Applications and Security参考文献 16被引用 12
一句话总结

Flint 是一种静态类型、领域特定的编程语言,专为在以太坊上编写安全、可验证的智能合约而设计。它通过保护块(基于类型状态的访问控制)、原子资产操作、非溢出算术运算以及默认不可变性来强制实现安全,防止常见的漏洞,如重入攻击、整数溢出和意外的资金损失,并支持形式化验证和编译器强制的正确性。

ABSTRACT

The Ethereum blockchain platform supports the execution of decentralised applications or smart contracts. These typically hold and transfer digital currency to other parties on the platform; however, they have been subject to numerous attacks due to the unintentional introduction of bugs. Over a billion dollars worth of currency has been stolen since its release in July 2015. As smart contracts cannot be updated after deployment, it is imperative that the programming language supports the development of robust contracts. We propose Flint, a new statically-typed programming language specifically designed for writing robust smart contracts. Flint's features enforce the writing of safe and predictable code. To encourage good practices, we introduce protection blocks. Protection blocks restrict who can run code and when (using typestate) it can be executed. To prevent vulnerabilities relating to the unintentional loss of currency, Flint Asset traits provide safe atomic operations, ensuring the state of contracts is always consistent. Writes to state are restricted, simplifying reasoning about smart contracts.

研究动机与目标

  • 解决自2015年以来已导致超过10亿美元损失的智能合约漏洞这一关键问题。
  • 设计一种编程语言,使编写不安全的智能合约在本质上变得不自然或不可能。
  • 为访问控制、原子状态更新和安全算术等安全模式提供原生语言级支持。
  • 将开发模式转向构建即安全,减少对部署后审计或运行时分析的依赖。
  • 支持形式化验证和工具链集成,使开发者能够编写正确、可预测且可维护的合约。

提出的方法

  • 引入保护块,通过类型状态建模有效执行序列,强制规定谁可以调用函数以及在何种合约状态下调用。
  • 定义原生的 Asset 类型用于以太币(Wei),确保转移、拆分和合并操作的原子性,防止余额不一致。
  • 默认情况下整数算术不会溢出,对于需要溢出行为的场景则提供显式循环操作符。
  • 强制默认不可变性和私有可见性,函数和变量必须显式声明才能可变。
  • 将循环限制为有限的 for-in 结构,消除无限循环漏洞。
  • 使用静态类型在部署前捕获类型错误,确保在编译时就保证正确性。

实验结果

研究问题

  • RQ1能否设计一种领域特定的编程语言,以防止常见的智能合约漏洞,如重入攻击、整数溢出和错误的状态转换?
  • RQ2如何将类型状态和访问控制集成到智能合约语言中,以强制执行正确的执行顺序和调用者授权?
  • RQ3原子资产操作在多大程度上可以消除合约余额会计中的不一致性?
  • RQ4默认不可变性和安全算术能否显著减少像 Solidity 这类语言中存在的攻击面?
  • RQ5将形式化安全保证集成到实用语言中,对开发人员生产力和代码正确性有何影响?

主要发现

  • Flint 通过基于类型状态的访问控制防止重入攻击,确保敏感操作仅在合约的有效状态下可调用。
  • 使用原生 Asset 类型确保所有转移操作都是原子且一致的,消除了与错误余额追踪相关的漏洞。
  • Flint 中的整数算术不会溢出;溢出时会抛出异常,从而防止静默数据损坏。
  • 该语言的默认不可变性和私有可见性使得在未显式声明的情况下无法意外引入可变状态,从而减少了攻击面。
  • 编译器强制所有状态更改均受限制且可预测,简化了对合约行为的推理。
  • 性能基准测试显示,Flint 编译后的代码与 Solidity 相当,即使未经过优化阶段,也表明其具备实际可行性。

更好的研究,从现在开始

从阅读论文到最终审阅,大幅缩短您的研究时间。

无需绑定信用卡

本解读由 AI 生成,并经人工编辑审核。