学习
实践
活动
工具
TVP
写文章

EOS技术研究:合约与数据库交互(一)

EosStore的自白

我们是由一群Eos坚定信仰者、区块链技术发烧友组成,立志与EOS持有者一起共建一个自由、开放、平等、互信的高效去中心化社区。同时作为超级节点的竞选者之一,期望可以成为其守护者以及EOS生态繁荣的建设者,并致力构造一个开放、多元、平衡的应用生态。感谢大家的支持,请与我们一起见证未来…

智能合约操作链数据库是很常见的应用场景。EOS提供了专门的工具来做这件事(相当于Ethereum的leveldb),专业术语叫做持久化API,本文将完整严密地介绍这个工具以及对它的使用测试。

关键字:EOS,智能合约,链数据库,eosio::multi_index,constructor,emplace,erase,find。

需求

首先来看EOS中智能合约涉及到持久化的场景需求。一个action在执行时会有上下文变量出现,包括事务机制的处理,这些内容会应用链上分配的内存资源,而如果没有持久化技术,执行超过作用域时就会丢失掉这些上下文数据。因此要使用持久化技术将关键内容记录在链数据库中,任何时候使用都不受影响。持久化技术应该包括:

记录一些状态持久化到数据库中

具备查询的能力从数据库中获取内容

提供C++ 的API来调用这些服务,也服务于合约开发者

eosio::multi_index

这是模仿boost::multi_index开发的一套库。它使用C++编写,提供了合约与数据库的交互持久化接口。

Multi-Index Iterators:不同于其他key-value数据库,multi_index提供了不同类型的key对应的值也是可迭代的复杂集合类型。

创建表

class/struct 定义一个持久化对象。

该对象需要有一个const的成员作为主键,类型为uint64_t

二级主键可选,提供不同的键类型

为每个二级索引定义一个键导出器,键导出器是一个函数,可以用来从Multi_index表中获取键

使用Multi-Index表

一般来讲,对数据库的操作无外乎增删改查,

增加对应的方法是emplace

修改就是modify

删除是erase

查找包括find和get,以及迭代器操作

实战

下面我们通过一个智能合约操作底层数据库的实例,来演示对持久化api,multi_index的使用。过程中,也会展示相应api的定义。

车辆维修跟踪

首先,创建一个service表,用来创建服务记录报告,它包含的字段有:

主键,客户ID不可当做主键,因为一个客户可以有多条记录。实际上,我们并不直接需要主键,所以我们可以让系统为我们生成一个。

客户ID,与账户名字对应

服务日期

里程表,汽车里程表

使用eosiocpp工具生成abi文件和wast文件。

然后在终端中部署该合约,

调用合约的exec方法,并输出结果:

通过输出结果,可以知道主键为13,customer账户名被转为无符号32位整型数据14927180964919508992,服务时间为2000,里程表为1000。我们已经成功将数据存入了multi_index并取了出来。

删除的话可以通过service_table.erase(result);来删除掉对应记录。

find涉及二级索引,迭代器等操作,end判断等multi_index的api操作没有给出具体实例,未来在其他合约使用时会直接说明。

(未完待续,敬请期待)

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180528G1W5FS00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券