主頁 > 區塊鏈 > cosmwasm&wasmd —— 智能合約、合約計費規則、合約與世界狀態互動

cosmwasm&wasmd —— 智能合約、合約計費規則、合約與世界狀態互動

2021-04-07 10:39:33 區塊鏈

一、前言

1.1 專案版本

1. cosmwasm:orgin/main
2. wasmd:origin/master

1.2 簡單介紹

1. cosmwasm主要功能:
- cosmwasm-template:提供撰寫智能合約(以下簡稱合約)的模板
- cosmwasm-examples:提供合約樣例
- cosmwasm-storage:存盤合約
- cosmwasm-vm:使用wasmer引擎執行給定的智能合約,還包含合約計費、存盤和快取wasm組件的功能
- go-cosmwasm:現已改名為wasmvm,呼叫cosmwasm-vm中的部署、實體化和執行合約的介面,使用它的優化和快取

2. wasmd主要功能:
- 基于cosmos-sdk寫的app,集群智能合約,匯入了wasmvm


先從簡單的說起

二、wasmd

wasmd主要功能如圖所示

wasm智能合約生命周期

圖中的irita網路是基于cosmos-sdk寫的區塊鏈網路,匯入了wasmd模塊,所以irita網路對于智能合約相關邏輯是與wasmd一致的,關于irita這里不做過多介紹,

0. 編譯:根據cosmwasm-template,參考cosmwasm-examples,使用rust撰寫合約,然后用cli命令編譯成wasm檔案,也可以用go來撰寫,
但是暫時沒有找到操作區塊鏈存盤、世界狀態的介面樣例,
1. 部署:將wasm原始位元組,經base64標準編碼后作為引數傳給wasmd,或者使用gzip演算法壓縮原始位元組后base64編碼,wasmd會將合約存盤并回傳
合約編號,若編譯好的Wasm位元組碼檔案比較大,則部署到鏈上需要的存盤空間會比較多,費用也會比較高,但是可以使用ontio-Wasm-build工具將 Wasm 位元組碼減小,
2. 初始化:也就是實體化,將合約編號作為引數傳給wasmd,wasmd會根據合約編號生成合約賬號,然后將合約賬號、合約位元組內容經base64編碼回傳,
可自行驗證本地編譯的代碼是否與上傳的代碼散列相匹配,
3. 執行:將合約賬號作為引數傳給wasmd,wasmd呼叫wasmvm提供的介面執行合約(其實初始化也會呼叫),回傳執行后的資料
4. 升降級:首先新合約按照步驟1執行,然后將舊合約賬號與新合約編號作為引數傳給wasmd,wasmd會重新建立合約賬號與合約的系結,也就是代理合約,
回傳新合約位元組內容,

三、cosmwasm

3.1 合約計費規則

  1. cosmwasm定義了合約在加密驗簽的gas消耗,如代碼所示

     定位代碼:cosmwasm/packages/vm/src/environment.rs -> GasConfig:
    
impl GasConfig {
    // 底層加密驗簽消耗gas:1000(cosmos-sdk定義的)* 100(cosmwasm定義的)
    const BASE_CRYPTO_COST: u64 = 100_000;

    // secp256k1 演算法驗簽消耗gas的因子
    const SECP256K1_VERIFY_FACTOR: (u64, u64) = (154, 154); // ~154 us in crypto benchmarks

    // secp256k1 演算法恢復公鑰消耗gas的因子
    const SECP256K1_RECOVER_PUBKEY_FACTOR: (u64, u64) = (162, 154); // 162 us / 154 us ~ 1.05
    // ed25519 演算法驗簽消耗gas的因子
    const ED25519_VERIFY_FACTOR: (u64, u64) = (63, 154); // 63 us / 154 us ~ 0.41

    // ed25519 演算法批量驗簽消耗gas的因子
    const ED255219_BATCH_VERIFY_FACTOR: (u64, u64) = (
        GasConfig::ED25519_VERIFY_FACTOR.0,
        GasConfig::ED25519_VERIFY_FACTOR.1 * 2,
    ); // 0.41 / 2. ~ 0.21
    // ed25519 演算法單公鑰驗簽消耗gas的因子
    const ED255219_BATCH_VERIFY_ONE_PUBKEY_FACTOR: (u64, u64) = (
        GasConfig::ED25519_VERIFY_FACTOR.0,
        GasConfig::ED25519_VERIFY_FACTOR.1 * 4,
    ); // 0.41 / 4. ~ 0.1
	
	// 計算加密驗簽消耗的gas
    fn calc_crypto_cost(factor: (u64, u64)) -> u64 {
        (GasConfig::BASE_CRYPTO_COST * factor.0) / factor.1
    }
}
  1. cosmwasm對于存盤的讀、寫、修改、洗掉的gas的計費規則由gas_limit控制,如代碼所示,但是對加、乘演算法等操作沒有定義,

     這里只展示部分代碼,定位代碼:cosmwasm/packages/vm/src/environment.rs -> Environment
    
    pub fn new(api: A, gas_limit: u64, print_debug: bool) -> Self {
        Environment {
            api,
            print_debug,
            gas_config: GasConfig::default(),
            data: Arc::new(RwLock::new(ContextData::new(gas_limit))),
        }
    }

	// 其他函式與此函式類似,就不貼代碼了
	// FnOnce匿名函式,可訪問外部變數S、Q
    fn with_context_data_mut<C, R>(&self, callback: C) -> R
    where
        C: FnOnce(&mut ContextData<S, Q>) -> R,
    {
    	// 根據new函式:self.data的值來自gasLimit
        let mut guard = self.data.as_ref().write().unwrap();
        let context_data = guard.borrow_mut();
        callback(context_data)
    }

以太坊對于gas的消耗就非常詳細,可參考下圖,具體見以太坊黃皮書第20頁,
gas的消耗
并且以太坊對每個操作指令都有明文規定的Gas消耗量,可參考下圖,具體見Gas清單 ,
在這里插入圖片描述
當然以太坊gas消耗是可以優化的,具體見此處,

  1. 執行智能合約時 gasUsed 無法提前預知, 這樣存在一個風險,當用戶的交易涉及一個惡意的智能合約,該合約執行將消耗無限的燃料, 這樣會導致交易方的余額全部消耗(惡意的智能合約有可能是程式Bug,如合約執行陷入一個死回圈),為了避免合約中的錯誤引起不可預計的燃料消耗,用戶需要在發送交易時設定允許消耗的燃料上限,即 gasLimit, 這樣不管合約是否良好,最壞情況也只是消耗 gasLimit 量的燃料,

  2. 如果交易尚未執行完成,而gas已用完,那么交易回滾,用完的gas不會返還,

  3. 即使交易失敗,也必須為已占用的計算資源支付手續費,

3.2 合約與世界狀態互動

先來看世界狀態的定義:所有節點從同一個創世狀態開始,依次運行達成共識的區塊內的交易,驅動各個節點的狀態按照相同操作序列(增加,洗掉,
修改)不斷變化,實作所有節點在執行完相同編號區塊內的交易后,狀態完全一致,把這個狀態稱之為世界狀態,

狀態變化

 合約與世界狀態的互動實際上是合約呼叫底層區塊鏈的讀寫介面,各節點執行相同的合約從而使得資料達成一致,
 只有在每個交易和區塊處理過后,并且每個節點達到相同狀態,智能合約才能正常運行,

來看合約對存盤的操作,如代碼(cosmwasm/packages/std/src/imports.rs)所示,此介面通過C/C++撰寫的動態庫操作存盤、驗簽,此介面將在vm中用到,見 cosmwasm/packages/vm/src/instance.rs -> Instance::from_module() 所示代碼

extern "C" {
	// 增刪改介面
    fn db_read(key: u32) -> u32;
    fn db_write(key: u32, value: u32);
    fn db_remove(key: u32);

    // scan creates an iterator, which can be read by consecutive next() calls
    // 迭代資料介面
    #[cfg(feature = "iterator")]
    fn db_scan(start_ptr: u32, end_ptr: u32, order: i32) -> u32;
    #[cfg(feature = "iterator")]
    fn db_next(iterator_id: u32) -> u32;
	
	// 可視化賬號
    fn canonicalize_address(source_ptr: u32, destination_ptr: u32) -> u32;
    fn humanize_address(source_ptr: u32, destination_ptr: u32) -> u32;

	// 演算法驗證
    fn secp256k1_verify(message_hash_ptr: u32, signature_ptr: u32, public_key_ptr: u32) -> u32;
    fn secp256k1_recover_pubkey(
        message_hash_ptr: u32,
        signature_ptr: u32,
        recovery_param: u32,
    ) -> u64;
    fn ed25519_verify(message_ptr: u32, signature_ptr: u32, public_key_ptr: u32) -> u32;
    fn ed25519_batch_verify(messages_ptr: u32, signatures_ptr: u32, public_keys_ptr: u32) -> u32;

    fn debug(source_ptr: u32);

	// 查詢鏈上資料
    /// Executes a query on the chain (import). Not to be confused with the
    /// query export, which queries the state of the contract.
    fn query_chain(request: u32) -> u32;
}

Fabric中智能合約與賬本中世界狀態進行互動的方法:利用PutState和GetState這兩個API來實作的,見下圖,
賬本中世界狀態進行互動

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/273283.html

標籤:區塊鏈

上一篇:Visual Studio使用筆記:cmake工程 missing and no known rule to make it

下一篇:愷撒密碼加密與解密

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • JAVA使用 web3j 進行token轉賬

    最近新學習了下區塊鏈這方面的知識,所學不多,給大家分享下。 # 1. 關于web3j web3j是一個高度模塊化,反應性,型別安全的Java和Android庫,用于與智能合約配合并與以太坊網路上的客戶端(節點)集成。 # 2. 準備作業 jdk版本1.8 引入maven <dependency> < ......

    uj5u.com 2020-09-10 03:03:06 more
  • 以太坊智能合約開發框架Truffle

    前言 部署智能合約有多種方式,命令列的瀏覽器的渠道都有,但往往跟我們程式員的風格不太相符,因為我們習慣了在IDE里寫了代碼然后打包運行看效果。 雖然現在IDE中已經存在了Solidity插件,可以撰寫智能合約,但是部署智能合約卻要另走他路,沒辦法進行一個快捷的部署與測驗。 如果團隊管理的區塊節點多、 ......

    uj5u.com 2020-09-10 03:03:12 more
  • 谷歌二次驗證碼成為區塊鏈專用安全碼,你怎么看?

    前言 谷歌身份驗證器,前些年大家都比較陌生,但隨著國內互聯網安全的加強,它越來越多地出現在大家的視野中。 比較廣泛接觸的人群是國際3A游戲愛好者,游戲盜號現象嚴重+國外賬號安全應用廣泛,這類游戲一般都會要求用戶系結名為“兩步驗證”、“雙重驗證”等,平臺一般都推薦用谷歌身份驗證器。 后來區塊鏈業務風靡 ......

    uj5u.com 2020-09-10 03:03:17 more
  • 密碼學DAY1

    目錄 ##1.1 密碼學基本概念 密碼在我們的生活中有著重要的作用,那么密碼究竟來自何方,為何會產生呢? 密碼學是網路安全、資訊安全、區塊鏈等產品的基礎,常見的非對稱加密、對稱加密、散列函式等,都屬于密碼學范疇。 密碼學有數千年的歷史,從最開始的替換法到如今的非對稱加密演算法,經歷了古典密碼學,近代密 ......

    uj5u.com 2020-09-10 03:03:50 more
  • 密碼學DAY1_02

    目錄 ##1.1 ASCII編碼 ASCII(American Standard Code for Information Interchange,美國資訊交換標準代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言。它是現今最通用的單位元組編碼系統,并等同于國際標準ISO/IE ......

    uj5u.com 2020-09-10 03:04:50 more
  • 密碼學DAY2

    ##1.1 加密模式 加密模式:https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html ECB ECB : Electronic codebook, 電子密碼本. 需要加密的訊息按照塊密碼的塊大小被分為數個塊,并對每個塊進 ......

    uj5u.com 2020-09-10 03:05:42 more
  • NTP時鐘服務器的特點(京準電子)

    NTP時鐘服務器的特點(京準電子) NTP時鐘服務器的特點(京準電子) 京準電子官V——ahjzsz 首先對時間同步進行了背景介紹,然后討論了不同的時間同步網路技術,最后指出了建立全球或區域時間同步網存在的問題。 一、概 述 在通信領域,“同步”概念是指頻率的同步,即網路各個節點的時鐘頻率和相位同步 ......

    uj5u.com 2020-09-10 03:05:47 more
  • 標準化考場時鐘同步系統推進智能化校園建設

    標準化考場時鐘同步系統推進智能化校園建設 標準化考場時鐘同步系統推進智能化校園建設 安徽京準電子科技官微——ahjzsz 一、背景概述隨著教育事業的快速發展,學校建設如雨后春筍,隨之而來的學校教育、管理、安全方面的問題成了學校管理人員面臨的最大的挑戰,這些問題同時也是學生家長所擔心的。為了讓學生有更 ......

    uj5u.com 2020-09-10 03:05:51 more
  • 位元幣入門

    引言 位元幣基本結構 位元幣基礎知識 1)哈希演算法 2)非對稱加密技術 3)數字簽名 4)MerkleTree 5)哪有位元幣,有的是UTXO 6)位元幣挖礦與共識 7)區塊驗證(共識) 總結 引言 上一篇我們已經知道了什么是區塊鏈,此篇說一下區塊鏈的第一個應用——位元幣。其實先有位元幣,后有的區塊 ......

    uj5u.com 2020-09-10 03:06:15 more
  • 北斗對時服務器(北斗對時設備)電力系統應用

    北斗對時服務器(北斗對時設備)電力系統應用 北斗對時服務器(北斗對時設備)電力系統應用 京準電子科技官微(ahjzsz) 中國北斗衛星導航系統(英文名稱:BeiDou Navigation Satellite System,簡稱BDS),因為是目前世界范圍內唯一可以大面積提供免費定位服務的系統,所以 ......

    uj5u.com 2020-09-10 03:06:20 more
最新发布
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:46:47 more
  • Hyperledger Fabric 使用 CouchDB 和復雜智能合約開發

    在上個實驗中,我們已經實作了簡單智能合約實作及客戶端開發,但該實驗中智能合約只有基礎的增刪改查功能,且其中的資料管理功能與傳統 MySQL 比相差甚遠。本文將在前面實驗的基礎上,將 Hyperledger Fabric 的默認資料庫支持 LevelDB 改為 CouchDB 模式,以實作更復雜的資料... ......

    uj5u.com 2023-04-16 07:28:31 more
  • .NET Core 波場鏈離線簽名、廣播交易(發送 TRX和USDT)筆記

    Get Started NuGet You can run the following command to install the Tron.Wallet.Net in your project. PM> Install-Package Tron.Wallet.Net 配置 public reco ......

    uj5u.com 2023-04-14 08:08:00 more
  • DKP 黑客分析——不正確的代幣對比率計算

    概述: 2023 年 2 月 8 日,針對 DKP 協議的閃電貸攻擊導致該協議的用戶損失了 8 萬美元,因為 execute() 函式取決于 USDT-DKP 對中兩種代幣的余額比率。 智能合約黑客概述: 攻擊者的交易:0x0c850f,0x2d31 攻擊者地址:0xF38 利用合同:0xf34ad ......

    uj5u.com 2023-04-07 07:46:09 more
  • Defi開發簡介

    Defi開發簡介 介紹 Defi是去中心化金融的縮寫, 是一項旨在利用區塊鏈技術和智能合約創建更加開放,可訪問和透明的金融體系的運動. 這與傳統金融形成鮮明對比,傳統金融通常由少數大型銀行和金融機構控制 在Defi的世界里,用戶可以直接從他們的電腦或移動設備上訪問廣泛的金融服務,而不需要像銀行或者信 ......

    uj5u.com 2023-04-05 08:01:34 more
  • solidity簡單的ERC20代幣實作

    // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; import "hardhat/console.sol"; //ERC20 同質化代幣,每個代幣的本質或性質都是相同 //ETH 是原生代幣,它不是ERC20代幣, ......

    uj5u.com 2023-03-21 07:56:29 more
  • solidity 參考型別修飾符memory、calldata與storage 常量修飾符C

    在solidity語言中 參考型別修飾符(參考型別為存盤空間不固定的數值型別) memory、calldata與storage,它們只能修飾參考型別變數,比如字串、陣列、位元組等... memory 適用于方法傳參、返參或在方法體內使用,使用完就會清除掉,釋放記憶體 calldata 僅適用于方法傳參 ......

    uj5u.com 2023-03-08 07:57:54 more
  • solidity注解標簽

    在solidity語言中 注釋符為// 注解符為/* 內容*/ 或者 是 ///內容 注解中含有這幾個標簽給予我們使用 @title 一個應該描述合約/介面的標題 contract, library, interface @author 作者的名字 contract, library, interf ......

    uj5u.com 2023-03-08 07:57:49 more
  • 評價指標:相似度、GAS消耗

    【代碼注釋自動生成方法綜述】 這些評測指標主要來自機器翻譯和文本總結等研究領域,可以評估候選文本(即基于代碼注釋自動方法而生成)和參考文本(即基于手工方式而生成)的相似度. BLEU指標^[^?88^^?^]^:其全稱是bilingual evaluation understudy.該指標是最早用于 ......

    uj5u.com 2023-02-23 07:27:39 more
  • 基于NOSTR協議的“公有制”版本的Twitter,去中心化社交軟體Damus

    最近,一個幽靈,Web3的幽靈,在網路游蕩,它叫Damus,這玩意詮釋了什么叫做病毒式營銷,滑稽的是,一個Web3產品卻在Web2的產品鏈上瘋狂傳銷,各方大佬紛紛為其背書,到底發生了什么?Damus的葫蘆里,賣的是什么藥? 注冊和簡單實用 很少有什么產品在用戶注冊環節會有什么噱頭,但Damus確實出 ......

    uj5u.com 2023-02-05 06:48:39 more