Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

EOS智能合约的多索引表table

西门幻雪雪vj
100 0 0
建多索引表是一种为了在RAM快速访问的方法,主要用来来缓存状态和数据。多索引表支持创建、读取、更新和删除(CRUD)业务,区块链不行(它只支持创建和读取)。3 v8 V0 J; a" a0 X: c2 W" l9 H( F
    多索引表提供了快速访问数据存储接口,是一种存储智能合同中使用的数据的实用的方法。在区块链记录交易信息,你应该使用多索引表存储应用程序数据。
' I2 T% ^0 c# O0 T6 \1 B7 E. s    使用多索引表,因为他们支持为使用的数据建立多个索引,主索引必须是uint64_t类型和唯一的,但其他的索引,可以有重复的,你可以使用多达16个,类型可以是uint64_t,uint128_t,uint256_t,doubleorlongdouble。
! Y- r4 A. O9 o  i+ B    如果你想你需要使用一个字符串做索引,需要转换成一个整数型,将结果存储在随后索引的字段中。
- h2 j! I6 ~" S3 L    1.创建一个结构
9 o( e! |% x! v, ~% z% j" ?    创建一个可以存储在多索引表中的结构,并在要索引的字段上定义getter。
) e* f% l4 j% A* e* x    请记住,这些getter中必须有一个命名为primary_key(),如果没有这个,编译器eosiocpp将产生一个错误…"itcan’tfindthefieldtouseastheprimarykey"即它找不到任何一个字段被作为主键。
' c8 z; z7 i$ d1 V, g1 x    如果你想要有一个以上的索引,(最多允许16个),然后为你想要索引的任何字段定义一个getter,这时这个名称就不那么重要了,因为你会把getter名称传递给typedef。" |( `5 p: A  F( r: s+ c* a
    ///@abitable( N7 C1 L. \) g* Q- m; R' }( `: N# V
    structmystruct
% H4 t2 Z% ]! l+ W2 ?2 x4 B+ u    {; I  m% B3 H' p
    uint64_tkey;  ?) a1 E1 R( M6 a9 v
    uint64_tsecondid;
% m# m- e/ N* T' e; v! [    std::stringname;$ o) \; t2 q( h7 V. n. D$ ]
    std::stringaccount;
( U% [7 f8 i: y1 A) R% V! G4 O- t+ ]+ z, C    uint64_tprimary_key()const{returnkey;}//getterforprimarykey: a/ l, d3 x; v4 C# I; i
    uint64_tby_id()const{returnsecondid;}//getterforadditionalkey) Z5 h0 e( I% S) q& k
    };
& |% Y( `1 Q+ A* W) b4 J    这里还要注意两件事:
) J6 b6 S6 d! Q, k* ], T! [/ P    1.注释:
+ u+ q: [, @" H* y* U% ]    ///@abitable
) h( U6 X  ^8 M6 ~' d9 m    编译器需要使用eosiocpp来识别要通过ABI公开该表并使其在智能合约之外可见。
, H1 @; _/ d+ I! d" g/ j    2.结构名称少于12个字符,而且所有的字符都要小写字母。) i4 L6 [/ ?7 z( z* w$ n
    2.多索引表和定义索引
: [$ C1 l5 \- c% ^! n, U    定义多索引表将使用mystruct,告诉它要索引什么,以及如何获取正在索引的数据。主键将自动创建的,所以使用struct后,如果我想要一个只有一个主键的多索引表,我可以定义它为:
$ _: q1 [* X6 Z    typedefeosio::multi_indexdatastore;
+ E# P, m2 h% X, e6 k( p% J: H    这定义了多个索引通过表名N(mystruct)和结构名mystruct。N(mystruct)会对结构名编译转换到uint64_t,使用uint64_t来标识属于多索引表的数据。, q5 h7 s) p) K- [' M
    若要添加附加索引或辅助索引,则使用indexed_by模板作为参数,因此定义变为:
4 E2 `: h2 M# d7 C+ N) O0 f    typedefeosio::multi_index>>datastore;$ |. }9 ?, Q2 c
    注意:% X9 P# N% b& ^8 o! P: H
    indexed_by>
. b$ U9 |$ V4 o% H/ U    参数:# f1 o) G& h7 E* Q
    字段的名称转换为整数,N(secondid)  d4 Y- Y* U* Y( ~$ P' `
    一个用户定义的密钥调用接口,const_mem_fun
3 X5 A1 M1 S/ ^    来看看有三个索引的情况。# ~8 N: {' Y# M& Q
    ///@abitable
( \9 ~0 k. y* O8 E+ c6 i    structmystruct
, X) f: T' N4 Q6 v2 r# n8 B' Q( ^  `3 H    {
+ Q8 w$ w4 }/ w9 b1 i! g    uint64_tkey;
% a* m) C5 n! g$ c7 B7 p    uint64_tsecondid;5 Z  f6 ]* q* l+ m4 J* V4 |
    uint64_tanotherid;
! Z/ _, ?+ ^: x- U# u    std::stringname;
5 B" r$ q3 B! L    std::stringaccount;% X+ }  f  Z2 u5 j+ _1 Z
    uint64_tprimary_key()const{returnkey;}2 M: E/ a( b2 u9 w- V, \) P
    uint64_tby_id()const{returnsecondid;}
2 j, @, C7 S- z" ], m; I0 v  u6 b    uint64_tby_anotherid()const{returnanotherid;}2 Q1 }$ \+ r  t: ?
    };
4 I/ {2 o8 L6 h    typedefeosio::multi_index>,indexed_by>>datastore;+ f; h9 ~" x1 |
    更多的就不列了。- n5 p& C) x6 O! h
    这里要注意的一个重要事项是,结构名与表名的匹配,并且将出现在ABI文件中的名称遵循规则(12个字符,所有都是小写的字母)。如果它们没有遵循这个规则,则表不会通过ABI可见(当然可以通过编辑ABI文件来绕过这一点)。: s2 D. @) x7 _
    3.创建定义类型的局部变量
5 k8 l: u$ S0 U# B# c6 q    //localinstancesofthemultiindexes6 g  S( {3 C6 J4 b* d; |* [. i( _  q
    pollstable_polls;5 t( `( _( a4 ~/ b" r* i, w
    votes_votes;$ s7 l0 |; C5 I$ O3 l# a) O" J" N
    现在我已经定义了一个带有两个索引的多索引表,我可以在我的智能合约中使用它。* c3 n) j$ b: o
    如下是一个智能合约使用两个索引的多索引表的例子。在这里你可以看到如何遍历表,如何在同一合约中使用两个表,我们未来将增加额外的教程,利用多索引表。
( Y: W% k) L$ I0 D    #include2 s8 Q4 r5 b% C  h! Y4 J7 P4 p
    usingnamespaceeosio;( ~/ Q6 I! k2 g" r
    classyouvote:publiccontract{
2 U% l5 V: E, q    public:% L1 ]) Z& V4 B. s# N# m( u- M
    youvote(account_names):contract(s),_polls(s,s),_votes(s,s)
6 `9 x9 L7 c( S1 V# v: Z7 x: M    {}
  X4 V  M/ Q8 N& D5 |" V    //publicmethodsexposedviatheABI
# U# c3 m( e# Q& o+ H' |1 }    //onpollsTable; A2 u+ |9 ^& q
    ///@abiaction: Z. _: ?# |- V- A! u% n, z/ e# H
    voidversion()
% M8 i& F& E+ t/ P  ]; v    {
1 d- A1 k) |8 |; U# C5 c5 A    print("YouVoteversion0.01");9 T1 M8 A6 ?! |, q4 w4 d8 h
    };1 T/ m8 S* l. c/ M9 J/ n% G
    ///@abiaction
  r' n' s0 _8 s: E7 T    voidaddpoll(account_names,std::stringpollName)5 ~- R' }' D- H) P- z; |
    {: Q/ Y/ j0 V  n3 d
    //require_auth(s);4 U; N+ W/ q9 w4 Y. V" |: n' S
    print("Addpoll",pollName);; d. }2 I6 u% M* r6 l- B4 V
    //updatethetabletoincludeanewpoll
1 b0 g9 z- C- J9 Y* }+ \    _polls.emplace(get_self(),[&](auto&p)* D; L! G6 O7 V+ @: n2 h
    {
; E6 X2 S9 n! O5 d8 f1 Q4 c. ]! n    p.key=_polls.available_primary_key();
! r5 u! @' R9 y8 O) A: @7 ~    p.pollId=_polls.available_primary_key();2 X7 Y$ E+ [7 v9 `( p7 n! m
    p.pollName=pollName;
2 V* p( ?$ t9 K" S/ y7 L& s9 X4 c0 C    p.pollStatus=0;
7 c3 |0 X- }5 ~, A: E# B/ c    p.option="";; C; E& W4 e5 }1 F: }' I/ i
    p.count=0;2 h% q$ |" q- a) Q2 U
    });8 j0 e  a+ m4 k" \1 D- I6 V+ [* |
    };6 y; X) n# b9 n- J4 y/ z
    ///@abiaction/ h0 q, h3 y5 O2 u$ F( r& y/ Q. n7 A
    voidrmpoll(account_names,std::stringpollName): J7 f/ W0 l0 F& d) P" m4 x
    {
* w& m: U0 Q/ U  G4 A3 R    //require_auth(s);& {! ~; h/ I. l4 G& Y
    print("Removepoll",pollName);
7 l0 p( [9 O6 W/ u  k' X    std::vectorkeysForDeletion;
& O1 r" G5 u4 f% `9 ]    //finditemswhichareforthenamedpoll, A, g7 s% p% j, J. ~. t
    for(auto&item:_polls)
  U& @1 v: C# O& I' I    {) I8 v, f8 F! O- e/ @& |* W3 @# @
    if(item.pollName==pollName)
( A% m0 w8 u2 @: O% L: i    {
5 Z; C7 ^- B# O    keysForDeletion.push_back(item.key);# m9 @- T/ H! r2 E) Z% v
    }
" J# L' @# \. k4 ^    }
5 g8 n1 ]; o+ k2 l, Y4 b8 w6 G    //nowdeleteeachitemforthatpoll
& E1 e2 q+ A7 r6 b4 V2 z    for(uint64_tkey:keysForDeletion). }! C( |0 L* |5 w' q* i
    {
$ S7 r& P9 j: R' I    print("removefrom_polls",key);
( r/ f' b2 t. K    autoitr=_polls.find(key);" ~: }- i! D" N  W, X0 `( m
    if(itr!=_polls.end())
! @- h) n' R; }5 w/ y6 z, w% v3 M    {
7 X! e$ d* O- m; T5 ~# f/ i    _polls.erase(itr);- X4 }+ w. O& j4 T; @' S' a
    }* C9 ]: H' y. q3 B' R
    }# w/ \  D# ]- e; r5 q  \5 \- X  c
    //addremovevotes...don'tneedittheactionsarepermanentlystoredontheblockchain+ [: o  M+ e( a' q4 U7 v. Z
    std::vectorkeysForDeletionFromVotes;" f) s) j. C- d5 w$ M
    //finditemswhichareforthenamedpoll
) q9 [& C5 r" r7 H6 S    for(auto&item:_votes)* `" n; _* Z) l) J
    {* h1 M$ w) h9 e
    if(item.pollName==pollName)
6 P. J6 f$ n! l2 F0 P    {
5 J4 P0 o8 N& q$ U5 _  Z    keysForDeletionFromVotes.push_back(item.key);
6 ]4 C4 p2 R/ B    }
% |8 s9 G: L. ^" ?6 m    }% U1 H  f/ a% u: C: b" ?3 b
    //nowdeleteeachitemforthatpoll/ i( C7 v( ^# i
    for(uint64_tkey:keysForDeletionFromVotes)
7 ]) b( J! ~, q: X    {% E( l( C0 s& P. A1 ?
    print("removefrom_votes",key);4 _5 y) w* Y6 @# |
    autoitr=_votes.find(key);
$ c$ |/ g  k' E: |2 U* a    if(itr!=_votes.end())
5 c2 w2 f5 z3 x    {4 [4 B; r6 ^& i" j6 o, @' ~' K
    _votes.erase(itr);
2 z2 j9 L: L. Q- a    }
3 g) ^; r! ~" F* Y- T    }
7 O6 _# h9 o4 \    };2 }7 E* Y) i3 V
    ///@abiaction% B) J4 T! }1 o+ m) N' l$ I
    voidstatus(std::stringpollName)
( Y1 V6 F) Y: ]0 n    {% m" ]9 C/ A2 l7 u9 N
    print("Changepollstatus",pollName);+ P, l* S( n- j5 {/ S
    std::vectorkeysForModify;! b# R2 Y4 o0 \/ h- M' Z
    //finditemswhichareforthenamedpoll$ u% N+ ]2 G# i+ V* @; E0 ?
    for(auto&item:_polls)8 z/ \. ]9 t/ N6 G+ C! r
    {% R3 W% u8 P# R3 f" Y9 S# @9 a4 c
    if(item.pollName==pollName)
3 G) \1 e0 x, b4 I& s# }    {4 b9 @, G3 z; t2 D; O  D' H) M; b- {
    keysForModify.push_back(item.key);; [/ L$ w* m8 m* W4 R
    }
! A6 w" h# k! L, |: V) f; `6 g! E    }0 d3 ]: o- @3 H6 _, _. I1 {
    //nowgeteachitemandmodifythestatus
0 }" C4 R9 _5 t    for(uint64_tkey:keysForModify)5 m: n* k# S8 b. x* w) ~$ r* [+ h1 {
    {
( N$ k- N; O+ P6 d    print("modify_pollsstatus",key);: T# L/ o5 r  p6 R
    autoitr=_polls.find(key);, ?1 z1 J9 Y0 H* l
    if(itr!=_polls.end())
3 u7 E% l& ?! t" P6 S0 R7 e4 g    {- j6 A! R9 a. W, Z
    _polls.modify(itr,get_self(),[&](auto&p), O+ K& [+ A  f  m$ A
    {
9 A/ k" E  I7 k    p.pollStatus=p.pollStatus+1;
* Q# Q0 @, ]) B    });
/ s0 S/ o6 ~! ?% Z6 \, o& V' }4 M( I    }! N0 V1 X. q6 ~0 u! l
    }1 T; q, _; U- V+ ]
    };
0 {4 ?+ e: z, _$ s8 b' o    ///@abiaction$ |' r0 e% S9 @2 }! ^# z2 |
    voidstatusreset(std::stringpollName)4 L2 D9 t3 [4 P5 ~* l: Q! \: w
    {  |8 l3 z3 Y/ s* O$ h/ {% P) U
    print("Resetpollstatus",pollName);9 e0 g6 T9 f5 z
    std::vectorkeysForModify;: M0 r( C; ]5 v! I& \
    //findallpollitems4 L9 q$ ^$ J% c9 b' m" a
    for(auto&item:_polls)0 R8 d1 v) @  g- \- t* T
    {
% D1 G: R( {+ l" j, a* R5 c    if(item.pollName==pollName)
0 n9 L5 h5 d+ N$ g    {) h4 W& T) f1 }: |
    keysForModify.push_back(item.key);
* P6 d" ?1 N! U    }
9 q: i' T3 Z1 a7 s    }
+ A8 Q4 N; E2 h- a/ R; p    //updatethestatusineachpollitem2 P) t( {. ?) s
    for(uint64_tkey:keysForModify): T' D: F" r' A1 \
    {
5 N+ d+ z3 s# ]- P9 q; A    print("modify_pollsstatus",key);
  M1 D) {% z  w' @3 ~9 S% [+ K$ A    autoitr=_polls.find(key);
# U+ X, P- d2 N: O: i: s    if(itr!=_polls.end())
6 j$ S% Q- Z# E    {
5 U6 o: K7 V& l  T- a+ q    _polls.modify(itr,get_self(),[&](auto&p)
0 e+ i. l: G! o' `    {
6 v! q+ d/ }# `0 u3 }' |    p.pollStatus=0;
$ s5 v" Y' d( Z1 ~& c    });
3 C' W  M: M9 _- v; G    }
, K/ c) |' }8 M7 V% H: `- x  F    }# p' R* d3 O. B  Z+ F& B
    };" ~- j% X9 F. n9 ^  {4 C: F7 ^
    ///@abiaction
$ d2 d5 w0 t$ C+ @* R, x    voidaddpollopt(std::stringpollName,std::stringoption). D1 W9 ]' ?( R+ l/ k
    {0 A0 \. p" s$ }# J2 {3 }
    print("Addpolloption",pollName,"option",option);% S3 d9 u0 s5 P, C; d; A! D1 U0 A
    //findthepollId,from_polls,usethistoupdatethe_pollswithanewoption
" Z7 `' K" U" o" G1 ~% u* I    for(auto&item:_polls)/ K3 _( X) l# G
    {
- Z9 Y* G( Y( [2 y9 `3 f    if(item.pollName==pollName), \2 g4 y* w- t
    {
0 g& V! j9 f9 W9 b' m3 ?2 s    //canonlyaddifthepollisnotstartedorfinished, i5 T, ]3 j: b+ b
    if(item.pollStatus==0)
1 S$ I. N7 M& @, ~5 M3 t2 i    {
  n4 e7 D% w- r; j    _polls.emplace(get_self(),[&](auto&p)
6 S7 J$ L0 C$ F% ~  g+ Y0 U- ]9 X    {) y' s5 p' ?  l. \# B0 k& G9 ?* u$ v+ j
    p.key=_polls.available_primary_key();8 \2 }' C0 R  T, m
    p.pollId=item.pollId;
5 r" U) {8 v7 F* Z+ x! z8 m    p.pollName=item.pollName;% z7 ]6 j6 q# h9 @& `. s5 g/ Z% ?
    p.pollStatus=0;* c. ?% P% F. c* |5 c
    p.option=option;
+ D, T( y/ B/ @. F    p.count=0;' U1 [% U% ^% R( }9 P- P" E$ m( C
    });" r( \: E4 {! R# m# [9 u
    }% T/ w7 K6 q4 P# g3 ~( F7 V
    else9 r: o9 p( N8 \4 |
    {
$ Q* X6 x# z3 y5 l. D& D& l6 d( U    print("Cannotaddpolloption",pollName,"option",option,"Pollhasstartedorisfinished.");
1 T0 r% |* m: h    }
- Z1 U( c, b1 }. j2 P& |- ~    break;//soyouonlyadditonce
% M. W6 m% K4 C3 e5 E    }
' x% m- o- q0 a- Y1 ~9 E0 \    }  O0 f2 X; [7 T# g
    };
8 M" B5 a- i5 ^, P    ///@abiaction* d3 N& b# [/ V+ L2 F! d# h, \1 V* x
    voidrmpollopt(std::stringpollName,std::stringoption)# @* m% @: R8 R. X
    {
: p5 u& `# `  ~    print("Removepolloption",pollName,"option",option);
/ S3 T, D/ X% v    std::vectorkeysForDeletion;
$ `' r: q" c+ I, W9 I5 _    //findandremovethenamedpoll; I2 U) E7 [) S$ q2 ~
    for(auto&item:_polls)
7 d; m4 t5 A- H5 W    {
4 ?6 G3 ?1 b6 Z    if(item.pollName==pollName)* l  o9 `$ `. C
    {6 z0 r# N! k& c9 n7 x  u
    keysForDeletion.push_back(item.key);
- m" ], Q, `+ s& J% k  m6 L6 Q8 i    }6 G7 L* A* ]* I; @6 U( h5 n& n7 J6 j
    }8 [3 h* o4 r) A$ {
    for(uint64_tkey:keysForDeletion)& `8 o( S* A. G. b+ y
    {
* B2 a# Q* v% A+ _- Y    print("removefrom_polls",key);
3 j8 O) `, P; ~- \8 c! r    autoitr=_polls.find(key);
' K$ T% D& w% r    if(itr!=_polls.end())- s% W/ X$ s* u2 E
    {# s5 y, r1 Y6 `
    if(itr->option==option)
$ O9 X5 |2 N' l4 Z: G    {
/ f2 R( ^4 H. C# S: I    _polls.erase(itr);: h, U& r# w4 y8 n" E
    }- n. n8 ^: I" ~2 K6 \& e( `
    }
% y- m" ?9 ~6 ]7 G. s( i    }. t  |) d- _9 u' |! t
    };3 n+ e5 U2 |2 @! w0 Y# A  L
    ///@abiaction
& U* A9 Y8 b/ b# K    voidvote(std::stringpollName,std::stringoption,std::stringaccountName)
  ]- Y0 y2 t4 }) Q( l: Q    {4 K5 H/ t! @; Q
    print("votefor",option,"inpoll",pollName,"by",accountName);
8 a( {8 D9 L8 b' I    //isthepollopen% R7 {* I! U, F/ i+ G
    for(auto&item:_polls)
, V+ d' u& q" Q8 t/ {. y    {
4 Q5 D* @5 ~" L/ y: f8 R: C, O9 \    if(item.pollName==pollName)4 _( n" E5 e3 l
    {" [7 a2 O2 X2 b3 R5 ?5 ~( `
    if(item.pollStatus!=1)
$ ~; F. }  q. w* m. L) j    {
9 A% i6 u! X: v5 `  |( e# ?; ~1 h    print("Poll",pollName,"isnotopen");
3 E8 q5 S! e2 @: [9 r+ i" z    return;: @: C/ l- ]1 i; X! y
    }
0 B6 f! P+ \4 X! P0 X    break;//onlyneedtocheckstatusonce/ e" f' i2 t6 N5 a( n; j7 o
    }3 l! Z' T7 ?1 k- Y6 ?3 V* J5 l
    }
. H7 y1 j& ?7 C8 C  x$ k    //hasaccountnamealreadyvoted?6 r( D( f9 }8 I4 a2 E& s2 A
    for(auto&vote:_votes)
- \& T# Y9 }8 J    {0 I* K. S0 @) p+ \$ T3 e* c
    if(vote.pollName==pollName&&vote.account==accountName)# G8 m5 [' l! ^
    {' v) U6 O- y* N  c+ u8 J
    print(accountName,"hasalreadyvotedinpoll",pollName);
* K% O+ A; l; `6 D. W% |    //eosio_assert(true,"AlreadyVoted");
% I3 K( n. I2 Q1 _9 N    return;' l3 C3 P/ j0 |% c& {3 F
    }4 d7 ~8 D" u$ W  _% E  f9 z
    }
# ~1 W$ @. O' d/ S6 x    uint64_tpollId=99999;//getthepollIdforthe_votestable
" [% `+ j2 N* `$ Z# [1 ?    //findthepollandtheoptionandincrementthecount
" K. C2 p2 C) s    for(auto&item:_polls)' v% x6 }4 U6 w0 R. ~3 _( X
    {* M6 D! H( b$ p' x! u$ H0 j
    if(item.pollName==pollName&&item.option==option)/ X2 G6 X. Q  i- V( L4 a3 S3 S
    {
6 w/ {* y& T% d/ U; ?, |    pollId=item.pollId;//forrecordingvoteinthispoll! I4 Q: L2 O  P
    _polls.modify(item,get_self(),[&](auto&p)1 Y+ }  M, b+ L1 D
    {
0 F4 O7 t6 _- D* K8 A5 |    p.count=p.count+1;7 u7 d4 {/ P2 l1 M! k& M% R" k
    });" `5 N8 e$ U. R3 K
    }
0 @$ X, L- {" o' s' @0 a! \    }
- ~- I+ n3 w$ W8 i, [5 L9 ^    //recordthataccountNamehasvoted
( C3 v. p' H, b, B! f1 v    _votes.emplace(get_self(),[&](auto&pv)
4 J8 H% N9 J4 p( w% L1 L: G  G" C    {
& u, [( Z) f. ?& ]3 Q    pv.key=_votes.available_primary_key();) l+ @/ `; e) k" g! y; T7 [9 x
    pv.pollId=pollId;
. G& l' x: J) N    pv.pollName=pollName;
  q$ [  }+ C4 Y$ Y/ ~( G6 F( F$ T    pv.account=accountName;
7 U& p; q+ k) Q6 N    });( |" E" y+ ~$ a) R. s
    };
( @# I' P* a; y9 G0 h    private:- H& h# c8 R0 a8 I8 I
    //createthemultiindextablestostorethedata, u- w) E  {7 g& i5 {7 i  F) X
    ///@abitable
- F8 L7 G8 A. q9 r, V    structpoll& f2 U2 U# _% U8 W
    {
- O& D) w% d5 X& q1 b    uint64_tkey;//primarykey$ C& ?0 `4 C) W! @- J
    uint64_tpollId;//secondkey,non-unique,thistablewillhaveduprowsforeachpollbecauseofoption: k3 S: w3 o4 R* t% R7 t
    std::stringpollName;//nameofpoll
/ T( I; v) H# D" ~0 Z" v, W    uint8_tpollStatus=0;//stauswhere0=closed,1=open,2=finished
0 t0 u& M/ W" H' U' _7 C    std::stringoption;//theitemyoucanvotefor7 D1 o. G! P* d6 P5 c6 e
    uint32_tcount=0;//thenumberofvotesforeachitme--thistobepulledouttosepartetable.; ^  c5 ], m: v8 s% M
    uint64_tprimary_key()const{returnkey;}
+ U6 F+ h8 x" n& C7 [; m    uint64_tby_pollId()const{returnpollId;}
  l* p6 E% t: i0 D4 z6 D+ G( \    };
# g: w; j2 s3 f4 B- ?. I    typedefeosio::multi_index>>pollstable;* Z, p; [# o1 w) Y; m2 z" z
    ///@abitable
! r: `+ R: b$ J    structpollvotes& V! R7 |# ^1 S- d/ M+ ~; o
    {# R8 N& A  M8 \5 X# @9 L9 e8 P4 Z
    uint64_tkey;
$ U4 u* z6 s! y    uint64_tpollId;
8 @9 Q4 m6 r" y. S    std::stringpollName;//nameofpoll
3 J2 S* r3 }; F9 P" n0 r$ _    std::stringaccount;//thisaccounthasvoted,usethistomakesurenoonevotes>1( ^9 k/ y7 m: R0 ]3 _4 W8 l
    uint64_tprimary_key()const{returnkey;}* W, b: Z( j/ ^, u, I; I
    uint64_tby_pollId()const{returnpollId;}- y; p1 u& p) @- o2 {* r+ \3 c! z% u7 W
    };5 M8 J' J0 G) j) A( K6 t3 n
    typedefeosio::multi_index>>votes;
: U3 g& s# r) }* T# k0 A5 s    //localinstancesofthemultiindexes, O6 I8 f. X4 W
    pollstable_polls;
/ o8 _% c( R% z5 ?, b0 ~; y( }9 j    votes_votes;6 w" [4 L+ h6 N+ g5 W
    };
' Y& u2 O/ b3 v. }/ w+ A' z    EOSIO_ABI(youvote,(version)(addpoll)(rmpoll)(status)(statusreset)(addpollopt)(rmpollopt)(vote))2 e4 V' C, O( ^" w
    注意EOSIO_ABI调用,它通过ABI公开函数,重要的是函数名与ABI函数名规则一定要匹配。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    10