Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

EOS智能合约的多索引表table

西门幻雪雪vj
104 0 0
建多索引表是一种为了在RAM快速访问的方法,主要用来来缓存状态和数据。多索引表支持创建、读取、更新和删除(CRUD)业务,区块链不行(它只支持创建和读取)。5 n9 J9 L) g9 X, u
    多索引表提供了快速访问数据存储接口,是一种存储智能合同中使用的数据的实用的方法。在区块链记录交易信息,你应该使用多索引表存储应用程序数据。3 S" S1 Z" t  F! S2 Z6 N
    使用多索引表,因为他们支持为使用的数据建立多个索引,主索引必须是uint64_t类型和唯一的,但其他的索引,可以有重复的,你可以使用多达16个,类型可以是uint64_t,uint128_t,uint256_t,doubleorlongdouble。7 A* ~" Y( v) w3 x( I) J
    如果你想你需要使用一个字符串做索引,需要转换成一个整数型,将结果存储在随后索引的字段中。) X8 t- _' P  s6 L$ e
    1.创建一个结构
0 K$ U. X8 Y/ u2 f/ F* X    创建一个可以存储在多索引表中的结构,并在要索引的字段上定义getter。  C% T$ H: l: k$ {; a' T
    请记住,这些getter中必须有一个命名为primary_key(),如果没有这个,编译器eosiocpp将产生一个错误…"itcan’tfindthefieldtouseastheprimarykey"即它找不到任何一个字段被作为主键。
: v. ~6 P3 ?* F5 v    如果你想要有一个以上的索引,(最多允许16个),然后为你想要索引的任何字段定义一个getter,这时这个名称就不那么重要了,因为你会把getter名称传递给typedef。
$ ?7 b- P0 _1 F% `% h    ///@abitable
) E( J3 \0 W: s. @1 R! e4 N    structmystruct1 y2 m2 p; C6 Z9 C) B
    {6 R1 ]+ j% m2 g& j+ J' B( A
    uint64_tkey;
7 g1 w6 X7 f5 j5 k    uint64_tsecondid;& [# m9 g. |" X6 Z! H
    std::stringname;
, A6 s5 I+ a& v  @* w8 I    std::stringaccount;
: J0 |- y% U, c) i! g" p    uint64_tprimary_key()const{returnkey;}//getterforprimarykey  ~* R4 Z: ^/ L- W6 Y, W# |/ W
    uint64_tby_id()const{returnsecondid;}//getterforadditionalkey
' u1 D* A3 _& c* D. z3 G    };% N# y' O: \# P' f
    这里还要注意两件事:
' s& V! o* K; M4 }8 r, f! `    1.注释:. \& a2 N9 Z$ `0 ]* g4 Y/ Q
    ///@abitable) V9 d! q+ T1 S7 F* i
    编译器需要使用eosiocpp来识别要通过ABI公开该表并使其在智能合约之外可见。
' t6 r" y# P. P  q9 D; O    2.结构名称少于12个字符,而且所有的字符都要小写字母。
9 b8 a2 p: ~; ~5 C    2.多索引表和定义索引
( K1 w3 D& f% @" `    定义多索引表将使用mystruct,告诉它要索引什么,以及如何获取正在索引的数据。主键将自动创建的,所以使用struct后,如果我想要一个只有一个主键的多索引表,我可以定义它为:
4 [& b( U4 P. Y1 U' |" S. Z    typedefeosio::multi_indexdatastore;; ~. z; ~. ?' O0 c; W" b3 K
    这定义了多个索引通过表名N(mystruct)和结构名mystruct。N(mystruct)会对结构名编译转换到uint64_t,使用uint64_t来标识属于多索引表的数据。
8 O4 K" K1 m3 z5 M    若要添加附加索引或辅助索引,则使用indexed_by模板作为参数,因此定义变为:
& G) f1 m1 S6 x' L$ p9 f4 p    typedefeosio::multi_index>>datastore;5 O" x) `% ]! p( |" @! v7 [! s
    注意:
; t2 x% G) D- N( `8 |* |5 O9 \1 U; [0 ~    indexed_by>( o' }) G7 d3 Q* ^+ \3 ?
    参数:- _" i: i% u- f1 J
    字段的名称转换为整数,N(secondid)
( Q, Q0 n, w- v4 M8 z* v    一个用户定义的密钥调用接口,const_mem_fun
: ?  B5 N8 a2 R  M% k- Q6 _    来看看有三个索引的情况。
/ T9 |/ a7 z4 U! l6 ?3 c  Q' P    ///@abitable
' c7 [4 W" I2 P3 [1 p    structmystruct
7 L8 S7 }& w9 z- i, }+ r    {
+ F6 _/ V# @' a* b: n* p1 h    uint64_tkey;
: D3 _1 l4 A3 v: l3 i# S    uint64_tsecondid;  u: E( C- i) w7 l
    uint64_tanotherid;
! W8 [! g& E! a0 S) l    std::stringname;
0 d% @* T3 b5 D3 t( t. T    std::stringaccount;5 i0 n' s% s& |$ O  P: a4 D* l% B
    uint64_tprimary_key()const{returnkey;}
; _' b# n1 a2 d/ w    uint64_tby_id()const{returnsecondid;}
6 s( B6 X5 H/ d9 d( r9 A" B( f    uint64_tby_anotherid()const{returnanotherid;}. f' H9 L6 }' U3 N7 B; T& M# ^6 j  j
    };
5 n' g( G% u8 @; h: l  O    typedefeosio::multi_index>,indexed_by>>datastore;1 d* E( P- N. I% q0 x4 ^
    更多的就不列了。
, O) `5 O& G: N% @+ c7 t/ |! x" p    这里要注意的一个重要事项是,结构名与表名的匹配,并且将出现在ABI文件中的名称遵循规则(12个字符,所有都是小写的字母)。如果它们没有遵循这个规则,则表不会通过ABI可见(当然可以通过编辑ABI文件来绕过这一点)。  R$ H: i1 ?# V$ P, E
    3.创建定义类型的局部变量
/ D6 a$ Z" e, l6 _1 m5 B) m    //localinstancesofthemultiindexes6 p- E% W) }" C5 W
    pollstable_polls;" k4 o, K" z7 `( r/ |
    votes_votes;4 J, C3 ]; d( t* V
    现在我已经定义了一个带有两个索引的多索引表,我可以在我的智能合约中使用它。
+ _* j: p, V9 \. T# ]' V, t! u    如下是一个智能合约使用两个索引的多索引表的例子。在这里你可以看到如何遍历表,如何在同一合约中使用两个表,我们未来将增加额外的教程,利用多索引表。7 Y4 M8 h6 x. C$ }
    #include  f7 f2 D5 L, m& F8 O1 C& z
    usingnamespaceeosio;
. k$ I- L5 K8 B3 ?3 m    classyouvote:publiccontract{
) k( `7 Y. o0 N    public:
5 u/ N. S' {, H) l1 O& v, k1 p    youvote(account_names):contract(s),_polls(s,s),_votes(s,s)! B, S( j$ U9 t* n
    {}
  U- h& \3 M& W* J8 ^3 g    //publicmethodsexposedviatheABI
/ v2 Z$ q6 I$ s" z    //onpollsTable
$ z  ]/ R$ M  b( l  P! a% S    ///@abiaction0 k4 A& n; ^' G& z  K6 v
    voidversion()
/ I" ]( `9 z' y1 i+ ~9 A    {6 ~5 ?. G+ d5 q! I& ?
    print("YouVoteversion0.01");3 H1 S  z, _; c/ @  d
    };6 _6 j7 L+ E, S/ t& `
    ///@abiaction% Z0 K5 a& p9 p3 X9 D0 {
    voidaddpoll(account_names,std::stringpollName)
6 x7 Z% G( Y+ W( b    {
7 m( [5 }2 v: b0 J& O1 f1 u+ {    //require_auth(s);
5 c, v" B8 N% T3 _0 A: `  g; B    print("Addpoll",pollName);. N2 ?9 }) @0 e' i  v8 }8 u
    //updatethetabletoincludeanewpoll5 {/ Q6 R& e7 k+ ]6 \* @* _
    _polls.emplace(get_self(),[&](auto&p)5 l$ G- R# s6 I
    {
. W1 i, X3 u7 F, ]' H$ M    p.key=_polls.available_primary_key();
( O0 t" J6 f% o$ H5 D! j( o5 I    p.pollId=_polls.available_primary_key();4 ~  X) u) U$ j2 c
    p.pollName=pollName;2 I& \- f3 g  g, m
    p.pollStatus=0;0 Y7 N; {( o% E$ f, q" }7 _
    p.option="";& U3 m3 [  A" @! Y- c% j
    p.count=0;# t0 w3 M2 k3 W5 Z' B8 t
    });
' K% a& i1 A  K+ K, U1 Z    };% ?6 d& [6 I5 Y7 p! S
    ///@abiaction
9 x6 [& {! b7 z3 n& \# b    voidrmpoll(account_names,std::stringpollName)2 `& H$ c9 Z- p/ a; C( _+ i
    {
( @. e4 s" E; m* h    //require_auth(s);
" \+ i( w7 Z: O! l, `3 Y# E4 H/ n    print("Removepoll",pollName);
  d5 c! _% K- y, N% }    std::vectorkeysForDeletion;
! [( r/ t) M! `    //finditemswhichareforthenamedpoll: F5 z( a! h( c8 i+ R
    for(auto&item:_polls)
# V+ z$ K8 }2 }  N% r    {
% ^6 ^7 G- S2 k    if(item.pollName==pollName)
; m# p+ x" w- p# [7 B8 u, S0 @    {
2 C- L1 S( J3 Z% X# F6 k    keysForDeletion.push_back(item.key);
2 w+ w/ R" e. q4 U( T* p; H7 O) O    }6 F* z) y7 x- n5 ?$ X1 s; f
    }
- p  b8 u9 S/ S. ?! q    //nowdeleteeachitemforthatpoll
" x) D  B( n0 u    for(uint64_tkey:keysForDeletion)
! t+ B: A* U  M. Y5 u9 a- O    {  L2 G& E  G9 l! q+ C9 y; C" z
    print("removefrom_polls",key);
/ A3 G+ `$ t3 Z0 ]    autoitr=_polls.find(key);% ^" w5 p0 e5 B
    if(itr!=_polls.end())
6 A/ y8 Q' c5 {    {
  V7 X, T- j  b9 I' B3 q1 _    _polls.erase(itr);
, x: _+ s5 s/ F- n    }1 Y- z. P0 b8 \$ v7 g! i1 w
    }3 O. Y, Q2 R  b0 z0 b! m) k* u
    //addremovevotes...don'tneedittheactionsarepermanentlystoredontheblockchain
& j& V! S" G& f+ L4 l7 L    std::vectorkeysForDeletionFromVotes;& n+ E7 Z+ T  Z' ]% Y0 B, g3 E) Q
    //finditemswhichareforthenamedpoll
" K/ e! Q% R. m9 t* |1 H    for(auto&item:_votes)1 z/ F' N, k4 N7 k; z% N& r
    {' U( w% T  F3 V& p
    if(item.pollName==pollName)& c( D+ H4 h+ z4 k) c3 D5 Q
    {
/ q/ ^* q9 k5 T6 @9 ^9 g    keysForDeletionFromVotes.push_back(item.key);
4 c5 g9 Y4 f) y# S: g& t    }+ ?# s7 N" d, A. o0 [, t
    }
; N* H" [& E! c' \# x1 g    //nowdeleteeachitemforthatpoll0 |0 I2 j, c3 i- o2 \
    for(uint64_tkey:keysForDeletionFromVotes)
$ o0 Y/ W% P% g/ H) n6 G    {3 l8 s+ n# b) d
    print("removefrom_votes",key);
. w$ c  ~- P" e, U6 i* e    autoitr=_votes.find(key);2 x3 ^8 @  w/ T) t' n
    if(itr!=_votes.end())4 @9 y7 L, ]3 j) l( n
    {/ E* d' u% Z, y6 ?! L
    _votes.erase(itr);  q& |7 {1 u) K% Z' q* ]  Z
    }4 H/ M) G7 n$ @6 Q% [
    }6 P$ b2 b: O' f/ _8 Y. L1 P! c
    };
3 P" A" X- s4 X. |5 K+ C- U* l& P    ///@abiaction
" ~3 O2 c" Z2 f6 @" r" s7 |8 X    voidstatus(std::stringpollName)8 f1 ?" x+ D  [5 Z  i
    {
2 P/ W5 ?% B" u0 b    print("Changepollstatus",pollName);) w' U: p0 g. C* T
    std::vectorkeysForModify;
% o$ R0 `7 T6 G, n, I+ ^    //finditemswhichareforthenamedpoll
; R# _1 b  s( R    for(auto&item:_polls)
+ E3 C  i+ i! ?2 A0 N7 e' q1 ?    {
" B! e* X1 H$ J% t    if(item.pollName==pollName)" l5 n' V# D- {' x/ L  J
    {! C1 A3 x) `4 Z+ E
    keysForModify.push_back(item.key);
# Y1 P( s  E5 P3 _7 `; ?- M    }# z( E: l8 {# f' Q1 R: s9 N9 P) o
    }% @5 |$ Y: A: ^9 g# o
    //nowgeteachitemandmodifythestatus
# j. u* K$ N: N2 y9 `" }9 t$ b    for(uint64_tkey:keysForModify): y6 ^) a$ ?6 D: U) \) e" w9 O' T
    {1 s' p, x8 v2 m9 b" _8 {9 D. w
    print("modify_pollsstatus",key);
; O, U( T( a7 h    autoitr=_polls.find(key);
! T# ?+ h0 t+ F' N/ d    if(itr!=_polls.end()): C2 Q# q9 d% D6 u" q+ X
    {
5 J  ^+ K, E8 r3 a8 z4 ]    _polls.modify(itr,get_self(),[&](auto&p)
+ f* c) f/ v8 M0 s6 v    {4 L9 c/ P& g3 N: ?4 F0 Y! z, b
    p.pollStatus=p.pollStatus+1;
; X7 ?% F% P6 Z- @, |# t: Y9 f! ]4 O    });
1 `. R+ T3 [9 F/ l5 l- l9 X4 p    }
* v2 B9 B* _+ A  X0 V8 r    }5 o. ]& W8 Q1 T6 W# T' X' q4 W
    };
# J' `" r# ?) o! O  _    ///@abiaction* F1 `9 ?7 m! E$ x0 M3 I
    voidstatusreset(std::stringpollName)! t; a1 D, p2 z7 D" L
    {
4 q/ H2 z4 a& [3 u5 e& J" ?    print("Resetpollstatus",pollName);
' ~7 G3 `8 ^, I) L( j& Y    std::vectorkeysForModify;/ ^- L/ e, I; G9 z: T
    //findallpollitems) q  P$ f- p) A0 j- y# z
    for(auto&item:_polls)
9 P! d* T2 g6 n  s, {3 p, D, G    {7 g) B! \; {) I4 O
    if(item.pollName==pollName)
9 C6 K0 E9 U# b) R( ^  P" G, r    {
1 y, b8 i$ `7 h& a' c) R    keysForModify.push_back(item.key);0 p& v4 y1 r2 H% h$ e% d5 F9 |
    }
& I7 ^. {8 t) d+ K. X    }+ t# j7 S/ p- k3 B9 ?- s
    //updatethestatusineachpollitem( ~) Q0 L$ q; t* b0 g1 e
    for(uint64_tkey:keysForModify)
) `) n7 q7 r0 o0 ]    {' I1 ~) `7 \" W: ~
    print("modify_pollsstatus",key);  c1 X6 Y9 f) K
    autoitr=_polls.find(key);
$ J. {' p2 b( ?    if(itr!=_polls.end())( U0 f/ N1 d: V! u! G* U
    {. x$ O0 Q' l6 \3 F5 r
    _polls.modify(itr,get_self(),[&](auto&p)# @# x5 C5 z* K0 h6 V! V
    {
" K0 R, ?3 I4 ~( V+ g; o7 Z- |    p.pollStatus=0;
/ Q& U9 ^: y; F3 u  P# V9 a    });4 G. c- n. T  w: M& p% ?
    }5 Y+ n/ [. _* }1 J; G
    }% u7 t/ B7 {7 `! g/ C3 l
    };
- N# o. q' N% N2 V6 \    ///@abiaction
- A/ ]* l! \1 [, e* o% A+ {    voidaddpollopt(std::stringpollName,std::stringoption)# b- n& E" l* h: N
    {1 q# a8 h3 g1 Q% ]
    print("Addpolloption",pollName,"option",option);* M! o. d- j  s$ J5 G, Q
    //findthepollId,from_polls,usethistoupdatethe_pollswithanewoption; [( n* Z) l5 o$ W' L- @( B
    for(auto&item:_polls)) l3 i; `4 t! h9 p
    {$ ?' V6 A4 u7 c, k# J4 Q3 O
    if(item.pollName==pollName); a% U. L6 |) E1 d5 @1 z
    {
7 m" k5 ?+ I0 ]8 E. C  o( e    //canonlyaddifthepollisnotstartedorfinished5 \: p: i+ K  Q. i) N
    if(item.pollStatus==0)3 D7 Z% L$ C5 c- l% g, t/ m# ]
    {
, b- y5 f- I% _# n    _polls.emplace(get_self(),[&](auto&p). _" L3 X, f0 i# V8 I: R9 o% X
    {
. U. |2 N8 }2 F- g  y5 W    p.key=_polls.available_primary_key();
% l/ I6 \0 U! R' g* `6 B- z" c    p.pollId=item.pollId;
! U; M6 z5 |! H    p.pollName=item.pollName;
; T0 L: p7 ~& M( B+ H; Z    p.pollStatus=0;, P7 Q- u: U! {9 y& s7 O+ s
    p.option=option;* f  D2 ]1 j( z7 ~. E# w$ R
    p.count=0;
, ~5 c6 Q' W, c4 J) |    });* T4 N# L" f& D9 }- U. y  s7 x2 M
    }
7 x: z5 F; p# B  J$ H    else' K: Y1 m& K. H7 L
    {; s( |$ L: k3 K4 d- Y, `* I
    print("Cannotaddpolloption",pollName,"option",option,"Pollhasstartedorisfinished.");5 m- O0 m9 N- {! F5 f0 i
    }
% S  a8 E3 e$ ~9 u3 d1 r. V    break;//soyouonlyadditonce
% i# h0 P) Y4 i: K0 z6 H    }
$ b* Z& O7 b6 f! R/ q    }6 Q& a7 P- s& [0 V
    };2 j' |, g+ r" X
    ///@abiaction
* x1 b! Y6 O) w1 p* y9 R4 V0 @# h    voidrmpollopt(std::stringpollName,std::stringoption)- Y; b6 {) B: e% ?" y" Q' e
    {7 P+ D2 C% A) a- R8 A8 o
    print("Removepolloption",pollName,"option",option);
# Z% T4 j. R8 ~    std::vectorkeysForDeletion;  r$ Z0 D6 M- @1 v8 o. x# n4 @- U
    //findandremovethenamedpoll( x* X+ {' ~4 E, f: g3 {
    for(auto&item:_polls)' Q* W% d0 z8 N: C/ F8 f3 c* T
    {6 M' `1 O1 p( H( A3 `. |# \- A! ]5 H# w
    if(item.pollName==pollName)- h' V2 A/ |( n9 M+ `- G% y
    {2 C4 o) E9 ~0 v0 ~/ p. L7 x- l
    keysForDeletion.push_back(item.key);/ q; N, I3 t5 _8 _* q8 H
    }
! h) l. f$ U: Q+ f/ Z9 o) t/ ~    }
1 B  C1 N7 I* L; a% D. q5 ?! q    for(uint64_tkey:keysForDeletion)
& I$ n( D2 W: Z7 t! Z    {! U8 Z& |% l1 D5 u' D# U* a
    print("removefrom_polls",key);
' F" S0 g- ^9 X& s5 r7 j1 U    autoitr=_polls.find(key);$ |1 b. @9 m; v- q2 B9 s* e
    if(itr!=_polls.end())
! G3 i' z3 F1 x' Z9 _    {
& H" y: O' P/ t$ e) K    if(itr->option==option); e# o4 T2 F2 d- T
    {
1 v, h. k& A/ Y9 I  J* b    _polls.erase(itr);6 m7 B- B2 W5 q
    }" ^, G7 p; z7 V' f/ J
    }
5 U7 j. h" n9 a$ m9 k. M    }6 O0 Z! O; i4 G3 g; }$ H  F
    };
& [3 X! ?4 v4 V% O. h) V0 B    ///@abiaction
8 c, p1 G" _7 E+ B& e+ M2 ?+ J    voidvote(std::stringpollName,std::stringoption,std::stringaccountName)' D6 O6 M8 j6 z
    {+ B) _! T" D1 W8 Q- |0 }# L
    print("votefor",option,"inpoll",pollName,"by",accountName);) t! j# |& w2 ~. j  R
    //isthepollopen
5 _8 q# R4 T& {    for(auto&item:_polls). l. i$ j! A4 C1 f# u+ q0 {
    {
$ }0 I) a$ f' {, ?- j    if(item.pollName==pollName)$ y6 N- K8 ~' C! n8 n
    {
6 r% ?  _1 S6 f- F  I    if(item.pollStatus!=1)
; W. o1 \' d1 Y; l- J6 E    {
4 M- P; D- `  \5 x. y4 t    print("Poll",pollName,"isnotopen");) o$ t- {9 |  j- g! F8 p! V
    return;
$ t6 R& S+ o( B" _2 B% W    }$ p( g! ?) k$ K4 r( P7 y
    break;//onlyneedtocheckstatusonce
( ?% _/ \) S' b6 ]# C    }$ t+ P; R& V; F1 W% s; }4 ~% L' t' H- F" k
    }# A# Q8 d9 b' C& Z" q, w* I! x
    //hasaccountnamealreadyvoted?
: k8 \8 a- u: Y, A( M$ ^: ^    for(auto&vote:_votes)
% y0 E4 D$ @9 v5 a7 q9 P% c    {9 e: M/ V0 \3 d( T/ ]6 Y
    if(vote.pollName==pollName&&vote.account==accountName)4 ?5 ~2 j6 A! f7 Y/ x+ m; t
    {- a7 F, Z2 K5 y3 N9 V+ i
    print(accountName,"hasalreadyvotedinpoll",pollName);: g9 P# o& a$ F$ S, b
    //eosio_assert(true,"AlreadyVoted");+ \( E+ ~( S! X3 ]2 z6 I
    return;3 x. T! i' K0 f/ Q
    }
( W1 m' [# f, \6 |& X- f    }' n: V* B4 \* W0 c. f
    uint64_tpollId=99999;//getthepollIdforthe_votestable
# \# t1 u) T2 j2 d* v/ r$ X    //findthepollandtheoptionandincrementthecount6 p7 T5 E3 d' j. I+ i' S6 r: k! Z
    for(auto&item:_polls)1 J$ F4 Y& g( w3 R9 e
    {) t0 H  _1 T, u# T) t3 P
    if(item.pollName==pollName&&item.option==option)
; M& ?- v/ Z4 \1 M- Q    {
' H- I2 q9 x/ f: Q( b, D    pollId=item.pollId;//forrecordingvoteinthispoll6 ^. K* F* Q" g) k+ ?5 P  O
    _polls.modify(item,get_self(),[&](auto&p)
; Q6 e& B* e5 u    {3 N# W9 d6 u0 H% O6 W" u
    p.count=p.count+1;
) z+ V/ v, g( ?6 N8 b7 }/ N3 N    });+ o5 m$ d/ J. l5 k0 I0 D- ~+ U( q9 s
    }- y4 d  a1 o& t$ ^' C- }0 w
    }9 |4 F3 F" j! e* C* a3 |( p
    //recordthataccountNamehasvoted
3 A6 Q: C" o9 w; I+ Y( X    _votes.emplace(get_self(),[&](auto&pv)' f& _4 c' e6 }1 I
    {
' ?* m8 }  ]+ \; k0 n    pv.key=_votes.available_primary_key();! i7 J- J. d& J2 v* {
    pv.pollId=pollId;
! }* M: G4 b1 C) ~! ~    pv.pollName=pollName;8 R" T. K+ E" \) ~5 Y6 Q
    pv.account=accountName;# o1 t" Z0 o0 ]4 u8 }
    });0 M$ S9 h4 K9 L; @
    };
! s  x, ?! C) B" b: p7 Q    private:
' X9 ~/ d; i/ l5 D, Z$ K$ h    //createthemultiindextablestostorethedata/ a: C( @4 ?7 f0 G* O4 ^& |9 M' R
    ///@abitable/ ]4 M8 ]! s' a
    structpoll5 W  D& F1 N0 ^/ ^$ \8 J
    {& E' J  M- ~0 S# Y% N
    uint64_tkey;//primarykey
# K' }7 C( C/ K# L! l    uint64_tpollId;//secondkey,non-unique,thistablewillhaveduprowsforeachpollbecauseofoption
9 V% }# Q$ n, _    std::stringpollName;//nameofpoll+ M$ i5 ]; U$ w7 D$ U
    uint8_tpollStatus=0;//stauswhere0=closed,1=open,2=finished% d( j+ b- W1 R" S8 r, X/ e" v0 r, s
    std::stringoption;//theitemyoucanvotefor
, R, H2 w. E- W& Y    uint32_tcount=0;//thenumberofvotesforeachitme--thistobepulledouttosepartetable." s  u8 x- M* U
    uint64_tprimary_key()const{returnkey;}/ W4 W8 `. A% N$ M2 b* B7 R$ i
    uint64_tby_pollId()const{returnpollId;}& i/ F' g2 S/ b8 @% I: F
    };
) x) g) H, t' f/ s& f, K0 a  Z    typedefeosio::multi_index>>pollstable;2 Z# m5 U. o( Q6 X
    ///@abitable$ ~) ~* A# v$ [# y
    structpollvotes
  {5 o, j4 |  ~  z9 Z4 m' p* t    {9 L1 \) K2 v% q
    uint64_tkey;
8 ?0 M6 L; d/ I1 E4 d  Q' h- Z$ T    uint64_tpollId;
* Y4 u! s6 H+ J9 _    std::stringpollName;//nameofpoll
% u; X% m" P: }/ w4 L    std::stringaccount;//thisaccounthasvoted,usethistomakesurenoonevotes>1, N& F1 @/ }+ D, J
    uint64_tprimary_key()const{returnkey;}
" Y" N9 i7 w9 C5 [! S5 b. a+ _    uint64_tby_pollId()const{returnpollId;}) s5 w& g  a7 s  o3 S9 F
    };
+ {, @* z" `' t8 W* l# S    typedefeosio::multi_index>>votes;
) ~; F% b7 L' c* ]/ q! X    //localinstancesofthemultiindexes2 a7 \- T& o" G7 d; `7 j# a2 x
    pollstable_polls;
9 k# c/ N( u$ r    votes_votes;" q. G! [: Q$ v! r
    };
3 i  S. y/ S% B# R. g1 v$ Q    EOSIO_ABI(youvote,(version)(addpoll)(rmpoll)(status)(statusreset)(addpollopt)(rmpollopt)(vote))2 G' m2 Z. c6 E  A
    注意EOSIO_ABI调用,它通过ABI公开函数,重要的是函数名与ABI函数名规则一定要匹配。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

西门幻雪雪vj 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    10