Solidity安全贴士(一)

开发前的准备

基本理念

  • 开发智能合约需要一个全新的工程思维,它不同于我们以往项目的开发,因为一旦它出错将付出巨大的代价,并且很难像传统软件那样轻易的打上补丁。就像直接给硬件编程或金融服务类软件开发,相比于web开发和移动开发都有更大的挑战。所以不能够仅仅防范已知的安全漏洞。

    • 预知错误:
      • 代码必须能够正确的处理出现的bug和漏洞。当智能合约出现错误时,停止合约,管理账户的资金风险(限制(转账)速率、最大(转账)额度)。
    • 谨慎发布智能合约:
      • 尽量在正式发布智能合约之前发现并修复可能的bug。对智能合约进行彻底的测试,并在任何新的攻击手法被发现后及时的测试。阶段性发布,每个阶段都提供足够的测试。
    • 保持智能合约的简洁:
      • 复杂会增加出错的风险。
    • 保持更新:
      • 尽可能快的将使用到的库或者工具更新到最新
      • 使用最新的安全技术
    • 清楚区块链的特性:
      • 小心针对外部合约的调用,因为你可能执行的是一段恶意代码然后被更改控制流程。
      • 如果你的public function是公开的,那么它就可以被恶意调用。(在以太坊上)你的private data也是对他人可见的。
      • 时刻记住gas(旷工的佣金)的花费和用户愿意支付的gas最大量
  • 简单与复杂的权衡

    • 一个理想的智能合约首先需要模块化,能够重用代码而不是重复编写,并且支持组件升级。从智能合约安全架构的角度出发同样如此,模块化和重用被严格审查检验过的合约是最佳策略,特别是在复杂智能合约系统里。
    • 但是以下几点中需要针对智能合约系统的特点找到最优的方式来达到平衡 :
      • 死板的/可升级的
        • 对于智能合约来说,延展性和安全之间需要基本权衡。延展性会增加程序复杂性和潜在的攻击危险。对于那些只在特定的时间段内提供有限的功能的智能合约,死板的代码比可升级的显得更加高效,比如无管治功能,有限短期内使用的代币发行的智能合约系统。
      • 一体化的/模块化的
        • 一体化的独立的智能合约把所有的变量和模块都放到一个合约中。尽管只有少数几个大家熟知的智能合约系统真的做到了一体化,但是将数据和流程都放到一个合约中还是享有部分优点–比如,提高代码审核(code review)效率。
      • 重复的/可重用的
        • 对于以前部署的智能合约不可重用时使用重复的代码还是很需要的。现在Live Libs 和Zeppelin Solidity 提供的安全智能合约组件,使其能够被重用而不需要每次都重新编写。任何合约安全性分析都必须标明重用代码,特别是以前没有建立与目标智能合同系统中处于风险中的资金相称的信任级别的代码。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值