在Solidity编程世界中,生存与进化都离不开三个关键词:安全、可复用、高效。

  1. 上链的原则
    1. 需要分布式协作的重要数据才上链,非必需数据不上链;

    2. 敏感数据脱敏或加密后上链(视数据保密程度选择符合隐私保护安全等级要求的加密算法); 

    3. 链上验证,链下授权。

  2. 精简函数变量
    1. EVM所设计用于最大的栈深度为16。建议:使用结构体或数组来封装入参或返回值,达到减少栈顶元素使用的目的
  3. 保证参数和行为符合预期
    1. 如果不严谨地检查智能合约输入参数或行为,有可能会触发一些意想不到的bug。
    2. 建议:在编写智能合约时,一定要注意对合约参数和行为的检查,尤其是那些对外部开放的合约函数。Solidity提供了require、revert、assert等关键字来进行异常的检测和处理。一旦检测并发现错误,整个函数调用会被回滚,所有状态修改都会被回退,就像从未调用过函数一样。
  4. 严控函数的执行权限
    1. 如果说智能合约的参数和行为检测提供了静态的合约安全措施,那么合约权限控制的模式则提供了动态访问行为的控制。
    2. 由于智能合约是发布到区块链上,所有数据和函数对所有参与者都是公开透明的,任一节点参与者都可发起交易,无法保证合约的隐私。因此,合约发布者必须对函数设计严格的访问限制机制。

    3. Solidity提供了函数可见性修饰符、修饰器等语法,灵活地使用这些语法,可帮助构建起合法授权、受控调用的智能合约系统。

  5. 抽象通用的业务逻辑
    1. 参考单一职责的编程原则,使合约无法将所有代码专注在自身业务逻辑中。抽象出可复用的功能,利用Solidity的继承机制继承最终抽象的合约。
  6. 预防私钥的丢失
    1. 在区块链中调用合约函数的方式有两种:内部调用和外部调用。

    2. 出于隐私保护和权限控制,业务合约会定义一个合约所有者。假设用户A部署了FruitStore合约,那上述合约owner就是部署者A的外部账户地址。这个地址由外部账户的私钥计算生成。

    3. 但是,在现实世界中,私钥泄露、丢失的现象比比皆是。一个商用区块链DAPP需要严肃考虑私钥的替换和重置等问题。

    4. 这个问题最为简单直观的解决方法是添加一个备用私钥。这个备用私钥可支持权限合约修改owner的操作,代码如下:

  7. 面向接口编程
  8. 合理预留事件
  9. 遵循安全编程规范
  10. 积累和复用成熟的代码
  11. 提升存储和计算的效率
  12. 保证合约可升级
Logo

为所有Web3兴趣爱好者提供学习成长、分享交流、生态实践、资源工具等服务,作为Anome Land原住民可不断优先享受各种福利,共同打造全球最大的Web3 UGC游戏平台。

更多推荐