Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

EOS智能合约的多索引表table

西门幻雪雪vj
143 0 0
建多索引表是一种为了在RAM快速访问的方法,主要用来来缓存状态和数据。多索引表支持创建、读取、更新和删除(CRUD)业务,区块链不行(它只支持创建和读取)。
- z3 R) `0 x1 V: u1 m    多索引表提供了快速访问数据存储接口,是一种存储智能合同中使用的数据的实用的方法。在区块链记录交易信息,你应该使用多索引表存储应用程序数据。+ E, O& V0 l' W) n, H8 o5 j2 ?
    使用多索引表,因为他们支持为使用的数据建立多个索引,主索引必须是uint64_t类型和唯一的,但其他的索引,可以有重复的,你可以使用多达16个,类型可以是uint64_t,uint128_t,uint256_t,doubleorlongdouble。
; q" d9 O* L% R/ f1 l% ?    如果你想你需要使用一个字符串做索引,需要转换成一个整数型,将结果存储在随后索引的字段中。
+ F! U8 ^: z8 p, N) p+ a; ?    1.创建一个结构( l7 W: T" O: G5 f+ M9 [
    创建一个可以存储在多索引表中的结构,并在要索引的字段上定义getter。" \) }6 ?3 M# |% B* t
    请记住,这些getter中必须有一个命名为primary_key(),如果没有这个,编译器eosiocpp将产生一个错误…"itcan’tfindthefieldtouseastheprimarykey"即它找不到任何一个字段被作为主键。
* D# `7 |7 G7 M1 q0 W    如果你想要有一个以上的索引,(最多允许16个),然后为你想要索引的任何字段定义一个getter,这时这个名称就不那么重要了,因为你会把getter名称传递给typedef。
0 J' y; ^/ B- V    ///@abitable1 S! i9 ]7 D; j5 g' V& b
    structmystruct
8 E* q% G* y, H- x    {: c4 L5 R9 X  ~7 |
    uint64_tkey;
' L3 F3 q2 i0 `, c    uint64_tsecondid;# H6 c( U: D5 m% d- a1 }: ~
    std::stringname;
4 m, n9 f& ]  {    std::stringaccount;" }0 q; A8 o9 S3 |; f
    uint64_tprimary_key()const{returnkey;}//getterforprimarykey
1 q9 r4 p  w! G) N5 s0 T    uint64_tby_id()const{returnsecondid;}//getterforadditionalkey
- w+ Z+ {% G) w. j    };% z( @/ U  Q$ Z* i
    这里还要注意两件事:
: `4 w+ f; x2 \/ v  g    1.注释:) |) N+ ~& @  r$ w4 I
    ///@abitable
. B* J5 H* i# ~6 y8 v    编译器需要使用eosiocpp来识别要通过ABI公开该表并使其在智能合约之外可见。* @, G8 G. z& }# `8 p; \
    2.结构名称少于12个字符,而且所有的字符都要小写字母。8 ^; @; I* x# M0 `! T
    2.多索引表和定义索引
6 R+ _3 o% ~9 W7 N  S! x6 B    定义多索引表将使用mystruct,告诉它要索引什么,以及如何获取正在索引的数据。主键将自动创建的,所以使用struct后,如果我想要一个只有一个主键的多索引表,我可以定义它为:, k1 X8 c+ G  y7 p- a
    typedefeosio::multi_indexdatastore;& E' q! B* o& |
    这定义了多个索引通过表名N(mystruct)和结构名mystruct。N(mystruct)会对结构名编译转换到uint64_t,使用uint64_t来标识属于多索引表的数据。
# b. Z4 w0 v* N' s  s3 l    若要添加附加索引或辅助索引,则使用indexed_by模板作为参数,因此定义变为:" f- d7 y7 F5 L' B7 q; W
    typedefeosio::multi_index>>datastore;
( M; n  l8 q3 r4 |8 a    注意:
1 E) j' u/ _3 u( r$ E- u    indexed_by>
$ z- o% d4 p* e- w    参数:
6 Q6 R1 B; F8 h9 z# u. n9 u    字段的名称转换为整数,N(secondid)( F9 L2 h; L5 X3 h0 C
    一个用户定义的密钥调用接口,const_mem_fun7 f" @9 Q0 @2 U( Z6 E( a
    来看看有三个索引的情况。
" l" x) s8 @# y+ A# X6 ^2 N    ///@abitable  G: g' m  z( @8 p, s1 \
    structmystruct
5 `  f, S0 B/ d# `# ^: r    {
* b& B% X! T  h% W, L( w. G    uint64_tkey;
5 f( T) U/ k& n, S7 s' A* ?    uint64_tsecondid;
6 W) m5 h2 s  E4 @+ N  N% W    uint64_tanotherid;& t" M  D, A* m/ z
    std::stringname;
5 u, n& C, }& e  v8 g9 r+ ^    std::stringaccount;
; K4 }9 b8 t- s* M$ [7 x    uint64_tprimary_key()const{returnkey;}
+ z/ m. }* Z+ K: K( B6 m7 Q    uint64_tby_id()const{returnsecondid;}
( W$ I1 g0 t% R2 {    uint64_tby_anotherid()const{returnanotherid;}
5 g2 W5 l8 k5 s+ u3 ]    };5 Z7 F% o3 c8 b5 F) H- R. W
    typedefeosio::multi_index>,indexed_by>>datastore;
# h; V+ Z9 e% p8 X    更多的就不列了。& w+ i! f3 l2 P; S
    这里要注意的一个重要事项是,结构名与表名的匹配,并且将出现在ABI文件中的名称遵循规则(12个字符,所有都是小写的字母)。如果它们没有遵循这个规则,则表不会通过ABI可见(当然可以通过编辑ABI文件来绕过这一点)。3 z% d  {2 k1 A) s) b
    3.创建定义类型的局部变量
$ E* G% f3 I  u    //localinstancesofthemultiindexes
+ w. e2 a& N* v: ~8 X2 q, k; Y    pollstable_polls;
) e  @( s7 s4 S* j1 b6 I    votes_votes;
- N9 y4 j$ b; f) }/ G* M% W    现在我已经定义了一个带有两个索引的多索引表,我可以在我的智能合约中使用它。
6 x0 t$ U& J, N- N0 y, i$ z    如下是一个智能合约使用两个索引的多索引表的例子。在这里你可以看到如何遍历表,如何在同一合约中使用两个表,我们未来将增加额外的教程,利用多索引表。9 v7 E, ^5 _7 z) _+ J* J; ?
    #include% l  ?( Q+ R0 [. Y/ g* [
    usingnamespaceeosio;  Z' W5 U( q! p- x2 m
    classyouvote:publiccontract{+ P7 z- \4 Q5 |; L( d1 b- k
    public:! U' N4 v3 C$ t5 F
    youvote(account_names):contract(s),_polls(s,s),_votes(s,s)
! g7 e- W0 e0 T    {}
' R# ^7 b3 b/ r' Q4 T    //publicmethodsexposedviatheABI
/ |: U" ~0 C: U& W( ?    //onpollsTable
& x9 G  z3 K: }0 l    ///@abiaction
: v1 {% x6 O+ V$ Z7 F    voidversion()
, D3 G( Z) Z. e: f    {5 x; f  S) v' y0 C" t( d; B+ S& y
    print("YouVoteversion0.01");
; O# x. _; b' Z: r    };1 F% D1 v) y9 a1 U2 V0 `6 E
    ///@abiaction& @& Q$ p$ a8 u7 _3 p7 D% k) [4 |
    voidaddpoll(account_names,std::stringpollName)# P! ]  U1 f1 c, |; f
    {
& p8 d( V- d$ v8 u) I3 |    //require_auth(s);* B3 O! U7 N. ^
    print("Addpoll",pollName);% X) k" B: j4 Y6 j
    //updatethetabletoincludeanewpoll% c6 S- M  r# Q0 J
    _polls.emplace(get_self(),[&](auto&p). y$ ^" F$ I' L! H& A& `& v
    {
8 f# t6 e  V' F    p.key=_polls.available_primary_key();
$ ^( }. S" b8 o9 b. H3 T    p.pollId=_polls.available_primary_key();
  Z1 {( b( `( d( \5 Z5 ?: i4 a8 Q    p.pollName=pollName;
/ W0 A4 D+ c3 p    p.pollStatus=0;7 P  F8 y2 Y6 y9 O. M
    p.option="";& A2 _) S: G7 @; @. A7 e. s
    p.count=0;* F5 Q! Q! _7 ]( |
    });% D4 v" W0 O, R+ e& y9 L
    };
5 U: E+ z/ ^" n; ]6 c. U    ///@abiaction! W1 F2 \& f% T9 ?. `, U: P
    voidrmpoll(account_names,std::stringpollName)+ k* {  k  u! P4 h" p
    {
1 t' j. H1 {1 g2 @  n    //require_auth(s);" H! \! u" {6 L/ J" ^
    print("Removepoll",pollName);" ~+ M6 S( m# z: g' A
    std::vectorkeysForDeletion;
2 e7 Q  e- n/ M6 y    //finditemswhichareforthenamedpoll' k. V& m6 t! k" h2 \2 P
    for(auto&item:_polls)+ W, p& ]$ V! ?5 r: r  S1 u% M; u
    {
* f3 R5 E! v) _) O3 f% \/ A    if(item.pollName==pollName)5 J, h, B; B3 K1 g& e! B/ ^) L# E& W
    {
3 _0 P! x9 ~$ O    keysForDeletion.push_back(item.key);
; z  u7 |" J$ S! ^0 d3 D# k    }
0 V1 t4 M0 }  M! U. q    }- b3 L0 n1 Z) ^5 p# o( ~* ]
    //nowdeleteeachitemforthatpoll/ M, Q! {5 _, i$ X
    for(uint64_tkey:keysForDeletion)" A9 p: T6 l% R* {2 \
    {( n+ J8 a8 u0 w2 S! }
    print("removefrom_polls",key);0 F: q" G6 k. ?0 ^4 w
    autoitr=_polls.find(key);5 p' U" G5 x9 m! J
    if(itr!=_polls.end())
0 b6 {7 S: w0 i/ z) G$ X% [# k    {0 L( ?. \5 V: R( ]. k3 `. g
    _polls.erase(itr);. d  f- c/ V% H: X
    }
5 R: N/ P# y7 z9 q+ N1 i6 ^) r, T+ Z    }
4 Q7 h0 k5 z" s- Y/ r0 \    //addremovevotes...don'tneedittheactionsarepermanentlystoredontheblockchain7 j6 Z- h6 X4 A* @% @+ s, _
    std::vectorkeysForDeletionFromVotes;
7 D1 M6 k/ ?2 K- }; l    //finditemswhichareforthenamedpoll
! ~: G6 [6 K6 J* p5 P# M9 b    for(auto&item:_votes)
/ {4 @0 z8 T7 C+ P( ~# X- B! u    {% p/ x, M7 ~  }2 ~. R
    if(item.pollName==pollName)9 W' h$ A. Q, u/ _& J' B0 F
    {
% C  W0 t& Y4 A+ }; f) b( p: F8 w    keysForDeletionFromVotes.push_back(item.key);
% `; |) a. u: ^/ {9 ]7 D' }: \    }6 ~0 j* l% O0 `0 v
    }2 d1 C) P! ]6 W0 `3 s
    //nowdeleteeachitemforthatpoll
# J( A& u$ a. K; T# ^! w5 v    for(uint64_tkey:keysForDeletionFromVotes)  [; ~6 y( y5 c9 D
    {
, `  g; |& G+ W7 I1 G    print("removefrom_votes",key);
  [' I+ s6 n* L& _7 L    autoitr=_votes.find(key);
( e- o. g( K: r) i) d1 N, F    if(itr!=_votes.end())
6 w. H4 D9 Z8 E9 o" o0 v& j9 K    {
5 t9 l% c' Y- ?/ U    _votes.erase(itr);+ N, ^2 K9 j+ F$ c6 D: v
    }6 C) q: i( @0 p% E$ ]4 h2 D
    }
! Y4 t- s+ D. e; j3 q9 b/ W    };! ^, w% t7 T2 ^3 Y* {
    ///@abiaction  @$ B8 o! I/ R9 M& g  K! V
    voidstatus(std::stringpollName)  B$ S6 ?* i% Q% l1 V* C
    {
' ^- S/ g+ a* `" g( s    print("Changepollstatus",pollName);
: h! }! Q( K' i    std::vectorkeysForModify;. f# t2 Z1 T# E9 p7 {. K
    //finditemswhichareforthenamedpoll4 s( {( {8 T( T8 w  y: o+ C
    for(auto&item:_polls)
* x: B  @0 C: Q& u/ a# L    {$ b% W2 K0 A( I' E2 i/ g
    if(item.pollName==pollName)
. ~% m0 O' `1 _: d3 `, H) x    {8 m2 t6 u  D; {2 t0 N
    keysForModify.push_back(item.key);
6 g  R9 I9 I9 O    }
& V8 d4 _* J$ i! H    }$ T! \7 Y1 E) y% i  n2 ^
    //nowgeteachitemandmodifythestatus4 l: w! B+ R& h; t: Q8 P5 V# d
    for(uint64_tkey:keysForModify); \3 O9 z5 C. ~
    {
  ~0 Y% d' f( K# ?) H3 C    print("modify_pollsstatus",key);
$ Q+ o" S; f( Y* k0 h( p' }8 E    autoitr=_polls.find(key);
* N& O$ W0 L& g1 X; o5 {    if(itr!=_polls.end())5 l; L% ]6 W; e8 b8 M
    {
3 ^. N6 i5 l9 w. l9 n- x3 y; m) t" m    _polls.modify(itr,get_self(),[&](auto&p); D$ h7 _8 a" t' S' @
    {3 {% p# S# K. h0 x% B
    p.pollStatus=p.pollStatus+1;
- K" G4 V. i% b7 o3 D4 N7 O    });
, ?0 n& Q/ r" `; n& n2 q* A: h    }
  J. ?1 ]7 O% A    }
6 @% ~  `+ f  I0 A    };+ K4 R; Q1 u& K3 Z& A3 X
    ///@abiaction* x+ l9 [- j$ Z' g( W9 g! B% T
    voidstatusreset(std::stringpollName)3 d" K( I1 ~3 E7 ]; `4 H7 C8 n  u9 u
    {
' G$ r  d( w* t! v' k+ z. u    print("Resetpollstatus",pollName);
: {, P; a% Y; X1 n4 w  j& Y! m    std::vectorkeysForModify;$ k( t* J/ H# ^7 r/ i4 T# d
    //findallpollitems
# B" W* E" h. `    for(auto&item:_polls)
$ V, ?; A6 B+ [. ]4 R0 a; ?    {
9 q2 k9 x9 L9 \    if(item.pollName==pollName)8 q/ F. [- t" _$ Z3 ?
    {2 `9 ?6 U* o* j" `
    keysForModify.push_back(item.key);
+ U$ f6 {' T$ _, P    }
3 |% Q8 T2 [7 {, K    }* x# R- `; G% T2 Y2 n
    //updatethestatusineachpollitem0 g( B: q/ G. \5 I7 `4 v; q
    for(uint64_tkey:keysForModify)
# h* P1 _9 r6 V, w    {
1 d; d" `& c2 d0 w' V+ ^. B    print("modify_pollsstatus",key);
4 F+ R4 t- a* i) ~    autoitr=_polls.find(key);" m6 f3 W9 |9 V5 K
    if(itr!=_polls.end())
5 s  A, J% z. X2 \4 C    {8 n3 r& u1 H* S1 ~$ b
    _polls.modify(itr,get_self(),[&](auto&p)
6 c9 @7 |! q0 H' @! O! {" G    {
+ S! C; w& T1 H9 A    p.pollStatus=0;- ^3 O8 x5 Z# O- q8 D+ R3 o6 A
    });8 D2 Q& W5 b7 c4 L1 v
    }
$ O" {: a4 \" Y  V! {* C    }
. |  ?. O6 {& a* C0 B    };
, I! r5 \1 \: X# F    ///@abiaction
( M" s+ c0 U; W) l    voidaddpollopt(std::stringpollName,std::stringoption). u/ S& U: d: c' r+ l- R: a
    {
- \3 O* c7 Q( C& X, x6 K* Y    print("Addpolloption",pollName,"option",option);
$ B/ C9 }% V  [1 |0 a; l. e    //findthepollId,from_polls,usethistoupdatethe_pollswithanewoption
/ O7 I# z8 o0 J0 j    for(auto&item:_polls)
9 H8 b' M6 F7 l! `5 B2 N    {- u( x# L4 k- s8 w. @9 D
    if(item.pollName==pollName)
, F/ l6 D( v- w, G$ U! P4 L    {
) q6 b( \) s: v& e    //canonlyaddifthepollisnotstartedorfinished
7 N- A/ i% n4 s% x    if(item.pollStatus==0)/ {/ ?  p$ K; k
    {4 d5 b0 I: w0 k% W0 V/ O, k
    _polls.emplace(get_self(),[&](auto&p)
5 Q1 I  M$ ?; U1 C" d$ n    {
8 g. m5 o, d$ J# ~0 O    p.key=_polls.available_primary_key();
+ G1 @6 j1 x  F2 R    p.pollId=item.pollId;+ M# a0 E2 F. j
    p.pollName=item.pollName;
1 K7 a5 W  c+ Q/ ]1 l/ x" B( ]8 E& J    p.pollStatus=0;
# e+ R! \( w$ k) O" U    p.option=option;
, q- ^& ]4 F7 l3 d2 M2 L) Z6 [    p.count=0;
! s/ w  L& }1 ?3 s  _7 N    });& W1 ~- ]8 ?4 ~! t6 ?2 A$ x) ~" n: Q
    }9 w4 X* m- @/ n* I5 f3 j
    else
! z  Y9 ~; T  F& T5 r9 _    {, a. E4 d4 }% e/ X  q$ e, c
    print("Cannotaddpolloption",pollName,"option",option,"Pollhasstartedorisfinished.");: p, S/ o" i% r/ N
    }
9 I$ }9 m$ z( d" D8 O- a    break;//soyouonlyadditonce
8 W2 N9 p5 ~$ F- k2 g' h; o- Q8 z    }* ~8 Z5 i" Z+ U% ^$ k4 C; f4 f
    }' w$ f7 G' T% J2 l6 f
    };) N: g. i4 o! D' X" j- v
    ///@abiaction; l+ V  Y9 p/ Q1 w  V
    voidrmpollopt(std::stringpollName,std::stringoption)* I' j3 T$ ^; {' }5 J& P( P
    {4 m1 E. V4 q( e
    print("Removepolloption",pollName,"option",option);
% ]3 d8 f. S6 a3 j3 s; w. K    std::vectorkeysForDeletion;) \9 j/ U% N! W$ T1 G
    //findandremovethenamedpoll
! i( H/ Q0 m$ u    for(auto&item:_polls)( E. S+ A! k9 ~2 i9 \' W
    {
* W) q) G+ r8 h8 i9 e6 w! Q    if(item.pollName==pollName)& G) W% g  k$ ?  T. N
    {) J' J( E  @5 {/ h8 n6 i
    keysForDeletion.push_back(item.key);' f& D' X/ n# L# {
    }
4 G% t! o+ Q1 X. p1 v    }
6 K* q8 t& r1 c  N3 G    for(uint64_tkey:keysForDeletion)9 d# H2 ]" R; ^& g+ ?) @8 O
    {
$ {; W+ H* E, c    print("removefrom_polls",key);0 C; R) \+ V. X, i0 h! `; d8 d" Z
    autoitr=_polls.find(key);! A6 {, S, s5 c
    if(itr!=_polls.end())
  a$ c( ^/ S9 q" T9 K: O    {; ]9 Q; @! @- s$ c4 J
    if(itr->option==option)# o4 a; {- w# ]; }1 z+ F
    {2 q% n$ X2 V' x7 P
    _polls.erase(itr);* E0 N+ X* j/ e1 K  b
    }
9 ~& S3 {  d0 l* J& g4 `0 D1 l' F    }$ N! O2 ?8 J7 m! `& [3 M. R
    }; C3 i; Y+ R0 V+ \- V
    };# Y: |# J+ D- ?; x. H. j8 n) g9 e- W
    ///@abiaction! I, y5 }% [5 z, E5 {- k' s6 a
    voidvote(std::stringpollName,std::stringoption,std::stringaccountName)
; o  K) e% y  J# ]) ?    {  z. `, n8 E  p# ?) G
    print("votefor",option,"inpoll",pollName,"by",accountName);
, l4 v* d: [  W8 S9 _+ L0 R    //isthepollopen1 i5 R0 s. [4 R" {0 h
    for(auto&item:_polls)+ d1 z5 K  g* U
    {
6 u8 c6 Y4 Y* z6 g0 _; T1 j( B    if(item.pollName==pollName)
" f" }- E2 w! \: f# {" B    {, M& K8 k$ K3 K. P+ u( h, u
    if(item.pollStatus!=1)/ s% V. h# N1 y; a1 p. L
    {
0 j8 s8 ^- p8 }( u    print("Poll",pollName,"isnotopen");
- s0 n' o6 M% B2 [    return;2 y. w3 \2 \0 x& D! U+ e. r
    }# ?+ Y3 e/ L4 l: n5 c
    break;//onlyneedtocheckstatusonce
. {, s% v; m/ m2 Z    }0 N/ U7 H" n& c& \
    }) K2 T) w1 `7 h& k; q
    //hasaccountnamealreadyvoted?
3 c* t: V) {1 e% P. J6 k$ p; U    for(auto&vote:_votes)
9 j) b3 S0 D9 _, k! u    {
6 P$ k$ ^1 U) ]  s- g    if(vote.pollName==pollName&&vote.account==accountName)1 u( H7 a3 w0 e
    {3 Q; U- f' W% W% r9 {
    print(accountName,"hasalreadyvotedinpoll",pollName);  a8 z) }8 ~5 @# w* g
    //eosio_assert(true,"AlreadyVoted");; y1 V1 a) u# A! V. }
    return;# P( L: K& b) W8 [
    }
/ t8 j. y8 A' D1 H% R1 Z# }    }
9 o& p' ]. r0 Y. L) _    uint64_tpollId=99999;//getthepollIdforthe_votestable: _+ E/ `1 R" j7 X* T+ T5 F' h8 A
    //findthepollandtheoptionandincrementthecount
! q0 i" X+ I) T( }) i    for(auto&item:_polls)
+ L) r5 e) O  d6 y3 T8 u( V4 r    {. A6 g: [3 k& p2 B
    if(item.pollName==pollName&&item.option==option)
- w1 O! _% H8 x1 Y    {4 c( S5 l' \3 H  L$ r+ k7 O" Q
    pollId=item.pollId;//forrecordingvoteinthispoll- ?- }* M* `$ Q7 r0 {# \9 u! o6 t/ ^8 V
    _polls.modify(item,get_self(),[&](auto&p)) ?, c6 Y, _4 \) W; M% _3 ]" F
    {; ^: `% Q* k6 V4 O9 N" g
    p.count=p.count+1;
4 j' ]4 P8 p: L3 Z/ w/ o4 V    });) }- a7 X$ a' }4 l0 L1 z* W, E
    }2 r& g: U" n' @2 E$ P4 W( z
    }
# j6 {: {, O* O2 G0 o7 z    //recordthataccountNamehasvoted
# U- D: R- Y( \1 R2 w1 @    _votes.emplace(get_self(),[&](auto&pv)2 \) h/ o, h2 k
    {* D: j% V6 ?8 v
    pv.key=_votes.available_primary_key();
  q' s0 O$ l* I# N$ U2 u    pv.pollId=pollId;  N7 e+ w9 W; W$ C. v- o
    pv.pollName=pollName;
6 ?1 q2 j- w( c    pv.account=accountName;
, B% t% ~7 G' ^( F    });
3 ^. O  s! L; {# q0 r$ f, [( ^6 N    };
% U0 l: m9 m+ i; I1 P, [    private:
3 y6 @4 X; Z- X/ v/ L2 ~5 l    //createthemultiindextablestostorethedata
& U$ J9 q& R6 m- z/ C- _    ///@abitable
* x6 K. @) a3 J    structpoll8 V+ V* A1 Q' t7 O0 F' Z! M' ?
    {* {: M! i  K5 J) V$ h1 a7 S
    uint64_tkey;//primarykey
8 z, j9 ]0 w5 Y) ^! R" C; y    uint64_tpollId;//secondkey,non-unique,thistablewillhaveduprowsforeachpollbecauseofoption! ^: B% y3 m/ D+ W  Z* {
    std::stringpollName;//nameofpoll
  o, e& ^& ]' w$ W) w6 T! k    uint8_tpollStatus=0;//stauswhere0=closed,1=open,2=finished
; {) i, n) D8 k; p: L+ [    std::stringoption;//theitemyoucanvotefor+ X& i6 Z# U9 j5 ^8 X4 |: I  ^' M
    uint32_tcount=0;//thenumberofvotesforeachitme--thistobepulledouttosepartetable.
2 M% J8 v. S% W    uint64_tprimary_key()const{returnkey;}
3 H1 C2 D9 Q& t5 _0 E8 u    uint64_tby_pollId()const{returnpollId;}
( b) [' C0 x' F* R" @: a    };
+ p! r3 D9 E+ B( o! K. f4 u+ ~, W    typedefeosio::multi_index>>pollstable;
2 [! ]: K3 L5 `% c) N    ///@abitable( v- t# q( @5 y  V& D
    structpollvotes
/ Y% @, b0 T( |3 Z& w    {# P) U: X8 A8 X' {6 w
    uint64_tkey;; Q8 z2 L# m6 G) p' `" H* w# H% U
    uint64_tpollId;: s9 j8 _, Z4 v! v: u, H. J
    std::stringpollName;//nameofpoll& Y& s- n  _* I* \
    std::stringaccount;//thisaccounthasvoted,usethistomakesurenoonevotes>1
$ G" s' Y  ]) n+ f+ ?+ Q    uint64_tprimary_key()const{returnkey;}3 H3 |4 e) q9 G& g; c7 H  ~, _: M
    uint64_tby_pollId()const{returnpollId;}
/ B9 C9 ]! X- s7 W2 B  k( C    };
! m+ ?4 Q. d. i- r    typedefeosio::multi_index>>votes;- \2 c3 j0 ~% s7 Y7 _
    //localinstancesofthemultiindexes5 Q, D! X' u- }
    pollstable_polls;
# R. `* |. o0 V2 D6 ?    votes_votes;
  R6 K( ?6 D' W' U" \    };8 q( }1 t; U  A3 |3 S3 h
    EOSIO_ABI(youvote,(version)(addpoll)(rmpoll)(status)(statusreset)(addpollopt)(rmpollopt)(vote))2 [/ G% f' r' y& }6 P8 q
    注意EOSIO_ABI调用,它通过ABI公开函数,重要的是函数名与ABI函数名规则一定要匹配。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    10