Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

EOS智能合约的多索引表table

西门幻雪雪vj
177 0 0
建多索引表是一种为了在RAM快速访问的方法,主要用来来缓存状态和数据。多索引表支持创建、读取、更新和删除(CRUD)业务,区块链不行(它只支持创建和读取)。
$ T7 X5 u1 d% {, m    多索引表提供了快速访问数据存储接口,是一种存储智能合同中使用的数据的实用的方法。在区块链记录交易信息,你应该使用多索引表存储应用程序数据。
& I- m/ j7 ?+ ?    使用多索引表,因为他们支持为使用的数据建立多个索引,主索引必须是uint64_t类型和唯一的,但其他的索引,可以有重复的,你可以使用多达16个,类型可以是uint64_t,uint128_t,uint256_t,doubleorlongdouble。
9 O1 S6 n- U# K7 g7 n2 n  V- `    如果你想你需要使用一个字符串做索引,需要转换成一个整数型,将结果存储在随后索引的字段中。/ o2 c' Y+ @" t$ G
    1.创建一个结构
5 t9 y- z+ e- V* G" Y" O. E8 {    创建一个可以存储在多索引表中的结构,并在要索引的字段上定义getter。$ \7 }) o8 o7 A* x( A, z
    请记住,这些getter中必须有一个命名为primary_key(),如果没有这个,编译器eosiocpp将产生一个错误…"itcan’tfindthefieldtouseastheprimarykey"即它找不到任何一个字段被作为主键。* x4 ?+ B6 Y) \1 k2 ?% V3 z
    如果你想要有一个以上的索引,(最多允许16个),然后为你想要索引的任何字段定义一个getter,这时这个名称就不那么重要了,因为你会把getter名称传递给typedef。' F2 H; i; o0 |$ Y; i( Z
    ///@abitable: c/ a% P& [+ _, o8 ^
    structmystruct" u$ Q* |! Z3 @0 {" F5 O
    {% j; ^8 H- m' k7 _/ I* ?  J' y% ]
    uint64_tkey;( ~2 W7 ~5 k( f. c2 Q/ R
    uint64_tsecondid;
- u. @) \* U5 L) r    std::stringname;
1 h+ R/ w  q% @# g+ g/ Q1 l% s    std::stringaccount;
& ]2 b( L& l! \* y    uint64_tprimary_key()const{returnkey;}//getterforprimarykey
/ O8 J: {* M/ Z2 G9 w. u7 N, n    uint64_tby_id()const{returnsecondid;}//getterforadditionalkey. B1 f! y& ^  u6 F
    };
( ]7 i# Z/ d+ F1 ~/ u1 w* d    这里还要注意两件事:
0 C$ S( F; @1 C3 A! C2 r2 s3 b- @    1.注释:
$ g# u* p2 d; k: J  f2 D    ///@abitable
" h8 z4 O5 K# `8 I; A( k    编译器需要使用eosiocpp来识别要通过ABI公开该表并使其在智能合约之外可见。( W( R4 X* n6 ]7 L& Z
    2.结构名称少于12个字符,而且所有的字符都要小写字母。1 H" a' \! \1 x  d8 L' [! a. V
    2.多索引表和定义索引5 Q' g' \4 K- M1 r8 U) J  x$ {8 [2 p
    定义多索引表将使用mystruct,告诉它要索引什么,以及如何获取正在索引的数据。主键将自动创建的,所以使用struct后,如果我想要一个只有一个主键的多索引表,我可以定义它为:) Z2 i) Z' v" e7 B) S  L) ]
    typedefeosio::multi_indexdatastore;# H4 k6 h0 v$ \
    这定义了多个索引通过表名N(mystruct)和结构名mystruct。N(mystruct)会对结构名编译转换到uint64_t,使用uint64_t来标识属于多索引表的数据。
1 ^3 t  R6 ~, r4 _! R6 ]" V+ S) D; e    若要添加附加索引或辅助索引,则使用indexed_by模板作为参数,因此定义变为:
  O8 E; M. I/ m$ R8 q1 t1 s( ~' T    typedefeosio::multi_index>>datastore;7 h9 i: Y% x& P3 n. A/ }( |
    注意:
- a" Y' {' v2 C5 O# V    indexed_by>: i9 [3 U& F4 ^5 `) _0 G
    参数:. R: ~  n3 A: a) Y; T
    字段的名称转换为整数,N(secondid)* a& k0 G% ^5 s
    一个用户定义的密钥调用接口,const_mem_fun5 [3 {% ]8 c6 ]
    来看看有三个索引的情况。* ]- e+ D. _  \2 S. N# q$ |& Y. k' d3 K
    ///@abitable5 X! p& A8 U; {$ V
    structmystruct
: G  D! P1 f0 ]1 G8 M    {) q: g0 x1 M3 k  V- P3 q1 b
    uint64_tkey;. o* u( L4 |' T' r# K/ c
    uint64_tsecondid;1 v6 w* ~8 I5 Z. Q* p
    uint64_tanotherid;" N2 x0 v" k3 d# Y, y6 n
    std::stringname;
' S; b$ R% Q0 L7 b! ^' a( G9 v1 j    std::stringaccount;4 [! W: }' U4 K/ \
    uint64_tprimary_key()const{returnkey;}
; `6 Q3 W/ W# a/ {4 ?7 [. h    uint64_tby_id()const{returnsecondid;}
8 x* T' n  k9 r- m0 P, V/ `& a5 z8 q( S% `    uint64_tby_anotherid()const{returnanotherid;}
/ L4 n& K% H  F, h0 N    };
. x1 A( l0 g; A! X3 z    typedefeosio::multi_index>,indexed_by>>datastore;
! i* @; l  x; f. Q! r    更多的就不列了。
6 K+ w9 g( ]& T7 X, S% m    这里要注意的一个重要事项是,结构名与表名的匹配,并且将出现在ABI文件中的名称遵循规则(12个字符,所有都是小写的字母)。如果它们没有遵循这个规则,则表不会通过ABI可见(当然可以通过编辑ABI文件来绕过这一点)。
1 z+ ], b/ S$ ]2 T# S6 `0 k    3.创建定义类型的局部变量
/ q) i! j" C; o' Y8 j6 p! z    //localinstancesofthemultiindexes
4 R2 p: @; v- n  h    pollstable_polls;4 _8 z! u) R! s; c( b( ^) Q' w
    votes_votes;3 w* m" U6 p% U  i6 P
    现在我已经定义了一个带有两个索引的多索引表,我可以在我的智能合约中使用它。
# s( c- R, M/ D* e    如下是一个智能合约使用两个索引的多索引表的例子。在这里你可以看到如何遍历表,如何在同一合约中使用两个表,我们未来将增加额外的教程,利用多索引表。7 ?1 d7 y6 o) B, B, _; e
    #include
( a" J: [4 q9 n* Q    usingnamespaceeosio;
. C; _! K/ z3 I4 [" h- Q    classyouvote:publiccontract{
" H/ n7 y+ _: `" m4 c! p( U5 f    public:% h, y. W5 M- b" \" T6 ~$ p
    youvote(account_names):contract(s),_polls(s,s),_votes(s,s)
$ a: w6 P/ T4 _    {}
) v: {9 [9 O3 ~$ D' L- ]8 I    //publicmethodsexposedviatheABI
. `  E4 ^( A, g( b* P$ N. E# Y( T+ z    //onpollsTable
1 e' l/ B) G4 E7 ~3 }, Z    ///@abiaction
. E+ ]! t6 Y' u; T    voidversion(), C4 a0 W  r! h$ R  E
    {
4 B& ?- h/ S$ y% c# m    print("YouVoteversion0.01");
; p7 E' q' F" {    };
+ X& B! C* j3 r/ r1 ]. @7 M( ^# ?% r    ///@abiaction- P- y, ?. o3 @6 c
    voidaddpoll(account_names,std::stringpollName)
5 Z' C0 I& w# w2 b0 B, A; d    {
( C, l4 ^# ]( }- u. V5 Y( h" p4 q    //require_auth(s);" Y0 L+ A) m% r) r
    print("Addpoll",pollName);
8 Z: j3 E9 T$ f% r    //updatethetabletoincludeanewpoll
& \/ K! m: D9 K, b/ U* K    _polls.emplace(get_self(),[&](auto&p)
2 M) T% s, b, B4 F4 P, Y  l    {: C: ^6 k1 r3 q2 f- v3 x9 [' d
    p.key=_polls.available_primary_key();" r; e! Q0 ^3 {7 X
    p.pollId=_polls.available_primary_key();
( o  m6 c% t% c( b6 I& G' f    p.pollName=pollName;
- V3 F" i8 V4 O: g) Q1 ^    p.pollStatus=0;
' i. y& k$ C) q( N: ~4 x8 u, ]    p.option="";' u& h8 v1 \& |; D' l. X
    p.count=0;+ ?0 x& i; h1 D: y2 c, z! p8 E! }
    });/ d4 t0 O5 r8 ?2 q( W  D1 O
    };
; x# X7 p5 {( p8 ?) {: z' f    ///@abiaction
) r2 p; q$ `" `+ m# G    voidrmpoll(account_names,std::stringpollName)# j- p, N. l1 ^  t4 A
    {
1 H! [$ V- w" T5 Z    //require_auth(s);
; k5 e" u& z( G8 R) |0 P    print("Removepoll",pollName);
2 V% J; m" X& s' A    std::vectorkeysForDeletion;
1 ~1 x3 \/ {: c' N6 |- V    //finditemswhichareforthenamedpoll
* i; Z3 y& p- G    for(auto&item:_polls)
* I% t6 c: N6 @8 m% o    {( I4 L+ U5 h2 c
    if(item.pollName==pollName)
$ }0 Y; h4 d2 @4 m( b    {, C- ~- L# \, s8 M; R& D" I& D" L
    keysForDeletion.push_back(item.key);+ ?. u) w4 V- x7 Z2 T
    }
. N$ T  ^, m! d, h& @8 o    }3 p6 n6 z. P9 Q/ ~( W
    //nowdeleteeachitemforthatpoll
0 b# e1 v( D" ]5 A    for(uint64_tkey:keysForDeletion)' e% g2 S$ H; h6 d( e+ s1 d
    {9 D+ ~/ H- s+ O
    print("removefrom_polls",key);- [! ^9 t: f5 Y- v: a! M. u" Y
    autoitr=_polls.find(key);
5 g& q" i; M4 T1 @8 F    if(itr!=_polls.end())& h8 H9 Y4 R5 T" K  J5 \- N& |
    {! s- r" u$ ]# C
    _polls.erase(itr);7 Q; A& V" X0 v* K1 {. ]* z
    }
( _! U; t# T9 D0 A! A5 B) T    }2 R! S( J- s; f- e3 k
    //addremovevotes...don'tneedittheactionsarepermanentlystoredontheblockchain
8 }) @7 F7 o% i/ h/ P( n% f    std::vectorkeysForDeletionFromVotes;
9 d" b. v- v. T# J3 w/ }9 F    //finditemswhichareforthenamedpoll9 B) C; O4 n1 E: `) A2 ?" f
    for(auto&item:_votes)- Y5 A* M/ u/ q; k+ C% S+ \& N8 |
    {
: a4 D9 Y4 a7 Q) |6 w! X' c9 @    if(item.pollName==pollName)
7 ^! l9 n/ h& ?6 V- y" l& K    {( t+ s0 ^+ x& o
    keysForDeletionFromVotes.push_back(item.key);6 q1 u& ]9 }) ~" {% h# L0 x% X
    }2 J- |8 \7 i, l4 r
    }
; ]: f3 D/ }; p  z3 U, \0 J7 _    //nowdeleteeachitemforthatpoll
0 Y9 O# @+ L! ?    for(uint64_tkey:keysForDeletionFromVotes)
- h" v6 j0 I! X& B1 i    {
) _! u; ^1 g! d" f; x/ _    print("removefrom_votes",key);% a$ U  S- a4 J! M1 p" U
    autoitr=_votes.find(key);7 a: A6 L# j# r1 r
    if(itr!=_votes.end())
6 n# }3 g" M3 O& M' W3 Y$ F3 B+ o7 b    {
8 p0 g1 F0 T- P$ j    _votes.erase(itr);: g4 V! X, G( a! q  k
    }1 j# E# H# Z. U4 \+ g& n5 U
    }
6 c+ \! B" }' _  d) q    };
7 A" ^1 v4 M% _6 l    ///@abiaction
/ R& R% \: c% D7 ^9 B4 `    voidstatus(std::stringpollName)- N0 t' L6 `; |$ g9 N
    {
- k) X3 w% A. q" r4 p8 }/ Q& v    print("Changepollstatus",pollName);! v& L" {5 `' K0 Q5 S4 n
    std::vectorkeysForModify;' }  A. |7 w: R  A& Q# a4 x
    //finditemswhichareforthenamedpoll& I( \+ Z* f, v- H0 H
    for(auto&item:_polls)
: k6 E& P: B( j+ x4 K    {, x/ d3 }/ ^" k) Q+ q- s- W5 g
    if(item.pollName==pollName)- D5 w1 j5 @' ^0 q
    {
" K1 h/ _/ ]) R( l. I* f. e1 g' X    keysForModify.push_back(item.key);
# J6 G  r$ f2 z& q3 N4 S* u) N    }, W( w; \$ n9 x9 f) K% @
    }, ^* o* g+ C) B' F3 H
    //nowgeteachitemandmodifythestatus6 A. A8 r# O& R
    for(uint64_tkey:keysForModify)
) c* g+ W- d8 P) f$ L    {  v- \  h6 W, J4 i) w
    print("modify_pollsstatus",key);. z' w! B: h+ h4 y
    autoitr=_polls.find(key);
1 s( a1 H* f- w& m/ B0 Z" }1 M    if(itr!=_polls.end())
- y) B+ X2 }. P5 f! f# z; n$ R9 u    {
! K, z3 a) ?* ^0 P4 D    _polls.modify(itr,get_self(),[&](auto&p)- [: u+ p/ F; ^
    {5 D% g; b. ?6 ^6 a* i
    p.pollStatus=p.pollStatus+1;
0 A% u4 P1 p2 d, ?0 j* W2 ^2 C: B8 q1 q    });
2 S* R; _- }9 g0 p% |( C! }8 g    }
7 B, ]; s: j7 ?* j8 }$ n0 w    }
" y! N, @' V; l, U1 I1 q; ^    };9 l/ x5 _* X4 |
    ///@abiaction
' R! Q2 Y5 Q( ^/ d    voidstatusreset(std::stringpollName)
- U* C7 L5 ]% V4 [    {' R7 V# V% f4 n
    print("Resetpollstatus",pollName);( S/ E6 F5 S2 w3 z
    std::vectorkeysForModify;/ x" U4 @4 u  Y" P7 f
    //findallpollitems0 `- p% }1 @( C4 g3 g
    for(auto&item:_polls)% R5 {" y7 _0 D9 J) k: S, C
    {1 ]* I9 i- k0 C3 R8 g1 P; D4 v9 H
    if(item.pollName==pollName)
) D+ e6 w+ Y0 r1 W    {" C* s7 @8 ]% d1 {
    keysForModify.push_back(item.key);2 ]* z5 H  p% J/ N4 q# \
    }
6 T1 T% \- v% n4 u$ Q; q    }% a' o4 a) ^1 Z2 u8 m' z& O, q+ u" V
    //updatethestatusineachpollitem) t& @& P+ b0 Z$ ^
    for(uint64_tkey:keysForModify)
1 n! \# B% B$ `1 T: d) `1 K& K+ ^0 \    {
; A: M( {5 _) G( ?8 ?6 Q    print("modify_pollsstatus",key);
3 Z6 y# S$ j& g3 J0 e# ?    autoitr=_polls.find(key);" o7 L( J% k' c1 l2 ?, C
    if(itr!=_polls.end())
, j' `' p$ J3 ]    {& b0 ]# T" {: R7 c# z
    _polls.modify(itr,get_self(),[&](auto&p). m9 |; \- U2 ~; y. n
    {8 {- e$ m- v% C; Z; `, O
    p.pollStatus=0;
+ k4 Y5 h( a/ Q' [5 k0 @. P5 h( h    });
5 x5 C7 ~6 c9 j5 Q    }
& F5 S2 i  a5 G% V% {$ o7 S5 Y0 \    }0 b+ l& H2 h! V
    };! ?. i7 {2 ]+ z$ f
    ///@abiaction- g2 Z0 r) C, E4 L( y5 E
    voidaddpollopt(std::stringpollName,std::stringoption); M" ^! `4 f7 S8 h# G3 h
    {
7 X, e4 {1 w' b% H+ v    print("Addpolloption",pollName,"option",option);
7 z0 S$ f9 ?% x7 _. d# y; E    //findthepollId,from_polls,usethistoupdatethe_pollswithanewoption! q0 z" B1 b2 }: e0 d; S
    for(auto&item:_polls)- Y# \8 a' R, C) p1 I' {
    {/ ]& Q7 ]# n" k( D5 s+ a
    if(item.pollName==pollName)' @) @% V; ]% V9 L+ y9 Y
    {
) F3 S; B4 `' q' I    //canonlyaddifthepollisnotstartedorfinished
$ q% \; Y- }( l* E/ c7 Y" W    if(item.pollStatus==0)
2 Y1 k) u5 C! d3 i  P2 V  P" R: v    {
3 N6 u& Z8 r2 S+ d    _polls.emplace(get_self(),[&](auto&p): k: ~" A9 e6 l6 D# ~. e6 U1 C' j
    {" C/ N$ ]+ T0 M$ y9 ^
    p.key=_polls.available_primary_key();
  [6 o: J  x6 D/ k8 _    p.pollId=item.pollId;
- s) w9 U. Y9 T& M! G( w    p.pollName=item.pollName;
( U8 _6 w& G0 U  {    p.pollStatus=0;2 {0 j& |# a1 {( M$ |
    p.option=option;: t9 H& Y4 j) G7 Z& m! I
    p.count=0;
: U" s7 Z; o, P. l  W7 C, o" |, `1 W    });
) x) ^+ R. O: V* }) h8 n4 g    }
% g" H3 M! [4 J/ i6 n% v0 ^    else
0 `3 r& O, c. D0 j( H2 x    {. ^. e  ^- E0 g5 C0 Y. S, h
    print("Cannotaddpolloption",pollName,"option",option,"Pollhasstartedorisfinished.");; j- d; }$ z. l2 D+ ^, o
    }
' I( c" }+ S/ S2 B, |1 U* m1 e    break;//soyouonlyadditonce1 K! F$ |6 H9 w7 M2 r# m$ r& z
    }; ]# o7 L6 s! J3 W6 |# z4 ]
    }
7 R$ u3 u' b3 G& r' F7 H# Q4 @    };; y# c; M: M+ U  w
    ///@abiaction
& c) n5 \) C& U- `4 n6 \& X& N    voidrmpollopt(std::stringpollName,std::stringoption)) `4 v8 d6 c2 |4 u# y0 }
    {$ N  b8 f: O* |  s; u. m
    print("Removepolloption",pollName,"option",option);
. w7 s1 n7 Y4 m* }" b4 _% v    std::vectorkeysForDeletion;
, c' i* F, x7 S    //findandremovethenamedpoll, r/ _0 i6 Y- w1 }: u
    for(auto&item:_polls)! B+ n& z4 g( f: y6 D2 u& R
    {/ z6 ]  r1 x7 f+ B8 E  _, u
    if(item.pollName==pollName)
, q) q' m% l6 h) X    {+ t- g8 Z2 ~. V1 r
    keysForDeletion.push_back(item.key);
8 w1 s0 x* n) t5 o" d9 s    }
: w- s$ E1 I, R7 l; }7 b    }) e' `2 @4 c* E
    for(uint64_tkey:keysForDeletion)
: Z/ |* S! J' p) e' W3 Z) _    {
+ _) Q, F$ ?! R% {$ ~, h    print("removefrom_polls",key);
2 L" e6 |( S. I4 C2 Z% d0 q    autoitr=_polls.find(key);
4 s4 a; k( e( U, p) \    if(itr!=_polls.end())
( ^2 y/ b9 ]2 _# s    {* w: M' l* J9 K8 Z; e
    if(itr->option==option)
8 L( V* j+ D/ J% Y5 ~3 E! n& z    {
- Y9 Z# ~! \' N. n6 D. [  P+ X    _polls.erase(itr);
' [3 B: [3 F; B4 P% I    }7 B$ s5 K+ f7 |+ m+ V
    }% M! f* |/ b# ~: T- B0 f
    }/ ?: y( @$ J( Z4 e3 p
    };+ Z1 K: W3 N. L  o' l. z
    ///@abiaction  U6 ]% s5 `+ t
    voidvote(std::stringpollName,std::stringoption,std::stringaccountName)/ l! T- Z; }) _3 Q
    {
, `9 u0 h$ h3 h* g    print("votefor",option,"inpoll",pollName,"by",accountName);
1 Z0 ~7 _- T3 K$ j; j: ^, X5 n    //isthepollopen: _- O: p* s9 O& d+ \
    for(auto&item:_polls)5 f$ N7 @" h3 h, g) @/ K% w
    {
) Y" T% A5 ?* ~1 z    if(item.pollName==pollName)" B+ e" @- {- J
    {3 r7 X9 |7 D- |" p3 t3 V
    if(item.pollStatus!=1)
7 }- z; R& S% D    {
+ A' H, e, L6 ]' E; }6 g$ m0 b    print("Poll",pollName,"isnotopen");
$ Z$ l4 a# N. W! y    return;; i6 K/ E2 ~9 ]; K* U
    }% X: i6 L" c8 u+ W& c5 `; z
    break;//onlyneedtocheckstatusonce# |4 y: O. _. }( w( [
    }* A9 `5 J: H. ~& h; w" V2 e1 I
    }
4 W; |* P, v8 @+ D    //hasaccountnamealreadyvoted?+ ?5 R" `& X. J
    for(auto&vote:_votes)4 b& N/ y; x! U- H+ N9 X3 o5 D6 y$ N
    {, H* t% P- M3 w6 g. Y+ F8 T" J
    if(vote.pollName==pollName&&vote.account==accountName)
# k( s5 _; i4 V: E/ [% a    {
' p. K& V" _7 W+ F! G    print(accountName,"hasalreadyvotedinpoll",pollName);- Q: f" @% q* T
    //eosio_assert(true,"AlreadyVoted");
+ a# f% e4 R2 ^    return;
/ K$ u! ~7 s# p0 s    }
- `/ I% b% L/ V) I5 [    }' C5 `4 L, m& l( e1 u/ e
    uint64_tpollId=99999;//getthepollIdforthe_votestable  ~- l- R, Q; U. {9 K
    //findthepollandtheoptionandincrementthecount* K6 O7 E( `# m/ c5 o: H/ |
    for(auto&item:_polls)
4 J$ Q1 A( T# n! y: x    {
- N8 s2 H8 f! k0 v) h/ T: s    if(item.pollName==pollName&&item.option==option)
" V% V8 {2 e3 V5 G    {. J; ?) C; }8 y
    pollId=item.pollId;//forrecordingvoteinthispoll! i  e5 l. r; O6 S3 n0 S8 t7 w
    _polls.modify(item,get_self(),[&](auto&p)
5 ^- u* C: Z) A+ I' N5 K) v    {
1 F, C) q. p) c# T) J+ d    p.count=p.count+1;* O0 Q; O) u$ O$ v9 w% e- {; v
    });0 R# e/ a4 z4 K% d
    }
5 p3 k- j/ H6 L: K/ e! x4 L+ q    }
; X) r0 w% K& `9 C    //recordthataccountNamehasvoted
  f' j+ ~% p+ n. T3 i& F( v8 ?    _votes.emplace(get_self(),[&](auto&pv)
& o* W4 r9 y; H( Y# ~+ y$ o8 b    {
* W" y! a1 K) X: u2 a# ]5 H* }) V2 N) ]    pv.key=_votes.available_primary_key();! p! F/ H( [& t2 b! p( d& \. I
    pv.pollId=pollId;1 Q* \. U8 m. A9 m' @5 q6 ~
    pv.pollName=pollName;$ e6 @  p( T" ]
    pv.account=accountName;
; v- h) P, ^. A" t5 E% L    });
" [/ e( [1 i7 W2 C5 X2 I0 z3 h    };
; L$ [  }1 C, t* H0 c    private:' v6 E7 J0 |- F2 J( K" W; s  P! i  l- _
    //createthemultiindextablestostorethedata5 a: r8 V! Y3 _" e  E5 X
    ///@abitable( o% L* P6 f5 f6 y& P. e
    structpoll6 e/ g! _( p1 W' w; S- Y5 U
    {
( e% R6 i4 l7 i: h    uint64_tkey;//primarykey
; B1 Y. O% @0 X& s$ c+ }3 |    uint64_tpollId;//secondkey,non-unique,thistablewillhaveduprowsforeachpollbecauseofoption& d) [8 K4 m( k
    std::stringpollName;//nameofpoll
8 m) @7 m' t2 B" n/ \" X    uint8_tpollStatus=0;//stauswhere0=closed,1=open,2=finished' W; c7 q: m" ?' r
    std::stringoption;//theitemyoucanvotefor' R8 |' n" d. U9 I+ A& O3 H
    uint32_tcount=0;//thenumberofvotesforeachitme--thistobepulledouttosepartetable.) D  S+ C) {" m  _4 U2 B% R; W
    uint64_tprimary_key()const{returnkey;}- m4 Q- g2 q& g! Y
    uint64_tby_pollId()const{returnpollId;}8 e* `* A  V3 B8 \+ H
    };6 N' F% y. m# W6 K& x
    typedefeosio::multi_index>>pollstable;, d1 [0 j0 C# j; q4 C
    ///@abitable
. W8 }& v+ Q6 f' K0 k    structpollvotes
& i8 e5 D8 }; Q, f$ S5 p5 C( U0 D    {
# R; J# O. d; w6 K& v; N- c    uint64_tkey;
; D/ S0 G1 N2 W8 Y4 H$ g6 z0 ]5 j    uint64_tpollId;
" ?+ S) s2 X' E  z$ e5 f    std::stringpollName;//nameofpoll
0 C$ C+ Q' f0 Q  D5 x    std::stringaccount;//thisaccounthasvoted,usethistomakesurenoonevotes>10 D4 z/ w. U) U2 }: [% s- F
    uint64_tprimary_key()const{returnkey;}
$ m$ l7 d! S/ M9 P5 D    uint64_tby_pollId()const{returnpollId;}
& Z2 E& S" [/ y  L& ?7 x    };6 W1 S+ ?  B3 r% N& Y
    typedefeosio::multi_index>>votes;
: \/ m1 u5 {0 [* ]; `: q7 ~    //localinstancesofthemultiindexes  A# d" P  J2 a- g9 m3 o( }3 T4 s1 ?
    pollstable_polls;
) X1 ?, ^% K0 S: g* O    votes_votes;
4 [# a( c/ ?6 j- E    };
, T) r0 h! c9 F1 u- v# P    EOSIO_ABI(youvote,(version)(addpoll)(rmpoll)(status)(statusreset)(addpollopt)(rmpollopt)(vote))0 @7 t+ C# u7 l9 T7 \  [) h
    注意EOSIO_ABI调用,它通过ABI公开函数,重要的是函数名与ABI函数名规则一定要匹配。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    10