国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【許曉笛】EOS 數(shù)據(jù)庫與持久化 API —— 實戰(zhàn)

yck / 3054人閱讀

摘要:查詢數(shù)據(jù)使用方法和其他迭代器操作查詢數(shù)據(jù)。數(shù)據(jù)庫服務的對象是維修技師和車主。如果查找成功,迭代器就會指向所需的數(shù)據(jù)對象。

EOS 數(shù)據(jù)庫開發(fā)實戰(zhàn)

上次的文章詳細講解了 EOS 數(shù)據(jù)庫的架構(gòu),本文將以官方示例為基礎(chǔ),詳解 EOS 數(shù)據(jù)庫的開發(fā)實戰(zhàn)。

基本步驟

在智能合約里與 EOS 數(shù)據(jù)庫交互,首先要定義存儲的數(shù)據(jù):

定義對象:具體就是定義一個 C++ 類或者 C++ 結(jié)構(gòu)體,數(shù)據(jù)表就由一個個對象組成。

定義主鍵:在剛才的類/結(jié)構(gòu)體中,定義一個const類型的成員函數(shù)primary_key(),返回值必須為uint64_t類型,返回值即為主鍵。

定義索引:EOS 數(shù)據(jù)表不光可以按照主鍵搜索數(shù)據(jù),還可以定義多達 16 種索引。而且索引鍵(Key)不止支持64位無符號整數(shù),還支持 128、256位整數(shù)以及雙精度、四精度浮點數(shù)。

為每個索引定義 鍵提取器(key extractor)

存儲數(shù)據(jù)定義好之后,就可以與數(shù)據(jù)庫交互了:

建立數(shù)據(jù)表:實例化 multi_index,建立數(shù)據(jù)表。

增刪數(shù)據(jù):使用emplace方法在表中添加數(shù)據(jù);使用erace方法刪除數(shù)據(jù)。

修改數(shù)據(jù):使用modify方法修改數(shù)據(jù)。

查詢數(shù)據(jù):使用getfind方法和其他迭代器操作查詢數(shù)據(jù)。

需求分析

我們參考 EOS 的官方示例,建立一個“汽車修理店”智能合約所需要的數(shù)據(jù)庫。數(shù)據(jù)庫服務的對象是維修技師和車主。每次車輛維修保養(yǎng)后,維修技師都可以添加本次維修服務的信息,可以更科學地管理每位客戶的車輛維修保養(yǎng)服務。而且維修技師和車主都可以更新車輛目前的里程,以便技師確定車輛是否應該保養(yǎng)。我們需要一個數(shù)據(jù)表:維修數(shù)據(jù)表(service Table)。

建立數(shù)據(jù)對象

維修數(shù)據(jù)表中,每一條數(shù)據(jù)對象就是一次車輛維修保養(yǎng)的數(shù)據(jù),包含以下成員:

主鍵:因為數(shù)據(jù)表主鍵必須是唯一的,所以無法用顧客的賬戶名作為主鍵(同一個顧客有多條維修記錄)。這里我們讓系統(tǒng)自動生成主鍵。

顧客賬戶:存儲每次維修服務的顧客賬戶名。

維修日期:每次維修服務的日期。

車輛里程:每次服務時,車輛的里程信息。

我們還想方便的查詢每個顧客的維修記錄,所以需要一個以顧客賬戶名為鍵(Key)的索引。

這樣我們就得到了 service_rec 結(jié)構(gòu)體:

struct service_rec {
    uint64_t        pkey;           // 主鍵
    account_name    customer;       // 顧客賬戶
    uint32_t        service_date;    // 維修日期
    uint32_t        odometer;        // 車輛里程
    
    //設置主鍵
    auto            primary_key()const { return pkey; }
    //設置索引
    account_name    get_customer()const { return customer; }

    //SERIALIZE 宏可以幫助提高編譯速度
    EOSLIB_SERIALIZE( service_rec, (pkey)(customer)(service_date)(odometer) )
};
建立數(shù)據(jù)表

下面就可以建立數(shù)據(jù)表了,首先,multi_index是個模板類:(對 C++ 模板不熟悉的可以百度一下)

eosio::multi_index 

我們需要填入以下multi_index的模板參數(shù):

TableName為數(shù)據(jù)表名稱,12字符以內(nèi),只能使用小寫字母,數(shù)字1-5,小數(shù)點“.”。

T為數(shù)據(jù)對象類型,這里就是我們定義的service_rec結(jié)構(gòu)體。

Indices為索引列表,最多十六個。為了降低開發(fā)難度,官方推薦使用const_mem_fun模板,大家可以模仿官方的做法:

按照需求,我們這樣設置multi_index的模板參數(shù):

using service_table_type = multi_index*/indexed_by< N(bycustomer), const_mem_fun >
>;

這里并沒有實例化multi_index,只是將填入相應模板參數(shù)的multi_index設置了一個別名:service_table_type。依然,對這里的做法不熟悉的可以看一下 C++ 模板類以及 C++ 的 using 關(guān)鍵字。

下面我們實例化multi_index,構(gòu)造函數(shù)需要兩個參數(shù):

multi_index( uint64_t code, uint64_t scope )

其中,code為數(shù)據(jù)表的擁有者,scope為數(shù)據(jù)表的細分名稱。這里有兩種理解,一種理解是不同的 scope 就是不同的數(shù)據(jù)表,也就是說,在同一個賬戶下,存在著TableName相同的多個數(shù)據(jù)表,他們的scope互不相同;另一種理解:scope表示了同一個數(shù)據(jù)表的不同部分,互相獨立讀寫。這兩種理解的結(jié)果是一樣的,就是唯一確定一個數(shù)據(jù)表需要三個參數(shù):TableNamecodescope

實例化multi_index

service_table_type service_table( current_receiver(), mechanic );

上面的code = current_receiver(),表示當前的智能合約,即“汽車維修店合約”。如果這里的code為其他合約,那么說明這個multi_index指向了其他賬戶名下的數(shù)據(jù)表,在本合約中就只能進行讀取操作了。scope = mechanic表明實例化的這個multi_index指向了細分名稱為mechanic(以維修技師賬戶命名)的數(shù)據(jù)表。

我們所建立的數(shù)據(jù)表結(jié)構(gòu)如下圖所示。

操作數(shù)據(jù)

一般數(shù)據(jù)庫的基本操作是增、刪、改、查,EOS 數(shù)據(jù)庫當然也具有這些功能。

新增數(shù)據(jù)

新增數(shù)據(jù)需要用到multi_indexemplace方法:

const_iterator emplace( unit64_t payer, Lambda&& constructor )

其中的payer參數(shù)位儲存空間支付賬戶,也就是由誰來提供新加入的這個數(shù)據(jù)對象的存儲空間,這里填入維修技師mechanic賬戶。constructor是個 Lambda 表達式,也叫匿名函數(shù),是向emplace方法傳入了一個構(gòu)造函數(shù),用來構(gòu)造這個新的數(shù)據(jù)對象。

service_table.emplace(mechanic,/*<-儲存空間支付賬戶*/ [&]( auto& s_rec )/*<-匿名函數(shù)*/ {
    s_rec.pkey = service_table.available_primary_key(); /*<-系統(tǒng)生成可用主鍵*/ //匿名函數(shù)體
    s_rec.customer = eosio::chain::string_to_name(customer_name);             //匿名函數(shù)體
    s_rec.service_date = service_date;                                        //匿名函數(shù)體
    s_rec.odometer = odometer;                                                //匿名函數(shù)體
});

其中的customer_nameservice_dateodometer要在實際開發(fā)時使用有意義的變量。

查詢數(shù)據(jù)

由于service_table數(shù)據(jù)表的主鍵是沒有意義的,所以我們需要使用bycustomer索引來根據(jù)顧客賬戶名(customer)查詢數(shù)據(jù)。

auto customer_index = service_table.template get_index();

這樣我們就得到了bycustomer索引,我們可以使用索引的find方法來按照索引查找特定customer的數(shù)據(jù)對象。

//建立要查找的賬戶,注意這里的customer_name要使用有意義的字符串
account_name customer_acct = eosio::chain::string_to_name(customer_name);
//使用`find`方法查找數(shù)據(jù),使cust_itr(迭代器)指向所需數(shù)據(jù)
auto cust_itr = customer_index.find(customer_acct);

如果沒有查找到,cust_itr(迭代器)就是service_table.end(),也就是搜索到最后也沒有找到對應的數(shù)據(jù)。如果查找成功,cust_itr(迭代器)就會指向所需的數(shù)據(jù)對象。

之后,可以使用下面的代碼可以遍歷數(shù)據(jù)表中所有我們所需的條目。(因為顧客賬戶名不是唯一的,用find方法會找到符合條件的第一條數(shù)據(jù))

while (cust_itr != service_table.end() /*<-判斷迭代器位置*/&& cust_itr->customer == customer_acct/*<-判斷數(shù)據(jù)是否符合*/) {

    // 業(yè)務邏輯,對數(shù)據(jù)進行處理
   
    cust_itr++;//迭代器自增,指向下一條數(shù)據(jù)
} 
修改數(shù)據(jù)

在迭代器指向數(shù)據(jù)后,可以對數(shù)據(jù)進行修改,使用modify方法:

service_table.modify(cust_itr,/*<-迭代器*/, mechanic, /*<-儲存空間支付賬戶*/ [&]( auto& s_rec )/*<-匿名函數(shù)*/ {
    
    s_rec.customer = new_customer;             //匿名函數(shù)體
    s_rec.service_date = new_service_date;     //匿名函數(shù)體
    s_rec.odometer = new_odometer;             //匿名函數(shù)體
});

匿名函數(shù)中的new_customernew_service_datenew_odometer請使用有意義的變量。也可以只修改其中部分變量。

刪除數(shù)據(jù)

在迭代器指向數(shù)據(jù)后,可以對數(shù)據(jù)進行刪除,使用erase方法:

service_table.erase( cust_itr/*<-迭代器*/ );

至此,帶領(lǐng)大家了初步解了 EOS 數(shù)據(jù)庫開發(fā)的思路與方法,EOS 數(shù)據(jù)庫還有很多 API 可以供智能合約使用,大家可以查閱官方 Wiki:
https://github.com/EOSIO/eos/...


相關(guān)文章和視頻推薦

【許曉笛】EOS 數(shù)據(jù)庫與持久化 API —— 架構(gòu)

圓方圓學院匯集大批區(qū)塊鏈名師,打造精品的區(qū)塊鏈技術(shù)課程。 在各大平臺都長期有優(yōu)質(zhì)免費公開課,歡迎報名收看。
公開課地址:https://ke.qq.com/course/345101? ? ?

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/24411.html

相關(guān)文章

  • 曉笛EOS 數(shù)據(jù)庫久化 API —— 架構(gòu)

    摘要:與數(shù)據(jù)庫交互的被官方稱為,中文可以叫做持久化。下圖為數(shù)據(jù)結(jié)構(gòu)。所有對數(shù)據(jù)的操作必須通過迭代器完成。迭代器會移動到需要的數(shù)據(jù)對象上。相關(guān)文章和視頻推薦許曉笛數(shù)據(jù)庫與持久化實戰(zhàn)圓方圓學院匯集大批區(qū)塊鏈名師,打造精品的區(qū)塊鏈技術(shù)課程。 EOS 數(shù)據(jù)庫結(jié)構(gòu)詳解 在 EOS 中,智能合約執(zhí)行完畢后,所占用的內(nèi)存會釋放。程序中的所有變量都會丟失。如果智能合約里要持久地記錄信息,比如游戲智能合約要記...

    piglei 評論0 收藏0
  • 曉笛EOS 系統(tǒng)架構(gòu)圖解

    摘要:了解系統(tǒng)架構(gòu)之前我們先看看目前系統(tǒng)的主要組成部分系統(tǒng)的核心進程,也就是所謂的節(jié)點。 其實沒有那么復雜 相信關(guān)心 EOS 系統(tǒng)的同學肯定見過下面這張藍圖。對,目前只是一個藍圖,而且以 BM 的尿性,肯定在心理已經(jīng)把這張圖改的面目全非了(比如圖中的 eosd 早就改名了)。所以這張圖只能作為未來 EOS 發(fā)展方向的參考而已,目前的 EOS 還遠沒有這么復雜和完善。 showImg(http...

    vibiu 評論0 收藏0
  • 曉笛EOS智能合約案例解析(1)

    摘要:構(gòu)造函數(shù)為空,參數(shù)為智能合約賬戶名。每個智能合約類都要繼承類類構(gòu)造函數(shù)創(chuàng)建代幣函數(shù)聲明函數(shù),這個函數(shù)用來新建一種代幣,并輸入代幣的各種屬性,同時函數(shù)也是一個。 詳解 EOS 智能合約的 hpp 文件 為了幫助大家熟悉 EOS 智能合約,EOS 官方提供了一個代幣(資產(chǎn))智能合約 Demo —— eosio.token。eosio.token 智能合約目前還不是特別完善,個別功能還沒有完...

    forsigner 評論0 收藏0
  • 曉笛】從零開始運行EOS系統(tǒng)

    摘要:成為最早一批運行的人復習一下上次文章的內(nèi)容,系統(tǒng)主要有三個應用程序系統(tǒng)的核心進程,也就是所謂的節(jié)點。建立本地單節(jié)點測試網(wǎng)絡構(gòu)建完成后,我們進入目錄使用和命令,運行節(jié)點程序命令中,參數(shù)表示使用了賬戶的權(quán)限,這是本地測試系統(tǒng)提供的原始賬戶。 成為最早一批運行EOS的人 復習一下上次文章的內(nèi)容,EOS 系統(tǒng)主要有三個應用程序: nodeos: EOS 系統(tǒng)的核心進程,也就是所謂的節(jié)點。 ...

    zoomdong 評論0 收藏0
  • 曉笛】聽說你買了EOS ,連代碼什么樣都不知道?

    摘要:說點題外話如果你想提高英語的話,持有一點代幣吧,你會急于搞清楚白皮書在講什么,要是想短時間快速提高英語,持有大量代幣吧,別問我是怎么知道的。 最近發(fā)現(xiàn)很多人投資了EOS,卻并不關(guān)心 EOS 目前的開發(fā)進度和技術(shù)細節(jié),如果你投資了 EOS, 還有一定的技術(shù)基礎(chǔ),那就更應該關(guān)心 EOS 的開發(fā)情況了,下面我們就從 EOS 的源代碼說起: Github 是目前最流行的源碼管理網(wǎng)站,無數(shù)明星項...

    imccl 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<