帶數據庫的智能合約

編寫使用數據庫的智能合約
前面一直在搗鼓EOS網絡搭建的相關東西。然而今天比較不走運的是,興致勃勃的把源碼版本升到4.0,在編譯的時候如我所猜想的出現了一系列問題,正一籌莫展的時候,導師突然問了我一個關于合約如何操作數據庫的問題。沒辦法,前面沒怎么關注這一塊,于是乎吞吞吐吐沒能回答老師的問題。心想,反正現在源碼有問題,搭不了網絡,干脆花點時間看看合約的內容。
于是乎,就有了今天的學習筆記,內容如下:

直接上實例合約源碼
addressbook.cpp源碼:

include <eosiolib/eosio.hpp>

include

using eosio::indexed_by;
using eosio::const_mem_fun;
using std::string;

class addressbook : public eosio::contract {
public:
//構造函數
explicit addressbook(action_name self) : contract(self) {}

//添加聯系人
//@abi action
void add(const account_name account, const string& name, uint64_t phone) {//獲取授權,如果沒有授權,Action調用會中止,事務會回滾require_auth(account);//eosio::multi_index(多索引表)可以用來讀取和修改EOS數據庫//address_index是自己定義的eosio::multi_index//實例化address數據表(multi_index),參數用于建立對表的訪問權限//如果訪問自己的合約則具有讀寫權限,訪問其他人的合約則具有只讀權限address_index addresses(_self, _self);//multi_index的find函數通過主鍵(primary_key)查詢數據,返回迭代器itr//auto關鍵字會自動匹配類型auto itr = addresses.find(account);//如果判斷條件不成立,則終止執行并打印錯誤信息eosio_assert(itr == addresses.end(), "Address for account already exists");//添加數據//使用存儲需要付費,第一個參數account是付費的賬戶addresses.emplace(account, [&](auto& address){address.account = account;address.name = name;address.phone = phone;});
}//修改聯系人信息
//@abi action
void update(const account_name account, const string& name, uint64_t phone) {require_auth(account);address_index addresses(_self, _self);auto itr = addresses.find(account);//如果沒有找到account,打印錯誤信息并終止eosio_assert(itr != addresses.end(), "Address for account not found");addresses.modify(itr, account, [&](auto& address){address.account = account;address.name = name;address.phone = phone;});
}//刪除聯系人
//@abi action
void remove(const account_name account) {require_auth(account);address_index addresses(_self, _self);auto itr = addresses.find(account);eosio_assert(itr != addresses.end(), "Address for account not found");//刪除addresses.erase(itr);
}//設置聯系人為特別關注
//@abi action
void like(const account_name account) {//無需獲取授權,每個人都可以調用like Actionaddress_index addresses(_self, _self);auto itr = addresses.find(account);eosio_assert(itr != addresses.end(), "Address for account not found");//修改相應的liked字段addresses.modify(itr, 0, [&](auto& address){//打印提示信息eosio::print("Liking: ", address.name.c_str(), "\n");address.liked++;});
}//功能和like()相同,但通過phone查詢數據,而不是主鍵
//@abi action
void likebyphone(uint64_t phone) {address_index addresses(_self, _self);//獲取自定義索引auto phone_index = addresses.get_index<N(phone)>();auto itr = phone_index.lower_bound(phone);for(; itr != phone_index.end() && itr->phone == phone; ++itr) {phone_index.modify(itr, 0, [&](auto& address){eosio::print("Liking: ", address.name.c_str(), "\n");address.liked++;});}
}

private:
//定義address表,i64表示索引使用默認的uint64_t類型
//@abi table address i64
struct address {
uint64_t account;
string name;
uint64_t phone;
uint64_t liked;

    //定義address表的主鍵,address表是一個multi-index表uint64_t primary_key() const { return account; }uint64_t get_phone() const {return phone; }EOSLIB_SERIALIZE(address, (account)(name)(phone)(liked));
};//默認通過主鍵索引,使用indexed_by,可以通過自定義函數進行索引
//這里是get_phone,即通過phone字段進行索引
typedef eosio::multi_index< N(address), address,indexed_by<N(phone), const_mem_fun<address, uint64_t, &address::get_phone>>>
address_index;

};

EOSIO_ABI(addressbook, (add)(update)(remove)(like)(likebyphone))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
該合約業務邏輯是實現一個通訊錄的功能,其中包括增加聯系人、更新聯系人信息、刪除聯系人以及將聯系人標記為特別關注。

接下來我們來一步步來看該合約是如何實現的。

創建表格
1)定義結構體
該結構體的成員變量為表的字段,成員函數primary_key()定義主鍵,get_phone()定義二級索引,EOSLIB_SERIALIZE宏定義序列化表字段如下:

struct address {uint64_t account;string name;uint64_t phone;uint64_t liked;//定義address表的主鍵,address表是一個multi-index表uint64_t primary_key() const { return account; }uint64_t get_phone() const {return phone; }EOSLIB_SERIALIZE(address, (account)(name)(phone)(liked));
};

1
2
3
4
5
6
7
8
9
10
11
12
其中宏EOSLIB_SERIALIZE定義如下

#define EOSLIB_SERIALIZE( TYPE, MEMBERS ) template friend DataStream& operator << ( DataStream& ds, const TYPE& t ){ return ds BOOST_PP_SEQ_FOR_EACH( EOSLIB_REFLECT_MEMBER_OP, <<, MEMBERS ); } template friend DataStream& operator >> ( DataStream& ds, TYPE& t ){ return ds BOOST_PP_SEQ_FOR_EACH( EOSLIB_REFLECT_MEMBER_OP, >>, MEMBERS ); }

轉載于:https://www.cnblogs.com/xiaocongcong888/p/9892714.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450849.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450849.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450849.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

沒有完美的軟件:編程永遠不容易

摘要&#xff1a;很多人想用十全十美來修飾一樣東西&#xff0c;比如軟件&#xff0c;對于客戶來說&#xff0c;當然希望他們的軟件能做到完美。雖然很多專家說利用一些規范可以讓軟件達到更好&#xff01;但是在現實開發中&#xff0c;真的會有那么完美的軟件嗎&#xff1f; 最…

Eclipse斷點調試出現Source not found

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 我的情況是和網上說的都不一樣&#xff0c;我真的也沒有想到這么坑&#xff0c; 我居然無意寫了一個死循環&#xff0c;dao/mapper調sql…

Memory Compression這到底是個什么東西?

Memory Compression這到底是個什么東西&#xff1f; Memory Compression這個進程&#xff0c;經過我的查詢說是內存壓縮功能&#xff0c;作用是壓縮內存讓內存占用更低&#xff0c;但是為什么這個進程瘋狂占用我的內存&#xff0c;我用的Win10 8G&#xff0c;通過資源監視器查看…

MySQL 5.6 for Windows 解壓縮版配置安裝

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 MySQL是一個小巧玲瓏但功能強大的數據庫&#xff0c;目前十分流行。但是官網給出的安裝包有兩種格式&#xff0c;一個是msi格式&#xf…

safari的一些問題

1、圖片過大時&#xff0c;在webview中是不會加載顯示的。2、如果是通過一個地址返回的base64數據給image&#xff0c;記住要在后臺進行base64_decode解析數據&#xff0c;這樣才是真實的圖片數據&#xff0c;后臺保存數據的時候不要保存"data:image/png;base64,"這一…

代碼審查“思維導圖”

摘要&#xff1a;隨著人們對軟件質量要求的不斷提高&#xff0c;軟件開發的每一個環節都應該得到十足的重視&#xff0c;俗話說&#xff1a;“細節決定成敗”&#xff0c;就此&#xff0c;本文提供了一個代碼審查“思維導圖”&#xff0c;希望對所有碼農們有所幫助。 代碼審查&…

thinkCMF----導航高亮顯示

導航高亮顯示&#xff0c;有多種方法&#xff0c;這里給出一個簡單的表示下&#xff1a; <a href"__ROOT__"><span class"text db">網站首頁</span><span class"eng db">HOME</span> </a> …

The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 tomcat啟動報務后訪問頁面報錯&#xff1a; org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/co…

優秀程序員和一般程序員差別在哪?

摘要&#xff1a;在這個世界上有兩種程序員&#xff1a;Day Programmers&#xff08;白班程序員&#xff09;和Night Programmers&#xff08;夜貓子程序員&#xff09;&#xff0c;你知道優秀程序員和一般程序員有哪些差別嗎&#xff1f;你又是哪一類型的呢&#xff1f;俗話說…

7. Oracle數據加載和卸載

在日常工作中&#xff1b;經常會遇到這樣的需求&#xff1a; Oracle 數據表跟文本或者文件格式進行交互&#xff1b;即將指定文件內容導入對應的 Oracle 數據表中&#xff1b;或者從 Oracle 數據表導出。其他數據庫中的表跟Oracle數據庫進行交互。若是少量數據&#xff1b;可選…

Navicat工具導出mySQL數據庫某個視圖結構的.sql腳本

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 用Navicat工具怎么都導不出來mySQL數據庫的某個視圖.sql腳本&#xff0c;即使導出來也只是包含視圖記錄&#xff0c;不包含視圖結構。經…

瞧瞧蘋果OS X如何干掉Linux

摘要&#xff1a;如果你去過Facebook或者其它一些創業類科技公司&#xff0c;你會發現隨處可見的Mac&#xff0c;無論是CEO還是開發者&#xff0c;都可能在使用Mac。而以往很受IT人士青睞的Linux好像在消失&#xff0c;這是真的嗎&#xff1f;蘋果OS X是如何干掉Linux的&#x…

超全十大經典排序算法及其分析

文章目錄0.算法概述0.1 算法分類0.2 算法復雜度0.3 相關概念1. 冒泡排序&#xff08;Bubble Sort&#xff09;1.1 算法描述&#xff1a;1.2 圖解演示1.3 代碼實現1.4 優化過程1.5 性能分析2. 選擇排序&#xff08;Selection Sort&#xff09;2.1 算法描述&#xff1a;2.2 圖解演…

eclipse安裝JAVA反編譯插件

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 前言&#xff1a;在實際的開發中幾乎都會使用到一些框架來輔助項目的開發工作&#xff0c;對于一些框架的代碼我們總懷有一些好奇之心&a…

noip2014生活大爆炸版石頭剪刀布

題目描述 石頭剪刀布是常見的猜拳游戲:石頭勝剪刀,剪刀勝布,布勝石頭。如果兩個人出拳一 樣&#xff0c;則不分勝負。在《生活大爆炸》第二季第8集中出現了一種石頭剪刀布的升級版游戲。 升級版游戲在傳統的石頭剪刀布游戲的基礎上,增加了兩個新手勢: 斯波克:《星際迷航》主角之…

初識react(二) 實現一個簡版的html+redux.js的demo

回顧 初識react(一) 揭開jsx語法和虛擬DOM面紗初識react(二) 實現一個簡版的htmlredux.js的demo初識react(三)在 react中使用redux來實現簡版計數器初識react(四) react中異步解決方案之 redux-saga初識react(五) 數據流終極解決方案 dva(零配置)前言 首先糾正個誤區&#xff0…

12個有趣的C語言面試題

摘要&#xff1a;12個C語言面試題&#xff0c;涉及指針、進程、運算、結構體、函數、內存&#xff0c;看看你能做出幾個&#xff01; 1.gets()函數 問&#xff1a;請找出下面代碼里的問題&#xff1a; #include<stdio.h> int main(void) { char buff[10]; memset…

超全Typora快速入門

文章目錄一.Typora快速入門1.代碼塊2.標題3.字體4.引用5.水平分割線6.圖片插入7.超鏈接8.列表9.表格10.任務列表11.數學表達式12.生成目錄13.表情符號14.定義腳注15.文件導出16.主題修改17.修改主題背景圖片18.設置背景透明度19.Typora 插入圖片調整大小20.字體和顏色21.頁內跳…

聊聊畢業設計系列 --- 系統實現

效果展示 github moment-server github地址 moment github地址 moment-manage github地址 articles 聊聊畢業設計系列 --- 項目介紹 聊聊畢業設計系列 --- 系統實現 前言 在上一篇文章中&#xff0c;主要是對項目做了介紹&#xff0c;并且對系統分析和系統設計做了大概的介紹。…

求職小記(持續更新)

自16年春正式工作以來也有兩年半了&#xff0c;也許是對現在leader的不滿。也許是想要折騰一下&#xff0c;也許還有也許&#xff0c;決定換一份工作&#xff0c;結束兩年零四個月的第一家it工作。從8月份的離職到十月底的offer經歷了很多&#xff0c;外面天慢慢的涼了&#xf…