如何使用EOS多索引表
这篇文章将为大家详细讲解有关如何使用EOS多索引表,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
成都创新互联公司坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站制作、成都网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的息县网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
为了深入和清晰的了解多索引表,最终的.cpp文件部分将被进一步详细讨论和讨论。注意,完整的.cpp文件可以在页面的底部找到。
词汇表
code
:是指已公布智能合约的account_name
。scope
:account_name
所涉及数据范围。table_name
: 存储在内存中的表的名称。
代码分解
要存储的结构
要在多索引表中存储的数据是limit_order
结构。primary_key()
,get_expiration()
,get_price()
函数用于返回表。返回的表将根据调用的函数排序。
struct limit_order { uint64_t id; uint128_t price; uint64_t expiration; account_name owner; auto primary_key() const { return id; } uint64_t get_expiration() const { return expiration; } uint128_t get_price() const { return price; } EOSLIB_SERIALIZE( limit_order, ( id )( price )( expiration )( owner ) ) };
建一个多索引表
auto payer = ilm.get_account(); ...
payer
是保存帐户的变量,它将账单元素添加到多索引表中,并修改已经在多索引表中的元素。
... eosio::multi_index< N( orders ), limit_order, ...
N(orders)
是多索引表的名称,limit_order
是要存储在表中的数据。
... indexed_by< N( byexp ), const_mem_fun< limit_order, uint64_t, &limit_order::get_expiration> >, ...
indexed_by< N( byexp ), const_mem_fun< limit_order, uint64_t, &limit_order::get_expiration> >
定义了多索引表的索引方式。N(byexp)
是这个索引的名称。const_mem_fun
表示正在查询的数据类型、limit_order
的变量的类型是uint64_t
,将使用get_expiration
函数获取变量。
... indexed_by< N( byprice ), const_mem_fun< limit_order, uint128_t, &limit_order::get_price> > ...
indexed_by< N( byprice ), const_mem_fun< limit_order, uint128_t, &limit_order::get_price> >
定义了多索引表的索引方式。N(byprice)
是这个索引的名称。const_mem_fun
表示正在查询的数据类型、limit_order
的变量的类型是uint128_t
,将使用get_price
函数获取变量。
orders( N( limitorders ), N( limitorders )
orders
即是多索引表。
auto payer = ilm.get_account(); print("Creating multi index table 'orders'.\n"); eosio::multi_index< N( orders ), limit_order, indexed_by< N( byexp ), const_mem_fun< limit_order, uint64_t, &limit_order::get_expiration> >, indexed_by< N( byprice ), const_mem_fun< limit_order, uint128_t, &limit_order::get_price> > > orders( N( limitorders ), N( limitorders ) );
添加多索引表
下面,将两个limit_order
添加到orders
表中。请注意,payer
是正在修改orders
表的“账单”帐户。
orders.emplace( payer, [&]( auto& o ) { o.id = 1; o.expiration = 300; o.owner = N(dan); }); auto order2 = orders.emplace( payer, [&]( auto& o ) { o.id = 2; o.expiration = 200; o.owner = N(thomas); });
按照主键排序
默认的orders
表按照主键排序。
print("Items sorted by primary key:\n"); for( const auto& item : orders ) { print(" ID=", item.id, ", expiration=", item.expiration, ", owner=", name{item.owner}, "\n"); }
按第二索引expiration排序
orders
表通过expiration
进行排序并分配给expidx
。
auto expidx = orders.get_index(); print("Items sorted by expiration:\n"); for( const auto& item : expidx ) { print(" ID=", item.id, ", expiration=", item.expiration, ", owner=", name{item.owner}, "\n"); }
按第二索引price排序
orders
表通过price
进行排序并分配给oridx
。
auto pridx = orders.get_index(); print("Items sorted by price:\n"); for( const auto& item : pridx ) { print(" ID=", item.id, ", expiration=", item.expiration, ", owner=", name{item.owner}, "\n"); }
修改一个输入值
下面,“ID=2”的条目被修改。请注意,payer
是正在修改orders
表的“账单”帐户。
print("Modifying expiration of order with ID=2 to 400.\n"); orders.modify( order2, payer, [&]( auto& o ) { o.expiration = 400; });
得到一个最小值
auto lower = expidx.lower_bound(100); print("First order with an expiration of at least 100 has ID=", lower->id, " and expiration=", lower->get_expiration(), "\n");
完整的.cpp文件
#include#include #include using namespace eosio; namespace limit_order_table { struct limit_order { uint64_t id; uint128_t price; uint64_t expiration; account_name owner; auto primary_key() const { return id; } uint64_t get_expiration() const { return expiration; } uint128_t get_price() const { return price; } EOSLIB_SERIALIZE( limit_order, ( id )( price )( expiration )( owner ) ) }; class limit_order_table { public: ACTION( N( limitorders ), issue_limit_order ) { EOSLIB_SERIALIZE( issue_limit_order ) }; static void on( const issue_limit_order& ilm ) { auto payer = ilm.get_account(); print("Creating multi index table 'orders'.\n"); eosio::multi_index< N( orders ), limit_order, indexed_by< N( byexp ), const_mem_fun< limit_order, uint64_t, &limit_order::get_expiration> >, indexed_by< N( byprice ), const_mem_fun< limit_order, uint128_t, &limit_order::get_price> > > orders( N( limitorders ), N( limitorders ) ); orders.emplace( payer, [&]( auto& o ) { o.id = 1; o.expiration = 300; o.owner = N(dan); }); auto order2 = orders.emplace( payer, [&]( auto& o ) { o.id = 2; o.expiration = 200; o.owner = N(thomas); }); print("Items sorted by primary key:\n"); for( const auto& item : orders ) { print(" ID=", item.id, ", expiration=", item.expiration, ", owner=", name{item.owner}, "\n"); } auto expidx = orders.get_index (); print("Items sorted by expiration:\n"); for( const auto& item : expidx ) { print(" ID=", item.id, ", expiration=", item.expiration, ", owner=", name{item.owner}, "\n"); } auto pridx = orders.get_index (); print("Items sorted by price:\n"); for( const auto& item : pridx ) { print(" ID=", item.id, ", expiration=", item.expiration, ", owner=", name{item.owner}, "\n"); } print("Modifying expiration of order with ID=2 to 400.\n"); orders.modify( order2, payer, [&]( auto& o ) { o.expiration = 400; }); auto lower = expidx.lower_bound(100); print("First order with an expiration of at least 100 has ID=", lower->id, " and expiration=", lower->get_expiration(), "\n"); }; } /// limit_order_table namespace limit_order_table { extern "C" { /// The apply method implements the dispatch of events to this contract void apply( uint64_t code, uint64_t action ) { require_auth( code ); eosio_assert( eosio::dispatch< limit_order_table, limit_order_table::issue_limit_order >( code, action ), "Could not dispatch" ); } } }
删除表
表不能直接删除,但是,在删除所有行之后,表将自动删除。
关于如何使用EOS多索引表就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
文章题目:如何使用EOS多索引表
文章地址:http://myzitong.com/article/gcodeg.html