在 EOS 中,智能合约执行完毕后,所占用的内存会释放。程序中的所有变量都会丢失。如果智能合约里要持久地记录信息,比如游戏智能合约要记录每位用户游戏记录,本次合约执行完毕后数据不能丢失,就需要将数据存储到 EOS 数据库中。与数据库交互的 API 被官方成为 Persistence API,中文可以叫做持久化 API。下图说明了 EOS 智能合约在执行 Action 时,与数据库的交互过程。

为了方便智能合约与 EOS 数据库的交互,EOS 仿造了 Boost 库中的 Multi-Index Containers,开发了 C++ 类:eosio::multi_index(以下简称 multi_index),中文可以叫做多索引列表类。
multi_index 头文件地址:
https://github.com/EOSIO/eos/blob/master/contracts/eosiolib/multi_index.hpp
在 EOS 见证人硬盘中,为每个账户都预留了数据库空间(大小与代币持有量有关),每个账户名下可以建立多个数据表。智能合约无法直接操作存储在见证人硬盘中的数据表,需要使用multi_index作为中间工具(或者叫容器),每个multi_index实例都与一个特定账户的特定数据表进行交互(取决于实例化时的参数)。EOS智能合约与EOS数据库的数据交互如下图所示。

数据表
multi_index是一个非常方便的数据库交互容器,可以存储任何 C++ 数据类型。每一个multi_index都相当于传统数据库的一个数据表(table),但将传统数据库的行与列的形式改为了单纯的列。也就是说multi_index是一个线性排列的表,只有一列,每一行都只存储一个对象。但是一般来说multi_index存储的对象都是结构体或者类,里面含有多个成员变量,所以multi_index存储数据的灵活性也是不亚于传统数据库的。
我们使用官方的“汽车维修店”示例,我们建立一个数据表,储存每个汽车维修店客户的账户名、保养时间、车辆里程。那么multi_index数据表储存的项目中,每个都是如下的结构体:
struct service_rec {
uint64_t pkey; // 主键
account_name customer; // 车主用户名
uint32_t service_date; // 维修保养时间
uint32_t odometer; // 车辆里程
};
在传统数据库中,需要建立一个 4 列的数据表,用来储存每个用户的这个 4 个数据,而multi_index的每个数据表只有一列,只存储每个用户的 service_rec 整个结构体即可。下图为multi_index数据结构。
多索引
首先,每个数据表要有一组主键,主键必须是无符号 64 位整数类型(64-bit integer),这就是上面的service_rec结构体中第一个变量为uint64_t类型的原因。在数据表中,所有的对象就是按照主键升序排列的,小的在前,大的在后。主键可以是有意义的,也可以是没有意义的,让系统产生一个在这个数据表中没有被使用的主键即可。为了设置主键,我们需要在之前的service_rec结构体添加一个叫做primary_key()的成员函数函数的返回值为主键。
auto primary_key()const { return pkey; }1
这样就将pkey这个变量设置成了主键。
multi_index从字面上看就是能使用多个索引的数据表。EOS 中,每个multi_index或者说每个数据表都可以设置最多16个索引。索引相当于使用特定的方式给数据表中的对象重新排序。比如在我们经常使用的 windows 文件管理器中,可以按照文件名排序、按照文件修改时间排序、按照文件大小排序,这就有了3个索引。EOS 数据库索引更加灵活,可以单独按照结构体中的某个变量索引,也可以将变量之间的运算结果(函数输出)进行索引。如果我们想使用车主用户名进行索引,需要在结构体中添加一个get_customer()成员函数,函数的返回值为索引变量。
account_name get_customer()const { return customer; }
这样就将customer这个变量设置成了数据表的一个索引,下图右侧为customer索引。

迭代器
multi_index是如何操作数据表中的每个对象的呢?答案是 Iterators(迭代器)。大家可以搜索 “C++ 迭代器”或者设计模式中的“迭代器模式”来了解迭代器的设计思路。在 EOS 数据库中,我更愿意将迭代器比喻为一个“电梯”,在整个数据表中上下穿梭。所有对数据的操作必须通过迭代器完成。典型的数据修改过程是这样的:首先使用迭代器的find()方法,在特定的索引中寻找需要的数据,比如在车主用户名索引中寻找某个用户。迭代器会移动到需要的数据对象上。然后就可以使用迭代器的modify()方法修改当前迭代器对应的数据。下图为迭代器指向用户 Sue 的情况。

本篇文章介绍了 EOS 数据库的基本结构,以后的文章会详细介绍 EOS 数据库使用实战,敬请期待。

【问链-EOS公开课】第八课 EOS 数据库与持久化 API(一)相关推荐

  1. 【问链-Eos公开课】第一课 EOS简介

    一.Eos简介 EOS(Enterprise Operation System),企业操作系统,是为企业级分布式应用设计的一款区块链操作系统.相比于目前区块链平台性能低.开发难度大以及手续费高等问题, ...

  2. 【问链-EOS公开课】第九课 EOS 数据库与持久化 API(二)

    上次的文章详细讲解了 EOS 数据库的架构,本文将以官方示例为基础,详解 EOS 数据库的开发实战. 基本步骤 在智能合约里与 EOS 数据库交互,首先要定义存储的数据: 定义对象:具体就是定义一个 ...

  3. 【问链-Eos公开课】第二课 EOS环境搭建(Ubuntu系统下)

    1.EOS三个组件: nodeos:服务端区块链节点组件,也就是区块生产节点,用于接受客户端的远端请求,并打包区块,主要包含四个插件,chain_plugin.http_plugin.net_plug ...

  4. 肖臻公开课(八)——比特币中的挖矿

    本笔记对应北京大学肖臻老师<区块链技术与应用>公开课第八课. 0.前言 在本节中,肖老师首先回顾了一下节点的定义,然后讲了讲挖矿的现有的趋势. 1.全节点和轻节点 以下介绍了一些全节点和轻 ...

  5. 一块链习公开课:从 0 到 1 构建去中心化应用 | ArcBlock 预告

    2019 年 6 月 16 日 上午 10 点,ArcBlock 区块基石研发副总裁陈天将出席"一块链习"主办的第 30 期<区块链技术公开课 100 讲>,探讨分享今 ...

  6. 盒子模型代码_果冻公开课第五课:五分钟理清盒模型的前世今生

    果冻公开课第五课:五分钟理清盒模型的前世今生 在前端程序员眼中,页面其实可以被视为一个个盒子组成的 那么,这些盒子是如何构建起整个页面的呢? 动画视频: 如何理解盒子模型 文字解析: 在上一节里面 我 ...

  7. 小学教师计算机课评课,信息技术公开课的评课

    信息技术公开课的评课 (即使没有听课的教师看本文也是有用的,能领会我的意思,并学到一点知识的.有几处是精彩之处,值得大家细看.) 用◎表示一点. 宏观指与本节无关的内容,如个人素质,总体印象,对课程理 ...

  8. 【问链财经-EOS公开课】 第十八课 史上最全EOS 资源汇总

    EOS 主网 超级节点 https://eos.live,EOS 竞选节点列表,by SuperONE https://www.imeos.one/block-producer,EOS 竞选节点列表, ...

  9. 【问链-EOS公开课】第十六课 EOS中文白皮书2.0

    摘要 EOS.IO软件引入了一种新的区块链架构,意在实现去中心化应用的性能扩展.通过创建类似操作系统的结构,在此基础上可构建各种应用程序.该软件提供帐户.身份验证.数据库.异步通信以及在数以百计的CP ...

最新文章

  1. Spring Hiernate整合
  2. git :设置 object-c 的忽略文件
  3. pytorch 笔记:tensorboardX
  4. 成功解决This DCH driver package is not compatible with the currently installed version of Windows. This
  5. P3375 【模板】KMP字符串匹配 (KMP模板)
  6. java arrays.equals_Java Arrays类的常见使用
  7. Java高级工程师实战经验图谱
  8. 《Linux内核设计与实现》读书笔记(十一)- 定时器和时间管理
  9. 可应用于实际的14个NLP突破性研究成果(四)
  10. Linux创建swap文件
  11. IO流 (一) ----- 基本概念和FIle类
  12. openssl 1.1.1b 如何制作SM2公钥(在Ubuntu 19.04下测试通过)
  13. Leetcode Top100题目和答案(Java完整版 面试必备)
  14. c语言专业面试问题,c语言面试问题(共3篇).doc
  15. mysql僵尸进程_僵尸进程产生原因和解决方法
  16. 不是所有国产软件都像360一样流氓!这些良心国产软件不该被埋没
  17. 互联网、云计算之用户服务
  18. java连缀怎样写_【20200625】连缀例话:-写文章的7项好处
  19. android charles 证书_手机安装Charles证书
  20. HTML + Css实现页面特效

热门文章

  1. (转)Silverlight显示本地图片、Stream转Byte数组
  2. 编程方法学16:数组
  3. Git学习笔记:远程仓库
  4. [云炬创业基础笔记]第九章企业的法律形态测试4
  5. 科大星云诗社动态20210409
  6. 致青春——谁的青春没有遗憾2018-01-05
  7. [C++调试笔记]网格划分grid_pic.cpp
  8. 云炬Android开发笔记 3-1项目架构初始化
  9. 专栏 | 基于 Jupyter 的特征工程手册:数据预处理(三)
  10. oracle表查询不动怎么转储,Oracle常用的转储方法总结