摘要:與數據庫交互的被官方稱為,中文可以叫做持久化。下圖為數據結構。所有對數據的操作必須通過迭代器完成。迭代器會移動到需要的數據對象上。相關文章和視頻推薦許曉笛數據庫與持久化實戰圓方圓學院匯集大批區塊鏈名師,打造精品的區塊鏈技術課程。
EOS 數據庫結構詳解
在 EOS 中,智能合約執行完畢后,所占用的內存會釋放。程序中的所有變量都會丟失。如果智能合約里要持久地記錄信息,比如游戲智能合約要記錄每位用戶游戲記錄,本次合約執行完畢后數據不能丟失,就需要將數據存儲到 EOS 數據庫中。與數據庫交互的 API 被官方稱為 Persistence API,中文可以叫做持久化 API。下圖說明了 EOS 智能合約在執行 Action 時,與數據庫的交互過程。
為了方便智能合約與 EOS 數據庫的交互,EOS 仿造了 Boost 庫中的 Multi-Index Containers,開發了 C++ 類:eosio::multi_index(以下簡稱 multi_index`),中文可以叫做多索引列表類。
multi_index 頭文件地址:
https://github.com/EOSIO/eos/...
在 EOS 見證人硬盤中,為每個賬戶都預留了數據庫空間(大小與代幣持有量有關),每個賬戶名下可以建立多個數據表。智能合約無法直接操作存儲在見證人硬盤中的數據表,需要使用multi_index作為中間工具(或者叫容器),每個multi_index實例都與一個特定賬戶的特定數據表進行交互(取決于實例化時的參數)。EOS智能合約與EOS數據庫的數據交互如下圖所示。
數據表multi_index是一個非常方便的數據庫交互容器,可以存儲任何 C++ 數據類型。每一個multi_index都相當于傳統數據庫的一個數據表(table),但將傳統數據庫的行與列的形式改為了單純的列。也就是說multi_index是一個線性排列的表,只有一列,每一行都只存儲一個對象。但是一般來說multi_index存儲的對象都是結構體或者類,里面含有多個成員變量,所以multi_index存儲數據的靈活性也是不亞于傳統數據庫的。
我們使用官方的“汽車維修店”示例,我們建立一個數據表,儲存每個汽車維修店客戶的賬戶名、保養時間、車輛里程。那么multi_index數據表儲存的項目中,每個都是如下的結構體:
struct service_rec { uint64_t pkey; // 主鍵 account_name customer; // 車主用戶名 uint32_t service_date; // 維修保養時間 uint32_t odometer; // 車輛里程 };
在傳統數據庫中,需要建立一個 4 列的數據表,用來儲存每個用戶的這個 4 個數據,而multi_index的每個數據表只有一列,只存儲每個用戶的 service_rec 整個結構體即可。下圖為multi_index數據結構。
多索引首先,每個數據表要有一組主鍵,主鍵必須是無符號 64 位整數類型(64-bit integer),這就是上面的service_rec結構體中第一個變量為uint64_t類型的原因。在數據表中,所有的對象就是按照主鍵升序排列的,小的在前,大的在后。主鍵可以是有意義的,也可以是沒有意義的,讓系統產生一個在這個數據表中沒有被使用的主鍵即可。為了設置主鍵,我們需要在之前的service_rec結構體添加一個叫做primary_key()的成員函數函數的返回值為主鍵。
auto primary_key()const { return pkey; }
這樣就將pkey這個變量設置成了主鍵。
multi_index從字面上看就是能使用多個索引的數據表。EOS 中,每個multi_index或者說每個數據表都可以設置最多16個索引。索引相當于使用特定的方式給數據表中的對象重新排序。比如在我們經常使用的 windows 文件管理器中,可以按照文件名排序、按照文件修改時間排序、按照文件大小排序,這就有了3個索引。EOS 數據庫索引更加靈活,可以多帶帶按照結構體中的某個變量索引,也可以將變量之間的運算結果(函數輸出)進行索引。如果我們想使用車主用戶名進行索引,需要在結構體中添加一個get_customer()成員函數,函數的返回值為索引變量。
account_name get_customer()const { return customer; }
這樣就將customer這個變量設置成了數據表的一個索引,下圖右側為customer索引。
迭代器multi_index是如何操作數據表中的每個對象的呢?答案是 Iterators(迭代器)。大家可以搜索 “C++ 迭代器”或者設計模式中的“迭代器模式”來了解迭代器的設計思路。在 EOS 數據庫中,我更愿意將迭代器比喻為一個“電梯”,在整個數據表中上下穿梭。所有對數據的操作必須通過迭代器完成。典型的數據修改過程是這樣的:首先使用迭代器的find()方法,在特定的索引中尋找需要的數據,比如在車主用戶名索引中尋找某個用戶。迭代器會移動到需要的數據對象上。然后就可以使用迭代器的modify()方法修改當前迭代器對應的數據。下圖為迭代器指向用戶 Sue 的情況。
本篇文章介紹了 EOS 數據庫的基本結構,以后的文章會詳細介紹 EOS 數據庫使用實戰,敬請期待。
【許曉笛】EOS 數據庫與持久化 API —— 實戰
圓方圓學院匯集大批區塊鏈名師,打造精品的區塊鏈技術課程。 在各大平臺都長期有優質免費公開課,歡迎報名收看。
公開課地址:https://ke.qq.com/course/345101? ? ?
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/24412.html
摘要:查詢數據使用方法和其他迭代器操作查詢數據。數據庫服務的對象是維修技師和車主。如果查找成功,迭代器就會指向所需的數據對象。 EOS 數據庫開發實戰 上次的文章詳細講解了 EOS 數據庫的架構,本文將以官方示例為基礎,詳解 EOS 數據庫的開發實戰。 基本步驟 在智能合約里與 EOS 數據庫交互,首先要定義存儲的數據: 定義對象:具體就是定義一個 C++ 類或者 C++ 結構體,數據表...
摘要:了解系統架構之前我們先看看目前系統的主要組成部分系統的核心進程,也就是所謂的節點。 其實沒有那么復雜 相信關心 EOS 系統的同學肯定見過下面這張藍圖。對,目前只是一個藍圖,而且以 BM 的尿性,肯定在心理已經把這張圖改的面目全非了(比如圖中的 eosd 早就改名了)。所以這張圖只能作為未來 EOS 發展方向的參考而已,目前的 EOS 還遠沒有這么復雜和完善。 showImg(http...
摘要:說點題外話如果你想提高英語的話,持有一點代幣吧,你會急于搞清楚白皮書在講什么,要是想短時間快速提高英語,持有大量代幣吧,別問我是怎么知道的。 最近發現很多人投資了EOS,卻并不關心 EOS 目前的開發進度和技術細節,如果你投資了 EOS, 還有一定的技術基礎,那就更應該關心 EOS 的開發情況了,下面我們就從 EOS 的源代碼說起: Github 是目前最流行的源碼管理網站,無數明星項...
摘要:所以想要實現真正實用的智能合約平臺,就要脫離比特幣系統的架構,尋找新的系統組織形式。比特幣和以太坊之所以設計了手續費機制,就是防止大量垃圾交易使得系統擁堵。 區塊鏈系統中,去中心化程度與效率之間天然地存在矛盾關系。 如果區塊鏈智能合約系統想追求類似比特幣的去中心化程度,理論上效率就會大打折扣。現實也是這樣的:比特幣每秒鐘只能處理7筆左右的交易,每一筆交易要用至少30分鐘才能確認,這種效...
摘要:相關文章和視頻推薦許曉笛智能合約案例解析圓方圓學院匯集大批區塊鏈名師,打造精品的區塊鏈技術課程。 Daniel Larimer 在他的博客介紹了EOS新的智能合約架構(EOS團隊的開發速度實在是太嚇人,根本追不上)。他給出了最簡單的一個新幣種的智能合約代碼,僅有49行就能完成一個新幣種的開發,一個新的愛息歐就誕生了。讓我們一步一步實現吧。 首先實現私有成員,建立一個 account 結...
閱讀 877·2021-09-02 09:55
閱讀 1508·2019-12-27 12:02
閱讀 1724·2019-08-30 14:24
閱讀 1146·2019-08-30 14:18
閱讀 2758·2019-08-29 13:57
閱讀 2206·2019-08-26 11:51
閱讀 1371·2019-08-26 10:37
閱讀 770·2019-08-23 16:09