3.07 EOS資料庫應用
1.EOS資料庫介紹
- 資料庫是輔助智慧合約儲存一些狀態和資料
- 資料庫執行在記憶體中,是KV儲存(區塊鏈就是分散式的KV儲存問題),通過multi_index與資料庫互動建表和操作,multi_index可以理解為一個表
- 資料庫是按不同賬戶分不同空間,Account裡實際上還有scope,scope中有table
- EOS資料庫的重點
- 資料表定義
- 多索引使用
- 迭代器使用
2.資料表
- mulit_index相當於傳統資料庫的一個表
- 但它將傳統資料庫行與列改為了單純的列,只有一個列,並且只儲存一個物件,也就是儲存C++的一個物件
- 物件中可以包含多個屬性,也可以實現類似於傳統資料庫的多列形式
- 官方的“汽車維修店”資料定義例項:
- 這是一個物件,一個物件是表中的一列
struct service_rec{
uint64_t pkey;
account_name customer;
uint32_t service_date;
uint32_t odometer;
}
3.多索引表
- 因為整個是一列,所以訪問資料中的屬性比較麻煩
- 可以在屬性上建立索引,便於操作
- 建立多索引,表必須有主鍵,必須是無符號的64位整型,所有物件按照主鍵升序排序的,小在前,大在後
auto primary_key()const{return pkey;}
- 主鍵本來就是索引,還可以自定義其他索引
- 例如使用車主使用者名稱做二級索引
account_name get_customer()const{return customer;}
- 索引起作用的程式碼:
- multi_index是EOS智慧合約關鍵字,宣告一個index使用
- <>中service是要定義的表名,service_rec是表中物件的struct宣告,indexed_by是宣告index的關鍵字,bycustomer是index的名字
using service_table_type=multi_index<service,service_rec,
indexed_by<N(bycustomer),const_men_fun<service_rec,
account_name,&service_rec::get_customer>>>;
- 左邊表按pkey排序,然後右邊新的index再次排序,指向前面的關聯資料
4.EOS多索引迭代器
- 例如上面新建立的索引,如果想使用,需要用到索引迭代器
- 最後一句話,呼叫customer_index的find方法,就是去查詢,find是EOS資料庫的API
account_name customer_acct=
eosio::chain::string_to_name(customer_name);
auto cust_itr=customer_index.find(customer_acct);
- 例如查詢Bob,將所有Bob都放到迭代器中,然後從迭代器中去查結果
- 通過定義資料表、index,再通過資料庫API使用index,返回迭代器,最後通過迭代器的遍歷可以訪問資料
- 使用的示例程式碼:
- while迴圈中判斷迭代器是否到最後一個,如果不是,去訪問裡面的customer,去過濾,看是否是想要的customer
while(cust_itr!=service_table.end()&&
cust_itr->customer==customer_acct){
//code
...
cust_itr++;
}
5.資料庫API介紹
- 構造一個multi_table的時候,要呼叫這個建構函式進行初始化
- code就是擁有當前表管理許可權的賬戶
- scope是在這個賬戶名下的一些區域,不同區域是隔離的
- 向表中新增新物件,類似插入的操作,插入一行
- constructor是怎麼構造這一行的Object,是一個lambda表示式
- 通過傳入主鍵,搜尋物件
6.資料庫應用案例
- 啟動網路
- 設定兩個alias
- 生成wast檔案
- 生成abi檔案
- 檢視容器中的合約
- 解鎖錢包
- 部署合約
- 檢視賬戶下的智慧合約
- 插入資料
- 檢視資料
- 再建立一個賬戶插入資料
- 檢視賬戶資訊
- 用新建的賬戶插入資料
- 檢視資料
- 檢視錶
- 更新資料
- 再次檢視資料
- 使用自定義索引,當前日誌不列印查詢的內容,需要再開一個會話看日誌
- 用自己賬戶也可以查到eosio的資料
- 使用自定義索引檢視區間資料,然後在日誌中檢視
- 刪除資料
- 關閉網路
7.如何升級非系統合約
- 如果同一個合約有程式碼變動,只需要重新編譯、部署即可升級
- 如果程式碼沒有任何改動重新部署是沒必要的,也會提示此合約程式碼已經存在的錯誤
學院Go語言視訊主頁
https://edu.csdn.net/lecturer/1928
[清華團隊帶你實戰區塊鏈開發]
(https://ke.qq.com/course/344443?tuin=3d17195d)
掃碼獲取海量視訊及原始碼 QQ群:
721929980
相關文章
- 應用適配資料庫還是資料庫適配應用資料庫
- oracle資料庫資料字典應用Oracle資料庫
- 資料庫在資料分析中如何應用資料庫
- 資料庫應用優化(一)資料庫優化
- 圖資料庫及應用場景資料庫
- 大型資料庫應用 作業(一)資料庫
- 資料庫應用開發一、vs資料庫
- 【許曉笛】EOS 資料庫與持久化 API —— 架構資料庫持久化API架構
- 【許曉笛】EOS 資料庫與持久化 API —— 實戰資料庫持久化API
- 資料庫應用系統中的資料庫完整性(上)KP資料庫
- 圖資料庫有哪些應用場景?資料庫
- Go Web 程式設計--應用資料庫GoWeb程式設計資料庫
- HTAP資料庫及應用場景分析資料庫
- 資料庫版本管理工具Flyway應用資料庫
- 大型資料庫應用——一些筆記資料庫筆記
- JSP+JDBC資料庫應用開發初步JSJDBC資料庫
- 使用 Bytebase 管理 Rainbond 上的應用資料庫AI資料庫
- 基於 EventBridge 構建資料庫應用整合資料庫
- 【劉文彬】EOS技術研究:合約與資料庫互動資料庫
- 淺談資料庫防火牆技術及應用資料庫防火牆
- [譯] 在 Laravel 應用程式之間共享資料庫Laravel資料庫
- 圖資料庫在主機安全的應用探索資料庫
- Go Web 程式設計入門--應用資料庫GoWeb程式設計資料庫
- 大型Electron應用本地資料庫技術選型資料庫
- 2.8 使用資料庫服務管理應用負載資料庫負載
- Elasticsearch資料庫 | Elasticsearch-7.5.0應用搭建實戰Elasticsearch資料庫
- B樹在資料庫索引中的應用剖析資料庫索引
- 蘇寧citus分散式資料庫應用實踐分散式資料庫
- C/C++ Qt 資料庫與SqlTableModel元件應用C++QT資料庫SQL元件
- 使用dbunit測試spring + mybatis的資料庫應用SpringMyBatis資料庫
- 理論+應用,帶你瞭解資料庫資源池資料庫
- 普元EOS 8閘道器設計及應用
- AIOps在京東資料庫運維中的典型應用AI資料庫運維
- 應用端連線MySQL資料庫報Communications link failureMySql資料庫AI
- MySQL資料庫binlog解析神器-binlog2sql應用MySql資料庫
- 快速搭建基於 Serverless 的 .NET Core 資料庫應用Server資料庫
- Oracle 12.2應用PSU後資料庫無法啟動Oracle資料庫
- Elasticsearch資料庫 | Elasticsearch-7.5.0應用基礎實戰Elasticsearch資料庫