Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

EOS智能合约的多索引表table

西门幻雪雪vj
118 0 0
建多索引表是一种为了在RAM快速访问的方法,主要用来来缓存状态和数据。多索引表支持创建、读取、更新和删除(CRUD)业务,区块链不行(它只支持创建和读取)。' j1 ~+ r4 y# m# w
    多索引表提供了快速访问数据存储接口,是一种存储智能合同中使用的数据的实用的方法。在区块链记录交易信息,你应该使用多索引表存储应用程序数据。
+ W5 M) a( }/ M$ E: ]    使用多索引表,因为他们支持为使用的数据建立多个索引,主索引必须是uint64_t类型和唯一的,但其他的索引,可以有重复的,你可以使用多达16个,类型可以是uint64_t,uint128_t,uint256_t,doubleorlongdouble。
$ P( [: p+ N  U: u5 [    如果你想你需要使用一个字符串做索引,需要转换成一个整数型,将结果存储在随后索引的字段中。$ u+ ]/ C4 x: v( `6 w$ L5 x+ s
    1.创建一个结构
6 N1 M; O% z3 a0 ~    创建一个可以存储在多索引表中的结构,并在要索引的字段上定义getter。
4 g! m4 Y7 f% t5 g1 y# x, I' [    请记住,这些getter中必须有一个命名为primary_key(),如果没有这个,编译器eosiocpp将产生一个错误…"itcan’tfindthefieldtouseastheprimarykey"即它找不到任何一个字段被作为主键。
- X8 X: ^4 A  w8 K, l    如果你想要有一个以上的索引,(最多允许16个),然后为你想要索引的任何字段定义一个getter,这时这个名称就不那么重要了,因为你会把getter名称传递给typedef。, Y( D8 b, M2 Z7 F
    ///@abitable
) H' z3 t/ Y3 S8 a& p    structmystruct4 N  [1 H; U2 U8 \9 ?4 H: u
    {
3 _! G4 E" B* @' p% ~  ]; D& {5 X8 a    uint64_tkey;
' h1 ~1 S) E& l4 h    uint64_tsecondid;
7 N8 s- |0 r6 a/ d+ r6 n2 A: A    std::stringname;! [( [! N- o! L
    std::stringaccount;  A# W8 x  Y! A
    uint64_tprimary_key()const{returnkey;}//getterforprimarykey7 z; Q5 |% V+ |- K  I: H' p. w1 I
    uint64_tby_id()const{returnsecondid;}//getterforadditionalkey  r2 @5 A4 `+ \, ]" m# r2 D4 {
    };
2 k" Z- C5 E) D    这里还要注意两件事:( L2 @: o; X" |# \. N
    1.注释:; T$ _% t6 K6 D5 G. O: y
    ///@abitable5 \* [  b, K: i3 [$ ?4 Q. r1 @0 }
    编译器需要使用eosiocpp来识别要通过ABI公开该表并使其在智能合约之外可见。9 G7 t8 G' o& c8 ]0 ~
    2.结构名称少于12个字符,而且所有的字符都要小写字母。4 E6 g; b  J4 s/ a# f3 [# M
    2.多索引表和定义索引
5 Z$ s* @6 h9 A6 I    定义多索引表将使用mystruct,告诉它要索引什么,以及如何获取正在索引的数据。主键将自动创建的,所以使用struct后,如果我想要一个只有一个主键的多索引表,我可以定义它为:7 ^3 C* d* u3 @" ]! R2 P& p
    typedefeosio::multi_indexdatastore;1 p9 \, [, z4 P0 J5 c& h0 u% j
    这定义了多个索引通过表名N(mystruct)和结构名mystruct。N(mystruct)会对结构名编译转换到uint64_t,使用uint64_t来标识属于多索引表的数据。
/ d9 l5 |! N  A! _. m    若要添加附加索引或辅助索引,则使用indexed_by模板作为参数,因此定义变为:
& H+ }4 A% l2 c  h% S7 S, L    typedefeosio::multi_index>>datastore;! P- F2 L7 _4 L# K1 V" c
    注意:
% K( P4 \! |- Z8 T    indexed_by>0 E* M, `+ l( `7 Q( f
    参数:
" ?# r$ P3 O4 w    字段的名称转换为整数,N(secondid), ?6 [- D# c4 ]& N- ]- T% U6 [
    一个用户定义的密钥调用接口,const_mem_fun1 L2 V9 X; ^  I( U/ z( s" B- T
    来看看有三个索引的情况。
! y( n! b) T9 `3 |( _    ///@abitable
6 A# i' \  H/ r6 ?    structmystruct1 A9 U  z8 U& m) z
    {
2 T  v4 h" N8 H3 s; X; a! b    uint64_tkey;7 J  ^1 i- j, r* T* M" U
    uint64_tsecondid;
* u/ g! Q- w5 l+ Z! a4 Y    uint64_tanotherid;
* j% K# {" t! B    std::stringname;+ Q# p. i' Q3 E
    std::stringaccount;  Z/ O# k5 _8 z, j, ^4 B
    uint64_tprimary_key()const{returnkey;}
7 t* e2 w, ]# n* E- }$ b4 f    uint64_tby_id()const{returnsecondid;}
; ^0 p% v! `* r% G+ [+ f0 M# w9 W2 S    uint64_tby_anotherid()const{returnanotherid;}
) M$ \2 C+ r' d- h+ Y& j. ?9 t% ~1 g    };
5 r3 [7 p6 d3 z    typedefeosio::multi_index>,indexed_by>>datastore;
  g+ f  D" Q! b- Q2 f* p/ }    更多的就不列了。
$ J2 q. m0 A3 g1 w( T    这里要注意的一个重要事项是,结构名与表名的匹配,并且将出现在ABI文件中的名称遵循规则(12个字符,所有都是小写的字母)。如果它们没有遵循这个规则,则表不会通过ABI可见(当然可以通过编辑ABI文件来绕过这一点)。
$ z$ ~9 ^$ T5 a7 _7 c    3.创建定义类型的局部变量3 Z5 S0 |2 x  Q. n) D! G7 z
    //localinstancesofthemultiindexes" C! M* U: q& a5 t# d
    pollstable_polls;
% I2 x" y% a: F( H. x' ~    votes_votes;
# R8 e& R' q6 @5 v9 q% x    现在我已经定义了一个带有两个索引的多索引表,我可以在我的智能合约中使用它。; c% R6 }8 @: C5 o3 S
    如下是一个智能合约使用两个索引的多索引表的例子。在这里你可以看到如何遍历表,如何在同一合约中使用两个表,我们未来将增加额外的教程,利用多索引表。
6 W, O4 r9 e- z2 D+ B    #include
8 Q$ Y1 l# Q  n    usingnamespaceeosio;6 t1 i3 k% f. O0 [7 T, Z
    classyouvote:publiccontract{. h: Z  ~; ^$ ^  k' O3 X8 D  H
    public:9 j+ R% x* G" ^- e2 z
    youvote(account_names):contract(s),_polls(s,s),_votes(s,s)/ m. w+ K& g1 h
    {}6 J/ H9 P3 _' o7 x: c3 e$ |# \5 [# ?
    //publicmethodsexposedviatheABI% z* U- O2 Q: q
    //onpollsTable
4 ?: o. {: y. c5 a1 g: |    ///@abiaction
, n+ O. H" T  S% ]3 A    voidversion()
9 e- @$ |. X* ?5 X: Z    {
( E2 w) l$ Z6 K3 |9 d& @    print("YouVoteversion0.01");
# I" K& j, u. `2 C* P6 u    };
0 R! c& G. n2 V/ M! ]' k    ///@abiaction1 Y% ^) E7 S* A1 s1 d8 ]
    voidaddpoll(account_names,std::stringpollName)7 F& J. p0 J2 A0 A+ o$ `( z9 R
    {3 b' u# V  @/ w+ ~) c3 F4 B* k- h
    //require_auth(s);
; J$ Q# p( A5 k9 d+ U6 C, D. i    print("Addpoll",pollName);
( k5 m' y) D1 f" {/ W- j    //updatethetabletoincludeanewpoll9 [- x& c, H6 \0 `# J& N
    _polls.emplace(get_self(),[&](auto&p)& D9 g( I  J/ O+ Q: {  q% p$ y7 f
    {" U" {! p% {( f. A  g! T% N& I( E
    p.key=_polls.available_primary_key();& ~' _9 M1 A6 a& a6 c- ^( b
    p.pollId=_polls.available_primary_key();
9 m) e7 v1 S5 O    p.pollName=pollName;  U/ E  t4 ^' X8 y* B3 Q
    p.pollStatus=0;8 t0 t3 s6 P% Y. c' C& z
    p.option="";
( a( E6 O+ E$ l& z  }    p.count=0;
2 ^. M6 O5 K! M5 T, v    });. x8 [- m: _" E. ^
    };, _3 y6 A' _3 F& D3 v) s- w7 ]1 Z
    ///@abiaction6 _2 B5 A9 t- G6 N5 f3 [
    voidrmpoll(account_names,std::stringpollName)
$ x" G! C  w& b6 l) u/ S/ M6 _    {
1 T# F* Z7 M+ E! B- D2 v    //require_auth(s);
1 C* ~6 @: p4 @6 f' [7 F( ^* c+ b    print("Removepoll",pollName);
( O* h4 @; `  e; p! }% T: [    std::vectorkeysForDeletion;4 w$ t% y$ d, @8 q0 r7 \' w
    //finditemswhichareforthenamedpoll
; \+ l" j- Y# {# G* L$ X    for(auto&item:_polls)& c' [# w( ^! l! c( w$ k
    {
1 x" ~( ^3 T: k9 `: W* l    if(item.pollName==pollName). s% k, r& m/ p2 C
    {
3 |1 U3 i! M7 ~/ O$ X) J9 @    keysForDeletion.push_back(item.key);
7 }: }5 G: M% O. ]; h1 r6 }    }8 q2 M& F( G5 K
    }: N8 H7 s  G( \9 U! X
    //nowdeleteeachitemforthatpoll, C* J# m' |  N
    for(uint64_tkey:keysForDeletion)
8 G# h6 o, s) j! X8 G' G# @    {5 Y5 {$ M" Y4 _# y1 a$ \$ p
    print("removefrom_polls",key);
; s' C6 z  D9 E  O    autoitr=_polls.find(key);1 P3 m+ `# R" i7 B6 m+ T1 h
    if(itr!=_polls.end())$ a9 z, v+ V& }, Q
    {5 r. k. W8 C' t* z/ U4 Z  X/ x+ J
    _polls.erase(itr);
. p, Y/ l) v2 n. I, y4 Q    }% y' |. B8 H; Z6 U) S
    }  ^* w) n* m: Q+ q. i
    //addremovevotes...don'tneedittheactionsarepermanentlystoredontheblockchain1 `: b' B: g9 g" N: z0 u- L' R; c* I
    std::vectorkeysForDeletionFromVotes;
' N; u4 X' X' j/ X: z9 s1 O    //finditemswhichareforthenamedpoll
: K# j$ ?" l- G2 ~    for(auto&item:_votes)
) U: J2 h) G6 s! d. N1 U. k5 X    {
9 A) W7 R( v# w! `; v    if(item.pollName==pollName)# O: V2 I( g2 g- Y
    {
: C3 y; D  b9 @- |$ i9 B: o8 Y* \& s3 b    keysForDeletionFromVotes.push_back(item.key);. T: E5 d: {9 i, P9 G4 G
    }
* k: M/ E8 C6 P    }" ~/ j6 q: O8 C6 f: N
    //nowdeleteeachitemforthatpoll! I: H  M$ `' O, T
    for(uint64_tkey:keysForDeletionFromVotes)
' E: x  U. x9 P9 t3 M    {8 V( A( j7 `" |4 z+ H- F" f
    print("removefrom_votes",key);
2 h/ D6 X# w! G# o. U3 v    autoitr=_votes.find(key);* f! S7 {3 s  L7 n
    if(itr!=_votes.end())
. S5 y% P  V& u5 Y1 o; O    {
$ G* L# v; _. C* E8 A  Y" Z  X3 {    _votes.erase(itr);
8 x6 g/ C; X- U7 [    }* S% h$ e- U7 ~' }# ?" v
    }
  [/ `4 r3 j0 I3 X) L    };# }, g) W* m  c8 a& ~- h  z
    ///@abiaction- L; C4 _8 |2 N, @8 u
    voidstatus(std::stringpollName)' I) Y" B  i9 Q+ _8 {
    {
8 z! P) O& p0 L& E1 m' d$ X; {    print("Changepollstatus",pollName);5 m3 ~" M) H& T! H/ W
    std::vectorkeysForModify;3 i6 L5 q0 x9 {6 N3 A
    //finditemswhichareforthenamedpoll
8 ~2 o, m1 N, n1 \" k/ I8 L    for(auto&item:_polls)6 k& ^- ?" k9 u! z! A
    {
' q+ V! a$ f" I/ j  W0 p* o4 I/ l/ p    if(item.pollName==pollName)
1 l: ^, _" a8 Z' C. t    {* s  C5 ?8 a  C# X2 e' n  ~
    keysForModify.push_back(item.key);5 {& W' u5 [5 L; Y
    }
, ?5 Y3 M% Z/ n8 Y8 @2 T    }
( L9 H. P& O" E9 }% ~    //nowgeteachitemandmodifythestatus# S% F3 @7 h0 I- j$ z8 P" `
    for(uint64_tkey:keysForModify)6 a5 }5 a9 {% r5 D( V: D! ?2 f$ b7 u
    {
' u: _3 ]* c) @/ h0 @) [0 k) h6 T! F; l: q    print("modify_pollsstatus",key);
1 L2 i' V  i0 f- W+ V, F" S1 g( s    autoitr=_polls.find(key);1 e( l- A  U% M3 H! K
    if(itr!=_polls.end())
9 P7 ?8 l0 @5 D1 X* O, g    {- C2 N7 D& c! P; G8 O3 |) [; i
    _polls.modify(itr,get_self(),[&](auto&p)
2 V% @0 o  {+ D, [+ l    {
: }& ]  e9 X5 X5 E/ A    p.pollStatus=p.pollStatus+1;
2 G1 a. A. ~8 N0 k! ]  p3 }    });
6 f  `! u$ K, ^    }
1 h+ t- l7 z# w' N! S    }
9 C  }% O: L# x    };
3 O" W) W0 u7 Q    ///@abiaction
. v8 q0 r5 E1 |    voidstatusreset(std::stringpollName)* n( h6 y/ u; u8 N$ g
    {
2 A- ?4 E7 K) f/ [0 ^: ?    print("Resetpollstatus",pollName);# ~  f- D2 m! P) I  ?
    std::vectorkeysForModify;  l" N% W( E+ S7 M3 ?0 Q
    //findallpollitems; p: G, A. T* P
    for(auto&item:_polls)
* x4 f* }6 ~- B    {
4 b. S4 x$ W! Q9 b0 |# |    if(item.pollName==pollName)8 R- ^1 H; L1 A5 _( l, {
    {8 {0 |- ^. N8 e9 G- ~
    keysForModify.push_back(item.key);4 X% H3 k, f8 g3 m' W4 X% r
    }
7 `- T. l6 j+ v; w' X    }/ J* u1 B+ g; }' L- M* }
    //updatethestatusineachpollitem
0 t/ v, o  ?$ C7 n0 V' \    for(uint64_tkey:keysForModify)9 t1 S( n9 U$ E0 B4 N2 @% k$ o2 m
    {- J  W7 T6 \- u1 r
    print("modify_pollsstatus",key);
& @. B; O8 f9 G  g3 X/ q) t- h/ {    autoitr=_polls.find(key);
( n5 P5 i: {  ~7 x# R* U- K6 g) `    if(itr!=_polls.end())1 }0 ^: J& w: e1 R
    {: [* @! n' x4 K
    _polls.modify(itr,get_self(),[&](auto&p). {! l: ]( `/ d0 @
    {
# N- W' b; X* ^) H' O    p.pollStatus=0;
3 @, r/ n8 C& z2 H9 @    });) O2 L5 ?1 v# ^) W1 Q* R. d0 b6 T3 ]
    }2 T$ F4 Z* h( r4 ]$ [3 r8 Z8 ?
    }% ?$ {( G+ ~) B+ s
    };
1 T# t2 i2 ^& Z2 \5 D; @    ///@abiaction
: t5 S; q/ w7 ^& y    voidaddpollopt(std::stringpollName,std::stringoption)
/ L* s/ M# m& w8 v! P    {
- r. g; P4 M, |" K- ~    print("Addpolloption",pollName,"option",option);& O' O, K. O' L' X
    //findthepollId,from_polls,usethistoupdatethe_pollswithanewoption
' P5 k4 \+ o1 e! W' Q7 V3 y, K: f    for(auto&item:_polls)6 Q! ^+ g  U& Q
    {% S0 q' \! V8 Y% e! u3 d( B- y
    if(item.pollName==pollName)6 n9 u) ?# b9 N! P: N* [
    {
$ h* Y' {& r5 v& t    //canonlyaddifthepollisnotstartedorfinished4 U- N1 o6 ]- ~0 m* R4 C  h  M, H+ I
    if(item.pollStatus==0)' g2 T) P  t0 Q/ I5 R5 z$ i; _
    {5 J! @$ U( {$ e" R6 P; h! Q9 _
    _polls.emplace(get_self(),[&](auto&p)
- K, n8 g' C6 g# E! J. [/ L% M1 r# b' Q    {
4 A0 y5 W/ }7 B    p.key=_polls.available_primary_key();, v8 ?* @9 }9 }1 r- {
    p.pollId=item.pollId;
6 X+ j- M& [1 m5 M+ S    p.pollName=item.pollName;
# \' H3 j' }. B0 q0 X$ ?, @) D    p.pollStatus=0;& \) L. X" Y/ X3 O0 B- ?- f1 ^: G
    p.option=option;
$ Y% e  G  r( ~% K    p.count=0;/ O8 I, c3 d4 N! @) [- ^2 s7 L
    });
6 Q, y9 `: z+ w    }
3 d0 k5 Z1 i& j6 M$ j. z    else# {6 C4 n! K( d/ r  q) ]2 V; b
    {
9 ~; U, b! z, {. t  i3 Y  d* P' b  c    print("Cannotaddpolloption",pollName,"option",option,"Pollhasstartedorisfinished.");/ e, n- P. b8 l" }& X8 b# r
    }
" ?- _7 F7 |5 E8 [$ e% ?    break;//soyouonlyadditonce
% o! h6 o6 B; \3 J8 c! j    }
1 O( ?9 c8 W# g: ^3 e; I    }
4 H8 }1 v7 `1 h( l    };! F$ x( x9 T5 Y
    ///@abiaction
2 \5 k3 ?3 V0 I3 ?$ v    voidrmpollopt(std::stringpollName,std::stringoption)" F- p) ~: Q, ~# ^- `8 |6 N
    {- k' b8 X$ K- x' `
    print("Removepolloption",pollName,"option",option);
  P/ m: \; h" \) P" L8 |2 u# o    std::vectorkeysForDeletion;
5 j6 ?' {) e. W6 Z% n    //findandremovethenamedpoll. L, c3 j" R* I* Q; _5 G$ h' c; p
    for(auto&item:_polls)- p( R! J5 O& O4 d3 W
    {2 k+ D/ U9 w- i: G4 {: ]
    if(item.pollName==pollName)
0 f! X) G' h& m; e0 g    {
* Z( y9 z4 I: w1 U8 T    keysForDeletion.push_back(item.key);$ b  Q, Y5 e# b
    }' M0 i+ W4 s/ ?
    }
7 E; X1 s  L& K/ Y    for(uint64_tkey:keysForDeletion)
7 X) R4 B) G5 Q& H    {5 \; Y5 `2 z( n0 N9 @
    print("removefrom_polls",key);
4 s- A2 G2 Y% X: N    autoitr=_polls.find(key);' e0 t! x% b: T0 R
    if(itr!=_polls.end())
& s( h( ?- ~: ]" a    {: W% j8 W( N' A* Q& J
    if(itr->option==option)
% \4 s* q# D) c    {
6 o% U4 X5 t  K8 c' B# p- p    _polls.erase(itr);
) t2 k9 j: l5 _+ J    }
; R! a. d- Q% d! V    }
8 h  |0 F$ M5 C* v6 _: _7 g    }
8 j  C' H6 ]  l% A  t1 u    };
3 t  g: J0 x& b% F# Z    ///@abiaction
% g0 ]: w" Z0 V! A7 O2 z' d; O    voidvote(std::stringpollName,std::stringoption,std::stringaccountName)
9 a' k7 A. X3 W" w+ q    {
1 M3 `' @  V6 h    print("votefor",option,"inpoll",pollName,"by",accountName);% C( {* E# O. D' w2 w9 H: t, H: e
    //isthepollopen
% ?( J" z! s4 y/ A8 q2 ~$ h    for(auto&item:_polls)
+ V3 K; J, P/ r    {/ {' S2 B4 p1 k9 ~0 T
    if(item.pollName==pollName)
6 Q  g* f1 q0 L    {
8 U1 h  T0 d$ p& _8 w5 I, \2 e    if(item.pollStatus!=1)0 V# C2 q* Z1 d8 G! N
    {8 P' t7 z( f! V) E+ V
    print("Poll",pollName,"isnotopen");
; \5 L3 [9 G. @7 c8 x    return;
1 j7 _* r1 x; ^    }" D' P& D4 S+ _8 D2 [' l
    break;//onlyneedtocheckstatusonce
2 T2 N; I  E4 y1 m3 Z/ [# d    }& Y# z( k/ d  C. F& X
    }6 Q! S' H7 Y, V  p/ }
    //hasaccountnamealreadyvoted?" e$ |4 y" K# M+ |) ]% S- ~
    for(auto&vote:_votes)
6 j7 b- k! u. ]3 I2 _    {
% D0 p- b$ F! Q) a    if(vote.pollName==pollName&&vote.account==accountName): u/ [& s) P6 ~  [' j6 Z
    {
6 x2 n3 d( \8 C' A% _    print(accountName,"hasalreadyvotedinpoll",pollName);
8 P+ U: U  ]. c    //eosio_assert(true,"AlreadyVoted");* b9 p* y! f( P* B' @
    return;
/ D3 R% |) I6 q* c    }# m: w, ^4 q# t- d- F& [0 S  f
    }$ ~6 m1 n# N0 s  @+ ?" x
    uint64_tpollId=99999;//getthepollIdforthe_votestable
- v# X5 F  v3 m" u. j. N    //findthepollandtheoptionandincrementthecount
; Y) a( A' }% v& B    for(auto&item:_polls)
; `/ s" F1 z- I/ U" e( t: r    {
# ]' Z+ ?2 a3 j  P    if(item.pollName==pollName&&item.option==option)
5 T9 `1 n  J2 t( T* P    {3 J' i! A0 A- B* s2 ?+ b, p, d
    pollId=item.pollId;//forrecordingvoteinthispoll$ o* l9 k4 J, A) O" t# ]; i& k5 t% z
    _polls.modify(item,get_self(),[&](auto&p). X+ y* [  A( A4 X
    {
* E% A4 [5 a7 H8 J  p9 x1 F) F( I    p.count=p.count+1;9 F5 ~7 N+ P. ?/ M( ]! G
    });2 N! w2 q% g3 s4 K
    }
! g; Z) {5 }( a# G    }  Q, N! R+ M9 k$ Y
    //recordthataccountNamehasvoted
/ X6 D, Z% ?! v2 H% E6 J    _votes.emplace(get_self(),[&](auto&pv)/ y3 V6 v( e; ^, H
    {
2 g% Q4 c* K. v8 n  ]3 R    pv.key=_votes.available_primary_key();
- }9 G- [3 i7 L# n    pv.pollId=pollId;
5 t. J6 [) y4 u$ K& e2 W0 O3 n  }7 ?& C    pv.pollName=pollName;
( y' J5 ]+ Q3 f- j+ f: _    pv.account=accountName;
  v- q7 e$ ]( s) F. F) L    });
' ^* T7 z# i" h$ u    };
. I; T& C  q+ \/ F3 c) Y( z    private:; E7 z& L5 R$ M& N
    //createthemultiindextablestostorethedata# w7 K! h* B# ~' W) f2 Z" X/ s
    ///@abitable+ x, m9 y- A3 a( r( Y7 w# [; b6 N; s
    structpoll6 N4 G5 B7 _/ H5 B6 r
    {
5 X  S2 a* g! [% b. G% s2 z    uint64_tkey;//primarykey
( S  A4 g6 W9 F    uint64_tpollId;//secondkey,non-unique,thistablewillhaveduprowsforeachpollbecauseofoption
6 ~* C: L5 ?7 Y& E  S2 ^& y    std::stringpollName;//nameofpoll
6 M9 e+ T  H1 Y7 b9 V% \/ ?$ K    uint8_tpollStatus=0;//stauswhere0=closed,1=open,2=finished  |% W; U: g, O2 _. p8 i
    std::stringoption;//theitemyoucanvotefor
2 z9 I3 j% Z+ k" \    uint32_tcount=0;//thenumberofvotesforeachitme--thistobepulledouttosepartetable.
; d( i& W1 d( k2 w9 w: o    uint64_tprimary_key()const{returnkey;}
6 r, s4 W8 @9 h: I    uint64_tby_pollId()const{returnpollId;}; j- ~, p7 ?' ~* {7 Y6 h
    };
! _! L! _, J5 r  Y    typedefeosio::multi_index>>pollstable;& T' R9 Z5 J5 K7 _1 X
    ///@abitable& v2 Q9 z8 C, _- f# k
    structpollvotes$ m3 C: O2 U$ l. Y0 w( J
    {% d1 x8 o% N' Q5 m) t
    uint64_tkey;0 ?. a# F0 h* Y$ J; M8 r
    uint64_tpollId;% k. \7 U& J6 q. C4 t
    std::stringpollName;//nameofpoll
. @$ i- W% e0 B4 a4 Q2 H% c  }+ H    std::stringaccount;//thisaccounthasvoted,usethistomakesurenoonevotes>1
% G' `! D. {( U7 @" x8 \    uint64_tprimary_key()const{returnkey;}
- s( E9 d6 l9 F8 \' n5 d1 R3 F( U    uint64_tby_pollId()const{returnpollId;}
3 A. z& f. y2 N2 z. O    };5 h+ s# ?2 k6 S( \! T* r; U0 @
    typedefeosio::multi_index>>votes;7 _3 J6 |+ i3 N- Z3 e1 |
    //localinstancesofthemultiindexes
/ v9 s& ]& I8 n  s/ b4 k+ i    pollstable_polls;1 |' P- }% N& N* P+ n9 V: c5 h
    votes_votes;. N; C& e/ K) _' v1 Q5 r2 ?  {" o
    };4 ?$ O) K: b8 j5 W7 e
    EOSIO_ABI(youvote,(version)(addpoll)(rmpoll)(status)(statusreset)(addpollopt)(rmpollopt)(vote))8 B' i5 d; d! U, _- t' J' y
    注意EOSIO_ABI调用,它通过ABI公开函数,重要的是函数名与ABI函数名规则一定要匹配。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    10