日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

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

發布時間:2025/3/21 asp.net 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 以太坊知识教程------智能合约的5种设计模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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种设计模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。