带数据库的智能合约

编写使用数据库的智能合约
前面一直在捣鼓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.mzph.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…