摘要:允許智能合約定義自己的私有數據庫表。有了多級索引,智能合約就具備了操作類似數據庫模塊的功能。因此雖然只有一列,但是的靈活性絲毫不亞于傳統的數據表。
摘要上一章我們學習了開發智能合約之前需要知道的必要概念:
什么是webAssembly以及它在智能合約上下游中的位置;
什么是ABI以及怎樣使用eosiocpp工具產生ABI和wasm、wast
hello智能合約的簡單入門:部署和調用
如果說智能合約開發是一個鎖著門的圖書館,那么之前的學習就是鑰匙。現在我們終于可以拿著鑰匙打開大門,走進去一探究竟。
說到智能合約開發,大家首先想到的肯定是寫代碼、像solidity開發一樣教語法。EOS的智能合約是用C++寫的,基本語法大家可以去買本C++的書;這一篇主要介紹EOS智能合約的數據存儲,為大家掃清智能合約開發道路上的最后一道障礙。
什么是RAM之前我們在學習如何在主網創建賬戶時,曾經接觸到RAM的概念。我們不能像操作以太坊那樣,憑空生成一個地址作為自己的賬戶,而是要先有一個賬戶,再去創建另一個賬戶。其中就涉及到一個關于RAM很關鍵的知識點:創建賬戶需要消耗RAM。
當時我們只是很模糊地知道,RAM大概是內存的意思。
RAM is used to store data in an in-memory database. DApps will use this to store state information so it is quickly available to their app.
RAM是EOS主網中的內存,用于存儲用戶在EOS中使用頻率高的數據(賬戶余額、合約狀態等)。
BM對EOS的期望是成為區塊鏈世界中的【操作系統】,因此可以把計算機的一些概念對標到EOS中,其中計算機中的運行內存,在EOS中就可以看做是RAM;而硬盤就可以對標EOS區塊鏈數據庫。
所以高訪問量的決策類數據,例如賬戶余額、智能合約的當前狀態等就會被存儲在RAM中,并且這部分數據將長期占用RAM;而低訪問的費決策性存證數據,例如交易數據,就會存儲在EOS系統的硬盤中,也就是區塊鏈中。當存儲賬號狀態的空間不足,即RAM不足時,轉賬或部署合約等相關操作就無法執行。
什么是EOS數據庫之前我們曾經介紹過transaction和action,action是智能合約執行的基本單元,transaction可以認為是一個或幾個action組成的原子性操作。action在被稱為action上下文的環境中執行,action上下文提供了執行action所需的一些條件,其中一個就是action的工作內存,這是action保存工作狀態的地方。在處理一個action之前,eosio會先為它清理一次內存,因此當變量在一個action中被賦值后,另一個action的上下文是拿不到這個值的。那么在action之間傳遞狀態的唯一方法就是把它持久存儲到EOS數據庫中,如下圖:
這個持久化存儲就是數據庫存儲數據。EOS允許智能合約定義自己的私有數據庫表。比如上圖,Apply Context的內容都是一次性的,一次action執行完成,對象就釋放了,只有存儲到EOSIO database的才被保存。
什么是multi_index接著上面介紹的數據庫往下說,?這個私有數據表是通過multi_index來訪問和交互的。EOS的multi_index類似boost的multi_index,即多索引容器。有了多級索引,智能合約就具備了操作類似數據庫模塊的功能。
multi_index是一個非常方便的、可以和數據庫交互的容器。從字面意思來看,multi_index就是一個可以使用多索引的數據表。
如下圖:
每一個multi_index容器都可以理解成傳統數據庫中的一張表,但是行和列稍有不同。和傳統的多列的表不同的是,multi_index只有一列。這一列中的每一行都表示一個對象,通常這個對象是struct或者是class類型的,有多個成員變量。因此雖然只有一列,但是multi_index的靈活性絲毫不亞于傳統的數據表。
舉個例子,比如下面的這個struct:
// @abi table proposal i64 struct Proposal { uint64_t id; account_name owner = 0; string description; std::vectorvotes; uint64_t primary_key() const { return id; } EOSLIB_SERIALIZE( Proposal, (id)(owner)(description)(votes)) }; typedef eosio::multi_index proposals;
首先看第一行:
// @abi table proposal i64
在部署合約之前,我們都會用eosiocpp來生成ABI,EOS智能合約編譯器可以讀取struct結構體和public方法之前的注。在注釋中我們可以傳入兩種類型:action和table,ABI就會根據我們的聲明,自動在生成的ABI中添加相應的方法或者表定義。
第二個proposal就是表名,而第三個i64就是表的主鍵的類型。在這里主鍵就是id。
account_name注意到第二個成員變量owner:
account_name owner = 0;
這里的account_name是EOS自己定義的類型,也就是之前我們曾經創建過的賬戶名??梢岳斫獬梢蕴恢械?b>address類型。
vectorstd::vectorvotes;
vector這里可以理解成以太坊中的mapping - 自定義的一個映射集合。
Primary Keysuint64_t primary_key() const { return id; }
eosio::multi_index規定,每行必須有一個主鍵,類型為64位的無符號整型。表中的對象都會根據主鍵,升序或者降序排列。通過在struct中定義primary_key()方法來獲取。在這個例子中,Proposal的主鍵就是id,類型為uint64_t。當然主鍵的類型也可以是account_name等。(account_name在eos中被存儲為uint64_int類型)。
數據序列化EOSLIB_SERIALIZE( Proposal, (id)(owner)(description)(votes))
通過閱讀contracts/eosiolib/serialize.hpp文件可以知道,它其實是使用了BOOST_PP_SEQ_FOR_EACH宏。它的作用基本上就是賦予了struct額外的操作,可以把數據序列化到multi_index,或者從multi_index中反序列化出來。
multi_index相關操作雖然不想SQL語句那樣豐富,但是multi_index依然提供了一些基礎的操作:
創建:使用.emplace
查詢:使用.find
修改已存在的入口:使用.modify
舉個查詢的例子:
auto itr = proposals.find(proposal_id)
以上語句查詢了特定id的proposal,它返回的是一個迭代器iterator。這就涉及到我們如何使用表中的數據,答案就是迭代器。
可以把迭代器想象成一個電梯,在整個數據表中上下滑動(來定位數據),任何對數據的操作都必須通過迭代器。
結束語這一章概念雖然有些多,但是值得大家仔細研究。這一章我們學習了:
RAM的概念:存儲用戶高頻使用的數據的地方,比如當前狀態;
EOS數據庫的概念以及如何存儲;
multi_index是什么 - 和數據庫交互的容器
這一章理論性的內容偏多,理解上可能不如之前的幾篇直觀。下一篇我們將學習如何操作multi_index,以此帶大家更加深入地理解multi_index,同時正式開啟我們的智能合約開發之旅。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/24223.html
摘要:以太坊項目成為第一個安裝稱為智能合約技術的區塊鏈協議,允許陌生人在無信任環境中簽訂協議。以太坊使用的共識機制稱為工作量證明,與其他流行的區塊鏈相同,如比特幣,比特幣現金和萊特幣。 顯然,你已經聽說過兩個最受歡迎的智能合約區塊鏈,但想知道EOS與以太坊之中哪個更好?或許你想比較一下兩種技術?好吧,你來對了地方,因為我要告訴你你需要知道的一切! 在這個EOS vs Ethereum指南中,...
摘要:多索引數據庫是中的一種數據結構,它根據范圍的定義方式提供存儲數據的靈活性。例如,每個帳戶已存儲在合約中定義的多索引數據庫中的數,該合約由定義范圍的每個帳戶的一小塊組成。 對于EOS RAM的來說什么最重要呢?我們經常在每天的數字貨幣和區塊鏈相關新聞中看到EOS旁邊的RAM這個詞,但是無論如何我們應該關注它的價格,為什么要關注它的價格,即使是那些只想深入了解智能合約開發的人也需要這樣嗎?...
前言 未來的公司形態會不斷地演化,去中心化,分布式,強化合作,適應變化,直到徹底地被網絡化。終極公司的形式將會變得與生物體相同,無縫地集成到生態圈中,成為其中的一個環節?!?凱文·凱利《失控》 小劇場 小二: 糖糖,我愛你哦~ 糖糖: 你騙人!男人的話能信母豬能上樹。 小二: 我可以向全世界證明,我說的是真的~ 糖糖: 那你怎么證明啊~ 小二: 我可以用 區塊鏈 寫下 糖糖我愛你哦~...
摘要:比特幣區塊鏈無疑是當今業界的最熱門的。目前,每個成功的礦工獲得可能每年更換一次或通過比特幣社區決策作為成功向區塊鏈添加一塊交易的獎勵。填寫其他詳細信息,例如比特幣金額和可選說明。 比特幣區塊鏈無疑是當今業界的最熱門的。通過這篇博客,我將盡力向大家介紹加密貨幣比特幣的概念,以及它如何創造我們稱之為區塊鏈的革命性技術。 這個問題經常引起混淆。這篇文章可以快速解釋和清理這方面的混亂! 什么是...
閱讀 3170·2021-09-10 10:51
閱讀 3351·2021-08-31 09:38
閱讀 1639·2019-08-30 15:54
閱讀 3129·2019-08-29 17:22
閱讀 3214·2019-08-26 13:53
閱讀 1960·2019-08-26 11:59
閱讀 3283·2019-08-26 11:37
閱讀 3308·2019-08-26 10:47