Commit 5226c257 authored by jiangpeng's avatar jiangpeng

add dapp vote

parent 2983a997
......@@ -30,15 +30,19 @@ github.com/NebulousLabs/merkletree v0.0.0-20181203152040-08d5d54b07f5/go.mod h1:
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/OneOfOne/xxhash v1.2.5/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q=
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
github.com/VictoriaMetrics/fastcache v1.5.3 h1:2odJnXLbFZcoV9KYtQ+7TH1UOq3dn3AssMgieaezkR4=
github.com/VictoriaMetrics/fastcache v1.5.3/go.mod h1:+jv9Ckb+za/P1ZRg/sulP5Ni1v49daAVERr0H3CuscE=
github.com/XiaoMi/pegasus-go-client v0.0.0-20181029071519-9400942c5d1c h1:3fAhdHMhoSG57DjJ/dqLFfgD+FoooPbQH6szINbrr3k=
github.com/XiaoMi/pegasus-go-client v0.0.0-20181029071519-9400942c5d1c/go.mod h1:KcL6D/4RZ8RAYzQ5gKI0odcdWUmCVlbQTOlWrhP71CY=
github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc h1:cAKDfWh5VpdgMhJosfJnn5/FoN2SRZ4p7fJNX58YPaU=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf h1:qet1QNfXsQxTZqLG4oE62mJzwPIB8+Tee4RNCL9ulrY=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=
github.com/apache/thrift v0.0.0-20171203172758-327ebb6c2b6d h1:b/FqDLjWXDQI6XBYvWDVgEKv3xOTs68qRkuqyU37lBc=
github.com/apache/thrift v0.0.0-20171203172758-327ebb6c2b6d/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847 h1:rtI0fD4oG/8eVokGVPYJEW1F88p1ZNgXiEIs9thEE4A=
github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
github.com/benbjohnson/clock v1.0.2 h1:Z0CN0Yb4ig9sGPXkvAQcGJfnrrMQ5QYLCMPRi9iD7YE=
......@@ -56,13 +60,17 @@ github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcug
github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI=
github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw=
github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ=
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo=
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=
github.com/btcsuite/btcutil v0.0.0-20180706230648-ab6388e0c60a/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d h1:yJzD/yFppdVCf6ApMkVy8cUxV0XrxdP9rVf6D87/Mng=
github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw=
github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg=
github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY=
github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3SkEwmHoWBmX1DNXhXZqlTpq6s4tyJGc=
github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=
github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=
github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8=
......@@ -71,6 +79,7 @@ github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cespare/xxhash/v2 v2.0.1-0.20190104013014-3767db7a7e18/go.mod h1:HD5P3vAIAh+Y2GAxg0PrPN1P8WkepXGpjbUPDHJqqKM=
github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cloudflare/cloudflare-go v0.10.2-0.20190916151808-a80f83b9add9/go.mod h1:1MxXX1Ux4x6mqPmjkUgTP1CdXIBXKX7T+Jk9Gxrmx+U=
......@@ -90,9 +99,11 @@ github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwc
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018 h1:6xT9KW8zLC5IlbaIF5Q7JNieBoACT7iW0YTxQHR0in0=
github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4=
github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea h1:j4317fAZh7X6GqbFowYdYdI0L9bwxL07jyPZIdepyZ0=
github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ=
github.com/decred/base58 v1.0.2 h1:yupIH6bg+q7KYfBk7oUv3xFjKGb5Ypm4+v/61X4keGY=
github.com/decred/base58 v1.0.2/go.mod h1:pXP9cXCfM2sFLb2viz2FNIdeMWmZDBKG3ZBYbiSM78E=
......@@ -115,7 +126,9 @@ github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw=
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
github.com/elastic/gosigar v0.8.1-0.20180330100440-37f05ff46ffa h1:XKAhUk/dtp+CV0VO6mhG2V7jA9vbcGcnYF/Ay9NjZrY=
github.com/elastic/gosigar v0.8.1-0.20180330100440-37f05ff46ffa/go.mod h1:cdorVVzy1fhmEqmtgqkoE3bYtCfSCkVyjTyCIo22xvs=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
......@@ -128,6 +141,7 @@ github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv
github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI=
github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww=
github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98=
github.com/go-interpreter/wagon v0.6.0 h1:BBxDxjiJiHgw9EdkYXAWs8NHhwnazZ5P2EWBW5hFNWw=
......@@ -144,6 +158,7 @@ github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 h1:zN2lZNZRflqFyxVaTIU61KNKQ9C0055u9CAfpmqUvo4=
github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3/go.mod h1:nPpo7qLxd6XL3hWJG/O60sR8ZKfMCiIoNap5GvD12KU=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
......@@ -256,6 +271,7 @@ github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlT
github.com/julienschmidt/httprouter v1.1.1-0.20170430222011-975b5c4c7c21/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0=
github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356 h1:I/yrLt2WilKxlQKCM52clh5rGzTKpVctGT1lH4Dc8Jw=
github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU=
github.com/kevinms/leakybucket-go v0.0.0-20200115003610-082473db97ca h1:qNtd6alRqd3qOdPrKXMZImV192ngQ0WSh1briEO33Tk=
github.com/kevinms/leakybucket-go v0.0.0-20200115003610-082473db97ca/go.mod h1:ph+C5vpnCcQvKBwJwKLTK3JLNGnBXYlG7m7JjoC/zYA=
......@@ -263,7 +279,9 @@ github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvW
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
github.com/klauspost/compress v1.8.2 h1:Bx0qjetmNjdFXASH02NSAREKpiaDwkO1DRZ3dV2KCcs=
github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w=
github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d h1:68u9r4wEvL3gYg2jvAOgROwZ3H+Y3hIDk4tbbmIjcYQ=
......@@ -436,6 +454,7 @@ github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXT
github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw=
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y=
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
......@@ -443,6 +462,7 @@ github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyex
github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/miekg/dns v1.1.30 h1:Qww6FseFn8PRfw07jueqIXqodm0JKiiKuK0DeXSqfyo=
github.com/miekg/dns v1.1.30/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
github.com/miguelmota/go-solidity-sha3 v0.1.0 h1:RoRqUD/qKqZCZIoAGVJhX6gEHeD6333uQv+jhBGpRDk=
github.com/miguelmota/go-solidity-sha3 v0.1.0/go.mod h1:FuaBKCJUkJcmPqCuKvPFYfzK1auYGr5+8i2evSBIm/Q=
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g=
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ=
......@@ -516,6 +536,7 @@ github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h
github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E=
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
github.com/olekukonko/tablewriter v0.0.2-0.20190409134802-7e037d187b0c h1:1RHs3tNxjXGHeul8z2t6H2N2TlAqpKe5yryJztRx4Jk=
github.com/olekukonko/tablewriter v0.0.2-0.20190409134802-7e037d187b0c/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
......@@ -530,6 +551,7 @@ github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFSt
github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34=
github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g=
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/perlin-network/life v0.0.0-20191203030451-05c0e0f7eaea h1:okKoivlkNRRLqXraEtatHfEhW+D71QTwkaj+4n4M2Xc=
......@@ -541,6 +563,7 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v0.9.2 h1:awm861/B8OKDd2I/6o1dy3ra4BamzKhYOiGItCeZ740=
......@@ -556,9 +579,11 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R
github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.3 h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURmKE=
github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150 h1:ZeU+auZj1iNzN8iVhff6M38Mfu73FQiJve/GEXYJBjE=
github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563 h1:dY6ETXrvDG7Sa4vE8ZQG4yqWg6UnOcbqTAahkV813vQ=
github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE=
github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho=
github.com/robertkrimen/otto v0.0.0-20170205013659-6a77b7cbc37d/go.mod h1:xvqspoSXJTIpemEonrMDFq6XzwHYYgToXWj5eRX1OtY=
github.com/robertkrimen/otto v0.0.0-20180617131154-15f95af6e78d h1:1VUlQbCfkoSGv7qP7Y+ro3ap1P1pPZxgdGVqiTVy5C4=
......@@ -571,6 +596,7 @@ github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubr
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY=
github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0=
......@@ -588,15 +614,20 @@ github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc=
github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4 h1:Gb2Tyox57NRNuZ2d3rmvB3pcmbu7O1RS3m8WRx7ilrg=
github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q=
github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570 h1:gIlAHnH1vJb5vwEjIp5kBj/eu99p/bl0Ay2goiPe5xE=
github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570/go.mod h1:8OR4w3TdeIHIh1g6EMY5p0gVNOovcWC+1vpc7naMuAw=
github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3 h1:njlZPzLwU639dk2kqnCPPv+wNjq7Xb6EfUxe/oX0/NM=
github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUWaI9xL8pRQCTXQgocU38Qw1g0Us7n5PxxTwTCYU=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d h1:gZZadD8H+fF+n9CmNhYL1Y0dJB+kLOmKd7FbPJLeGHs=
......@@ -605,11 +636,14 @@ github.com/tjfoc/gmsm v1.3.1/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn
github.com/tjfoc/gmsm v1.3.2 h1:7JVkAn5bvUJ7HtU08iW6UiD+UTmJTIToHCfeFzkcCxM=
github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w=
github.com/twitchyliquid64/golang-asm v0.0.0-20190126203739-365674df15fc/go.mod h1:NoCfSFWosfqMqmmD7hApkirIK9ozpHjxRnRxs1l413A=
github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef h1:wHSqTBrZW24CsNJDfeh9Ex6Pm0Rcpc7qrgKBiL44vF4=
github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs=
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/valyala/fasthttp v1.5.0 h1:dhq+O9pmNZFF6qAXpasMO1xSm7dL4qEz2ylfZN8BG9w=
github.com/valyala/fasthttp v1.5.0/go.mod h1:eriCz9OhZjKCGfJ185a/IDgNl0bg9IbzfpcslMZXU1c=
github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
github.com/vmihailenco/msgpack v4.0.4+incompatible h1:dSLoQfGFAo3F6OoNhwUmLwVgaUXK79GlxNBwueZn0xI=
......@@ -625,6 +659,7 @@ github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:
github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI=
github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow=
github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg=
github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208 h1:1cngl9mPEoITZG8s8cVcUy5CeIBYhEESkOB7m6Gmkrk=
github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees=
github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
......@@ -771,6 +806,7 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.28.0 h1:bO/TA4OxCOummhSf10siHuG7vJOiwh7SpRpFZDkOgl4=
google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
......@@ -793,6 +829,7 @@ gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHO
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
......
......@@ -30,6 +30,7 @@ import (
_ "github.com/33cn/plugin/plugin/dapp/trade" //auto gen
_ "github.com/33cn/plugin/plugin/dapp/unfreeze" //auto gen
_ "github.com/33cn/plugin/plugin/dapp/valnode" //auto gen
_ "github.com/33cn/plugin/plugin/dapp/vote" //auto gen
_ "github.com/33cn/plugin/plugin/dapp/wasm" //auto gen
_ "github.com/33cn/plugin/plugin/dapp/x2ethereum" //auto gen
)
all:
bash build.sh $(OUT) $(FLAG)
#!/bin/bash
# 官方ci集成脚本
strpwd=$(pwd)
strcmd=${strpwd##*dapp/}
strapp=${strcmd%/cmd*}
OUT_DIR="${1}/$strapp"
#FLAG=$2
mkdir -p "${OUT_DIR}"
cp ./build/* "${OUT_DIR}"
/*Package commands implement dapp client commands*/
package commands
import (
jsonrpc "github.com/33cn/chain33/rpc/jsonclient"
rpctypes "github.com/33cn/chain33/rpc/types"
"github.com/33cn/chain33/types"
vty "github.com/33cn/plugin/plugin/dapp/vote/types"
"github.com/spf13/cobra"
)
/*
* 实现合约对应客户端
*/
// Cmd vote client command
func Cmd() *cobra.Command {
cmd := &cobra.Command{
Use: "vote",
Short: "vote command",
Args: cobra.MinimumNArgs(1),
}
cmd.AddCommand(
//create tx
createGroupCMD(),
updateMemberCMD(),
createVoteCMD(),
commitVoteCMD(),
//query rpc
groupInfoCMD(),
voteInfoCMD(),
memberInfoCMD(),
listGroupCMD(),
listVoteCMD(),
listMemberCMD(),
)
return cmd
}
func markRequired(cmd *cobra.Command, params ...string) {
for _, param := range params {
_ = cmd.MarkFlagRequired(param)
}
}
func sendCreateTxRPC(cmd *cobra.Command, actionName string, req types.Message) {
title, _ := cmd.Flags().GetString("title")
cfg := types.GetCliSysParam(title)
rpcAddr, _ := cmd.Flags().GetString("rpc_laddr")
payLoad := types.MustPBToJSON(req)
pm := &rpctypes.CreateTxIn{
Execer: cfg.ExecName(vty.VoteX),
ActionName: actionName,
Payload: payLoad,
}
var res string
ctx := jsonrpc.NewRPCCtx(rpcAddr, "Chain33.CreateTransaction", pm, &res)
ctx.RunWithoutMarshal()
}
func sendQueryRPC(cmd *cobra.Command, funcName string, req, reply types.Message) {
title, _ := cmd.Flags().GetString("title")
cfg := types.GetCliSysParam(title)
rpcAddr, _ := cmd.Flags().GetString("rpc_laddr")
payLoad := types.MustPBToJSON(req)
query := &rpctypes.Query4Jrpc{
Execer: cfg.ExecName(vty.VoteX),
FuncName: funcName,
Payload: payLoad,
}
ctx := jsonrpc.NewRPCCtx(rpcAddr, "Chain33.Query", query, reply)
ctx.Run()
}
package commands
import (
"fmt"
"os"
"github.com/33cn/chain33/types"
vty "github.com/33cn/plugin/plugin/dapp/vote/types"
"github.com/spf13/cobra"
)
func createGroupCMD() *cobra.Command {
cmd := &cobra.Command{
Use: "createGroup",
Short: "create tx(create vote group)",
Run: createGroup,
Example: "createGroup -n=group1 -a=admin1 -m=member1 -m=member2",
}
createGroupFlags(cmd)
return cmd
}
func createGroupFlags(cmd *cobra.Command) {
cmd.Flags().StringP("name", "n", "", "group name")
cmd.Flags().StringArrayP("admins", "a", nil, "group admin address array")
cmd.Flags().StringArrayP("members", "m", nil, "group member address array")
cmd.Flags().UintSliceP("weights", "w", nil, "member vote weight array")
markRequired(cmd, "name")
}
func createGroup(cmd *cobra.Command, args []string) {
name, _ := cmd.Flags().GetString("name")
admins, _ := cmd.Flags().GetStringArray("admins")
memberAddrs, _ := cmd.Flags().GetStringArray("members")
weights, _ := cmd.Flags().GetUintSlice("weights")
if name == "" {
fmt.Fprintf(os.Stderr, "ErrNilGroupName")
}
if len(weights) == 0 {
weights = make([]uint, len(memberAddrs))
}
if len(weights) != len(memberAddrs) {
fmt.Fprintf(os.Stderr, "member address array length should equal with vote weight array length")
}
members := make([]*vty.GroupMember, 0)
for i, addr := range memberAddrs {
members = append(members, &vty.GroupMember{Addr: addr, VoteWeight: uint32(weights[i])})
}
params := &vty.CreateGroup{
Name: name,
Admins: admins,
Members: members,
}
sendCreateTxRPC(cmd, vty.NameCreateGroupAction, params)
}
func updateMemberCMD() *cobra.Command {
cmd := &cobra.Command{
Use: "updateMember",
Short: "create tx(update group members)",
Run: updateMember,
Example: "updateMember -g=id -a=addMember1 -a=addMember2 -r=removeMember1 ...",
}
updateMemberFlags(cmd)
return cmd
}
func updateMemberFlags(cmd *cobra.Command) {
cmd.Flags().StringP("groupID", "g", "", "group id")
cmd.Flags().StringArrayP("addMembers", "a", nil, "group member address array for adding")
cmd.Flags().UintSliceP("weights", "w", nil, "member vote weight array for adding")
cmd.Flags().StringArrayP("removeMembers", "r", nil, "group member address array for removing")
markRequired(cmd, "groupID")
}
func updateMember(cmd *cobra.Command, args []string) {
groupID, _ := cmd.Flags().GetString("groupID")
addAddrs, _ := cmd.Flags().GetStringArray("addMembers")
weights, _ := cmd.Flags().GetUintSlice("weights")
removeAddrs, _ := cmd.Flags().GetStringArray("removeMembers")
if groupID == "" {
fmt.Fprintf(os.Stderr, "ErrNilGroupID")
}
if len(weights) == 0 {
weights = make([]uint, len(addAddrs))
}
if len(weights) != len(addAddrs) {
fmt.Fprintf(os.Stderr, "member address array length should equal with vote weight array length")
}
addMembers := make([]*vty.GroupMember, 0)
for i, addr := range addAddrs {
addMembers = append(addMembers, &vty.GroupMember{Addr: addr, VoteWeight: uint32(weights[i])})
}
params := &vty.UpdateMember{
GroupID: groupID,
RemoveMemberAddrs: removeAddrs,
AddMembers: addMembers,
}
sendCreateTxRPC(cmd, vty.NameUpdateMemberAction, params)
}
func createVoteCMD() *cobra.Command {
cmd := &cobra.Command{
Use: "createVote",
Short: "create tx(create vote)",
Run: createVote,
}
createVoteFlags(cmd)
return cmd
}
func createVoteFlags(cmd *cobra.Command) {
cmd.Flags().StringP("name", "n", "", "vote name")
cmd.Flags().StringArrayP("groupIDs", "g", nil, "related group id array")
cmd.Flags().StringArrayP("options", "o", nil, "vote option array")
cmd.Flags().Int64P("beginTime", "b", 0, "vote begin unix timestamp, default set now time")
cmd.Flags().Int64P("endTime", "e", 0, "vote end unix timestamp, default set beginTime + 300 seconds")
markRequired(cmd, "name", "groupIDs", "options")
}
func createVote(cmd *cobra.Command, args []string) {
name, _ := cmd.Flags().GetString("name")
groupIDs, _ := cmd.Flags().GetStringArray("groupIDs")
options, _ := cmd.Flags().GetStringArray("options")
beginTime, _ := cmd.Flags().GetInt64("beginTime")
endTime, _ := cmd.Flags().GetInt64("endTime")
if name == "" {
fmt.Fprintf(os.Stderr, "ErrNilVoteName")
}
if len(groupIDs) == 0 {
fmt.Fprintf(os.Stderr, "ErrNilGroupIDs")
}
if len(options) == 0 {
fmt.Fprintf(os.Stderr, "ErrNilOptions")
}
if beginTime == 0 {
beginTime = types.Now().Unix()
}
if endTime == 0 {
endTime = beginTime + 300
}
params := &vty.CreateVote{
Name: name,
VoteGroups: groupIDs,
VoteOptions: options,
BeginTimestamp: beginTime,
EndTimestamp: endTime,
}
sendCreateTxRPC(cmd, vty.NameCreateVoteAction, params)
}
func commitVoteCMD() *cobra.Command {
cmd := &cobra.Command{
Use: "commitVote",
Short: "create tx(commit vote)",
Run: commitVote,
}
commitVoteFlags(cmd)
return cmd
}
func commitVoteFlags(cmd *cobra.Command) {
cmd.Flags().StringP("voteID", "v", "", "vote id")
cmd.Flags().StringP("groupID", "g", "", "belonging group id")
cmd.Flags().Uint32P("optionIndex", "o", 0, "voting option index in option array")
markRequired(cmd, "voteID", "groupID", "optionIndex")
}
func commitVote(cmd *cobra.Command, args []string) {
voteID, _ := cmd.Flags().GetString("voteID")
groupID, _ := cmd.Flags().GetString("groupID")
optionIndex, _ := cmd.Flags().GetUint32("optionIndex")
if voteID == "" {
fmt.Fprintf(os.Stderr, "ErrNilVoteID")
}
if len(groupID) == 0 {
fmt.Fprintf(os.Stderr, "ErrNilGroupID")
}
params := &vty.CommitVote{
VoteID: voteID,
GroupID: groupID,
OptionIndex: optionIndex,
}
sendCreateTxRPC(cmd, vty.NameCommitVoteAction, params)
}
package commands
import (
"fmt"
"os"
"github.com/33cn/chain33/types"
vty "github.com/33cn/plugin/plugin/dapp/vote/types"
"github.com/spf13/cobra"
)
func groupInfoCMD() *cobra.Command {
cmd := &cobra.Command{
Use: "groupInfo",
Short: "show group info",
Run: groupInfo,
}
groupInfoFlags(cmd)
return cmd
}
func groupInfoFlags(cmd *cobra.Command) {
cmd.Flags().StringP("groupID", "g", "", "group id")
markRequired(cmd, "groupID")
}
func groupInfo(cmd *cobra.Command, args []string) {
groupID, _ := cmd.Flags().GetString("groupID")
if len(groupID) == 0 {
fmt.Fprintf(os.Stderr, "ErrNilGroupID")
}
params := &types.ReqString{
Data: groupID,
}
info := &vty.GroupVoteInfo{}
sendQueryRPC(cmd, "GetGroup", params, info)
}
func voteInfoCMD() *cobra.Command {
cmd := &cobra.Command{
Use: "voteInfo",
Short: "show vote info",
Run: voteInfo,
}
voteInfoFlags(cmd)
return cmd
}
func voteInfoFlags(cmd *cobra.Command) {
cmd.Flags().StringP("voteID", "v", "", "vote id")
markRequired(cmd, "voteID")
}
func voteInfo(cmd *cobra.Command, args []string) {
voteID, _ := cmd.Flags().GetString("voteID")
if len(voteID) == 0 {
fmt.Fprintf(os.Stderr, "ErrNilVoteID")
}
params := &types.ReqString{
Data: voteID,
}
info := &vty.VoteInfo{}
sendQueryRPC(cmd, "GetVote", params, info)
}
func memberInfoCMD() *cobra.Command {
cmd := &cobra.Command{
Use: "memberInfo",
Short: "show member info",
Run: memberInfo,
}
memberInfoFlags(cmd)
return cmd
}
func memberInfoFlags(cmd *cobra.Command) {
cmd.Flags().StringP("addr", "a", "", "member address")
markRequired(cmd, "addr")
}
func memberInfo(cmd *cobra.Command, args []string) {
addr, _ := cmd.Flags().GetString("addr")
if len(addr) == 0 {
fmt.Fprintf(os.Stderr, "ErrNilAddress")
}
params := &types.ReqString{
Data: addr,
}
info := &vty.MemberInfo{}
sendQueryRPC(cmd, "GetMember", params, info)
}
func listGroupCMD() *cobra.Command {
cmd := &cobra.Command{
Use: "listGroup",
Short: "show group list",
Run: listGroup,
}
listCmdFlags(cmd)
return cmd
}
func listGroup(cmd *cobra.Command, args []string) {
runListCMD(cmd, args, "ListGroup", &vty.GroupVoteInfos{})
}
func listVoteCMD() *cobra.Command {
cmd := &cobra.Command{
Use: "listVote",
Short: "show vote list",
Run: listVote,
}
listCmdFlags(cmd)
return cmd
}
func listVote(cmd *cobra.Command, args []string) {
runListCMD(cmd, args, "ListVote", &vty.VoteInfos{})
}
func listMemberCMD() *cobra.Command {
cmd := &cobra.Command{
Use: "listMember",
Short: "show member list",
Run: listMember,
}
listCmdFlags(cmd)
return cmd
}
func listMember(cmd *cobra.Command, args []string) {
runListCMD(cmd, args, "ListMember", &vty.MemberInfos{})
}
func listCmdFlags(cmd *cobra.Command) {
cmd.Flags().StringP("startItem", "s", "", "list start item id, default nil value")
cmd.Flags().Uint32P("count", "c", 10, "list count, default 10")
cmd.Flags().Uint32P("direction", "d", 0, "list direction, default 1 (Ascending order)")
}
func runListCMD(cmd *cobra.Command, args []string, funcName string, reply types.Message) {
startID, _ := cmd.Flags().GetString("startItem")
count, _ := cmd.Flags().GetUint32("count")
direction, _ := cmd.Flags().GetUint32("direction")
params := &vty.ReqListItem{
StartItemID: startID,
Count: int32(count),
Direction: int32(direction),
}
sendQueryRPC(cmd, funcName, params, reply)
}
package executor
import (
"encoding/hex"
dbm "github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/types"
vty "github.com/33cn/plugin/plugin/dapp/vote/types"
)
type action struct {
db dbm.KV
txHash []byte
fromAddr string
blockTime int64
height int64
index int
}
func newAction(v *vote, tx *types.Transaction, index int) *action {
return &action{db: v.GetStateDB(),
txHash: tx.Hash(),
fromAddr: tx.From(),
blockTime: v.GetBlockTime(),
height: v.GetHeight(),
index: index}
}
func (a *action) getGroupInfo(groupID string) (*vty.GroupInfo, error) {
info := &vty.GroupInfo{}
err := readStateDB(a.db, formatStateIDKey(groupID), info)
if err == types.ErrNotFound {
err = errGroupNotExist
}
return info, err
}
func (a *action) getVoteInfo(voteID string) (*vty.VoteInfo, error) {
info := &vty.VoteInfo{}
err := readStateDB(a.db, formatStateIDKey(voteID), info)
if err == types.ErrNotFound {
err = errVoteNotExist
}
return info, err
}
func (a *action) createGroup(create *vty.CreateGroup) (*types.Receipt, error) {
receipt := &types.Receipt{Ty: types.ExecOk}
xhash := hex.EncodeToString(a.txHash)
group := &vty.GroupInfo{}
group.Name = create.Name
group.ID = formatGroupID(xhash)
//添加创建者作为默认管理员
group.Admins = append(group.Admins, create.Admins...)
if !checkSliceItemExist(a.fromAddr, create.Admins) {
group.Admins = append(group.Admins, a.fromAddr)
}
group.Members = create.Members
// set default vote weight
for _, member := range group.Members {
if member.VoteWeight < 1 {
member.VoteWeight = 1
}
}
group.MemberNum = uint32(len(group.Members))
group.Creator = a.fromAddr
groupValue := types.Encode(group)
receipt.KV = append(receipt.KV, &types.KeyValue{Key: formatStateIDKey(group.ID), Value: groupValue})
receipt.Logs = append(receipt.Logs, &types.ReceiptLog{Ty: vty.TyCreateGroupLog, Log: groupValue})
return receipt, nil
}
func (a *action) updateMember(update *vty.UpdateMember) (*types.Receipt, error) {
receipt := &types.Receipt{Ty: types.ExecOk}
group, err := a.getGroupInfo(update.GroupID)
if err != nil {
elog.Error("vote exec updateMember", "txHash", a.txHash, "err", err)
return nil, errStateDBGet
}
addrMap := make(map[string]int)
for index, member := range group.Members {
addrMap[member.Addr] = index
}
// remove members
for _, addr := range update.GetRemoveMemberAddrs() {
if index, ok := addrMap[addr]; ok {
group.Members = append(group.Members[:index], group.Members[index+1:]...)
}
}
// add members
for _, member := range update.GetAddMembers() {
group.Members = append(group.Members, member)
}
groupValue := types.Encode(group)
receipt.KV = append(receipt.KV, &types.KeyValue{Key: formatStateIDKey(group.ID), Value: groupValue})
receipt.Logs = append(receipt.Logs, &types.ReceiptLog{Ty: vty.TyUpdateMemberLog, Log: groupValue})
return receipt, nil
}
func (a *action) createVote(create *vty.CreateVote) (*types.Receipt, error) {
receipt := &types.Receipt{Ty: types.ExecOk}
vote := &vty.VoteInfo{}
vote.ID = formatVoteID(hex.EncodeToString(a.txHash))
vote.BeginTimestamp = create.BeginTimestamp
vote.EndTimestamp = create.EndTimestamp
vote.Name = create.Name
vote.VoteGroups = create.VoteGroups
vote.VoteOptions = make([]*vty.VoteOption, 0)
for _, option := range create.VoteOptions {
vote.VoteOptions = append(vote.VoteOptions, &vty.VoteOption{Option: option})
}
vote.Creator = a.fromAddr
voteValue := types.Encode(vote)
receipt.KV = append(receipt.KV, &types.KeyValue{Key: formatStateIDKey(vote.ID), Value: voteValue})
receipt.Logs = append(receipt.Logs, &types.ReceiptLog{Ty: vty.TyCreateVoteLog, Log: voteValue})
return receipt, nil
}
func (a *action) commitVote(commit *vty.CommitVote) (*types.Receipt, error) {
receipt := &types.Receipt{Ty: types.ExecOk}
vote, err := a.getVoteInfo(commit.VoteID)
group, err1 := a.getGroupInfo(commit.GroupID)
if err != nil || err1 != nil {
elog.Error("vote exec commitVote", "txHash", a.txHash, "err", err, "err1", err1)
return nil, errStateDBGet
}
for _, member := range group.Members {
if member.Addr == a.fromAddr {
vote.VoteOptions[commit.OptionIndex].Score += member.VoteWeight
}
}
vote.VotedMembers = append(vote.VotedMembers, a.fromAddr)
voteValue := types.Encode(vote)
receipt.KV = append(receipt.KV, &types.KeyValue{Key: formatStateIDKey(vote.ID), Value: voteValue})
receipt.Logs = append(receipt.Logs, &types.ReceiptLog{Ty: vty.TyCommitVoteLog, Log: voteValue})
return receipt, nil
}
package executor
import (
"encoding/hex"
"github.com/33cn/chain33/types"
vty "github.com/33cn/plugin/plugin/dapp/vote/types"
)
// CheckTx 实现自定义检验交易接口,供框架调用
func (v *vote) CheckTx(tx *types.Transaction, index int) error {
// implement code
txHash := hex.EncodeToString(tx.Hash())
var action vty.VoteAction
err := types.Decode(tx.Payload, &action)
if err != nil {
elog.Error("vote CheckTx", "txHash", txHash, "Decode payload error", err)
return types.ErrActionNotSupport
}
if action.Ty == vty.TyCreateGroupAction {
err = v.checkCreateGroup(action.GetCreateGroup())
} else if action.Ty == vty.TyUpdateMemberAction {
err = v.checkUpdateMember(action.GetUpdateMember())
} else if action.Ty == vty.TyCreateVoteAction {
err = v.checkCreateVote(action.GetCreateVote())
} else if action.Ty == vty.TyCommitVoteAction {
err = v.checkCommitVote(action.GetCommitVote(), tx, index)
} else {
err = types.ErrActionNotSupport
}
if err != nil {
elog.Error("vote CheckTx", "txHash", txHash, "actionName", tx.ActionName(), "err", err, "actionData", action)
}
return err
}
func checkMemberValidity(members []*vty.GroupMember) error {
filter := make(map[string]struct{}, len(members))
for _, member := range members {
if member.GetAddr() == "" {
return errNilMember
}
if _, ok := filter[member.Addr]; ok {
return errDuplicateMember
}
filter[member.Addr] = struct{}{}
}
return nil
}
func (v *vote) checkCreateGroup(create *vty.CreateGroup) error {
if create.GetName() == "" {
return errEmptyName
}
//检测组成员是否有重复
if err := checkMemberValidity(create.GetMembers()); err != nil {
return err
}
//检测管理员是否有重复
if checkSliceItemDuplicate(create.GetAdmins()) {
return errDuplicateAdmin
}
return nil
}
func (v *vote) checkUpdateMember(update *vty.UpdateMember) error {
if len(update.GetGroupID()) != IDLen {
return errInvalidGroupID
}
for _, member := range update.AddMembers {
if len(member.Addr) != addrLen {
return types.ErrInvalidAddress
}
}
for _, addr := range update.RemoveMemberAddrs {
if len(addr) != addrLen {
return types.ErrInvalidAddress
}
}
return nil
}
func (v *vote) checkCreateVote(create *vty.CreateVote) error {
if create.GetName() == "" {
return errEmptyName
}
if create.GetEndTimestamp() <= v.GetBlockTime() || create.EndTimestamp <= create.BeginTimestamp {
return errInvalidVoteTime
}
if len(create.VoteOptions) < 2 {
return errInvalidVoteOption
}
if len(create.VoteGroups) == 0 {
return errEmptyVoteGroup
}
if checkSliceItemDuplicate(create.VoteGroups) {
return errDuplicateGroup
}
return nil
}
func (v *vote) checkCommitVote(commit *vty.CommitVote, tx *types.Transaction, index int) error {
voteID := commit.GetVoteID()
groupID := commit.GetGroupID()
if len(voteID) != IDLen {
return errInvalidVoteID
}
if len(groupID) != IDLen {
return errInvalidGroupID
}
action := newAction(v, tx, index)
voteInfo, err := action.getVoteInfo(voteID)
if err != nil {
return err
}
if voteInfo.EndTimestamp <= action.blockTime {
return errVoteAlreadyFinished
}
if commit.OptionIndex >= uint32(len(voteInfo.VoteOptions)) {
return errInvalidOptionIndex
}
//check group validity
if !checkSliceItemExist(commit.GroupID, voteInfo.VoteGroups) {
return errInvalidGroupID
}
// check if already vote
if checkSliceItemExist(action.fromAddr, voteInfo.VotedMembers) {
return errAlreadyVoted
}
groupInfo, err := action.getGroupInfo(commit.GroupID)
if err != nil {
return err
}
// check if exist in group members
if !checkMemberExist(action.fromAddr, groupInfo.Members) {
return errInvalidGroupMember
}
return nil
}
package executor
import "errors"
var (
errEmptyName = errors.New("ErrEmptyName")
errInvalidMemberWeights = errors.New("errInvalidMemberWeights")
errNilMember = errors.New("errNilMember")
errDuplicateMember = errors.New("errDuplicateMember")
errDuplicateGroup = errors.New("errDuplicateGroup")
errDuplicateAdmin = errors.New("errDuplicateAdmin")
errInvalidVoteTime = errors.New("errInvalidVoteTime")
errInvalidVoteOption = errors.New("errInvalidVoteOption")
errEmptyVoteGroup = errors.New("errEmptyVoteGroup")
errVoteNotExist = errors.New("errVoteNotExist")
errGroupNotExist = errors.New("errGroupNotExist")
errStateDBGet = errors.New("errStateDBGet")
errInvalidVoteID = errors.New("errInvalidVoteID")
errInvalidGroupID = errors.New("errInvalidGroupID")
errInvalidOptionIndex = errors.New("errInvalidOptionIndex")
errAlreadyVoted = errors.New("errAlreadyVoted")
errInvalidGroupMember = errors.New("errInvalidGroupMember")
errVoteAlreadyFinished = errors.New("errVoteAlreadyFinished")
)
package executor
import (
"github.com/33cn/chain33/types"
votetypes "github.com/33cn/plugin/plugin/dapp/vote/types"
)
/*
* 实现交易的链上执行接口
* 关键数据上链(statedb)并生成交易回执(log)
*/
func (v *vote) Exec_CreateGroup(payload *votetypes.CreateGroup, tx *types.Transaction, index int) (*types.Receipt, error) {
action := newAction(v, tx, index)
return action.createGroup(payload)
}
func (v *vote) Exec_UpdateMember(payload *votetypes.UpdateMember, tx *types.Transaction, index int) (*types.Receipt, error) {
action := newAction(v, tx, index)
return action.updateMember(payload)
}
func (v *vote) Exec_CreateVote(payload *votetypes.CreateVote, tx *types.Transaction, index int) (*types.Receipt, error) {
action := newAction(v, tx, index)
return action.createVote(payload)
}
func (v *vote) Exec_CommitVote(payload *votetypes.CommitVote, tx *types.Transaction, index int) (*types.Receipt, error) {
action := newAction(v, tx, index)
return action.commitVote(payload)
}
package executor
import (
"github.com/33cn/chain33/types"
)
/*
* 实现区块回退时本地执行的数据清除
*/
// ExecDelLocal localdb kv数据自动回滚接口
func (v *vote) ExecDelLocal(tx *types.Transaction, receipt *types.ReceiptData, index int) (*types.LocalDBSet, error) {
kvs, err := v.DelRollbackKV(tx, tx.Execer)
if err != nil {
return nil, err
}
dbSet := &types.LocalDBSet{}
dbSet.KV = append(dbSet.KV, kvs...)
return dbSet, nil
}
package executor
import (
"encoding/hex"
"github.com/33cn/chain33/types"
vty "github.com/33cn/plugin/plugin/dapp/vote/types"
)
/*
* 实现交易相关数据本地执行,数据不上链
* 非关键数据,本地存储(localDB), 用于辅助查询,效率高
*/
func (v *vote) ExecLocal_CreateGroup(payload *vty.CreateGroup, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
dbSet := &types.LocalDBSet{}
groupInfo := decodeGroupInfo(receiptData.Logs[0].Log)
table := newGroupTable(v.GetLocalDB())
err := table.Add(&vty.GroupVoteInfo{GroupInfo: groupInfo})
if err != nil {
elog.Error("execLocal createGroup", "txHash", hex.EncodeToString(tx.Hash()), "table add", err)
return nil, err
}
kvs, err := table.Save()
if err != nil {
elog.Error("execLocal createGroup", "txHash", hex.EncodeToString(tx.Hash()), "table save", err)
return nil, err
}
dbSet.KV = kvs
kvs, err = v.addGroupMember(groupInfo.GetID(), groupInfo.Members)
if err != nil {
elog.Error("execLocal createGroup", "txHash", hex.EncodeToString(tx.Hash()), "addMemberErr", err)
return nil, err
}
dbSet.KV = append(dbSet.KV, kvs...)
//auto gen for localdb auto rollback
return v.addAutoRollBack(tx, dbSet.KV), nil
}
func (v *vote) ExecLocal_UpdateMember(update *vty.UpdateMember, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
dbSet := &types.LocalDBSet{}
groupInfo := decodeGroupInfo(receiptData.Logs[0].Log)
table := newGroupTable(v.GetLocalDB())
err := table.Replace(&vty.GroupVoteInfo{GroupInfo: groupInfo})
if err != nil {
elog.Error("execLocal updateMember", "txHash", hex.EncodeToString(tx.Hash()), "groupID", groupInfo.ID, "table replace", err)
return nil, err
}
kvs, err := table.Save()
if err != nil {
elog.Error("execLocal updateMember", "txHash", hex.EncodeToString(tx.Hash()), "groupID", groupInfo.ID, "table save", err)
return nil, err
}
dbSet.KV = kvs
kvs, err = v.addGroupMember(groupInfo.GetID(), update.AddMembers)
if err != nil {
elog.Error("execLocal updateMember", "txHash", hex.EncodeToString(tx.Hash()), "addMemberErr", err)
return nil, err
}
dbSet.KV = append(dbSet.KV, kvs...)
kvs, err = v.removeGroupMember(groupInfo.GetID(), update.RemoveMemberAddrs)
if err != nil {
elog.Error("execLocal updateMember", "txHash", hex.EncodeToString(tx.Hash()), "removeMemberErr", err)
return nil, err
}
dbSet.KV = append(dbSet.KV, kvs...)
//auto gen for localdb auto rollback
return v.addAutoRollBack(tx, dbSet.KV), nil
}
func (v *vote) ExecLocal_CreateVote(payload *vty.CreateVote, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
dbSet := &types.LocalDBSet{}
voteInfo := decodeVoteInfo(receiptData.Logs[0].Log)
table := newVoteTable(v.GetLocalDB())
err := table.Add(voteInfo)
if err != nil {
elog.Error("execLocal createVote", "txHash", hex.EncodeToString(tx.Hash()), "voteTable add", err)
return nil, err
}
kvs, err := table.Save()
if err != nil {
elog.Error("execLocal createVote", "txHash", hex.EncodeToString(tx.Hash()), "voteTable save", err)
return nil, err
}
dbSet.KV = kvs
// 在关联的投票组表中记录voteID信息
table = newGroupTable(v.GetLocalDB())
for _, groupID := range voteInfo.VoteGroups {
row, err := table.GetData([]byte(groupID))
if err != nil {
continue
}
if info, ok := row.Data.(*vty.GroupVoteInfo); ok {
info.VoteIDs = append(info.VoteIDs, voteInfo.ID)
err = table.Replace(info)
if err != nil {
elog.Error("execLocal createVote", "txHash", hex.EncodeToString(tx.Hash()),
"groupID", groupID, "groupTable replace", err)
return nil, err
}
}
}
kvs, err = table.Save()
if err != nil {
elog.Error("execLocal createVote", "txHash", hex.EncodeToString(tx.Hash()), "groupTable save", err)
return nil, err
}
dbSet.KV = append(dbSet.KV, kvs...)
//auto gen for localdb auto rollback
return v.addAutoRollBack(tx, dbSet.KV), nil
}
func (v *vote) ExecLocal_CommitVote(payload *vty.CommitVote, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
dbSet := &types.LocalDBSet{}
//implement code, add customize kv to dbSet...
voteInfo := decodeVoteInfo(receiptData.Logs[0].Log)
table := newVoteTable(v.GetLocalDB())
err := table.Replace(voteInfo)
if err != nil {
elog.Error("execLocal commitVote", "txHash", hex.EncodeToString(tx.Hash()), "voteTable add", err)
return nil, err
}
kvs, err := table.Save()
if err != nil {
elog.Error("execLocal commitVote", "txHash", hex.EncodeToString(tx.Hash()), "voteTable save", err)
return nil, err
}
dbSet.KV = kvs
//auto gen for localdb auto rollback
return v.addAutoRollBack(tx, dbSet.KV), nil
}
//当区块回滚时,框架支持自动回滚localdb kv,需要对exec-local返回的kv进行封装
func (v *vote) addAutoRollBack(tx *types.Transaction, kv []*types.KeyValue) *types.LocalDBSet {
dbSet := &types.LocalDBSet{}
dbSet.KV = v.AddRollbackKV(tx, tx.Execer, kv)
return dbSet
}
func (v *vote) addGroupMember(groupID string, members []*vty.GroupMember) ([]*types.KeyValue, error) {
table := newMemberTable(v.GetLocalDB())
for _, member := range members {
addrKey := []byte(member.Addr)
row, err := table.GetData(addrKey)
if err == nil {
info, ok := row.Data.(*vty.MemberInfo)
if ok && !checkSliceItemExist(groupID, info.GroupIDs) {
info.GroupIDs = append(info.GroupIDs, groupID)
err = table.Replace(info)
}
} else if err == types.ErrNotFound {
err = table.Add(&vty.MemberInfo{Addr: member.Addr, GroupIDs: []string{groupID}})
}
// 这个错可能由GetData,Replace,Add返回
if err != nil {
elog.Error("execLocal addMember", "member table Add/Replace", err)
return nil, err
}
}
kvs, err := table.Save()
if err != nil {
elog.Error("execLocal addMember", "member table save", err)
return nil, err
}
return kvs, nil
}
func (v *vote) removeGroupMember(groupID string, addrs []string) ([]*types.KeyValue, error) {
table := newMemberTable(v.GetLocalDB())
for _, addr := range addrs {
addrKey := []byte(addr)
row, err := table.GetData(addrKey)
if err == types.ErrNotFound {
return nil, nil
} else if err != nil {
elog.Error("execLocal removeMember", "member table getData", err)
return nil, err
}
info, ok := row.Data.(*vty.MemberInfo)
if !ok {
return nil, types.ErrTypeAsset
}
for index, id := range info.GroupIDs {
if id == groupID {
info.GroupIDs = append(info.GroupIDs[:index], info.GroupIDs[index+1:]...)
err = table.Replace(info)
if err != nil {
elog.Error("execLocal removeMember", "member table replace", err)
return nil, err
}
break
}
}
}
kvs, err := table.Save()
if err != nil {
elog.Error("execLocal addMember", "member table save", err)
return nil, err
}
return kvs, nil
}
package executor
/*
* 用户合约存取kv数据时,key值前缀需要满足一定规范
* 即key = keyPrefix + userKey
* 需要字段前缀查询时,使用’-‘作为分割符号
*/
var (
//keyPrefixStateDB state db key必须前缀
keyPrefixStateDB = "mavl-vote-"
//keyPrefixLocalDB local db的key必须前缀
keyPrefixLocalDB = "LODB-vote-"
)
// groupID or voteID
func formatStateIDKey(id string) []byte {
return []byte(keyPrefixStateDB + id)
}
package executor
import (
"github.com/33cn/chain33/types"
vty "github.com/33cn/plugin/plugin/dapp/vote/types"
)
// Query_GroupInfo query group info
func (v *vote) Query_GetGroup(in *types.ReqString) (types.Message, error) {
if len(in.GetData()) != IDLen {
return nil, errInvalidGroupID
}
groupID := in.Data
table := newGroupTable(v.GetLocalDB())
row, err := table.GetData([]byte(groupID))
if err != nil {
elog.Error("query getGroup", "id", groupID, "err", err)
return nil, err
}
info, ok := row.Data.(*vty.GroupVoteInfo)
if !ok {
return nil, types.ErrTypeAsset
}
return info, nil
}
func (v *vote) Query_GetVote(in *types.ReqString) (types.Message, error) {
if len(in.GetData()) != IDLen {
return nil, errInvalidVoteID
}
voteID := in.Data
table := newVoteTable(v.GetLocalDB())
row, err := table.GetData([]byte(voteID))
if err != nil {
elog.Error("query getVote", "id", voteID, "err", err)
return nil, err
}
info, ok := row.Data.(*vty.VoteInfo)
if !ok {
return nil, types.ErrTypeAsset
}
return info, nil
}
func (v *vote) Query_GetMember(in *types.ReqString) (types.Message, error) {
if len(in.GetData()) != addrLen {
return nil, types.ErrInvalidAddress
}
addr := in.Data
table := newMemberTable(v.GetLocalDB())
row, err := table.GetData([]byte(addr))
if err != nil {
elog.Error("query getMember", "addr", addr, "err", err)
return nil, err
}
info, ok := row.Data.(*vty.MemberInfo)
if !ok {
return nil, types.ErrTypeAsset
}
return info, nil
}
func (v *vote) Query_ListGroup(in *vty.ReqListItem) (types.Message, error) {
if in == nil {
return nil, types.ErrInvalidParam
}
table := newGroupTable(v.GetLocalDB())
var primaryKey []byte
primaryKey = append(primaryKey, []byte(in.StartItemID)...)
rows, err := table.ListIndex(groupTablePrimary, nil, primaryKey, in.Count, in.Direction)
if err != nil {
elog.Error("query listGroup", "err", err, "param", in)
return nil, err
}
list := &vty.GroupVoteInfos{GroupList: make([]*vty.GroupVoteInfo, 0)}
for _, row := range rows {
info, ok := row.Data.(*vty.GroupVoteInfo)
if !ok {
return nil, types.ErrTypeAsset
}
list.GroupList = append(list.GroupList, info)
}
return list, nil
}
func (v *vote) Query_ListVote(in *vty.ReqListItem) (types.Message, error) {
if in == nil {
return nil, types.ErrInvalidParam
}
table := newVoteTable(v.GetLocalDB())
var primaryKey []byte
primaryKey = append(primaryKey, []byte(in.StartItemID)...)
rows, err := table.ListIndex(voteTablePrimary, nil, primaryKey, in.Count, in.Direction)
if err != nil {
elog.Error("query listVote", "err", err, "param", in)
return nil, err
}
list := &vty.VoteInfos{VoteList: make([]*vty.VoteInfo, 0)}
for _, row := range rows {
info, ok := row.Data.(*vty.VoteInfo)
if !ok {
return nil, types.ErrTypeAsset
}
list.VoteList = append(list.VoteList, info)
}
return list, nil
}
func (v *vote) Query_ListMember(in *vty.ReqListItem) (types.Message, error) {
if in == nil {
return nil, types.ErrInvalidParam
}
table := newMemberTable(v.GetLocalDB())
var primaryKey []byte
primaryKey = append(primaryKey, []byte(in.StartItemID)...)
rows, err := table.ListIndex(memberTablePrimary, nil, primaryKey, in.Count, in.Direction)
if err != nil {
elog.Error("query listMember", "err", err, "param", in)
return nil, err
}
list := &vty.MemberInfos{MemberList: make([]*vty.MemberInfo, 0)}
for _, row := range rows {
info, ok := row.Data.(*vty.MemberInfo)
if !ok {
return nil, types.ErrTypeAsset
}
list.MemberList = append(list.MemberList, info)
}
return list, nil
}
package executor
import (
"github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/common/db/table"
"github.com/33cn/chain33/types"
vty "github.com/33cn/plugin/plugin/dapp/vote/types"
)
var (
groupTablePrimary = "groupid"
voteTablePrimary = "voteid"
memberTablePrimary = "addr"
)
var groupTableOpt = &table.Option{
Prefix: keyPrefixLocalDB,
Name: "group",
Primary: groupTablePrimary,
}
var voteTableOpt = &table.Option{
Prefix: keyPrefixLocalDB,
Name: "vote",
Primary: voteTablePrimary,
}
var memberTableOpt = &table.Option{
Prefix: keyPrefixLocalDB,
Name: "member",
Primary: memberTablePrimary,
}
//新建表
func newTable(kvDB db.KV, rowMeta table.RowMeta, opt *table.Option) *table.Table {
table, err := table.NewTable(rowMeta, kvDB, opt)
if err != nil {
panic(err)
}
return table
}
func newGroupTable(kvDB db.KV) *table.Table {
return newTable(kvDB, &groupTableRow{}, groupTableOpt)
}
func newVoteTable(kvDB db.KV) *table.Table {
return newTable(kvDB, &voteTableRow{}, voteTableOpt)
}
func newMemberTable(kvDB db.KV) *table.Table {
return newTable(kvDB, &memberTableRow{}, memberTableOpt)
}
//groupTableRow table meta 结构
type groupTableRow struct {
*vty.GroupVoteInfo
}
//CreateRow 新建数据行
func (r *groupTableRow) CreateRow() *table.Row {
return &table.Row{Data: &vty.GroupVoteInfo{}}
}
//SetPayload 设置数据
func (r *groupTableRow) SetPayload(data types.Message) error {
if d, ok := data.(*vty.GroupVoteInfo); ok {
r.GroupVoteInfo = d
return nil
}
return types.ErrTypeAsset
}
//Get 按照indexName 查询 indexValue
func (r *groupTableRow) Get(key string) ([]byte, error) {
if key == groupTablePrimary {
return []byte(r.GroupVoteInfo.GetGroupInfo().GetID()), nil
}
return nil, types.ErrNotFound
}
//voteTableRow table meta 结构
type voteTableRow struct {
*vty.VoteInfo
}
//CreateRow 新建数据行
func (r *voteTableRow) CreateRow() *table.Row {
return &table.Row{Data: &vty.VoteInfo{}}
}
//SetPayload 设置数据
func (r *voteTableRow) SetPayload(data types.Message) error {
if d, ok := data.(*vty.VoteInfo); ok {
r.VoteInfo = d
return nil
}
return types.ErrTypeAsset
}
//Get 按照indexName 查询 indexValue
func (r *voteTableRow) Get(key string) ([]byte, error) {
if key == voteTablePrimary {
return []byte(r.VoteInfo.GetID()), nil
}
return nil, types.ErrNotFound
}
type memberTableRow struct {
*vty.MemberInfo
}
//CreateRow 新建数据行
func (r *memberTableRow) CreateRow() *table.Row {
return &table.Row{Data: &vty.MemberInfo{}}
}
//SetPayload 设置数据
func (r *memberTableRow) SetPayload(data types.Message) error {
if d, ok := data.(*vty.MemberInfo); ok {
r.MemberInfo = d
return nil
}
return types.ErrTypeAsset
}
//Get 按照indexName 查询 indexValue
func (r *memberTableRow) Get(key string) ([]byte, error) {
if key == memberTablePrimary {
return []byte(r.MemberInfo.GetAddr()), nil
}
return nil, types.ErrNotFound
}
package executor
import (
"github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/types"
vty "github.com/33cn/plugin/plugin/dapp/vote/types"
)
const (
// IDLen length of groupID or voteID
IDLen = 65
addrLen = 34
)
func formatGroupID(txHash string) string {
return "g" + txHash
}
func formatVoteID(txHash string) string {
return "v" + txHash
}
func checkMemberExist(addr string, members []*vty.GroupMember) bool {
for _, item := range members {
if addr == item.Addr {
return true
}
}
return false
}
func checkSliceItemExist(target string, items []string) bool {
for _, item := range items {
if target == item {
return true
}
}
return false
}
func checkSliceItemDuplicate(items []string) bool {
filter := make(map[string]struct{}, len(items))
for _, item := range items {
if _, ok := filter[item]; ok {
return true
}
filter[item] = struct{}{}
}
return false
}
func readStateDB(stateDB db.KV, key []byte, result types.Message) error {
val, err := stateDB.Get(key)
if err != nil {
return err
}
return types.Decode(val, result)
}
func mustDecodeProto(data []byte, msg types.Message) {
if err := types.Decode(data, msg); err != nil {
panic(err.Error())
}
}
func decodeGroupInfo(data []byte) *vty.GroupInfo {
info := &vty.GroupInfo{}
mustDecodeProto(data, info)
return info
}
func decodeVoteInfo(data []byte) *vty.VoteInfo {
info := &vty.VoteInfo{}
mustDecodeProto(data, info)
return info
}
package executor
import (
log "github.com/33cn/chain33/common/log/log15"
drivers "github.com/33cn/chain33/system/dapp"
"github.com/33cn/chain33/types"
votetypes "github.com/33cn/plugin/plugin/dapp/vote/types"
)
/*
* 执行器相关定义
* 重载基类相关接口
*/
var (
//日志
elog = log.New("module", "vote.executor")
)
var driverName = votetypes.VoteX
// Init register dapp
func Init(name string, cfg *types.Chain33Config, sub []byte) {
drivers.Register(cfg, GetName(), newVote, cfg.GetDappFork(driverName, "Enable"))
InitExecType()
}
// InitExecType Init Exec Type
func InitExecType() {
ety := types.LoadExecutorType(driverName)
ety.InitFuncList(types.ListMethod(&vote{}))
}
type vote struct {
drivers.DriverBase
}
func newVote() drivers.Driver {
t := &vote{}
t.SetChild(t)
t.SetExecutorType(types.LoadExecutorType(driverName))
return t
}
// GetName get driver name
func GetName() string {
return newVote().GetName()
}
func (v *vote) GetDriverName() string {
return driverName
}
package types
import (
"github.com/33cn/chain33/pluginmgr"
"github.com/33cn/plugin/plugin/dapp/vote/commands"
"github.com/33cn/plugin/plugin/dapp/vote/executor"
"github.com/33cn/plugin/plugin/dapp/vote/rpc"
votetypes "github.com/33cn/plugin/plugin/dapp/vote/types"
)
/*
* 初始化dapp相关的组件
*/
func init() {
pluginmgr.Register(&pluginmgr.PluginBase{
Name: votetypes.VoteX,
ExecName: executor.GetName(),
Exec: executor.Init,
Cmd: commands.Cmd,
RPC: rpc.Init,
})
}
all:
bash ./create_protobuf.sh
#!/bin/bash
# proto生成命令,将pb.go文件生成到types/目录下, chain33_path支持引用chain33框架的proto文件
chain33_path=$(go list -f '{{.Dir}}' "github.com/33cn/chain33")
protoc --go_out=plugins=grpc:../types ./*.proto --proto_path=. --proto_path="${chain33_path}/types/proto/"
syntax = "proto3";
package types;
// vote 合约交易行为总类型
message VoteAction {
int32 ty = 1;
oneof value {
CreateGroup createGroup = 2;
UpdateMember updateMember = 3;
CreateVote createVote = 4;
CommitVote commitVote = 5;
}
}
message GroupMember {
string addr = 1;
uint32 voteWeight = 2;
}
//创建投票组
message CreateGroup {
string name = 1;
repeated string admins = 2;
repeated GroupMember members = 3;
}
//更新投票组
message UpdateMember{
string groupID = 1;
repeated GroupMember addMembers = 2;
repeated string removeMemberAddrs = 3;
}
//
message GroupInfo {
string ID = 1;
string name = 2;
uint32 memberNum = 3;
string creator = 4;
repeated string admins = 5;
repeated GroupMember members = 6;
}
message VoteOption {
string option = 1;
uint32 score = 2;
}
//
message CreateVote{
string name = 1;
repeated string voteGroups = 2;
repeated string voteOptions = 3;
int64 beginTimestamp = 4;
int64 endTimestamp = 5;
}
//
message CommitVote{
string voteID = 1;
string groupID = 2;
uint32 optionIndex = 3;
}
//
message VoteInfo{
string ID = 1;
string name = 2;
string creator = 3;
repeated string voteGroups = 4;
repeated VoteOption voteOptions = 5;
int64 beginTimestamp = 6;
int64 endTimestamp = 7;
repeated string votedMembers = 8;
}
message VoteInfos {
repeated VoteInfo voteList = 1;
}
message GroupVoteInfo{
GroupInfo groupInfo = 1;
repeated string voteIDs = 2;
}
message GroupVoteInfos{
repeated GroupVoteInfo groupList = 1;
}
message MemberInfo {
string addr = 1;
repeated string groupIDs = 2;
}
message MemberInfos{
repeated MemberInfo memberList = 1;
}
message ReqListItem{
string startItemID = 1;
int32 count = 2;
int32 direction = 3;
}
package rpc
/*
* 实现json rpc和grpc service接口
* json rpc用Jrpc结构作为接收实例
* grpc使用channelClient结构作为接收实例
*/
package rpc
import (
rpctypes "github.com/33cn/chain33/rpc/types"
)
/*
* rpc相关结构定义和初始化
*/
// 实现grpc的service接口
type channelClient struct {
rpctypes.ChannelClient
}
// Jrpc 实现json rpc调用实例
type Jrpc struct {
cli *channelClient
}
// Grpc grpc
type Grpc struct {
*channelClient
}
// Init init rpc
func Init(name string, s rpctypes.RPCServer) {
cli := &channelClient{}
grpc := &Grpc{channelClient: cli}
cli.Init(name, s, &Jrpc{cli: cli}, grpc)
}
package types
import (
"reflect"
log "github.com/33cn/chain33/common/log/log15"
"github.com/33cn/chain33/types"
)
/*
* 交易相关类型定义
* 交易action通常有对应的log结构,用于交易回执日志记录
* 每一种action和log需要用id数值和name名称加以区分
*/
// action类型id和name,这些常量可以自定义修改
const (
TyUnknowAction = iota + 100
TyCreateGroupAction
TyUpdateMemberAction
TyCreateVoteAction
TyCommitVoteAction
NameCreateGroupAction = "CreateGroup"
NameUpdateMemberAction = "UpdateMember"
NameCreateVoteAction = "CreateVote"
NameCommitVoteAction = "CommitVote"
)
// log类型id值
const (
TyUnknownLog = iota + 100
TyCreateGroupLog
TyUpdateMemberLog
TyCreateVoteLog
TyCommitVoteLog
NameCreateGroupLog = "CreateGroupLog"
NameUpdateMemberLog = "UpdateMemberLog"
NameCreateVoteLog = "CreateVoteLog"
NameCommitVoteLog = "CommitVoteLog"
)
var (
//VoteX 执行器名称定义
VoteX = "vote"
//定义actionMap
actionMap = map[string]int32{
NameCreateGroupAction: TyCreateGroupAction,
NameUpdateMemberAction: TyUpdateMemberAction,
NameCreateVoteAction: TyCreateVoteAction,
NameCommitVoteAction: TyCommitVoteAction,
}
//定义log的id和具体log类型及名称,填入具体自定义log类型
logMap = map[int64]*types.LogInfo{
TyCreateGroupLog: {Ty: reflect.TypeOf(GroupInfo{}), Name: NameCreateGroupLog},
TyUpdateMemberLog: {Ty: reflect.TypeOf(GroupInfo{}), Name: NameUpdateMemberLog},
TyCreateVoteLog: {Ty: reflect.TypeOf(VoteInfo{}), Name: NameCreateVoteLog},
TyCommitVoteLog: {Ty: reflect.TypeOf(VoteInfo{}), Name: NameCommitVoteLog},
}
tlog = log.New("module", "vote.types")
)
// init defines a register function
func init() {
types.AllowUserExec = append(types.AllowUserExec, []byte(VoteX))
//注册合约启用高度
types.RegFork(VoteX, InitFork)
types.RegExec(VoteX, InitExecutor)
}
// InitFork defines register fork
func InitFork(cfg *types.Chain33Config) {
cfg.RegisterDappFork(VoteX, "Enable", 0)
}
// InitExecutor defines register executor
func InitExecutor(cfg *types.Chain33Config) {
types.RegistorExecutor(VoteX, NewType(cfg))
}
type voteType struct {
types.ExecTypeBase
}
func NewType(cfg *types.Chain33Config) *voteType {
c := &voteType{}
c.SetChild(c)
c.SetConfig(cfg)
return c
}
// GetPayload 获取合约action结构
func (v *voteType) GetPayload() types.Message {
return &VoteAction{}
}
// GeTypeMap 获取合约action的id和name信息
func (v *voteType) GetTypeMap() map[string]int32 {
return actionMap
}
// GetLogMap 获取合约log相关信息
func (v *voteType) GetLogMap() map[int64]*types.LogInfo {
return logMap
}
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: vote.proto
package types
import (
fmt "fmt"
math "math"
proto "github.com/golang/protobuf/proto"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
// vote 合约交易行为总类型
type VoteAction struct {
Ty int32 `protobuf:"varint,1,opt,name=ty,proto3" json:"ty,omitempty"`
// Types that are valid to be assigned to Value:
// *VoteAction_CreateGroup
// *VoteAction_UpdateMember
// *VoteAction_CreateVote
// *VoteAction_CommitVote
Value isVoteAction_Value `protobuf_oneof:"value"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *VoteAction) Reset() { *m = VoteAction{} }
func (m *VoteAction) String() string { return proto.CompactTextString(m) }
func (*VoteAction) ProtoMessage() {}
func (*VoteAction) Descriptor() ([]byte, []int) {
return fileDescriptor_21d31c94b62a6ac7, []int{0}
}
func (m *VoteAction) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_VoteAction.Unmarshal(m, b)
}
func (m *VoteAction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_VoteAction.Marshal(b, m, deterministic)
}
func (m *VoteAction) XXX_Merge(src proto.Message) {
xxx_messageInfo_VoteAction.Merge(m, src)
}
func (m *VoteAction) XXX_Size() int {
return xxx_messageInfo_VoteAction.Size(m)
}
func (m *VoteAction) XXX_DiscardUnknown() {
xxx_messageInfo_VoteAction.DiscardUnknown(m)
}
var xxx_messageInfo_VoteAction proto.InternalMessageInfo
func (m *VoteAction) GetTy() int32 {
if m != nil {
return m.Ty
}
return 0
}
type isVoteAction_Value interface {
isVoteAction_Value()
}
type VoteAction_CreateGroup struct {
CreateGroup *CreateGroup `protobuf:"bytes,2,opt,name=createGroup,proto3,oneof"`
}
type VoteAction_UpdateMember struct {
UpdateMember *UpdateMember `protobuf:"bytes,3,opt,name=updateMember,proto3,oneof"`
}
type VoteAction_CreateVote struct {
CreateVote *CreateVote `protobuf:"bytes,4,opt,name=createVote,proto3,oneof"`
}
type VoteAction_CommitVote struct {
CommitVote *CommitVote `protobuf:"bytes,5,opt,name=commitVote,proto3,oneof"`
}
func (*VoteAction_CreateGroup) isVoteAction_Value() {}
func (*VoteAction_UpdateMember) isVoteAction_Value() {}
func (*VoteAction_CreateVote) isVoteAction_Value() {}
func (*VoteAction_CommitVote) isVoteAction_Value() {}
func (m *VoteAction) GetValue() isVoteAction_Value {
if m != nil {
return m.Value
}
return nil
}
func (m *VoteAction) GetCreateGroup() *CreateGroup {
if x, ok := m.GetValue().(*VoteAction_CreateGroup); ok {
return x.CreateGroup
}
return nil
}
func (m *VoteAction) GetUpdateMember() *UpdateMember {
if x, ok := m.GetValue().(*VoteAction_UpdateMember); ok {
return x.UpdateMember
}
return nil
}
func (m *VoteAction) GetCreateVote() *CreateVote {
if x, ok := m.GetValue().(*VoteAction_CreateVote); ok {
return x.CreateVote
}
return nil
}
func (m *VoteAction) GetCommitVote() *CommitVote {
if x, ok := m.GetValue().(*VoteAction_CommitVote); ok {
return x.CommitVote
}
return nil
}
// XXX_OneofWrappers is for the internal use of the proto package.
func (*VoteAction) XXX_OneofWrappers() []interface{} {
return []interface{}{
(*VoteAction_CreateGroup)(nil),
(*VoteAction_UpdateMember)(nil),
(*VoteAction_CreateVote)(nil),
(*VoteAction_CommitVote)(nil),
}
}
type GroupMember struct {
Addr string `protobuf:"bytes,1,opt,name=addr,proto3" json:"addr,omitempty"`
VoteWeight uint32 `protobuf:"varint,2,opt,name=voteWeight,proto3" json:"voteWeight,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *GroupMember) Reset() { *m = GroupMember{} }
func (m *GroupMember) String() string { return proto.CompactTextString(m) }
func (*GroupMember) ProtoMessage() {}
func (*GroupMember) Descriptor() ([]byte, []int) {
return fileDescriptor_21d31c94b62a6ac7, []int{1}
}
func (m *GroupMember) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GroupMember.Unmarshal(m, b)
}
func (m *GroupMember) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_GroupMember.Marshal(b, m, deterministic)
}
func (m *GroupMember) XXX_Merge(src proto.Message) {
xxx_messageInfo_GroupMember.Merge(m, src)
}
func (m *GroupMember) XXX_Size() int {
return xxx_messageInfo_GroupMember.Size(m)
}
func (m *GroupMember) XXX_DiscardUnknown() {
xxx_messageInfo_GroupMember.DiscardUnknown(m)
}
var xxx_messageInfo_GroupMember proto.InternalMessageInfo
func (m *GroupMember) GetAddr() string {
if m != nil {
return m.Addr
}
return ""
}
func (m *GroupMember) GetVoteWeight() uint32 {
if m != nil {
return m.VoteWeight
}
return 0
}
//创建投票组
type CreateGroup struct {
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
Admins []string `protobuf:"bytes,2,rep,name=admins,proto3" json:"admins,omitempty"`
Members []*GroupMember `protobuf:"bytes,3,rep,name=members,proto3" json:"members,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *CreateGroup) Reset() { *m = CreateGroup{} }
func (m *CreateGroup) String() string { return proto.CompactTextString(m) }
func (*CreateGroup) ProtoMessage() {}
func (*CreateGroup) Descriptor() ([]byte, []int) {
return fileDescriptor_21d31c94b62a6ac7, []int{2}
}
func (m *CreateGroup) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CreateGroup.Unmarshal(m, b)
}
func (m *CreateGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_CreateGroup.Marshal(b, m, deterministic)
}
func (m *CreateGroup) XXX_Merge(src proto.Message) {
xxx_messageInfo_CreateGroup.Merge(m, src)
}
func (m *CreateGroup) XXX_Size() int {
return xxx_messageInfo_CreateGroup.Size(m)
}
func (m *CreateGroup) XXX_DiscardUnknown() {
xxx_messageInfo_CreateGroup.DiscardUnknown(m)
}
var xxx_messageInfo_CreateGroup proto.InternalMessageInfo
func (m *CreateGroup) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *CreateGroup) GetAdmins() []string {
if m != nil {
return m.Admins
}
return nil
}
func (m *CreateGroup) GetMembers() []*GroupMember {
if m != nil {
return m.Members
}
return nil
}
//更新投票组
type UpdateMember struct {
GroupID string `protobuf:"bytes,1,opt,name=groupID,proto3" json:"groupID,omitempty"`
AddMembers []*GroupMember `protobuf:"bytes,2,rep,name=addMembers,proto3" json:"addMembers,omitempty"`
RemoveMemberAddrs []string `protobuf:"bytes,3,rep,name=removeMemberAddrs,proto3" json:"removeMemberAddrs,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *UpdateMember) Reset() { *m = UpdateMember{} }
func (m *UpdateMember) String() string { return proto.CompactTextString(m) }
func (*UpdateMember) ProtoMessage() {}
func (*UpdateMember) Descriptor() ([]byte, []int) {
return fileDescriptor_21d31c94b62a6ac7, []int{3}
}
func (m *UpdateMember) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UpdateMember.Unmarshal(m, b)
}
func (m *UpdateMember) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_UpdateMember.Marshal(b, m, deterministic)
}
func (m *UpdateMember) XXX_Merge(src proto.Message) {
xxx_messageInfo_UpdateMember.Merge(m, src)
}
func (m *UpdateMember) XXX_Size() int {
return xxx_messageInfo_UpdateMember.Size(m)
}
func (m *UpdateMember) XXX_DiscardUnknown() {
xxx_messageInfo_UpdateMember.DiscardUnknown(m)
}
var xxx_messageInfo_UpdateMember proto.InternalMessageInfo
func (m *UpdateMember) GetGroupID() string {
if m != nil {
return m.GroupID
}
return ""
}
func (m *UpdateMember) GetAddMembers() []*GroupMember {
if m != nil {
return m.AddMembers
}
return nil
}
func (m *UpdateMember) GetRemoveMemberAddrs() []string {
if m != nil {
return m.RemoveMemberAddrs
}
return nil
}
//
type GroupInfo struct {
ID string `protobuf:"bytes,1,opt,name=ID,proto3" json:"ID,omitempty"`
Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
MemberNum uint32 `protobuf:"varint,3,opt,name=memberNum,proto3" json:"memberNum,omitempty"`
Creator string `protobuf:"bytes,4,opt,name=creator,proto3" json:"creator,omitempty"`
Admins []string `protobuf:"bytes,5,rep,name=admins,proto3" json:"admins,omitempty"`
Members []*GroupMember `protobuf:"bytes,6,rep,name=members,proto3" json:"members,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *GroupInfo) Reset() { *m = GroupInfo{} }
func (m *GroupInfo) String() string { return proto.CompactTextString(m) }
func (*GroupInfo) ProtoMessage() {}
func (*GroupInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_21d31c94b62a6ac7, []int{4}
}
func (m *GroupInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GroupInfo.Unmarshal(m, b)
}
func (m *GroupInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_GroupInfo.Marshal(b, m, deterministic)
}
func (m *GroupInfo) XXX_Merge(src proto.Message) {
xxx_messageInfo_GroupInfo.Merge(m, src)
}
func (m *GroupInfo) XXX_Size() int {
return xxx_messageInfo_GroupInfo.Size(m)
}
func (m *GroupInfo) XXX_DiscardUnknown() {
xxx_messageInfo_GroupInfo.DiscardUnknown(m)
}
var xxx_messageInfo_GroupInfo proto.InternalMessageInfo
func (m *GroupInfo) GetID() string {
if m != nil {
return m.ID
}
return ""
}
func (m *GroupInfo) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *GroupInfo) GetMemberNum() uint32 {
if m != nil {
return m.MemberNum
}
return 0
}
func (m *GroupInfo) GetCreator() string {
if m != nil {
return m.Creator
}
return ""
}
func (m *GroupInfo) GetAdmins() []string {
if m != nil {
return m.Admins
}
return nil
}
func (m *GroupInfo) GetMembers() []*GroupMember {
if m != nil {
return m.Members
}
return nil
}
type VoteOption struct {
Option string `protobuf:"bytes,1,opt,name=option,proto3" json:"option,omitempty"`
Score uint32 `protobuf:"varint,2,opt,name=score,proto3" json:"score,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *VoteOption) Reset() { *m = VoteOption{} }
func (m *VoteOption) String() string { return proto.CompactTextString(m) }
func (*VoteOption) ProtoMessage() {}
func (*VoteOption) Descriptor() ([]byte, []int) {
return fileDescriptor_21d31c94b62a6ac7, []int{5}
}
func (m *VoteOption) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_VoteOption.Unmarshal(m, b)
}
func (m *VoteOption) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_VoteOption.Marshal(b, m, deterministic)
}
func (m *VoteOption) XXX_Merge(src proto.Message) {
xxx_messageInfo_VoteOption.Merge(m, src)
}
func (m *VoteOption) XXX_Size() int {
return xxx_messageInfo_VoteOption.Size(m)
}
func (m *VoteOption) XXX_DiscardUnknown() {
xxx_messageInfo_VoteOption.DiscardUnknown(m)
}
var xxx_messageInfo_VoteOption proto.InternalMessageInfo
func (m *VoteOption) GetOption() string {
if m != nil {
return m.Option
}
return ""
}
func (m *VoteOption) GetScore() uint32 {
if m != nil {
return m.Score
}
return 0
}
//
type CreateVote struct {
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
VoteGroups []string `protobuf:"bytes,2,rep,name=voteGroups,proto3" json:"voteGroups,omitempty"`
VoteOptions []string `protobuf:"bytes,3,rep,name=voteOptions,proto3" json:"voteOptions,omitempty"`
BeginTimestamp int64 `protobuf:"varint,4,opt,name=beginTimestamp,proto3" json:"beginTimestamp,omitempty"`
EndTimestamp int64 `protobuf:"varint,5,opt,name=endTimestamp,proto3" json:"endTimestamp,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *CreateVote) Reset() { *m = CreateVote{} }
func (m *CreateVote) String() string { return proto.CompactTextString(m) }
func (*CreateVote) ProtoMessage() {}
func (*CreateVote) Descriptor() ([]byte, []int) {
return fileDescriptor_21d31c94b62a6ac7, []int{6}
}
func (m *CreateVote) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CreateVote.Unmarshal(m, b)
}
func (m *CreateVote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_CreateVote.Marshal(b, m, deterministic)
}
func (m *CreateVote) XXX_Merge(src proto.Message) {
xxx_messageInfo_CreateVote.Merge(m, src)
}
func (m *CreateVote) XXX_Size() int {
return xxx_messageInfo_CreateVote.Size(m)
}
func (m *CreateVote) XXX_DiscardUnknown() {
xxx_messageInfo_CreateVote.DiscardUnknown(m)
}
var xxx_messageInfo_CreateVote proto.InternalMessageInfo
func (m *CreateVote) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *CreateVote) GetVoteGroups() []string {
if m != nil {
return m.VoteGroups
}
return nil
}
func (m *CreateVote) GetVoteOptions() []string {
if m != nil {
return m.VoteOptions
}
return nil
}
func (m *CreateVote) GetBeginTimestamp() int64 {
if m != nil {
return m.BeginTimestamp
}
return 0
}
func (m *CreateVote) GetEndTimestamp() int64 {
if m != nil {
return m.EndTimestamp
}
return 0
}
//
type CommitVote struct {
VoteID string `protobuf:"bytes,1,opt,name=voteID,proto3" json:"voteID,omitempty"`
GroupID string `protobuf:"bytes,2,opt,name=groupID,proto3" json:"groupID,omitempty"`
OptionIndex uint32 `protobuf:"varint,3,opt,name=optionIndex,proto3" json:"optionIndex,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *CommitVote) Reset() { *m = CommitVote{} }
func (m *CommitVote) String() string { return proto.CompactTextString(m) }
func (*CommitVote) ProtoMessage() {}
func (*CommitVote) Descriptor() ([]byte, []int) {
return fileDescriptor_21d31c94b62a6ac7, []int{7}
}
func (m *CommitVote) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CommitVote.Unmarshal(m, b)
}
func (m *CommitVote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_CommitVote.Marshal(b, m, deterministic)
}
func (m *CommitVote) XXX_Merge(src proto.Message) {
xxx_messageInfo_CommitVote.Merge(m, src)
}
func (m *CommitVote) XXX_Size() int {
return xxx_messageInfo_CommitVote.Size(m)
}
func (m *CommitVote) XXX_DiscardUnknown() {
xxx_messageInfo_CommitVote.DiscardUnknown(m)
}
var xxx_messageInfo_CommitVote proto.InternalMessageInfo
func (m *CommitVote) GetVoteID() string {
if m != nil {
return m.VoteID
}
return ""
}
func (m *CommitVote) GetGroupID() string {
if m != nil {
return m.GroupID
}
return ""
}
func (m *CommitVote) GetOptionIndex() uint32 {
if m != nil {
return m.OptionIndex
}
return 0
}
//
type VoteInfo struct {
ID string `protobuf:"bytes,1,opt,name=ID,proto3" json:"ID,omitempty"`
Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
Creator string `protobuf:"bytes,3,opt,name=creator,proto3" json:"creator,omitempty"`
VoteGroups []string `protobuf:"bytes,4,rep,name=voteGroups,proto3" json:"voteGroups,omitempty"`
VoteOptions []*VoteOption `protobuf:"bytes,5,rep,name=voteOptions,proto3" json:"voteOptions,omitempty"`
BeginTimestamp int64 `protobuf:"varint,6,opt,name=beginTimestamp,proto3" json:"beginTimestamp,omitempty"`
EndTimestamp int64 `protobuf:"varint,7,opt,name=endTimestamp,proto3" json:"endTimestamp,omitempty"`
VotedMembers []string `protobuf:"bytes,8,rep,name=votedMembers,proto3" json:"votedMembers,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *VoteInfo) Reset() { *m = VoteInfo{} }
func (m *VoteInfo) String() string { return proto.CompactTextString(m) }
func (*VoteInfo) ProtoMessage() {}
func (*VoteInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_21d31c94b62a6ac7, []int{8}
}
func (m *VoteInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_VoteInfo.Unmarshal(m, b)
}
func (m *VoteInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_VoteInfo.Marshal(b, m, deterministic)
}
func (m *VoteInfo) XXX_Merge(src proto.Message) {
xxx_messageInfo_VoteInfo.Merge(m, src)
}
func (m *VoteInfo) XXX_Size() int {
return xxx_messageInfo_VoteInfo.Size(m)
}
func (m *VoteInfo) XXX_DiscardUnknown() {
xxx_messageInfo_VoteInfo.DiscardUnknown(m)
}
var xxx_messageInfo_VoteInfo proto.InternalMessageInfo
func (m *VoteInfo) GetID() string {
if m != nil {
return m.ID
}
return ""
}
func (m *VoteInfo) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *VoteInfo) GetCreator() string {
if m != nil {
return m.Creator
}
return ""
}
func (m *VoteInfo) GetVoteGroups() []string {
if m != nil {
return m.VoteGroups
}
return nil
}
func (m *VoteInfo) GetVoteOptions() []*VoteOption {
if m != nil {
return m.VoteOptions
}
return nil
}
func (m *VoteInfo) GetBeginTimestamp() int64 {
if m != nil {
return m.BeginTimestamp
}
return 0
}
func (m *VoteInfo) GetEndTimestamp() int64 {
if m != nil {
return m.EndTimestamp
}
return 0
}
func (m *VoteInfo) GetVotedMembers() []string {
if m != nil {
return m.VotedMembers
}
return nil
}
type VoteInfos struct {
VoteList []*VoteInfo `protobuf:"bytes,1,rep,name=voteList,proto3" json:"voteList,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *VoteInfos) Reset() { *m = VoteInfos{} }
func (m *VoteInfos) String() string { return proto.CompactTextString(m) }
func (*VoteInfos) ProtoMessage() {}
func (*VoteInfos) Descriptor() ([]byte, []int) {
return fileDescriptor_21d31c94b62a6ac7, []int{9}
}
func (m *VoteInfos) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_VoteInfos.Unmarshal(m, b)
}
func (m *VoteInfos) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_VoteInfos.Marshal(b, m, deterministic)
}
func (m *VoteInfos) XXX_Merge(src proto.Message) {
xxx_messageInfo_VoteInfos.Merge(m, src)
}
func (m *VoteInfos) XXX_Size() int {
return xxx_messageInfo_VoteInfos.Size(m)
}
func (m *VoteInfos) XXX_DiscardUnknown() {
xxx_messageInfo_VoteInfos.DiscardUnknown(m)
}
var xxx_messageInfo_VoteInfos proto.InternalMessageInfo
func (m *VoteInfos) GetVoteList() []*VoteInfo {
if m != nil {
return m.VoteList
}
return nil
}
type GroupVoteInfo struct {
GroupInfo *GroupInfo `protobuf:"bytes,1,opt,name=groupInfo,proto3" json:"groupInfo,omitempty"`
VoteIDs []string `protobuf:"bytes,2,rep,name=voteIDs,proto3" json:"voteIDs,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *GroupVoteInfo) Reset() { *m = GroupVoteInfo{} }
func (m *GroupVoteInfo) String() string { return proto.CompactTextString(m) }
func (*GroupVoteInfo) ProtoMessage() {}
func (*GroupVoteInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_21d31c94b62a6ac7, []int{10}
}
func (m *GroupVoteInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GroupVoteInfo.Unmarshal(m, b)
}
func (m *GroupVoteInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_GroupVoteInfo.Marshal(b, m, deterministic)
}
func (m *GroupVoteInfo) XXX_Merge(src proto.Message) {
xxx_messageInfo_GroupVoteInfo.Merge(m, src)
}
func (m *GroupVoteInfo) XXX_Size() int {
return xxx_messageInfo_GroupVoteInfo.Size(m)
}
func (m *GroupVoteInfo) XXX_DiscardUnknown() {
xxx_messageInfo_GroupVoteInfo.DiscardUnknown(m)
}
var xxx_messageInfo_GroupVoteInfo proto.InternalMessageInfo
func (m *GroupVoteInfo) GetGroupInfo() *GroupInfo {
if m != nil {
return m.GroupInfo
}
return nil
}
func (m *GroupVoteInfo) GetVoteIDs() []string {
if m != nil {
return m.VoteIDs
}
return nil
}
type GroupVoteInfos struct {
GroupList []*GroupVoteInfo `protobuf:"bytes,1,rep,name=groupList,proto3" json:"groupList,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *GroupVoteInfos) Reset() { *m = GroupVoteInfos{} }
func (m *GroupVoteInfos) String() string { return proto.CompactTextString(m) }
func (*GroupVoteInfos) ProtoMessage() {}
func (*GroupVoteInfos) Descriptor() ([]byte, []int) {
return fileDescriptor_21d31c94b62a6ac7, []int{11}
}
func (m *GroupVoteInfos) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GroupVoteInfos.Unmarshal(m, b)
}
func (m *GroupVoteInfos) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_GroupVoteInfos.Marshal(b, m, deterministic)
}
func (m *GroupVoteInfos) XXX_Merge(src proto.Message) {
xxx_messageInfo_GroupVoteInfos.Merge(m, src)
}
func (m *GroupVoteInfos) XXX_Size() int {
return xxx_messageInfo_GroupVoteInfos.Size(m)
}
func (m *GroupVoteInfos) XXX_DiscardUnknown() {
xxx_messageInfo_GroupVoteInfos.DiscardUnknown(m)
}
var xxx_messageInfo_GroupVoteInfos proto.InternalMessageInfo
func (m *GroupVoteInfos) GetGroupList() []*GroupVoteInfo {
if m != nil {
return m.GroupList
}
return nil
}
type MemberInfo struct {
Addr string `protobuf:"bytes,1,opt,name=addr,proto3" json:"addr,omitempty"`
GroupIDs []string `protobuf:"bytes,2,rep,name=groupIDs,proto3" json:"groupIDs,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *MemberInfo) Reset() { *m = MemberInfo{} }
func (m *MemberInfo) String() string { return proto.CompactTextString(m) }
func (*MemberInfo) ProtoMessage() {}
func (*MemberInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_21d31c94b62a6ac7, []int{12}
}
func (m *MemberInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_MemberInfo.Unmarshal(m, b)
}
func (m *MemberInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_MemberInfo.Marshal(b, m, deterministic)
}
func (m *MemberInfo) XXX_Merge(src proto.Message) {
xxx_messageInfo_MemberInfo.Merge(m, src)
}
func (m *MemberInfo) XXX_Size() int {
return xxx_messageInfo_MemberInfo.Size(m)
}
func (m *MemberInfo) XXX_DiscardUnknown() {
xxx_messageInfo_MemberInfo.DiscardUnknown(m)
}
var xxx_messageInfo_MemberInfo proto.InternalMessageInfo
func (m *MemberInfo) GetAddr() string {
if m != nil {
return m.Addr
}
return ""
}
func (m *MemberInfo) GetGroupIDs() []string {
if m != nil {
return m.GroupIDs
}
return nil
}
type MemberInfos struct {
MemberList []*MemberInfo `protobuf:"bytes,1,rep,name=memberList,proto3" json:"memberList,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *MemberInfos) Reset() { *m = MemberInfos{} }
func (m *MemberInfos) String() string { return proto.CompactTextString(m) }
func (*MemberInfos) ProtoMessage() {}
func (*MemberInfos) Descriptor() ([]byte, []int) {
return fileDescriptor_21d31c94b62a6ac7, []int{13}
}
func (m *MemberInfos) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_MemberInfos.Unmarshal(m, b)
}
func (m *MemberInfos) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_MemberInfos.Marshal(b, m, deterministic)
}
func (m *MemberInfos) XXX_Merge(src proto.Message) {
xxx_messageInfo_MemberInfos.Merge(m, src)
}
func (m *MemberInfos) XXX_Size() int {
return xxx_messageInfo_MemberInfos.Size(m)
}
func (m *MemberInfos) XXX_DiscardUnknown() {
xxx_messageInfo_MemberInfos.DiscardUnknown(m)
}
var xxx_messageInfo_MemberInfos proto.InternalMessageInfo
func (m *MemberInfos) GetMemberList() []*MemberInfo {
if m != nil {
return m.MemberList
}
return nil
}
type ReqListItem struct {
StartItemID string `protobuf:"bytes,1,opt,name=startItemID,proto3" json:"startItemID,omitempty"`
Count int32 `protobuf:"varint,2,opt,name=count,proto3" json:"count,omitempty"`
Direction int32 `protobuf:"varint,3,opt,name=direction,proto3" json:"direction,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ReqListItem) Reset() { *m = ReqListItem{} }
func (m *ReqListItem) String() string { return proto.CompactTextString(m) }
func (*ReqListItem) ProtoMessage() {}
func (*ReqListItem) Descriptor() ([]byte, []int) {
return fileDescriptor_21d31c94b62a6ac7, []int{14}
}
func (m *ReqListItem) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReqListItem.Unmarshal(m, b)
}
func (m *ReqListItem) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ReqListItem.Marshal(b, m, deterministic)
}
func (m *ReqListItem) XXX_Merge(src proto.Message) {
xxx_messageInfo_ReqListItem.Merge(m, src)
}
func (m *ReqListItem) XXX_Size() int {
return xxx_messageInfo_ReqListItem.Size(m)
}
func (m *ReqListItem) XXX_DiscardUnknown() {
xxx_messageInfo_ReqListItem.DiscardUnknown(m)
}
var xxx_messageInfo_ReqListItem proto.InternalMessageInfo
func (m *ReqListItem) GetStartItemID() string {
if m != nil {
return m.StartItemID
}
return ""
}
func (m *ReqListItem) GetCount() int32 {
if m != nil {
return m.Count
}
return 0
}
func (m *ReqListItem) GetDirection() int32 {
if m != nil {
return m.Direction
}
return 0
}
func init() {
proto.RegisterType((*VoteAction)(nil), "types.VoteAction")
proto.RegisterType((*GroupMember)(nil), "types.GroupMember")
proto.RegisterType((*CreateGroup)(nil), "types.CreateGroup")
proto.RegisterType((*UpdateMember)(nil), "types.UpdateMember")
proto.RegisterType((*GroupInfo)(nil), "types.GroupInfo")
proto.RegisterType((*VoteOption)(nil), "types.VoteOption")
proto.RegisterType((*CreateVote)(nil), "types.CreateVote")
proto.RegisterType((*CommitVote)(nil), "types.CommitVote")
proto.RegisterType((*VoteInfo)(nil), "types.VoteInfo")
proto.RegisterType((*VoteInfos)(nil), "types.VoteInfos")
proto.RegisterType((*GroupVoteInfo)(nil), "types.GroupVoteInfo")
proto.RegisterType((*GroupVoteInfos)(nil), "types.GroupVoteInfos")
proto.RegisterType((*MemberInfo)(nil), "types.MemberInfo")
proto.RegisterType((*MemberInfos)(nil), "types.MemberInfos")
proto.RegisterType((*ReqListItem)(nil), "types.ReqListItem")
}
func init() {
proto.RegisterFile("vote.proto", fileDescriptor_21d31c94b62a6ac7)
}
var fileDescriptor_21d31c94b62a6ac7 = []byte{
// 703 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x55, 0x5f, 0x6b, 0xd4, 0x4e,
0x14, 0x6d, 0xb2, 0xcd, 0xee, 0xe6, 0xa6, 0xed, 0xef, 0xd7, 0xb1, 0x94, 0x20, 0x22, 0x61, 0x1e,
0xa4, 0x60, 0x59, 0x70, 0x0b, 0xa2, 0xe2, 0x83, 0xd5, 0x82, 0x5d, 0xb0, 0x0a, 0x83, 0x7f, 0xf0,
0xcd, 0x74, 0x33, 0xae, 0x01, 0x93, 0x89, 0xc9, 0xec, 0x62, 0x5f, 0x7d, 0x14, 0xfc, 0x28, 0xfa,
0x19, 0x65, 0x6e, 0x66, 0x26, 0x13, 0xb7, 0xa5, 0x7d, 0x9b, 0x7b, 0xe7, 0xdc, 0x3b, 0x77, 0xce,
0x39, 0x93, 0x00, 0xac, 0x84, 0xe4, 0x93, 0xaa, 0x16, 0x52, 0x90, 0x40, 0x5e, 0x54, 0xbc, 0xa1,
0x3f, 0x7c, 0x80, 0xf7, 0x42, 0xf2, 0xe3, 0xb9, 0xcc, 0x45, 0x49, 0x76, 0xc0, 0x97, 0x17, 0xb1,
0x97, 0x78, 0x07, 0x01, 0xf3, 0xe5, 0x05, 0x79, 0x08, 0xd1, 0xbc, 0xe6, 0xa9, 0xe4, 0x2f, 0x6b,
0xb1, 0xac, 0x62, 0x3f, 0xf1, 0x0e, 0xa2, 0x29, 0x99, 0x60, 0xed, 0xe4, 0x45, 0xb7, 0x73, 0xba,
0xc1, 0x5c, 0x20, 0x79, 0x0c, 0x5b, 0xcb, 0x2a, 0x4b, 0x25, 0x3f, 0xe3, 0xc5, 0x39, 0xaf, 0xe3,
0x01, 0x16, 0xde, 0xd2, 0x85, 0xef, 0x9c, 0xad, 0xd3, 0x0d, 0xd6, 0x83, 0x92, 0x23, 0x80, 0xb6,
0x93, 0x1a, 0x2b, 0xde, 0xc4, 0xc2, 0xdd, 0xde, 0x89, 0x6a, 0xe3, 0x74, 0x83, 0x39, 0x30, 0x2c,
0x12, 0x45, 0x91, 0x4b, 0x2c, 0x0a, 0xfa, 0x45, 0x76, 0x03, 0x8b, 0x6c, 0xf4, 0x7c, 0x04, 0xc1,
0x2a, 0xfd, 0xba, 0xe4, 0xf4, 0x18, 0x22, 0x1c, 0x5b, 0x4f, 0x40, 0x60, 0x33, 0xcd, 0xb2, 0x1a,
0x69, 0x08, 0x19, 0xae, 0xc9, 0xdd, 0x96, 0xbc, 0x0f, 0x3c, 0x5f, 0x7c, 0x91, 0xc8, 0xc3, 0x36,
0x73, 0x32, 0x74, 0x01, 0x91, 0x43, 0x87, 0x6a, 0x51, 0xa6, 0x05, 0x37, 0x2d, 0xd4, 0x9a, 0xec,
0xc3, 0x30, 0xcd, 0x8a, 0xbc, 0x6c, 0x62, 0x3f, 0x19, 0x1c, 0x84, 0x4c, 0x47, 0xe4, 0x10, 0x46,
0x05, 0x1e, 0xdc, 0xc4, 0x83, 0x64, 0xe0, 0xf0, 0xeb, 0xcc, 0xc4, 0x0c, 0x84, 0xfe, 0xf4, 0x60,
0xcb, 0xe5, 0x8f, 0xc4, 0x30, 0x5a, 0x28, 0xe0, 0xec, 0x44, 0x9f, 0x66, 0x42, 0x32, 0x05, 0x48,
0xb3, 0xec, 0x4c, 0xf7, 0xf6, 0xaf, 0xec, 0xed, 0xa0, 0xc8, 0x21, 0xec, 0xd6, 0xbc, 0x10, 0x2b,
0xdd, 0xfd, 0x38, 0xcb, 0xf4, 0x58, 0x21, 0x5b, 0xdf, 0xa0, 0xbf, 0x3d, 0x08, 0xb1, 0xd3, 0xac,
0xfc, 0x2c, 0x94, 0x79, 0xec, 0x10, 0xfe, 0xec, 0xc4, 0x92, 0xe0, 0x3b, 0x24, 0xdc, 0x81, 0xb0,
0xbd, 0xc9, 0xeb, 0x65, 0x81, 0xae, 0xd8, 0x66, 0x5d, 0x42, 0xdd, 0x05, 0x45, 0x15, 0x35, 0x0a,
0x1f, 0x32, 0x13, 0x3a, 0xe4, 0x05, 0x57, 0x91, 0x37, 0xbc, 0x9e, 0xbc, 0x27, 0xad, 0xd9, 0xdf,
0x54, 0x68, 0xf6, 0x7d, 0x18, 0x0a, 0x5c, 0xe9, 0x99, 0x75, 0x44, 0xf6, 0x20, 0x68, 0xe6, 0xa2,
0xe6, 0x5a, 0xe6, 0x36, 0xa0, 0x7f, 0x3c, 0x80, 0xce, 0x7f, 0x97, 0x2a, 0xac, 0x4d, 0x82, 0x47,
0x1b, 0x95, 0x9d, 0x0c, 0x49, 0x20, 0x5a, 0xd9, 0xe3, 0x0d, 0xad, 0x6e, 0x8a, 0xdc, 0x83, 0x9d,
0x73, 0xbe, 0xc8, 0xcb, 0xb7, 0x79, 0xc1, 0x1b, 0x99, 0x16, 0x15, 0xf2, 0x30, 0x60, 0xff, 0x64,
0x09, 0x85, 0x2d, 0x5e, 0x66, 0x1d, 0x2a, 0x40, 0x54, 0x2f, 0x47, 0x3f, 0x01, 0x74, 0xd6, 0x57,
0x97, 0x55, 0x07, 0x59, 0x81, 0x74, 0xe4, 0xda, 0xc7, 0xef, 0xdb, 0x27, 0x81, 0xa8, 0x25, 0x64,
0x56, 0x66, 0xfc, 0xbb, 0x16, 0xcb, 0x4d, 0xd1, 0x5f, 0x3e, 0x8c, 0x55, 0xf3, 0x1b, 0xab, 0xef,
0xe8, 0x3b, 0xe8, 0xeb, 0xdb, 0xa7, 0x6e, 0x73, 0x8d, 0xba, 0xa3, 0x3e, 0x75, 0x01, 0x6a, 0x6d,
0x5e, 0x78, 0xa7, 0xe9, 0x75, 0x6c, 0x0e, 0x6f, 0xc4, 0xe6, 0x68, 0x9d, 0x4d, 0x85, 0x51, 0xad,
0xed, 0x73, 0x1a, 0xe3, 0x88, 0xbd, 0x1c, 0x7d, 0x04, 0xa1, 0xa1, 0xa3, 0x21, 0xf7, 0x61, 0xac,
0x36, 0x5f, 0xe5, 0x8d, 0x8c, 0x3d, 0x1c, 0xf7, 0x3f, 0x67, 0x5c, 0x85, 0x61, 0x16, 0x40, 0x3f,
0xc2, 0x36, 0x5e, 0xd4, 0xb2, 0x39, 0x81, 0x70, 0x61, 0x1e, 0x16, 0x92, 0x1a, 0x4d, 0xff, 0x77,
0x9d, 0x8d, 0xf5, 0x1d, 0x44, 0x31, 0xdb, 0x0a, 0x6a, 0x7c, 0x67, 0x42, 0x7a, 0x02, 0x3b, 0xbd,
0xd6, 0x0d, 0x99, 0xea, 0xde, 0xce, 0x68, 0x7b, 0x6e, 0x6f, 0x3b, 0x5f, 0x07, 0xa3, 0x4f, 0x01,
0xda, 0x5b, 0xe2, 0x69, 0x97, 0x7d, 0x21, 0x6f, 0xc3, 0x58, 0x3b, 0xc7, 0x8c, 0x60, 0x63, 0xfa,
0x0c, 0xa2, 0xae, 0xba, 0x21, 0x0f, 0x00, 0xda, 0x17, 0xe9, 0x4c, 0x60, 0xb4, 0xec, 0x70, 0xcc,
0x01, 0xd1, 0x39, 0x44, 0x8c, 0x7f, 0x53, 0xcb, 0x99, 0xe4, 0x85, 0xf2, 0x66, 0x23, 0xd3, 0x1a,
0x03, 0xeb, 0x3a, 0x37, 0xa5, 0x1e, 0xf1, 0x5c, 0x2c, 0xcb, 0xf6, 0x5b, 0x1d, 0xb0, 0x36, 0x50,
0x9f, 0x9f, 0x2c, 0xaf, 0x39, 0xfe, 0xec, 0xd0, 0x82, 0x01, 0xeb, 0x12, 0xe7, 0x43, 0xfc, 0x35,
0x1e, 0xfd, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xf6, 0x6e, 0x23, 0x7c, 0x28, 0x07, 0x00, 0x00,
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment