阅读本文前,您需要熟悉eos节点的操作流程,熟悉cleos客户端基础指令,并且对自定义合约的开发有着一定的了解。

操作系统:MAC OS 10.13.x,EOSIO版本号:1.1.3

背景

在EOS自定义合约开发过程中有持久化存储的需求,则需要创建一个用作持久化存储的数据库。EOS中的数据库是通过multi_index来完成交互与访问。

下面通过我们先创建数据表,并进行数据表进行增删改查。

1 创建数据表

创建智能合约

在创建数据表前,我们首先需要创建智能合约,关于智能合约的创建,网上有很多这样的教程,文本不再赘述。

可以参考EOSIO3.0 hello world 从 0 到 1

创建数据表结构

//@abi table cactus.db i64

struct cts_db {

uint64_t id;

string store_content;

uint64_t primary_key() const { return id; }

EOSLIB_SERIALIZE(cts_db, (id)(store_content))

};

typedef multi_index cactus_db_index;

//@abi table cactus.db i64 表示生成abi的时候生成name为cactus.db index_type为i64 的表。下面是生成的abi中的表结构。

"tables": [{

"name": "cactus",

"index_type": "i64",

"key_names": [

"id"

],

"key_types": [

"uint64"

],

"type": "cts_db"

}

]

其中有几点注意事项以及可能会由此导致的问题:

//@abi table 生成abi的时候会生成该新的数据表,不加则生成的abi中table无内容,进行查表操作的时候显示如下。

Table cactus.db is not specified in the ABI

在对表名进行命名是要注意,表名长度需要小于13(不包括13)个字符,且只能包含.12345abcdefghijklmnopqrstuvwxyz这些字符,否则查找的时候会提示错误。

一定需要有primary_key()方法。

当//@abi table中声明的表名包括'.'时,生成abi文件时会将'.'后面的内容忽略,可以观察上方生成的abi文件中"name"为"cactus"而不是在代码中所声明的"cactus.db"。

若//@abi table后不写声明表名,生成abi时表名会取结构体的名字。

生成multi_index对象时,multi_index时,table_name需要与上面所声明的table_name一致,否则会造成查表的时候内容为空的情况。

cactus-MacBook-Pro:cactus_db huid$ cleos get table cactus huid cactus

{

"rows": [],

"more": false

}

2 操作简单数据表

获取数据表信息

cleos get table code scope table_name

这里的code与scope与创建实例对象时multi_index(code, scope)的参数相对应,否则获取的时候虽然不会报错,但是没有内容。

数据表插入方法使用

///@abi action

void ctsstore(account_name user){

cactus_db_index ctsdb( _self, user );

ctsdb.emplace( user, [&]( auto& a) {

a.id = ctsdb.available_primary_key();

a.store_content = store_content;

});

}

其中available_primary_key()是一个实用的方法,可以提供主键自增长功能。

执行并获取表信息。

cleos push action cactus ctsstore '{"user":"huid", "store_content":"cactus"}' -p huid@active

cleos push action cactus ctsstore '{"user":"huid", "store_content":"cactus"}' -p huid@active

cleos get table cactus huid cactus

{

"rows": [{

"id": 0,

"user_name": "cactus"

},{

"id": 1,

"user_name": "cactus"

}

],

"more": false

}

数据表查找方法使用

cactus_db_index ctsdb( _self, user );

auto& itr = ctsdb.get( id , "data not found" );

数据表修改方法使用

///@abi action

void ctsmodify( uint64_t id, account_name user, string store_content ){

cactus_db_index ctsdb( _self, user );

auto& itr = ctsdb.get( id , "data not found" );

ctsdb.modify( itr, user, [&]( auto& a ) {

a.store_content = store_content;

});

}

执行并获取表信息。

cleos push action cactus ctsmodify '{"id":1, "user":"huid", "store_content":"db"}' -p huid@active

cleos get table cactus huid cactus

{

"rows": [{

"id": 0,

"user_name": "cactus"

},{

"id": 1,

"user_name": "db"

}

],

"more": false

}

数据表删除方法使用

///@abi action

void ctserase( uint64_t id, account_name user ){

cactus_db_index ctsdb( _self, user );

auto &itr = ctsdb.get( id , "data not found" );

ctsdb.erase( itr );

}

执行并获取表信息。

cleos push action cactus ctserase '{"id":1, "user":"huid"}' -p huid@active

cleos get table cactus huid cactus

{

"rows": [{

"id": 0,

"user_name": "cactus"

}

],

"more": false

}

源代码

#include

using namespace eosio;

using namespace std;

class cactus_db : public contract {

public:

using contract::contract;

///@abi action

void ctsstore( account_name user, string store_content ){

cactus_db_index ctsdb( _self, user );

ctsdb.emplace( user, [&]( auto& a ) {

a.id = ctsdb.available_primary_key();

a.store_content = store_content;

});

}

///@abi action

void ctsmodify( uint64_t id, account_name user, string store_content ){

cactus_db_index ctsdb( _self, user );

auto& itr = ctsdb.get( id , "data not found" );

ctsdb.modify( itr, user, [&]( auto& a ) {

a.store_content = store_content;

});

}

///@abi action

void ctserase( uint64_t id, account_name user){

cactus_db_index ctsdb( _self, user );

auto &itr = ctsdb.get( id , "data not found" );

ctsdb.erase( itr );

}

private:

//@abi table cactus.db i64

struct cts_db {

uint64_t id;

string store_content;

uint64_t primary_key() const { return id; }

EOSLIB_SERIALIZE(cts_db, (id)(store_content))

};

typedef multi_index cactus_db_index;

};

EOSIO_ABI(cactus_db, (ctsstore)(ctsmodify)(ctserase))

3 多索引数据表

多索引表数据表和简单数据表在定义的时候不同。

简单数据表: multi_index

多索引数据表: multi_index

indexed_by,

indexed_by,

….>>

多索引数据表较简单数据表多了一个indexed_by,, 以下具体说明。

创建多索引数据表

private:

//@abi table cactus.db i64

struct cts_db {

uint64_t id;

uint64_t index_id;

string store_content;

uint64_t primary_key() const { return id; }

uint64_t get_index_id() const { return index_id; }

EOSLIB_SERIALIZE(cts_db, (id)(index_id)(store_content))

};

typedef multi_index< N(cactus), cts_db, indexed_by< N(index_id),

const_mem_fun< cts_db, uint64_t, &cts_db::get_index_id > > > cactus_db_index;

};

注意点:

除了主键函数外还需要写一个索引键值函数,如get_index_id()

结构中的<>注意成对。

多索引数据表查找并修改

cactus_db_index ctsdb( _self, user );

auto idx = ctsdb.template get_index();

auto itr = idx.find(mtrans::get_index_id(index_id));

if ( itr == ctsdb.end() ) { print("don't find"); }

else{

ctsdb.modify( itr, user, [&](auto &a ){

a.store_content = store_content;

});

}

eos 连接mysql_EOS智能合约中数据库的使用与常见问题相关推荐

  1. Eos的Wasm智能合约的局限性

    官方只支持用C++写智能合约 用C++写智能合约门槛过高,会把许多开发者挡在门外,C++的复杂性也会让智能合约的设计变得困难. Wasm智能合约的效率并不是最优 由于C++最终也是编译成wasm字节码 ...

  2. 【许晓笛】EOS 什么是智能合约(3)

    详解 EOS 智能合约的 abi 文件 这次向大家介绍 eosio.token 智能合约的最后一个文件 -- abi文件.ABI 全称 Application Binary Interface,中文名 ...

  3. 以太坊智能合约中随机数预测

    一.前言 作为首次币发行(ICO)的平台,以太坊已经获得了极大的普及. 但是,它不仅仅用于 ERC20 通证,轮盘,彩票和纸牌游戏都可以使用以太坊区块链实现. 与任何区块链实施一样,以太坊是不可逆的, ...

  4. 以太坊EVM智能合约中的数据存储

    目录 EVM基本信息 数据管理 Stack Args Memory Storage 固定长度的值 动态长度数组 Mappings 复杂类型的组合 总结 EVM基本信息 以太坊是一种基于栈的虚拟机,基于 ...

  5. 来自智能合约中的威胁:去中心化应用安全威胁Top10榜单

    NCC Group 发起了一个名为 2018 年去中心化应用安全 Top10 ( Decentralized Application Security Project)的项目.据悉,该项目会与类似于 ...

  6. 数据:锁定在智能合约中的MKR供应占比已创下16个月新高

    Glassnode数据显示,锁定在智能合约中的MKR供应占比已创下16个月以来的新高,目前为58.287%. 文章链接:https://www.tuoluocaijing.cn/kuaixun/det ...

  7. solidity智能合约中tx.origin的正确使用场景

    简介 tx.origin是Solidity的一个全局变量,它遍历整个调用栈并返回最初发送调用(或事务)的帐户的地址.在智能合约中使用此变量进行身份验证会使合约容易受到类似网络钓鱼的攻击. 但针对tx. ...

  8. 如何在智能合约中调用另一个合约的函数

    智能合约是在区块链中被执行的一段程序,因为它们在区块链上执行,所以不依赖于任何的中心化服务器.目前最主流的智能合约编程语言是 Solidity. 在以太坊区块链中,智能合约可以和其他已经部署的智能合约 ...

  9. EOS之记事本智能合约

    EOS记事本智能合约 本次分享的内容是一个记事本合约,调用合约中的写入动作可以将文本和作者保存到数据库中,通过记事本合约来学习EOS智能合约数据存储当中的主键自增. 合约动作 写入动作 记事本合约必须 ...

最新文章

  1. 2016年日本信息安全市场规模分析
  2. KMeans中的K怎么选择?Elbow method怎么实施?
  3. 《WCF技术内幕》翻译2:《WCF技术内幕》绪论
  4. 图解 wp WordPress 文章 链接 在新窗口打开
  5. 解决Asp.net中的Chart控件运行出现错误提示“ ChartImg.axd 执行子请求时出错”
  6. USB 之四 USB 发展(更名)史 / USB 规范变化
  7. 抓包红色_抓包三部曲 WebSocket 协议原理抓包分析
  8. 头条搜索“美丽中国”,你为哪处风景胜地打过Call?
  9. setwindowpos怎么改变z序_【情感问答】||朋友圈子小,沉默寡言嘴不甜,情商低,该怎么脱单?...
  10. 关于“Fluent UI”或Ribbon Design报道的补充说明
  11. cocos2d-x 10.1版本 修复真机上白屏问题
  12. 360路由器v2刷第三方固件_路由器不拆闪存,编程器刷机技巧,恢复出厂固件办法...
  13. DEDE 文章常用标签
  14. Python语言程序设计基础_实验4 流程控制II_答案_通识教育必修课程_上海师范大学
  15. 基于android的理财软件,基于Android的理财系统APP的设计
  16. 数据库期末大作业:机票预定信息系统数据库设计与实现
  17. 三星手机动态修改分辨率信息
  18. Python 实现简单的客户端认证
  19. 复制文本到word中时产生底色的去除方法
  20. 【Linux修炼】6.gcc/g++及Makefile【工具篇】

热门文章

  1. 学习Python中turtle模块的基本用法(4:绘制科赫曲线和谢尔宾斯基三角形)
  2. 如何解决Redis缓存雪崩、击穿与穿透
  3. Como criar uma linguagem usando ANTLR4 e Java
  4. nginx patch补丁方式添加 nginx_upstream_check_module 模块,并测试健康检查
  5. 智能车竞赛技术报告 | 节能信标组 - 北京科技大学节能信标组
  6. carsim与simulink联合仿真 eps+sbw+lka 动力学车辆模型
  7. 让阿根廷队“告吹”的三个球背后,2022 年世界杯暗藏哪些技术玄机?
  8. winapi属于底层开发吗_请问一下关于VC++的Winmain函数(WINAPI是什么?)
  9. antd pro v5 tab标签卡(多标签页)实现
  10. 10 23 周总结+一道奇妙数论