Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

EOS智能合约的多索引表table

西门幻雪雪vj
128 0 0
建多索引表是一种为了在RAM快速访问的方法,主要用来来缓存状态和数据。多索引表支持创建、读取、更新和删除(CRUD)业务,区块链不行(它只支持创建和读取)。) B; q% R) s0 [
    多索引表提供了快速访问数据存储接口,是一种存储智能合同中使用的数据的实用的方法。在区块链记录交易信息,你应该使用多索引表存储应用程序数据。
3 e* |6 Q; z; ]7 K    使用多索引表,因为他们支持为使用的数据建立多个索引,主索引必须是uint64_t类型和唯一的,但其他的索引,可以有重复的,你可以使用多达16个,类型可以是uint64_t,uint128_t,uint256_t,doubleorlongdouble。# _5 s1 P* w; d, n2 o) C. M7 q
    如果你想你需要使用一个字符串做索引,需要转换成一个整数型,将结果存储在随后索引的字段中。# _  q. [- W, W. i% a
    1.创建一个结构
- m$ O+ }- Z+ j6 u7 A    创建一个可以存储在多索引表中的结构,并在要索引的字段上定义getter。
6 o' @: I. [  l; i/ W    请记住,这些getter中必须有一个命名为primary_key(),如果没有这个,编译器eosiocpp将产生一个错误…"itcan’tfindthefieldtouseastheprimarykey"即它找不到任何一个字段被作为主键。
: ~* d2 k. ^* ]8 x4 c    如果你想要有一个以上的索引,(最多允许16个),然后为你想要索引的任何字段定义一个getter,这时这个名称就不那么重要了,因为你会把getter名称传递给typedef。4 K! h1 ^4 u8 g# m4 Q/ o( N
    ///@abitable
; y/ Y, D' [6 X    structmystruct! U! k5 P, Q5 u0 F: x9 b1 f( H
    {7 u) g! K2 \" ~
    uint64_tkey;
$ w1 d- }$ d7 c  K' O. g9 Z' E    uint64_tsecondid;
0 {& p& V+ ]. E& c* ]6 G    std::stringname;
- n8 U3 `! R9 ]! E    std::stringaccount;  \( G  Q+ l! J9 d  @7 ~6 I/ l
    uint64_tprimary_key()const{returnkey;}//getterforprimarykey
( V% r% e5 t7 }8 L' [( N    uint64_tby_id()const{returnsecondid;}//getterforadditionalkey9 o$ W+ B* O+ H1 ~6 i6 \3 K* j
    };& U+ H0 u: ~- O' c& \0 I$ M0 L* o. D( M( S
    这里还要注意两件事:
, y5 ^- z/ X' ~; \9 ?. y/ _    1.注释:) _' U% j% I8 Y. D8 I$ ^1 C4 [' m
    ///@abitable8 }9 m) a: K7 a3 ]
    编译器需要使用eosiocpp来识别要通过ABI公开该表并使其在智能合约之外可见。
6 f' ]$ ~4 z# J! l5 L; l8 v! U    2.结构名称少于12个字符,而且所有的字符都要小写字母。
' L% I8 Q& ?4 N7 b    2.多索引表和定义索引$ R- Q! X1 i7 X
    定义多索引表将使用mystruct,告诉它要索引什么,以及如何获取正在索引的数据。主键将自动创建的,所以使用struct后,如果我想要一个只有一个主键的多索引表,我可以定义它为:
7 B- }7 J: r* o6 ?& W- l    typedefeosio::multi_indexdatastore;
! T* F  G. \6 W8 ^0 z- c; M    这定义了多个索引通过表名N(mystruct)和结构名mystruct。N(mystruct)会对结构名编译转换到uint64_t,使用uint64_t来标识属于多索引表的数据。6 M, A* Z9 H/ A- {( M
    若要添加附加索引或辅助索引,则使用indexed_by模板作为参数,因此定义变为:
  x, ~) z5 A2 G) b& m    typedefeosio::multi_index>>datastore;
1 y7 _6 k4 ]# m5 x: G5 w    注意:/ |% b" I% E: z: p4 b: R' r
    indexed_by>  a/ v1 b9 e6 C  I! z4 u$ x" j
    参数:
% D8 y9 B  ~. S' \0 \% l* n    字段的名称转换为整数,N(secondid)+ Q- K% @' U- D! T+ H/ C+ y
    一个用户定义的密钥调用接口,const_mem_fun
8 o2 Z8 {% L7 A    来看看有三个索引的情况。: Z. @% o8 a; _( ~0 n. q
    ///@abitable
7 f  g/ i; q6 f    structmystruct
) ]; b" i- j7 M, y; y6 K8 W    {
$ g0 o$ K  M( v( b  v    uint64_tkey;. D* K' b8 v7 F3 O4 Y& X" u
    uint64_tsecondid;0 s% ^% y* `& w/ w- `7 r0 u/ O
    uint64_tanotherid;" \& a* X; ?8 t5 k. m4 Q
    std::stringname;* O- `0 K* Z: y- ]  N
    std::stringaccount;& _5 C* L9 X/ n5 s4 r1 P' r% ]; l
    uint64_tprimary_key()const{returnkey;}
6 Y5 r+ Z' e* }8 ^    uint64_tby_id()const{returnsecondid;}$ U7 ?; ~& _; x7 r- I* y0 x
    uint64_tby_anotherid()const{returnanotherid;}
- R  z% ?8 @. c) o! ]    };
/ A  d( O: a$ d6 i! Y" B    typedefeosio::multi_index>,indexed_by>>datastore;
! i' S, Q$ w- Q$ \    更多的就不列了。
% H' Q" ^  k6 b6 c    这里要注意的一个重要事项是,结构名与表名的匹配,并且将出现在ABI文件中的名称遵循规则(12个字符,所有都是小写的字母)。如果它们没有遵循这个规则,则表不会通过ABI可见(当然可以通过编辑ABI文件来绕过这一点)。* x5 a# Q& U1 J5 ~% g- |
    3.创建定义类型的局部变量
3 F( @8 |2 A6 X    //localinstancesofthemultiindexes
, z1 w0 J  Q& \2 T4 ~, Z    pollstable_polls;
; v2 Y! a- c7 O& e    votes_votes;
* T. ~3 S7 x$ J5 _' b5 ]# b    现在我已经定义了一个带有两个索引的多索引表,我可以在我的智能合约中使用它。. \. H! Y( q: L' B, u: D# n: G
    如下是一个智能合约使用两个索引的多索引表的例子。在这里你可以看到如何遍历表,如何在同一合约中使用两个表,我们未来将增加额外的教程,利用多索引表。: s% f$ }& ~* E7 h' S
    #include1 w% g. u4 `8 U' _+ h: ]/ Z
    usingnamespaceeosio;
1 f; _+ Z- J( M; `6 n% E4 }    classyouvote:publiccontract{
6 N8 N- g* D! u- Z    public:
2 R; a: G) A" N- U    youvote(account_names):contract(s),_polls(s,s),_votes(s,s)
  d1 N- `- L! x& o+ N& l$ W    {}6 w4 Y( c8 e" g; d
    //publicmethodsexposedviatheABI) W8 g5 L2 x9 F0 L9 ]6 Q% j7 i
    //onpollsTable
. n6 X3 e$ P5 I+ ?+ B    ///@abiaction+ O4 s( j; I, g! \0 v) `
    voidversion(): B/ E2 g4 C/ O$ x4 D( \, @8 r% H
    {; W: r  j0 N6 M  u
    print("YouVoteversion0.01");
1 r, [9 r. t$ {: [  T& k6 F/ {* z. P    };0 j" ]$ B; A. n3 V" j' m
    ///@abiaction
& q, C  Q! E/ g! D- h) `# F, L    voidaddpoll(account_names,std::stringpollName)0 d2 ~; U2 L. ?* g+ s9 f
    {
! S4 B" i$ ?  p* ^1 K) ?    //require_auth(s);
7 e9 H6 `- t- M1 W) T& a" w    print("Addpoll",pollName);# k* d! _. d: l) F
    //updatethetabletoincludeanewpoll
7 I# T# y' H' J$ }' t: ^    _polls.emplace(get_self(),[&](auto&p)/ @1 ?6 |( h- F+ C9 x6 D
    {
8 s' b/ y; i7 O% U5 ^    p.key=_polls.available_primary_key();6 \" ~  h& \# Z
    p.pollId=_polls.available_primary_key();4 J  v8 p1 c$ @
    p.pollName=pollName;
4 A' \4 T/ z  C7 t- X" C0 p    p.pollStatus=0;4 o% a8 D3 p0 F
    p.option="";7 U" d  P% B. u0 I
    p.count=0;
$ b9 y8 V7 }2 A( P$ B9 W  Y( I    });- `0 [( g0 g; h7 ]+ n' z
    };
5 j$ {. O; |+ }6 m2 H% h    ///@abiaction1 z4 Q- |; R! f0 X; u
    voidrmpoll(account_names,std::stringpollName)
% k. V1 u" [- R+ V5 H    {
3 }& G, K+ u2 N+ i    //require_auth(s);: x  [/ d' ~: L0 \1 x) r& c
    print("Removepoll",pollName);. e$ B8 h$ X+ [* H( M: Y7 {
    std::vectorkeysForDeletion;3 C# g8 m; B$ I7 b$ R# s
    //finditemswhichareforthenamedpoll
1 K1 z) A+ }) e    for(auto&item:_polls): w& v$ E0 o+ U- d  l1 x/ T% R
    {5 o% s3 F: s, q! |. p% o
    if(item.pollName==pollName)
7 v( Q: n# R" j    {
4 c. _: r: G  P& U    keysForDeletion.push_back(item.key);
9 a- }9 I0 d" S; l, ^4 V    }
7 w8 f8 {# ~" V( L" m    }
% Q5 n: b4 h, |& l! B7 n    //nowdeleteeachitemforthatpoll
$ m+ y3 v3 C. ?1 H. z! E    for(uint64_tkey:keysForDeletion)1 q' t% u7 t. I
    {
- J: l% f. W* D/ J. _& x6 r5 }4 t    print("removefrom_polls",key);* o1 b2 S; m+ B8 o  _6 {& F" y& R  C
    autoitr=_polls.find(key);
$ v/ d9 A) y* c5 ~    if(itr!=_polls.end())4 ]% u# a* G" @6 t. x  F
    {
% y% n' x5 x! w/ l* [; W7 ?    _polls.erase(itr);
; j6 P  }1 e( v6 ^) `    }
6 j$ L7 l! P! u1 O& q    }
$ H* V% U+ n, A1 D1 }3 D1 l$ U* j2 T    //addremovevotes...don'tneedittheactionsarepermanentlystoredontheblockchain
! \/ N% M$ X1 D4 ~    std::vectorkeysForDeletionFromVotes;8 I9 ?: @" i- V# L
    //finditemswhichareforthenamedpoll# u  R* t( \6 w/ r4 v
    for(auto&item:_votes)7 A7 \1 Q# W3 M
    {
+ |$ U; L7 Y5 s. x& H2 ~, v: R    if(item.pollName==pollName)
- F. O1 l+ _. }: }    {
, G. W# D% a4 A# B    keysForDeletionFromVotes.push_back(item.key);
) T% M* p( f8 p% S9 F4 i    }# p9 v5 D/ a4 ^8 I3 S1 @
    }
4 p" ?/ B, q$ N* K" V: y% r    //nowdeleteeachitemforthatpoll) X% P" \: S% x6 D% ^
    for(uint64_tkey:keysForDeletionFromVotes)
8 \7 I% ~& z9 N* M2 [$ C    {
7 b  t8 U8 _+ `6 v, t. I1 D    print("removefrom_votes",key);
% I8 t4 D; o* I# w- `    autoitr=_votes.find(key);' Y8 t& L8 O# w8 X6 i- c* h
    if(itr!=_votes.end())
; H+ l" |, H) S2 ^  q6 ~0 R, N+ C) w    {
3 _; a! A) t' O, ^    _votes.erase(itr);! _6 w8 _+ K! n& Q, f1 X3 i
    }9 ]" L% q( o  S& ]6 Y& Y
    }
  L8 M6 T, }5 a4 ]6 q1 n5 l    };
- |; a5 e' [9 ~; N  \( m. O4 M    ///@abiaction
+ W- I8 M' F5 k* g    voidstatus(std::stringpollName)/ Z, r  j8 p( J
    {
5 w3 d! J8 K9 i7 A    print("Changepollstatus",pollName);: W9 ^9 \1 h7 ~9 A  y
    std::vectorkeysForModify;( y( f0 q3 ?5 o: y# k& ?8 Z& Z- m
    //finditemswhichareforthenamedpoll
; c: V# l- q3 s# N! S8 `' q; P    for(auto&item:_polls)
% V3 Z, J" P- X0 Z/ a. V    {5 X  t" m2 v4 L. T# d- ^% `
    if(item.pollName==pollName)
/ s) A0 ^; f( I; c. {    {
8 w4 b& I) E2 y  X  F' g9 h8 s0 v# U& H& C    keysForModify.push_back(item.key);- a/ k7 E$ P. z, L/ z8 G/ W
    }; @0 L, d" ]4 S' k: A& k6 Z
    }9 L2 Q5 x( A+ ?& u. Z
    //nowgeteachitemandmodifythestatus
% _0 E# _& @4 g7 D- _. ^' P    for(uint64_tkey:keysForModify): a. B# C! s; f  W0 m$ k
    {
! a( i/ u" @  a; e) g+ v    print("modify_pollsstatus",key);
4 Q! c' g" ^8 o$ U, [    autoitr=_polls.find(key);. X/ o$ ~. ?9 K6 N+ o9 C
    if(itr!=_polls.end())
+ u% Y4 g! O3 l' j* b5 |    {' ^0 C. ~5 }& d7 {
    _polls.modify(itr,get_self(),[&](auto&p)
# w2 i. q0 w( k    {
+ }1 q- r3 v/ {& Z5 Q$ r# v8 u! u    p.pollStatus=p.pollStatus+1;
' `/ ~  D3 M  X. h0 h5 h    });8 _! V0 i$ ]. B  q8 g( n% `
    }
2 ]0 a! F; f- c* H, S4 k& h0 h7 c4 Q    }
$ S  T3 q5 u7 p8 ?4 S' s    };" Q$ t3 _" r1 Z
    ///@abiaction& F' P, m) Y% h9 T& H5 {
    voidstatusreset(std::stringpollName)
& g+ R- g2 [. g, J5 O$ Y" D    {: R* ]8 x+ ~2 I$ [
    print("Resetpollstatus",pollName);
. i8 m1 z: d; S2 k( I    std::vectorkeysForModify;
! o. }9 A, ]3 D2 c    //findallpollitems
" O/ |/ X; k! s    for(auto&item:_polls)
0 L7 m9 n' y" s  K4 |. x) h    {
8 p" v, _! ?: T- l) E6 L$ x    if(item.pollName==pollName)' H( w2 s, {+ `+ U1 W2 k
    {2 N. e$ k# D2 k% C$ F+ f1 A
    keysForModify.push_back(item.key);
9 d. ~; w4 @$ o4 M3 ]: M# C    }3 Q: t- E/ D1 c( D# O
    }# V6 |7 S5 U. j& o$ _
    //updatethestatusineachpollitem
  S+ Y# w1 L- a    for(uint64_tkey:keysForModify)2 z- z( x2 d% A% m1 c/ [: A
    {
' l; ?2 O$ b0 L' m. t    print("modify_pollsstatus",key);
- m0 t& h+ e# l: o7 m    autoitr=_polls.find(key);& x% x( O& L. s( {# m, ]9 c
    if(itr!=_polls.end())
9 L5 x+ c; ^& S0 U. b4 T    {
2 i% z: w' g5 g  C. w2 d5 W" I    _polls.modify(itr,get_self(),[&](auto&p)
/ F* `7 A6 Z- B( T' {1 ^, A    {
, g0 b, b8 I! x1 \& T# b    p.pollStatus=0;  \) s+ `. |6 D5 _6 a! ?
    });
! o. D' W6 T1 ?    }+ A+ e. f0 M# H6 ^4 a5 @  a
    }# @& Q% V1 f, x# m  K
    };
  n% \0 B. a; [( J* c7 J: c    ///@abiaction
- w6 ?: ?8 J6 \5 N0 s4 m) X2 p    voidaddpollopt(std::stringpollName,std::stringoption)
/ U& T0 P9 s4 ~( ^    {. w* B4 e- X( `8 \: Z1 P. H
    print("Addpolloption",pollName,"option",option);
1 X5 S9 _1 f$ M0 Z) d    //findthepollId,from_polls,usethistoupdatethe_pollswithanewoption
( S# J6 e0 ?0 o! A4 H    for(auto&item:_polls)+ l  Y6 M: y* c1 s  c5 Q  {. E
    {
1 b  [/ q" K7 H0 F) q/ N    if(item.pollName==pollName)
- b% H$ K" |7 {- O' R/ P0 x    {0 g4 m) y- {) I# X7 |2 V, p2 b( M6 D
    //canonlyaddifthepollisnotstartedorfinished
1 L! {6 I( j6 B3 b( L    if(item.pollStatus==0)
+ @- W7 @# v" {* A    {
9 ?) ^2 t5 v4 W) u$ x1 j    _polls.emplace(get_self(),[&](auto&p)% M( T+ c0 c! ]; h6 m$ y
    {3 w; {' j% R8 t
    p.key=_polls.available_primary_key();
; p  N4 x. _- w+ V& Y    p.pollId=item.pollId;* j- B- W( g) N9 S. }
    p.pollName=item.pollName;" g) [0 U1 q( k; S/ e, r- @8 P3 s
    p.pollStatus=0;8 S% k0 m* t! X% r% g. n
    p.option=option;* T! F$ ]9 w" z6 w# y' U7 k
    p.count=0;6 e4 z. Y/ F* j, H+ N4 W7 @. |
    });
' u# W6 Y& t# S" G8 B" Y# N    }. M+ U8 @: P5 L7 Z" a6 q: R' Y; ~
    else
: q! a& n* f5 |    {) F! S4 y9 \# g! E4 Y
    print("Cannotaddpolloption",pollName,"option",option,"Pollhasstartedorisfinished.");
. E8 E# ]- y* u. Q9 P    }/ V3 J  ], I0 V" e% O) K
    break;//soyouonlyadditonce
/ @) D9 x9 ], N8 Y# d    }
, y; y/ S: u: g7 Q. Q2 C4 r    }
9 m, M# L* A$ ?$ F/ s    };4 [8 `) P2 Q/ K6 C$ |, O' K/ p( z
    ///@abiaction
$ x& o2 t: t( }/ u    voidrmpollopt(std::stringpollName,std::stringoption); x. L6 O0 F- D  S& |# ]+ [
    {
2 ]3 Y- s6 @1 h/ ]7 W3 b1 K    print("Removepolloption",pollName,"option",option);
- p7 B$ V" t" n% o$ m9 O! Q9 J    std::vectorkeysForDeletion;
  z% J  v+ U' \/ x& s    //findandremovethenamedpoll* w) @' L; X# o2 [' }& T  E1 g
    for(auto&item:_polls)( N# w* {3 B9 p" p; X: |4 I
    {
# S; @( [$ J( o; d; T    if(item.pollName==pollName)- X5 {% Q/ I  ]" y7 d* z
    {
& k3 F+ b+ r8 Q2 u    keysForDeletion.push_back(item.key);4 g2 J" c+ g! [: d' {
    }
8 b& D& O  P8 s" l  b4 _( ?! `    }  R: ]. I/ C& S7 M6 ?) w$ Q
    for(uint64_tkey:keysForDeletion)5 _# J$ B' ?! Q3 I  a# H% B( ~. ~
    {
) L: u. |1 |/ x5 z3 H8 u- v    print("removefrom_polls",key);5 x8 S: \. N4 H' p" D4 ]! l
    autoitr=_polls.find(key);
) b0 v0 C& {( i# o    if(itr!=_polls.end())
/ Y6 U, ^, Y& N- ^% i    {! K7 i( o# t3 E# C+ X  u
    if(itr->option==option)
; E/ \9 {. x6 H" U    {
0 x& b/ Z9 r+ q    _polls.erase(itr);  v' D0 m) i- v7 i
    }
5 r' I- k9 a* \) Q4 [* H    }
' O4 s1 U- Y1 g% v! n    }2 h. `3 v5 U5 O- \% f
    };
. M. l8 J/ i8 V! o3 p    ///@abiaction8 }9 d. ]! E) b% \% o
    voidvote(std::stringpollName,std::stringoption,std::stringaccountName), k" l: m, c; B  v$ q$ j0 ?' y8 X
    {
/ G7 z3 m& ]8 {! b7 B& _! Y9 J    print("votefor",option,"inpoll",pollName,"by",accountName);9 V& W' Z- n$ n" |
    //isthepollopen
2 d8 y  ^& Z! M8 U6 x, H; `    for(auto&item:_polls)
% V/ }2 {; W- A  O) U9 ?1 Q  _4 h    {/ W+ B( k) C2 N+ [0 N8 r8 S0 x
    if(item.pollName==pollName)
0 q. {8 J6 ^7 H- g    {
2 A) {7 ^' [. s" y1 x& ~    if(item.pollStatus!=1)/ G2 c7 c% ^4 ]4 J
    {
7 D* `+ {7 W& J7 |1 [/ o5 i3 v. N3 y& ?    print("Poll",pollName,"isnotopen");
3 r0 e4 [$ t% |. @- F2 I# q    return;
, ]4 F$ R" s; ?% y1 @' h! t8 C4 q    }
1 o0 }9 a: V+ Q, D    break;//onlyneedtocheckstatusonce! _: x$ b+ \' j6 r3 Y
    }
6 b& C, W' ?$ p7 o0 |' U    }
: W% x& m# U) R2 |' E  d    //hasaccountnamealreadyvoted?3 q9 b* u5 [1 o& V2 I" V  @
    for(auto&vote:_votes)
+ S5 Q! n) _% K+ w2 g+ N    {5 X% |* y8 ^5 V8 i& a3 H
    if(vote.pollName==pollName&&vote.account==accountName)  E1 D4 L8 k$ D! W+ w
    {
4 I  M' R+ B1 P2 f) s3 E    print(accountName,"hasalreadyvotedinpoll",pollName);( H( }! x7 U2 o4 v+ ^/ @, E
    //eosio_assert(true,"AlreadyVoted");1 E. v' J, Q2 N: s- s! }' T
    return;& \: w; ^" h- P2 Z- j8 Y5 Q! |
    }0 t3 j6 K; G/ }1 f+ |
    }
0 w/ T* a! s6 m/ [, @% ]1 }6 T    uint64_tpollId=99999;//getthepollIdforthe_votestable' R7 w0 I% }9 m! R& W8 l
    //findthepollandtheoptionandincrementthecount
2 h2 G' F4 ?  u( d- E2 W+ j! t9 |0 T% A    for(auto&item:_polls)8 {( r8 X& [+ V" u6 m( v
    {
/ ~9 j- t$ U2 ]7 Y5 M9 }. t    if(item.pollName==pollName&&item.option==option)
, Z8 r. p9 U3 W+ M. O    {
/ ?, C0 r" q" p3 j    pollId=item.pollId;//forrecordingvoteinthispoll# M( L( d6 F4 `! w% q! J: \
    _polls.modify(item,get_self(),[&](auto&p)9 g# x; Y: R6 Z: X7 k) S0 K2 k/ U6 s
    {
5 U# T2 ?8 _* X$ ]; _% M& p! i    p.count=p.count+1;
5 \- \7 R0 T# ?3 @    });
. K7 B! \' [- W- m    }
  p1 f- E; V+ e- B5 [5 f6 k9 ]    }8 P  M0 R3 y# Q
    //recordthataccountNamehasvoted2 K/ W: t, s3 X6 E- M
    _votes.emplace(get_self(),[&](auto&pv)
( M! g4 u- s+ R8 A8 D    {
; h1 S$ C0 R4 {& \: q( V    pv.key=_votes.available_primary_key();
2 y# W7 Z7 z6 A6 x7 D    pv.pollId=pollId;
; L, I" N- W% n! s$ u+ S    pv.pollName=pollName;# Y3 g1 x$ {$ z% b% \  T
    pv.account=accountName;3 \4 A' _7 e! c" U' a1 N; e( N
    });
5 ]+ H9 ~& t1 o1 a- D: h    };. h8 n- ], y3 k- E" d6 W
    private:
2 y; x) k2 V* V* N6 n, i' B) K$ V    //createthemultiindextablestostorethedata$ m3 b$ I# h- v( a2 w4 J$ S
    ///@abitable
! e6 K8 A7 `1 x/ [+ m8 y2 ^( a1 w    structpoll
1 M% D/ ]3 x3 K6 I    {
* c; F1 D- j: ?    uint64_tkey;//primarykey
" ?2 @" Y& Z2 ~# |    uint64_tpollId;//secondkey,non-unique,thistablewillhaveduprowsforeachpollbecauseofoption
, N9 W5 T% J6 }* b    std::stringpollName;//nameofpoll+ l, V! j7 [2 X1 e4 M  F) a
    uint8_tpollStatus=0;//stauswhere0=closed,1=open,2=finished
! w) q( D6 i0 e2 I  ~3 n7 g/ C    std::stringoption;//theitemyoucanvotefor
9 I$ V* X: Y8 c5 H3 M    uint32_tcount=0;//thenumberofvotesforeachitme--thistobepulledouttosepartetable.
* J- X: v) o4 ~  H; t, q    uint64_tprimary_key()const{returnkey;}& X  T, I  Y: g6 D$ t
    uint64_tby_pollId()const{returnpollId;}
' w! V% m& P3 _# E/ @( U9 g    };9 ^- I/ H' R9 `
    typedefeosio::multi_index>>pollstable;
5 c1 Q$ a- {- _% x6 W6 [1 ~    ///@abitable
9 @2 A+ U) ?, w9 h! Y    structpollvotes5 B" {" |4 w2 \3 B6 k8 s
    {
6 r' k; _7 p9 j5 t8 ?    uint64_tkey;3 {: j% S6 T) G( o, [0 ]
    uint64_tpollId;
) I$ e1 Y. q5 S( G% J+ z0 K    std::stringpollName;//nameofpoll) l6 ]4 O+ R; v) c
    std::stringaccount;//thisaccounthasvoted,usethistomakesurenoonevotes>10 ]5 A2 l8 \. p
    uint64_tprimary_key()const{returnkey;}8 T1 Q% ~& I0 Z( t0 S- w
    uint64_tby_pollId()const{returnpollId;}
$ J! w9 O/ Y" R0 B% p    };
8 @. s, o$ K8 z0 n, C    typedefeosio::multi_index>>votes;" G2 j" l: E1 H8 y6 H
    //localinstancesofthemultiindexes$ L2 J9 M4 w5 m! L
    pollstable_polls;
# B$ N& m- ~* d0 t    votes_votes;; T7 e' `) f+ I* i# F$ D
    };
+ p+ ^. ~% c( G8 D2 ^/ Y; D+ Q8 |    EOSIO_ABI(youvote,(version)(addpoll)(rmpoll)(status)(statusreset)(addpollopt)(rmpollopt)(vote))
3 j  a2 M* n. \8 Q  M2 v    注意EOSIO_ABI调用,它通过ABI公开函数,重要的是函数名与ABI函数名规则一定要匹配。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    10