苏泽
大家好 这里是苏泽 一个钟爱区块链技术的后端开发者
本篇专栏 ←持续记录本人自学两年走过无数弯路的智能合约学习笔记和经验总结 如果喜欢拜托三连支持~
总而言之,智能合约实现上要达到的目标是:完备的业务功能、精悍的代码逻辑、良好的模块抽象、清晰的合约结构、合理的安全检查、完备的升级方案。
经典的5种设计模式
1、自毁合约
1、自毁合约:
合约自毁模式用于终止一个合约,从区块链中永久删除该合约,无法调用合约功能或记录交易。常见用例包括定时合约或必须在达到里程碑时终止的合约。
正如你所看到的, destroyContract()
方法负责销毁合约。
请注意,我们使用自定义的ownerRestricted
修饰符来显示该方法的调用者,即仅允许合约的拥有者 销毁合约。
2、工厂合约
工厂合约用于创建和部署子合约(资产),存储子合约地址以确保安全性和防止数据丢失。常用于销售资产并跟踪资产所有者。
代码address newCarAsset = new CarAsset(...)
将触发一个交易来部署子合约并返回该合约的地址。 由于工厂合约和资产合约之间唯一的联系是变量address[] carAssets
,所以一定要正确保存子合约的地址。
3、名称注册表
名称注册表模式通过合约名称到地址的映射表,简化了依赖多个合约的DApp的开发。通过固定一个合约地址,可以轻松查找合约地址,更新合约时不影响DApp的代码。
你的DApp将使用getContractDetails(name)
来获取指定合约的地址和版本。
4、映射表迭代器
映射表迭代器模式解决了Solidity中映射表无法迭代的问题,通过将键值对存储在数组中实现迭代操作。
实现put()
函数的一个常见错误,是通过遍历来检查指定的键是否存在。正确的做法是 elements[key] == address(0)
。虽然遍历检查的做法不完全是一个错误,但它并不可取, 因为随着keys数组的增长,迭代成本越来越高,因此应该尽可能避免迭代。
5、提款模式
提款模式用于退款操作,避免在退款过程中出现异常导致整个交易被回滚。建议使用withdrawFunds()方法单独按需退款给调用者,而不是一次性退款给所有买家。