1. 主键和二级索引

1.1 multi_index的主键

必须是唯一的,且类型是uint64_t,且须实现primary_key()方法返回主键字段。

  • eosio::multi_index支持类似的语义,但是该对象的主键在eosio::multi_index容器必须是唯一的无符号64位整数。
  • eosio::multi_index中的对象容器按主键索引按无符号64位整数主键的升序排序。

1.2 二级索引

  • Multi-Index表最多可以使用16个二级索引,可以通过多索引进行排序;
  • 得为每个二级索引定义一个函数,用于从Multi-Index表的函数中获取键,这个函数会被indexed_by()使用。

1.2.1 二级索引的数据类型

  • uint64_t:64位无符号整型键
  • uint128_t:128位无符号整型键
  • eosio::checksum256:256位固定大小字典键
  • double:双精度浮点键
  • long double

2. EOS智能合约与EOS数据库的数据交互

智能合约无法直接操作存储在硬盘中的数据表,而是需要使用multi_index作为中间工具(或者叫容器),每个multi_index实例都与一个特定账户的特定数据表进行交互(取决于实例化时的参数)

mysql多级索引 多级索引表_二级索引

3. 动作上下文 action context

包含内容

  • 当前交易数据 the Current Transaction Data.
  • 交易头 transaction header
  • 交易中所有原始操作的动作有序vector
  • 交易中上下文无关操作的向量
  • 由实现契约的代码定义的可修剪上下文无关数据集(作为blob向量提供)以及blob向量的完整索引。
    a prunable set of context free data (provided as a vector of blobs) defined by the code that implements the contract, and a full index to the vector of blobs.

在操作处理之前,EOSIO会为该操作设置一个干净的工作内存,用以存储动作的工作内存变量。

一个动作的工作内存仅对该动作可用,甚至对同一事务中的动作也是如此。

当执行另一个操作时可能设置的变量在另一个操作的上下文中不可用。在操作之间传递状态的唯一方法是将其持久化并从EOSIO数据库中检索。

3.1 一个动作的其他功能

-在EOSIO持久存储中保持更改状态

-将当前交易通知收件人

-向新接收方发送内联操作请求

-生成新(递延)交易记录

-取消现有(正在进行的)延迟事务(即取消已提交的延迟事务请求)