1、自毁合约

合约自毁模式用于终止一个合约,这意味着将从区块链上永久删除这个合约。 一旦被销毁,就不可能调用合约的功能,也不会在账本中记录交易。
eg. 贷款合约,它应当在贷款还清后自动销毁;另一个案例是基于时间的拍卖合约,它应当在拍卖结束后 终止 —— 假设我们不需要在链上保存拍卖的历史记录。

在处理一个被销毁的合约时,有一些需要注意的问题:

  • 合约销毁后,发送给该合约的交易将失败。
  • 任何发送给被销毁合约的资金,都将永远丢失。
  • 为避免资金损失,应当在发送资金前确保目标合约仍然存在,移除所有对已销毁合约的引用。
contract SelfDesctructionContract {public address owner;public string someValue;modifier ownerRestricted {require(owner == msg.sender);_;} // constructorfunction SelfDesctructionContract() {owner = msg.sender;}// a simple setter functionfunction setSomeValue(string value){someValue = value;} // you can call it anything you wantfunction destroyContract() ownerRestricted {suicide(owner);}
}

2、工厂合约

工厂合约用于创建和部署“子”合约。

工厂用于存储子合约的地址,以便在必要时提取使用。

  • 为什么不把它们存在Web应用数据库里?
  • 将地址数据存在工厂合约里、存在区块链上,更加安全不会丢失。
  • 需要跟踪所有新 创建的子合约以便同步更新数据库。

eg. 销售资产并跟踪这些资产(例如,谁是资产的所有者)。 需要向负责部署资产的 函数添加payable修饰符以便销售资产。


contract CarShop {address[] carAssets;function createChildContract(string brand, string model) public payable {// insert check if the sent ether is enough to cover the car asset ...address newCarAsset = new CarAsset(brand, model, msg.sender);            carAssets.push(newCarAsset);   }function getDeployedChildContracts() public view returns (address[]) {return carAssets;}
}contract CarAsset {string public brand;string public model;address public owner;function CarAsset(string _brand, string _model, address _owner) public {brand = _brand;model = _model;owner = _owner;}
}

3、名称注册表

  • 其实就是一个字符串map一个struct对象。
  • 使用场景: 假设一个合约依赖很多个合约,如果将所有这些合约的地址写在你的应用代码中,如果这些合约的地址随着时间的推移而变化,那该怎么办?
contract NameRegistry {struct ContractDetails {address owner;address contractAddress;uint16 version;}mapping(string => ContractDetails) registry;function registerName(string name, address addr, uint16 ver) returns (bool) {// versions should start from 1require(ver >= 1);ContractDetails memory info = registry[name];require(info.owner == msg.sender);// create info if it doesn't exist in the registryif (info.contractAddress == address(0)) {info = ContractDetails({owner: msg.sender,contractAddress: addr,version: ver});} else {info.version = ver;info.contractAddress = addr;}// update record in the registryregistry[name] = info;return true;}function getContractDetails(string name) constant returns(address, uint16) {return (registry[name].contractAddress, registry[name].version);}
}

4、映射表迭代器

由于mapping迭代效率低,所以需要一个mapping迭代模式,答案就是通过一个数组来保存key。

注意:put()函数的一个常见错误“通过遍历来检查指定的键是否存在”。

contract MappingIterator {mapping(string => address) elements;string[] keys;function put(string key, address addr) returns (bool) {bool exists = elements[key] == address(0)if (!exists) {keys.push(key);}elements[key] = addr;return true;}function getKeyCount() constant returns (uint) {return keys.length;}function getElementAtIndex(uint index) returns (address) {return elements[keys[index]];}function getElement(string name) returns (address) {return elements[name];}
}

5. 提款模式

简单来说,就是不用transfer,而是用send,因为一旦callback错误,transfer会导致异常,而send不会。


contract WithdrawalContract {mapping(address => uint) buyers;function buy() payable {require(msg.value > 0);buyers[msg.sender] = msg.value;}function withdraw() {uint amount = buyers[msg.sender];require(amount > 0);buyers[msg.sender] = 0;      require(msg.sender.send(amount));}
}

以太坊知识教程------智能合约的5种设计模式相关推荐

  1. 以太坊知识教程------智能合约(2)调用

    1. 合约消息 合约之间通过调用或发送消息的方式进行交互 .当一个合约接收到一条消息时,它可以回复一些数据,这样消息的原发送者就能立即使用 .采用这种方法,发送一条消息就像调用一次函数. 一个智能合约 ...

  2. 以太坊知识教程------智能合约(1)基本概念

    1.智能合约的定义 智能合约是一段 EVM 可执行的代码 智能合约的信息都被附在"交易"中,以交易的形式发布到网络中 合约发布之后用户会得到一个合约地址,相当于合约对象的指针 当网 ...

  3. 以太坊知识教程------智能合约(3)函数修饰符

    1. solidity的五个关键字修饰符 操作 定义 public 用来修饰公开的函数 /变量,表明该函数/变量既可以在合约外部访问,也可以在合约内部访问 . private 私有函数和变量,只有当前 ...

  4. 以太坊知识教程------智能合约(2)调用 delegatecall call send

    1. 函数调用call(-) <address>.call(-) 可以接受任何长度.任何类型的参数,每个参数将被填充到 32 字节并拼接在一起 . 但有一种例外情况,当第一个参数的长度恰好 ...

  5. 基于以太坊网络的智能合约开发、部署和测试(入门)

    为什么80%的码农都做不了架构师?>>>    基本概念: 以太坊是一个开放的.公开的区块链平台,允许用户构建自己的去中心化应用在上面运行 Solidity是一种语法类似JavaSc ...

  6. 比特币开发者:BSC可能会超越以太坊成为顶级智能合约平台

    比特币开发者Udi Wertheimer发推称,我觉得这是以太坊作为顶级智能合约平台的最后一个周期了. 昨天币安智能链(BSC)结算500万ETH,以太坊本身结算700万ETH左右.这可能会很快结束. ...

  7. 以太坊可更新智能合约研究与开发综述

    原文地址:https://ethfans.org/posts/ethereum-upgradeable-smart-contract-strategies 这篇文章是对以太坊可更新智能合约领域里的研究 ...

  8. 以太坊—开放的智能合约完整解决方案

    什么是以太坊(Ethereum)? 通俗的讲,以太坊是一种新的法律.传统的合同合约依据法律订立,执行.违约处理依赖律师.法院:以太坊解决了这一系列问题,合约通过程序订立.执行,人工无法干预,所以几乎可 ...

  9. 元宇宙应用开发实例——以太坊里的智能合约和Decentraland里的3D前端交互组件

    目录 1. 元宇宙核心技术 2. 元宇宙实例及应用实例 3. 以太坊里的智能合约开发 3.1. World Wide Web的访问能力 3.2. 初始化以太坊钱包 3.3. 开发4方合约 3.4. 手 ...

最新文章

  1. 如何利用zendstudio新建 或导入php项目
  2. 微信之父张小龙:产品经理的必备书单(转)
  3. 关于Adium近期无法添加MSN联系人的说明
  4. 前端 --- 关于DOM的介绍
  5. Android之webview与js交互
  6. java 大数类_Java大数类介绍
  7. java体系的四大基类_Java中的io流学习(了解四大基类和基本步骤)
  8. 30 个用于杂志网站的 WordPress 主题
  9. String常见问题
  10. 基于表的数据字典构造MySQL建表语句
  11. 完美解决IE6不支持position:fixed的bug
  12. 全栈开发永远成不了高级程序员?!
  13. HDU2502 月之数(解法三)【废除!!!】
  14. celery 可视化_Celery部署爬虫(三)
  15. Netfilter学习之NAT类型动态配置(二)NAT类型介绍及MASQUERADE用户层的实现
  16. 2.4G无线模块(NRF24L01)学习(2)——单片机互相控制LED灯
  17. 【问题描述】在带头结点单链表中查找最大值,将其值与最后一个元素交换,输出交换后的单链表各元素。【输入形式】循环输入若干个整数,以字母结束输入,建立带头结点的单链表。【输出形式】输出最
  18. 04_NetBean安裝
  19. 小白数据库下载数据教学
  20. MySQL字符集(表情包)

热门文章

  1. 二层交换配置完ping失败_设置完端口聚合之后就ping不通了!!!
  2. html金额输入框转大写,纯CSS实现输入框字符自动转为小写或大写
  3. 数据中心继续蓬勃发展的5个原因
  4. 如何做好配电室、临时用电安全管理?
  5. 读懂 | 路由器简史
  6. ML:MLOps系列讲解之《MLOps Stack Canvas堆栈画布》解读
  7. 成功解决基于pyecharts生成的html文件打开时显示空白
  8. 成功解决The NVIDIA driver on your system is too old (found version 9010). Please update your GPU driver
  9. ML之xgboost:绘制xgboost的二叉树graphviz的两种方法代码实现
  10. DL之DNN优化技术:神经网络算法简介之GD/SGD算法(BP的梯度下降算法)的简介、理解、代码实现、SGD缺点及改进(Momentum/NAG/Ada系列/RMSProp)之详细攻略