智能合约安全准则
solidity智能合约安全性
中级遵循这些高级建议,构建更安全的智能合约。
设计准则
编写代码之前,务必先讨论行智能合约的设计。
文档和规范
文档可以在不同级别编写,在执行合约时应进行更新:
- 系统的简要英文描述,描述合约的行为和所使用的代码库
- 数据模型和架构图,包括合约的交互概述图和系统的状态转换图。 可以使用Slither 打印机生成相关图示。
- 完整的代码文档, 可以为 Solidity 使用Natspec 格式。
链上计算与链下计算
- 保持尽可能多的链下代码。 保持链上代码层的最小化。 用链下代码的方式对数据进行预处理,使链上验证变得简单。 是否需要已排序列表? 在链下对列表进行排序,然后在链上只检查其顺序。
升级
我们在我们的博客文章中讨论了不同的升级解决方案。 在编写任何代码之前,请慎重选择是否支持可升级性。 该决定将影响您如何构建我们的代码。 一般来说,我们建议:
- 优先考虑合约迁移而不是可升级性。迁移系统有许多与可升级系统相同的优点,不存在缺陷。
- 使用数据分离模式而不是 delegatecallproxy 模式。如果您的项目有明确的抽象分离,则使用数据分离的可升级性只需要进行一些调整。 delegatecallproxy 需要 EVM 专业知识,并且非常容易出错。
- 在部署前记录迁移/升级程序。如果您不得不在没有任何指导的情况下在压力下做出反应,您就会犯错。 提前写好要遵循的程序。 其中应包括:
- 启动新的智能合约的调用
- 密钥存放在哪里以及如何获取它们
- 如何检查部署! 开发和测试部署后的脚本。
实施指南
力求简洁。 尽可能使用最简单的解决方案来实现您的目的。 所有的团队成员都应当能够理解解决方案。
功能组成
使用便于检查的代码库架构, 避免选择不利于正确性验证的架构。
- 通过多个合同或将相似的功能组合在一起(例如,身份验证、算术等)来拆分您的系统逻辑。
- 编写小的函数,并且目的明确。这将便于审查并允许对单个组件进行测试。