首页 > 其他分享 >智能合约的设计模式

智能合约的设计模式

时间:2023-02-22 11:23:19浏览次数:39  
标签:销毁 string 智能 address owner 设计模式 合约 public

合约自毁模式

合约自毁模式用于终止一个合约,这意味着将从区块链上永久删除这个合约。 一旦被销毁,就不可能 调用合约的功能,也不会在账本中记录交易。

现在的问题是:“为什么我要销毁合约?”。

有很多原因,比如某些定时合约,或者那些一旦达到里程碑就必须终止的合约。 一个典型的案例 是贷款合约,它应当在贷款还清后自动销毁;另一个案例是基于时间的拍卖合约,它应当在拍卖结束后 终止 —— 假设我们不需要在链上保存拍卖的历史记录。

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

  • 合约销毁后,发送给该合约的交易将失败
  • 任何发送给被销毁合约的资金,都将永远丢失

为避免资金损失,应当在发送资金前确保目标合约仍然存在,移除所有对已销毁合约的引用。 现在我们来看看代码:

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.7;
 
contract SelfDesctructionContract {
    address owner;
    string  someValue;
    modifier ownerRestricted {
        require(owner == msg.sender);
        _;
    } 
    // constructor
    constructor() {
        owner = msg.sender;
    }
    // a simple setter function
    function setSomeValue(string memory value ) public {
        someValue = value;
    } 
    // you can call it anything you want
    function destroyContract()public ownerRestricted {
        selfdestruct(payable(owner));
    }
}

正如你所看到的, destroyContract()​方法负责销毁合约。

请注意,我们使用自定义的ownerRestricted​修饰符来显示该方法的调用者,即仅允许合约的拥有者 销毁合约

工厂合约

工厂合约用于创建和部署“子”合约。 这些子合约可以被称为“资产”,可以表示现实生活中的房子或汽车。

工厂用于存储子合约的地址,以便在必要时提取使用。 你可能会问,为什么不把它们存在Web应用数据库里? 这是因为将这些地址数据存在工厂合约里,就意味着是存在区块链上,因此更加安全,而数据库的损坏 可能会造成资产地址的丢失,从而导致丢失对这些资产合约的引用。 除此之外,你还需要跟踪所有新 创建的子合约以便同步更新数据库。

工厂合约的一个常见用例是销售资产并跟踪这些资产(例如,谁是资产的所有者)。 需要向负责部署资产的 函数添加payable修饰符以便销售资产。 代码如下:

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.7;
 
contract CarShop {
   address[] carAssets;
   function createChildContract(string memory brand, string memory model) public payable {
      // insert check if the sent ether is enough to cover the car asset ...
      address newCarAsset = address(new CarAsset(brand, model, msg.sender));          
      carAssets.push(newCarAsset);   
   }
   function getDeployedChildContracts() public view returns (address[] memory) {
      return carAssets;
   }
}

contract CarAsset {
   string public brand;
   string public model;
   address public owner;
   constructor(string memory _brand, string memory _model, address  _owner)  {
      brand = _brand;
      model = _model;
      owner = _owner;
   }
}   

代码address newCarAsset = new CarAsset(...)​将触发一个交易来部署子合约并返回该合约的地址。 由于工厂合约和资产合约之间唯一的联系是变量address[] carAssets​,所以一定要正确保存子合约的地址。

标签:销毁,string,智能,address,owner,设计模式,合约,public
From: https://www.cnblogs.com/myfriend/p/design-mode-of-smart-contracts-zkwjbl.html

相关文章