区块链-智能合约-编程攻略
在Solidity编程世界中,生存与进化都离不开三个关键词:安全、可复用、高效。上链的原则需要分布式协作的重要数据才上链,非必需数据不上链;敏感数据脱敏或加密后上链(视数据保密程度选择符合隐私保护安全等级要求的加密算法);链上验证,链下授权。精简函数变量EVM所设计用于最大的栈深度为16。建议:使用结构体或数组来封装入参或返回值,达到减少栈顶元素使用的目的保证参数和行为符合预期如果不严谨地检查智能
·
在Solidity编程世界中,生存与进化都离不开三个关键词:安全、可复用、高效。
- 上链的原则
-
需要分布式协作的重要数据才上链,非必需数据不上链;
-
敏感数据脱敏或加密后上链(视数据保密程度选择符合隐私保护安全等级要求的加密算法);
-
链上验证,链下授权。
-
- 精简函数变量
- EVM所设计用于最大的栈深度为16。建议:使用结构体或数组来封装入参或返回值,达到减少栈顶元素使用的目的
- 保证参数和行为符合预期
- 如果不严谨地检查智能合约输入参数或行为,有可能会触发一些意想不到的bug。
- 建议:在编写智能合约时,一定要注意对合约参数和行为的检查,尤其是那些对外部开放的合约函数。Solidity提供了require、revert、assert等关键字来进行异常的检测和处理。一旦检测并发现错误,整个函数调用会被回滚,所有状态修改都会被回退,就像从未调用过函数一样。
- 严控函数的执行权限
- 如果说智能合约的参数和行为检测提供了静态的合约安全措施,那么合约权限控制的模式则提供了动态访问行为的控制。
-
由于智能合约是发布到区块链上,所有数据和函数对所有参与者都是公开透明的,任一节点参与者都可发起交易,无法保证合约的隐私。因此,合约发布者必须对函数设计严格的访问限制机制。
-
Solidity提供了函数可见性修饰符、修饰器等语法,灵活地使用这些语法,可帮助构建起合法授权、受控调用的智能合约系统。
- 抽象通用的业务逻辑
- 参考单一职责的编程原则,使合约无法将所有代码专注在自身业务逻辑中。抽象出可复用的功能,利用Solidity的继承机制继承最终抽象的合约。
- 预防私钥的丢失
-
在区块链中调用合约函数的方式有两种:内部调用和外部调用。
-
出于隐私保护和权限控制,业务合约会定义一个合约所有者。假设用户A部署了FruitStore合约,那上述合约owner就是部署者A的外部账户地址。这个地址由外部账户的私钥计算生成。
-
但是,在现实世界中,私钥泄露、丢失的现象比比皆是。一个商用区块链DAPP需要严肃考虑私钥的替换和重置等问题。
-
这个问题最为简单直观的解决方法是添加一个备用私钥。这个备用私钥可支持权限合约修改owner的操作,代码如下:
-
- 面向接口编程
- 合理预留事件
- 遵循安全编程规范
- 积累和复用成熟的代码
- 提升存储和计算的效率
- 保证合约可升级
更多推荐
所有评论(0)