1.EOS数据库介绍

  • 数据库是辅助智能合约存储一些状态和数据
  • 数据库运行在内存中,是KV存储(区块链就是分布式的KV存储问题),通过multi_index与数据库交互建表和操作,multi_index可以理解为一个表
  • 数据库是按不同账户分不同空间,Account里实际上还有scope,scope中有table
    3.07  EOS数据库应用_区块链
  • EOS数据库的重点
    • 数据表定义
    • 多索引使用
    • 迭代器使用

2.数据表

  • mulit_index相当于传统数据库的一个表
  • 但它将传统数据库行与列改为了单纯的列,只有一个列,并且只存储一个对象,也就是存储C++的一个对象
  • 对象中可以包含多个属性,也可以实现类似于传统数据库的多列形式
  • 官方的“汽车维修店”数据定义实例:
  • 这是一个对象,一个对象是表中的一列
struct service_rec{
uint64_t pkey;
account_name customer;
uint32_t service_date;
uint32_t odometer;
}

3.07  EOS数据库应用_GO语言_02

3.多索引表

  • 因为整个是一列,所以访问数据中的属性比较麻烦
  • 可以在属性上建立索引,便于操作
  • 建立多索引,表必须有主键,必须是无符号的64位整型,所有对象按照主键升序排序的,小在前,大在后
auto primary_key()const{return pkey;}
  • 主键本来就是索引,还可以自定义其他索引
  • 例如使用车主用户名做二级索引
account_name get_customer()const{return customer;}
  • 索引起作用的代码:
  • multi_index是EOS智能合约关键字,声明一个index使用
  • <>中service是要定义的表名,service_rec是表中对象的struct声明,indexed_by是声明index的关键字,bycustomer是index的名字
using service_table_type=multi_index<service,service_rec,
indexed_by<N(bycustomer),const_men_fun<service_rec,
account_name,&service_rec::get_customer>>>;
  • 左边表按pkey排序,然后右边新的index再次排序,指向前面的关联数据
    3.07  EOS数据库应用_GO语言_03

4.EOS多索引迭代器

  • 例如上面新创建的索引,如果想使用,需要用到索引迭代器
  • 最后一句话,调用customer_index的find方法,就是去查找,find是EOS数据库的API
account_name customer_acct=
eosio::chain::string_to_name(customer_name);
auto cust_itr=customer_index.find(customer_acct);
  • 例如查找Bob,将所有Bob都放到迭代器中,然后从迭代器中去查结果
    3.07  EOS数据库应用_GO语言_04
  • 通过定义数据表、index,再通过数据库API使用index,返回迭代器,最后通过迭代器的遍历可以访问数据
  • 使用的示例代码:
  • while循环中判断迭代器是否到最后一个,如果不是,去访问里面的customer,去过滤,看是否是想要的customer
while(cust_itr!=service_table.end()&&
cust_itr->customer==customer_acct){
//code
...
cust_itr++;
}

5.数据库API介绍

  • 构造一个multi_table的时候,要调用这个构造函数进行初始化
  • code就是拥有当前表管理权限的账户
  • scope是在这个账户名下的一些区域,不同区域是隔离的
    3.07  EOS数据库应用_GO语言_05
  • 向表中添加新对象,类似插入的操作,插入一行
  • constructor是怎么构造这一行的Object,是一个lambda表达式
    3.07  EOS数据库应用_区块链_06
  • 通过传入主键,搜索对象
    3.07  EOS数据库应用_区块链_07

6.数据库应用案例

  • 启动网络
    3.07  EOS数据库应用_GO语言_08
  • 设置两个alias
    3.07  EOS数据库应用_GO语言_09
    3.07  EOS数据库应用_GO语言_10
  • 生成wast文件
    3.07  EOS数据库应用_区块链_11
  • 生成abi文件
    3.07  EOS数据库应用_GO语言_12
  • 查看容器中的合约
    3.07  EOS数据库应用_GO语言_13
  • 解锁钱包
    3.07  EOS数据库应用_区块链_14
  • 部署合约
    3.07  EOS数据库应用_GO语言_15
  • 查看账户下的智能合约
    3.07  EOS数据库应用_GO语言_16
  • 插入数据
    3.07  EOS数据库应用_GO语言_17
  • 查看数据
    3.07  EOS数据库应用_GO语言_18
    3.07  EOS数据库应用_GO语言_19- 再创建一个账户插入数据
    3.07  EOS数据库应用_区块链_20
  • 查看账户信息
    3.07  EOS数据库应用_GO语言_21
  • 用新建的账户插入数据
    3.07  EOS数据库应用_区块链_22
  • 查看数据
    3.07  EOS数据库应用_区块链_23
  • 查看表
    3.07  EOS数据库应用_GO语言_24
  • 更新数据
    3.07  EOS数据库应用_区块链_25
  • 再次查看数据
    3.07  EOS数据库应用_GO语言_26
  • 使用自定义索引,当前日志不打印查询的内容,需要再开一个会话看日志
    3.07  EOS数据库应用_GO语言_27
  • 用自己账户也可以查到eosio的数据
    3.07  EOS数据库应用_区块链_28
  • 使用自定义索引查看区间数据,然后在日志中查看
    3.07  EOS数据库应用_区块链_29
  • 删除数据
    3.07  EOS数据库应用_区块链_30
  • 关闭网络
    3.07  EOS数据库应用_区块链_31

7.如何升级非系统合约

  • 如果同一个合约有代码变动,只需要重新编译、部署即可升级
  • 如果代码没有任何改动重新部署是没必要的,也会提示此合约代码已经存在的错误

学院Go语言视频主页