成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

EOS入門指南PART6——?jiǎng)e忙著開(kāi)發(fā),先來(lái)看看智能合約數(shù)據(jù)是怎么存的

ranwu / 1277人閱讀

摘要:允許智能合約定義自己的私有數(shù)據(jù)庫(kù)表。有了多級(jí)索引,智能合約就具備了操作類似數(shù)據(jù)庫(kù)模塊的功能。因此雖然只有一列,但是的靈活性絲毫不亞于傳統(tǒng)的數(shù)據(jù)表。

上一章我們學(xué)習(xí)了開(kāi)發(fā)智能合約之前需要知道的必要概念:

什么是webAssembly以及它在智能合約上下游中的位置;

什么是ABI以及怎樣使用eosiocpp工具產(chǎn)生ABI和wasm、wast

hello智能合約的簡(jiǎn)單入門:部署和調(diào)用

如果說(shuō)智能合約開(kāi)發(fā)是一個(gè)鎖著門的圖書(shū)館,那么之前的學(xué)習(xí)就是鑰匙?,F(xiàn)在我們終于可以拿著鑰匙打開(kāi)大門,走進(jìn)去一探究竟。

摘要

說(shuō)到智能合約開(kāi)發(fā),大家首先想到的肯定是寫(xiě)代碼、像solidity開(kāi)發(fā)一樣教語(yǔ)法。EOS的智能合約是用C++寫(xiě)的,基本語(yǔ)法大家可以去買本C++的書(shū);這一篇主要介紹EOS智能合約的數(shù)據(jù)存儲(chǔ),為大家掃清智能合約開(kāi)發(fā)道路上的最后一道障礙。

什么是RAM

之前我們?cè)趯W(xué)習(xí)如何在主網(wǎng)創(chuàng)建賬戶時(shí),曾經(jīng)接觸到RAM的概念。我們不能像操作以太坊那樣,憑空生成一個(gè)地址作為自己的賬戶,而是要先有一個(gè)賬戶,再去創(chuàng)建另一個(gè)賬戶。其中就涉及到一個(gè)關(guān)于RAM很關(guān)鍵的知識(shí)點(diǎn):創(chuàng)建賬戶需要消耗RAM。

當(dāng)時(shí)我們只是很模糊地知道,RAM大概是內(nèi)存的意思。

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主網(wǎng)中的內(nèi)存,用于存儲(chǔ)用戶在EOS中使用頻率高的數(shù)據(jù)(賬戶余額、合約狀態(tài)等)。

BM對(duì)EOS的期望是成為區(qū)塊鏈?zhǔn)澜缰械摹静僮飨到y(tǒng)】,因此可以把計(jì)算機(jī)的一些概念對(duì)標(biāo)到EOS中,其中計(jì)算機(jī)中的運(yùn)行內(nèi)存,在EOS中就可以看做是RAM;而硬盤就可以對(duì)標(biāo)EOS區(qū)塊鏈數(shù)據(jù)庫(kù)。

所以高訪問(wèn)量的決策類數(shù)據(jù),例如賬戶余額、智能合約的當(dāng)前狀態(tài)等就會(huì)被存儲(chǔ)在RAM中,并且這部分?jǐn)?shù)據(jù)將長(zhǎng)期占用RAM;而低訪問(wèn)的費(fèi)決策性存證數(shù)據(jù),例如交易數(shù)據(jù),就會(huì)存儲(chǔ)在EOS系統(tǒng)的硬盤中,也就是區(qū)塊鏈中。當(dāng)存儲(chǔ)賬號(hào)狀態(tài)的空間不足,即RAM不足時(shí),轉(zhuǎn)賬或部署合約等相關(guān)操作就無(wú)法執(zhí)行。

什么是EOS數(shù)據(jù)庫(kù)

之前我們?cè)?jīng)介紹過(guò)transaction和action,action是智能合約執(zhí)行的基本單元,transaction可以認(rèn)為是一個(gè)或幾個(gè)action組成的原子性操作。action在被稱為action上下文的環(huán)境中執(zhí)行,action上下文提供了執(zhí)行action所需的一些條件,其中一個(gè)就是action的工作內(nèi)存,這是action保存工作狀態(tài)的地方。在處理一個(gè)action之前,eosio會(huì)先為它清理一次內(nèi)存,因此當(dāng)變量在一個(gè)action中被賦值后,另一個(gè)action的上下文是拿不到這個(gè)值的。那么在action之間傳遞狀態(tài)的唯一方法就是把它持久存儲(chǔ)到EOS數(shù)據(jù)庫(kù)中,如下圖:

這個(gè)持久化存儲(chǔ)就是數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)。EOS允許智能合約定義自己的私有數(shù)據(jù)庫(kù)表。比如上圖,Apply Context的內(nèi)容都是一次性的,一次action執(zhí)行完成,對(duì)象就釋放了,只有存儲(chǔ)到EOSIO database的才被保存。

什么是multi_index

接著上面介紹的數(shù)據(jù)庫(kù)往下說(shuō),?這個(gè)私有數(shù)據(jù)表是通過(guò)multi_index來(lái)訪問(wèn)和交互的。EOS的multi_index類似boost的multi_index,即多索引容器。有了多級(jí)索引,智能合約就具備了操作類似數(shù)據(jù)庫(kù)模塊的功能。

multi_index是一個(gè)非常方便的、可以和數(shù)據(jù)庫(kù)交互的容器。

從字面意思來(lái)看,multi_index就是一個(gè)可以使用多索引的數(shù)據(jù)表。

如下圖:

每一個(gè)multi_index容器都可以理解成傳統(tǒng)數(shù)據(jù)庫(kù)中的一張表,但是行和列稍有不同。和傳統(tǒng)的多列的表不同的是,multi_index只有一列。這一列中的每一行都表示一個(gè)對(duì)象,通常這個(gè)對(duì)象是struct或者是class類型的,有多個(gè)成員變量。因此雖然只有一列,但是multi_index的靈活性絲毫不亞于傳統(tǒng)的數(shù)據(jù)表。

舉個(gè)例子,比如下面的這個(gè)struct

// @abi table proposal i64
struct Proposal {
  uint64_t id;
  account_name owner = 0;
  string description;
  std::vector votes;

  uint64_t primary_key() const { return id; }

  EOSLIB_SERIALIZE( Proposal, (id)(owner)(description)(votes))
};


typedef eosio::multi_index proposals;

首先看第一行:

// @abi table proposal i64

在部署合約之前,我們都會(huì)用eosiocpp來(lái)生成ABI,EOS智能合約編譯器可以讀取struct結(jié)構(gòu)體和public方法之前的注。在注釋中我們可以傳入兩種類型:actiontable,ABI就會(huì)根據(jù)我們的聲明,自動(dòng)在生成的ABI中添加相應(yīng)的方法或者表定義。

第二個(gè)proposal就是表名,而第三個(gè)i64就是表的主鍵的類型。在這里主鍵就是id。

account_name

注意到第二個(gè)成員變量owner:

account_name owner = 0;

這里的account_name是EOS自己定義的類型,也就是之前我們?cè)?jīng)創(chuàng)建過(guò)的賬戶名??梢岳斫獬梢蕴恢械?b>address類型。

vector
std::vector votes;

vector這里可以理解成以太坊中的mapping - 自定義的一個(gè)映射集合。

Primary Keys
 uint64_t primary_key() const { return id; }

eosio::multi_index規(guī)定,每行必須有一個(gè)主鍵,類型為64位的無(wú)符號(hào)整型。表中的對(duì)象都會(huì)根據(jù)主鍵,升序或者降序排列。通過(guò)在struct中定義primary_key()方法來(lái)獲取。在這個(gè)例子中,Proposal的主鍵就是id,類型為uint64_t。當(dāng)然主鍵的類型也可以是account_name等。(account_name在eos中被存儲(chǔ)為uint64_int類型)。

數(shù)據(jù)序列化
EOSLIB_SERIALIZE( Proposal, (id)(owner)(description)(votes))

通過(guò)閱讀contracts/eosiolib/serialize.hpp文件可以知道,它其實(shí)是使用了BOOST_PP_SEQ_FOR_EACH宏。它的作用基本上就是賦予了struct額外的操作,可以把數(shù)據(jù)序列化到multi_index,或者從multi_index中反序列化出來(lái)。

multi_index相關(guān)操作

雖然不想SQL語(yǔ)句那樣豐富,但是multi_index依然提供了一些基礎(chǔ)的操作:

創(chuàng)建:使用.emplace

查詢:使用.find

修改已存在的入口:使用.modify

舉個(gè)查詢的例子:

auto itr = proposals.find(proposal_id)

以上語(yǔ)句查詢了特定id的proposal,它返回的是一個(gè)迭代器iterator。這就涉及到我們?nèi)绾问褂帽碇械臄?shù)據(jù),答案就是迭代器。

可以把迭代器想象成一個(gè)電梯,在整個(gè)數(shù)據(jù)表中上下滑動(dòng)(來(lái)定位數(shù)據(jù)),任何對(duì)數(shù)據(jù)的操作都必須通過(guò)迭代器。

結(jié)束語(yǔ)

這一章概念雖然有些多,但是值得大家仔細(xì)研究。這一章我們學(xué)習(xí)了:

RAM的概念:存儲(chǔ)用戶高頻使用的數(shù)據(jù)的地方,比如當(dāng)前狀態(tài);

EOS數(shù)據(jù)庫(kù)的概念以及如何存儲(chǔ);

multi_index是什么 - 和數(shù)據(jù)庫(kù)交互的容器

這一章理論性的內(nèi)容偏多,理解上可能不如之前的幾篇直觀。下一篇我們將學(xué)習(xí)如何操作multi_index,以此帶大家更加深入地理解multi_index,同時(shí)正式開(kāi)啟我們的智能合約開(kāi)發(fā)之旅。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/24223.html

相關(guān)文章

  • 以太坊和EOS那個(gè)好?

    摘要:以太坊項(xiàng)目成為第一個(gè)安裝稱為智能合約技術(shù)的區(qū)塊鏈協(xié)議,允許陌生人在無(wú)信任環(huán)境中簽訂協(xié)議。以太坊使用的共識(shí)機(jī)制稱為工作量證明,與其他流行的區(qū)塊鏈相同,如比特幣,比特幣現(xiàn)金和萊特幣。 顯然,你已經(jīng)聽(tīng)說(shuō)過(guò)兩個(gè)最受歡迎的智能合約區(qū)塊鏈,但想知道EOS與以太坊之中哪個(gè)更好?或許你想比較一下兩種技術(shù)?好吧,你來(lái)對(duì)了地方,因?yàn)槲乙嬖V你你需要知道的一切! 在這個(gè)EOS vs Ethereum指南中,...

    antyiwei 評(píng)論0 收藏0
  • EOS內(nèi)存即RAM如何買賣

    摘要:多索引數(shù)據(jù)庫(kù)是中的一種數(shù)據(jù)結(jié)構(gòu),它根據(jù)范圍的定義方式提供存儲(chǔ)數(shù)據(jù)的靈活性。例如,每個(gè)帳戶已存儲(chǔ)在合約中定義的多索引數(shù)據(jù)庫(kù)中的數(shù),該合約由定義范圍的每個(gè)帳戶的一小塊組成。 對(duì)于EOS RAM的來(lái)說(shuō)什么最重要呢?我們經(jīng)常在每天的數(shù)字貨幣和區(qū)塊鏈相關(guān)新聞中看到EOS旁邊的RAM這個(gè)詞,但是無(wú)論如何我們應(yīng)該關(guān)注它的價(jià)格,為什么要關(guān)注它的價(jià)格,即使是那些只想深入了解智能合約開(kāi)發(fā)的人也需要這樣嗎?...

    ShevaKuilin 評(píng)論0 收藏0
  • 你所不知道 ? Blockchain

    前言 未來(lái)的公司形態(tài)會(huì)不斷地演化,去中心化,分布式,強(qiáng)化合作,適應(yīng)變化,直到徹底地被網(wǎng)絡(luò)化。終極公司的形式將會(huì)變得與生物體相同,無(wú)縫地集成到生態(tài)圈中,成為其中的一個(gè)環(huán)節(jié)?!?凱文·凱利《失控》 小劇場(chǎng) 小二: 糖糖,我愛(ài)你哦~ 糖糖: 你騙人!男人的話能信母豬能上樹(shù)。 小二: 我可以向全世界證明,我說(shuō)的是真的~ 糖糖: 那你怎么證明啊~ 小二: 我可以用 區(qū)塊鏈 寫(xiě)下 糖糖我愛(ài)你哦~...

    Tecode 評(píng)論0 收藏0
  • 如何理解比特幣和區(qū)塊鏈?

    摘要:比特幣區(qū)塊鏈無(wú)疑是當(dāng)今業(yè)界的最熱門的。目前,每個(gè)成功的礦工獲得可能每年更換一次或通過(guò)比特幣社區(qū)決策作為成功向區(qū)塊鏈添加一塊交易的獎(jiǎng)勵(lì)。填寫(xiě)其他詳細(xì)信息,例如比特幣金額和可選說(shuō)明。 比特幣區(qū)塊鏈無(wú)疑是當(dāng)今業(yè)界的最熱門的。通過(guò)這篇博客,我將盡力向大家介紹加密貨幣比特幣的概念,以及它如何創(chuàng)造我們稱之為區(qū)塊鏈的革命性技術(shù)。 這個(gè)問(wèn)題經(jīng)常引起混淆。這篇文章可以快速解釋和清理這方面的混亂! 什么是...

    Kosmos 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<