国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

設(shè)計模式:智能合約的經(jīng)典設(shè)計模式及解析

這篇具有很好參考價值的文章主要介紹了設(shè)計模式:智能合約的經(jīng)典設(shè)計模式及解析。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?智能合約設(shè)計,# 智能合約,區(qū)塊鏈

?蘇澤

大家好 這里是蘇澤 一個鐘愛區(qū)塊鏈技術(shù)的后端開發(fā)者

本篇專欄?←持續(xù)記錄本人自學兩年走過無數(shù)彎路的智能合約學習筆記和經(jīng)驗總結(jié) 如果喜歡拜托三連支持~


總而言之,智能合約實現(xiàn)上要達到的目標是:完備的業(yè)務(wù)功能、精悍的代碼邏輯、良好的模塊抽象、清晰的合約結(jié)構(gòu)、合理的安全檢查、完備的升級方案。?

智能合約設(shè)計,# 智能合約,區(qū)塊鏈

經(jīng)典的5種設(shè)計模式

1、自毀合約

1、自毀合約:
合約自毀模式用于終止一個合約,從區(qū)塊鏈中永久刪除該合約,無法調(diào)用合約功能或記錄交易。常見用例包括定時合約或必須在達到里程碑時終止的合約。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
contract SelfDesctructionContract {
   public address owner;
   public string someValue;
   modifier ownerRestricted {
      require(owner == msg.sender);
      _;
   } 
   // constructor
   function SelfDesctructionContract() {
      owner = msg.sender;
   }
   // a simple setter function
   function setSomeValue(string value){
      someValue = value;
   } 
   // you can call it anything you want
   function destroyContract() ownerRestricted {
     suicide(owner);
   }
}

正如你所看到的,?destroyContract()方法負責銷毀合約。

請注意,我們使用自定義的ownerRestricted修飾符來顯示該方法的調(diào)用者,即僅允許合約的擁有者 銷毀合約。

2、工廠合約

工廠合約用于創(chuàng)建和部署子合約(資產(chǎn)),存儲子合約地址以確保安全性和防止數(shù)據(jù)丟失。常用于銷售資產(chǎn)并跟蹤資產(chǎn)所有者。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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;
   }
}

代碼address newCarAsset = new CarAsset(...)將觸發(fā)一個交易來部署子合約并返回該合約的地址。 由于工廠合約和資產(chǎn)合約之間唯一的聯(lián)系是變量address[] carAssets,所以一定要正確保存子合約的地址。

3、名稱注冊表

名稱注冊表模式通過合約名稱到地址的映射表,簡化了依賴多個合約的DApp的開發(fā)。通過固定一個合約地址,可以輕松查找合約地址,更新合約時不影響DApp的代碼。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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 1
      require(ver >= 1);
      
      ContractDetails memory info = registry[name];
      require(info.owner == msg.sender);
      // create info if it doesn't exist in the registry
       if (info.contractAddress == address(0)) {
          info = ContractDetails({
             owner: msg.sender,
             contractAddress: addr,
             version: ver
          });
       } else {
          info.version = ver;
          info.contractAddress = addr;
       }
       // update record in the registry
       registry[name] = info;
       return true;
   }
    function getContractDetails(string name) constant returns(address, uint16) {
      return (registry[name].contractAddress, registry[name].version);
   }
}

你的DApp將使用getContractDetails(name)來獲取指定合約的地址和版本。

4、映射表迭代器

映射表迭代器模式解決了Solidity中映射表無法迭代的問題,通過將鍵值對存儲在數(shù)組中實現(xiàn)迭代操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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];
    }
}

實現(xiàn)put()函數(shù)的一個常見錯誤,是通過遍歷來檢查指定的鍵是否存在。正確的做法是?elements[key] == address(0)。雖然遍歷檢查的做法不完全是一個錯誤,但它并不可取, 因為隨著keys數(shù)組的增長,迭代成本越來越高,因此應(yīng)該盡可能避免迭代。

5、提款模式

提款模式用于退款操作,避免在退款過程中出現(xiàn)異常導致整個交易被回滾。建議使用withdrawFunds()方法單獨按需退款給調(diào)用者,而不是一次性退款給所有買家。

1
2
3
4
5
6
7
8
9
10
11
12
13
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));
   }
}

五種模式優(yōu)劣性解析: ?

  1. 自毀合約:自毀合約模式用于終止一個合約并從區(qū)塊鏈中永久刪除。這種模式常用于一次性合約或需要在特定條件下終止的合約。通過調(diào)用自毀函數(shù)(selfdestruct)并指定一個地址,合約的余額將被轉(zhuǎn)移到該地址,并且合約的代碼和存儲將被刪除。

  2. 工廠合約:工廠合約模式用于創(chuàng)建和部署子合約。工廠合約負責管理子合約的創(chuàng)建過程,并存儲子合約的地址以確保安全性和方便訪問。這種模式常用于創(chuàng)建多個相似的合約實例,例如創(chuàng)建代幣合約或其他可復(fù)制的資產(chǎn)。

  3. 名稱注冊表:名稱注冊表模式通過將合約名稱映射到地址的表來簡化依賴多個合約的去中心化應(yīng)用(DApp)的開發(fā)。通過使用注冊表合約,可以通過固定的合約地址輕松查找和更新合約,而不需要在DApp的代碼中硬編碼合約地址,從而提高了靈活性和可維護性。

  4. 映射表迭代器:Solidity中的映射表無法直接迭代,但通過映射表迭代器模式可以解決這個問題。該模式通過將鍵值對存儲在數(shù)組中,以特定的順序記錄映射表中的鍵,并提供函數(shù)來遍歷數(shù)組并返回鍵值對的詳細信息,從而實現(xiàn)對映射表的迭代操作。

  5. 提款模式:提款模式用于在合約中進行退款操作,以防止在退款過程中出現(xiàn)異常導致整個交易被回滾。通常建議使用提款模式時,將退款金額存儲在合約中,然后通過調(diào)用合約的withdrawFunds()方法,單獨按需退款給調(diào)用者,而不是一次性退款給所有的買家。這樣可以確保退款操作的可靠性,并避免因異常而導致整個退款過程失敗。文章來源地址http://www.zghlxwxcb.cn/news/detail-848839.html

到了這里,關(guān)于設(shè)計模式:智能合約的經(jīng)典設(shè)計模式及解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 經(jīng)典的設(shè)計模式16——觀察者模式

    定義: 定義了一種一對多的依賴關(guān)系,讓多個觀察者對象同時監(jiān)聽某一個主題對象。這個主題對象在狀態(tài)變化時,會通知所有的觀察者對象,使得他們能夠自動更新自己。 目標和觀察者:一對多 單向依賴。通知的順序絕不依賴于通知的順序,多個觀察者之間的功能是平行的

    2024年02月09日
    瀏覽(21)
  • 設(shè)計模式系列:經(jīng)典的單例模式

    單例模式,是設(shè)計模式當中非常重要的一種,在面試中也常常被考察到。 正文如下: 一、什么時候使用單例模式? 單例模式可謂是23種設(shè)計模式中最簡單、最常見的設(shè)計模式了,它可以保證一個類只有一個實例。我們平時網(wǎng)購時用的購物車,就是單例模式的一個例子。想一

    2024年02月15日
    瀏覽(19)
  • 設(shè)計模式——經(jīng)典單例

    // 構(gòu)造、析構(gòu)函數(shù)私有化(一個進程只允許一個對象存在) // 對象私有化、靜態(tài)化(因為接口靜態(tài)函數(shù)) // 對象調(diào)用接口靜態(tài)化(因為靜態(tài)函數(shù)脫離了類對象,可以直接調(diào)用) 唯一的對象在使用時才進行初始化。存在多線程問題。 唯一的對象在定義時就完成初始化。

    2024年02月12日
    瀏覽(16)
  • <JavaEE> 經(jīng)典設(shè)計模式之 -- 線程池

    <JavaEE> 經(jīng)典設(shè)計模式之 -- 線程池

    目錄 一、線程池的概念 二、Java 標準庫中的線程池類 2.1 ThreadPoolExecutor 類 2.1.1?corePoolSize 和?maximumPoolSize 2.1.2?keepAliveTime 和?unit 2.1.3?workQueue 2.1.4?threadFactory 2.1.5?handler 2.1.6 創(chuàng)建一個參數(shù)自定義的線程池 2.2?Executors 類 2.3 實現(xiàn)自己的線程池 1)什么是線程池? 準備預(yù)期需要使

    2024年02月05日
    瀏覽(14)
  • 8. Fabric2.2 區(qū)塊鏈農(nóng)產(chǎn)品溯源系統(tǒng) - 智能合約設(shè)計

    根據(jù)上小節(jié)的需求分析與方案設(shè)計來進行智能合約的設(shè)計。 智能合約設(shè)計最核心的是存儲字段的設(shè)計、也就是索引設(shè)計,F(xiàn)abric 常見的時間狀態(tài)存儲引擎是LevelDB 或 CouchDB,這兩個數(shù)據(jù)庫是KV存儲,KV存儲不像SQL類型存儲,一張表創(chuàng)建多個字段,多個字段索引可以進行各種復(fù)查詢

    2023年04月08日
    瀏覽(28)
  • 【設(shè)計模式】代理模式例子解析

    【設(shè)計模式】代理模式例子解析

    代理模式,顧名思義,就是我們在需要訪問一個類時,并不直接調(diào)用這個類,而是通過一個\\\"代理\\\"來間接地實現(xiàn)這個過程。 這個“代理”就像是真實對象的一個接口,所有的對于真實對象的操作都需要通過這個“代理”來實現(xiàn)?!班嵵仄涫碌拇怼?,這或許是代理模式的最好

    2024年01月25日
    瀏覽(17)
  • 區(qū)塊鏈技術(shù)與應(yīng)用 【全國職業(yè)院校技能大賽國賽題目解析】第一套智能合約安全漏洞測試(0基礎(chǔ)版)

    區(qū)塊鏈技術(shù)與應(yīng)用 【全國職業(yè)院校技能大賽國賽題目解析】第一套智能合約安全漏洞測試(0基礎(chǔ)版)

    第一套題的智能合約安全漏洞測試題目 漏洞合約代碼 總結(jié): EtherStore合約 是一個簡單的儲蓄合約,用戶可以存入和提取以太幣。 Attack合約 是針對 EtherStore 合約設(shè)計的,它包含了一個構(gòu)造函數(shù)來引用目標 EtherStore 合約 ,并提供了一個 attack 函數(shù) ,試圖通過先存入再立即提取

    2024年04月11日
    瀏覽(31)
  • 區(qū)塊鏈的設(shè)計模式 blockchain SMR BCML DML

    區(qū)塊鏈的設(shè)計模式 blockchain SMR BCML DML

    2.4.1 Blockchain 區(qū)塊鏈模式 公有鏈(以太坊等) Blockchain is as we have described it, and includes many of so-called public chains or public ledgers, which are permissionless to join. 2.4.2 State Machine Replication (SMR) 復(fù)制狀態(tài)機 聯(lián)盟鏈(Hyperledger Fabric) SMR includes many of so-called private chains, consortium chains or private

    2024年02月13日
    瀏覽(20)
  • 萬字解析設(shè)計模式之原型模式與建造者模式

    萬字解析設(shè)計模式之原型模式與建造者模式

    原型模式是一種創(chuàng)建型設(shè)計模式,其目的是使用已有對象作為原型來創(chuàng)建新的對象。 原型模式的核心是克隆 ,即通過復(fù)制已有對象來創(chuàng)建新對象,而不是通過創(chuàng)建新對象的過程中獨立地分配和初始化所有需要的資源。這種方式可以節(jié)省創(chuàng)建對象的時間和資源,特別是在創(chuàng)建

    2024年02月06日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包