Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

EOS智能合约的多索引表table

西门幻雪雪vj
178 0 0
建多索引表是一种为了在RAM快速访问的方法,主要用来来缓存状态和数据。多索引表支持创建、读取、更新和删除(CRUD)业务,区块链不行(它只支持创建和读取)。# I5 a3 ^0 }. T0 I
    多索引表提供了快速访问数据存储接口,是一种存储智能合同中使用的数据的实用的方法。在区块链记录交易信息,你应该使用多索引表存储应用程序数据。
/ K1 W- j5 d( i6 I    使用多索引表,因为他们支持为使用的数据建立多个索引,主索引必须是uint64_t类型和唯一的,但其他的索引,可以有重复的,你可以使用多达16个,类型可以是uint64_t,uint128_t,uint256_t,doubleorlongdouble。2 y0 K/ S( ^% x+ ^1 f4 M4 P
    如果你想你需要使用一个字符串做索引,需要转换成一个整数型,将结果存储在随后索引的字段中。
/ p- M  t  r3 a& z: V    1.创建一个结构
) [* H# b/ c$ P% B0 ?2 p4 w* p    创建一个可以存储在多索引表中的结构,并在要索引的字段上定义getter。9 f) n- L$ w1 T, l2 j
    请记住,这些getter中必须有一个命名为primary_key(),如果没有这个,编译器eosiocpp将产生一个错误…"itcan’tfindthefieldtouseastheprimarykey"即它找不到任何一个字段被作为主键。
) y7 S1 N1 _; E; q) b1 n    如果你想要有一个以上的索引,(最多允许16个),然后为你想要索引的任何字段定义一个getter,这时这个名称就不那么重要了,因为你会把getter名称传递给typedef。4 u5 \4 f0 l; i7 _2 Y' _6 O1 p" A
    ///@abitable- W" |# a) Y/ q# ?$ w
    structmystruct, B. ]3 M) [4 E0 M* D
    {. E4 t% z# X# f2 e1 M$ s* d' o+ }
    uint64_tkey;
: \: j2 @( R0 A: d5 j    uint64_tsecondid;9 W- J# a6 `3 w1 W4 ^4 ~
    std::stringname;7 K0 A* g4 y6 @+ L2 S& }/ r0 l
    std::stringaccount;5 F6 D: ]1 Z# E' j( I0 v# u
    uint64_tprimary_key()const{returnkey;}//getterforprimarykey: }6 y* f5 F3 u% J
    uint64_tby_id()const{returnsecondid;}//getterforadditionalkey
6 u! q- ~! U7 Z7 L+ z+ t/ s0 S    };
5 r: ^7 J+ c4 @& }7 ^1 N    这里还要注意两件事:' [* S3 W. \, B; j3 }) n" I) R) H( W
    1.注释:/ }. F* r5 I; \& |: e
    ///@abitable( W& b  G, U; ^/ [: v
    编译器需要使用eosiocpp来识别要通过ABI公开该表并使其在智能合约之外可见。9 ~! c+ [: r- ~. t
    2.结构名称少于12个字符,而且所有的字符都要小写字母。7 H( K8 w. G# F
    2.多索引表和定义索引
& S3 i0 T  z  A1 b& k/ S3 V    定义多索引表将使用mystruct,告诉它要索引什么,以及如何获取正在索引的数据。主键将自动创建的,所以使用struct后,如果我想要一个只有一个主键的多索引表,我可以定义它为:$ ?$ F8 G1 f4 J7 S6 i4 o$ L
    typedefeosio::multi_indexdatastore;
& x9 |, D: }0 L/ X    这定义了多个索引通过表名N(mystruct)和结构名mystruct。N(mystruct)会对结构名编译转换到uint64_t,使用uint64_t来标识属于多索引表的数据。$ P. f1 W) ]. L  |) W( W  @* u# R
    若要添加附加索引或辅助索引,则使用indexed_by模板作为参数,因此定义变为:
3 Q% d4 h1 |$ f* U7 C& k    typedefeosio::multi_index>>datastore;2 u2 {0 V. }1 q  O. @! h8 Q% U  x
    注意:! ?  ^7 B) t8 F* _. A
    indexed_by>
7 r3 B  B+ x+ |% w) S% \    参数:
& g# L% L) |; I  J# T! D& _* C5 O& C3 b    字段的名称转换为整数,N(secondid)
1 ^, ~, N' l1 k5 h3 V' Z2 i    一个用户定义的密钥调用接口,const_mem_fun. z. U9 {8 ?( c  q
    来看看有三个索引的情况。
# ]5 {4 G7 Y) P# p/ E    ///@abitable$ i1 f# ]6 j# r+ Z+ Z
    structmystruct. t4 O4 u) b( p0 [5 L0 Y+ |
    {
* X2 f& P0 t  |5 e7 S0 q    uint64_tkey;  m6 t! Z; `4 l/ o
    uint64_tsecondid;
7 `9 b4 n: p( V% c9 u1 w& [    uint64_tanotherid;
- X9 O, [6 q: q! d4 Q7 `& \    std::stringname;8 Z0 b: F% L' L6 n6 v
    std::stringaccount;
9 H7 f9 s+ V0 P6 D3 m/ s5 [: ?4 P3 k    uint64_tprimary_key()const{returnkey;}: D/ G7 a% }) q: l* i% L
    uint64_tby_id()const{returnsecondid;}
% E+ o' H. I" l* y. r    uint64_tby_anotherid()const{returnanotherid;}: P5 K. Z/ y1 A
    };) t% w- w% Q" Y" }. z
    typedefeosio::multi_index>,indexed_by>>datastore;
- L6 v  s* V! V: j7 I( m. x    更多的就不列了。
7 b: R4 ^  ^5 c% h; n' K    这里要注意的一个重要事项是,结构名与表名的匹配,并且将出现在ABI文件中的名称遵循规则(12个字符,所有都是小写的字母)。如果它们没有遵循这个规则,则表不会通过ABI可见(当然可以通过编辑ABI文件来绕过这一点)。
2 O% _3 |" l" |$ A  v    3.创建定义类型的局部变量
' i; w% j; F* s" i8 [# Y5 q    //localinstancesofthemultiindexes; p: ~- H, l- O1 l
    pollstable_polls;, m) k9 y- v) D: {- z
    votes_votes;% X+ _  `3 R5 @' o
    现在我已经定义了一个带有两个索引的多索引表,我可以在我的智能合约中使用它。
- E( w# ^# h$ C) c1 X  o    如下是一个智能合约使用两个索引的多索引表的例子。在这里你可以看到如何遍历表,如何在同一合约中使用两个表,我们未来将增加额外的教程,利用多索引表。
+ l& |, H: ^) F0 O0 U    #include$ S8 x4 \, q' y3 `; \& l7 \( z
    usingnamespaceeosio;
+ B0 C0 K* u# G+ i7 N    classyouvote:publiccontract{
% {2 e7 h% m0 T- `4 m0 e    public:
6 s/ _9 R" }; m" a* D4 x; z* z0 i    youvote(account_names):contract(s),_polls(s,s),_votes(s,s)$ t4 x2 r0 M, k) [7 d9 C$ \! ~
    {}/ ~% [' e& A( O% h3 D, x( A- f
    //publicmethodsexposedviatheABI
9 h5 W1 G+ ]0 t5 b6 q+ w' B0 R' p    //onpollsTable! d: w0 l, A+ K9 p
    ///@abiaction
* F* a, `1 g9 P    voidversion()
$ k/ ~- o4 M; v: z, y    {
% O+ y- d: P  a& ?5 r    print("YouVoteversion0.01");+ b! F2 p( V7 x* o, ?
    };
9 w8 P* q3 Q) q  X) ]; }8 A    ///@abiaction
* j# u7 S5 Q6 F  \    voidaddpoll(account_names,std::stringpollName)
! i, G3 N7 k9 `7 ]! [    {
' p( K$ a* x# ]* N    //require_auth(s);" {( y2 X8 V' Z; g: D% r. ~, E' |* A0 {
    print("Addpoll",pollName);
. d0 U. C' p4 x1 _3 S    //updatethetabletoincludeanewpoll+ S- U* u1 q/ E% R/ D7 v5 ^# t# v
    _polls.emplace(get_self(),[&](auto&p). M% ?  s* G9 ?4 u! r  e# C) @6 U
    {( Y$ X7 U, h- {5 R- A* b: J
    p.key=_polls.available_primary_key();5 ]: H7 S* ^- a" n7 ~
    p.pollId=_polls.available_primary_key();) y3 A9 L0 k1 ^$ w6 K" y1 m; H7 @
    p.pollName=pollName;( ~  D& I/ i6 J- X4 ^
    p.pollStatus=0;
/ |% ?% M# A# @: ?9 O* s% O: N+ j! N% t* B    p.option="";6 {' K) D2 c. P
    p.count=0;
/ `# B3 U! c$ K) z" v    });
3 p  N/ D; x! w. e( C) G. W    };# q& O& V! K4 T$ w
    ///@abiaction
* M& `/ M# d1 ~9 w    voidrmpoll(account_names,std::stringpollName)/ b3 F- ?$ ^/ B% N
    {3 N: }1 k0 @4 C& z% P! Z% U
    //require_auth(s);
3 A# o( v! X! P' I: Y    print("Removepoll",pollName);
5 w1 v+ b( Q$ A' U, \    std::vectorkeysForDeletion;; P+ ~( Q7 g. I- Y* o
    //finditemswhichareforthenamedpoll. D6 X5 W' x& w( L
    for(auto&item:_polls)
' }; G) [; ?' M% i9 ]0 z  C    {
' J. c. k( n  j& ~    if(item.pollName==pollName)
# @( \2 S. E' G7 u( B+ B    {) {; g, ?; y, Q; F8 F* y0 t8 z
    keysForDeletion.push_back(item.key);
% ?. C* Q1 [( Q; z    }( O7 h# m4 P# x$ S* y  R
    }( [: F5 B0 J/ L
    //nowdeleteeachitemforthatpoll& g! e0 c% J- X* i( I6 e
    for(uint64_tkey:keysForDeletion)5 e" V3 L, S- k4 q
    {$ E/ a6 J% I$ ~9 M8 @
    print("removefrom_polls",key);" F7 b( ]- n0 D  j1 `! S# w! O" R. x
    autoitr=_polls.find(key);
* J5 O8 [+ s1 Q: l; k    if(itr!=_polls.end())( ^9 [+ n7 C* j
    {) Y9 U! X' N/ E
    _polls.erase(itr);3 m3 p, |8 b, h3 e" a! ?- ^
    }
- e7 o" N- C# k9 D) H    }5 o1 R- [1 a( s: K- {9 D: O
    //addremovevotes...don'tneedittheactionsarepermanentlystoredontheblockchain
: I  h. M# E% \% I5 {2 j, e0 B    std::vectorkeysForDeletionFromVotes;
6 K2 {) O7 s2 S# \/ }/ [( u    //finditemswhichareforthenamedpoll0 r$ g2 N6 r/ {4 {* |
    for(auto&item:_votes)
  w$ a/ C9 |' U! R9 V    {
. J  w7 e- j8 D4 M# ~    if(item.pollName==pollName)9 N/ l2 [3 b! r% u- M
    {
7 n. L% s' i/ k7 H7 ?( Y    keysForDeletionFromVotes.push_back(item.key);
6 P9 f1 [: V' g9 H  C; \    }9 a, }# C  p5 W, {7 q
    }
1 ?+ x+ u2 n! ?/ X* v    //nowdeleteeachitemforthatpoll+ S* u4 B' ~  i0 G- S* g8 k
    for(uint64_tkey:keysForDeletionFromVotes)
. o" w3 L# N  X" A. Z    {
" a1 E0 S6 \5 }/ n6 j! X    print("removefrom_votes",key);
. z; T- ?5 P7 f% ^( u) ?    autoitr=_votes.find(key);
$ }; B# A+ X# G2 |    if(itr!=_votes.end())' k' n" y: i* h' P: J  `9 E
    {
$ E- e. e4 X$ m- A; \# K" D    _votes.erase(itr);+ `5 H- x: Y' c7 f& a9 D4 _  N$ X
    }
$ {! @# J: m$ n# X( }    }+ |" O) q1 g/ p% d
    };) |0 B, S7 t/ H5 `3 o' p
    ///@abiaction
+ Q( F0 T3 k- V! H* z    voidstatus(std::stringpollName)* j7 G; f8 c2 Q( o7 m
    {  Q/ f: `1 O/ |+ p1 U; X
    print("Changepollstatus",pollName);* L/ }1 S1 E* V5 z+ ^
    std::vectorkeysForModify;( b+ |/ c9 u9 Y% r- U1 ?3 w1 {
    //finditemswhichareforthenamedpoll
; I) c5 x' w( K8 D* W* Q8 f    for(auto&item:_polls)
! k' W# Z, }  h3 i/ {* o    {6 w6 V6 X/ |9 w* N1 N$ R2 Y
    if(item.pollName==pollName)
; N& {/ u7 S' T  m" {" T; ~    {
% |7 w0 H! z0 o, H" G4 a+ a, C    keysForModify.push_back(item.key);' e& j4 e6 H( B2 w/ _( W8 {8 N. C3 ^' G
    }
2 _' s' [) I) C' l2 ?' {  [    }
* [/ l' r  L  d  P    //nowgeteachitemandmodifythestatus; e. A! z3 E8 E3 O- [/ [; B
    for(uint64_tkey:keysForModify)# q6 u2 v$ K& d- \% A
    {
) B, v* s* w/ A% L5 ]# V    print("modify_pollsstatus",key);
4 j9 I1 |1 o; i+ z    autoitr=_polls.find(key);
" o- e( ^1 t( |+ a* P    if(itr!=_polls.end())
" I% f* {& h! l    {
7 A9 E* j/ ~9 i8 X$ B% U* h    _polls.modify(itr,get_self(),[&](auto&p)
7 W, X) h, G# s6 o$ t    {/ Y% l( M4 O+ c& [) K
    p.pollStatus=p.pollStatus+1;
  n$ H9 w- ?- r1 f; @9 M    });: S% w0 J& h. _) B" D0 S" l
    }
3 p2 p6 _, [& J4 u) L- O' O1 y    }
) ~. W  [4 G1 r) c; o    };
7 k# L( [/ V2 j& ~+ Z5 @1 f    ///@abiaction, l& U/ V. |2 W: s; C  i5 t
    voidstatusreset(std::stringpollName)
  u# i3 \1 H; O! b    {  q3 r: D- d' O  |2 Y8 D
    print("Resetpollstatus",pollName);! N0 p! I- J7 u1 X1 [
    std::vectorkeysForModify;' j+ X, z4 V, d. p
    //findallpollitems: o5 q4 x, N# f# B0 C
    for(auto&item:_polls)
7 X. ]) W& u% A' c6 _% ?    {  W. P9 F; I" V; u0 [  @
    if(item.pollName==pollName)' {4 |$ I% H5 Q* E$ G* n$ z% ^- K
    {8 M* z& i' e9 o' U% Q9 I, Z% p
    keysForModify.push_back(item.key);
, [/ d+ P1 y( A) {' [. e    }
: ?, F7 t* n" j+ K9 Y0 A    }
0 {+ i6 ]2 f8 Q2 e4 z9 g    //updatethestatusineachpollitem
- _# k8 e) |1 t) X+ {9 H, I7 \( q    for(uint64_tkey:keysForModify), `* f/ p8 q/ i) u# S. i
    {
5 H. O+ L5 i4 s! G; R    print("modify_pollsstatus",key);
% d7 _  E4 z7 N; B2 O    autoitr=_polls.find(key);, _6 B! r9 T! O  z% M
    if(itr!=_polls.end())
# l. z0 J& I& U+ `( G& `    {6 _$ }& m% C  p/ }* ~1 {7 l
    _polls.modify(itr,get_self(),[&](auto&p)
) [& \" T9 T0 A9 Z    {* H- z, D1 V% l2 T, m% M! i1 R
    p.pollStatus=0;
: \  s/ H1 I% R9 ^# Q) c5 _% v    });
( z' O1 b9 g- Y; t3 v9 Q    }
/ n% w+ C' ^6 |6 Q; V0 o: s    }! ?4 @0 w2 i7 H1 W
    };
% z+ m6 O1 w: e- h* |    ///@abiaction8 v8 e. Q. U1 n* m
    voidaddpollopt(std::stringpollName,std::stringoption)
# |/ s4 Z, J0 {+ m; y    {! P6 p4 g' b/ i7 y5 e0 T
    print("Addpolloption",pollName,"option",option);- q: n( a6 A& K9 O  r, ~/ \
    //findthepollId,from_polls,usethistoupdatethe_pollswithanewoption
# l5 O8 i1 |0 Y2 F5 i    for(auto&item:_polls)
9 [& f5 Z1 v7 e1 K2 \    {
9 R0 S' N# m" {& {( B    if(item.pollName==pollName)
* ^" \. D1 U- w) v! I6 A+ u    {- T. p+ l0 e6 z+ \+ B0 f  F
    //canonlyaddifthepollisnotstartedorfinished4 v& x- `  L+ r6 t2 _
    if(item.pollStatus==0)1 S7 @( _, w: n; T6 v3 n
    {
. Z) z* O- b2 Q, @9 `  V    _polls.emplace(get_self(),[&](auto&p)
0 y' n' a3 V6 T    {" E4 l, f# O4 `% S
    p.key=_polls.available_primary_key();0 f) J- O) P) {& V: d
    p.pollId=item.pollId;
# g+ A* ]4 x" e' p  q    p.pollName=item.pollName;
( I" |' E- a" I    p.pollStatus=0;$ \& L4 q2 v) R
    p.option=option;
1 B6 i8 n7 ], i& _* I    p.count=0;  H3 {* J8 T) e& p$ i% k" C
    });% L2 k5 H$ j  A4 s9 i
    }
% H; O9 {" c; }! _    else
. T7 ]; i% h( Q6 U) E    {
, _1 |1 i. F2 a5 o& j    print("Cannotaddpolloption",pollName,"option",option,"Pollhasstartedorisfinished.");7 x$ j# M: K2 x' d1 a
    }, |3 H+ B7 O% m" O5 e
    break;//soyouonlyadditonce$ G9 n: Z4 y% z  u% w
    }8 q! J4 O) r& E, N
    }' L( S0 C- O8 Y$ _. s! G
    };
- w3 I  |9 ]+ Q! ]/ f7 F    ///@abiaction3 G2 P! ]" t; g/ s, x9 H5 m
    voidrmpollopt(std::stringpollName,std::stringoption)9 W/ H0 [+ l2 t7 M. @
    {! B" J$ x5 e: b
    print("Removepolloption",pollName,"option",option);
6 S2 T9 s/ O  x6 p* n6 s    std::vectorkeysForDeletion;
0 m# S4 y+ j( u& C' U9 x    //findandremovethenamedpoll
0 a; c; V0 ^: f0 h7 j7 a    for(auto&item:_polls)
8 R; d& k3 S; v    {* B6 y: x2 v5 ^, g$ g; H/ w
    if(item.pollName==pollName)5 u5 ^  E6 O, [6 {+ H
    {+ D" v0 {! r( P' l1 H9 `# [& d7 u  W
    keysForDeletion.push_back(item.key);
9 G$ C' ^; d  P    }" l; N% ?0 Y6 R2 n+ a9 c" h, ?
    }
- o% y7 [) R( G+ |9 M    for(uint64_tkey:keysForDeletion)( ]) ?, r/ B: x1 x. }
    {
- v9 q5 z. l6 d* C) n) X1 O4 `: w    print("removefrom_polls",key);
4 z- A  E2 Y7 E    autoitr=_polls.find(key);
% e9 n/ y  i7 r( M* g/ w- J    if(itr!=_polls.end())" D% [% F& l- C6 J9 s+ b
    {) `3 L9 z  N( @& J6 a: O' g( h, V
    if(itr->option==option)% H7 f/ f, i! r) r1 q. p$ h
    {. Y0 X' _' I; m. q, l
    _polls.erase(itr);9 Q& n8 H3 F4 l( U
    }
, k& o  g4 g# I& n1 J' y; B- X    }
/ N  v7 B" g. E7 }& i5 r; K# S    }% d0 ~, v  x1 A3 m" p! {
    };* [7 m% K8 X% k; U" E
    ///@abiaction/ K1 X: e% [: M) J1 Q  X2 N
    voidvote(std::stringpollName,std::stringoption,std::stringaccountName): _0 j+ {, x8 F# p
    {
- K- [, ?5 X6 N# L2 w    print("votefor",option,"inpoll",pollName,"by",accountName);
  C; H4 i7 M$ M- H+ O    //isthepollopen
" A$ ?2 M* {1 ^6 C) c& y    for(auto&item:_polls)0 E) U4 r; H: i3 F, M* R1 h
    {
' T, }0 w- I9 D4 p& m    if(item.pollName==pollName)
" K) a' C9 W8 U2 e    {" T1 E. E6 m0 \  }* T4 ~
    if(item.pollStatus!=1)
0 w' B2 U+ v6 T. M2 H    {9 P  A) ]% Y# a7 z/ q" N$ }% z
    print("Poll",pollName,"isnotopen");) X2 L( s- i, t% M5 P5 k" c
    return;
3 T" }' h' H7 P3 Q0 ]0 D    }
# v# b' i2 v% \8 t' _    break;//onlyneedtocheckstatusonce
0 @# x* O. D. P: I0 L8 P+ f    }7 p' _9 U+ Z3 O& ?4 d
    }
3 w' D) R8 L0 \, x' i    //hasaccountnamealreadyvoted?
, b4 Z2 ]. e2 ]+ Y' U% R    for(auto&vote:_votes)# q: q, F/ C# t+ O' ]; R& t4 |
    {7 U2 N' J) j8 F
    if(vote.pollName==pollName&&vote.account==accountName)- E2 ?) |% U; k
    {
% J  ?' [5 s  p# O& B% {' m    print(accountName,"hasalreadyvotedinpoll",pollName);7 d! J# B4 ]9 I) S2 m" s) h- i* k
    //eosio_assert(true,"AlreadyVoted");; X! h. o/ n0 N, b
    return;" K6 M: g; r) W/ H0 R8 W1 Q/ A) {& h' Z! [
    }2 {# J0 D9 G  Y: o. b
    }' ~7 ^$ S: M! ]( W' c
    uint64_tpollId=99999;//getthepollIdforthe_votestable
9 |) a! g! {- f+ H+ ^3 a5 j" h  [' J    //findthepollandtheoptionandincrementthecount  o9 W  N9 @, D6 K: U; ?
    for(auto&item:_polls)
. f) B2 f+ n6 d3 I1 g4 ]! U, ~- I9 t    {: w9 ^. T2 ?- ^: ~* p& j! Z5 y
    if(item.pollName==pollName&&item.option==option)6 }* w! u+ y/ n+ i
    {" \$ U6 V0 X  U# N& r9 R: n
    pollId=item.pollId;//forrecordingvoteinthispoll
7 T* B3 p8 n, }6 r' N    _polls.modify(item,get_self(),[&](auto&p)
" |5 B6 w) L5 v: L7 Z    {( @. _1 u$ B1 E# }
    p.count=p.count+1;$ T+ P- [" y, M: b( M/ m& _2 |
    });
- F6 c) A, `3 @( F& g    }
. a( l* U- R2 \8 o    }$ d4 I0 F6 }& A+ K5 E
    //recordthataccountNamehasvoted
; _: |/ j0 n4 e7 M7 W) D7 _' {    _votes.emplace(get_self(),[&](auto&pv)3 z- |$ Y- y$ f1 z; r, D4 m
    {
3 p/ U& B" a2 \! o+ D    pv.key=_votes.available_primary_key();
3 R) I8 j. u1 ?" _    pv.pollId=pollId;2 S: @9 b. g- `9 ~$ Y
    pv.pollName=pollName;! B6 R- l2 [5 _+ Y3 `
    pv.account=accountName;
* G2 M& A  r4 B    });6 s5 G" e3 `- m4 D0 P7 H
    };' c% d' r4 u6 U
    private:
: ~4 c, E1 H5 F9 c- X0 R5 j; k    //createthemultiindextablestostorethedata
5 i; p0 }8 B7 O" H$ m6 a    ///@abitable
/ k: Q$ M4 W2 J) h2 a& A  g    structpoll
) ]: h/ m! j1 R: a    {
% O0 t0 ?" m4 q6 |4 ^    uint64_tkey;//primarykey
! ^  V$ n" D' a# b! [    uint64_tpollId;//secondkey,non-unique,thistablewillhaveduprowsforeachpollbecauseofoption, v% U: \! J2 C# t1 l# B: q. `
    std::stringpollName;//nameofpoll2 L& o! _( M/ T/ \7 i: Q
    uint8_tpollStatus=0;//stauswhere0=closed,1=open,2=finished9 T1 K/ v) e. Y7 D( {
    std::stringoption;//theitemyoucanvotefor
7 P: J3 d: a/ `3 R  k- }, w: t) a- K    uint32_tcount=0;//thenumberofvotesforeachitme--thistobepulledouttosepartetable.% M4 M+ r- T' Z5 E
    uint64_tprimary_key()const{returnkey;}6 b# n$ j7 n  k& ^
    uint64_tby_pollId()const{returnpollId;}
6 l( M4 v( X* D4 X! s) t) ]1 R    };# {' e, ?+ o( T# p, |  x/ q
    typedefeosio::multi_index>>pollstable;% e" q0 l& R: {, D+ U
    ///@abitable6 c' I) U. O4 z( \7 y, l5 r
    structpollvotes$ b8 {5 |9 P% G5 Y- Q
    {( e  ~/ K2 ~3 p8 r1 l' y" H
    uint64_tkey;
) S. c2 ], N2 S/ f, I6 f3 x    uint64_tpollId;
- e! T. W0 H3 k; e' H' b$ i+ N$ q+ p    std::stringpollName;//nameofpoll4 K/ f& w4 y0 {: W, Q2 s8 k% {9 q
    std::stringaccount;//thisaccounthasvoted,usethistomakesurenoonevotes>1! x  q9 m( G/ O- t
    uint64_tprimary_key()const{returnkey;}
6 E5 B2 [9 z7 H  e3 D* Z* O    uint64_tby_pollId()const{returnpollId;}
( k: L! ?* j. S" c! z4 \; x! J    };
9 k5 x0 |6 O' G, l" i' j  j    typedefeosio::multi_index>>votes;; }0 A' p& P+ r* Q) p+ s4 b
    //localinstancesofthemultiindexes% _7 h: I7 ]& i; v
    pollstable_polls;
+ a0 W( ^: ~3 U0 s( ^    votes_votes;
$ w+ T! f$ E$ N0 ~* ^* ~    };7 ~+ P" p$ t& A, T: [
    EOSIO_ABI(youvote,(version)(addpoll)(rmpoll)(status)(statusreset)(addpollopt)(rmpollopt)(vote))
3 f8 d: H7 Z+ |! D$ h, L    注意EOSIO_ABI调用,它通过ABI公开函数,重要的是函数名与ABI函数名规则一定要匹配。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    10