From ff92c2ca98f22daa33b35b6f06a8499add1a4f05 Mon Sep 17 00:00:00 2001 From: holyxiaoxin Date: Wed, 16 Aug 2023 16:56:03 +0800 Subject: [PATCH 001/150] feat: add application folder to compact --- cmd/cometbft/commands/compact.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/cometbft/commands/compact.go b/cmd/cometbft/commands/compact.go index 327e1dbca68..91092fafc0d 100644 --- a/cmd/cometbft/commands/compact.go +++ b/cmd/cometbft/commands/compact.go @@ -36,7 +36,7 @@ Currently, only GoLevelDB is supported. } func compactGoLevelDBs(rootDir string, logger log.Logger) { - dbNames := []string{"state", "blockstore"} + dbNames := []string{"state", "blockstore", "application"} o := &opt.Options{ DisableSeeksCompaction: true, } From 21fbb3142899ca5a669d934fee6556f353f4cb4c Mon Sep 17 00:00:00 2001 From: Lim Jia Rong Date: Tue, 22 Aug 2023 15:19:28 +0800 Subject: [PATCH 002/150] feat: ability to specify db-names for experimental-compact-goleveldb --- cmd/cometbft/commands/compact.go | 49 +++++++++++++++++++++----------- cmd/cometbft/main.go | 2 +- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/cmd/cometbft/commands/compact.go b/cmd/cometbft/commands/compact.go index 91092fafc0d..65cd382e74d 100644 --- a/cmd/cometbft/commands/compact.go +++ b/cmd/cometbft/commands/compact.go @@ -3,6 +3,7 @@ package commands import ( "errors" "path/filepath" + "strings" "sync" "github.com/spf13/cobra" @@ -13,30 +14,46 @@ import ( "github.com/cometbft/cometbft/libs/log" ) -var CompactGoLevelDBCmd = &cobra.Command{ - Use: "experimental-compact-goleveldb", - Aliases: []string{"experimental_compact_goleveldb"}, - Short: "force compacts the CometBFT storage engine (only GoLevelDB supported)", - Long: ` -This is a temporary utility command that performs a force compaction on the state -and blockstores to reduce disk space for a pruning node. This should only be run +const ( + flagDbNames = "db-names" +) + +func CompactGoLevelDBCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "experimental-compact-goleveldb", + Short: "force compacts the CometBFT storage engine (only GoLevelDB supported)", + Long: ` +This is a temporary utility command that performs a force compaction on the state +and blockstores to reduce disk space for a pruning node. This should only be run once the node has stopped. This command will likely be omitted in the future after the planned refactor to the storage engine. Currently, only GoLevelDB is supported. `, - RunE: func(cmd *cobra.Command, args []string) error { - if config.DBBackend != "goleveldb" { - return errors.New("compaction is currently only supported with goleveldb") - } + RunE: func(cmd *cobra.Command, args []string) error { + if config.DBBackend != "goleveldb" { + return errors.New("compaction is currently only supported with goleveldb") + } + + dbNames, err := cmd.Flags().GetString(flagDbNames) + if err != nil { + return err + } + if dbNames == "" { + return errors.New("--db-names cannot be empty") + } + + compactGoLevelDBs(config.RootDir, strings.Split(dbNames, ","), logger) + return nil + }, + } + + cmd.Flags().String(flagDbNames, "state,blockstore", "the golevel db names in /data to compact, e.g. state,blockstore,application") - compactGoLevelDBs(config.RootDir, logger) - return nil - }, + return cmd } -func compactGoLevelDBs(rootDir string, logger log.Logger) { - dbNames := []string{"state", "blockstore", "application"} +func compactGoLevelDBs(rootDir string, dbNames []string, logger log.Logger) { o := &opt.Options{ DisableSeeksCompaction: true, } diff --git a/cmd/cometbft/main.go b/cmd/cometbft/main.go index 908f2a939d5..438e2af3463 100644 --- a/cmd/cometbft/main.go +++ b/cmd/cometbft/main.go @@ -28,7 +28,7 @@ func main() { cmd.GenNodeKeyCmd, cmd.VersionCmd, cmd.RollbackStateCmd, - cmd.CompactGoLevelDBCmd, + cmd.CompactGoLevelDBCmd(), cmd.InspectCmd, debug.DebugCmd, cli.NewCompletionCmd(rootCmd, true), From ea9fac2335a856b5046fd58b3ef8cd59cbbcef7c Mon Sep 17 00:00:00 2001 From: yan-soon Date: Thu, 1 Feb 2024 15:03:31 +0800 Subject: [PATCH 003/150] port over oracle service --- go.mod | 51 ++- go.sum | 74 ++++ oracle/reactor.go | 210 +++++++++++ oracle/service/adapters/adapters.go | 31 ++ oracle/service/adapters/decimal_handler.go | 82 +++++ oracle/service/adapters/evm_fetcher.go | 122 +++++++ oracle/service/adapters/evm_struct_parser.go | 92 +++++ oracle/service/adapters/evm_value_parser.go | 75 ++++ oracle/service/adapters/fetcher.go | 156 ++++++++ oracle/service/adapters/fetcher_multiple.go | 112 ++++++ oracle/service/adapters/float_handler.go | 74 ++++ oracle/service/adapters/math_filter.go | 148 ++++++++ oracle/service/adapters/median_filter.go | 89 +++++ .../service/adapters/oracle_result_fetcher.go | 125 +++++++ oracle/service/adapters/static_handler.go | 51 +++ oracle/service/adapters/unchanged_handler.go | 81 +++++ .../service/adapters/unresponsive_handler.go | 70 ++++ oracle/service/adapters/weighted_average.go | 90 +++++ oracle/service/parser/parser.go | 101 ++++++ oracle/service/runner/runner.go | 332 ++++++++++++++++++ oracle/service/types/adapter.go | 61 ++++ oracle/service/types/alias.go | 15 + oracle/service/types/app.go | 17 + oracle/service/types/config.go | 9 + oracle/service/types/oracle.go | 134 +++++++ proto/Switcheo/carbon/oracle/oracle.proto | 73 ++++ proto/Switcheo/carbon/oracle/query.proto | 207 +++++++++++ proto/Switcheo/carbon/oracle/slashing.proto | 20 ++ proto/buf.yaml | 3 + redis/generic_value.go | 113 ++++++ redis/redis.go | 64 ++++ redis/service.go | 75 ++++ 32 files changed, 2944 insertions(+), 13 deletions(-) create mode 100644 oracle/reactor.go create mode 100644 oracle/service/adapters/adapters.go create mode 100644 oracle/service/adapters/decimal_handler.go create mode 100644 oracle/service/adapters/evm_fetcher.go create mode 100644 oracle/service/adapters/evm_struct_parser.go create mode 100644 oracle/service/adapters/evm_value_parser.go create mode 100644 oracle/service/adapters/fetcher.go create mode 100644 oracle/service/adapters/fetcher_multiple.go create mode 100644 oracle/service/adapters/float_handler.go create mode 100644 oracle/service/adapters/math_filter.go create mode 100644 oracle/service/adapters/median_filter.go create mode 100644 oracle/service/adapters/oracle_result_fetcher.go create mode 100644 oracle/service/adapters/static_handler.go create mode 100644 oracle/service/adapters/unchanged_handler.go create mode 100644 oracle/service/adapters/unresponsive_handler.go create mode 100644 oracle/service/adapters/weighted_average.go create mode 100644 oracle/service/parser/parser.go create mode 100644 oracle/service/runner/runner.go create mode 100644 oracle/service/types/adapter.go create mode 100644 oracle/service/types/alias.go create mode 100644 oracle/service/types/app.go create mode 100644 oracle/service/types/config.go create mode 100644 oracle/service/types/oracle.go create mode 100644 proto/Switcheo/carbon/oracle/oracle.proto create mode 100644 proto/Switcheo/carbon/oracle/query.proto create mode 100644 proto/Switcheo/carbon/oracle/slashing.proto create mode 100644 redis/generic_value.go create mode 100644 redis/redis.go create mode 100644 redis/service.go diff --git a/go.mod b/go.mod index da6f0c7de42..d5ca9797615 100644 --- a/go.mod +++ b/go.mod @@ -30,9 +30,9 @@ require ( github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa github.com/spf13/cobra v1.6.1 github.com/spf13/viper v1.15.0 - github.com/stretchr/testify v1.8.2 - golang.org/x/crypto v0.7.0 - golang.org/x/net v0.8.0 + github.com/stretchr/testify v1.8.4 + golang.org/x/crypto v0.17.0 + golang.org/x/net v0.18.0 google.golang.org/grpc v1.54.0 ) @@ -52,11 +52,32 @@ require ( github.com/google/uuid v1.3.0 github.com/oasisprotocol/curve25519-voi v0.0.0-20220708102147-0a8a51822cae github.com/vektra/mockery/v2 v2.23.1 - golang.org/x/sync v0.1.0 + golang.org/x/sync v0.5.0 gonum.org/v1/gonum v0.12.0 google.golang.org/protobuf v1.30.0 ) +require ( + cosmossdk.io/math v1.2.0 // indirect + github.com/StackExchange/wmi v1.2.1 // indirect + github.com/bits-and-blooms/bitset v1.10.0 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect + github.com/deckarep/golang-set/v2 v2.1.0 // indirect + github.com/ethereum/c-kzg-4844 v0.4.0 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/holiman/uint256 v1.2.4 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect + github.com/supranational/blst v0.3.11 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.0 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect + rsc.io/tmplfunc v0.0.3 // indirect +) + require ( 4d63.com/gocheckcompilerdirectives v1.2.1 // indirect 4d63.com/gochecknoglobals v0.2.1 // indirect @@ -67,7 +88,7 @@ require ( github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 // indirect github.com/Masterminds/semver v1.5.0 // indirect - github.com/Microsoft/go-winio v0.6.0 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect github.com/OpenPeeDeeP/depguard v1.1.1 // indirect github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 // indirect @@ -110,6 +131,7 @@ require ( github.com/dustin/go-humanize v1.0.1 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/esimonov/ifshort v1.0.4 // indirect + github.com/ethereum/go-ethereum v1.13.11 github.com/ettle/strcase v0.1.1 // indirect github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c // indirect github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 // indirect @@ -126,6 +148,8 @@ require ( github.com/go-git/go-billy/v5 v5.4.1 // indirect github.com/go-logr/logr v1.2.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-redis/redis v6.15.9+incompatible + github.com/go-redsync/redsync/v4 v4.11.0 github.com/go-toolsmith/astcast v1.1.0 // indirect github.com/go-toolsmith/astcopy v1.1.0 // indirect github.com/go-toolsmith/astequal v1.1.0 // indirect @@ -139,7 +163,7 @@ require ( github.com/gofrs/uuid/v5 v5.0.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/glog v1.0.0 // indirect - github.com/golang/snappy v0.0.4 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 // indirect github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe // indirect @@ -195,7 +219,7 @@ require ( github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.17 // indirect - github.com/mattn/go-runewidth v0.0.9 // indirect + github.com/mattn/go-runewidth v0.0.13 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mbilski/exhaustivestruct v1.2.0 // indirect github.com/mgechev/revive v1.3.1 // indirect @@ -257,6 +281,7 @@ require ( github.com/tdakkota/asciicheck v0.2.0 // indirect github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c // indirect github.com/tetafro/godot v1.4.11 // indirect + github.com/tidwall/gjson v1.17.0 github.com/timakin/bodyclose v0.0.0-20221125081123-e39cf3fc478e // indirect github.com/timonwong/loggercheck v0.9.4 // indirect github.com/tomarrell/wrapcheck/v2 v2.8.1 // indirect @@ -275,13 +300,13 @@ require ( go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.10.0 // indirect go.uber.org/zap v1.24.0 // indirect - golang.org/x/exp v0.0.0-20230307190834-24139beb5833 // indirect + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2 // indirect - golang.org/x/mod v0.9.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - golang.org/x/tools v0.7.0 // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/term v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/tools v0.15.0 // indirect google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect diff --git a/go.sum b/go.sum index 4e0c853dbf3..d2f4136780b 100644 --- a/go.sum +++ b/go.sum @@ -39,6 +39,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +cosmossdk.io/math v1.2.0 h1:8gudhTkkD3NxOP2YyyJIYYmt6dQ55ZfJkDOaxXpy7Ig= +cosmossdk.io/math v1.2.0/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Abirdcfly/dupword v0.0.11 h1:z6v8rMETchZXUIuHxYNmlUAuKuB21PeaSymTed16wgU= github.com/Abirdcfly/dupword v0.0.11/go.mod h1:wH8mVGuf3CP5fsBTkfWwwwKTjDnVVCxtU8d8rgeVYXA= @@ -64,6 +66,8 @@ github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYr github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= @@ -72,6 +76,8 @@ github.com/OpenPeeDeeP/depguard v1.1.1 h1:TSUznLjvp/4IUP+OQ0t/4jF4QUyxIcVX8YnghZ github.com/OpenPeeDeeP/depguard v1.1.1/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc= github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 h1:wPbRQzjjwFc0ih8puEVAOFGELsn1zoIIYdxvML7mDxA= github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g= +github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= +github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/acomagu/bufpipe v1.0.4 h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ= github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= @@ -101,6 +107,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= +github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bkielbasa/cyclop v1.2.0 h1:7Jmnh0yL2DjKfw28p86YTd/B4lRGcNuu12sKE35sM7A= github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M= @@ -174,6 +182,10 @@ github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnht github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cometbft/cometbft-db v0.7.0 h1:uBjbrBx4QzU0zOEnU8KxoDl18dMNgDh+zZRUE0ucsbo= github.com/cometbft/cometbft-db v0.7.0/go.mod h1:yiKJIm2WKrt6x8Cyxtq9YTEcIMPcEe4XPxhgX59Fzf0= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= @@ -189,6 +201,8 @@ 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/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDUstnC9DIo= @@ -200,6 +214,8 @@ github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2 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/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= +github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= @@ -242,6 +258,10 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/esimonov/ifshort v1.0.4 h1:6SID4yGWfRae/M7hkVDVVyppy8q/v9OuxNdmjLQStBA= github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= +github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= +github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.11 h1:b51Dsm+rEg7anFRUMGB8hODXHvNfcRKzz9vcj8wSdUs= +github.com/ethereum/go-ethereum v1.13.11/go.mod h1:gFtlVORuUcT+UUIcJ/veCNjkuOSujCi338uSHJrYAew= github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw= github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= @@ -303,6 +323,13 @@ github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg= +github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-redsync/redsync/v4 v4.11.0 h1:OPEcAxHBb95EzfwCKWM93ksOwHd5bTce2BD4+R14N6k= +github.com/go-redsync/redsync/v4 v4.11.0/go.mod h1:ZfayzutkgeBmEmBlUR3j+rF6kN44UUGtEdfzhBFZTPc= github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-toolsmith/astcast v1.1.0 h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8= @@ -373,6 +400,7 @@ github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= @@ -434,6 +462,7 @@ github.com/google/pprof v0.0.0-20230228050547-1710fef4ab10 h1:CqYfpuYIjnlNxM3msd github.com/google/pprof v0.0.0-20230228050547-1710fef4ab10/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -471,6 +500,8 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= @@ -582,6 +613,7 @@ github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPn github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.14.9 h1:10HX2Td0ocZpYEjhilsuo6WWtUqttj2Kb0KtD86/KYA= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= @@ -597,7 +629,10 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/avo v0.5.0/go.mod h1:ChHFdoV7ql95Wi7vuq2YT1bwCJqiWdZrQ1im3VujLYM= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/moby/term v0.0.0-20221205130635-1aeaba878587 h1:HfkjXDfhgVaN5rmueG8cL8KKeFNecRCXFhaJ2qZ5SKA= github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= @@ -721,6 +756,7 @@ github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4l github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= @@ -754,6 +790,8 @@ github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= @@ -821,8 +859,11 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= @@ -838,10 +879,20 @@ github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpR github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= github.com/tetafro/godot v1.4.11 h1:BVoBIqAf/2QdbFmSwAWnaIqDivZdOV0ZRwEm6jivLKw= github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= +github.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM= +github.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/timakin/bodyclose v0.0.0-20221125081123-e39cf3fc478e h1:MV6KaVu/hzByHP0UvJ4HcMGE/8a6A4Rggc/0wx2AvJo= github.com/timakin/bodyclose v0.0.0-20221125081123-e39cf3fc478e/go.mod h1:27bSVNWSBOHm+qRp1T9qzaIpsWEP6TbUnei/43HK+PQ= github.com/timonwong/loggercheck v0.9.4 h1:HKKhqrjcVj8sxL7K77beXh0adEm6DLjV/QOGeMXEVi4= github.com/timonwong/loggercheck v0.9.4/go.mod h1:caz4zlPcgvpEkXgVnAJGowHAMW2NwHaNlpS8xDbVhTg= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tomarrell/wrapcheck/v2 v2.8.1 h1:HxSqDSN0sAt0yJYsrcYVoEeyM4aI9yAm3KQpIXDJRhQ= github.com/tomarrell/wrapcheck/v2 v2.8.1/go.mod h1:/n2Q3NZ4XFT50ho6Hbxg+RV1uyo2Uow/Vdm9NQcl5SE= github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw= @@ -919,6 +970,8 @@ golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -931,6 +984,8 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20230307190834-24139beb5833 h1:SChBja7BCQewoTAU7IgvucQKMIXrEpFxNMs0spT3/5s= golang.org/x/exp v0.0.0-20230307190834-24139beb5833/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2 h1:J74nGeMgeFnYQJN59eFwh06jX/V8g0lB7LWpjSLxtgU= @@ -967,6 +1022,8 @@ golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1018,6 +1075,8 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= +golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1042,6 +1101,9 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1060,6 +1122,7 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1128,6 +1191,10 @@ golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1138,6 +1205,7 @@ golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1152,6 +1220,8 @@ golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1230,6 +1300,8 @@ golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= +golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1384,3 +1456,5 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8 rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/oracle/reactor.go b/oracle/reactor.go new file mode 100644 index 00000000000..72e942721e1 --- /dev/null +++ b/oracle/reactor.go @@ -0,0 +1,210 @@ +package oracle + +import ( + "errors" + "fmt" + "time" + + cfg "github.com/cometbft/cometbft/config" + "github.com/cometbft/cometbft/libs/clist" + "github.com/cometbft/cometbft/libs/log" + "github.com/cometbft/cometbft/p2p" + protomem "github.com/cometbft/cometbft/proto/tendermint/mempool" + "github.com/cometbft/cometbft/types" +) + +// Reactor handles mempool tx broadcasting amongst peers. +// It maintains a map from peer ID to counter, to prevent gossiping txs to the +// peers you received it from. +type Reactor struct { + p2p.BaseReactor + config *cfg.MempoolConfig + mempool *CListMempool + ids *mempoolIDs +} + +// NewReactor returns a new Reactor with the given config and mempool. +func NewReactor(config *cfg.MempoolConfig, mempool *CListMempool) *Reactor { + memR := &Reactor{ + config: config, + mempool: mempool, + ids: newMempoolIDs(), + } + memR.BaseReactor = *p2p.NewBaseReactor("Mempool", memR) + return memR +} + +// InitPeer implements Reactor by creating a state for the peer. +func (memR *Reactor) InitPeer(peer p2p.Peer) p2p.Peer { + memR.ids.ReserveForPeer(peer) + return peer +} + +// SetLogger sets the Logger on the reactor and the underlying mempool. +func (memR *Reactor) SetLogger(l log.Logger) { + memR.Logger = l + memR.mempool.SetLogger(l) +} + +// OnStart implements p2p.BaseReactor. +func (memR *Reactor) OnStart() error { + if !memR.config.Broadcast { + memR.Logger.Info("Tx broadcasting is disabled") + } + return nil +} + +// GetChannels implements Reactor by returning the list of channels for this +// reactor. +func (memR *Reactor) GetChannels() []*p2p.ChannelDescriptor { + largestTx := make([]byte, memR.config.MaxTxBytes) + batchMsg := protomem.Message{ + Sum: &protomem.Message_Txs{ + Txs: &protomem.Txs{Txs: [][]byte{largestTx}}, + }, + } + + return []*p2p.ChannelDescriptor{ + { + ID: MempoolChannel, + Priority: 5, + RecvMessageCapacity: batchMsg.Size(), + MessageType: &protomem.Message{}, + }, + } +} + +// AddPeer implements Reactor. +// It starts a broadcast routine ensuring all txs are forwarded to the given peer. +func (memR *Reactor) AddPeer(peer p2p.Peer) { + if memR.config.Broadcast { + go memR.broadcastTxRoutine(peer) + } +} + +// RemovePeer implements Reactor. +func (memR *Reactor) RemovePeer(peer p2p.Peer, _ interface{}) { + memR.ids.Reclaim(peer) + // broadcast routine checks if peer is gone and returns +} + +// Receive implements Reactor. +// It adds any received transactions to the mempool. +func (memR *Reactor) Receive(e p2p.Envelope) { + memR.Logger.Debug("Receive", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) + switch msg := e.Message.(type) { + case *protomem.Txs: + protoTxs := msg.GetTxs() + if len(protoTxs) == 0 { + memR.Logger.Error("received empty txs from peer", "src", e.Src) + return + } + txInfo := TxInfo{SenderID: memR.ids.GetForPeer(e.Src)} + if e.Src != nil { + txInfo.SenderP2PID = e.Src.ID() + } + + var err error + for _, tx := range protoTxs { + ntx := types.Tx(tx) + err = memR.mempool.CheckTx(ntx, nil, txInfo) + if errors.Is(err, ErrTxInCache) { + memR.Logger.Debug("Tx already exists in cache", "tx", ntx.String()) + } else if err != nil { + memR.Logger.Info("Could not check tx", "tx", ntx.String(), "err", err) + } + } + default: + memR.Logger.Error("unknown message type", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) + memR.Switch.StopPeerForError(e.Src, fmt.Errorf("mempool cannot handle message of type: %T", e.Message)) + return + } + + // broadcasting happens from go routines per peer +} + +// PeerState describes the state of a peer. +type PeerState interface { + GetHeight() int64 +} + +// Send new mempool txs to peer. +func (memR *Reactor) broadcastTxRoutine(peer p2p.Peer) { + peerID := memR.ids.GetForPeer(peer) + var next *clist.CElement + + for { + // In case of both next.NextWaitChan() and peer.Quit() are variable at the same time + if !memR.IsRunning() || !peer.IsRunning() { + return + } + // This happens because the CElement we were looking at got garbage + // collected (removed). That is, .NextWait() returned nil. Go ahead and + // start from the beginning. + if next == nil { + select { + case <-memR.mempool.TxsWaitChan(): // Wait until a tx is available + if next = memR.mempool.TxsFront(); next == nil { + continue + } + case <-peer.Quit(): + return + case <-memR.Quit(): + return + } + } + + // Make sure the peer is up to date. + peerState, ok := peer.Get(types.PeerStateKey).(PeerState) + if !ok { + // Peer does not have a state yet. We set it in the consensus reactor, but + // when we add peer in Switch, the order we call reactors#AddPeer is + // different every time due to us using a map. Sometimes other reactors + // will be initialized before the consensus reactor. We should wait a few + // milliseconds and retry. + time.Sleep(PeerCatchupSleepIntervalMS * time.Millisecond) + continue + } + + // Allow for a lag of 1 block. + memTx := next.Value.(*mempoolTx) + if peerState.GetHeight() < memTx.Height()-1 { + time.Sleep(PeerCatchupSleepIntervalMS * time.Millisecond) + continue + } + + // NOTE: Transaction batching was disabled due to + // https://github.com/tendermint/tendermint/issues/5796 + + if !memTx.isSender(peerID) { + success := peer.Send(p2p.Envelope{ + ChannelID: MempoolChannel, + Message: &protomem.Txs{Txs: [][]byte{memTx.tx}}, + }) + if !success { + time.Sleep(PeerCatchupSleepIntervalMS * time.Millisecond) + continue + } + } + + select { + case <-next.NextWaitChan(): + // see the start of the for loop for nil check + next = next.Next() + case <-peer.Quit(): + return + case <-memR.Quit(): + return + } + } +} + +// TxsMessage is a Message containing transactions. +type TxsMessage struct { + Txs []types.Tx +} + +// String returns a string representation of the TxsMessage. +func (m *TxsMessage) String() string { + return fmt.Sprintf("[TxsMessage %v]", m.Txs) +} diff --git a/oracle/service/adapters/adapters.go b/oracle/service/adapters/adapters.go new file mode 100644 index 00000000000..0c01dc66ebb --- /dev/null +++ b/oracle/service/adapters/adapters.go @@ -0,0 +1,31 @@ +package adapters + +import ( + "github.com/cometbft/cometbft/oracle/service/types" + "github.com/cometbft/cometbft/redis" + log "github.com/sirupsen/logrus" + "google.golang.org/grpc" +) + +// GetAdapterMap returns a map of all adapters +func GetAdapterMap(grpcClient *grpc.ClientConn, redisService *redis.Service) map[string]types.Adapter { + adapterMap := make(map[string]types.Adapter) + adaptersList := []types.Adapter{ + NewFetcher(grpcClient, redisService), NewFetcherMultiple(grpcClient, redisService), + NewUnresponsiveHandler(grpcClient, redisService), NewUnchangedHandler(grpcClient, redisService), + NewMedianFilter(grpcClient, redisService), NewWeightedAverage(grpcClient, redisService), + NewFloatHandler(grpcClient, redisService), NewDecimalHandler(grpcClient, redisService), + NewMathFilter(grpcClient, redisService), NewOracleResultFetcher(grpcClient, redisService), + NewEVMStructParser(grpcClient, redisService), NewEVMFetcher(grpcClient, redisService), + NewStaticHandler(grpcClient, redisService), + } + for _, adapter := range adaptersList { + _, existing := adapterMap[adapter.Id()] + if existing { + log.Errorf("Duplicate ID for %s, ignoring duplicate", adapter.Id()) + continue + } + adapterMap[adapter.Id()] = adapter + } + return adapterMap +} diff --git a/oracle/service/adapters/decimal_handler.go b/oracle/service/adapters/decimal_handler.go new file mode 100644 index 00000000000..3211c77b3df --- /dev/null +++ b/oracle/service/adapters/decimal_handler.go @@ -0,0 +1,82 @@ +package adapters + +import ( + "fmt" + + sdkmath "cosmossdk.io/math" + "github.com/cometbft/cometbft/oracle/service/types" + "github.com/cometbft/cometbft/redis" + "google.golang.org/grpc" +) + +// DecimalHandler struct for decimal handler +type DecimalHandler struct { + grpcClient *grpc.ClientConn + redisService *redis.Service +} + +func NewDecimalHandler(grpcClient *grpc.ClientConn, redisService *redis.Service) *DecimalHandler { + return &DecimalHandler{ + grpcClient: grpcClient, + redisService: redisService, + } +} + +// Id returns float handler Id +func (handler *DecimalHandler) Id() string { + return "decimal_handler" +} + +// Validate validate job config +func (handler *DecimalHandler) Validate(job types.OracleJob) error { + op := job.ConfigValue("operation").String() + switch op { + case "decrease", "increase": + // check the exponent is a valid uint + job.ConfigValue("exponent").Uint64() + default: + return fmt.Errorf("unsupported operation '%s'", op) + } + return nil +} + +// ShiftDecimalLeft - Shift decimal point to the left by exponent +func ShiftDecimalLeft(value sdkmath.LegacyDec, exponent uint64) string { + multiplier := sdkmath.NewIntWithDecimal(1, int(exponent)) + return value.QuoInt(multiplier).String() +} + +// ShiftDecimalRight - Shift decimal point to the right by exponent +func ShiftDecimalRight(value sdkmath.LegacyDec, exponent uint64) string { + multiplier := sdkmath.NewIntWithDecimal(1, int(exponent)) + return value.MulInt(multiplier).String() +} + +// Perform handles float operations +func (handler *DecimalHandler) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, _ *types.AdapterStore) (types.AdapterResult, error) { + input := job.GetInput(result) + if input.IsEmpty() { + return result, fmt.Errorf("%s: input cannot be empty", job.InputId) + } + inputDec, err := sdkmath.LegacyNewDecFromStr(input.String()) + if err != nil { + return result, err + } + + var output redis.GenericValue + op := job.ConfigValue("operation").String() + exponent := job.ConfigValue("exponent").Uint64() + + switch op { + case "decrease": + output = types.StringToGenericValue(ShiftDecimalLeft(inputDec, exponent)) + case "increase": + output = types.StringToGenericValue(ShiftDecimalRight(inputDec, exponent)) + default: + panic("unsupported operation: " + op) + } + + job.SetOutput(result, output) + + return result, nil +} diff --git a/oracle/service/adapters/evm_fetcher.go b/oracle/service/adapters/evm_fetcher.go new file mode 100644 index 00000000000..dbff1a4a94b --- /dev/null +++ b/oracle/service/adapters/evm_fetcher.go @@ -0,0 +1,122 @@ +package adapters + +import ( + "context" + "encoding/hex" + "fmt" + "net/url" + + "github.com/cometbft/cometbft/oracle/service/types" + "github.com/cometbft/cometbft/redis" + "github.com/ethereum/go-ethereum" + ethcommon "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/ethclient" + log "github.com/sirupsen/logrus" + "google.golang.org/grpc" +) + +// EVMFetcher struct for evmFetcher +type EVMFetcher struct { + grpcClient *grpc.ClientConn + redisService *redis.Service +} + +func NewEVMFetcher(grpcClient *grpc.ClientConn, redisService *redis.Service) *EVMFetcher { + return &EVMFetcher{ + grpcClient: grpcClient, + redisService: redisService, + } +} + +// Id returns evmFetcher Id +func (evmFetcher *EVMFetcher) Id() string { + return "evm_fetcher" +} + +// Validate validate job config +func (evmFetcher *EVMFetcher) Validate(job types.OracleJob) error { + address := job.ConfigValue("address") + calldata := job.ConfigValue("calldata") + nodeRpc := job.ConfigValue("default_node_rpc") + nodeKey := job.ConfigValue("custom_node_url_key") + switch { + case address.IsEmpty(): + return fmt.Errorf("address cannot be blank") + case calldata.IsEmpty(): + return fmt.Errorf("calldata cannot be blank") + case nodeRpc.IsEmpty(): + return fmt.Errorf("default_node_rpc cannot be blank") + case nodeKey.IsEmpty(): + return fmt.Errorf("custom_node_url_key cannot be blank") + } + return nil +} + +// GetRpcUrl attempts to get the rpc url from config file, if not it populates the config file with the default rpc url +func GetRpcUrl(job types.OracleJob, config types.Config) (string, error) { + rpcUrl := job.ConfigValue("default_node_rpc").String() + nodeKey := job.ConfigValue("custom_node_url_key").String() + + customNode, exists := config[nodeKey] + + if exists && customNode.Host != "" { + rpcUrl = customNode.Host + url, err := url.Parse(rpcUrl) + if err != nil { + log.Warnf("%s: evm_fetcher: error parsing custom rpc url, using default url instead: %s", nodeKey, err) + } else { + return url.String(), nil + } + } + + url, err := url.Parse(rpcUrl) + if err != nil { + return "", fmt.Errorf("evm_fetcher: error parsing default rpc url: %s", err) + } + + return url.String(), nil +} + +// Perform performs a network request +func (evmFetcher *EVMFetcher) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, _ *types.AdapterStore) (types.AdapterResult, error) { + rpcUrl, err := GetRpcUrl(job, runTimeInput.Config) + if err != nil { + return result, err + } + client, err := ethclient.Dial(rpcUrl) + if err != nil { + return result, err + } + + addrStr := job.ConfigValue("address").String() + addr, err := hexutil.Decode(addrStr) + if err != nil { + return result, err + } + ethAddr := ethcommon.BytesToAddress(addr) + + calldataStr := job.ConfigValue("calldata").String() + data, err := hexutil.Decode(calldataStr) + if err != nil { + return result, err + } + + msg := ethereum.CallMsg{ + To: ðAddr, + Data: data, + } + rsp, err := client.CallContract(context.Background(), msg, nil) + if err != nil { + return result, err + } + + rspHexStr := hex.EncodeToString(rsp) + genericValue := types.StringToGenericValue(rspHexStr) + if err != nil { + return result, err + } + + result = job.SetOutput(result, genericValue) + return result, nil +} diff --git a/oracle/service/adapters/evm_struct_parser.go b/oracle/service/adapters/evm_struct_parser.go new file mode 100644 index 00000000000..1c8f6b3303d --- /dev/null +++ b/oracle/service/adapters/evm_struct_parser.go @@ -0,0 +1,92 @@ +package adapters + +import ( + "encoding/hex" + "fmt" + "math/big" + + sdkmath "cosmossdk.io/math" + "github.com/cometbft/cometbft/oracle/service/types" + "github.com/cometbft/cometbft/redis" + "github.com/ethereum/go-ethereum/accounts/abi" + "google.golang.org/grpc" +) + +// EVMStructParser struct for evmStructParser +type EVMStructParser struct { + grpcClient *grpc.ClientConn + redisService *redis.Service +} + +func NewEVMStructParser(grpcClient *grpc.ClientConn, redisService *redis.Service) *EVMStructParser { + return &EVMStructParser{ + grpcClient: grpcClient, + redisService: redisService, + } +} + +// Id returns evmStructParser Id +func (evmStructParser *EVMStructParser) Id() string { + return "evm_struct_parser" +} + +// Validate validate job config +func (evmStructParser *EVMStructParser) Validate(job types.OracleJob) error { + outputStruct := job.ConfigValue("output_struct") + outputType := job.ConfigValue("output_type") + outputIndex := job.ConfigValue("output_index") + switch { + case outputStruct.IsEmpty(): + return fmt.Errorf("%s: output_struct cannot be blank", job.OutputId) + case outputIndex.IsEmpty(): + return fmt.Errorf("%s: output_index cannot be blank", job.OutputId) + case outputType.IsEmpty(): + return fmt.Errorf("%s: output_type cannot be blank", job.OutputId) + } + return nil +} + +func ParseEvmStructResponse(outputType string, outputStruct []string, outputIndex int64, evmResponse []byte) (redis.GenericValue, error) { + args := abi.Arguments{} + for _, argType := range outputStruct { + abiType, err := abi.NewType(argType, "", nil) + if err != nil { + panic(err) + } + args = append(args, abi.Argument{Type: abiType}) + } + responseInterface, err := args.Unpack(evmResponse) + if err != nil { + return types.StringToGenericValue(""), err + } + resultInterface := responseInterface[outputIndex] + switch outputType { + case "uint256": + z := new(big.Int) + z.SetString(fmt.Sprint(resultInterface), 10) + sdkInt := sdkmath.NewIntFromBigInt(z) + return types.StringToGenericValue(sdkInt.String()), nil + default: + return types.StringToGenericValue(""), fmt.Errorf("unsupported operation: %s", outputType) + } +} + +// Perform performs a network request +func (evmStructParser *EVMStructParser) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, _ *types.AdapterStore) (types.AdapterResult, error) { + rspHexStr := job.GetInput(result).String() + rsp, err := hex.DecodeString(rspHexStr) + if err != nil { + return result, err + } + outputType := job.ConfigValue("output_type").String() + outputStruct := job.ConfigValue("output_struct").StringArray() + outputIndex := job.ConfigValue("output_index").Int64() + + genericValue, err := ParseEvmStructResponse(outputType, outputStruct, outputIndex, rsp) + if err != nil { + return result, err + } + + result = job.SetOutput(result, genericValue) + return result, nil +} diff --git a/oracle/service/adapters/evm_value_parser.go b/oracle/service/adapters/evm_value_parser.go new file mode 100644 index 00000000000..609151e1e08 --- /dev/null +++ b/oracle/service/adapters/evm_value_parser.go @@ -0,0 +1,75 @@ +package adapters + +import ( + "encoding/hex" + "fmt" + "math/big" + + sdkmath "cosmossdk.io/math" + "github.com/cometbft/cometbft/oracle/service/types" + "github.com/cometbft/cometbft/redis" + "github.com/holiman/uint256" + "google.golang.org/grpc" +) + +// EVMValueParser struct for evmValueParser +type EVMValueParser struct { + grpcClient *grpc.ClientConn + redisService *redis.Service +} + +func NewEVMValueParser(grpcClient *grpc.ClientConn, redisService *redis.Service) *EVMValueParser { + return &EVMValueParser{ + grpcClient: grpcClient, + redisService: redisService, + } +} + +// Id returns evmValueParser Id +func (evmValueParser *EVMValueParser) Id() string { + return "evm_value_parser" +} + +// Validate validate job config +func (evmValueParser *EVMValueParser) Validate(job types.OracleJob) error { + outputType := job.ConfigValue("output_type") + switch { + case outputType.IsEmpty(): + return fmt.Errorf("%s: outputType cannot be blank", job.OutputId) + } + return nil +} + +func ParseSingleEvmResponse(outputType string, evmResponse []byte) (redis.GenericValue, error) { + switch outputType { + case "uint256": + z := new(big.Int) + z.SetBytes(evmResponse) + _, overflow := uint256.FromBig(z) + if overflow { + panic("number is more than uint256") + } + sdkInt := sdkmath.NewIntFromBigInt(z) + return types.StringToGenericValue(sdkInt.String()), nil + default: + panic("unsupported operation: " + outputType) + } +} + +// Perform performs a network request +func (evmValueParser *EVMValueParser) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, _ *types.AdapterStore) (types.AdapterResult, error) { + rspHexStr := job.GetInput(result).String() + rsp, err := hex.DecodeString(rspHexStr) + if err != nil { + return result, err + } + outputType := job.ConfigValue("output_type").String() + + genericValue, err := ParseSingleEvmResponse(outputType, rsp) + if err != nil { + return result, err + } + + result = job.SetOutput(result, genericValue) + return result, nil +} diff --git a/oracle/service/adapters/fetcher.go b/oracle/service/adapters/fetcher.go new file mode 100644 index 00000000000..1580ace7546 --- /dev/null +++ b/oracle/service/adapters/fetcher.go @@ -0,0 +1,156 @@ +package adapters + +import ( + "bytes" + "fmt" + "io/ioutil" + "net/http" + "time" + + "github.com/cometbft/cometbft/oracle/service/types" + "github.com/cometbft/cometbft/redis" + "github.com/go-redsync/redsync/v4" + "github.com/go-redsync/redsync/v4/redis/goredis" + log "github.com/sirupsen/logrus" + "github.com/tidwall/gjson" + "google.golang.org/grpc" +) + +// Fetcher struct for fetcher +type Fetcher struct { + grpcClient *grpc.ClientConn + redisService *redis.Service +} + +func NewFetcher(grpcClient *grpc.ClientConn, redisService *redis.Service) *Fetcher { + return &Fetcher{ + grpcClient: grpcClient, + redisService: redisService, + } +} + +// Id returns fetcher Id +func (fetcher *Fetcher) Id() string { + return "fetcher" +} + +// Validate validate job config +func (fetcher *Fetcher) Validate(job types.OracleJob) error { + url := job.ConfigValue("url") + timeout := job.ConfigValue("timeout") + path := job.ConfigValue("path") + switch { + case url.IsEmpty(): + return fmt.Errorf("url cannot be blank") + case timeout.Uint64() == 0: + return fmt.Errorf("invalid timeout") + case path.IsEmpty(): + return fmt.Errorf("path cannot be blank") + } + return nil +} + +// Perform performs a network request +func (fetcher *Fetcher) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, _ *types.AdapterStore) (types.AdapterResult, error) { + url := job.ConfigValue("url").String() + timeout := job.ConfigValue("timeout").Uint64() + reqBody := job.ConfigValue("request_body").String() + + responseStr := getUrlResponse(url, timeout, reqBody) + if responseStr == "" { + return result, fmt.Errorf("empty response for %s", url) + } + + output := "" + path := job.ConfigValue("path").String() + if path != "" { + value := gjson.Get(responseStr, job.ConfigValue("path").String()) + output = value.String() + } + + if output == "" { + log.Warnln("empty output for " + url) + } + + result = job.SetOutput(result, types.StringToGenericValue(output)) + return result, nil +} + +// getUrlResponse attempts to get a url response from redis cache +// if redis cache is empty, it will make a http call and populate redis with the url as key +func getUrlResponse(url string, timeout uint64, reqBody string) string { + redService := redis.NewService(0) + defer redService.Client.Close() + pool := goredis.NewPool(redService.Client) + + // Create an instance of redisync to be used to obtain a mutual exclusion + // lock. + rs := redsync.New(pool) + + lockKey := GetUrlFetcherLockKey(url) + locker := rs.NewMutex(lockKey, redsync.WithTries(50), redsync.WithExpiry(time.Second*5), redsync.WithRetryDelay(time.Millisecond*100)) + + if err := locker.Lock(); err != nil { + return "" + } + + urlResponseKey := GetUrlFetcherResponseKey(url) + + outputGeneric, ok, err := redService.Get(urlResponseKey) + if err == nil && ok { + if ok, err := locker.Unlock(); !ok || err != nil { + panic(fmt.Sprintf("getUrlResponse: unlock failed: %s", err.Error())) + } + return outputGeneric.String() + } + + httpClient := http.Client{ + Timeout: time.Duration(timeout) * time.Second, + } + + var response *http.Response + + //nolint: bodyclose // ignore lint error for response.Body.Close() being outside of if else block + // if reqBody is present, perform post request instead + if reqBody != "" { + response, err = httpClient.Post(url, "application/json", bytes.NewBuffer([]byte(reqBody))) + } else { + response, err = httpClient.Get(url) + } + + if err != nil { + return "" + } + + defer response.Body.Close() + + body, readErr := ioutil.ReadAll(response.Body) + + if readErr != nil { + return "" + } + + output := string(body) + + if err := redService.SetNX(urlResponseKey, types.StringToGenericValue(output), time.Second*5); err != nil { + log.Warnf("getUrlResponse: failed to set response cache on redis for oracle: %s, %e", urlResponseKey, err) + return output + } + + if ok, err := locker.Unlock(); !ok || err != nil { + log.Warnf("getUrlResponse: failed to unlock response cache mutex for oracle: %v, %s, %e", ok, urlResponseKey, err) + return output + } + + return output +} + +// GetUrlFetcherLockKey returns the lock key for a given url +func GetUrlFetcherLockKey(url string) string { + return fmt.Sprintf("oracle:url-lock:%s", url) +} + +// GetUrlFetcherResponseKey returns the response key for a given url +func GetUrlFetcherResponseKey(url string) string { + return fmt.Sprintf("oracle:url-response:%s", url) +} diff --git a/oracle/service/adapters/fetcher_multiple.go b/oracle/service/adapters/fetcher_multiple.go new file mode 100644 index 00000000000..c2965f7ff9a --- /dev/null +++ b/oracle/service/adapters/fetcher_multiple.go @@ -0,0 +1,112 @@ +package adapters + +import ( + "fmt" + neturl "net/url" + + "github.com/cometbft/cometbft/oracle/service/types" + "github.com/cometbft/cometbft/redis" + log "github.com/sirupsen/logrus" + "github.com/tidwall/gjson" + "google.golang.org/grpc" +) + +// FetcherMultiple struct for fetcherMultiple +type FetcherMultiple struct { + grpcClient *grpc.ClientConn + redisService *redis.Service +} + +func NewFetcherMultiple(grpcClient *grpc.ClientConn, redisService *redis.Service) *FetcherMultiple { + return &FetcherMultiple{ + grpcClient: grpcClient, + redisService: redisService, + } +} + +// Id returns fetcherMultiple Id +func (fetcherMultiple *FetcherMultiple) Id() string { + return "fetcher_multiple" +} + +// Validate validate job config +func (fetcherMultiple *FetcherMultiple) Validate(job types.OracleJob) error { + node_key := job.ConfigValue("custom_node_url_key") + timeout := job.ConfigValue("timeout") + paths := job.ConfigValue("paths").StringArray() + switch { + case node_key.IsEmpty(): + return fmt.Errorf("custom_node_url_key cannot be blank") + case timeout.Uint64() == 0: + return fmt.Errorf("invalid timeout") + case len(paths) == 0: + return fmt.Errorf("no paths") + } + return nil +} + +func GetUrl(job types.OracleJob, config types.Config) (string, error) { + nodeHost := job.ConfigValue("default_node_host").String() + nodePath := job.ConfigValue("default_node_path").String() + nodeKey := job.ConfigValue("custom_node_url_key").String() + + customNode, exists := config[nodeKey] + + if exists && customNode.Host != "" && customNode.Path != "" { + nodeHost = customNode.Host + nodePath = customNode.Path + baseUrl, err := neturl.Parse(nodeHost) + if err != nil { + log.Warnf("%s: fetcher_multiple: error parsing custom url, using default url instead: %s", nodeKey, err) + } else { + url := baseUrl.String() + nodePath + return url, nil + } + } + + baseUrl, err := neturl.Parse(nodeHost) + if err != nil { + return "", fmt.Errorf("fetcher_multiple: error parsing default url: %s", err) + } + url := baseUrl.String() + nodePath + + return url, nil +} + +// Perform performs a network request +func (fetcherMultiple *FetcherMultiple) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, _ *types.AdapterStore) (types.AdapterResult, error) { + url, err := GetUrl(job, runTimeInput.Config) + if err != nil { + return result, err + } + + timeout := job.ConfigValue("timeout").Uint64() + reqBody := job.ConfigValue("request_body").String() + + responseStr := getUrlResponse(url, timeout, reqBody) + if responseStr == "" { + return result, fmt.Errorf("empty response from %s", url) + } + + paths := job.ConfigValue("paths").StringArray() + outputs := []string{} + for idx := range paths { + output := "" + if paths[idx] != "" { + value := gjson.Get(responseStr, paths[idx]) + output = value.String() + } + + if output == "" { + result = job.SetOutput(result, types.StringToGenericValue("")) + return result, fmt.Errorf("empty output for %s at %s", url, paths[idx]) + } + outputs = append(outputs, output) + } + if len(paths) == 1 { + result = job.SetOutput(result, types.StringToGenericValue(outputs[0])) + return result, nil + } + result = job.SetOutputList(result, outputs) + return result, nil +} diff --git a/oracle/service/adapters/float_handler.go b/oracle/service/adapters/float_handler.go new file mode 100644 index 00000000000..bd9104a73b4 --- /dev/null +++ b/oracle/service/adapters/float_handler.go @@ -0,0 +1,74 @@ +package adapters + +import ( + "fmt" + + "cosmossdk.io/math" + "github.com/cometbft/cometbft/oracle/service/types" + "github.com/cometbft/cometbft/redis" + "google.golang.org/grpc" +) + +// FloatHandler struct for float handler +type FloatHandler struct { + grpcClient *grpc.ClientConn + redisService *redis.Service +} + +func NewFloatHandler(grpcClient *grpc.ClientConn, redisService *redis.Service) *FloatHandler { + return &FloatHandler{ + grpcClient: grpcClient, + redisService: redisService, + } +} + +// Id returns float handler Id +func (handler *FloatHandler) Id() string { + return "float_handler" +} + +// Validate validate job config +func (handler *FloatHandler) Validate(job types.OracleJob) error { + op := job.ConfigValue("operation").String() + switch op { + case "round": + // check the precision is a valid uint + job.ConfigValue("precision").Uint64() + default: + return fmt.Errorf("unsupported operation: '%s'", op) + } + return nil +} + +// Round round to the specified precision +func Round(value math.LegacyDec, precision uint64) string { + multiplier := math.NewIntWithDecimal(1, int(precision)) + val := math.LegacyNewDecFromInt(value.MulInt(multiplier).RoundInt()).QuoInt(multiplier) + return val.String() +} + +// Perform handles float operations +func (handler *FloatHandler) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, _ *types.AdapterStore) (types.AdapterResult, error) { + input := job.GetInput(result) + if input.IsEmpty() { + return result, fmt.Errorf("%s: input cannot be empty", job.InputId) + } + value, err := math.LegacyNewDecFromStr(input.String()) + if err != nil { + return result, err + } + + var output redis.GenericValue + op := job.ConfigValue("operation").String() + switch op { + case "round": + rounded := Round(value, job.ConfigValue("precision").Uint64()) + output = types.StringToGenericValue(rounded) + default: + panic(fmt.Sprintf("unsupported operation: %s", op)) + } + + job.SetOutput(result, output) + + return result, nil +} diff --git a/oracle/service/adapters/math_filter.go b/oracle/service/adapters/math_filter.go new file mode 100644 index 00000000000..97d611f061f --- /dev/null +++ b/oracle/service/adapters/math_filter.go @@ -0,0 +1,148 @@ +package adapters + +import ( + "fmt" + + "github.com/cometbft/cometbft/redis" + + sdkmath "cosmossdk.io/math" + "github.com/cometbft/cometbft/oracle/service/types" + "google.golang.org/grpc" +) + +// MathFilter struct for float handler +type MathFilter struct { + grpcClient *grpc.ClientConn + redisService *redis.Service +} + +func NewMathFilter(grpcClient *grpc.ClientConn, redisService *redis.Service) *MathFilter { + return &MathFilter{ + grpcClient: grpcClient, + redisService: redisService, + } +} + +// Id returns math filter Id +func (handler *MathFilter) Id() string { + return "math_filter" +} + +var SUPPORTED_OPS = []string{"divide", "/", "multiply", "*", "add", "+", "subtract", "-", "min", "max"} + +// Validate validate job config +func (handler *MathFilter) Validate(job types.OracleJob) error { + _, err := getOperations(job) + if err != nil { + return err + } + return nil +} + +// getOperations returns the array of operations to be performed. +// Ops can either be a single string or an array of strings, the single string is to keep backwards compatibility, +// specs should use array of strings even if just for a single operation e.g. ["divide"] +func getOperations(job types.OracleJob) ([]string, error) { + ops := []string{job.ConfigValue("operation").String()} + if ops[0] == "" || !contains(SUPPORTED_OPS, ops[0]) { + ops = job.ConfigValue("operation").StringArray() + for _, op := range ops { + if !contains(SUPPORTED_OPS, op) { + return nil, fmt.Errorf("unsupported operation '%s'", op) + } + } + } + return ops, nil +} + +// contains checks if a string is present in a slice +func contains(s []string, str string) bool { + for _, v := range s { + if v == str { + return true + } + } + return false +} + +// checks if any of the input values for the math_filter job is empty +func isValidInputs(inputs []redis.GenericValue) bool { + for _, input := range inputs { + if input.IsEmpty() { + return false + } + } + return true +} + +// Combine combines two feeds into one +// e.g. swth/usdc, osmo/swth => osmo/usdc +func Combine(vals []types.GenericValue, ops []string) (sdkmath.LegacyDec, error) { + res, err := sdkmath.LegacyNewDecFromStr(vals[0].String()) + if err != nil { + return sdkmath.LegacyDec{}, err + } + for i := 1; i < len(vals); i++ { + op := ops[i-1] + val, err := sdkmath.LegacyNewDecFromStr(vals[i].String()) + if err != nil { + return sdkmath.LegacyDec{}, err + } + switch op { + case "divide", "/": + if val.IsZero() { + return sdkmath.LegacyDec{}, fmt.Errorf("val at index %d is zero, cannot divide", i) + } + res = res.Quo(val) + case "multiply", "*": + res = res.Mul(val) + case "add", "+": + res = res.Add(val) + case "subtract", "-": + if res.LT(val) { + return sdkmath.LegacyDec{}, fmt.Errorf("val at index %d is greater than res, cannot subtract", i) + } + res = res.Sub(val) + case "max": + res = sdkmath.LegacyMaxDec(res, val) + case "min": + res = sdkmath.LegacyMinDec(res, val) + default: + panic("unsupported operation " + op) + } + } + return res, nil +} + +// Perform handles math filter operations +func (handler *MathFilter) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, _ *types.AdapterStore) (types.AdapterResult, error) { + ops, err := getOperations(job) + if err != nil { + return result, fmt.Errorf("%s: unable to get operations for job: %s", job.OutputId, err) + } + + vals, err := job.GetInputs(result) + if err != nil { + return result, fmt.Errorf("%s: unable to get inputs for job: %s", job.OutputId, err) + } + + if !isValidInputs(vals) { + return result, fmt.Errorf("%s: empty inputs detected, skipping job", job.OutputId) + } + + if len(vals) < 2 { + return result, fmt.Errorf("number of val input %d for math filter not supported", len(vals)) + } + + if len(ops) != len(vals)-1 { + return result, fmt.Errorf("number of values != number of operations - 1 for oracle_id") + } + + outputVal, err := Combine(vals, ops) + if err != nil { + return result, fmt.Errorf("error combining values: %s", err.Error()) + } + output := types.StringToGenericValue(outputVal.String()) + job.SetOutput(result, output) + return result, nil +} diff --git a/oracle/service/adapters/median_filter.go b/oracle/service/adapters/median_filter.go new file mode 100644 index 00000000000..f8a2061e65b --- /dev/null +++ b/oracle/service/adapters/median_filter.go @@ -0,0 +1,89 @@ +package adapters + +import ( + "fmt" + "sort" + + "github.com/cometbft/cometbft/oracle/service/types" + "github.com/cometbft/cometbft/redis" + "google.golang.org/grpc" +) + +// MedianFilter struct for median filter +type MedianFilter struct { + grpcClient *grpc.ClientConn + redisService *redis.Service +} + +// Id returns median filter Id +func (filter *MedianFilter) Id() string { + return "median_filter" +} + +func NewMedianFilter(grpcClient *grpc.ClientConn, redisService *redis.Service) *MedianFilter { + return &MedianFilter{ + grpcClient: grpcClient, + redisService: redisService, + } +} + +// Validate validate job config +func (filter *MedianFilter) Validate(job types.OracleJob) error { + valueIds := job.ConfigValue("value_ids").StringArray() + percentage := job.ConfigValue("tolerance_percentage").Float64() + switch { + case len(valueIds) == 0: + return fmt.Errorf("value_ids cannot be blank") + case percentage < 0 || percentage > 100: + return fmt.Errorf("tolerance_percentage must be in range [0, 100]") + } + return nil +} + +// CalcMedian calculate the median of an array of float64 values +func CalcMedian(values []float64) float64 { + sort.Float64s(values) + mid := len(values) / 2 + + if len(values)%2 == 1 { + return values[mid] + } + + sum := values[mid-1] + values[mid] + return sum / 2 +} + +// Perform sets the input value to an empty string if its deviation from the median exceeds the specified threshold +func (filter *MedianFilter) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, _ *types.AdapterStore) (types.AdapterResult, error) { + input := job.GetInput(result) + if input.IsEmpty() { + return result, fmt.Errorf("%s: input cannot be empty", job.InputId) + } + + valueIds := job.ConfigValue("value_ids").StringArray() + tolerancePercentage := job.ConfigValue("tolerance_percentage").Float64() + var values []float64 + for _, valueId := range valueIds { + value := result.GetData(valueId) + if value.Present() { + values = append(values, value.Float64()) + } + } + + if len(values) == 0 { + return result, fmt.Errorf("%s: no values found for value_ids: %v", job.InputId, valueIds) + } + + median := CalcMedian(values) + output := input + minValue := median - median/100*tolerancePercentage + maxValue := median + median/100*tolerancePercentage + + if input.Float64() < minValue || input.Float64() > maxValue { + output = types.StringToGenericValue("") + } + + result = job.SetOutput(result, output) + + return result, nil +} diff --git a/oracle/service/adapters/oracle_result_fetcher.go b/oracle/service/adapters/oracle_result_fetcher.go new file mode 100644 index 00000000000..aa291cd3baf --- /dev/null +++ b/oracle/service/adapters/oracle_result_fetcher.go @@ -0,0 +1,125 @@ +package adapters + +import ( + "encoding/json" + "fmt" + "strconv" + "time" + + "github.com/cometbft/cometbft/oracle/service/types" + "github.com/cometbft/cometbft/redis" + + "google.golang.org/grpc" +) + +const ORACLE_ID = "oracle_id" +const STALE_ALLOWANCE = "stale_allowance" + +// OracleResultFetcher struct for float handler +type OracleResultFetcher struct { + grpcClient *grpc.ClientConn + redisService *redis.Service +} + +func NewOracleResultFetcher(grpcClient *grpc.ClientConn, redisService *redis.Service) *OracleResultFetcher { + return &OracleResultFetcher{ + grpcClient: grpcClient, + redisService: redisService, + } +} + +// Id returns cache fetcher Id +func (oracleResultFetcher *OracleResultFetcher) Id() string { + return "oracle_result_fetcher" +} + +// Validate validate job config +func (oracleResultFetcher *OracleResultFetcher) Validate(job types.OracleJob) error { + oracleId := job.ConfigValue(ORACLE_ID) + staleAllowance := job.ConfigValue(STALE_ALLOWANCE) + if oracleId.IsEmpty() { + return fmt.Errorf("oracle ID cannot be blank") + } + if staleAllowance.IsEmpty() { + return fmt.Errorf("stale allowance cannot be blank") + } + return nil +} + +// Perform handles cache fetcher operations +func (oracleResultFetcher *OracleResultFetcher) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, store *types.AdapterStore) (types.AdapterResult, error) { + oracleId := job.ConfigValue(ORACLE_ID).String() + staleAllowance := job.ConfigValue(STALE_ALLOWANCE).String() + + price, cacheErr := getOracleResultFromCache(oracleId, staleAllowance, *oracleResultFetcher.redisService) + + if cacheErr != nil { + // rework to re-perform job as we cant use carbon query client due to circular depedency + // logrus.Error(cacheErr) + // var grpcErr error + // price, grpcErr = getOracleResultFromGrpc(oracleId, oracleResultFetcher.grpcClient) + // if grpcErr != nil { + // return result, grpcErr + // } + } + + job.SetOutput(result, types.StringToGenericValue(price)) + + return result, nil +} + +// GetOracleResultKey returns the redis key for a given oracle +func GetOracleResultKey(oracleId string) string { + return fmt.Sprintf("oracle-result:%s", oracleId) +} + +func getOracleResultFromCache(oracleId string, staleAllowance string, redisService redis.Service) (string, error) { + key := GetOracleResultKey(oracleId) + outputGeneric, ok, err := redisService.Get(key) + if err != nil || !ok { + return "", err + } + + outputString := outputGeneric.String() + var oracleCache types.OracleCache + unmarshalErr := json.Unmarshal([]byte(outputString), &oracleCache) + if unmarshalErr != nil { + return "", unmarshalErr + } + + elapsedTime := time.Since(oracleCache.Timestamp.Time) + timeout, err := strconv.ParseUint(staleAllowance, 10, 64) + if err != nil { + return "", err + } + + if elapsedTime.Seconds() > float64(timeout) { + return "", fmt.Errorf("oracle: %s stale allowance exceeded", oracleId) + } + + return oracleCache.Price, nil +} + +func getOracleResultFromGrpc(oracleId string, grpcClient *grpc.ClientConn) (string, error) { + // change this to reperform the whole job if not found in cache, as we cant use + // oracle query client from carbon due to circular depedency + // oracleClient := oracle.NewQueryClient(grpcClient) + // request := &oracle.QueryResultsRequest{ + // OracleId: oracleId, + // } + + // // Call the gRPC method to fetch data from the Oracle + // response, err := oracleClient.Results(context.Background(), request) + // if err != nil { + // return "", err + // } + + // if len(response.Results) == 0 { + // return "", fmt.Errorf("oracle: %s RPC result is empty", oracleId) + // } + + // grpcResult := []oracle.Result{response.Results[len(response.Results)-1]} + + // return grpcResult[0].Data, nil + return "", nil +} diff --git a/oracle/service/adapters/static_handler.go b/oracle/service/adapters/static_handler.go new file mode 100644 index 00000000000..ec829cdebd1 --- /dev/null +++ b/oracle/service/adapters/static_handler.go @@ -0,0 +1,51 @@ +package adapters + +import ( + "fmt" + + sdkmath "cosmossdk.io/math" + "github.com/cometbft/cometbft/oracle/service/types" + "github.com/cometbft/cometbft/redis" + "google.golang.org/grpc" +) + +// StaticHandler struct for decimal handler +type StaticHandler struct { + grpcClient *grpc.ClientConn + redisService *redis.Service +} + +func NewStaticHandler(grpcClient *grpc.ClientConn, redisService *redis.Service) *StaticHandler { + return &StaticHandler{ + grpcClient: grpcClient, + redisService: redisService, + } +} + +// Id returns float handler Id +func (handler *StaticHandler) Id() string { + return "static_handler" +} + +// Validate validate job config +func (handler *StaticHandler) Validate(job types.OracleJob) error { + valStr := job.ConfigValue("value").String() + _, err := sdkmath.LegacyNewDecFromStr(valStr) + if err != nil { + return fmt.Errorf("value %s cannot be cast to sdk.Dec error: %s", valStr, err.Error()) + } + return nil +} + +// Perform handles float operations +func (handler *StaticHandler) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, _ *types.AdapterStore) (types.AdapterResult, error) { + valStr := job.ConfigValue("value").String() + val, err := sdkmath.LegacyNewDecFromStr(valStr) + if err != nil { + return result, fmt.Errorf("value %s cannot be cast to sdk.Dec error: %s", valStr, err.Error()) + } + output := types.StringToGenericValue(val.String()) + + job.SetOutput(result, output) + return result, nil +} diff --git a/oracle/service/adapters/unchanged_handler.go b/oracle/service/adapters/unchanged_handler.go new file mode 100644 index 00000000000..46091aedd00 --- /dev/null +++ b/oracle/service/adapters/unchanged_handler.go @@ -0,0 +1,81 @@ +package adapters + +import ( + "fmt" + + "github.com/cometbft/cometbft/oracle/service/types" + "github.com/cometbft/cometbft/redis" + log "github.com/sirupsen/logrus" + "google.golang.org/grpc" +) + +// UnchangedHandler struct for unresponsive handler +type UnchangedHandler struct { + grpcClient *grpc.ClientConn + redisService *redis.Service +} + +func NewUnchangedHandler(grpcClient *grpc.ClientConn, redisService *redis.Service) *UnchangedHandler { + return &UnchangedHandler{ + grpcClient: grpcClient, + redisService: redisService, + } +} + +// Id returns unchanged handler Id +func (handler *UnchangedHandler) Id() string { + return "unchanged_handler" +} + +// Validate validate job config +func (handler *UnchangedHandler) Validate(job types.OracleJob) error { + strategy := job.ConfigValue("strategy").String() + switch strategy { + case "nullify": + default: + return fmt.Errorf("unsupported strategy '%s'", strategy) + } + // check that threshold_duration is a valid uint + job.ConfigValue("threshold_duration").Uint64() + return nil +} + +// StoreHash struct for store hash +type StoreHash struct { + Value string + LastUpdateTime uint64 +} + +// Perform handles unchanged responses +func (handler *UnchangedHandler) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, store *types.AdapterStore) (types.AdapterResult, error) { + input := job.GetInput(result) + + var lastUpdateTime types.GenericValue + var lastValue types.GenericValue + if runTimeInput.LastStoreDataExists { + lastUpdateTime = runTimeInput.GetLastStoreData("last_update_time") + lastValue = runTimeInput.GetLastStoreData("value") + } + + thresholdDuration := job.ConfigValue("threshold_duration").Uint64() + + valueWasChanged := input.String() != lastValue.String() + valueIsStale := lastUpdateTime.Present() && lastUpdateTime.Uint64() < runTimeInput.BeginTime-thresholdDuration + + if runTimeInput.LastStoreDataExists && !valueWasChanged && valueIsStale { + log.Warnf("[oracle] Unchanged value for %+v, %+v", job.InputId, job.OutputId) + job.SetOutput(result, types.StringToGenericValue("")) + } else { + job.SetOutput(result, input) + } + + store.ShouldPersist = true + + store.SetData("value", input) + store.SetData("last_update_time", lastUpdateTime) + if valueWasChanged { + store.SetData("last_update_time", types.Uint64ToGenericValue(runTimeInput.BeginTime)) + } + + return result, nil +} diff --git a/oracle/service/adapters/unresponsive_handler.go b/oracle/service/adapters/unresponsive_handler.go new file mode 100644 index 00000000000..3de2867f392 --- /dev/null +++ b/oracle/service/adapters/unresponsive_handler.go @@ -0,0 +1,70 @@ +package adapters + +import ( + "fmt" + + "github.com/cometbft/cometbft/oracle/service/types" + "github.com/cometbft/cometbft/redis" + "google.golang.org/grpc" +) + +// UnresponsiveHandler struct for unresponsive handler +type UnresponsiveHandler struct { + grpcClient *grpc.ClientConn + redisService *redis.Service +} + +func NewUnresponsiveHandler(grpcClient *grpc.ClientConn, redisService *redis.Service) *UnresponsiveHandler { + return &UnresponsiveHandler{ + grpcClient: grpcClient, + redisService: redisService, + } +} + +// Id returns unresponsive handler Id +func (handler *UnresponsiveHandler) Id() string { + return "unresponsive_handler" +} + +// Validate validate job config +func (handler *UnresponsiveHandler) Validate(job types.OracleJob) error { + strategy := job.ConfigValue("strategy").String() + switch strategy { + case "use_last": + default: + return fmt.Errorf("unsupported strategy '%s'", strategy) + } + // check that grace_duration is a valid uint + // TODO: refactor GenericValue to not panic + job.ConfigValue("grace_duration").Uint64() + return nil +} + +// Perform handles empty responses +func (handler *UnresponsiveHandler) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, store *types.AdapterStore) (types.AdapterResult, error) { + input := job.GetInput(result) + output := input + + graceDuration := job.ConfigValue("grace_duration").Uint64() + var lastResponsiveTime uint64 + if runTimeInput.LastStoreDataExists && runTimeInput.GetLastStoreData("last_responsive_time").Present() { + lastResponsiveTime = runTimeInput.GetLastStoreData("last_responsive_time").Uint64() + } + + store.SetData("last_responsive_time", types.Uint64ToGenericValue(lastResponsiveTime)) + + withinGraceDuration := lastResponsiveTime > runTimeInput.BeginTime-graceDuration + + if output.IsEmpty() && runTimeInput.LastStoreDataExists && withinGraceDuration { + output = runTimeInput.GetLastStoreData("value") + } else { + store.SetData("last_responsive_time", types.Uint64ToGenericValue(runTimeInput.BeginTime)) + } + + store.ShouldPersist = true + store.SetData("value", output) + + result = job.SetOutput(result, output) + + return result, nil +} diff --git a/oracle/service/adapters/weighted_average.go b/oracle/service/adapters/weighted_average.go new file mode 100644 index 00000000000..13c46b63304 --- /dev/null +++ b/oracle/service/adapters/weighted_average.go @@ -0,0 +1,90 @@ +package adapters + +import ( + "fmt" + + "github.com/cometbft/cometbft/oracle/service/types" + "github.com/cometbft/cometbft/redis" + "google.golang.org/grpc" +) + +// WeightedAverage struct for weighted average +type WeightedAverage struct { + grpcClient *grpc.ClientConn + redisService *redis.Service +} + +func NewWeightedAverage(grpcClient *grpc.ClientConn, redisService *redis.Service) *WeightedAverage { + return &WeightedAverage{ + grpcClient: grpcClient, + redisService: redisService, + } +} + +// Id returns weighted average Id +func (adapter *WeightedAverage) Id() string { + return "weighted_average" +} + +// Validate validate job config +func (adapter *WeightedAverage) Validate(job types.OracleJob) error { + valueIds := job.ConfigValue("value_ids").StringArray() + weights := job.ConfigValue("weights").Float64Array() + switch { + case len(valueIds) != len(weights): + return fmt.Errorf("len(value_ids) != len(weights)") + case len(valueIds) == 0: + return fmt.Errorf("value_ids cannot be 0") + } + return nil +} + +// CalcWeightedAverage calculate the mean of an array of float64 values +func CalcWeightedAverage(values []float64, weights []float64) float64 { + var sum float64 + var weightSum float64 + + for index, value := range values { + weight := weights[index] + if value == 0 || weight == 0 { + continue + } + sum += value * weight + weightSum += weight + } + + if weightSum < 0.5 { + return 0 + } + + return sum / weightSum +} + +// Perform calculates the weighted average +func (adapter *WeightedAverage) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, _ *types.AdapterStore) (types.AdapterResult, error) { + valueIds := job.ConfigValue("value_ids").StringArray() + weights := job.ConfigValue("weights").Float64Array() + var filteredWeights []float64 + var values []float64 + for index, valueId := range valueIds { + value := result.GetData(valueId) + if value.Present() { + values = append(values, value.Float64()) + filteredWeights = append(filteredWeights, weights[index]) + } + } + + if len(values) == 0 { + return result, fmt.Errorf("no values found for weighted_average") + } + + average := CalcWeightedAverage(values, filteredWeights) + + if average == 0 { + return result, fmt.Errorf("weighted_average is 0") + } + + result = job.SetOutput(result, types.Float64ToGenericValue(average)) + + return result, nil +} diff --git a/oracle/service/parser/parser.go b/oracle/service/parser/parser.go new file mode 100644 index 00000000000..32ad99bbff3 --- /dev/null +++ b/oracle/service/parser/parser.go @@ -0,0 +1,101 @@ +package parser + +import ( + "fmt" + + "github.com/cometbft/cometbft/oracle/service/types" +) + +// ConstructTemplateMap create a map of templates +func ConstructTemplateMap(templates []types.OracleTemplate) (map[string]types.OracleTemplate, error) { + templateMap := make(map[string]types.OracleTemplate, len(templates)) + + for _, template := range templates { + if _, ok := templateMap[template.TemplateId]; ok { + return nil, fmt.Errorf("duplicate template id: %s", template.TemplateId) + } + templateMap[template.TemplateId] = template + } + return templateMap, nil +} + +// UnrollSubAdapters convert sub adapter templates to full sub adapters +func UnrollSubAdapters(subAdapters []types.OracleJobSubAdapter, templateMap map[string]types.OracleTemplate) ([]types.OracleJobSubAdapter, error) { + var unrolledAdapters []types.OracleJobSubAdapter + for _, subAdapter := range subAdapters { + switch { + case len(subAdapter.Adapter) > 0: + unrolledAdapters = append(unrolledAdapters, subAdapter) + + case len(subAdapter.Template) > 0: + template, ok := templateMap[subAdapter.Template] + if !ok { + return nil, fmt.Errorf("template not found in map: %s", subAdapter.Template) + } + unrolledAdapters = append(unrolledAdapters, template.SubAdapters...) + + default: + return nil, fmt.Errorf("invalid subadapter") + } + } + return unrolledAdapters, nil +} + +// UnrollOracleJobs convert sub adapter declarations to full jobs +func UnrollOracleJobs(jobs []types.OracleJob) (unrolledJobs []types.OracleJob, err error) { + for _, job := range jobs { + switch { + case len(job.Adapter) > 0: + unrolledJobs = append(unrolledJobs, job) + + case len(job.SubAdapters) > 0: + for _, subAdapter := range job.SubAdapters { + unrolledJob := types.OracleJob{} + unrolledJob.OutputId = job.OutputId + unrolledJob.InputId = job.InputId + if len(unrolledJob.InputId) == 0 { + unrolledJob.InputId = job.OutputId + } + unrolledJob.Adapter = subAdapter.Adapter + unrolledJob.Config = subAdapter.Config + unrolledJobs = append(unrolledJobs, unrolledJob) + } + default: + return nil, fmt.Errorf("job has no adapters or subadapters") + } + } + return +} + +func ParseSpec(spec types.OracleSpec) (unrolledSpec types.OracleSpec, err error) { + templateMap, err := ConstructTemplateMap(spec.Templates) + if err != nil { + return + } + for i, job := range spec.Jobs { + spec.Jobs[i].SubAdapters, err = UnrollSubAdapters(job.SubAdapters, templateMap) + if err != nil { + return + } + } + spec.Jobs, err = UnrollOracleJobs(spec.Jobs) + if err != nil { + return + } + return spec, nil +} + +// ValidateOracleJobs validates oracle jobs +func ValidateOracleJobs(app types.App, jobs []types.OracleJob) error { + for _, job := range jobs { + adapter, ok := app.AdapterMap[job.Adapter] + if !ok { + return fmt.Errorf("adapter not found: '%s'", job.Adapter) + } + err := adapter.Validate(job) + if err != nil { + return fmt.Errorf("%s: %s", adapter.Id(), err.Error()) + } + } + return nil +} diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go new file mode 100644 index 00000000000..a8cf9817e2c --- /dev/null +++ b/oracle/service/runner/runner.go @@ -0,0 +1,332 @@ +package runner + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "strconv" + "time" + + log "github.com/sirupsen/logrus" + + "github.com/Switcheo/carbon-wallet-go/api" + "github.com/Switcheo/carbon/constants" + oracletypes "github.com/Switcheo/carbon/x/oracle/types" + "github.com/cometbft/cometbft/oracle/service/adapters" + "github.com/cometbft/cometbft/oracle/service/parser" + "github.com/cometbft/cometbft/oracle/service/types" + "github.com/cometbft/cometbft/redis" +) + +var ( + OracleOverwriteData string +) + +// OracleInfoResult oracle info result +type OracleInfoResult struct { + Id string `json:"id"` + Status string `json:"status"` +} + +// OracleInfoResponse oracle info response +type OracleInfoResponse struct { + Height string `json:"height"` + Result OracleInfoResult `json:"result"` +} + +// LastSubmissionTimeKey key for last submission time +const LastSubmissionTimeKey = "oracle:submitter:last-submission-time" + +// LastStoreDataKey returns the key for the given adapter and job +func LastStoreDataKey(adapter types.Adapter, job types.OracleJob) string { + return fmt.Sprintf("oracle:adapter-store:%s:%s", adapter.Id(), job.InputId) +} + +// GetLastStoreData returns the last stored value for the given adapter and job +func GetLastStoreData(service redis.Service, adapter types.Adapter, job types.OracleJob) (data map[string]types.GenericValue, exists bool, err error) { + key := LastStoreDataKey(adapter, job) + value, exists, err := service.Get(key) + if err != nil { + return + } + data = make(map[string]types.GenericValue) + if exists { + err := json.Unmarshal([]byte(value.String()), &data) + if err != nil { + panic(err) + } + } + return data, exists, nil +} + +// SetLastStoreData sets the last store data for the given adapter and job +func SetLastStoreData(service redis.Service, adapter types.Adapter, job types.OracleJob, store types.AdapterStore) error { + key := LastStoreDataKey(adapter, job) + dataBytes, err := json.Marshal(&store.Data) + if err != nil { + panic(err) + } + err = service.Set(key, types.StringToGenericValue(string(dataBytes)), 0) + if err != nil { + return err + } + return nil +} + +// GetOracleLockKey returns the lock key for a given oracle and time +func GetOracleLockKey(oracle types.Oracle, normalizedTime uint64) string { + return fmt.Sprintf("oracle:oracle-lock:%s:%d", oracle.Id, normalizedTime) +} + +func overwriteData(oracleId string, data string) string { + if oracleId != "DXBT" { // if we want to overwrite DETH: `&& oracleID != "DETH"` + return data + } + + var min, max, interval int64 + switch oracleId { + case "DXBT": + min, max = 15000, 10000 // this was how it was before the refactor, maybe intended? + interval = 20 + case "DETH": + min, max = 500, 1500 + interval = 5 + } + + // create a price based on current system time + t := time.Now().Unix() + minute := t / 60 + seconds := t - (t/60)*60 + // round to the nearest 10th second, e.g. 10, 20, 30... + roundedSeconds := (seconds / 10) * 10 + isEvenMinute := minute%2 == 0 + // if the minute is exactly an even minute + if isEvenMinute { + if roundedSeconds == 0 { + return strconv.FormatUint(uint64(min), 10) + } + + price := strconv.FormatUint(uint64(min+roundedSeconds*interval), 10) + decimalPrice := strconv.FormatUint(uint64(seconds/10), 10) + decimalPrice += strconv.FormatUint(10-uint64(seconds/10), 10) + return price + "." + decimalPrice + } + + if roundedSeconds == 0 { + return strconv.FormatUint(uint64(max), 10) + } + + price := strconv.FormatUint(uint64(max-roundedSeconds*interval), 10) + decimalPrice := strconv.FormatUint(uint64(seconds/10)+4, 10) + decimalPrice += strconv.FormatUint(10-uint64(seconds/10), 10) + return price + "." + decimalPrice +} + +// func msgResultCallback(response *sdktypes.TxResponse, msg sdktypes.Msg, err error) { +// var result float32 +// result = 1 +// if err != nil { +// result = 0 +// } +// telemetry.SetGaugeWithLabels([]string{constants.METRIC_VOTE_STATUS}, result, []metrics.Label{telemetry.NewLabel("transaction_hash", response.TxHash)}) +// } + +// // SubmitVote submit oracle vote +// func SubmitVote(app types.App, msg oracletypes.MsgCreateVote) { +// power, err := oracleapi.GetSubAccountPower(app.Wallet.GRPCURL, app.Wallet.Bech32Addr, app.Wallet.ClientCtx) +// if err != nil { +// return +// } + +// if power.IsZero() { +// return +// } + +// app.Wallet.SubmitMsgAsync(&msg, msgResultCallback) +// // log.Infoln("Submitted vote", app.Wallet.AccAddress().String(), msg.OracleID, msg.Timestamp, msg.Data) +// } + +// SyncOracles sync oracles with active on-chain oracles +func SyncOracles(app types.App) (oracles []types.Oracle, err error) { + // fetch oracle list first + grpcConn, err := api.GetGRPCConnection(app.Wallet.GRPCURL, app.Wallet.ClientCtx) + if err != nil { + log.Error(err) + return nil, err + } + defer grpcConn.Close() + + oracleClient := oracletypes.NewQueryClient(grpcConn) + oracleRes, err := oracleClient.OracleAll( + context.Background(), + &oracletypes.QueryAllOracleRequest{ + //Pagination: &sdkquerytypes.PageRequest{} + }, + ) + if err != nil { + log.Error(err) + return nil, err + } + + oraclesData := oracleRes.Oracles + + for _, oracle := range oraclesData { + var spec types.OracleSpec + err = json.Unmarshal([]byte(oracle.Spec), &spec) + if err != nil { + log.Errorf("[oracle:%v] invalid oracle spec: %+v", oracle.Id, err) + continue + } + spec, err := parser.ParseSpec(spec) + if err != nil { + log.Warnf("[oracle:%v] unable to unroll spec: %v", oracle.Id, err) + continue + } + err = parser.ValidateOracleJobs(app, spec.Jobs) + if err != nil { + log.Warnf("[oracle: %v,] invalid oracle jobs: %v", oracle.Id, err) + continue + } + oracles = append(oracles, types.Oracle{ + Id: oracle.Id, + Resolution: uint64(oracle.Resolution), + Spec: spec, + }) + } + log.Info("[oracle] Synced oracle specs") + return oracles, err +} + +func SaveOracleResult(price string, oracleId string, redisService redis.Service) { + if price != "" { + key := adapters.GetOracleResultKey(oracleId) + data, err := json.Marshal(types.OracleCache{Price: price, Timestamp: types.JSONTime{Time: time.Now()}}) + if err != nil { + panic(err) + } + jsonString := string(data) + setErr := redisService.Set(key, types.StringToGenericValue(jsonString), 0) + if setErr != nil { + log.Error(err) + } + } +} + +// RunOracle run oracle submission +func RunOracle(app types.App, oracle types.Oracle, currentTime uint64) error { + red := app.Redis + normalizedTime := (currentTime / oracle.Resolution) * oracle.Resolution + lastSubmissionTime, exists, err := red.Get(LastSubmissionTimeKey) + if err != nil { + return err + } + if exists && normalizedTime <= lastSubmissionTime.Uint64() { + return nil + } + lockKey := GetOracleLockKey(oracle, normalizedTime) + err = red.SetNX(lockKey, types.StringToGenericValue("1"), time.Minute*5) + //nolint:nilerr //already processed/processing + if err != nil { + return nil + } + + jobs := oracle.Spec.Jobs + shouldEarlyTerminate := oracle.Spec.ShouldEarlyTerminate + result := types.NewAdapterResult() + + input := types.AdapterRunTimeInput{ + BeginTime: currentTime, + Config: app.Config, + } + + for _, job := range jobs { + adapter, ok := app.AdapterMap[job.Adapter] + if !ok { + panic("adapter should exist: " + job.Adapter) + } + input.LastStoreData, input.LastStoreDataExists, err = GetLastStoreData(red, adapter, job) + if err != nil { + return err + } + store := types.NewAdapterStore() + result, err = adapter.Perform(job, result, input, &store) + if err != nil { + log.Error(fmt.Errorf("%s: %s: %s", oracle.Id, adapter.Id(), err.Error())) + if shouldEarlyTerminate { + break + } + } + if store.ShouldPersist { + if err := SetLastStoreData(red, adapter, job, store); err != nil { + return err + } + } + } + + err = red.Set(LastSubmissionTimeKey, types.Uint64ToGenericValue(normalizedTime), 0) + if err != nil { + return err + } + + resultData := result.GetData(oracle.Spec.OutputId).String() + + SaveOracleResult(resultData, oracle.Id, red) + + if OracleOverwriteData == constants.True { + resultData = overwriteData(oracle.Id, resultData) // if we want to override oracle price + // resultData = overwriteDataV2(oracle.ID, resultData) // if we want to override oracle price + } + + if resultData == "" { + return errors.New("skipping submission for " + oracle.Id + " as result is empty") + } + + msg := oracletypes.MsgCreateVote{ + Creator: app.Wallet.Bech32Addr, + OracleId: oracle.Id, + Timestamp: int64(normalizedTime), + Data: resultData, + } + + SubmitVote(app, msg) + + return nil +} + +// RunOracles run oracle submissions +func RunOracles(app types.App, t uint64) { + for _, oracle := range app.Oracles { + go func(currOracle types.Oracle) { + err := RunOracle(app, currOracle, t) + if err != nil { + log.Warnln(err) + } + }(oracle) + } +} + +// Run run oracles +func Run(app types.App) { + log.Info("[oracle] Service started.") + count := 0 + for { + if count == 0 { // on init, and every minute + oracles, err := SyncOracles(app) + if err != nil { + log.Warn(err) + time.Sleep(time.Second) + continue + } + app.Oracles = oracles + } + + RunOracles(app, uint64(time.Now().Unix())) + time.Sleep(100 * time.Millisecond) + + count++ + if count > 600 { // 600 * 0.1s = 60s = every minute + count = 0 + } + } +} diff --git a/oracle/service/types/adapter.go b/oracle/service/types/adapter.go new file mode 100644 index 00000000000..61375130147 --- /dev/null +++ b/oracle/service/types/adapter.go @@ -0,0 +1,61 @@ +package types + +// Adapter interface for adapter +type Adapter interface { + Id() string + Perform(job OracleJob, result AdapterResult, runTimeInput AdapterRunTimeInput, store *AdapterStore) (AdapterResult, error) + Validate(job OracleJob) error +} + +// AdapterResult struct for adapter results +type AdapterResult struct { + Data map[string]GenericValue +} + +// GetData get data for given key +func (result AdapterResult) GetData(key string) GenericValue { + return result.Data[key] +} + +// SetData sets data for the given key, value pair +func (result *AdapterResult) SetData(key string, value GenericValue) { + result.Data[key] = value +} + +// NewAdapterResult returns an initialized AdapterResult +func NewAdapterResult() AdapterResult { + result := AdapterResult{} + result.Data = make(map[string]GenericValue) + return result +} + +// AdapterRunTimeInput struct for adapter input +type AdapterRunTimeInput struct { + LastStoreData map[string]GenericValue + LastStoreDataExists bool + BeginTime uint64 + Config Config +} + +// GetLastStoreData gets data for the given key +func (input AdapterRunTimeInput) GetLastStoreData(key string) GenericValue { + return input.LastStoreData[key] +} + +// AdapterStore struct for adapter store +type AdapterStore struct { + ShouldPersist bool + Data map[string]GenericValue +} + +// NewAdapterStore returns an initialized adapter store +func NewAdapterStore() AdapterStore { + store := AdapterStore{} + store.Data = make(map[string]GenericValue) + return store +} + +// SetData sets data for the given key, value pair +func (store *AdapterStore) SetData(key string, value GenericValue) { + store.Data[key] = value +} diff --git a/oracle/service/types/alias.go b/oracle/service/types/alias.go new file mode 100644 index 00000000000..3db04a21667 --- /dev/null +++ b/oracle/service/types/alias.go @@ -0,0 +1,15 @@ +package types + +import ( + r "github.com/cometbft/cometbft/redis" +) + +type ( + GenericValue = r.GenericValue +) + +var ( + StringToGenericValue = r.StringToGenericValue + Float64ToGenericValue = r.Float64ToGenericValue + Uint64ToGenericValue = r.Uint64ToGenericValue +) diff --git a/oracle/service/types/app.go b/oracle/service/types/app.go new file mode 100644 index 00000000000..c44af39667c --- /dev/null +++ b/oracle/service/types/app.go @@ -0,0 +1,17 @@ +package types + +import ( + // carbonwalletgo "github.com/Switcheo/carbon-wallet-go" + "github.com/cometbft/cometbft/redis" + "google.golang.org/grpc" +) + +// App struct for app +type App struct { + Oracles []Oracle + AdapterMap map[string]Adapter + Redis redis.Service + // Wallet carbonwalletgo.Wallet + Config Config + GrpcClient *grpc.ClientConn +} diff --git a/oracle/service/types/config.go b/oracle/service/types/config.go new file mode 100644 index 00000000000..4ce6a739269 --- /dev/null +++ b/oracle/service/types/config.go @@ -0,0 +1,9 @@ +package types + +// Config struct for app +type Config map[string]CustomNode + +type CustomNode struct { + Host string `json:"host"` + Path string `json:"path"` +} diff --git a/oracle/service/types/oracle.go b/oracle/service/types/oracle.go new file mode 100644 index 00000000000..77c45fea3a9 --- /dev/null +++ b/oracle/service/types/oracle.go @@ -0,0 +1,134 @@ +package types + +import ( + "encoding/json" + "fmt" + "strings" + "time" + + "github.com/cometbft/cometbft/redis" +) + +// Oracle struct for oracles +type Oracle struct { + Id string `json:"id"` + Resolution uint64 `json:"resolution"` + Spec OracleSpec `json:"spec"` +} + +// OracleSpec struct for oracle specs +type OracleSpec struct { + OutputId string `json:"output_id"` + Jobs []OracleJob `json:"jobs"` + Templates []OracleTemplate `json:"templates"` + // flag to determine if oracle jobs should terminate upon error (should terminate for specs that do not use weighted_average in their calcs.) + ShouldEarlyTerminate bool `json:"should_early_terminate"` +} + +// OracleJob struct for oracle jobs +type OracleJob struct { + OutputId string `json:"output_id"` + InputId string `json:"input_id"` + Adapter string `json:"adapter"` + Config map[string]string `json:"config"` + SubAdapters []OracleJobSubAdapter `json:"adapters"` +} + +// OracleTemplate struct for oracle template +type OracleTemplate struct { + TemplateId string `json:"template_id"` + SubAdapters []OracleJobSubAdapter `json:"adapters"` +} + +// OracleJobSubAdapter struct for sub adapters +type OracleJobSubAdapter struct { + Adapter string `json:"adapter"` + Config map[string]string `json:"config"` + Template string `json:"template"` +} + +type JSONTime struct { + Time time.Time +} + +func (t JSONTime) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf("\"%s\"", t.Time.Format(time.RFC3339Nano))), nil +} + +func (t *JSONTime) UnmarshalJSON(data []byte) error { + var timestamp string + err := json.Unmarshal(data, ×tamp) + if err != nil { + return err + } + + parsedTime, err := time.Parse(time.RFC3339Nano, timestamp) + if err != nil { + return err + } + + t.Time = parsedTime + return nil +} + +type OracleCache struct { + Price string `json:"price"` + Timestamp JSONTime `json:"timestamp"` +} + +// ConfigValue returns the config for a specified key +func (job OracleJob) ConfigValue(key string) GenericValue { + return StringToGenericValue(job.Config[key]) +} + +// GetInput gets job input for the specified adapter result +func (job OracleJob) GetInput(result AdapterResult) GenericValue { + return result.GetData(job.InputId) +} + +// GetInputs gets list of job input for the specified adapter result +func (job OracleJob) GetInputs(result AdapterResult) ([]GenericValue, error) { + res := []GenericValue{} + input := result.GetData(job.InputId) + if input.IsEmpty() { + valueIdsStr := job.ConfigValue("input_ids") + if !valueIdsStr.Present() || valueIdsStr.IsEmpty() { + return res, fmt.Errorf("GetInputs: input_ids not found in job config for job with outputID: %s", job.OutputId) + } + valueIds := valueIdsStr.StringArray() + for _, valueId := range valueIds { + res = append(res, result.GetData(valueId)) + } + } else { + values := strings.Split(input.String(), " ") + for _, val := range values { + res = append(res, redis.StringToGenericValue(val)) + } + } + return res, nil +} + +// SetOutput sets the job output on the adapter result +func (job OracleJob) SetOutput(result AdapterResult, output GenericValue) AdapterResult { + result.SetData(job.OutputId, output) + return result +} + +// SetOutputList sets the job output of an array of strings on the adapter result +func (job OracleJob) SetOutputList(result AdapterResult, output []string) AdapterResult { + job.SetOutput(result, StringArrayToGenericValue(output)) + return result +} + +// SetOutputs sets the job outputs on the adapter results +func (job OracleJob) SetOutputs(result AdapterResult, outputIds []string, outputs []GenericValue) AdapterResult { + for idx := range outputIds { + result.SetData(outputIds[idx], outputs[idx]) + } + return result +} + +func StringArrayToGenericValue(stringArray []string) GenericValue { + strings := strings.Join(stringArray, " ") + return StringToGenericValue(strings) +} diff --git a/proto/Switcheo/carbon/oracle/oracle.proto b/proto/Switcheo/carbon/oracle/oracle.proto new file mode 100644 index 00000000000..9c6e0a48a62 --- /dev/null +++ b/proto/Switcheo/carbon/oracle/oracle.proto @@ -0,0 +1,73 @@ +syntax = "proto3"; +package Switcheo.carbon.oracle; + +option go_package = "github.com/cometbft/cometbft/oracle/types"; +option (gogoproto.goproto_getters_all) = false; + +import "cosmos/base/v1beta1/coin.proto"; +import "gogoproto/gogo.proto"; +import "google/protobuf/timestamp.proto"; +import "google/protobuf/duration.proto"; + +// Params defines the parameters for the oracle module. +message Params { + option (gogoproto.goproto_stringer) = false; + bool oracle_slash_enabled = 1; + uint32 oracle_slash_window_block = 2; + string oracle_slash_initial = 3 [ + (gogoproto.customtype) = "cosmossdk.io/math.LegacyDec", + (gogoproto.nullable) = false + ]; + string oracle_slash_increment = 4 [ + (gogoproto.customtype) = "cosmossdk.io/math.LegacyDec", + (gogoproto.nullable) = false + ]; + uint32 oracle_continuous_slash_max = 5; + uint32 newly_bonded_window_allowance = 6; + google.protobuf.Duration vote_timestamp_future_allowance = 7 + [ (gogoproto.nullable) = false, (gogoproto.stdduration) = true ]; + string oracle_min_vote_factor = 8 [ + (gogoproto.customtype) = "cosmossdk.io/math.LegacyDec", + (gogoproto.nullable) = false + ]; + string max_power_to_slash_factor = 9 [ + (gogoproto.customtype) = "cosmossdk.io/math.LegacyDec", + (gogoproto.nullable) = false + ]; +} + +message Oracle { + string creator = 1; + string id = 2; + string description = 3; + string status = 4; + int64 min_turnout_percentage = 5; + int64 max_result_age = 6; + string security_type = 7; + string result_strategy = 8; + int64 resolution = 9; + string spec = 10; +} + +message Vote { + string oracle_id = 1; + int64 timestamp = 2; + string data = 3; + string voter = 4; +} + +message Result { + string oracle_id = 1 [ (gogoproto.moretags) = "db:\"oracle_id\"" ]; + int64 timestamp = 3 [ (gogoproto.moretags) = "db:\"timestamp\"" ]; + string data = 4 [ (gogoproto.moretags) = "db:\"data\"" ]; +} + +message Mark { + string oracle_id = 1; + int64 timestamp = 2; +} + +message Contract { + string oracle_id = 1; + string contract_address = 2; +} \ No newline at end of file diff --git a/proto/Switcheo/carbon/oracle/query.proto b/proto/Switcheo/carbon/oracle/query.proto new file mode 100644 index 00000000000..71c7aac04d2 --- /dev/null +++ b/proto/Switcheo/carbon/oracle/query.proto @@ -0,0 +1,207 @@ +syntax = "proto3"; +package Switcheo.carbon.oracle; + +import "google/api/annotations.proto"; +import "cosmos/base/query/v1beta1/pagination.proto"; +import "gogoproto/gogo.proto"; +// this line is used by starport scaffolding # 1 +import "Switcheo/carbon/oracle/oracle.proto"; +import "Switcheo/carbon/oracle/slashing.proto"; + +option go_package = "github.com/cometbft/cometbft/oracle/types"; +option (gogoproto.goproto_getters_all) = false; + +// Query defines the gRPC querier service. +service Query { + // this line is used by starport scaffolding # 2 + + // Get details for an oracle + rpc Oracle(QueryOracleRequest) returns (QueryOracleResponse) { + option (google.api.http).get = "/carbon/oracle/v1/oracles/{id}"; + } + + // Get details for all oracles + rpc OracleAll(QueryAllOracleRequest) returns (QueryAllOracleResponse) { + option (google.api.http).get = "/carbon/oracle/v1/oracles"; + } + + // Get results for all oracles, or a specific oracle + rpc Results(QueryResultsRequest) returns (QueryResultsResponse) { + option (google.api.http) = { + get : "/carbon/oracle/v1/results/{oracle_id}" + additional_bindings {get : "/carbon/oracle/v1/results"} + }; + } + + // Get latest result for all oracles + rpc ResultsLatest(QueryResultsRequest) returns (QueryResultsResponse) { + option (google.api.http).get = "/carbon/oracle/v1/results_latest"; + } + + // Get votes for all oracles, or a specific oracle + rpc Votes(QueryVotesRequest) returns (QueryVotesResponse) { + option (google.api.http) = { + get : "/carbon/oracle/v1/votes/{oracle_id}" + additional_bindings {get : "/carbon/oracle/v1/votes"} + }; + } + + // Get voting power for an address + rpc VoterPower(QueryVoterPowerRequest) returns (QueryVoterPowerResponse) { + option (google.api.http).get = "/carbon/oracle/v1/powers/{address}"; + } + + // Get all slash counters + rpc SlashCounterAll(QueryAllSlashCounterRequest) + returns (QueryAllSlashCounterResponse) { + option (google.api.http).get = "/carbon/oracle/v1/slash_counters"; + } + + // Get slash counter for a valoper address + rpc SlashCounter(QuerySlashCounterRequest) + returns (QuerySlashCounterResponse) { + option (google.api.http).get = + "/carbon/oracle/v1/slash_counters/{valoper_address}"; + } + + // Get all oracle votes window + rpc OracleVotesWindowAll(QueryAllOracleVotesWindowRequest) + returns (QueryAllOracleVotesWindowResponse) { + option (google.api.http).get = "/carbon/oracle/v1/oracle_votes_windows"; + } + + // Get oracle votes window for address + rpc OracleVotesWindow(QueryOracleVotesWindowRequest) + returns (QueryOracleVotesWindowResponse) { + option (google.api.http).get = + "/carbon/oracle/v1/oracle_votes_windows/{valoper_address}"; + } + + rpc OracleContractAddress(QueryContractAddressRequest) + returns (QueryContractAddressResponse) { + option (google.api.http).get = "/carbon/oracle/v1/contracts_address/{id}"; + } + + rpc OracleContractAll(QueryContractAllRequest) + returns (QueryContractAllResponse) { + option (google.api.http).get = "/carbon/oracle/v1/contracts"; + } + + rpc OracleContractParams(QueryContractParamsRequest) + returns (QueryContractParamsResponse) { + option (google.api.http).get = "/carbon/oracle/v1/contract_params/{id}"; + } + + rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { + option (google.api.http).get = "/carbon/oracle/v1/params"; + } +} + +// this line is used by starport scaffolding # 3 +message QueryOracleRequest { string id = 1; } + +message QueryOracleResponse { + Oracle oracle = 1 [ (gogoproto.nullable) = false ]; +} + +message QueryAllOracleRequest { + cosmos.base.query.v1beta1.PageRequest pagination = 1; +} + +message QueryAllOracleResponse { + repeated Oracle oracles = 1 [ (gogoproto.nullable) = false ]; + cosmos.base.query.v1beta1.PageResponse pagination = 2; +} + +message QueryResultsRequest { + string oracle_id = 1; + cosmos.base.query.v1beta1.PageRequest pagination = 2; +} + +message QueryResultsResponse { + repeated Result results = 1 [ (gogoproto.nullable) = false ]; + cosmos.base.query.v1beta1.PageResponse pagination = 2; +} + +message QueryVotesRequest { + string oracle_id = 1; + int64 timestamp = 2; + string voter = 3; + cosmos.base.query.v1beta1.PageRequest pagination = 4; +} + +message QueryVotesResponse { + repeated Vote votes = 1 [ (gogoproto.nullable) = false ]; + cosmos.base.query.v1beta1.PageResponse pagination = 2; +} + +message QueryVoterPowerRequest { string address = 1; } + +message QueryVoterPowerResponse { + string power = 1 [ + (gogoproto.customtype) = "cosmossdk.io/math.Int", + (gogoproto.nullable) = true + ]; +} + +message QueryAllSlashCounterRequest { + cosmos.base.query.v1beta1.PageRequest pagination = 1; +} + +message QueryAllSlashCounterResponse { + repeated SlashCounter slash_counters = 1 [ (gogoproto.nullable) = false ]; + cosmos.base.query.v1beta1.PageResponse pagination = 2; +} + +message QuerySlashCounterRequest { string valoper_address = 1; } + +message QuerySlashCounterResponse { + SlashCounter slash_counter = 1 [ (gogoproto.nullable) = false ]; +} + +message QueryAllOracleVotesWindowRequest { + cosmos.base.query.v1beta1.PageRequest pagination = 1; +} + +message QueryAllOracleVotesWindowResponse { + repeated OracleVotesWindow oracle_votes_windows = 1 + [ (gogoproto.nullable) = false ]; + cosmos.base.query.v1beta1.PageResponse pagination = 2; +} + +message QueryOracleVotesWindowRequest { + string valoper_address = 1; + cosmos.base.query.v1beta1.PageRequest pagination = 2; +} + +message QueryOracleVotesWindowResponse { + repeated OracleVotesWindow oracle_votes_windows = 1 + [ (gogoproto.nullable) = false ]; + cosmos.base.query.v1beta1.PageResponse pagination = 2; +} + +// QueryParamsRequest is request type for the Query/Params RPC method. +message QueryParamsRequest {} + +// QueryParamsResponse is response type for the Query/Params RPC method. +message QueryParamsResponse { + // params holds all the parameters of this module. + Params params = 1 [ (gogoproto.nullable) = false ]; +} + +message QueryContractAddressRequest { string id = 1; } +message QueryContractAddressResponse { string address = 1; } + +message QueryContractAllRequest {} +message QueryContractAllResponse { + repeated Contract contracts = 1 [ (gogoproto.nullable) = false ]; +} + +message QueryContractParamsRequest { string id = 1; } +message QueryContractParamsResponse { + string id = 1; + string creator = 2; + uint64 decimals = 3; + string timestamp = 4; + string data = 5; +} \ No newline at end of file diff --git a/proto/Switcheo/carbon/oracle/slashing.proto b/proto/Switcheo/carbon/oracle/slashing.proto new file mode 100644 index 00000000000..581ff52e74e --- /dev/null +++ b/proto/Switcheo/carbon/oracle/slashing.proto @@ -0,0 +1,20 @@ +syntax = "proto3"; +package Switcheo.carbon.oracle; + +option go_package = "github.com/cometbft/cometbft/oracle/types"; +option (gogoproto.goproto_getters_all) = false; + +import "gogoproto/gogo.proto"; + +message OracleVotesWindow { + string validator = 1; + string oracle_id = 2; + uint64 vote_count = 3; +} + +message SlashCounter { + string validator = 1; + uint64 slash_count = 2; + uint64 prev_slash_count = 3; + uint64 newly_bonded_window_allowance = 4; +} diff --git a/proto/buf.yaml b/proto/buf.yaml index c6e0660f147..96921e0fe65 100644 --- a/proto/buf.yaml +++ b/proto/buf.yaml @@ -1,6 +1,9 @@ version: v1 deps: + - buf.build/cosmos/cosmos-proto + - buf.build/cosmos/cosmos-sdk - buf.build/cosmos/gogo-proto + - buf.build/googleapis/googleapis breaking: use: - FILE diff --git a/redis/generic_value.go b/redis/generic_value.go new file mode 100644 index 00000000000..00681d28146 --- /dev/null +++ b/redis/generic_value.go @@ -0,0 +1,113 @@ +package redis + +import ( + "encoding/json" + "strconv" +) + +// GenericValue provides convenience methods for transforming between different types +type GenericValue struct { + Raw string `json:"raw"` +} + +// IsEmpty checks if the value is empty +func (generic GenericValue) IsEmpty() bool { + return len(generic.Raw) == 0 +} + +// Present checks if the value is not empty +func (generic GenericValue) Present() bool { + return len(generic.Raw) > 0 +} + +// String Returns GenericValue as a string +func (generic GenericValue) String() string { + return generic.Raw +} + +// StringArray Returns GenericValue as a string array +func (generic GenericValue) StringArray() []string { + var array []string + err := json.Unmarshal([]byte(generic.Raw), &array) + if err != nil { + panic(err) + } + return array +} + +// Uint64 Returns GenericValue as a uint64 +func (generic GenericValue) Uint64() uint64 { + if generic.IsEmpty() { + panic("Invalid Uint64") + } + parsedValue, err := strconv.ParseUint(generic.Raw, 10, 64) + if err != nil { + panic(err) + } + + return parsedValue +} + +// Int64 Returns GenericValue as a int64 +func (generic GenericValue) Int64() int64 { + if generic.IsEmpty() { + panic("Invalid Int64") + } + parsedValue, err := strconv.ParseInt(generic.Raw, 10, 64) + if err != nil { + panic(err) + } + + return parsedValue +} + +// Float64 Returns GenericValue as a uint64 +func (generic GenericValue) Float64() float64 { + if generic.IsEmpty() { + panic("Invalid Float64") + } + parsedValue, err := strconv.ParseFloat(generic.Raw, 64) + if err != nil { + panic(err) + } + + return parsedValue +} + +// Float64Array Returns GenericValue as a float64 array +func (generic GenericValue) Float64Array() []float64 { + var array []float64 + err := json.Unmarshal([]byte(generic.Raw), &array) + if err != nil { + panic(err) + } + return array +} + +// StringToGenericValue converts a string to a generic value +func StringToGenericValue(value string) GenericValue { + return GenericValue{ + Raw: value, + } +} + +// Uint64ToGenericValue converts a uint64 to a generic value +func Uint64ToGenericValue(value uint64) GenericValue { + return GenericValue{ + Raw: strconv.FormatUint(value, 10), + } +} + +// Int64ToGenericValue converts an int64 to a generic value +func Int64ToGenericValue(value int64) GenericValue { + return GenericValue{ + Raw: strconv.FormatInt(value, 10), + } +} + +// Float64ToGenericValue converts a float64 to a generic value +func Float64ToGenericValue(value float64) GenericValue { + return GenericValue{ + Raw: strconv.FormatFloat(value, 'f', -1, 64), + } +} diff --git a/redis/redis.go b/redis/redis.go new file mode 100644 index 00000000000..101a3153300 --- /dev/null +++ b/redis/redis.go @@ -0,0 +1,64 @@ +package redis + +import ( + "os" + "strings" + "time" + + "github.com/go-redis/redis" + log "github.com/sirupsen/logrus" +) + +// Client is a reexport of the redis client +type Client = redis.Client + +func GetEnvOr(key string, defaultValue string) string { + value, found := os.LookupEnv(key) + if !found { + return defaultValue + } + return value +} + +func GetSettings(db int) *redis.Options { + dbString := GetEnvOr("REDIS_URL", "") + if dbString != "" { + url, err := redis.ParseURL(dbString) + if err != nil { + panic(err) + } + url.DB = 0 + return url + } + + host := GetEnvOr("REDIS_HOST", "localhost") + port := GetEnvOr("REDIS_PORT", "6379") + password := GetEnvOr("REDIS_PASSWORD", "") + log.Debugf("REDIS_HOST=%v REDIS_HOST=%v REDIS_PASSWORD=%v", host, port, password) + + return &redis.Options{ + Addr: host + ":" + port, + Password: password, // no password set + DB: db, // use default DB + } +} + +// ConnectClient returns a redis client +func ConnectClient(db int) *redis.Client { + client := redis.NewClient(GetSettings(db)) + + // Polling for redis + for { + err := client.Ping().Err() + if err == nil { + break + } + if !strings.HasSuffix(err.Error(), ": connect: connection refused") { + panic("Cannot connect to redis: " + err.Error()) + } + log.Warn("Redis: Unable to connect, retrying in 5 seconds...") + time.Sleep(time.Second) + } + + return client +} diff --git a/redis/service.go b/redis/service.go new file mode 100644 index 00000000000..ef1f4b51a5f --- /dev/null +++ b/redis/service.go @@ -0,0 +1,75 @@ +package redis + +import ( + "fmt" + "time" + + "github.com/go-redis/redis" +) + +// Service is a wrapper around redis.Client +type Service struct { + Client *Client +} + +// NewService constructor for Service +func NewService(db int) Service { + return Service{ + Client: ConnectClient(db), + } +} + +// Exists checks if a redis key exists +func (s Service) Exists(key string) (bool, error) { + exists, err := s.Client.Exists(key).Result() + if err != nil { + return false, err + } + return exists != 0, nil +} + +// Get get redis value +func (s Service) Get(key string) (GenericValue, bool, error) { + value, err := s.Client.Get(key).Result() + if err != nil { + if err == redis.Nil { + return GenericValue{}, false, nil + } + return GenericValue{}, false, err + } + return StringToGenericValue(value), true, nil +} + +// Del clears the value for the given key +func (s Service) Del(key string) error { + err := s.Client.Del(key).Err() + if err != nil { + return err + } + return nil +} + +// Set sets redis value +func (s Service) Set(key string, value GenericValue, t time.Duration) error { + err := s.Client.Set(key, value.String(), t).Err() + if err != nil { + return err + } + return nil +} + +func (s Service) SetNX(key string, value GenericValue, t time.Duration) error { + setnx := s.Client.SetNX(key, value.String(), t) + err := setnx.Err() + if err != nil { + return err + } + res, err := setnx.Result() + if err != nil { + return err + } + if !res { // already exist + return fmt.Errorf("SetNX for key: %s exists", key) + } + return nil +} From c507a87f8a29a657aa66f3b98894a92d08e851e1 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 6 Feb 2024 16:07:31 +0800 Subject: [PATCH 004/150] finishing porting over oracle service and start storing votes --- Makefile | 11 + blocksync/reactor_test.go | 5 +- consensus/byzantine_test.go | 6 +- consensus/common_test.go | 5 +- consensus/reactor_test.go | 5 +- consensus/replay.go | 5 +- consensus/replay_file.go | 5 +- consensus/replay_test.go | 5 +- consensus/wal_generator.go | 5 +- go.mod | 45 +- go.sum | 283 +++++- node/node.go | 14 +- node/node_test.go | 8 + node/setup.go | 2 + oracle/reactor.go | 355 ++++--- .../service/adapters/oracle_result_fetcher.go | 54 +- oracle/service/parser/parser.go | 4 +- oracle/service/runner/runner.go | 79 +- oracle/service/types/{app.go => info.go} | 4 +- oracle/service/types/vote.go | 9 + oracle/types/oracle.pb.go | 910 +++++++++++++++++ oracle/types/query.pb.go | 918 ++++++++++++++++++ proto/Switcheo/carbon/oracle/oracle.proto | 70 +- proto/Switcheo/carbon/oracle/query.proto | 174 +--- proto/Switcheo/carbon/oracle/slashing.proto | 20 - proto/buf.lock | 13 +- proto/buf.yaml | 1 - proto/tendermint/abci/types.proto | 10 +- proto/tendermint/types/validator.proto | 1 - scripts/protocgen.sh | 22 + state/execution.go | 9 +- state/execution_test.go | 41 +- state/validation_test.go | 9 + 33 files changed, 2543 insertions(+), 564 deletions(-) rename oracle/service/types/{app.go => info.go} (75%) create mode 100644 oracle/service/types/vote.go create mode 100644 oracle/types/oracle.pb.go create mode 100644 oracle/types/query.pb.go delete mode 100644 proto/Switcheo/carbon/oracle/slashing.proto create mode 100644 scripts/protocgen.sh diff --git a/Makefile b/Makefile index 7d23666e73a..0b095ee061e 100644 --- a/Makefile +++ b/Makefile @@ -15,6 +15,8 @@ GOOS ?= linux GOARCH ?= amd64 GOARM ?= +DOCKER := $(shell which docker) + ifeq (linux/arm,$(findstring linux/arm,$(TARGETPLATFORM))) GOOS=linux GOARCH=arm @@ -124,11 +126,20 @@ ifeq (,$(shell which clang-format)) endif .PHONY: check-proto-format-deps +protoVer=0.14.0 +protoImageName=ghcr.io/cosmos/proto-builder:$(protoVer) +protoImage=$(DOCKER) run --rm -v $(CURDIR):/workspace --workdir /workspace $(protoImageName) + +proto-gen-carbon: + @echo "Generating Protobuf files" + @$(protoImage) sh ./scripts/protocgen.sh + proto-gen: check-proto-deps @echo "Generating Protobuf files" @go run github.com/bufbuild/buf/cmd/buf generate @mv ./proto/tendermint/abci/types.pb.go ./abci/types/ @cp ./proto/tendermint/rpc/grpc/types.pb.go ./rpc/grpc + @mv ./proto/Switcheo/carbon/oracle/*.pb.go ./oracle/types/ .PHONY: proto-gen # These targets are provided for convenience and are intended for local diff --git a/blocksync/reactor_test.go b/blocksync/reactor_test.go index cd6e640ab75..543be4a8b1f 100644 --- a/blocksync/reactor_test.go +++ b/blocksync/reactor_test.go @@ -25,6 +25,8 @@ import ( "github.com/cometbft/cometbft/store" "github.com/cometbft/cometbft/types" cmttime "github.com/cometbft/cometbft/types/time" + + oracletypes "github.com/cometbft/cometbft/oracle/service/types" ) var config *cfg.Config @@ -108,8 +110,9 @@ func newReactor( stateStore = sm.NewStore(db, sm.StoreOptions{ DiscardABCIResponses: false, }) + oracleInfo := oracletypes.OracleInfo{} blockExec := sm.NewBlockExecutor(stateStore, log.TestingLogger(), proxyApp.Consensus(), - mp, sm.EmptyEvidencePool{}, blockStore) + mp, &oracleInfo, sm.EmptyEvidencePool{}, blockStore) if err = stateStore.Save(state); err != nil { panic(err) } diff --git a/consensus/byzantine_test.go b/consensus/byzantine_test.go index bb72e7932a9..eb13ed37a56 100644 --- a/consensus/byzantine_test.go +++ b/consensus/byzantine_test.go @@ -29,6 +29,8 @@ import ( sm "github.com/cometbft/cometbft/state" "github.com/cometbft/cometbft/store" "github.com/cometbft/cometbft/types" + + oracletypes "github.com/cometbft/cometbft/oracle/service/types" ) //---------------------------------------------- @@ -89,8 +91,10 @@ func TestByzantinePrevoteEquivocation(t *testing.T) { require.NoError(t, err) evpool.SetLogger(logger.With("module", "evidence")) + oracleInfo := oracletypes.OracleInfo{} + // Make State - blockExec := sm.NewBlockExecutor(stateStore, log.TestingLogger(), proxyAppConnCon, mempool, evpool, blockStore) + blockExec := sm.NewBlockExecutor(stateStore, log.TestingLogger(), proxyAppConnCon, mempool, &oracleInfo, evpool, blockStore) cs := NewState(thisConfig.Consensus, state, blockExec, blockStore, mempool, evpool) cs.SetLogger(cs.Logger) // set private validator diff --git a/consensus/common_test.go b/consensus/common_test.go index 95effc131dd..8060c46f71e 100644 --- a/consensus/common_test.go +++ b/consensus/common_test.go @@ -38,6 +38,8 @@ import ( "github.com/cometbft/cometbft/store" "github.com/cometbft/cometbft/types" cmttime "github.com/cometbft/cometbft/types/time" + + oracletypes "github.com/cometbft/cometbft/oracle/service/types" ) const ( @@ -431,7 +433,8 @@ func newStateWithConfigAndBlockStore( panic(err) } - blockExec := sm.NewBlockExecutor(stateStore, log.TestingLogger(), proxyAppConnCon, mempool, evpool, blockStore) + oracleInfo := oracletypes.OracleInfo{} + blockExec := sm.NewBlockExecutor(stateStore, log.TestingLogger(), proxyAppConnCon, mempool, &oracleInfo, evpool, blockStore) cs := NewState(thisConfig.Consensus, state, blockExec, blockStore, mempool, evpool) cs.SetLogger(log.TestingLogger().With("module", "consensus")) cs.SetPrivValidator(pv) diff --git a/consensus/reactor_test.go b/consensus/reactor_test.go index aed400188ac..abd1d5199a1 100644 --- a/consensus/reactor_test.go +++ b/consensus/reactor_test.go @@ -37,6 +37,8 @@ import ( statemocks "github.com/cometbft/cometbft/state/mocks" "github.com/cometbft/cometbft/store" "github.com/cometbft/cometbft/types" + + oracletypes "github.com/cometbft/cometbft/oracle/service/types" ) //---------------------------------------------- @@ -188,7 +190,8 @@ func TestReactorWithEvidence(t *testing.T) { evpool2 := sm.EmptyEvidencePool{} // Make State - blockExec := sm.NewBlockExecutor(stateStore, log.TestingLogger(), proxyAppConnCon, mempool, evpool, blockStore) + oracleInfo := oracletypes.OracleInfo{} + blockExec := sm.NewBlockExecutor(stateStore, log.TestingLogger(), proxyAppConnCon, mempool, &oracleInfo, evpool, blockStore) cs := NewState(thisConfig.Consensus, state, blockExec, blockStore, mempool, evpool2) cs.SetLogger(log.TestingLogger().With("module", "consensus")) cs.SetPrivValidator(pv) diff --git a/consensus/replay.go b/consensus/replay.go index b8e457fa518..c210458cf4c 100644 --- a/consensus/replay.go +++ b/consensus/replay.go @@ -15,6 +15,8 @@ import ( "github.com/cometbft/cometbft/proxy" sm "github.com/cometbft/cometbft/state" "github.com/cometbft/cometbft/types" + + oracletypes "github.com/cometbft/cometbft/oracle/service/types" ) var crc32c = crc32.MakeTable(crc32.Castagnoli) @@ -527,7 +529,8 @@ func (h *Handshaker) replayBlock(state sm.State, height int64, proxyApp proxy.Ap // Use stubs for both mempool and evidence pool since no transactions nor // evidence are needed here - block already exists. - blockExec := sm.NewBlockExecutor(h.stateStore, h.logger, proxyApp, emptyMempool{}, sm.EmptyEvidencePool{}, h.store) + oracleInfo := oracletypes.OracleInfo{} + blockExec := sm.NewBlockExecutor(h.stateStore, h.logger, proxyApp, emptyMempool{}, &oracleInfo, sm.EmptyEvidencePool{}, h.store) blockExec.SetEventBus(h.eventBus) var err error diff --git a/consensus/replay_file.go b/consensus/replay_file.go index 269dcc0fd82..58077bca930 100644 --- a/consensus/replay_file.go +++ b/consensus/replay_file.go @@ -19,6 +19,8 @@ import ( sm "github.com/cometbft/cometbft/state" "github.com/cometbft/cometbft/store" "github.com/cometbft/cometbft/types" + + oracletypes "github.com/cometbft/cometbft/oracle/service/types" ) const ( @@ -329,7 +331,8 @@ func newConsensusStateForReplay(config cfg.BaseConfig, csConfig *cfg.ConsensusCo } mempool, evpool := emptyMempool{}, sm.EmptyEvidencePool{} - blockExec := sm.NewBlockExecutor(stateStore, log.TestingLogger(), proxyApp.Consensus(), mempool, evpool, blockStore) + oracleInfo := oracletypes.OracleInfo{} + blockExec := sm.NewBlockExecutor(stateStore, log.TestingLogger(), proxyApp.Consensus(), mempool, &oracleInfo, evpool, blockStore) consensusState := NewState(csConfig, state.Copy(), blockExec, blockStore, mempool, evpool) diff --git a/consensus/replay_test.go b/consensus/replay_test.go index bcf74387f36..021ff87c775 100644 --- a/consensus/replay_test.go +++ b/consensus/replay_test.go @@ -34,6 +34,8 @@ import ( sm "github.com/cometbft/cometbft/state" smmocks "github.com/cometbft/cometbft/state/mocks" "github.com/cometbft/cometbft/types" + + oracletypes "github.com/cometbft/cometbft/oracle/service/types" ) func TestMain(m *testing.M) { @@ -767,7 +769,8 @@ func testHandshakeReplay(t *testing.T, config *cfg.Config, nBlocks int, mode uin func applyBlock(t *testing.T, stateStore sm.Store, mempool mempool.Mempool, evpool sm.EvidencePool, st sm.State, blk *types.Block, proxyApp proxy.AppConns, bs sm.BlockStore) sm.State { testPartSize := types.BlockPartSizeBytes - blockExec := sm.NewBlockExecutor(stateStore, log.TestingLogger(), proxyApp.Consensus(), mempool, evpool, bs) + oracleInfo := oracletypes.OracleInfo{} + blockExec := sm.NewBlockExecutor(stateStore, log.TestingLogger(), proxyApp.Consensus(), mempool, &oracleInfo, evpool, bs) bps, err := blk.MakePartSet(testPartSize) require.NoError(t, err) diff --git a/consensus/wal_generator.go b/consensus/wal_generator.go index c44e9f68ad0..38d99081fdc 100644 --- a/consensus/wal_generator.go +++ b/consensus/wal_generator.go @@ -21,6 +21,8 @@ import ( sm "github.com/cometbft/cometbft/state" "github.com/cometbft/cometbft/store" "github.com/cometbft/cometbft/types" + + oracletypes "github.com/cometbft/cometbft/oracle/service/types" ) // WALGenerateNBlocks generates a consensus WAL. It does this by spinning up a @@ -83,7 +85,8 @@ func WALGenerateNBlocks(t *testing.T, wr io.Writer, numBlocks int, config *cfg.C }) mempool := emptyMempool{} evpool := sm.EmptyEvidencePool{} - blockExec := sm.NewBlockExecutor(stateStore, log.TestingLogger(), proxyApp.Consensus(), mempool, evpool, blockStore) + oracleInfo := oracletypes.OracleInfo{} + blockExec := sm.NewBlockExecutor(stateStore, log.TestingLogger(), proxyApp.Consensus(), mempool, &oracleInfo, evpool, blockStore) consensusState := NewState(config.Consensus, state.Copy(), blockExec, blockStore, mempool, evpool) consensusState.SetLogger(logger) consensusState.SetEventBus(eventBus) diff --git a/go.mod b/go.mod index d5ca9797615..6a5641311c7 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module github.com/cometbft/cometbft -go 1.20 +go 1.21 + +toolchain go1.21.3 require ( github.com/BurntSushi/toml v1.2.1 @@ -33,7 +35,7 @@ require ( github.com/stretchr/testify v1.8.4 golang.org/x/crypto v0.17.0 golang.org/x/net v0.18.0 - google.golang.org/grpc v1.54.0 + google.golang.org/grpc v1.61.0 ) require ( @@ -42,39 +44,52 @@ require ( ) require ( + cosmossdk.io/math v1.2.0 github.com/Masterminds/semver/v3 v3.2.0 github.com/btcsuite/btcd/btcec/v2 v2.3.2 github.com/btcsuite/btcd/btcutil v1.1.3 - github.com/cometbft/cometbft-db v0.7.0 - github.com/cosmos/gogoproto v1.4.6 + github.com/cometbft/cometbft-db v0.10.0 + github.com/cosmos/gogoproto v1.4.11 github.com/go-git/go-git/v5 v5.6.1 github.com/gofrs/uuid v4.4.0+incompatible - github.com/google/uuid v1.3.0 + github.com/google/uuid v1.4.0 + github.com/holiman/uint256 v1.2.4 github.com/oasisprotocol/curve25519-voi v0.0.0-20220708102147-0a8a51822cae github.com/vektra/mockery/v2 v2.23.1 golang.org/x/sync v0.5.0 gonum.org/v1/gonum v0.12.0 - google.golang.org/protobuf v1.30.0 + google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 + google.golang.org/protobuf v1.31.0 ) require ( - cosmossdk.io/math v1.2.0 // indirect + github.com/DataDog/zstd v1.4.5 // indirect github.com/StackExchange/wmi v1.2.1 // indirect github.com/bits-and-blooms/bitset v1.10.0 // indirect + github.com/cockroachdb/errors v1.8.1 // indirect + github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f // indirect + github.com/cockroachdb/pebble v1.0.0 // indirect + github.com/cockroachdb/redact v1.0.8 // indirect + github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/ethereum/c-kzg-4844 v0.4.0 // indirect github.com/go-ole/go-ole v1.3.0 // indirect - github.com/holiman/uint256 v1.2.4 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/linxGnu/grocksdb v1.8.11 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/rivo/uniseg v0.2.0 // indirect + github.com/rogpeppe/go-internal v1.9.0 // indirect github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect github.com/supranational/blst v0.3.11 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) @@ -133,9 +148,6 @@ require ( github.com/esimonov/ifshort v1.0.4 // indirect github.com/ethereum/go-ethereum v1.13.11 github.com/ettle/strcase v0.1.1 // indirect - github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c // indirect - github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 // indirect - github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 // indirect github.com/fatih/color v1.15.0 // indirect github.com/fatih/structtag v1.2.0 // indirect github.com/felixge/fgprof v0.9.3 // indirect @@ -162,7 +174,7 @@ require ( github.com/gofrs/flock v0.8.1 // indirect github.com/gofrs/uuid/v5 v5.0.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/glog v1.0.0 // indirect + github.com/golang/glog v1.1.2 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 // indirect github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect @@ -174,7 +186,7 @@ require ( github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 // indirect github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 // indirect github.com/google/btree v1.1.2 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-containerregistry v0.13.0 // indirect github.com/google/pprof v0.0.0-20230228050547-1710fef4ab10 // indirect github.com/gordonklaus/ineffassign v0.0.0-20230107090616-13ace0543b28 // indirect @@ -262,7 +274,7 @@ require ( github.com/securego/gosec/v2 v2.15.0 // indirect github.com/sergi/go-diff v1.2.0 // indirect github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c // indirect - github.com/sirupsen/logrus v1.9.0 // indirect + github.com/sirupsen/logrus v1.9.0 github.com/sivchari/containedctx v1.0.2 // indirect github.com/sivchari/nosnakecase v1.7.0 // indirect github.com/sivchari/tenv v1.7.1 // indirect @@ -279,7 +291,6 @@ require ( github.com/subosito/gotenv v1.4.2 // indirect github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c // indirect github.com/tdakkota/asciicheck v0.2.0 // indirect - github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c // indirect github.com/tetafro/godot v1.4.11 // indirect github.com/tidwall/gjson v1.17.0 github.com/timakin/bodyclose v0.0.0-20221125081123-e39cf3fc478e // indirect @@ -293,7 +304,7 @@ require ( github.com/yagipy/maintidx v1.0.0 // indirect github.com/yeya24/promlinter v0.2.0 // indirect gitlab.com/bosi/decorder v0.2.3 // indirect - go.etcd.io/bbolt v1.3.6 // indirect + go.etcd.io/bbolt v1.3.8 // indirect go.opentelemetry.io/otel v1.14.0 // indirect go.opentelemetry.io/otel/sdk v1.14.0 // indirect go.opentelemetry.io/otel/trace v1.14.0 // indirect @@ -307,7 +318,7 @@ require ( golang.org/x/term v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.15.0 // indirect - google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect + google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index d2f4136780b..8cd4f0cbc0c 100644 --- a/go.sum +++ b/go.sum @@ -44,6 +44,7 @@ cosmossdk.io/math v1.2.0/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Abirdcfly/dupword v0.0.11 h1:z6v8rMETchZXUIuHxYNmlUAuKuB21PeaSymTed16wgU= github.com/Abirdcfly/dupword v0.0.11/go.mod h1:wH8mVGuf3CP5fsBTkfWwwwKTjDnVVCxtU8d8rgeVYXA= +github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/Antonboom/errname v0.1.9 h1:BZDX4r3l4TBZxZ2o2LNrlGxSHran4d1u4veZdoORTT4= github.com/Antonboom/errname v0.1.9/go.mod h1:nLTcJzevREuAsgTbG85UsuiWpMpAqbKD1HNZ29OzE58= github.com/Antonboom/nilnil v0.1.3 h1:6RTbx3d2mcEu3Zwq9TowQpQMVpP75zugwOtqY1RTtcE= @@ -54,18 +55,23 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= +github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= +github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= +github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM= github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 h1:+r1rSv4gvYn0wmRjC8X7IAzX8QezqtFV9m0MUHFJgts= github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= +github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= -github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= @@ -76,14 +82,19 @@ github.com/OpenPeeDeeP/depguard v1.1.1 h1:TSUznLjvp/4IUP+OQ0t/4jF4QUyxIcVX8YnghZ github.com/OpenPeeDeeP/depguard v1.1.1/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc= github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 h1:wPbRQzjjwFc0ih8puEVAOFGELsn1zoIIYdxvML7mDxA= github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g= +github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= +github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= +github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/acomagu/bufpipe v1.0.4 h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ= github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -102,7 +113,9 @@ github.com/ashanbrown/forbidigo v1.5.1 h1:WXhzLjOlnuDYPYQo/eFlcFMi8X/kLfvWLYu6CS github.com/ashanbrown/forbidigo v1.5.1/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU= github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s= github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= +github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= +github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -155,6 +168,7 @@ github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7N github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= +github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= @@ -180,8 +194,23 @@ github.com/cloudflare/circl v1.3.1/go.mod h1:+CauBF6R70Jqcyl8N2hC8pAXYbWkGIezuSb github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cometbft/cometbft-db v0.7.0 h1:uBjbrBx4QzU0zOEnU8KxoDl18dMNgDh+zZRUE0ucsbo= -github.com/cometbft/cometbft-db v0.7.0/go.mod h1:yiKJIm2WKrt6x8Cyxtq9YTEcIMPcEe4XPxhgX59Fzf0= +github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= +github.com/cockroachdb/errors v1.8.1 h1:A5+txlVZfOqFBDa4mGz2bUWSp0aHElvHX2bKkdbQu+Y= +github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= +github.com/cockroachdb/pebble v1.0.0 h1:WZWlV/s78glZbY2ylUITDOWSVBD3cLjcWPLRPFbHNYg= +github.com/cockroachdb/pebble v1.0.0/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= +github.com/cockroachdb/redact v1.0.8 h1:8QG/764wK+vmEYoOlfobpe12EQcS81ukx/a4hdVMxNw= +github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +github.com/cometbft/cometbft-db v0.10.0 h1:VMBQh88zXn64jXVvj39tlu/IgsGR84T7ImjS523DCiU= +github.com/cometbft/cometbft-db v0.10.0/go.mod h1:7RR7NRv99j7keWJ5IkE9iZibUTKYdtepXTp7Ra0FxKk= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= @@ -190,21 +219,25 @@ github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkX github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/containerd/stargz-snapshotter/estargz v0.12.1 h1:+7nYmHJb0tEkcRaAW+MHqoKaJYZmkikupxCqVtmPuY0= +github.com/containerd/stargz-snapshotter/estargz v0.12.1/go.mod h1:12VUuCq3qPq4y8yUW+l5w3+oXV3cx2Po3KSe/SmPGqw= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cosmos/gogoproto v1.4.6 h1:Ee7z15dWJaGlgM2rWrK8N2IX7PQcuccu8oG68jp5RL4= -github.com/cosmos/gogoproto v1.4.6/go.mod h1:VS/ASYmPgv6zkPKLjR9EB91lwbLHOzaGCirmKKhncfI= +github.com/cosmos/gogoproto v1.4.11 h1:LZcMHrx4FjUgrqQSWeaGC1v/TeuVFqSLa43CC6aWR2g= +github.com/cosmos/gogoproto v1.4.11/go.mod h1:/g39Mh8m17X8Q/GDEs5zYTSNaNnInBSohtaxzQnYq1Y= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= +github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= +github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDUstnC9DIo= github.com/curioswitch/go-reassign v0.2.0/go.mod h1:x6OpXuWvgfQaMGks2BZybTngWjT84hqJfKoO8Tt/Roc= github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= @@ -224,14 +257,19 @@ github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0 github.com/denis-tingaikin/go-header v0.4.3 h1:tEaZKAlqql6SKCY++utLmkPLd6K8IBM20Ha7UVm+mtU= github.com/denis-tingaikin/go-header v0.4.3/go.mod h1:0wOCWuN71D5qIgE2nz9KrKmuYBAC2Mra5RassOIQ2/c= github.com/denisenkom/go-mssqldb v0.12.0 h1:VtrkII767ttSPNRfFekePK3sctr+joXgO58stqQbtUA= +github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= +github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/docker/cli v23.0.1+incompatible h1:LRyWITpGzl2C9e9uGxzisptnxAn1zfZKXy13Ul2Q5oM= github.com/docker/cli v23.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= @@ -248,6 +286,7 @@ github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -258,42 +297,53 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/esimonov/ifshort v1.0.4 h1:6SID4yGWfRae/M7hkVDVVyppy8q/v9OuxNdmjLQStBA= github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= +github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.13.11 h1:b51Dsm+rEg7anFRUMGB8hODXHvNfcRKzz9vcj8wSdUs= github.com/ethereum/go-ethereum v1.13.11/go.mod h1:gFtlVORuUcT+UUIcJ/veCNjkuOSujCi338uSHJrYAew= github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw= github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= -github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= -github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= -github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= -github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= -github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 h1:7HZCaLC5+BZpmbhCOZJ293Lz68O7PYrF2EzeiFMwCLk= -github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= +github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g= github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw= github.com/firefart/nonamedreturns v1.0.4 h1:abzI1p7mAEPYuR4A+VLKn4eNDOycjYo2phmY9sfv40Y= github.com/firefart/nonamedreturns v1.0.4/go.mod h1:TDhe/tjI1BXo48CmYbUduTV7BdIga8MAO/xbKdcVsGI= +github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= +github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= +github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= +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/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= +github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-chi/chi/v5 v5.0.8 h1:lD+NLqFcAi1ovnVZpsnObHGW4xb4J8lNmoYVfECH1Y0= github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-critic/go-critic v0.7.0 h1:tqbKzB8pqi0NsRZ+1pyU4aweAF7A7QN0Pi4Q02+rYnQ= github.com/go-critic/go-critic v0.7.0/go.mod h1:moYzd7GdVXE2C2hYTwd7h0CPcqlUeclsyBRwMa38v64= +github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= @@ -323,14 +373,20 @@ github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg= github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-redis/redis/v7 v7.4.0 h1:7obg6wUoj05T0EpY0o8B59S9w5yeMWql7sw2kwNW1x4= +github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= +github.com/go-redis/redis/v8 v8.11.4 h1:kHoYkfZP6+pe04aFTnhDH6GDROa5yJdHJVNxV3F46Tg= +github.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w= github.com/go-redsync/redsync/v4 v4.11.0 h1:OPEcAxHBb95EzfwCKWM93ksOwHd5bTce2BD4+R14N6k= github.com/go-redsync/redsync/v4 v4.11.0/go.mod h1:ZfayzutkgeBmEmBlUR3j+rF6kN44UUGtEdfzhBFZTPc= github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-toolsmith/astcast v1.1.0 h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8= github.com/go-toolsmith/astcast v1.1.0/go.mod h1:qdcuFWeGGS2xX5bLM/c3U9lewg7+Zu4mr+xPwZIB4ZU= @@ -344,6 +400,7 @@ github.com/go-toolsmith/astfmt v1.1.0/go.mod h1:OrcLlRwu0CuiIBp/8b5PYF9ktGVZUjlN github.com/go-toolsmith/astp v1.1.0 h1:dXPuCl6u2llURjdPLLDxJeZInAeZ0/eZwFJmqZMnpQA= github.com/go-toolsmith/astp v1.1.0/go.mod h1:0T1xFGz9hicKs8Z5MfAqSUitoUYS30pDMsRVIDHs8CA= github.com/go-toolsmith/pkgload v1.2.2 h1:0CtmHq/02QhxcF7E9N5LIFcYFsMR5rdovfqTtRKkgIk= +github.com/go-toolsmith/pkgload v1.2.2/go.mod h1:R2hxLNRKuAsiXCo2i5J6ZQPhnPMOVtU+f0arbFPWCus= github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQiyP2Bvw= github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ= @@ -353,6 +410,9 @@ github.com/go-xmlfmt/xmlfmt v1.1.2 h1:Nea7b4icn8s57fTx1M5AI4qQT5HEM3rVUO8MuE6g80 github.com/go-xmlfmt/xmlfmt v1.1.2/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= @@ -361,14 +421,22 @@ github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1 github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid/v5 v5.0.0 h1:p544++a97kEL+svbcFbCQVM9KFu0Yo25UoISXGNNH9M= github.com/gofrs/uuid/v5 v5.0.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8= +github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188 h1:+eHOFJl1BaXrQxKX+T06f78590z4qA2ZzBTqahsKSE4= +github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= +github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -398,8 +466,8 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= @@ -421,6 +489,9 @@ github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 h1:DIPQnGy2Gv2FSA github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6/go.mod h1:0AKcRCkMoKvUvlf89F6O7H2LYdhr1zBh736mBItOdRs= github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys= github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= +github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws= +github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= @@ -437,11 +508,15 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-containerregistry v0.13.0 h1:y1C7Z3e149OJbOPDBxLYR8ITPz8dTKqQwjErKVHJC8k= github.com/google/go-containerregistry v0.13.0/go.mod h1:J9FQ+eSS4a1aC2GNZxvNpbWhgp0487v+cgiilB4FqDo= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -462,15 +537,18 @@ github.com/google/pprof v0.0.0-20230228050547-1710fef4ab10 h1:CqYfpuYIjnlNxM3msd github.com/google/pprof v0.0.0-20230228050547-1710fef4ab10/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gordonklaus/ineffassign v0.0.0-20230107090616-13ace0543b28 h1:9alfqbrhuD+9fLZ4iaAVwhlp5PEhmnBt7yvK2Oy5C1U= github.com/gordonklaus/ineffassign v0.0.0-20230107090616-13ace0543b28/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= @@ -484,13 +562,17 @@ github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3 github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= github.com/gostaticanalysis/testutil v0.4.0 h1:nhdCmubdmDF6VEatUNjgUZBJKWRqugoISdUv3PPQgHY= +github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU= github.com/gotestyourself/gotestyourself v2.2.0+incompatible h1:AQwinXlbQR2HvPjQZOmDhRqsv5mZf+Jb1RnSLxcqZcI= github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= +github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= @@ -500,9 +582,16 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= +github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -510,12 +599,19 @@ github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1: github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/informalsystems/tm-load-test v1.3.0 h1:FGjKy7vBw6mXNakt+wmNWKggQZRsKkEYpaFk/zR64VA= github.com/informalsystems/tm-load-test v1.3.0/go.mod h1:OQ5AQ9TbT5hKWBNIwsMjn6Bf4O0U4b1kRc+0qZlQJKw= +github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= +github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= +github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= +github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= +github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jdxcode/netrc v0.0.0-20221124155335-4616370d1a84 h1:2uT3aivO7NVpUPGcQX7RbHijHMyWix/yCnIrCWc+5co= @@ -526,6 +622,7 @@ github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c github.com/jgautheron/goconst v1.5.1 h1:HxVbL1MhydKs8R8n/HE5NPvzfaYmQJA3o879lE4+WcM= github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= +github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg= @@ -542,14 +639,24 @@ github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= +github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= +github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY= github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= github.com/junk1tm/musttag v0.5.0 h1:bV1DTdi38Hi4pG4OVWa7Kap0hi0o7EczuK6wQt9zPOM= github.com/junk1tm/musttag v0.5.0/go.mod h1:PcR7BA+oREQYvHwgjIDmw3exJeds5JzRcvEJTfjrA0M= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= +github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= +github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= +github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw= +github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/errcheck v1.6.3 h1:dEKh+GLHcWm2oN34nMvDzn1sqI0i0WxPvrgiJA5JuM8= github.com/kisielk/errcheck v1.6.3/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= @@ -558,9 +665,12 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/kkHAIKE/contextcheck v1.1.4 h1:B6zAaLhOEEcjvUgIYEqystmnFk1Oemn8bvJhbt0GMb8= github.com/kkHAIKE/contextcheck v1.1.4/go.mod h1:1+i/gWqokIa+dm31mqGLZhZJ7Uh44DJGZVmr6QRBNJg= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw1HU4= github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE= github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -570,6 +680,7 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -578,18 +689,26 @@ github.com/kulti/thelper v0.6.3 h1:ElhKf+AlItIu+xGnI990no4cE2+XaSu1ULymV2Yulxs= github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= github.com/kunwardeep/paralleltest v1.0.6 h1:FCKYMF1OF2+RveWlABsdnmsvJrei5aoyZoaGS+Ugg8g= github.com/kunwardeep/paralleltest v1.0.6/go.mod h1:Y0Y0XISdZM5IKm3TREQMZ6iteqn1YuwCsJO/0kL9Zes= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/kyoh86/exportloopref v0.1.11 h1:1Z0bcmTypkL3Q4k+IDHMWTcnCliEZcaPiIe0/ymEyhQ= github.com/kyoh86/exportloopref v0.1.11/go.mod h1:qkV4UF1zGl6EkF1ox8L5t9SwyeBAZ3qLMd6up458uqA= +github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/ldez/gomoddirectives v0.2.3 h1:y7MBaisZVDYmKvt9/l1mjNCiSA1BVn34U0ObUcJwlhA= github.com/ldez/gomoddirectives v0.2.3/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= github.com/ldez/tagliatelle v0.4.0 h1:sylp7d9kh6AdXN2DpVGHBRb5guTVAgOxqNGhbqc4b1c= github.com/ldez/tagliatelle v0.4.0/go.mod h1:mNtTfrHy2haaBAw+VT7IBV6VXBThS7TCreYWbBcJ87I= +github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/leonklingele/grouper v1.1.1 h1:suWXRU57D4/Enn6pXR0QVqqWWrnJ9Osrz+5rjt8ivzU= github.com/leonklingele/grouper v1.1.1/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= +github.com/linxGnu/grocksdb v1.8.11 h1:BGol9e5gB1BrsTvOxloC88pe70TCqgrfLNwkyWW0kD8= +github.com/linxGnu/grocksdb v1.8.11/go.mod h1:xZCIb5Muw+nhbDK4Y5UJuOrin5MceOuiXkVUR7vp4WY= github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCEtOM= github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -604,24 +723,33 @@ github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26/go.mod h1:1BELzlh859 github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.14.9 h1:10HX2Td0ocZpYEjhilsuo6WWtUqttj2Kb0KtD86/KYA= +github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mbilski/exhaustivestruct v1.2.0 h1:wCBmUnSYufAHO6J4AVWY6ff+oxWxsVFrwgOdMUQePUo= github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= +github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= +github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= github.com/mgechev/revive v1.3.1 h1:OlQkcH40IB2cGuprTPcjB0iIUddgVZgGmDX3IAMR8D4= github.com/mgechev/revive v1.3.1/go.mod h1:YlD6TTWl2B8A103R9KWJSPVI9DrEf+oqr15q21Ld+5I= +github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= @@ -629,6 +757,8 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= +github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/avo v0.5.0/go.mod h1:ChHFdoV7ql95Wi7vuq2YT1bwCJqiWdZrQ1im3VujLYM= @@ -645,11 +775,15 @@ github.com/moricho/tparallel v0.3.0 h1:8dDx3S3e+jA+xiQXC7O3dvfRTe/J+FYlTDDW01Y7z github.com/moricho/tparallel v0.3.0/go.mod h1:leENX2cUv7Sv2qDgdi0D0fCftN8fRC67Bcn8pqzeYNI= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= +github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= +github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 h1:4kuARK6Y6FxaNu/BnU2OAaLF86eTVhP2hjTB6iMvItA= github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= @@ -668,14 +802,17 @@ github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6 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= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo/v2 v2.8.0 h1:pAM+oBNPrpXRs+E/8spkeGx9QgekbRVyr74EUvRVOUI= +github.com/onsi/ginkgo/v2 v2.8.0/go.mod h1:6JsQiECmxCa3V5st74AL/AmsV482EDdVrGaVW6z3oYU= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.26.0 h1:03cDLK28U6hWvCAns6NeydX3zIm4SF3ci69ulidS32Q= +github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034= @@ -687,6 +824,7 @@ github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuh github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= github.com/ory/dockertest/v3 v3.9.1 h1:v4dkG+dlu76goxMiTT2j8zV7s4oPPEppKT8K8p2f1kY= +github.com/ory/dockertest/v3 v3.9.1/go.mod h1:42Ir9hmvaAPm0Mgibk6mBPi7SFvTXxEcnztDYOJ//uM= github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k= github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= @@ -698,10 +836,13 @@ github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvI github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -756,9 +897,15 @@ github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4l github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/redis/go-redis/v9 v9.0.2 h1:BA426Zqe/7r56kCcvxYLWe1mkaz71LKF77GwgFzSxfE= +github.com/redis/go-redis/v9 v9.0.2/go.mod h1:/xDTe9EF1LM61hek62Poq2nzQSGj0xSrEtEHbBQevps= +github.com/redis/rueidis v1.0.19 h1:s65oWtotzlIFN8eMPhyYwxlwLR1lUdhza2KtWprKYSo= +github.com/redis/rueidis v1.0.19/go.mod h1:8B+r5wdnjwK3lTFml5VtxjzGOQAC+5UmujoD12pDrEo= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= @@ -772,6 +919,7 @@ github.com/ryancurrah/gomodguard v1.3.0 h1:q15RT/pd6UggBXVBuLps8BXRvl5GPBcwVA7BJ github.com/ryancurrah/gomodguard v1.3.0/go.mod h1:ggBxb3luypPEzqVtq33ee7YSN35V28XeGnid8dnni50= github.com/ryanrolds/sqlclosecheck v0.4.0 h1:i8SX60Rppc1wRuyQjMciLqIzV3xnoHB7/tXbr6RGYNI= github.com/ryanrolds/sqlclosecheck v0.4.0/go.mod h1:TBRRjzL31JONc9i4XMinicuo+s+E8yKZ5FN8X3G6CKQ= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sanposhiho/wastedassign/v2 v2.0.7 h1:J+6nrY4VW+gC9xFzUc+XjPD3g3wF3je/NsJFwFK7Uxc= github.com/sanposhiho/wastedassign/v2 v2.0.7/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= @@ -782,6 +930,7 @@ github.com/sashamelentyev/usestdlibvars v1.23.0 h1:01h+/2Kd+NblNItNeux0veSL5cBF1 github.com/sashamelentyev/usestdlibvars v1.23.0/go.mod h1:YPwr/Y1LATzHI93CqoPUN/2BzGQ/6N/cl/KwgR0B/aU= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/securego/gosec/v2 v2.15.0 h1:v4Ym7FF58/jlykYmmhZ7mTm7FQvN/setNm++0fgIAtw= github.com/securego/gosec/v2 v2.15.0/go.mod h1:VOjTrZOkUtSDt2QLSJmQBMWnvwiQPEjg0l+5juIqGk8= @@ -810,6 +959,8 @@ github.com/sivchari/tenv v1.7.1 h1:PSpuD4bu6fSmtWMxSGWcvqUUgIn7k3yOJhOIzVWn8Ak= github.com/sivchari/tenv v1.7.1/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= github.com/skeema/knownhosts v1.1.0 h1:Wvr9V0MxhjRbl3f9nMnKnFfiWTJmtECJ9Njkea3ysW0= github.com/skeema/knownhosts v1.1.0/go.mod h1:sKFq3RD6/TKZkSWn8boUbDC7Qkgcv+8XXijpFO6roag= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa h1:YJfZp12Z3AFhSBeXOlv4BO55RMwPn2NoQeDsrdWnBtY= github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= github.com/sonatard/noctx v0.0.2 h1:L7Dz4De2zDQhW8S0t+KUjY0MAQJd6SgVwhzNIc4ok00= @@ -840,6 +991,8 @@ github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= +github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= +github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stbenjam/no-sprintf-host-port v0.1.1 h1:tYugd/yrm1O0dV+ThCbaKZh195Dfm07ysF0U6JQXczc= github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -857,9 +1010,11 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stvp/tempredis v0.0.0-20181119212430-b82af8480203 h1:QVqDTf3h2WHt08YuiTGPZLls0Wq99X9bWd0Q5ZSBesM= +github.com/stvp/tempredis v0.0.0-20181119212430-b82af8480203/go.mod h1:oqN97ltKNihBbwlX8dLpwxCl3+HnXKV/R0e+sRLd9C8= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= @@ -871,8 +1026,6 @@ github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c h1:+aPplB github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c/go.mod h1:SbErYREK7xXdsRiigaQiQkI9McGRzYMvlKYaP3Nimdk= github.com/tdakkota/asciicheck v0.2.0 h1:o8jvnUANo0qXtnslk2d3nMKTFNlOnJjRrNcj0j9qkHM= github.com/tdakkota/asciicheck v0.2.0/go.mod h1:Qb7Y9EgjCLJGup51gDHFzbI08/gbGhL/UVhYIPWG2rg= -github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= -github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA= github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag= @@ -897,29 +1050,51 @@ github.com/tomarrell/wrapcheck/v2 v2.8.1 h1:HxSqDSN0sAt0yJYsrcYVoEeyM4aI9yAm3KQp github.com/tomarrell/wrapcheck/v2 v2.8.1/go.mod h1:/n2Q3NZ4XFT50ho6Hbxg+RV1uyo2Uow/Vdm9NQcl5SE= github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw= github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ultraware/funlen v0.0.3 h1:5ylVWm8wsNwH5aWo9438pwvsK0QiqVuUrt9bn7S/iLA= github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= github.com/ultraware/whitespace v0.0.5 h1:hh+/cpIcopyMYbZNVov9iSxvJU3OYQg78Sfaqzi/CzI= github.com/ultraware/whitespace v0.0.5/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= +github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= +github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/uudashr/gocognit v1.0.6 h1:2Cgi6MweCsdB6kpcVQp7EW4U23iBFQWfTXiWlyp842Y= github.com/uudashr/gocognit v1.0.6/go.mod h1:nAIUuVBnYU7pcninia3BHOvQkpQCeO76Uscky5BOwcY= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/vbatts/tar-split v0.11.2 h1:Via6XqJr0hceW4wff3QRzD5gAk/tatMw/4ZA7cTlIME= +github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= github.com/vektra/mockery/v2 v2.23.1 h1:N59FENM2d/gWE6Ns5JPuf9a7jqQWeheGefZqvuvb1dM= github.com/vektra/mockery/v2 v2.23.1/go.mod h1:Zh3Kv1ckKs6FokhlVLcCu6UTyzfS3M8mpROz1lBNp+w= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= github.com/yeya24/promlinter v0.2.0 h1:xFKDQ82orCU5jQujdaD8stOHiv8UN68BSdn2a8u8Y3o= github.com/yeya24/promlinter v0.2.0/go.mod h1:u54lkmBOZrpEbQQ6gox2zWKKLKu2SGe+2KOiextY+IA= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -929,8 +1104,8 @@ github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= gitlab.com/bosi/decorder v0.2.3 h1:gX4/RgK16ijY8V+BRQHAySfQAb354T7/xQpDB2n10P0= gitlab.com/bosi/decorder v0.2.3/go.mod h1:9K1RB5+VPNQYtXtTDAzd2OEftsZb1oV0IrJrzChSdGE= -go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= +go.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA= +go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -946,6 +1121,7 @@ go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+go go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= @@ -957,6 +1133,7 @@ golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -968,8 +1145,6 @@ golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.0.0-20220826181053-bd7e27e6170d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -982,8 +1157,6 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230307190834-24139beb5833 h1:SChBja7BCQewoTAU7IgvucQKMIXrEpFxNMs0spT3/5s= -golang.org/x/exp v0.0.0-20230307190834-24139beb5833/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= @@ -1020,8 +1193,6 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1029,9 +1200,11 @@ golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -1040,6 +1213,7 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1073,8 +1247,6 @@ golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1099,9 +1271,7 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1111,6 +1281,7 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1121,6 +1292,7 @@ golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1149,7 +1321,6 @@ golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1189,8 +1360,6 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= @@ -1203,8 +1372,7 @@ golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1218,22 +1386,25 @@ golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.1.0 h1:xYY+Bajn2a7VBmTM5GikTmnK8ZuX8YgnQCqZpbBNtmA= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -1298,8 +1469,6 @@ golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1334,6 +1503,7 @@ google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1370,8 +1540,13 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f h1:BWUVssLB0HVOSY78gIdvk1dTVYtT1y8SBWtPYuTJ/6w= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ= +google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= +google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1388,8 +1563,8 @@ google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.54.0 h1:EhTqbhiYeixwWQtAEZAxmV9MGqcjEU2mFx52xCzNyag= -google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= +google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0= +google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1403,8 +1578,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 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= @@ -1415,8 +1590,13 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= @@ -1435,6 +1615,7 @@ gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1458,3 +1639,5 @@ rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/node/node.go b/node/node.go index 21ef92144a9..daf4edcc027 100644 --- a/node/node.go +++ b/node/node.go @@ -39,6 +39,9 @@ import ( cmttime "github.com/cometbft/cometbft/types/time" "github.com/cometbft/cometbft/version" + "github.com/cometbft/cometbft/oracle" + oracletypes "github.com/cometbft/cometbft/oracle/service/types" + _ "net/http/pprof" //nolint: gosec ) @@ -67,6 +70,8 @@ type Node struct { bcReactor p2p.Reactor // for block-syncing mempoolReactor p2p.Reactor // for gossipping transactions mempool mempl.Mempool + oracleReactor oracle.Reactor + oracleInfo *oracletypes.OracleInfo stateSync bool // whether the node should state sync on startup stateSyncReactor *statesync.Reactor // for hosting and restoring state sync snapshots stateSyncProvider statesync.StateProvider // provides state data for bootstrapping a node @@ -375,12 +380,17 @@ func NewNodeWithContext(ctx context.Context, return nil, err } + // Make OracleReactor + oracleReactor := oracle.NewReactor("", "127.0.0.1:9090") + oracleInfo := oracleReactor.OracleInfo + // make block executor for consensus and blocksync reactors to execute blocks blockExec := sm.NewBlockExecutor( stateStore, logger.With("module", "state"), proxyApp.Consensus(), mempool, + oracleInfo, evidencePool, blockStore, sm.BlockExecutorWithMetrics(smMetrics), @@ -432,7 +442,7 @@ func NewNodeWithContext(ctx context.Context, // Setup Switch. p2pLogger := logger.With("module", "p2p") sw := createSwitch( - config, transport, p2pMetrics, peerFilters, mempoolReactor, bcReactor, + config, transport, p2pMetrics, peerFilters, mempoolReactor, oracleReactor, bcReactor, stateSyncReactor, consensusReactor, evidenceReactor, nodeInfo, nodeKey, p2pLogger, ) @@ -487,6 +497,8 @@ func NewNodeWithContext(ctx context.Context, bcReactor: bcReactor, mempoolReactor: mempoolReactor, mempool: mempool, + oracleReactor: *oracleReactor, + oracleInfo: oracleInfo, consensusState: consensusState, consensusReactor: consensusReactor, stateSyncReactor: stateSyncReactor, diff --git a/node/node_test.go b/node/node_test.go index 01d5f0f8fcc..80c1f5e8a89 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -32,6 +32,8 @@ import ( "github.com/cometbft/cometbft/store" "github.com/cometbft/cometbft/types" cmttime "github.com/cometbft/cometbft/types/time" + + oracletypes "github.com/cometbft/cometbft/oracle/service/types" ) func TestNodeStartStop(t *testing.T) { @@ -313,11 +315,14 @@ func TestCreateProposalBlock(t *testing.T) { assert.NoError(t, err) } + oracleInfo := oracletypes.OracleInfo{} + blockExec := sm.NewBlockExecutor( stateStore, logger, proxyApp.Consensus(), mempool, + &oracleInfo, evidencePool, blockStore, ) @@ -390,11 +395,14 @@ func TestMaxProposalBlockSize(t *testing.T) { err = mempool.CheckTx(tx, nil, mempl.TxInfo{}) assert.NoError(t, err) + oracleInfo := oracletypes.OracleInfo{} + blockExec := sm.NewBlockExecutor( stateStore, logger, proxyApp.Consensus(), mempool, + &oracleInfo, sm.EmptyEvidencePool{}, blockStore, ) diff --git a/node/setup.go b/node/setup.go index 9f64219ff41..56a083ba1ae 100644 --- a/node/setup.go +++ b/node/setup.go @@ -399,6 +399,7 @@ func createSwitch(config *cfg.Config, p2pMetrics *p2p.Metrics, peerFilters []p2p.PeerFilterFunc, mempoolReactor p2p.Reactor, + oracleReactor p2p.Reactor, bcReactor p2p.Reactor, stateSyncReactor *statesync.Reactor, consensusReactor *cs.Reactor, @@ -415,6 +416,7 @@ func createSwitch(config *cfg.Config, ) sw.SetLogger(p2pLogger) sw.AddReactor("MEMPOOL", mempoolReactor) + sw.AddReactor("ORACLE", oracleReactor) sw.AddReactor("BLOCKSYNC", bcReactor) sw.AddReactor("CONSENSUS", consensusReactor) sw.AddReactor("EVIDENCE", evidenceReactor) diff --git a/oracle/reactor.go b/oracle/reactor.go index 72e942721e1..1f88666ea18 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -1,16 +1,27 @@ package oracle import ( - "errors" + "encoding/json" "fmt" + "io" + "os" "time" - cfg "github.com/cometbft/cometbft/config" - "github.com/cometbft/cometbft/libs/clist" + "github.com/sirupsen/logrus" + + // cfg "github.com/cometbft/cometbft/config" + "github.com/cometbft/cometbft/libs/log" + "github.com/cometbft/cometbft/oracle/service/adapters" + "github.com/cometbft/cometbft/oracle/service/runner" + oracletypes "github.com/cometbft/cometbft/oracle/service/types" "github.com/cometbft/cometbft/p2p" - protomem "github.com/cometbft/cometbft/proto/tendermint/mempool" + "github.com/cometbft/cometbft/redis" "github.com/cometbft/cometbft/types" + + "google.golang.org/grpc" + "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/credentials/insecure" ) // Reactor handles mempool tx broadcasting amongst peers. @@ -18,186 +29,248 @@ import ( // peers you received it from. type Reactor struct { p2p.BaseReactor - config *cfg.MempoolConfig - mempool *CListMempool - ids *mempoolIDs + OracleInfo *oracletypes.OracleInfo + grpcAddress string + // config *cfg.MempoolConfig + // mempool *CListMempool + // ids *mempoolIDs } // NewReactor returns a new Reactor with the given config and mempool. -func NewReactor(config *cfg.MempoolConfig, mempool *CListMempool) *Reactor { +func NewReactor(configPath string, grpcAddress string) *Reactor { + // load oracle.json config if present + jsonFile, openErr := os.Open(configPath) + if openErr != nil { + logrus.Warnf("[oracle] error opening oracle.json config file: %v", openErr) + } + + bytes, err := io.ReadAll(jsonFile) + if err != nil { + logrus.Warnf("[oracle] error reading oracle.json config file: %v", err) + } + + var config oracletypes.Config + err = json.Unmarshal(bytes, &config) + if err != nil { + logrus.Warnf("[oracle] error parsing oracle.json config file: %v", err) + } + + oracleInfo := oracletypes.OracleInfo{ + Oracles: nil, + Config: config, + } + + jsonFile.Close() + memR := &Reactor{ - config: config, - mempool: mempool, - ids: newMempoolIDs(), + OracleInfo: &oracleInfo, + grpcAddress: grpcAddress, } - memR.BaseReactor = *p2p.NewBaseReactor("Mempool", memR) + memR.BaseReactor = *p2p.NewBaseReactor("Oracle", memR) + return memR } // InitPeer implements Reactor by creating a state for the peer. -func (memR *Reactor) InitPeer(peer p2p.Peer) p2p.Peer { - memR.ids.ReserveForPeer(peer) - return peer -} +// func (memR *Reactor) InitPeer(peer p2p.Peer) p2p.Peer { +// memR.ids.ReserveForPeer(peer) +// return peer +// } // SetLogger sets the Logger on the reactor and the underlying mempool. func (memR *Reactor) SetLogger(l log.Logger) { memR.Logger = l - memR.mempool.SetLogger(l) + memR.BaseService.SetLogger(l) } // OnStart implements p2p.BaseReactor. func (memR *Reactor) OnStart() error { - if !memR.config.Broadcast { - memR.Logger.Info("Tx broadcasting is disabled") + memR.OracleInfo.Redis = redis.NewService(0) + + grpcMaxRetryCount := 12 + retryCount := 0 + sleepTime := time.Second + var client *grpc.ClientConn + + for { + logrus.Infof("[oracle] trying to connect to grpc with address %s : %d", memR.grpcAddress, retryCount) + if retryCount == grpcMaxRetryCount { + panic("failed to connect to grpc:grpcClient after 12 tries") + } + time.Sleep(sleepTime) + + // reinit otherwise connection will be idle, in idle we can't tell if it's really ready + var err error + client, err = grpc.Dial( + memR.grpcAddress, + grpc.WithTransportCredentials(insecure.NewCredentials()), + ) + if err != nil { + panic(err) + } + // give it some time to connect after dailing, but not too long as connection can become idle + time.Sleep(time.Duration(retryCount*int(time.Second) + 1)) + + if client.GetState() == connectivity.Ready { + memR.OracleInfo.GrpcClient = client + break + } + client.Close() + retryCount++ + sleepTime *= 2 } + + memR.OracleInfo.AdapterMap = adapters.GetAdapterMap(memR.OracleInfo.GrpcClient, &memR.OracleInfo.Redis) + logrus.Info("[oracle] running oracle service...") + runner.Run(memR.OracleInfo) + return nil } // GetChannels implements Reactor by returning the list of channels for this // reactor. -func (memR *Reactor) GetChannels() []*p2p.ChannelDescriptor { - largestTx := make([]byte, memR.config.MaxTxBytes) - batchMsg := protomem.Message{ - Sum: &protomem.Message_Txs{ - Txs: &protomem.Txs{Txs: [][]byte{largestTx}}, - }, - } +// func (memR *Reactor) GetChannels() []*p2p.ChannelDescriptor { +// largestTx := make([]byte, memR.config.MaxTxBytes) +// batchMsg := protomem.Message{ +// Sum: &protomem.Message_Txs{ +// Txs: &protomem.Txs{Txs: [][]byte{largestTx}}, +// }, +// } - return []*p2p.ChannelDescriptor{ - { - ID: MempoolChannel, - Priority: 5, - RecvMessageCapacity: batchMsg.Size(), - MessageType: &protomem.Message{}, - }, - } -} +// return []*p2p.ChannelDescriptor{ +// { +// ID: MempoolChannel, +// Priority: 5, +// RecvMessageCapacity: batchMsg.Size(), +// MessageType: &protomem.Message{}, +// }, +// } +// } // AddPeer implements Reactor. // It starts a broadcast routine ensuring all txs are forwarded to the given peer. -func (memR *Reactor) AddPeer(peer p2p.Peer) { - if memR.config.Broadcast { - go memR.broadcastTxRoutine(peer) - } -} +// func (memR *Reactor) AddPeer(peer p2p.Peer) { +// if memR.config.Broadcast { +// go memR.broadcastTxRoutine(peer) +// } +// } // RemovePeer implements Reactor. -func (memR *Reactor) RemovePeer(peer p2p.Peer, _ interface{}) { - memR.ids.Reclaim(peer) - // broadcast routine checks if peer is gone and returns -} +// func (memR *Reactor) RemovePeer(peer p2p.Peer, _ interface{}) { +// memR.ids.Reclaim(peer) +// // broadcast routine checks if peer is gone and returns +// } -// Receive implements Reactor. -// It adds any received transactions to the mempool. -func (memR *Reactor) Receive(e p2p.Envelope) { - memR.Logger.Debug("Receive", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) - switch msg := e.Message.(type) { - case *protomem.Txs: - protoTxs := msg.GetTxs() - if len(protoTxs) == 0 { - memR.Logger.Error("received empty txs from peer", "src", e.Src) - return - } - txInfo := TxInfo{SenderID: memR.ids.GetForPeer(e.Src)} - if e.Src != nil { - txInfo.SenderP2PID = e.Src.ID() - } +// // Receive implements Reactor. +// // It adds any received transactions to the mempool. +// func (memR *Reactor) Receive(e p2p.Envelope) { +// memR.Logger.Debug("Receive", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) +// switch msg := e.Message.(type) { +// case *protomem.Txs: +// protoTxs := msg.GetTxs() +// if len(protoTxs) == 0 { +// memR.Logger.Error("received empty txs from peer", "src", e.Src) +// return +// } +// txInfo := TxInfo{SenderID: memR.ids.GetForPeer(e.Src)} +// if e.Src != nil { +// txInfo.SenderP2PID = e.Src.ID() +// } - var err error - for _, tx := range protoTxs { - ntx := types.Tx(tx) - err = memR.mempool.CheckTx(ntx, nil, txInfo) - if errors.Is(err, ErrTxInCache) { - memR.Logger.Debug("Tx already exists in cache", "tx", ntx.String()) - } else if err != nil { - memR.Logger.Info("Could not check tx", "tx", ntx.String(), "err", err) - } - } - default: - memR.Logger.Error("unknown message type", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) - memR.Switch.StopPeerForError(e.Src, fmt.Errorf("mempool cannot handle message of type: %T", e.Message)) - return - } +// var err error +// for _, tx := range protoTxs { +// ntx := types.Tx(tx) +// err = memR.mempool.CheckTx(ntx, nil, txInfo) +// if errors.Is(err, ErrTxInCache) { +// memR.Logger.Debug("Tx already exists in cache", "tx", ntx.String()) +// } else if err != nil { +// memR.Logger.Info("Could not check tx", "tx", ntx.String(), "err", err) +// } +// } +// default: +// memR.Logger.Error("unknown message type", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) +// memR.Switch.StopPeerForError(e.Src, fmt.Errorf("mempool cannot handle message of type: %T", e.Message)) +// return +// } - // broadcasting happens from go routines per peer -} +// // broadcasting happens from go routines per peer +// } // PeerState describes the state of a peer. type PeerState interface { GetHeight() int64 } -// Send new mempool txs to peer. -func (memR *Reactor) broadcastTxRoutine(peer p2p.Peer) { - peerID := memR.ids.GetForPeer(peer) - var next *clist.CElement +// // Send new mempool txs to peer. +// func (memR *Reactor) broadcastTxRoutine(peer p2p.Peer) { +// peerID := memR.ids.GetForPeer(peer) +// var next *clist.CElement - for { - // In case of both next.NextWaitChan() and peer.Quit() are variable at the same time - if !memR.IsRunning() || !peer.IsRunning() { - return - } - // This happens because the CElement we were looking at got garbage - // collected (removed). That is, .NextWait() returned nil. Go ahead and - // start from the beginning. - if next == nil { - select { - case <-memR.mempool.TxsWaitChan(): // Wait until a tx is available - if next = memR.mempool.TxsFront(); next == nil { - continue - } - case <-peer.Quit(): - return - case <-memR.Quit(): - return - } - } +// for { +// // In case of both next.NextWaitChan() and peer.Quit() are variable at the same time +// if !memR.IsRunning() || !peer.IsRunning() { +// return +// } +// // This happens because the CElement we were looking at got garbage +// // collected (removed). That is, .NextWait() returned nil. Go ahead and +// // start from the beginning. +// if next == nil { +// select { +// case <-memR.mempool.TxsWaitChan(): // Wait until a tx is available +// if next = memR.mempool.TxsFront(); next == nil { +// continue +// } +// case <-peer.Quit(): +// return +// case <-memR.Quit(): +// return +// } +// } - // Make sure the peer is up to date. - peerState, ok := peer.Get(types.PeerStateKey).(PeerState) - if !ok { - // Peer does not have a state yet. We set it in the consensus reactor, but - // when we add peer in Switch, the order we call reactors#AddPeer is - // different every time due to us using a map. Sometimes other reactors - // will be initialized before the consensus reactor. We should wait a few - // milliseconds and retry. - time.Sleep(PeerCatchupSleepIntervalMS * time.Millisecond) - continue - } +// // Make sure the peer is up to date. +// peerState, ok := peer.Get(types.PeerStateKey).(PeerState) +// if !ok { +// // Peer does not have a state yet. We set it in the consensus reactor, but +// // when we add peer in Switch, the order we call reactors#AddPeer is +// // different every time due to us using a map. Sometimes other reactors +// // will be initialized before the consensus reactor. We should wait a few +// // milliseconds and retry. +// time.Sleep(PeerCatchupSleepIntervalMS * time.Millisecond) +// continue +// } - // Allow for a lag of 1 block. - memTx := next.Value.(*mempoolTx) - if peerState.GetHeight() < memTx.Height()-1 { - time.Sleep(PeerCatchupSleepIntervalMS * time.Millisecond) - continue - } +// // Allow for a lag of 1 block. +// memTx := next.Value.(*mempoolTx) +// if peerState.GetHeight() < memTx.Height()-1 { +// time.Sleep(PeerCatchupSleepIntervalMS * time.Millisecond) +// continue +// } - // NOTE: Transaction batching was disabled due to - // https://github.com/tendermint/tendermint/issues/5796 - - if !memTx.isSender(peerID) { - success := peer.Send(p2p.Envelope{ - ChannelID: MempoolChannel, - Message: &protomem.Txs{Txs: [][]byte{memTx.tx}}, - }) - if !success { - time.Sleep(PeerCatchupSleepIntervalMS * time.Millisecond) - continue - } - } +// // NOTE: Transaction batching was disabled due to +// // https://github.com/tendermint/tendermint/issues/5796 - select { - case <-next.NextWaitChan(): - // see the start of the for loop for nil check - next = next.Next() - case <-peer.Quit(): - return - case <-memR.Quit(): - return - } - } -} +// if !memTx.isSender(peerID) { +// success := peer.Send(p2p.Envelope{ +// ChannelID: MempoolChannel, +// Message: &protomem.Txs{Txs: [][]byte{memTx.tx}}, +// }) +// if !success { +// time.Sleep(PeerCatchupSleepIntervalMS * time.Millisecond) +// continue +// } +// } + +// select { +// case <-next.NextWaitChan(): +// // see the start of the for loop for nil check +// next = next.Next() +// case <-peer.Quit(): +// return +// case <-memR.Quit(): +// return +// } +// } +// } // TxsMessage is a Message containing transactions. type TxsMessage struct { diff --git a/oracle/service/adapters/oracle_result_fetcher.go b/oracle/service/adapters/oracle_result_fetcher.go index aa291cd3baf..a35638527ac 100644 --- a/oracle/service/adapters/oracle_result_fetcher.go +++ b/oracle/service/adapters/oracle_result_fetcher.go @@ -1,13 +1,16 @@ package adapters import ( + "context" "encoding/json" "fmt" "strconv" "time" "github.com/cometbft/cometbft/oracle/service/types" + oracle "github.com/cometbft/cometbft/oracle/types" "github.com/cometbft/cometbft/redis" + "github.com/sirupsen/logrus" "google.golang.org/grpc" ) @@ -55,12 +58,12 @@ func (oracleResultFetcher *OracleResultFetcher) Perform(job types.OracleJob, res if cacheErr != nil { // rework to re-perform job as we cant use carbon query client due to circular depedency - // logrus.Error(cacheErr) - // var grpcErr error - // price, grpcErr = getOracleResultFromGrpc(oracleId, oracleResultFetcher.grpcClient) - // if grpcErr != nil { - // return result, grpcErr - // } + logrus.Error(cacheErr) + var grpcErr error + price, grpcErr = getOracleResultFromGrpc(oracleId, oracleResultFetcher.grpcClient) + if grpcErr != nil { + return result, grpcErr + } } job.SetOutput(result, types.StringToGenericValue(price)) @@ -101,25 +104,22 @@ func getOracleResultFromCache(oracleId string, staleAllowance string, redisServi } func getOracleResultFromGrpc(oracleId string, grpcClient *grpc.ClientConn) (string, error) { - // change this to reperform the whole job if not found in cache, as we cant use - // oracle query client from carbon due to circular depedency - // oracleClient := oracle.NewQueryClient(grpcClient) - // request := &oracle.QueryResultsRequest{ - // OracleId: oracleId, - // } - - // // Call the gRPC method to fetch data from the Oracle - // response, err := oracleClient.Results(context.Background(), request) - // if err != nil { - // return "", err - // } - - // if len(response.Results) == 0 { - // return "", fmt.Errorf("oracle: %s RPC result is empty", oracleId) - // } - - // grpcResult := []oracle.Result{response.Results[len(response.Results)-1]} - - // return grpcResult[0].Data, nil - return "", nil + oracleClient := oracle.NewQueryClient(grpcClient) + request := &oracle.QueryResultsRequest{ + OracleId: oracleId, + } + + // Call the gRPC method to fetch data from the Oracle + response, err := oracleClient.Results(context.Background(), request) + if err != nil { + return "", err + } + + if len(response.Results) == 0 { + return "", fmt.Errorf("oracle: %s RPC result is empty", oracleId) + } + + grpcResult := []oracle.Result{response.Results[len(response.Results)-1]} + + return grpcResult[0].Data, nil } diff --git a/oracle/service/parser/parser.go b/oracle/service/parser/parser.go index 32ad99bbff3..2c137c64603 100644 --- a/oracle/service/parser/parser.go +++ b/oracle/service/parser/parser.go @@ -86,9 +86,9 @@ func ParseSpec(spec types.OracleSpec) (unrolledSpec types.OracleSpec, err error) } // ValidateOracleJobs validates oracle jobs -func ValidateOracleJobs(app types.App, jobs []types.OracleJob) error { +func ValidateOracleJobs(oracleInfo *types.OracleInfo, jobs []types.OracleJob) error { for _, job := range jobs { - adapter, ok := app.AdapterMap[job.Adapter] + adapter, ok := oracleInfo.AdapterMap[job.Adapter] if !ok { return fmt.Errorf("adapter not found: '%s'", job.Adapter) } diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index a8cf9817e2c..66de398e01e 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -10,12 +10,11 @@ import ( log "github.com/sirupsen/logrus" - "github.com/Switcheo/carbon-wallet-go/api" - "github.com/Switcheo/carbon/constants" - oracletypes "github.com/Switcheo/carbon/x/oracle/types" + // "github.com/Switcheo/carbon/constants" "github.com/cometbft/cometbft/oracle/service/adapters" "github.com/cometbft/cometbft/oracle/service/parser" "github.com/cometbft/cometbft/oracle/service/types" + oracletypes "github.com/cometbft/cometbft/oracle/types" "github.com/cometbft/cometbft/redis" ) @@ -123,41 +122,10 @@ func overwriteData(oracleId string, data string) string { return price + "." + decimalPrice } -// func msgResultCallback(response *sdktypes.TxResponse, msg sdktypes.Msg, err error) { -// var result float32 -// result = 1 -// if err != nil { -// result = 0 -// } -// telemetry.SetGaugeWithLabels([]string{constants.METRIC_VOTE_STATUS}, result, []metrics.Label{telemetry.NewLabel("transaction_hash", response.TxHash)}) -// } - -// // SubmitVote submit oracle vote -// func SubmitVote(app types.App, msg oracletypes.MsgCreateVote) { -// power, err := oracleapi.GetSubAccountPower(app.Wallet.GRPCURL, app.Wallet.Bech32Addr, app.Wallet.ClientCtx) -// if err != nil { -// return -// } - -// if power.IsZero() { -// return -// } - -// app.Wallet.SubmitMsgAsync(&msg, msgResultCallback) -// // log.Infoln("Submitted vote", app.Wallet.AccAddress().String(), msg.OracleID, msg.Timestamp, msg.Data) -// } - // SyncOracles sync oracles with active on-chain oracles -func SyncOracles(app types.App) (oracles []types.Oracle, err error) { +func SyncOracles(oracleInfo *types.OracleInfo) (oracles []types.Oracle, err error) { // fetch oracle list first - grpcConn, err := api.GetGRPCConnection(app.Wallet.GRPCURL, app.Wallet.ClientCtx) - if err != nil { - log.Error(err) - return nil, err - } - defer grpcConn.Close() - - oracleClient := oracletypes.NewQueryClient(grpcConn) + oracleClient := oracletypes.NewQueryClient(oracleInfo.GrpcClient) oracleRes, err := oracleClient.OracleAll( context.Background(), &oracletypes.QueryAllOracleRequest{ @@ -183,7 +151,7 @@ func SyncOracles(app types.App) (oracles []types.Oracle, err error) { log.Warnf("[oracle:%v] unable to unroll spec: %v", oracle.Id, err) continue } - err = parser.ValidateOracleJobs(app, spec.Jobs) + err = parser.ValidateOracleJobs(oracleInfo, spec.Jobs) if err != nil { log.Warnf("[oracle: %v,] invalid oracle jobs: %v", oracle.Id, err) continue @@ -214,8 +182,8 @@ func SaveOracleResult(price string, oracleId string, redisService redis.Service) } // RunOracle run oracle submission -func RunOracle(app types.App, oracle types.Oracle, currentTime uint64) error { - red := app.Redis +func RunOracle(oracleInfo *types.OracleInfo, oracle types.Oracle, currentTime uint64) error { + red := oracleInfo.Redis normalizedTime := (currentTime / oracle.Resolution) * oracle.Resolution lastSubmissionTime, exists, err := red.Get(LastSubmissionTimeKey) if err != nil { @@ -237,11 +205,11 @@ func RunOracle(app types.App, oracle types.Oracle, currentTime uint64) error { input := types.AdapterRunTimeInput{ BeginTime: currentTime, - Config: app.Config, + Config: oracleInfo.Config, } for _, job := range jobs { - adapter, ok := app.AdapterMap[job.Adapter] + adapter, ok := oracleInfo.AdapterMap[job.Adapter] if !ok { panic("adapter should exist: " + job.Adapter) } @@ -273,32 +241,33 @@ func RunOracle(app types.App, oracle types.Oracle, currentTime uint64) error { SaveOracleResult(resultData, oracle.Id, red) - if OracleOverwriteData == constants.True { + if OracleOverwriteData == "true" { resultData = overwriteData(oracle.Id, resultData) // if we want to override oracle price - // resultData = overwriteDataV2(oracle.ID, resultData) // if we want to override oracle price } if resultData == "" { return errors.New("skipping submission for " + oracle.Id + " as result is empty") } - msg := oracletypes.MsgCreateVote{ - Creator: app.Wallet.Bech32Addr, - OracleId: oracle.Id, - Timestamp: int64(normalizedTime), + vote := types.Vote{ + Creator: "", + OracleID: oracle.Id, + Timestamp: normalizedTime, Data: resultData, } - SubmitVote(app, msg) + oracleMap := oracleInfo.Votes[normalizedTime] + oracleMap[oracle.Id] = append(oracleMap[oracle.Id], vote) + oracleInfo.Votes[normalizedTime] = oracleMap return nil } // RunOracles run oracle submissions -func RunOracles(app types.App, t uint64) { - for _, oracle := range app.Oracles { +func RunOracles(oracleInfo *types.OracleInfo, t uint64) { + for _, oracle := range oracleInfo.Oracles { go func(currOracle types.Oracle) { - err := RunOracle(app, currOracle, t) + err := RunOracle(oracleInfo, currOracle, t) if err != nil { log.Warnln(err) } @@ -307,21 +276,21 @@ func RunOracles(app types.App, t uint64) { } // Run run oracles -func Run(app types.App) { +func Run(oracleInfo *types.OracleInfo) { log.Info("[oracle] Service started.") count := 0 for { if count == 0 { // on init, and every minute - oracles, err := SyncOracles(app) + oracles, err := SyncOracles(oracleInfo) if err != nil { log.Warn(err) time.Sleep(time.Second) continue } - app.Oracles = oracles + oracleInfo.Oracles = oracles } - RunOracles(app, uint64(time.Now().Unix())) + RunOracles(oracleInfo, uint64(time.Now().Unix())) time.Sleep(100 * time.Millisecond) count++ diff --git a/oracle/service/types/app.go b/oracle/service/types/info.go similarity index 75% rename from oracle/service/types/app.go rename to oracle/service/types/info.go index c44af39667c..7d84d3b6111 100644 --- a/oracle/service/types/app.go +++ b/oracle/service/types/info.go @@ -7,11 +7,11 @@ import ( ) // App struct for app -type App struct { +type OracleInfo struct { Oracles []Oracle AdapterMap map[string]Adapter Redis redis.Service - // Wallet carbonwalletgo.Wallet Config Config GrpcClient *grpc.ClientConn + Votes map[uint64]map[string][]Vote // timestamp : oracleId : []vote } diff --git a/oracle/service/types/vote.go b/oracle/service/types/vote.go new file mode 100644 index 00000000000..c3fbc23805e --- /dev/null +++ b/oracle/service/types/vote.go @@ -0,0 +1,9 @@ +package types + +type Vote struct { + Creator string + OracleID string + Timestamp uint64 + Data string + Signature string +} diff --git a/oracle/types/oracle.pb.go b/oracle/types/oracle.pb.go new file mode 100644 index 00000000000..2046661595c --- /dev/null +++ b/oracle/types/oracle.pb.go @@ -0,0 +1,910 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: Switcheo/carbon/oracle/oracle.proto + +package types + +import ( + fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// 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.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type Oracle struct { + Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + MinTurnoutPercentage int64 `protobuf:"varint,5,opt,name=min_turnout_percentage,json=minTurnoutPercentage,proto3" json:"min_turnout_percentage,omitempty"` + MaxResultAge int64 `protobuf:"varint,6,opt,name=max_result_age,json=maxResultAge,proto3" json:"max_result_age,omitempty"` + SecurityType string `protobuf:"bytes,7,opt,name=security_type,json=securityType,proto3" json:"security_type,omitempty"` + ResultStrategy string `protobuf:"bytes,8,opt,name=result_strategy,json=resultStrategy,proto3" json:"result_strategy,omitempty"` + Resolution int64 `protobuf:"varint,9,opt,name=resolution,proto3" json:"resolution,omitempty"` + Spec string `protobuf:"bytes,10,opt,name=spec,proto3" json:"spec,omitempty"` +} + +func (m *Oracle) Reset() { *m = Oracle{} } +func (m *Oracle) String() string { return proto.CompactTextString(m) } +func (*Oracle) ProtoMessage() {} +func (*Oracle) Descriptor() ([]byte, []int) { + return fileDescriptor_beeacc2d7716135d, []int{0} +} +func (m *Oracle) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Oracle) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Oracle.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Oracle) XXX_Merge(src proto.Message) { + xxx_messageInfo_Oracle.Merge(m, src) +} +func (m *Oracle) XXX_Size() int { + return m.Size() +} +func (m *Oracle) XXX_DiscardUnknown() { + xxx_messageInfo_Oracle.DiscardUnknown(m) +} + +var xxx_messageInfo_Oracle proto.InternalMessageInfo + +type Result struct { + OracleId string `protobuf:"bytes,1,opt,name=oracle_id,json=oracleId,proto3" json:"oracle_id,omitempty" db:"oracle_id"` + Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty" db:"timestamp"` + Data string `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty" db:"data"` +} + +func (m *Result) Reset() { *m = Result{} } +func (m *Result) String() string { return proto.CompactTextString(m) } +func (*Result) ProtoMessage() {} +func (*Result) Descriptor() ([]byte, []int) { + return fileDescriptor_beeacc2d7716135d, []int{1} +} +func (m *Result) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Result) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Result.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Result) XXX_Merge(src proto.Message) { + xxx_messageInfo_Result.Merge(m, src) +} +func (m *Result) XXX_Size() int { + return m.Size() +} +func (m *Result) XXX_DiscardUnknown() { + xxx_messageInfo_Result.DiscardUnknown(m) +} + +var xxx_messageInfo_Result proto.InternalMessageInfo + +func init() { + proto.RegisterType((*Oracle)(nil), "Switcheo.carbon.oracle.Oracle") + proto.RegisterType((*Result)(nil), "Switcheo.carbon.oracle.Result") +} + +func init() { + proto.RegisterFile("Switcheo/carbon/oracle/oracle.proto", fileDescriptor_beeacc2d7716135d) +} + +var fileDescriptor_beeacc2d7716135d = []byte{ + // 429 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x4c, 0x92, 0x4f, 0x6f, 0xd3, 0x30, + 0x18, 0xc6, 0x9b, 0xb6, 0x64, 0xcb, 0xcb, 0x56, 0x24, 0x6b, 0xaa, 0x22, 0x0e, 0x59, 0xc9, 0x90, + 0x18, 0x97, 0x06, 0x09, 0x4e, 0xdc, 0xe8, 0x05, 0x71, 0x02, 0x65, 0x3b, 0x71, 0x89, 0x1c, 0xe7, + 0x25, 0xb3, 0xd4, 0xc4, 0x91, 0xfd, 0x46, 0xac, 0x5f, 0x02, 0xf1, 0xb1, 0x26, 0x4e, 0x3b, 0x72, + 0x9a, 0xa0, 0xfd, 0x06, 0xfb, 0x04, 0x53, 0xec, 0xf4, 0xcf, 0x29, 0xaf, 0x9f, 0xdf, 0xcf, 0x71, + 0xf2, 0xc8, 0x70, 0x71, 0xf5, 0x53, 0x92, 0xb8, 0x41, 0x95, 0x08, 0xae, 0x73, 0x55, 0x27, 0x4a, + 0x73, 0xb1, 0xc4, 0xfe, 0x31, 0x6f, 0xb4, 0x22, 0xc5, 0xa6, 0x5b, 0x69, 0xee, 0xa4, 0xb9, 0xa3, + 0x2f, 0xcf, 0x4a, 0x55, 0x2a, 0xab, 0x24, 0xdd, 0xe4, 0xec, 0xf8, 0xcf, 0x10, 0xfc, 0xaf, 0x56, + 0x60, 0x21, 0x1c, 0x09, 0x8d, 0x9c, 0x94, 0x0e, 0xbd, 0x99, 0x77, 0x19, 0xa4, 0xdb, 0x25, 0x9b, + 0xc0, 0x50, 0x16, 0xe1, 0xd0, 0x86, 0x43, 0x59, 0xb0, 0x19, 0x3c, 0x2f, 0xd0, 0x08, 0x2d, 0x1b, + 0x92, 0xaa, 0x0e, 0x47, 0x16, 0x1c, 0x46, 0x6c, 0x0a, 0xbe, 0x21, 0x4e, 0xad, 0x09, 0xc7, 0x16, + 0xf6, 0x2b, 0xf6, 0x01, 0xa6, 0x95, 0xac, 0x33, 0x6a, 0x75, 0xad, 0x5a, 0xca, 0x1a, 0xd4, 0x02, + 0x6b, 0xe2, 0x25, 0x86, 0xcf, 0x66, 0xde, 0xe5, 0x28, 0x3d, 0xab, 0x64, 0x7d, 0xed, 0xe0, 0xb7, + 0x1d, 0x63, 0xaf, 0x61, 0x52, 0xf1, 0xdb, 0x4c, 0xa3, 0x69, 0x97, 0x94, 0x75, 0xb6, 0x6f, 0xed, + 0x93, 0x8a, 0xdf, 0xa6, 0x36, 0xfc, 0x54, 0x22, 0xbb, 0x80, 0x53, 0x83, 0xa2, 0xd5, 0x92, 0x56, + 0x19, 0xad, 0x1a, 0x0c, 0x8f, 0xec, 0xd1, 0x27, 0xdb, 0xf0, 0x7a, 0xd5, 0x20, 0x7b, 0x03, 0x2f, + 0xfa, 0xd7, 0x18, 0xd2, 0x9c, 0xb0, 0x5c, 0x85, 0xc7, 0x56, 0x9b, 0xb8, 0xf8, 0xaa, 0x4f, 0x59, + 0x04, 0xa0, 0xd1, 0xa8, 0x65, 0x6b, 0x7f, 0x31, 0xb0, 0xe7, 0x1d, 0x24, 0x8c, 0xc1, 0xd8, 0x34, + 0x28, 0x42, 0xb0, 0xbb, 0xed, 0x1c, 0xff, 0xf2, 0xc0, 0x77, 0xdf, 0xc3, 0x12, 0x08, 0x5c, 0xef, + 0x99, 0x2c, 0x5c, 0x9d, 0x0b, 0xf6, 0xf8, 0x70, 0x3e, 0x29, 0xf2, 0x8f, 0xf1, 0x0e, 0xc4, 0xe9, + 0xb1, 0x9b, 0xbf, 0x14, 0xec, 0x1d, 0x04, 0x24, 0x2b, 0x34, 0xc4, 0xab, 0xc6, 0x36, 0x3a, 0xda, + 0x6f, 0xd8, 0x81, 0x38, 0xdd, 0x4b, 0xec, 0x15, 0x8c, 0x0b, 0x4e, 0xdc, 0x35, 0xbc, 0x38, 0x7d, + 0x7c, 0x38, 0x0f, 0x3a, 0xb9, 0xcb, 0xe2, 0xd4, 0xa2, 0xc5, 0xe7, 0xbb, 0xff, 0xd1, 0xe0, 0x6e, + 0x1d, 0x79, 0xf7, 0xeb, 0xc8, 0xfb, 0xb7, 0x8e, 0xbc, 0xdf, 0x9b, 0x68, 0x70, 0xbf, 0x89, 0x06, + 0x7f, 0x37, 0xd1, 0xe0, 0xfb, 0xdb, 0x52, 0xd2, 0x4d, 0x9b, 0xcf, 0x85, 0xaa, 0x12, 0xa1, 0x2a, + 0xa4, 0xfc, 0x07, 0xed, 0x87, 0xfe, 0x6e, 0x75, 0x4d, 0x9a, 0xdc, 0xb7, 0xb7, 0xe5, 0xfd, 0x53, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xbe, 0x9f, 0xe4, 0x4b, 0x82, 0x02, 0x00, 0x00, +} + +func (m *Oracle) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Oracle) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Oracle) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Spec) > 0 { + i -= len(m.Spec) + copy(dAtA[i:], m.Spec) + i = encodeVarintOracle(dAtA, i, uint64(len(m.Spec))) + i-- + dAtA[i] = 0x52 + } + if m.Resolution != 0 { + i = encodeVarintOracle(dAtA, i, uint64(m.Resolution)) + i-- + dAtA[i] = 0x48 + } + if len(m.ResultStrategy) > 0 { + i -= len(m.ResultStrategy) + copy(dAtA[i:], m.ResultStrategy) + i = encodeVarintOracle(dAtA, i, uint64(len(m.ResultStrategy))) + i-- + dAtA[i] = 0x42 + } + if len(m.SecurityType) > 0 { + i -= len(m.SecurityType) + copy(dAtA[i:], m.SecurityType) + i = encodeVarintOracle(dAtA, i, uint64(len(m.SecurityType))) + i-- + dAtA[i] = 0x3a + } + if m.MaxResultAge != 0 { + i = encodeVarintOracle(dAtA, i, uint64(m.MaxResultAge)) + i-- + dAtA[i] = 0x30 + } + if m.MinTurnoutPercentage != 0 { + i = encodeVarintOracle(dAtA, i, uint64(m.MinTurnoutPercentage)) + i-- + dAtA[i] = 0x28 + } + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintOracle(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x22 + } + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = encodeVarintOracle(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x1a + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintOracle(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0x12 + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintOracle(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Result) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Result) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Result) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintOracle(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0x22 + } + if m.Timestamp != 0 { + i = encodeVarintOracle(dAtA, i, uint64(m.Timestamp)) + i-- + dAtA[i] = 0x18 + } + if len(m.OracleId) > 0 { + i -= len(m.OracleId) + copy(dAtA[i:], m.OracleId) + i = encodeVarintOracle(dAtA, i, uint64(len(m.OracleId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintOracle(dAtA []byte, offset int, v uint64) int { + offset -= sovOracle(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Oracle) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovOracle(uint64(l)) + } + l = len(m.Id) + if l > 0 { + n += 1 + l + sovOracle(uint64(l)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + sovOracle(uint64(l)) + } + l = len(m.Status) + if l > 0 { + n += 1 + l + sovOracle(uint64(l)) + } + if m.MinTurnoutPercentage != 0 { + n += 1 + sovOracle(uint64(m.MinTurnoutPercentage)) + } + if m.MaxResultAge != 0 { + n += 1 + sovOracle(uint64(m.MaxResultAge)) + } + l = len(m.SecurityType) + if l > 0 { + n += 1 + l + sovOracle(uint64(l)) + } + l = len(m.ResultStrategy) + if l > 0 { + n += 1 + l + sovOracle(uint64(l)) + } + if m.Resolution != 0 { + n += 1 + sovOracle(uint64(m.Resolution)) + } + l = len(m.Spec) + if l > 0 { + n += 1 + l + sovOracle(uint64(l)) + } + return n +} + +func (m *Result) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.OracleId) + if l > 0 { + n += 1 + l + sovOracle(uint64(l)) + } + if m.Timestamp != 0 { + n += 1 + sovOracle(uint64(m.Timestamp)) + } + l = len(m.Data) + if l > 0 { + n += 1 + l + sovOracle(uint64(l)) + } + return n +} + +func sovOracle(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozOracle(x uint64) (n int) { + return sovOracle(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Oracle) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOracle + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Oracle: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Oracle: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOracle + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthOracle + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOracle + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOracle + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthOracle + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOracle + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOracle + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthOracle + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOracle + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOracle + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthOracle + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOracle + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Status = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MinTurnoutPercentage", wireType) + } + m.MinTurnoutPercentage = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOracle + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MinTurnoutPercentage |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxResultAge", wireType) + } + m.MaxResultAge = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOracle + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MaxResultAge |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SecurityType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOracle + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthOracle + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOracle + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SecurityType = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResultStrategy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOracle + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthOracle + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOracle + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ResultStrategy = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Resolution", wireType) + } + m.Resolution = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOracle + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Resolution |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOracle + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthOracle + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOracle + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Spec = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipOracle(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthOracle + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Result) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOracle + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Result: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Result: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OracleId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOracle + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthOracle + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOracle + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.OracleId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) + } + m.Timestamp = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOracle + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Timestamp |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOracle + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthOracle + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOracle + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipOracle(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthOracle + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipOracle(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowOracle + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowOracle + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowOracle + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthOracle + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupOracle + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthOracle + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthOracle = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowOracle = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupOracle = fmt.Errorf("proto: unexpected end of group") +) diff --git a/oracle/types/query.pb.go b/oracle/types/query.pb.go new file mode 100644 index 00000000000..8cc09461f7f --- /dev/null +++ b/oracle/types/query.pb.go @@ -0,0 +1,918 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: Switcheo/carbon/oracle/query.proto + +package types + +import ( + context "context" + fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" + _ "google.golang.org/genproto/googleapis/api/annotations" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// 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.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type QueryAllOracleRequest struct { +} + +func (m *QueryAllOracleRequest) Reset() { *m = QueryAllOracleRequest{} } +func (m *QueryAllOracleRequest) String() string { return proto.CompactTextString(m) } +func (*QueryAllOracleRequest) ProtoMessage() {} +func (*QueryAllOracleRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_8c80f252cd67c921, []int{0} +} +func (m *QueryAllOracleRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryAllOracleRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryAllOracleRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryAllOracleRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryAllOracleRequest.Merge(m, src) +} +func (m *QueryAllOracleRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryAllOracleRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryAllOracleRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryAllOracleRequest proto.InternalMessageInfo + +type QueryAllOracleResponse struct { + Oracles []Oracle `protobuf:"bytes,1,rep,name=oracles,proto3" json:"oracles"` +} + +func (m *QueryAllOracleResponse) Reset() { *m = QueryAllOracleResponse{} } +func (m *QueryAllOracleResponse) String() string { return proto.CompactTextString(m) } +func (*QueryAllOracleResponse) ProtoMessage() {} +func (*QueryAllOracleResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_8c80f252cd67c921, []int{1} +} +func (m *QueryAllOracleResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryAllOracleResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryAllOracleResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryAllOracleResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryAllOracleResponse.Merge(m, src) +} +func (m *QueryAllOracleResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryAllOracleResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryAllOracleResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryAllOracleResponse proto.InternalMessageInfo + +type QueryResultsRequest struct { + OracleId string `protobuf:"bytes,1,opt,name=oracle_id,json=oracleId,proto3" json:"oracle_id,omitempty"` +} + +func (m *QueryResultsRequest) Reset() { *m = QueryResultsRequest{} } +func (m *QueryResultsRequest) String() string { return proto.CompactTextString(m) } +func (*QueryResultsRequest) ProtoMessage() {} +func (*QueryResultsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_8c80f252cd67c921, []int{2} +} +func (m *QueryResultsRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryResultsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryResultsRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryResultsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryResultsRequest.Merge(m, src) +} +func (m *QueryResultsRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryResultsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryResultsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryResultsRequest proto.InternalMessageInfo + +type QueryResultsResponse struct { + Results []Result `protobuf:"bytes,1,rep,name=results,proto3" json:"results"` +} + +func (m *QueryResultsResponse) Reset() { *m = QueryResultsResponse{} } +func (m *QueryResultsResponse) String() string { return proto.CompactTextString(m) } +func (*QueryResultsResponse) ProtoMessage() {} +func (*QueryResultsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_8c80f252cd67c921, []int{3} +} +func (m *QueryResultsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryResultsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryResultsResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryResultsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryResultsResponse.Merge(m, src) +} +func (m *QueryResultsResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryResultsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryResultsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryResultsResponse proto.InternalMessageInfo + +func init() { + proto.RegisterType((*QueryAllOracleRequest)(nil), "Switcheo.carbon.oracle.QueryAllOracleRequest") + proto.RegisterType((*QueryAllOracleResponse)(nil), "Switcheo.carbon.oracle.QueryAllOracleResponse") + proto.RegisterType((*QueryResultsRequest)(nil), "Switcheo.carbon.oracle.QueryResultsRequest") + proto.RegisterType((*QueryResultsResponse)(nil), "Switcheo.carbon.oracle.QueryResultsResponse") +} + +func init() { + proto.RegisterFile("Switcheo/carbon/oracle/query.proto", fileDescriptor_8c80f252cd67c921) +} + +var fileDescriptor_8c80f252cd67c921 = []byte{ + // 391 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x0a, 0x2e, 0xcf, 0x2c, + 0x49, 0xce, 0x48, 0xcd, 0xd7, 0x4f, 0x4e, 0x2c, 0x4a, 0xca, 0xcf, 0xd3, 0xcf, 0x2f, 0x4a, 0x4c, + 0xce, 0x49, 0xd5, 0x2f, 0x2c, 0x4d, 0x2d, 0xaa, 0xd4, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, + 0x83, 0xa9, 0xd1, 0x83, 0xa8, 0xd1, 0x83, 0xa8, 0x91, 0x92, 0x49, 0xcf, 0xcf, 0x4f, 0xcf, 0x49, + 0xd5, 0x4f, 0x2c, 0xc8, 0xd4, 0x4f, 0xcc, 0xcb, 0xcb, 0x2f, 0x49, 0x2c, 0xc9, 0xcc, 0xcf, 0x2b, + 0x86, 0xe8, 0x92, 0x12, 0x49, 0xcf, 0x4f, 0xcf, 0x07, 0x33, 0xf5, 0x41, 0x2c, 0xa8, 0xa8, 0x32, + 0x0e, 0xfb, 0x20, 0x14, 0x44, 0x91, 0x92, 0x38, 0x97, 0x68, 0x20, 0xc8, 0x7e, 0xc7, 0x9c, 0x1c, + 0x7f, 0xb0, 0x78, 0x50, 0x6a, 0x61, 0x69, 0x6a, 0x71, 0x89, 0x52, 0x04, 0x97, 0x18, 0xba, 0x44, + 0x71, 0x41, 0x7e, 0x5e, 0x71, 0xaa, 0x90, 0x1d, 0x17, 0x3b, 0xc4, 0x88, 0x62, 0x09, 0x46, 0x05, + 0x66, 0x0d, 0x6e, 0x23, 0x39, 0x3d, 0xec, 0xae, 0xd6, 0x83, 0x68, 0x74, 0x62, 0x39, 0x71, 0x4f, + 0x9e, 0x21, 0x08, 0xa6, 0x49, 0xc9, 0x88, 0x4b, 0x18, 0x6c, 0x72, 0x50, 0x6a, 0x71, 0x69, 0x4e, + 0x49, 0x31, 0xd4, 0x42, 0x21, 0x69, 0x2e, 0x4e, 0x88, 0x8a, 0xf8, 0xcc, 0x14, 0x09, 0x46, 0x05, + 0x46, 0x0d, 0xce, 0x20, 0x0e, 0x88, 0x80, 0x67, 0x8a, 0x52, 0x18, 0x97, 0x08, 0xaa, 0x1e, 0x84, + 0x5b, 0x8a, 0x20, 0x42, 0x84, 0xdc, 0x02, 0xd1, 0x09, 0x73, 0x0b, 0x54, 0x93, 0xd1, 0x29, 0x26, + 0x2e, 0x56, 0xb0, 0xc1, 0x42, 0xbd, 0x8c, 0x5c, 0x9c, 0x10, 0xf7, 0x3a, 0xe6, 0xe4, 0x08, 0xe9, + 0xe2, 0x32, 0x06, 0x6b, 0x60, 0x49, 0xe9, 0x11, 0xab, 0x1c, 0xe2, 0x6c, 0x25, 0xc5, 0xa6, 0xcb, + 0x4f, 0x26, 0x33, 0x49, 0x0b, 0x49, 0xa2, 0x45, 0x4d, 0x99, 0x21, 0x94, 0x55, 0x2c, 0xb4, 0x81, + 0x91, 0x8b, 0x1d, 0xea, 0x5b, 0x21, 0x6d, 0xbc, 0xc6, 0xa3, 0x86, 0xa3, 0x94, 0x0e, 0x71, 0x8a, + 0xa1, 0x2e, 0xf1, 0x02, 0xbb, 0xc4, 0x25, 0x0a, 0xab, 0x5b, 0xa0, 0xa1, 0x24, 0xa4, 0x8a, 0x53, + 0x4a, 0xbf, 0x1a, 0x1e, 0x67, 0xb5, 0x4e, 0xee, 0x27, 0x1e, 0xca, 0x31, 0x9c, 0x78, 0x24, 0xc7, + 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, 0x31, 0x5c, 0x78, 0x2c, + 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x66, 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, + 0x7e, 0xae, 0x7e, 0x72, 0x7e, 0x6e, 0x6a, 0x49, 0x52, 0x5a, 0x09, 0x82, 0x01, 0x35, 0xb9, 0xa4, + 0xb2, 0x20, 0xb5, 0x38, 0x89, 0x0d, 0x9c, 0x36, 0x8d, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0x5d, + 0xd0, 0x8a, 0x79, 0x32, 0x03, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// QueryClient is the client API for Query service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type QueryClient interface { + // Get details for all oracles + OracleAll(ctx context.Context, in *QueryAllOracleRequest, opts ...grpc.CallOption) (*QueryAllOracleResponse, error) + // Get results for all oracles, or a specific oracle + Results(ctx context.Context, in *QueryResultsRequest, opts ...grpc.CallOption) (*QueryResultsResponse, error) +} + +type queryClient struct { + cc grpc1.ClientConn +} + +func NewQueryClient(cc grpc1.ClientConn) QueryClient { + return &queryClient{cc} +} + +func (c *queryClient) OracleAll(ctx context.Context, in *QueryAllOracleRequest, opts ...grpc.CallOption) (*QueryAllOracleResponse, error) { + out := new(QueryAllOracleResponse) + err := c.cc.Invoke(ctx, "/Switcheo.carbon.oracle.Query/OracleAll", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) Results(ctx context.Context, in *QueryResultsRequest, opts ...grpc.CallOption) (*QueryResultsResponse, error) { + out := new(QueryResultsResponse) + err := c.cc.Invoke(ctx, "/Switcheo.carbon.oracle.Query/Results", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// QueryServer is the server API for Query service. +type QueryServer interface { + // Get details for all oracles + OracleAll(context.Context, *QueryAllOracleRequest) (*QueryAllOracleResponse, error) + // Get results for all oracles, or a specific oracle + Results(context.Context, *QueryResultsRequest) (*QueryResultsResponse, error) +} + +// UnimplementedQueryServer can be embedded to have forward compatible implementations. +type UnimplementedQueryServer struct { +} + +func (*UnimplementedQueryServer) OracleAll(ctx context.Context, req *QueryAllOracleRequest) (*QueryAllOracleResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method OracleAll not implemented") +} +func (*UnimplementedQueryServer) Results(ctx context.Context, req *QueryResultsRequest) (*QueryResultsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Results not implemented") +} + +func RegisterQueryServer(s grpc1.Server, srv QueryServer) { + s.RegisterService(&_Query_serviceDesc, srv) +} + +func _Query_OracleAll_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryAllOracleRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).OracleAll(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/Switcheo.carbon.oracle.Query/OracleAll", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).OracleAll(ctx, req.(*QueryAllOracleRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_Results_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryResultsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).Results(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/Switcheo.carbon.oracle.Query/Results", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).Results(ctx, req.(*QueryResultsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Query_serviceDesc = grpc.ServiceDesc{ + ServiceName: "Switcheo.carbon.oracle.Query", + HandlerType: (*QueryServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "OracleAll", + Handler: _Query_OracleAll_Handler, + }, + { + MethodName: "Results", + Handler: _Query_Results_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "Switcheo/carbon/oracle/query.proto", +} + +func (m *QueryAllOracleRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryAllOracleRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryAllOracleRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *QueryAllOracleResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryAllOracleResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryAllOracleResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Oracles) > 0 { + for iNdEx := len(m.Oracles) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Oracles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *QueryResultsRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryResultsRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryResultsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.OracleId) > 0 { + i -= len(m.OracleId) + copy(dAtA[i:], m.OracleId) + i = encodeVarintQuery(dAtA, i, uint64(len(m.OracleId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryResultsResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryResultsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryResultsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Results) > 0 { + for iNdEx := len(m.Results) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Results[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { + offset -= sovQuery(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *QueryAllOracleRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryAllOracleResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Oracles) > 0 { + for _, e := range m.Oracles { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func (m *QueryResultsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.OracleId) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryResultsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Results) > 0 { + for _, e := range m.Results { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func sovQuery(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozQuery(x uint64) (n int) { + return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *QueryAllOracleRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryAllOracleRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryAllOracleRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryAllOracleResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryAllOracleResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryAllOracleResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Oracles", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Oracles = append(m.Oracles, Oracle{}) + if err := m.Oracles[len(m.Oracles)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryResultsRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryResultsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryResultsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OracleId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.OracleId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryResultsResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryResultsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryResultsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Results", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Results = append(m.Results, Result{}) + if err := m.Results[len(m.Results)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipQuery(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthQuery + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupQuery + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthQuery + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthQuery = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowQuery = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupQuery = fmt.Errorf("proto: unexpected end of group") +) diff --git a/proto/Switcheo/carbon/oracle/oracle.proto b/proto/Switcheo/carbon/oracle/oracle.proto index 9c6e0a48a62..e30b1dc3b03 100644 --- a/proto/Switcheo/carbon/oracle/oracle.proto +++ b/proto/Switcheo/carbon/oracle/oracle.proto @@ -1,59 +1,22 @@ syntax = "proto3"; package Switcheo.carbon.oracle; -option go_package = "github.com/cometbft/cometbft/oracle/types"; -option (gogoproto.goproto_getters_all) = false; - -import "cosmos/base/v1beta1/coin.proto"; import "gogoproto/gogo.proto"; -import "google/protobuf/timestamp.proto"; -import "google/protobuf/duration.proto"; -// Params defines the parameters for the oracle module. -message Params { - option (gogoproto.goproto_stringer) = false; - bool oracle_slash_enabled = 1; - uint32 oracle_slash_window_block = 2; - string oracle_slash_initial = 3 [ - (gogoproto.customtype) = "cosmossdk.io/math.LegacyDec", - (gogoproto.nullable) = false - ]; - string oracle_slash_increment = 4 [ - (gogoproto.customtype) = "cosmossdk.io/math.LegacyDec", - (gogoproto.nullable) = false - ]; - uint32 oracle_continuous_slash_max = 5; - uint32 newly_bonded_window_allowance = 6; - google.protobuf.Duration vote_timestamp_future_allowance = 7 - [ (gogoproto.nullable) = false, (gogoproto.stdduration) = true ]; - string oracle_min_vote_factor = 8 [ - (gogoproto.customtype) = "cosmossdk.io/math.LegacyDec", - (gogoproto.nullable) = false - ]; - string max_power_to_slash_factor = 9 [ - (gogoproto.customtype) = "cosmossdk.io/math.LegacyDec", - (gogoproto.nullable) = false - ]; -} +option go_package = "github.com/cometbft/cometbft/oracle/types"; +option (gogoproto.goproto_getters_all) = false; message Oracle { - string creator = 1; - string id = 2; - string description = 3; - string status = 4; - int64 min_turnout_percentage = 5; - int64 max_result_age = 6; - string security_type = 7; - string result_strategy = 8; - int64 resolution = 9; - string spec = 10; -} - -message Vote { - string oracle_id = 1; - int64 timestamp = 2; - string data = 3; - string voter = 4; + string creator = 1; + string id = 2; + string description = 3; + string status = 4; + int64 min_turnout_percentage = 5; + int64 max_result_age = 6; + string security_type = 7; + string result_strategy = 8; + int64 resolution = 9; + string spec = 10; } message Result { @@ -62,12 +25,3 @@ message Result { string data = 4 [ (gogoproto.moretags) = "db:\"data\"" ]; } -message Mark { - string oracle_id = 1; - int64 timestamp = 2; -} - -message Contract { - string oracle_id = 1; - string contract_address = 2; -} \ No newline at end of file diff --git a/proto/Switcheo/carbon/oracle/query.proto b/proto/Switcheo/carbon/oracle/query.proto index 71c7aac04d2..a4fd797ff1c 100644 --- a/proto/Switcheo/carbon/oracle/query.proto +++ b/proto/Switcheo/carbon/oracle/query.proto @@ -2,24 +2,15 @@ syntax = "proto3"; package Switcheo.carbon.oracle; import "google/api/annotations.proto"; -import "cosmos/base/query/v1beta1/pagination.proto"; import "gogoproto/gogo.proto"; // this line is used by starport scaffolding # 1 import "Switcheo/carbon/oracle/oracle.proto"; -import "Switcheo/carbon/oracle/slashing.proto"; -option go_package = "github.com/cometbft/cometbft/oracle/types"; +option go_package = "github.com/cometbft/cometbft/oracle/types"; option (gogoproto.goproto_getters_all) = false; // Query defines the gRPC querier service. service Query { - // this line is used by starport scaffolding # 2 - - // Get details for an oracle - rpc Oracle(QueryOracleRequest) returns (QueryOracleResponse) { - option (google.api.http).get = "/carbon/oracle/v1/oracles/{id}"; - } - // Get details for all oracles rpc OracleAll(QueryAllOracleRequest) returns (QueryAllOracleResponse) { option (google.api.http).get = "/carbon/oracle/v1/oracles"; @@ -32,176 +23,19 @@ service Query { additional_bindings {get : "/carbon/oracle/v1/results"} }; } - - // Get latest result for all oracles - rpc ResultsLatest(QueryResultsRequest) returns (QueryResultsResponse) { - option (google.api.http).get = "/carbon/oracle/v1/results_latest"; - } - - // Get votes for all oracles, or a specific oracle - rpc Votes(QueryVotesRequest) returns (QueryVotesResponse) { - option (google.api.http) = { - get : "/carbon/oracle/v1/votes/{oracle_id}" - additional_bindings {get : "/carbon/oracle/v1/votes"} - }; - } - - // Get voting power for an address - rpc VoterPower(QueryVoterPowerRequest) returns (QueryVoterPowerResponse) { - option (google.api.http).get = "/carbon/oracle/v1/powers/{address}"; - } - - // Get all slash counters - rpc SlashCounterAll(QueryAllSlashCounterRequest) - returns (QueryAllSlashCounterResponse) { - option (google.api.http).get = "/carbon/oracle/v1/slash_counters"; - } - - // Get slash counter for a valoper address - rpc SlashCounter(QuerySlashCounterRequest) - returns (QuerySlashCounterResponse) { - option (google.api.http).get = - "/carbon/oracle/v1/slash_counters/{valoper_address}"; - } - - // Get all oracle votes window - rpc OracleVotesWindowAll(QueryAllOracleVotesWindowRequest) - returns (QueryAllOracleVotesWindowResponse) { - option (google.api.http).get = "/carbon/oracle/v1/oracle_votes_windows"; - } - - // Get oracle votes window for address - rpc OracleVotesWindow(QueryOracleVotesWindowRequest) - returns (QueryOracleVotesWindowResponse) { - option (google.api.http).get = - "/carbon/oracle/v1/oracle_votes_windows/{valoper_address}"; - } - - rpc OracleContractAddress(QueryContractAddressRequest) - returns (QueryContractAddressResponse) { - option (google.api.http).get = "/carbon/oracle/v1/contracts_address/{id}"; - } - - rpc OracleContractAll(QueryContractAllRequest) - returns (QueryContractAllResponse) { - option (google.api.http).get = "/carbon/oracle/v1/contracts"; - } - - rpc OracleContractParams(QueryContractParamsRequest) - returns (QueryContractParamsResponse) { - option (google.api.http).get = "/carbon/oracle/v1/contract_params/{id}"; - } - - rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { - option (google.api.http).get = "/carbon/oracle/v1/params"; - } + } -// this line is used by starport scaffolding # 3 -message QueryOracleRequest { string id = 1; } - -message QueryOracleResponse { - Oracle oracle = 1 [ (gogoproto.nullable) = false ]; -} - -message QueryAllOracleRequest { - cosmos.base.query.v1beta1.PageRequest pagination = 1; -} +message QueryAllOracleRequest {} message QueryAllOracleResponse { - repeated Oracle oracles = 1 [ (gogoproto.nullable) = false ]; - cosmos.base.query.v1beta1.PageResponse pagination = 2; + repeated Oracle oracles = 1 [(gogoproto.nullable) = false]; } message QueryResultsRequest { string oracle_id = 1; - cosmos.base.query.v1beta1.PageRequest pagination = 2; } message QueryResultsResponse { repeated Result results = 1 [ (gogoproto.nullable) = false ]; - cosmos.base.query.v1beta1.PageResponse pagination = 2; } - -message QueryVotesRequest { - string oracle_id = 1; - int64 timestamp = 2; - string voter = 3; - cosmos.base.query.v1beta1.PageRequest pagination = 4; -} - -message QueryVotesResponse { - repeated Vote votes = 1 [ (gogoproto.nullable) = false ]; - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -message QueryVoterPowerRequest { string address = 1; } - -message QueryVoterPowerResponse { - string power = 1 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.nullable) = true - ]; -} - -message QueryAllSlashCounterRequest { - cosmos.base.query.v1beta1.PageRequest pagination = 1; -} - -message QueryAllSlashCounterResponse { - repeated SlashCounter slash_counters = 1 [ (gogoproto.nullable) = false ]; - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -message QuerySlashCounterRequest { string valoper_address = 1; } - -message QuerySlashCounterResponse { - SlashCounter slash_counter = 1 [ (gogoproto.nullable) = false ]; -} - -message QueryAllOracleVotesWindowRequest { - cosmos.base.query.v1beta1.PageRequest pagination = 1; -} - -message QueryAllOracleVotesWindowResponse { - repeated OracleVotesWindow oracle_votes_windows = 1 - [ (gogoproto.nullable) = false ]; - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -message QueryOracleVotesWindowRequest { - string valoper_address = 1; - cosmos.base.query.v1beta1.PageRequest pagination = 2; -} - -message QueryOracleVotesWindowResponse { - repeated OracleVotesWindow oracle_votes_windows = 1 - [ (gogoproto.nullable) = false ]; - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QueryParamsRequest is request type for the Query/Params RPC method. -message QueryParamsRequest {} - -// QueryParamsResponse is response type for the Query/Params RPC method. -message QueryParamsResponse { - // params holds all the parameters of this module. - Params params = 1 [ (gogoproto.nullable) = false ]; -} - -message QueryContractAddressRequest { string id = 1; } -message QueryContractAddressResponse { string address = 1; } - -message QueryContractAllRequest {} -message QueryContractAllResponse { - repeated Contract contracts = 1 [ (gogoproto.nullable) = false ]; -} - -message QueryContractParamsRequest { string id = 1; } -message QueryContractParamsResponse { - string id = 1; - string creator = 2; - uint64 decimals = 3; - string timestamp = 4; - string data = 5; -} \ No newline at end of file diff --git a/proto/Switcheo/carbon/oracle/slashing.proto b/proto/Switcheo/carbon/oracle/slashing.proto deleted file mode 100644 index 581ff52e74e..00000000000 --- a/proto/Switcheo/carbon/oracle/slashing.proto +++ /dev/null @@ -1,20 +0,0 @@ -syntax = "proto3"; -package Switcheo.carbon.oracle; - -option go_package = "github.com/cometbft/cometbft/oracle/types"; -option (gogoproto.goproto_getters_all) = false; - -import "gogoproto/gogo.proto"; - -message OracleVotesWindow { - string validator = 1; - string oracle_id = 2; - uint64 vote_count = 3; -} - -message SlashCounter { - string validator = 1; - uint64 slash_count = 2; - uint64 prev_slash_count = 3; - uint64 newly_bonded_window_allowance = 4; -} diff --git a/proto/buf.lock b/proto/buf.lock index f2b69369858..335a3eb17e9 100644 --- a/proto/buf.lock +++ b/proto/buf.lock @@ -1,7 +1,18 @@ # Generated by buf. DO NOT EDIT. version: v1 deps: + - remote: buf.build + owner: cosmos + repository: cosmos-proto + commit: 1935555c206d4afb9e94615dfd0fad31 + digest: shake256:c74d91a3ac7ae07d579e90eee33abf9b29664047ac8816500cf22c081fec0d72d62c89ce0bebafc1f6fec7aa5315be72606717740ca95007248425102c365377 - remote: buf.build owner: cosmos repository: gogo-proto - commit: 6652e3443c3b4504bb3bf82e73a7e409 + commit: 88ef6483f90f478fb938c37dde52ece3 + digest: shake256:89c45df2aa11e0cff97b0d695436713db3d993d76792e9f8dc1ae90e6ab9a9bec55503d48ceedd6b86069ab07d3041b32001b2bfe0227fa725dd515ff381e5ba + - remote: buf.build + owner: googleapis + repository: googleapis + commit: a86849a25cc04f4dbe9b15ddddfbc488 + digest: shake256:e19143328f8cbfe13fc226aeee5e63773ca494693a72740a7560664270039a380d94a1344234b88c7691311460df9a9b1c2982190d0a2612eae80368718e1943 diff --git a/proto/buf.yaml b/proto/buf.yaml index 96921e0fe65..0895e40e931 100644 --- a/proto/buf.yaml +++ b/proto/buf.yaml @@ -1,7 +1,6 @@ version: v1 deps: - buf.build/cosmos/cosmos-proto - - buf.build/cosmos/cosmos-sdk - buf.build/cosmos/gogo-proto - buf.build/googleapis/googleapis breaking: diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto index 89bafb6cd54..ce1edcb5c88 100644 --- a/proto/tendermint/abci/types.proto +++ b/proto/tendermint/abci/types.proto @@ -173,7 +173,7 @@ message RequestExtendVote { // Verify the vote extension message RequestVerifyVoteExtension { // the hash of the block that this received vote corresponds to - bytes hash = 1; + bytes hash = 1; // the validator that signed the vote extension bytes validator_address = 2; int64 height = 3; @@ -345,7 +345,7 @@ message ResponseVerifyVoteExtension { // Incorrectly implementing this thus has liveness implications as it may affect // CometBFT's ability to receive 2/3+ valid votes to finalize the block. // Honest nodes should never be rejected. - REJECT = 2; + REJECT = 2; } } @@ -442,10 +442,10 @@ message ValidatorUpdate { } message VoteInfo { - Validator validator = 1 [(gogoproto.nullable) = false]; + Validator validator = 1 [(gogoproto.nullable) = false]; tendermint.types.BlockIDFlag block_id_flag = 3; - reserved 2; // signed_last_block + reserved 2; // signed_last_block } message ExtendedVoteInfo { @@ -458,7 +458,7 @@ message ExtendedVoteInfo { // block_id_flag indicates whether the validator voted for a block, nil, or did not vote at all tendermint.types.BlockIDFlag block_id_flag = 5; - reserved 2; // signed_last_block + reserved 2; // signed_last_block } enum MisbehaviorType { diff --git a/proto/tendermint/types/validator.proto b/proto/tendermint/types/validator.proto index 7b55956fcdd..a47e677a2fc 100644 --- a/proto/tendermint/types/validator.proto +++ b/proto/tendermint/types/validator.proto @@ -17,7 +17,6 @@ enum BlockIDFlag { BLOCK_ID_FLAG_NIL = 3 [(gogoproto.enumvalue_customname) = "BlockIDFlagNil"]; // voted for nil } - message ValidatorSet { repeated Validator validators = 1; Validator proposer = 2; diff --git a/scripts/protocgen.sh b/scripts/protocgen.sh new file mode 100644 index 00000000000..e5d969d50a2 --- /dev/null +++ b/scripts/protocgen.sh @@ -0,0 +1,22 @@ +echo "Formatting protobuf files" +find ./ -name "*.proto" -exec clang-format -i {} \; + +set -e + +echo "Generating gogo proto code" +cd proto +proto_dirs=$(find ./Switcheo/carbon -path -prune -o -name '*.proto' -print0 | xargs -0 -n1 dirname | sort | uniq) +for dir in $proto_dirs; do + for file in $(find "${dir}" -maxdepth 1 -name '*.proto'); do + # Check if the go_package in the file is pointing to carbon + if grep -q "option go_package.*cometbft" "$file"; then + buf generate --template buf.gen.gogo.yaml "$file" + fi + done +done + +cd .. + +# move proto files to the right places +cp -r github.com/cometbft/cometbft/* ./ +rm -rf github.com diff --git a/state/execution.go b/state/execution.go index 817f1753ea8..c8b0bbef2dc 100644 --- a/state/execution.go +++ b/state/execution.go @@ -14,6 +14,8 @@ import ( cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/cometbft/cometbft/proxy" "github.com/cometbft/cometbft/types" + + oracletypes "github.com/cometbft/cometbft/oracle/service/types" ) //----------------------------------------------------------------------------- @@ -37,8 +39,9 @@ type BlockExecutor struct { // manage the mempool lock during commit // and update both with block results after commit. - mempool mempool.Mempool - evpool EvidencePool + mempool mempool.Mempool + oracleInfo *oracletypes.OracleInfo + evpool EvidencePool logger log.Logger @@ -60,6 +63,7 @@ func NewBlockExecutor( logger log.Logger, proxyApp proxy.AppConnConsensus, mempool mempool.Mempool, + oracleInfo *oracletypes.OracleInfo, evpool EvidencePool, blockStore BlockStore, options ...BlockExecutorOption, @@ -69,6 +73,7 @@ func NewBlockExecutor( proxyApp: proxyApp, eventBus: types.NopEventBus{}, mempool: mempool, + oracleInfo: oracleInfo, evpool: evpool, logger: logger, metrics: NopMetrics(), diff --git a/state/execution_test.go b/state/execution_test.go index d4ae6d16a40..9d9c809324c 100644 --- a/state/execution_test.go +++ b/state/execution_test.go @@ -32,6 +32,8 @@ import ( "github.com/cometbft/cometbft/types" cmttime "github.com/cometbft/cometbft/types/time" "github.com/cometbft/cometbft/version" + + oracletypes "github.com/cometbft/cometbft/oracle/service/types" ) var ( @@ -64,8 +66,11 @@ func TestApplyBlock(t *testing.T) { mock.Anything, mock.Anything, mock.Anything).Return(nil) + + oracleInfo := oracletypes.OracleInfo{} + blockExec := sm.NewBlockExecutor(stateStore, log.TestingLogger(), proxyApp.Consensus(), - mp, sm.EmptyEvidencePool{}, blockStore) + mp, &oracleInfo, sm.EmptyEvidencePool{}, blockStore) block := makeBlock(state, 1, new(types.Commit)) bps, err := block.MakePartSet(testPartSize) @@ -130,7 +135,8 @@ func TestFinalizeBlockDecidedLastCommit(t *testing.T) { eventBus := types.NewEventBus() require.NoError(t, eventBus.Start()) - blockExec := sm.NewBlockExecutor(stateStore, log.NewNopLogger(), proxyApp.Consensus(), mp, evpool, blockStore) + oracleInfo := oracletypes.OracleInfo{} + blockExec := sm.NewBlockExecutor(stateStore, log.NewNopLogger(), proxyApp.Consensus(), mp, &oracleInfo, evpool, blockStore) state, _, lastCommit, err := makeAndCommitGoodBlock(state, 1, new(types.Commit), state.NextValidators.Validators[0].Address, blockExec, privVals, nil) require.NoError(t, err) @@ -343,8 +349,9 @@ func TestFinalizeBlockMisbehavior(t *testing.T) { blockStore := store.NewBlockStore(dbm.NewMemDB()) + oracleInfo := oracletypes.OracleInfo{} blockExec := sm.NewBlockExecutor(stateStore, log.TestingLogger(), proxyApp.Consensus(), - mp, evpool, blockStore) + mp, &oracleInfo, evpool, blockStore) block := makeBlock(state, 1, new(types.Commit)) block.Evidence = types.EvidenceData{Evidence: ev} @@ -384,11 +391,14 @@ func TestProcessProposal(t *testing.T) { err = eventBus.Start() require.NoError(t, err) + oracleInfo := oracletypes.OracleInfo{} + blockExec := sm.NewBlockExecutor( stateStore, logger, proxyApp.Consensus(), new(mpmocks.Mempool), + &oracleInfo, sm.EmptyEvidencePool{}, blockStore, ) @@ -600,12 +610,15 @@ func TestFinalizeBlockValidatorUpdates(t *testing.T) { mock.Anything).Return(nil) mp.On("ReapMaxBytesMaxGas", mock.Anything, mock.Anything).Return(types.Txs{}) + oracleInfo := oracletypes.OracleInfo{} + blockStore := store.NewBlockStore(dbm.NewMemDB()) blockExec := sm.NewBlockExecutor( stateStore, log.TestingLogger(), proxyApp.Consensus(), mp, + &oracleInfo, sm.EmptyEvidencePool{}, blockStore, ) @@ -676,12 +689,16 @@ func TestFinalizeBlockValidatorUpdatesResultingInEmptySet(t *testing.T) { stateStore := sm.NewStore(stateDB, sm.StoreOptions{ DiscardABCIResponses: false, }) + + oracleInfo := oracletypes.OracleInfo{} + blockStore := store.NewBlockStore(dbm.NewMemDB()) blockExec := sm.NewBlockExecutor( stateStore, log.TestingLogger(), proxyApp.Consensus(), new(mpmocks.Mempool), + &oracleInfo, sm.EmptyEvidencePool{}, blockStore, ) @@ -732,12 +749,15 @@ func TestEmptyPrepareProposal(t *testing.T) { mock.Anything).Return(nil) mp.On("ReapMaxBytesMaxGas", mock.Anything, mock.Anything).Return(types.Txs{}) + oracleInfo := oracletypes.OracleInfo{} + blockStore := store.NewBlockStore(dbm.NewMemDB()) blockExec := sm.NewBlockExecutor( stateStore, log.TestingLogger(), proxyApp.Consensus(), mp, + &oracleInfo, sm.EmptyEvidencePool{}, blockStore, ) @@ -777,12 +797,15 @@ func TestPrepareProposalTxsAllIncluded(t *testing.T) { require.NoError(t, err) defer proxyApp.Stop() //nolint:errcheck // ignore for tests + oracleInfo := oracletypes.OracleInfo{} + blockStore := store.NewBlockStore(dbm.NewMemDB()) blockExec := sm.NewBlockExecutor( stateStore, log.TestingLogger(), proxyApp.Consensus(), mp, + &oracleInfo, evpool, blockStore, ) @@ -832,12 +855,15 @@ func TestPrepareProposalReorderTxs(t *testing.T) { require.NoError(t, err) defer proxyApp.Stop() //nolint:errcheck // ignore for tests + oracleInfo := oracletypes.OracleInfo{} + blockStore := store.NewBlockStore(dbm.NewMemDB()) blockExec := sm.NewBlockExecutor( stateStore, log.TestingLogger(), proxyApp.Consensus(), mp, + &oracleInfo, evpool, blockStore, ) @@ -888,12 +914,15 @@ func TestPrepareProposalErrorOnTooManyTxs(t *testing.T) { require.NoError(t, err) defer proxyApp.Stop() //nolint:errcheck // ignore for tests + oracleInfo := oracletypes.OracleInfo{} + blockStore := store.NewBlockStore(dbm.NewMemDB()) blockExec := sm.NewBlockExecutor( stateStore, log.NewNopLogger(), proxyApp.Consensus(), mp, + &oracleInfo, evpool, blockStore, ) @@ -939,12 +968,15 @@ func TestPrepareProposalErrorOnPrepareProposalError(t *testing.T) { require.NoError(t, err) defer proxyApp.Stop() //nolint:errcheck // ignore for tests + oracleInfo := oracletypes.OracleInfo{} + blockStore := store.NewBlockStore(dbm.NewMemDB()) blockExec := sm.NewBlockExecutor( stateStore, log.NewNopLogger(), proxyApp.Consensus(), mp, + &oracleInfo, evpool, blockStore, ) @@ -1028,12 +1060,15 @@ func TestCreateProposalAbsentVoteExtensions(t *testing.T) { mock.Anything).Return(nil) mp.On("ReapMaxBytesMaxGas", mock.Anything, mock.Anything).Return(types.Txs{}) + oracleInfo := oracletypes.OracleInfo{} + blockStore := store.NewBlockStore(dbm.NewMemDB()) blockExec := sm.NewBlockExecutor( stateStore, log.NewNopLogger(), proxyApp.Consensus(), mp, + &oracleInfo, sm.EmptyEvidencePool{}, blockStore, ) diff --git a/state/validation_test.go b/state/validation_test.go index b4efcd75989..fc165632829 100644 --- a/state/validation_test.go +++ b/state/validation_test.go @@ -22,6 +22,8 @@ import ( "github.com/cometbft/cometbft/store" "github.com/cometbft/cometbft/types" cmttime "github.com/cometbft/cometbft/types/time" + + oracletypes "github.com/cometbft/cometbft/oracle/service/types" ) const validationTestsStopHeight int64 = 10 @@ -49,11 +51,14 @@ func TestValidateBlockHeader(t *testing.T) { blockStore := store.NewBlockStore(dbm.NewMemDB()) + oracleInfo := oracletypes.OracleInfo{} + blockExec := sm.NewBlockExecutor( stateStore, log.TestingLogger(), proxyApp.Consensus(), mp, + &oracleInfo, sm.EmptyEvidencePool{}, blockStore, ) @@ -144,6 +149,7 @@ func TestValidateBlockCommit(t *testing.T) { mock.Anything, mock.Anything).Return(nil) + oracleInfo := oracletypes.OracleInfo{} blockStore := store.NewBlockStore(dbm.NewMemDB()) blockExec := sm.NewBlockExecutor( @@ -151,6 +157,7 @@ func TestValidateBlockCommit(t *testing.T) { log.TestingLogger(), proxyApp.Consensus(), mp, + &oracleInfo, sm.EmptyEvidencePool{}, blockStore, ) @@ -296,6 +303,7 @@ func TestValidateBlockEvidence(t *testing.T) { mock.Anything, mock.Anything).Return(nil) state.ConsensusParams.Evidence.MaxBytes = 1000 + oracleInfo := oracletypes.OracleInfo{} blockStore := store.NewBlockStore(dbm.NewMemDB()) blockExec := sm.NewBlockExecutor( @@ -303,6 +311,7 @@ func TestValidateBlockEvidence(t *testing.T) { log.TestingLogger(), proxyApp.Consensus(), mp, + &oracleInfo, evpool, blockStore, ) From 9bc89f8845403265e02a1ccbac185c9e04423118 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 16 Feb 2024 14:18:57 +0800 Subject: [PATCH 005/150] implement pruning, gossip and partial signing svc --- node/node.go | 2 +- oracle/ids.go | 71 +++ oracle/reactor.go | 328 ++++++----- oracle/service/adapters/adapters.go | 2 +- oracle/service/runner/runner.go | 171 +++++- oracle/service/types/info.go | 35 +- oracle/service/types/vote.go | 9 - privval/file.go | 11 + privval/retry_signer_client.go | 19 + privval/signer_client.go | 22 + proto/tendermint/oracle/types.pb.go | 885 ++++++++++++++++++++++++++++ proto/tendermint/oracle/types.proto | 20 + types/priv_validator.go | 32 + 13 files changed, 1431 insertions(+), 176 deletions(-) create mode 100644 oracle/ids.go delete mode 100644 oracle/service/types/vote.go create mode 100644 proto/tendermint/oracle/types.pb.go create mode 100644 proto/tendermint/oracle/types.proto diff --git a/node/node.go b/node/node.go index daf4edcc027..3ba04d7bfff 100644 --- a/node/node.go +++ b/node/node.go @@ -381,7 +381,7 @@ func NewNodeWithContext(ctx context.Context, } // Make OracleReactor - oracleReactor := oracle.NewReactor("", "127.0.0.1:9090") + oracleReactor := oracle.NewReactor("", "13.215.29.72:9090", pubKey, privValidator) oracleInfo := oracleReactor.OracleInfo // make block executor for consensus and blocksync reactors to execute blocks diff --git a/oracle/ids.go b/oracle/ids.go new file mode 100644 index 00000000000..69437907d66 --- /dev/null +++ b/oracle/ids.go @@ -0,0 +1,71 @@ +package oracle + +import ( + "fmt" + + cmtsync "github.com/cometbft/cometbft/libs/sync" + "github.com/cometbft/cometbft/p2p" +) + +type oracleIDs struct { + mtx cmtsync.RWMutex + peerMap map[p2p.ID]uint16 + nextID uint16 // assumes that a node will never have over 65536 active peers + activeIDs map[uint16]struct{} // used to check if a given peerID key is used, the value doesn't matter +} + +// Reserve searches for the next unused ID and assigns it to the +// peer. +func (ids *oracleIDs) ReserveForPeer(peer p2p.Peer) { + ids.mtx.Lock() + defer ids.mtx.Unlock() + + curID := ids.nextPeerID() + ids.peerMap[peer.ID()] = curID + ids.activeIDs[curID] = struct{}{} +} + +// nextPeerID returns the next unused peer ID to use. +// This assumes that ids's mutex is already locked. +func (ids *oracleIDs) nextPeerID() uint16 { + if len(ids.activeIDs) == MaxActiveIDs { + panic(fmt.Sprintf("node has maximum %d active IDs and wanted to get one more", MaxActiveIDs)) + } + + _, idExists := ids.activeIDs[ids.nextID] + for idExists { + ids.nextID++ + _, idExists = ids.activeIDs[ids.nextID] + } + curID := ids.nextID + ids.nextID++ + return curID +} + +// Reclaim returns the ID reserved for the peer back to unused pool. +func (ids *oracleIDs) Reclaim(peer p2p.Peer) { + ids.mtx.Lock() + defer ids.mtx.Unlock() + + removedID, ok := ids.peerMap[peer.ID()] + if ok { + delete(ids.activeIDs, removedID) + delete(ids.peerMap, peer.ID()) + } +} + +// GetForPeer returns an ID reserved for the peer. +func (ids *oracleIDs) GetForPeer(peer p2p.Peer) uint16 { + ids.mtx.RLock() + defer ids.mtx.RUnlock() + + return ids.peerMap[peer.ID()] +} + +func newOracleIDs() *oracleIDs { + return &oracleIDs{ + peerMap: make(map[p2p.ID]uint16), + activeIDs: map[uint16]struct{}{0: {}}, + nextID: 1, // reserve unknownPeerID(0) for oracleReactor.BroadcastTx + } +} diff --git a/oracle/reactor.go b/oracle/reactor.go index 1f88666ea18..8c8b107fefd 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -4,18 +4,21 @@ import ( "encoding/json" "fmt" "io" + "math" "os" "time" "github.com/sirupsen/logrus" // cfg "github.com/cometbft/cometbft/config" + "github.com/cometbft/cometbft/crypto" "github.com/cometbft/cometbft/libs/log" "github.com/cometbft/cometbft/oracle/service/adapters" "github.com/cometbft/cometbft/oracle/service/runner" oracletypes "github.com/cometbft/cometbft/oracle/service/types" "github.com/cometbft/cometbft/p2p" + oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" "github.com/cometbft/cometbft/redis" "github.com/cometbft/cometbft/types" @@ -24,6 +27,19 @@ import ( "google.golang.org/grpc/credentials/insecure" ) +const ( + OracleChannel = byte(0x42) + + // PeerCatchupSleepIntervalMS defines how much time to sleep if a peer is behind + PeerCatchupSleepIntervalMS = 100 + + // UnknownPeerID is the peer ID to use when running CheckTx when there is + // no peer (e.g. RPC) + UnknownPeerID uint16 = 0 + + MaxActiveIDs = math.MaxUint16 +) + // Reactor handles mempool tx broadcasting amongst peers. // It maintains a map from peer ID to counter, to prevent gossiping txs to the // peers you received it from. @@ -33,11 +49,11 @@ type Reactor struct { grpcAddress string // config *cfg.MempoolConfig // mempool *CListMempool - // ids *mempoolIDs + ids *oracleIDs } // NewReactor returns a new Reactor with the given config and mempool. -func NewReactor(configPath string, grpcAddress string) *Reactor { +func NewReactor(configPath string, grpcAddress string, pubKey crypto.PubKey, privValidator types.PrivValidator) *Reactor { // load oracle.json config if present jsonFile, openErr := os.Open(configPath) if openErr != nil { @@ -55,37 +71,51 @@ func NewReactor(configPath string, grpcAddress string) *Reactor { logrus.Warnf("[oracle] error parsing oracle.json config file: %v", err) } - oracleInfo := oracletypes.OracleInfo{ - Oracles: nil, - Config: config, + voteDataBuffer := &oracletypes.VoteDataBuffer{ + Buffer: make(map[uint64]map[string][]*oracleproto.Vote), + } + + gossipVoteBuffer := &oracletypes.GossipVoteBuffer{ + Buffer: make(map[uint64]*oracleproto.GossipVote), + } + + oracleInfo := &oracletypes.OracleInfo{ + Oracles: nil, + Config: config, + VoteDataBuffer: voteDataBuffer, + GossipVoteBuffer: gossipVoteBuffer, + SignVotesChan: make(chan *oracleproto.Vote), + PubKey: pubKey, + PrivValidator: privValidator, } jsonFile.Close() - memR := &Reactor{ - OracleInfo: &oracleInfo, + oracleR := &Reactor{ + OracleInfo: oracleInfo, grpcAddress: grpcAddress, + ids: newOracleIDs(), } - memR.BaseReactor = *p2p.NewBaseReactor("Oracle", memR) + oracleR.BaseReactor = *p2p.NewBaseReactor("Oracle", oracleR) - return memR + return oracleR } // InitPeer implements Reactor by creating a state for the peer. -// func (memR *Reactor) InitPeer(peer p2p.Peer) p2p.Peer { -// memR.ids.ReserveForPeer(peer) -// return peer -// } +func (oracleR *Reactor) InitPeer(peer p2p.Peer) p2p.Peer { + oracleR.ids.ReserveForPeer(peer) + return peer +} // SetLogger sets the Logger on the reactor and the underlying mempool. -func (memR *Reactor) SetLogger(l log.Logger) { - memR.Logger = l - memR.BaseService.SetLogger(l) +func (oracleR *Reactor) SetLogger(l log.Logger) { + oracleR.Logger = l + oracleR.BaseService.SetLogger(l) } // OnStart implements p2p.BaseReactor. -func (memR *Reactor) OnStart() error { - memR.OracleInfo.Redis = redis.NewService(0) +func (oracleR *Reactor) OnStart() error { + oracleR.OracleInfo.Redis = redis.NewService(0) grpcMaxRetryCount := 12 retryCount := 0 @@ -93,7 +123,7 @@ func (memR *Reactor) OnStart() error { var client *grpc.ClientConn for { - logrus.Infof("[oracle] trying to connect to grpc with address %s : %d", memR.grpcAddress, retryCount) + logrus.Infof("[oracle] trying to connect to grpc with address %s : %d", oracleR.grpcAddress, retryCount) if retryCount == grpcMaxRetryCount { panic("failed to connect to grpc:grpcClient after 12 tries") } @@ -102,7 +132,7 @@ func (memR *Reactor) OnStart() error { // reinit otherwise connection will be idle, in idle we can't tell if it's really ready var err error client, err = grpc.Dial( - memR.grpcAddress, + oracleR.grpcAddress, grpc.WithTransportCredentials(insecure.NewCredentials()), ) if err != nil { @@ -112,7 +142,7 @@ func (memR *Reactor) OnStart() error { time.Sleep(time.Duration(retryCount*int(time.Second) + 1)) if client.GetState() == connectivity.Ready { - memR.OracleInfo.GrpcClient = client + oracleR.OracleInfo.GrpcClient = client break } client.Close() @@ -120,157 +150,153 @@ func (memR *Reactor) OnStart() error { sleepTime *= 2 } - memR.OracleInfo.AdapterMap = adapters.GetAdapterMap(memR.OracleInfo.GrpcClient, &memR.OracleInfo.Redis) + oracleR.OracleInfo.AdapterMap = adapters.GetAdapterMap(oracleR.OracleInfo.GrpcClient, &oracleR.OracleInfo.Redis) logrus.Info("[oracle] running oracle service...") - runner.Run(memR.OracleInfo) + runner.Run(oracleR.OracleInfo) return nil } // GetChannels implements Reactor by returning the list of channels for this // reactor. -// func (memR *Reactor) GetChannels() []*p2p.ChannelDescriptor { -// largestTx := make([]byte, memR.config.MaxTxBytes) -// batchMsg := protomem.Message{ -// Sum: &protomem.Message_Txs{ -// Txs: &protomem.Txs{Txs: [][]byte{largestTx}}, -// }, -// } - -// return []*p2p.ChannelDescriptor{ -// { -// ID: MempoolChannel, -// Priority: 5, -// RecvMessageCapacity: batchMsg.Size(), -// MessageType: &protomem.Message{}, -// }, -// } -// } +func (oracleR *Reactor) GetChannels() []*p2p.ChannelDescriptor { + // largestTx := make([]byte, oracleR.config.MaxTxBytes) + // TODO, confirm these params + return []*p2p.ChannelDescriptor{ + { + ID: OracleChannel, + Priority: 5, + RecvMessageCapacity: 1024, + RecvBufferCapacity: 50 * 4096, + SendQueueCapacity: 1000, + MessageType: &oracleproto.Vote{}, + }, + } +} // AddPeer implements Reactor. // It starts a broadcast routine ensuring all txs are forwarded to the given peer. -// func (memR *Reactor) AddPeer(peer p2p.Peer) { -// if memR.config.Broadcast { -// go memR.broadcastTxRoutine(peer) -// } -// } +func (oracleR *Reactor) AddPeer(peer p2p.Peer) { + // if oracleR.config.Broadcast { + go oracleR.broadcastVoteRoutine(peer) + // } +} // RemovePeer implements Reactor. -// func (memR *Reactor) RemovePeer(peer p2p.Peer, _ interface{}) { -// memR.ids.Reclaim(peer) -// // broadcast routine checks if peer is gone and returns -// } +func (oracleR *Reactor) RemovePeer(peer p2p.Peer, _ interface{}) { + oracleR.ids.Reclaim(peer) + // broadcast routine checks if peer is gone and returns +} // // Receive implements Reactor. // // It adds any received transactions to the mempool. -// func (memR *Reactor) Receive(e p2p.Envelope) { -// memR.Logger.Debug("Receive", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) -// switch msg := e.Message.(type) { -// case *protomem.Txs: -// protoTxs := msg.GetTxs() -// if len(protoTxs) == 0 { -// memR.Logger.Error("received empty txs from peer", "src", e.Src) -// return -// } -// txInfo := TxInfo{SenderID: memR.ids.GetForPeer(e.Src)} -// if e.Src != nil { -// txInfo.SenderP2PID = e.Src.ID() -// } - -// var err error -// for _, tx := range protoTxs { -// ntx := types.Tx(tx) -// err = memR.mempool.CheckTx(ntx, nil, txInfo) -// if errors.Is(err, ErrTxInCache) { -// memR.Logger.Debug("Tx already exists in cache", "tx", ntx.String()) -// } else if err != nil { -// memR.Logger.Info("Could not check tx", "tx", ntx.String(), "err", err) -// } -// } -// default: -// memR.Logger.Error("unknown message type", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) -// memR.Switch.StopPeerForError(e.Src, fmt.Errorf("mempool cannot handle message of type: %T", e.Message)) -// return -// } - -// // broadcasting happens from go routines per peer -// } +func (oracleR *Reactor) Receive(e p2p.Envelope) { + oracleR.Logger.Debug("Receive", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) + switch msg := e.Message.(type) { + case *oracleproto.GossipVote: + // hash and check if gossipVote already exists + gossipVoteHash := runner.HashGossipVote(msg) + + oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RLock() + _, ok := oracleR.OracleInfo.GossipVoteBuffer.Buffer[gossipVoteHash] + oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() + + if !ok { + oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Lock() + oracleR.OracleInfo.GossipVoteBuffer.Buffer[gossipVoteHash] = msg + oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() + + // safe to assume that if gossipVote does not exist in gossipBuffer, it also does not exist in dataBuffer? + oracleR.OracleInfo.VoteDataBuffer.UpdateMtx.Lock() + for _, vote := range msg.Votes { + runner.AddVoteToDataBuffer(oracleR.OracleInfo, vote) + } + oracleR.OracleInfo.VoteDataBuffer.UpdateMtx.Unlock() + } + default: + oracleR.Logger.Error("unknown message type", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) + oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("mempool cannot handle message of type: %T", e.Message)) + return + } + + // broadcasting happens from go routines per peer +} // PeerState describes the state of a peer. type PeerState interface { GetHeight() int64 } -// // Send new mempool txs to peer. -// func (memR *Reactor) broadcastTxRoutine(peer p2p.Peer) { -// peerID := memR.ids.GetForPeer(peer) -// var next *clist.CElement - -// for { -// // In case of both next.NextWaitChan() and peer.Quit() are variable at the same time -// if !memR.IsRunning() || !peer.IsRunning() { -// return -// } -// // This happens because the CElement we were looking at got garbage -// // collected (removed). That is, .NextWait() returned nil. Go ahead and -// // start from the beginning. -// if next == nil { -// select { -// case <-memR.mempool.TxsWaitChan(): // Wait until a tx is available -// if next = memR.mempool.TxsFront(); next == nil { -// continue -// } -// case <-peer.Quit(): -// return -// case <-memR.Quit(): -// return -// } -// } - -// // Make sure the peer is up to date. -// peerState, ok := peer.Get(types.PeerStateKey).(PeerState) -// if !ok { -// // Peer does not have a state yet. We set it in the consensus reactor, but -// // when we add peer in Switch, the order we call reactors#AddPeer is -// // different every time due to us using a map. Sometimes other reactors -// // will be initialized before the consensus reactor. We should wait a few -// // milliseconds and retry. -// time.Sleep(PeerCatchupSleepIntervalMS * time.Millisecond) -// continue -// } - -// // Allow for a lag of 1 block. -// memTx := next.Value.(*mempoolTx) -// if peerState.GetHeight() < memTx.Height()-1 { -// time.Sleep(PeerCatchupSleepIntervalMS * time.Millisecond) -// continue -// } - -// // NOTE: Transaction batching was disabled due to -// // https://github.com/tendermint/tendermint/issues/5796 - -// if !memTx.isSender(peerID) { -// success := peer.Send(p2p.Envelope{ -// ChannelID: MempoolChannel, -// Message: &protomem.Txs{Txs: [][]byte{memTx.tx}}, -// }) -// if !success { -// time.Sleep(PeerCatchupSleepIntervalMS * time.Millisecond) -// continue -// } -// } - -// select { -// case <-next.NextWaitChan(): -// // see the start of the for loop for nil check -// next = next.Next() -// case <-peer.Quit(): -// return -// case <-memR.Quit(): -// return -// } -// } -// } +// // Send new oracle votes to peer. +func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { + // peerID := oracleR.ids.GetForPeer(peer) + + for { + // In case of both next.NextWaitChan() and peer.Quit() are variable at the same time + if !oracleR.IsRunning() || !peer.IsRunning() { + return + } + // This happens because the CElement we were looking at got garbage + // collected (removed). That is, .NextWait() returned nil. Go ahead and + // start from the beginning. + select { + // case <-oracleR.mempool.TxsWaitChan(): // Wait until a tx is available + // if next = oracleR.mempool.TxsFront(); next == nil { + // continue + // } + case <-peer.Quit(): + return + case <-oracleR.Quit(): + return + default: + } + + // Make sure the peer is up to date. + // peerState, ok := peer.Get(types.PeerStateKey).(PeerState) + // if !ok { + // // Peer does not have a state yet. We set it in the consensus reactor, but + // // when we add peer in Switch, the order we call reactors#AddPeer is + // // different every time due to us using a map. Sometimes other reactors + // // will be initialized before the consensus reactor. We should wait a few + // // milliseconds and retry. + // time.Sleep(PeerCatchupSleepIntervalMS * time.Millisecond) + // continue + // } + + // // Allow for a lag of 1 block. + // memTx := next.Value.(*mempoolTx) + // if peerState.GetHeight() < memTx.Height()-1 { + // time.Sleep(PeerCatchupSleepIntervalMS * time.Millisecond) + // continue + // } + + // NOTE: Transaction batching was disabled due to + // https://github.com/tendermint/tendermint/issues/5796 + + // if !memTx.isSender(peerID) { + for _, gossipVote := range oracleR.OracleInfo.GossipVoteBuffer.Buffer { + success := peer.Send(p2p.Envelope{ + ChannelID: OracleChannel, + Message: gossipVote, + }) + if !success { + time.Sleep(PeerCatchupSleepIntervalMS * time.Millisecond) + continue + } + } + // } + + // select { + // case <-next.NextWaitChan(): + // // see the start of the for loop for nil check + // next = next.Next() + // case <-peer.Quit(): + // return + // case <-oracleR.Quit(): + // return + // } + } +} // TxsMessage is a Message containing transactions. type TxsMessage struct { diff --git a/oracle/service/adapters/adapters.go b/oracle/service/adapters/adapters.go index 0c01dc66ebb..d8844ce795e 100644 --- a/oracle/service/adapters/adapters.go +++ b/oracle/service/adapters/adapters.go @@ -16,7 +16,7 @@ func GetAdapterMap(grpcClient *grpc.ClientConn, redisService *redis.Service) map NewMedianFilter(grpcClient, redisService), NewWeightedAverage(grpcClient, redisService), NewFloatHandler(grpcClient, redisService), NewDecimalHandler(grpcClient, redisService), NewMathFilter(grpcClient, redisService), NewOracleResultFetcher(grpcClient, redisService), - NewEVMStructParser(grpcClient, redisService), NewEVMFetcher(grpcClient, redisService), + NewEVMValueParser(grpcClient, redisService), NewEVMStructParser(grpcClient, redisService), NewEVMFetcher(grpcClient, redisService), NewStaticHandler(grpcClient, redisService), } for _, adapter := range adaptersList { diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 66de398e01e..d929cfa9653 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -2,6 +2,8 @@ package runner import ( "context" + "crypto/sha256" + "encoding/binary" "encoding/json" "errors" "fmt" @@ -15,6 +17,7 @@ import ( "github.com/cometbft/cometbft/oracle/service/parser" "github.com/cometbft/cometbft/oracle/service/types" oracletypes "github.com/cometbft/cometbft/oracle/types" + oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" "github.com/cometbft/cometbft/redis" ) @@ -249,20 +252,171 @@ func RunOracle(oracleInfo *types.OracleInfo, oracle types.Oracle, currentTime ui return errors.New("skipping submission for " + oracle.Id + " as result is empty") } - vote := types.Vote{ - Creator: "", - OracleID: oracle.Id, + // when querying oracle, use go routines to parallelise + // each reactor will have a map of id: normalisedTime: votes + // each reactor will also have a channel for gossiping + // sign the vote and append to the map + // signed vote will also be marshalled to bytes and passed to the channel + // broadcast routine will read the channel concurrently and gossip the encoded votes + // received votes from gossiping will be unmarshalled and placed into their own maps + // use the map to check for 2/3 maj to insert into the prepareProposal method + // when submitting results that have 2/3 maj, it should only be in one single tx + // the single tx consists of the oracle id: result: the validators address and signature + + // need to handle concurrency for reading/writing to the maps + // 1. writing your own votes to the map + // 2. writing gossiped votes to the map + // 3. pruning expired votes from the map, prune every min? + // 4. reading the votes to calculate 2/3 maj, + // need to have pruning logic + + // need to consider if we want to gossip votes not submitted by us (ie gossip a vote received from other reactors) + // if you prune when you submit in proposal, only the validator submitting the proposal will have knowledge of which + // votes to prune + // have in built pruning logic that runs every 1 min? + // every one minute delete gossip + + vote := oracleproto.Vote{ + Validator: oracleInfo.PubKey.Address().String(), + OracleId: oracle.Id, Timestamp: normalizedTime, Data: resultData, } - oracleMap := oracleInfo.Votes[normalizedTime] - oracleMap[oracle.Id] = append(oracleMap[oracle.Id], vote) - oracleInfo.Votes[normalizedTime] = oracleMap - + oracleInfo.SignVotesChan <- &vote return nil } +func RunProcessSignVoteQueue(oracleInfo *types.OracleInfo) { + go func(oracleInfo *types.OracleInfo) { + for { + select { + case <-oracleInfo.StopChannel: + return + default: + interval := oracleInfo.MsgFlushInterval + if interval == 0 { + interval = 100 * time.Millisecond + } + time.Sleep(interval) + ProcessSignVoteQueue(oracleInfo) + } + } + }(oracleInfo) +} + +func HashGossipVote(gossipVote *oracleproto.GossipVote) uint64 { + h := sha256.New() + encoding, err := gossipVote.Marshal() + if err != nil { + panic(err) + } + h.Write(encoding) + hashBytes := h.Sum(nil) + hashUint64 := binary.BigEndian.Uint64(hashBytes) + return hashUint64 +} + +func ProcessSignVoteQueue(oracleInfo *types.OracleInfo) { + votes := []*oracleproto.Vote{} + for { + select { + case vote := <-oracleInfo.SignVotesChan: + votes = append(votes, vote) + continue + default: + } + break + } + + if len(votes) == 0 { + return + } + + gossipVote := &oracleproto.GossipVote{ + Validator: oracleInfo.PubKey.Address().String(), + PublicKey: oracleInfo.PubKey.Bytes(), + SignType: oracleInfo.PubKey.Type(), + Votes: votes, + } + + // signing of vote should append the signature field and timestamp field of gossipVote + if err := oracleInfo.PrivValidator.SignOracleVote("", gossipVote); err != nil { + log.Errorf("error signing oracle votes") + } + + gossipVoteHash := HashGossipVote(gossipVote) + + oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() + oracleInfo.GossipVoteBuffer.Buffer[gossipVoteHash] = gossipVote + oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() + + // maybe dont have a channel? maybe just add it to a buffer? + // add gossip votes to a gossip buffer + // this gossip buffer will be sent to other peers + // when sending, loop through gossip buffer and send out each gossipVote one by one + // when receiving this gossip buffer, add data to map that we dont have, and add data to gossip buffer that we dont have + // check if we have it by hashing the gossipVoteObject + // prune the gossip buffer every 3 secs + // prune the data map every 3 secs + // prune everything with timestamp > 3 secs ago + // data map will be in timestamp : oracleId: votes[] + + // after signing, pass into data map + oracleInfo.VoteDataBuffer.UpdateMtx.Lock() + defer oracleInfo.VoteDataBuffer.UpdateMtx.Unlock() + + for _, vote := range gossipVote.Votes { + AddVoteToDataBuffer(oracleInfo, vote) + } +} + +func AddVoteToDataBuffer(oracleInfo *types.OracleInfo, vote *oracleproto.Vote) { + _, ok := oracleInfo.VoteDataBuffer.Buffer[vote.Timestamp] + if !ok { + oracleInfo.VoteDataBuffer.Buffer[vote.Timestamp] = make(map[string][]*oracleproto.Vote) + } + + oracleMap := oracleInfo.VoteDataBuffer.Buffer[vote.Timestamp] + oracleMap[vote.OracleId] = append(oracleMap[vote.OracleId], vote) + oracleInfo.VoteDataBuffer.Buffer[vote.Timestamp] = oracleMap +} + +func PruneVoteDataBuffer(oracleInfo *types.OracleInfo) { + go func(oracleInfo *types.OracleInfo) { + ticker := time.Tick(3 * time.Second) + for range ticker { + oracleInfo.VoteDataBuffer.UpdateMtx.Lock() + // prune everything older than 3 secs + for timestamp, _ := range oracleInfo.VoteDataBuffer.Buffer { + currTime := uint64(time.Now().Unix()) + if timestamp <= currTime-uint64(3*time.Second) { + delete(oracleInfo.VoteDataBuffer.Buffer, timestamp) + } + } + oracleInfo.VoteDataBuffer.UpdateMtx.Unlock() + } + }(oracleInfo) +} + +func PruneGossipVoteBuffer(oracleInfo *types.OracleInfo) { + go func(oracleInfo *types.OracleInfo) { + ticker := time.Tick(3 * time.Second) + for range ticker { + oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() + // prune everything older than 3 secs + for key, gossipVote := range oracleInfo.GossipVoteBuffer.Buffer { + currTime := uint64(time.Now().Unix()) + timestamp := gossipVote.SignedTimestamp + if timestamp <= currTime-uint64(3*time.Second) { + delete(oracleInfo.GossipVoteBuffer.Buffer, key) + } + } + oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() + } + }(oracleInfo) +} + // RunOracles run oracle submissions func RunOracles(oracleInfo *types.OracleInfo, t uint64) { for _, oracle := range oracleInfo.Oracles { @@ -279,6 +433,9 @@ func RunOracles(oracleInfo *types.OracleInfo, t uint64) { func Run(oracleInfo *types.OracleInfo) { log.Info("[oracle] Service started.") count := 0 + RunProcessSignVoteQueue(oracleInfo) + PruneGossipVoteBuffer(oracleInfo) + PruneVoteDataBuffer(oracleInfo) for { if count == 0 { // on init, and every minute oracles, err := SyncOracles(oracleInfo) diff --git a/oracle/service/types/info.go b/oracle/service/types/info.go index 7d84d3b6111..6e9795302b9 100644 --- a/oracle/service/types/info.go +++ b/oracle/service/types/info.go @@ -1,17 +1,38 @@ package types import ( - // carbonwalletgo "github.com/Switcheo/carbon-wallet-go" + "time" + + "github.com/cometbft/cometbft/crypto" + cmtsync "github.com/cometbft/cometbft/libs/sync" + oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" "github.com/cometbft/cometbft/redis" + "github.com/cometbft/cometbft/types" "google.golang.org/grpc" ) // App struct for app type OracleInfo struct { - Oracles []Oracle - AdapterMap map[string]Adapter - Redis redis.Service - Config Config - GrpcClient *grpc.ClientConn - Votes map[uint64]map[string][]Vote // timestamp : oracleId : []vote + Oracles []Oracle + AdapterMap map[string]Adapter + Redis redis.Service + Config Config + GrpcClient *grpc.ClientConn + VoteDataBuffer *VoteDataBuffer + GossipVoteBuffer *GossipVoteBuffer + SignVotesChan chan *oracleproto.Vote + PubKey crypto.PubKey + PrivValidator types.PrivValidator + MsgFlushInterval time.Duration + StopChannel chan int +} + +type GossipVoteBuffer struct { + Buffer map[uint64]*oracleproto.GossipVote + UpdateMtx cmtsync.RWMutex +} + +type VoteDataBuffer struct { + Buffer map[uint64]map[string][]*oracleproto.Vote + UpdateMtx cmtsync.RWMutex } diff --git a/oracle/service/types/vote.go b/oracle/service/types/vote.go deleted file mode 100644 index c3fbc23805e..00000000000 --- a/oracle/service/types/vote.go +++ /dev/null @@ -1,9 +0,0 @@ -package types - -type Vote struct { - Creator string - OracleID string - Timestamp uint64 - Data string - Signature string -} diff --git a/privval/file.go b/privval/file.go index a092e38b087..562a0168935 100644 --- a/privval/file.go +++ b/privval/file.go @@ -16,6 +16,7 @@ import ( cmtos "github.com/cometbft/cometbft/libs/os" "github.com/cometbft/cometbft/libs/protoio" "github.com/cometbft/cometbft/libs/tempfile" + oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/cometbft/cometbft/types" cmttime "github.com/cometbft/cometbft/types/time" @@ -275,6 +276,16 @@ func (pv *FilePV) SignProposal(chainID string, proposal *cmtproto.Proposal) erro return nil } +// SignOracleVote signs a canonical representation of the vote, along with the +// chainID. Implements PrivValidator. +func (pv *FilePV) SignOracleVote(chainID string, vote *oracleproto.GossipVote) error { + // TODO TODO TODO: implement sign oracle vote + // if err := pv.signVote(chainID, vote); err != nil { + // return fmt.Errorf("error signing vote: %v", err) + // } + return nil +} + // Save persists the FilePV to disk. func (pv *FilePV) Save() { pv.Key.Save() diff --git a/privval/retry_signer_client.go b/privval/retry_signer_client.go index 271e146474c..1f1c49310ac 100644 --- a/privval/retry_signer_client.go +++ b/privval/retry_signer_client.go @@ -5,6 +5,7 @@ import ( "time" "github.com/cometbft/cometbft/crypto" + oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/cometbft/cometbft/types" ) @@ -79,6 +80,24 @@ func (sc *RetrySignerClient) SignVote(chainID string, vote *cmtproto.Vote) error return fmt.Errorf("exhausted all attempts to sign vote: %w", err) } +func (sc *RetrySignerClient) SignOracleVote(chainID string, vote *oracleproto.GossipVote) error { + // TODO TODO TODO: implement sign oracle vote + var err error + // for i := 0; i < sc.retries || sc.retries == 0; i++ { + // err = sc.next.SignVote(chainID, vote) + // if err == nil { + // return nil + // } + // // If remote signer errors, we don't retry. + // if _, ok := err.(*RemoteSignerError); ok { + // return err + // } + // time.Sleep(sc.timeout) + // } + // return fmt.Errorf("exhausted all attempts to sign vote: %w", err) + return err +} + func (sc *RetrySignerClient) SignProposal(chainID string, proposal *cmtproto.Proposal) error { var err error for i := 0; i < sc.retries || sc.retries == 0; i++ { diff --git a/privval/signer_client.go b/privval/signer_client.go index 8ebb99fc408..66f261ba8de 100644 --- a/privval/signer_client.go +++ b/privval/signer_client.go @@ -6,6 +6,7 @@ import ( "github.com/cometbft/cometbft/crypto" cryptoenc "github.com/cometbft/cometbft/crypto/encoding" + oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" privvalproto "github.com/cometbft/cometbft/proto/tendermint/privval" cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/cometbft/cometbft/types" @@ -110,6 +111,27 @@ func (sc *SignerClient) SignVote(chainID string, vote *cmtproto.Vote) error { return nil } +// SignVote requests a remote signer to sign a vote +func (sc *SignerClient) SignOracleVote(chainID string, vote *oracleproto.GossipVote) error { + // TODO TODO TODO: implement sign oracle vote + // response, err := sc.endpoint.SendRequest(mustWrapMsg(&privvalproto.SignVoteRequest{Vote: vote, ChainId: chainID})) + // if err != nil { + // return err + // } + + // resp := response.GetSignedVoteResponse() + // if resp == nil { + // return ErrUnexpectedResponse + // } + // if resp.Error != nil { + // return &RemoteSignerError{Code: int(resp.Error.Code), Description: resp.Error.Description} + // } + + // *vote = resp.Vote + + return nil +} + // SignProposal requests a remote signer to sign a proposal func (sc *SignerClient) SignProposal(chainID string, proposal *cmtproto.Proposal) error { response, err := sc.endpoint.SendRequest(mustWrapMsg( diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go new file mode 100644 index 00000000000..5c298f08cf2 --- /dev/null +++ b/proto/tendermint/oracle/types.pb.go @@ -0,0 +1,885 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: tendermint/oracle/types.proto + +package oracle + +import ( + fmt "fmt" + proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// 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.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type Vote struct { + Validator string `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` + OracleId string `protobuf:"bytes,2,opt,name=oracle_id,json=oracleId,proto3" json:"oracle_id,omitempty"` + Timestamp uint64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Data string `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` +} + +func (m *Vote) Reset() { *m = Vote{} } +func (m *Vote) String() string { return proto.CompactTextString(m) } +func (*Vote) ProtoMessage() {} +func (*Vote) Descriptor() ([]byte, []int) { + return fileDescriptor_ed9227d272ed5d90, []int{0} +} +func (m *Vote) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Vote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Vote.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Vote) XXX_Merge(src proto.Message) { + xxx_messageInfo_Vote.Merge(m, src) +} +func (m *Vote) XXX_Size() int { + return m.Size() +} +func (m *Vote) XXX_DiscardUnknown() { + xxx_messageInfo_Vote.DiscardUnknown(m) +} + +var xxx_messageInfo_Vote proto.InternalMessageInfo + +func (m *Vote) GetValidator() string { + if m != nil { + return m.Validator + } + return "" +} + +func (m *Vote) GetOracleId() string { + if m != nil { + return m.OracleId + } + return "" +} + +func (m *Vote) GetTimestamp() uint64 { + if m != nil { + return m.Timestamp + } + return 0 +} + +func (m *Vote) GetData() string { + if m != nil { + return m.Data + } + return "" +} + +type GossipVote struct { + Validator string `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` + SignedTimestamp uint64 `protobuf:"varint,2,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` + Signature []byte `protobuf:"bytes,3,opt,name=signature,proto3" json:"signature,omitempty"` + PublicKey []byte `protobuf:"bytes,4,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` + SignType string `protobuf:"bytes,5,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` + Votes []*Vote `protobuf:"bytes,6,rep,name=votes,proto3" json:"votes,omitempty"` +} + +func (m *GossipVote) Reset() { *m = GossipVote{} } +func (m *GossipVote) String() string { return proto.CompactTextString(m) } +func (*GossipVote) ProtoMessage() {} +func (*GossipVote) Descriptor() ([]byte, []int) { + return fileDescriptor_ed9227d272ed5d90, []int{1} +} +func (m *GossipVote) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GossipVote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GossipVote.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *GossipVote) XXX_Merge(src proto.Message) { + xxx_messageInfo_GossipVote.Merge(m, src) +} +func (m *GossipVote) XXX_Size() int { + return m.Size() +} +func (m *GossipVote) XXX_DiscardUnknown() { + xxx_messageInfo_GossipVote.DiscardUnknown(m) +} + +var xxx_messageInfo_GossipVote proto.InternalMessageInfo + +func (m *GossipVote) GetValidator() string { + if m != nil { + return m.Validator + } + return "" +} + +func (m *GossipVote) GetSignedTimestamp() uint64 { + if m != nil { + return m.SignedTimestamp + } + return 0 +} + +func (m *GossipVote) GetSignature() []byte { + if m != nil { + return m.Signature + } + return nil +} + +func (m *GossipVote) GetPublicKey() []byte { + if m != nil { + return m.PublicKey + } + return nil +} + +func (m *GossipVote) GetSignType() string { + if m != nil { + return m.SignType + } + return "" +} + +func (m *GossipVote) GetVotes() []*Vote { + if m != nil { + return m.Votes + } + return nil +} + +func init() { + proto.RegisterType((*Vote)(nil), "tendermint.oracle.Vote") + proto.RegisterType((*GossipVote)(nil), "tendermint.oracle.GossipVote") +} + +func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } + +var fileDescriptor_ed9227d272ed5d90 = []byte{ + // 313 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x91, 0xc1, 0x4a, 0xc3, 0x40, + 0x10, 0x86, 0xbb, 0x6d, 0x5a, 0xcc, 0x58, 0x50, 0xf7, 0x62, 0xc0, 0x36, 0x94, 0x9e, 0xea, 0xc1, + 0x04, 0xd4, 0x27, 0xf0, 0x22, 0x22, 0x78, 0x08, 0xc5, 0x83, 0x97, 0xb0, 0x49, 0xc6, 0xba, 0xd8, + 0x74, 0x43, 0x76, 0x5a, 0xc8, 0x5b, 0xf8, 0x58, 0x1e, 0x7b, 0xf4, 0x24, 0xd2, 0xbe, 0x88, 0xec, + 0x2e, 0x98, 0x43, 0x2f, 0xde, 0x86, 0xef, 0x9f, 0xe1, 0x9f, 0x7f, 0x06, 0xc6, 0x84, 0xab, 0x02, + 0xeb, 0x52, 0xae, 0x28, 0x56, 0xb5, 0xc8, 0x97, 0x18, 0x53, 0x53, 0xa1, 0x8e, 0xaa, 0x5a, 0x91, + 0xe2, 0x67, 0xad, 0x1c, 0x39, 0x79, 0xaa, 0xc1, 0x7b, 0x56, 0x84, 0x7c, 0x04, 0xfe, 0x46, 0x2c, + 0x65, 0x21, 0x48, 0xd5, 0x01, 0x9b, 0xb0, 0x99, 0x9f, 0xb4, 0x80, 0x5f, 0x80, 0xef, 0xfa, 0x53, + 0x59, 0x04, 0x5d, 0xab, 0x1e, 0x39, 0xf0, 0x50, 0x98, 0x51, 0x92, 0x25, 0x6a, 0x12, 0x65, 0x15, + 0xf4, 0x26, 0x6c, 0xe6, 0x25, 0x2d, 0xe0, 0x1c, 0xbc, 0x42, 0x90, 0x08, 0x3c, 0x3b, 0x65, 0xeb, + 0xe9, 0x37, 0x03, 0xb8, 0x57, 0x5a, 0xcb, 0xea, 0x1f, 0xde, 0x97, 0x70, 0xaa, 0xe5, 0x62, 0x85, + 0x45, 0xda, 0xba, 0x74, 0xad, 0xcb, 0x89, 0xe3, 0xf3, 0x3f, 0xaf, 0x11, 0xf8, 0x06, 0x09, 0x5a, + 0xd7, 0x68, 0x37, 0x19, 0x26, 0x2d, 0xe0, 0x63, 0x80, 0x6a, 0x9d, 0x2d, 0x65, 0x9e, 0xbe, 0x63, + 0x63, 0xf7, 0x19, 0x26, 0xbe, 0x23, 0x8f, 0xd8, 0x98, 0x8c, 0xa6, 0x37, 0x35, 0x07, 0x0b, 0xfa, + 0x2e, 0xa3, 0x01, 0xf3, 0xa6, 0x42, 0x7e, 0x05, 0xfd, 0x8d, 0x22, 0xd4, 0xc1, 0x60, 0xd2, 0x9b, + 0x1d, 0x5f, 0x9f, 0x47, 0x07, 0x97, 0x8c, 0x4c, 0x94, 0xc4, 0x75, 0xdd, 0x3d, 0x7d, 0xee, 0x42, + 0xb6, 0xdd, 0x85, 0xec, 0x67, 0x17, 0xb2, 0x8f, 0x7d, 0xd8, 0xd9, 0xee, 0xc3, 0xce, 0xd7, 0x3e, + 0xec, 0xbc, 0xdc, 0x2e, 0x24, 0xbd, 0xad, 0xb3, 0x28, 0x57, 0x65, 0x9c, 0xab, 0x12, 0x29, 0x7b, + 0xa5, 0xb6, 0xb0, 0x6f, 0x8a, 0x0f, 0x9e, 0x98, 0x0d, 0xac, 0x70, 0xf3, 0x1b, 0x00, 0x00, 0xff, + 0xff, 0x40, 0x33, 0x0b, 0xb2, 0xe0, 0x01, 0x00, 0x00, +} + +func (m *Vote) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Vote) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Vote) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0x22 + } + if m.Timestamp != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Timestamp)) + i-- + dAtA[i] = 0x18 + } + if len(m.OracleId) > 0 { + i -= len(m.OracleId) + copy(dAtA[i:], m.OracleId) + i = encodeVarintTypes(dAtA, i, uint64(len(m.OracleId))) + i-- + dAtA[i] = 0x12 + } + if len(m.Validator) > 0 { + i -= len(m.Validator) + copy(dAtA[i:], m.Validator) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Validator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *GossipVote) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GossipVote) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Votes) > 0 { + for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Votes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + } + if len(m.SignType) > 0 { + i -= len(m.SignType) + copy(dAtA[i:], m.SignType) + i = encodeVarintTypes(dAtA, i, uint64(len(m.SignType))) + i-- + dAtA[i] = 0x2a + } + if len(m.PublicKey) > 0 { + i -= len(m.PublicKey) + copy(dAtA[i:], m.PublicKey) + i = encodeVarintTypes(dAtA, i, uint64(len(m.PublicKey))) + i-- + dAtA[i] = 0x22 + } + if len(m.Signature) > 0 { + i -= len(m.Signature) + copy(dAtA[i:], m.Signature) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Signature))) + i-- + dAtA[i] = 0x1a + } + if m.SignedTimestamp != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.SignedTimestamp)) + i-- + dAtA[i] = 0x10 + } + if len(m.Validator) > 0 { + i -= len(m.Validator) + copy(dAtA[i:], m.Validator) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Validator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintTypes(dAtA []byte, offset int, v uint64) int { + offset -= sovTypes(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Vote) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Validator) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.OracleId) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.Timestamp != 0 { + n += 1 + sovTypes(uint64(m.Timestamp)) + } + l = len(m.Data) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *GossipVote) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Validator) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.SignedTimestamp != 0 { + n += 1 + sovTypes(uint64(m.SignedTimestamp)) + } + l = len(m.Signature) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.PublicKey) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.SignType) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if len(m.Votes) > 0 { + for _, e := range m.Votes { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + return n +} + +func sovTypes(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozTypes(x uint64) (n int) { + return sovTypes(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Vote) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Vote: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Vote: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Validator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OracleId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.OracleId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) + } + m.Timestamp = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Timestamp |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GossipVote) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GossipVote: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GossipVote: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Validator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SignedTimestamp", wireType) + } + m.SignedTimestamp = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SignedTimestamp |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signature = append(m.Signature[:0], dAtA[iNdEx:postIndex]...) + if m.Signature == nil { + m.Signature = []byte{} + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PublicKey", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PublicKey = append(m.PublicKey[:0], dAtA[iNdEx:postIndex]...) + if m.PublicKey == nil { + m.PublicKey = []byte{} + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SignType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SignType = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Votes = append(m.Votes, &Vote{}) + if err := m.Votes[len(m.Votes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipTypes(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTypes + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTypes + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTypes + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthTypes + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupTypes + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthTypes + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthTypes = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowTypes = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupTypes = fmt.Errorf("proto: unexpected end of group") +) diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto new file mode 100644 index 00000000000..6a4370af25d --- /dev/null +++ b/proto/tendermint/oracle/types.proto @@ -0,0 +1,20 @@ +syntax = "proto3"; +package tendermint.oracle; + +option go_package = "github.com/cometbft/cometbft/proto/tendermint/oracle"; + +message Vote { + string validator = 1; + string oracle_id = 2; + uint64 timestamp = 3; + string data = 4; +} + +message GossipVote { + string validator = 1; + uint64 signed_timestamp = 2; + bytes signature = 3; + bytes public_key = 4; + string sign_type = 5; + repeated Vote votes = 6; +} diff --git a/types/priv_validator.go b/types/priv_validator.go index 340794d00c5..b08a925dd33 100644 --- a/types/priv_validator.go +++ b/types/priv_validator.go @@ -7,6 +7,7 @@ import ( "github.com/cometbft/cometbft/crypto" "github.com/cometbft/cometbft/crypto/ed25519" + oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" ) @@ -17,6 +18,7 @@ type PrivValidator interface { SignVote(chainID string, vote *cmtproto.Vote) error SignProposal(chainID string, proposal *cmtproto.Proposal) error + SignOracleVote(chainID string, oracleVote *oracleproto.GossipVote) error } type PrivValidatorsByAddress []PrivValidator @@ -98,6 +100,36 @@ func (pv MockPV) SignVote(chainID string, vote *cmtproto.Vote) error { return nil } +// Implements PrivValidator. +func (pv MockPV) SignOracleVote(chainID string, vote *oracleproto.GossipVote) error { + // TODO TODO TODO: implement sign oracle vote + // useChainID := chainID + // if pv.breakVoteSigning { + // useChainID = "incorrect-chain-id" + // } + + // signBytes := VoteSignBytes(useChainID, vote) + // sig, err := pv.PrivKey.Sign(signBytes) + // if err != nil { + // return err + // } + // vote.Signature = sig + + // var extSig []byte + // // We only sign vote extensions for non-nil precommits + // if vote.Type == cmtproto.PrecommitType && !ProtoBlockIDIsNil(&vote.BlockID) { + // extSignBytes := VoteExtensionSignBytes(useChainID, vote) + // extSig, err = pv.PrivKey.Sign(extSignBytes) + // if err != nil { + // return err + // } + // } else if len(vote.Extension) > 0 { + // return errors.New("unexpected vote extension - vote extensions are only allowed in non-nil precommits") + // } + // vote.ExtensionSignature = extSig + return nil +} + // Implements PrivValidator. func (pv MockPV) SignProposal(chainID string, proposal *cmtproto.Proposal) error { useChainID := chainID From 4d5a70b9b55545e702a114c39e18c1f857bc0987 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 20 Feb 2024 16:02:08 +0800 Subject: [PATCH 006/150] rehaul gossiping and pruning and add new unsigned vote buffer --- oracle/reactor.go | 47 +++++++++----- oracle/service/runner/runner.go | 110 +++++++++++++++----------------- oracle/service/types/info.go | 37 +++++++---- state/execution.go | 19 ++++++ 4 files changed, 125 insertions(+), 88 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 8c8b107fefd..15d6ed24b5b 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -76,17 +76,22 @@ func NewReactor(configPath string, grpcAddress string, pubKey crypto.PubKey, pri } gossipVoteBuffer := &oracletypes.GossipVoteBuffer{ - Buffer: make(map[uint64]*oracleproto.GossipVote), + Buffer: make(map[string]*oracleproto.GossipVote), + } + + unsignedVoteBuffer := &oracletypes.UnsignedVoteBuffer{ + Buffer: []*oracletypes.UnsignedVotes{}, } oracleInfo := &oracletypes.OracleInfo{ - Oracles: nil, - Config: config, - VoteDataBuffer: voteDataBuffer, - GossipVoteBuffer: gossipVoteBuffer, - SignVotesChan: make(chan *oracleproto.Vote), - PubKey: pubKey, - PrivValidator: privValidator, + Oracles: nil, + Config: config, + VoteDataBuffer: voteDataBuffer, + GossipVoteBuffer: gossipVoteBuffer, + UnsignedVoteBuffer: unsignedVoteBuffer, + SignVotesChan: make(chan *oracleproto.Vote), + PubKey: pubKey, + PrivValidator: privValidator, } jsonFile.Close() @@ -194,24 +199,32 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { oracleR.Logger.Debug("Receive", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) switch msg := e.Message.(type) { case *oracleproto.GossipVote: - // hash and check if gossipVote already exists - gossipVoteHash := runner.HashGossipVote(msg) - oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RLock() - _, ok := oracleR.OracleInfo.GossipVoteBuffer.Buffer[gossipVoteHash] + currentGossipVote, ok := oracleR.OracleInfo.GossipVoteBuffer.Buffer[msg.Validator] oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() if !ok { + // first gossipVote entry from this validator oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Lock() - oracleR.OracleInfo.GossipVoteBuffer.Buffer[gossipVoteHash] = msg + oracleR.OracleInfo.GossipVoteBuffer.Buffer[msg.Validator] = msg oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() // safe to assume that if gossipVote does not exist in gossipBuffer, it also does not exist in dataBuffer? - oracleR.OracleInfo.VoteDataBuffer.UpdateMtx.Lock() - for _, vote := range msg.Votes { - runner.AddVoteToDataBuffer(oracleR.OracleInfo, vote) + // oracleR.OracleInfo.VoteDataBuffer.UpdateMtx.Lock() + // for _, vote := range msg.Votes { + // runner.AddVoteToDataBuffer(oracleR.OracleInfo, vote) + // } + // oracleR.OracleInfo.VoteDataBuffer.UpdateMtx.Unlock() + } else { + // existing gossipVote entry from this validator + oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Lock() + previousTimestamp := currentGossipVote.SignedTimestamp + newTimestamp := msg.SignedTimestamp + // only replace if the gossipVote received has a later timestamp than our current one + if newTimestamp > previousTimestamp { + oracleR.OracleInfo.GossipVoteBuffer.Buffer[msg.Validator] = msg } - oracleR.OracleInfo.VoteDataBuffer.UpdateMtx.Unlock() + oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() } default: oracleR.Logger.Error("unknown message type", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index d929cfa9653..fb2a467c280 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -252,30 +252,6 @@ func RunOracle(oracleInfo *types.OracleInfo, oracle types.Oracle, currentTime ui return errors.New("skipping submission for " + oracle.Id + " as result is empty") } - // when querying oracle, use go routines to parallelise - // each reactor will have a map of id: normalisedTime: votes - // each reactor will also have a channel for gossiping - // sign the vote and append to the map - // signed vote will also be marshalled to bytes and passed to the channel - // broadcast routine will read the channel concurrently and gossip the encoded votes - // received votes from gossiping will be unmarshalled and placed into their own maps - // use the map to check for 2/3 maj to insert into the prepareProposal method - // when submitting results that have 2/3 maj, it should only be in one single tx - // the single tx consists of the oracle id: result: the validators address and signature - - // need to handle concurrency for reading/writing to the maps - // 1. writing your own votes to the map - // 2. writing gossiped votes to the map - // 3. pruning expired votes from the map, prune every min? - // 4. reading the votes to calculate 2/3 maj, - // need to have pruning logic - - // need to consider if we want to gossip votes not submitted by us (ie gossip a vote received from other reactors) - // if you prune when you submit in proposal, only the validator submitting the proposal will have knowledge of which - // votes to prune - // have in built pruning logic that runs every 1 min? - // every one minute delete gossip - vote := oracleproto.Vote{ Validator: oracleInfo.PubKey.Address().String(), OracleId: oracle.Id, @@ -296,7 +272,7 @@ func RunProcessSignVoteQueue(oracleInfo *types.OracleInfo) { default: interval := oracleInfo.MsgFlushInterval if interval == 0 { - interval = 100 * time.Millisecond + interval = 500 * time.Millisecond } time.Sleep(interval) ProcessSignVoteQueue(oracleInfo) @@ -333,42 +309,46 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo) { return } - gossipVote := &oracleproto.GossipVote{ + // new batch of unsigned votes + newUnsignedVotes := &types.UnsignedVotes{ + Timestamp: uint64(time.Now().Unix()), + Votes: votes, + } + + // append new batch into unsignedVotesBuffer, need to mutex lock as it will clash with concurrent pruning + oracleInfo.UnsignedVoteBuffer.UpdateMtx.Lock() + oracleInfo.UnsignedVoteBuffer.Buffer = append(oracleInfo.UnsignedVoteBuffer.Buffer, newUnsignedVotes) + oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() + + // loop through unsignedVoteBuffer and combine all votes + var batchVotes = []*oracleproto.Vote{} + oracleInfo.UnsignedVoteBuffer.UpdateMtx.RLock() + for _, unsignedVotes := range oracleInfo.UnsignedVoteBuffer.Buffer { + batchVotes = append(batchVotes, unsignedVotes.Votes...) + } + oracleInfo.UnsignedVoteBuffer.UpdateMtx.RUnlock() + + // batch sign the entire unsignedVoteBuffer and add to gossipBuffer + newGossipVote := &oracleproto.GossipVote{ Validator: oracleInfo.PubKey.Address().String(), PublicKey: oracleInfo.PubKey.Bytes(), SignType: oracleInfo.PubKey.Type(), - Votes: votes, + Votes: batchVotes, } // signing of vote should append the signature field and timestamp field of gossipVote - if err := oracleInfo.PrivValidator.SignOracleVote("", gossipVote); err != nil { + if err := oracleInfo.PrivValidator.SignOracleVote("", newGossipVote); err != nil { log.Errorf("error signing oracle votes") } + newGossipVote.SignedTimestamp = uint64(time.Now().Unix()) - gossipVoteHash := HashGossipVote(gossipVote) + // replace current gossipVoteBuffer with new one + address := oracleInfo.PubKey.Address().String() + // need to mutex lock as it will clash with concurrent gossip oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() - oracleInfo.GossipVoteBuffer.Buffer[gossipVoteHash] = gossipVote + oracleInfo.GossipVoteBuffer.Buffer[address] = newGossipVote oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() - - // maybe dont have a channel? maybe just add it to a buffer? - // add gossip votes to a gossip buffer - // this gossip buffer will be sent to other peers - // when sending, loop through gossip buffer and send out each gossipVote one by one - // when receiving this gossip buffer, add data to map that we dont have, and add data to gossip buffer that we dont have - // check if we have it by hashing the gossipVoteObject - // prune the gossip buffer every 3 secs - // prune the data map every 3 secs - // prune everything with timestamp > 3 secs ago - // data map will be in timestamp : oracleId: votes[] - - // after signing, pass into data map - oracleInfo.VoteDataBuffer.UpdateMtx.Lock() - defer oracleInfo.VoteDataBuffer.UpdateMtx.Unlock() - - for _, vote := range gossipVote.Votes { - AddVoteToDataBuffer(oracleInfo, vote) - } } func AddVoteToDataBuffer(oracleInfo *types.OracleInfo, vote *oracleproto.Vote) { @@ -399,20 +379,34 @@ func PruneVoteDataBuffer(oracleInfo *types.OracleInfo) { }(oracleInfo) } -func PruneGossipVoteBuffer(oracleInfo *types.OracleInfo) { +func PruneUnsignedVoteBuffer(oracleInfo *types.OracleInfo) { go func(oracleInfo *types.OracleInfo) { ticker := time.Tick(3 * time.Second) for range ticker { - oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() + oracleInfo.UnsignedVoteBuffer.UpdateMtx.RLock() // prune everything older than 3 secs - for key, gossipVote := range oracleInfo.GossipVoteBuffer.Buffer { - currTime := uint64(time.Now().Unix()) - timestamp := gossipVote.SignedTimestamp + currTime := uint64(time.Now().Unix()) + numberOfVotesToPrune := 0 + count := 0 + unsignedVoteBuffer := oracleInfo.UnsignedVoteBuffer.Buffer + for _, unsignedVotes := range unsignedVoteBuffer { + // unsigned votes are arranged from least recent to most recent + timestamp := unsignedVotes.Timestamp if timestamp <= currTime-uint64(3*time.Second) { - delete(oracleInfo.GossipVoteBuffer.Buffer, key) + numberOfVotesToPrune++ + count += len(unsignedVotes.Votes) + } else { + // everything beyond is more recent hence we can early terminate + break } } - oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() + oracleInfo.UnsignedVoteBuffer.UpdateMtx.RUnlock() + + if numberOfVotesToPrune > 0 { + oracleInfo.UnsignedVoteBuffer.UpdateMtx.Lock() + oracleInfo.UnsignedVoteBuffer.Buffer = oracleInfo.UnsignedVoteBuffer.Buffer[numberOfVotesToPrune:] + oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() + } } }(oracleInfo) } @@ -434,8 +428,8 @@ func Run(oracleInfo *types.OracleInfo) { log.Info("[oracle] Service started.") count := 0 RunProcessSignVoteQueue(oracleInfo) - PruneGossipVoteBuffer(oracleInfo) - PruneVoteDataBuffer(oracleInfo) + PruneUnsignedVoteBuffer(oracleInfo) + // PruneVoteDataBuffer(oracleInfo) for { if count == 0 { // on init, and every minute oracles, err := SyncOracles(oracleInfo) diff --git a/oracle/service/types/info.go b/oracle/service/types/info.go index 6e9795302b9..542da184566 100644 --- a/oracle/service/types/info.go +++ b/oracle/service/types/info.go @@ -13,22 +13,28 @@ import ( // App struct for app type OracleInfo struct { - Oracles []Oracle - AdapterMap map[string]Adapter - Redis redis.Service - Config Config - GrpcClient *grpc.ClientConn - VoteDataBuffer *VoteDataBuffer - GossipVoteBuffer *GossipVoteBuffer - SignVotesChan chan *oracleproto.Vote - PubKey crypto.PubKey - PrivValidator types.PrivValidator - MsgFlushInterval time.Duration - StopChannel chan int + Oracles []Oracle + AdapterMap map[string]Adapter + Redis redis.Service + Config Config + GrpcClient *grpc.ClientConn + VoteDataBuffer *VoteDataBuffer + UnsignedVoteBuffer *UnsignedVoteBuffer + GossipVoteBuffer *GossipVoteBuffer + SignVotesChan chan *oracleproto.Vote + PubKey crypto.PubKey + PrivValidator types.PrivValidator + MsgFlushInterval time.Duration + StopChannel chan int +} + +type UnsignedVotes struct { + Timestamp uint64 + Votes []*oracleproto.Vote } type GossipVoteBuffer struct { - Buffer map[uint64]*oracleproto.GossipVote + Buffer map[string]*oracleproto.GossipVote UpdateMtx cmtsync.RWMutex } @@ -36,3 +42,8 @@ type VoteDataBuffer struct { Buffer map[uint64]map[string][]*oracleproto.Vote UpdateMtx cmtsync.RWMutex } + +type UnsignedVoteBuffer struct { + Buffer []*UnsignedVotes // deque of UnsignedVote obj + UpdateMtx cmtsync.RWMutex +} diff --git a/state/execution.go b/state/execution.go index c8b0bbef2dc..68c98fac91e 100644 --- a/state/execution.go +++ b/state/execution.go @@ -128,6 +128,25 @@ func (blockExec *BlockExecutor) CreateProposalBlock( maxReapBytes = -1 } + // check which results have 2/3 maj + // totalPower := math.NewInt(state.Validators.TotalVotingPower()) + // minTurnoutRatio := math.LegacyNewDec(67).QuoInt64(100) + // minTurnout := minTurnoutRatio.MulInt(totalPower).RoundInt() + + // blockExec.oracleInfo.VoteDataBuffer.UpdateMtx.RLock() + // for timestamp, data := range blockExec.oracleInfo.VoteDataBuffer.Buffer { + // currentPower := math.OneInt() + // for oracleId, votes := range data { + // for _, vote := range votes { + // validator := vote.Validator + // if state.Validators.HasAddress([]byte(validator)) { + // // get power of validator + // power := state.Validators.GetByAddress([]byte(validator)) + // } + // } + // } + // } + txs := blockExec.mempool.ReapMaxBytesMaxGas(maxReapBytes, maxGas) commit := lastExtCommit.ToCommit() block := state.MakeBlock(height, txs, commit, evidence, proposerAddr) From 7d5e05f418dddbd869fe58e01400dfa1a5599f34 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 20 Feb 2024 23:15:16 +0800 Subject: [PATCH 007/150] add notes --- oracle/reactor.go | 7 ------- 1 file changed, 7 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 15d6ed24b5b..7b1fda2aa55 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -208,13 +208,6 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Lock() oracleR.OracleInfo.GossipVoteBuffer.Buffer[msg.Validator] = msg oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() - - // safe to assume that if gossipVote does not exist in gossipBuffer, it also does not exist in dataBuffer? - // oracleR.OracleInfo.VoteDataBuffer.UpdateMtx.Lock() - // for _, vote := range msg.Votes { - // runner.AddVoteToDataBuffer(oracleR.OracleInfo, vote) - // } - // oracleR.OracleInfo.VoteDataBuffer.UpdateMtx.Unlock() } else { // existing gossipVote entry from this validator oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Lock() From 8fd47e5c180ca08ae904d827f0f740cb5c9503ab Mon Sep 17 00:00:00 2001 From: yan-soon Date: Wed, 21 Feb 2024 20:19:55 +0800 Subject: [PATCH 008/150] implement oracle signing svc --- oracle/service/runner/runner.go | 15 - privval/file.go | 19 +- privval/retry_signer_client.go | 25 +- privval/signer_client.go | 28 +- proto/tendermint/oracle/types.pb.go | 423 +++++++++++++-- proto/tendermint/oracle/types.proto | 17 +- proto/tendermint/privval/types.pb.go | 773 ++++++++++++++++++++++++--- proto/tendermint/privval/types.proto | 15 + types/oracle.go | 25 + types/priv_validator.go | 33 +- 10 files changed, 1185 insertions(+), 188 deletions(-) create mode 100644 types/oracle.go diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index fb2a467c280..e1aeb5453b7 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -2,8 +2,6 @@ package runner import ( "context" - "crypto/sha256" - "encoding/binary" "encoding/json" "errors" "fmt" @@ -281,18 +279,6 @@ func RunProcessSignVoteQueue(oracleInfo *types.OracleInfo) { }(oracleInfo) } -func HashGossipVote(gossipVote *oracleproto.GossipVote) uint64 { - h := sha256.New() - encoding, err := gossipVote.Marshal() - if err != nil { - panic(err) - } - h.Write(encoding) - hashBytes := h.Sum(nil) - hashUint64 := binary.BigEndian.Uint64(hashBytes) - return hashUint64 -} - func ProcessSignVoteQueue(oracleInfo *types.OracleInfo) { votes := []*oracleproto.Vote{} for { @@ -340,7 +326,6 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo) { if err := oracleInfo.PrivValidator.SignOracleVote("", newGossipVote); err != nil { log.Errorf("error signing oracle votes") } - newGossipVote.SignedTimestamp = uint64(time.Now().Unix()) // replace current gossipVoteBuffer with new one address := oracleInfo.PubKey.Address().String() diff --git a/privval/file.go b/privval/file.go index 562a0168935..f50421711cd 100644 --- a/privval/file.go +++ b/privval/file.go @@ -279,10 +279,9 @@ func (pv *FilePV) SignProposal(chainID string, proposal *cmtproto.Proposal) erro // SignOracleVote signs a canonical representation of the vote, along with the // chainID. Implements PrivValidator. func (pv *FilePV) SignOracleVote(chainID string, vote *oracleproto.GossipVote) error { - // TODO TODO TODO: implement sign oracle vote - // if err := pv.signVote(chainID, vote); err != nil { - // return fmt.Errorf("error signing vote: %v", err) - // } + if err := pv.signOracleVote(vote); err != nil { + return fmt.Errorf("error signing vote: %v", err) + } return nil } @@ -310,6 +309,18 @@ func (pv *FilePV) String() string { ) } +func (pv *FilePV) signOracleVote(vote *oracleproto.GossipVote) error { + signBytes := types.OracleVoteSignBytes(vote) + sig, err := pv.Key.PrivKey.Sign(signBytes) + if err != nil { + return err + } + vote.SignedTimestamp = uint64(time.Now().Unix()) + vote.Signature = sig + + return nil +} + //------------------------------------------------------------------------------------ // signVote checks if the vote is good to sign and sets the vote signature. diff --git a/privval/retry_signer_client.go b/privval/retry_signer_client.go index 1f1c49310ac..270aa63473d 100644 --- a/privval/retry_signer_client.go +++ b/privval/retry_signer_client.go @@ -83,19 +83,18 @@ func (sc *RetrySignerClient) SignVote(chainID string, vote *cmtproto.Vote) error func (sc *RetrySignerClient) SignOracleVote(chainID string, vote *oracleproto.GossipVote) error { // TODO TODO TODO: implement sign oracle vote var err error - // for i := 0; i < sc.retries || sc.retries == 0; i++ { - // err = sc.next.SignVote(chainID, vote) - // if err == nil { - // return nil - // } - // // If remote signer errors, we don't retry. - // if _, ok := err.(*RemoteSignerError); ok { - // return err - // } - // time.Sleep(sc.timeout) - // } - // return fmt.Errorf("exhausted all attempts to sign vote: %w", err) - return err + for i := 0; i < sc.retries || sc.retries == 0; i++ { + err = sc.next.SignOracleVote(chainID, vote) + if err == nil { + return nil + } + // If remote signer errors, we don't retry. + if _, ok := err.(*RemoteSignerError); ok { + return err + } + time.Sleep(sc.timeout) + } + return fmt.Errorf("exhausted all attempts to sign vote: %w", err) } func (sc *RetrySignerClient) SignProposal(chainID string, proposal *cmtproto.Proposal) error { diff --git a/privval/signer_client.go b/privval/signer_client.go index 66f261ba8de..f2ab27c5d84 100644 --- a/privval/signer_client.go +++ b/privval/signer_client.go @@ -114,20 +114,20 @@ func (sc *SignerClient) SignVote(chainID string, vote *cmtproto.Vote) error { // SignVote requests a remote signer to sign a vote func (sc *SignerClient) SignOracleVote(chainID string, vote *oracleproto.GossipVote) error { // TODO TODO TODO: implement sign oracle vote - // response, err := sc.endpoint.SendRequest(mustWrapMsg(&privvalproto.SignVoteRequest{Vote: vote, ChainId: chainID})) - // if err != nil { - // return err - // } - - // resp := response.GetSignedVoteResponse() - // if resp == nil { - // return ErrUnexpectedResponse - // } - // if resp.Error != nil { - // return &RemoteSignerError{Code: int(resp.Error.Code), Description: resp.Error.Description} - // } - - // *vote = resp.Vote + response, err := sc.endpoint.SendRequest(mustWrapMsg(&privvalproto.SignOracleVoteRequest{Vote: vote, ChainId: chainID})) + if err != nil { + return err + } + + resp := response.GetSignedOracleVoteResponse() + if resp == nil { + return ErrUnexpectedResponse + } + if resp.Error != nil { + return &RemoteSignerError{Code: int(resp.Error.Code), Description: resp.Error.Description} + } + + *vote = resp.Vote return nil } diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index 5c298f08cf2..5e08a0de499 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -92,11 +92,11 @@ func (m *Vote) GetData() string { type GossipVote struct { Validator string `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` - SignedTimestamp uint64 `protobuf:"varint,2,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` - Signature []byte `protobuf:"bytes,3,opt,name=signature,proto3" json:"signature,omitempty"` - PublicKey []byte `protobuf:"bytes,4,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` - SignType string `protobuf:"bytes,5,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` - Votes []*Vote `protobuf:"bytes,6,rep,name=votes,proto3" json:"votes,omitempty"` + PublicKey []byte `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` + SignType string `protobuf:"bytes,3,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` + Votes []*Vote `protobuf:"bytes,4,rep,name=votes,proto3" json:"votes,omitempty"` + SignedTimestamp uint64 `protobuf:"varint,5,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` + Signature []byte `protobuf:"bytes,6,opt,name=signature,proto3" json:"signature,omitempty"` } func (m *GossipVote) Reset() { *m = GossipVote{} } @@ -139,6 +139,27 @@ func (m *GossipVote) GetValidator() string { return "" } +func (m *GossipVote) GetPublicKey() []byte { + if m != nil { + return m.PublicKey + } + return nil +} + +func (m *GossipVote) GetSignType() string { + if m != nil { + return m.SignType + } + return "" +} + +func (m *GossipVote) GetVotes() []*Vote { + if m != nil { + return m.Votes + } + return nil +} + func (m *GossipVote) GetSignedTimestamp() uint64 { if m != nil { return m.SignedTimestamp @@ -153,21 +174,68 @@ func (m *GossipVote) GetSignature() []byte { return nil } -func (m *GossipVote) GetPublicKey() []byte { +type CanonicalGossipVote struct { + Validator string `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` + PublicKey []byte `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` + SignType string `protobuf:"bytes,3,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` + Votes []*Vote `protobuf:"bytes,4,rep,name=votes,proto3" json:"votes,omitempty"` +} + +func (m *CanonicalGossipVote) Reset() { *m = CanonicalGossipVote{} } +func (m *CanonicalGossipVote) String() string { return proto.CompactTextString(m) } +func (*CanonicalGossipVote) ProtoMessage() {} +func (*CanonicalGossipVote) Descriptor() ([]byte, []int) { + return fileDescriptor_ed9227d272ed5d90, []int{2} +} +func (m *CanonicalGossipVote) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CanonicalGossipVote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_CanonicalGossipVote.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *CanonicalGossipVote) XXX_Merge(src proto.Message) { + xxx_messageInfo_CanonicalGossipVote.Merge(m, src) +} +func (m *CanonicalGossipVote) XXX_Size() int { + return m.Size() +} +func (m *CanonicalGossipVote) XXX_DiscardUnknown() { + xxx_messageInfo_CanonicalGossipVote.DiscardUnknown(m) +} + +var xxx_messageInfo_CanonicalGossipVote proto.InternalMessageInfo + +func (m *CanonicalGossipVote) GetValidator() string { + if m != nil { + return m.Validator + } + return "" +} + +func (m *CanonicalGossipVote) GetPublicKey() []byte { if m != nil { return m.PublicKey } return nil } -func (m *GossipVote) GetSignType() string { +func (m *CanonicalGossipVote) GetSignType() string { if m != nil { return m.SignType } return "" } -func (m *GossipVote) GetVotes() []*Vote { +func (m *CanonicalGossipVote) GetVotes() []*Vote { if m != nil { return m.Votes } @@ -177,32 +245,34 @@ func (m *GossipVote) GetVotes() []*Vote { func init() { proto.RegisterType((*Vote)(nil), "tendermint.oracle.Vote") proto.RegisterType((*GossipVote)(nil), "tendermint.oracle.GossipVote") + proto.RegisterType((*CanonicalGossipVote)(nil), "tendermint.oracle.CanonicalGossipVote") } func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 313 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x91, 0xc1, 0x4a, 0xc3, 0x40, - 0x10, 0x86, 0xbb, 0x6d, 0x5a, 0xcc, 0x58, 0x50, 0xf7, 0x62, 0xc0, 0x36, 0x94, 0x9e, 0xea, 0xc1, - 0x04, 0xd4, 0x27, 0xf0, 0x22, 0x22, 0x78, 0x08, 0xc5, 0x83, 0x97, 0xb0, 0x49, 0xc6, 0xba, 0xd8, - 0x74, 0x43, 0x76, 0x5a, 0xc8, 0x5b, 0xf8, 0x58, 0x1e, 0x7b, 0xf4, 0x24, 0xd2, 0xbe, 0x88, 0xec, - 0x2e, 0x98, 0x43, 0x2f, 0xde, 0x86, 0xef, 0x9f, 0xe1, 0x9f, 0x7f, 0x06, 0xc6, 0x84, 0xab, 0x02, - 0xeb, 0x52, 0xae, 0x28, 0x56, 0xb5, 0xc8, 0x97, 0x18, 0x53, 0x53, 0xa1, 0x8e, 0xaa, 0x5a, 0x91, - 0xe2, 0x67, 0xad, 0x1c, 0x39, 0x79, 0xaa, 0xc1, 0x7b, 0x56, 0x84, 0x7c, 0x04, 0xfe, 0x46, 0x2c, - 0x65, 0x21, 0x48, 0xd5, 0x01, 0x9b, 0xb0, 0x99, 0x9f, 0xb4, 0x80, 0x5f, 0x80, 0xef, 0xfa, 0x53, - 0x59, 0x04, 0x5d, 0xab, 0x1e, 0x39, 0xf0, 0x50, 0x98, 0x51, 0x92, 0x25, 0x6a, 0x12, 0x65, 0x15, - 0xf4, 0x26, 0x6c, 0xe6, 0x25, 0x2d, 0xe0, 0x1c, 0xbc, 0x42, 0x90, 0x08, 0x3c, 0x3b, 0x65, 0xeb, - 0xe9, 0x37, 0x03, 0xb8, 0x57, 0x5a, 0xcb, 0xea, 0x1f, 0xde, 0x97, 0x70, 0xaa, 0xe5, 0x62, 0x85, - 0x45, 0xda, 0xba, 0x74, 0xad, 0xcb, 0x89, 0xe3, 0xf3, 0x3f, 0xaf, 0x11, 0xf8, 0x06, 0x09, 0x5a, - 0xd7, 0x68, 0x37, 0x19, 0x26, 0x2d, 0xe0, 0x63, 0x80, 0x6a, 0x9d, 0x2d, 0x65, 0x9e, 0xbe, 0x63, - 0x63, 0xf7, 0x19, 0x26, 0xbe, 0x23, 0x8f, 0xd8, 0x98, 0x8c, 0xa6, 0x37, 0x35, 0x07, 0x0b, 0xfa, - 0x2e, 0xa3, 0x01, 0xf3, 0xa6, 0x42, 0x7e, 0x05, 0xfd, 0x8d, 0x22, 0xd4, 0xc1, 0x60, 0xd2, 0x9b, - 0x1d, 0x5f, 0x9f, 0x47, 0x07, 0x97, 0x8c, 0x4c, 0x94, 0xc4, 0x75, 0xdd, 0x3d, 0x7d, 0xee, 0x42, - 0xb6, 0xdd, 0x85, 0xec, 0x67, 0x17, 0xb2, 0x8f, 0x7d, 0xd8, 0xd9, 0xee, 0xc3, 0xce, 0xd7, 0x3e, - 0xec, 0xbc, 0xdc, 0x2e, 0x24, 0xbd, 0xad, 0xb3, 0x28, 0x57, 0x65, 0x9c, 0xab, 0x12, 0x29, 0x7b, - 0xa5, 0xb6, 0xb0, 0x6f, 0x8a, 0x0f, 0x9e, 0x98, 0x0d, 0xac, 0x70, 0xf3, 0x1b, 0x00, 0x00, 0xff, - 0xff, 0x40, 0x33, 0x0b, 0xb2, 0xe0, 0x01, 0x00, 0x00, + // 331 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x92, 0x41, 0x4a, 0xc3, 0x40, + 0x14, 0x86, 0x3b, 0x36, 0x2d, 0xcd, 0x28, 0xa8, 0xe3, 0xc2, 0x80, 0x6d, 0x28, 0x5d, 0xd5, 0x85, + 0x09, 0xa8, 0x27, 0xd0, 0x85, 0x88, 0xe0, 0x22, 0x14, 0x17, 0x6e, 0xc2, 0x24, 0x79, 0xd6, 0xc1, + 0x24, 0x13, 0x32, 0xaf, 0x85, 0xdc, 0xc2, 0x13, 0x78, 0x1e, 0x97, 0x5d, 0xba, 0x12, 0x69, 0x2f, + 0x22, 0x33, 0x03, 0xcd, 0xa2, 0x1b, 0x97, 0xee, 0x86, 0xef, 0x7f, 0x8f, 0xff, 0xff, 0x87, 0x47, + 0x47, 0x08, 0x65, 0x06, 0x75, 0x21, 0x4a, 0x0c, 0x65, 0xcd, 0xd3, 0x1c, 0x42, 0x6c, 0x2a, 0x50, + 0x41, 0x55, 0x4b, 0x94, 0xec, 0xb8, 0x95, 0x03, 0x2b, 0x4f, 0x14, 0x75, 0x9e, 0x24, 0x02, 0x1b, + 0x52, 0x77, 0xc9, 0x73, 0x91, 0x71, 0x94, 0xb5, 0x47, 0xc6, 0x64, 0xea, 0x46, 0x2d, 0x60, 0x67, + 0xd4, 0xb5, 0xf3, 0xb1, 0xc8, 0xbc, 0x3d, 0xa3, 0x0e, 0x2c, 0xb8, 0xcf, 0xf4, 0x2a, 0x8a, 0x02, + 0x14, 0xf2, 0xa2, 0xf2, 0xba, 0x63, 0x32, 0x75, 0xa2, 0x16, 0x30, 0x46, 0x9d, 0x8c, 0x23, 0xf7, + 0x1c, 0xb3, 0x65, 0xde, 0x93, 0x6f, 0x42, 0xe9, 0x9d, 0x54, 0x4a, 0x54, 0x7f, 0xf0, 0x1e, 0x51, + 0x5a, 0x2d, 0x92, 0x5c, 0xa4, 0xf1, 0x1b, 0x34, 0xc6, 0xfc, 0x20, 0x72, 0x2d, 0x79, 0x80, 0x46, + 0x47, 0x53, 0x62, 0x5e, 0xc6, 0xba, 0xa7, 0x71, 0x77, 0xa3, 0x81, 0x06, 0xb3, 0xa6, 0x02, 0x76, + 0x41, 0x7b, 0x4b, 0x89, 0xa0, 0x3c, 0x67, 0xdc, 0x9d, 0xee, 0x5f, 0x9e, 0x06, 0x3b, 0x1f, 0x10, + 0xe8, 0x04, 0x91, 0x9d, 0x62, 0xe7, 0xf4, 0x48, 0xaf, 0x42, 0x16, 0xb7, 0x85, 0x7a, 0xa6, 0xd0, + 0xa1, 0xe5, 0xb3, 0x6d, 0xad, 0xa1, 0xb5, 0xe5, 0xb8, 0xa8, 0xc1, 0xeb, 0xdb, 0x50, 0x5b, 0x30, + 0xf9, 0x20, 0xf4, 0xe4, 0x96, 0x97, 0xb2, 0x14, 0x29, 0xcf, 0xff, 0x61, 0xd3, 0x9b, 0xc7, 0xcf, + 0xb5, 0x4f, 0x56, 0x6b, 0x9f, 0xfc, 0xac, 0x7d, 0xf2, 0xbe, 0xf1, 0x3b, 0xab, 0x8d, 0xdf, 0xf9, + 0xda, 0xf8, 0x9d, 0xe7, 0xeb, 0xb9, 0xc0, 0xd7, 0x45, 0x12, 0xa4, 0xb2, 0x08, 0x53, 0x59, 0x00, + 0x26, 0x2f, 0xd8, 0x3e, 0xcc, 0x1d, 0x85, 0x3b, 0x57, 0x96, 0xf4, 0x8d, 0x70, 0xf5, 0x1b, 0x00, + 0x00, 0xff, 0xff, 0xbd, 0x1c, 0x3d, 0xbd, 0x81, 0x02, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -274,6 +344,18 @@ func (m *GossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.Signature) > 0 { + i -= len(m.Signature) + copy(dAtA[i:], m.Signature) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Signature))) + i-- + dAtA[i] = 0x32 + } + if m.SignedTimestamp != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.SignedTimestamp)) + i-- + dAtA[i] = 0x28 + } if len(m.Votes) > 0 { for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { { @@ -285,7 +367,7 @@ func (m *GossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x32 + dAtA[i] = 0x22 } } if len(m.SignType) > 0 { @@ -293,26 +375,72 @@ func (m *GossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.SignType) i = encodeVarintTypes(dAtA, i, uint64(len(m.SignType))) i-- - dAtA[i] = 0x2a + dAtA[i] = 0x1a } if len(m.PublicKey) > 0 { i -= len(m.PublicKey) copy(dAtA[i:], m.PublicKey) i = encodeVarintTypes(dAtA, i, uint64(len(m.PublicKey))) i-- - dAtA[i] = 0x22 + dAtA[i] = 0x12 } - if len(m.Signature) > 0 { - i -= len(m.Signature) - copy(dAtA[i:], m.Signature) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Signature))) + if len(m.Validator) > 0 { + i -= len(m.Validator) + copy(dAtA[i:], m.Validator) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Validator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *CanonicalGossipVote) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CanonicalGossipVote) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CanonicalGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Votes) > 0 { + for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Votes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + if len(m.SignType) > 0 { + i -= len(m.SignType) + copy(dAtA[i:], m.SignType) + i = encodeVarintTypes(dAtA, i, uint64(len(m.SignType))) i-- dAtA[i] = 0x1a } - if m.SignedTimestamp != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.SignedTimestamp)) + if len(m.PublicKey) > 0 { + i -= len(m.PublicKey) + copy(dAtA[i:], m.PublicKey) + i = encodeVarintTypes(dAtA, i, uint64(len(m.PublicKey))) i-- - dAtA[i] = 0x10 + dAtA[i] = 0x12 } if len(m.Validator) > 0 { i -= len(m.Validator) @@ -369,6 +497,20 @@ func (m *GossipVote) Size() (n int) { if l > 0 { n += 1 + l + sovTypes(uint64(l)) } + l = len(m.PublicKey) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.SignType) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if len(m.Votes) > 0 { + for _, e := range m.Votes { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } if m.SignedTimestamp != 0 { n += 1 + sovTypes(uint64(m.SignedTimestamp)) } @@ -376,6 +518,19 @@ func (m *GossipVote) Size() (n int) { if l > 0 { n += 1 + l + sovTypes(uint64(l)) } + return n +} + +func (m *CanonicalGossipVote) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Validator) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } l = len(m.PublicKey) if l > 0 { n += 1 + l + sovTypes(uint64(l)) @@ -626,6 +781,106 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { m.Validator = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PublicKey", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PublicKey = append(m.PublicKey[:0], dAtA[iNdEx:postIndex]...) + if m.PublicKey == nil { + m.PublicKey = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SignType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SignType = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Votes = append(m.Votes, &Vote{}) + if err := m.Votes[len(m.Votes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field SignedTimestamp", wireType) } @@ -644,7 +899,7 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { break } } - case 3: + case 6: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) } @@ -678,7 +933,89 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { m.Signature = []byte{} } iNdEx = postIndex - case 4: + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CanonicalGossipVote) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CanonicalGossipVote: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CanonicalGossipVote: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Validator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field PublicKey", wireType) } @@ -712,7 +1049,7 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { m.PublicKey = []byte{} } iNdEx = postIndex - case 5: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field SignType", wireType) } @@ -744,7 +1081,7 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { } m.SignType = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 6: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) } diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index 6a4370af25d..e5b2bcb6a2b 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -12,9 +12,16 @@ message Vote { message GossipVote { string validator = 1; - uint64 signed_timestamp = 2; - bytes signature = 3; - bytes public_key = 4; - string sign_type = 5; - repeated Vote votes = 6; + bytes public_key = 2; + string sign_type = 3; + repeated Vote votes = 4; + uint64 signed_timestamp = 5; + bytes signature = 6; +} + +message CanonicalGossipVote { + string validator = 1; + bytes public_key = 2; + string sign_type = 3; + repeated Vote votes = 4; } diff --git a/proto/tendermint/privval/types.pb.go b/proto/tendermint/privval/types.pb.go index cafa0e9278c..8e2eb18d26d 100644 --- a/proto/tendermint/privval/types.pb.go +++ b/proto/tendermint/privval/types.pb.go @@ -6,6 +6,7 @@ package privval import ( fmt "fmt" crypto "github.com/cometbft/cometbft/proto/tendermint/crypto" + oracle "github.com/cometbft/cometbft/proto/tendermint/oracle" types "github.com/cometbft/cometbft/proto/tendermint/types" _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" @@ -424,6 +425,112 @@ func (m *SignedProposalResponse) GetError() *RemoteSignerError { return nil } +// SignOracleVoteRequest is a request to sign a vote +type SignOracleVoteRequest struct { + Vote *oracle.GossipVote `protobuf:"bytes,1,opt,name=vote,proto3" json:"vote,omitempty"` + ChainId string `protobuf:"bytes,2,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` +} + +func (m *SignOracleVoteRequest) Reset() { *m = SignOracleVoteRequest{} } +func (m *SignOracleVoteRequest) String() string { return proto.CompactTextString(m) } +func (*SignOracleVoteRequest) ProtoMessage() {} +func (*SignOracleVoteRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_cb4e437a5328cf9c, []int{7} +} +func (m *SignOracleVoteRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SignOracleVoteRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SignOracleVoteRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SignOracleVoteRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SignOracleVoteRequest.Merge(m, src) +} +func (m *SignOracleVoteRequest) XXX_Size() int { + return m.Size() +} +func (m *SignOracleVoteRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SignOracleVoteRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_SignOracleVoteRequest proto.InternalMessageInfo + +func (m *SignOracleVoteRequest) GetVote() *oracle.GossipVote { + if m != nil { + return m.Vote + } + return nil +} + +func (m *SignOracleVoteRequest) GetChainId() string { + if m != nil { + return m.ChainId + } + return "" +} + +// SignedOracleVoteResponse is a response containing a signed vote or an error +type SignedOracleVoteResponse struct { + Vote oracle.GossipVote `protobuf:"bytes,1,opt,name=vote,proto3" json:"vote"` + Error *RemoteSignerError `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` +} + +func (m *SignedOracleVoteResponse) Reset() { *m = SignedOracleVoteResponse{} } +func (m *SignedOracleVoteResponse) String() string { return proto.CompactTextString(m) } +func (*SignedOracleVoteResponse) ProtoMessage() {} +func (*SignedOracleVoteResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_cb4e437a5328cf9c, []int{8} +} +func (m *SignedOracleVoteResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SignedOracleVoteResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SignedOracleVoteResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SignedOracleVoteResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_SignedOracleVoteResponse.Merge(m, src) +} +func (m *SignedOracleVoteResponse) XXX_Size() int { + return m.Size() +} +func (m *SignedOracleVoteResponse) XXX_DiscardUnknown() { + xxx_messageInfo_SignedOracleVoteResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_SignedOracleVoteResponse proto.InternalMessageInfo + +func (m *SignedOracleVoteResponse) GetVote() oracle.GossipVote { + if m != nil { + return m.Vote + } + return oracle.GossipVote{} +} + +func (m *SignedOracleVoteResponse) GetError() *RemoteSignerError { + if m != nil { + return m.Error + } + return nil +} + // PingRequest is a request to confirm that the connection is alive. type PingRequest struct { } @@ -432,7 +539,7 @@ func (m *PingRequest) Reset() { *m = PingRequest{} } func (m *PingRequest) String() string { return proto.CompactTextString(m) } func (*PingRequest) ProtoMessage() {} func (*PingRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_cb4e437a5328cf9c, []int{7} + return fileDescriptor_cb4e437a5328cf9c, []int{9} } func (m *PingRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -469,7 +576,7 @@ func (m *PingResponse) Reset() { *m = PingResponse{} } func (m *PingResponse) String() string { return proto.CompactTextString(m) } func (*PingResponse) ProtoMessage() {} func (*PingResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_cb4e437a5328cf9c, []int{8} + return fileDescriptor_cb4e437a5328cf9c, []int{10} } func (m *PingResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -508,6 +615,8 @@ type Message struct { // *Message_SignedProposalResponse // *Message_PingRequest // *Message_PingResponse + // *Message_SignOracleVoteRequest + // *Message_SignedOracleVoteResponse Sum isMessage_Sum `protobuf_oneof:"sum"` } @@ -515,7 +624,7 @@ func (m *Message) Reset() { *m = Message{} } func (m *Message) String() string { return proto.CompactTextString(m) } func (*Message) ProtoMessage() {} func (*Message) Descriptor() ([]byte, []int) { - return fileDescriptor_cb4e437a5328cf9c, []int{9} + return fileDescriptor_cb4e437a5328cf9c, []int{11} } func (m *Message) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -574,15 +683,23 @@ type Message_PingRequest struct { type Message_PingResponse struct { PingResponse *PingResponse `protobuf:"bytes,8,opt,name=ping_response,json=pingResponse,proto3,oneof" json:"ping_response,omitempty"` } +type Message_SignOracleVoteRequest struct { + SignOracleVoteRequest *SignOracleVoteRequest `protobuf:"bytes,9,opt,name=sign_oracle_vote_request,json=signOracleVoteRequest,proto3,oneof" json:"sign_oracle_vote_request,omitempty"` +} +type Message_SignedOracleVoteResponse struct { + SignedOracleVoteResponse *SignedOracleVoteResponse `protobuf:"bytes,10,opt,name=signed_oracle_vote_response,json=signedOracleVoteResponse,proto3,oneof" json:"signed_oracle_vote_response,omitempty"` +} -func (*Message_PubKeyRequest) isMessage_Sum() {} -func (*Message_PubKeyResponse) isMessage_Sum() {} -func (*Message_SignVoteRequest) isMessage_Sum() {} -func (*Message_SignedVoteResponse) isMessage_Sum() {} -func (*Message_SignProposalRequest) isMessage_Sum() {} -func (*Message_SignedProposalResponse) isMessage_Sum() {} -func (*Message_PingRequest) isMessage_Sum() {} -func (*Message_PingResponse) isMessage_Sum() {} +func (*Message_PubKeyRequest) isMessage_Sum() {} +func (*Message_PubKeyResponse) isMessage_Sum() {} +func (*Message_SignVoteRequest) isMessage_Sum() {} +func (*Message_SignedVoteResponse) isMessage_Sum() {} +func (*Message_SignProposalRequest) isMessage_Sum() {} +func (*Message_SignedProposalResponse) isMessage_Sum() {} +func (*Message_PingRequest) isMessage_Sum() {} +func (*Message_PingResponse) isMessage_Sum() {} +func (*Message_SignOracleVoteRequest) isMessage_Sum() {} +func (*Message_SignedOracleVoteResponse) isMessage_Sum() {} func (m *Message) GetSum() isMessage_Sum { if m != nil { @@ -647,6 +764,20 @@ func (m *Message) GetPingResponse() *PingResponse { return nil } +func (m *Message) GetSignOracleVoteRequest() *SignOracleVoteRequest { + if x, ok := m.GetSum().(*Message_SignOracleVoteRequest); ok { + return x.SignOracleVoteRequest + } + return nil +} + +func (m *Message) GetSignedOracleVoteResponse() *SignedOracleVoteResponse { + if x, ok := m.GetSum().(*Message_SignedOracleVoteResponse); ok { + return x.SignedOracleVoteResponse + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*Message) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -658,6 +789,8 @@ func (*Message) XXX_OneofWrappers() []interface{} { (*Message_SignedProposalResponse)(nil), (*Message_PingRequest)(nil), (*Message_PingResponse)(nil), + (*Message_SignOracleVoteRequest)(nil), + (*Message_SignedOracleVoteResponse)(nil), } } @@ -670,6 +803,8 @@ func init() { proto.RegisterType((*SignedVoteResponse)(nil), "tendermint.privval.SignedVoteResponse") proto.RegisterType((*SignProposalRequest)(nil), "tendermint.privval.SignProposalRequest") proto.RegisterType((*SignedProposalResponse)(nil), "tendermint.privval.SignedProposalResponse") + proto.RegisterType((*SignOracleVoteRequest)(nil), "tendermint.privval.SignOracleVoteRequest") + proto.RegisterType((*SignedOracleVoteResponse)(nil), "tendermint.privval.SignedOracleVoteResponse") proto.RegisterType((*PingRequest)(nil), "tendermint.privval.PingRequest") proto.RegisterType((*PingResponse)(nil), "tendermint.privval.PingResponse") proto.RegisterType((*Message)(nil), "tendermint.privval.Message") @@ -678,55 +813,61 @@ func init() { func init() { proto.RegisterFile("tendermint/privval/types.proto", fileDescriptor_cb4e437a5328cf9c) } var fileDescriptor_cb4e437a5328cf9c = []byte{ - // 756 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x55, 0x4d, 0x4f, 0xe3, 0x46, - 0x18, 0xb6, 0x21, 0x1f, 0xf0, 0x86, 0x84, 0x30, 0x50, 0x1a, 0x22, 0x6a, 0xd2, 0x54, 0x6d, 0x51, - 0x0e, 0x49, 0x45, 0xd5, 0x5e, 0xe8, 0xa5, 0x80, 0xd5, 0x44, 0x11, 0x76, 0x3a, 0x09, 0x05, 0x21, - 0x55, 0x56, 0x3e, 0x06, 0x63, 0x41, 0x3c, 0x5e, 0x8f, 0x83, 0x94, 0xf3, 0xde, 0xf6, 0xb4, 0xd2, - 0xfe, 0x89, 0x3d, 0xef, 0xaf, 0xe0, 0xc8, 0x71, 0x4f, 0xab, 0x15, 0xfc, 0x91, 0x55, 0xc6, 0x13, - 0xdb, 0xf9, 0x42, 0xbb, 0xe2, 0x36, 0xf3, 0xbe, 0xef, 0x3c, 0x1f, 0x33, 0x8f, 0x65, 0x50, 0x3c, - 0x62, 0xf7, 0x88, 0xdb, 0xb7, 0x6c, 0xaf, 0xe2, 0xb8, 0xd6, 0xdd, 0x5d, 0xfb, 0xb6, 0xe2, 0x0d, - 0x1d, 0xc2, 0xca, 0x8e, 0x4b, 0x3d, 0x8a, 0x50, 0xd8, 0x2f, 0x8b, 0x7e, 0x7e, 0x37, 0x72, 0xa6, - 0xeb, 0x0e, 0x1d, 0x8f, 0x56, 0x6e, 0xc8, 0x50, 0x9c, 0x98, 0xe8, 0x72, 0xa4, 0x28, 0x5e, 0x7e, - 0xcb, 0xa4, 0x26, 0xe5, 0xcb, 0xca, 0x68, 0xe5, 0x57, 0x8b, 0x35, 0xd8, 0xc0, 0xa4, 0x4f, 0x3d, - 0xd2, 0xb4, 0x4c, 0x9b, 0xb8, 0xaa, 0xeb, 0x52, 0x17, 0x21, 0x88, 0x75, 0x69, 0x8f, 0xe4, 0xe4, - 0x82, 0xbc, 0x1f, 0xc7, 0x7c, 0x8d, 0x0a, 0x90, 0xea, 0x11, 0xd6, 0x75, 0x2d, 0xc7, 0xb3, 0xa8, - 0x9d, 0x5b, 0x2a, 0xc8, 0xfb, 0xab, 0x38, 0x5a, 0x2a, 0x96, 0x20, 0xdd, 0x18, 0x74, 0xea, 0x64, - 0x88, 0xc9, 0xab, 0x01, 0x61, 0x1e, 0xda, 0x81, 0x95, 0xee, 0x75, 0xdb, 0xb2, 0x0d, 0xab, 0xc7, - 0xa1, 0x56, 0x71, 0x92, 0xef, 0x6b, 0xbd, 0xe2, 0x1b, 0x19, 0x32, 0xe3, 0x61, 0xe6, 0x50, 0x9b, - 0x11, 0x74, 0x08, 0x49, 0x67, 0xd0, 0x31, 0x6e, 0xc8, 0x90, 0x0f, 0xa7, 0x0e, 0x76, 0xcb, 0x91, - 0x1b, 0xf0, 0xdd, 0x96, 0x1b, 0x83, 0xce, 0xad, 0xd5, 0xad, 0x93, 0xe1, 0x51, 0xec, 0xfe, 0xd3, - 0x9e, 0x84, 0x13, 0x0e, 0x07, 0x41, 0x87, 0x10, 0x27, 0x23, 0xe9, 0x5c, 0x57, 0xea, 0xe0, 0xe7, - 0xf2, 0xec, 0xe5, 0x95, 0x67, 0x7c, 0x62, 0xff, 0x4c, 0xf1, 0x02, 0xd6, 0x47, 0xd5, 0xff, 0xa8, - 0x47, 0xc6, 0xd2, 0x4b, 0x10, 0xbb, 0xa3, 0x1e, 0x11, 0x4a, 0xb6, 0xa3, 0x70, 0xfe, 0x9d, 0xf2, - 0x61, 0x3e, 0x33, 0x61, 0x73, 0x69, 0xd2, 0xe6, 0x6b, 0x19, 0x10, 0x27, 0xec, 0xf9, 0xe0, 0xc2, - 0xea, 0x6f, 0x5f, 0x83, 0x2e, 0x1c, 0xfa, 0x1c, 0x2f, 0xf2, 0x77, 0x0d, 0x9b, 0xa3, 0x6a, 0xc3, - 0xa5, 0x0e, 0x65, 0xed, 0xdb, 0xb1, 0xc7, 0x3f, 0x61, 0xc5, 0x11, 0x25, 0xa1, 0x24, 0x3f, 0xab, - 0x24, 0x38, 0x14, 0xcc, 0x3e, 0xe7, 0xf7, 0x9d, 0x0c, 0xdb, 0xbe, 0xdf, 0x90, 0x4c, 0x78, 0xfe, - 0xeb, 0x5b, 0xd8, 0x84, 0xf7, 0x90, 0xf3, 0x45, 0xfe, 0xd3, 0x90, 0x6a, 0x58, 0xb6, 0x29, 0x7c, - 0x17, 0x33, 0xb0, 0xe6, 0x6f, 0x7d, 0x65, 0xc5, 0x0f, 0x71, 0x48, 0x9e, 0x12, 0xc6, 0xda, 0x26, - 0x41, 0x75, 0x58, 0x17, 0x21, 0x34, 0x5c, 0x7f, 0x5c, 0x88, 0xfd, 0x71, 0x1e, 0xe3, 0x44, 0xdc, - 0xab, 0x12, 0x4e, 0x3b, 0x13, 0xf9, 0xd7, 0x20, 0x1b, 0x82, 0xf9, 0x64, 0x42, 0x7f, 0xf1, 0x39, - 0x34, 0x7f, 0xb2, 0x2a, 0xe1, 0x8c, 0x33, 0xf9, 0x85, 0xfc, 0x0b, 0x1b, 0xcc, 0x32, 0x6d, 0x63, - 0x94, 0x88, 0x40, 0xde, 0x32, 0x07, 0xfc, 0x69, 0x1e, 0xe0, 0x54, 0xa8, 0xab, 0x12, 0x5e, 0x67, - 0x53, 0x39, 0xbf, 0x84, 0x2d, 0xc6, 0xdf, 0x6b, 0x0c, 0x2a, 0x64, 0xc6, 0x38, 0xea, 0x2f, 0x8b, - 0x50, 0x27, 0xf3, 0x5c, 0x95, 0x30, 0x62, 0xb3, 0x29, 0xff, 0x1f, 0xbe, 0xe3, 0x72, 0xc7, 0x8f, - 0x18, 0x48, 0x8e, 0x73, 0xf0, 0x5f, 0x17, 0x81, 0x4f, 0xe5, 0xb4, 0x2a, 0xe1, 0x4d, 0x36, 0x27, - 0xbe, 0x57, 0x90, 0x13, 0xd2, 0x23, 0x04, 0x42, 0x7e, 0x82, 0x33, 0x94, 0x16, 0xcb, 0x9f, 0x8e, - 0x67, 0x55, 0xc2, 0xdb, 0x6c, 0x7e, 0x70, 0x4f, 0x60, 0xcd, 0xb1, 0x6c, 0x33, 0x50, 0x9f, 0xe4, - 0xd8, 0x7b, 0x73, 0x5f, 0x30, 0x4c, 0x59, 0x55, 0xc2, 0x29, 0x27, 0xdc, 0xa2, 0x7f, 0x20, 0x2d, - 0x50, 0x84, 0xc4, 0x15, 0x0e, 0x53, 0x58, 0x0c, 0x13, 0x08, 0x5b, 0x73, 0x22, 0xfb, 0xa3, 0x38, - 0x2c, 0xb3, 0x41, 0xbf, 0xf4, 0x5e, 0x86, 0x04, 0x0f, 0x39, 0x43, 0x08, 0x32, 0x2a, 0xc6, 0x3a, - 0x6e, 0x1a, 0x67, 0x5a, 0x5d, 0xd3, 0xcf, 0xb5, 0xac, 0x84, 0x14, 0xc8, 0x07, 0x35, 0xf5, 0xa2, - 0xa1, 0x1e, 0xb7, 0xd4, 0x13, 0x03, 0xab, 0xcd, 0x86, 0xae, 0x35, 0xd5, 0xac, 0x8c, 0x72, 0xb0, - 0x25, 0xfa, 0x9a, 0x6e, 0x1c, 0xeb, 0x9a, 0xa6, 0x1e, 0xb7, 0x6a, 0xba, 0x96, 0x5d, 0x42, 0x3f, - 0xc0, 0x8e, 0xe8, 0x84, 0x65, 0xa3, 0x55, 0x3b, 0x55, 0xf5, 0xb3, 0x56, 0x76, 0x19, 0x7d, 0x0f, - 0x9b, 0xa2, 0x8d, 0xd5, 0xbf, 0x4f, 0x82, 0x46, 0x2c, 0x82, 0x78, 0x8e, 0x6b, 0x2d, 0x35, 0xe8, - 0xc4, 0x8f, 0xf4, 0xfb, 0x47, 0x45, 0x7e, 0x78, 0x54, 0xe4, 0xcf, 0x8f, 0x8a, 0xfc, 0xf6, 0x49, - 0x91, 0x1e, 0x9e, 0x14, 0xe9, 0xe3, 0x93, 0x22, 0x5d, 0xfe, 0x61, 0x5a, 0xde, 0xf5, 0xa0, 0x53, - 0xee, 0xd2, 0x7e, 0xa5, 0x4b, 0xfb, 0xc4, 0xeb, 0x5c, 0x79, 0xe1, 0xc2, 0xff, 0x57, 0xcd, 0xfe, - 0x25, 0x3b, 0x09, 0xde, 0xf9, 0xfd, 0x4b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xda, 0x9f, 0x99, 0x3e, - 0x42, 0x07, 0x00, 0x00, + // 861 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0x4d, 0x6f, 0xdb, 0x46, + 0x10, 0x25, 0x6d, 0xc9, 0xb2, 0x47, 0xfe, 0x50, 0xd6, 0x8e, 0xab, 0xb8, 0xb1, 0xe2, 0xaa, 0x68, + 0x9b, 0x1a, 0x05, 0xd5, 0xa6, 0x68, 0x7b, 0x48, 0x2f, 0xb5, 0x4d, 0x84, 0x82, 0x11, 0x52, 0x5d, + 0x2b, 0x4d, 0x10, 0xa0, 0x20, 0x24, 0x6a, 0x43, 0x13, 0xb1, 0xb8, 0x5b, 0x2e, 0x65, 0x40, 0xe7, + 0x1e, 0x0a, 0xf4, 0x14, 0xa0, 0x7f, 0xa2, 0x3f, 0x25, 0xc7, 0x1c, 0x7b, 0x2a, 0x0a, 0xfb, 0x8f, + 0x14, 0xda, 0x5d, 0xf1, 0x43, 0x94, 0x82, 0x04, 0xce, 0x6d, 0x77, 0x66, 0xf6, 0xcd, 0x7b, 0x33, + 0x7c, 0x82, 0xa0, 0x11, 0x93, 0x70, 0x40, 0xa2, 0x61, 0x10, 0xc6, 0x2d, 0x16, 0x05, 0x97, 0x97, + 0xbd, 0x8b, 0x56, 0x3c, 0x66, 0x84, 0x1b, 0x2c, 0xa2, 0x31, 0x45, 0x28, 0xcd, 0x1b, 0x2a, 0xbf, + 0x77, 0x37, 0xf3, 0xc6, 0x8b, 0xc6, 0x2c, 0xa6, 0xad, 0x97, 0x64, 0xac, 0x5e, 0xe4, 0xb2, 0x02, + 0x29, 0x8b, 0xb7, 0xb7, 0x9f, 0xc9, 0xd2, 0xa8, 0xe7, 0x5d, 0x90, 0x5c, 0x7a, 0xc7, 0xa7, 0x3e, + 0x15, 0xc7, 0xd6, 0xe4, 0x24, 0xa3, 0xcd, 0x36, 0xdc, 0xc2, 0x64, 0x48, 0x63, 0x72, 0x16, 0xf8, + 0x21, 0x89, 0xcc, 0x28, 0xa2, 0x11, 0x42, 0x50, 0xf2, 0xe8, 0x80, 0xd4, 0xf5, 0x03, 0xfd, 0x7e, + 0x19, 0x8b, 0x33, 0x3a, 0x80, 0xea, 0x80, 0x70, 0x2f, 0x0a, 0x58, 0x1c, 0xd0, 0xb0, 0xbe, 0x74, + 0xa0, 0xdf, 0x5f, 0xc3, 0xd9, 0x50, 0xf3, 0x10, 0x36, 0x3a, 0xa3, 0xfe, 0x29, 0x19, 0x63, 0xf2, + 0xdb, 0x88, 0xf0, 0x18, 0xdd, 0x81, 0x55, 0xef, 0xbc, 0x17, 0x84, 0x6e, 0x30, 0x10, 0x50, 0x6b, + 0xb8, 0x22, 0xee, 0xed, 0x41, 0xf3, 0x4f, 0x1d, 0x36, 0xa7, 0xc5, 0x9c, 0xd1, 0x90, 0x13, 0xf4, + 0x10, 0x2a, 0x6c, 0xd4, 0x77, 0x5f, 0x92, 0xb1, 0x28, 0xae, 0x3e, 0xb8, 0x6b, 0x64, 0x06, 0x24, + 0x87, 0x61, 0x74, 0x46, 0xfd, 0x8b, 0xc0, 0x3b, 0x25, 0xe3, 0xa3, 0xd2, 0xeb, 0x7f, 0xef, 0x69, + 0x78, 0x85, 0x09, 0x10, 0xf4, 0x10, 0xca, 0x64, 0x42, 0x5d, 0xf0, 0xaa, 0x3e, 0xf8, 0xcc, 0x28, + 0xce, 0xd6, 0x28, 0xe8, 0xc4, 0xf2, 0x4d, 0xf3, 0x19, 0x6c, 0x4d, 0xa2, 0xbf, 0xd0, 0x98, 0x4c, + 0xa9, 0x1f, 0x42, 0xe9, 0x92, 0xc6, 0x44, 0x31, 0xd9, 0xcd, 0xc2, 0xc9, 0x99, 0x8a, 0x62, 0x51, + 0x93, 0x93, 0xb9, 0x94, 0x97, 0xf9, 0xbb, 0x0e, 0x48, 0x34, 0x1c, 0x48, 0x70, 0x25, 0xf5, 0xeb, + 0x77, 0x41, 0x57, 0x0a, 0x65, 0x8f, 0x1b, 0xe9, 0x3b, 0x87, 0xed, 0x49, 0xb4, 0x13, 0x51, 0x46, + 0x79, 0xef, 0x62, 0xaa, 0xf1, 0x7b, 0x58, 0x65, 0x2a, 0xa4, 0x98, 0xec, 0x15, 0x99, 0x24, 0x8f, + 0x92, 0xda, 0xb7, 0xe9, 0xfd, 0x4b, 0x87, 0x5d, 0xa9, 0x37, 0x6d, 0xa6, 0x34, 0xff, 0xf8, 0x3e, + 0xdd, 0x94, 0xf6, 0xb4, 0xe7, 0x8d, 0xf4, 0x13, 0xb8, 0x3d, 0x89, 0x3a, 0xc2, 0x13, 0xd9, 0x2d, + 0x7f, 0x93, 0xdb, 0xc3, 0x7e, 0x16, 0x54, 0x1a, 0xc8, 0x78, 0x44, 0x39, 0x0f, 0xd8, 0xbb, 0x2d, + 0xfb, 0x95, 0x0e, 0x75, 0x29, 0x3e, 0xdb, 0x49, 0xc9, 0xff, 0xe1, 0x3d, 0x5a, 0x7d, 0xb8, 0xcd, + 0x6f, 0x40, 0xb5, 0x13, 0x84, 0xbe, 0xd2, 0xdb, 0xdc, 0x84, 0x75, 0x79, 0x95, 0xa4, 0x9a, 0x7f, + 0x54, 0xa0, 0xf2, 0x98, 0x70, 0xde, 0xf3, 0x09, 0x3a, 0x85, 0x2d, 0x65, 0x3f, 0x37, 0x92, 0xe5, + 0x8a, 0xeb, 0x27, 0xf3, 0x3a, 0xe6, 0x8c, 0x6e, 0x69, 0x78, 0x83, 0xe5, 0x9c, 0x6f, 0x43, 0x2d, + 0x05, 0x93, 0xcd, 0x14, 0xff, 0xe6, 0xdb, 0xd0, 0x64, 0xa5, 0xa5, 0xe1, 0x4d, 0x96, 0xff, 0x6d, + 0xf8, 0x19, 0x6e, 0xf1, 0xc0, 0x0f, 0xdd, 0xc9, 0x44, 0x12, 0x7a, 0xcb, 0x02, 0xf0, 0xd3, 0x79, + 0x80, 0x33, 0x76, 0xb6, 0x34, 0xbc, 0xc5, 0x67, 0x1c, 0xfe, 0x1c, 0x76, 0xb8, 0x58, 0xd6, 0x14, + 0x54, 0xd1, 0x2c, 0x09, 0xd4, 0xcf, 0x17, 0xa1, 0xe6, 0x9d, 0x6c, 0x69, 0x18, 0xf1, 0xa2, 0xbf, + 0x7f, 0x85, 0xdb, 0x82, 0xee, 0xf4, 0xf3, 0x4d, 0x28, 0x97, 0x05, 0xf8, 0x17, 0x8b, 0xc0, 0x67, + 0x1c, 0x6a, 0x69, 0x78, 0x9b, 0xcf, 0x31, 0xee, 0x0b, 0xa8, 0x2b, 0xea, 0x99, 0x06, 0x8a, 0xfe, + 0x8a, 0xe8, 0x70, 0xb8, 0x98, 0xfe, 0xac, 0x31, 0x2d, 0x0d, 0xef, 0xf2, 0xf9, 0x96, 0x3d, 0x81, + 0x75, 0x16, 0x84, 0x7e, 0xc2, 0xbe, 0x22, 0xb0, 0xef, 0xcd, 0xdd, 0x60, 0xfa, 0x95, 0x59, 0x1a, + 0xae, 0xb2, 0xf4, 0x8a, 0x1e, 0xc1, 0x86, 0x42, 0x51, 0x14, 0x57, 0x05, 0xcc, 0xc1, 0x62, 0x98, + 0x84, 0xd8, 0x3a, 0xcb, 0xdc, 0xd1, 0x40, 0xca, 0x76, 0xa5, 0x5f, 0xf2, 0xdf, 0xc2, 0x9a, 0xc0, + 0xfc, 0x72, 0x91, 0xec, 0x82, 0xf5, 0x2d, 0x0d, 0x8b, 0x15, 0x15, 0x7f, 0x13, 0x86, 0xf0, 0xb1, + 0x1a, 0x6e, 0xbe, 0x8f, 0x22, 0x0f, 0xa2, 0xd1, 0x57, 0x8b, 0xe7, 0x5b, 0xf4, 0xbe, 0xa5, 0x61, + 0xb5, 0xaf, 0x62, 0xee, 0xa8, 0x0c, 0xcb, 0x7c, 0x34, 0x3c, 0xfc, 0x5b, 0x87, 0x15, 0xe1, 0x5c, + 0x8e, 0x10, 0x6c, 0x9a, 0x18, 0x3b, 0xf8, 0xcc, 0x7d, 0x62, 0x9f, 0xda, 0xce, 0x53, 0xbb, 0xa6, + 0xa1, 0x06, 0xec, 0x25, 0x31, 0xf3, 0x59, 0xc7, 0x3c, 0xee, 0x9a, 0x27, 0x2e, 0x36, 0xcf, 0x3a, + 0x8e, 0x7d, 0x66, 0xd6, 0x74, 0x54, 0x87, 0x1d, 0x95, 0xb7, 0x1d, 0xf7, 0xd8, 0xb1, 0x6d, 0xf3, + 0xb8, 0xdb, 0x76, 0xec, 0xda, 0x12, 0xda, 0x87, 0x3b, 0x2a, 0x93, 0x86, 0xdd, 0x6e, 0xfb, 0xb1, + 0xe9, 0x3c, 0xe9, 0xd6, 0x96, 0xd1, 0x47, 0xb0, 0xad, 0xd2, 0xd8, 0xfc, 0xe9, 0x24, 0x49, 0x94, + 0x32, 0x88, 0x4f, 0x71, 0xbb, 0x6b, 0x26, 0x99, 0xf2, 0x91, 0xf3, 0xfa, 0xaa, 0xa1, 0xbf, 0xb9, + 0x6a, 0xe8, 0xff, 0x5d, 0x35, 0xf4, 0x57, 0xd7, 0x0d, 0xed, 0xcd, 0x75, 0x43, 0xfb, 0xe7, 0xba, + 0xa1, 0x3d, 0xff, 0xce, 0x0f, 0xe2, 0xf3, 0x51, 0xdf, 0xf0, 0xe8, 0xb0, 0xe5, 0xd1, 0x21, 0x89, + 0xfb, 0x2f, 0xe2, 0xf4, 0x20, 0xff, 0x7a, 0x14, 0xff, 0x13, 0xf5, 0x57, 0x44, 0xe6, 0xdb, 0xff, + 0x03, 0x00, 0x00, 0xff, 0xff, 0x72, 0xcc, 0x3e, 0x3c, 0x30, 0x09, 0x00, 0x00, } func (m *RemoteSignerError) Marshal() (dAtA []byte, err error) { @@ -1013,6 +1154,93 @@ func (m *SignedProposalResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } +func (m *SignOracleVoteRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SignOracleVoteRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SignOracleVoteRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ChainId) > 0 { + i -= len(m.ChainId) + copy(dAtA[i:], m.ChainId) + i = encodeVarintTypes(dAtA, i, uint64(len(m.ChainId))) + i-- + dAtA[i] = 0x12 + } + if m.Vote != nil { + { + size, err := m.Vote.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *SignedOracleVoteResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SignedOracleVoteResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SignedOracleVoteResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Error != nil { + { + size, err := m.Error.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + { + size, err := m.Vote.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *PingRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1259,6 +1487,48 @@ func (m *Message_PingResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { } return len(dAtA) - i, nil } +func (m *Message_SignOracleVoteRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Message_SignOracleVoteRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.SignOracleVoteRequest != nil { + { + size, err := m.SignOracleVoteRequest.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x4a + } + return len(dAtA) - i, nil +} +func (m *Message_SignedOracleVoteResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Message_SignedOracleVoteResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.SignedOracleVoteResponse != nil { + { + size, err := m.SignedOracleVoteResponse.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x52 + } + return len(dAtA) - i, nil +} func encodeVarintTypes(dAtA []byte, offset int, v uint64) int { offset -= sovTypes(v) base := offset @@ -1378,6 +1648,38 @@ func (m *SignedProposalResponse) Size() (n int) { return n } +func (m *SignOracleVoteRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Vote != nil { + l = m.Vote.Size() + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.ChainId) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *SignedOracleVoteResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Vote.Size() + n += 1 + l + sovTypes(uint64(l)) + if m.Error != nil { + l = m.Error.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + func (m *PingRequest) Size() (n int) { if m == nil { return 0 @@ -1504,6 +1806,30 @@ func (m *Message_PingResponse) Size() (n int) { } return n } +func (m *Message_SignOracleVoteRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SignOracleVoteRequest != nil { + l = m.SignOracleVoteRequest.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Message_SignedOracleVoteResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SignedOracleVoteResponse != nil { + l = m.SignedOracleVoteResponse.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} func sovTypes(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 @@ -2287,7 +2613,7 @@ func (m *SignedProposalResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *PingRequest) Unmarshal(dAtA []byte) error { +func (m *SignOracleVoteRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2310,20 +2636,257 @@ func (m *PingRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PingRequest: wiretype end group for non-group") + return fmt.Errorf("proto: SignOracleVoteRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PingRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SignOracleVoteRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Vote", wireType) } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Vote == nil { + m.Vote = &oracle.GossipVote{} + } + if err := m.Vote.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SignedOracleVoteResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SignedOracleVoteResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SignedOracleVoteResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Vote", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Vote.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Error == nil { + m.Error = &RemoteSignerError{} + } + if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PingRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PingRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PingRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -2696,6 +3259,76 @@ func (m *Message) Unmarshal(dAtA []byte) error { } m.Sum = &Message_PingResponse{v} iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SignOracleVoteRequest", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &SignOracleVoteRequest{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Sum = &Message_SignOracleVoteRequest{v} + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SignedOracleVoteResponse", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &SignedOracleVoteResponse{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Sum = &Message_SignedOracleVoteResponse{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/proto/tendermint/privval/types.proto b/proto/tendermint/privval/types.proto index 13190ca42fa..bc3f3932cc7 100644 --- a/proto/tendermint/privval/types.proto +++ b/proto/tendermint/privval/types.proto @@ -3,6 +3,7 @@ package tendermint.privval; import "tendermint/crypto/keys.proto"; import "tendermint/types/types.proto"; +import "tendermint/oracle/types.proto"; import "gogoproto/gogo.proto"; option go_package = "github.com/cometbft/cometbft/proto/tendermint/privval"; @@ -56,6 +57,18 @@ message SignedProposalResponse { RemoteSignerError error = 2; } +// SignOracleVoteRequest is a request to sign a vote +message SignOracleVoteRequest { + tendermint.oracle.GossipVote vote = 1; + string chain_id = 2; +} + +// SignedOracleVoteResponse is a response containing a signed vote or an error +message SignedOracleVoteResponse { + tendermint.oracle.GossipVote vote = 1 [(gogoproto.nullable) = false]; + RemoteSignerError error = 2; +} + // PingRequest is a request to confirm that the connection is alive. message PingRequest {} @@ -72,5 +85,7 @@ message Message { SignedProposalResponse signed_proposal_response = 6; PingRequest ping_request = 7; PingResponse ping_response = 8; + SignOracleVoteRequest sign_oracle_vote_request = 9; + SignedOracleVoteResponse signed_oracle_vote_response = 10; } } diff --git a/types/oracle.go b/types/oracle.go new file mode 100644 index 00000000000..35da9e321b9 --- /dev/null +++ b/types/oracle.go @@ -0,0 +1,25 @@ +package types + +import ( + "github.com/cometbft/cometbft/libs/protoio" + oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" +) + +func OracleVoteSignBytes(vote *oracleproto.GossipVote) []byte { + pb := CanonicalizeOracleVote(vote) + bz, err := protoio.MarshalDelimited(&pb) + if err != nil { + panic(err) + } + + return bz +} + +func CanonicalizeOracleVote(vote *oracleproto.GossipVote) oracleproto.CanonicalGossipVote { + return oracleproto.CanonicalGossipVote{ + Validator: vote.Validator, + PublicKey: vote.PublicKey, + SignType: vote.SignType, + Votes: vote.Votes, + } +} diff --git a/types/priv_validator.go b/types/priv_validator.go index b08a925dd33..9f6b9f0822b 100644 --- a/types/priv_validator.go +++ b/types/priv_validator.go @@ -4,6 +4,7 @@ import ( "bytes" "errors" "fmt" + "time" "github.com/cometbft/cometbft/crypto" "github.com/cometbft/cometbft/crypto/ed25519" @@ -103,30 +104,14 @@ func (pv MockPV) SignVote(chainID string, vote *cmtproto.Vote) error { // Implements PrivValidator. func (pv MockPV) SignOracleVote(chainID string, vote *oracleproto.GossipVote) error { // TODO TODO TODO: implement sign oracle vote - // useChainID := chainID - // if pv.breakVoteSigning { - // useChainID = "incorrect-chain-id" - // } - - // signBytes := VoteSignBytes(useChainID, vote) - // sig, err := pv.PrivKey.Sign(signBytes) - // if err != nil { - // return err - // } - // vote.Signature = sig - - // var extSig []byte - // // We only sign vote extensions for non-nil precommits - // if vote.Type == cmtproto.PrecommitType && !ProtoBlockIDIsNil(&vote.BlockID) { - // extSignBytes := VoteExtensionSignBytes(useChainID, vote) - // extSig, err = pv.PrivKey.Sign(extSignBytes) - // if err != nil { - // return err - // } - // } else if len(vote.Extension) > 0 { - // return errors.New("unexpected vote extension - vote extensions are only allowed in non-nil precommits") - // } - // vote.ExtensionSignature = extSig + signBytes := OracleVoteSignBytes(vote) + sig, err := pv.PrivKey.Sign(signBytes) + if err != nil { + return err + } + vote.SignedTimestamp = uint64(time.Now().Unix()) + vote.Signature = sig + return nil } From 945b2fa7ebdcbb5e974169ad4386acd5200465dd Mon Sep 17 00:00:00 2001 From: yan-soon Date: Wed, 21 Feb 2024 20:21:29 +0800 Subject: [PATCH 009/150] remove unused code from oracle reactor --- oracle/reactor.go | 5 ----- oracle/service/runner/runner.go | 29 ----------------------------- oracle/service/types/info.go | 6 ------ 3 files changed, 40 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 7b1fda2aa55..423c24b4e35 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -71,10 +71,6 @@ func NewReactor(configPath string, grpcAddress string, pubKey crypto.PubKey, pri logrus.Warnf("[oracle] error parsing oracle.json config file: %v", err) } - voteDataBuffer := &oracletypes.VoteDataBuffer{ - Buffer: make(map[uint64]map[string][]*oracleproto.Vote), - } - gossipVoteBuffer := &oracletypes.GossipVoteBuffer{ Buffer: make(map[string]*oracleproto.GossipVote), } @@ -86,7 +82,6 @@ func NewReactor(configPath string, grpcAddress string, pubKey crypto.PubKey, pri oracleInfo := &oracletypes.OracleInfo{ Oracles: nil, Config: config, - VoteDataBuffer: voteDataBuffer, GossipVoteBuffer: gossipVoteBuffer, UnsignedVoteBuffer: unsignedVoteBuffer, SignVotesChan: make(chan *oracleproto.Vote), diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index e1aeb5453b7..ba9ec52cda0 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -336,34 +336,6 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo) { oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() } -func AddVoteToDataBuffer(oracleInfo *types.OracleInfo, vote *oracleproto.Vote) { - _, ok := oracleInfo.VoteDataBuffer.Buffer[vote.Timestamp] - if !ok { - oracleInfo.VoteDataBuffer.Buffer[vote.Timestamp] = make(map[string][]*oracleproto.Vote) - } - - oracleMap := oracleInfo.VoteDataBuffer.Buffer[vote.Timestamp] - oracleMap[vote.OracleId] = append(oracleMap[vote.OracleId], vote) - oracleInfo.VoteDataBuffer.Buffer[vote.Timestamp] = oracleMap -} - -func PruneVoteDataBuffer(oracleInfo *types.OracleInfo) { - go func(oracleInfo *types.OracleInfo) { - ticker := time.Tick(3 * time.Second) - for range ticker { - oracleInfo.VoteDataBuffer.UpdateMtx.Lock() - // prune everything older than 3 secs - for timestamp, _ := range oracleInfo.VoteDataBuffer.Buffer { - currTime := uint64(time.Now().Unix()) - if timestamp <= currTime-uint64(3*time.Second) { - delete(oracleInfo.VoteDataBuffer.Buffer, timestamp) - } - } - oracleInfo.VoteDataBuffer.UpdateMtx.Unlock() - } - }(oracleInfo) -} - func PruneUnsignedVoteBuffer(oracleInfo *types.OracleInfo) { go func(oracleInfo *types.OracleInfo) { ticker := time.Tick(3 * time.Second) @@ -414,7 +386,6 @@ func Run(oracleInfo *types.OracleInfo) { count := 0 RunProcessSignVoteQueue(oracleInfo) PruneUnsignedVoteBuffer(oracleInfo) - // PruneVoteDataBuffer(oracleInfo) for { if count == 0 { // on init, and every minute oracles, err := SyncOracles(oracleInfo) diff --git a/oracle/service/types/info.go b/oracle/service/types/info.go index 542da184566..4f6a44948ab 100644 --- a/oracle/service/types/info.go +++ b/oracle/service/types/info.go @@ -18,7 +18,6 @@ type OracleInfo struct { Redis redis.Service Config Config GrpcClient *grpc.ClientConn - VoteDataBuffer *VoteDataBuffer UnsignedVoteBuffer *UnsignedVoteBuffer GossipVoteBuffer *GossipVoteBuffer SignVotesChan chan *oracleproto.Vote @@ -38,11 +37,6 @@ type GossipVoteBuffer struct { UpdateMtx cmtsync.RWMutex } -type VoteDataBuffer struct { - Buffer map[uint64]map[string][]*oracleproto.Vote - UpdateMtx cmtsync.RWMutex -} - type UnsignedVoteBuffer struct { Buffer []*UnsignedVotes // deque of UnsignedVote obj UpdateMtx cmtsync.RWMutex From 37aa8e17e358d88ec695ffab55f8de921aecb989 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 23 Feb 2024 14:51:53 +0800 Subject: [PATCH 010/150] update and test gossip votes among cluster of vals --- docker-compose.yml | 30 ++++++++ node/node.go | 3 +- oracle/reactor.go | 44 +++++++++--- oracle/service/runner/runner.go | 11 ++- oracle/service/types/info.go | 1 + proto/tendermint/oracle/types.pb.go | 104 +++++++++++++++------------- proto/tendermint/oracle/types.proto | 6 +- 7 files changed, 133 insertions(+), 66 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index ee582871976..47340202515 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,14 +1,28 @@ version: '3' services: + redis: + image: redis:6.2 + ports: + - "6379:6379" + volumes: + - redis_data:/data + networks: + localnet: + ipv4_address: 192.167.10.6 + node0: container_name: node0 image: "cometbft/localnode" + depends_on: + - redis ports: - "26656-26657:26656-26657" environment: - ID=0 - LOG=${LOG:-cometbft.log} + - REDIS_HOST=redis + - REDIS_PORT=6379 volumes: - ./build:/cometbft:Z networks: @@ -18,11 +32,15 @@ services: node1: container_name: node1 image: "cometbft/localnode" + depends_on: + - redis ports: - "26659-26660:26656-26657" environment: - ID=1 - LOG=${LOG:-cometbft.log} + - REDIS_HOST=redis + - REDIS_PORT=6379 volumes: - ./build:/cometbft:Z networks: @@ -32,9 +50,13 @@ services: node2: container_name: node2 image: "cometbft/localnode" + depends_on: + - redis environment: - ID=2 - LOG=${LOG:-cometbft.log} + - REDIS_HOST=redis + - REDIS_PORT=6379 ports: - "26661-26662:26656-26657" volumes: @@ -46,9 +68,13 @@ services: node3: container_name: node3 image: "cometbft/localnode" + depends_on: + - redis environment: - ID=3 - LOG=${LOG:-cometbft.log} + - REDIS_HOST=redis + - REDIS_PORT=6379 ports: - "26663-26664:26656-26657" volumes: @@ -64,3 +90,7 @@ networks: driver: default config: - subnet: 192.167.10.0/16 + +# Define volumes +volumes: + redis_data: diff --git a/node/node.go b/node/node.go index 3ba04d7bfff..d7ab938095e 100644 --- a/node/node.go +++ b/node/node.go @@ -381,7 +381,7 @@ func NewNodeWithContext(ctx context.Context, } // Make OracleReactor - oracleReactor := oracle.NewReactor("", "13.215.29.72:9090", pubKey, privValidator) + oracleReactor := oracle.NewReactor("", "13.215.29.72:9090", pubKey, privValidator, state.Validators) oracleInfo := oracleReactor.OracleInfo // make block executor for consensus and blocksync reactors to execute blocks @@ -955,6 +955,7 @@ func makeNodeInfo( bc.BlocksyncChannel, cs.StateChannel, cs.DataChannel, cs.VoteChannel, cs.VoteSetBitsChannel, mempl.MempoolChannel, + oracle.OracleChannel, evidence.EvidenceChannel, statesync.SnapshotChannel, statesync.ChunkChannel, }, diff --git a/oracle/reactor.go b/oracle/reactor.go index 423c24b4e35..cd899952361 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -53,7 +53,7 @@ type Reactor struct { } // NewReactor returns a new Reactor with the given config and mempool. -func NewReactor(configPath string, grpcAddress string, pubKey crypto.PubKey, privValidator types.PrivValidator) *Reactor { +func NewReactor(configPath string, grpcAddress string, pubKey crypto.PubKey, privValidator types.PrivValidator, validatorSet *types.ValidatorSet) *Reactor { // load oracle.json config if present jsonFile, openErr := os.Open(configPath) if openErr != nil { @@ -87,6 +87,7 @@ func NewReactor(configPath string, grpcAddress string, pubKey crypto.PubKey, pri SignVotesChan: make(chan *oracleproto.Vote), PubKey: pubKey, PrivValidator: privValidator, + ValidatorSet: validatorSet, } jsonFile.Close() @@ -152,8 +153,9 @@ func (oracleR *Reactor) OnStart() error { oracleR.OracleInfo.AdapterMap = adapters.GetAdapterMap(oracleR.OracleInfo.GrpcClient, &oracleR.OracleInfo.Redis) logrus.Info("[oracle] running oracle service...") - runner.Run(oracleR.OracleInfo) - + go func() { + runner.Run(oracleR.OracleInfo) + }() return nil } @@ -166,10 +168,10 @@ func (oracleR *Reactor) GetChannels() []*p2p.ChannelDescriptor { { ID: OracleChannel, Priority: 5, - RecvMessageCapacity: 1024, + RecvMessageCapacity: 4096, RecvBufferCapacity: 50 * 4096, SendQueueCapacity: 1000, - MessageType: &oracleproto.Vote{}, + MessageType: &oracleproto.GossipVote{}, }, } } @@ -178,7 +180,10 @@ func (oracleR *Reactor) GetChannels() []*p2p.ChannelDescriptor { // It starts a broadcast routine ensuring all txs are forwarded to the given peer. func (oracleR *Reactor) AddPeer(peer p2p.Peer) { // if oracleR.config.Broadcast { - go oracleR.broadcastVoteRoutine(peer) + go func() { + oracleR.broadcastVoteRoutine(peer) + time.Sleep(100 * time.Millisecond) + }() // } } @@ -194,14 +199,29 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { oracleR.Logger.Debug("Receive", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) switch msg := e.Message.(type) { case *oracleproto.GossipVote: + // verify sig of incoming gossip vote, throw if verification fails + _, val := oracleR.OracleInfo.ValidatorSet.GetByAddress(msg.Validator) + if val == nil { + oracleR.Logger.Info("failed signature verification", msg) + logrus.Info("NOT A VALIDATOR!!!!!!!!!!!!!!") + return + } + pubKey := val.PubKey + // need to use pubkey of signer + if !pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature) { + oracleR.Logger.Info("failed signature verification", msg) + logrus.Info("FAILED SIGNATURE VERIFICATION!!!!!!!!!!!!!!") + return + } + oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RLock() - currentGossipVote, ok := oracleR.OracleInfo.GossipVoteBuffer.Buffer[msg.Validator] + currentGossipVote, ok := oracleR.OracleInfo.GossipVoteBuffer.Buffer[pubKey.Address().String()] oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() if !ok { // first gossipVote entry from this validator oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Lock() - oracleR.OracleInfo.GossipVoteBuffer.Buffer[msg.Validator] = msg + oracleR.OracleInfo.GossipVoteBuffer.Buffer[pubKey.Address().String()] = msg oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() } else { // existing gossipVote entry from this validator @@ -210,13 +230,13 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { newTimestamp := msg.SignedTimestamp // only replace if the gossipVote received has a later timestamp than our current one if newTimestamp > previousTimestamp { - oracleR.OracleInfo.GossipVoteBuffer.Buffer[msg.Validator] = msg + oracleR.OracleInfo.GossipVoteBuffer.Buffer[pubKey.Address().String()] = msg } oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() } default: oracleR.Logger.Error("unknown message type", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) - oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("mempool cannot handle message of type: %T", e.Message)) + oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("oracle cannot handle message of type: %T", e.Message)) return } @@ -275,16 +295,20 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { // https://github.com/tendermint/tendermint/issues/5796 // if !memTx.isSender(peerID) { + oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RLock() for _, gossipVote := range oracleR.OracleInfo.GossipVoteBuffer.Buffer { success := peer.Send(p2p.Envelope{ ChannelID: OracleChannel, Message: gossipVote, }) if !success { + logrus.Info("FAILED TO SEND!!!!!!!!!!!!!!!!!!!!!!!!!!!!") time.Sleep(PeerCatchupSleepIntervalMS * time.Millisecond) continue } } + oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() + time.Sleep(200 * time.Millisecond) // } // select { diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index ba9ec52cda0..d8e3c27b438 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -251,7 +251,7 @@ func RunOracle(oracleInfo *types.OracleInfo, oracle types.Oracle, currentTime ui } vote := oracleproto.Vote{ - Validator: oracleInfo.PubKey.Address().String(), + Validator: oracleInfo.PubKey.Address(), OracleId: oracle.Id, Timestamp: normalizedTime, Data: resultData, @@ -316,7 +316,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo) { // batch sign the entire unsignedVoteBuffer and add to gossipBuffer newGossipVote := &oracleproto.GossipVote{ - Validator: oracleInfo.PubKey.Address().String(), + Validator: oracleInfo.PubKey.Address(), PublicKey: oracleInfo.PubKey.Bytes(), SignType: oracleInfo.PubKey.Type(), Votes: batchVotes, @@ -389,6 +389,11 @@ func Run(oracleInfo *types.OracleInfo) { for { if count == 0 { // on init, and every minute oracles, err := SyncOracles(oracleInfo) + oracleInfo.GossipVoteBuffer.UpdateMtx.RLock() + for address := range oracleInfo.GossipVoteBuffer.Buffer { + log.Infof("THIS IS MY VALIDATOR ADDRESS: %s \n\n\n", address) + } + oracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() if err != nil { log.Warn(err) time.Sleep(time.Second) @@ -401,7 +406,7 @@ func Run(oracleInfo *types.OracleInfo) { time.Sleep(100 * time.Millisecond) count++ - if count > 600 { // 600 * 0.1s = 60s = every minute + if count > 300 { // 600 * 0.1s = 60s = every minute count = 0 } } diff --git a/oracle/service/types/info.go b/oracle/service/types/info.go index 4f6a44948ab..5d9de752a46 100644 --- a/oracle/service/types/info.go +++ b/oracle/service/types/info.go @@ -25,6 +25,7 @@ type OracleInfo struct { PrivValidator types.PrivValidator MsgFlushInterval time.Duration StopChannel chan int + ValidatorSet *types.ValidatorSet } type UnsignedVotes struct { diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index 5e08a0de499..fdd9ffc355d 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -23,7 +23,7 @@ var _ = math.Inf const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type Vote struct { - Validator string `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` + Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` OracleId string `protobuf:"bytes,2,opt,name=oracle_id,json=oracleId,proto3" json:"oracle_id,omitempty"` Timestamp uint64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` Data string `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` @@ -62,11 +62,11 @@ func (m *Vote) XXX_DiscardUnknown() { var xxx_messageInfo_Vote proto.InternalMessageInfo -func (m *Vote) GetValidator() string { +func (m *Vote) GetValidator() []byte { if m != nil { return m.Validator } - return "" + return nil } func (m *Vote) GetOracleId() string { @@ -91,7 +91,7 @@ func (m *Vote) GetData() string { } type GossipVote struct { - Validator string `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` + Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` PublicKey []byte `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` SignType string `protobuf:"bytes,3,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` Votes []*Vote `protobuf:"bytes,4,rep,name=votes,proto3" json:"votes,omitempty"` @@ -132,11 +132,11 @@ func (m *GossipVote) XXX_DiscardUnknown() { var xxx_messageInfo_GossipVote proto.InternalMessageInfo -func (m *GossipVote) GetValidator() string { +func (m *GossipVote) GetValidator() []byte { if m != nil { return m.Validator } - return "" + return nil } func (m *GossipVote) GetPublicKey() []byte { @@ -175,7 +175,7 @@ func (m *GossipVote) GetSignature() []byte { } type CanonicalGossipVote struct { - Validator string `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` + Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` PublicKey []byte `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` SignType string `protobuf:"bytes,3,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` Votes []*Vote `protobuf:"bytes,4,rep,name=votes,proto3" json:"votes,omitempty"` @@ -214,11 +214,11 @@ func (m *CanonicalGossipVote) XXX_DiscardUnknown() { var xxx_messageInfo_CanonicalGossipVote proto.InternalMessageInfo -func (m *CanonicalGossipVote) GetValidator() string { +func (m *CanonicalGossipVote) GetValidator() []byte { if m != nil { return m.Validator } - return "" + return nil } func (m *CanonicalGossipVote) GetPublicKey() []byte { @@ -251,28 +251,28 @@ func init() { func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 331 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x92, 0x41, 0x4a, 0xc3, 0x40, - 0x14, 0x86, 0x3b, 0x36, 0x2d, 0xcd, 0x28, 0xa8, 0xe3, 0xc2, 0x80, 0x6d, 0x28, 0x5d, 0xd5, 0x85, - 0x09, 0xa8, 0x27, 0xd0, 0x85, 0x88, 0xe0, 0x22, 0x14, 0x17, 0x6e, 0xc2, 0x24, 0x79, 0xd6, 0xc1, - 0x24, 0x13, 0x32, 0xaf, 0x85, 0xdc, 0xc2, 0x13, 0x78, 0x1e, 0x97, 0x5d, 0xba, 0x12, 0x69, 0x2f, - 0x22, 0x33, 0x03, 0xcd, 0xa2, 0x1b, 0x97, 0xee, 0x86, 0xef, 0x7f, 0x8f, 0xff, 0xff, 0x87, 0x47, - 0x47, 0x08, 0x65, 0x06, 0x75, 0x21, 0x4a, 0x0c, 0x65, 0xcd, 0xd3, 0x1c, 0x42, 0x6c, 0x2a, 0x50, - 0x41, 0x55, 0x4b, 0x94, 0xec, 0xb8, 0x95, 0x03, 0x2b, 0x4f, 0x14, 0x75, 0x9e, 0x24, 0x02, 0x1b, - 0x52, 0x77, 0xc9, 0x73, 0x91, 0x71, 0x94, 0xb5, 0x47, 0xc6, 0x64, 0xea, 0x46, 0x2d, 0x60, 0x67, - 0xd4, 0xb5, 0xf3, 0xb1, 0xc8, 0xbc, 0x3d, 0xa3, 0x0e, 0x2c, 0xb8, 0xcf, 0xf4, 0x2a, 0x8a, 0x02, - 0x14, 0xf2, 0xa2, 0xf2, 0xba, 0x63, 0x32, 0x75, 0xa2, 0x16, 0x30, 0x46, 0x9d, 0x8c, 0x23, 0xf7, - 0x1c, 0xb3, 0x65, 0xde, 0x93, 0x6f, 0x42, 0xe9, 0x9d, 0x54, 0x4a, 0x54, 0x7f, 0xf0, 0x1e, 0x51, - 0x5a, 0x2d, 0x92, 0x5c, 0xa4, 0xf1, 0x1b, 0x34, 0xc6, 0xfc, 0x20, 0x72, 0x2d, 0x79, 0x80, 0x46, - 0x47, 0x53, 0x62, 0x5e, 0xc6, 0xba, 0xa7, 0x71, 0x77, 0xa3, 0x81, 0x06, 0xb3, 0xa6, 0x02, 0x76, - 0x41, 0x7b, 0x4b, 0x89, 0xa0, 0x3c, 0x67, 0xdc, 0x9d, 0xee, 0x5f, 0x9e, 0x06, 0x3b, 0x1f, 0x10, - 0xe8, 0x04, 0x91, 0x9d, 0x62, 0xe7, 0xf4, 0x48, 0xaf, 0x42, 0x16, 0xb7, 0x85, 0x7a, 0xa6, 0xd0, - 0xa1, 0xe5, 0xb3, 0x6d, 0xad, 0xa1, 0xb5, 0xe5, 0xb8, 0xa8, 0xc1, 0xeb, 0xdb, 0x50, 0x5b, 0x30, - 0xf9, 0x20, 0xf4, 0xe4, 0x96, 0x97, 0xb2, 0x14, 0x29, 0xcf, 0xff, 0x61, 0xd3, 0x9b, 0xc7, 0xcf, - 0xb5, 0x4f, 0x56, 0x6b, 0x9f, 0xfc, 0xac, 0x7d, 0xf2, 0xbe, 0xf1, 0x3b, 0xab, 0x8d, 0xdf, 0xf9, - 0xda, 0xf8, 0x9d, 0xe7, 0xeb, 0xb9, 0xc0, 0xd7, 0x45, 0x12, 0xa4, 0xb2, 0x08, 0x53, 0x59, 0x00, - 0x26, 0x2f, 0xd8, 0x3e, 0xcc, 0x1d, 0x85, 0x3b, 0x57, 0x96, 0xf4, 0x8d, 0x70, 0xf5, 0x1b, 0x00, - 0x00, 0xff, 0xff, 0xbd, 0x1c, 0x3d, 0xbd, 0x81, 0x02, 0x00, 0x00, + // 335 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x92, 0xc1, 0x4a, 0xf3, 0x40, + 0x14, 0x85, 0x3b, 0x7f, 0xd3, 0xd2, 0xcc, 0x5f, 0x50, 0xc7, 0x85, 0x01, 0xdb, 0x10, 0xba, 0x8a, + 0x0b, 0x13, 0x50, 0x9f, 0x40, 0x17, 0x22, 0x82, 0x8b, 0x50, 0x5c, 0xb8, 0x09, 0x93, 0xe4, 0x5a, + 0x07, 0x93, 0x4c, 0xc8, 0xdc, 0x16, 0xf2, 0x16, 0x3e, 0x81, 0xcf, 0xe3, 0xb2, 0x4b, 0x57, 0x22, + 0xed, 0x8b, 0x48, 0x66, 0xa0, 0x59, 0x74, 0xe3, 0xd2, 0xdd, 0xf0, 0xdd, 0x7b, 0x38, 0xe7, 0x0c, + 0x97, 0x4e, 0x11, 0xca, 0x0c, 0xea, 0x42, 0x94, 0x18, 0xca, 0x9a, 0xa7, 0x39, 0x84, 0xd8, 0x54, + 0xa0, 0x82, 0xaa, 0x96, 0x28, 0xd9, 0x51, 0x37, 0x0e, 0xcc, 0x78, 0xa6, 0xa8, 0xf5, 0x28, 0x11, + 0xd8, 0x84, 0xda, 0x2b, 0x9e, 0x8b, 0x8c, 0xa3, 0xac, 0x1d, 0xe2, 0x11, 0x7f, 0x1c, 0x75, 0x80, + 0x9d, 0x52, 0xdb, 0xec, 0xc7, 0x22, 0x73, 0xfe, 0x79, 0xc4, 0xb7, 0xa3, 0x91, 0x01, 0x77, 0x59, + 0x2b, 0x45, 0x51, 0x80, 0x42, 0x5e, 0x54, 0x4e, 0xdf, 0x23, 0xbe, 0x15, 0x75, 0x80, 0x31, 0x6a, + 0x65, 0x1c, 0xb9, 0x63, 0x69, 0x95, 0x7e, 0xcf, 0xbe, 0x08, 0xa5, 0xb7, 0x52, 0x29, 0x51, 0xfd, + 0xc2, 0x7b, 0x4a, 0x69, 0xb5, 0x4c, 0x72, 0x91, 0xc6, 0xaf, 0xd0, 0x68, 0xf3, 0x71, 0x64, 0x1b, + 0x72, 0x0f, 0x4d, 0x1b, 0x4d, 0x89, 0x45, 0x19, 0xb7, 0x3d, 0xb5, 0xbb, 0x1d, 0x8d, 0x5a, 0x30, + 0x6f, 0x2a, 0x60, 0xe7, 0x74, 0xb0, 0x92, 0x08, 0xca, 0xb1, 0xbc, 0xbe, 0xff, 0xff, 0xe2, 0x24, + 0xd8, 0xfb, 0x80, 0xa0, 0x4d, 0x10, 0x99, 0x2d, 0x76, 0x46, 0x0f, 0x5b, 0x29, 0x64, 0x71, 0x57, + 0x68, 0xa0, 0x0b, 0x1d, 0x18, 0x3e, 0xdf, 0xd5, 0x9a, 0x18, 0x5b, 0x8e, 0xcb, 0x1a, 0x9c, 0xa1, + 0x09, 0xb5, 0x03, 0xb3, 0x77, 0x42, 0x8f, 0x6f, 0x78, 0x29, 0x4b, 0x91, 0xf2, 0xfc, 0x0f, 0x36, + 0xbd, 0x7e, 0xf8, 0xd8, 0xb8, 0x64, 0xbd, 0x71, 0xc9, 0xf7, 0xc6, 0x25, 0x6f, 0x5b, 0xb7, 0xb7, + 0xde, 0xba, 0xbd, 0xcf, 0xad, 0xdb, 0x7b, 0xba, 0x5a, 0x08, 0x7c, 0x59, 0x26, 0x41, 0x2a, 0x8b, + 0x30, 0x95, 0x05, 0x60, 0xf2, 0x8c, 0xdd, 0x43, 0xdf, 0x51, 0xb8, 0x77, 0x65, 0xc9, 0x50, 0x0f, + 0x2e, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x1d, 0xc1, 0x06, 0x56, 0x81, 0x02, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -587,7 +587,7 @@ func (m *Vote) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -597,23 +597,25 @@ func (m *Vote) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Validator = string(dAtA[iNdEx:postIndex]) + m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) + if m.Validator == nil { + m.Validator = []byte{} + } iNdEx = postIndex case 2: if wireType != 2 { @@ -752,7 +754,7 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -762,23 +764,25 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Validator = string(dAtA[iNdEx:postIndex]) + m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) + if m.Validator == nil { + m.Validator = []byte{} + } iNdEx = postIndex case 2: if wireType != 2 { @@ -987,7 +991,7 @@ func (m *CanonicalGossipVote) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -997,23 +1001,25 @@ func (m *CanonicalGossipVote) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Validator = string(dAtA[iNdEx:postIndex]) + m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) + if m.Validator == nil { + m.Validator = []byte{} + } iNdEx = postIndex case 2: if wireType != 2 { diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index e5b2bcb6a2b..b2d750181fa 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -4,14 +4,14 @@ package tendermint.oracle; option go_package = "github.com/cometbft/cometbft/proto/tendermint/oracle"; message Vote { - string validator = 1; + bytes validator = 1; string oracle_id = 2; uint64 timestamp = 3; string data = 4; } message GossipVote { - string validator = 1; + bytes validator = 1; bytes public_key = 2; string sign_type = 3; repeated Vote votes = 4; @@ -20,7 +20,7 @@ message GossipVote { } message CanonicalGossipVote { - string validator = 1; + bytes validator = 1; bytes public_key = 2; string sign_type = 3; repeated Vote votes = 4; From be0f2c5d4abbd56b0b2c852ac45229a03dbfe36d Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 23 Feb 2024 17:13:11 +0800 Subject: [PATCH 011/150] add new proto for list of gossipVotes --- proto/tendermint/oracle/types.pb.go | 229 +++++++++++++++++++++++++--- proto/tendermint/oracle/types.proto | 4 + 2 files changed, 210 insertions(+), 23 deletions(-) diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index fdd9ffc355d..a553865ff35 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -174,6 +174,50 @@ func (m *GossipVote) GetSignature() []byte { return nil } +type GossipVotes struct { + GossipVotes []*GossipVote `protobuf:"bytes,1,rep,name=gossip_votes,json=gossipVotes,proto3" json:"gossip_votes,omitempty"` +} + +func (m *GossipVotes) Reset() { *m = GossipVotes{} } +func (m *GossipVotes) String() string { return proto.CompactTextString(m) } +func (*GossipVotes) ProtoMessage() {} +func (*GossipVotes) Descriptor() ([]byte, []int) { + return fileDescriptor_ed9227d272ed5d90, []int{2} +} +func (m *GossipVotes) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GossipVotes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GossipVotes.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *GossipVotes) XXX_Merge(src proto.Message) { + xxx_messageInfo_GossipVotes.Merge(m, src) +} +func (m *GossipVotes) XXX_Size() int { + return m.Size() +} +func (m *GossipVotes) XXX_DiscardUnknown() { + xxx_messageInfo_GossipVotes.DiscardUnknown(m) +} + +var xxx_messageInfo_GossipVotes proto.InternalMessageInfo + +func (m *GossipVotes) GetGossipVotes() []*GossipVote { + if m != nil { + return m.GossipVotes + } + return nil +} + type CanonicalGossipVote struct { Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` PublicKey []byte `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` @@ -185,7 +229,7 @@ func (m *CanonicalGossipVote) Reset() { *m = CanonicalGossipVote{} } func (m *CanonicalGossipVote) String() string { return proto.CompactTextString(m) } func (*CanonicalGossipVote) ProtoMessage() {} func (*CanonicalGossipVote) Descriptor() ([]byte, []int) { - return fileDescriptor_ed9227d272ed5d90, []int{2} + return fileDescriptor_ed9227d272ed5d90, []int{3} } func (m *CanonicalGossipVote) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -245,34 +289,37 @@ func (m *CanonicalGossipVote) GetVotes() []*Vote { func init() { proto.RegisterType((*Vote)(nil), "tendermint.oracle.Vote") proto.RegisterType((*GossipVote)(nil), "tendermint.oracle.GossipVote") + proto.RegisterType((*GossipVotes)(nil), "tendermint.oracle.GossipVotes") proto.RegisterType((*CanonicalGossipVote)(nil), "tendermint.oracle.CanonicalGossipVote") } func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 335 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x92, 0xc1, 0x4a, 0xf3, 0x40, - 0x14, 0x85, 0x3b, 0x7f, 0xd3, 0xd2, 0xcc, 0x5f, 0x50, 0xc7, 0x85, 0x01, 0xdb, 0x10, 0xba, 0x8a, - 0x0b, 0x13, 0x50, 0x9f, 0x40, 0x17, 0x22, 0x82, 0x8b, 0x50, 0x5c, 0xb8, 0x09, 0x93, 0xe4, 0x5a, - 0x07, 0x93, 0x4c, 0xc8, 0xdc, 0x16, 0xf2, 0x16, 0x3e, 0x81, 0xcf, 0xe3, 0xb2, 0x4b, 0x57, 0x22, - 0xed, 0x8b, 0x48, 0x66, 0xa0, 0x59, 0x74, 0xe3, 0xd2, 0xdd, 0xf0, 0xdd, 0x7b, 0x38, 0xe7, 0x0c, - 0x97, 0x4e, 0x11, 0xca, 0x0c, 0xea, 0x42, 0x94, 0x18, 0xca, 0x9a, 0xa7, 0x39, 0x84, 0xd8, 0x54, - 0xa0, 0x82, 0xaa, 0x96, 0x28, 0xd9, 0x51, 0x37, 0x0e, 0xcc, 0x78, 0xa6, 0xa8, 0xf5, 0x28, 0x11, - 0xd8, 0x84, 0xda, 0x2b, 0x9e, 0x8b, 0x8c, 0xa3, 0xac, 0x1d, 0xe2, 0x11, 0x7f, 0x1c, 0x75, 0x80, - 0x9d, 0x52, 0xdb, 0xec, 0xc7, 0x22, 0x73, 0xfe, 0x79, 0xc4, 0xb7, 0xa3, 0x91, 0x01, 0x77, 0x59, - 0x2b, 0x45, 0x51, 0x80, 0x42, 0x5e, 0x54, 0x4e, 0xdf, 0x23, 0xbe, 0x15, 0x75, 0x80, 0x31, 0x6a, - 0x65, 0x1c, 0xb9, 0x63, 0x69, 0x95, 0x7e, 0xcf, 0xbe, 0x08, 0xa5, 0xb7, 0x52, 0x29, 0x51, 0xfd, - 0xc2, 0x7b, 0x4a, 0x69, 0xb5, 0x4c, 0x72, 0x91, 0xc6, 0xaf, 0xd0, 0x68, 0xf3, 0x71, 0x64, 0x1b, - 0x72, 0x0f, 0x4d, 0x1b, 0x4d, 0x89, 0x45, 0x19, 0xb7, 0x3d, 0xb5, 0xbb, 0x1d, 0x8d, 0x5a, 0x30, - 0x6f, 0x2a, 0x60, 0xe7, 0x74, 0xb0, 0x92, 0x08, 0xca, 0xb1, 0xbc, 0xbe, 0xff, 0xff, 0xe2, 0x24, - 0xd8, 0xfb, 0x80, 0xa0, 0x4d, 0x10, 0x99, 0x2d, 0x76, 0x46, 0x0f, 0x5b, 0x29, 0x64, 0x71, 0x57, - 0x68, 0xa0, 0x0b, 0x1d, 0x18, 0x3e, 0xdf, 0xd5, 0x9a, 0x18, 0x5b, 0x8e, 0xcb, 0x1a, 0x9c, 0xa1, - 0x09, 0xb5, 0x03, 0xb3, 0x77, 0x42, 0x8f, 0x6f, 0x78, 0x29, 0x4b, 0x91, 0xf2, 0xfc, 0x0f, 0x36, - 0xbd, 0x7e, 0xf8, 0xd8, 0xb8, 0x64, 0xbd, 0x71, 0xc9, 0xf7, 0xc6, 0x25, 0x6f, 0x5b, 0xb7, 0xb7, - 0xde, 0xba, 0xbd, 0xcf, 0xad, 0xdb, 0x7b, 0xba, 0x5a, 0x08, 0x7c, 0x59, 0x26, 0x41, 0x2a, 0x8b, - 0x30, 0x95, 0x05, 0x60, 0xf2, 0x8c, 0xdd, 0x43, 0xdf, 0x51, 0xb8, 0x77, 0x65, 0xc9, 0x50, 0x0f, - 0x2e, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x1d, 0xc1, 0x06, 0x56, 0x81, 0x02, 0x00, 0x00, + // 362 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x52, 0xc1, 0x4a, 0xeb, 0x40, + 0x14, 0xed, 0xbc, 0xa6, 0xa5, 0x99, 0x16, 0x9e, 0x8e, 0x0b, 0x03, 0xb6, 0x21, 0x64, 0x15, 0x17, + 0x26, 0xa0, 0x7e, 0x80, 0xe8, 0x42, 0x44, 0x50, 0x18, 0x8a, 0x0b, 0x37, 0x61, 0x92, 0x8c, 0x71, + 0x30, 0xc9, 0x84, 0xcc, 0xb4, 0x90, 0xbf, 0xf0, 0x0b, 0xfc, 0x1e, 0x97, 0x5d, 0xba, 0x12, 0x69, + 0x7f, 0x44, 0x32, 0x03, 0x9d, 0x45, 0x5d, 0xb8, 0x74, 0x77, 0xe7, 0xdc, 0x7b, 0xe6, 0x9c, 0x73, + 0xb9, 0x70, 0x26, 0x69, 0x95, 0xd1, 0xa6, 0x64, 0x95, 0x8c, 0x78, 0x43, 0xd2, 0x82, 0x46, 0xb2, + 0xad, 0xa9, 0x08, 0xeb, 0x86, 0x4b, 0x8e, 0xf6, 0x4d, 0x3b, 0xd4, 0x6d, 0x5f, 0x40, 0xeb, 0x81, + 0x4b, 0x8a, 0xa6, 0xd0, 0x5e, 0x92, 0x82, 0x65, 0x44, 0xf2, 0xc6, 0x01, 0x1e, 0x08, 0x26, 0xd8, + 0x00, 0xe8, 0x08, 0xda, 0x7a, 0x3e, 0x66, 0x99, 0xf3, 0xcf, 0x03, 0x81, 0x8d, 0x47, 0x1a, 0xb8, + 0xc9, 0x3a, 0xaa, 0x64, 0x25, 0x15, 0x92, 0x94, 0xb5, 0xd3, 0xf7, 0x40, 0x60, 0x61, 0x03, 0x20, + 0x04, 0xad, 0x8c, 0x48, 0xe2, 0x58, 0x8a, 0xa5, 0x6a, 0xff, 0x13, 0x40, 0x78, 0xcd, 0x85, 0x60, + 0xf5, 0x2f, 0xb4, 0x67, 0x10, 0xd6, 0x8b, 0xa4, 0x60, 0x69, 0xfc, 0x42, 0x5b, 0x25, 0x3e, 0xc1, + 0xb6, 0x46, 0x6e, 0x69, 0xdb, 0x59, 0x13, 0x2c, 0xaf, 0xe2, 0x2e, 0xa7, 0x52, 0xb7, 0xf1, 0xa8, + 0x03, 0xe6, 0x6d, 0x4d, 0xd1, 0x09, 0x1c, 0x2c, 0xb9, 0xa4, 0xc2, 0xb1, 0xbc, 0x7e, 0x30, 0x3e, + 0x3d, 0x0c, 0x77, 0x16, 0x10, 0x76, 0x0e, 0xb0, 0x9e, 0x42, 0xc7, 0x70, 0xaf, 0xa3, 0xd2, 0x2c, + 0x36, 0x81, 0x06, 0x2a, 0xd0, 0x7f, 0x8d, 0xcf, 0xb7, 0xb1, 0xa6, 0x5a, 0x96, 0xc8, 0x45, 0x43, + 0x9d, 0xa1, 0x36, 0xb5, 0x05, 0xfc, 0x7b, 0x38, 0x36, 0xf9, 0x04, 0xba, 0x80, 0x93, 0x5c, 0x3d, + 0x63, 0xed, 0x06, 0x28, 0x37, 0xb3, 0x1f, 0xdc, 0x18, 0x16, 0x1e, 0xe7, 0xe6, 0x07, 0xff, 0x0d, + 0xc0, 0x83, 0x2b, 0x52, 0xf1, 0x8a, 0xa5, 0xa4, 0xf8, 0x83, 0xab, 0xbb, 0xbc, 0x7b, 0x5f, 0xbb, + 0x60, 0xb5, 0x76, 0xc1, 0xd7, 0xda, 0x05, 0xaf, 0x1b, 0xb7, 0xb7, 0xda, 0xb8, 0xbd, 0x8f, 0x8d, + 0xdb, 0x7b, 0x3c, 0xcf, 0x99, 0x7c, 0x5e, 0x24, 0x61, 0xca, 0xcb, 0x28, 0xe5, 0x25, 0x95, 0xc9, + 0x93, 0x34, 0x85, 0x3a, 0xcc, 0x68, 0xe7, 0x6c, 0x93, 0xa1, 0x6a, 0x9c, 0x7d, 0x07, 0x00, 0x00, + 0xff, 0xff, 0xd8, 0x11, 0xcd, 0x0c, 0xd2, 0x02, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -394,6 +441,43 @@ func (m *GossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *GossipVotes) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GossipVotes) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GossipVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.GossipVotes) > 0 { + for iNdEx := len(m.GossipVotes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.GossipVotes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func (m *CanonicalGossipVote) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -521,6 +605,21 @@ func (m *GossipVote) Size() (n int) { return n } +func (m *GossipVotes) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.GossipVotes) > 0 { + for _, e := range m.GossipVotes { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + return n +} + func (m *CanonicalGossipVote) Size() (n int) { if m == nil { return 0 @@ -958,6 +1057,90 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { } return nil } +func (m *GossipVotes) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GossipVotes: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GossipVotes: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GossipVotes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.GossipVotes = append(m.GossipVotes, &GossipVote{}) + if err := m.GossipVotes[len(m.GossipVotes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *CanonicalGossipVote) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index b2d750181fa..a50d7a4d5ef 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -19,6 +19,10 @@ message GossipVote { bytes signature = 6; } +message GossipVotes { + repeated GossipVote gossip_votes = 1; +} + message CanonicalGossipVote { bytes validator = 1; bytes public_key = 2; From d4339f059d52129233ce151c61e4b3257fd67a18 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 23 Feb 2024 17:39:45 +0800 Subject: [PATCH 012/150] Revert "add new proto for list of gossipVotes" This reverts commit be0f2c5d4abbd56b0b2c852ac45229a03dbfe36d. --- proto/tendermint/oracle/types.pb.go | 229 +++------------------------- proto/tendermint/oracle/types.proto | 4 - 2 files changed, 23 insertions(+), 210 deletions(-) diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index a553865ff35..fdd9ffc355d 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -174,50 +174,6 @@ func (m *GossipVote) GetSignature() []byte { return nil } -type GossipVotes struct { - GossipVotes []*GossipVote `protobuf:"bytes,1,rep,name=gossip_votes,json=gossipVotes,proto3" json:"gossip_votes,omitempty"` -} - -func (m *GossipVotes) Reset() { *m = GossipVotes{} } -func (m *GossipVotes) String() string { return proto.CompactTextString(m) } -func (*GossipVotes) ProtoMessage() {} -func (*GossipVotes) Descriptor() ([]byte, []int) { - return fileDescriptor_ed9227d272ed5d90, []int{2} -} -func (m *GossipVotes) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GossipVotes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GossipVotes.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *GossipVotes) XXX_Merge(src proto.Message) { - xxx_messageInfo_GossipVotes.Merge(m, src) -} -func (m *GossipVotes) XXX_Size() int { - return m.Size() -} -func (m *GossipVotes) XXX_DiscardUnknown() { - xxx_messageInfo_GossipVotes.DiscardUnknown(m) -} - -var xxx_messageInfo_GossipVotes proto.InternalMessageInfo - -func (m *GossipVotes) GetGossipVotes() []*GossipVote { - if m != nil { - return m.GossipVotes - } - return nil -} - type CanonicalGossipVote struct { Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` PublicKey []byte `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` @@ -229,7 +185,7 @@ func (m *CanonicalGossipVote) Reset() { *m = CanonicalGossipVote{} } func (m *CanonicalGossipVote) String() string { return proto.CompactTextString(m) } func (*CanonicalGossipVote) ProtoMessage() {} func (*CanonicalGossipVote) Descriptor() ([]byte, []int) { - return fileDescriptor_ed9227d272ed5d90, []int{3} + return fileDescriptor_ed9227d272ed5d90, []int{2} } func (m *CanonicalGossipVote) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -289,37 +245,34 @@ func (m *CanonicalGossipVote) GetVotes() []*Vote { func init() { proto.RegisterType((*Vote)(nil), "tendermint.oracle.Vote") proto.RegisterType((*GossipVote)(nil), "tendermint.oracle.GossipVote") - proto.RegisterType((*GossipVotes)(nil), "tendermint.oracle.GossipVotes") proto.RegisterType((*CanonicalGossipVote)(nil), "tendermint.oracle.CanonicalGossipVote") } func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 362 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x52, 0xc1, 0x4a, 0xeb, 0x40, - 0x14, 0xed, 0xbc, 0xa6, 0xa5, 0x99, 0x16, 0x9e, 0x8e, 0x0b, 0x03, 0xb6, 0x21, 0x64, 0x15, 0x17, - 0x26, 0xa0, 0x7e, 0x80, 0xe8, 0x42, 0x44, 0x50, 0x18, 0x8a, 0x0b, 0x37, 0x61, 0x92, 0x8c, 0x71, - 0x30, 0xc9, 0x84, 0xcc, 0xb4, 0x90, 0xbf, 0xf0, 0x0b, 0xfc, 0x1e, 0x97, 0x5d, 0xba, 0x12, 0x69, - 0x7f, 0x44, 0x32, 0x03, 0x9d, 0x45, 0x5d, 0xb8, 0x74, 0x77, 0xe7, 0xdc, 0x7b, 0xe6, 0x9c, 0x73, - 0xb9, 0x70, 0x26, 0x69, 0x95, 0xd1, 0xa6, 0x64, 0x95, 0x8c, 0x78, 0x43, 0xd2, 0x82, 0x46, 0xb2, - 0xad, 0xa9, 0x08, 0xeb, 0x86, 0x4b, 0x8e, 0xf6, 0x4d, 0x3b, 0xd4, 0x6d, 0x5f, 0x40, 0xeb, 0x81, - 0x4b, 0x8a, 0xa6, 0xd0, 0x5e, 0x92, 0x82, 0x65, 0x44, 0xf2, 0xc6, 0x01, 0x1e, 0x08, 0x26, 0xd8, - 0x00, 0xe8, 0x08, 0xda, 0x7a, 0x3e, 0x66, 0x99, 0xf3, 0xcf, 0x03, 0x81, 0x8d, 0x47, 0x1a, 0xb8, - 0xc9, 0x3a, 0xaa, 0x64, 0x25, 0x15, 0x92, 0x94, 0xb5, 0xd3, 0xf7, 0x40, 0x60, 0x61, 0x03, 0x20, - 0x04, 0xad, 0x8c, 0x48, 0xe2, 0x58, 0x8a, 0xa5, 0x6a, 0xff, 0x13, 0x40, 0x78, 0xcd, 0x85, 0x60, - 0xf5, 0x2f, 0xb4, 0x67, 0x10, 0xd6, 0x8b, 0xa4, 0x60, 0x69, 0xfc, 0x42, 0x5b, 0x25, 0x3e, 0xc1, - 0xb6, 0x46, 0x6e, 0x69, 0xdb, 0x59, 0x13, 0x2c, 0xaf, 0xe2, 0x2e, 0xa7, 0x52, 0xb7, 0xf1, 0xa8, - 0x03, 0xe6, 0x6d, 0x4d, 0xd1, 0x09, 0x1c, 0x2c, 0xb9, 0xa4, 0xc2, 0xb1, 0xbc, 0x7e, 0x30, 0x3e, - 0x3d, 0x0c, 0x77, 0x16, 0x10, 0x76, 0x0e, 0xb0, 0x9e, 0x42, 0xc7, 0x70, 0xaf, 0xa3, 0xd2, 0x2c, - 0x36, 0x81, 0x06, 0x2a, 0xd0, 0x7f, 0x8d, 0xcf, 0xb7, 0xb1, 0xa6, 0x5a, 0x96, 0xc8, 0x45, 0x43, - 0x9d, 0xa1, 0x36, 0xb5, 0x05, 0xfc, 0x7b, 0x38, 0x36, 0xf9, 0x04, 0xba, 0x80, 0x93, 0x5c, 0x3d, - 0x63, 0xed, 0x06, 0x28, 0x37, 0xb3, 0x1f, 0xdc, 0x18, 0x16, 0x1e, 0xe7, 0xe6, 0x07, 0xff, 0x0d, - 0xc0, 0x83, 0x2b, 0x52, 0xf1, 0x8a, 0xa5, 0xa4, 0xf8, 0x83, 0xab, 0xbb, 0xbc, 0x7b, 0x5f, 0xbb, - 0x60, 0xb5, 0x76, 0xc1, 0xd7, 0xda, 0x05, 0xaf, 0x1b, 0xb7, 0xb7, 0xda, 0xb8, 0xbd, 0x8f, 0x8d, - 0xdb, 0x7b, 0x3c, 0xcf, 0x99, 0x7c, 0x5e, 0x24, 0x61, 0xca, 0xcb, 0x28, 0xe5, 0x25, 0x95, 0xc9, - 0x93, 0x34, 0x85, 0x3a, 0xcc, 0x68, 0xe7, 0x6c, 0x93, 0xa1, 0x6a, 0x9c, 0x7d, 0x07, 0x00, 0x00, - 0xff, 0xff, 0xd8, 0x11, 0xcd, 0x0c, 0xd2, 0x02, 0x00, 0x00, + // 335 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x92, 0xc1, 0x4a, 0xf3, 0x40, + 0x14, 0x85, 0x3b, 0x7f, 0xd3, 0xd2, 0xcc, 0x5f, 0x50, 0xc7, 0x85, 0x01, 0xdb, 0x10, 0xba, 0x8a, + 0x0b, 0x13, 0x50, 0x9f, 0x40, 0x17, 0x22, 0x82, 0x8b, 0x50, 0x5c, 0xb8, 0x09, 0x93, 0xe4, 0x5a, + 0x07, 0x93, 0x4c, 0xc8, 0xdc, 0x16, 0xf2, 0x16, 0x3e, 0x81, 0xcf, 0xe3, 0xb2, 0x4b, 0x57, 0x22, + 0xed, 0x8b, 0x48, 0x66, 0xa0, 0x59, 0x74, 0xe3, 0xd2, 0xdd, 0xf0, 0xdd, 0x7b, 0x38, 0xe7, 0x0c, + 0x97, 0x4e, 0x11, 0xca, 0x0c, 0xea, 0x42, 0x94, 0x18, 0xca, 0x9a, 0xa7, 0x39, 0x84, 0xd8, 0x54, + 0xa0, 0x82, 0xaa, 0x96, 0x28, 0xd9, 0x51, 0x37, 0x0e, 0xcc, 0x78, 0xa6, 0xa8, 0xf5, 0x28, 0x11, + 0xd8, 0x84, 0xda, 0x2b, 0x9e, 0x8b, 0x8c, 0xa3, 0xac, 0x1d, 0xe2, 0x11, 0x7f, 0x1c, 0x75, 0x80, + 0x9d, 0x52, 0xdb, 0xec, 0xc7, 0x22, 0x73, 0xfe, 0x79, 0xc4, 0xb7, 0xa3, 0x91, 0x01, 0x77, 0x59, + 0x2b, 0x45, 0x51, 0x80, 0x42, 0x5e, 0x54, 0x4e, 0xdf, 0x23, 0xbe, 0x15, 0x75, 0x80, 0x31, 0x6a, + 0x65, 0x1c, 0xb9, 0x63, 0x69, 0x95, 0x7e, 0xcf, 0xbe, 0x08, 0xa5, 0xb7, 0x52, 0x29, 0x51, 0xfd, + 0xc2, 0x7b, 0x4a, 0x69, 0xb5, 0x4c, 0x72, 0x91, 0xc6, 0xaf, 0xd0, 0x68, 0xf3, 0x71, 0x64, 0x1b, + 0x72, 0x0f, 0x4d, 0x1b, 0x4d, 0x89, 0x45, 0x19, 0xb7, 0x3d, 0xb5, 0xbb, 0x1d, 0x8d, 0x5a, 0x30, + 0x6f, 0x2a, 0x60, 0xe7, 0x74, 0xb0, 0x92, 0x08, 0xca, 0xb1, 0xbc, 0xbe, 0xff, 0xff, 0xe2, 0x24, + 0xd8, 0xfb, 0x80, 0xa0, 0x4d, 0x10, 0x99, 0x2d, 0x76, 0x46, 0x0f, 0x5b, 0x29, 0x64, 0x71, 0x57, + 0x68, 0xa0, 0x0b, 0x1d, 0x18, 0x3e, 0xdf, 0xd5, 0x9a, 0x18, 0x5b, 0x8e, 0xcb, 0x1a, 0x9c, 0xa1, + 0x09, 0xb5, 0x03, 0xb3, 0x77, 0x42, 0x8f, 0x6f, 0x78, 0x29, 0x4b, 0x91, 0xf2, 0xfc, 0x0f, 0x36, + 0xbd, 0x7e, 0xf8, 0xd8, 0xb8, 0x64, 0xbd, 0x71, 0xc9, 0xf7, 0xc6, 0x25, 0x6f, 0x5b, 0xb7, 0xb7, + 0xde, 0xba, 0xbd, 0xcf, 0xad, 0xdb, 0x7b, 0xba, 0x5a, 0x08, 0x7c, 0x59, 0x26, 0x41, 0x2a, 0x8b, + 0x30, 0x95, 0x05, 0x60, 0xf2, 0x8c, 0xdd, 0x43, 0xdf, 0x51, 0xb8, 0x77, 0x65, 0xc9, 0x50, 0x0f, + 0x2e, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x1d, 0xc1, 0x06, 0x56, 0x81, 0x02, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -441,43 +394,6 @@ func (m *GossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *GossipVotes) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GossipVotes) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GossipVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.GossipVotes) > 0 { - for iNdEx := len(m.GossipVotes) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.GossipVotes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - func (m *CanonicalGossipVote) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -605,21 +521,6 @@ func (m *GossipVote) Size() (n int) { return n } -func (m *GossipVotes) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.GossipVotes) > 0 { - for _, e := range m.GossipVotes { - l = e.Size() - n += 1 + l + sovTypes(uint64(l)) - } - } - return n -} - func (m *CanonicalGossipVote) Size() (n int) { if m == nil { return 0 @@ -1057,90 +958,6 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { } return nil } -func (m *GossipVotes) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: GossipVotes: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GossipVotes: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GossipVotes", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.GossipVotes = append(m.GossipVotes, &GossipVote{}) - if err := m.GossipVotes[len(m.GossipVotes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *CanonicalGossipVote) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index a50d7a4d5ef..b2d750181fa 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -19,10 +19,6 @@ message GossipVote { bytes signature = 6; } -message GossipVotes { - repeated GossipVote gossip_votes = 1; -} - message CanonicalGossipVote { bytes validator = 1; bytes public_key = 2; From c3501d76541cb4b668277d515d8f1b48bf65871c Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 23 Feb 2024 17:51:54 +0800 Subject: [PATCH 013/150] test update buf build name, for exporting --- proto/buf.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/proto/buf.yaml b/proto/buf.yaml index 0895e40e931..4e1d99fa43a 100644 --- a/proto/buf.yaml +++ b/proto/buf.yaml @@ -1,4 +1,5 @@ version: v1 +name: buf.build/Switcheo/cometbft deps: - buf.build/cosmos/cosmos-proto - buf.build/cosmos/gogo-proto From a6aa022c72f5cd203a2277878aa5165e210d62cf Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 26 Feb 2024 17:36:07 +0800 Subject: [PATCH 014/150] add SignGossipVote hook to proxyApp interface --- abci/client/grpc_client.go | 4 + abci/client/mocks/client.go | 26 + abci/client/socket_client.go | 13 + abci/types/application.go | 11 +- abci/types/messages.go | 12 + abci/types/mocks/application.go | 26 + abci/types/types.pb.go | 1284 ++++++++++++++++++++++------- proto/buf.lock | 4 +- proto/tendermint/abci/types.proto | 16 + proxy/app_conn.go | 6 + proxy/mocks/app_conn_consensus.go | 26 + state/execution.go | 46 +- 12 files changed, 1170 insertions(+), 304 deletions(-) diff --git a/abci/client/grpc_client.go b/abci/client/grpc_client.go index 926e679d687..4a0ac155474 100644 --- a/abci/client/grpc_client.go +++ b/abci/client/grpc_client.go @@ -245,3 +245,7 @@ func (cli *grpcClient) VerifyVoteExtension(ctx context.Context, req *types.Reque func (cli *grpcClient) FinalizeBlock(ctx context.Context, req *types.RequestFinalizeBlock) (*types.ResponseFinalizeBlock, error) { return cli.client.FinalizeBlock(ctx, types.ToRequestFinalizeBlock(req).GetFinalizeBlock(), grpc.WaitForReady(true)) } + +func (cli *grpcClient) SignGossipVote(ctx context.Context, req *types.RequestSignGossipVote) (*types.ResponseSignGossipVote, error) { + return cli.client.SignGossipVote(ctx, types.ToRequestSignGossipVote(req).GetSignGossipVote(), grpc.WaitForReady(true)) +} diff --git a/abci/client/mocks/client.go b/abci/client/mocks/client.go index 6494bdb5db7..aa34ab74c1c 100644 --- a/abci/client/mocks/client.go +++ b/abci/client/mocks/client.go @@ -524,6 +524,32 @@ func (_m *Client) SetResponseCallback(_a0 abcicli.Callback) { _m.Called(_a0) } +// SignGossipVote provides a mock function with given fields: _a0, _a1 +func (_m *Client) SignGossipVote(_a0 context.Context, _a1 *types.RequestSignGossipVote) (*types.ResponseSignGossipVote, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseSignGossipVote + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestSignGossipVote) (*types.ResponseSignGossipVote, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestSignGossipVote) *types.ResponseSignGossipVote); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseSignGossipVote) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestSignGossipVote) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // Start provides a mock function with given fields: func (_m *Client) Start() error { ret := _m.Called() diff --git a/abci/client/socket_client.go b/abci/client/socket_client.go index 47382e31292..a9a50fc2958 100644 --- a/abci/client/socket_client.go +++ b/abci/client/socket_client.go @@ -412,6 +412,17 @@ func (cli *socketClient) FinalizeBlock(ctx context.Context, req *types.RequestFi return reqRes.Response.GetFinalizeBlock(), cli.Error() } +func (cli *socketClient) SignGossipVote(ctx context.Context, req *types.RequestSignGossipVote) (*types.ResponseSignGossipVote, error) { + reqRes, err := cli.queueRequest(ctx, types.ToRequestSignGossipVote(req)) + if err != nil { + return nil, err + } + if err := cli.Flush(ctx); err != nil { + return nil, err + } + return reqRes.Response.GetSignGossipVote(), cli.Error() +} + func (cli *socketClient) queueRequest(ctx context.Context, req *types.Request) (*ReqRes, error) { reqres := NewReqRes(req) @@ -493,6 +504,8 @@ func resMatchesReq(req *types.Request, res *types.Response) (ok bool) { _, ok = res.Value.(*types.Response_ProcessProposal) case *types.Request_FinalizeBlock: _, ok = res.Value.(*types.Response_FinalizeBlock) + case *types.Request_SignGossipVote: + _, ok = res.Value.(*types.Response_SignGossipVote) } return ok } diff --git a/abci/types/application.go b/abci/types/application.go index 4ccfd229ebc..e07f99e7bb3 100644 --- a/abci/types/application.go +++ b/abci/types/application.go @@ -1,6 +1,8 @@ package types -import "context" +import ( + "context" +) //go:generate ../../scripts/mockery_generate.sh Application @@ -32,6 +34,9 @@ type Application interface { OfferSnapshot(context.Context, *RequestOfferSnapshot) (*ResponseOfferSnapshot, error) // Offer a snapshot to the application LoadSnapshotChunk(context.Context, *RequestLoadSnapshotChunk) (*ResponseLoadSnapshotChunk, error) // Load a snapshot chunk ApplySnapshotChunk(context.Context, *RequestApplySnapshotChunk) (*ResponseApplySnapshotChunk, error) // Apply a shapshot chunk + + // Hooks + SignGossipVote(context.Context, *RequestSignGossipVote) (*ResponseSignGossipVote, error) } //------------------------------------------------------- @@ -117,3 +122,7 @@ func (BaseApplication) FinalizeBlock(_ context.Context, req *RequestFinalizeBloc TxResults: txs, }, nil } + +func (BaseApplication) SignGossipVote(_ context.Context, req *RequestSignGossipVote) (*ResponseSignGossipVote, error) { + return &ResponseSignGossipVote{}, nil +} diff --git a/abci/types/messages.go b/abci/types/messages.go index b081098d0bd..87293cc3778 100644 --- a/abci/types/messages.go +++ b/abci/types/messages.go @@ -123,6 +123,12 @@ func ToRequestFinalizeBlock(req *RequestFinalizeBlock) *Request { } } +func ToRequestSignGossipVote(req *RequestSignGossipVote) *Request { + return &Request{ + Value: &Request_SignGossipVote{req}, + } +} + //---------------------------------------- func ToResponseException(errStr string) *Response { @@ -226,3 +232,9 @@ func ToResponseFinalizeBlock(res *ResponseFinalizeBlock) *Response { Value: &Response_FinalizeBlock{res}, } } + +func ToResponseSignGossipVote(res *ResponseSignGossipVote) *Response { + return &Response{ + Value: &Response_SignGossipVote{res}, + } +} diff --git a/abci/types/mocks/application.go b/abci/types/mocks/application.go index b7f0b51ded0..46bab165959 100644 --- a/abci/types/mocks/application.go +++ b/abci/types/mocks/application.go @@ -352,6 +352,32 @@ func (_m *Application) Query(_a0 context.Context, _a1 *types.RequestQuery) (*typ return r0, r1 } +// SignGossipVote provides a mock function with given fields: _a0, _a1 +func (_m *Application) SignGossipVote(_a0 context.Context, _a1 *types.RequestSignGossipVote) (*types.ResponseSignGossipVote, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseSignGossipVote + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestSignGossipVote) (*types.ResponseSignGossipVote, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestSignGossipVote) *types.ResponseSignGossipVote); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseSignGossipVote) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestSignGossipVote) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // VerifyVoteExtension provides a mock function with given fields: _a0, _a1 func (_m *Application) VerifyVoteExtension(_a0 context.Context, _a1 *types.RequestVerifyVoteExtension) (*types.ResponseVerifyVoteExtension, error) { ret := _m.Called(_a0, _a1) diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go index 203aeeeb313..a81bffbe891 100644 --- a/abci/types/types.pb.go +++ b/abci/types/types.pb.go @@ -7,6 +7,7 @@ import ( context "context" fmt "fmt" crypto "github.com/cometbft/cometbft/proto/tendermint/crypto" + oracle "github.com/cometbft/cometbft/proto/tendermint/oracle" types1 "github.com/cometbft/cometbft/proto/tendermint/types" _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" @@ -121,7 +122,7 @@ func (x ResponseOfferSnapshot_Result) String() string { } func (ResponseOfferSnapshot_Result) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{27, 0} + return fileDescriptor_252557cfdd89a31a, []int{28, 0} } type ResponseApplySnapshotChunk_Result int32 @@ -158,7 +159,7 @@ func (x ResponseApplySnapshotChunk_Result) String() string { } func (ResponseApplySnapshotChunk_Result) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{29, 0} + return fileDescriptor_252557cfdd89a31a, []int{30, 0} } type ResponseProcessProposal_ProposalStatus int32 @@ -186,7 +187,7 @@ func (x ResponseProcessProposal_ProposalStatus) String() string { } func (ResponseProcessProposal_ProposalStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{31, 0} + return fileDescriptor_252557cfdd89a31a, []int{32, 0} } type ResponseVerifyVoteExtension_VerifyStatus int32 @@ -218,7 +219,7 @@ func (x ResponseVerifyVoteExtension_VerifyStatus) String() string { } func (ResponseVerifyVoteExtension_VerifyStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{33, 0} + return fileDescriptor_252557cfdd89a31a, []int{34, 0} } type Request struct { @@ -239,6 +240,7 @@ type Request struct { // *Request_ExtendVote // *Request_VerifyVoteExtension // *Request_FinalizeBlock + // *Request_SignGossipVote Value isRequest_Value `protobuf_oneof:"value"` } @@ -329,6 +331,9 @@ type Request_VerifyVoteExtension struct { type Request_FinalizeBlock struct { FinalizeBlock *RequestFinalizeBlock `protobuf:"bytes,20,opt,name=finalize_block,json=finalizeBlock,proto3,oneof" json:"finalize_block,omitempty"` } +type Request_SignGossipVote struct { + SignGossipVote *RequestSignGossipVote `protobuf:"bytes,21,opt,name=sign_gossip_vote,json=signGossipVote,proto3,oneof" json:"sign_gossip_vote,omitempty"` +} func (*Request_Echo) isRequest_Value() {} func (*Request_Flush) isRequest_Value() {} @@ -346,6 +351,7 @@ func (*Request_ProcessProposal) isRequest_Value() {} func (*Request_ExtendVote) isRequest_Value() {} func (*Request_VerifyVoteExtension) isRequest_Value() {} func (*Request_FinalizeBlock) isRequest_Value() {} +func (*Request_SignGossipVote) isRequest_Value() {} func (m *Request) GetValue() isRequest_Value { if m != nil { @@ -466,6 +472,13 @@ func (m *Request) GetFinalizeBlock() *RequestFinalizeBlock { return nil } +func (m *Request) GetSignGossipVote() *RequestSignGossipVote { + if x, ok := m.GetValue().(*Request_SignGossipVote); ok { + return x.SignGossipVote + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*Request) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -485,6 +498,7 @@ func (*Request) XXX_OneofWrappers() []interface{} { (*Request_ExtendVote)(nil), (*Request_VerifyVoteExtension)(nil), (*Request_FinalizeBlock)(nil), + (*Request_SignGossipVote)(nil), } } @@ -1572,6 +1586,74 @@ func (m *RequestFinalizeBlock) GetProposerAddress() []byte { return nil } +type RequestSignGossipVote struct { + GossipVotes []*oracle.GossipVote `protobuf:"bytes,1,rep,name=gossip_votes,json=gossipVotes,proto3" json:"gossip_votes,omitempty"` + GrpcAddress string `protobuf:"bytes,2,opt,name=grpc_address,json=grpcAddress,proto3" json:"grpc_address,omitempty"` + SubaccountLabel string `protobuf:"bytes,3,opt,name=subaccount_label,json=subaccountLabel,proto3" json:"subaccount_label,omitempty"` + Password string `protobuf:"bytes,4,opt,name=password,proto3" json:"password,omitempty"` +} + +func (m *RequestSignGossipVote) Reset() { *m = RequestSignGossipVote{} } +func (m *RequestSignGossipVote) String() string { return proto.CompactTextString(m) } +func (*RequestSignGossipVote) ProtoMessage() {} +func (*RequestSignGossipVote) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{17} +} +func (m *RequestSignGossipVote) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RequestSignGossipVote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RequestSignGossipVote.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RequestSignGossipVote) XXX_Merge(src proto.Message) { + xxx_messageInfo_RequestSignGossipVote.Merge(m, src) +} +func (m *RequestSignGossipVote) XXX_Size() int { + return m.Size() +} +func (m *RequestSignGossipVote) XXX_DiscardUnknown() { + xxx_messageInfo_RequestSignGossipVote.DiscardUnknown(m) +} + +var xxx_messageInfo_RequestSignGossipVote proto.InternalMessageInfo + +func (m *RequestSignGossipVote) GetGossipVotes() []*oracle.GossipVote { + if m != nil { + return m.GossipVotes + } + return nil +} + +func (m *RequestSignGossipVote) GetGrpcAddress() string { + if m != nil { + return m.GrpcAddress + } + return "" +} + +func (m *RequestSignGossipVote) GetSubaccountLabel() string { + if m != nil { + return m.SubaccountLabel + } + return "" +} + +func (m *RequestSignGossipVote) GetPassword() string { + if m != nil { + return m.Password + } + return "" +} + type Response struct { // Types that are valid to be assigned to Value: // @@ -1592,6 +1674,7 @@ type Response struct { // *Response_ExtendVote // *Response_VerifyVoteExtension // *Response_FinalizeBlock + // *Response_SignGossipVote Value isResponse_Value `protobuf_oneof:"value"` } @@ -1599,7 +1682,7 @@ func (m *Response) Reset() { *m = Response{} } func (m *Response) String() string { return proto.CompactTextString(m) } func (*Response) ProtoMessage() {} func (*Response) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{17} + return fileDescriptor_252557cfdd89a31a, []int{18} } func (m *Response) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1685,6 +1768,9 @@ type Response_VerifyVoteExtension struct { type Response_FinalizeBlock struct { FinalizeBlock *ResponseFinalizeBlock `protobuf:"bytes,21,opt,name=finalize_block,json=finalizeBlock,proto3,oneof" json:"finalize_block,omitempty"` } +type Response_SignGossipVote struct { + SignGossipVote *ResponseSignGossipVote `protobuf:"bytes,22,opt,name=sign_gossip_vote,json=signGossipVote,proto3,oneof" json:"sign_gossip_vote,omitempty"` +} func (*Response_Exception) isResponse_Value() {} func (*Response_Echo) isResponse_Value() {} @@ -1703,6 +1789,7 @@ func (*Response_ProcessProposal) isResponse_Value() {} func (*Response_ExtendVote) isResponse_Value() {} func (*Response_VerifyVoteExtension) isResponse_Value() {} func (*Response_FinalizeBlock) isResponse_Value() {} +func (*Response_SignGossipVote) isResponse_Value() {} func (m *Response) GetValue() isResponse_Value { if m != nil { @@ -1830,6 +1917,13 @@ func (m *Response) GetFinalizeBlock() *ResponseFinalizeBlock { return nil } +func (m *Response) GetSignGossipVote() *ResponseSignGossipVote { + if x, ok := m.GetValue().(*Response_SignGossipVote); ok { + return x.SignGossipVote + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*Response) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -1850,6 +1944,7 @@ func (*Response) XXX_OneofWrappers() []interface{} { (*Response_ExtendVote)(nil), (*Response_VerifyVoteExtension)(nil), (*Response_FinalizeBlock)(nil), + (*Response_SignGossipVote)(nil), } } @@ -1862,7 +1957,7 @@ func (m *ResponseException) Reset() { *m = ResponseException{} } func (m *ResponseException) String() string { return proto.CompactTextString(m) } func (*ResponseException) ProtoMessage() {} func (*ResponseException) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{18} + return fileDescriptor_252557cfdd89a31a, []int{19} } func (m *ResponseException) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1906,7 +2001,7 @@ func (m *ResponseEcho) Reset() { *m = ResponseEcho{} } func (m *ResponseEcho) String() string { return proto.CompactTextString(m) } func (*ResponseEcho) ProtoMessage() {} func (*ResponseEcho) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{19} + return fileDescriptor_252557cfdd89a31a, []int{20} } func (m *ResponseEcho) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1949,7 +2044,7 @@ func (m *ResponseFlush) Reset() { *m = ResponseFlush{} } func (m *ResponseFlush) String() string { return proto.CompactTextString(m) } func (*ResponseFlush) ProtoMessage() {} func (*ResponseFlush) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{20} + return fileDescriptor_252557cfdd89a31a, []int{21} } func (m *ResponseFlush) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1990,7 +2085,7 @@ func (m *ResponseInfo) Reset() { *m = ResponseInfo{} } func (m *ResponseInfo) String() string { return proto.CompactTextString(m) } func (*ResponseInfo) ProtoMessage() {} func (*ResponseInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{21} + return fileDescriptor_252557cfdd89a31a, []int{22} } func (m *ResponseInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2064,7 +2159,7 @@ func (m *ResponseInitChain) Reset() { *m = ResponseInitChain{} } func (m *ResponseInitChain) String() string { return proto.CompactTextString(m) } func (*ResponseInitChain) ProtoMessage() {} func (*ResponseInitChain) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{22} + return fileDescriptor_252557cfdd89a31a, []int{23} } func (m *ResponseInitChain) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2131,7 +2226,7 @@ func (m *ResponseQuery) Reset() { *m = ResponseQuery{} } func (m *ResponseQuery) String() string { return proto.CompactTextString(m) } func (*ResponseQuery) ProtoMessage() {} func (*ResponseQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{23} + return fileDescriptor_252557cfdd89a31a, []int{24} } func (m *ResponseQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2238,7 +2333,7 @@ func (m *ResponseCheckTx) Reset() { *m = ResponseCheckTx{} } func (m *ResponseCheckTx) String() string { return proto.CompactTextString(m) } func (*ResponseCheckTx) ProtoMessage() {} func (*ResponseCheckTx) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{24} + return fileDescriptor_252557cfdd89a31a, []int{25} } func (m *ResponseCheckTx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2331,7 +2426,7 @@ func (m *ResponseCommit) Reset() { *m = ResponseCommit{} } func (m *ResponseCommit) String() string { return proto.CompactTextString(m) } func (*ResponseCommit) ProtoMessage() {} func (*ResponseCommit) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{25} + return fileDescriptor_252557cfdd89a31a, []int{26} } func (m *ResponseCommit) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2375,7 +2470,7 @@ func (m *ResponseListSnapshots) Reset() { *m = ResponseListSnapshots{} } func (m *ResponseListSnapshots) String() string { return proto.CompactTextString(m) } func (*ResponseListSnapshots) ProtoMessage() {} func (*ResponseListSnapshots) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{26} + return fileDescriptor_252557cfdd89a31a, []int{27} } func (m *ResponseListSnapshots) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2419,7 +2514,7 @@ func (m *ResponseOfferSnapshot) Reset() { *m = ResponseOfferSnapshot{} } func (m *ResponseOfferSnapshot) String() string { return proto.CompactTextString(m) } func (*ResponseOfferSnapshot) ProtoMessage() {} func (*ResponseOfferSnapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{27} + return fileDescriptor_252557cfdd89a31a, []int{28} } func (m *ResponseOfferSnapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2463,7 +2558,7 @@ func (m *ResponseLoadSnapshotChunk) Reset() { *m = ResponseLoadSnapshotC func (m *ResponseLoadSnapshotChunk) String() string { return proto.CompactTextString(m) } func (*ResponseLoadSnapshotChunk) ProtoMessage() {} func (*ResponseLoadSnapshotChunk) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{28} + return fileDescriptor_252557cfdd89a31a, []int{29} } func (m *ResponseLoadSnapshotChunk) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2509,7 +2604,7 @@ func (m *ResponseApplySnapshotChunk) Reset() { *m = ResponseApplySnapsho func (m *ResponseApplySnapshotChunk) String() string { return proto.CompactTextString(m) } func (*ResponseApplySnapshotChunk) ProtoMessage() {} func (*ResponseApplySnapshotChunk) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{29} + return fileDescriptor_252557cfdd89a31a, []int{30} } func (m *ResponseApplySnapshotChunk) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2567,7 +2662,7 @@ func (m *ResponsePrepareProposal) Reset() { *m = ResponsePrepareProposal func (m *ResponsePrepareProposal) String() string { return proto.CompactTextString(m) } func (*ResponsePrepareProposal) ProtoMessage() {} func (*ResponsePrepareProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{30} + return fileDescriptor_252557cfdd89a31a, []int{31} } func (m *ResponsePrepareProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2611,7 +2706,7 @@ func (m *ResponseProcessProposal) Reset() { *m = ResponseProcessProposal func (m *ResponseProcessProposal) String() string { return proto.CompactTextString(m) } func (*ResponseProcessProposal) ProtoMessage() {} func (*ResponseProcessProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{31} + return fileDescriptor_252557cfdd89a31a, []int{32} } func (m *ResponseProcessProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2655,7 +2750,7 @@ func (m *ResponseExtendVote) Reset() { *m = ResponseExtendVote{} } func (m *ResponseExtendVote) String() string { return proto.CompactTextString(m) } func (*ResponseExtendVote) ProtoMessage() {} func (*ResponseExtendVote) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{32} + return fileDescriptor_252557cfdd89a31a, []int{33} } func (m *ResponseExtendVote) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2699,7 +2794,7 @@ func (m *ResponseVerifyVoteExtension) Reset() { *m = ResponseVerifyVoteE func (m *ResponseVerifyVoteExtension) String() string { return proto.CompactTextString(m) } func (*ResponseVerifyVoteExtension) ProtoMessage() {} func (*ResponseVerifyVoteExtension) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{33} + return fileDescriptor_252557cfdd89a31a, []int{34} } func (m *ResponseVerifyVoteExtension) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2754,7 +2849,7 @@ func (m *ResponseFinalizeBlock) Reset() { *m = ResponseFinalizeBlock{} } func (m *ResponseFinalizeBlock) String() string { return proto.CompactTextString(m) } func (*ResponseFinalizeBlock) ProtoMessage() {} func (*ResponseFinalizeBlock) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{34} + return fileDescriptor_252557cfdd89a31a, []int{35} } func (m *ResponseFinalizeBlock) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2818,6 +2913,50 @@ func (m *ResponseFinalizeBlock) GetAppHash() []byte { return nil } +type ResponseSignGossipVote struct { + EncodedTx []byte `protobuf:"bytes,1,opt,name=encoded_tx,json=encodedTx,proto3" json:"encoded_tx,omitempty"` +} + +func (m *ResponseSignGossipVote) Reset() { *m = ResponseSignGossipVote{} } +func (m *ResponseSignGossipVote) String() string { return proto.CompactTextString(m) } +func (*ResponseSignGossipVote) ProtoMessage() {} +func (*ResponseSignGossipVote) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{36} +} +func (m *ResponseSignGossipVote) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResponseSignGossipVote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ResponseSignGossipVote.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ResponseSignGossipVote) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseSignGossipVote.Merge(m, src) +} +func (m *ResponseSignGossipVote) XXX_Size() int { + return m.Size() +} +func (m *ResponseSignGossipVote) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseSignGossipVote.DiscardUnknown(m) +} + +var xxx_messageInfo_ResponseSignGossipVote proto.InternalMessageInfo + +func (m *ResponseSignGossipVote) GetEncodedTx() []byte { + if m != nil { + return m.EncodedTx + } + return nil +} + type CommitInfo struct { Round int32 `protobuf:"varint,1,opt,name=round,proto3" json:"round,omitempty"` Votes []VoteInfo `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes"` @@ -2827,7 +2966,7 @@ func (m *CommitInfo) Reset() { *m = CommitInfo{} } func (m *CommitInfo) String() string { return proto.CompactTextString(m) } func (*CommitInfo) ProtoMessage() {} func (*CommitInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{35} + return fileDescriptor_252557cfdd89a31a, []int{37} } func (m *CommitInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2885,7 +3024,7 @@ func (m *ExtendedCommitInfo) Reset() { *m = ExtendedCommitInfo{} } func (m *ExtendedCommitInfo) String() string { return proto.CompactTextString(m) } func (*ExtendedCommitInfo) ProtoMessage() {} func (*ExtendedCommitInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{36} + return fileDescriptor_252557cfdd89a31a, []int{38} } func (m *ExtendedCommitInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2940,7 +3079,7 @@ func (m *Event) Reset() { *m = Event{} } func (m *Event) String() string { return proto.CompactTextString(m) } func (*Event) ProtoMessage() {} func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{37} + return fileDescriptor_252557cfdd89a31a, []int{39} } func (m *Event) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2994,7 +3133,7 @@ func (m *EventAttribute) Reset() { *m = EventAttribute{} } func (m *EventAttribute) String() string { return proto.CompactTextString(m) } func (*EventAttribute) ProtoMessage() {} func (*EventAttribute) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{38} + return fileDescriptor_252557cfdd89a31a, []int{40} } func (m *EventAttribute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3062,7 +3201,7 @@ func (m *ExecTxResult) Reset() { *m = ExecTxResult{} } func (m *ExecTxResult) String() string { return proto.CompactTextString(m) } func (*ExecTxResult) ProtoMessage() {} func (*ExecTxResult) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{39} + return fileDescriptor_252557cfdd89a31a, []int{41} } func (m *ExecTxResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3161,7 +3300,7 @@ func (m *TxResult) Reset() { *m = TxResult{} } func (m *TxResult) String() string { return proto.CompactTextString(m) } func (*TxResult) ProtoMessage() {} func (*TxResult) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{40} + return fileDescriptor_252557cfdd89a31a, []int{42} } func (m *TxResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3228,7 +3367,7 @@ func (m *Validator) Reset() { *m = Validator{} } func (m *Validator) String() string { return proto.CompactTextString(m) } func (*Validator) ProtoMessage() {} func (*Validator) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{41} + return fileDescriptor_252557cfdd89a31a, []int{43} } func (m *Validator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3280,7 +3419,7 @@ func (m *ValidatorUpdate) Reset() { *m = ValidatorUpdate{} } func (m *ValidatorUpdate) String() string { return proto.CompactTextString(m) } func (*ValidatorUpdate) ProtoMessage() {} func (*ValidatorUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{42} + return fileDescriptor_252557cfdd89a31a, []int{44} } func (m *ValidatorUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3332,7 +3471,7 @@ 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_252557cfdd89a31a, []int{43} + return fileDescriptor_252557cfdd89a31a, []int{45} } func (m *VoteInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3390,7 +3529,7 @@ func (m *ExtendedVoteInfo) Reset() { *m = ExtendedVoteInfo{} } func (m *ExtendedVoteInfo) String() string { return proto.CompactTextString(m) } func (*ExtendedVoteInfo) ProtoMessage() {} func (*ExtendedVoteInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{44} + return fileDescriptor_252557cfdd89a31a, []int{46} } func (m *ExtendedVoteInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3465,7 +3604,7 @@ func (m *Misbehavior) Reset() { *m = Misbehavior{} } func (m *Misbehavior) String() string { return proto.CompactTextString(m) } func (*Misbehavior) ProtoMessage() {} func (*Misbehavior) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{45} + return fileDescriptor_252557cfdd89a31a, []int{47} } func (m *Misbehavior) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3541,7 +3680,7 @@ func (m *Snapshot) Reset() { *m = Snapshot{} } func (m *Snapshot) String() string { return proto.CompactTextString(m) } func (*Snapshot) ProtoMessage() {} func (*Snapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{46} + return fileDescriptor_252557cfdd89a31a, []int{48} } func (m *Snapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3629,6 +3768,7 @@ func init() { proto.RegisterType((*RequestExtendVote)(nil), "tendermint.abci.RequestExtendVote") proto.RegisterType((*RequestVerifyVoteExtension)(nil), "tendermint.abci.RequestVerifyVoteExtension") proto.RegisterType((*RequestFinalizeBlock)(nil), "tendermint.abci.RequestFinalizeBlock") + proto.RegisterType((*RequestSignGossipVote)(nil), "tendermint.abci.RequestSignGossipVote") proto.RegisterType((*Response)(nil), "tendermint.abci.Response") proto.RegisterType((*ResponseException)(nil), "tendermint.abci.ResponseException") proto.RegisterType((*ResponseEcho)(nil), "tendermint.abci.ResponseEcho") @@ -3647,6 +3787,7 @@ func init() { proto.RegisterType((*ResponseExtendVote)(nil), "tendermint.abci.ResponseExtendVote") proto.RegisterType((*ResponseVerifyVoteExtension)(nil), "tendermint.abci.ResponseVerifyVoteExtension") proto.RegisterType((*ResponseFinalizeBlock)(nil), "tendermint.abci.ResponseFinalizeBlock") + proto.RegisterType((*ResponseSignGossipVote)(nil), "tendermint.abci.ResponseSignGossipVote") proto.RegisterType((*CommitInfo)(nil), "tendermint.abci.CommitInfo") proto.RegisterType((*ExtendedCommitInfo)(nil), "tendermint.abci.ExtendedCommitInfo") proto.RegisterType((*Event)(nil), "tendermint.abci.Event") @@ -3664,205 +3805,216 @@ func init() { func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) } var fileDescriptor_252557cfdd89a31a = []byte{ - // 3167 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0xcb, 0x73, 0x23, 0xd5, - 0xd5, 0x57, 0xeb, 0xad, 0xa3, 0x87, 0xdb, 0xd7, 0x9e, 0x41, 0x23, 0x06, 0xdb, 0x34, 0x05, 0x0c, - 0x03, 0xd8, 0x7c, 0x9e, 0x6f, 0x78, 0xd4, 0xc0, 0x57, 0x25, 0x6b, 0x34, 0x9f, 0xec, 0x31, 0xb6, - 0x69, 0xcb, 0x43, 0x91, 0x07, 0x4d, 0x5b, 0xba, 0xb2, 0x9a, 0x91, 0xd4, 0x4d, 0xf7, 0x95, 0x91, - 0x59, 0xa5, 0x42, 0x52, 0x95, 0x62, 0x45, 0x55, 0xb2, 0x60, 0x11, 0x16, 0x59, 0x64, 0x93, 0xbf, - 0x20, 0xab, 0x64, 0x93, 0x05, 0x8b, 0x2c, 0x58, 0x66, 0x45, 0x52, 0xb0, 0x63, 0x9b, 0x45, 0xb6, - 0xa9, 0xfb, 0xe8, 0x97, 0xa4, 0xb6, 0xa4, 0x81, 0x2c, 0x52, 0xc9, 0xae, 0xef, 0xe9, 0x73, 0xce, - 0xed, 0x7b, 0xee, 0xb9, 0xe7, 0xf1, 0xeb, 0x0b, 0x8f, 0x13, 0x3c, 0x68, 0x63, 0xbb, 0x6f, 0x0c, - 0xc8, 0x96, 0x7e, 0xda, 0x32, 0xb6, 0xc8, 0x85, 0x85, 0x9d, 0x4d, 0xcb, 0x36, 0x89, 0x89, 0x96, - 0xfc, 0x97, 0x9b, 0xf4, 0x65, 0xe5, 0x89, 0x00, 0x77, 0xcb, 0xbe, 0xb0, 0x88, 0xb9, 0x65, 0xd9, - 0xa6, 0xd9, 0xe1, 0xfc, 0x95, 0xeb, 0x93, 0xaf, 0x1f, 0xe2, 0x0b, 0xa1, 0x2d, 0x24, 0xcc, 0x66, - 0xd9, 0xb2, 0x74, 0x5b, 0xef, 0xbb, 0xaf, 0x37, 0x26, 0x5e, 0x9f, 0xeb, 0x3d, 0xa3, 0xad, 0x13, - 0xd3, 0x16, 0x1c, 0xeb, 0x67, 0xa6, 0x79, 0xd6, 0xc3, 0x5b, 0x6c, 0x74, 0x3a, 0xec, 0x6c, 0x11, - 0xa3, 0x8f, 0x1d, 0xa2, 0xf7, 0x2d, 0xc1, 0xb0, 0x7a, 0x66, 0x9e, 0x99, 0xec, 0x71, 0x8b, 0x3e, - 0x71, 0xaa, 0xf2, 0xc7, 0x1c, 0x64, 0x54, 0xfc, 0xc1, 0x10, 0x3b, 0x04, 0x6d, 0x43, 0x12, 0xb7, - 0xba, 0x66, 0x59, 0xda, 0x90, 0x6e, 0xe4, 0xb7, 0xaf, 0x6f, 0x8e, 0x2d, 0x70, 0x53, 0xf0, 0xd5, - 0x5b, 0x5d, 0xb3, 0x11, 0x53, 0x19, 0x2f, 0xba, 0x0d, 0xa9, 0x4e, 0x6f, 0xe8, 0x74, 0xcb, 0x71, - 0x26, 0xf4, 0x44, 0x94, 0xd0, 0x3d, 0xca, 0xd4, 0x88, 0xa9, 0x9c, 0x9b, 0x4e, 0x65, 0x0c, 0x3a, - 0x66, 0x39, 0x71, 0xf9, 0x54, 0xbb, 0x83, 0x0e, 0x9b, 0x8a, 0xf2, 0xa2, 0x1d, 0x00, 0x63, 0x60, - 0x10, 0xad, 0xd5, 0xd5, 0x8d, 0x41, 0x39, 0xc5, 0x24, 0x9f, 0x8c, 0x96, 0x34, 0x48, 0x8d, 0x32, - 0x36, 0x62, 0x6a, 0xce, 0x70, 0x07, 0xf4, 0x73, 0x3f, 0x18, 0x62, 0xfb, 0xa2, 0x9c, 0xbe, 0xfc, - 0x73, 0xdf, 0xa2, 0x4c, 0xf4, 0x73, 0x19, 0x37, 0x7a, 0x1d, 0xb2, 0xad, 0x2e, 0x6e, 0x3d, 0xd4, - 0xc8, 0xa8, 0x9c, 0x65, 0x92, 0xeb, 0x51, 0x92, 0x35, 0xca, 0xd7, 0x1c, 0x35, 0x62, 0x6a, 0xa6, - 0xc5, 0x1f, 0xd1, 0xab, 0x90, 0x6e, 0x99, 0xfd, 0xbe, 0x41, 0xca, 0x79, 0x26, 0xbb, 0x16, 0x29, - 0xcb, 0xb8, 0x1a, 0x31, 0x55, 0xf0, 0xa3, 0x03, 0x28, 0xf5, 0x0c, 0x87, 0x68, 0xce, 0x40, 0xb7, - 0x9c, 0xae, 0x49, 0x9c, 0x72, 0x81, 0x69, 0x78, 0x3a, 0x4a, 0xc3, 0xbe, 0xe1, 0x90, 0x63, 0x97, - 0xb9, 0x11, 0x53, 0x8b, 0xbd, 0x20, 0x81, 0xea, 0x33, 0x3b, 0x1d, 0x6c, 0x7b, 0x0a, 0xcb, 0xc5, - 0xcb, 0xf5, 0x1d, 0x52, 0x6e, 0x57, 0x9e, 0xea, 0x33, 0x83, 0x04, 0xf4, 0x43, 0x58, 0xe9, 0x99, - 0x7a, 0xdb, 0x53, 0xa7, 0xb5, 0xba, 0xc3, 0xc1, 0xc3, 0x72, 0x89, 0x29, 0x7d, 0x2e, 0xf2, 0x23, - 0x4d, 0xbd, 0xed, 0xaa, 0xa8, 0x51, 0x81, 0x46, 0x4c, 0x5d, 0xee, 0x8d, 0x13, 0xd1, 0xbb, 0xb0, - 0xaa, 0x5b, 0x56, 0xef, 0x62, 0x5c, 0xfb, 0x12, 0xd3, 0x7e, 0x33, 0x4a, 0x7b, 0x95, 0xca, 0x8c, - 0xab, 0x47, 0xfa, 0x04, 0x15, 0x35, 0x41, 0xb6, 0x6c, 0x6c, 0xe9, 0x36, 0xd6, 0x2c, 0xdb, 0xb4, - 0x4c, 0x47, 0xef, 0x95, 0x65, 0xa6, 0xfb, 0xd9, 0x28, 0xdd, 0x47, 0x9c, 0xff, 0x48, 0xb0, 0x37, - 0x62, 0xea, 0x92, 0x15, 0x26, 0x71, 0xad, 0x66, 0x0b, 0x3b, 0x8e, 0xaf, 0x75, 0x79, 0x96, 0x56, - 0xc6, 0x1f, 0xd6, 0x1a, 0x22, 0xa1, 0x3a, 0xe4, 0xf1, 0x88, 0x8a, 0x6b, 0xe7, 0x26, 0xc1, 0x65, - 0xc4, 0x14, 0x2a, 0x91, 0x27, 0x94, 0xb1, 0x3e, 0x30, 0x09, 0x6e, 0xc4, 0x54, 0xc0, 0xde, 0x08, - 0xe9, 0x70, 0xe5, 0x1c, 0xdb, 0x46, 0xe7, 0x82, 0xa9, 0xd1, 0xd8, 0x1b, 0xc7, 0x30, 0x07, 0xe5, - 0x15, 0xa6, 0xf0, 0xf9, 0x28, 0x85, 0x0f, 0x98, 0x10, 0x55, 0x51, 0x77, 0x45, 0x1a, 0x31, 0x75, - 0xe5, 0x7c, 0x92, 0x4c, 0x5d, 0xac, 0x63, 0x0c, 0xf4, 0x9e, 0xf1, 0x11, 0xd6, 0x4e, 0x7b, 0x66, - 0xeb, 0x61, 0x79, 0xf5, 0x72, 0x17, 0xbb, 0x27, 0xb8, 0x77, 0x28, 0x33, 0x75, 0xb1, 0x4e, 0x90, - 0xb0, 0x93, 0x81, 0xd4, 0xb9, 0xde, 0x1b, 0xe2, 0xbd, 0x64, 0x36, 0x29, 0xa7, 0xf6, 0x92, 0xd9, - 0x8c, 0x9c, 0xdd, 0x4b, 0x66, 0x73, 0x32, 0xec, 0x25, 0xb3, 0x20, 0xe7, 0x95, 0x67, 0x21, 0x1f, - 0x08, 0x4c, 0xa8, 0x0c, 0x99, 0x3e, 0x76, 0x1c, 0xfd, 0x0c, 0xb3, 0x38, 0x96, 0x53, 0xdd, 0xa1, - 0x52, 0x82, 0x42, 0x30, 0x18, 0x29, 0x9f, 0x4a, 0x9e, 0x24, 0x8d, 0x33, 0x54, 0xf2, 0x1c, 0xdb, - 0xcc, 0x1c, 0x42, 0x52, 0x0c, 0xd1, 0x53, 0x50, 0x64, 0x4b, 0xd1, 0xdc, 0xf7, 0x34, 0xd8, 0x25, - 0xd5, 0x02, 0x23, 0x3e, 0x10, 0x4c, 0xeb, 0x90, 0xb7, 0xb6, 0x2d, 0x8f, 0x25, 0xc1, 0x58, 0xc0, - 0xda, 0xb6, 0x5c, 0x86, 0x27, 0xa1, 0x40, 0xd7, 0xed, 0x71, 0x24, 0xd9, 0x24, 0x79, 0x4a, 0x13, - 0x2c, 0xca, 0x9f, 0xe3, 0x20, 0x8f, 0x07, 0x30, 0xf4, 0x2a, 0x24, 0x69, 0x2c, 0x17, 0x61, 0xb9, - 0xb2, 0xc9, 0x03, 0xfd, 0xa6, 0x1b, 0xe8, 0x37, 0x9b, 0x6e, 0xa0, 0xdf, 0xc9, 0x7e, 0xf1, 0xd5, - 0x7a, 0xec, 0xd3, 0xbf, 0xae, 0x4b, 0x2a, 0x93, 0x40, 0xd7, 0x68, 0xd8, 0xd2, 0x8d, 0x81, 0x66, - 0xb4, 0xd9, 0x27, 0xe7, 0x68, 0x4c, 0xd2, 0x8d, 0xc1, 0x6e, 0x1b, 0xed, 0x83, 0xdc, 0x32, 0x07, - 0x0e, 0x1e, 0x38, 0x43, 0x47, 0xe3, 0xa9, 0x46, 0x04, 0xe3, 0x50, 0x48, 0xe5, 0x09, 0xaf, 0xe6, - 0x72, 0x1e, 0x31, 0x46, 0x75, 0xa9, 0x15, 0x26, 0xa0, 0x7b, 0x00, 0x5e, 0x3e, 0x72, 0xca, 0xc9, - 0x8d, 0xc4, 0x8d, 0xfc, 0xf6, 0xc6, 0xc4, 0x86, 0x3f, 0x70, 0x59, 0x4e, 0xac, 0xb6, 0x4e, 0xf0, - 0x4e, 0x92, 0x7e, 0xae, 0x1a, 0x90, 0x44, 0xcf, 0xc0, 0x92, 0x6e, 0x59, 0x9a, 0x43, 0x74, 0x82, - 0xb5, 0xd3, 0x0b, 0x82, 0x1d, 0x16, 0xe7, 0x0b, 0x6a, 0x51, 0xb7, 0xac, 0x63, 0x4a, 0xdd, 0xa1, - 0x44, 0xf4, 0x34, 0x94, 0x68, 0x4c, 0x37, 0xf4, 0x9e, 0xd6, 0xc5, 0xc6, 0x59, 0x97, 0xb0, 0x78, - 0x9e, 0x50, 0x8b, 0x82, 0xda, 0x60, 0x44, 0xa5, 0xed, 0xed, 0x38, 0x8b, 0xe7, 0x08, 0x41, 0xb2, - 0xad, 0x13, 0x9d, 0x59, 0xb2, 0xa0, 0xb2, 0x67, 0x4a, 0xb3, 0x74, 0xd2, 0x15, 0xf6, 0x61, 0xcf, - 0xe8, 0x2a, 0xa4, 0x85, 0xda, 0x04, 0x53, 0x2b, 0x46, 0x68, 0x15, 0x52, 0x96, 0x6d, 0x9e, 0x63, - 0xb6, 0x75, 0x59, 0x95, 0x0f, 0x14, 0x15, 0x4a, 0xe1, 0xd8, 0x8f, 0x4a, 0x10, 0x27, 0x23, 0x31, - 0x4b, 0x9c, 0x8c, 0xd0, 0x4b, 0x90, 0xa4, 0x86, 0x64, 0x73, 0x94, 0xa6, 0x64, 0x3b, 0x21, 0xd7, - 0xbc, 0xb0, 0xb0, 0xca, 0x38, 0x95, 0x25, 0x28, 0x86, 0x72, 0x82, 0x72, 0x15, 0x56, 0xa7, 0x85, - 0x78, 0xa5, 0xeb, 0xd1, 0x43, 0xa1, 0x1a, 0xdd, 0x86, 0xac, 0x17, 0xe3, 0xb9, 0xe3, 0x5c, 0x9b, - 0x98, 0xd6, 0x65, 0x56, 0x3d, 0x56, 0xea, 0x31, 0x74, 0x03, 0xba, 0xba, 0xc8, 0xe8, 0x05, 0x35, - 0xa3, 0x5b, 0x56, 0x43, 0x77, 0xba, 0xca, 0x7b, 0x50, 0x8e, 0x8a, 0xdf, 0x01, 0x83, 0x49, 0xcc, - 0xed, 0x5d, 0x83, 0x5d, 0x85, 0x74, 0xc7, 0xb4, 0xfb, 0x3a, 0x61, 0xca, 0x8a, 0xaa, 0x18, 0x51, - 0x43, 0xf2, 0x58, 0x9e, 0x60, 0x64, 0x3e, 0x50, 0x34, 0xb8, 0x16, 0x19, 0xc3, 0xa9, 0x88, 0x31, - 0x68, 0x63, 0x6e, 0xd6, 0xa2, 0xca, 0x07, 0xbe, 0x22, 0xfe, 0xb1, 0x7c, 0x40, 0xa7, 0x75, 0xd8, - 0x5a, 0x99, 0xfe, 0x9c, 0x2a, 0x46, 0xca, 0x67, 0x09, 0xb8, 0x3a, 0x3d, 0x92, 0xa3, 0x0d, 0x28, - 0xf4, 0xf5, 0x91, 0x46, 0x46, 0xc2, 0xed, 0x24, 0xb6, 0xf1, 0xd0, 0xd7, 0x47, 0xcd, 0x11, 0xf7, - 0x39, 0x19, 0x12, 0x64, 0xe4, 0x94, 0xe3, 0x1b, 0x89, 0x1b, 0x05, 0x95, 0x3e, 0xa2, 0x13, 0x58, - 0xee, 0x99, 0x2d, 0xbd, 0xa7, 0xf5, 0x74, 0x87, 0x68, 0x22, 0xc5, 0xf3, 0x43, 0xf4, 0xd4, 0x84, - 0xb1, 0x79, 0x4c, 0xc6, 0x6d, 0xbe, 0x9f, 0x34, 0xe0, 0x08, 0xff, 0x5f, 0x62, 0x3a, 0xf6, 0x75, - 0x77, 0xab, 0xd1, 0x5d, 0xc8, 0xf7, 0x0d, 0xe7, 0x14, 0x77, 0xf5, 0x73, 0xc3, 0xb4, 0xc5, 0x69, - 0x9a, 0x74, 0x9a, 0x37, 0x7d, 0x1e, 0xa1, 0x29, 0x28, 0x16, 0xd8, 0x92, 0x54, 0xc8, 0x87, 0xdd, - 0x68, 0x92, 0x5e, 0x38, 0x9a, 0xbc, 0x04, 0xab, 0x03, 0x3c, 0x22, 0x9a, 0x7f, 0x5e, 0xb9, 0x9f, - 0x64, 0x98, 0xe9, 0x11, 0x7d, 0xe7, 0x9d, 0x70, 0x87, 0xba, 0x0c, 0x7a, 0x8e, 0xe5, 0x42, 0xcb, - 0x74, 0xb0, 0xad, 0xe9, 0xed, 0xb6, 0x8d, 0x1d, 0x87, 0x95, 0x4f, 0x05, 0x96, 0xe0, 0x18, 0xbd, - 0xca, 0xc9, 0xca, 0x2f, 0x82, 0x5b, 0x13, 0xce, 0x7d, 0xc2, 0xf0, 0x92, 0x6f, 0xf8, 0x63, 0x58, - 0x15, 0xf2, 0xed, 0x90, 0xed, 0x79, 0x0d, 0xfa, 0xf8, 0xe4, 0xf9, 0x1a, 0xb7, 0x39, 0x72, 0xc5, - 0xa3, 0xcd, 0x9e, 0x78, 0x34, 0xb3, 0x23, 0x48, 0x32, 0xa3, 0x24, 0x79, 0x88, 0xa1, 0xcf, 0xff, - 0x6e, 0x5b, 0xf1, 0x71, 0x02, 0x96, 0x27, 0x0a, 0x09, 0x6f, 0x61, 0xd2, 0xd4, 0x85, 0xc5, 0xa7, - 0x2e, 0x2c, 0xb1, 0xf0, 0xc2, 0xc4, 0x5e, 0x27, 0x67, 0xef, 0x75, 0xea, 0x7b, 0xdc, 0xeb, 0xf4, - 0xa3, 0xed, 0xf5, 0xbf, 0x74, 0x17, 0x7e, 0x2d, 0x41, 0x25, 0xba, 0xfa, 0x9a, 0xba, 0x1d, 0xcf, - 0xc3, 0xb2, 0xf7, 0x29, 0x9e, 0x7a, 0x1e, 0x18, 0x65, 0xef, 0x85, 0xd0, 0x1f, 0x99, 0xe3, 0x9e, - 0x86, 0xd2, 0x58, 0x6d, 0xc8, 0x5d, 0xb9, 0x78, 0x1e, 0x9c, 0x5f, 0xf9, 0x59, 0xc2, 0x4b, 0x3c, - 0xa1, 0x02, 0x6e, 0xca, 0x69, 0x7d, 0x0b, 0x56, 0xda, 0xb8, 0x65, 0xb4, 0x1f, 0xf5, 0xb0, 0x2e, - 0x0b, 0xe9, 0xff, 0x9e, 0xd5, 0x49, 0x2f, 0xf9, 0x15, 0x40, 0x56, 0xc5, 0x8e, 0x45, 0xeb, 0x31, - 0xb4, 0x03, 0x39, 0x3c, 0x6a, 0x61, 0x8b, 0xb8, 0x25, 0xec, 0xf4, 0x16, 0x81, 0x73, 0xd7, 0x5d, - 0x4e, 0xda, 0x20, 0x7b, 0x62, 0xe8, 0x96, 0xc0, 0x00, 0xa2, 0xdb, 0x79, 0x21, 0x1e, 0x04, 0x01, - 0x5e, 0x76, 0x41, 0x80, 0x44, 0x64, 0x7f, 0xcb, 0xa5, 0xc6, 0x50, 0x80, 0x5b, 0x02, 0x05, 0x48, - 0xce, 0x98, 0x2c, 0x04, 0x03, 0xd4, 0x42, 0x30, 0x40, 0x7a, 0xc6, 0x32, 0x23, 0x70, 0x80, 0x97, - 0x5d, 0x1c, 0x20, 0x33, 0xe3, 0x8b, 0xc7, 0x80, 0x80, 0x37, 0x02, 0x40, 0x40, 0x8e, 0x89, 0x6e, - 0x44, 0x8a, 0x4e, 0x41, 0x02, 0x5e, 0xf3, 0x90, 0x80, 0x42, 0x24, 0x8a, 0x20, 0x84, 0xc7, 0xa1, - 0x80, 0xc3, 0x09, 0x28, 0x80, 0xb7, 0xee, 0xcf, 0x44, 0xaa, 0x98, 0x81, 0x05, 0x1c, 0x4e, 0x60, - 0x01, 0xa5, 0x19, 0x0a, 0x67, 0x80, 0x01, 0x3f, 0x9a, 0x0e, 0x06, 0x44, 0xb7, 0xeb, 0xe2, 0x33, - 0xe7, 0x43, 0x03, 0xb4, 0x08, 0x34, 0x40, 0x8e, 0xec, 0x5c, 0xb9, 0xfa, 0xb9, 0xe1, 0x80, 0x93, - 0x29, 0x70, 0x00, 0x6f, 0xdc, 0x6f, 0x44, 0x2a, 0x9f, 0x03, 0x0f, 0x38, 0x99, 0x82, 0x07, 0xa0, - 0x99, 0x6a, 0x67, 0x02, 0x02, 0xf7, 0xc2, 0x80, 0xc0, 0x4a, 0x44, 0xd5, 0xe9, 0x9f, 0xf6, 0x08, - 0x44, 0xe0, 0x34, 0x0a, 0x11, 0xe0, 0x5d, 0xfb, 0x0b, 0x91, 0x1a, 0x17, 0x80, 0x04, 0x0e, 0x27, - 0x20, 0x81, 0x2b, 0x33, 0x3c, 0x6d, 0x7e, 0x4c, 0x20, 0x25, 0xa7, 0xf7, 0x92, 0xd9, 0xac, 0x9c, - 0xe3, 0x68, 0xc0, 0x5e, 0x32, 0x9b, 0x97, 0x0b, 0xca, 0x73, 0xb4, 0x82, 0x19, 0x8b, 0x73, 0xb4, - 0x57, 0xc0, 0xb6, 0x6d, 0xda, 0xa2, 0xbb, 0xe7, 0x03, 0xe5, 0x06, 0xed, 0x11, 0xfd, 0x98, 0x76, - 0x09, 0x7e, 0xc0, 0x7a, 0xb2, 0x40, 0x1c, 0x53, 0x7e, 0x2f, 0xf9, 0xb2, 0x0c, 0x41, 0x08, 0xf6, - 0x97, 0x39, 0xd1, 0x5f, 0x06, 0x50, 0x85, 0x78, 0x18, 0x55, 0x58, 0x87, 0x3c, 0xed, 0xb5, 0xc6, - 0x00, 0x03, 0xdd, 0xf2, 0x00, 0x83, 0x9b, 0xb0, 0xcc, 0x12, 0x26, 0xc7, 0x1e, 0x44, 0x5a, 0x4a, - 0xb2, 0xb4, 0xb4, 0x44, 0x5f, 0x70, 0xeb, 0xf0, 0xfc, 0xf4, 0x22, 0xac, 0x04, 0x78, 0xbd, 0x1e, - 0x8e, 0x77, 0xcf, 0xb2, 0xc7, 0x5d, 0x15, 0xcd, 0xdc, 0x9f, 0x24, 0xdf, 0x42, 0x3e, 0xd2, 0x30, - 0x0d, 0x14, 0x90, 0xbe, 0x27, 0x50, 0x20, 0xfe, 0xc8, 0xa0, 0x40, 0xb0, 0x27, 0x4d, 0x84, 0x7b, - 0xd2, 0x7f, 0x48, 0xfe, 0x9e, 0x78, 0x2d, 0x7e, 0xcb, 0x6c, 0x63, 0xd1, 0x25, 0xb2, 0x67, 0x5a, - 0x92, 0xf4, 0xcc, 0x33, 0xd1, 0x0b, 0xd2, 0x47, 0xca, 0xe5, 0x25, 0x9e, 0x9c, 0xc8, 0x2b, 0x5e, - 0x83, 0xc9, 0x13, 0xbf, 0x68, 0x30, 0x65, 0x48, 0x3c, 0xc4, 0x1c, 0x2e, 0x2e, 0xa8, 0xf4, 0x91, - 0xf2, 0x31, 0xe7, 0x13, 0x09, 0x9c, 0x0f, 0xd0, 0xab, 0x90, 0x63, 0x60, 0xbf, 0x66, 0x5a, 0x8e, - 0x80, 0x88, 0x43, 0xa5, 0x0d, 0x47, 0xfc, 0x37, 0x8f, 0x28, 0xcf, 0xa1, 0xe5, 0xa8, 0x59, 0x4b, - 0x3c, 0x05, 0x2a, 0x8e, 0x5c, 0xa8, 0xe2, 0xb8, 0x0e, 0x39, 0xfa, 0xf5, 0x8e, 0xa5, 0xb7, 0x70, - 0x19, 0xd8, 0x87, 0xfa, 0x04, 0xe5, 0x77, 0x71, 0x58, 0x1a, 0x4b, 0x34, 0x53, 0xd7, 0xee, 0xba, - 0x64, 0x3c, 0x00, 0x79, 0xcc, 0x67, 0x8f, 0x35, 0x80, 0x33, 0xdd, 0xd1, 0x3e, 0xd4, 0x07, 0x04, - 0xb7, 0x85, 0x51, 0x02, 0x14, 0x54, 0x81, 0x2c, 0x1d, 0x0d, 0x1d, 0xdc, 0x16, 0xe8, 0x8b, 0x37, - 0x46, 0x0d, 0x48, 0xe3, 0x73, 0x3c, 0x20, 0x4e, 0x39, 0xc3, 0xb6, 0xfd, 0xea, 0x64, 0x3b, 0x4c, - 0x5f, 0xef, 0x94, 0xe9, 0x66, 0x7f, 0xfb, 0xd5, 0xba, 0xcc, 0xb9, 0x5f, 0x30, 0xfb, 0x06, 0xc1, - 0x7d, 0x8b, 0x5c, 0xa8, 0x42, 0x3e, 0x6c, 0x85, 0xec, 0x98, 0x15, 0x18, 0x0e, 0x58, 0x70, 0xdb, - 0x7b, 0x6a, 0x53, 0xc3, 0xb4, 0x0d, 0x72, 0xa1, 0x16, 0xfb, 0xb8, 0x6f, 0x99, 0x66, 0x4f, 0xe3, - 0x67, 0xbc, 0x0a, 0xa5, 0x70, 0x5e, 0x45, 0x4f, 0x41, 0xd1, 0xc6, 0x44, 0x37, 0x06, 0x5a, 0xa8, - 0x08, 0x2e, 0x70, 0x22, 0x3f, 0x53, 0x7b, 0xc9, 0xac, 0x24, 0xc7, 0xf7, 0x92, 0xd9, 0xb8, 0x9c, - 0x50, 0x8e, 0xe0, 0xca, 0xd4, 0xbc, 0x8a, 0x5e, 0x81, 0x9c, 0x9f, 0x92, 0x25, 0xb6, 0xda, 0x4b, - 0x90, 0x16, 0x9f, 0x57, 0xf9, 0x83, 0xe4, 0xab, 0x0c, 0x63, 0x37, 0x75, 0x48, 0xdb, 0xd8, 0x19, - 0xf6, 0x38, 0x9a, 0x52, 0xda, 0x7e, 0x71, 0xbe, 0x8c, 0x4c, 0xa9, 0xc3, 0x1e, 0x51, 0x85, 0xb0, - 0xf2, 0x2e, 0xa4, 0x39, 0x05, 0xe5, 0x21, 0x73, 0x72, 0x70, 0xff, 0xe0, 0xf0, 0xed, 0x03, 0x39, - 0x86, 0x00, 0xd2, 0xd5, 0x5a, 0xad, 0x7e, 0xd4, 0x94, 0x25, 0x94, 0x83, 0x54, 0x75, 0xe7, 0x50, - 0x6d, 0xca, 0x71, 0x4a, 0x56, 0xeb, 0x7b, 0xf5, 0x5a, 0x53, 0x4e, 0xa0, 0x65, 0x28, 0xf2, 0x67, - 0xed, 0xde, 0xa1, 0xfa, 0x66, 0xb5, 0x29, 0x27, 0x03, 0xa4, 0xe3, 0xfa, 0xc1, 0xdd, 0xba, 0x2a, - 0xa7, 0x94, 0xff, 0x81, 0x6b, 0x91, 0x39, 0xdc, 0x07, 0x66, 0xa4, 0x00, 0x30, 0xa3, 0x7c, 0x16, - 0xa7, 0x4d, 0x4d, 0x54, 0x62, 0x46, 0x7b, 0x63, 0x0b, 0xdf, 0x5e, 0x20, 0xab, 0x8f, 0xad, 0x9e, - 0xf6, 0x31, 0x36, 0xee, 0x60, 0xd2, 0xea, 0xf2, 0x42, 0x81, 0x47, 0xa0, 0xa2, 0x5a, 0x14, 0x54, - 0x26, 0xe4, 0x70, 0xb6, 0xf7, 0x71, 0x8b, 0x68, 0xdc, 0x89, 0x1c, 0xd6, 0x4c, 0xe4, 0x28, 0x1b, - 0xa5, 0x1e, 0x73, 0xa2, 0xf2, 0xde, 0x42, 0xb6, 0xcc, 0x41, 0x4a, 0xad, 0x37, 0xd5, 0x77, 0xe4, - 0x04, 0x42, 0x50, 0x62, 0x8f, 0xda, 0xf1, 0x41, 0xf5, 0xe8, 0xb8, 0x71, 0x48, 0x6d, 0xb9, 0x02, - 0x4b, 0xae, 0x2d, 0x5d, 0x62, 0x4a, 0x79, 0x1e, 0x1e, 0x8b, 0xa8, 0x2a, 0x26, 0x5b, 0x2a, 0xe5, - 0x37, 0x52, 0x90, 0x3b, 0x5c, 0x19, 0x1c, 0x42, 0xda, 0x21, 0x3a, 0x19, 0x3a, 0xc2, 0x88, 0xaf, - 0xcc, 0x5b, 0x66, 0x6c, 0xba, 0x0f, 0xc7, 0x4c, 0x5c, 0x15, 0x6a, 0x94, 0xdb, 0x50, 0x0a, 0xbf, - 0x89, 0xb6, 0x81, 0xef, 0x44, 0x71, 0xe5, 0x0e, 0xa0, 0xc9, 0xea, 0x63, 0x4a, 0x7b, 0x29, 0x4d, - 0x6b, 0x2f, 0x7f, 0x2b, 0xc1, 0xe3, 0x97, 0x54, 0x1a, 0xe8, 0xad, 0xb1, 0x45, 0xbe, 0xb6, 0x48, - 0x9d, 0xb2, 0xc9, 0x69, 0x63, 0xcb, 0xbc, 0x05, 0x85, 0x20, 0x7d, 0xbe, 0x45, 0x7e, 0x1b, 0xf7, - 0x0f, 0x71, 0xb8, 0x0f, 0xf6, 0x43, 0xa0, 0xf4, 0x1d, 0x43, 0xe0, 0xeb, 0x00, 0x64, 0xa4, 0x71, - 0xb7, 0x76, 0xf3, 0xe8, 0x13, 0x53, 0xf0, 0x45, 0xdc, 0x6a, 0x8e, 0xc4, 0x21, 0xc8, 0x11, 0xf1, - 0xe4, 0xa0, 0xe3, 0x20, 0x28, 0x30, 0x64, 0x39, 0xd6, 0x11, 0x0d, 0xf3, 0xbc, 0xc9, 0xd8, 0x07, - 0x0f, 0x38, 0xd9, 0x41, 0xef, 0xc0, 0x63, 0x63, 0x85, 0x82, 0xa7, 0x3a, 0x39, 0x6f, 0xbd, 0x70, - 0x25, 0x5c, 0x2f, 0xb8, 0xaa, 0x83, 0xd9, 0x3e, 0x15, 0xce, 0xf6, 0xef, 0x00, 0xf8, 0xe0, 0x00, - 0x8d, 0x30, 0xb6, 0x39, 0x1c, 0xb4, 0x99, 0x07, 0xa4, 0x54, 0x3e, 0x40, 0xb7, 0x21, 0x45, 0x3d, - 0xc9, 0xb5, 0xd3, 0x64, 0x28, 0xa6, 0x9e, 0x10, 0x00, 0x17, 0x38, 0xb7, 0x62, 0x00, 0x9a, 0x04, - 0x68, 0x23, 0xa6, 0x78, 0x23, 0x3c, 0xc5, 0x93, 0x91, 0x50, 0xef, 0xf4, 0xa9, 0x3e, 0x82, 0x14, - 0xdb, 0x79, 0x9a, 0x74, 0xd9, 0x5f, 0x01, 0x51, 0x2d, 0xd2, 0x67, 0xf4, 0x63, 0x00, 0x9d, 0x10, - 0xdb, 0x38, 0x1d, 0xfa, 0x13, 0xac, 0x4f, 0xf7, 0x9c, 0xaa, 0xcb, 0xb7, 0x73, 0x5d, 0xb8, 0xd0, - 0xaa, 0x2f, 0x1a, 0x70, 0xa3, 0x80, 0x42, 0xe5, 0x00, 0x4a, 0x61, 0x59, 0xb7, 0xbe, 0xe1, 0xdf, - 0x10, 0xae, 0x6f, 0x78, 0xb9, 0x2a, 0xea, 0x1b, 0xaf, 0x3a, 0x4a, 0xf0, 0x5f, 0x1f, 0x6c, 0xa0, - 0xfc, 0x24, 0x0e, 0x85, 0xa0, 0xe3, 0xfd, 0xe7, 0x95, 0x20, 0xca, 0xcf, 0x25, 0xc8, 0x7a, 0xcb, - 0x0f, 0xff, 0x07, 0x09, 0xfd, 0x38, 0xe2, 0xd6, 0x8b, 0x07, 0x7f, 0x5e, 0xf0, 0xdf, 0x44, 0x09, - 0xef, 0x37, 0xd1, 0x1d, 0x2f, 0xfd, 0x45, 0x01, 0x22, 0x41, 0x5b, 0x0b, 0xaf, 0x72, 0xb3, 0xfd, - 0x1d, 0xc8, 0x79, 0xa7, 0x97, 0x36, 0x1d, 0x2e, 0x70, 0x24, 0x89, 0x33, 0x24, 0x60, 0xbf, 0x55, - 0x48, 0x59, 0xe6, 0x87, 0xe2, 0xcf, 0x48, 0x42, 0xe5, 0x03, 0xa5, 0x0d, 0x4b, 0x63, 0x47, 0x1f, - 0xdd, 0x81, 0x8c, 0x35, 0x3c, 0xd5, 0x5c, 0xe7, 0x18, 0x83, 0xd7, 0xdc, 0x72, 0x76, 0x78, 0xda, - 0x33, 0x5a, 0xf7, 0xf1, 0x85, 0xfb, 0x31, 0xd6, 0xf0, 0xf4, 0x3e, 0xf7, 0x21, 0x3e, 0x4b, 0x3c, - 0x38, 0xcb, 0x2f, 0x25, 0xc8, 0xba, 0x67, 0x02, 0xfd, 0x1f, 0xe4, 0xbc, 0xb0, 0xe2, 0xfd, 0xda, - 0x8c, 0x8c, 0x47, 0x42, 0xbf, 0x2f, 0x82, 0xaa, 0xee, 0x3f, 0x59, 0xa3, 0xad, 0x75, 0x7a, 0x3a, - 0xf7, 0xa5, 0x52, 0xd8, 0x66, 0x3c, 0xf0, 0xb0, 0x78, 0xbc, 0x7b, 0xf7, 0x5e, 0x4f, 0x3f, 0x53, - 0xf3, 0x4c, 0x66, 0xb7, 0x4d, 0x07, 0xa2, 0xb2, 0xfb, 0xbb, 0x04, 0xf2, 0xf8, 0x89, 0xfd, 0xce, - 0x5f, 0x37, 0x99, 0xe6, 0x12, 0x53, 0xd2, 0x1c, 0xda, 0x82, 0x15, 0x8f, 0x43, 0x73, 0x8c, 0xb3, - 0x81, 0x4e, 0x86, 0x36, 0x16, 0x80, 0x24, 0xf2, 0x5e, 0x1d, 0xbb, 0x6f, 0x26, 0x57, 0x9d, 0x7a, - 0xc4, 0x55, 0x7f, 0x1c, 0x87, 0x7c, 0x00, 0x1e, 0x45, 0xff, 0x1b, 0x08, 0x46, 0xa5, 0x29, 0x99, - 0x21, 0xc0, 0xeb, 0xff, 0xa6, 0x0c, 0x9b, 0x29, 0xbe, 0xb8, 0x99, 0xa2, 0x40, 0x68, 0x17, 0x6d, - 0x4d, 0x2e, 0x8c, 0xb6, 0xbe, 0x00, 0x88, 0x98, 0x44, 0xef, 0x69, 0xe7, 0x26, 0x31, 0x06, 0x67, - 0x1a, 0x77, 0x43, 0x1e, 0x3a, 0x64, 0xf6, 0xe6, 0x01, 0x7b, 0x71, 0xc4, 0x3c, 0xf2, 0xa7, 0x12, - 0x64, 0xbd, 0xb2, 0x7b, 0xd1, 0x9f, 0x98, 0x57, 0x21, 0x2d, 0x2a, 0x4b, 0xfe, 0x17, 0x53, 0x8c, - 0xa6, 0xc2, 0xca, 0x15, 0xc8, 0xf6, 0x31, 0xd1, 0x59, 0x1c, 0xe4, 0x59, 0xcd, 0x1b, 0xdf, 0x7c, - 0x0d, 0xf2, 0x81, 0x1f, 0xc0, 0x34, 0x34, 0x1e, 0xd4, 0xdf, 0x96, 0x63, 0x95, 0xcc, 0x27, 0x9f, - 0x6f, 0x24, 0x0e, 0xf0, 0x87, 0xf4, 0x34, 0xab, 0xf5, 0x5a, 0xa3, 0x5e, 0xbb, 0x2f, 0x4b, 0x95, - 0xfc, 0x27, 0x9f, 0x6f, 0x64, 0x54, 0xcc, 0x10, 0xc5, 0x9b, 0xf7, 0x61, 0x69, 0x6c, 0x63, 0xc2, - 0x65, 0x0b, 0x82, 0xd2, 0xdd, 0x93, 0xa3, 0xfd, 0xdd, 0x5a, 0xb5, 0x59, 0xd7, 0x1e, 0x1c, 0x36, - 0xeb, 0xb2, 0x84, 0x1e, 0x83, 0x95, 0xfd, 0xdd, 0xff, 0x6f, 0x34, 0xb5, 0xda, 0xfe, 0x6e, 0xfd, - 0xa0, 0xa9, 0x55, 0x9b, 0xcd, 0x6a, 0xed, 0xbe, 0x1c, 0xdf, 0xfe, 0x3c, 0x0f, 0xc9, 0xea, 0x4e, - 0x6d, 0x17, 0xd5, 0x20, 0xc9, 0xa0, 0x90, 0x4b, 0x6f, 0x80, 0x55, 0x2e, 0xc7, 0x86, 0xd1, 0x3d, - 0x48, 0x31, 0x94, 0x04, 0x5d, 0x7e, 0x25, 0xac, 0x32, 0x03, 0x2c, 0xa6, 0x1f, 0xc3, 0x4e, 0xe4, - 0xa5, 0x77, 0xc4, 0x2a, 0x97, 0x63, 0xc7, 0x68, 0x1f, 0x32, 0x6e, 0x93, 0x3c, 0xeb, 0xe2, 0x56, - 0x65, 0x26, 0xa0, 0x4b, 0x97, 0xc6, 0xc1, 0x86, 0xcb, 0xaf, 0x8f, 0x55, 0x66, 0xa0, 0xca, 0x68, - 0x17, 0xd2, 0xa2, 0x1d, 0x9d, 0x71, 0x23, 0xac, 0x32, 0x0b, 0x27, 0x46, 0x2a, 0xe4, 0x7c, 0x18, - 0x67, 0xf6, 0xa5, 0xb8, 0xca, 0x1c, 0x80, 0x39, 0x7a, 0x17, 0x8a, 0xe1, 0x56, 0x77, 0xbe, 0x5b, - 0x67, 0x95, 0x39, 0x11, 0x69, 0xaa, 0x3f, 0xdc, 0xf7, 0xce, 0x77, 0x0b, 0xad, 0x32, 0x27, 0x40, - 0x8d, 0xde, 0x87, 0xe5, 0xc9, 0xbe, 0x74, 0xfe, 0x4b, 0x69, 0x95, 0x05, 0x20, 0x6b, 0xd4, 0x07, - 0x34, 0xa5, 0x9f, 0x5d, 0xe0, 0x8e, 0x5a, 0x65, 0x11, 0x04, 0x1b, 0xb5, 0x61, 0x69, 0xbc, 0x49, - 0x9c, 0xf7, 0xce, 0x5a, 0x65, 0x6e, 0x34, 0x9b, 0xcf, 0x12, 0x6e, 0x2e, 0xe7, 0xbd, 0xc3, 0x56, - 0x99, 0x1b, 0xdc, 0x46, 0x27, 0x00, 0x81, 0xfe, 0x70, 0x8e, 0x3b, 0x6d, 0x95, 0x79, 0x60, 0x6e, - 0x64, 0xc1, 0xca, 0xb4, 0xc6, 0x71, 0x91, 0x2b, 0x6e, 0x95, 0x85, 0xd0, 0x6f, 0xea, 0xcf, 0xe1, - 0x16, 0x70, 0xbe, 0x2b, 0x6f, 0x95, 0x39, 0x61, 0xf0, 0x9d, 0xea, 0x17, 0x5f, 0xaf, 0x49, 0x5f, - 0x7e, 0xbd, 0x26, 0xfd, 0xed, 0xeb, 0x35, 0xe9, 0xd3, 0x6f, 0xd6, 0x62, 0x5f, 0x7e, 0xb3, 0x16, - 0xfb, 0xcb, 0x37, 0x6b, 0xb1, 0x1f, 0x3c, 0x7b, 0x66, 0x90, 0xee, 0xf0, 0x74, 0xb3, 0x65, 0xf6, - 0xb7, 0x5a, 0x66, 0x1f, 0x93, 0xd3, 0x0e, 0xf1, 0x1f, 0xfc, 0x9b, 0xcb, 0xa7, 0x69, 0x96, 0x41, - 0x6f, 0xfd, 0x33, 0x00, 0x00, 0xff, 0xff, 0x64, 0xd0, 0x90, 0x6e, 0xd9, 0x2c, 0x00, 0x00, + // 3330 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0xcd, 0x73, 0x23, 0xc5, + 0x15, 0xd7, 0xe8, 0xcb, 0xd2, 0xd3, 0x87, 0xc7, 0x6d, 0xaf, 0xd1, 0x8a, 0x5d, 0xdb, 0x0c, 0x05, + 0xec, 0x2e, 0x60, 0x13, 0x6f, 0x96, 0x8f, 0x5a, 0x48, 0x45, 0xd6, 0x6a, 0x91, 0xbd, 0xc6, 0x36, + 0x63, 0x79, 0x29, 0xf2, 0xc1, 0x30, 0x92, 0xda, 0xd2, 0xb0, 0x92, 0x66, 0x98, 0x19, 0x79, 0x65, + 0x4e, 0x54, 0x48, 0xaa, 0x52, 0x9c, 0xa8, 0xe2, 0xc2, 0x21, 0x1c, 0x72, 0xc8, 0x25, 0x7f, 0x41, + 0x4e, 0xb9, 0x24, 0x07, 0x0e, 0x39, 0x70, 0xcc, 0x89, 0xa4, 0xe0, 0x14, 0xae, 0x39, 0xe4, 0x9a, + 0xea, 0x8f, 0xf9, 0x92, 0x66, 0x2c, 0x69, 0x21, 0x87, 0x54, 0x72, 0x9b, 0x7e, 0xf3, 0xde, 0xeb, + 0xe9, 0xd7, 0xaf, 0xdf, 0xc7, 0x6f, 0x1a, 0x1e, 0xb7, 0xf1, 0xa0, 0x8d, 0xcd, 0xbe, 0x36, 0xb0, + 0xb7, 0xd4, 0x66, 0x4b, 0xdb, 0xb2, 0xcf, 0x0d, 0x6c, 0x6d, 0x1a, 0xa6, 0x6e, 0xeb, 0x68, 0xd1, + 0x7b, 0xb9, 0x49, 0x5e, 0x96, 0xaf, 0xfa, 0xb8, 0x5b, 0xe6, 0xb9, 0x61, 0xeb, 0x5b, 0x86, 0xa9, + 0xeb, 0xa7, 0x8c, 0xbf, 0x7c, 0x65, 0xf2, 0xf5, 0x03, 0x7c, 0xce, 0xb5, 0x05, 0x84, 0xe9, 0x2c, + 0x5b, 0x86, 0x6a, 0xaa, 0x7d, 0xe7, 0xf5, 0xc6, 0xc4, 0xeb, 0x33, 0xb5, 0xa7, 0xb5, 0x55, 0x5b, + 0x37, 0x39, 0xc7, 0x7a, 0x47, 0xd7, 0x3b, 0x3d, 0xbc, 0x45, 0x47, 0xcd, 0xe1, 0xe9, 0x96, 0xad, + 0xf5, 0xb1, 0x65, 0xab, 0x7d, 0x83, 0x33, 0xac, 0x74, 0xf4, 0x8e, 0x4e, 0x1f, 0xb7, 0xc8, 0x53, + 0xc8, 0xbc, 0xba, 0xa9, 0xb6, 0x7a, 0xd8, 0xbf, 0x48, 0xe9, 0x53, 0x80, 0x05, 0x19, 0xbf, 0x3f, + 0xc4, 0x96, 0x8d, 0xb6, 0x21, 0x89, 0x5b, 0x5d, 0xbd, 0x24, 0x6c, 0x08, 0xd7, 0x72, 0xdb, 0x57, + 0x36, 0xc7, 0xd6, 0xbf, 0xc9, 0xf9, 0x6a, 0xad, 0xae, 0x5e, 0x8f, 0xc9, 0x94, 0x17, 0xdd, 0x82, + 0xd4, 0x69, 0x6f, 0x68, 0x75, 0x4b, 0x71, 0x2a, 0x74, 0x35, 0x4a, 0xe8, 0x2e, 0x61, 0xaa, 0xc7, + 0x64, 0xc6, 0x4d, 0xa6, 0xd2, 0x06, 0xa7, 0x7a, 0x29, 0x71, 0xf1, 0x54, 0xbb, 0x83, 0x53, 0x3a, + 0x15, 0xe1, 0x45, 0x3b, 0x00, 0xda, 0x40, 0xb3, 0x95, 0x56, 0x57, 0xd5, 0x06, 0xa5, 0x14, 0x95, + 0x7c, 0x22, 0x5a, 0x52, 0xb3, 0xab, 0x84, 0xb1, 0x1e, 0x93, 0xb3, 0x9a, 0x33, 0x20, 0x9f, 0xfb, + 0xfe, 0x10, 0x9b, 0xe7, 0xa5, 0xf4, 0xc5, 0x9f, 0xfb, 0x26, 0x61, 0x22, 0x9f, 0x4b, 0xb9, 0xd1, + 0xab, 0x90, 0x69, 0x75, 0x71, 0xeb, 0x81, 0x62, 0x8f, 0x4a, 0x19, 0x2a, 0xb9, 0x1e, 0x25, 0x59, + 0x25, 0x7c, 0x8d, 0x51, 0x3d, 0x26, 0x2f, 0xb4, 0xd8, 0x23, 0x7a, 0x19, 0xd2, 0x2d, 0xbd, 0xdf, + 0xd7, 0xec, 0x52, 0x8e, 0xca, 0xae, 0x45, 0xca, 0x52, 0xae, 0x7a, 0x4c, 0xe6, 0xfc, 0xe8, 0x00, + 0x8a, 0x3d, 0xcd, 0xb2, 0x15, 0x6b, 0xa0, 0x1a, 0x56, 0x57, 0xb7, 0xad, 0x52, 0x9e, 0x6a, 0x78, + 0x2a, 0x4a, 0xc3, 0xbe, 0x66, 0xd9, 0xc7, 0x0e, 0x73, 0x3d, 0x26, 0x17, 0x7a, 0x7e, 0x02, 0xd1, + 0xa7, 0x9f, 0x9e, 0x62, 0xd3, 0x55, 0x58, 0x2a, 0x5c, 0xac, 0xef, 0x90, 0x70, 0x3b, 0xf2, 0x44, + 0x9f, 0xee, 0x27, 0xa0, 0x9f, 0xc2, 0x72, 0x4f, 0x57, 0xdb, 0xae, 0x3a, 0xa5, 0xd5, 0x1d, 0x0e, + 0x1e, 0x94, 0x8a, 0x54, 0xe9, 0xf5, 0xc8, 0x8f, 0xd4, 0xd5, 0xb6, 0xa3, 0xa2, 0x4a, 0x04, 0xea, + 0x31, 0x79, 0xa9, 0x37, 0x4e, 0x44, 0xef, 0xc0, 0x8a, 0x6a, 0x18, 0xbd, 0xf3, 0x71, 0xed, 0x8b, + 0x54, 0xfb, 0x8d, 0x28, 0xed, 0x15, 0x22, 0x33, 0xae, 0x1e, 0xa9, 0x13, 0x54, 0xd4, 0x00, 0xd1, + 0x30, 0xb1, 0xa1, 0x9a, 0x58, 0x31, 0x4c, 0xdd, 0xd0, 0x2d, 0xb5, 0x57, 0x12, 0xa9, 0xee, 0x67, + 0xa2, 0x74, 0x1f, 0x31, 0xfe, 0x23, 0xce, 0x5e, 0x8f, 0xc9, 0x8b, 0x46, 0x90, 0xc4, 0xb4, 0xea, + 0x2d, 0x6c, 0x59, 0x9e, 0xd6, 0xa5, 0x69, 0x5a, 0x29, 0x7f, 0x50, 0x6b, 0x80, 0x84, 0x6a, 0x90, + 0xc3, 0x23, 0x22, 0xae, 0x9c, 0xe9, 0x36, 0x2e, 0x21, 0xaa, 0x50, 0x8a, 0x3c, 0xa1, 0x94, 0xf5, + 0xbe, 0x6e, 0xe3, 0x7a, 0x4c, 0x06, 0xec, 0x8e, 0x90, 0x0a, 0x97, 0xce, 0xb0, 0xa9, 0x9d, 0x9e, + 0x53, 0x35, 0x0a, 0x7d, 0x63, 0x69, 0xfa, 0xa0, 0xb4, 0x4c, 0x15, 0x3e, 0x1b, 0xa5, 0xf0, 0x3e, + 0x15, 0x22, 0x2a, 0x6a, 0x8e, 0x48, 0x3d, 0x26, 0x2f, 0x9f, 0x4d, 0x92, 0x89, 0x8b, 0x9d, 0x6a, + 0x03, 0xb5, 0xa7, 0x7d, 0x80, 0x95, 0x66, 0x4f, 0x6f, 0x3d, 0x28, 0xad, 0x5c, 0xec, 0x62, 0x77, + 0x39, 0xf7, 0x0e, 0x61, 0x26, 0x2e, 0x76, 0xea, 0x27, 0x20, 0x19, 0x44, 0x4b, 0xeb, 0x0c, 0x94, + 0x8e, 0x6e, 0x59, 0x9a, 0xc1, 0x96, 0x7f, 0x89, 0x6a, 0x7c, 0x3a, 0x4a, 0xe3, 0xb1, 0xd6, 0x19, + 0xbc, 0x4e, 0xd9, 0xb9, 0x09, 0x8a, 0x56, 0x80, 0xb2, 0xb3, 0x00, 0xa9, 0x33, 0xb5, 0x37, 0xc4, + 0x7b, 0xc9, 0x4c, 0x52, 0x4c, 0xed, 0x25, 0x33, 0x0b, 0x62, 0x66, 0x2f, 0x99, 0xc9, 0x8a, 0xb0, + 0x97, 0xcc, 0x80, 0x98, 0x93, 0x9e, 0x81, 0x9c, 0x2f, 0xd8, 0xa1, 0x12, 0x2c, 0xf4, 0xb1, 0x65, + 0xa9, 0x1d, 0x4c, 0x63, 0x63, 0x56, 0x76, 0x86, 0x52, 0x11, 0xf2, 0xfe, 0x00, 0x27, 0x7d, 0x22, + 0xb8, 0x92, 0x24, 0x76, 0x11, 0xc9, 0x33, 0x6c, 0x52, 0x13, 0x73, 0x49, 0x3e, 0x44, 0x4f, 0x42, + 0x81, 0x9a, 0x47, 0x71, 0xde, 0x93, 0x00, 0x9a, 0x94, 0xf3, 0x94, 0x78, 0x9f, 0x33, 0xad, 0x43, + 0xce, 0xd8, 0x36, 0x5c, 0x96, 0x04, 0x65, 0x01, 0x63, 0xdb, 0x70, 0x18, 0x9e, 0x80, 0x3c, 0x59, + 0xb9, 0xcb, 0x91, 0xa4, 0x93, 0xe4, 0x08, 0x8d, 0xb3, 0x48, 0x7f, 0x89, 0x83, 0x38, 0x1e, 0x14, + 0xd1, 0xcb, 0x90, 0x24, 0xe9, 0x83, 0x87, 0xfa, 0xf2, 0x26, 0xcb, 0x2d, 0x9b, 0x4e, 0x6e, 0xd9, + 0x6c, 0x38, 0xb9, 0x65, 0x27, 0xf3, 0xc5, 0x57, 0xeb, 0xb1, 0x4f, 0xfe, 0xb6, 0x2e, 0xc8, 0x54, + 0x02, 0x5d, 0x26, 0xa1, 0x50, 0xd5, 0x06, 0x8a, 0xd6, 0xa6, 0x9f, 0x9c, 0x25, 0x71, 0x4e, 0xd5, + 0x06, 0xbb, 0x6d, 0xb4, 0x0f, 0x62, 0x4b, 0x1f, 0x58, 0x78, 0x60, 0x0d, 0x2d, 0x85, 0x65, 0x37, + 0x1e, 0xe0, 0x03, 0x61, 0x9a, 0xa5, 0x9f, 0xaa, 0xc3, 0x79, 0x44, 0x19, 0xe5, 0xc5, 0x56, 0x90, + 0x80, 0xee, 0x02, 0xb8, 0x29, 0xd0, 0x2a, 0x25, 0x37, 0x12, 0xd7, 0x72, 0xdb, 0x1b, 0x13, 0x5b, + 0x7e, 0xdf, 0x61, 0x39, 0x31, 0xda, 0xaa, 0x8d, 0x77, 0x92, 0xe4, 0x73, 0x65, 0x9f, 0x24, 0x7a, + 0x1a, 0x16, 0x55, 0xc3, 0x50, 0x2c, 0x5b, 0xb5, 0xb1, 0xd2, 0x3c, 0xb7, 0xb1, 0x45, 0x73, 0x47, + 0x5e, 0x2e, 0xa8, 0x86, 0x71, 0x4c, 0xa8, 0x3b, 0x84, 0x88, 0x9e, 0x82, 0x22, 0xc9, 0x13, 0x9a, + 0xda, 0x53, 0xba, 0x58, 0xeb, 0x74, 0x6d, 0x9a, 0x23, 0x12, 0x72, 0x81, 0x53, 0xeb, 0x94, 0x28, + 0xb5, 0xdd, 0x1d, 0xa7, 0x39, 0x02, 0x21, 0x48, 0xb6, 0x55, 0x5b, 0xa5, 0x96, 0xcc, 0xcb, 0xf4, + 0x99, 0xd0, 0x0c, 0xd5, 0xee, 0x72, 0xfb, 0xd0, 0x67, 0xb4, 0x0a, 0x69, 0xae, 0x36, 0x41, 0xd5, + 0xf2, 0x11, 0x5a, 0x81, 0x94, 0x61, 0xea, 0x67, 0x98, 0x6e, 0x5d, 0x46, 0x66, 0x03, 0x49, 0x86, + 0x62, 0x30, 0x9f, 0xa0, 0x22, 0xc4, 0xed, 0x11, 0x9f, 0x25, 0x6e, 0x8f, 0xd0, 0x0b, 0x90, 0x24, + 0x86, 0xa4, 0x73, 0x14, 0x43, 0x32, 0x28, 0x97, 0x6b, 0x9c, 0x1b, 0x58, 0xa6, 0x9c, 0xd2, 0x22, + 0x14, 0x02, 0x79, 0x46, 0x5a, 0x85, 0x95, 0xb0, 0xb4, 0x21, 0x75, 0x5d, 0x7a, 0x20, 0xfc, 0xa3, + 0x5b, 0x90, 0x71, 0xf3, 0x06, 0x73, 0x9c, 0xcb, 0x13, 0xd3, 0x3a, 0xcc, 0xb2, 0xcb, 0x4a, 0x3c, + 0x86, 0x6c, 0x40, 0x57, 0xe5, 0x55, 0x42, 0x5e, 0x5e, 0x50, 0x0d, 0xa3, 0xae, 0x5a, 0x5d, 0xe9, + 0x5d, 0x28, 0x45, 0xe5, 0x04, 0x9f, 0xc1, 0x04, 0xea, 0xf6, 0x8e, 0xc1, 0x56, 0x21, 0x7d, 0xaa, + 0x9b, 0x7d, 0xd5, 0xa6, 0xca, 0x0a, 0x32, 0x1f, 0x11, 0x43, 0xb2, 0xfc, 0x90, 0xa0, 0x64, 0x36, + 0x90, 0x14, 0xb8, 0x1c, 0x99, 0x17, 0x88, 0x88, 0x36, 0x68, 0x63, 0x66, 0xd6, 0x82, 0xcc, 0x06, + 0x9e, 0x22, 0xf6, 0xb1, 0x6c, 0x40, 0xa6, 0xb5, 0xe8, 0x5a, 0xa9, 0xfe, 0xac, 0xcc, 0x47, 0xd2, + 0x67, 0x09, 0x58, 0x0d, 0xcf, 0x0e, 0x68, 0x03, 0xf2, 0x7d, 0x75, 0xa4, 0xd8, 0x23, 0xee, 0x76, + 0x02, 0xdd, 0x78, 0xe8, 0xab, 0xa3, 0xc6, 0x88, 0xf9, 0x9c, 0x08, 0x09, 0x7b, 0x64, 0x95, 0xe2, + 0x1b, 0x89, 0x6b, 0x79, 0x99, 0x3c, 0xa2, 0x13, 0x58, 0xea, 0xe9, 0x2d, 0xb5, 0xa7, 0xf4, 0x54, + 0xcb, 0x56, 0x78, 0xd9, 0xc0, 0x0e, 0xd1, 0x93, 0x13, 0xc6, 0x66, 0x71, 0x1e, 0xb7, 0xd9, 0x7e, + 0x92, 0x80, 0xc3, 0xfd, 0x7f, 0x91, 0xea, 0xd8, 0x57, 0x9d, 0xad, 0x46, 0x77, 0x20, 0xd7, 0xd7, + 0xac, 0x26, 0xee, 0xaa, 0x67, 0x9a, 0x6e, 0xf2, 0xd3, 0x34, 0xe9, 0x34, 0x6f, 0x78, 0x3c, 0x5c, + 0x93, 0x5f, 0xcc, 0xb7, 0x25, 0xa9, 0x80, 0x0f, 0x3b, 0xd1, 0x24, 0x3d, 0x77, 0x34, 0x79, 0x01, + 0x56, 0x06, 0x78, 0x64, 0x2b, 0xde, 0x79, 0x65, 0x7e, 0xb2, 0x40, 0x4d, 0x8f, 0xc8, 0x3b, 0xf7, + 0x84, 0x5b, 0xc4, 0x65, 0xd0, 0x75, 0x9a, 0x5f, 0x0d, 0xdd, 0xc2, 0xa6, 0xa2, 0xb6, 0xdb, 0x26, + 0xb6, 0x2c, 0x5a, 0x92, 0xe5, 0x69, 0xd2, 0xa4, 0xf4, 0x0a, 0x23, 0x4b, 0xbf, 0xf6, 0x6f, 0x4d, + 0x30, 0x9f, 0x72, 0xc3, 0x0b, 0x9e, 0xe1, 0x8f, 0x61, 0x85, 0xcb, 0xb7, 0x03, 0xb6, 0x67, 0x75, + 0xed, 0xe3, 0x93, 0xe7, 0x6b, 0xdc, 0xe6, 0xc8, 0x11, 0x8f, 0x36, 0x7b, 0xe2, 0xd1, 0xcc, 0x8e, + 0x20, 0x49, 0x8d, 0x92, 0x64, 0x21, 0x86, 0x3c, 0xff, 0xb7, 0x6d, 0xc5, 0x47, 0x09, 0x58, 0x9a, + 0x28, 0x4e, 0xdc, 0x85, 0x09, 0xa1, 0x0b, 0x8b, 0x87, 0x2e, 0x2c, 0x31, 0xf7, 0xc2, 0xf8, 0x5e, + 0x27, 0xa7, 0xef, 0x75, 0xea, 0x7b, 0xdc, 0xeb, 0xf4, 0xa3, 0xed, 0xf5, 0x7f, 0x74, 0x17, 0x7e, + 0x23, 0x40, 0x39, 0xba, 0xa2, 0x0b, 0xdd, 0x8e, 0x67, 0x61, 0xc9, 0xfd, 0x14, 0x57, 0x3d, 0x0b, + 0x8c, 0xa2, 0xfb, 0x82, 0xeb, 0x8f, 0xcc, 0x71, 0x4f, 0x41, 0x71, 0xac, 0xde, 0x64, 0xae, 0x5c, + 0x38, 0xf3, 0xcf, 0x2f, 0xfd, 0x32, 0xe1, 0x26, 0x9e, 0x40, 0x51, 0x18, 0x72, 0x5a, 0xdf, 0x84, + 0xe5, 0x36, 0x6e, 0x69, 0xed, 0x47, 0x3d, 0xac, 0x4b, 0x5c, 0xfa, 0xff, 0x67, 0x75, 0xd2, 0x4b, + 0xfe, 0x24, 0xc0, 0xa5, 0xd0, 0x4a, 0x1a, 0xfd, 0x18, 0xf2, 0xbe, 0x32, 0x9c, 0x6d, 0xc8, 0x58, + 0x13, 0xcd, 0x20, 0x86, 0x4d, 0x4f, 0x48, 0xce, 0x75, 0xdc, 0x67, 0x8b, 0xd4, 0xab, 0x1d, 0xd3, + 0x68, 0x05, 0x3c, 0x29, 0x2b, 0xe7, 0x08, 0xcd, 0x71, 0xa2, 0xeb, 0x20, 0x5a, 0xc3, 0xa6, 0xda, + 0x6a, 0xe9, 0xc3, 0x81, 0xad, 0xf4, 0xd4, 0x26, 0xee, 0xf1, 0x94, 0xbb, 0xe8, 0xd1, 0xf7, 0x09, + 0x19, 0x95, 0x21, 0x63, 0xa8, 0x96, 0xf5, 0x50, 0x37, 0xdb, 0xbc, 0xf2, 0x75, 0xc7, 0xd2, 0x3f, + 0x00, 0x32, 0x32, 0xb6, 0x0c, 0x52, 0x55, 0xa2, 0x1d, 0xc8, 0xe2, 0x51, 0x0b, 0x1b, 0xb6, 0x53, + 0x88, 0x87, 0x37, 0x4f, 0x8c, 0xbb, 0xe6, 0x70, 0xd6, 0x63, 0xb2, 0x27, 0x86, 0x6e, 0x72, 0x74, + 0x24, 0x1a, 0xe8, 0xe0, 0xe2, 0x7e, 0x78, 0xe4, 0x45, 0x07, 0x1e, 0x49, 0x44, 0x76, 0xfe, 0x4c, + 0x6a, 0x0c, 0x1f, 0xb9, 0xc9, 0xf1, 0x91, 0xe4, 0x94, 0xc9, 0x02, 0x00, 0x49, 0x35, 0x00, 0x90, + 0xa4, 0xa7, 0x2c, 0x33, 0x02, 0x21, 0x79, 0xd1, 0x41, 0x48, 0x16, 0xa6, 0x7c, 0xf1, 0x18, 0x44, + 0xf2, 0x9a, 0x0f, 0x22, 0xc9, 0x52, 0xd1, 0x8d, 0x48, 0xd1, 0x10, 0x8c, 0xe4, 0x15, 0x17, 0x23, + 0xc9, 0x47, 0xe2, 0x2b, 0x5c, 0x78, 0x1c, 0x24, 0x39, 0x9c, 0x00, 0x49, 0x0a, 0x91, 0xfd, 0x21, + 0x53, 0x31, 0x05, 0x25, 0x39, 0x9c, 0x40, 0x49, 0x8a, 0x53, 0x14, 0x4e, 0x81, 0x49, 0x7e, 0x16, + 0x0e, 0x93, 0x44, 0x03, 0x19, 0xfc, 0x33, 0x67, 0xc3, 0x49, 0x94, 0x08, 0x9c, 0x44, 0x8c, 0xec, + 0xe9, 0x99, 0xfa, 0x99, 0x81, 0x92, 0x93, 0x10, 0xa0, 0x84, 0x41, 0x1a, 0xd7, 0x22, 0x95, 0xcf, + 0x80, 0x94, 0x9c, 0x84, 0x20, 0x25, 0x68, 0xaa, 0xda, 0xa9, 0x50, 0xc9, 0xdd, 0x20, 0x54, 0xb2, + 0x1c, 0x51, 0x3b, 0x7b, 0xa7, 0x3d, 0x02, 0x2b, 0x69, 0x46, 0x61, 0x25, 0x0c, 0xcf, 0x78, 0x2e, + 0x52, 0xe3, 0x1c, 0x60, 0xc9, 0xe1, 0x04, 0x58, 0x72, 0x69, 0x8a, 0xa7, 0x4d, 0x41, 0x4b, 0x8e, + 0x43, 0xd0, 0x92, 0xd5, 0x48, 0xf4, 0x89, 0xa9, 0x9c, 0x07, 0x2e, 0x49, 0x89, 0xe9, 0xbd, 0x64, + 0x26, 0x23, 0x66, 0x19, 0x50, 0xb2, 0x97, 0xcc, 0xe4, 0xc4, 0xbc, 0x74, 0x9d, 0x14, 0x77, 0x63, + 0xc1, 0x93, 0xb4, 0x51, 0xd8, 0x34, 0x75, 0x93, 0x03, 0x1f, 0x6c, 0x20, 0x5d, 0x23, 0xed, 0xb3, + 0x17, 0x28, 0x2f, 0x80, 0x56, 0x68, 0xbb, 0xea, 0x0b, 0x8e, 0xd2, 0x1f, 0x04, 0x4f, 0x96, 0x82, + 0x2b, 0xfe, 0xd6, 0x3b, 0xcb, 0x5b, 0x6f, 0x1f, 0xe0, 0x12, 0x0f, 0x02, 0x2e, 0xeb, 0x90, 0x23, + 0x6d, 0xe8, 0x18, 0x96, 0xa2, 0x1a, 0x2e, 0x96, 0x72, 0x03, 0x96, 0x68, 0x2d, 0xc1, 0x60, 0x19, + 0x9e, 0xb1, 0x93, 0x34, 0x63, 0x2f, 0x92, 0x17, 0xcc, 0xe4, 0x2c, 0x75, 0x3f, 0x0f, 0xcb, 0x3e, + 0x5e, 0xb7, 0xbd, 0x65, 0xc0, 0x82, 0xe8, 0x72, 0x57, 0x78, 0x9f, 0xfb, 0x67, 0xc1, 0xb3, 0x90, + 0x07, 0xc2, 0x84, 0xe1, 0x25, 0xc2, 0xf7, 0x84, 0x97, 0xc4, 0x1f, 0x19, 0x2f, 0xf1, 0xb7, 0xeb, + 0x89, 0x60, 0xbb, 0xfe, 0x2f, 0xc1, 0xdb, 0x13, 0x17, 0xfd, 0x68, 0xe9, 0x6d, 0xcc, 0x1b, 0x68, + 0xfa, 0x4c, 0xaa, 0xb5, 0x9e, 0xde, 0xe1, 0x39, 0x9b, 0x3c, 0x12, 0x2e, 0x37, 0x9b, 0x65, 0x79, + 0xb2, 0x72, 0x7b, 0x6f, 0x56, 0x13, 0xf1, 0xde, 0x5b, 0x84, 0xc4, 0x03, 0xcc, 0xd0, 0xf9, 0xbc, + 0x4c, 0x1e, 0x09, 0x1f, 0x75, 0x3e, 0x5e, 0xdb, 0xb0, 0x01, 0x7a, 0x19, 0xb2, 0xf4, 0xd7, 0x8b, + 0xa2, 0x1b, 0x16, 0x47, 0xe4, 0x03, 0x55, 0x1f, 0xfb, 0xff, 0xb2, 0x79, 0x44, 0x78, 0x0e, 0x0d, + 0x4b, 0xce, 0x18, 0xfc, 0xc9, 0x57, 0x8c, 0x65, 0x03, 0xc5, 0xd8, 0x15, 0xc8, 0x92, 0xaf, 0xb7, + 0x0c, 0xb5, 0x85, 0x4b, 0x40, 0x3f, 0xd4, 0x23, 0x48, 0xbf, 0x8f, 0xc3, 0xe2, 0x58, 0xf6, 0x0a, + 0x5d, 0xbb, 0xe3, 0x92, 0x71, 0x1f, 0x1a, 0x34, 0x9b, 0x3d, 0xd6, 0x00, 0x3a, 0xaa, 0xa5, 0x3c, + 0x54, 0x07, 0x36, 0x6e, 0x73, 0xa3, 0xf8, 0x28, 0xa4, 0xd6, 0x21, 0xa3, 0xa1, 0x85, 0xdb, 0x1c, + 0x98, 0x72, 0xc7, 0xa8, 0x0e, 0x69, 0x7c, 0x86, 0x07, 0xb6, 0x55, 0x5a, 0xa0, 0xdb, 0xbe, 0x3a, + 0x89, 0x14, 0x90, 0xd7, 0x3b, 0x25, 0xb2, 0xd9, 0xdf, 0x7e, 0xb5, 0x2e, 0x32, 0xee, 0xe7, 0xf4, + 0xbe, 0x66, 0xe3, 0xbe, 0x61, 0x9f, 0xcb, 0x5c, 0x3e, 0x68, 0x85, 0xcc, 0x98, 0x15, 0x28, 0x44, + 0x9a, 0x77, 0x90, 0x0f, 0x62, 0x53, 0x4d, 0x37, 0x35, 0xfb, 0x5c, 0x2e, 0xf4, 0x71, 0xdf, 0xd0, + 0xf5, 0x9e, 0xc2, 0xce, 0x78, 0x05, 0x8a, 0xc1, 0x64, 0x8d, 0x9e, 0x84, 0x82, 0x89, 0x6d, 0x55, + 0x1b, 0x28, 0x81, 0xfe, 0x20, 0xcf, 0x88, 0xec, 0x4c, 0xed, 0x25, 0x33, 0x82, 0x18, 0xdf, 0x4b, + 0x66, 0xe2, 0x62, 0x42, 0x3a, 0x22, 0x25, 0x68, 0x48, 0xb2, 0x46, 0x2f, 0x41, 0xd6, 0xcb, 0xf3, + 0xac, 0xfe, 0xbc, 0x00, 0x84, 0xf2, 0x78, 0xa5, 0x3f, 0x0a, 0x9e, 0xca, 0x20, 0xac, 0x55, 0x83, + 0xb4, 0x89, 0xad, 0x61, 0x8f, 0x01, 0x4d, 0xc5, 0xed, 0xe7, 0x67, 0x4b, 0xf3, 0x84, 0x3a, 0xec, + 0xd9, 0x32, 0x17, 0x96, 0xde, 0x81, 0x34, 0xa3, 0xa0, 0x1c, 0x2c, 0x9c, 0x1c, 0xdc, 0x3b, 0x38, + 0x7c, 0xeb, 0x40, 0x8c, 0x21, 0x80, 0x74, 0xa5, 0x5a, 0xad, 0x1d, 0x35, 0x44, 0x01, 0x65, 0x21, + 0x55, 0xd9, 0x39, 0x94, 0x1b, 0x62, 0x9c, 0x90, 0xe5, 0xda, 0x5e, 0xad, 0xda, 0x10, 0x13, 0x68, + 0x09, 0x0a, 0xec, 0x59, 0xb9, 0x7b, 0x28, 0xbf, 0x51, 0x69, 0x88, 0x49, 0x1f, 0xe9, 0xb8, 0x76, + 0x70, 0xa7, 0x26, 0x8b, 0x29, 0xe9, 0x07, 0x70, 0x39, 0xb2, 0x30, 0xf0, 0x30, 0x2b, 0xc1, 0x87, + 0x59, 0x49, 0x9f, 0xc5, 0x49, 0xbf, 0x17, 0x95, 0xed, 0xd1, 0xde, 0xd8, 0xc2, 0xb7, 0xe7, 0x28, + 0x15, 0xc6, 0x56, 0x4f, 0x5a, 0x3c, 0x13, 0x9f, 0x62, 0xbb, 0xd5, 0x65, 0xd5, 0x07, 0x8b, 0x40, + 0x05, 0xb9, 0xc0, 0xa9, 0x54, 0xc8, 0x62, 0x6c, 0xef, 0xe1, 0x96, 0xad, 0x30, 0x27, 0xb2, 0x68, + 0x9f, 0x95, 0x25, 0x6c, 0x84, 0x7a, 0xcc, 0x88, 0xd2, 0xbb, 0x73, 0xd9, 0x32, 0x0b, 0x29, 0xb9, + 0xd6, 0x90, 0xdf, 0x16, 0x13, 0x08, 0x41, 0x91, 0x3e, 0x2a, 0xc7, 0x07, 0x95, 0xa3, 0xe3, 0xfa, + 0x21, 0xb1, 0xe5, 0x32, 0x2c, 0x3a, 0xb6, 0x74, 0x88, 0x29, 0xe9, 0x59, 0x78, 0x2c, 0xa2, 0x54, + 0x99, 0xec, 0x36, 0xa5, 0xdf, 0x0a, 0x7e, 0xee, 0x60, 0xb9, 0x71, 0x08, 0x69, 0xcb, 0x56, 0xed, + 0xa1, 0xc5, 0x8d, 0xf8, 0xd2, 0xac, 0xb5, 0xcb, 0xa6, 0xf3, 0x70, 0x4c, 0xc5, 0x65, 0xae, 0x46, + 0xba, 0x05, 0xc5, 0xe0, 0x9b, 0x68, 0x1b, 0x78, 0x4e, 0x14, 0x97, 0x6e, 0x03, 0x9a, 0x2c, 0x69, + 0x42, 0x3a, 0x6f, 0x21, 0xac, 0xf3, 0xfe, 0x9d, 0x00, 0x8f, 0x5f, 0x50, 0xbe, 0xa0, 0x37, 0xc7, + 0x16, 0xf9, 0xca, 0x3c, 0xc5, 0xcf, 0x26, 0xa3, 0x8d, 0x2d, 0xf3, 0x26, 0xe4, 0xfd, 0xf4, 0xd9, + 0x16, 0xf9, 0x6d, 0xdc, 0x3b, 0xc4, 0x41, 0x88, 0xc0, 0x0b, 0x81, 0xc2, 0x77, 0x0c, 0x81, 0xaf, + 0x02, 0xd8, 0x23, 0x85, 0xb9, 0xb5, 0x93, 0x47, 0xaf, 0x86, 0x40, 0xaf, 0xb8, 0xd5, 0x18, 0xf1, + 0x43, 0x90, 0xb5, 0xf9, 0x93, 0x85, 0x8e, 0xfd, 0x78, 0xc9, 0x90, 0xe6, 0x58, 0x8b, 0x63, 0x09, + 0xb3, 0x26, 0x63, 0x0f, 0x57, 0x61, 0x64, 0x0b, 0xbd, 0x0d, 0x8f, 0x8d, 0x15, 0x0a, 0xae, 0xea, + 0xe4, 0xac, 0xf5, 0xc2, 0xa5, 0x60, 0xbd, 0xe0, 0xa8, 0xf6, 0x67, 0xfb, 0x54, 0x30, 0xdb, 0xbf, + 0x04, 0xab, 0xe1, 0x25, 0x22, 0xba, 0x0a, 0x80, 0x07, 0x24, 0x2d, 0xb4, 0x15, 0xf7, 0x9f, 0x44, + 0x96, 0x53, 0x1a, 0x23, 0xe9, 0x6d, 0x00, 0x0f, 0x70, 0x21, 0xa1, 0xc9, 0xd4, 0x87, 0x83, 0x36, + 0xe5, 0x4b, 0xc9, 0x6c, 0x80, 0x6e, 0x41, 0x8a, 0x61, 0x08, 0xf1, 0x88, 0x18, 0x4e, 0x26, 0xf2, + 0x01, 0x36, 0x8c, 0x5b, 0xd2, 0x00, 0x4d, 0x82, 0xde, 0x11, 0x53, 0xbc, 0x16, 0x9c, 0xe2, 0x89, + 0x48, 0xf8, 0x3c, 0x7c, 0xaa, 0x0f, 0x20, 0x45, 0x5d, 0x86, 0x64, 0x6b, 0xfa, 0xa7, 0x85, 0x97, + 0x99, 0xe4, 0x19, 0xfd, 0x1c, 0x40, 0xb5, 0x6d, 0x53, 0x6b, 0x0e, 0xbd, 0x09, 0xd6, 0xc3, 0x5d, + 0xae, 0xe2, 0xf0, 0xed, 0x5c, 0xe1, 0xbe, 0xb7, 0xe2, 0x89, 0xfa, 0xfc, 0xcf, 0xa7, 0x50, 0x3a, + 0x80, 0x62, 0x50, 0xd6, 0x29, 0x8c, 0xd8, 0x37, 0x04, 0x0b, 0x23, 0x56, 0xe7, 0xf2, 0xc2, 0xc8, + 0x2d, 0xab, 0x12, 0xec, 0x77, 0x12, 0x1d, 0x48, 0x1f, 0xc6, 0x21, 0xef, 0xf7, 0xd8, 0xff, 0xbd, + 0xda, 0x45, 0xfa, 0x95, 0x00, 0x19, 0x77, 0xf9, 0xc1, 0x7f, 0x4b, 0x81, 0x9f, 0x71, 0xcc, 0x7a, + 0x71, 0xff, 0x0f, 0x21, 0xf6, 0xeb, 0x2d, 0xe1, 0xfe, 0x7a, 0xbb, 0xed, 0xe6, 0xcd, 0x28, 0x78, + 0xc6, 0x6f, 0x6b, 0xee, 0x55, 0x4e, 0x99, 0x70, 0x1b, 0xb2, 0xee, 0xb1, 0x27, 0xdd, 0x8a, 0x83, + 0x84, 0x09, 0xfc, 0xf0, 0x71, 0x14, 0x6c, 0x05, 0x52, 0x86, 0xfe, 0x90, 0xff, 0x6d, 0x4a, 0xc8, + 0x6c, 0x20, 0xb5, 0x61, 0x71, 0x2c, 0x66, 0xa0, 0xdb, 0xb0, 0x60, 0x0c, 0x9b, 0x8a, 0xe3, 0x1c, + 0x63, 0x90, 0xa5, 0x53, 0x07, 0x0f, 0x9b, 0x3d, 0xad, 0x75, 0x0f, 0x9f, 0x3b, 0x1f, 0x63, 0x0c, + 0x9b, 0xf7, 0x98, 0x0f, 0xb1, 0x59, 0xe2, 0xfe, 0x59, 0x3e, 0x15, 0x20, 0xe3, 0x9c, 0x09, 0xf4, + 0x23, 0xc8, 0xba, 0xf1, 0xc8, 0xfd, 0x5d, 0x1c, 0x19, 0xc8, 0xb8, 0x7e, 0x4f, 0x04, 0x55, 0x9c, + 0xff, 0xdc, 0x5a, 0x5b, 0x39, 0xed, 0xa9, 0xcc, 0x97, 0x8a, 0x41, 0x9b, 0xb1, 0x88, 0x45, 0x03, + 0xf9, 0xee, 0x9d, 0xbb, 0x3d, 0xb5, 0x23, 0xe7, 0xa8, 0xcc, 0x6e, 0x9b, 0x0c, 0x78, 0x49, 0xf8, + 0x4f, 0x01, 0xc4, 0xf1, 0x13, 0xfb, 0x9d, 0xbf, 0x6e, 0x32, 0x3f, 0x26, 0x42, 0xf2, 0x23, 0xda, + 0x82, 0x65, 0x97, 0x43, 0x21, 0xdd, 0xb1, 0x6a, 0x0f, 0x4d, 0xcc, 0x41, 0x5e, 0xe4, 0xbe, 0x3a, + 0x76, 0xde, 0x4c, 0xae, 0x3a, 0xf5, 0x88, 0xab, 0xfe, 0x28, 0x0e, 0x39, 0x1f, 0xe4, 0x8c, 0x7e, + 0xe8, 0x0b, 0x46, 0xc5, 0x90, 0x94, 0xe2, 0xe3, 0xf5, 0x7e, 0xfd, 0x06, 0xcd, 0x14, 0x9f, 0xdf, + 0x4c, 0x51, 0xc0, 0xbe, 0x83, 0x60, 0x27, 0xe7, 0x46, 0xb0, 0x9f, 0x03, 0x64, 0xeb, 0xb6, 0xda, + 0x53, 0xce, 0x74, 0x5b, 0x1b, 0x74, 0x14, 0xe6, 0x86, 0x2c, 0x74, 0x88, 0xf4, 0xcd, 0x7d, 0xfa, + 0xe2, 0x88, 0x7a, 0xe4, 0x2f, 0x04, 0xc8, 0xb8, 0xf5, 0xfa, 0xbc, 0x3f, 0x86, 0x57, 0x21, 0xcd, + 0x4b, 0x52, 0xf6, 0x67, 0x98, 0x8f, 0x42, 0xa1, 0xfa, 0x32, 0x64, 0xfa, 0xd8, 0x56, 0x69, 0x1c, + 0x64, 0xe9, 0xd0, 0x1d, 0xdf, 0x78, 0x05, 0x72, 0xbe, 0x9f, 0xea, 0x24, 0x34, 0x1e, 0xd4, 0xde, + 0x12, 0x63, 0xe5, 0x85, 0x8f, 0x3f, 0xdf, 0x48, 0x1c, 0xe0, 0x87, 0xe4, 0x34, 0xcb, 0xb5, 0x6a, + 0xbd, 0x56, 0xbd, 0x27, 0x0a, 0xe5, 0xdc, 0xc7, 0x9f, 0x6f, 0x2c, 0xc8, 0x98, 0xe2, 0x9b, 0x37, + 0xee, 0xc1, 0xe2, 0xd8, 0xc6, 0x04, 0xeb, 0x1d, 0x04, 0xc5, 0x3b, 0x27, 0x47, 0xfb, 0xbb, 0xd5, + 0x4a, 0xa3, 0xa6, 0xdc, 0x3f, 0x6c, 0xd4, 0x44, 0x01, 0x3d, 0x06, 0xcb, 0xfb, 0xbb, 0xaf, 0xd7, + 0x1b, 0x4a, 0x75, 0x7f, 0xb7, 0x76, 0xd0, 0x50, 0x2a, 0x8d, 0x46, 0xa5, 0x7a, 0x4f, 0x8c, 0x6f, + 0x7f, 0x98, 0x87, 0x64, 0x65, 0xa7, 0xba, 0x8b, 0xaa, 0x90, 0xa4, 0x18, 0xca, 0x85, 0x37, 0xf5, + 0xca, 0x17, 0x23, 0xd5, 0xe8, 0x2e, 0xa4, 0x28, 0xbc, 0x82, 0x2e, 0xbe, 0xba, 0x57, 0x9e, 0x02, + 0x5d, 0x93, 0x8f, 0xa1, 0x27, 0xf2, 0xc2, 0xbb, 0x7c, 0xe5, 0x8b, 0x91, 0x6c, 0xb4, 0x0f, 0x0b, + 0x4e, 0x77, 0x3d, 0xed, 0x82, 0x5d, 0x79, 0x2a, 0xbc, 0x4c, 0x96, 0xc6, 0x50, 0x8a, 0x8b, 0xaf, + 0xf9, 0x95, 0xa7, 0x60, 0xdc, 0x68, 0x17, 0xd2, 0xbc, 0x8f, 0x9d, 0x72, 0x73, 0xaf, 0x3c, 0x0d, + 0xb5, 0x46, 0x32, 0x64, 0x3d, 0xfc, 0x67, 0xfa, 0xe5, 0xc5, 0xf2, 0x0c, 0xf0, 0x3d, 0x7a, 0x07, + 0x0a, 0xc1, 0x1e, 0x79, 0xb6, 0xdb, 0x81, 0xe5, 0x19, 0xf1, 0x71, 0xa2, 0x3f, 0xd8, 0x30, 0xcf, + 0x76, 0x5b, 0xb0, 0x3c, 0x23, 0x5c, 0x8e, 0xde, 0x83, 0xa5, 0xc9, 0x86, 0x76, 0xf6, 0xcb, 0x83, + 0xe5, 0x39, 0x00, 0x74, 0xd4, 0x07, 0x14, 0xd2, 0x08, 0xcf, 0x71, 0x97, 0xb0, 0x3c, 0x0f, 0x9e, + 0x8e, 0xda, 0xb0, 0x38, 0xde, 0x5d, 0xce, 0x7a, 0xb7, 0xb0, 0x3c, 0x33, 0xb6, 0xce, 0x66, 0x09, + 0x76, 0xa5, 0xb3, 0xde, 0x35, 0x2c, 0xcf, 0x0c, 0xb5, 0xa3, 0x13, 0x00, 0x5f, 0x63, 0x39, 0xc3, + 0xdd, 0xc3, 0xf2, 0x2c, 0xa0, 0x3b, 0x32, 0x60, 0x39, 0xac, 0xe3, 0x9c, 0xe7, 0x2a, 0x62, 0x79, + 0x2e, 0x2c, 0x9e, 0xf8, 0x73, 0xb0, 0x77, 0x9c, 0xed, 0x6a, 0x62, 0x79, 0x46, 0x50, 0x1e, 0xa9, + 0x50, 0x1c, 0xeb, 0x97, 0x66, 0xbc, 0xa9, 0x58, 0x9e, 0x15, 0xa3, 0xdf, 0xa9, 0x7c, 0xf1, 0xf5, + 0x9a, 0xf0, 0xe5, 0xd7, 0x6b, 0xc2, 0xdf, 0xbf, 0x5e, 0x13, 0x3e, 0xf9, 0x66, 0x2d, 0xf6, 0xe5, + 0x37, 0x6b, 0xb1, 0xbf, 0x7e, 0xb3, 0x16, 0xfb, 0xc9, 0x33, 0x1d, 0xcd, 0xee, 0x0e, 0x9b, 0x9b, + 0x2d, 0xbd, 0xbf, 0xd5, 0xd2, 0xfb, 0xd8, 0x6e, 0x9e, 0xda, 0xde, 0x83, 0x77, 0xc7, 0xbd, 0x99, + 0xa6, 0x49, 0xfa, 0xe6, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x82, 0x4f, 0x04, 0xe9, 0x03, 0x2f, + 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3893,6 +4045,7 @@ type ABCIClient interface { ExtendVote(ctx context.Context, in *RequestExtendVote, opts ...grpc.CallOption) (*ResponseExtendVote, error) VerifyVoteExtension(ctx context.Context, in *RequestVerifyVoteExtension, opts ...grpc.CallOption) (*ResponseVerifyVoteExtension, error) FinalizeBlock(ctx context.Context, in *RequestFinalizeBlock, opts ...grpc.CallOption) (*ResponseFinalizeBlock, error) + SignGossipVote(ctx context.Context, in *RequestSignGossipVote, opts ...grpc.CallOption) (*ResponseSignGossipVote, error) } type aBCIClient struct { @@ -4047,6 +4200,15 @@ func (c *aBCIClient) FinalizeBlock(ctx context.Context, in *RequestFinalizeBlock return out, nil } +func (c *aBCIClient) SignGossipVote(ctx context.Context, in *RequestSignGossipVote, opts ...grpc.CallOption) (*ResponseSignGossipVote, error) { + out := new(ResponseSignGossipVote) + err := c.cc.Invoke(ctx, "/tendermint.abci.ABCI/SignGossipVote", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ABCIServer is the server API for ABCI service. type ABCIServer interface { Echo(context.Context, *RequestEcho) (*ResponseEcho, error) @@ -4065,6 +4227,7 @@ type ABCIServer interface { ExtendVote(context.Context, *RequestExtendVote) (*ResponseExtendVote, error) VerifyVoteExtension(context.Context, *RequestVerifyVoteExtension) (*ResponseVerifyVoteExtension, error) FinalizeBlock(context.Context, *RequestFinalizeBlock) (*ResponseFinalizeBlock, error) + SignGossipVote(context.Context, *RequestSignGossipVote) (*ResponseSignGossipVote, error) } // UnimplementedABCIServer can be embedded to have forward compatible implementations. @@ -4119,6 +4282,9 @@ func (*UnimplementedABCIServer) VerifyVoteExtension(ctx context.Context, req *Re func (*UnimplementedABCIServer) FinalizeBlock(ctx context.Context, req *RequestFinalizeBlock) (*ResponseFinalizeBlock, error) { return nil, status.Errorf(codes.Unimplemented, "method FinalizeBlock not implemented") } +func (*UnimplementedABCIServer) SignGossipVote(ctx context.Context, req *RequestSignGossipVote) (*ResponseSignGossipVote, error) { + return nil, status.Errorf(codes.Unimplemented, "method SignGossipVote not implemented") +} func RegisterABCIServer(s grpc1.Server, srv ABCIServer) { s.RegisterService(&_ABCI_serviceDesc, srv) @@ -4412,6 +4578,24 @@ func _ABCI_FinalizeBlock_Handler(srv interface{}, ctx context.Context, dec func( return interceptor(ctx, in, info, handler) } +func _ABCI_SignGossipVote_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestSignGossipVote) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ABCIServer).SignGossipVote(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tendermint.abci.ABCI/SignGossipVote", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ABCIServer).SignGossipVote(ctx, req.(*RequestSignGossipVote)) + } + return interceptor(ctx, in, info, handler) +} + var _ABCI_serviceDesc = grpc.ServiceDesc{ ServiceName: "tendermint.abci.ABCI", HandlerType: (*ABCIServer)(nil), @@ -4480,6 +4664,10 @@ var _ABCI_serviceDesc = grpc.ServiceDesc{ MethodName: "FinalizeBlock", Handler: _ABCI_FinalizeBlock_Handler, }, + { + MethodName: "SignGossipVote", + Handler: _ABCI_SignGossipVote_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "tendermint/abci/types.proto", @@ -4863,6 +5051,29 @@ func (m *Request_FinalizeBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { } return len(dAtA) - i, nil } +func (m *Request_SignGossipVote) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Request_SignGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.SignGossipVote != nil { + { + size, err := m.SignGossipVote.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xaa + } + return len(dAtA) - i, nil +} func (m *RequestEcho) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -5028,12 +5239,12 @@ func (m *RequestInitChain) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x12 } - n18, err18 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err18 != nil { - return 0, err18 + n19, err19 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err19 != nil { + return 0, err19 } - i -= n18 - i = encodeVarintTypes(dAtA, i, uint64(n18)) + i -= n19 + i = encodeVarintTypes(dAtA, i, uint64(n19)) i-- dAtA[i] = 0xa return len(dAtA) - i, nil @@ -5328,12 +5539,12 @@ func (m *RequestPrepareProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x3a } - n20, err20 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err20 != nil { - return 0, err20 + n21, err21 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err21 != nil { + return 0, err21 } - i -= n20 - i = encodeVarintTypes(dAtA, i, uint64(n20)) + i -= n21 + i = encodeVarintTypes(dAtA, i, uint64(n21)) i-- dAtA[i] = 0x32 if m.Height != 0 { @@ -5416,12 +5627,12 @@ func (m *RequestProcessProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x3a } - n22, err22 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err22 != nil { - return 0, err22 + n23, err23 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err23 != nil { + return 0, err23 } - i -= n22 - i = encodeVarintTypes(dAtA, i, uint64(n22)) + i -= n23 + i = encodeVarintTypes(dAtA, i, uint64(n23)) i-- dAtA[i] = 0x32 if m.Height != 0 { @@ -5539,12 +5750,12 @@ func (m *RequestExtendVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x22 } } - n25, err25 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err25 != nil { - return 0, err25 + n26, err26 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err26 != nil { + return 0, err26 } - i -= n25 - i = encodeVarintTypes(dAtA, i, uint64(n25)) + i -= n26 + i = encodeVarintTypes(dAtA, i, uint64(n26)) i-- dAtA[i] = 0x1a if m.Height != 0 { @@ -5645,12 +5856,12 @@ func (m *RequestFinalizeBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x3a } - n26, err26 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err26 != nil { - return 0, err26 + n27, err27 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err27 != nil { + return 0, err27 } - i -= n26 - i = encodeVarintTypes(dAtA, i, uint64(n26)) + i -= n27 + i = encodeVarintTypes(dAtA, i, uint64(n27)) i-- dAtA[i] = 0x32 if m.Height != 0 { @@ -5701,6 +5912,64 @@ func (m *RequestFinalizeBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *RequestSignGossipVote) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RequestSignGossipVote) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RequestSignGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Password) > 0 { + i -= len(m.Password) + copy(dAtA[i:], m.Password) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Password))) + i-- + dAtA[i] = 0x22 + } + if len(m.SubaccountLabel) > 0 { + i -= len(m.SubaccountLabel) + copy(dAtA[i:], m.SubaccountLabel) + i = encodeVarintTypes(dAtA, i, uint64(len(m.SubaccountLabel))) + i-- + dAtA[i] = 0x1a + } + if len(m.GrpcAddress) > 0 { + i -= len(m.GrpcAddress) + copy(dAtA[i:], m.GrpcAddress) + i = encodeVarintTypes(dAtA, i, uint64(len(m.GrpcAddress))) + i-- + dAtA[i] = 0x12 + } + if len(m.GossipVotes) > 0 { + for iNdEx := len(m.GossipVotes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.GossipVotes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func (m *Response) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -6102,6 +6371,29 @@ func (m *Response_FinalizeBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) } return len(dAtA) - i, nil } +func (m *Response_SignGossipVote) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Response_SignGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.SignGossipVote != nil { + { + size, err := m.SignGossipVote.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xb2 + } + return len(dAtA) - i, nil +} func (m *ResponseException) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -6613,20 +6905,20 @@ func (m *ResponseApplySnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, err } } if len(m.RefetchChunks) > 0 { - dAtA48 := make([]byte, len(m.RefetchChunks)*10) - var j47 int + dAtA50 := make([]byte, len(m.RefetchChunks)*10) + var j49 int for _, num := range m.RefetchChunks { for num >= 1<<7 { - dAtA48[j47] = uint8(uint64(num)&0x7f | 0x80) + dAtA50[j49] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j47++ + j49++ } - dAtA48[j47] = uint8(num) - j47++ + dAtA50[j49] = uint8(num) + j49++ } - i -= j47 - copy(dAtA[i:], dAtA48[:j47]) - i = encodeVarintTypes(dAtA, i, uint64(j47)) + i -= j49 + copy(dAtA[i:], dAtA50[:j49]) + i = encodeVarintTypes(dAtA, i, uint64(j49)) i-- dAtA[i] = 0x12 } @@ -6840,7 +7132,7 @@ func (m *ResponseFinalizeBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *CommitInfo) Marshal() (dAtA []byte, err error) { +func (m *ResponseSignGossipVote) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6850,23 +7142,53 @@ func (m *CommitInfo) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *CommitInfo) MarshalTo(dAtA []byte) (int, error) { +func (m *ResponseSignGossipVote) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *CommitInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ResponseSignGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.Votes) > 0 { - for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Votes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } + if len(m.EncodedTx) > 0 { + i -= len(m.EncodedTx) + copy(dAtA[i:], m.EncodedTx) + i = encodeVarintTypes(dAtA, i, uint64(len(m.EncodedTx))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *CommitInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CommitInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CommitInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Votes) > 0 { + for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Votes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } i -= size i = encodeVarintTypes(dAtA, i, uint64(size)) } @@ -7333,12 +7655,12 @@ func (m *Misbehavior) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x28 } - n54, err54 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err54 != nil { - return 0, err54 + n56, err56 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err56 != nil { + return 0, err56 } - i -= n54 - i = encodeVarintTypes(dAtA, i, uint64(n54)) + i -= n56 + i = encodeVarintTypes(dAtA, i, uint64(n56)) i-- dAtA[i] = 0x22 if m.Height != 0 { @@ -7631,6 +7953,18 @@ func (m *Request_FinalizeBlock) Size() (n int) { } return n } +func (m *Request_SignGossipVote) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SignGossipVote != nil { + l = m.SignGossipVote.Size() + n += 2 + l + sovTypes(uint64(l)) + } + return n +} func (m *RequestEcho) Size() (n int) { if m == nil { return 0 @@ -8003,6 +8337,33 @@ func (m *RequestFinalizeBlock) Size() (n int) { return n } +func (m *RequestSignGossipVote) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.GossipVotes) > 0 { + for _, e := range m.GossipVotes { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + l = len(m.GrpcAddress) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.SubaccountLabel) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Password) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + func (m *Response) Size() (n int) { if m == nil { return 0 @@ -8219,6 +8580,18 @@ func (m *Response_FinalizeBlock) Size() (n int) { } return n } +func (m *Response_SignGossipVote) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SignGossipVote != nil { + l = m.SignGossipVote.Size() + n += 2 + l + sovTypes(uint64(l)) + } + return n +} func (m *ResponseException) Size() (n int) { if m == nil { return 0 @@ -8550,6 +8923,19 @@ func (m *ResponseFinalizeBlock) Size() (n int) { return n } +func (m *ResponseSignGossipVote) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.EncodedTx) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + func (m *CommitInfo) Size() (n int) { if m == nil { return 0 @@ -9395,6 +9781,41 @@ func (m *Request) Unmarshal(dAtA []byte) error { } m.Value = &Request_FinalizeBlock{v} iNdEx = postIndex + case 21: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SignGossipVote", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RequestSignGossipVote{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Request_SignGossipVote{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -12026,6 +12447,186 @@ func (m *RequestFinalizeBlock) Unmarshal(dAtA []byte) error { } return nil } +func (m *RequestSignGossipVote) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestSignGossipVote: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestSignGossipVote: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GossipVotes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.GossipVotes = append(m.GossipVotes, &oracle.GossipVote{}) + if err := m.GossipVotes[len(m.GossipVotes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GrpcAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.GrpcAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SubaccountLabel", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SubaccountLabel = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Password", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Password = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Response) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -12650,6 +13251,41 @@ func (m *Response) Unmarshal(dAtA []byte) error { } m.Value = &Response_FinalizeBlock{v} iNdEx = postIndex + case 22: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SignGossipVote", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &ResponseSignGossipVote{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Response_SignGossipVote{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -14812,6 +15448,90 @@ func (m *ResponseFinalizeBlock) Unmarshal(dAtA []byte) error { } return nil } +func (m *ResponseSignGossipVote) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResponseSignGossipVote: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResponseSignGossipVote: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EncodedTx", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.EncodedTx = append(m.EncodedTx[:0], dAtA[iNdEx:postIndex]...) + if m.EncodedTx == nil { + m.EncodedTx = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *CommitInfo) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/proto/buf.lock b/proto/buf.lock index 335a3eb17e9..3fa18eb3d65 100644 --- a/proto/buf.lock +++ b/proto/buf.lock @@ -14,5 +14,5 @@ deps: - remote: buf.build owner: googleapis repository: googleapis - commit: a86849a25cc04f4dbe9b15ddddfbc488 - digest: shake256:e19143328f8cbfe13fc226aeee5e63773ca494693a72740a7560664270039a380d94a1344234b88c7691311460df9a9b1c2982190d0a2612eae80368718e1943 + commit: 7e6f6e774e29406da95bd61cdcdbc8bc + digest: shake256:fe43dd2265ea0c07d76bd925eeba612667cf4c948d2ce53d6e367e1b4b3cb5fa69a51e6acb1a6a50d32f894f054a35e6c0406f6808a483f2752e10c866ffbf73 diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto index ce1edcb5c88..65d2dc54ddb 100644 --- a/proto/tendermint/abci/types.proto +++ b/proto/tendermint/abci/types.proto @@ -11,6 +11,7 @@ import "tendermint/types/params.proto"; import "tendermint/types/validator.proto"; import "google/protobuf/timestamp.proto"; import "gogoproto/gogo.proto"; +import "tendermint/oracle/types.proto"; // NOTE: When using custom types, mind the warnings. // https://github.com/cosmos/gogoproto/blob/master/custom_types.md#warnings-and-issues @@ -34,6 +35,7 @@ service ABCI { rpc ExtendVote(RequestExtendVote) returns (ResponseExtendVote); rpc VerifyVoteExtension(RequestVerifyVoteExtension) returns (ResponseVerifyVoteExtension); rpc FinalizeBlock(RequestFinalizeBlock) returns (ResponseFinalizeBlock); + rpc SignGossipVote(RequestSignGossipVote) returns (ResponseSignGossipVote); } //---------------------------------------- @@ -57,6 +59,7 @@ message Request { RequestExtendVote extend_vote = 18; RequestVerifyVoteExtension verify_vote_extension = 19; RequestFinalizeBlock finalize_block = 20; + RequestSignGossipVote sign_gossip_vote = 21; } reserved 4, 7, 9, 10; // SetOption, BeginBlock, DeliverTx, EndBlock } @@ -193,6 +196,14 @@ message RequestFinalizeBlock { bytes proposer_address = 8; } +message RequestSignGossipVote { + repeated tendermint.oracle.GossipVote gossip_votes = 1; + string grpc_address = 2; + string subaccount_label = 3; + string password = 4; +} + + //---------------------------------------- // Response types @@ -215,6 +226,7 @@ message Response { ResponseExtendVote extend_vote = 19; ResponseVerifyVoteExtension verify_vote_extension = 20; ResponseFinalizeBlock finalize_block = 21; + ResponseSignGossipVote sign_gossip_vote = 22; } reserved 5, 8, 10, 11; // SetOption, BeginBlock, DeliverTx, EndBlock } @@ -365,6 +377,10 @@ message ResponseFinalizeBlock { bytes app_hash = 5; } +message ResponseSignGossipVote { + bytes encoded_tx = 1; +} + //---------------------------------------- // Misc. diff --git a/proxy/app_conn.go b/proxy/app_conn.go index 064f32891ff..fefa235afe4 100644 --- a/proxy/app_conn.go +++ b/proxy/app_conn.go @@ -24,6 +24,7 @@ type AppConnConsensus interface { VerifyVoteExtension(context.Context, *types.RequestVerifyVoteExtension) (*types.ResponseVerifyVoteExtension, error) FinalizeBlock(context.Context, *types.RequestFinalizeBlock) (*types.ResponseFinalizeBlock, error) Commit(context.Context) (*types.ResponseCommit, error) + SignGossipVote(context.Context, *types.RequestSignGossipVote) (*types.ResponseSignGossipVote, error) } type AppConnMempool interface { @@ -109,6 +110,11 @@ func (app *appConnConsensus) Commit(ctx context.Context) (*types.ResponseCommit, return app.appConn.Commit(ctx, &types.RequestCommit{}) } +func (app *appConnConsensus) SignGossipVote(ctx context.Context, req *types.RequestSignGossipVote) (*types.ResponseSignGossipVote, error) { + defer addTimeSample(app.metrics.MethodTimingSeconds.With("method", "commit", "type", "sync"))() + return app.appConn.SignGossipVote(ctx, req) +} + //------------------------------------------------ // Implements AppConnMempool (subset of abcicli.Client) diff --git a/proxy/mocks/app_conn_consensus.go b/proxy/mocks/app_conn_consensus.go index 7dee0b1c5ce..85ab06717f3 100644 --- a/proxy/mocks/app_conn_consensus.go +++ b/proxy/mocks/app_conn_consensus.go @@ -185,6 +185,32 @@ func (_m *AppConnConsensus) ProcessProposal(_a0 context.Context, _a1 *types.Requ return r0, r1 } +// SignGossipVote provides a mock function with given fields: _a0, _a1 +func (_m *AppConnConsensus) SignGossipVote(_a0 context.Context, _a1 *types.RequestSignGossipVote) (*types.ResponseSignGossipVote, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseSignGossipVote + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestSignGossipVote) (*types.ResponseSignGossipVote, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestSignGossipVote) *types.ResponseSignGossipVote); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseSignGossipVote) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestSignGossipVote) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // VerifyVoteExtension provides a mock function with given fields: _a0, _a1 func (_m *AppConnConsensus) VerifyVoteExtension(_a0 context.Context, _a1 *types.RequestVerifyVoteExtension) (*types.ResponseVerifyVoteExtension, error) { ret := _m.Called(_a0, _a1) diff --git a/state/execution.go b/state/execution.go index 68c98fac91e..5c9d184df70 100644 --- a/state/execution.go +++ b/state/execution.go @@ -16,6 +16,7 @@ import ( "github.com/cometbft/cometbft/types" oracletypes "github.com/cometbft/cometbft/oracle/service/types" + oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" ) //----------------------------------------------------------------------------- @@ -128,33 +129,40 @@ func (blockExec *BlockExecutor) CreateProposalBlock( maxReapBytes = -1 } - // check which results have 2/3 maj - // totalPower := math.NewInt(state.Validators.TotalVotingPower()) - // minTurnoutRatio := math.LegacyNewDec(67).QuoInt64(100) - // minTurnout := minTurnoutRatio.MulInt(totalPower).RoundInt() - - // blockExec.oracleInfo.VoteDataBuffer.UpdateMtx.RLock() - // for timestamp, data := range blockExec.oracleInfo.VoteDataBuffer.Buffer { - // currentPower := math.OneInt() - // for oracleId, votes := range data { - // for _, vote := range votes { - // validator := vote.Validator - // if state.Validators.HasAddress([]byte(validator)) { - // // get power of validator - // power := state.Validators.GetByAddress([]byte(validator)) - // } - // } - // } - // } + // check if oracle's gossipVoteMap has any results + blockExec.oracleInfo.GossipVoteBuffer.UpdateMtx.RLock() + oracleVotesBuffer := blockExec.oracleInfo.GossipVoteBuffer.Buffer + blockExec.oracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() + + var signGossipVoteTxBz []byte + if len(oracleVotesBuffer) > 0 { + votes := []*oracleproto.GossipVote{} + for _, vote := range oracleVotesBuffer { + votes = append(votes, vote) + } + resp, err := blockExec.proxyApp.SignGossipVote(ctx, &abci.RequestSignGossipVote{ + GossipVotes: votes, + }) + if err != nil { + blockExec.logger.Error("error in proxyAppConn.SignGossipVote", "err", err) + } + signGossipVoteTxBz = resp.EncodedTx + } txs := blockExec.mempool.ReapMaxBytesMaxGas(maxReapBytes, maxGas) commit := lastExtCommit.ToCommit() block := state.MakeBlock(height, txs, commit, evidence, proposerAddr) + txSlice := block.Txs.ToSliceOfBytes() + + if len(signGossipVoteTxBz) > 0 { + txSlice = append([][]byte{signGossipVoteTxBz}, txSlice...) + } + rpp, err := blockExec.proxyApp.PrepareProposal( ctx, &abci.RequestPrepareProposal{ MaxTxBytes: maxDataBytes, - Txs: block.Txs.ToSliceOfBytes(), + Txs: txSlice, LocalLastCommit: buildExtendedCommitInfo(lastExtCommit, blockExec.store, state.InitialHeight, state.ConsensusParams.ABCI), Misbehavior: block.Evidence.Evidence.ToABCI(), Height: block.Height, From 820ce18355ffb7a1fd65eabde567a744df6e3888 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Wed, 28 Feb 2024 14:19:45 +0800 Subject: [PATCH 015/150] use http client to query oracle and results, instead of grpc --- oracle/service/adapters/fetcher.go | 27 +- oracle/service/adapters/fetcher_multiple.go | 2 +- .../service/adapters/oracle_result_fetcher.go | 40 +- oracle/service/runner/runner.go | 38 +- oracle/types/oracle.pb.go | 192 ++-- oracle/types/query.pb.go | 918 ------------------ proto/Switcheo/carbon/oracle/oracle.proto | 8 +- proto/Switcheo/carbon/oracle/query.proto | 41 - 8 files changed, 202 insertions(+), 1064 deletions(-) delete mode 100644 oracle/types/query.pb.go delete mode 100644 proto/Switcheo/carbon/oracle/query.proto diff --git a/oracle/service/adapters/fetcher.go b/oracle/service/adapters/fetcher.go index 1580ace7546..ebc861d62aa 100644 --- a/oracle/service/adapters/fetcher.go +++ b/oracle/service/adapters/fetcher.go @@ -56,7 +56,7 @@ func (fetcher *Fetcher) Perform(job types.OracleJob, result types.AdapterResult, timeout := job.ConfigValue("timeout").Uint64() reqBody := job.ConfigValue("request_body").String() - responseStr := getUrlResponse(url, timeout, reqBody) + responseStr := GetUrlResponse(url, timeout, reqBody) if responseStr == "" { return result, fmt.Errorf("empty response for %s", url) } @@ -76,9 +76,32 @@ func (fetcher *Fetcher) Perform(job types.OracleJob, result types.AdapterResult, return result, nil } +func HTTPRequest(url string, timeout uint64) []byte { + httpClient := http.Client{ + Timeout: time.Duration(timeout) * time.Second, + } + + var response *http.Response + response, err := httpClient.Get(url) + + if err != nil { + return []byte{} + } + + defer response.Body.Close() + + body, readErr := ioutil.ReadAll(response.Body) + + if readErr != nil { + return []byte{} + } + + return body +} + // getUrlResponse attempts to get a url response from redis cache // if redis cache is empty, it will make a http call and populate redis with the url as key -func getUrlResponse(url string, timeout uint64, reqBody string) string { +func GetUrlResponse(url string, timeout uint64, reqBody string) string { redService := redis.NewService(0) defer redService.Client.Close() pool := goredis.NewPool(redService.Client) diff --git a/oracle/service/adapters/fetcher_multiple.go b/oracle/service/adapters/fetcher_multiple.go index c2965f7ff9a..a64c20abaf2 100644 --- a/oracle/service/adapters/fetcher_multiple.go +++ b/oracle/service/adapters/fetcher_multiple.go @@ -83,7 +83,7 @@ func (fetcherMultiple *FetcherMultiple) Perform(job types.OracleJob, result type timeout := job.ConfigValue("timeout").Uint64() reqBody := job.ConfigValue("request_body").String() - responseStr := getUrlResponse(url, timeout, reqBody) + responseStr := GetUrlResponse(url, timeout, reqBody) if responseStr == "" { return result, fmt.Errorf("empty response from %s", url) } diff --git a/oracle/service/adapters/oracle_result_fetcher.go b/oracle/service/adapters/oracle_result_fetcher.go index a35638527ac..4ca0006dc93 100644 --- a/oracle/service/adapters/oracle_result_fetcher.go +++ b/oracle/service/adapters/oracle_result_fetcher.go @@ -1,7 +1,6 @@ package adapters import ( - "context" "encoding/json" "fmt" "strconv" @@ -50,19 +49,18 @@ func (oracleResultFetcher *OracleResultFetcher) Validate(job types.OracleJob) er } // Perform handles cache fetcher operations -func (oracleResultFetcher *OracleResultFetcher) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, store *types.AdapterStore) (types.AdapterResult, error) { - oracleId := job.ConfigValue(ORACLE_ID).String() +func (oracleResultFetcher *OracleResultFetcher) Perform(job types.OracleJob, result types.AdapterResult, _ types.AdapterRunTimeInput, _ *types.AdapterStore) (types.AdapterResult, error) { + oracleID := job.ConfigValue(ORACLE_ID).String() staleAllowance := job.ConfigValue(STALE_ALLOWANCE).String() - price, cacheErr := getOracleResultFromCache(oracleId, staleAllowance, *oracleResultFetcher.redisService) + price, cacheErr := getOracleResultFromCache(oracleID, staleAllowance, *oracleResultFetcher.redisService) if cacheErr != nil { - // rework to re-perform job as we cant use carbon query client due to circular depedency logrus.Error(cacheErr) - var grpcErr error - price, grpcErr = getOracleResultFromGrpc(oracleId, oracleResultFetcher.grpcClient) - if grpcErr != nil { - return result, grpcErr + var apiErr error + price, apiErr = getOracleResultFromAPI(oracleID) + if apiErr != nil { + return result, apiErr } } @@ -103,23 +101,25 @@ func getOracleResultFromCache(oracleId string, staleAllowance string, redisServi return oracleCache.Price, nil } -func getOracleResultFromGrpc(oracleId string, grpcClient *grpc.ClientConn) (string, error) { - oracleClient := oracle.NewQueryClient(grpcClient) - request := &oracle.QueryResultsRequest{ - OracleId: oracleId, +func getOracleResultFromAPI(oracleID string) (string, error) { + oracleResultsURL := "https://api.carbon.network/carbon/oracle/v1/results/" + oracleID + response := HTTPRequest(oracleResultsURL, 10) + + if len(response) == 0 { + return "", fmt.Errorf("empty response from %s", oracleResultsURL) } - // Call the gRPC method to fetch data from the Oracle - response, err := oracleClient.Results(context.Background(), request) - if err != nil { - return "", err + type Response struct { + Results []oracle.Result `json:"results"` } - if len(response.Results) == 0 { - return "", fmt.Errorf("oracle: %s RPC result is empty", oracleId) + var parsedResponse Response + + if err := json.Unmarshal(response, &parsedResponse); err != nil { + return "", err } - grpcResult := []oracle.Result{response.Results[len(response.Results)-1]} + grpcResult := []oracle.Result{parsedResponse.Results[len(parsedResponse.Results)-1]} return grpcResult[0].Data, nil } diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index d8e3c27b438..fec939d32c4 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -1,7 +1,6 @@ package runner import ( - "context" "encoding/json" "errors" "fmt" @@ -125,22 +124,26 @@ func overwriteData(oracleId string, data string) string { // SyncOracles sync oracles with active on-chain oracles func SyncOracles(oracleInfo *types.OracleInfo) (oracles []types.Oracle, err error) { - // fetch oracle list first - oracleClient := oracletypes.NewQueryClient(oracleInfo.GrpcClient) - oracleRes, err := oracleClient.OracleAll( - context.Background(), - &oracletypes.QueryAllOracleRequest{ - //Pagination: &sdkquerytypes.PageRequest{} - }, - ) - if err != nil { - log.Error(err) + oraclesURL := "https://test-api.carbon.network/carbon/oracle/v1/oracles" + response := adapters.HTTPRequest(oraclesURL, 10) + + if len(response) == 0 { + return nil, fmt.Errorf("empty response from %s", oraclesURL) + } + + type Response struct { + Oracles []oracletypes.Oracle `json:"oracles"` + } + + var parsedResponse Response + + if err := json.Unmarshal(response, &parsedResponse); err != nil { return nil, err } - oraclesData := oracleRes.Oracles + oraclesData := parsedResponse - for _, oracle := range oraclesData { + for _, oracle := range oraclesData.Oracles { var spec types.OracleSpec err = json.Unmarshal([]byte(oracle.Spec), &spec) if err != nil { @@ -157,9 +160,16 @@ func SyncOracles(oracleInfo *types.OracleInfo) (oracles []types.Oracle, err erro log.Warnf("[oracle: %v,] invalid oracle jobs: %v", oracle.Id, err) continue } + + resoUint64, err := strconv.ParseUint(oracle.Resolution, 10, 64) + if err != nil { + log.Warnf("[oracle: %v,] unable to parse reso to uint64: %v", oracle.Id, err) + continue + } + oracles = append(oracles, types.Oracle{ Id: oracle.Id, - Resolution: uint64(oracle.Resolution), + Resolution: resoUint64, Spec: spec, }) } diff --git a/oracle/types/oracle.pb.go b/oracle/types/oracle.pb.go index 2046661595c..b0c5ae02fff 100644 --- a/oracle/types/oracle.pb.go +++ b/oracle/types/oracle.pb.go @@ -28,11 +28,11 @@ type Oracle struct { Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` - MinTurnoutPercentage int64 `protobuf:"varint,5,opt,name=min_turnout_percentage,json=minTurnoutPercentage,proto3" json:"min_turnout_percentage,omitempty"` - MaxResultAge int64 `protobuf:"varint,6,opt,name=max_result_age,json=maxResultAge,proto3" json:"max_result_age,omitempty"` + MinTurnoutPercentage string `protobuf:"bytes,5,opt,name=min_turnout_percentage,json=minTurnoutPercentage,proto3" json:"min_turnout_percentage,omitempty"` + MaxResultAge string `protobuf:"bytes,6,opt,name=max_result_age,json=maxResultAge,proto3" json:"max_result_age,omitempty"` SecurityType string `protobuf:"bytes,7,opt,name=security_type,json=securityType,proto3" json:"security_type,omitempty"` ResultStrategy string `protobuf:"bytes,8,opt,name=result_strategy,json=resultStrategy,proto3" json:"result_strategy,omitempty"` - Resolution int64 `protobuf:"varint,9,opt,name=resolution,proto3" json:"resolution,omitempty"` + Resolution string `protobuf:"bytes,9,opt,name=resolution,proto3" json:"resolution,omitempty"` Spec string `protobuf:"bytes,10,opt,name=spec,proto3" json:"spec,omitempty"` } @@ -71,7 +71,7 @@ var xxx_messageInfo_Oracle proto.InternalMessageInfo type Result struct { OracleId string `protobuf:"bytes,1,opt,name=oracle_id,json=oracleId,proto3" json:"oracle_id,omitempty" db:"oracle_id"` - Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty" db:"timestamp"` + Timestamp string `protobuf:"bytes,3,opt,name=timestamp,proto3" json:"timestamp,omitempty" db:"timestamp"` Data string `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty" db:"data"` } @@ -118,34 +118,34 @@ func init() { } var fileDescriptor_beeacc2d7716135d = []byte{ - // 429 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x4c, 0x92, 0x4f, 0x6f, 0xd3, 0x30, - 0x18, 0xc6, 0x9b, 0xb6, 0x64, 0xcb, 0xcb, 0x56, 0x24, 0x6b, 0xaa, 0x22, 0x0e, 0x59, 0xc9, 0x90, - 0x18, 0x97, 0x06, 0x09, 0x4e, 0xdc, 0xe8, 0x05, 0x71, 0x02, 0x65, 0x3b, 0x71, 0x89, 0x1c, 0xe7, - 0x25, 0xb3, 0xd4, 0xc4, 0x91, 0xfd, 0x46, 0xac, 0x5f, 0x02, 0xf1, 0xb1, 0x26, 0x4e, 0x3b, 0x72, - 0x9a, 0xa0, 0xfd, 0x06, 0xfb, 0x04, 0x53, 0xec, 0xf4, 0xcf, 0x29, 0xaf, 0x9f, 0xdf, 0xcf, 0x71, - 0xf2, 0xc8, 0x70, 0x71, 0xf5, 0x53, 0x92, 0xb8, 0x41, 0x95, 0x08, 0xae, 0x73, 0x55, 0x27, 0x4a, - 0x73, 0xb1, 0xc4, 0xfe, 0x31, 0x6f, 0xb4, 0x22, 0xc5, 0xa6, 0x5b, 0x69, 0xee, 0xa4, 0xb9, 0xa3, - 0x2f, 0xcf, 0x4a, 0x55, 0x2a, 0xab, 0x24, 0xdd, 0xe4, 0xec, 0xf8, 0xcf, 0x10, 0xfc, 0xaf, 0x56, - 0x60, 0x21, 0x1c, 0x09, 0x8d, 0x9c, 0x94, 0x0e, 0xbd, 0x99, 0x77, 0x19, 0xa4, 0xdb, 0x25, 0x9b, - 0xc0, 0x50, 0x16, 0xe1, 0xd0, 0x86, 0x43, 0x59, 0xb0, 0x19, 0x3c, 0x2f, 0xd0, 0x08, 0x2d, 0x1b, - 0x92, 0xaa, 0x0e, 0x47, 0x16, 0x1c, 0x46, 0x6c, 0x0a, 0xbe, 0x21, 0x4e, 0xad, 0x09, 0xc7, 0x16, - 0xf6, 0x2b, 0xf6, 0x01, 0xa6, 0x95, 0xac, 0x33, 0x6a, 0x75, 0xad, 0x5a, 0xca, 0x1a, 0xd4, 0x02, - 0x6b, 0xe2, 0x25, 0x86, 0xcf, 0x66, 0xde, 0xe5, 0x28, 0x3d, 0xab, 0x64, 0x7d, 0xed, 0xe0, 0xb7, - 0x1d, 0x63, 0xaf, 0x61, 0x52, 0xf1, 0xdb, 0x4c, 0xa3, 0x69, 0x97, 0x94, 0x75, 0xb6, 0x6f, 0xed, - 0x93, 0x8a, 0xdf, 0xa6, 0x36, 0xfc, 0x54, 0x22, 0xbb, 0x80, 0x53, 0x83, 0xa2, 0xd5, 0x92, 0x56, - 0x19, 0xad, 0x1a, 0x0c, 0x8f, 0xec, 0xd1, 0x27, 0xdb, 0xf0, 0x7a, 0xd5, 0x20, 0x7b, 0x03, 0x2f, - 0xfa, 0xd7, 0x18, 0xd2, 0x9c, 0xb0, 0x5c, 0x85, 0xc7, 0x56, 0x9b, 0xb8, 0xf8, 0xaa, 0x4f, 0x59, - 0x04, 0xa0, 0xd1, 0xa8, 0x65, 0x6b, 0x7f, 0x31, 0xb0, 0xe7, 0x1d, 0x24, 0x8c, 0xc1, 0xd8, 0x34, - 0x28, 0x42, 0xb0, 0xbb, 0xed, 0x1c, 0xff, 0xf2, 0xc0, 0x77, 0xdf, 0xc3, 0x12, 0x08, 0x5c, 0xef, - 0x99, 0x2c, 0x5c, 0x9d, 0x0b, 0xf6, 0xf8, 0x70, 0x3e, 0x29, 0xf2, 0x8f, 0xf1, 0x0e, 0xc4, 0xe9, - 0xb1, 0x9b, 0xbf, 0x14, 0xec, 0x1d, 0x04, 0x24, 0x2b, 0x34, 0xc4, 0xab, 0xc6, 0x36, 0x3a, 0xda, - 0x6f, 0xd8, 0x81, 0x38, 0xdd, 0x4b, 0xec, 0x15, 0x8c, 0x0b, 0x4e, 0xdc, 0x35, 0xbc, 0x38, 0x7d, - 0x7c, 0x38, 0x0f, 0x3a, 0xb9, 0xcb, 0xe2, 0xd4, 0xa2, 0xc5, 0xe7, 0xbb, 0xff, 0xd1, 0xe0, 0x6e, - 0x1d, 0x79, 0xf7, 0xeb, 0xc8, 0xfb, 0xb7, 0x8e, 0xbc, 0xdf, 0x9b, 0x68, 0x70, 0xbf, 0x89, 0x06, - 0x7f, 0x37, 0xd1, 0xe0, 0xfb, 0xdb, 0x52, 0xd2, 0x4d, 0x9b, 0xcf, 0x85, 0xaa, 0x12, 0xa1, 0x2a, - 0xa4, 0xfc, 0x07, 0xed, 0x87, 0xfe, 0x6e, 0x75, 0x4d, 0x9a, 0xdc, 0xb7, 0xb7, 0xe5, 0xfd, 0x53, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xbe, 0x9f, 0xe4, 0x4b, 0x82, 0x02, 0x00, 0x00, + // 421 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x4c, 0x92, 0xbf, 0x6e, 0xd4, 0x40, + 0x10, 0xc6, 0xcf, 0xc7, 0xe1, 0xc4, 0x03, 0x39, 0xa4, 0x55, 0x74, 0x5a, 0x51, 0x38, 0xc1, 0x41, + 0x02, 0x9a, 0x33, 0x12, 0x54, 0x74, 0x5c, 0x83, 0xa8, 0x40, 0x4e, 0x2a, 0x1a, 0x6b, 0xbd, 0x1e, + 0x9c, 0x95, 0xce, 0x5e, 0x6b, 0x77, 0x2c, 0x72, 0x2f, 0x81, 0x78, 0xac, 0x88, 0x2a, 0x25, 0x55, + 0x04, 0x77, 0x6f, 0x90, 0x27, 0x40, 0xde, 0xf5, 0xfd, 0xa9, 0x3c, 0xfb, 0xfd, 0x7e, 0xb6, 0xbc, + 0x9f, 0x06, 0x2e, 0x2e, 0x7f, 0x28, 0x92, 0xd7, 0xa8, 0x53, 0x29, 0x4c, 0xa1, 0x9b, 0x54, 0x1b, + 0x21, 0x97, 0x38, 0x3c, 0xe6, 0xad, 0xd1, 0xa4, 0xd9, 0x6c, 0x2b, 0xcd, 0xbd, 0x34, 0xf7, 0xf4, + 0xf9, 0x69, 0xa5, 0x2b, 0xed, 0x94, 0xb4, 0x9f, 0xbc, 0x9d, 0xfc, 0x1e, 0x43, 0xf8, 0xc5, 0x09, + 0x8c, 0xc3, 0x91, 0x34, 0x28, 0x48, 0x1b, 0x1e, 0x9c, 0x07, 0xaf, 0xa3, 0x6c, 0x7b, 0x64, 0x53, + 0x18, 0xab, 0x92, 0x8f, 0x5d, 0x38, 0x56, 0x25, 0x3b, 0x87, 0x27, 0x25, 0x5a, 0x69, 0x54, 0x4b, + 0x4a, 0x37, 0xfc, 0x91, 0x03, 0x87, 0x11, 0x9b, 0x41, 0x68, 0x49, 0x50, 0x67, 0xf9, 0xc4, 0xc1, + 0xe1, 0xc4, 0xde, 0xc3, 0xac, 0x56, 0x4d, 0x4e, 0x9d, 0x69, 0x74, 0x47, 0x79, 0x8b, 0x46, 0x62, + 0x43, 0xa2, 0x42, 0xfe, 0xd8, 0x79, 0xa7, 0xb5, 0x6a, 0xae, 0x3c, 0xfc, 0xba, 0x63, 0xec, 0x25, + 0x4c, 0x6b, 0x71, 0x93, 0x1b, 0xb4, 0xdd, 0x92, 0xf2, 0xde, 0x0e, 0x9d, 0xfd, 0xb4, 0x16, 0x37, + 0x99, 0x0b, 0x3f, 0x56, 0xc8, 0x2e, 0xe0, 0xc4, 0xa2, 0xec, 0x8c, 0xa2, 0x55, 0x4e, 0xab, 0x16, + 0xf9, 0x91, 0x97, 0xb6, 0xe1, 0xd5, 0xaa, 0x45, 0xf6, 0x0a, 0x9e, 0x0d, 0x9f, 0xb1, 0x64, 0x04, + 0x61, 0xb5, 0xe2, 0xc7, 0x4e, 0x9b, 0xfa, 0xf8, 0x72, 0x48, 0x59, 0x0c, 0x60, 0xd0, 0xea, 0x65, + 0xe7, 0xae, 0x18, 0x39, 0xe7, 0x20, 0x61, 0x0c, 0x26, 0xb6, 0x45, 0xc9, 0xc1, 0x11, 0x37, 0x27, + 0x3f, 0x03, 0x08, 0xfd, 0xff, 0xb0, 0x14, 0x22, 0xdf, 0x7b, 0xae, 0x4a, 0x5f, 0xe7, 0x82, 0x3d, + 0xdc, 0x9f, 0x4d, 0xcb, 0xe2, 0x43, 0xb2, 0x03, 0x49, 0x76, 0xec, 0xe7, 0xcf, 0x25, 0x7b, 0x0b, + 0x11, 0xa9, 0x1a, 0x2d, 0x89, 0xba, 0xf5, 0x8d, 0xee, 0x5f, 0xd8, 0x81, 0x24, 0xdb, 0x4b, 0xec, + 0x05, 0x4c, 0x4a, 0x41, 0xc2, 0x37, 0xbc, 0x38, 0x79, 0xb8, 0x3f, 0x8b, 0x7a, 0xb9, 0xcf, 0x92, + 0xcc, 0xa1, 0xc5, 0xa7, 0xdb, 0x7f, 0xf1, 0xe8, 0x76, 0x1d, 0x07, 0x77, 0xeb, 0x38, 0xf8, 0xbb, + 0x8e, 0x83, 0x5f, 0x9b, 0x78, 0x74, 0xb7, 0x89, 0x47, 0x7f, 0x36, 0xf1, 0xe8, 0xdb, 0x9b, 0x4a, + 0xd1, 0x75, 0x57, 0xcc, 0xa5, 0xae, 0x53, 0xa9, 0x6b, 0xa4, 0xe2, 0x3b, 0xed, 0x87, 0x61, 0xb7, + 0xfa, 0x26, 0x6d, 0x11, 0xba, 0x6d, 0x79, 0xf7, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x5d, 0xa8, 0x5c, + 0xa8, 0x82, 0x02, 0x00, 0x00, } func (m *Oracle) Marshal() (dAtA []byte, err error) { @@ -175,10 +175,12 @@ func (m *Oracle) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x52 } - if m.Resolution != 0 { - i = encodeVarintOracle(dAtA, i, uint64(m.Resolution)) + if len(m.Resolution) > 0 { + i -= len(m.Resolution) + copy(dAtA[i:], m.Resolution) + i = encodeVarintOracle(dAtA, i, uint64(len(m.Resolution))) i-- - dAtA[i] = 0x48 + dAtA[i] = 0x4a } if len(m.ResultStrategy) > 0 { i -= len(m.ResultStrategy) @@ -194,15 +196,19 @@ func (m *Oracle) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x3a } - if m.MaxResultAge != 0 { - i = encodeVarintOracle(dAtA, i, uint64(m.MaxResultAge)) + if len(m.MaxResultAge) > 0 { + i -= len(m.MaxResultAge) + copy(dAtA[i:], m.MaxResultAge) + i = encodeVarintOracle(dAtA, i, uint64(len(m.MaxResultAge))) i-- - dAtA[i] = 0x30 + dAtA[i] = 0x32 } - if m.MinTurnoutPercentage != 0 { - i = encodeVarintOracle(dAtA, i, uint64(m.MinTurnoutPercentage)) + if len(m.MinTurnoutPercentage) > 0 { + i -= len(m.MinTurnoutPercentage) + copy(dAtA[i:], m.MinTurnoutPercentage) + i = encodeVarintOracle(dAtA, i, uint64(len(m.MinTurnoutPercentage))) i-- - dAtA[i] = 0x28 + dAtA[i] = 0x2a } if len(m.Status) > 0 { i -= len(m.Status) @@ -262,10 +268,12 @@ func (m *Result) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x22 } - if m.Timestamp != 0 { - i = encodeVarintOracle(dAtA, i, uint64(m.Timestamp)) + if len(m.Timestamp) > 0 { + i -= len(m.Timestamp) + copy(dAtA[i:], m.Timestamp) + i = encodeVarintOracle(dAtA, i, uint64(len(m.Timestamp))) i-- - dAtA[i] = 0x18 + dAtA[i] = 0x1a } if len(m.OracleId) > 0 { i -= len(m.OracleId) @@ -310,11 +318,13 @@ func (m *Oracle) Size() (n int) { if l > 0 { n += 1 + l + sovOracle(uint64(l)) } - if m.MinTurnoutPercentage != 0 { - n += 1 + sovOracle(uint64(m.MinTurnoutPercentage)) + l = len(m.MinTurnoutPercentage) + if l > 0 { + n += 1 + l + sovOracle(uint64(l)) } - if m.MaxResultAge != 0 { - n += 1 + sovOracle(uint64(m.MaxResultAge)) + l = len(m.MaxResultAge) + if l > 0 { + n += 1 + l + sovOracle(uint64(l)) } l = len(m.SecurityType) if l > 0 { @@ -324,8 +334,9 @@ func (m *Oracle) Size() (n int) { if l > 0 { n += 1 + l + sovOracle(uint64(l)) } - if m.Resolution != 0 { - n += 1 + sovOracle(uint64(m.Resolution)) + l = len(m.Resolution) + if l > 0 { + n += 1 + l + sovOracle(uint64(l)) } l = len(m.Spec) if l > 0 { @@ -344,8 +355,9 @@ func (m *Result) Size() (n int) { if l > 0 { n += 1 + l + sovOracle(uint64(l)) } - if m.Timestamp != 0 { - n += 1 + sovOracle(uint64(m.Timestamp)) + l = len(m.Timestamp) + if l > 0 { + n += 1 + l + sovOracle(uint64(l)) } l = len(m.Data) if l > 0 { @@ -518,10 +530,10 @@ func (m *Oracle) Unmarshal(dAtA []byte) error { m.Status = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 5: - if wireType != 0 { + if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field MinTurnoutPercentage", wireType) } - m.MinTurnoutPercentage = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowOracle @@ -531,16 +543,29 @@ func (m *Oracle) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.MinTurnoutPercentage |= int64(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthOracle + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOracle + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MinTurnoutPercentage = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex case 6: - if wireType != 0 { + if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field MaxResultAge", wireType) } - m.MaxResultAge = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowOracle @@ -550,11 +575,24 @@ func (m *Oracle) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.MaxResultAge |= int64(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthOracle + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOracle + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MaxResultAge = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex case 7: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field SecurityType", wireType) @@ -620,10 +658,10 @@ func (m *Oracle) Unmarshal(dAtA []byte) error { m.ResultStrategy = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 9: - if wireType != 0 { + if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Resolution", wireType) } - m.Resolution = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowOracle @@ -633,11 +671,24 @@ func (m *Oracle) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Resolution |= int64(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthOracle + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOracle + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Resolution = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex case 10: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) @@ -753,10 +804,10 @@ func (m *Result) Unmarshal(dAtA []byte) error { m.OracleId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: - if wireType != 0 { + if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) } - m.Timestamp = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowOracle @@ -766,11 +817,24 @@ func (m *Result) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Timestamp |= int64(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthOracle + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOracle + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Timestamp = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) diff --git a/oracle/types/query.pb.go b/oracle/types/query.pb.go deleted file mode 100644 index 8cc09461f7f..00000000000 --- a/oracle/types/query.pb.go +++ /dev/null @@ -1,918 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: Switcheo/carbon/oracle/query.proto - -package types - -import ( - context "context" - fmt "fmt" - _ "github.com/cosmos/gogoproto/gogoproto" - grpc1 "github.com/cosmos/gogoproto/grpc" - proto "github.com/cosmos/gogoproto/proto" - _ "google.golang.org/genproto/googleapis/api/annotations" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - io "io" - math "math" - math_bits "math/bits" -) - -// 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.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -type QueryAllOracleRequest struct { -} - -func (m *QueryAllOracleRequest) Reset() { *m = QueryAllOracleRequest{} } -func (m *QueryAllOracleRequest) String() string { return proto.CompactTextString(m) } -func (*QueryAllOracleRequest) ProtoMessage() {} -func (*QueryAllOracleRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8c80f252cd67c921, []int{0} -} -func (m *QueryAllOracleRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryAllOracleRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryAllOracleRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryAllOracleRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryAllOracleRequest.Merge(m, src) -} -func (m *QueryAllOracleRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryAllOracleRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryAllOracleRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryAllOracleRequest proto.InternalMessageInfo - -type QueryAllOracleResponse struct { - Oracles []Oracle `protobuf:"bytes,1,rep,name=oracles,proto3" json:"oracles"` -} - -func (m *QueryAllOracleResponse) Reset() { *m = QueryAllOracleResponse{} } -func (m *QueryAllOracleResponse) String() string { return proto.CompactTextString(m) } -func (*QueryAllOracleResponse) ProtoMessage() {} -func (*QueryAllOracleResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8c80f252cd67c921, []int{1} -} -func (m *QueryAllOracleResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryAllOracleResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryAllOracleResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryAllOracleResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryAllOracleResponse.Merge(m, src) -} -func (m *QueryAllOracleResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryAllOracleResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryAllOracleResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryAllOracleResponse proto.InternalMessageInfo - -type QueryResultsRequest struct { - OracleId string `protobuf:"bytes,1,opt,name=oracle_id,json=oracleId,proto3" json:"oracle_id,omitempty"` -} - -func (m *QueryResultsRequest) Reset() { *m = QueryResultsRequest{} } -func (m *QueryResultsRequest) String() string { return proto.CompactTextString(m) } -func (*QueryResultsRequest) ProtoMessage() {} -func (*QueryResultsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_8c80f252cd67c921, []int{2} -} -func (m *QueryResultsRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryResultsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryResultsRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryResultsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryResultsRequest.Merge(m, src) -} -func (m *QueryResultsRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryResultsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryResultsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryResultsRequest proto.InternalMessageInfo - -type QueryResultsResponse struct { - Results []Result `protobuf:"bytes,1,rep,name=results,proto3" json:"results"` -} - -func (m *QueryResultsResponse) Reset() { *m = QueryResultsResponse{} } -func (m *QueryResultsResponse) String() string { return proto.CompactTextString(m) } -func (*QueryResultsResponse) ProtoMessage() {} -func (*QueryResultsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_8c80f252cd67c921, []int{3} -} -func (m *QueryResultsResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryResultsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryResultsResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryResultsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryResultsResponse.Merge(m, src) -} -func (m *QueryResultsResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryResultsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryResultsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryResultsResponse proto.InternalMessageInfo - -func init() { - proto.RegisterType((*QueryAllOracleRequest)(nil), "Switcheo.carbon.oracle.QueryAllOracleRequest") - proto.RegisterType((*QueryAllOracleResponse)(nil), "Switcheo.carbon.oracle.QueryAllOracleResponse") - proto.RegisterType((*QueryResultsRequest)(nil), "Switcheo.carbon.oracle.QueryResultsRequest") - proto.RegisterType((*QueryResultsResponse)(nil), "Switcheo.carbon.oracle.QueryResultsResponse") -} - -func init() { - proto.RegisterFile("Switcheo/carbon/oracle/query.proto", fileDescriptor_8c80f252cd67c921) -} - -var fileDescriptor_8c80f252cd67c921 = []byte{ - // 391 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x0a, 0x2e, 0xcf, 0x2c, - 0x49, 0xce, 0x48, 0xcd, 0xd7, 0x4f, 0x4e, 0x2c, 0x4a, 0xca, 0xcf, 0xd3, 0xcf, 0x2f, 0x4a, 0x4c, - 0xce, 0x49, 0xd5, 0x2f, 0x2c, 0x4d, 0x2d, 0xaa, 0xd4, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, - 0x83, 0xa9, 0xd1, 0x83, 0xa8, 0xd1, 0x83, 0xa8, 0x91, 0x92, 0x49, 0xcf, 0xcf, 0x4f, 0xcf, 0x49, - 0xd5, 0x4f, 0x2c, 0xc8, 0xd4, 0x4f, 0xcc, 0xcb, 0xcb, 0x2f, 0x49, 0x2c, 0xc9, 0xcc, 0xcf, 0x2b, - 0x86, 0xe8, 0x92, 0x12, 0x49, 0xcf, 0x4f, 0xcf, 0x07, 0x33, 0xf5, 0x41, 0x2c, 0xa8, 0xa8, 0x32, - 0x0e, 0xfb, 0x20, 0x14, 0x44, 0x91, 0x92, 0x38, 0x97, 0x68, 0x20, 0xc8, 0x7e, 0xc7, 0x9c, 0x1c, - 0x7f, 0xb0, 0x78, 0x50, 0x6a, 0x61, 0x69, 0x6a, 0x71, 0x89, 0x52, 0x04, 0x97, 0x18, 0xba, 0x44, - 0x71, 0x41, 0x7e, 0x5e, 0x71, 0xaa, 0x90, 0x1d, 0x17, 0x3b, 0xc4, 0x88, 0x62, 0x09, 0x46, 0x05, - 0x66, 0x0d, 0x6e, 0x23, 0x39, 0x3d, 0xec, 0xae, 0xd6, 0x83, 0x68, 0x74, 0x62, 0x39, 0x71, 0x4f, - 0x9e, 0x21, 0x08, 0xa6, 0x49, 0xc9, 0x88, 0x4b, 0x18, 0x6c, 0x72, 0x50, 0x6a, 0x71, 0x69, 0x4e, - 0x49, 0x31, 0xd4, 0x42, 0x21, 0x69, 0x2e, 0x4e, 0x88, 0x8a, 0xf8, 0xcc, 0x14, 0x09, 0x46, 0x05, - 0x46, 0x0d, 0xce, 0x20, 0x0e, 0x88, 0x80, 0x67, 0x8a, 0x52, 0x18, 0x97, 0x08, 0xaa, 0x1e, 0x84, - 0x5b, 0x8a, 0x20, 0x42, 0x84, 0xdc, 0x02, 0xd1, 0x09, 0x73, 0x0b, 0x54, 0x93, 0xd1, 0x29, 0x26, - 0x2e, 0x56, 0xb0, 0xc1, 0x42, 0xbd, 0x8c, 0x5c, 0x9c, 0x10, 0xf7, 0x3a, 0xe6, 0xe4, 0x08, 0xe9, - 0xe2, 0x32, 0x06, 0x6b, 0x60, 0x49, 0xe9, 0x11, 0xab, 0x1c, 0xe2, 0x6c, 0x25, 0xc5, 0xa6, 0xcb, - 0x4f, 0x26, 0x33, 0x49, 0x0b, 0x49, 0xa2, 0x45, 0x4d, 0x99, 0x21, 0x94, 0x55, 0x2c, 0xb4, 0x81, - 0x91, 0x8b, 0x1d, 0xea, 0x5b, 0x21, 0x6d, 0xbc, 0xc6, 0xa3, 0x86, 0xa3, 0x94, 0x0e, 0x71, 0x8a, - 0xa1, 0x2e, 0xf1, 0x02, 0xbb, 0xc4, 0x25, 0x0a, 0xab, 0x5b, 0xa0, 0xa1, 0x24, 0xa4, 0x8a, 0x53, - 0x4a, 0xbf, 0x1a, 0x1e, 0x67, 0xb5, 0x4e, 0xee, 0x27, 0x1e, 0xca, 0x31, 0x9c, 0x78, 0x24, 0xc7, - 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, 0x31, 0x5c, 0x78, 0x2c, - 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x66, 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, - 0x7e, 0xae, 0x7e, 0x72, 0x7e, 0x6e, 0x6a, 0x49, 0x52, 0x5a, 0x09, 0x82, 0x01, 0x35, 0xb9, 0xa4, - 0xb2, 0x20, 0xb5, 0x38, 0x89, 0x0d, 0x9c, 0x36, 0x8d, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0x5d, - 0xd0, 0x8a, 0x79, 0x32, 0x03, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// QueryClient is the client API for Query service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type QueryClient interface { - // Get details for all oracles - OracleAll(ctx context.Context, in *QueryAllOracleRequest, opts ...grpc.CallOption) (*QueryAllOracleResponse, error) - // Get results for all oracles, or a specific oracle - Results(ctx context.Context, in *QueryResultsRequest, opts ...grpc.CallOption) (*QueryResultsResponse, error) -} - -type queryClient struct { - cc grpc1.ClientConn -} - -func NewQueryClient(cc grpc1.ClientConn) QueryClient { - return &queryClient{cc} -} - -func (c *queryClient) OracleAll(ctx context.Context, in *QueryAllOracleRequest, opts ...grpc.CallOption) (*QueryAllOracleResponse, error) { - out := new(QueryAllOracleResponse) - err := c.cc.Invoke(ctx, "/Switcheo.carbon.oracle.Query/OracleAll", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) Results(ctx context.Context, in *QueryResultsRequest, opts ...grpc.CallOption) (*QueryResultsResponse, error) { - out := new(QueryResultsResponse) - err := c.cc.Invoke(ctx, "/Switcheo.carbon.oracle.Query/Results", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// QueryServer is the server API for Query service. -type QueryServer interface { - // Get details for all oracles - OracleAll(context.Context, *QueryAllOracleRequest) (*QueryAllOracleResponse, error) - // Get results for all oracles, or a specific oracle - Results(context.Context, *QueryResultsRequest) (*QueryResultsResponse, error) -} - -// UnimplementedQueryServer can be embedded to have forward compatible implementations. -type UnimplementedQueryServer struct { -} - -func (*UnimplementedQueryServer) OracleAll(ctx context.Context, req *QueryAllOracleRequest) (*QueryAllOracleResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method OracleAll not implemented") -} -func (*UnimplementedQueryServer) Results(ctx context.Context, req *QueryResultsRequest) (*QueryResultsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Results not implemented") -} - -func RegisterQueryServer(s grpc1.Server, srv QueryServer) { - s.RegisterService(&_Query_serviceDesc, srv) -} - -func _Query_OracleAll_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryAllOracleRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).OracleAll(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/Switcheo.carbon.oracle.Query/OracleAll", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).OracleAll(ctx, req.(*QueryAllOracleRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_Results_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryResultsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).Results(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/Switcheo.carbon.oracle.Query/Results", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).Results(ctx, req.(*QueryResultsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _Query_serviceDesc = grpc.ServiceDesc{ - ServiceName: "Switcheo.carbon.oracle.Query", - HandlerType: (*QueryServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "OracleAll", - Handler: _Query_OracleAll_Handler, - }, - { - MethodName: "Results", - Handler: _Query_Results_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "Switcheo/carbon/oracle/query.proto", -} - -func (m *QueryAllOracleRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryAllOracleRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryAllOracleRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryAllOracleResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryAllOracleResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryAllOracleResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Oracles) > 0 { - for iNdEx := len(m.Oracles) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Oracles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *QueryResultsRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryResultsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryResultsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.OracleId) > 0 { - i -= len(m.OracleId) - copy(dAtA[i:], m.OracleId) - i = encodeVarintQuery(dAtA, i, uint64(len(m.OracleId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *QueryResultsResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryResultsResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryResultsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Results) > 0 { - for iNdEx := len(m.Results) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Results[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { - offset -= sovQuery(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *QueryAllOracleRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryAllOracleResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Oracles) > 0 { - for _, e := range m.Oracles { - l = e.Size() - n += 1 + l + sovQuery(uint64(l)) - } - } - return n -} - -func (m *QueryResultsRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.OracleId) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryResultsResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Results) > 0 { - for _, e := range m.Results { - l = e.Size() - n += 1 + l + sovQuery(uint64(l)) - } - } - return n -} - -func sovQuery(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozQuery(x uint64) (n int) { - return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *QueryAllOracleRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryAllOracleRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryAllOracleRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryAllOracleResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryAllOracleResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryAllOracleResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Oracles", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Oracles = append(m.Oracles, Oracle{}) - if err := m.Oracles[len(m.Oracles)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryResultsRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryResultsRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryResultsRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OracleId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.OracleId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryResultsResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryResultsResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryResultsResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Results", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Results = append(m.Results, Result{}) - if err := m.Results[len(m.Results)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipQuery(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowQuery - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowQuery - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowQuery - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthQuery - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupQuery - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthQuery - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthQuery = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowQuery = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupQuery = fmt.Errorf("proto: unexpected end of group") -) diff --git a/proto/Switcheo/carbon/oracle/oracle.proto b/proto/Switcheo/carbon/oracle/oracle.proto index e30b1dc3b03..3fd5b6429ae 100644 --- a/proto/Switcheo/carbon/oracle/oracle.proto +++ b/proto/Switcheo/carbon/oracle/oracle.proto @@ -11,17 +11,17 @@ message Oracle { string id = 2; string description = 3; string status = 4; - int64 min_turnout_percentage = 5; - int64 max_result_age = 6; + string min_turnout_percentage = 5; + string max_result_age = 6; string security_type = 7; string result_strategy = 8; - int64 resolution = 9; + string resolution = 9; string spec = 10; } message Result { string oracle_id = 1 [ (gogoproto.moretags) = "db:\"oracle_id\"" ]; - int64 timestamp = 3 [ (gogoproto.moretags) = "db:\"timestamp\"" ]; + string timestamp = 3 [ (gogoproto.moretags) = "db:\"timestamp\"" ]; string data = 4 [ (gogoproto.moretags) = "db:\"data\"" ]; } diff --git a/proto/Switcheo/carbon/oracle/query.proto b/proto/Switcheo/carbon/oracle/query.proto deleted file mode 100644 index a4fd797ff1c..00000000000 --- a/proto/Switcheo/carbon/oracle/query.proto +++ /dev/null @@ -1,41 +0,0 @@ -syntax = "proto3"; -package Switcheo.carbon.oracle; - -import "google/api/annotations.proto"; -import "gogoproto/gogo.proto"; -// this line is used by starport scaffolding # 1 -import "Switcheo/carbon/oracle/oracle.proto"; - -option go_package = "github.com/cometbft/cometbft/oracle/types"; -option (gogoproto.goproto_getters_all) = false; - -// Query defines the gRPC querier service. -service Query { - // Get details for all oracles - rpc OracleAll(QueryAllOracleRequest) returns (QueryAllOracleResponse) { - option (google.api.http).get = "/carbon/oracle/v1/oracles"; - } - - // Get results for all oracles, or a specific oracle - rpc Results(QueryResultsRequest) returns (QueryResultsResponse) { - option (google.api.http) = { - get : "/carbon/oracle/v1/results/{oracle_id}" - additional_bindings {get : "/carbon/oracle/v1/results"} - }; - } - -} - -message QueryAllOracleRequest {} - -message QueryAllOracleResponse { - repeated Oracle oracles = 1 [(gogoproto.nullable) = false]; -} - -message QueryResultsRequest { - string oracle_id = 1; -} - -message QueryResultsResponse { - repeated Result results = 1 [ (gogoproto.nullable) = false ]; -} From 2e2f0ed48e0cdac6cc93fc569eeae30b3b391883 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Wed, 28 Feb 2024 14:51:53 +0800 Subject: [PATCH 016/150] shift proto file and update package name to prevent clash with carbon --- Makefile | 1 - .../service/adapters/oracle_result_fetcher.go | 2 +- oracle/service/runner/runner.go | 4 +- oracle/types/oracle.pb.go | 974 ------------------ proto/Switcheo/carbon/oracle/oracle.proto | 27 - proto/tendermint/oracle/types.pb.go | 945 ++++++++++++++++- proto/tendermint/oracle/types.proto | 21 + 7 files changed, 947 insertions(+), 1027 deletions(-) delete mode 100644 oracle/types/oracle.pb.go delete mode 100644 proto/Switcheo/carbon/oracle/oracle.proto diff --git a/Makefile b/Makefile index 0b095ee061e..3205bbaaf70 100644 --- a/Makefile +++ b/Makefile @@ -139,7 +139,6 @@ proto-gen: check-proto-deps @go run github.com/bufbuild/buf/cmd/buf generate @mv ./proto/tendermint/abci/types.pb.go ./abci/types/ @cp ./proto/tendermint/rpc/grpc/types.pb.go ./rpc/grpc - @mv ./proto/Switcheo/carbon/oracle/*.pb.go ./oracle/types/ .PHONY: proto-gen # These targets are provided for convenience and are intended for local diff --git a/oracle/service/adapters/oracle_result_fetcher.go b/oracle/service/adapters/oracle_result_fetcher.go index 4ca0006dc93..6f11d8aaf08 100644 --- a/oracle/service/adapters/oracle_result_fetcher.go +++ b/oracle/service/adapters/oracle_result_fetcher.go @@ -7,7 +7,7 @@ import ( "time" "github.com/cometbft/cometbft/oracle/service/types" - oracle "github.com/cometbft/cometbft/oracle/types" + "github.com/cometbft/cometbft/proto/tendermint/oracle" "github.com/cometbft/cometbft/redis" "github.com/sirupsen/logrus" diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index fec939d32c4..641536b8699 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -13,7 +13,7 @@ import ( "github.com/cometbft/cometbft/oracle/service/adapters" "github.com/cometbft/cometbft/oracle/service/parser" "github.com/cometbft/cometbft/oracle/service/types" - oracletypes "github.com/cometbft/cometbft/oracle/types" + "github.com/cometbft/cometbft/proto/tendermint/oracle" oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" "github.com/cometbft/cometbft/redis" ) @@ -132,7 +132,7 @@ func SyncOracles(oracleInfo *types.OracleInfo) (oracles []types.Oracle, err erro } type Response struct { - Oracles []oracletypes.Oracle `json:"oracles"` + Oracles []oracle.Oracle `json:"oracles"` } var parsedResponse Response diff --git a/oracle/types/oracle.pb.go b/oracle/types/oracle.pb.go deleted file mode 100644 index b0c5ae02fff..00000000000 --- a/oracle/types/oracle.pb.go +++ /dev/null @@ -1,974 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: Switcheo/carbon/oracle/oracle.proto - -package types - -import ( - fmt "fmt" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// 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.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -type Oracle struct { - Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` - Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` - Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` - MinTurnoutPercentage string `protobuf:"bytes,5,opt,name=min_turnout_percentage,json=minTurnoutPercentage,proto3" json:"min_turnout_percentage,omitempty"` - MaxResultAge string `protobuf:"bytes,6,opt,name=max_result_age,json=maxResultAge,proto3" json:"max_result_age,omitempty"` - SecurityType string `protobuf:"bytes,7,opt,name=security_type,json=securityType,proto3" json:"security_type,omitempty"` - ResultStrategy string `protobuf:"bytes,8,opt,name=result_strategy,json=resultStrategy,proto3" json:"result_strategy,omitempty"` - Resolution string `protobuf:"bytes,9,opt,name=resolution,proto3" json:"resolution,omitempty"` - Spec string `protobuf:"bytes,10,opt,name=spec,proto3" json:"spec,omitempty"` -} - -func (m *Oracle) Reset() { *m = Oracle{} } -func (m *Oracle) String() string { return proto.CompactTextString(m) } -func (*Oracle) ProtoMessage() {} -func (*Oracle) Descriptor() ([]byte, []int) { - return fileDescriptor_beeacc2d7716135d, []int{0} -} -func (m *Oracle) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Oracle) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Oracle.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Oracle) XXX_Merge(src proto.Message) { - xxx_messageInfo_Oracle.Merge(m, src) -} -func (m *Oracle) XXX_Size() int { - return m.Size() -} -func (m *Oracle) XXX_DiscardUnknown() { - xxx_messageInfo_Oracle.DiscardUnknown(m) -} - -var xxx_messageInfo_Oracle proto.InternalMessageInfo - -type Result struct { - OracleId string `protobuf:"bytes,1,opt,name=oracle_id,json=oracleId,proto3" json:"oracle_id,omitempty" db:"oracle_id"` - Timestamp string `protobuf:"bytes,3,opt,name=timestamp,proto3" json:"timestamp,omitempty" db:"timestamp"` - Data string `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty" db:"data"` -} - -func (m *Result) Reset() { *m = Result{} } -func (m *Result) String() string { return proto.CompactTextString(m) } -func (*Result) ProtoMessage() {} -func (*Result) Descriptor() ([]byte, []int) { - return fileDescriptor_beeacc2d7716135d, []int{1} -} -func (m *Result) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Result) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Result.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Result) XXX_Merge(src proto.Message) { - xxx_messageInfo_Result.Merge(m, src) -} -func (m *Result) XXX_Size() int { - return m.Size() -} -func (m *Result) XXX_DiscardUnknown() { - xxx_messageInfo_Result.DiscardUnknown(m) -} - -var xxx_messageInfo_Result proto.InternalMessageInfo - -func init() { - proto.RegisterType((*Oracle)(nil), "Switcheo.carbon.oracle.Oracle") - proto.RegisterType((*Result)(nil), "Switcheo.carbon.oracle.Result") -} - -func init() { - proto.RegisterFile("Switcheo/carbon/oracle/oracle.proto", fileDescriptor_beeacc2d7716135d) -} - -var fileDescriptor_beeacc2d7716135d = []byte{ - // 421 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x4c, 0x92, 0xbf, 0x6e, 0xd4, 0x40, - 0x10, 0xc6, 0xcf, 0xc7, 0xe1, 0xc4, 0x03, 0x39, 0xa4, 0x55, 0x74, 0x5a, 0x51, 0x38, 0xc1, 0x41, - 0x02, 0x9a, 0x33, 0x12, 0x54, 0x74, 0x5c, 0x83, 0xa8, 0x40, 0x4e, 0x2a, 0x1a, 0x6b, 0xbd, 0x1e, - 0x9c, 0x95, 0xce, 0x5e, 0x6b, 0x77, 0x2c, 0x72, 0x2f, 0x81, 0x78, 0xac, 0x88, 0x2a, 0x25, 0x55, - 0x04, 0x77, 0x6f, 0x90, 0x27, 0x40, 0xde, 0xf5, 0xfd, 0xa9, 0x3c, 0xfb, 0xfd, 0x7e, 0xb6, 0xbc, - 0x9f, 0x06, 0x2e, 0x2e, 0x7f, 0x28, 0x92, 0xd7, 0xa8, 0x53, 0x29, 0x4c, 0xa1, 0x9b, 0x54, 0x1b, - 0x21, 0x97, 0x38, 0x3c, 0xe6, 0xad, 0xd1, 0xa4, 0xd9, 0x6c, 0x2b, 0xcd, 0xbd, 0x34, 0xf7, 0xf4, - 0xf9, 0x69, 0xa5, 0x2b, 0xed, 0x94, 0xb4, 0x9f, 0xbc, 0x9d, 0xfc, 0x1e, 0x43, 0xf8, 0xc5, 0x09, - 0x8c, 0xc3, 0x91, 0x34, 0x28, 0x48, 0x1b, 0x1e, 0x9c, 0x07, 0xaf, 0xa3, 0x6c, 0x7b, 0x64, 0x53, - 0x18, 0xab, 0x92, 0x8f, 0x5d, 0x38, 0x56, 0x25, 0x3b, 0x87, 0x27, 0x25, 0x5a, 0x69, 0x54, 0x4b, - 0x4a, 0x37, 0xfc, 0x91, 0x03, 0x87, 0x11, 0x9b, 0x41, 0x68, 0x49, 0x50, 0x67, 0xf9, 0xc4, 0xc1, - 0xe1, 0xc4, 0xde, 0xc3, 0xac, 0x56, 0x4d, 0x4e, 0x9d, 0x69, 0x74, 0x47, 0x79, 0x8b, 0x46, 0x62, - 0x43, 0xa2, 0x42, 0xfe, 0xd8, 0x79, 0xa7, 0xb5, 0x6a, 0xae, 0x3c, 0xfc, 0xba, 0x63, 0xec, 0x25, - 0x4c, 0x6b, 0x71, 0x93, 0x1b, 0xb4, 0xdd, 0x92, 0xf2, 0xde, 0x0e, 0x9d, 0xfd, 0xb4, 0x16, 0x37, - 0x99, 0x0b, 0x3f, 0x56, 0xc8, 0x2e, 0xe0, 0xc4, 0xa2, 0xec, 0x8c, 0xa2, 0x55, 0x4e, 0xab, 0x16, - 0xf9, 0x91, 0x97, 0xb6, 0xe1, 0xd5, 0xaa, 0x45, 0xf6, 0x0a, 0x9e, 0x0d, 0x9f, 0xb1, 0x64, 0x04, - 0x61, 0xb5, 0xe2, 0xc7, 0x4e, 0x9b, 0xfa, 0xf8, 0x72, 0x48, 0x59, 0x0c, 0x60, 0xd0, 0xea, 0x65, - 0xe7, 0xae, 0x18, 0x39, 0xe7, 0x20, 0x61, 0x0c, 0x26, 0xb6, 0x45, 0xc9, 0xc1, 0x11, 0x37, 0x27, - 0x3f, 0x03, 0x08, 0xfd, 0xff, 0xb0, 0x14, 0x22, 0xdf, 0x7b, 0xae, 0x4a, 0x5f, 0xe7, 0x82, 0x3d, - 0xdc, 0x9f, 0x4d, 0xcb, 0xe2, 0x43, 0xb2, 0x03, 0x49, 0x76, 0xec, 0xe7, 0xcf, 0x25, 0x7b, 0x0b, - 0x11, 0xa9, 0x1a, 0x2d, 0x89, 0xba, 0xf5, 0x8d, 0xee, 0x5f, 0xd8, 0x81, 0x24, 0xdb, 0x4b, 0xec, - 0x05, 0x4c, 0x4a, 0x41, 0xc2, 0x37, 0xbc, 0x38, 0x79, 0xb8, 0x3f, 0x8b, 0x7a, 0xb9, 0xcf, 0x92, - 0xcc, 0xa1, 0xc5, 0xa7, 0xdb, 0x7f, 0xf1, 0xe8, 0x76, 0x1d, 0x07, 0x77, 0xeb, 0x38, 0xf8, 0xbb, - 0x8e, 0x83, 0x5f, 0x9b, 0x78, 0x74, 0xb7, 0x89, 0x47, 0x7f, 0x36, 0xf1, 0xe8, 0xdb, 0x9b, 0x4a, - 0xd1, 0x75, 0x57, 0xcc, 0xa5, 0xae, 0x53, 0xa9, 0x6b, 0xa4, 0xe2, 0x3b, 0xed, 0x87, 0x61, 0xb7, - 0xfa, 0x26, 0x6d, 0x11, 0xba, 0x6d, 0x79, 0xf7, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x5d, 0xa8, 0x5c, - 0xa8, 0x82, 0x02, 0x00, 0x00, -} - -func (m *Oracle) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Oracle) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Oracle) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Spec) > 0 { - i -= len(m.Spec) - copy(dAtA[i:], m.Spec) - i = encodeVarintOracle(dAtA, i, uint64(len(m.Spec))) - i-- - dAtA[i] = 0x52 - } - if len(m.Resolution) > 0 { - i -= len(m.Resolution) - copy(dAtA[i:], m.Resolution) - i = encodeVarintOracle(dAtA, i, uint64(len(m.Resolution))) - i-- - dAtA[i] = 0x4a - } - if len(m.ResultStrategy) > 0 { - i -= len(m.ResultStrategy) - copy(dAtA[i:], m.ResultStrategy) - i = encodeVarintOracle(dAtA, i, uint64(len(m.ResultStrategy))) - i-- - dAtA[i] = 0x42 - } - if len(m.SecurityType) > 0 { - i -= len(m.SecurityType) - copy(dAtA[i:], m.SecurityType) - i = encodeVarintOracle(dAtA, i, uint64(len(m.SecurityType))) - i-- - dAtA[i] = 0x3a - } - if len(m.MaxResultAge) > 0 { - i -= len(m.MaxResultAge) - copy(dAtA[i:], m.MaxResultAge) - i = encodeVarintOracle(dAtA, i, uint64(len(m.MaxResultAge))) - i-- - dAtA[i] = 0x32 - } - if len(m.MinTurnoutPercentage) > 0 { - i -= len(m.MinTurnoutPercentage) - copy(dAtA[i:], m.MinTurnoutPercentage) - i = encodeVarintOracle(dAtA, i, uint64(len(m.MinTurnoutPercentage))) - i-- - dAtA[i] = 0x2a - } - if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintOracle(dAtA, i, uint64(len(m.Status))) - i-- - dAtA[i] = 0x22 - } - if len(m.Description) > 0 { - i -= len(m.Description) - copy(dAtA[i:], m.Description) - i = encodeVarintOracle(dAtA, i, uint64(len(m.Description))) - i-- - dAtA[i] = 0x1a - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintOracle(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0x12 - } - if len(m.Creator) > 0 { - i -= len(m.Creator) - copy(dAtA[i:], m.Creator) - i = encodeVarintOracle(dAtA, i, uint64(len(m.Creator))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Result) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Result) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Result) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Data) > 0 { - i -= len(m.Data) - copy(dAtA[i:], m.Data) - i = encodeVarintOracle(dAtA, i, uint64(len(m.Data))) - i-- - dAtA[i] = 0x22 - } - if len(m.Timestamp) > 0 { - i -= len(m.Timestamp) - copy(dAtA[i:], m.Timestamp) - i = encodeVarintOracle(dAtA, i, uint64(len(m.Timestamp))) - i-- - dAtA[i] = 0x1a - } - if len(m.OracleId) > 0 { - i -= len(m.OracleId) - copy(dAtA[i:], m.OracleId) - i = encodeVarintOracle(dAtA, i, uint64(len(m.OracleId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintOracle(dAtA []byte, offset int, v uint64) int { - offset -= sovOracle(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Oracle) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Creator) - if l > 0 { - n += 1 + l + sovOracle(uint64(l)) - } - l = len(m.Id) - if l > 0 { - n += 1 + l + sovOracle(uint64(l)) - } - l = len(m.Description) - if l > 0 { - n += 1 + l + sovOracle(uint64(l)) - } - l = len(m.Status) - if l > 0 { - n += 1 + l + sovOracle(uint64(l)) - } - l = len(m.MinTurnoutPercentage) - if l > 0 { - n += 1 + l + sovOracle(uint64(l)) - } - l = len(m.MaxResultAge) - if l > 0 { - n += 1 + l + sovOracle(uint64(l)) - } - l = len(m.SecurityType) - if l > 0 { - n += 1 + l + sovOracle(uint64(l)) - } - l = len(m.ResultStrategy) - if l > 0 { - n += 1 + l + sovOracle(uint64(l)) - } - l = len(m.Resolution) - if l > 0 { - n += 1 + l + sovOracle(uint64(l)) - } - l = len(m.Spec) - if l > 0 { - n += 1 + l + sovOracle(uint64(l)) - } - return n -} - -func (m *Result) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.OracleId) - if l > 0 { - n += 1 + l + sovOracle(uint64(l)) - } - l = len(m.Timestamp) - if l > 0 { - n += 1 + l + sovOracle(uint64(l)) - } - l = len(m.Data) - if l > 0 { - n += 1 + l + sovOracle(uint64(l)) - } - return n -} - -func sovOracle(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozOracle(x uint64) (n int) { - return sovOracle(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Oracle) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Oracle: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Oracle: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Creator = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Description = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Status = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MinTurnoutPercentage", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.MinTurnoutPercentage = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxResultAge", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.MaxResultAge = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SecurityType", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SecurityType = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResultStrategy", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ResultStrategy = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Resolution", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Resolution = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 10: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Spec = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOracle(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthOracle - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Result) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Result: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Result: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OracleId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.OracleId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Timestamp = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Data = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOracle(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthOracle - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipOracle(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowOracle - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowOracle - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowOracle - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthOracle - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupOracle - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthOracle - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthOracle = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowOracle = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupOracle = fmt.Errorf("proto: unexpected end of group") -) diff --git a/proto/Switcheo/carbon/oracle/oracle.proto b/proto/Switcheo/carbon/oracle/oracle.proto deleted file mode 100644 index 3fd5b6429ae..00000000000 --- a/proto/Switcheo/carbon/oracle/oracle.proto +++ /dev/null @@ -1,27 +0,0 @@ -syntax = "proto3"; -package Switcheo.carbon.oracle; - -import "gogoproto/gogo.proto"; - -option go_package = "github.com/cometbft/cometbft/oracle/types"; -option (gogoproto.goproto_getters_all) = false; - -message Oracle { - string creator = 1; - string id = 2; - string description = 3; - string status = 4; - string min_turnout_percentage = 5; - string max_result_age = 6; - string security_type = 7; - string result_strategy = 8; - string resolution = 9; - string spec = 10; -} - -message Result { - string oracle_id = 1 [ (gogoproto.moretags) = "db:\"oracle_id\"" ]; - string timestamp = 3 [ (gogoproto.moretags) = "db:\"timestamp\"" ]; - string data = 4 [ (gogoproto.moretags) = "db:\"data\"" ]; -} - diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index fdd9ffc355d..50d30104adb 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -5,6 +5,7 @@ package oracle import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" io "io" math "math" @@ -242,37 +243,230 @@ func (m *CanonicalGossipVote) GetVotes() []*Vote { return nil } +type Oracle struct { + Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + MinTurnoutPercentage string `protobuf:"bytes,5,opt,name=min_turnout_percentage,json=minTurnoutPercentage,proto3" json:"min_turnout_percentage,omitempty"` + MaxResultAge string `protobuf:"bytes,6,opt,name=max_result_age,json=maxResultAge,proto3" json:"max_result_age,omitempty"` + SecurityType string `protobuf:"bytes,7,opt,name=security_type,json=securityType,proto3" json:"security_type,omitempty"` + ResultStrategy string `protobuf:"bytes,8,opt,name=result_strategy,json=resultStrategy,proto3" json:"result_strategy,omitempty"` + Resolution string `protobuf:"bytes,9,opt,name=resolution,proto3" json:"resolution,omitempty"` + Spec string `protobuf:"bytes,10,opt,name=spec,proto3" json:"spec,omitempty"` +} + +func (m *Oracle) Reset() { *m = Oracle{} } +func (m *Oracle) String() string { return proto.CompactTextString(m) } +func (*Oracle) ProtoMessage() {} +func (*Oracle) Descriptor() ([]byte, []int) { + return fileDescriptor_ed9227d272ed5d90, []int{3} +} +func (m *Oracle) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Oracle) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Oracle.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Oracle) XXX_Merge(src proto.Message) { + xxx_messageInfo_Oracle.Merge(m, src) +} +func (m *Oracle) XXX_Size() int { + return m.Size() +} +func (m *Oracle) XXX_DiscardUnknown() { + xxx_messageInfo_Oracle.DiscardUnknown(m) +} + +var xxx_messageInfo_Oracle proto.InternalMessageInfo + +func (m *Oracle) GetCreator() string { + if m != nil { + return m.Creator + } + return "" +} + +func (m *Oracle) GetId() string { + if m != nil { + return m.Id + } + return "" +} + +func (m *Oracle) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *Oracle) GetStatus() string { + if m != nil { + return m.Status + } + return "" +} + +func (m *Oracle) GetMinTurnoutPercentage() string { + if m != nil { + return m.MinTurnoutPercentage + } + return "" +} + +func (m *Oracle) GetMaxResultAge() string { + if m != nil { + return m.MaxResultAge + } + return "" +} + +func (m *Oracle) GetSecurityType() string { + if m != nil { + return m.SecurityType + } + return "" +} + +func (m *Oracle) GetResultStrategy() string { + if m != nil { + return m.ResultStrategy + } + return "" +} + +func (m *Oracle) GetResolution() string { + if m != nil { + return m.Resolution + } + return "" +} + +func (m *Oracle) GetSpec() string { + if m != nil { + return m.Spec + } + return "" +} + +type Result struct { + OracleId string `protobuf:"bytes,1,opt,name=oracle_id,json=oracleId,proto3" json:"oracle_id,omitempty" db:"oracle_id"` + Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty" db:"timestamp"` + Data string `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty" db:"data"` +} + +func (m *Result) Reset() { *m = Result{} } +func (m *Result) String() string { return proto.CompactTextString(m) } +func (*Result) ProtoMessage() {} +func (*Result) Descriptor() ([]byte, []int) { + return fileDescriptor_ed9227d272ed5d90, []int{4} +} +func (m *Result) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Result) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Result.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Result) XXX_Merge(src proto.Message) { + xxx_messageInfo_Result.Merge(m, src) +} +func (m *Result) XXX_Size() int { + return m.Size() +} +func (m *Result) XXX_DiscardUnknown() { + xxx_messageInfo_Result.DiscardUnknown(m) +} + +var xxx_messageInfo_Result proto.InternalMessageInfo + +func (m *Result) GetOracleId() string { + if m != nil { + return m.OracleId + } + return "" +} + +func (m *Result) GetTimestamp() int64 { + if m != nil { + return m.Timestamp + } + return 0 +} + +func (m *Result) GetData() string { + if m != nil { + return m.Data + } + return "" +} + func init() { proto.RegisterType((*Vote)(nil), "tendermint.oracle.Vote") proto.RegisterType((*GossipVote)(nil), "tendermint.oracle.GossipVote") proto.RegisterType((*CanonicalGossipVote)(nil), "tendermint.oracle.CanonicalGossipVote") + proto.RegisterType((*Oracle)(nil), "tendermint.oracle.Oracle") + proto.RegisterType((*Result)(nil), "tendermint.oracle.Result") } func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 335 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x92, 0xc1, 0x4a, 0xf3, 0x40, - 0x14, 0x85, 0x3b, 0x7f, 0xd3, 0xd2, 0xcc, 0x5f, 0x50, 0xc7, 0x85, 0x01, 0xdb, 0x10, 0xba, 0x8a, - 0x0b, 0x13, 0x50, 0x9f, 0x40, 0x17, 0x22, 0x82, 0x8b, 0x50, 0x5c, 0xb8, 0x09, 0x93, 0xe4, 0x5a, - 0x07, 0x93, 0x4c, 0xc8, 0xdc, 0x16, 0xf2, 0x16, 0x3e, 0x81, 0xcf, 0xe3, 0xb2, 0x4b, 0x57, 0x22, - 0xed, 0x8b, 0x48, 0x66, 0xa0, 0x59, 0x74, 0xe3, 0xd2, 0xdd, 0xf0, 0xdd, 0x7b, 0x38, 0xe7, 0x0c, - 0x97, 0x4e, 0x11, 0xca, 0x0c, 0xea, 0x42, 0x94, 0x18, 0xca, 0x9a, 0xa7, 0x39, 0x84, 0xd8, 0x54, - 0xa0, 0x82, 0xaa, 0x96, 0x28, 0xd9, 0x51, 0x37, 0x0e, 0xcc, 0x78, 0xa6, 0xa8, 0xf5, 0x28, 0x11, - 0xd8, 0x84, 0xda, 0x2b, 0x9e, 0x8b, 0x8c, 0xa3, 0xac, 0x1d, 0xe2, 0x11, 0x7f, 0x1c, 0x75, 0x80, - 0x9d, 0x52, 0xdb, 0xec, 0xc7, 0x22, 0x73, 0xfe, 0x79, 0xc4, 0xb7, 0xa3, 0x91, 0x01, 0x77, 0x59, - 0x2b, 0x45, 0x51, 0x80, 0x42, 0x5e, 0x54, 0x4e, 0xdf, 0x23, 0xbe, 0x15, 0x75, 0x80, 0x31, 0x6a, - 0x65, 0x1c, 0xb9, 0x63, 0x69, 0x95, 0x7e, 0xcf, 0xbe, 0x08, 0xa5, 0xb7, 0x52, 0x29, 0x51, 0xfd, - 0xc2, 0x7b, 0x4a, 0x69, 0xb5, 0x4c, 0x72, 0x91, 0xc6, 0xaf, 0xd0, 0x68, 0xf3, 0x71, 0x64, 0x1b, - 0x72, 0x0f, 0x4d, 0x1b, 0x4d, 0x89, 0x45, 0x19, 0xb7, 0x3d, 0xb5, 0xbb, 0x1d, 0x8d, 0x5a, 0x30, - 0x6f, 0x2a, 0x60, 0xe7, 0x74, 0xb0, 0x92, 0x08, 0xca, 0xb1, 0xbc, 0xbe, 0xff, 0xff, 0xe2, 0x24, - 0xd8, 0xfb, 0x80, 0xa0, 0x4d, 0x10, 0x99, 0x2d, 0x76, 0x46, 0x0f, 0x5b, 0x29, 0x64, 0x71, 0x57, - 0x68, 0xa0, 0x0b, 0x1d, 0x18, 0x3e, 0xdf, 0xd5, 0x9a, 0x18, 0x5b, 0x8e, 0xcb, 0x1a, 0x9c, 0xa1, - 0x09, 0xb5, 0x03, 0xb3, 0x77, 0x42, 0x8f, 0x6f, 0x78, 0x29, 0x4b, 0x91, 0xf2, 0xfc, 0x0f, 0x36, - 0xbd, 0x7e, 0xf8, 0xd8, 0xb8, 0x64, 0xbd, 0x71, 0xc9, 0xf7, 0xc6, 0x25, 0x6f, 0x5b, 0xb7, 0xb7, - 0xde, 0xba, 0xbd, 0xcf, 0xad, 0xdb, 0x7b, 0xba, 0x5a, 0x08, 0x7c, 0x59, 0x26, 0x41, 0x2a, 0x8b, - 0x30, 0x95, 0x05, 0x60, 0xf2, 0x8c, 0xdd, 0x43, 0xdf, 0x51, 0xb8, 0x77, 0x65, 0xc9, 0x50, 0x0f, - 0x2e, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x1d, 0xc1, 0x06, 0x56, 0x81, 0x02, 0x00, 0x00, + // 572 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x54, 0xbd, 0x6e, 0xd4, 0x4c, + 0x14, 0x8d, 0x37, 0x9b, 0x4d, 0x7c, 0x93, 0x6c, 0xbe, 0x6f, 0x88, 0x82, 0x05, 0x89, 0xb3, 0x18, + 0x24, 0x96, 0x82, 0x5d, 0x04, 0xa9, 0xe8, 0x08, 0x05, 0x42, 0x48, 0x80, 0x4c, 0x44, 0x41, 0x63, + 0xcd, 0xda, 0x17, 0x33, 0x62, 0xed, 0xb1, 0x66, 0xae, 0xa3, 0xf8, 0x25, 0x10, 0x4f, 0xc0, 0xf3, + 0x20, 0xaa, 0x94, 0x54, 0x11, 0x4a, 0xde, 0x20, 0x4f, 0x80, 0x3c, 0xb3, 0xb1, 0x2d, 0xd2, 0x50, + 0xd2, 0x5d, 0x9f, 0x73, 0xae, 0xef, 0xcf, 0xcc, 0x19, 0xd8, 0x23, 0xcc, 0x13, 0x54, 0x99, 0xc8, + 0x69, 0x2a, 0x15, 0x8f, 0xe7, 0x38, 0xa5, 0xaa, 0x40, 0x3d, 0x29, 0x94, 0x24, 0xc9, 0xfe, 0x6f, + 0xe9, 0x89, 0xa5, 0x6f, 0x6d, 0xa7, 0x32, 0x95, 0x86, 0x9d, 0xd6, 0x91, 0x15, 0x06, 0x1a, 0xfa, + 0xef, 0x25, 0x21, 0xdb, 0x05, 0xf7, 0x98, 0xcf, 0x45, 0xc2, 0x49, 0x2a, 0xcf, 0x19, 0x39, 0xe3, + 0x8d, 0xb0, 0x05, 0xd8, 0x6d, 0x70, 0xed, 0x5f, 0x22, 0x91, 0x78, 0xbd, 0x91, 0x33, 0x76, 0xc3, + 0x35, 0x0b, 0xbc, 0x4c, 0xea, 0x54, 0x12, 0x19, 0x6a, 0xe2, 0x59, 0xe1, 0x2d, 0x8f, 0x9c, 0x71, + 0x3f, 0x6c, 0x01, 0xc6, 0xa0, 0x9f, 0x70, 0xe2, 0x5e, 0xdf, 0x64, 0x99, 0x38, 0x38, 0x73, 0x00, + 0x5e, 0x48, 0xad, 0x45, 0xf1, 0x17, 0xb5, 0xf7, 0x00, 0x8a, 0x72, 0x36, 0x17, 0x71, 0xf4, 0x19, + 0x2b, 0x53, 0x7c, 0x23, 0x74, 0x2d, 0xf2, 0x0a, 0xab, 0xba, 0x35, 0x2d, 0xd2, 0x3c, 0xaa, 0xa7, + 0x37, 0xd5, 0xdd, 0x70, 0xad, 0x06, 0x8e, 0xaa, 0x02, 0xd9, 0x43, 0x58, 0x39, 0x96, 0x84, 0xda, + 0xeb, 0x8f, 0x96, 0xc7, 0xeb, 0x8f, 0x6f, 0x4e, 0xae, 0xad, 0x65, 0x52, 0x77, 0x10, 0x5a, 0x15, + 0x7b, 0x00, 0xff, 0xd5, 0xa9, 0x98, 0x44, 0xed, 0x40, 0x2b, 0x66, 0xa0, 0x2d, 0x8b, 0x1f, 0x35, + 0x63, 0xed, 0xda, 0xb2, 0x9c, 0x4a, 0x85, 0xde, 0xc0, 0x36, 0xd5, 0x00, 0xc1, 0x37, 0x07, 0x6e, + 0x3c, 0xe7, 0xb9, 0xcc, 0x45, 0xcc, 0xe7, 0xff, 0xe0, 0xa4, 0xc1, 0x8f, 0x1e, 0x0c, 0xde, 0x18, + 0x98, 0x79, 0xb0, 0x1a, 0x2b, 0x6c, 0x3a, 0x72, 0xc3, 0xab, 0x4f, 0x36, 0x84, 0x5e, 0x73, 0xdc, + 0x3d, 0x91, 0xb0, 0x11, 0xac, 0x27, 0xa8, 0x63, 0x25, 0x0a, 0x12, 0x32, 0x5f, 0xb4, 0xd0, 0x85, + 0xd8, 0x0e, 0x0c, 0x34, 0x71, 0x2a, 0xf5, 0xe2, 0xb8, 0x17, 0x5f, 0xec, 0x00, 0x76, 0x32, 0x91, + 0x47, 0x54, 0xaa, 0x5c, 0x96, 0x14, 0x15, 0xa8, 0x62, 0xcc, 0x89, 0xa7, 0x68, 0xd6, 0xeb, 0x86, + 0xdb, 0x99, 0xc8, 0x8f, 0x2c, 0xf9, 0xb6, 0xe1, 0xd8, 0x3d, 0x18, 0x66, 0xfc, 0x24, 0x52, 0xa8, + 0xcb, 0x39, 0x45, 0xb5, 0x7a, 0x60, 0xd4, 0x1b, 0x19, 0x3f, 0x09, 0x0d, 0xf8, 0x2c, 0x45, 0x76, + 0x17, 0x36, 0x35, 0xc6, 0xa5, 0x12, 0x54, 0xd9, 0xd5, 0xac, 0x5a, 0xd1, 0x15, 0x68, 0xd6, 0x73, + 0x1f, 0xb6, 0x16, 0xbf, 0xd1, 0xa4, 0x38, 0x61, 0x5a, 0x79, 0x6b, 0x46, 0x36, 0xb4, 0xf0, 0xbb, + 0x05, 0xca, 0x7c, 0x00, 0x85, 0x5a, 0xce, 0x4b, 0x33, 0xa2, 0x6b, 0x34, 0x1d, 0xa4, 0xbe, 0xce, + 0xba, 0xc0, 0xd8, 0x03, 0x7b, 0x9d, 0xeb, 0x38, 0xf8, 0xe2, 0xc0, 0xc0, 0xf6, 0xc3, 0xa6, 0x5d, + 0xa3, 0x98, 0x75, 0x1e, 0xb2, 0xcb, 0xb3, 0xfd, 0x61, 0x32, 0x7b, 0x1a, 0x34, 0x44, 0xd0, 0x31, + 0xcf, 0xa3, 0x3f, 0xcd, 0xb3, 0xdc, 0x26, 0x34, 0x44, 0xd0, 0x35, 0xd4, 0x9d, 0xae, 0xa1, 0x0e, + 0x37, 0x2f, 0xcf, 0xf6, 0xdd, 0x5a, 0x6c, 0x8c, 0x65, 0xfd, 0x75, 0xf8, 0xfa, 0xfb, 0xb9, 0xef, + 0x9c, 0x9e, 0xfb, 0xce, 0xaf, 0x73, 0xdf, 0xf9, 0x7a, 0xe1, 0x2f, 0x9d, 0x5e, 0xf8, 0x4b, 0x3f, + 0x2f, 0xfc, 0xa5, 0x0f, 0x07, 0xa9, 0xa0, 0x4f, 0xe5, 0x6c, 0x12, 0xcb, 0x6c, 0x1a, 0xcb, 0x0c, + 0x69, 0xf6, 0x91, 0xda, 0xc0, 0xbe, 0x0e, 0xd7, 0x5e, 0x96, 0xd9, 0xc0, 0x10, 0x4f, 0x7e, 0x07, + 0x00, 0x00, 0xff, 0xff, 0xe5, 0xd0, 0x69, 0x5d, 0x75, 0x04, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -452,6 +646,141 @@ func (m *CanonicalGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *Oracle) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Oracle) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Oracle) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Spec) > 0 { + i -= len(m.Spec) + copy(dAtA[i:], m.Spec) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Spec))) + i-- + dAtA[i] = 0x52 + } + if len(m.Resolution) > 0 { + i -= len(m.Resolution) + copy(dAtA[i:], m.Resolution) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Resolution))) + i-- + dAtA[i] = 0x4a + } + if len(m.ResultStrategy) > 0 { + i -= len(m.ResultStrategy) + copy(dAtA[i:], m.ResultStrategy) + i = encodeVarintTypes(dAtA, i, uint64(len(m.ResultStrategy))) + i-- + dAtA[i] = 0x42 + } + if len(m.SecurityType) > 0 { + i -= len(m.SecurityType) + copy(dAtA[i:], m.SecurityType) + i = encodeVarintTypes(dAtA, i, uint64(len(m.SecurityType))) + i-- + dAtA[i] = 0x3a + } + if len(m.MaxResultAge) > 0 { + i -= len(m.MaxResultAge) + copy(dAtA[i:], m.MaxResultAge) + i = encodeVarintTypes(dAtA, i, uint64(len(m.MaxResultAge))) + i-- + dAtA[i] = 0x32 + } + if len(m.MinTurnoutPercentage) > 0 { + i -= len(m.MinTurnoutPercentage) + copy(dAtA[i:], m.MinTurnoutPercentage) + i = encodeVarintTypes(dAtA, i, uint64(len(m.MinTurnoutPercentage))) + i-- + dAtA[i] = 0x2a + } + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x22 + } + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x1a + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0x12 + } + if len(m.Creator) > 0 { + i -= len(m.Creator) + copy(dAtA[i:], m.Creator) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Creator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Result) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Result) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Result) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0x22 + } + if m.Timestamp != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Timestamp)) + i-- + dAtA[i] = 0x18 + } + if len(m.OracleId) > 0 { + i -= len(m.OracleId) + copy(dAtA[i:], m.OracleId) + i = encodeVarintTypes(dAtA, i, uint64(len(m.OracleId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func encodeVarintTypes(dAtA []byte, offset int, v uint64) int { offset -= sovTypes(v) base := offset @@ -548,6 +877,75 @@ func (m *CanonicalGossipVote) Size() (n int) { return n } +func (m *Oracle) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Creator) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Id) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Status) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.MinTurnoutPercentage) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.MaxResultAge) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.SecurityType) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.ResultStrategy) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Resolution) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Spec) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *Result) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.OracleId) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.Timestamp != 0 { + n += 1 + sovTypes(uint64(m.Timestamp)) + } + l = len(m.Data) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + func sovTypes(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -1142,6 +1540,509 @@ func (m *CanonicalGossipVote) Unmarshal(dAtA []byte) error { } return nil } +func (m *Oracle) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Oracle: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Oracle: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Creator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Status = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MinTurnoutPercentage", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MinTurnoutPercentage = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxResultAge", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MaxResultAge = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SecurityType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SecurityType = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResultStrategy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ResultStrategy = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Resolution", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Resolution = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Spec = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Result) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Result: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Result: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OracleId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.OracleId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) + } + m.Timestamp = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Timestamp |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipTypes(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index b2d750181fa..7b22c8611e7 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -3,6 +3,8 @@ package tendermint.oracle; option go_package = "github.com/cometbft/cometbft/proto/tendermint/oracle"; +import "gogoproto/gogo.proto"; + message Vote { bytes validator = 1; string oracle_id = 2; @@ -25,3 +27,22 @@ message CanonicalGossipVote { string sign_type = 3; repeated Vote votes = 4; } + +message Oracle { + string creator = 1; + string id = 2; + string description = 3; + string status = 4; + string min_turnout_percentage = 5; + string max_result_age = 6; + string security_type = 7; + string result_strategy = 8; + string resolution = 9; + string spec = 10; +} + +message Result { + string oracle_id = 1 [ (gogoproto.moretags) = "db:\"oracle_id\"" ]; + int64 timestamp = 3 [ (gogoproto.moretags) = "db:\"timestamp\"" ]; + string data = 4 [ (gogoproto.moretags) = "db:\"data\"" ]; +} \ No newline at end of file From 8407ba7446e8be0aa33b0e51c40f1fbff3d13867 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 5 Mar 2024 17:48:04 +0800 Subject: [PATCH 017/150] remove unused grpc client from oracle service --- node/node.go | 3 +- oracle/reactor.go | 50 ++----------------- oracle/service/adapters/adapters.go | 17 +++---- oracle/service/adapters/decimal_handler.go | 5 +- oracle/service/adapters/evm_fetcher.go | 5 +- oracle/service/adapters/evm_struct_parser.go | 5 +- oracle/service/adapters/evm_value_parser.go | 5 +- oracle/service/adapters/fetcher.go | 5 +- oracle/service/adapters/fetcher_multiple.go | 5 +- oracle/service/adapters/float_handler.go | 5 +- oracle/service/adapters/math_filter.go | 5 +- oracle/service/adapters/median_filter.go | 5 +- .../service/adapters/oracle_result_fetcher.go | 6 +-- oracle/service/adapters/static_handler.go | 5 +- oracle/service/adapters/unchanged_handler.go | 5 +- .../service/adapters/unresponsive_handler.go | 5 +- oracle/service/adapters/weighted_average.go | 5 +- oracle/service/runner/runner.go | 2 +- 18 files changed, 30 insertions(+), 113 deletions(-) diff --git a/node/node.go b/node/node.go index d7ab938095e..43fa58ed218 100644 --- a/node/node.go +++ b/node/node.go @@ -381,7 +381,8 @@ func NewNodeWithContext(ctx context.Context, } // Make OracleReactor - oracleReactor := oracle.NewReactor("", "13.215.29.72:9090", pubKey, privValidator, state.Validators) + + oracleReactor := oracle.NewReactor("", pubKey, privValidator, state.Validators) oracleInfo := oracleReactor.OracleInfo // make block executor for consensus and blocksync reactors to execute blocks diff --git a/oracle/reactor.go b/oracle/reactor.go index cd899952361..8629ebd2c97 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -21,10 +21,6 @@ import ( oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" "github.com/cometbft/cometbft/redis" "github.com/cometbft/cometbft/types" - - "google.golang.org/grpc" - "google.golang.org/grpc/connectivity" - "google.golang.org/grpc/credentials/insecure" ) const ( @@ -45,15 +41,14 @@ const ( // peers you received it from. type Reactor struct { p2p.BaseReactor - OracleInfo *oracletypes.OracleInfo - grpcAddress string + OracleInfo *oracletypes.OracleInfo // config *cfg.MempoolConfig // mempool *CListMempool ids *oracleIDs } // NewReactor returns a new Reactor with the given config and mempool. -func NewReactor(configPath string, grpcAddress string, pubKey crypto.PubKey, privValidator types.PrivValidator, validatorSet *types.ValidatorSet) *Reactor { +func NewReactor(configPath string, pubKey crypto.PubKey, privValidator types.PrivValidator, validatorSet *types.ValidatorSet) *Reactor { // load oracle.json config if present jsonFile, openErr := os.Open(configPath) if openErr != nil { @@ -93,9 +88,8 @@ func NewReactor(configPath string, grpcAddress string, pubKey crypto.PubKey, pri jsonFile.Close() oracleR := &Reactor{ - OracleInfo: oracleInfo, - grpcAddress: grpcAddress, - ids: newOracleIDs(), + OracleInfo: oracleInfo, + ids: newOracleIDs(), } oracleR.BaseReactor = *p2p.NewBaseReactor("Oracle", oracleR) @@ -117,41 +111,7 @@ func (oracleR *Reactor) SetLogger(l log.Logger) { // OnStart implements p2p.BaseReactor. func (oracleR *Reactor) OnStart() error { oracleR.OracleInfo.Redis = redis.NewService(0) - - grpcMaxRetryCount := 12 - retryCount := 0 - sleepTime := time.Second - var client *grpc.ClientConn - - for { - logrus.Infof("[oracle] trying to connect to grpc with address %s : %d", oracleR.grpcAddress, retryCount) - if retryCount == grpcMaxRetryCount { - panic("failed to connect to grpc:grpcClient after 12 tries") - } - time.Sleep(sleepTime) - - // reinit otherwise connection will be idle, in idle we can't tell if it's really ready - var err error - client, err = grpc.Dial( - oracleR.grpcAddress, - grpc.WithTransportCredentials(insecure.NewCredentials()), - ) - if err != nil { - panic(err) - } - // give it some time to connect after dailing, but not too long as connection can become idle - time.Sleep(time.Duration(retryCount*int(time.Second) + 1)) - - if client.GetState() == connectivity.Ready { - oracleR.OracleInfo.GrpcClient = client - break - } - client.Close() - retryCount++ - sleepTime *= 2 - } - - oracleR.OracleInfo.AdapterMap = adapters.GetAdapterMap(oracleR.OracleInfo.GrpcClient, &oracleR.OracleInfo.Redis) + oracleR.OracleInfo.AdapterMap = adapters.GetAdapterMap(&oracleR.OracleInfo.Redis) logrus.Info("[oracle] running oracle service...") go func() { runner.Run(oracleR.OracleInfo) diff --git a/oracle/service/adapters/adapters.go b/oracle/service/adapters/adapters.go index d8844ce795e..b770aff3f97 100644 --- a/oracle/service/adapters/adapters.go +++ b/oracle/service/adapters/adapters.go @@ -4,20 +4,19 @@ import ( "github.com/cometbft/cometbft/oracle/service/types" "github.com/cometbft/cometbft/redis" log "github.com/sirupsen/logrus" - "google.golang.org/grpc" ) // GetAdapterMap returns a map of all adapters -func GetAdapterMap(grpcClient *grpc.ClientConn, redisService *redis.Service) map[string]types.Adapter { +func GetAdapterMap(redisService *redis.Service) map[string]types.Adapter { adapterMap := make(map[string]types.Adapter) adaptersList := []types.Adapter{ - NewFetcher(grpcClient, redisService), NewFetcherMultiple(grpcClient, redisService), - NewUnresponsiveHandler(grpcClient, redisService), NewUnchangedHandler(grpcClient, redisService), - NewMedianFilter(grpcClient, redisService), NewWeightedAverage(grpcClient, redisService), - NewFloatHandler(grpcClient, redisService), NewDecimalHandler(grpcClient, redisService), - NewMathFilter(grpcClient, redisService), NewOracleResultFetcher(grpcClient, redisService), - NewEVMValueParser(grpcClient, redisService), NewEVMStructParser(grpcClient, redisService), NewEVMFetcher(grpcClient, redisService), - NewStaticHandler(grpcClient, redisService), + NewFetcher(redisService), NewFetcherMultiple(redisService), + NewUnresponsiveHandler(redisService), NewUnchangedHandler(redisService), + NewMedianFilter(redisService), NewWeightedAverage(redisService), + NewFloatHandler(redisService), NewDecimalHandler(redisService), + NewMathFilter(redisService), NewOracleResultFetcher(redisService), + NewEVMValueParser(redisService), NewEVMStructParser(redisService), NewEVMFetcher(redisService), + NewStaticHandler(redisService), } for _, adapter := range adaptersList { _, existing := adapterMap[adapter.Id()] diff --git a/oracle/service/adapters/decimal_handler.go b/oracle/service/adapters/decimal_handler.go index 3211c77b3df..0eea411f179 100644 --- a/oracle/service/adapters/decimal_handler.go +++ b/oracle/service/adapters/decimal_handler.go @@ -6,18 +6,15 @@ import ( sdkmath "cosmossdk.io/math" "github.com/cometbft/cometbft/oracle/service/types" "github.com/cometbft/cometbft/redis" - "google.golang.org/grpc" ) // DecimalHandler struct for decimal handler type DecimalHandler struct { - grpcClient *grpc.ClientConn redisService *redis.Service } -func NewDecimalHandler(grpcClient *grpc.ClientConn, redisService *redis.Service) *DecimalHandler { +func NewDecimalHandler(redisService *redis.Service) *DecimalHandler { return &DecimalHandler{ - grpcClient: grpcClient, redisService: redisService, } } diff --git a/oracle/service/adapters/evm_fetcher.go b/oracle/service/adapters/evm_fetcher.go index dbff1a4a94b..8a3aeeb7dc1 100644 --- a/oracle/service/adapters/evm_fetcher.go +++ b/oracle/service/adapters/evm_fetcher.go @@ -13,18 +13,15 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/ethclient" log "github.com/sirupsen/logrus" - "google.golang.org/grpc" ) // EVMFetcher struct for evmFetcher type EVMFetcher struct { - grpcClient *grpc.ClientConn redisService *redis.Service } -func NewEVMFetcher(grpcClient *grpc.ClientConn, redisService *redis.Service) *EVMFetcher { +func NewEVMFetcher(redisService *redis.Service) *EVMFetcher { return &EVMFetcher{ - grpcClient: grpcClient, redisService: redisService, } } diff --git a/oracle/service/adapters/evm_struct_parser.go b/oracle/service/adapters/evm_struct_parser.go index 1c8f6b3303d..abf5940df56 100644 --- a/oracle/service/adapters/evm_struct_parser.go +++ b/oracle/service/adapters/evm_struct_parser.go @@ -9,18 +9,15 @@ import ( "github.com/cometbft/cometbft/oracle/service/types" "github.com/cometbft/cometbft/redis" "github.com/ethereum/go-ethereum/accounts/abi" - "google.golang.org/grpc" ) // EVMStructParser struct for evmStructParser type EVMStructParser struct { - grpcClient *grpc.ClientConn redisService *redis.Service } -func NewEVMStructParser(grpcClient *grpc.ClientConn, redisService *redis.Service) *EVMStructParser { +func NewEVMStructParser(redisService *redis.Service) *EVMStructParser { return &EVMStructParser{ - grpcClient: grpcClient, redisService: redisService, } } diff --git a/oracle/service/adapters/evm_value_parser.go b/oracle/service/adapters/evm_value_parser.go index 609151e1e08..9b35cc725aa 100644 --- a/oracle/service/adapters/evm_value_parser.go +++ b/oracle/service/adapters/evm_value_parser.go @@ -9,18 +9,15 @@ import ( "github.com/cometbft/cometbft/oracle/service/types" "github.com/cometbft/cometbft/redis" "github.com/holiman/uint256" - "google.golang.org/grpc" ) // EVMValueParser struct for evmValueParser type EVMValueParser struct { - grpcClient *grpc.ClientConn redisService *redis.Service } -func NewEVMValueParser(grpcClient *grpc.ClientConn, redisService *redis.Service) *EVMValueParser { +func NewEVMValueParser(redisService *redis.Service) *EVMValueParser { return &EVMValueParser{ - grpcClient: grpcClient, redisService: redisService, } } diff --git a/oracle/service/adapters/fetcher.go b/oracle/service/adapters/fetcher.go index ebc861d62aa..6dcb658d8de 100644 --- a/oracle/service/adapters/fetcher.go +++ b/oracle/service/adapters/fetcher.go @@ -13,18 +13,15 @@ import ( "github.com/go-redsync/redsync/v4/redis/goredis" log "github.com/sirupsen/logrus" "github.com/tidwall/gjson" - "google.golang.org/grpc" ) // Fetcher struct for fetcher type Fetcher struct { - grpcClient *grpc.ClientConn redisService *redis.Service } -func NewFetcher(grpcClient *grpc.ClientConn, redisService *redis.Service) *Fetcher { +func NewFetcher(redisService *redis.Service) *Fetcher { return &Fetcher{ - grpcClient: grpcClient, redisService: redisService, } } diff --git a/oracle/service/adapters/fetcher_multiple.go b/oracle/service/adapters/fetcher_multiple.go index a64c20abaf2..5760ec7ad2f 100644 --- a/oracle/service/adapters/fetcher_multiple.go +++ b/oracle/service/adapters/fetcher_multiple.go @@ -8,18 +8,15 @@ import ( "github.com/cometbft/cometbft/redis" log "github.com/sirupsen/logrus" "github.com/tidwall/gjson" - "google.golang.org/grpc" ) // FetcherMultiple struct for fetcherMultiple type FetcherMultiple struct { - grpcClient *grpc.ClientConn redisService *redis.Service } -func NewFetcherMultiple(grpcClient *grpc.ClientConn, redisService *redis.Service) *FetcherMultiple { +func NewFetcherMultiple(redisService *redis.Service) *FetcherMultiple { return &FetcherMultiple{ - grpcClient: grpcClient, redisService: redisService, } } diff --git a/oracle/service/adapters/float_handler.go b/oracle/service/adapters/float_handler.go index bd9104a73b4..7d3c6d2479d 100644 --- a/oracle/service/adapters/float_handler.go +++ b/oracle/service/adapters/float_handler.go @@ -6,18 +6,15 @@ import ( "cosmossdk.io/math" "github.com/cometbft/cometbft/oracle/service/types" "github.com/cometbft/cometbft/redis" - "google.golang.org/grpc" ) // FloatHandler struct for float handler type FloatHandler struct { - grpcClient *grpc.ClientConn redisService *redis.Service } -func NewFloatHandler(grpcClient *grpc.ClientConn, redisService *redis.Service) *FloatHandler { +func NewFloatHandler(redisService *redis.Service) *FloatHandler { return &FloatHandler{ - grpcClient: grpcClient, redisService: redisService, } } diff --git a/oracle/service/adapters/math_filter.go b/oracle/service/adapters/math_filter.go index 97d611f061f..82a6f690c18 100644 --- a/oracle/service/adapters/math_filter.go +++ b/oracle/service/adapters/math_filter.go @@ -7,18 +7,15 @@ import ( sdkmath "cosmossdk.io/math" "github.com/cometbft/cometbft/oracle/service/types" - "google.golang.org/grpc" ) // MathFilter struct for float handler type MathFilter struct { - grpcClient *grpc.ClientConn redisService *redis.Service } -func NewMathFilter(grpcClient *grpc.ClientConn, redisService *redis.Service) *MathFilter { +func NewMathFilter(redisService *redis.Service) *MathFilter { return &MathFilter{ - grpcClient: grpcClient, redisService: redisService, } } diff --git a/oracle/service/adapters/median_filter.go b/oracle/service/adapters/median_filter.go index f8a2061e65b..4aa17652874 100644 --- a/oracle/service/adapters/median_filter.go +++ b/oracle/service/adapters/median_filter.go @@ -6,12 +6,10 @@ import ( "github.com/cometbft/cometbft/oracle/service/types" "github.com/cometbft/cometbft/redis" - "google.golang.org/grpc" ) // MedianFilter struct for median filter type MedianFilter struct { - grpcClient *grpc.ClientConn redisService *redis.Service } @@ -20,9 +18,8 @@ func (filter *MedianFilter) Id() string { return "median_filter" } -func NewMedianFilter(grpcClient *grpc.ClientConn, redisService *redis.Service) *MedianFilter { +func NewMedianFilter(redisService *redis.Service) *MedianFilter { return &MedianFilter{ - grpcClient: grpcClient, redisService: redisService, } } diff --git a/oracle/service/adapters/oracle_result_fetcher.go b/oracle/service/adapters/oracle_result_fetcher.go index 6f11d8aaf08..f9c12263a24 100644 --- a/oracle/service/adapters/oracle_result_fetcher.go +++ b/oracle/service/adapters/oracle_result_fetcher.go @@ -10,8 +10,6 @@ import ( "github.com/cometbft/cometbft/proto/tendermint/oracle" "github.com/cometbft/cometbft/redis" "github.com/sirupsen/logrus" - - "google.golang.org/grpc" ) const ORACLE_ID = "oracle_id" @@ -19,13 +17,11 @@ const STALE_ALLOWANCE = "stale_allowance" // OracleResultFetcher struct for float handler type OracleResultFetcher struct { - grpcClient *grpc.ClientConn redisService *redis.Service } -func NewOracleResultFetcher(grpcClient *grpc.ClientConn, redisService *redis.Service) *OracleResultFetcher { +func NewOracleResultFetcher(redisService *redis.Service) *OracleResultFetcher { return &OracleResultFetcher{ - grpcClient: grpcClient, redisService: redisService, } } diff --git a/oracle/service/adapters/static_handler.go b/oracle/service/adapters/static_handler.go index ec829cdebd1..b2d6d05e50f 100644 --- a/oracle/service/adapters/static_handler.go +++ b/oracle/service/adapters/static_handler.go @@ -6,18 +6,15 @@ import ( sdkmath "cosmossdk.io/math" "github.com/cometbft/cometbft/oracle/service/types" "github.com/cometbft/cometbft/redis" - "google.golang.org/grpc" ) // StaticHandler struct for decimal handler type StaticHandler struct { - grpcClient *grpc.ClientConn redisService *redis.Service } -func NewStaticHandler(grpcClient *grpc.ClientConn, redisService *redis.Service) *StaticHandler { +func NewStaticHandler(redisService *redis.Service) *StaticHandler { return &StaticHandler{ - grpcClient: grpcClient, redisService: redisService, } } diff --git a/oracle/service/adapters/unchanged_handler.go b/oracle/service/adapters/unchanged_handler.go index 46091aedd00..f711b9cf99d 100644 --- a/oracle/service/adapters/unchanged_handler.go +++ b/oracle/service/adapters/unchanged_handler.go @@ -6,18 +6,15 @@ import ( "github.com/cometbft/cometbft/oracle/service/types" "github.com/cometbft/cometbft/redis" log "github.com/sirupsen/logrus" - "google.golang.org/grpc" ) // UnchangedHandler struct for unresponsive handler type UnchangedHandler struct { - grpcClient *grpc.ClientConn redisService *redis.Service } -func NewUnchangedHandler(grpcClient *grpc.ClientConn, redisService *redis.Service) *UnchangedHandler { +func NewUnchangedHandler(redisService *redis.Service) *UnchangedHandler { return &UnchangedHandler{ - grpcClient: grpcClient, redisService: redisService, } } diff --git a/oracle/service/adapters/unresponsive_handler.go b/oracle/service/adapters/unresponsive_handler.go index 3de2867f392..df27ef26469 100644 --- a/oracle/service/adapters/unresponsive_handler.go +++ b/oracle/service/adapters/unresponsive_handler.go @@ -5,18 +5,15 @@ import ( "github.com/cometbft/cometbft/oracle/service/types" "github.com/cometbft/cometbft/redis" - "google.golang.org/grpc" ) // UnresponsiveHandler struct for unresponsive handler type UnresponsiveHandler struct { - grpcClient *grpc.ClientConn redisService *redis.Service } -func NewUnresponsiveHandler(grpcClient *grpc.ClientConn, redisService *redis.Service) *UnresponsiveHandler { +func NewUnresponsiveHandler(redisService *redis.Service) *UnresponsiveHandler { return &UnresponsiveHandler{ - grpcClient: grpcClient, redisService: redisService, } } diff --git a/oracle/service/adapters/weighted_average.go b/oracle/service/adapters/weighted_average.go index 13c46b63304..9db1b182dc2 100644 --- a/oracle/service/adapters/weighted_average.go +++ b/oracle/service/adapters/weighted_average.go @@ -5,18 +5,15 @@ import ( "github.com/cometbft/cometbft/oracle/service/types" "github.com/cometbft/cometbft/redis" - "google.golang.org/grpc" ) // WeightedAverage struct for weighted average type WeightedAverage struct { - grpcClient *grpc.ClientConn redisService *redis.Service } -func NewWeightedAverage(grpcClient *grpc.ClientConn, redisService *redis.Service) *WeightedAverage { +func NewWeightedAverage(redisService *redis.Service) *WeightedAverage { return &WeightedAverage{ - grpcClient: grpcClient, redisService: redisService, } } diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 641536b8699..6d6921b11cd 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -416,7 +416,7 @@ func Run(oracleInfo *types.OracleInfo) { time.Sleep(100 * time.Millisecond) count++ - if count > 300 { // 600 * 0.1s = 60s = every minute + if count > 600 { // 600 * 0.1s = 60s = every minute count = 0 } } From 9cd2e53eab0d03bcdf4c8d27bef1d7db73013dbe Mon Sep 17 00:00:00 2001 From: yan-soon Date: Thu, 7 Mar 2024 12:00:32 +0800 Subject: [PATCH 018/150] update oracle proto, for proposer verification --- abci/types/types.pb.go | 579 +++++++++++++----------------- oracle/reactor.go | 5 +- oracle/service/runner/runner.go | 3 +- proto/tendermint/abci/types.proto | 8 +- state/execution.go | 4 +- 5 files changed, 266 insertions(+), 333 deletions(-) diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go index a81bffbe891..fc9fe5d83af 100644 --- a/abci/types/types.pb.go +++ b/abci/types/types.pb.go @@ -1587,10 +1587,9 @@ func (m *RequestFinalizeBlock) GetProposerAddress() []byte { } type RequestSignGossipVote struct { - GossipVotes []*oracle.GossipVote `protobuf:"bytes,1,rep,name=gossip_votes,json=gossipVotes,proto3" json:"gossip_votes,omitempty"` - GrpcAddress string `protobuf:"bytes,2,opt,name=grpc_address,json=grpcAddress,proto3" json:"grpc_address,omitempty"` - SubaccountLabel string `protobuf:"bytes,3,opt,name=subaccount_label,json=subaccountLabel,proto3" json:"subaccount_label,omitempty"` - Password string `protobuf:"bytes,4,opt,name=password,proto3" json:"password,omitempty"` + ProposerAddress []byte `protobuf:"bytes,1,opt,name=proposer_address,json=proposerAddress,proto3" json:"proposer_address,omitempty"` + GossipVotes []*oracle.GossipVote `protobuf:"bytes,2,rep,name=gossip_votes,json=gossipVotes,proto3" json:"gossip_votes,omitempty"` + Height int64 `protobuf:"varint,3,opt,name=height,proto3" json:"height,omitempty"` } func (m *RequestSignGossipVote) Reset() { *m = RequestSignGossipVote{} } @@ -1626,32 +1625,25 @@ func (m *RequestSignGossipVote) XXX_DiscardUnknown() { var xxx_messageInfo_RequestSignGossipVote proto.InternalMessageInfo -func (m *RequestSignGossipVote) GetGossipVotes() []*oracle.GossipVote { +func (m *RequestSignGossipVote) GetProposerAddress() []byte { if m != nil { - return m.GossipVotes + return m.ProposerAddress } return nil } -func (m *RequestSignGossipVote) GetGrpcAddress() string { - if m != nil { - return m.GrpcAddress - } - return "" -} - -func (m *RequestSignGossipVote) GetSubaccountLabel() string { +func (m *RequestSignGossipVote) GetGossipVotes() []*oracle.GossipVote { if m != nil { - return m.SubaccountLabel + return m.GossipVotes } - return "" + return nil } -func (m *RequestSignGossipVote) GetPassword() string { +func (m *RequestSignGossipVote) GetHeight() int64 { if m != nil { - return m.Password + return m.Height } - return "" + return 0 } type Response struct { @@ -3805,216 +3797,212 @@ func init() { func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) } var fileDescriptor_252557cfdd89a31a = []byte{ - // 3330 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0xcd, 0x73, 0x23, 0xc5, - 0x15, 0xd7, 0xe8, 0xcb, 0xd2, 0xd3, 0x87, 0xc7, 0x6d, 0xaf, 0xd1, 0x8a, 0x5d, 0xdb, 0x0c, 0x05, - 0xec, 0x2e, 0x60, 0x13, 0x6f, 0x96, 0x8f, 0x5a, 0x48, 0x45, 0xd6, 0x6a, 0x91, 0xbd, 0xc6, 0x36, - 0x63, 0x79, 0x29, 0xf2, 0xc1, 0x30, 0x92, 0xda, 0xd2, 0xb0, 0x92, 0x66, 0x98, 0x19, 0x79, 0x65, - 0x4e, 0x54, 0x48, 0xaa, 0x52, 0x9c, 0xa8, 0xe2, 0xc2, 0x21, 0x1c, 0x72, 0xc8, 0x25, 0x7f, 0x41, - 0x4e, 0xb9, 0x24, 0x07, 0x0e, 0x39, 0x70, 0xcc, 0x89, 0xa4, 0xe0, 0x14, 0xae, 0x39, 0xe4, 0x9a, - 0xea, 0x8f, 0xf9, 0x92, 0x66, 0x2c, 0x69, 0x21, 0x87, 0x54, 0x72, 0x9b, 0x7e, 0xf3, 0xde, 0xeb, - 0xe9, 0xd7, 0xaf, 0xdf, 0xc7, 0x6f, 0x1a, 0x1e, 0xb7, 0xf1, 0xa0, 0x8d, 0xcd, 0xbe, 0x36, 0xb0, - 0xb7, 0xd4, 0x66, 0x4b, 0xdb, 0xb2, 0xcf, 0x0d, 0x6c, 0x6d, 0x1a, 0xa6, 0x6e, 0xeb, 0x68, 0xd1, - 0x7b, 0xb9, 0x49, 0x5e, 0x96, 0xaf, 0xfa, 0xb8, 0x5b, 0xe6, 0xb9, 0x61, 0xeb, 0x5b, 0x86, 0xa9, - 0xeb, 0xa7, 0x8c, 0xbf, 0x7c, 0x65, 0xf2, 0xf5, 0x03, 0x7c, 0xce, 0xb5, 0x05, 0x84, 0xe9, 0x2c, - 0x5b, 0x86, 0x6a, 0xaa, 0x7d, 0xe7, 0xf5, 0xc6, 0xc4, 0xeb, 0x33, 0xb5, 0xa7, 0xb5, 0x55, 0x5b, - 0x37, 0x39, 0xc7, 0x7a, 0x47, 0xd7, 0x3b, 0x3d, 0xbc, 0x45, 0x47, 0xcd, 0xe1, 0xe9, 0x96, 0xad, - 0xf5, 0xb1, 0x65, 0xab, 0x7d, 0x83, 0x33, 0xac, 0x74, 0xf4, 0x8e, 0x4e, 0x1f, 0xb7, 0xc8, 0x53, - 0xc8, 0xbc, 0xba, 0xa9, 0xb6, 0x7a, 0xd8, 0xbf, 0x48, 0xe9, 0x53, 0x80, 0x05, 0x19, 0xbf, 0x3f, - 0xc4, 0x96, 0x8d, 0xb6, 0x21, 0x89, 0x5b, 0x5d, 0xbd, 0x24, 0x6c, 0x08, 0xd7, 0x72, 0xdb, 0x57, - 0x36, 0xc7, 0xd6, 0xbf, 0xc9, 0xf9, 0x6a, 0xad, 0xae, 0x5e, 0x8f, 0xc9, 0x94, 0x17, 0xdd, 0x82, - 0xd4, 0x69, 0x6f, 0x68, 0x75, 0x4b, 0x71, 0x2a, 0x74, 0x35, 0x4a, 0xe8, 0x2e, 0x61, 0xaa, 0xc7, - 0x64, 0xc6, 0x4d, 0xa6, 0xd2, 0x06, 0xa7, 0x7a, 0x29, 0x71, 0xf1, 0x54, 0xbb, 0x83, 0x53, 0x3a, - 0x15, 0xe1, 0x45, 0x3b, 0x00, 0xda, 0x40, 0xb3, 0x95, 0x56, 0x57, 0xd5, 0x06, 0xa5, 0x14, 0x95, - 0x7c, 0x22, 0x5a, 0x52, 0xb3, 0xab, 0x84, 0xb1, 0x1e, 0x93, 0xb3, 0x9a, 0x33, 0x20, 0x9f, 0xfb, - 0xfe, 0x10, 0x9b, 0xe7, 0xa5, 0xf4, 0xc5, 0x9f, 0xfb, 0x26, 0x61, 0x22, 0x9f, 0x4b, 0xb9, 0xd1, - 0xab, 0x90, 0x69, 0x75, 0x71, 0xeb, 0x81, 0x62, 0x8f, 0x4a, 0x19, 0x2a, 0xb9, 0x1e, 0x25, 0x59, - 0x25, 0x7c, 0x8d, 0x51, 0x3d, 0x26, 0x2f, 0xb4, 0xd8, 0x23, 0x7a, 0x19, 0xd2, 0x2d, 0xbd, 0xdf, - 0xd7, 0xec, 0x52, 0x8e, 0xca, 0xae, 0x45, 0xca, 0x52, 0xae, 0x7a, 0x4c, 0xe6, 0xfc, 0xe8, 0x00, - 0x8a, 0x3d, 0xcd, 0xb2, 0x15, 0x6b, 0xa0, 0x1a, 0x56, 0x57, 0xb7, 0xad, 0x52, 0x9e, 0x6a, 0x78, - 0x2a, 0x4a, 0xc3, 0xbe, 0x66, 0xd9, 0xc7, 0x0e, 0x73, 0x3d, 0x26, 0x17, 0x7a, 0x7e, 0x02, 0xd1, - 0xa7, 0x9f, 0x9e, 0x62, 0xd3, 0x55, 0x58, 0x2a, 0x5c, 0xac, 0xef, 0x90, 0x70, 0x3b, 0xf2, 0x44, - 0x9f, 0xee, 0x27, 0xa0, 0x9f, 0xc2, 0x72, 0x4f, 0x57, 0xdb, 0xae, 0x3a, 0xa5, 0xd5, 0x1d, 0x0e, - 0x1e, 0x94, 0x8a, 0x54, 0xe9, 0xf5, 0xc8, 0x8f, 0xd4, 0xd5, 0xb6, 0xa3, 0xa2, 0x4a, 0x04, 0xea, - 0x31, 0x79, 0xa9, 0x37, 0x4e, 0x44, 0xef, 0xc0, 0x8a, 0x6a, 0x18, 0xbd, 0xf3, 0x71, 0xed, 0x8b, - 0x54, 0xfb, 0x8d, 0x28, 0xed, 0x15, 0x22, 0x33, 0xae, 0x1e, 0xa9, 0x13, 0x54, 0xd4, 0x00, 0xd1, - 0x30, 0xb1, 0xa1, 0x9a, 0x58, 0x31, 0x4c, 0xdd, 0xd0, 0x2d, 0xb5, 0x57, 0x12, 0xa9, 0xee, 0x67, - 0xa2, 0x74, 0x1f, 0x31, 0xfe, 0x23, 0xce, 0x5e, 0x8f, 0xc9, 0x8b, 0x46, 0x90, 0xc4, 0xb4, 0xea, - 0x2d, 0x6c, 0x59, 0x9e, 0xd6, 0xa5, 0x69, 0x5a, 0x29, 0x7f, 0x50, 0x6b, 0x80, 0x84, 0x6a, 0x90, - 0xc3, 0x23, 0x22, 0xae, 0x9c, 0xe9, 0x36, 0x2e, 0x21, 0xaa, 0x50, 0x8a, 0x3c, 0xa1, 0x94, 0xf5, - 0xbe, 0x6e, 0xe3, 0x7a, 0x4c, 0x06, 0xec, 0x8e, 0x90, 0x0a, 0x97, 0xce, 0xb0, 0xa9, 0x9d, 0x9e, - 0x53, 0x35, 0x0a, 0x7d, 0x63, 0x69, 0xfa, 0xa0, 0xb4, 0x4c, 0x15, 0x3e, 0x1b, 0xa5, 0xf0, 0x3e, - 0x15, 0x22, 0x2a, 0x6a, 0x8e, 0x48, 0x3d, 0x26, 0x2f, 0x9f, 0x4d, 0x92, 0x89, 0x8b, 0x9d, 0x6a, - 0x03, 0xb5, 0xa7, 0x7d, 0x80, 0x95, 0x66, 0x4f, 0x6f, 0x3d, 0x28, 0xad, 0x5c, 0xec, 0x62, 0x77, - 0x39, 0xf7, 0x0e, 0x61, 0x26, 0x2e, 0x76, 0xea, 0x27, 0x20, 0x19, 0x44, 0x4b, 0xeb, 0x0c, 0x94, - 0x8e, 0x6e, 0x59, 0x9a, 0xc1, 0x96, 0x7f, 0x89, 0x6a, 0x7c, 0x3a, 0x4a, 0xe3, 0xb1, 0xd6, 0x19, - 0xbc, 0x4e, 0xd9, 0xb9, 0x09, 0x8a, 0x56, 0x80, 0xb2, 0xb3, 0x00, 0xa9, 0x33, 0xb5, 0x37, 0xc4, - 0x7b, 0xc9, 0x4c, 0x52, 0x4c, 0xed, 0x25, 0x33, 0x0b, 0x62, 0x66, 0x2f, 0x99, 0xc9, 0x8a, 0xb0, - 0x97, 0xcc, 0x80, 0x98, 0x93, 0x9e, 0x81, 0x9c, 0x2f, 0xd8, 0xa1, 0x12, 0x2c, 0xf4, 0xb1, 0x65, - 0xa9, 0x1d, 0x4c, 0x63, 0x63, 0x56, 0x76, 0x86, 0x52, 0x11, 0xf2, 0xfe, 0x00, 0x27, 0x7d, 0x22, - 0xb8, 0x92, 0x24, 0x76, 0x11, 0xc9, 0x33, 0x6c, 0x52, 0x13, 0x73, 0x49, 0x3e, 0x44, 0x4f, 0x42, - 0x81, 0x9a, 0x47, 0x71, 0xde, 0x93, 0x00, 0x9a, 0x94, 0xf3, 0x94, 0x78, 0x9f, 0x33, 0xad, 0x43, - 0xce, 0xd8, 0x36, 0x5c, 0x96, 0x04, 0x65, 0x01, 0x63, 0xdb, 0x70, 0x18, 0x9e, 0x80, 0x3c, 0x59, - 0xb9, 0xcb, 0x91, 0xa4, 0x93, 0xe4, 0x08, 0x8d, 0xb3, 0x48, 0x7f, 0x89, 0x83, 0x38, 0x1e, 0x14, - 0xd1, 0xcb, 0x90, 0x24, 0xe9, 0x83, 0x87, 0xfa, 0xf2, 0x26, 0xcb, 0x2d, 0x9b, 0x4e, 0x6e, 0xd9, - 0x6c, 0x38, 0xb9, 0x65, 0x27, 0xf3, 0xc5, 0x57, 0xeb, 0xb1, 0x4f, 0xfe, 0xb6, 0x2e, 0xc8, 0x54, - 0x02, 0x5d, 0x26, 0xa1, 0x50, 0xd5, 0x06, 0x8a, 0xd6, 0xa6, 0x9f, 0x9c, 0x25, 0x71, 0x4e, 0xd5, - 0x06, 0xbb, 0x6d, 0xb4, 0x0f, 0x62, 0x4b, 0x1f, 0x58, 0x78, 0x60, 0x0d, 0x2d, 0x85, 0x65, 0x37, - 0x1e, 0xe0, 0x03, 0x61, 0x9a, 0xa5, 0x9f, 0xaa, 0xc3, 0x79, 0x44, 0x19, 0xe5, 0xc5, 0x56, 0x90, - 0x80, 0xee, 0x02, 0xb8, 0x29, 0xd0, 0x2a, 0x25, 0x37, 0x12, 0xd7, 0x72, 0xdb, 0x1b, 0x13, 0x5b, - 0x7e, 0xdf, 0x61, 0x39, 0x31, 0xda, 0xaa, 0x8d, 0x77, 0x92, 0xe4, 0x73, 0x65, 0x9f, 0x24, 0x7a, - 0x1a, 0x16, 0x55, 0xc3, 0x50, 0x2c, 0x5b, 0xb5, 0xb1, 0xd2, 0x3c, 0xb7, 0xb1, 0x45, 0x73, 0x47, - 0x5e, 0x2e, 0xa8, 0x86, 0x71, 0x4c, 0xa8, 0x3b, 0x84, 0x88, 0x9e, 0x82, 0x22, 0xc9, 0x13, 0x9a, - 0xda, 0x53, 0xba, 0x58, 0xeb, 0x74, 0x6d, 0x9a, 0x23, 0x12, 0x72, 0x81, 0x53, 0xeb, 0x94, 0x28, - 0xb5, 0xdd, 0x1d, 0xa7, 0x39, 0x02, 0x21, 0x48, 0xb6, 0x55, 0x5b, 0xa5, 0x96, 0xcc, 0xcb, 0xf4, - 0x99, 0xd0, 0x0c, 0xd5, 0xee, 0x72, 0xfb, 0xd0, 0x67, 0xb4, 0x0a, 0x69, 0xae, 0x36, 0x41, 0xd5, - 0xf2, 0x11, 0x5a, 0x81, 0x94, 0x61, 0xea, 0x67, 0x98, 0x6e, 0x5d, 0x46, 0x66, 0x03, 0x49, 0x86, - 0x62, 0x30, 0x9f, 0xa0, 0x22, 0xc4, 0xed, 0x11, 0x9f, 0x25, 0x6e, 0x8f, 0xd0, 0x0b, 0x90, 0x24, - 0x86, 0xa4, 0x73, 0x14, 0x43, 0x32, 0x28, 0x97, 0x6b, 0x9c, 0x1b, 0x58, 0xa6, 0x9c, 0xd2, 0x22, - 0x14, 0x02, 0x79, 0x46, 0x5a, 0x85, 0x95, 0xb0, 0xb4, 0x21, 0x75, 0x5d, 0x7a, 0x20, 0xfc, 0xa3, - 0x5b, 0x90, 0x71, 0xf3, 0x06, 0x73, 0x9c, 0xcb, 0x13, 0xd3, 0x3a, 0xcc, 0xb2, 0xcb, 0x4a, 0x3c, - 0x86, 0x6c, 0x40, 0x57, 0xe5, 0x55, 0x42, 0x5e, 0x5e, 0x50, 0x0d, 0xa3, 0xae, 0x5a, 0x5d, 0xe9, - 0x5d, 0x28, 0x45, 0xe5, 0x04, 0x9f, 0xc1, 0x04, 0xea, 0xf6, 0x8e, 0xc1, 0x56, 0x21, 0x7d, 0xaa, - 0x9b, 0x7d, 0xd5, 0xa6, 0xca, 0x0a, 0x32, 0x1f, 0x11, 0x43, 0xb2, 0xfc, 0x90, 0xa0, 0x64, 0x36, - 0x90, 0x14, 0xb8, 0x1c, 0x99, 0x17, 0x88, 0x88, 0x36, 0x68, 0x63, 0x66, 0xd6, 0x82, 0xcc, 0x06, - 0x9e, 0x22, 0xf6, 0xb1, 0x6c, 0x40, 0xa6, 0xb5, 0xe8, 0x5a, 0xa9, 0xfe, 0xac, 0xcc, 0x47, 0xd2, - 0x67, 0x09, 0x58, 0x0d, 0xcf, 0x0e, 0x68, 0x03, 0xf2, 0x7d, 0x75, 0xa4, 0xd8, 0x23, 0xee, 0x76, - 0x02, 0xdd, 0x78, 0xe8, 0xab, 0xa3, 0xc6, 0x88, 0xf9, 0x9c, 0x08, 0x09, 0x7b, 0x64, 0x95, 0xe2, - 0x1b, 0x89, 0x6b, 0x79, 0x99, 0x3c, 0xa2, 0x13, 0x58, 0xea, 0xe9, 0x2d, 0xb5, 0xa7, 0xf4, 0x54, - 0xcb, 0x56, 0x78, 0xd9, 0xc0, 0x0e, 0xd1, 0x93, 0x13, 0xc6, 0x66, 0x71, 0x1e, 0xb7, 0xd9, 0x7e, - 0x92, 0x80, 0xc3, 0xfd, 0x7f, 0x91, 0xea, 0xd8, 0x57, 0x9d, 0xad, 0x46, 0x77, 0x20, 0xd7, 0xd7, - 0xac, 0x26, 0xee, 0xaa, 0x67, 0x9a, 0x6e, 0xf2, 0xd3, 0x34, 0xe9, 0x34, 0x6f, 0x78, 0x3c, 0x5c, - 0x93, 0x5f, 0xcc, 0xb7, 0x25, 0xa9, 0x80, 0x0f, 0x3b, 0xd1, 0x24, 0x3d, 0x77, 0x34, 0x79, 0x01, - 0x56, 0x06, 0x78, 0x64, 0x2b, 0xde, 0x79, 0x65, 0x7e, 0xb2, 0x40, 0x4d, 0x8f, 0xc8, 0x3b, 0xf7, - 0x84, 0x5b, 0xc4, 0x65, 0xd0, 0x75, 0x9a, 0x5f, 0x0d, 0xdd, 0xc2, 0xa6, 0xa2, 0xb6, 0xdb, 0x26, - 0xb6, 0x2c, 0x5a, 0x92, 0xe5, 0x69, 0xd2, 0xa4, 0xf4, 0x0a, 0x23, 0x4b, 0xbf, 0xf6, 0x6f, 0x4d, - 0x30, 0x9f, 0x72, 0xc3, 0x0b, 0x9e, 0xe1, 0x8f, 0x61, 0x85, 0xcb, 0xb7, 0x03, 0xb6, 0x67, 0x75, - 0xed, 0xe3, 0x93, 0xe7, 0x6b, 0xdc, 0xe6, 0xc8, 0x11, 0x8f, 0x36, 0x7b, 0xe2, 0xd1, 0xcc, 0x8e, - 0x20, 0x49, 0x8d, 0x92, 0x64, 0x21, 0x86, 0x3c, 0xff, 0xb7, 0x6d, 0xc5, 0x47, 0x09, 0x58, 0x9a, - 0x28, 0x4e, 0xdc, 0x85, 0x09, 0xa1, 0x0b, 0x8b, 0x87, 0x2e, 0x2c, 0x31, 0xf7, 0xc2, 0xf8, 0x5e, - 0x27, 0xa7, 0xef, 0x75, 0xea, 0x7b, 0xdc, 0xeb, 0xf4, 0xa3, 0xed, 0xf5, 0x7f, 0x74, 0x17, 0x7e, - 0x23, 0x40, 0x39, 0xba, 0xa2, 0x0b, 0xdd, 0x8e, 0x67, 0x61, 0xc9, 0xfd, 0x14, 0x57, 0x3d, 0x0b, - 0x8c, 0xa2, 0xfb, 0x82, 0xeb, 0x8f, 0xcc, 0x71, 0x4f, 0x41, 0x71, 0xac, 0xde, 0x64, 0xae, 0x5c, - 0x38, 0xf3, 0xcf, 0x2f, 0xfd, 0x32, 0xe1, 0x26, 0x9e, 0x40, 0x51, 0x18, 0x72, 0x5a, 0xdf, 0x84, - 0xe5, 0x36, 0x6e, 0x69, 0xed, 0x47, 0x3d, 0xac, 0x4b, 0x5c, 0xfa, 0xff, 0x67, 0x75, 0xd2, 0x4b, - 0xfe, 0x24, 0xc0, 0xa5, 0xd0, 0x4a, 0x1a, 0xfd, 0x18, 0xf2, 0xbe, 0x32, 0x9c, 0x6d, 0xc8, 0x58, - 0x13, 0xcd, 0x20, 0x86, 0x4d, 0x4f, 0x48, 0xce, 0x75, 0xdc, 0x67, 0x8b, 0xd4, 0xab, 0x1d, 0xd3, - 0x68, 0x05, 0x3c, 0x29, 0x2b, 0xe7, 0x08, 0xcd, 0x71, 0xa2, 0xeb, 0x20, 0x5a, 0xc3, 0xa6, 0xda, - 0x6a, 0xe9, 0xc3, 0x81, 0xad, 0xf4, 0xd4, 0x26, 0xee, 0xf1, 0x94, 0xbb, 0xe8, 0xd1, 0xf7, 0x09, - 0x19, 0x95, 0x21, 0x63, 0xa8, 0x96, 0xf5, 0x50, 0x37, 0xdb, 0xbc, 0xf2, 0x75, 0xc7, 0xd2, 0x3f, - 0x00, 0x32, 0x32, 0xb6, 0x0c, 0x52, 0x55, 0xa2, 0x1d, 0xc8, 0xe2, 0x51, 0x0b, 0x1b, 0xb6, 0x53, - 0x88, 0x87, 0x37, 0x4f, 0x8c, 0xbb, 0xe6, 0x70, 0xd6, 0x63, 0xb2, 0x27, 0x86, 0x6e, 0x72, 0x74, - 0x24, 0x1a, 0xe8, 0xe0, 0xe2, 0x7e, 0x78, 0xe4, 0x45, 0x07, 0x1e, 0x49, 0x44, 0x76, 0xfe, 0x4c, - 0x6a, 0x0c, 0x1f, 0xb9, 0xc9, 0xf1, 0x91, 0xe4, 0x94, 0xc9, 0x02, 0x00, 0x49, 0x35, 0x00, 0x90, - 0xa4, 0xa7, 0x2c, 0x33, 0x02, 0x21, 0x79, 0xd1, 0x41, 0x48, 0x16, 0xa6, 0x7c, 0xf1, 0x18, 0x44, - 0xf2, 0x9a, 0x0f, 0x22, 0xc9, 0x52, 0xd1, 0x8d, 0x48, 0xd1, 0x10, 0x8c, 0xe4, 0x15, 0x17, 0x23, - 0xc9, 0x47, 0xe2, 0x2b, 0x5c, 0x78, 0x1c, 0x24, 0x39, 0x9c, 0x00, 0x49, 0x0a, 0x91, 0xfd, 0x21, - 0x53, 0x31, 0x05, 0x25, 0x39, 0x9c, 0x40, 0x49, 0x8a, 0x53, 0x14, 0x4e, 0x81, 0x49, 0x7e, 0x16, - 0x0e, 0x93, 0x44, 0x03, 0x19, 0xfc, 0x33, 0x67, 0xc3, 0x49, 0x94, 0x08, 0x9c, 0x44, 0x8c, 0xec, - 0xe9, 0x99, 0xfa, 0x99, 0x81, 0x92, 0x93, 0x10, 0xa0, 0x84, 0x41, 0x1a, 0xd7, 0x22, 0x95, 0xcf, - 0x80, 0x94, 0x9c, 0x84, 0x20, 0x25, 0x68, 0xaa, 0xda, 0xa9, 0x50, 0xc9, 0xdd, 0x20, 0x54, 0xb2, - 0x1c, 0x51, 0x3b, 0x7b, 0xa7, 0x3d, 0x02, 0x2b, 0x69, 0x46, 0x61, 0x25, 0x0c, 0xcf, 0x78, 0x2e, - 0x52, 0xe3, 0x1c, 0x60, 0xc9, 0xe1, 0x04, 0x58, 0x72, 0x69, 0x8a, 0xa7, 0x4d, 0x41, 0x4b, 0x8e, - 0x43, 0xd0, 0x92, 0xd5, 0x48, 0xf4, 0x89, 0xa9, 0x9c, 0x07, 0x2e, 0x49, 0x89, 0xe9, 0xbd, 0x64, - 0x26, 0x23, 0x66, 0x19, 0x50, 0xb2, 0x97, 0xcc, 0xe4, 0xc4, 0xbc, 0x74, 0x9d, 0x14, 0x77, 0x63, - 0xc1, 0x93, 0xb4, 0x51, 0xd8, 0x34, 0x75, 0x93, 0x03, 0x1f, 0x6c, 0x20, 0x5d, 0x23, 0xed, 0xb3, - 0x17, 0x28, 0x2f, 0x80, 0x56, 0x68, 0xbb, 0xea, 0x0b, 0x8e, 0xd2, 0x1f, 0x04, 0x4f, 0x96, 0x82, - 0x2b, 0xfe, 0xd6, 0x3b, 0xcb, 0x5b, 0x6f, 0x1f, 0xe0, 0x12, 0x0f, 0x02, 0x2e, 0xeb, 0x90, 0x23, - 0x6d, 0xe8, 0x18, 0x96, 0xa2, 0x1a, 0x2e, 0x96, 0x72, 0x03, 0x96, 0x68, 0x2d, 0xc1, 0x60, 0x19, - 0x9e, 0xb1, 0x93, 0x34, 0x63, 0x2f, 0x92, 0x17, 0xcc, 0xe4, 0x2c, 0x75, 0x3f, 0x0f, 0xcb, 0x3e, - 0x5e, 0xb7, 0xbd, 0x65, 0xc0, 0x82, 0xe8, 0x72, 0x57, 0x78, 0x9f, 0xfb, 0x67, 0xc1, 0xb3, 0x90, - 0x07, 0xc2, 0x84, 0xe1, 0x25, 0xc2, 0xf7, 0x84, 0x97, 0xc4, 0x1f, 0x19, 0x2f, 0xf1, 0xb7, 0xeb, - 0x89, 0x60, 0xbb, 0xfe, 0x2f, 0xc1, 0xdb, 0x13, 0x17, 0xfd, 0x68, 0xe9, 0x6d, 0xcc, 0x1b, 0x68, - 0xfa, 0x4c, 0xaa, 0xb5, 0x9e, 0xde, 0xe1, 0x39, 0x9b, 0x3c, 0x12, 0x2e, 0x37, 0x9b, 0x65, 0x79, - 0xb2, 0x72, 0x7b, 0x6f, 0x56, 0x13, 0xf1, 0xde, 0x5b, 0x84, 0xc4, 0x03, 0xcc, 0xd0, 0xf9, 0xbc, - 0x4c, 0x1e, 0x09, 0x1f, 0x75, 0x3e, 0x5e, 0xdb, 0xb0, 0x01, 0x7a, 0x19, 0xb2, 0xf4, 0xd7, 0x8b, - 0xa2, 0x1b, 0x16, 0x47, 0xe4, 0x03, 0x55, 0x1f, 0xfb, 0xff, 0xb2, 0x79, 0x44, 0x78, 0x0e, 0x0d, - 0x4b, 0xce, 0x18, 0xfc, 0xc9, 0x57, 0x8c, 0x65, 0x03, 0xc5, 0xd8, 0x15, 0xc8, 0x92, 0xaf, 0xb7, - 0x0c, 0xb5, 0x85, 0x4b, 0x40, 0x3f, 0xd4, 0x23, 0x48, 0xbf, 0x8f, 0xc3, 0xe2, 0x58, 0xf6, 0x0a, - 0x5d, 0xbb, 0xe3, 0x92, 0x71, 0x1f, 0x1a, 0x34, 0x9b, 0x3d, 0xd6, 0x00, 0x3a, 0xaa, 0xa5, 0x3c, - 0x54, 0x07, 0x36, 0x6e, 0x73, 0xa3, 0xf8, 0x28, 0xa4, 0xd6, 0x21, 0xa3, 0xa1, 0x85, 0xdb, 0x1c, - 0x98, 0x72, 0xc7, 0xa8, 0x0e, 0x69, 0x7c, 0x86, 0x07, 0xb6, 0x55, 0x5a, 0xa0, 0xdb, 0xbe, 0x3a, - 0x89, 0x14, 0x90, 0xd7, 0x3b, 0x25, 0xb2, 0xd9, 0xdf, 0x7e, 0xb5, 0x2e, 0x32, 0xee, 0xe7, 0xf4, - 0xbe, 0x66, 0xe3, 0xbe, 0x61, 0x9f, 0xcb, 0x5c, 0x3e, 0x68, 0x85, 0xcc, 0x98, 0x15, 0x28, 0x44, - 0x9a, 0x77, 0x90, 0x0f, 0x62, 0x53, 0x4d, 0x37, 0x35, 0xfb, 0x5c, 0x2e, 0xf4, 0x71, 0xdf, 0xd0, - 0xf5, 0x9e, 0xc2, 0xce, 0x78, 0x05, 0x8a, 0xc1, 0x64, 0x8d, 0x9e, 0x84, 0x82, 0x89, 0x6d, 0x55, - 0x1b, 0x28, 0x81, 0xfe, 0x20, 0xcf, 0x88, 0xec, 0x4c, 0xed, 0x25, 0x33, 0x82, 0x18, 0xdf, 0x4b, - 0x66, 0xe2, 0x62, 0x42, 0x3a, 0x22, 0x25, 0x68, 0x48, 0xb2, 0x46, 0x2f, 0x41, 0xd6, 0xcb, 0xf3, - 0xac, 0xfe, 0xbc, 0x00, 0x84, 0xf2, 0x78, 0xa5, 0x3f, 0x0a, 0x9e, 0xca, 0x20, 0xac, 0x55, 0x83, - 0xb4, 0x89, 0xad, 0x61, 0x8f, 0x01, 0x4d, 0xc5, 0xed, 0xe7, 0x67, 0x4b, 0xf3, 0x84, 0x3a, 0xec, - 0xd9, 0x32, 0x17, 0x96, 0xde, 0x81, 0x34, 0xa3, 0xa0, 0x1c, 0x2c, 0x9c, 0x1c, 0xdc, 0x3b, 0x38, - 0x7c, 0xeb, 0x40, 0x8c, 0x21, 0x80, 0x74, 0xa5, 0x5a, 0xad, 0x1d, 0x35, 0x44, 0x01, 0x65, 0x21, - 0x55, 0xd9, 0x39, 0x94, 0x1b, 0x62, 0x9c, 0x90, 0xe5, 0xda, 0x5e, 0xad, 0xda, 0x10, 0x13, 0x68, - 0x09, 0x0a, 0xec, 0x59, 0xb9, 0x7b, 0x28, 0xbf, 0x51, 0x69, 0x88, 0x49, 0x1f, 0xe9, 0xb8, 0x76, - 0x70, 0xa7, 0x26, 0x8b, 0x29, 0xe9, 0x07, 0x70, 0x39, 0xb2, 0x30, 0xf0, 0x30, 0x2b, 0xc1, 0x87, - 0x59, 0x49, 0x9f, 0xc5, 0x49, 0xbf, 0x17, 0x95, 0xed, 0xd1, 0xde, 0xd8, 0xc2, 0xb7, 0xe7, 0x28, - 0x15, 0xc6, 0x56, 0x4f, 0x5a, 0x3c, 0x13, 0x9f, 0x62, 0xbb, 0xd5, 0x65, 0xd5, 0x07, 0x8b, 0x40, - 0x05, 0xb9, 0xc0, 0xa9, 0x54, 0xc8, 0x62, 0x6c, 0xef, 0xe1, 0x96, 0xad, 0x30, 0x27, 0xb2, 0x68, - 0x9f, 0x95, 0x25, 0x6c, 0x84, 0x7a, 0xcc, 0x88, 0xd2, 0xbb, 0x73, 0xd9, 0x32, 0x0b, 0x29, 0xb9, - 0xd6, 0x90, 0xdf, 0x16, 0x13, 0x08, 0x41, 0x91, 0x3e, 0x2a, 0xc7, 0x07, 0x95, 0xa3, 0xe3, 0xfa, - 0x21, 0xb1, 0xe5, 0x32, 0x2c, 0x3a, 0xb6, 0x74, 0x88, 0x29, 0xe9, 0x59, 0x78, 0x2c, 0xa2, 0x54, - 0x99, 0xec, 0x36, 0xa5, 0xdf, 0x0a, 0x7e, 0xee, 0x60, 0xb9, 0x71, 0x08, 0x69, 0xcb, 0x56, 0xed, - 0xa1, 0xc5, 0x8d, 0xf8, 0xd2, 0xac, 0xb5, 0xcb, 0xa6, 0xf3, 0x70, 0x4c, 0xc5, 0x65, 0xae, 0x46, - 0xba, 0x05, 0xc5, 0xe0, 0x9b, 0x68, 0x1b, 0x78, 0x4e, 0x14, 0x97, 0x6e, 0x03, 0x9a, 0x2c, 0x69, - 0x42, 0x3a, 0x6f, 0x21, 0xac, 0xf3, 0xfe, 0x9d, 0x00, 0x8f, 0x5f, 0x50, 0xbe, 0xa0, 0x37, 0xc7, - 0x16, 0xf9, 0xca, 0x3c, 0xc5, 0xcf, 0x26, 0xa3, 0x8d, 0x2d, 0xf3, 0x26, 0xe4, 0xfd, 0xf4, 0xd9, - 0x16, 0xf9, 0x6d, 0xdc, 0x3b, 0xc4, 0x41, 0x88, 0xc0, 0x0b, 0x81, 0xc2, 0x77, 0x0c, 0x81, 0xaf, - 0x02, 0xd8, 0x23, 0x85, 0xb9, 0xb5, 0x93, 0x47, 0xaf, 0x86, 0x40, 0xaf, 0xb8, 0xd5, 0x18, 0xf1, - 0x43, 0x90, 0xb5, 0xf9, 0x93, 0x85, 0x8e, 0xfd, 0x78, 0xc9, 0x90, 0xe6, 0x58, 0x8b, 0x63, 0x09, - 0xb3, 0x26, 0x63, 0x0f, 0x57, 0x61, 0x64, 0x0b, 0xbd, 0x0d, 0x8f, 0x8d, 0x15, 0x0a, 0xae, 0xea, - 0xe4, 0xac, 0xf5, 0xc2, 0xa5, 0x60, 0xbd, 0xe0, 0xa8, 0xf6, 0x67, 0xfb, 0x54, 0x30, 0xdb, 0xbf, - 0x04, 0xab, 0xe1, 0x25, 0x22, 0xba, 0x0a, 0x80, 0x07, 0x24, 0x2d, 0xb4, 0x15, 0xf7, 0x9f, 0x44, - 0x96, 0x53, 0x1a, 0x23, 0xe9, 0x6d, 0x00, 0x0f, 0x70, 0x21, 0xa1, 0xc9, 0xd4, 0x87, 0x83, 0x36, - 0xe5, 0x4b, 0xc9, 0x6c, 0x80, 0x6e, 0x41, 0x8a, 0x61, 0x08, 0xf1, 0x88, 0x18, 0x4e, 0x26, 0xf2, - 0x01, 0x36, 0x8c, 0x5b, 0xd2, 0x00, 0x4d, 0x82, 0xde, 0x11, 0x53, 0xbc, 0x16, 0x9c, 0xe2, 0x89, - 0x48, 0xf8, 0x3c, 0x7c, 0xaa, 0x0f, 0x20, 0x45, 0x5d, 0x86, 0x64, 0x6b, 0xfa, 0xa7, 0x85, 0x97, - 0x99, 0xe4, 0x19, 0xfd, 0x1c, 0x40, 0xb5, 0x6d, 0x53, 0x6b, 0x0e, 0xbd, 0x09, 0xd6, 0xc3, 0x5d, - 0xae, 0xe2, 0xf0, 0xed, 0x5c, 0xe1, 0xbe, 0xb7, 0xe2, 0x89, 0xfa, 0xfc, 0xcf, 0xa7, 0x50, 0x3a, - 0x80, 0x62, 0x50, 0xd6, 0x29, 0x8c, 0xd8, 0x37, 0x04, 0x0b, 0x23, 0x56, 0xe7, 0xf2, 0xc2, 0xc8, - 0x2d, 0xab, 0x12, 0xec, 0x77, 0x12, 0x1d, 0x48, 0x1f, 0xc6, 0x21, 0xef, 0xf7, 0xd8, 0xff, 0xbd, - 0xda, 0x45, 0xfa, 0x95, 0x00, 0x19, 0x77, 0xf9, 0xc1, 0x7f, 0x4b, 0x81, 0x9f, 0x71, 0xcc, 0x7a, - 0x71, 0xff, 0x0f, 0x21, 0xf6, 0xeb, 0x2d, 0xe1, 0xfe, 0x7a, 0xbb, 0xed, 0xe6, 0xcd, 0x28, 0x78, - 0xc6, 0x6f, 0x6b, 0xee, 0x55, 0x4e, 0x99, 0x70, 0x1b, 0xb2, 0xee, 0xb1, 0x27, 0xdd, 0x8a, 0x83, - 0x84, 0x09, 0xfc, 0xf0, 0x71, 0x14, 0x6c, 0x05, 0x52, 0x86, 0xfe, 0x90, 0xff, 0x6d, 0x4a, 0xc8, - 0x6c, 0x20, 0xb5, 0x61, 0x71, 0x2c, 0x66, 0xa0, 0xdb, 0xb0, 0x60, 0x0c, 0x9b, 0x8a, 0xe3, 0x1c, - 0x63, 0x90, 0xa5, 0x53, 0x07, 0x0f, 0x9b, 0x3d, 0xad, 0x75, 0x0f, 0x9f, 0x3b, 0x1f, 0x63, 0x0c, - 0x9b, 0xf7, 0x98, 0x0f, 0xb1, 0x59, 0xe2, 0xfe, 0x59, 0x3e, 0x15, 0x20, 0xe3, 0x9c, 0x09, 0xf4, - 0x23, 0xc8, 0xba, 0xf1, 0xc8, 0xfd, 0x5d, 0x1c, 0x19, 0xc8, 0xb8, 0x7e, 0x4f, 0x04, 0x55, 0x9c, - 0xff, 0xdc, 0x5a, 0x5b, 0x39, 0xed, 0xa9, 0xcc, 0x97, 0x8a, 0x41, 0x9b, 0xb1, 0x88, 0x45, 0x03, - 0xf9, 0xee, 0x9d, 0xbb, 0x3d, 0xb5, 0x23, 0xe7, 0xa8, 0xcc, 0x6e, 0x9b, 0x0c, 0x78, 0x49, 0xf8, - 0x4f, 0x01, 0xc4, 0xf1, 0x13, 0xfb, 0x9d, 0xbf, 0x6e, 0x32, 0x3f, 0x26, 0x42, 0xf2, 0x23, 0xda, - 0x82, 0x65, 0x97, 0x43, 0x21, 0xdd, 0xb1, 0x6a, 0x0f, 0x4d, 0xcc, 0x41, 0x5e, 0xe4, 0xbe, 0x3a, - 0x76, 0xde, 0x4c, 0xae, 0x3a, 0xf5, 0x88, 0xab, 0xfe, 0x28, 0x0e, 0x39, 0x1f, 0xe4, 0x8c, 0x7e, - 0xe8, 0x0b, 0x46, 0xc5, 0x90, 0x94, 0xe2, 0xe3, 0xf5, 0x7e, 0xfd, 0x06, 0xcd, 0x14, 0x9f, 0xdf, - 0x4c, 0x51, 0xc0, 0xbe, 0x83, 0x60, 0x27, 0xe7, 0x46, 0xb0, 0x9f, 0x03, 0x64, 0xeb, 0xb6, 0xda, - 0x53, 0xce, 0x74, 0x5b, 0x1b, 0x74, 0x14, 0xe6, 0x86, 0x2c, 0x74, 0x88, 0xf4, 0xcd, 0x7d, 0xfa, - 0xe2, 0x88, 0x7a, 0xe4, 0x2f, 0x04, 0xc8, 0xb8, 0xf5, 0xfa, 0xbc, 0x3f, 0x86, 0x57, 0x21, 0xcd, - 0x4b, 0x52, 0xf6, 0x67, 0x98, 0x8f, 0x42, 0xa1, 0xfa, 0x32, 0x64, 0xfa, 0xd8, 0x56, 0x69, 0x1c, - 0x64, 0xe9, 0xd0, 0x1d, 0xdf, 0x78, 0x05, 0x72, 0xbe, 0x9f, 0xea, 0x24, 0x34, 0x1e, 0xd4, 0xde, - 0x12, 0x63, 0xe5, 0x85, 0x8f, 0x3f, 0xdf, 0x48, 0x1c, 0xe0, 0x87, 0xe4, 0x34, 0xcb, 0xb5, 0x6a, - 0xbd, 0x56, 0xbd, 0x27, 0x0a, 0xe5, 0xdc, 0xc7, 0x9f, 0x6f, 0x2c, 0xc8, 0x98, 0xe2, 0x9b, 0x37, - 0xee, 0xc1, 0xe2, 0xd8, 0xc6, 0x04, 0xeb, 0x1d, 0x04, 0xc5, 0x3b, 0x27, 0x47, 0xfb, 0xbb, 0xd5, - 0x4a, 0xa3, 0xa6, 0xdc, 0x3f, 0x6c, 0xd4, 0x44, 0x01, 0x3d, 0x06, 0xcb, 0xfb, 0xbb, 0xaf, 0xd7, - 0x1b, 0x4a, 0x75, 0x7f, 0xb7, 0x76, 0xd0, 0x50, 0x2a, 0x8d, 0x46, 0xa5, 0x7a, 0x4f, 0x8c, 0x6f, - 0x7f, 0x98, 0x87, 0x64, 0x65, 0xa7, 0xba, 0x8b, 0xaa, 0x90, 0xa4, 0x18, 0xca, 0x85, 0x37, 0xf5, - 0xca, 0x17, 0x23, 0xd5, 0xe8, 0x2e, 0xa4, 0x28, 0xbc, 0x82, 0x2e, 0xbe, 0xba, 0x57, 0x9e, 0x02, - 0x5d, 0x93, 0x8f, 0xa1, 0x27, 0xf2, 0xc2, 0xbb, 0x7c, 0xe5, 0x8b, 0x91, 0x6c, 0xb4, 0x0f, 0x0b, - 0x4e, 0x77, 0x3d, 0xed, 0x82, 0x5d, 0x79, 0x2a, 0xbc, 0x4c, 0x96, 0xc6, 0x50, 0x8a, 0x8b, 0xaf, - 0xf9, 0x95, 0xa7, 0x60, 0xdc, 0x68, 0x17, 0xd2, 0xbc, 0x8f, 0x9d, 0x72, 0x73, 0xaf, 0x3c, 0x0d, - 0xb5, 0x46, 0x32, 0x64, 0x3d, 0xfc, 0x67, 0xfa, 0xe5, 0xc5, 0xf2, 0x0c, 0xf0, 0x3d, 0x7a, 0x07, - 0x0a, 0xc1, 0x1e, 0x79, 0xb6, 0xdb, 0x81, 0xe5, 0x19, 0xf1, 0x71, 0xa2, 0x3f, 0xd8, 0x30, 0xcf, - 0x76, 0x5b, 0xb0, 0x3c, 0x23, 0x5c, 0x8e, 0xde, 0x83, 0xa5, 0xc9, 0x86, 0x76, 0xf6, 0xcb, 0x83, - 0xe5, 0x39, 0x00, 0x74, 0xd4, 0x07, 0x14, 0xd2, 0x08, 0xcf, 0x71, 0x97, 0xb0, 0x3c, 0x0f, 0x9e, - 0x8e, 0xda, 0xb0, 0x38, 0xde, 0x5d, 0xce, 0x7a, 0xb7, 0xb0, 0x3c, 0x33, 0xb6, 0xce, 0x66, 0x09, - 0x76, 0xa5, 0xb3, 0xde, 0x35, 0x2c, 0xcf, 0x0c, 0xb5, 0xa3, 0x13, 0x00, 0x5f, 0x63, 0x39, 0xc3, - 0xdd, 0xc3, 0xf2, 0x2c, 0xa0, 0x3b, 0x32, 0x60, 0x39, 0xac, 0xe3, 0x9c, 0xe7, 0x2a, 0x62, 0x79, - 0x2e, 0x2c, 0x9e, 0xf8, 0x73, 0xb0, 0x77, 0x9c, 0xed, 0x6a, 0x62, 0x79, 0x46, 0x50, 0x1e, 0xa9, - 0x50, 0x1c, 0xeb, 0x97, 0x66, 0xbc, 0xa9, 0x58, 0x9e, 0x15, 0xa3, 0xdf, 0xa9, 0x7c, 0xf1, 0xf5, - 0x9a, 0xf0, 0xe5, 0xd7, 0x6b, 0xc2, 0xdf, 0xbf, 0x5e, 0x13, 0x3e, 0xf9, 0x66, 0x2d, 0xf6, 0xe5, - 0x37, 0x6b, 0xb1, 0xbf, 0x7e, 0xb3, 0x16, 0xfb, 0xc9, 0x33, 0x1d, 0xcd, 0xee, 0x0e, 0x9b, 0x9b, - 0x2d, 0xbd, 0xbf, 0xd5, 0xd2, 0xfb, 0xd8, 0x6e, 0x9e, 0xda, 0xde, 0x83, 0x77, 0xc7, 0xbd, 0x99, - 0xa6, 0x49, 0xfa, 0xe6, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x82, 0x4f, 0x04, 0xe9, 0x03, 0x2f, - 0x00, 0x00, + // 3278 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0xcb, 0x73, 0x23, 0xd5, + 0xd5, 0x57, 0xeb, 0xad, 0xa3, 0x87, 0xdb, 0xd7, 0x1e, 0xa3, 0x11, 0x83, 0x6d, 0x9a, 0x02, 0x86, + 0x01, 0x6c, 0x3e, 0xcf, 0x37, 0x3c, 0x6a, 0x20, 0x15, 0x59, 0xa3, 0x41, 0xf6, 0x18, 0xdb, 0xb4, + 0xe5, 0xa1, 0xc8, 0x83, 0xa6, 0x2d, 0x5d, 0x49, 0xcd, 0x48, 0xea, 0xa6, 0xbb, 0x65, 0x64, 0x56, + 0x54, 0x48, 0xaa, 0x52, 0xac, 0xa8, 0x62, 0xc3, 0x22, 0x2c, 0xb2, 0xc8, 0x26, 0x7f, 0x41, 0x56, + 0x59, 0x65, 0xc1, 0x22, 0x0b, 0x96, 0x59, 0x91, 0x14, 0xac, 0xc2, 0x36, 0x8b, 0x6c, 0x53, 0xf7, + 0xd1, 0x2f, 0xa9, 0xdb, 0x92, 0x06, 0xb2, 0x48, 0x25, 0xbb, 0x7b, 0x4f, 0x9f, 0x73, 0x6e, 0xdf, + 0x73, 0xef, 0x3d, 0x8f, 0xdf, 0xbd, 0xf0, 0xa8, 0x8d, 0x87, 0x6d, 0x6c, 0x0e, 0xb4, 0xa1, 0xbd, + 0xad, 0x9e, 0xb5, 0xb4, 0x6d, 0xfb, 0xc2, 0xc0, 0xd6, 0x96, 0x61, 0xea, 0xb6, 0x8e, 0x96, 0xbc, + 0x8f, 0x5b, 0xe4, 0x63, 0xe5, 0x31, 0x1f, 0x77, 0xcb, 0xbc, 0x30, 0x6c, 0x7d, 0xdb, 0x30, 0x75, + 0xbd, 0xc3, 0xf8, 0x2b, 0xd7, 0xa6, 0x3f, 0x3f, 0xc0, 0x17, 0x5c, 0x5b, 0x40, 0x98, 0x8e, 0xb2, + 0x6d, 0xa8, 0xa6, 0x3a, 0x70, 0x3e, 0x6f, 0x4e, 0x7d, 0x3e, 0x57, 0xfb, 0x5a, 0x5b, 0xb5, 0x75, + 0x93, 0x73, 0x6c, 0x74, 0x75, 0xbd, 0xdb, 0xc7, 0xdb, 0xb4, 0x77, 0x36, 0xea, 0x6c, 0xdb, 0xda, + 0x00, 0x5b, 0xb6, 0x3a, 0x30, 0x38, 0xc3, 0x6a, 0x57, 0xef, 0xea, 0xb4, 0xb9, 0x4d, 0x5a, 0x21, + 0xe3, 0xea, 0xa6, 0xda, 0xea, 0x63, 0xff, 0x24, 0xa5, 0xcf, 0x00, 0x32, 0x32, 0x7e, 0x7f, 0x84, + 0x2d, 0x1b, 0xed, 0x40, 0x12, 0xb7, 0x7a, 0x7a, 0x59, 0xd8, 0x14, 0xae, 0xe7, 0x77, 0xae, 0x6d, + 0x4d, 0xcc, 0x7f, 0x8b, 0xf3, 0xd5, 0x5b, 0x3d, 0xbd, 0x11, 0x93, 0x29, 0x2f, 0xba, 0x05, 0xa9, + 0x4e, 0x7f, 0x64, 0xf5, 0xca, 0x71, 0x2a, 0xf4, 0x58, 0x94, 0xd0, 0x5d, 0xc2, 0xd4, 0x88, 0xc9, + 0x8c, 0x9b, 0x0c, 0xa5, 0x0d, 0x3b, 0x7a, 0x39, 0x71, 0xf9, 0x50, 0x7b, 0xc3, 0x0e, 0x1d, 0x8a, + 0xf0, 0xa2, 0x5d, 0x00, 0x6d, 0xa8, 0xd9, 0x4a, 0xab, 0xa7, 0x6a, 0xc3, 0x72, 0x8a, 0x4a, 0x3e, + 0x1e, 0x2d, 0xa9, 0xd9, 0x35, 0xc2, 0xd8, 0x88, 0xc9, 0x39, 0xcd, 0xe9, 0x90, 0xdf, 0x7d, 0x7f, + 0x84, 0xcd, 0x8b, 0x72, 0xfa, 0xf2, 0xdf, 0x7d, 0x93, 0x30, 0x91, 0xdf, 0xa5, 0xdc, 0xe8, 0x55, + 0xc8, 0xb6, 0x7a, 0xb8, 0xf5, 0x40, 0xb1, 0xc7, 0xe5, 0x2c, 0x95, 0xdc, 0x88, 0x92, 0xac, 0x11, + 0xbe, 0xe6, 0xb8, 0x11, 0x93, 0x33, 0x2d, 0xd6, 0x44, 0x2f, 0x43, 0xba, 0xa5, 0x0f, 0x06, 0x9a, + 0x5d, 0xce, 0x53, 0xd9, 0xf5, 0x48, 0x59, 0xca, 0xd5, 0x88, 0xc9, 0x9c, 0x1f, 0x1d, 0x42, 0xa9, + 0xaf, 0x59, 0xb6, 0x62, 0x0d, 0x55, 0xc3, 0xea, 0xe9, 0xb6, 0x55, 0x2e, 0x50, 0x0d, 0x4f, 0x46, + 0x69, 0x38, 0xd0, 0x2c, 0xfb, 0xc4, 0x61, 0x6e, 0xc4, 0xe4, 0x62, 0xdf, 0x4f, 0x20, 0xfa, 0xf4, + 0x4e, 0x07, 0x9b, 0xae, 0xc2, 0x72, 0xf1, 0x72, 0x7d, 0x47, 0x84, 0xdb, 0x91, 0x27, 0xfa, 0x74, + 0x3f, 0x01, 0xfd, 0x14, 0x56, 0xfa, 0xba, 0xda, 0x76, 0xd5, 0x29, 0xad, 0xde, 0x68, 0xf8, 0xa0, + 0x5c, 0xa2, 0x4a, 0x9f, 0x89, 0xfc, 0x49, 0x5d, 0x6d, 0x3b, 0x2a, 0x6a, 0x44, 0xa0, 0x11, 0x93, + 0x97, 0xfb, 0x93, 0x44, 0xf4, 0x0e, 0xac, 0xaa, 0x86, 0xd1, 0xbf, 0x98, 0xd4, 0xbe, 0x44, 0xb5, + 0xdf, 0x88, 0xd2, 0x5e, 0x25, 0x32, 0x93, 0xea, 0x91, 0x3a, 0x45, 0x45, 0x4d, 0x10, 0x0d, 0x13, + 0x1b, 0xaa, 0x89, 0x15, 0xc3, 0xd4, 0x0d, 0xdd, 0x52, 0xfb, 0x65, 0x91, 0xea, 0x7e, 0x3a, 0x4a, + 0xf7, 0x31, 0xe3, 0x3f, 0xe6, 0xec, 0x8d, 0x98, 0xbc, 0x64, 0x04, 0x49, 0x4c, 0xab, 0xde, 0xc2, + 0x96, 0xe5, 0x69, 0x5d, 0x9e, 0xa5, 0x95, 0xf2, 0x07, 0xb5, 0x06, 0x48, 0xa8, 0x0e, 0x79, 0x3c, + 0x26, 0xe2, 0xca, 0xb9, 0x6e, 0xe3, 0x32, 0xa2, 0x0a, 0xa5, 0xc8, 0x13, 0x4a, 0x59, 0xef, 0xeb, + 0x36, 0x6e, 0xc4, 0x64, 0xc0, 0x6e, 0x0f, 0xa9, 0x70, 0xe5, 0x1c, 0x9b, 0x5a, 0xe7, 0x82, 0xaa, + 0x51, 0xe8, 0x17, 0x4b, 0xd3, 0x87, 0xe5, 0x15, 0xaa, 0xf0, 0xd9, 0x28, 0x85, 0xf7, 0xa9, 0x10, + 0x51, 0x51, 0x77, 0x44, 0x1a, 0x31, 0x79, 0xe5, 0x7c, 0x9a, 0x4c, 0xb6, 0x58, 0x47, 0x1b, 0xaa, + 0x7d, 0xed, 0x43, 0xac, 0x9c, 0xf5, 0xf5, 0xd6, 0x83, 0xf2, 0xea, 0xe5, 0x5b, 0xec, 0x2e, 0xe7, + 0xde, 0x25, 0xcc, 0x64, 0x8b, 0x75, 0xfc, 0x04, 0x24, 0x83, 0x68, 0x69, 0xdd, 0xa1, 0xd2, 0xd5, + 0x2d, 0x4b, 0x33, 0xd8, 0xf4, 0xaf, 0x50, 0x8d, 0x4f, 0x45, 0x69, 0x3c, 0xd1, 0xba, 0xc3, 0xd7, + 0x29, 0x3b, 0x37, 0x41, 0xc9, 0x0a, 0x50, 0x76, 0x33, 0x90, 0x3a, 0x57, 0xfb, 0x23, 0xbc, 0x9f, + 0xcc, 0x26, 0xc5, 0xd4, 0x7e, 0x32, 0x9b, 0x11, 0xb3, 0xfb, 0xc9, 0x6c, 0x4e, 0x84, 0xfd, 0x64, + 0x16, 0xc4, 0xbc, 0xf4, 0x34, 0xe4, 0x7d, 0xce, 0x0e, 0x95, 0x21, 0x33, 0xc0, 0x96, 0xa5, 0x76, + 0x31, 0xf5, 0x8d, 0x39, 0xd9, 0xe9, 0x4a, 0x25, 0x28, 0xf8, 0x1d, 0x9c, 0xf4, 0xa9, 0xe0, 0x4a, + 0x12, 0xdf, 0x45, 0x24, 0xcf, 0xb1, 0x49, 0x4d, 0xcc, 0x25, 0x79, 0x17, 0x3d, 0x01, 0x45, 0x6a, + 0x1e, 0xc5, 0xf9, 0x4e, 0x1c, 0x68, 0x52, 0x2e, 0x50, 0xe2, 0x7d, 0xce, 0xb4, 0x01, 0x79, 0x63, + 0xc7, 0x70, 0x59, 0x12, 0x94, 0x05, 0x8c, 0x1d, 0xc3, 0x61, 0x78, 0x1c, 0x0a, 0x64, 0xe6, 0x2e, + 0x47, 0x92, 0x0e, 0x92, 0x27, 0x34, 0xce, 0x22, 0xfd, 0x39, 0x0e, 0xe2, 0xa4, 0x53, 0x44, 0x2f, + 0x43, 0x92, 0x84, 0x0f, 0xee, 0xea, 0x2b, 0x5b, 0x2c, 0xb6, 0x6c, 0x39, 0xb1, 0x65, 0xab, 0xe9, + 0xc4, 0x96, 0xdd, 0xec, 0x97, 0x5f, 0x6f, 0xc4, 0x3e, 0xfd, 0xeb, 0x86, 0x20, 0x53, 0x09, 0x74, + 0x95, 0xb8, 0x42, 0x55, 0x1b, 0x2a, 0x5a, 0x9b, 0xfe, 0x72, 0x8e, 0xf8, 0x39, 0x55, 0x1b, 0xee, + 0xb5, 0xd1, 0x01, 0x88, 0x2d, 0x7d, 0x68, 0xe1, 0xa1, 0x35, 0xb2, 0x14, 0x16, 0xdd, 0xb8, 0x83, + 0x0f, 0xb8, 0x69, 0x16, 0x7e, 0x6a, 0x0e, 0xe7, 0x31, 0x65, 0x94, 0x97, 0x5a, 0x41, 0x02, 0xba, + 0x0b, 0xe0, 0x86, 0x40, 0xab, 0x9c, 0xdc, 0x4c, 0x5c, 0xcf, 0xef, 0x6c, 0x4e, 0x2d, 0xf9, 0x7d, + 0x87, 0xe5, 0xd4, 0x68, 0xab, 0x36, 0xde, 0x4d, 0x92, 0xdf, 0x95, 0x7d, 0x92, 0xe8, 0x29, 0x58, + 0x52, 0x0d, 0x43, 0xb1, 0x6c, 0xd5, 0xc6, 0xca, 0xd9, 0x85, 0x8d, 0x2d, 0x1a, 0x3b, 0x0a, 0x72, + 0x51, 0x35, 0x8c, 0x13, 0x42, 0xdd, 0x25, 0x44, 0xf4, 0x24, 0x94, 0x48, 0x9c, 0xd0, 0xd4, 0xbe, + 0xd2, 0xc3, 0x5a, 0xb7, 0x67, 0xd3, 0x18, 0x91, 0x90, 0x8b, 0x9c, 0xda, 0xa0, 0x44, 0xa9, 0xed, + 0xae, 0x38, 0x8d, 0x11, 0x08, 0x41, 0xb2, 0xad, 0xda, 0x2a, 0xb5, 0x64, 0x41, 0xa6, 0x6d, 0x42, + 0x33, 0x54, 0xbb, 0xc7, 0xed, 0x43, 0xdb, 0x68, 0x0d, 0xd2, 0x5c, 0x6d, 0x82, 0xaa, 0xe5, 0x3d, + 0xb4, 0x0a, 0x29, 0xc3, 0xd4, 0xcf, 0x31, 0x5d, 0xba, 0xac, 0xcc, 0x3a, 0x92, 0x0c, 0xa5, 0x60, + 0x3c, 0x41, 0x25, 0x88, 0xdb, 0x63, 0x3e, 0x4a, 0xdc, 0x1e, 0xa3, 0x17, 0x20, 0x49, 0x0c, 0x49, + 0xc7, 0x28, 0x85, 0x44, 0x50, 0x2e, 0xd7, 0xbc, 0x30, 0xb0, 0x4c, 0x39, 0xa5, 0x25, 0x28, 0x06, + 0xe2, 0x8c, 0xb4, 0x06, 0xab, 0x61, 0x61, 0x43, 0xea, 0xb9, 0xf4, 0x80, 0xfb, 0x47, 0xb7, 0x20, + 0xeb, 0xc6, 0x0d, 0xb6, 0x71, 0xae, 0x4e, 0x0d, 0xeb, 0x30, 0xcb, 0x2e, 0x2b, 0xd9, 0x31, 0x64, + 0x01, 0x7a, 0x2a, 0xcf, 0x12, 0x0a, 0x72, 0x46, 0x35, 0x8c, 0x86, 0x6a, 0xf5, 0xa4, 0x77, 0xa1, + 0x1c, 0x15, 0x13, 0x7c, 0x06, 0x13, 0xe8, 0xb6, 0x77, 0x0c, 0xb6, 0x06, 0xe9, 0x8e, 0x6e, 0x0e, + 0x54, 0x9b, 0x2a, 0x2b, 0xca, 0xbc, 0x47, 0x0c, 0xc9, 0xe2, 0x43, 0x82, 0x92, 0x59, 0x47, 0x52, + 0xe0, 0x6a, 0x64, 0x5c, 0x20, 0x22, 0xda, 0xb0, 0x8d, 0x99, 0x59, 0x8b, 0x32, 0xeb, 0x78, 0x8a, + 0xd8, 0xcf, 0xb2, 0x0e, 0x19, 0xd6, 0xa2, 0x73, 0xa5, 0xfa, 0x73, 0x32, 0xef, 0x49, 0x9f, 0x27, + 0x60, 0x2d, 0x3c, 0x3a, 0xa0, 0x4d, 0x28, 0x0c, 0xd4, 0xb1, 0x62, 0x8f, 0xf9, 0xb6, 0x13, 0xe8, + 0xc2, 0xc3, 0x40, 0x1d, 0x37, 0xc7, 0x6c, 0xcf, 0x89, 0x90, 0xb0, 0xc7, 0x56, 0x39, 0xbe, 0x99, + 0xb8, 0x5e, 0x90, 0x49, 0x13, 0x9d, 0xc2, 0x72, 0x5f, 0x6f, 0xa9, 0x7d, 0xa5, 0xaf, 0x5a, 0xb6, + 0xc2, 0xd3, 0x06, 0x76, 0x88, 0x9e, 0x98, 0x32, 0x36, 0xf3, 0xf3, 0xb8, 0xcd, 0xd6, 0x93, 0x38, + 0x1c, 0xbe, 0xff, 0x97, 0xa8, 0x8e, 0x03, 0xd5, 0x59, 0x6a, 0x74, 0x07, 0xf2, 0x03, 0xcd, 0x3a, + 0xc3, 0x3d, 0xf5, 0x5c, 0xd3, 0x4d, 0x7e, 0x9a, 0xa6, 0x37, 0xcd, 0x1b, 0x1e, 0x0f, 0xd7, 0xe4, + 0x17, 0xf3, 0x2d, 0x49, 0x2a, 0xb0, 0x87, 0x1d, 0x6f, 0x92, 0x5e, 0xd8, 0x9b, 0xbc, 0x00, 0xab, + 0x43, 0x3c, 0xb6, 0x15, 0xef, 0xbc, 0xb2, 0x7d, 0x92, 0xa1, 0xa6, 0x47, 0xe4, 0x9b, 0x7b, 0xc2, + 0x2d, 0xb2, 0x65, 0xd0, 0x33, 0x34, 0xbe, 0x1a, 0xba, 0x85, 0x4d, 0x45, 0x6d, 0xb7, 0x4d, 0x6c, + 0x59, 0x34, 0x25, 0x2b, 0xd0, 0xa0, 0x49, 0xe9, 0x55, 0x46, 0x96, 0x7e, 0xed, 0x5f, 0x9a, 0x60, + 0x3c, 0xe5, 0x86, 0x17, 0x3c, 0xc3, 0x9f, 0xc0, 0x2a, 0x97, 0x6f, 0x07, 0x6c, 0xcf, 0xf2, 0xda, + 0x47, 0xa7, 0xcf, 0xd7, 0xa4, 0xcd, 0x91, 0x23, 0x1e, 0x6d, 0xf6, 0xc4, 0xc3, 0x99, 0x1d, 0x41, + 0x92, 0x1a, 0x25, 0xc9, 0x5c, 0x0c, 0x69, 0xff, 0xa7, 0x2d, 0xc5, 0xc7, 0x09, 0x58, 0x9e, 0x4a, + 0x4e, 0xdc, 0x89, 0x09, 0xa1, 0x13, 0x8b, 0x87, 0x4e, 0x2c, 0xb1, 0xf0, 0xc4, 0xf8, 0x5a, 0x27, + 0x67, 0xaf, 0x75, 0xea, 0x07, 0x5c, 0xeb, 0xf4, 0xc3, 0xad, 0xf5, 0xbf, 0x75, 0x15, 0x7e, 0x23, + 0x40, 0x25, 0x3a, 0xa3, 0x0b, 0x5d, 0x8e, 0x67, 0x61, 0xd9, 0xfd, 0x15, 0x57, 0x3d, 0x73, 0x8c, + 0xa2, 0xfb, 0x81, 0xeb, 0x8f, 0x8c, 0x71, 0x4f, 0x42, 0x69, 0x22, 0xdf, 0x64, 0x5b, 0xb9, 0x78, + 0xee, 0x1f, 0x5f, 0xfa, 0x65, 0xc2, 0x0d, 0x3c, 0x81, 0xa4, 0x30, 0xe4, 0xb4, 0xbe, 0x09, 0x2b, + 0x6d, 0xdc, 0xd2, 0xda, 0x0f, 0x7b, 0x58, 0x97, 0xb9, 0xf4, 0xff, 0xce, 0x6a, 0xe8, 0x2e, 0xb9, + 0x12, 0x9a, 0x49, 0x87, 0x2a, 0x11, 0x42, 0x95, 0xa0, 0x1f, 0x43, 0xc1, 0x97, 0xb1, 0xb3, 0x10, + 0x37, 0x51, 0x6f, 0x33, 0x34, 0x62, 0xcb, 0xd3, 0x2f, 0xe7, 0xbb, 0x6e, 0x3b, 0x72, 0x33, 0x49, + 0x7f, 0x07, 0xc8, 0xca, 0xd8, 0x32, 0x48, 0xba, 0x88, 0x76, 0x21, 0x87, 0xc7, 0x2d, 0x6c, 0xd8, + 0x4e, 0x86, 0x1d, 0x5e, 0x15, 0x31, 0xee, 0xba, 0xc3, 0xd9, 0x88, 0xc9, 0x9e, 0x18, 0xba, 0xc9, + 0x61, 0x8f, 0x68, 0x04, 0x83, 0x8b, 0xfb, 0x71, 0x8f, 0x17, 0x1d, 0xdc, 0x23, 0x11, 0x59, 0xd2, + 0x33, 0xa9, 0x09, 0xe0, 0xe3, 0x26, 0x07, 0x3e, 0x92, 0x33, 0x06, 0x0b, 0x20, 0x1f, 0xb5, 0x00, + 0xf2, 0x91, 0x9e, 0x31, 0xcd, 0x08, 0xe8, 0xe3, 0x45, 0x07, 0xfa, 0xc8, 0xcc, 0xf8, 0xe3, 0x09, + 0xec, 0xe3, 0x35, 0x1f, 0xf6, 0x91, 0xa3, 0xa2, 0x9b, 0x91, 0xa2, 0x21, 0xe0, 0xc7, 0x2b, 0x2e, + 0xf8, 0x51, 0x88, 0x04, 0x4e, 0xb8, 0xf0, 0x24, 0xfa, 0x71, 0x34, 0x85, 0x7e, 0x14, 0x23, 0x0b, + 0x3f, 0xa6, 0x62, 0x06, 0xfc, 0x71, 0x34, 0x05, 0x7f, 0x94, 0x66, 0x28, 0x9c, 0x81, 0x7f, 0xfc, + 0x2c, 0x1c, 0xff, 0x88, 0x46, 0x28, 0xf8, 0x6f, 0xce, 0x07, 0x80, 0x28, 0x11, 0x00, 0x88, 0x18, + 0x59, 0xac, 0x33, 0xf5, 0x73, 0x23, 0x20, 0xa7, 0x21, 0x08, 0x08, 0xc3, 0x2a, 0xae, 0x47, 0x2a, + 0x9f, 0x03, 0x02, 0x39, 0x0d, 0x81, 0x40, 0xd0, 0x4c, 0xb5, 0x33, 0x31, 0x90, 0xbb, 0x41, 0x0c, + 0x64, 0x25, 0x22, 0x29, 0xf6, 0x4e, 0x7b, 0x04, 0x08, 0x72, 0x16, 0x05, 0x82, 0x30, 0xa0, 0xe2, + 0xb9, 0x48, 0x8d, 0x0b, 0xa0, 0x20, 0x47, 0x53, 0x28, 0xc8, 0x95, 0x19, 0x3b, 0x6d, 0x06, 0x0c, + 0x72, 0x12, 0x02, 0x83, 0xac, 0x45, 0xc2, 0x4a, 0x4c, 0xe5, 0x22, 0x38, 0x48, 0x4a, 0x4c, 0xef, + 0x27, 0xb3, 0x59, 0x31, 0xc7, 0x10, 0x90, 0xfd, 0x64, 0x36, 0x2f, 0x16, 0xa4, 0x67, 0x48, 0xd6, + 0x36, 0xe1, 0x3c, 0x49, 0x7d, 0x84, 0x4d, 0x53, 0x37, 0x39, 0xa2, 0xc1, 0x3a, 0xd2, 0x75, 0x52, + 0x17, 0x7b, 0x8e, 0xf2, 0x12, 0xcc, 0x84, 0xd6, 0xa1, 0x3e, 0xe7, 0x28, 0xfd, 0x41, 0xf0, 0x64, + 0x29, 0x6a, 0xe2, 0xaf, 0xa9, 0x73, 0xbc, 0xa6, 0xf6, 0x21, 0x29, 0xf1, 0x20, 0x92, 0xb2, 0x01, + 0x79, 0x52, 0x5f, 0x4e, 0x80, 0x24, 0xaa, 0xe1, 0x82, 0x24, 0x37, 0x60, 0x99, 0x26, 0x09, 0x0c, + 0x6f, 0xe1, 0x41, 0x25, 0x49, 0x83, 0xca, 0x12, 0xf9, 0xc0, 0x4c, 0xce, 0x62, 0xf2, 0xf3, 0xb0, + 0xe2, 0xe3, 0x75, 0xeb, 0x56, 0x86, 0x18, 0x88, 0x2e, 0x77, 0x95, 0x17, 0xb0, 0x7f, 0x12, 0x3c, + 0x0b, 0x79, 0xe8, 0x4a, 0x18, 0x10, 0x22, 0xfc, 0x40, 0x40, 0x48, 0xfc, 0xa1, 0x81, 0x10, 0x7f, + 0x1d, 0x9e, 0x08, 0xd6, 0xe1, 0xff, 0x14, 0xbc, 0x35, 0x71, 0x61, 0x8d, 0x96, 0xde, 0xc6, 0xbc, + 0x32, 0xa6, 0x6d, 0x92, 0x86, 0xf5, 0xf5, 0x2e, 0xaf, 0x7f, 0x49, 0x93, 0x70, 0xb9, 0xd1, 0x2c, + 0xc7, 0x83, 0x95, 0x5b, 0x54, 0xb3, 0x64, 0x87, 0x17, 0xd5, 0x22, 0x24, 0x1e, 0x60, 0x06, 0xbb, + 0x17, 0x64, 0xd2, 0x24, 0x7c, 0x74, 0xf3, 0xf1, 0xa4, 0x85, 0x75, 0xd0, 0xcb, 0x90, 0xa3, 0x77, + 0x2a, 0x8a, 0x6e, 0x58, 0x1c, 0x6a, 0x0f, 0xa4, 0x73, 0xec, 0x62, 0x65, 0xeb, 0x98, 0xf0, 0x1c, + 0x19, 0x96, 0x9c, 0x35, 0x78, 0xcb, 0x97, 0x2f, 0xe4, 0x02, 0x59, 0xd6, 0x35, 0xc8, 0x91, 0xbf, + 0xb7, 0x0c, 0xb5, 0x85, 0xcb, 0x40, 0x7f, 0xd4, 0x23, 0x48, 0xbf, 0x8f, 0xc3, 0xd2, 0x44, 0xf4, + 0x0a, 0x9d, 0xbb, 0xb3, 0x25, 0xe3, 0x3e, 0x98, 0x67, 0x3e, 0x7b, 0xac, 0x03, 0x74, 0x55, 0x4b, + 0xf9, 0x40, 0x1d, 0xda, 0xb8, 0xcd, 0x8d, 0xe2, 0xa3, 0xa0, 0x0a, 0x64, 0x49, 0x6f, 0x64, 0xe1, + 0x36, 0x47, 0x9c, 0xdc, 0x3e, 0x6a, 0x40, 0x1a, 0x9f, 0xe3, 0xa1, 0x6d, 0x95, 0x33, 0x74, 0xd9, + 0xd7, 0xa6, 0x21, 0x00, 0xf2, 0x79, 0xb7, 0x4c, 0x16, 0xfb, 0xbb, 0xaf, 0x37, 0x44, 0xc6, 0xfd, + 0x9c, 0x3e, 0xd0, 0x6c, 0x3c, 0x30, 0xec, 0x0b, 0x99, 0xcb, 0x07, 0xad, 0x90, 0x9d, 0xb0, 0x02, + 0xc5, 0x3e, 0x0b, 0x0e, 0xa4, 0x41, 0x6c, 0xaa, 0xe9, 0xa6, 0x66, 0x5f, 0xc8, 0xc5, 0x01, 0x1e, + 0x18, 0xba, 0xde, 0x57, 0xd8, 0x19, 0xaf, 0x42, 0x29, 0x18, 0xac, 0xd1, 0x13, 0x50, 0x34, 0xb1, + 0xad, 0x6a, 0x43, 0x25, 0x90, 0xab, 0x15, 0x18, 0x91, 0x9d, 0xa9, 0xfd, 0x64, 0x56, 0x10, 0xe3, + 0xfb, 0xc9, 0x6c, 0x5c, 0x4c, 0x48, 0xc7, 0x24, 0xb7, 0x0c, 0x09, 0xd6, 0xe8, 0x25, 0xc8, 0x79, + 0x71, 0x5e, 0xa0, 0xb3, 0xbd, 0x04, 0x5d, 0xf2, 0x78, 0xa5, 0x3f, 0x0a, 0x9e, 0xca, 0x20, 0x5e, + 0x55, 0x87, 0xb4, 0x89, 0xad, 0x51, 0x9f, 0x21, 0x48, 0xa5, 0x9d, 0xe7, 0xe7, 0x0b, 0xf3, 0x84, + 0x3a, 0xea, 0xdb, 0x32, 0x17, 0x96, 0xde, 0x81, 0x34, 0xa3, 0xa0, 0x3c, 0x64, 0x4e, 0x0f, 0xef, + 0x1d, 0x1e, 0xbd, 0x75, 0x28, 0xc6, 0x10, 0x40, 0xba, 0x5a, 0xab, 0xd5, 0x8f, 0x9b, 0xa2, 0x80, + 0x72, 0x90, 0xaa, 0xee, 0x1e, 0xc9, 0x4d, 0x31, 0x4e, 0xc8, 0x72, 0x7d, 0xbf, 0x5e, 0x6b, 0x8a, + 0x09, 0xb4, 0x0c, 0x45, 0xd6, 0x56, 0xee, 0x1e, 0xc9, 0x6f, 0x54, 0x9b, 0x62, 0xd2, 0x47, 0x3a, + 0xa9, 0x1f, 0xde, 0xa9, 0xcb, 0x62, 0x4a, 0xfa, 0x3f, 0xb8, 0x1a, 0x99, 0x18, 0x78, 0x60, 0x94, + 0xe0, 0x03, 0xa3, 0xa4, 0xcf, 0xe3, 0xa4, 0x90, 0x8b, 0x8a, 0xf6, 0x68, 0x7f, 0x62, 0xe2, 0x3b, + 0x0b, 0xa4, 0x0a, 0x13, 0xb3, 0x27, 0xb5, 0x9b, 0x89, 0x3b, 0xd8, 0x6e, 0xf5, 0x58, 0xf6, 0xc1, + 0x3c, 0x50, 0x51, 0x2e, 0x72, 0x2a, 0x15, 0xb2, 0x18, 0xdb, 0x7b, 0xb8, 0x65, 0x2b, 0x6c, 0x13, + 0x59, 0xb4, 0x80, 0xca, 0x11, 0x36, 0x42, 0x3d, 0x61, 0x44, 0xe9, 0xdd, 0x85, 0x6c, 0x99, 0x83, + 0x94, 0x5c, 0x6f, 0xca, 0x6f, 0x8b, 0x09, 0x84, 0xa0, 0x44, 0x9b, 0xca, 0xc9, 0x61, 0xf5, 0xf8, + 0xa4, 0x71, 0x44, 0x6c, 0xb9, 0x02, 0x4b, 0x8e, 0x2d, 0x1d, 0x62, 0x4a, 0x7a, 0x16, 0x1e, 0x89, + 0x48, 0x55, 0xa6, 0xcb, 0x48, 0xe9, 0xb7, 0x82, 0x9f, 0x3b, 0x98, 0x6e, 0x1c, 0x41, 0xda, 0xb2, + 0x55, 0x7b, 0x64, 0x71, 0x23, 0xbe, 0x34, 0x6f, 0xee, 0xb2, 0xe5, 0x34, 0x4e, 0xa8, 0xb8, 0xcc, + 0xd5, 0x48, 0xb7, 0xa0, 0x14, 0xfc, 0x12, 0x6d, 0x03, 0x6f, 0x13, 0xc5, 0xa5, 0xdb, 0x80, 0xa6, + 0x53, 0x9a, 0x90, 0x92, 0x5a, 0x08, 0x2b, 0xa9, 0x7f, 0x27, 0xc0, 0xa3, 0x97, 0xa4, 0x2f, 0xe8, + 0xcd, 0x89, 0x49, 0xbe, 0xb2, 0x48, 0xf2, 0xb3, 0xc5, 0x68, 0x13, 0xd3, 0xbc, 0x09, 0x05, 0x3f, + 0x7d, 0xbe, 0x49, 0x7e, 0x17, 0xf7, 0x0e, 0x71, 0xb0, 0xf6, 0xf7, 0x5c, 0xa0, 0xf0, 0x3d, 0x5d, + 0xe0, 0xab, 0x00, 0xf6, 0x58, 0x61, 0xdb, 0x3a, 0xb4, 0x20, 0xe5, 0x98, 0x2a, 0x6e, 0x35, 0xc7, + 0xfc, 0x10, 0xe4, 0x6c, 0xde, 0xb2, 0xd0, 0x89, 0x1f, 0x08, 0x19, 0xd1, 0x18, 0x6b, 0x71, 0x90, + 0x60, 0xde, 0x60, 0xec, 0x01, 0x26, 0x8c, 0x6c, 0xa1, 0xb7, 0xe1, 0x91, 0x89, 0x44, 0xc1, 0x55, + 0x9d, 0x9c, 0x37, 0x5f, 0xb8, 0x12, 0xcc, 0x17, 0x1c, 0xd5, 0xfe, 0x68, 0x9f, 0x0a, 0x46, 0xfb, + 0x97, 0x60, 0x2d, 0x3c, 0x45, 0x44, 0x8f, 0x01, 0xe0, 0x21, 0x09, 0x0b, 0x6d, 0xc5, 0xbd, 0x6c, + 0xc8, 0x71, 0x4a, 0x73, 0x2c, 0xbd, 0x0d, 0xe0, 0x21, 0x29, 0xc4, 0x35, 0x99, 0xfa, 0x68, 0xd8, + 0xa6, 0x7c, 0x29, 0x99, 0x75, 0xd0, 0x2d, 0x48, 0xf9, 0x2b, 0xfe, 0x69, 0x1f, 0x4e, 0x06, 0xf2, + 0x21, 0x31, 0x8c, 0x5b, 0xd2, 0x00, 0x4d, 0xa3, 0xd9, 0x11, 0x43, 0xbc, 0x16, 0x1c, 0xe2, 0xf1, + 0x48, 0x5c, 0x3c, 0x7c, 0xa8, 0x0f, 0x21, 0x45, 0xb7, 0x0c, 0x89, 0xd6, 0xf4, 0x0a, 0x85, 0xa7, + 0x99, 0xa4, 0x8d, 0x7e, 0x0e, 0xa0, 0xda, 0xb6, 0xa9, 0x9d, 0x8d, 0xbc, 0x01, 0x36, 0xc2, 0xb7, + 0x5c, 0xd5, 0xe1, 0xdb, 0xbd, 0xc6, 0xf7, 0xde, 0xaa, 0x27, 0xea, 0xdb, 0x7f, 0x3e, 0x85, 0xd2, + 0x21, 0x94, 0x82, 0xb2, 0x4e, 0x62, 0xc4, 0xfe, 0x21, 0x98, 0x18, 0xb1, 0x3c, 0x97, 0x27, 0x46, + 0x6e, 0x5a, 0x95, 0x60, 0xf7, 0x44, 0xb4, 0x23, 0x7d, 0x14, 0x87, 0x82, 0x7f, 0xc7, 0xfe, 0xf7, + 0xe5, 0x2e, 0xd2, 0xaf, 0x04, 0xc8, 0xba, 0xd3, 0x0f, 0x5e, 0x1a, 0x05, 0x6e, 0xd9, 0x98, 0xf5, + 0xe2, 0xfe, 0x9b, 0x1e, 0x76, 0xa7, 0x96, 0x70, 0xef, 0xd4, 0x6e, 0xbb, 0x71, 0x33, 0x0a, 0x9e, + 0xf1, 0xdb, 0x9a, 0xef, 0x2a, 0x27, 0x4d, 0xb8, 0x0d, 0x39, 0xf7, 0xd8, 0x93, 0x6a, 0x25, 0x08, + 0x90, 0x39, 0x5d, 0x7a, 0xdf, 0xa7, 0x7f, 0xc0, 0xaf, 0x91, 0x12, 0x32, 0xeb, 0x48, 0x6d, 0x58, + 0x9a, 0xf0, 0x19, 0xe8, 0x36, 0x64, 0x8c, 0xd1, 0x99, 0xe2, 0x6c, 0x8e, 0x09, 0x2c, 0xd2, 0xc9, + 0x83, 0x47, 0x67, 0x7d, 0xad, 0x75, 0x0f, 0x5f, 0x38, 0x3f, 0x63, 0x8c, 0xce, 0xee, 0xb1, 0x3d, + 0xc4, 0x46, 0x89, 0xfb, 0x47, 0xf9, 0x4c, 0x80, 0xac, 0x73, 0x26, 0xd0, 0x8f, 0x20, 0xe7, 0xfa, + 0x23, 0xf7, 0x1e, 0x38, 0xd2, 0x91, 0x71, 0xfd, 0x9e, 0x08, 0xaa, 0x3a, 0x17, 0xd8, 0x5a, 0x5b, + 0xe9, 0xf4, 0x55, 0xb6, 0x97, 0x4a, 0x41, 0x9b, 0x31, 0x8f, 0x45, 0x1d, 0xf9, 0xde, 0x9d, 0xbb, + 0x7d, 0xb5, 0x2b, 0xe7, 0xa9, 0xcc, 0x5e, 0x9b, 0x74, 0x78, 0x4a, 0xf8, 0x0f, 0x01, 0xc4, 0xc9, + 0x13, 0xfb, 0xbd, 0xff, 0x6e, 0x3a, 0x3e, 0x26, 0x42, 0xe2, 0x23, 0xda, 0x86, 0x15, 0x97, 0x43, + 0x21, 0xd5, 0xb1, 0x6a, 0x8f, 0x4c, 0xcc, 0xd1, 0x5b, 0xe4, 0x7e, 0x3a, 0x71, 0xbe, 0x4c, 0xcf, + 0x3a, 0xf5, 0x90, 0xb3, 0xfe, 0x38, 0x0e, 0x79, 0x1f, 0x96, 0x8c, 0xfe, 0xdf, 0xe7, 0x8c, 0x4a, + 0x21, 0x21, 0xc5, 0xc7, 0xeb, 0xdd, 0xe9, 0x06, 0xcd, 0x14, 0x5f, 0xdc, 0x4c, 0x51, 0x88, 0xbd, + 0x03, 0x4d, 0x27, 0x17, 0x86, 0xa6, 0x9f, 0x03, 0x64, 0xeb, 0xb6, 0xda, 0x57, 0xce, 0x75, 0x5b, + 0x1b, 0x76, 0x15, 0xb6, 0x0d, 0x99, 0xeb, 0x10, 0xe9, 0x97, 0xfb, 0xf4, 0xc3, 0x31, 0xdd, 0x91, + 0xbf, 0x10, 0x20, 0xeb, 0xe6, 0xeb, 0x8b, 0xde, 0xf8, 0xae, 0x41, 0x9a, 0xa7, 0xa4, 0xec, 0xca, + 0x97, 0xf7, 0x42, 0x31, 0xf8, 0x0a, 0x64, 0x07, 0xd8, 0x56, 0xa9, 0x1f, 0x64, 0xe1, 0xd0, 0xed, + 0xdf, 0x78, 0x05, 0xf2, 0xbe, 0xdb, 0x72, 0xe2, 0x1a, 0x0f, 0xeb, 0x6f, 0x89, 0xb1, 0x4a, 0xe6, + 0x93, 0x2f, 0x36, 0x13, 0x87, 0xf8, 0x03, 0x72, 0x9a, 0xe5, 0x7a, 0xad, 0x51, 0xaf, 0xdd, 0x13, + 0x85, 0x4a, 0xfe, 0x93, 0x2f, 0x36, 0x33, 0x32, 0xa6, 0xf8, 0xe6, 0x8d, 0x7b, 0xb0, 0x34, 0xb1, + 0x30, 0xc1, 0x7c, 0x07, 0x41, 0xe9, 0xce, 0xe9, 0xf1, 0xc1, 0x5e, 0xad, 0xda, 0xac, 0x2b, 0xf7, + 0x8f, 0x9a, 0x75, 0x51, 0x40, 0x8f, 0xc0, 0xca, 0xc1, 0xde, 0xeb, 0x8d, 0xa6, 0x52, 0x3b, 0xd8, + 0xab, 0x1f, 0x36, 0x95, 0x6a, 0xb3, 0x59, 0xad, 0xdd, 0x13, 0xe3, 0x3b, 0x1f, 0x15, 0x20, 0x59, + 0xdd, 0xad, 0xed, 0xa1, 0x1a, 0x24, 0x29, 0x86, 0x72, 0xe9, 0x13, 0xbc, 0xca, 0xe5, 0x48, 0x35, + 0xba, 0x0b, 0x29, 0x0a, 0xaf, 0xa0, 0xcb, 0xdf, 0xe4, 0x55, 0x66, 0x40, 0xd7, 0xe4, 0x67, 0xe8, + 0x89, 0xbc, 0xf4, 0x91, 0x5e, 0xe5, 0x72, 0x24, 0x1b, 0x1d, 0x40, 0xc6, 0xa9, 0xae, 0x67, 0xbd, + 0x9c, 0xab, 0xcc, 0x84, 0x97, 0xc9, 0xd4, 0x18, 0x4a, 0x71, 0xf9, 0xfb, 0xbd, 0xca, 0x0c, 0x8c, + 0x1b, 0xed, 0x41, 0x9a, 0xd7, 0xb1, 0x33, 0x9e, 0xe4, 0x55, 0x66, 0xa1, 0xd6, 0x48, 0x86, 0x9c, + 0x87, 0xff, 0xcc, 0x7e, 0x95, 0x58, 0x99, 0x03, 0xbe, 0x47, 0xef, 0x40, 0x31, 0x58, 0x23, 0xcf, + 0xf7, 0xec, 0xaf, 0x32, 0x27, 0x3e, 0x4e, 0xf4, 0x07, 0x0b, 0xe6, 0xf9, 0x9e, 0x01, 0x56, 0xe6, + 0x84, 0xcb, 0xd1, 0x7b, 0xb0, 0x3c, 0x5d, 0xd0, 0xce, 0xff, 0x2a, 0xb0, 0xb2, 0x00, 0x80, 0x8e, + 0x06, 0x80, 0x42, 0x0a, 0xe1, 0x05, 0x1e, 0x09, 0x56, 0x16, 0xc1, 0xd3, 0x51, 0x1b, 0x96, 0x26, + 0xab, 0xcb, 0x79, 0x1f, 0x0d, 0x56, 0xe6, 0xc6, 0xd6, 0xd9, 0x28, 0xc1, 0xaa, 0x74, 0xde, 0x47, + 0x84, 0x95, 0xb9, 0xa1, 0x76, 0x74, 0x0a, 0xe0, 0x2b, 0x2c, 0xe7, 0x78, 0x54, 0x58, 0x99, 0x07, + 0x74, 0x47, 0x06, 0xac, 0x84, 0x55, 0x9c, 0x8b, 0xbc, 0x31, 0xac, 0x2c, 0x84, 0xc5, 0x93, 0xfd, + 0x1c, 0xac, 0x1d, 0xe7, 0x7b, 0x73, 0x58, 0x99, 0x13, 0x94, 0x47, 0x2a, 0x94, 0x26, 0xea, 0xa5, + 0x39, 0x9f, 0x20, 0x56, 0xe6, 0xc5, 0xe8, 0x77, 0xab, 0x5f, 0x7e, 0xb3, 0x2e, 0x7c, 0xf5, 0xcd, + 0xba, 0xf0, 0xb7, 0x6f, 0xd6, 0x85, 0x4f, 0xbf, 0x5d, 0x8f, 0x7d, 0xf5, 0xed, 0x7a, 0xec, 0x2f, + 0xdf, 0xae, 0xc7, 0x7e, 0xf2, 0x74, 0x57, 0xb3, 0x7b, 0xa3, 0xb3, 0xad, 0x96, 0x3e, 0xd8, 0x6e, + 0xe9, 0x03, 0x6c, 0x9f, 0x75, 0x6c, 0xaf, 0xe1, 0x3d, 0x5e, 0x3f, 0x4b, 0xd3, 0x20, 0x7d, 0xf3, + 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x13, 0x56, 0x3f, 0x46, 0xdc, 0x2e, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -5932,26 +5920,10 @@ func (m *RequestSignGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.Password) > 0 { - i -= len(m.Password) - copy(dAtA[i:], m.Password) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Password))) - i-- - dAtA[i] = 0x22 - } - if len(m.SubaccountLabel) > 0 { - i -= len(m.SubaccountLabel) - copy(dAtA[i:], m.SubaccountLabel) - i = encodeVarintTypes(dAtA, i, uint64(len(m.SubaccountLabel))) - i-- - dAtA[i] = 0x1a - } - if len(m.GrpcAddress) > 0 { - i -= len(m.GrpcAddress) - copy(dAtA[i:], m.GrpcAddress) - i = encodeVarintTypes(dAtA, i, uint64(len(m.GrpcAddress))) + if m.Height != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Height)) i-- - dAtA[i] = 0x12 + dAtA[i] = 0x18 } if len(m.GossipVotes) > 0 { for iNdEx := len(m.GossipVotes) - 1; iNdEx >= 0; iNdEx-- { @@ -5964,9 +5936,16 @@ func (m *RequestSignGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 } } + if len(m.ProposerAddress) > 0 { + i -= len(m.ProposerAddress) + copy(dAtA[i:], m.ProposerAddress) + i = encodeVarintTypes(dAtA, i, uint64(len(m.ProposerAddress))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } @@ -8343,23 +8322,18 @@ func (m *RequestSignGossipVote) Size() (n int) { } var l int _ = l + l = len(m.ProposerAddress) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } if len(m.GossipVotes) > 0 { for _, e := range m.GossipVotes { l = e.Size() n += 1 + l + sovTypes(uint64(l)) } } - l = len(m.GrpcAddress) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.SubaccountLabel) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.Password) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + if m.Height != 0 { + n += 1 + sovTypes(uint64(m.Height)) } return n } @@ -12478,9 +12452,9 @@ func (m *RequestSignGossipVote) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GossipVotes", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ProposerAddress", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -12490,31 +12464,31 @@ func (m *RequestSignGossipVote) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.GossipVotes = append(m.GossipVotes, &oracle.GossipVote{}) - if err := m.GossipVotes[len(m.GossipVotes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.ProposerAddress = append(m.ProposerAddress[:0], dAtA[iNdEx:postIndex]...) + if m.ProposerAddress == nil { + m.ProposerAddress = []byte{} } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GrpcAddress", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field GossipVotes", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -12524,61 +12498,31 @@ func (m *RequestSignGossipVote) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.GrpcAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SubaccountLabel", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF + m.GossipVotes = append(m.GossipVotes, &oracle.GossipVote{}) + if err := m.GossipVotes[len(m.GossipVotes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - m.SubaccountLabel = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Password", wireType) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Height", wireType) } - var stringLen uint64 + m.Height = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -12588,24 +12532,11 @@ func (m *RequestSignGossipVote) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + m.Height |= int64(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Password = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/oracle/reactor.go b/oracle/reactor.go index 8629ebd2c97..a432f62e224 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -8,6 +8,7 @@ import ( "os" "time" + "github.com/cometbft/cometbft/crypto/ed25519" "github.com/sirupsen/logrus" // cfg "github.com/cometbft/cometbft/config" @@ -162,8 +163,8 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { // verify sig of incoming gossip vote, throw if verification fails _, val := oracleR.OracleInfo.ValidatorSet.GetByAddress(msg.Validator) if val == nil { - oracleR.Logger.Info("failed signature verification", msg) - logrus.Info("NOT A VALIDATOR!!!!!!!!!!!!!!") + pubkey := ed25519.PubKey(msg.PublicKey) + logrus.Infof("NOT A VALIDATOR: %s", pubkey.String()) return } pubKey := val.PubKey diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 6d6921b11cd..14e752e4b5b 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -222,7 +222,8 @@ func RunOracle(oracleInfo *types.OracleInfo, oracle types.Oracle, currentTime ui for _, job := range jobs { adapter, ok := oracleInfo.AdapterMap[job.Adapter] if !ok { - panic("adapter should exist: " + job.Adapter) + // panic("adapter should exist: " + job.Adapter) + return fmt.Errorf("invalid adapter: %s, skipping oracle :%s", job.Adapter, oracle.Id) } input.LastStoreData, input.LastStoreDataExists, err = GetLastStoreData(red, adapter, job) if err != nil { diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto index 65d2dc54ddb..ff394363f76 100644 --- a/proto/tendermint/abci/types.proto +++ b/proto/tendermint/abci/types.proto @@ -197,13 +197,11 @@ message RequestFinalizeBlock { } message RequestSignGossipVote { - repeated tendermint.oracle.GossipVote gossip_votes = 1; - string grpc_address = 2; - string subaccount_label = 3; - string password = 4; + bytes proposer_address = 1; + repeated tendermint.oracle.GossipVote gossip_votes = 2; + int64 height = 3; } - //---------------------------------------- // Response types diff --git a/state/execution.go b/state/execution.go index 5c9d184df70..538d96518d6 100644 --- a/state/execution.go +++ b/state/execution.go @@ -141,7 +141,9 @@ func (blockExec *BlockExecutor) CreateProposalBlock( votes = append(votes, vote) } resp, err := blockExec.proxyApp.SignGossipVote(ctx, &abci.RequestSignGossipVote{ - GossipVotes: votes, + ProposerAddress: proposerAddr, + GossipVotes: votes, + Height: height, }) if err != nil { blockExec.logger.Error("error in proxyAppConn.SignGossipVote", "err", err) From 0262f41dd08c4830d26004c5621b914454d35f71 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Thu, 7 Mar 2024 18:00:24 +0800 Subject: [PATCH 019/150] add logs for validator set --- oracle/reactor.go | 1 + 1 file changed, 1 insertion(+) diff --git a/oracle/reactor.go b/oracle/reactor.go index a432f62e224..f015c67aad3 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -162,6 +162,7 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { case *oracleproto.GossipVote: // verify sig of incoming gossip vote, throw if verification fails _, val := oracleR.OracleInfo.ValidatorSet.GetByAddress(msg.Validator) + logrus.Infof("THIS IS MY VALIDATOR SET: %v", oracleR.OracleInfo.ValidatorSet.Validators) if val == nil { pubkey := ed25519.PubKey(msg.PublicKey) logrus.Infof("NOT A VALIDATOR: %s", pubkey.String()) From c14385f90f14583ee90904d15fbfe939f2c8765c Mon Sep 17 00:00:00 2001 From: yan-soon Date: Thu, 7 Mar 2024 18:42:01 +0800 Subject: [PATCH 020/150] remove val set logs --- oracle/reactor.go | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index f015c67aad3..33e4a1f2e3b 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -9,6 +9,7 @@ import ( "time" "github.com/cometbft/cometbft/crypto/ed25519" + "github.com/cometbft/cometbft/crypto/sr25519" "github.com/sirupsen/logrus" // cfg "github.com/cometbft/cometbft/config" @@ -161,18 +162,32 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { switch msg := e.Message.(type) { case *oracleproto.GossipVote: // verify sig of incoming gossip vote, throw if verification fails - _, val := oracleR.OracleInfo.ValidatorSet.GetByAddress(msg.Validator) - logrus.Infof("THIS IS MY VALIDATOR SET: %v", oracleR.OracleInfo.ValidatorSet.Validators) - if val == nil { - pubkey := ed25519.PubKey(msg.PublicKey) - logrus.Infof("NOT A VALIDATOR: %s", pubkey.String()) - return - } - pubKey := val.PubKey - // need to use pubkey of signer - if !pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature) { - oracleR.Logger.Info("failed signature verification", msg) - logrus.Info("FAILED SIGNATURE VERIFICATION!!!!!!!!!!!!!!") + // _, val := oracleR.OracleInfo.ValidatorSet.GetByAddress(msg.Validator) + // if val == nil { + // pubkey := ed25519.PubKey(msg.PublicKey) + // logrus.Infof("NOT A VALIDATOR: %s", pubkey.String()) + // return + // } + signType := msg.SignType + var pubKey crypto.PubKey + + switch signType { + case "ed25519": + pubKey = ed25519.PubKey(msg.PublicKey) + if success := pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature); !success { + oracleR.Logger.Info("failed signature verification", msg) + logrus.Info("FAILED SIGNATURE VERIFICATION!!!!!!!!!!!!!!") + return + } + case "sr25519": + pubKey = sr25519.PubKey(msg.PublicKey) + if success := pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature); !success { + oracleR.Logger.Info("failed signature verification", msg) + logrus.Info("FAILED SIGNATURE VERIFICATION!!!!!!!!!!!!!!") + return + } + default: + logrus.Error("SIGNATURE NOT SUPPORTED NOOOOOOOOO") return } From d4f658a6588b09bea7399a177faf413f5b564865 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Thu, 7 Mar 2024 19:02:30 +0800 Subject: [PATCH 021/150] fix bug where tx wasnt included in block --- state/execution.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/state/execution.go b/state/execution.go index 538d96518d6..f56e4aede71 100644 --- a/state/execution.go +++ b/state/execution.go @@ -153,13 +153,14 @@ func (blockExec *BlockExecutor) CreateProposalBlock( txs := blockExec.mempool.ReapMaxBytesMaxGas(maxReapBytes, maxGas) commit := lastExtCommit.ToCommit() - block := state.MakeBlock(height, txs, commit, evidence, proposerAddr) - txSlice := block.Txs.ToSliceOfBytes() if len(signGossipVoteTxBz) > 0 { - txSlice = append([][]byte{signGossipVoteTxBz}, txSlice...) + signGossipVoteTx := types.Tx(signGossipVoteTxBz) + txs = append([]types.Tx{signGossipVoteTx}, txs...) } + block := state.MakeBlock(height, txs, commit, evidence, proposerAddr) + txSlice := block.Txs.ToSliceOfBytes() rpp, err := blockExec.proxyApp.PrepareProposal( ctx, &abci.RequestPrepareProposal{ From ab6d5755df14528c962c72c2bddf5d324263a359 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Thu, 7 Mar 2024 19:30:55 +0800 Subject: [PATCH 022/150] account size of injected MsgCreateResult tx in block prop --- state/execution.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/state/execution.go b/state/execution.go index f56e4aede71..d78dcb73ab3 100644 --- a/state/execution.go +++ b/state/execution.go @@ -151,10 +151,12 @@ func (blockExec *BlockExecutor) CreateProposalBlock( signGossipVoteTxBz = resp.EncodedTx } - txs := blockExec.mempool.ReapMaxBytesMaxGas(maxReapBytes, maxGas) + var txs types.Txs commit := lastExtCommit.ToCommit() if len(signGossipVoteTxBz) > 0 { + maxReapBytes -= int64(len(signGossipVoteTxBz)) + txs = blockExec.mempool.ReapMaxBytesMaxGas(maxReapBytes, maxGas) signGossipVoteTx := types.Tx(signGossipVoteTxBz) txs = append([]types.Tx{signGossipVoteTx}, txs...) } From c96342cbbd8047fbffe7ef04f7b6ff58073ec1c9 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 8 Mar 2024 13:14:06 +0800 Subject: [PATCH 023/150] account for maxTxDataBytes when inserting oracle tx in to block prop --- state/execution.go | 1 + 1 file changed, 1 insertion(+) diff --git a/state/execution.go b/state/execution.go index d78dcb73ab3..d9302d72fd0 100644 --- a/state/execution.go +++ b/state/execution.go @@ -156,6 +156,7 @@ func (blockExec *BlockExecutor) CreateProposalBlock( if len(signGossipVoteTxBz) > 0 { maxReapBytes -= int64(len(signGossipVoteTxBz)) + maxDataBytes -= int64(len(signGossipVoteTxBz)) txs = blockExec.mempool.ReapMaxBytesMaxGas(maxReapBytes, maxGas) signGossipVoteTx := types.Tx(signGossipVoteTxBz) txs = append([]types.Tx{signGossipVoteTx}, txs...) From c7e19e4ce063843c207a765dda1714a8275072da Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 8 Mar 2024 16:10:16 +0800 Subject: [PATCH 024/150] inject oracle results tx into response of prepare proposal instead --- state/execution.go | 59 +++++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 32 deletions(-) diff --git a/state/execution.go b/state/execution.go index d9302d72fd0..7993ccf7d95 100644 --- a/state/execution.go +++ b/state/execution.go @@ -129,39 +129,8 @@ func (blockExec *BlockExecutor) CreateProposalBlock( maxReapBytes = -1 } - // check if oracle's gossipVoteMap has any results - blockExec.oracleInfo.GossipVoteBuffer.UpdateMtx.RLock() - oracleVotesBuffer := blockExec.oracleInfo.GossipVoteBuffer.Buffer - blockExec.oracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() - - var signGossipVoteTxBz []byte - if len(oracleVotesBuffer) > 0 { - votes := []*oracleproto.GossipVote{} - for _, vote := range oracleVotesBuffer { - votes = append(votes, vote) - } - resp, err := blockExec.proxyApp.SignGossipVote(ctx, &abci.RequestSignGossipVote{ - ProposerAddress: proposerAddr, - GossipVotes: votes, - Height: height, - }) - if err != nil { - blockExec.logger.Error("error in proxyAppConn.SignGossipVote", "err", err) - } - signGossipVoteTxBz = resp.EncodedTx - } - - var txs types.Txs + txs := blockExec.mempool.ReapMaxBytesMaxGas(maxReapBytes, maxGas) commit := lastExtCommit.ToCommit() - - if len(signGossipVoteTxBz) > 0 { - maxReapBytes -= int64(len(signGossipVoteTxBz)) - maxDataBytes -= int64(len(signGossipVoteTxBz)) - txs = blockExec.mempool.ReapMaxBytesMaxGas(maxReapBytes, maxGas) - signGossipVoteTx := types.Tx(signGossipVoteTxBz) - txs = append([]types.Tx{signGossipVoteTx}, txs...) - } - block := state.MakeBlock(height, txs, commit, evidence, proposerAddr) txSlice := block.Txs.ToSliceOfBytes() rpp, err := blockExec.proxyApp.PrepareProposal( @@ -189,6 +158,32 @@ func (blockExec *BlockExecutor) CreateProposalBlock( return nil, err } + // check if oracle's gossipVoteMap has any results + blockExec.oracleInfo.GossipVoteBuffer.UpdateMtx.RLock() + oracleVotesBuffer := blockExec.oracleInfo.GossipVoteBuffer.Buffer + blockExec.oracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() + + var signGossipVoteTxBz []byte + if len(oracleVotesBuffer) > 0 { + votes := []*oracleproto.GossipVote{} + for _, vote := range oracleVotesBuffer { + votes = append(votes, vote) + } + resp, err := blockExec.proxyApp.SignGossipVote(ctx, &abci.RequestSignGossipVote{ + ProposerAddress: proposerAddr, + GossipVotes: votes, + Height: height, + }) + if err != nil { + blockExec.logger.Error("error in proxyAppConn.SignGossipVote", "err", err) + } + signGossipVoteTxBz = resp.EncodedTx + } + + if len(signGossipVoteTxBz) > 0 { + rpp.Txs = append([][]byte{signGossipVoteTxBz}, rpp.Txs...) + } + txl := types.ToTxs(rpp.Txs) if err := txl.Validate(maxDataBytes); err != nil { return nil, err From e6f036dee8fc79ab1789a10d59f372fcd2ed49a7 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 8 Mar 2024 17:23:37 +0800 Subject: [PATCH 025/150] Revert "inject oracle results tx into response of prepare proposal instead" This reverts commit c7e19e4ce063843c207a765dda1714a8275072da. --- state/execution.go | 59 +++++++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/state/execution.go b/state/execution.go index 7993ccf7d95..d9302d72fd0 100644 --- a/state/execution.go +++ b/state/execution.go @@ -129,8 +129,39 @@ func (blockExec *BlockExecutor) CreateProposalBlock( maxReapBytes = -1 } - txs := blockExec.mempool.ReapMaxBytesMaxGas(maxReapBytes, maxGas) + // check if oracle's gossipVoteMap has any results + blockExec.oracleInfo.GossipVoteBuffer.UpdateMtx.RLock() + oracleVotesBuffer := blockExec.oracleInfo.GossipVoteBuffer.Buffer + blockExec.oracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() + + var signGossipVoteTxBz []byte + if len(oracleVotesBuffer) > 0 { + votes := []*oracleproto.GossipVote{} + for _, vote := range oracleVotesBuffer { + votes = append(votes, vote) + } + resp, err := blockExec.proxyApp.SignGossipVote(ctx, &abci.RequestSignGossipVote{ + ProposerAddress: proposerAddr, + GossipVotes: votes, + Height: height, + }) + if err != nil { + blockExec.logger.Error("error in proxyAppConn.SignGossipVote", "err", err) + } + signGossipVoteTxBz = resp.EncodedTx + } + + var txs types.Txs commit := lastExtCommit.ToCommit() + + if len(signGossipVoteTxBz) > 0 { + maxReapBytes -= int64(len(signGossipVoteTxBz)) + maxDataBytes -= int64(len(signGossipVoteTxBz)) + txs = blockExec.mempool.ReapMaxBytesMaxGas(maxReapBytes, maxGas) + signGossipVoteTx := types.Tx(signGossipVoteTxBz) + txs = append([]types.Tx{signGossipVoteTx}, txs...) + } + block := state.MakeBlock(height, txs, commit, evidence, proposerAddr) txSlice := block.Txs.ToSliceOfBytes() rpp, err := blockExec.proxyApp.PrepareProposal( @@ -158,32 +189,6 @@ func (blockExec *BlockExecutor) CreateProposalBlock( return nil, err } - // check if oracle's gossipVoteMap has any results - blockExec.oracleInfo.GossipVoteBuffer.UpdateMtx.RLock() - oracleVotesBuffer := blockExec.oracleInfo.GossipVoteBuffer.Buffer - blockExec.oracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() - - var signGossipVoteTxBz []byte - if len(oracleVotesBuffer) > 0 { - votes := []*oracleproto.GossipVote{} - for _, vote := range oracleVotesBuffer { - votes = append(votes, vote) - } - resp, err := blockExec.proxyApp.SignGossipVote(ctx, &abci.RequestSignGossipVote{ - ProposerAddress: proposerAddr, - GossipVotes: votes, - Height: height, - }) - if err != nil { - blockExec.logger.Error("error in proxyAppConn.SignGossipVote", "err", err) - } - signGossipVoteTxBz = resp.EncodedTx - } - - if len(signGossipVoteTxBz) > 0 { - rpp.Txs = append([][]byte{signGossipVoteTxBz}, rpp.Txs...) - } - txl := types.ToTxs(rpp.Txs) if err := txl.Validate(maxDataBytes); err != nil { return nil, err From 6a76447353a7068efbe6ff2aa0a2cf85066d450d Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 11 Mar 2024 12:56:34 +0800 Subject: [PATCH 026/150] adding logs for debugging --- consensus/state.go | 23 +++++++++++++++++++++++ state/execution.go | 8 +++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/consensus/state.go b/consensus/state.go index a7b953acb00..af0996965b9 100644 --- a/consensus/state.go +++ b/consensus/state.go @@ -3,6 +3,7 @@ package consensus import ( "bytes" "context" + "encoding/hex" "errors" "fmt" "io" @@ -12,6 +13,7 @@ import ( "time" "github.com/cosmos/gogoproto/proto" + "github.com/sirupsen/logrus" cfg "github.com/cometbft/cometbft/config" cstypes "github.com/cometbft/cometbft/consensus/types" @@ -982,6 +984,9 @@ func (cs *State) handleTimeout(ti timeoutInfo, rs cstypes.RoundState) { cs.enterNewRound(ti.Height, 0) case cstypes.RoundStepNewRound: + logrus.Info("CREATE PROPOSAL BLOCK: ENTERING PROPOSE from handleTimeout:") + logrus.Infof("STATE APP HASH: %s", hex.EncodeToString(cs.state.AppHash)) + logrus.Infof("BLOCK APP HASH: %s", cs.ProposalBlock.AppHash.String()) cs.enterPropose(ti.Height, ti.Round) case cstypes.RoundStepPropose: @@ -989,6 +994,9 @@ func (cs *State) handleTimeout(ti timeoutInfo, rs cstypes.RoundState) { cs.Logger.Error("failed publishing timeout propose", "err", err) } + logrus.Info("PROPOSAL COMPLETE: ENTERING PREVOTE from handleTimeout:") + logrus.Infof("STATE APP HASH: %s", hex.EncodeToString(cs.state.AppHash)) + logrus.Infof("BLOCK APP HASH: %s", cs.ProposalBlock.AppHash.String()) cs.enterPrevote(ti.Height, ti.Round) case cstypes.RoundStepPrevoteWait: @@ -1032,6 +1040,9 @@ func (cs *State) handleTxsAvailable() { cs.scheduleTimeout(timeoutCommit, cs.Height, 0, cstypes.RoundStepNewRound) case cstypes.RoundStepNewRound: // after timeoutCommit + logrus.Info("CREATE PROPOSAL BLOCK: ENTERING PROPOSE from handleTimeout:") + logrus.Infof("STATE APP HASH: %s", hex.EncodeToString(cs.state.AppHash)) + logrus.Infof("BLOCK APP HASH: %s", cs.ProposalBlock.AppHash.String()) cs.enterPropose(cs.Height, 0) } } @@ -1108,6 +1119,9 @@ func (cs *State) enterNewRound(height int64, round int32) { cstypes.RoundStepNewRound) } } else { + logrus.Info("CREATE PROPOSAL BLOCK: ENTERING PROPOSE from handleTimeout:") + logrus.Infof("STATE APP HASH: %s", hex.EncodeToString(cs.state.AppHash)) + logrus.Infof("BLOCK APP HASH: %s", cs.ProposalBlock.AppHash.String()) cs.enterPropose(height, round) } } @@ -1157,6 +1171,9 @@ func (cs *State) enterPropose(height int64, round int32) { // else, we'll enterPrevote when the rest of the proposal is received (in AddProposalBlockPart), // or else after timeoutPropose if cs.isProposalComplete() { + logrus.Info("PROPOSAL COMPLETE: ENTERING PREVOTE from enterPropose:") + logrus.Infof("STATE APP HASH: %s", hex.EncodeToString(cs.state.AppHash)) + logrus.Infof("BLOCK APP HASH: %s", cs.ProposalBlock.AppHash.String()) cs.enterPrevote(height, cs.Round) } }() @@ -2040,6 +2057,9 @@ func (cs *State) handleCompleteProposal(blockHeight int64) { if cs.Step <= cstypes.RoundStepPropose && cs.isProposalComplete() { // Move onto the next step + logrus.Info("PROPOSAL COMPLETE: ENTERING PREVOTE from handleCompleteProposal:") + logrus.Infof("STATE APP HASH: %s", hex.EncodeToString(cs.state.AppHash)) + logrus.Infof("BLOCK APP HASH: %s", cs.ProposalBlock.AppHash.String()) cs.enterPrevote(blockHeight, cs.Round) if hasTwoThirds { // this is optimisation as this will be triggered when prevote is added cs.enterPrecommit(blockHeight, cs.Round) @@ -2300,6 +2320,9 @@ func (cs *State) addVote(vote *types.Vote, peerID p2p.ID) (added bool, err error case cs.Proposal != nil && 0 <= cs.Proposal.POLRound && cs.Proposal.POLRound == vote.Round: // If the proposal is now complete, enter prevote of cs.Round. if cs.isProposalComplete() { + logrus.Info("PROPOSAL COMPLETE: ENTERING PREVOTE from addVote:") + logrus.Infof("STATE APP HASH: %s", hex.EncodeToString(cs.state.AppHash)) + logrus.Infof("BLOCK APP HASH: %s", cs.ProposalBlock.AppHash.String()) cs.enterPrevote(height, cs.Round) } } diff --git a/state/execution.go b/state/execution.go index d9302d72fd0..b10d81d0e44 100644 --- a/state/execution.go +++ b/state/execution.go @@ -3,6 +3,7 @@ package state import ( "bytes" "context" + "encoding/hex" "fmt" "time" @@ -14,6 +15,7 @@ import ( cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/cometbft/cometbft/proxy" "github.com/cometbft/cometbft/types" + "github.com/sirupsen/logrus" oracletypes "github.com/cometbft/cometbft/oracle/service/types" oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" @@ -156,7 +158,6 @@ func (blockExec *BlockExecutor) CreateProposalBlock( if len(signGossipVoteTxBz) > 0 { maxReapBytes -= int64(len(signGossipVoteTxBz)) - maxDataBytes -= int64(len(signGossipVoteTxBz)) txs = blockExec.mempool.ReapMaxBytesMaxGas(maxReapBytes, maxGas) signGossipVoteTx := types.Tx(signGossipVoteTxBz) txs = append([]types.Tx{signGossipVoteTx}, txs...) @@ -164,6 +165,11 @@ func (blockExec *BlockExecutor) CreateProposalBlock( block := state.MakeBlock(height, txs, commit, evidence, proposerAddr) txSlice := block.Txs.ToSliceOfBytes() + + logrus.Info("BEFORE REQUEST PROPOSAL:") + logrus.Infof("STATE APP HASH: %s", hex.EncodeToString(state.AppHash)) + logrus.Infof("BLOCK APP HASH: %s", block.AppHash.String()) + rpp, err := blockExec.proxyApp.PrepareProposal( ctx, &abci.RequestPrepareProposal{ From 25375f675f2ac8c38708495dec56419fdfa3e86f Mon Sep 17 00:00:00 2001 From: Yan Date: Tue, 12 Mar 2024 11:21:19 +0800 Subject: [PATCH 027/150] add string compression --- Makefile | 8 - consensus/state.go | 23 -- docker-compose.yml | 2 +- oracle/reactor.go | 2 +- oracle/service/runner/runner.go | 23 +- oracle/service/types/info.go | 4 +- oracle/service/utils/compress.go | 36 +++ proto/tendermint/oracle/types.pb.go | 423 ++++++++++++++++++++++++---- proto/tendermint/oracle/types.proto | 11 +- state/execution.go | 7 +- 10 files changed, 436 insertions(+), 103 deletions(-) create mode 100644 oracle/service/utils/compress.go diff --git a/Makefile b/Makefile index 3205bbaaf70..8730d3ed0f8 100644 --- a/Makefile +++ b/Makefile @@ -126,14 +126,6 @@ ifeq (,$(shell which clang-format)) endif .PHONY: check-proto-format-deps -protoVer=0.14.0 -protoImageName=ghcr.io/cosmos/proto-builder:$(protoVer) -protoImage=$(DOCKER) run --rm -v $(CURDIR):/workspace --workdir /workspace $(protoImageName) - -proto-gen-carbon: - @echo "Generating Protobuf files" - @$(protoImage) sh ./scripts/protocgen.sh - proto-gen: check-proto-deps @echo "Generating Protobuf files" @go run github.com/bufbuild/buf/cmd/buf generate diff --git a/consensus/state.go b/consensus/state.go index af0996965b9..a7b953acb00 100644 --- a/consensus/state.go +++ b/consensus/state.go @@ -3,7 +3,6 @@ package consensus import ( "bytes" "context" - "encoding/hex" "errors" "fmt" "io" @@ -13,7 +12,6 @@ import ( "time" "github.com/cosmos/gogoproto/proto" - "github.com/sirupsen/logrus" cfg "github.com/cometbft/cometbft/config" cstypes "github.com/cometbft/cometbft/consensus/types" @@ -984,9 +982,6 @@ func (cs *State) handleTimeout(ti timeoutInfo, rs cstypes.RoundState) { cs.enterNewRound(ti.Height, 0) case cstypes.RoundStepNewRound: - logrus.Info("CREATE PROPOSAL BLOCK: ENTERING PROPOSE from handleTimeout:") - logrus.Infof("STATE APP HASH: %s", hex.EncodeToString(cs.state.AppHash)) - logrus.Infof("BLOCK APP HASH: %s", cs.ProposalBlock.AppHash.String()) cs.enterPropose(ti.Height, ti.Round) case cstypes.RoundStepPropose: @@ -994,9 +989,6 @@ func (cs *State) handleTimeout(ti timeoutInfo, rs cstypes.RoundState) { cs.Logger.Error("failed publishing timeout propose", "err", err) } - logrus.Info("PROPOSAL COMPLETE: ENTERING PREVOTE from handleTimeout:") - logrus.Infof("STATE APP HASH: %s", hex.EncodeToString(cs.state.AppHash)) - logrus.Infof("BLOCK APP HASH: %s", cs.ProposalBlock.AppHash.String()) cs.enterPrevote(ti.Height, ti.Round) case cstypes.RoundStepPrevoteWait: @@ -1040,9 +1032,6 @@ func (cs *State) handleTxsAvailable() { cs.scheduleTimeout(timeoutCommit, cs.Height, 0, cstypes.RoundStepNewRound) case cstypes.RoundStepNewRound: // after timeoutCommit - logrus.Info("CREATE PROPOSAL BLOCK: ENTERING PROPOSE from handleTimeout:") - logrus.Infof("STATE APP HASH: %s", hex.EncodeToString(cs.state.AppHash)) - logrus.Infof("BLOCK APP HASH: %s", cs.ProposalBlock.AppHash.String()) cs.enterPropose(cs.Height, 0) } } @@ -1119,9 +1108,6 @@ func (cs *State) enterNewRound(height int64, round int32) { cstypes.RoundStepNewRound) } } else { - logrus.Info("CREATE PROPOSAL BLOCK: ENTERING PROPOSE from handleTimeout:") - logrus.Infof("STATE APP HASH: %s", hex.EncodeToString(cs.state.AppHash)) - logrus.Infof("BLOCK APP HASH: %s", cs.ProposalBlock.AppHash.String()) cs.enterPropose(height, round) } } @@ -1171,9 +1157,6 @@ func (cs *State) enterPropose(height int64, round int32) { // else, we'll enterPrevote when the rest of the proposal is received (in AddProposalBlockPart), // or else after timeoutPropose if cs.isProposalComplete() { - logrus.Info("PROPOSAL COMPLETE: ENTERING PREVOTE from enterPropose:") - logrus.Infof("STATE APP HASH: %s", hex.EncodeToString(cs.state.AppHash)) - logrus.Infof("BLOCK APP HASH: %s", cs.ProposalBlock.AppHash.String()) cs.enterPrevote(height, cs.Round) } }() @@ -2057,9 +2040,6 @@ func (cs *State) handleCompleteProposal(blockHeight int64) { if cs.Step <= cstypes.RoundStepPropose && cs.isProposalComplete() { // Move onto the next step - logrus.Info("PROPOSAL COMPLETE: ENTERING PREVOTE from handleCompleteProposal:") - logrus.Infof("STATE APP HASH: %s", hex.EncodeToString(cs.state.AppHash)) - logrus.Infof("BLOCK APP HASH: %s", cs.ProposalBlock.AppHash.String()) cs.enterPrevote(blockHeight, cs.Round) if hasTwoThirds { // this is optimisation as this will be triggered when prevote is added cs.enterPrecommit(blockHeight, cs.Round) @@ -2320,9 +2300,6 @@ func (cs *State) addVote(vote *types.Vote, peerID p2p.ID) (added bool, err error case cs.Proposal != nil && 0 <= cs.Proposal.POLRound && cs.Proposal.POLRound == vote.Round: // If the proposal is now complete, enter prevote of cs.Round. if cs.isProposalComplete() { - logrus.Info("PROPOSAL COMPLETE: ENTERING PREVOTE from addVote:") - logrus.Infof("STATE APP HASH: %s", hex.EncodeToString(cs.state.AppHash)) - logrus.Infof("BLOCK APP HASH: %s", cs.ProposalBlock.AppHash.String()) cs.enterPrevote(height, cs.Round) } } diff --git a/docker-compose.yml b/docker-compose.yml index 47340202515..20837a8f8a3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -89,7 +89,7 @@ networks: ipam: driver: default config: - - subnet: 192.167.10.0/16 + - subnet: 192.167.0.0/16 # Define volumes volumes: diff --git a/oracle/reactor.go b/oracle/reactor.go index 33e4a1f2e3b..d65a99fa9d6 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -81,7 +81,7 @@ func NewReactor(configPath string, pubKey crypto.PubKey, privValidator types.Pri Config: config, GossipVoteBuffer: gossipVoteBuffer, UnsignedVoteBuffer: unsignedVoteBuffer, - SignVotesChan: make(chan *oracleproto.Vote), + SignVotesChan: make(chan *oracleproto.CompressedVote), PubKey: pubKey, PrivValidator: privValidator, ValidatorSet: validatorSet, diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 14e752e4b5b..bc1da91f4b9 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -9,10 +9,11 @@ import ( log "github.com/sirupsen/logrus" - // "github.com/Switcheo/carbon/constants" "github.com/cometbft/cometbft/oracle/service/adapters" "github.com/cometbft/cometbft/oracle/service/parser" "github.com/cometbft/cometbft/oracle/service/types" + + "github.com/cometbft/cometbft/oracle/service/utils" "github.com/cometbft/cometbft/proto/tendermint/oracle" oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" "github.com/cometbft/cometbft/redis" @@ -261,11 +262,21 @@ func RunOracle(oracleInfo *types.OracleInfo, oracle types.Oracle, currentTime ui return errors.New("skipping submission for " + oracle.Id + " as result is empty") } - vote := oracleproto.Vote{ + compressedId, err := utils.CompressString(oracle.Id) + if err != nil { + return errors.New("error compressing oracleId, skipping submission for " + oracle.Id) + } + + compressedData, err := utils.CompressString(resultData) + if err != nil { + return errors.New("error compressing resultData, skipping submission for " + oracle.Id) + } + + vote := oracleproto.CompressedVote{ Validator: oracleInfo.PubKey.Address(), - OracleId: oracle.Id, + OracleId: compressedId, Timestamp: normalizedTime, - Data: resultData, + Data: compressedData, } oracleInfo.SignVotesChan <- &vote @@ -291,7 +302,7 @@ func RunProcessSignVoteQueue(oracleInfo *types.OracleInfo) { } func ProcessSignVoteQueue(oracleInfo *types.OracleInfo) { - votes := []*oracleproto.Vote{} + votes := []*oracleproto.CompressedVote{} for { select { case vote := <-oracleInfo.SignVotesChan: @@ -318,7 +329,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo) { oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() // loop through unsignedVoteBuffer and combine all votes - var batchVotes = []*oracleproto.Vote{} + var batchVotes = []*oracleproto.CompressedVote{} oracleInfo.UnsignedVoteBuffer.UpdateMtx.RLock() for _, unsignedVotes := range oracleInfo.UnsignedVoteBuffer.Buffer { batchVotes = append(batchVotes, unsignedVotes.Votes...) diff --git a/oracle/service/types/info.go b/oracle/service/types/info.go index 5d9de752a46..89cdb57cb4c 100644 --- a/oracle/service/types/info.go +++ b/oracle/service/types/info.go @@ -20,7 +20,7 @@ type OracleInfo struct { GrpcClient *grpc.ClientConn UnsignedVoteBuffer *UnsignedVoteBuffer GossipVoteBuffer *GossipVoteBuffer - SignVotesChan chan *oracleproto.Vote + SignVotesChan chan *oracleproto.CompressedVote PubKey crypto.PubKey PrivValidator types.PrivValidator MsgFlushInterval time.Duration @@ -30,7 +30,7 @@ type OracleInfo struct { type UnsignedVotes struct { Timestamp uint64 - Votes []*oracleproto.Vote + Votes []*oracleproto.CompressedVote } type GossipVoteBuffer struct { diff --git a/oracle/service/utils/compress.go b/oracle/service/utils/compress.go new file mode 100644 index 00000000000..82891d7f384 --- /dev/null +++ b/oracle/service/utils/compress.go @@ -0,0 +1,36 @@ +package utils + +import ( + "bytes" + "compress/gzip" + "io" +) + +func CompressString(input string) ([]byte, error) { + var buf bytes.Buffer + gz := gzip.NewWriter(&buf) + _, err := gz.Write([]byte(input)) + if err != nil { + return nil, err + } + if err := gz.Close(); err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +func DecompressString(compressed []byte) (string, error) { + buf := bytes.NewReader(compressed) + gz, err := gzip.NewReader(buf) + if err != nil { + return "", err + } + decompressed, err := io.ReadAll(gz) + if err != nil { + return "", err + } + if err := gz.Close(); err != nil { + return "", err + } + return string(decompressed), nil +} diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index 50d30104adb..338b322640f 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -91,20 +91,88 @@ func (m *Vote) GetData() string { return "" } +type CompressedVote struct { + Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` + OracleId []byte `protobuf:"bytes,2,opt,name=oracle_id,json=oracleId,proto3" json:"oracle_id,omitempty"` + Timestamp uint64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Data []byte `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` +} + +func (m *CompressedVote) Reset() { *m = CompressedVote{} } +func (m *CompressedVote) String() string { return proto.CompactTextString(m) } +func (*CompressedVote) ProtoMessage() {} +func (*CompressedVote) Descriptor() ([]byte, []int) { + return fileDescriptor_ed9227d272ed5d90, []int{1} +} +func (m *CompressedVote) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CompressedVote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_CompressedVote.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *CompressedVote) XXX_Merge(src proto.Message) { + xxx_messageInfo_CompressedVote.Merge(m, src) +} +func (m *CompressedVote) XXX_Size() int { + return m.Size() +} +func (m *CompressedVote) XXX_DiscardUnknown() { + xxx_messageInfo_CompressedVote.DiscardUnknown(m) +} + +var xxx_messageInfo_CompressedVote proto.InternalMessageInfo + +func (m *CompressedVote) GetValidator() []byte { + if m != nil { + return m.Validator + } + return nil +} + +func (m *CompressedVote) GetOracleId() []byte { + if m != nil { + return m.OracleId + } + return nil +} + +func (m *CompressedVote) GetTimestamp() uint64 { + if m != nil { + return m.Timestamp + } + return 0 +} + +func (m *CompressedVote) GetData() []byte { + if m != nil { + return m.Data + } + return nil +} + type GossipVote struct { - Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` - PublicKey []byte `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` - SignType string `protobuf:"bytes,3,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` - Votes []*Vote `protobuf:"bytes,4,rep,name=votes,proto3" json:"votes,omitempty"` - SignedTimestamp uint64 `protobuf:"varint,5,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` - Signature []byte `protobuf:"bytes,6,opt,name=signature,proto3" json:"signature,omitempty"` + Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` + PublicKey []byte `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` + SignType string `protobuf:"bytes,3,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` + Votes []*CompressedVote `protobuf:"bytes,4,rep,name=votes,proto3" json:"votes,omitempty"` + SignedTimestamp uint64 `protobuf:"varint,5,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` + Signature []byte `protobuf:"bytes,6,opt,name=signature,proto3" json:"signature,omitempty"` } func (m *GossipVote) Reset() { *m = GossipVote{} } func (m *GossipVote) String() string { return proto.CompactTextString(m) } func (*GossipVote) ProtoMessage() {} func (*GossipVote) Descriptor() ([]byte, []int) { - return fileDescriptor_ed9227d272ed5d90, []int{1} + return fileDescriptor_ed9227d272ed5d90, []int{2} } func (m *GossipVote) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -154,7 +222,7 @@ func (m *GossipVote) GetSignType() string { return "" } -func (m *GossipVote) GetVotes() []*Vote { +func (m *GossipVote) GetVotes() []*CompressedVote { if m != nil { return m.Votes } @@ -176,17 +244,17 @@ func (m *GossipVote) GetSignature() []byte { } type CanonicalGossipVote struct { - Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` - PublicKey []byte `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` - SignType string `protobuf:"bytes,3,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` - Votes []*Vote `protobuf:"bytes,4,rep,name=votes,proto3" json:"votes,omitempty"` + Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` + PublicKey []byte `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` + SignType string `protobuf:"bytes,3,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` + Votes []*CompressedVote `protobuf:"bytes,4,rep,name=votes,proto3" json:"votes,omitempty"` } func (m *CanonicalGossipVote) Reset() { *m = CanonicalGossipVote{} } func (m *CanonicalGossipVote) String() string { return proto.CompactTextString(m) } func (*CanonicalGossipVote) ProtoMessage() {} func (*CanonicalGossipVote) Descriptor() ([]byte, []int) { - return fileDescriptor_ed9227d272ed5d90, []int{2} + return fileDescriptor_ed9227d272ed5d90, []int{3} } func (m *CanonicalGossipVote) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -236,7 +304,7 @@ func (m *CanonicalGossipVote) GetSignType() string { return "" } -func (m *CanonicalGossipVote) GetVotes() []*Vote { +func (m *CanonicalGossipVote) GetVotes() []*CompressedVote { if m != nil { return m.Votes } @@ -260,7 +328,7 @@ func (m *Oracle) Reset() { *m = Oracle{} } func (m *Oracle) String() string { return proto.CompactTextString(m) } func (*Oracle) ProtoMessage() {} func (*Oracle) Descriptor() ([]byte, []int) { - return fileDescriptor_ed9227d272ed5d90, []int{3} + return fileDescriptor_ed9227d272ed5d90, []int{4} } func (m *Oracle) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -369,7 +437,7 @@ func (m *Result) Reset() { *m = Result{} } func (m *Result) String() string { return proto.CompactTextString(m) } func (*Result) ProtoMessage() {} func (*Result) Descriptor() ([]byte, []int) { - return fileDescriptor_ed9227d272ed5d90, []int{4} + return fileDescriptor_ed9227d272ed5d90, []int{5} } func (m *Result) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -421,6 +489,7 @@ func (m *Result) GetData() string { func init() { proto.RegisterType((*Vote)(nil), "tendermint.oracle.Vote") + proto.RegisterType((*CompressedVote)(nil), "tendermint.oracle.CompressedVote") proto.RegisterType((*GossipVote)(nil), "tendermint.oracle.GossipVote") proto.RegisterType((*CanonicalGossipVote)(nil), "tendermint.oracle.CanonicalGossipVote") proto.RegisterType((*Oracle)(nil), "tendermint.oracle.Oracle") @@ -430,43 +499,45 @@ func init() { func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 572 bytes of a gzipped FileDescriptorProto + // 594 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x54, 0xbd, 0x6e, 0xd4, 0x4c, - 0x14, 0x8d, 0x37, 0x9b, 0x4d, 0x7c, 0x93, 0x6c, 0xbe, 0x6f, 0x88, 0x82, 0x05, 0x89, 0xb3, 0x18, - 0x24, 0x96, 0x82, 0x5d, 0x04, 0xa9, 0xe8, 0x08, 0x05, 0x42, 0x48, 0x80, 0x4c, 0x44, 0x41, 0x63, - 0xcd, 0xda, 0x17, 0x33, 0x62, 0xed, 0xb1, 0x66, 0xae, 0xa3, 0xf8, 0x25, 0x10, 0x4f, 0xc0, 0xf3, - 0x20, 0xaa, 0x94, 0x54, 0x11, 0x4a, 0xde, 0x20, 0x4f, 0x80, 0x3c, 0xb3, 0xb1, 0x2d, 0xd2, 0x50, - 0xd2, 0x5d, 0x9f, 0x73, 0xae, 0xef, 0xcf, 0xcc, 0x19, 0xd8, 0x23, 0xcc, 0x13, 0x54, 0x99, 0xc8, - 0x69, 0x2a, 0x15, 0x8f, 0xe7, 0x38, 0xa5, 0xaa, 0x40, 0x3d, 0x29, 0x94, 0x24, 0xc9, 0xfe, 0x6f, - 0xe9, 0x89, 0xa5, 0x6f, 0x6d, 0xa7, 0x32, 0x95, 0x86, 0x9d, 0xd6, 0x91, 0x15, 0x06, 0x1a, 0xfa, - 0xef, 0x25, 0x21, 0xdb, 0x05, 0xf7, 0x98, 0xcf, 0x45, 0xc2, 0x49, 0x2a, 0xcf, 0x19, 0x39, 0xe3, - 0x8d, 0xb0, 0x05, 0xd8, 0x6d, 0x70, 0xed, 0x5f, 0x22, 0x91, 0x78, 0xbd, 0x91, 0x33, 0x76, 0xc3, - 0x35, 0x0b, 0xbc, 0x4c, 0xea, 0x54, 0x12, 0x19, 0x6a, 0xe2, 0x59, 0xe1, 0x2d, 0x8f, 0x9c, 0x71, - 0x3f, 0x6c, 0x01, 0xc6, 0xa0, 0x9f, 0x70, 0xe2, 0x5e, 0xdf, 0x64, 0x99, 0x38, 0x38, 0x73, 0x00, - 0x5e, 0x48, 0xad, 0x45, 0xf1, 0x17, 0xb5, 0xf7, 0x00, 0x8a, 0x72, 0x36, 0x17, 0x71, 0xf4, 0x19, - 0x2b, 0x53, 0x7c, 0x23, 0x74, 0x2d, 0xf2, 0x0a, 0xab, 0xba, 0x35, 0x2d, 0xd2, 0x3c, 0xaa, 0xa7, - 0x37, 0xd5, 0xdd, 0x70, 0xad, 0x06, 0x8e, 0xaa, 0x02, 0xd9, 0x43, 0x58, 0x39, 0x96, 0x84, 0xda, - 0xeb, 0x8f, 0x96, 0xc7, 0xeb, 0x8f, 0x6f, 0x4e, 0xae, 0xad, 0x65, 0x52, 0x77, 0x10, 0x5a, 0x15, - 0x7b, 0x00, 0xff, 0xd5, 0xa9, 0x98, 0x44, 0xed, 0x40, 0x2b, 0x66, 0xa0, 0x2d, 0x8b, 0x1f, 0x35, - 0x63, 0xed, 0xda, 0xb2, 0x9c, 0x4a, 0x85, 0xde, 0xc0, 0x36, 0xd5, 0x00, 0xc1, 0x37, 0x07, 0x6e, - 0x3c, 0xe7, 0xb9, 0xcc, 0x45, 0xcc, 0xe7, 0xff, 0xe0, 0xa4, 0xc1, 0x8f, 0x1e, 0x0c, 0xde, 0x18, - 0x98, 0x79, 0xb0, 0x1a, 0x2b, 0x6c, 0x3a, 0x72, 0xc3, 0xab, 0x4f, 0x36, 0x84, 0x5e, 0x73, 0xdc, - 0x3d, 0x91, 0xb0, 0x11, 0xac, 0x27, 0xa8, 0x63, 0x25, 0x0a, 0x12, 0x32, 0x5f, 0xb4, 0xd0, 0x85, - 0xd8, 0x0e, 0x0c, 0x34, 0x71, 0x2a, 0xf5, 0xe2, 0xb8, 0x17, 0x5f, 0xec, 0x00, 0x76, 0x32, 0x91, - 0x47, 0x54, 0xaa, 0x5c, 0x96, 0x14, 0x15, 0xa8, 0x62, 0xcc, 0x89, 0xa7, 0x68, 0xd6, 0xeb, 0x86, - 0xdb, 0x99, 0xc8, 0x8f, 0x2c, 0xf9, 0xb6, 0xe1, 0xd8, 0x3d, 0x18, 0x66, 0xfc, 0x24, 0x52, 0xa8, - 0xcb, 0x39, 0x45, 0xb5, 0x7a, 0x60, 0xd4, 0x1b, 0x19, 0x3f, 0x09, 0x0d, 0xf8, 0x2c, 0x45, 0x76, - 0x17, 0x36, 0x35, 0xc6, 0xa5, 0x12, 0x54, 0xd9, 0xd5, 0xac, 0x5a, 0xd1, 0x15, 0x68, 0xd6, 0x73, - 0x1f, 0xb6, 0x16, 0xbf, 0xd1, 0xa4, 0x38, 0x61, 0x5a, 0x79, 0x6b, 0x46, 0x36, 0xb4, 0xf0, 0xbb, - 0x05, 0xca, 0x7c, 0x00, 0x85, 0x5a, 0xce, 0x4b, 0x33, 0xa2, 0x6b, 0x34, 0x1d, 0xa4, 0xbe, 0xce, - 0xba, 0xc0, 0xd8, 0x03, 0x7b, 0x9d, 0xeb, 0x38, 0xf8, 0xe2, 0xc0, 0xc0, 0xf6, 0xc3, 0xa6, 0x5d, - 0xa3, 0x98, 0x75, 0x1e, 0xb2, 0xcb, 0xb3, 0xfd, 0x61, 0x32, 0x7b, 0x1a, 0x34, 0x44, 0xd0, 0x31, - 0xcf, 0xa3, 0x3f, 0xcd, 0xb3, 0xdc, 0x26, 0x34, 0x44, 0xd0, 0x35, 0xd4, 0x9d, 0xae, 0xa1, 0x0e, - 0x37, 0x2f, 0xcf, 0xf6, 0xdd, 0x5a, 0x6c, 0x8c, 0x65, 0xfd, 0x75, 0xf8, 0xfa, 0xfb, 0xb9, 0xef, - 0x9c, 0x9e, 0xfb, 0xce, 0xaf, 0x73, 0xdf, 0xf9, 0x7a, 0xe1, 0x2f, 0x9d, 0x5e, 0xf8, 0x4b, 0x3f, - 0x2f, 0xfc, 0xa5, 0x0f, 0x07, 0xa9, 0xa0, 0x4f, 0xe5, 0x6c, 0x12, 0xcb, 0x6c, 0x1a, 0xcb, 0x0c, - 0x69, 0xf6, 0x91, 0xda, 0xc0, 0xbe, 0x0e, 0xd7, 0x5e, 0x96, 0xd9, 0xc0, 0x10, 0x4f, 0x7e, 0x07, - 0x00, 0x00, 0xff, 0xff, 0xe5, 0xd0, 0x69, 0x5d, 0x75, 0x04, 0x00, 0x00, + 0x14, 0x8d, 0x37, 0x9b, 0x4d, 0x7c, 0xb3, 0xd9, 0x7c, 0xdf, 0x10, 0x45, 0x16, 0x24, 0xce, 0xc6, + 0x20, 0xb1, 0x34, 0xbb, 0x08, 0x22, 0x21, 0xd1, 0x91, 0x14, 0x08, 0x21, 0x01, 0x32, 0x11, 0x05, + 0x8d, 0x35, 0x6b, 0x5f, 0xcc, 0x88, 0xb5, 0xc7, 0x9a, 0xb9, 0x8e, 0xb2, 0x05, 0xaf, 0x80, 0x78, + 0x0c, 0x1e, 0x05, 0x51, 0xa5, 0xa4, 0x8a, 0x50, 0xd2, 0x50, 0xe7, 0x09, 0x90, 0x67, 0x1c, 0xef, + 0x42, 0x1a, 0x94, 0x8a, 0xee, 0xfa, 0x9c, 0x33, 0x73, 0x7f, 0x7c, 0xcf, 0xc0, 0x36, 0x61, 0x9e, + 0xa0, 0xca, 0x44, 0x4e, 0x23, 0xa9, 0x78, 0x3c, 0xc1, 0x11, 0x4d, 0x0b, 0xd4, 0xc3, 0x42, 0x49, + 0x92, 0xec, 0xff, 0x19, 0x3d, 0xb4, 0xf4, 0xcd, 0x8d, 0x54, 0xa6, 0xd2, 0xb0, 0xa3, 0x2a, 0xb2, + 0xc2, 0x40, 0x43, 0xfb, 0x8d, 0x24, 0x64, 0x5b, 0xe0, 0x1e, 0xf1, 0x89, 0x48, 0x38, 0x49, 0xe5, + 0x39, 0x7d, 0x67, 0xd0, 0x0d, 0x67, 0x00, 0xbb, 0x05, 0xae, 0xbd, 0x25, 0x12, 0x89, 0xd7, 0xea, + 0x3b, 0x03, 0x37, 0x5c, 0xb1, 0xc0, 0xb3, 0xa4, 0x3a, 0x4a, 0x22, 0x43, 0x4d, 0x3c, 0x2b, 0xbc, + 0xc5, 0xbe, 0x33, 0x68, 0x87, 0x33, 0x80, 0x31, 0x68, 0x27, 0x9c, 0xb8, 0xd7, 0x36, 0xa7, 0x4c, + 0x1c, 0x7c, 0x84, 0xde, 0x81, 0xcc, 0x0a, 0x85, 0x5a, 0x63, 0x72, 0x9d, 0xf4, 0xdd, 0x6b, 0xa5, + 0xef, 0xd6, 0xe9, 0x7f, 0x3a, 0x00, 0x4f, 0xa5, 0xd6, 0xa2, 0xf8, 0x8b, 0xdc, 0xdb, 0x00, 0x45, + 0x39, 0x9e, 0x88, 0x38, 0xfa, 0x80, 0xd3, 0x3a, 0xb9, 0x6b, 0x91, 0xe7, 0x38, 0xad, 0x4a, 0xd3, + 0x22, 0xcd, 0xa3, 0x6a, 0xf8, 0x26, 0xbb, 0x1b, 0xae, 0x54, 0xc0, 0xe1, 0xb4, 0x40, 0xf6, 0x08, + 0x96, 0x8e, 0x24, 0xa1, 0xf6, 0xda, 0xfd, 0xc5, 0xc1, 0xea, 0x83, 0xdd, 0xe1, 0x95, 0xbf, 0x32, + 0xfc, 0x7d, 0x0e, 0xa1, 0xd5, 0xb3, 0x7b, 0xf0, 0x5f, 0x75, 0x09, 0x26, 0xd1, 0xac, 0xb5, 0x25, + 0xd3, 0xda, 0xba, 0xc5, 0x0f, 0x9b, 0x06, 0xb7, 0x6c, 0x01, 0x9c, 0x4a, 0x85, 0x5e, 0xc7, 0x96, + 0xd7, 0x00, 0xc1, 0x17, 0x07, 0x6e, 0x1c, 0xf0, 0x5c, 0xe6, 0x22, 0xe6, 0x93, 0x7f, 0xba, 0xe7, + 0xe0, 0x5b, 0x0b, 0x3a, 0x2f, 0x8d, 0x80, 0x79, 0xb0, 0x1c, 0x2b, 0x6c, 0x6a, 0x73, 0xc3, 0xcb, + 0x4f, 0xd6, 0x83, 0x56, 0xb3, 0x81, 0x2d, 0x91, 0xb0, 0x3e, 0xac, 0x26, 0xa8, 0x63, 0x25, 0x0a, + 0x12, 0x32, 0xaf, 0x8b, 0x99, 0x87, 0xd8, 0x26, 0x74, 0x34, 0x71, 0x2a, 0x75, 0xbd, 0x81, 0xf5, + 0x17, 0xdb, 0x83, 0xcd, 0x4c, 0xe4, 0x11, 0x95, 0x2a, 0x97, 0x25, 0x45, 0x05, 0xaa, 0x18, 0x73, + 0xe2, 0x29, 0x9a, 0x41, 0xbb, 0xe1, 0x46, 0x26, 0xf2, 0x43, 0x4b, 0xbe, 0x6a, 0x38, 0x76, 0x07, + 0x7a, 0x19, 0x3f, 0x8e, 0x14, 0xea, 0x72, 0x42, 0x51, 0xa5, 0xee, 0x18, 0x75, 0x37, 0xe3, 0xc7, + 0xa1, 0x01, 0x9f, 0xa4, 0xc8, 0x6e, 0xc3, 0x9a, 0xc6, 0xb8, 0x54, 0x82, 0xa6, 0x76, 0x48, 0xcb, + 0x56, 0x74, 0x09, 0x9a, 0x41, 0xdd, 0x85, 0xf5, 0xfa, 0x1a, 0x4d, 0x8a, 0x13, 0xa6, 0x53, 0x6f, + 0xc5, 0xc8, 0x7a, 0x16, 0x7e, 0x5d, 0xa3, 0xcc, 0x07, 0x50, 0xa8, 0xe5, 0xa4, 0x34, 0x2d, 0xba, + 0x46, 0x33, 0x87, 0x54, 0x2b, 0xae, 0x0b, 0x8c, 0x3d, 0xb0, 0x0e, 0xab, 0xe2, 0xe0, 0x93, 0x03, + 0x1d, 0x5b, 0x0f, 0x1b, 0xcd, 0x9b, 0xc7, 0x8c, 0x73, 0x9f, 0x5d, 0x9c, 0xee, 0xf4, 0x92, 0xf1, + 0xe3, 0xa0, 0x21, 0x82, 0x39, 0x43, 0xdd, 0xff, 0xd3, 0x50, 0x8b, 0xb3, 0x03, 0x0d, 0x11, 0xcc, + 0x9b, 0x6c, 0x77, 0xde, 0xe3, 0xfb, 0x6b, 0x17, 0xa7, 0x3b, 0x6e, 0x25, 0x36, 0x66, 0xb3, 0x9e, + 0xdb, 0x7f, 0xf1, 0xf5, 0xcc, 0x77, 0x4e, 0xce, 0x7c, 0xe7, 0xc7, 0x99, 0xef, 0x7c, 0x3e, 0xf7, + 0x17, 0x4e, 0xce, 0xfd, 0x85, 0xef, 0xe7, 0xfe, 0xc2, 0xdb, 0xbd, 0x54, 0xd0, 0xfb, 0x72, 0x3c, + 0x8c, 0x65, 0x36, 0x8a, 0x65, 0x86, 0x34, 0x7e, 0x47, 0xb3, 0xc0, 0x3e, 0x58, 0x57, 0x1e, 0xbb, + 0x71, 0xc7, 0x10, 0x0f, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0x91, 0x24, 0x69, 0x96, 0x08, 0x05, + 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -518,6 +589,55 @@ func (m *Vote) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *CompressedVote) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CompressedVote) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CompressedVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0x22 + } + if m.Timestamp != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Timestamp)) + i-- + dAtA[i] = 0x18 + } + if len(m.OracleId) > 0 { + i -= len(m.OracleId) + copy(dAtA[i:], m.OracleId) + i = encodeVarintTypes(dAtA, i, uint64(len(m.OracleId))) + i-- + dAtA[i] = 0x12 + } + if len(m.Validator) > 0 { + i -= len(m.Validator) + copy(dAtA[i:], m.Validator) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Validator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *GossipVote) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -816,6 +936,30 @@ func (m *Vote) Size() (n int) { return n } +func (m *CompressedVote) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Validator) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.OracleId) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.Timestamp != 0 { + n += 1 + sovTypes(uint64(m.Timestamp)) + } + l = len(m.Data) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + func (m *GossipVote) Size() (n int) { if m == nil { return 0 @@ -1119,6 +1263,177 @@ func (m *Vote) Unmarshal(dAtA []byte) error { } return nil } +func (m *CompressedVote) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CompressedVote: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CompressedVote: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) + if m.Validator == nil { + m.Validator = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OracleId", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.OracleId = append(m.OracleId[:0], dAtA[iNdEx:postIndex]...) + if m.OracleId == nil { + m.OracleId = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) + } + m.Timestamp = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Timestamp |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *GossipVote) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -1277,7 +1592,7 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Votes = append(m.Votes, &Vote{}) + m.Votes = append(m.Votes, &CompressedVote{}) if err := m.Votes[len(m.Votes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -1514,7 +1829,7 @@ func (m *CanonicalGossipVote) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Votes = append(m.Votes, &Vote{}) + m.Votes = append(m.Votes, &CompressedVote{}) if err := m.Votes[len(m.Votes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index 7b22c8611e7..48314b96c3b 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -12,11 +12,18 @@ message Vote { string data = 4; } +message CompressedVote { + bytes validator = 1; + bytes oracle_id = 2; + uint64 timestamp = 3; + bytes data = 4; +} + message GossipVote { bytes validator = 1; bytes public_key = 2; string sign_type = 3; - repeated Vote votes = 4; + repeated CompressedVote votes = 4; uint64 signed_timestamp = 5; bytes signature = 6; } @@ -25,7 +32,7 @@ message CanonicalGossipVote { bytes validator = 1; bytes public_key = 2; string sign_type = 3; - repeated Vote votes = 4; + repeated CompressedVote votes = 4; } message Oracle { diff --git a/state/execution.go b/state/execution.go index b10d81d0e44..615f722f6f8 100644 --- a/state/execution.go +++ b/state/execution.go @@ -3,7 +3,6 @@ package state import ( "bytes" "context" - "encoding/hex" "fmt" "time" @@ -15,7 +14,6 @@ import ( cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/cometbft/cometbft/proxy" "github.com/cometbft/cometbft/types" - "github.com/sirupsen/logrus" oracletypes "github.com/cometbft/cometbft/oracle/service/types" oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" @@ -142,6 +140,7 @@ func (blockExec *BlockExecutor) CreateProposalBlock( for _, vote := range oracleVotesBuffer { votes = append(votes, vote) } + resp, err := blockExec.proxyApp.SignGossipVote(ctx, &abci.RequestSignGossipVote{ ProposerAddress: proposerAddr, GossipVotes: votes, @@ -166,10 +165,6 @@ func (blockExec *BlockExecutor) CreateProposalBlock( block := state.MakeBlock(height, txs, commit, evidence, proposerAddr) txSlice := block.Txs.ToSliceOfBytes() - logrus.Info("BEFORE REQUEST PROPOSAL:") - logrus.Infof("STATE APP HASH: %s", hex.EncodeToString(state.AppHash)) - logrus.Infof("BLOCK APP HASH: %s", block.AppHash.String()) - rpp, err := blockExec.proxyApp.PrepareProposal( ctx, &abci.RequestPrepareProposal{ From 9157efb19ebfcc76da453323507eb16182145843 Mon Sep 17 00:00:00 2001 From: Yan Date: Tue, 12 Mar 2024 11:56:49 +0800 Subject: [PATCH 028/150] test with larger max tx size for oracle gossip --- oracle/reactor.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index d65a99fa9d6..06074ee7001 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -130,9 +130,7 @@ func (oracleR *Reactor) GetChannels() []*p2p.ChannelDescriptor { { ID: OracleChannel, Priority: 5, - RecvMessageCapacity: 4096, - RecvBufferCapacity: 50 * 4096, - SendQueueCapacity: 1000, + RecvMessageCapacity: 65536, MessageType: &oracleproto.GossipVote{}, }, } From ded309f0566825aa74be7d2df6d92caa58dbb176 Mon Sep 17 00:00:00 2001 From: Yan Date: Tue, 12 Mar 2024 17:37:49 +0800 Subject: [PATCH 029/150] add config oracle reactor --- config/config.go | 63 +++++++++++++++++++ config/toml.go | 23 +++++++ node/node.go | 2 +- oracle/reactor.go | 20 ++++-- oracle/service/adapters/adapters.go | 4 +- oracle/service/adapters/evm_fetcher.go | 2 +- oracle/service/adapters/fetcher_multiple.go | 2 +- .../service/adapters/oracle_result_fetcher.go | 17 +++-- oracle/service/runner/runner.go | 24 ++++--- oracle/service/types/adapter.go | 2 +- oracle/service/types/config.go | 2 +- oracle/service/types/info.go | 9 +-- 12 files changed, 137 insertions(+), 33 deletions(-) diff --git a/config/config.go b/config/config.go index b02ad75e726..26e56625ba8 100644 --- a/config/config.go +++ b/config/config.go @@ -72,6 +72,7 @@ type Config struct { RPC *RPCConfig `mapstructure:"rpc"` P2P *P2PConfig `mapstructure:"p2p"` Mempool *MempoolConfig `mapstructure:"mempool"` + Oracle *OracleConfig `mapstructure:"oracle"` StateSync *StateSyncConfig `mapstructure:"statesync"` BlockSync *BlockSyncConfig `mapstructure:"blocksync"` Consensus *ConsensusConfig `mapstructure:"consensus"` @@ -87,6 +88,7 @@ func DefaultConfig() *Config { RPC: DefaultRPCConfig(), P2P: DefaultP2PConfig(), Mempool: DefaultMempoolConfig(), + Oracle: DefaultOracleConfig(), StateSync: DefaultStateSyncConfig(), BlockSync: DefaultBlockSyncConfig(), Consensus: DefaultConsensusConfig(), @@ -103,6 +105,7 @@ func TestConfig() *Config { RPC: TestRPCConfig(), P2P: TestP2PConfig(), Mempool: TestMempoolConfig(), + Oracle: TestOracleConfig(), StateSync: TestStateSyncConfig(), BlockSync: TestBlockSyncConfig(), Consensus: TestConsensusConfig(), @@ -137,6 +140,9 @@ func (cfg *Config) ValidateBasic() error { if err := cfg.Mempool.ValidateBasic(); err != nil { return fmt.Errorf("error in [mempool] section: %w", err) } + if err := cfg.Oracle.ValidateBasic(); err != nil { + return fmt.Errorf("error in [oracle] section: %w", err) + } if err := cfg.StateSync.ValidateBasic(); err != nil { return fmt.Errorf("error in [statesync] section: %w", err) } @@ -786,6 +792,63 @@ func (cfg *MempoolConfig) ValidateBasic() error { return nil } +//----------------------------------------------------------------------------- +// OracleConfig + +// OracleConfig defines the configuration for the CometBFT oracle service +type OracleConfig struct { + // Path to custom oracle spec should validators decide to use a different spec from the default + CustomNodePath string `mapstructure:"custom_node_path"` + // Url used to query chain for syncing of oracles and fetching cached oracle results + RestUrl string `mapstructure:"rest_url"` + // Interval determines how long we should keep our gossiped votes before pruning + PruneInterval time.Duration `mapstructure:"prune_interval"` + // Interval determines how long we should wait before batch signing votes + SignInterval time.Duration `mapstructure:"sign_interval"` + // Interval determines how long we should wait before re-syncing oracles from the chain + SyncInterval time.Duration `mapstructure:"sync_interval"` + // Max allowable size for votes that can be gossiped from peer to peer + MaxGossipMsgSize int `mapstructure:"max_gossip_msg_size"` +} + +// DefaultOracleConfig returns a default configuration for the CometBFT oracle service +func DefaultOracleConfig() *OracleConfig { + return &OracleConfig{ + RestUrl: "127.0.0.1", // localhost + PruneInterval: 5 * time.Second, // 5s + SignInterval: 500 * time.Millisecond, // 0.5s + SyncInterval: 60 * time.Second, // 60s + MaxGossipMsgSize: 65536, + } +} + +// TestOracleConfig returns a configuration for testing the CometBFT mempool +func TestOracleConfig() *OracleConfig { + cfg := DefaultOracleConfig() + cfg.MaxGossipMsgSize = 1000 + return cfg +} + +// ValidateBasic performs basic validation and returns an error if any check fails. +func (cfg *OracleConfig) ValidateBasic() error { + if cfg.RestUrl == "" { + return errors.New("rest_url can't be empty") + } + if cfg.PruneInterval < 0 { + return errors.New("prune_interval can't be negative") + } + if cfg.SignInterval < 0 { + return errors.New("sign_interval can't be negative") + } + if cfg.SyncInterval < 0 { + return errors.New("sync_interval can't be negative") + } + if cfg.MaxGossipMsgSize < 0 { + return errors.New("max_gossip_msg_size can't be negative") + } + return nil +} + //----------------------------------------------------------------------------- // StateSyncConfig diff --git a/config/toml.go b/config/toml.go index 80e4aac33ee..713ee4c4f75 100644 --- a/config/toml.go +++ b/config/toml.go @@ -379,6 +379,29 @@ max_tx_bytes = {{ .Mempool.MaxTxBytes }} # XXX: Unused due to https://github.com/tendermint/tendermint/issues/5796 max_batch_bytes = {{ .Mempool.MaxBatchBytes }} +####################################################### +### Oracle Configuration Option ### +####################################################### +[oracle] + +# Path to custom oracle spec should validators decide to use a different spec from the default +custom_node_path = "{{ .Oracle.CustomNodePath }}" + +# Url used to query chain for syncing of oracles and fetching cached oracle results +rest_url = "{{ .Oracle.RestUrl }}" + +# Interval determines how long we should keep our gossiped votes before pruning +prune_interval = "{{ .Oracle.PruneInterval }}" + +# Interval determines how long we should wait before batch signing votes +sign_interval = "{{ .Oracle.SignInterval }}" + +# Interval determines how long we should wait before re-syncing oracles from the chain +sync_interval = "{{ .Oracle.SyncInterval }}" + +# Max allowable size for votes that can be gossiped from peer to peer +max_gossip_msg_size = {{ .Oracle.MaxGossipMsgSize }} + ####################################################### ### State Sync Configuration Options ### ####################################################### diff --git a/node/node.go b/node/node.go index 43fa58ed218..04286a3fb03 100644 --- a/node/node.go +++ b/node/node.go @@ -382,7 +382,7 @@ func NewNodeWithContext(ctx context.Context, // Make OracleReactor - oracleReactor := oracle.NewReactor("", pubKey, privValidator, state.Validators) + oracleReactor := oracle.NewReactor(config.Oracle, pubKey, privValidator, state.Validators) oracleInfo := oracleReactor.OracleInfo // make block executor for consensus and blocksync reactors to execute blocks diff --git a/oracle/reactor.go b/oracle/reactor.go index 06074ee7001..66f7e7adb11 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -8,6 +8,7 @@ import ( "os" "time" + "github.com/cometbft/cometbft/config" "github.com/cometbft/cometbft/crypto/ed25519" "github.com/cometbft/cometbft/crypto/sr25519" "github.com/sirupsen/logrus" @@ -50,9 +51,10 @@ type Reactor struct { } // NewReactor returns a new Reactor with the given config and mempool. -func NewReactor(configPath string, pubKey crypto.PubKey, privValidator types.PrivValidator, validatorSet *types.ValidatorSet) *Reactor { +func NewReactor(config *config.OracleConfig, pubKey crypto.PubKey, privValidator types.PrivValidator, validatorSet *types.ValidatorSet) *Reactor { // load oracle.json config if present - jsonFile, openErr := os.Open(configPath) + customNodeConfigPath := config.CustomNodePath + jsonFile, openErr := os.Open(customNodeConfigPath) if openErr != nil { logrus.Warnf("[oracle] error opening oracle.json config file: %v", openErr) } @@ -62,8 +64,8 @@ func NewReactor(configPath string, pubKey crypto.PubKey, privValidator types.Pri logrus.Warnf("[oracle] error reading oracle.json config file: %v", err) } - var config oracletypes.Config - err = json.Unmarshal(bytes, &config) + var customNodeConfig oracletypes.CustomNodeConfig + err = json.Unmarshal(bytes, &customNodeConfig) if err != nil { logrus.Warnf("[oracle] error parsing oracle.json config file: %v", err) } @@ -79,6 +81,7 @@ func NewReactor(configPath string, pubKey crypto.PubKey, privValidator types.Pri oracleInfo := &oracletypes.OracleInfo{ Oracles: nil, Config: config, + CustomNodeConfig: customNodeConfig, GossipVoteBuffer: gossipVoteBuffer, UnsignedVoteBuffer: unsignedVoteBuffer, SignVotesChan: make(chan *oracleproto.CompressedVote), @@ -113,7 +116,7 @@ func (oracleR *Reactor) SetLogger(l log.Logger) { // OnStart implements p2p.BaseReactor. func (oracleR *Reactor) OnStart() error { oracleR.OracleInfo.Redis = redis.NewService(0) - oracleR.OracleInfo.AdapterMap = adapters.GetAdapterMap(&oracleR.OracleInfo.Redis) + oracleR.OracleInfo.AdapterMap = adapters.GetAdapterMap(&oracleR.OracleInfo.Redis, oracleR.OracleInfo.Config.RestUrl) logrus.Info("[oracle] running oracle service...") go func() { runner.Run(oracleR.OracleInfo) @@ -126,11 +129,16 @@ func (oracleR *Reactor) OnStart() error { func (oracleR *Reactor) GetChannels() []*p2p.ChannelDescriptor { // largestTx := make([]byte, oracleR.config.MaxTxBytes) // TODO, confirm these params + messageCap := oracleR.OracleInfo.Config.MaxGossipMsgSize + if messageCap == 0 { + logrus.Warn("MAX GOSSIP MSG SIZE NOT SET!!!!") + messageCap = 65536 + } return []*p2p.ChannelDescriptor{ { ID: OracleChannel, Priority: 5, - RecvMessageCapacity: 65536, + RecvMessageCapacity: messageCap, MessageType: &oracleproto.GossipVote{}, }, } diff --git a/oracle/service/adapters/adapters.go b/oracle/service/adapters/adapters.go index b770aff3f97..1eac562b584 100644 --- a/oracle/service/adapters/adapters.go +++ b/oracle/service/adapters/adapters.go @@ -7,14 +7,14 @@ import ( ) // GetAdapterMap returns a map of all adapters -func GetAdapterMap(redisService *redis.Service) map[string]types.Adapter { +func GetAdapterMap(redisService *redis.Service, restUrl string) map[string]types.Adapter { adapterMap := make(map[string]types.Adapter) adaptersList := []types.Adapter{ NewFetcher(redisService), NewFetcherMultiple(redisService), NewUnresponsiveHandler(redisService), NewUnchangedHandler(redisService), NewMedianFilter(redisService), NewWeightedAverage(redisService), NewFloatHandler(redisService), NewDecimalHandler(redisService), - NewMathFilter(redisService), NewOracleResultFetcher(redisService), + NewMathFilter(redisService), NewOracleResultFetcher(redisService, restUrl), NewEVMValueParser(redisService), NewEVMStructParser(redisService), NewEVMFetcher(redisService), NewStaticHandler(redisService), } diff --git a/oracle/service/adapters/evm_fetcher.go b/oracle/service/adapters/evm_fetcher.go index 8a3aeeb7dc1..f82b0e438a0 100644 --- a/oracle/service/adapters/evm_fetcher.go +++ b/oracle/service/adapters/evm_fetcher.go @@ -51,7 +51,7 @@ func (evmFetcher *EVMFetcher) Validate(job types.OracleJob) error { } // GetRpcUrl attempts to get the rpc url from config file, if not it populates the config file with the default rpc url -func GetRpcUrl(job types.OracleJob, config types.Config) (string, error) { +func GetRpcUrl(job types.OracleJob, config types.CustomNodeConfig) (string, error) { rpcUrl := job.ConfigValue("default_node_rpc").String() nodeKey := job.ConfigValue("custom_node_url_key").String() diff --git a/oracle/service/adapters/fetcher_multiple.go b/oracle/service/adapters/fetcher_multiple.go index 5760ec7ad2f..7920b2ee11e 100644 --- a/oracle/service/adapters/fetcher_multiple.go +++ b/oracle/service/adapters/fetcher_multiple.go @@ -42,7 +42,7 @@ func (fetcherMultiple *FetcherMultiple) Validate(job types.OracleJob) error { return nil } -func GetUrl(job types.OracleJob, config types.Config) (string, error) { +func GetUrl(job types.OracleJob, config types.CustomNodeConfig) (string, error) { nodeHost := job.ConfigValue("default_node_host").String() nodePath := job.ConfigValue("default_node_path").String() nodeKey := job.ConfigValue("custom_node_url_key").String() diff --git a/oracle/service/adapters/oracle_result_fetcher.go b/oracle/service/adapters/oracle_result_fetcher.go index f9c12263a24..ab9553b1fa9 100644 --- a/oracle/service/adapters/oracle_result_fetcher.go +++ b/oracle/service/adapters/oracle_result_fetcher.go @@ -18,11 +18,13 @@ const STALE_ALLOWANCE = "stale_allowance" // OracleResultFetcher struct for float handler type OracleResultFetcher struct { redisService *redis.Service + restUrl string } -func NewOracleResultFetcher(redisService *redis.Service) *OracleResultFetcher { +func NewOracleResultFetcher(redisService *redis.Service, restUrl string) *OracleResultFetcher { return &OracleResultFetcher{ redisService: redisService, + restUrl: restUrl, } } @@ -54,7 +56,7 @@ func (oracleResultFetcher *OracleResultFetcher) Perform(job types.OracleJob, res if cacheErr != nil { logrus.Error(cacheErr) var apiErr error - price, apiErr = getOracleResultFromAPI(oracleID) + price, apiErr = getOracleResultFromAPI(oracleID, oracleResultFetcher.restUrl) if apiErr != nil { return result, apiErr } @@ -97,12 +99,15 @@ func getOracleResultFromCache(oracleId string, staleAllowance string, redisServi return oracleCache.Price, nil } -func getOracleResultFromAPI(oracleID string) (string, error) { - oracleResultsURL := "https://api.carbon.network/carbon/oracle/v1/results/" + oracleID - response := HTTPRequest(oracleResultsURL, 10) +func getOracleResultFromAPI(oracleID, restUrl string) (string, error) { + if restUrl == "" { + restUrl = "https://test-api.carbon.network" + } + restUrl = restUrl + "/carbon/oracle/v1/results/" + oracleID + response := HTTPRequest(restUrl, 10) if len(response) == 0 { - return "", fmt.Errorf("empty response from %s", oracleResultsURL) + return "", fmt.Errorf("empty response from %s", restUrl) } type Response struct { diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index bc1da91f4b9..251ac36d323 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -14,7 +14,6 @@ import ( "github.com/cometbft/cometbft/oracle/service/types" "github.com/cometbft/cometbft/oracle/service/utils" - "github.com/cometbft/cometbft/proto/tendermint/oracle" oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" "github.com/cometbft/cometbft/redis" ) @@ -125,7 +124,12 @@ func overwriteData(oracleId string, data string) string { // SyncOracles sync oracles with active on-chain oracles func SyncOracles(oracleInfo *types.OracleInfo) (oracles []types.Oracle, err error) { - oraclesURL := "https://test-api.carbon.network/carbon/oracle/v1/oracles" + oraclesURL := oracleInfo.Config.RestUrl + if oraclesURL == "" { + oraclesURL = "https://test-api.carbon.network" + } + oraclesURL += "/carbon/oracle/v1/oracles" + response := adapters.HTTPRequest(oraclesURL, 10) if len(response) == 0 { @@ -133,7 +137,7 @@ func SyncOracles(oracleInfo *types.OracleInfo) (oracles []types.Oracle, err erro } type Response struct { - Oracles []oracle.Oracle `json:"oracles"` + Oracles []oracleproto.Oracle `json:"oracles"` } var parsedResponse Response @@ -217,7 +221,7 @@ func RunOracle(oracleInfo *types.OracleInfo, oracle types.Oracle, currentTime ui input := types.AdapterRunTimeInput{ BeginTime: currentTime, - Config: oracleInfo.Config, + Config: oracleInfo.CustomNodeConfig, } for _, job := range jobs { @@ -290,9 +294,9 @@ func RunProcessSignVoteQueue(oracleInfo *types.OracleInfo) { case <-oracleInfo.StopChannel: return default: - interval := oracleInfo.MsgFlushInterval + interval := oracleInfo.Config.SignInterval if interval == 0 { - interval = 500 * time.Millisecond + interval = 100 * time.Millisecond } time.Sleep(interval) ProcessSignVoteQueue(oracleInfo) @@ -360,7 +364,11 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo) { func PruneUnsignedVoteBuffer(oracleInfo *types.OracleInfo) { go func(oracleInfo *types.OracleInfo) { - ticker := time.Tick(3 * time.Second) + interval := oracleInfo.Config.PruneInterval + if interval == 0 { + interval = 1 * time.Second + } + ticker := time.Tick(interval) for range ticker { oracleInfo.UnsignedVoteBuffer.UpdateMtx.RLock() // prune everything older than 3 secs @@ -371,7 +379,7 @@ func PruneUnsignedVoteBuffer(oracleInfo *types.OracleInfo) { for _, unsignedVotes := range unsignedVoteBuffer { // unsigned votes are arranged from least recent to most recent timestamp := unsignedVotes.Timestamp - if timestamp <= currTime-uint64(3*time.Second) { + if timestamp <= currTime-uint64(interval) { numberOfVotesToPrune++ count += len(unsignedVotes.Votes) } else { diff --git a/oracle/service/types/adapter.go b/oracle/service/types/adapter.go index 61375130147..74fdf053a2e 100644 --- a/oracle/service/types/adapter.go +++ b/oracle/service/types/adapter.go @@ -34,7 +34,7 @@ type AdapterRunTimeInput struct { LastStoreData map[string]GenericValue LastStoreDataExists bool BeginTime uint64 - Config Config + Config CustomNodeConfig } // GetLastStoreData gets data for the given key diff --git a/oracle/service/types/config.go b/oracle/service/types/config.go index 4ce6a739269..1da159a6a19 100644 --- a/oracle/service/types/config.go +++ b/oracle/service/types/config.go @@ -1,7 +1,7 @@ package types // Config struct for app -type Config map[string]CustomNode +type CustomNodeConfig map[string]CustomNode type CustomNode struct { Host string `json:"host"` diff --git a/oracle/service/types/info.go b/oracle/service/types/info.go index 89cdb57cb4c..b6f68ebd8e9 100644 --- a/oracle/service/types/info.go +++ b/oracle/service/types/info.go @@ -1,14 +1,12 @@ package types import ( - "time" - + "github.com/cometbft/cometbft/config" "github.com/cometbft/cometbft/crypto" cmtsync "github.com/cometbft/cometbft/libs/sync" oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" "github.com/cometbft/cometbft/redis" "github.com/cometbft/cometbft/types" - "google.golang.org/grpc" ) // App struct for app @@ -16,14 +14,13 @@ type OracleInfo struct { Oracles []Oracle AdapterMap map[string]Adapter Redis redis.Service - Config Config - GrpcClient *grpc.ClientConn + Config *config.OracleConfig + CustomNodeConfig CustomNodeConfig UnsignedVoteBuffer *UnsignedVoteBuffer GossipVoteBuffer *GossipVoteBuffer SignVotesChan chan *oracleproto.CompressedVote PubKey crypto.PubKey PrivValidator types.PrivValidator - MsgFlushInterval time.Duration StopChannel chan int ValidatorSet *types.ValidatorSet } From 9b9955cc4ad75562546e7d05868f91530f564a7d Mon Sep 17 00:00:00 2001 From: Yan Date: Wed, 13 Mar 2024 15:02:44 +0800 Subject: [PATCH 030/150] cut down on oracle msg size --- config/config.go | 8 +- oracle/reactor.go | 9 +- oracle/service/runner/runner.go | 23 +- oracle/service/types/info.go | 4 +- proto/tendermint/oracle/types.pb.go | 617 ++++------------------------ proto/tendermint/oracle/types.proto | 32 +- types/oracle.go | 1 - 7 files changed, 94 insertions(+), 600 deletions(-) diff --git a/config/config.go b/config/config.go index 26e56625ba8..2498c29718a 100644 --- a/config/config.go +++ b/config/config.go @@ -814,10 +814,10 @@ type OracleConfig struct { // DefaultOracleConfig returns a default configuration for the CometBFT oracle service func DefaultOracleConfig() *OracleConfig { return &OracleConfig{ - RestUrl: "127.0.0.1", // localhost - PruneInterval: 5 * time.Second, // 5s - SignInterval: 500 * time.Millisecond, // 0.5s - SyncInterval: 60 * time.Second, // 60s + RestUrl: "http://localhost:1317", // localhost + PruneInterval: 4 * time.Second, // 4s + SignInterval: 500 * time.Millisecond, // 0.5s + SyncInterval: 60 * time.Second, // 60s MaxGossipMsgSize: 65536, } } diff --git a/oracle/reactor.go b/oracle/reactor.go index 66f7e7adb11..6b8c4af5dc9 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -84,7 +84,7 @@ func NewReactor(config *config.OracleConfig, pubKey crypto.PubKey, privValidator CustomNodeConfig: customNodeConfig, GossipVoteBuffer: gossipVoteBuffer, UnsignedVoteBuffer: unsignedVoteBuffer, - SignVotesChan: make(chan *oracleproto.CompressedVote), + SignVotesChan: make(chan *oracleproto.Vote), PubKey: pubKey, PrivValidator: privValidator, ValidatorSet: validatorSet, @@ -131,7 +131,6 @@ func (oracleR *Reactor) GetChannels() []*p2p.ChannelDescriptor { // TODO, confirm these params messageCap := oracleR.OracleInfo.Config.MaxGossipMsgSize if messageCap == 0 { - logrus.Warn("MAX GOSSIP MSG SIZE NOT SET!!!!") messageCap = 65536 } return []*p2p.ChannelDescriptor{ @@ -168,12 +167,6 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { switch msg := e.Message.(type) { case *oracleproto.GossipVote: // verify sig of incoming gossip vote, throw if verification fails - // _, val := oracleR.OracleInfo.ValidatorSet.GetByAddress(msg.Validator) - // if val == nil { - // pubkey := ed25519.PubKey(msg.PublicKey) - // logrus.Infof("NOT A VALIDATOR: %s", pubkey.String()) - // return - // } signType := msg.SignType var pubKey crypto.PubKey diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 251ac36d323..82c4239fab1 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -13,7 +13,6 @@ import ( "github.com/cometbft/cometbft/oracle/service/parser" "github.com/cometbft/cometbft/oracle/service/types" - "github.com/cometbft/cometbft/oracle/service/utils" oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" "github.com/cometbft/cometbft/redis" ) @@ -266,21 +265,10 @@ func RunOracle(oracleInfo *types.OracleInfo, oracle types.Oracle, currentTime ui return errors.New("skipping submission for " + oracle.Id + " as result is empty") } - compressedId, err := utils.CompressString(oracle.Id) - if err != nil { - return errors.New("error compressing oracleId, skipping submission for " + oracle.Id) - } - - compressedData, err := utils.CompressString(resultData) - if err != nil { - return errors.New("error compressing resultData, skipping submission for " + oracle.Id) - } - - vote := oracleproto.CompressedVote{ - Validator: oracleInfo.PubKey.Address(), - OracleId: compressedId, + vote := oracleproto.Vote{ + OracleId: oracle.Id, Timestamp: normalizedTime, - Data: compressedData, + Data: resultData, } oracleInfo.SignVotesChan <- &vote @@ -306,7 +294,7 @@ func RunProcessSignVoteQueue(oracleInfo *types.OracleInfo) { } func ProcessSignVoteQueue(oracleInfo *types.OracleInfo) { - votes := []*oracleproto.CompressedVote{} + votes := []*oracleproto.Vote{} for { select { case vote := <-oracleInfo.SignVotesChan: @@ -333,7 +321,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo) { oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() // loop through unsignedVoteBuffer and combine all votes - var batchVotes = []*oracleproto.CompressedVote{} + var batchVotes = []*oracleproto.Vote{} oracleInfo.UnsignedVoteBuffer.UpdateMtx.RLock() for _, unsignedVotes := range oracleInfo.UnsignedVoteBuffer.Buffer { batchVotes = append(batchVotes, unsignedVotes.Votes...) @@ -342,7 +330,6 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo) { // batch sign the entire unsignedVoteBuffer and add to gossipBuffer newGossipVote := &oracleproto.GossipVote{ - Validator: oracleInfo.PubKey.Address(), PublicKey: oracleInfo.PubKey.Bytes(), SignType: oracleInfo.PubKey.Type(), Votes: batchVotes, diff --git a/oracle/service/types/info.go b/oracle/service/types/info.go index b6f68ebd8e9..6615f0b19e3 100644 --- a/oracle/service/types/info.go +++ b/oracle/service/types/info.go @@ -18,7 +18,7 @@ type OracleInfo struct { CustomNodeConfig CustomNodeConfig UnsignedVoteBuffer *UnsignedVoteBuffer GossipVoteBuffer *GossipVoteBuffer - SignVotesChan chan *oracleproto.CompressedVote + SignVotesChan chan *oracleproto.Vote PubKey crypto.PubKey PrivValidator types.PrivValidator StopChannel chan int @@ -27,7 +27,7 @@ type OracleInfo struct { type UnsignedVotes struct { Timestamp uint64 - Votes []*oracleproto.CompressedVote + Votes []*oracleproto.Vote } type GossipVoteBuffer struct { diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index 338b322640f..b649c47a18d 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -24,10 +24,9 @@ var _ = math.Inf const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type Vote struct { - Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` - OracleId string `protobuf:"bytes,2,opt,name=oracle_id,json=oracleId,proto3" json:"oracle_id,omitempty"` - Timestamp uint64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Data string `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` + OracleId string `protobuf:"bytes,1,opt,name=oracle_id,json=oracleId,proto3" json:"oracle_id,omitempty"` + Timestamp uint64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Data string `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` } func (m *Vote) Reset() { *m = Vote{} } @@ -63,13 +62,6 @@ func (m *Vote) XXX_DiscardUnknown() { var xxx_messageInfo_Vote proto.InternalMessageInfo -func (m *Vote) GetValidator() []byte { - if m != nil { - return m.Validator - } - return nil -} - func (m *Vote) GetOracleId() string { if m != nil { return m.OracleId @@ -91,88 +83,19 @@ func (m *Vote) GetData() string { return "" } -type CompressedVote struct { - Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` - OracleId []byte `protobuf:"bytes,2,opt,name=oracle_id,json=oracleId,proto3" json:"oracle_id,omitempty"` - Timestamp uint64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Data []byte `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` -} - -func (m *CompressedVote) Reset() { *m = CompressedVote{} } -func (m *CompressedVote) String() string { return proto.CompactTextString(m) } -func (*CompressedVote) ProtoMessage() {} -func (*CompressedVote) Descriptor() ([]byte, []int) { - return fileDescriptor_ed9227d272ed5d90, []int{1} -} -func (m *CompressedVote) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *CompressedVote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_CompressedVote.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *CompressedVote) XXX_Merge(src proto.Message) { - xxx_messageInfo_CompressedVote.Merge(m, src) -} -func (m *CompressedVote) XXX_Size() int { - return m.Size() -} -func (m *CompressedVote) XXX_DiscardUnknown() { - xxx_messageInfo_CompressedVote.DiscardUnknown(m) -} - -var xxx_messageInfo_CompressedVote proto.InternalMessageInfo - -func (m *CompressedVote) GetValidator() []byte { - if m != nil { - return m.Validator - } - return nil -} - -func (m *CompressedVote) GetOracleId() []byte { - if m != nil { - return m.OracleId - } - return nil -} - -func (m *CompressedVote) GetTimestamp() uint64 { - if m != nil { - return m.Timestamp - } - return 0 -} - -func (m *CompressedVote) GetData() []byte { - if m != nil { - return m.Data - } - return nil -} - type GossipVote struct { - Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` - PublicKey []byte `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` - SignType string `protobuf:"bytes,3,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` - Votes []*CompressedVote `protobuf:"bytes,4,rep,name=votes,proto3" json:"votes,omitempty"` - SignedTimestamp uint64 `protobuf:"varint,5,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` - Signature []byte `protobuf:"bytes,6,opt,name=signature,proto3" json:"signature,omitempty"` + PublicKey []byte `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` + SignType string `protobuf:"bytes,2,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` + Votes []*Vote `protobuf:"bytes,3,rep,name=votes,proto3" json:"votes,omitempty"` + SignedTimestamp uint64 `protobuf:"varint,4,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` + Signature []byte `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` } func (m *GossipVote) Reset() { *m = GossipVote{} } func (m *GossipVote) String() string { return proto.CompactTextString(m) } func (*GossipVote) ProtoMessage() {} func (*GossipVote) Descriptor() ([]byte, []int) { - return fileDescriptor_ed9227d272ed5d90, []int{2} + return fileDescriptor_ed9227d272ed5d90, []int{1} } func (m *GossipVote) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -201,13 +124,6 @@ func (m *GossipVote) XXX_DiscardUnknown() { var xxx_messageInfo_GossipVote proto.InternalMessageInfo -func (m *GossipVote) GetValidator() []byte { - if m != nil { - return m.Validator - } - return nil -} - func (m *GossipVote) GetPublicKey() []byte { if m != nil { return m.PublicKey @@ -222,7 +138,7 @@ func (m *GossipVote) GetSignType() string { return "" } -func (m *GossipVote) GetVotes() []*CompressedVote { +func (m *GossipVote) GetVotes() []*Vote { if m != nil { return m.Votes } @@ -244,17 +160,16 @@ func (m *GossipVote) GetSignature() []byte { } type CanonicalGossipVote struct { - Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` - PublicKey []byte `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` - SignType string `protobuf:"bytes,3,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` - Votes []*CompressedVote `protobuf:"bytes,4,rep,name=votes,proto3" json:"votes,omitempty"` + PublicKey []byte `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` + SignType string `protobuf:"bytes,2,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` + Votes []*Vote `protobuf:"bytes,3,rep,name=votes,proto3" json:"votes,omitempty"` } func (m *CanonicalGossipVote) Reset() { *m = CanonicalGossipVote{} } func (m *CanonicalGossipVote) String() string { return proto.CompactTextString(m) } func (*CanonicalGossipVote) ProtoMessage() {} func (*CanonicalGossipVote) Descriptor() ([]byte, []int) { - return fileDescriptor_ed9227d272ed5d90, []int{3} + return fileDescriptor_ed9227d272ed5d90, []int{2} } func (m *CanonicalGossipVote) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -283,13 +198,6 @@ func (m *CanonicalGossipVote) XXX_DiscardUnknown() { var xxx_messageInfo_CanonicalGossipVote proto.InternalMessageInfo -func (m *CanonicalGossipVote) GetValidator() []byte { - if m != nil { - return m.Validator - } - return nil -} - func (m *CanonicalGossipVote) GetPublicKey() []byte { if m != nil { return m.PublicKey @@ -304,7 +212,7 @@ func (m *CanonicalGossipVote) GetSignType() string { return "" } -func (m *CanonicalGossipVote) GetVotes() []*CompressedVote { +func (m *CanonicalGossipVote) GetVotes() []*Vote { if m != nil { return m.Votes } @@ -328,7 +236,7 @@ func (m *Oracle) Reset() { *m = Oracle{} } func (m *Oracle) String() string { return proto.CompactTextString(m) } func (*Oracle) ProtoMessage() {} func (*Oracle) Descriptor() ([]byte, []int) { - return fileDescriptor_ed9227d272ed5d90, []int{4} + return fileDescriptor_ed9227d272ed5d90, []int{3} } func (m *Oracle) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -437,7 +345,7 @@ func (m *Result) Reset() { *m = Result{} } func (m *Result) String() string { return proto.CompactTextString(m) } func (*Result) ProtoMessage() {} func (*Result) Descriptor() ([]byte, []int) { - return fileDescriptor_ed9227d272ed5d90, []int{5} + return fileDescriptor_ed9227d272ed5d90, []int{4} } func (m *Result) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -489,7 +397,6 @@ func (m *Result) GetData() string { func init() { proto.RegisterType((*Vote)(nil), "tendermint.oracle.Vote") - proto.RegisterType((*CompressedVote)(nil), "tendermint.oracle.CompressedVote") proto.RegisterType((*GossipVote)(nil), "tendermint.oracle.GossipVote") proto.RegisterType((*CanonicalGossipVote)(nil), "tendermint.oracle.CanonicalGossipVote") proto.RegisterType((*Oracle)(nil), "tendermint.oracle.Oracle") @@ -499,45 +406,42 @@ func init() { func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 594 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x54, 0xbd, 0x6e, 0xd4, 0x4c, - 0x14, 0x8d, 0x37, 0x9b, 0x4d, 0x7c, 0xb3, 0xd9, 0x7c, 0xdf, 0x10, 0x45, 0x16, 0x24, 0xce, 0xc6, - 0x20, 0xb1, 0x34, 0xbb, 0x08, 0x22, 0x21, 0xd1, 0x91, 0x14, 0x08, 0x21, 0x01, 0x32, 0x11, 0x05, - 0x8d, 0x35, 0x6b, 0x5f, 0xcc, 0x88, 0xb5, 0xc7, 0x9a, 0xb9, 0x8e, 0xb2, 0x05, 0xaf, 0x80, 0x78, - 0x0c, 0x1e, 0x05, 0x51, 0xa5, 0xa4, 0x8a, 0x50, 0xd2, 0x50, 0xe7, 0x09, 0x90, 0x67, 0x1c, 0xef, - 0x42, 0x1a, 0x94, 0x8a, 0xee, 0xfa, 0x9c, 0x33, 0x73, 0x7f, 0x7c, 0xcf, 0xc0, 0x36, 0x61, 0x9e, - 0xa0, 0xca, 0x44, 0x4e, 0x23, 0xa9, 0x78, 0x3c, 0xc1, 0x11, 0x4d, 0x0b, 0xd4, 0xc3, 0x42, 0x49, - 0x92, 0xec, 0xff, 0x19, 0x3d, 0xb4, 0xf4, 0xcd, 0x8d, 0x54, 0xa6, 0xd2, 0xb0, 0xa3, 0x2a, 0xb2, - 0xc2, 0x40, 0x43, 0xfb, 0x8d, 0x24, 0x64, 0x5b, 0xe0, 0x1e, 0xf1, 0x89, 0x48, 0x38, 0x49, 0xe5, - 0x39, 0x7d, 0x67, 0xd0, 0x0d, 0x67, 0x00, 0xbb, 0x05, 0xae, 0xbd, 0x25, 0x12, 0x89, 0xd7, 0xea, - 0x3b, 0x03, 0x37, 0x5c, 0xb1, 0xc0, 0xb3, 0xa4, 0x3a, 0x4a, 0x22, 0x43, 0x4d, 0x3c, 0x2b, 0xbc, - 0xc5, 0xbe, 0x33, 0x68, 0x87, 0x33, 0x80, 0x31, 0x68, 0x27, 0x9c, 0xb8, 0xd7, 0x36, 0xa7, 0x4c, - 0x1c, 0x7c, 0x84, 0xde, 0x81, 0xcc, 0x0a, 0x85, 0x5a, 0x63, 0x72, 0x9d, 0xf4, 0xdd, 0x6b, 0xa5, - 0xef, 0xd6, 0xe9, 0x7f, 0x3a, 0x00, 0x4f, 0xa5, 0xd6, 0xa2, 0xf8, 0x8b, 0xdc, 0xdb, 0x00, 0x45, - 0x39, 0x9e, 0x88, 0x38, 0xfa, 0x80, 0xd3, 0x3a, 0xb9, 0x6b, 0x91, 0xe7, 0x38, 0xad, 0x4a, 0xd3, - 0x22, 0xcd, 0xa3, 0x6a, 0xf8, 0x26, 0xbb, 0x1b, 0xae, 0x54, 0xc0, 0xe1, 0xb4, 0x40, 0xf6, 0x08, - 0x96, 0x8e, 0x24, 0xa1, 0xf6, 0xda, 0xfd, 0xc5, 0xc1, 0xea, 0x83, 0xdd, 0xe1, 0x95, 0xbf, 0x32, - 0xfc, 0x7d, 0x0e, 0xa1, 0xd5, 0xb3, 0x7b, 0xf0, 0x5f, 0x75, 0x09, 0x26, 0xd1, 0xac, 0xb5, 0x25, - 0xd3, 0xda, 0xba, 0xc5, 0x0f, 0x9b, 0x06, 0xb7, 0x6c, 0x01, 0x9c, 0x4a, 0x85, 0x5e, 0xc7, 0x96, - 0xd7, 0x00, 0xc1, 0x17, 0x07, 0x6e, 0x1c, 0xf0, 0x5c, 0xe6, 0x22, 0xe6, 0x93, 0x7f, 0xba, 0xe7, - 0xe0, 0x5b, 0x0b, 0x3a, 0x2f, 0x8d, 0x80, 0x79, 0xb0, 0x1c, 0x2b, 0x6c, 0x6a, 0x73, 0xc3, 0xcb, - 0x4f, 0xd6, 0x83, 0x56, 0xb3, 0x81, 0x2d, 0x91, 0xb0, 0x3e, 0xac, 0x26, 0xa8, 0x63, 0x25, 0x0a, - 0x12, 0x32, 0xaf, 0x8b, 0x99, 0x87, 0xd8, 0x26, 0x74, 0x34, 0x71, 0x2a, 0x75, 0xbd, 0x81, 0xf5, - 0x17, 0xdb, 0x83, 0xcd, 0x4c, 0xe4, 0x11, 0x95, 0x2a, 0x97, 0x25, 0x45, 0x05, 0xaa, 0x18, 0x73, - 0xe2, 0x29, 0x9a, 0x41, 0xbb, 0xe1, 0x46, 0x26, 0xf2, 0x43, 0x4b, 0xbe, 0x6a, 0x38, 0x76, 0x07, - 0x7a, 0x19, 0x3f, 0x8e, 0x14, 0xea, 0x72, 0x42, 0x51, 0xa5, 0xee, 0x18, 0x75, 0x37, 0xe3, 0xc7, - 0xa1, 0x01, 0x9f, 0xa4, 0xc8, 0x6e, 0xc3, 0x9a, 0xc6, 0xb8, 0x54, 0x82, 0xa6, 0x76, 0x48, 0xcb, - 0x56, 0x74, 0x09, 0x9a, 0x41, 0xdd, 0x85, 0xf5, 0xfa, 0x1a, 0x4d, 0x8a, 0x13, 0xa6, 0x53, 0x6f, - 0xc5, 0xc8, 0x7a, 0x16, 0x7e, 0x5d, 0xa3, 0xcc, 0x07, 0x50, 0xa8, 0xe5, 0xa4, 0x34, 0x2d, 0xba, - 0x46, 0x33, 0x87, 0x54, 0x2b, 0xae, 0x0b, 0x8c, 0x3d, 0xb0, 0x0e, 0xab, 0xe2, 0xe0, 0x93, 0x03, - 0x1d, 0x5b, 0x0f, 0x1b, 0xcd, 0x9b, 0xc7, 0x8c, 0x73, 0x9f, 0x5d, 0x9c, 0xee, 0xf4, 0x92, 0xf1, - 0xe3, 0xa0, 0x21, 0x82, 0x39, 0x43, 0xdd, 0xff, 0xd3, 0x50, 0x8b, 0xb3, 0x03, 0x0d, 0x11, 0xcc, - 0x9b, 0x6c, 0x77, 0xde, 0xe3, 0xfb, 0x6b, 0x17, 0xa7, 0x3b, 0x6e, 0x25, 0x36, 0x66, 0xb3, 0x9e, - 0xdb, 0x7f, 0xf1, 0xf5, 0xcc, 0x77, 0x4e, 0xce, 0x7c, 0xe7, 0xc7, 0x99, 0xef, 0x7c, 0x3e, 0xf7, - 0x17, 0x4e, 0xce, 0xfd, 0x85, 0xef, 0xe7, 0xfe, 0xc2, 0xdb, 0xbd, 0x54, 0xd0, 0xfb, 0x72, 0x3c, - 0x8c, 0x65, 0x36, 0x8a, 0x65, 0x86, 0x34, 0x7e, 0x47, 0xb3, 0xc0, 0x3e, 0x58, 0x57, 0x1e, 0xbb, - 0x71, 0xc7, 0x10, 0x0f, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0x91, 0x24, 0x69, 0x96, 0x08, 0x05, - 0x00, 0x00, + // 557 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x53, 0x4d, 0x6e, 0xd3, 0x40, + 0x14, 0xae, 0x93, 0x34, 0xad, 0x5f, 0xdb, 0x14, 0x86, 0xaa, 0x58, 0xd0, 0xba, 0xc1, 0x20, 0x51, + 0x16, 0x24, 0x08, 0xba, 0x62, 0x47, 0x59, 0x20, 0x84, 0x04, 0xc8, 0x04, 0x16, 0x6c, 0xac, 0x89, + 0xfd, 0x30, 0x23, 0x62, 0x8f, 0x35, 0xf3, 0x8c, 0xea, 0x1d, 0x27, 0x40, 0x1c, 0x89, 0x25, 0x62, + 0xd5, 0x25, 0xab, 0x0a, 0x25, 0x37, 0xe8, 0x09, 0x90, 0x67, 0xdc, 0x24, 0x52, 0x0e, 0xc0, 0xee, + 0xcd, 0xf7, 0x7d, 0xf3, 0xfe, 0x66, 0x3e, 0x38, 0x24, 0xcc, 0x13, 0x54, 0x99, 0xc8, 0x69, 0x28, + 0x15, 0x8f, 0x27, 0x38, 0xa4, 0xaa, 0x40, 0x3d, 0x28, 0x94, 0x24, 0xc9, 0xae, 0x2f, 0xe8, 0x81, + 0xa5, 0x6f, 0xed, 0xa5, 0x32, 0x95, 0x86, 0x1d, 0xd6, 0x91, 0x15, 0x06, 0xef, 0xa1, 0xf3, 0x41, + 0x12, 0xb2, 0xdb, 0xe0, 0x5a, 0x5d, 0x24, 0x12, 0xcf, 0xe9, 0x3b, 0xc7, 0x6e, 0xb8, 0x69, 0x81, + 0x97, 0x09, 0x3b, 0x00, 0x97, 0x44, 0x86, 0x9a, 0x78, 0x56, 0x78, 0xad, 0xbe, 0x73, 0xdc, 0x09, + 0x17, 0x00, 0x63, 0xd0, 0x49, 0x38, 0x71, 0xaf, 0x6d, 0x6e, 0x99, 0x38, 0xf8, 0xe9, 0x00, 0xbc, + 0x90, 0x5a, 0x8b, 0xc2, 0x64, 0x3f, 0x04, 0x28, 0xca, 0xf1, 0x44, 0xc4, 0xd1, 0x17, 0xac, 0x4c, + 0xfa, 0xed, 0xd0, 0xb5, 0xc8, 0x2b, 0xac, 0xea, 0xe2, 0x5a, 0xa4, 0x79, 0x54, 0x4f, 0x60, 0xf2, + 0xbb, 0xe1, 0x66, 0x0d, 0x8c, 0xaa, 0x02, 0xd9, 0x43, 0x58, 0xff, 0x2a, 0x09, 0xb5, 0xd7, 0xee, + 0xb7, 0x8f, 0xb7, 0x1e, 0xdf, 0x1c, 0xac, 0x8c, 0x36, 0xa8, 0x6b, 0x84, 0x56, 0xc5, 0x1e, 0xc0, + 0xb5, 0xfa, 0x2a, 0x26, 0xd1, 0xa2, 0xe5, 0x8e, 0x69, 0x79, 0xd7, 0xe2, 0xa3, 0x79, 0xe3, 0x07, + 0xb6, 0x2c, 0xa7, 0x52, 0xa1, 0xb7, 0x6e, 0x9b, 0x9a, 0x03, 0xc1, 0x37, 0x07, 0x6e, 0x3c, 0xe7, + 0xb9, 0xcc, 0x45, 0xcc, 0x27, 0xff, 0x65, 0x96, 0xe0, 0x77, 0x0b, 0xba, 0x6f, 0x0c, 0xcc, 0x3c, + 0xd8, 0x88, 0x15, 0x72, 0x92, 0xaa, 0x79, 0x9d, 0xab, 0x23, 0xeb, 0x41, 0x4b, 0x24, 0x4d, 0xa5, + 0x96, 0x48, 0x58, 0x1f, 0xb6, 0x12, 0xd4, 0xb1, 0x12, 0x05, 0x09, 0x99, 0x37, 0xaf, 0xb2, 0x0c, + 0xb1, 0x7d, 0xe8, 0x6a, 0xe2, 0x54, 0x6a, 0xb3, 0x18, 0x37, 0x6c, 0x4e, 0xec, 0x04, 0xf6, 0x33, + 0x91, 0x47, 0x54, 0xaa, 0x5c, 0x96, 0x14, 0x15, 0xa8, 0x62, 0xcc, 0x89, 0xa7, 0x76, 0x39, 0x6e, + 0xb8, 0x97, 0x89, 0x7c, 0x64, 0xc9, 0xb7, 0x73, 0x8e, 0xdd, 0x83, 0x5e, 0xc6, 0xcf, 0x22, 0x85, + 0xba, 0x9c, 0x50, 0x54, 0xab, 0xbb, 0x46, 0xbd, 0x9d, 0xf1, 0xb3, 0xd0, 0x80, 0xcf, 0x52, 0x64, + 0x77, 0x61, 0x47, 0x63, 0x5c, 0x2a, 0x41, 0x95, 0x5d, 0xcd, 0x86, 0x15, 0x5d, 0x81, 0x66, 0x3d, + 0xf7, 0x61, 0xb7, 0x49, 0xa3, 0x49, 0x71, 0xc2, 0xb4, 0xf2, 0x36, 0x8d, 0xac, 0x67, 0xe1, 0x77, + 0x0d, 0xca, 0x7c, 0x00, 0x85, 0x5a, 0x4e, 0x4a, 0x33, 0xa2, 0x6b, 0x34, 0x4b, 0x48, 0xfd, 0x25, + 0x75, 0x81, 0xb1, 0x07, 0xf6, 0x4b, 0xd6, 0x71, 0xf0, 0xdd, 0x81, 0xae, 0xed, 0x87, 0x0d, 0x57, + 0x3e, 0xfb, 0x29, 0xbb, 0xbc, 0x38, 0xea, 0x25, 0xe3, 0xa7, 0xc1, 0x9c, 0x08, 0x96, 0x0c, 0xf0, + 0x68, 0xd9, 0x00, 0xf5, 0x46, 0xdb, 0x8b, 0x0b, 0x73, 0x22, 0x58, 0x36, 0xc5, 0x9d, 0xc6, 0x14, + 0x66, 0xc3, 0xa7, 0x3b, 0x97, 0x17, 0x47, 0x6e, 0x2d, 0x36, 0xe6, 0xb0, 0x1e, 0x39, 0x7d, 0xfd, + 0x6b, 0xea, 0x3b, 0xe7, 0x53, 0xdf, 0xf9, 0x3b, 0xf5, 0x9d, 0x1f, 0x33, 0x7f, 0xed, 0x7c, 0xe6, + 0xaf, 0xfd, 0x99, 0xf9, 0x6b, 0x1f, 0x4f, 0x52, 0x41, 0x9f, 0xcb, 0xf1, 0x20, 0x96, 0xd9, 0x30, + 0x96, 0x19, 0xd2, 0xf8, 0x13, 0x2d, 0x02, 0xeb, 0xe1, 0x15, 0xff, 0x8f, 0xbb, 0x86, 0x78, 0xf2, + 0x2f, 0x00, 0x00, 0xff, 0xff, 0xe2, 0x68, 0x5f, 0xa4, 0x1b, 0x04, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -565,74 +469,18 @@ func (m *Vote) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.Data) i = encodeVarintTypes(dAtA, i, uint64(len(m.Data))) i-- - dAtA[i] = 0x22 - } - if m.Timestamp != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Timestamp)) - i-- - dAtA[i] = 0x18 - } - if len(m.OracleId) > 0 { - i -= len(m.OracleId) - copy(dAtA[i:], m.OracleId) - i = encodeVarintTypes(dAtA, i, uint64(len(m.OracleId))) - i-- - dAtA[i] = 0x12 - } - if len(m.Validator) > 0 { - i -= len(m.Validator) - copy(dAtA[i:], m.Validator) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Validator))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *CompressedVote) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *CompressedVote) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CompressedVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Data) > 0 { - i -= len(m.Data) - copy(dAtA[i:], m.Data) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Data))) - i-- - dAtA[i] = 0x22 + dAtA[i] = 0x1a } if m.Timestamp != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.Timestamp)) i-- - dAtA[i] = 0x18 + dAtA[i] = 0x10 } if len(m.OracleId) > 0 { i -= len(m.OracleId) copy(dAtA[i:], m.OracleId) i = encodeVarintTypes(dAtA, i, uint64(len(m.OracleId))) i-- - dAtA[i] = 0x12 - } - if len(m.Validator) > 0 { - i -= len(m.Validator) - copy(dAtA[i:], m.Validator) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Validator))) - i-- dAtA[i] = 0xa } return len(dAtA) - i, nil @@ -663,12 +511,12 @@ func (m *GossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.Signature) i = encodeVarintTypes(dAtA, i, uint64(len(m.Signature))) i-- - dAtA[i] = 0x32 + dAtA[i] = 0x2a } if m.SignedTimestamp != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.SignedTimestamp)) i-- - dAtA[i] = 0x28 + dAtA[i] = 0x20 } if len(m.Votes) > 0 { for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { @@ -681,7 +529,7 @@ func (m *GossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x22 + dAtA[i] = 0x1a } } if len(m.SignType) > 0 { @@ -689,20 +537,13 @@ func (m *GossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.SignType) i = encodeVarintTypes(dAtA, i, uint64(len(m.SignType))) i-- - dAtA[i] = 0x1a + dAtA[i] = 0x12 } if len(m.PublicKey) > 0 { i -= len(m.PublicKey) copy(dAtA[i:], m.PublicKey) i = encodeVarintTypes(dAtA, i, uint64(len(m.PublicKey))) i-- - dAtA[i] = 0x12 - } - if len(m.Validator) > 0 { - i -= len(m.Validator) - copy(dAtA[i:], m.Validator) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Validator))) - i-- dAtA[i] = 0xa } return len(dAtA) - i, nil @@ -739,7 +580,7 @@ func (m *CanonicalGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x22 + dAtA[i] = 0x1a } } if len(m.SignType) > 0 { @@ -747,20 +588,13 @@ func (m *CanonicalGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.SignType) i = encodeVarintTypes(dAtA, i, uint64(len(m.SignType))) i-- - dAtA[i] = 0x1a + dAtA[i] = 0x12 } if len(m.PublicKey) > 0 { i -= len(m.PublicKey) copy(dAtA[i:], m.PublicKey) i = encodeVarintTypes(dAtA, i, uint64(len(m.PublicKey))) i-- - dAtA[i] = 0x12 - } - if len(m.Validator) > 0 { - i -= len(m.Validator) - copy(dAtA[i:], m.Validator) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Validator))) - i-- dAtA[i] = 0xa } return len(dAtA) - i, nil @@ -918,34 +752,6 @@ func (m *Vote) Size() (n int) { } var l int _ = l - l = len(m.Validator) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.OracleId) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - if m.Timestamp != 0 { - n += 1 + sovTypes(uint64(m.Timestamp)) - } - l = len(m.Data) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *CompressedVote) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Validator) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } l = len(m.OracleId) if l > 0 { n += 1 + l + sovTypes(uint64(l)) @@ -966,10 +772,6 @@ func (m *GossipVote) Size() (n int) { } var l int _ = l - l = len(m.Validator) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } l = len(m.PublicKey) if l > 0 { n += 1 + l + sovTypes(uint64(l)) @@ -1000,10 +802,6 @@ func (m *CanonicalGossipVote) Size() (n int) { } var l int _ = l - l = len(m.Validator) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } l = len(m.PublicKey) if l > 0 { n += 1 + l + sovTypes(uint64(l)) @@ -1126,40 +924,6 @@ func (m *Vote) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) - if m.Validator == nil { - m.Validator = []byte{} - } - iNdEx = postIndex - case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field OracleId", wireType) } @@ -1191,7 +955,7 @@ func (m *Vote) Unmarshal(dAtA []byte) error { } m.OracleId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 2: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) } @@ -1210,7 +974,7 @@ func (m *Vote) Unmarshal(dAtA []byte) error { break } } - case 4: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) } @@ -1263,177 +1027,6 @@ func (m *Vote) Unmarshal(dAtA []byte) error { } return nil } -func (m *CompressedVote) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: CompressedVote: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CompressedVote: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) - if m.Validator == nil { - m.Validator = []byte{} - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OracleId", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.OracleId = append(m.OracleId[:0], dAtA[iNdEx:postIndex]...) - if m.OracleId == nil { - m.OracleId = []byte{} - } - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) - } - m.Timestamp = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Timestamp |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) - if m.Data == nil { - m.Data = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *GossipVote) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -1464,40 +1057,6 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) - if m.Validator == nil { - m.Validator = []byte{} - } - iNdEx = postIndex - case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field PublicKey", wireType) } @@ -1531,7 +1090,7 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { m.PublicKey = []byte{} } iNdEx = postIndex - case 3: + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field SignType", wireType) } @@ -1563,7 +1122,7 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { } m.SignType = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) } @@ -1592,12 +1151,12 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Votes = append(m.Votes, &CompressedVote{}) + m.Votes = append(m.Votes, &Vote{}) if err := m.Votes[len(m.Votes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 5: + case 4: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field SignedTimestamp", wireType) } @@ -1616,7 +1175,7 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { break } } - case 6: + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) } @@ -1701,40 +1260,6 @@ func (m *CanonicalGossipVote) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) - if m.Validator == nil { - m.Validator = []byte{} - } - iNdEx = postIndex - case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field PublicKey", wireType) } @@ -1768,7 +1293,7 @@ func (m *CanonicalGossipVote) Unmarshal(dAtA []byte) error { m.PublicKey = []byte{} } iNdEx = postIndex - case 3: + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field SignType", wireType) } @@ -1800,7 +1325,7 @@ func (m *CanonicalGossipVote) Unmarshal(dAtA []byte) error { } m.SignType = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) } @@ -1829,7 +1354,7 @@ func (m *CanonicalGossipVote) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Votes = append(m.Votes, &CompressedVote{}) + m.Votes = append(m.Votes, &Vote{}) if err := m.Votes[len(m.Votes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index 48314b96c3b..6ef266db97c 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -6,33 +6,23 @@ option go_package = "github.com/cometbft/cometbft/proto/tendermint/oracle"; import "gogoproto/gogo.proto"; message Vote { - bytes validator = 1; - string oracle_id = 2; - uint64 timestamp = 3; - string data = 4; -} - -message CompressedVote { - bytes validator = 1; - bytes oracle_id = 2; - uint64 timestamp = 3; - bytes data = 4; + string oracle_id = 1; + uint64 timestamp = 2; + string data = 3; } message GossipVote { - bytes validator = 1; - bytes public_key = 2; - string sign_type = 3; - repeated CompressedVote votes = 4; - uint64 signed_timestamp = 5; - bytes signature = 6; + bytes public_key = 1; + string sign_type = 2; + repeated Vote votes = 3; + uint64 signed_timestamp = 4; + bytes signature = 5; } message CanonicalGossipVote { - bytes validator = 1; - bytes public_key = 2; - string sign_type = 3; - repeated CompressedVote votes = 4; + bytes public_key = 1; + string sign_type = 2; + repeated Vote votes = 3; } message Oracle { diff --git a/types/oracle.go b/types/oracle.go index 35da9e321b9..6cf4532a1a3 100644 --- a/types/oracle.go +++ b/types/oracle.go @@ -17,7 +17,6 @@ func OracleVoteSignBytes(vote *oracleproto.GossipVote) []byte { func CanonicalizeOracleVote(vote *oracleproto.GossipVote) oracleproto.CanonicalGossipVote { return oracleproto.CanonicalGossipVote{ - Validator: vote.Validator, PublicKey: vote.PublicKey, SignType: vote.SignType, Votes: vote.Votes, From 4315a359bca25b58c41a10a38664cb48a8d7e935 Mon Sep 17 00:00:00 2001 From: Yan Date: Wed, 13 Mar 2024 15:16:25 +0800 Subject: [PATCH 031/150] add back validator field to oracle vote --- proto/tendermint/oracle/types.pb.go | 140 +++++++++++++++++++--------- proto/tendermint/oracle/types.proto | 7 +- 2 files changed, 101 insertions(+), 46 deletions(-) diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index b649c47a18d..9a38f6661cc 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -24,9 +24,10 @@ var _ = math.Inf const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type Vote struct { - OracleId string `protobuf:"bytes,1,opt,name=oracle_id,json=oracleId,proto3" json:"oracle_id,omitempty"` - Timestamp uint64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Data string `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` + Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` + OracleId string `protobuf:"bytes,2,opt,name=oracle_id,json=oracleId,proto3" json:"oracle_id,omitempty"` + Timestamp uint64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Data string `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` } func (m *Vote) Reset() { *m = Vote{} } @@ -62,6 +63,13 @@ func (m *Vote) XXX_DiscardUnknown() { var xxx_messageInfo_Vote proto.InternalMessageInfo +func (m *Vote) GetValidator() []byte { + if m != nil { + return m.Validator + } + return nil +} + func (m *Vote) GetOracleId() string { if m != nil { return m.OracleId @@ -406,42 +414,43 @@ func init() { func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 557 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x53, 0x4d, 0x6e, 0xd3, 0x40, - 0x14, 0xae, 0x93, 0x34, 0xad, 0x5f, 0xdb, 0x14, 0x86, 0xaa, 0x58, 0xd0, 0xba, 0xc1, 0x20, 0x51, - 0x16, 0x24, 0x08, 0xba, 0x62, 0x47, 0x59, 0x20, 0x84, 0x04, 0xc8, 0x04, 0x16, 0x6c, 0xac, 0x89, - 0xfd, 0x30, 0x23, 0x62, 0x8f, 0x35, 0xf3, 0x8c, 0xea, 0x1d, 0x27, 0x40, 0x1c, 0x89, 0x25, 0x62, - 0xd5, 0x25, 0xab, 0x0a, 0x25, 0x37, 0xe8, 0x09, 0x90, 0x67, 0xdc, 0x24, 0x52, 0x0e, 0xc0, 0xee, - 0xcd, 0xf7, 0x7d, 0xf3, 0xfe, 0x66, 0x3e, 0x38, 0x24, 0xcc, 0x13, 0x54, 0x99, 0xc8, 0x69, 0x28, - 0x15, 0x8f, 0x27, 0x38, 0xa4, 0xaa, 0x40, 0x3d, 0x28, 0x94, 0x24, 0xc9, 0xae, 0x2f, 0xe8, 0x81, - 0xa5, 0x6f, 0xed, 0xa5, 0x32, 0x95, 0x86, 0x1d, 0xd6, 0x91, 0x15, 0x06, 0xef, 0xa1, 0xf3, 0x41, - 0x12, 0xb2, 0xdb, 0xe0, 0x5a, 0x5d, 0x24, 0x12, 0xcf, 0xe9, 0x3b, 0xc7, 0x6e, 0xb8, 0x69, 0x81, - 0x97, 0x09, 0x3b, 0x00, 0x97, 0x44, 0x86, 0x9a, 0x78, 0x56, 0x78, 0xad, 0xbe, 0x73, 0xdc, 0x09, - 0x17, 0x00, 0x63, 0xd0, 0x49, 0x38, 0x71, 0xaf, 0x6d, 0x6e, 0x99, 0x38, 0xf8, 0xe9, 0x00, 0xbc, - 0x90, 0x5a, 0x8b, 0xc2, 0x64, 0x3f, 0x04, 0x28, 0xca, 0xf1, 0x44, 0xc4, 0xd1, 0x17, 0xac, 0x4c, - 0xfa, 0xed, 0xd0, 0xb5, 0xc8, 0x2b, 0xac, 0xea, 0xe2, 0x5a, 0xa4, 0x79, 0x54, 0x4f, 0x60, 0xf2, - 0xbb, 0xe1, 0x66, 0x0d, 0x8c, 0xaa, 0x02, 0xd9, 0x43, 0x58, 0xff, 0x2a, 0x09, 0xb5, 0xd7, 0xee, - 0xb7, 0x8f, 0xb7, 0x1e, 0xdf, 0x1c, 0xac, 0x8c, 0x36, 0xa8, 0x6b, 0x84, 0x56, 0xc5, 0x1e, 0xc0, - 0xb5, 0xfa, 0x2a, 0x26, 0xd1, 0xa2, 0xe5, 0x8e, 0x69, 0x79, 0xd7, 0xe2, 0xa3, 0x79, 0xe3, 0x07, - 0xb6, 0x2c, 0xa7, 0x52, 0xa1, 0xb7, 0x6e, 0x9b, 0x9a, 0x03, 0xc1, 0x37, 0x07, 0x6e, 0x3c, 0xe7, - 0xb9, 0xcc, 0x45, 0xcc, 0x27, 0xff, 0x65, 0x96, 0xe0, 0x77, 0x0b, 0xba, 0x6f, 0x0c, 0xcc, 0x3c, - 0xd8, 0x88, 0x15, 0x72, 0x92, 0xaa, 0x79, 0x9d, 0xab, 0x23, 0xeb, 0x41, 0x4b, 0x24, 0x4d, 0xa5, - 0x96, 0x48, 0x58, 0x1f, 0xb6, 0x12, 0xd4, 0xb1, 0x12, 0x05, 0x09, 0x99, 0x37, 0xaf, 0xb2, 0x0c, - 0xb1, 0x7d, 0xe8, 0x6a, 0xe2, 0x54, 0x6a, 0xb3, 0x18, 0x37, 0x6c, 0x4e, 0xec, 0x04, 0xf6, 0x33, - 0x91, 0x47, 0x54, 0xaa, 0x5c, 0x96, 0x14, 0x15, 0xa8, 0x62, 0xcc, 0x89, 0xa7, 0x76, 0x39, 0x6e, - 0xb8, 0x97, 0x89, 0x7c, 0x64, 0xc9, 0xb7, 0x73, 0x8e, 0xdd, 0x83, 0x5e, 0xc6, 0xcf, 0x22, 0x85, - 0xba, 0x9c, 0x50, 0x54, 0xab, 0xbb, 0x46, 0xbd, 0x9d, 0xf1, 0xb3, 0xd0, 0x80, 0xcf, 0x52, 0x64, - 0x77, 0x61, 0x47, 0x63, 0x5c, 0x2a, 0x41, 0x95, 0x5d, 0xcd, 0x86, 0x15, 0x5d, 0x81, 0x66, 0x3d, - 0xf7, 0x61, 0xb7, 0x49, 0xa3, 0x49, 0x71, 0xc2, 0xb4, 0xf2, 0x36, 0x8d, 0xac, 0x67, 0xe1, 0x77, - 0x0d, 0xca, 0x7c, 0x00, 0x85, 0x5a, 0x4e, 0x4a, 0x33, 0xa2, 0x6b, 0x34, 0x4b, 0x48, 0xfd, 0x25, - 0x75, 0x81, 0xb1, 0x07, 0xf6, 0x4b, 0xd6, 0x71, 0xf0, 0xdd, 0x81, 0xae, 0xed, 0x87, 0x0d, 0x57, - 0x3e, 0xfb, 0x29, 0xbb, 0xbc, 0x38, 0xea, 0x25, 0xe3, 0xa7, 0xc1, 0x9c, 0x08, 0x96, 0x0c, 0xf0, - 0x68, 0xd9, 0x00, 0xf5, 0x46, 0xdb, 0x8b, 0x0b, 0x73, 0x22, 0x58, 0x36, 0xc5, 0x9d, 0xc6, 0x14, - 0x66, 0xc3, 0xa7, 0x3b, 0x97, 0x17, 0x47, 0x6e, 0x2d, 0x36, 0xe6, 0xb0, 0x1e, 0x39, 0x7d, 0xfd, - 0x6b, 0xea, 0x3b, 0xe7, 0x53, 0xdf, 0xf9, 0x3b, 0xf5, 0x9d, 0x1f, 0x33, 0x7f, 0xed, 0x7c, 0xe6, - 0xaf, 0xfd, 0x99, 0xf9, 0x6b, 0x1f, 0x4f, 0x52, 0x41, 0x9f, 0xcb, 0xf1, 0x20, 0x96, 0xd9, 0x30, - 0x96, 0x19, 0xd2, 0xf8, 0x13, 0x2d, 0x02, 0xeb, 0xe1, 0x15, 0xff, 0x8f, 0xbb, 0x86, 0x78, 0xf2, - 0x2f, 0x00, 0x00, 0xff, 0xff, 0xe2, 0x68, 0x5f, 0xa4, 0x1b, 0x04, 0x00, 0x00, + // 567 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x54, 0xcd, 0x6e, 0xd3, 0x4c, + 0x14, 0xad, 0x93, 0x34, 0xad, 0x6f, 0xdb, 0xf4, 0xfb, 0x86, 0xaa, 0x58, 0xd0, 0xba, 0xc1, 0x20, + 0x11, 0x16, 0x24, 0x08, 0xba, 0x62, 0x47, 0x58, 0x20, 0x84, 0x04, 0xc8, 0x44, 0x2c, 0xd8, 0x58, + 0x13, 0x7b, 0x30, 0x23, 0x6c, 0x8f, 0x35, 0x73, 0x5d, 0xd5, 0x3b, 0x9e, 0x00, 0xf1, 0x48, 0x2c, + 0x11, 0xab, 0x2e, 0x59, 0x55, 0x28, 0x79, 0x83, 0x3e, 0x01, 0xf2, 0x4c, 0x62, 0x5b, 0xf4, 0x01, + 0xd8, 0x8d, 0xcf, 0x39, 0x77, 0xee, 0xdf, 0x1c, 0xc3, 0x31, 0xb2, 0x2c, 0x62, 0x32, 0xe5, 0x19, + 0x4e, 0x84, 0xa4, 0x61, 0xc2, 0x26, 0x58, 0xe6, 0x4c, 0x8d, 0x73, 0x29, 0x50, 0x90, 0xff, 0x1b, + 0x7a, 0x6c, 0xe8, 0x5b, 0x07, 0xb1, 0x88, 0x85, 0x66, 0x27, 0xd5, 0xc9, 0x08, 0x3d, 0x05, 0xbd, + 0xf7, 0x02, 0x19, 0x39, 0x02, 0xfb, 0x8c, 0x26, 0x3c, 0xa2, 0x28, 0xa4, 0x63, 0x0d, 0xad, 0xd1, + 0xae, 0xdf, 0x00, 0xe4, 0x36, 0xd8, 0xe6, 0x96, 0x80, 0x47, 0x4e, 0x67, 0x68, 0x8d, 0x6c, 0x7f, + 0xdb, 0x00, 0x2f, 0xa3, 0x2a, 0x14, 0x79, 0xca, 0x14, 0xd2, 0x34, 0x77, 0xba, 0x43, 0x6b, 0xd4, + 0xf3, 0x1b, 0x80, 0x10, 0xe8, 0x45, 0x14, 0xa9, 0xd3, 0xd3, 0x51, 0xfa, 0xec, 0x7d, 0xb7, 0x00, + 0x5e, 0x08, 0xa5, 0x78, 0xae, 0x73, 0x1f, 0x03, 0xe4, 0xc5, 0x3c, 0xe1, 0x61, 0xf0, 0x99, 0x95, + 0xeb, 0xe4, 0x06, 0x79, 0xc5, 0xca, 0x2a, 0xb9, 0xe2, 0x71, 0x16, 0x54, 0xfd, 0xad, 0x93, 0x57, + 0xc0, 0xac, 0xcc, 0x19, 0x79, 0x08, 0x9b, 0x67, 0x02, 0x99, 0x72, 0xba, 0xc3, 0xee, 0x68, 0xe7, + 0xf1, 0xcd, 0xf1, 0xb5, 0xc6, 0xc7, 0x55, 0x0e, 0xdf, 0xa8, 0xc8, 0x03, 0xf8, 0xaf, 0x0a, 0x65, + 0x51, 0xd0, 0x94, 0xdc, 0xd3, 0x25, 0xef, 0x1b, 0x7c, 0x56, 0x17, 0x7e, 0x64, 0xd2, 0x52, 0x2c, + 0x24, 0x73, 0x36, 0x4d, 0x51, 0x35, 0xe0, 0x7d, 0xb1, 0xe0, 0xc6, 0x73, 0x9a, 0x89, 0x8c, 0x87, + 0x34, 0xf9, 0x27, 0xbd, 0x78, 0x3f, 0x3b, 0xd0, 0x7f, 0xa3, 0x61, 0xe2, 0xc0, 0x56, 0x28, 0x59, + 0xbd, 0x3b, 0xdb, 0x5f, 0x7f, 0x92, 0x01, 0x74, 0xea, 0x95, 0x75, 0x78, 0x44, 0x86, 0xb0, 0x13, + 0x31, 0x15, 0x4a, 0x9e, 0x23, 0x17, 0x99, 0x5e, 0x97, 0xed, 0xb7, 0x21, 0x72, 0x08, 0x7d, 0x85, + 0x14, 0x0b, 0xb5, 0x5a, 0xd9, 0xea, 0x8b, 0x9c, 0xc2, 0x61, 0xca, 0xb3, 0x00, 0x0b, 0x99, 0x89, + 0x02, 0x83, 0x9c, 0xc9, 0x90, 0x65, 0x48, 0x63, 0x33, 0x1c, 0xdb, 0x3f, 0x48, 0x79, 0x36, 0x33, + 0xe4, 0xdb, 0x9a, 0x23, 0xf7, 0x60, 0x90, 0xd2, 0xf3, 0x40, 0x32, 0x55, 0x24, 0x18, 0x54, 0xea, + 0xbe, 0x56, 0xef, 0xa6, 0xf4, 0xdc, 0xd7, 0xe0, 0xb3, 0x98, 0x91, 0xbb, 0xb0, 0xa7, 0x58, 0x58, + 0x48, 0x8e, 0xa5, 0x19, 0xcd, 0x96, 0x11, 0xad, 0x41, 0x3d, 0x9e, 0xfb, 0xb0, 0xbf, 0xba, 0x46, + 0xa1, 0xa4, 0xc8, 0xe2, 0xd2, 0xd9, 0xd6, 0xb2, 0x81, 0x81, 0xdf, 0xad, 0x50, 0xe2, 0x02, 0x48, + 0xa6, 0x44, 0x52, 0xe8, 0x16, 0x6d, 0xad, 0x69, 0x21, 0xd5, 0x93, 0x54, 0x39, 0x0b, 0x1d, 0x30, + 0x4f, 0xb2, 0x3a, 0x7b, 0x5f, 0x2d, 0xe8, 0x9b, 0x7a, 0xc8, 0xa4, 0xfd, 0xd8, 0xf5, 0x38, 0xa7, + 0xe4, 0xea, 0xf2, 0x64, 0x10, 0xcd, 0x9f, 0x7a, 0x35, 0xe1, 0xb5, 0x0c, 0xf0, 0xe8, 0x6f, 0x03, + 0x74, 0x9b, 0x80, 0x9a, 0xf0, 0xda, 0xa6, 0xb8, 0xd3, 0x36, 0xc5, 0x74, 0xef, 0xea, 0xf2, 0xc4, + 0xae, 0xc4, 0xda, 0x1c, 0xc6, 0x23, 0xd3, 0xd7, 0x3f, 0x16, 0xae, 0x75, 0xb1, 0x70, 0xad, 0xdf, + 0x0b, 0xd7, 0xfa, 0xb6, 0x74, 0x37, 0x2e, 0x96, 0xee, 0xc6, 0xaf, 0xa5, 0xbb, 0xf1, 0xe1, 0x34, + 0xe6, 0xf8, 0xa9, 0x98, 0x8f, 0x43, 0x91, 0x4e, 0x42, 0x91, 0x32, 0x9c, 0x7f, 0xc4, 0xe6, 0x60, + 0x1c, 0x7e, 0xed, 0xef, 0x30, 0xef, 0x6b, 0xe2, 0xc9, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xcc, + 0xbd, 0xe7, 0x47, 0x39, 0x04, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -469,18 +478,25 @@ func (m *Vote) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.Data) i = encodeVarintTypes(dAtA, i, uint64(len(m.Data))) i-- - dAtA[i] = 0x1a + dAtA[i] = 0x22 } if m.Timestamp != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.Timestamp)) i-- - dAtA[i] = 0x10 + dAtA[i] = 0x18 } if len(m.OracleId) > 0 { i -= len(m.OracleId) copy(dAtA[i:], m.OracleId) i = encodeVarintTypes(dAtA, i, uint64(len(m.OracleId))) i-- + dAtA[i] = 0x12 + } + if len(m.Validator) > 0 { + i -= len(m.Validator) + copy(dAtA[i:], m.Validator) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Validator))) + i-- dAtA[i] = 0xa } return len(dAtA) - i, nil @@ -752,6 +768,10 @@ func (m *Vote) Size() (n int) { } var l int _ = l + l = len(m.Validator) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } l = len(m.OracleId) if l > 0 { n += 1 + l + sovTypes(uint64(l)) @@ -924,6 +944,40 @@ func (m *Vote) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) + if m.Validator == nil { + m.Validator = []byte{} + } + iNdEx = postIndex + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field OracleId", wireType) } @@ -955,7 +1009,7 @@ func (m *Vote) Unmarshal(dAtA []byte) error { } m.OracleId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 3: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) } @@ -974,7 +1028,7 @@ func (m *Vote) Unmarshal(dAtA []byte) error { break } } - case 3: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) } diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index 6ef266db97c..9ec2b7fa6c6 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -6,9 +6,10 @@ option go_package = "github.com/cometbft/cometbft/proto/tendermint/oracle"; import "gogoproto/gogo.proto"; message Vote { - string oracle_id = 1; - uint64 timestamp = 2; - string data = 3; + bytes validator = 1; + string oracle_id = 2; + uint64 timestamp = 3; + string data = 4; } message GossipVote { From 2e8c0fe2bd7e683dd83b51dcd0d757cf19a6d047 Mon Sep 17 00:00:00 2001 From: Yan Date: Wed, 13 Mar 2024 15:23:56 +0800 Subject: [PATCH 032/150] add back validator field to gossipVote --- proto/tendermint/oracle/types.pb.go | 220 +++++++++++++++++++++------- proto/tendermint/oracle/types.proto | 18 ++- 2 files changed, 173 insertions(+), 65 deletions(-) diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index 9a38f6661cc..50d30104adb 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -92,11 +92,12 @@ func (m *Vote) GetData() string { } type GossipVote struct { - PublicKey []byte `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` - SignType string `protobuf:"bytes,2,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` - Votes []*Vote `protobuf:"bytes,3,rep,name=votes,proto3" json:"votes,omitempty"` - SignedTimestamp uint64 `protobuf:"varint,4,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` - Signature []byte `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` + Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` + PublicKey []byte `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` + SignType string `protobuf:"bytes,3,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` + Votes []*Vote `protobuf:"bytes,4,rep,name=votes,proto3" json:"votes,omitempty"` + SignedTimestamp uint64 `protobuf:"varint,5,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` + Signature []byte `protobuf:"bytes,6,opt,name=signature,proto3" json:"signature,omitempty"` } func (m *GossipVote) Reset() { *m = GossipVote{} } @@ -132,6 +133,13 @@ func (m *GossipVote) XXX_DiscardUnknown() { var xxx_messageInfo_GossipVote proto.InternalMessageInfo +func (m *GossipVote) GetValidator() []byte { + if m != nil { + return m.Validator + } + return nil +} + func (m *GossipVote) GetPublicKey() []byte { if m != nil { return m.PublicKey @@ -168,9 +176,10 @@ func (m *GossipVote) GetSignature() []byte { } type CanonicalGossipVote struct { - PublicKey []byte `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` - SignType string `protobuf:"bytes,2,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` - Votes []*Vote `protobuf:"bytes,3,rep,name=votes,proto3" json:"votes,omitempty"` + Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` + PublicKey []byte `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` + SignType string `protobuf:"bytes,3,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` + Votes []*Vote `protobuf:"bytes,4,rep,name=votes,proto3" json:"votes,omitempty"` } func (m *CanonicalGossipVote) Reset() { *m = CanonicalGossipVote{} } @@ -206,6 +215,13 @@ func (m *CanonicalGossipVote) XXX_DiscardUnknown() { var xxx_messageInfo_CanonicalGossipVote proto.InternalMessageInfo +func (m *CanonicalGossipVote) GetValidator() []byte { + if m != nil { + return m.Validator + } + return nil +} + func (m *CanonicalGossipVote) GetPublicKey() []byte { if m != nil { return m.PublicKey @@ -414,43 +430,43 @@ func init() { func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 567 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x54, 0xcd, 0x6e, 0xd3, 0x4c, - 0x14, 0xad, 0x93, 0x34, 0xad, 0x6f, 0xdb, 0xf4, 0xfb, 0x86, 0xaa, 0x58, 0xd0, 0xba, 0xc1, 0x20, - 0x11, 0x16, 0x24, 0x08, 0xba, 0x62, 0x47, 0x58, 0x20, 0x84, 0x04, 0xc8, 0x44, 0x2c, 0xd8, 0x58, - 0x13, 0x7b, 0x30, 0x23, 0x6c, 0x8f, 0x35, 0x73, 0x5d, 0xd5, 0x3b, 0x9e, 0x00, 0xf1, 0x48, 0x2c, - 0x11, 0xab, 0x2e, 0x59, 0x55, 0x28, 0x79, 0x83, 0x3e, 0x01, 0xf2, 0x4c, 0x62, 0x5b, 0xf4, 0x01, - 0xd8, 0x8d, 0xcf, 0x39, 0x77, 0xee, 0xdf, 0x1c, 0xc3, 0x31, 0xb2, 0x2c, 0x62, 0x32, 0xe5, 0x19, - 0x4e, 0x84, 0xa4, 0x61, 0xc2, 0x26, 0x58, 0xe6, 0x4c, 0x8d, 0x73, 0x29, 0x50, 0x90, 0xff, 0x1b, - 0x7a, 0x6c, 0xe8, 0x5b, 0x07, 0xb1, 0x88, 0x85, 0x66, 0x27, 0xd5, 0xc9, 0x08, 0x3d, 0x05, 0xbd, - 0xf7, 0x02, 0x19, 0x39, 0x02, 0xfb, 0x8c, 0x26, 0x3c, 0xa2, 0x28, 0xa4, 0x63, 0x0d, 0xad, 0xd1, - 0xae, 0xdf, 0x00, 0xe4, 0x36, 0xd8, 0xe6, 0x96, 0x80, 0x47, 0x4e, 0x67, 0x68, 0x8d, 0x6c, 0x7f, - 0xdb, 0x00, 0x2f, 0xa3, 0x2a, 0x14, 0x79, 0xca, 0x14, 0xd2, 0x34, 0x77, 0xba, 0x43, 0x6b, 0xd4, - 0xf3, 0x1b, 0x80, 0x10, 0xe8, 0x45, 0x14, 0xa9, 0xd3, 0xd3, 0x51, 0xfa, 0xec, 0x7d, 0xb7, 0x00, - 0x5e, 0x08, 0xa5, 0x78, 0xae, 0x73, 0x1f, 0x03, 0xe4, 0xc5, 0x3c, 0xe1, 0x61, 0xf0, 0x99, 0x95, - 0xeb, 0xe4, 0x06, 0x79, 0xc5, 0xca, 0x2a, 0xb9, 0xe2, 0x71, 0x16, 0x54, 0xfd, 0xad, 0x93, 0x57, - 0xc0, 0xac, 0xcc, 0x19, 0x79, 0x08, 0x9b, 0x67, 0x02, 0x99, 0x72, 0xba, 0xc3, 0xee, 0x68, 0xe7, - 0xf1, 0xcd, 0xf1, 0xb5, 0xc6, 0xc7, 0x55, 0x0e, 0xdf, 0xa8, 0xc8, 0x03, 0xf8, 0xaf, 0x0a, 0x65, - 0x51, 0xd0, 0x94, 0xdc, 0xd3, 0x25, 0xef, 0x1b, 0x7c, 0x56, 0x17, 0x7e, 0x64, 0xd2, 0x52, 0x2c, - 0x24, 0x73, 0x36, 0x4d, 0x51, 0x35, 0xe0, 0x7d, 0xb1, 0xe0, 0xc6, 0x73, 0x9a, 0x89, 0x8c, 0x87, - 0x34, 0xf9, 0x27, 0xbd, 0x78, 0x3f, 0x3b, 0xd0, 0x7f, 0xa3, 0x61, 0xe2, 0xc0, 0x56, 0x28, 0x59, - 0xbd, 0x3b, 0xdb, 0x5f, 0x7f, 0x92, 0x01, 0x74, 0xea, 0x95, 0x75, 0x78, 0x44, 0x86, 0xb0, 0x13, - 0x31, 0x15, 0x4a, 0x9e, 0x23, 0x17, 0x99, 0x5e, 0x97, 0xed, 0xb7, 0x21, 0x72, 0x08, 0x7d, 0x85, - 0x14, 0x0b, 0xb5, 0x5a, 0xd9, 0xea, 0x8b, 0x9c, 0xc2, 0x61, 0xca, 0xb3, 0x00, 0x0b, 0x99, 0x89, - 0x02, 0x83, 0x9c, 0xc9, 0x90, 0x65, 0x48, 0x63, 0x33, 0x1c, 0xdb, 0x3f, 0x48, 0x79, 0x36, 0x33, - 0xe4, 0xdb, 0x9a, 0x23, 0xf7, 0x60, 0x90, 0xd2, 0xf3, 0x40, 0x32, 0x55, 0x24, 0x18, 0x54, 0xea, - 0xbe, 0x56, 0xef, 0xa6, 0xf4, 0xdc, 0xd7, 0xe0, 0xb3, 0x98, 0x91, 0xbb, 0xb0, 0xa7, 0x58, 0x58, - 0x48, 0x8e, 0xa5, 0x19, 0xcd, 0x96, 0x11, 0xad, 0x41, 0x3d, 0x9e, 0xfb, 0xb0, 0xbf, 0xba, 0x46, - 0xa1, 0xa4, 0xc8, 0xe2, 0xd2, 0xd9, 0xd6, 0xb2, 0x81, 0x81, 0xdf, 0xad, 0x50, 0xe2, 0x02, 0x48, - 0xa6, 0x44, 0x52, 0xe8, 0x16, 0x6d, 0xad, 0x69, 0x21, 0xd5, 0x93, 0x54, 0x39, 0x0b, 0x1d, 0x30, - 0x4f, 0xb2, 0x3a, 0x7b, 0x5f, 0x2d, 0xe8, 0x9b, 0x7a, 0xc8, 0xa4, 0xfd, 0xd8, 0xf5, 0x38, 0xa7, - 0xe4, 0xea, 0xf2, 0x64, 0x10, 0xcd, 0x9f, 0x7a, 0x35, 0xe1, 0xb5, 0x0c, 0xf0, 0xe8, 0x6f, 0x03, - 0x74, 0x9b, 0x80, 0x9a, 0xf0, 0xda, 0xa6, 0xb8, 0xd3, 0x36, 0xc5, 0x74, 0xef, 0xea, 0xf2, 0xc4, - 0xae, 0xc4, 0xda, 0x1c, 0xc6, 0x23, 0xd3, 0xd7, 0x3f, 0x16, 0xae, 0x75, 0xb1, 0x70, 0xad, 0xdf, - 0x0b, 0xd7, 0xfa, 0xb6, 0x74, 0x37, 0x2e, 0x96, 0xee, 0xc6, 0xaf, 0xa5, 0xbb, 0xf1, 0xe1, 0x34, - 0xe6, 0xf8, 0xa9, 0x98, 0x8f, 0x43, 0x91, 0x4e, 0x42, 0x91, 0x32, 0x9c, 0x7f, 0xc4, 0xe6, 0x60, - 0x1c, 0x7e, 0xed, 0xef, 0x30, 0xef, 0x6b, 0xe2, 0xc9, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xcc, - 0xbd, 0xe7, 0x47, 0x39, 0x04, 0x00, 0x00, + // 572 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x54, 0xbd, 0x6e, 0xd4, 0x4c, + 0x14, 0x8d, 0x37, 0x9b, 0x4d, 0x7c, 0x93, 0x6c, 0xbe, 0x6f, 0x88, 0x82, 0x05, 0x89, 0xb3, 0x18, + 0x24, 0x96, 0x82, 0x5d, 0x04, 0xa9, 0xe8, 0x08, 0x05, 0x42, 0x48, 0x80, 0x4c, 0x44, 0x41, 0x63, + 0xcd, 0xda, 0x17, 0x33, 0x62, 0xed, 0xb1, 0x66, 0xae, 0xa3, 0xf8, 0x25, 0x10, 0x4f, 0xc0, 0xf3, + 0x20, 0xaa, 0x94, 0x54, 0x11, 0x4a, 0xde, 0x20, 0x4f, 0x80, 0x3c, 0xb3, 0xb1, 0x2d, 0xd2, 0x50, + 0xd2, 0x5d, 0x9f, 0x73, 0xae, 0xef, 0xcf, 0xcc, 0x19, 0xd8, 0x23, 0xcc, 0x13, 0x54, 0x99, 0xc8, + 0x69, 0x2a, 0x15, 0x8f, 0xe7, 0x38, 0xa5, 0xaa, 0x40, 0x3d, 0x29, 0x94, 0x24, 0xc9, 0xfe, 0x6f, + 0xe9, 0x89, 0xa5, 0x6f, 0x6d, 0xa7, 0x32, 0x95, 0x86, 0x9d, 0xd6, 0x91, 0x15, 0x06, 0x1a, 0xfa, + 0xef, 0x25, 0x21, 0xdb, 0x05, 0xf7, 0x98, 0xcf, 0x45, 0xc2, 0x49, 0x2a, 0xcf, 0x19, 0x39, 0xe3, + 0x8d, 0xb0, 0x05, 0xd8, 0x6d, 0x70, 0xed, 0x5f, 0x22, 0x91, 0x78, 0xbd, 0x91, 0x33, 0x76, 0xc3, + 0x35, 0x0b, 0xbc, 0x4c, 0xea, 0x54, 0x12, 0x19, 0x6a, 0xe2, 0x59, 0xe1, 0x2d, 0x8f, 0x9c, 0x71, + 0x3f, 0x6c, 0x01, 0xc6, 0xa0, 0x9f, 0x70, 0xe2, 0x5e, 0xdf, 0x64, 0x99, 0x38, 0x38, 0x73, 0x00, + 0x5e, 0x48, 0xad, 0x45, 0xf1, 0x17, 0xb5, 0xf7, 0x00, 0x8a, 0x72, 0x36, 0x17, 0x71, 0xf4, 0x19, + 0x2b, 0x53, 0x7c, 0x23, 0x74, 0x2d, 0xf2, 0x0a, 0xab, 0xba, 0x35, 0x2d, 0xd2, 0x3c, 0xaa, 0xa7, + 0x37, 0xd5, 0xdd, 0x70, 0xad, 0x06, 0x8e, 0xaa, 0x02, 0xd9, 0x43, 0x58, 0x39, 0x96, 0x84, 0xda, + 0xeb, 0x8f, 0x96, 0xc7, 0xeb, 0x8f, 0x6f, 0x4e, 0xae, 0xad, 0x65, 0x52, 0x77, 0x10, 0x5a, 0x15, + 0x7b, 0x00, 0xff, 0xd5, 0xa9, 0x98, 0x44, 0xed, 0x40, 0x2b, 0x66, 0xa0, 0x2d, 0x8b, 0x1f, 0x35, + 0x63, 0xed, 0xda, 0xb2, 0x9c, 0x4a, 0x85, 0xde, 0xc0, 0x36, 0xd5, 0x00, 0xc1, 0x37, 0x07, 0x6e, + 0x3c, 0xe7, 0xb9, 0xcc, 0x45, 0xcc, 0xe7, 0xff, 0xe0, 0xa4, 0xc1, 0x8f, 0x1e, 0x0c, 0xde, 0x18, + 0x98, 0x79, 0xb0, 0x1a, 0x2b, 0x6c, 0x3a, 0x72, 0xc3, 0xab, 0x4f, 0x36, 0x84, 0x5e, 0x73, 0xdc, + 0x3d, 0x91, 0xb0, 0x11, 0xac, 0x27, 0xa8, 0x63, 0x25, 0x0a, 0x12, 0x32, 0x5f, 0xb4, 0xd0, 0x85, + 0xd8, 0x0e, 0x0c, 0x34, 0x71, 0x2a, 0xf5, 0xe2, 0xb8, 0x17, 0x5f, 0xec, 0x00, 0x76, 0x32, 0x91, + 0x47, 0x54, 0xaa, 0x5c, 0x96, 0x14, 0x15, 0xa8, 0x62, 0xcc, 0x89, 0xa7, 0x68, 0xd6, 0xeb, 0x86, + 0xdb, 0x99, 0xc8, 0x8f, 0x2c, 0xf9, 0xb6, 0xe1, 0xd8, 0x3d, 0x18, 0x66, 0xfc, 0x24, 0x52, 0xa8, + 0xcb, 0x39, 0x45, 0xb5, 0x7a, 0x60, 0xd4, 0x1b, 0x19, 0x3f, 0x09, 0x0d, 0xf8, 0x2c, 0x45, 0x76, + 0x17, 0x36, 0x35, 0xc6, 0xa5, 0x12, 0x54, 0xd9, 0xd5, 0xac, 0x5a, 0xd1, 0x15, 0x68, 0xd6, 0x73, + 0x1f, 0xb6, 0x16, 0xbf, 0xd1, 0xa4, 0x38, 0x61, 0x5a, 0x79, 0x6b, 0x46, 0x36, 0xb4, 0xf0, 0xbb, + 0x05, 0xca, 0x7c, 0x00, 0x85, 0x5a, 0xce, 0x4b, 0x33, 0xa2, 0x6b, 0x34, 0x1d, 0xa4, 0xbe, 0xce, + 0xba, 0xc0, 0xd8, 0x03, 0x7b, 0x9d, 0xeb, 0x38, 0xf8, 0xe2, 0xc0, 0xc0, 0xf6, 0xc3, 0xa6, 0x5d, + 0xa3, 0x98, 0x75, 0x1e, 0xb2, 0xcb, 0xb3, 0xfd, 0x61, 0x32, 0x7b, 0x1a, 0x34, 0x44, 0xd0, 0x31, + 0xcf, 0xa3, 0x3f, 0xcd, 0xb3, 0xdc, 0x26, 0x34, 0x44, 0xd0, 0x35, 0xd4, 0x9d, 0xae, 0xa1, 0x0e, + 0x37, 0x2f, 0xcf, 0xf6, 0xdd, 0x5a, 0x6c, 0x8c, 0x65, 0xfd, 0x75, 0xf8, 0xfa, 0xfb, 0xb9, 0xef, + 0x9c, 0x9e, 0xfb, 0xce, 0xaf, 0x73, 0xdf, 0xf9, 0x7a, 0xe1, 0x2f, 0x9d, 0x5e, 0xf8, 0x4b, 0x3f, + 0x2f, 0xfc, 0xa5, 0x0f, 0x07, 0xa9, 0xa0, 0x4f, 0xe5, 0x6c, 0x12, 0xcb, 0x6c, 0x1a, 0xcb, 0x0c, + 0x69, 0xf6, 0x91, 0xda, 0xc0, 0xbe, 0x0e, 0xd7, 0x5e, 0x96, 0xd9, 0xc0, 0x10, 0x4f, 0x7e, 0x07, + 0x00, 0x00, 0xff, 0xff, 0xe5, 0xd0, 0x69, 0x5d, 0x75, 0x04, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -527,12 +543,12 @@ func (m *GossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.Signature) i = encodeVarintTypes(dAtA, i, uint64(len(m.Signature))) i-- - dAtA[i] = 0x2a + dAtA[i] = 0x32 } if m.SignedTimestamp != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.SignedTimestamp)) i-- - dAtA[i] = 0x20 + dAtA[i] = 0x28 } if len(m.Votes) > 0 { for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { @@ -545,7 +561,7 @@ func (m *GossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a + dAtA[i] = 0x22 } } if len(m.SignType) > 0 { @@ -553,13 +569,20 @@ func (m *GossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.SignType) i = encodeVarintTypes(dAtA, i, uint64(len(m.SignType))) i-- - dAtA[i] = 0x12 + dAtA[i] = 0x1a } if len(m.PublicKey) > 0 { i -= len(m.PublicKey) copy(dAtA[i:], m.PublicKey) i = encodeVarintTypes(dAtA, i, uint64(len(m.PublicKey))) i-- + dAtA[i] = 0x12 + } + if len(m.Validator) > 0 { + i -= len(m.Validator) + copy(dAtA[i:], m.Validator) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Validator))) + i-- dAtA[i] = 0xa } return len(dAtA) - i, nil @@ -596,7 +619,7 @@ func (m *CanonicalGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a + dAtA[i] = 0x22 } } if len(m.SignType) > 0 { @@ -604,13 +627,20 @@ func (m *CanonicalGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.SignType) i = encodeVarintTypes(dAtA, i, uint64(len(m.SignType))) i-- - dAtA[i] = 0x12 + dAtA[i] = 0x1a } if len(m.PublicKey) > 0 { i -= len(m.PublicKey) copy(dAtA[i:], m.PublicKey) i = encodeVarintTypes(dAtA, i, uint64(len(m.PublicKey))) i-- + dAtA[i] = 0x12 + } + if len(m.Validator) > 0 { + i -= len(m.Validator) + copy(dAtA[i:], m.Validator) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Validator))) + i-- dAtA[i] = 0xa } return len(dAtA) - i, nil @@ -792,6 +822,10 @@ func (m *GossipVote) Size() (n int) { } var l int _ = l + l = len(m.Validator) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } l = len(m.PublicKey) if l > 0 { n += 1 + l + sovTypes(uint64(l)) @@ -822,6 +856,10 @@ func (m *CanonicalGossipVote) Size() (n int) { } var l int _ = l + l = len(m.Validator) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } l = len(m.PublicKey) if l > 0 { n += 1 + l + sovTypes(uint64(l)) @@ -1111,6 +1149,40 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) + if m.Validator == nil { + m.Validator = []byte{} + } + iNdEx = postIndex + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field PublicKey", wireType) } @@ -1144,7 +1216,7 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { m.PublicKey = []byte{} } iNdEx = postIndex - case 2: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field SignType", wireType) } @@ -1176,7 +1248,7 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { } m.SignType = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) } @@ -1210,7 +1282,7 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 4: + case 5: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field SignedTimestamp", wireType) } @@ -1229,7 +1301,7 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { break } } - case 5: + case 6: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) } @@ -1314,6 +1386,40 @@ func (m *CanonicalGossipVote) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) + if m.Validator == nil { + m.Validator = []byte{} + } + iNdEx = postIndex + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field PublicKey", wireType) } @@ -1347,7 +1453,7 @@ func (m *CanonicalGossipVote) Unmarshal(dAtA []byte) error { m.PublicKey = []byte{} } iNdEx = postIndex - case 2: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field SignType", wireType) } @@ -1379,7 +1485,7 @@ func (m *CanonicalGossipVote) Unmarshal(dAtA []byte) error { } m.SignType = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) } diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index 9ec2b7fa6c6..7b22c8611e7 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -13,17 +13,19 @@ message Vote { } message GossipVote { - bytes public_key = 1; - string sign_type = 2; - repeated Vote votes = 3; - uint64 signed_timestamp = 4; - bytes signature = 5; + bytes validator = 1; + bytes public_key = 2; + string sign_type = 3; + repeated Vote votes = 4; + uint64 signed_timestamp = 5; + bytes signature = 6; } message CanonicalGossipVote { - bytes public_key = 1; - string sign_type = 2; - repeated Vote votes = 3; + bytes validator = 1; + bytes public_key = 2; + string sign_type = 3; + repeated Vote votes = 4; } message Oracle { From 3994d1083ea341a56aa28a13f05d1cb09d3f4bbd Mon Sep 17 00:00:00 2001 From: Yan Date: Wed, 13 Mar 2024 15:44:20 +0800 Subject: [PATCH 033/150] add rest endpoint check before starting up oracle service --- oracle/reactor.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/oracle/reactor.go b/oracle/reactor.go index 6b8c4af5dc9..b35ba252cdf 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -70,6 +70,27 @@ func NewReactor(config *config.OracleConfig, pubKey crypto.PubKey, privValidator logrus.Warnf("[oracle] error parsing oracle.json config file: %v", err) } + restMaxRetryCount := 12 + retryCount := 0 + sleepTime := time.Second + + for { + logrus.Infof("[oracle] checking if rest endpoint is up %s : %d", config.RestUrl, retryCount) + if retryCount == restMaxRetryCount { + panic("failed to connect to grpc:grpcClient after 12 tries") + } + time.Sleep(sleepTime) + + res := adapters.HTTPRequest(config.RestUrl, 10) + if len(res) != 0 { + break + } + + time.Sleep(time.Duration(retryCount*int(time.Second) + 1)) + retryCount++ + sleepTime *= 2 + } + gossipVoteBuffer := &oracletypes.GossipVoteBuffer{ Buffer: make(map[string]*oracleproto.GossipVote), } From 37fa715e9cde3b829a30b99f74daee7b498fe05c Mon Sep 17 00:00:00 2001 From: Yan Date: Wed, 13 Mar 2024 16:12:55 +0800 Subject: [PATCH 034/150] shift rest endpoint check to within go routine --- oracle/reactor.go | 21 --------------------- oracle/service/runner/runner.go | 23 +++++++++++++++++++++++ 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index b35ba252cdf..6b8c4af5dc9 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -70,27 +70,6 @@ func NewReactor(config *config.OracleConfig, pubKey crypto.PubKey, privValidator logrus.Warnf("[oracle] error parsing oracle.json config file: %v", err) } - restMaxRetryCount := 12 - retryCount := 0 - sleepTime := time.Second - - for { - logrus.Infof("[oracle] checking if rest endpoint is up %s : %d", config.RestUrl, retryCount) - if retryCount == restMaxRetryCount { - panic("failed to connect to grpc:grpcClient after 12 tries") - } - time.Sleep(sleepTime) - - res := adapters.HTTPRequest(config.RestUrl, 10) - if len(res) != 0 { - break - } - - time.Sleep(time.Duration(retryCount*int(time.Second) + 1)) - retryCount++ - sleepTime *= 2 - } - gossipVoteBuffer := &oracletypes.GossipVoteBuffer{ Buffer: make(map[string]*oracleproto.GossipVote), } diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 82c4239fab1..d5ed662e903 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -400,6 +400,7 @@ func RunOracles(oracleInfo *types.OracleInfo, t uint64) { // Run run oracles func Run(oracleInfo *types.OracleInfo) { log.Info("[oracle] Service started.") + waitForRestAPI(oracleInfo.Config.RestUrl) count := 0 RunProcessSignVoteQueue(oracleInfo) PruneUnsignedVoteBuffer(oracleInfo) @@ -428,3 +429,25 @@ func Run(oracleInfo *types.OracleInfo) { } } } + +func waitForRestAPI(url string) { + restMaxRetryCount := 12 + retryCount := 0 + sleepTime := time.Second + for { + log.Infof("[oracle] checking if rest endpoint is up %s : %d", url, retryCount) + if retryCount == restMaxRetryCount { + panic("failed to connect to grpc:grpcClient after 12 tries") + } + time.Sleep(sleepTime) + + res := adapters.HTTPRequest(url, 10) + if len(res) != 0 { + break + } + + time.Sleep(time.Duration(retryCount*int(time.Second) + 1)) + retryCount++ + sleepTime *= 2 + } +} From 6f52e10cfc21ae7b9b8c82bdfe4eec9e64c952e0 Mon Sep 17 00:00:00 2001 From: Yan Date: Wed, 13 Mar 2024 16:28:37 +0800 Subject: [PATCH 035/150] add grpc health check before starting oracle service --- config/config.go | 16 +++++++---- config/toml.go | 7 +++-- oracle/reactor.go | 2 +- oracle/service/runner/runner.go | 48 +++++++++++++++++++++++++++++---- 4 files changed, 60 insertions(+), 13 deletions(-) diff --git a/config/config.go b/config/config.go index 2498c29718a..3c973f17e95 100644 --- a/config/config.go +++ b/config/config.go @@ -799,8 +799,10 @@ func (cfg *MempoolConfig) ValidateBasic() error { type OracleConfig struct { // Path to custom oracle spec should validators decide to use a different spec from the default CustomNodePath string `mapstructure:"custom_node_path"` - // Url used to query chain for syncing of oracles and fetching cached oracle results - RestUrl string `mapstructure:"rest_url"` + // REST API address used to query chain for syncing of oracles and fetching cached oracle results + RestApiAddress string `mapstructure:"rest_api_address"` + // GRPC address used to query chain for syncing of oracles and fetching cached oracle results + GrpcAddress string `mapstructure:"grpc_address"` // Interval determines how long we should keep our gossiped votes before pruning PruneInterval time.Duration `mapstructure:"prune_interval"` // Interval determines how long we should wait before batch signing votes @@ -814,7 +816,8 @@ type OracleConfig struct { // DefaultOracleConfig returns a default configuration for the CometBFT oracle service func DefaultOracleConfig() *OracleConfig { return &OracleConfig{ - RestUrl: "http://localhost:1317", // localhost + RestApiAddress: "http://localhost:1317", // localhost + GrpcAddress: "http://localhost:9090", // localhost PruneInterval: 4 * time.Second, // 4s SignInterval: 500 * time.Millisecond, // 0.5s SyncInterval: 60 * time.Second, // 60s @@ -831,8 +834,11 @@ func TestOracleConfig() *OracleConfig { // ValidateBasic performs basic validation and returns an error if any check fails. func (cfg *OracleConfig) ValidateBasic() error { - if cfg.RestUrl == "" { - return errors.New("rest_url can't be empty") + if cfg.RestApiAddress == "" { + return errors.New("rest_api_address can't be empty") + } + if cfg.GrpcAddress == "" { + return errors.New("grpc_address can't be empty") } if cfg.PruneInterval < 0 { return errors.New("prune_interval can't be negative") diff --git a/config/toml.go b/config/toml.go index 713ee4c4f75..5924a8dda63 100644 --- a/config/toml.go +++ b/config/toml.go @@ -387,8 +387,11 @@ max_batch_bytes = {{ .Mempool.MaxBatchBytes }} # Path to custom oracle spec should validators decide to use a different spec from the default custom_node_path = "{{ .Oracle.CustomNodePath }}" -# Url used to query chain for syncing of oracles and fetching cached oracle results -rest_url = "{{ .Oracle.RestUrl }}" +# REST API address used to query chain for syncing of oracles and fetching cached oracle results +rest_api_address = "{{ .Oracle.RestApiAddress }}" + +# GRPC address used to query chain for syncing of oracles and fetching cached oracle results +grpc_address = "{{ .Oracle.GrpcAddress }}" # Interval determines how long we should keep our gossiped votes before pruning prune_interval = "{{ .Oracle.PruneInterval }}" diff --git a/oracle/reactor.go b/oracle/reactor.go index 6b8c4af5dc9..7caaf988ada 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -116,7 +116,7 @@ func (oracleR *Reactor) SetLogger(l log.Logger) { // OnStart implements p2p.BaseReactor. func (oracleR *Reactor) OnStart() error { oracleR.OracleInfo.Redis = redis.NewService(0) - oracleR.OracleInfo.AdapterMap = adapters.GetAdapterMap(&oracleR.OracleInfo.Redis, oracleR.OracleInfo.Config.RestUrl) + oracleR.OracleInfo.AdapterMap = adapters.GetAdapterMap(&oracleR.OracleInfo.Redis, oracleR.OracleInfo.Config.RestApiAddress) logrus.Info("[oracle] running oracle service...") go func() { runner.Run(oracleR.OracleInfo) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index d5ed662e903..bb624dfa3e8 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -8,6 +8,9 @@ import ( "time" log "github.com/sirupsen/logrus" + "google.golang.org/grpc" + "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/credentials/insecure" "github.com/cometbft/cometbft/oracle/service/adapters" "github.com/cometbft/cometbft/oracle/service/parser" @@ -123,7 +126,7 @@ func overwriteData(oracleId string, data string) string { // SyncOracles sync oracles with active on-chain oracles func SyncOracles(oracleInfo *types.OracleInfo) (oracles []types.Oracle, err error) { - oraclesURL := oracleInfo.Config.RestUrl + oraclesURL := oracleInfo.Config.RestApiAddress if oraclesURL == "" { oraclesURL = "https://test-api.carbon.network" } @@ -400,7 +403,8 @@ func RunOracles(oracleInfo *types.OracleInfo, t uint64) { // Run run oracles func Run(oracleInfo *types.OracleInfo) { log.Info("[oracle] Service started.") - waitForRestAPI(oracleInfo.Config.RestUrl) + waitForGrpc(oracleInfo.Config.GrpcAddress) + waitForRestAPI(oracleInfo.Config.RestApiAddress) count := 0 RunProcessSignVoteQueue(oracleInfo) PruneUnsignedVoteBuffer(oracleInfo) @@ -430,18 +434,18 @@ func Run(oracleInfo *types.OracleInfo) { } } -func waitForRestAPI(url string) { +func waitForRestAPI(address string) { restMaxRetryCount := 12 retryCount := 0 sleepTime := time.Second for { - log.Infof("[oracle] checking if rest endpoint is up %s : %d", url, retryCount) + log.Infof("[oracle] checking if rest endpoint is up %s : %d", address, retryCount) if retryCount == restMaxRetryCount { panic("failed to connect to grpc:grpcClient after 12 tries") } time.Sleep(sleepTime) - res := adapters.HTTPRequest(url, 10) + res := adapters.HTTPRequest(address, 10) if len(res) != 0 { break } @@ -451,3 +455,37 @@ func waitForRestAPI(url string) { sleepTime *= 2 } } + +func waitForGrpc(address string) { + grpcMaxRetryCount := 12 + retryCount := 0 + sleepTime := time.Second + var client *grpc.ClientConn + + for { + log.Infof("[oracle] trying to connect to grpc with address %s : %d", address, retryCount) + if retryCount == grpcMaxRetryCount { + panic("failed to connect to grpc:grpcClient after 12 tries") + } + time.Sleep(sleepTime) + + // reinit otherwise connection will be idle, in idle we can't tell if it's really ready + var err error + client, err = grpc.Dial( + address, + grpc.WithTransportCredentials(insecure.NewCredentials()), + ) + if err != nil { + panic(err) + } + // give it some time to connect after dailing, but not too long as connection can become idle + time.Sleep(time.Duration(retryCount*int(time.Second) + 1)) + + if client.GetState() == connectivity.Ready { + break + } + client.Close() + retryCount++ + sleepTime *= 2 + } +} From af0c3f9f1ad275b595e012de82f26b3fe3812ca2 Mon Sep 17 00:00:00 2001 From: Yan Date: Wed, 13 Mar 2024 16:35:04 +0800 Subject: [PATCH 036/150] update default grpc addr --- config/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/config.go b/config/config.go index 3c973f17e95..ed242205bc6 100644 --- a/config/config.go +++ b/config/config.go @@ -817,7 +817,7 @@ type OracleConfig struct { func DefaultOracleConfig() *OracleConfig { return &OracleConfig{ RestApiAddress: "http://localhost:1317", // localhost - GrpcAddress: "http://localhost:9090", // localhost + GrpcAddress: "127.0.0.1:9090", // localhost PruneInterval: 4 * time.Second, // 4s SignInterval: 500 * time.Millisecond, // 0.5s SyncInterval: 60 * time.Second, // 60s From a75f1b99428513ec0b5ed0fb1626610d9b758278 Mon Sep 17 00:00:00 2001 From: Yan Date: Thu, 14 Mar 2024 17:02:29 +0800 Subject: [PATCH 037/150] add validator check during gossiping, add gossipVoteBuffer pruner --- node/node.go | 5 +++-- oracle/reactor.go | 21 +++++++++++++++++---- oracle/service/runner/runner.go | 20 ++++++++++++++++++++ 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/node/node.go b/node/node.go index 04286a3fb03..12ddfea7f5b 100644 --- a/node/node.go +++ b/node/node.go @@ -381,8 +381,7 @@ func NewNodeWithContext(ctx context.Context, } // Make OracleReactor - - oracleReactor := oracle.NewReactor(config.Oracle, pubKey, privValidator, state.Validators) + oracleReactor := oracle.NewReactor(config.Oracle, pubKey, privValidator) oracleInfo := oracleReactor.OracleInfo // make block executor for consensus and blocksync reactors to execute blocks @@ -416,6 +415,8 @@ func NewNodeWithContext(ctx context.Context, privValidator, csMetrics, stateSync || blockSync, eventBus, consensusLogger, offlineStateSyncHeight, ) + oracleReactor.OracleInfo.ValidatorSet = consensusState.Validators + err = stateStore.SetOfflineStateSyncHeight(0) if err != nil { panic(fmt.Sprintf("failed to reset the offline state sync height %s", err)) diff --git a/oracle/reactor.go b/oracle/reactor.go index 7caaf988ada..30f1e764f41 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -51,7 +51,7 @@ type Reactor struct { } // NewReactor returns a new Reactor with the given config and mempool. -func NewReactor(config *config.OracleConfig, pubKey crypto.PubKey, privValidator types.PrivValidator, validatorSet *types.ValidatorSet) *Reactor { +func NewReactor(config *config.OracleConfig, pubKey crypto.PubKey, privValidator types.PrivValidator) *Reactor { // load oracle.json config if present customNodeConfigPath := config.CustomNodePath jsonFile, openErr := os.Open(customNodeConfigPath) @@ -87,7 +87,6 @@ func NewReactor(config *config.OracleConfig, pubKey crypto.PubKey, privValidator SignVotesChan: make(chan *oracleproto.Vote), PubKey: pubKey, PrivValidator: privValidator, - ValidatorSet: validatorSet, } jsonFile.Close() @@ -169,27 +168,41 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { // verify sig of incoming gossip vote, throw if verification fails signType := msg.SignType var pubKey crypto.PubKey + var valAddress []byte switch signType { case "ed25519": pubKey = ed25519.PubKey(msg.PublicKey) if success := pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature); !success { - oracleR.Logger.Info("failed signature verification", msg) + oracleR.Logger.Error("failed signature verification", msg) logrus.Info("FAILED SIGNATURE VERIFICATION!!!!!!!!!!!!!!") + oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("oracle failed ed25519 signature verification: %T", e.Message)) return } + valAddress = pubKey.Address() case "sr25519": pubKey = sr25519.PubKey(msg.PublicKey) if success := pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature); !success { - oracleR.Logger.Info("failed signature verification", msg) + oracleR.Logger.Error("failed signature verification", msg) logrus.Info("FAILED SIGNATURE VERIFICATION!!!!!!!!!!!!!!") + oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("oracle failed sr25519 signature verification: %T", e.Message)) return } + valAddress = pubKey.Address() default: logrus.Error("SIGNATURE NOT SUPPORTED NOOOOOOOOO") + oracleR.Logger.Error("signature type not supported", msg) + oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("oracle does not support the following signature type: %T", e.Message)) return } + // check if peer is a validator + if !oracleR.OracleInfo.ValidatorSet.HasAddress(valAddress) { + logrus.Error("NOT VALIDATOR NOOOOOOOOOOOOOOO") + oracleR.Logger.Error("invalid validator trying to gossip oracle votes", msg) + oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("invalid validator trying to gossip oracle votes: %T", e.Message)) + } + oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RLock() currentGossipVote, ok := oracleR.OracleInfo.GossipVoteBuffer.Buffer[pubKey.Address().String()] oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index bb624dfa3e8..275ee349d0d 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -352,6 +352,25 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo) { oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() } +func PruneGossipVoteBuffer(oracleInfo *types.OracleInfo) { + go func(oracleInfo *types.OracleInfo) { + interval := 60 * time.Second + ticker := time.Tick(interval) + for range ticker { + oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() + currTime := uint64(time.Now().Unix()) + + // prune gossip vote that have signed timestamps older than 60 secs + for valAddr, gossipVote := range oracleInfo.GossipVoteBuffer.Buffer { + if gossipVote.SignedTimestamp < currTime-uint64(interval) { + delete(oracleInfo.GossipVoteBuffer.Buffer, valAddr) + } + } + oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() + } + }(oracleInfo) +} + func PruneUnsignedVoteBuffer(oracleInfo *types.OracleInfo) { go func(oracleInfo *types.OracleInfo) { interval := oracleInfo.Config.PruneInterval @@ -408,6 +427,7 @@ func Run(oracleInfo *types.OracleInfo) { count := 0 RunProcessSignVoteQueue(oracleInfo) PruneUnsignedVoteBuffer(oracleInfo) + PruneGossipVoteBuffer(oracleInfo) for { if count == 0 { // on init, and every minute oracles, err := SyncOracles(oracleInfo) From 4ede0a5b1663bfb0f907c5100bd5792be2d3fb9e Mon Sep 17 00:00:00 2001 From: Yan Date: Thu, 14 Mar 2024 17:58:36 +0800 Subject: [PATCH 038/150] add logs for validator checking on gossip --- oracle/reactor.go | 1 + oracle/service/runner/runner.go | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 30f1e764f41..8d897b06342 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -199,6 +199,7 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { // check if peer is a validator if !oracleR.OracleInfo.ValidatorSet.HasAddress(valAddress) { logrus.Error("NOT VALIDATOR NOOOOOOOOOOOOOOO") + logrus.Infof("VALIDATOR SET: %v", oracleR.OracleInfo.ValidatorSet) oracleR.Logger.Error("invalid validator trying to gossip oracle votes", msg) oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("invalid validator trying to gossip oracle votes: %T", e.Message)) } diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 275ee349d0d..430bbafd8c2 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -359,13 +359,15 @@ func PruneGossipVoteBuffer(oracleInfo *types.OracleInfo) { for range ticker { oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() currTime := uint64(time.Now().Unix()) + buffer := oracleInfo.GossipVoteBuffer.Buffer // prune gossip vote that have signed timestamps older than 60 secs for valAddr, gossipVote := range oracleInfo.GossipVoteBuffer.Buffer { if gossipVote.SignedTimestamp < currTime-uint64(interval) { - delete(oracleInfo.GossipVoteBuffer.Buffer, valAddr) + delete(buffer, valAddr) } } + oracleInfo.GossipVoteBuffer.Buffer = buffer oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() } }(oracleInfo) From f875f1378cdb80e0031a643df451d4a1e5793611 Mon Sep 17 00:00:00 2001 From: Yan Date: Thu, 14 Mar 2024 18:37:18 +0800 Subject: [PATCH 039/150] add more logs for debugging --- consensus/reactor.go | 2 ++ oracle/reactor.go | 1 + oracle/service/runner/runner.go | 1 + 3 files changed, 4 insertions(+) diff --git a/consensus/reactor.go b/consensus/reactor.go index ee87b7ba637..5b6bb19d26e 100644 --- a/consensus/reactor.go +++ b/consensus/reactor.go @@ -19,6 +19,7 @@ import ( sm "github.com/cometbft/cometbft/state" "github.com/cometbft/cometbft/types" cmttime "github.com/cometbft/cometbft/types/time" + "github.com/sirupsen/logrus" ) const ( @@ -342,6 +343,7 @@ func (conR *Reactor) Receive(e p2p.Envelope) { cs := conR.conS cs.mtx.RLock() height, valSize, lastCommitSize := cs.Height, cs.Validators.Size(), cs.LastCommit.Size() + logrus.Infof("@@@@@@@@@@@@@ VAL SIZE: %v @@@@@@@@@@@@@@@", cs.Validators.Size()) cs.mtx.RUnlock() ps.EnsureVoteBitArrays(height, valSize) ps.EnsureVoteBitArrays(height-1, lastCommitSize) diff --git a/oracle/reactor.go b/oracle/reactor.go index 8d897b06342..60dce87e864 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -202,6 +202,7 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { logrus.Infof("VALIDATOR SET: %v", oracleR.OracleInfo.ValidatorSet) oracleR.Logger.Error("invalid validator trying to gossip oracle votes", msg) oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("invalid validator trying to gossip oracle votes: %T", e.Message)) + return } oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RLock() diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 430bbafd8c2..3a1ff05340b 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -364,6 +364,7 @@ func PruneGossipVoteBuffer(oracleInfo *types.OracleInfo) { // prune gossip vote that have signed timestamps older than 60 secs for valAddr, gossipVote := range oracleInfo.GossipVoteBuffer.Buffer { if gossipVote.SignedTimestamp < currTime-uint64(interval) { + log.Infof("DELETING STALE GOSSIP BUFFER FOR VAL: %s", valAddr) delete(buffer, valAddr) } } From 41b3fdad3971b9d0782c6ac22277baa6775a11f3 Mon Sep 17 00:00:00 2001 From: Yan Date: Sat, 16 Mar 2024 01:25:57 +0800 Subject: [PATCH 040/150] add gossip interval to config --- config/config.go | 8 +++--- config/toml.go | 4 +-- oracle/reactor.go | 72 +++++++++++------------------------------------ 3 files changed, 23 insertions(+), 61 deletions(-) diff --git a/config/config.go b/config/config.go index ed242205bc6..e65c8f92d5a 100644 --- a/config/config.go +++ b/config/config.go @@ -807,8 +807,8 @@ type OracleConfig struct { PruneInterval time.Duration `mapstructure:"prune_interval"` // Interval determines how long we should wait before batch signing votes SignInterval time.Duration `mapstructure:"sign_interval"` - // Interval determines how long we should wait before re-syncing oracles from the chain - SyncInterval time.Duration `mapstructure:"sync_interval"` + // Interval determines how long we should wait between gossiping of votes + GossipInterval time.Duration `mapstructure:"gossip_interval"` // Max allowable size for votes that can be gossiped from peer to peer MaxGossipMsgSize int `mapstructure:"max_gossip_msg_size"` } @@ -820,7 +820,7 @@ func DefaultOracleConfig() *OracleConfig { GrpcAddress: "127.0.0.1:9090", // localhost PruneInterval: 4 * time.Second, // 4s SignInterval: 500 * time.Millisecond, // 0.5s - SyncInterval: 60 * time.Second, // 60s + GossipInterval: 100 * time.Millisecond, // 0.1s MaxGossipMsgSize: 65536, } } @@ -846,7 +846,7 @@ func (cfg *OracleConfig) ValidateBasic() error { if cfg.SignInterval < 0 { return errors.New("sign_interval can't be negative") } - if cfg.SyncInterval < 0 { + if cfg.GossipInterval < 0 { return errors.New("sync_interval can't be negative") } if cfg.MaxGossipMsgSize < 0 { diff --git a/config/toml.go b/config/toml.go index 5924a8dda63..b6b6e88713f 100644 --- a/config/toml.go +++ b/config/toml.go @@ -399,8 +399,8 @@ prune_interval = "{{ .Oracle.PruneInterval }}" # Interval determines how long we should wait before batch signing votes sign_interval = "{{ .Oracle.SignInterval }}" -# Interval determines how long we should wait before re-syncing oracles from the chain -sync_interval = "{{ .Oracle.SyncInterval }}" +# Interval determines how long we should wait between gossiping of votes +gossip_interval = "{{ .Oracle.GossipInterval }}" # Max allowable size for votes that can be gossiped from peer to peer max_gossip_msg_size = {{ .Oracle.MaxGossipMsgSize }} diff --git a/oracle/reactor.go b/oracle/reactor.go index 60dce87e864..ed5c66214aa 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -168,7 +168,6 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { // verify sig of incoming gossip vote, throw if verification fails signType := msg.SignType var pubKey crypto.PubKey - var valAddress []byte switch signType { case "ed25519": @@ -179,7 +178,6 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("oracle failed ed25519 signature verification: %T", e.Message)) return } - valAddress = pubKey.Address() case "sr25519": pubKey = sr25519.PubKey(msg.PublicKey) if success := pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature); !success { @@ -188,7 +186,6 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("oracle failed sr25519 signature verification: %T", e.Message)) return } - valAddress = pubKey.Address() default: logrus.Error("SIGNATURE NOT SUPPORTED NOOOOOOOOO") oracleR.Logger.Error("signature type not supported", msg) @@ -196,15 +193,6 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { return } - // check if peer is a validator - if !oracleR.OracleInfo.ValidatorSet.HasAddress(valAddress) { - logrus.Error("NOT VALIDATOR NOOOOOOOOOOOOOOO") - logrus.Infof("VALIDATOR SET: %v", oracleR.OracleInfo.ValidatorSet) - oracleR.Logger.Error("invalid validator trying to gossip oracle votes", msg) - oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("invalid validator trying to gossip oracle votes: %T", e.Message)) - return - } - oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RLock() currentGossipVote, ok := oracleR.OracleInfo.GossipVoteBuffer.Buffer[pubKey.Address().String()] oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() @@ -241,21 +229,12 @@ type PeerState interface { // // Send new oracle votes to peer. func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { - // peerID := oracleR.ids.GetForPeer(peer) - for { // In case of both next.NextWaitChan() and peer.Quit() are variable at the same time if !oracleR.IsRunning() || !peer.IsRunning() { return } - // This happens because the CElement we were looking at got garbage - // collected (removed). That is, .NextWait() returned nil. Go ahead and - // start from the beginning. select { - // case <-oracleR.mempool.TxsWaitChan(): // Wait until a tx is available - // if next = oracleR.mempool.TxsFront(); next == nil { - // continue - // } case <-peer.Quit(): return case <-oracleR.Quit(): @@ -264,28 +243,17 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { } // Make sure the peer is up to date. - // peerState, ok := peer.Get(types.PeerStateKey).(PeerState) - // if !ok { - // // Peer does not have a state yet. We set it in the consensus reactor, but - // // when we add peer in Switch, the order we call reactors#AddPeer is - // // different every time due to us using a map. Sometimes other reactors - // // will be initialized before the consensus reactor. We should wait a few - // // milliseconds and retry. - // time.Sleep(PeerCatchupSleepIntervalMS * time.Millisecond) - // continue - // } - - // // Allow for a lag of 1 block. - // memTx := next.Value.(*mempoolTx) - // if peerState.GetHeight() < memTx.Height()-1 { - // time.Sleep(PeerCatchupSleepIntervalMS * time.Millisecond) - // continue - // } - - // NOTE: Transaction batching was disabled due to - // https://github.com/tendermint/tendermint/issues/5796 - - // if !memTx.isSender(peerID) { + _, ok := peer.Get(types.PeerStateKey).(PeerState) + if !ok { + // Peer does not have a state yet. We set it in the consensus reactor, but + // when we add peer in Switch, the order we call reactors#AddPeer is + // different every time due to us using a map. Sometimes other reactors + // will be initialized before the consensus reactor. We should wait a few + // milliseconds and retry. + time.Sleep(PeerCatchupSleepIntervalMS * time.Millisecond) + continue + } + oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RLock() for _, gossipVote := range oracleR.OracleInfo.GossipVoteBuffer.Buffer { success := peer.Send(p2p.Envelope{ @@ -299,18 +267,12 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { } } oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() - time.Sleep(200 * time.Millisecond) - // } - - // select { - // case <-next.NextWaitChan(): - // // see the start of the for loop for nil check - // next = next.Next() - // case <-peer.Quit(): - // return - // case <-oracleR.Quit(): - // return - // } + + interval := oracleR.OracleInfo.Config.GossipInterval + if interval == 0 { + interval = 100 * time.Millisecond + } + time.Sleep(interval) } } From bbbc29ae247498270761c570f9217f83e1de08bc Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 16 Apr 2024 18:03:07 +0800 Subject: [PATCH 041/150] remove oracle service --- node/node.go | 2 +- oracle/reactor.go | 35 +- oracle/service/adapters/adapters.go | 30 -- oracle/service/adapters/decimal_handler.go | 79 ----- oracle/service/adapters/evm_fetcher.go | 119 ------- oracle/service/adapters/evm_struct_parser.go | 89 ----- oracle/service/adapters/evm_value_parser.go | 72 ---- oracle/service/adapters/fetcher.go | 176 ---------- oracle/service/adapters/fetcher_multiple.go | 109 ------ oracle/service/adapters/float_handler.go | 71 ---- oracle/service/adapters/math_filter.go | 145 -------- oracle/service/adapters/median_filter.go | 86 ----- .../service/adapters/oracle_result_fetcher.go | 126 ------- oracle/service/adapters/static_handler.go | 48 --- oracle/service/adapters/unchanged_handler.go | 78 ----- .../service/adapters/unresponsive_handler.go | 67 ---- oracle/service/adapters/weighted_average.go | 87 ----- oracle/service/parser/parser.go | 101 ------ oracle/service/runner/runner.go | 318 ++---------------- oracle/service/types/adapter.go | 61 ---- oracle/service/types/alias.go | 15 - oracle/service/types/config.go | 9 - oracle/service/types/info.go | 6 - oracle/service/types/oracle.go | 134 -------- proto/tendermint/abci/types.proto | 15 + redis/generic_value.go | 113 ------- redis/redis.go | 64 ---- redis/service.go | 75 ----- state/execution_test.go | 2 + 29 files changed, 50 insertions(+), 2282 deletions(-) delete mode 100644 oracle/service/adapters/adapters.go delete mode 100644 oracle/service/adapters/decimal_handler.go delete mode 100644 oracle/service/adapters/evm_fetcher.go delete mode 100644 oracle/service/adapters/evm_struct_parser.go delete mode 100644 oracle/service/adapters/evm_value_parser.go delete mode 100644 oracle/service/adapters/fetcher.go delete mode 100644 oracle/service/adapters/fetcher_multiple.go delete mode 100644 oracle/service/adapters/float_handler.go delete mode 100644 oracle/service/adapters/math_filter.go delete mode 100644 oracle/service/adapters/median_filter.go delete mode 100644 oracle/service/adapters/oracle_result_fetcher.go delete mode 100644 oracle/service/adapters/static_handler.go delete mode 100644 oracle/service/adapters/unchanged_handler.go delete mode 100644 oracle/service/adapters/unresponsive_handler.go delete mode 100644 oracle/service/adapters/weighted_average.go delete mode 100644 oracle/service/parser/parser.go delete mode 100644 oracle/service/types/adapter.go delete mode 100644 oracle/service/types/alias.go delete mode 100644 oracle/service/types/config.go delete mode 100644 oracle/service/types/oracle.go delete mode 100644 redis/generic_value.go delete mode 100644 redis/redis.go delete mode 100644 redis/service.go diff --git a/node/node.go b/node/node.go index f9e9d5b6fb5..1658f792815 100644 --- a/node/node.go +++ b/node/node.go @@ -412,7 +412,7 @@ func NewNodeWithContext(ctx context.Context, privValidator, csMetrics, stateSync || blockSync, eventBus, consensusLogger, offlineStateSyncHeight, ) - oracleReactor.OracleInfo.ValidatorSet = consensusState.Validators + oracleReactor.ConsensusState = consensusState err = stateStore.SetOfflineStateSyncHeight(0) if err != nil { diff --git a/oracle/reactor.go b/oracle/reactor.go index ed5c66214aa..4a3f42e0826 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -1,11 +1,8 @@ package oracle import ( - "encoding/json" "fmt" - "io" "math" - "os" "time" "github.com/cometbft/cometbft/config" @@ -16,13 +13,12 @@ import ( // cfg "github.com/cometbft/cometbft/config" "github.com/cometbft/cometbft/crypto" + cs "github.com/cometbft/cometbft/consensus" "github.com/cometbft/cometbft/libs/log" - "github.com/cometbft/cometbft/oracle/service/adapters" "github.com/cometbft/cometbft/oracle/service/runner" oracletypes "github.com/cometbft/cometbft/oracle/service/types" "github.com/cometbft/cometbft/p2p" oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" - "github.com/cometbft/cometbft/redis" "github.com/cometbft/cometbft/types" ) @@ -47,29 +43,12 @@ type Reactor struct { OracleInfo *oracletypes.OracleInfo // config *cfg.MempoolConfig // mempool *CListMempool - ids *oracleIDs + ids *oracleIDs + ConsensusState *cs.State } // NewReactor returns a new Reactor with the given config and mempool. func NewReactor(config *config.OracleConfig, pubKey crypto.PubKey, privValidator types.PrivValidator) *Reactor { - // load oracle.json config if present - customNodeConfigPath := config.CustomNodePath - jsonFile, openErr := os.Open(customNodeConfigPath) - if openErr != nil { - logrus.Warnf("[oracle] error opening oracle.json config file: %v", openErr) - } - - bytes, err := io.ReadAll(jsonFile) - if err != nil { - logrus.Warnf("[oracle] error reading oracle.json config file: %v", err) - } - - var customNodeConfig oracletypes.CustomNodeConfig - err = json.Unmarshal(bytes, &customNodeConfig) - if err != nil { - logrus.Warnf("[oracle] error parsing oracle.json config file: %v", err) - } - gossipVoteBuffer := &oracletypes.GossipVoteBuffer{ Buffer: make(map[string]*oracleproto.GossipVote), } @@ -79,9 +58,7 @@ func NewReactor(config *config.OracleConfig, pubKey crypto.PubKey, privValidator } oracleInfo := &oracletypes.OracleInfo{ - Oracles: nil, Config: config, - CustomNodeConfig: customNodeConfig, GossipVoteBuffer: gossipVoteBuffer, UnsignedVoteBuffer: unsignedVoteBuffer, SignVotesChan: make(chan *oracleproto.Vote), @@ -89,8 +66,6 @@ func NewReactor(config *config.OracleConfig, pubKey crypto.PubKey, privValidator PrivValidator: privValidator, } - jsonFile.Close() - oracleR := &Reactor{ OracleInfo: oracleInfo, ids: newOracleIDs(), @@ -114,8 +89,6 @@ func (oracleR *Reactor) SetLogger(l log.Logger) { // OnStart implements p2p.BaseReactor. func (oracleR *Reactor) OnStart() error { - oracleR.OracleInfo.Redis = redis.NewService(0) - oracleR.OracleInfo.AdapterMap = adapters.GetAdapterMap(&oracleR.OracleInfo.Redis, oracleR.OracleInfo.Config.RestApiAddress) logrus.Info("[oracle] running oracle service...") go func() { runner.Run(oracleR.OracleInfo) @@ -165,6 +138,8 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { oracleR.Logger.Debug("Receive", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) switch msg := e.Message.(type) { case *oracleproto.GossipVote: + + // verify if val // verify sig of incoming gossip vote, throw if verification fails signType := msg.SignType var pubKey crypto.PubKey diff --git a/oracle/service/adapters/adapters.go b/oracle/service/adapters/adapters.go deleted file mode 100644 index 1eac562b584..00000000000 --- a/oracle/service/adapters/adapters.go +++ /dev/null @@ -1,30 +0,0 @@ -package adapters - -import ( - "github.com/cometbft/cometbft/oracle/service/types" - "github.com/cometbft/cometbft/redis" - log "github.com/sirupsen/logrus" -) - -// GetAdapterMap returns a map of all adapters -func GetAdapterMap(redisService *redis.Service, restUrl string) map[string]types.Adapter { - adapterMap := make(map[string]types.Adapter) - adaptersList := []types.Adapter{ - NewFetcher(redisService), NewFetcherMultiple(redisService), - NewUnresponsiveHandler(redisService), NewUnchangedHandler(redisService), - NewMedianFilter(redisService), NewWeightedAverage(redisService), - NewFloatHandler(redisService), NewDecimalHandler(redisService), - NewMathFilter(redisService), NewOracleResultFetcher(redisService, restUrl), - NewEVMValueParser(redisService), NewEVMStructParser(redisService), NewEVMFetcher(redisService), - NewStaticHandler(redisService), - } - for _, adapter := range adaptersList { - _, existing := adapterMap[adapter.Id()] - if existing { - log.Errorf("Duplicate ID for %s, ignoring duplicate", adapter.Id()) - continue - } - adapterMap[adapter.Id()] = adapter - } - return adapterMap -} diff --git a/oracle/service/adapters/decimal_handler.go b/oracle/service/adapters/decimal_handler.go deleted file mode 100644 index 0eea411f179..00000000000 --- a/oracle/service/adapters/decimal_handler.go +++ /dev/null @@ -1,79 +0,0 @@ -package adapters - -import ( - "fmt" - - sdkmath "cosmossdk.io/math" - "github.com/cometbft/cometbft/oracle/service/types" - "github.com/cometbft/cometbft/redis" -) - -// DecimalHandler struct for decimal handler -type DecimalHandler struct { - redisService *redis.Service -} - -func NewDecimalHandler(redisService *redis.Service) *DecimalHandler { - return &DecimalHandler{ - redisService: redisService, - } -} - -// Id returns float handler Id -func (handler *DecimalHandler) Id() string { - return "decimal_handler" -} - -// Validate validate job config -func (handler *DecimalHandler) Validate(job types.OracleJob) error { - op := job.ConfigValue("operation").String() - switch op { - case "decrease", "increase": - // check the exponent is a valid uint - job.ConfigValue("exponent").Uint64() - default: - return fmt.Errorf("unsupported operation '%s'", op) - } - return nil -} - -// ShiftDecimalLeft - Shift decimal point to the left by exponent -func ShiftDecimalLeft(value sdkmath.LegacyDec, exponent uint64) string { - multiplier := sdkmath.NewIntWithDecimal(1, int(exponent)) - return value.QuoInt(multiplier).String() -} - -// ShiftDecimalRight - Shift decimal point to the right by exponent -func ShiftDecimalRight(value sdkmath.LegacyDec, exponent uint64) string { - multiplier := sdkmath.NewIntWithDecimal(1, int(exponent)) - return value.MulInt(multiplier).String() -} - -// Perform handles float operations -func (handler *DecimalHandler) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, _ *types.AdapterStore) (types.AdapterResult, error) { - input := job.GetInput(result) - if input.IsEmpty() { - return result, fmt.Errorf("%s: input cannot be empty", job.InputId) - } - inputDec, err := sdkmath.LegacyNewDecFromStr(input.String()) - if err != nil { - return result, err - } - - var output redis.GenericValue - op := job.ConfigValue("operation").String() - exponent := job.ConfigValue("exponent").Uint64() - - switch op { - case "decrease": - output = types.StringToGenericValue(ShiftDecimalLeft(inputDec, exponent)) - case "increase": - output = types.StringToGenericValue(ShiftDecimalRight(inputDec, exponent)) - default: - panic("unsupported operation: " + op) - } - - job.SetOutput(result, output) - - return result, nil -} diff --git a/oracle/service/adapters/evm_fetcher.go b/oracle/service/adapters/evm_fetcher.go deleted file mode 100644 index f82b0e438a0..00000000000 --- a/oracle/service/adapters/evm_fetcher.go +++ /dev/null @@ -1,119 +0,0 @@ -package adapters - -import ( - "context" - "encoding/hex" - "fmt" - "net/url" - - "github.com/cometbft/cometbft/oracle/service/types" - "github.com/cometbft/cometbft/redis" - "github.com/ethereum/go-ethereum" - ethcommon "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/ethclient" - log "github.com/sirupsen/logrus" -) - -// EVMFetcher struct for evmFetcher -type EVMFetcher struct { - redisService *redis.Service -} - -func NewEVMFetcher(redisService *redis.Service) *EVMFetcher { - return &EVMFetcher{ - redisService: redisService, - } -} - -// Id returns evmFetcher Id -func (evmFetcher *EVMFetcher) Id() string { - return "evm_fetcher" -} - -// Validate validate job config -func (evmFetcher *EVMFetcher) Validate(job types.OracleJob) error { - address := job.ConfigValue("address") - calldata := job.ConfigValue("calldata") - nodeRpc := job.ConfigValue("default_node_rpc") - nodeKey := job.ConfigValue("custom_node_url_key") - switch { - case address.IsEmpty(): - return fmt.Errorf("address cannot be blank") - case calldata.IsEmpty(): - return fmt.Errorf("calldata cannot be blank") - case nodeRpc.IsEmpty(): - return fmt.Errorf("default_node_rpc cannot be blank") - case nodeKey.IsEmpty(): - return fmt.Errorf("custom_node_url_key cannot be blank") - } - return nil -} - -// GetRpcUrl attempts to get the rpc url from config file, if not it populates the config file with the default rpc url -func GetRpcUrl(job types.OracleJob, config types.CustomNodeConfig) (string, error) { - rpcUrl := job.ConfigValue("default_node_rpc").String() - nodeKey := job.ConfigValue("custom_node_url_key").String() - - customNode, exists := config[nodeKey] - - if exists && customNode.Host != "" { - rpcUrl = customNode.Host - url, err := url.Parse(rpcUrl) - if err != nil { - log.Warnf("%s: evm_fetcher: error parsing custom rpc url, using default url instead: %s", nodeKey, err) - } else { - return url.String(), nil - } - } - - url, err := url.Parse(rpcUrl) - if err != nil { - return "", fmt.Errorf("evm_fetcher: error parsing default rpc url: %s", err) - } - - return url.String(), nil -} - -// Perform performs a network request -func (evmFetcher *EVMFetcher) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, _ *types.AdapterStore) (types.AdapterResult, error) { - rpcUrl, err := GetRpcUrl(job, runTimeInput.Config) - if err != nil { - return result, err - } - client, err := ethclient.Dial(rpcUrl) - if err != nil { - return result, err - } - - addrStr := job.ConfigValue("address").String() - addr, err := hexutil.Decode(addrStr) - if err != nil { - return result, err - } - ethAddr := ethcommon.BytesToAddress(addr) - - calldataStr := job.ConfigValue("calldata").String() - data, err := hexutil.Decode(calldataStr) - if err != nil { - return result, err - } - - msg := ethereum.CallMsg{ - To: ðAddr, - Data: data, - } - rsp, err := client.CallContract(context.Background(), msg, nil) - if err != nil { - return result, err - } - - rspHexStr := hex.EncodeToString(rsp) - genericValue := types.StringToGenericValue(rspHexStr) - if err != nil { - return result, err - } - - result = job.SetOutput(result, genericValue) - return result, nil -} diff --git a/oracle/service/adapters/evm_struct_parser.go b/oracle/service/adapters/evm_struct_parser.go deleted file mode 100644 index abf5940df56..00000000000 --- a/oracle/service/adapters/evm_struct_parser.go +++ /dev/null @@ -1,89 +0,0 @@ -package adapters - -import ( - "encoding/hex" - "fmt" - "math/big" - - sdkmath "cosmossdk.io/math" - "github.com/cometbft/cometbft/oracle/service/types" - "github.com/cometbft/cometbft/redis" - "github.com/ethereum/go-ethereum/accounts/abi" -) - -// EVMStructParser struct for evmStructParser -type EVMStructParser struct { - redisService *redis.Service -} - -func NewEVMStructParser(redisService *redis.Service) *EVMStructParser { - return &EVMStructParser{ - redisService: redisService, - } -} - -// Id returns evmStructParser Id -func (evmStructParser *EVMStructParser) Id() string { - return "evm_struct_parser" -} - -// Validate validate job config -func (evmStructParser *EVMStructParser) Validate(job types.OracleJob) error { - outputStruct := job.ConfigValue("output_struct") - outputType := job.ConfigValue("output_type") - outputIndex := job.ConfigValue("output_index") - switch { - case outputStruct.IsEmpty(): - return fmt.Errorf("%s: output_struct cannot be blank", job.OutputId) - case outputIndex.IsEmpty(): - return fmt.Errorf("%s: output_index cannot be blank", job.OutputId) - case outputType.IsEmpty(): - return fmt.Errorf("%s: output_type cannot be blank", job.OutputId) - } - return nil -} - -func ParseEvmStructResponse(outputType string, outputStruct []string, outputIndex int64, evmResponse []byte) (redis.GenericValue, error) { - args := abi.Arguments{} - for _, argType := range outputStruct { - abiType, err := abi.NewType(argType, "", nil) - if err != nil { - panic(err) - } - args = append(args, abi.Argument{Type: abiType}) - } - responseInterface, err := args.Unpack(evmResponse) - if err != nil { - return types.StringToGenericValue(""), err - } - resultInterface := responseInterface[outputIndex] - switch outputType { - case "uint256": - z := new(big.Int) - z.SetString(fmt.Sprint(resultInterface), 10) - sdkInt := sdkmath.NewIntFromBigInt(z) - return types.StringToGenericValue(sdkInt.String()), nil - default: - return types.StringToGenericValue(""), fmt.Errorf("unsupported operation: %s", outputType) - } -} - -// Perform performs a network request -func (evmStructParser *EVMStructParser) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, _ *types.AdapterStore) (types.AdapterResult, error) { - rspHexStr := job.GetInput(result).String() - rsp, err := hex.DecodeString(rspHexStr) - if err != nil { - return result, err - } - outputType := job.ConfigValue("output_type").String() - outputStruct := job.ConfigValue("output_struct").StringArray() - outputIndex := job.ConfigValue("output_index").Int64() - - genericValue, err := ParseEvmStructResponse(outputType, outputStruct, outputIndex, rsp) - if err != nil { - return result, err - } - - result = job.SetOutput(result, genericValue) - return result, nil -} diff --git a/oracle/service/adapters/evm_value_parser.go b/oracle/service/adapters/evm_value_parser.go deleted file mode 100644 index 9b35cc725aa..00000000000 --- a/oracle/service/adapters/evm_value_parser.go +++ /dev/null @@ -1,72 +0,0 @@ -package adapters - -import ( - "encoding/hex" - "fmt" - "math/big" - - sdkmath "cosmossdk.io/math" - "github.com/cometbft/cometbft/oracle/service/types" - "github.com/cometbft/cometbft/redis" - "github.com/holiman/uint256" -) - -// EVMValueParser struct for evmValueParser -type EVMValueParser struct { - redisService *redis.Service -} - -func NewEVMValueParser(redisService *redis.Service) *EVMValueParser { - return &EVMValueParser{ - redisService: redisService, - } -} - -// Id returns evmValueParser Id -func (evmValueParser *EVMValueParser) Id() string { - return "evm_value_parser" -} - -// Validate validate job config -func (evmValueParser *EVMValueParser) Validate(job types.OracleJob) error { - outputType := job.ConfigValue("output_type") - switch { - case outputType.IsEmpty(): - return fmt.Errorf("%s: outputType cannot be blank", job.OutputId) - } - return nil -} - -func ParseSingleEvmResponse(outputType string, evmResponse []byte) (redis.GenericValue, error) { - switch outputType { - case "uint256": - z := new(big.Int) - z.SetBytes(evmResponse) - _, overflow := uint256.FromBig(z) - if overflow { - panic("number is more than uint256") - } - sdkInt := sdkmath.NewIntFromBigInt(z) - return types.StringToGenericValue(sdkInt.String()), nil - default: - panic("unsupported operation: " + outputType) - } -} - -// Perform performs a network request -func (evmValueParser *EVMValueParser) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, _ *types.AdapterStore) (types.AdapterResult, error) { - rspHexStr := job.GetInput(result).String() - rsp, err := hex.DecodeString(rspHexStr) - if err != nil { - return result, err - } - outputType := job.ConfigValue("output_type").String() - - genericValue, err := ParseSingleEvmResponse(outputType, rsp) - if err != nil { - return result, err - } - - result = job.SetOutput(result, genericValue) - return result, nil -} diff --git a/oracle/service/adapters/fetcher.go b/oracle/service/adapters/fetcher.go deleted file mode 100644 index 6dcb658d8de..00000000000 --- a/oracle/service/adapters/fetcher.go +++ /dev/null @@ -1,176 +0,0 @@ -package adapters - -import ( - "bytes" - "fmt" - "io/ioutil" - "net/http" - "time" - - "github.com/cometbft/cometbft/oracle/service/types" - "github.com/cometbft/cometbft/redis" - "github.com/go-redsync/redsync/v4" - "github.com/go-redsync/redsync/v4/redis/goredis" - log "github.com/sirupsen/logrus" - "github.com/tidwall/gjson" -) - -// Fetcher struct for fetcher -type Fetcher struct { - redisService *redis.Service -} - -func NewFetcher(redisService *redis.Service) *Fetcher { - return &Fetcher{ - redisService: redisService, - } -} - -// Id returns fetcher Id -func (fetcher *Fetcher) Id() string { - return "fetcher" -} - -// Validate validate job config -func (fetcher *Fetcher) Validate(job types.OracleJob) error { - url := job.ConfigValue("url") - timeout := job.ConfigValue("timeout") - path := job.ConfigValue("path") - switch { - case url.IsEmpty(): - return fmt.Errorf("url cannot be blank") - case timeout.Uint64() == 0: - return fmt.Errorf("invalid timeout") - case path.IsEmpty(): - return fmt.Errorf("path cannot be blank") - } - return nil -} - -// Perform performs a network request -func (fetcher *Fetcher) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, _ *types.AdapterStore) (types.AdapterResult, error) { - url := job.ConfigValue("url").String() - timeout := job.ConfigValue("timeout").Uint64() - reqBody := job.ConfigValue("request_body").String() - - responseStr := GetUrlResponse(url, timeout, reqBody) - if responseStr == "" { - return result, fmt.Errorf("empty response for %s", url) - } - - output := "" - path := job.ConfigValue("path").String() - if path != "" { - value := gjson.Get(responseStr, job.ConfigValue("path").String()) - output = value.String() - } - - if output == "" { - log.Warnln("empty output for " + url) - } - - result = job.SetOutput(result, types.StringToGenericValue(output)) - return result, nil -} - -func HTTPRequest(url string, timeout uint64) []byte { - httpClient := http.Client{ - Timeout: time.Duration(timeout) * time.Second, - } - - var response *http.Response - response, err := httpClient.Get(url) - - if err != nil { - return []byte{} - } - - defer response.Body.Close() - - body, readErr := ioutil.ReadAll(response.Body) - - if readErr != nil { - return []byte{} - } - - return body -} - -// getUrlResponse attempts to get a url response from redis cache -// if redis cache is empty, it will make a http call and populate redis with the url as key -func GetUrlResponse(url string, timeout uint64, reqBody string) string { - redService := redis.NewService(0) - defer redService.Client.Close() - pool := goredis.NewPool(redService.Client) - - // Create an instance of redisync to be used to obtain a mutual exclusion - // lock. - rs := redsync.New(pool) - - lockKey := GetUrlFetcherLockKey(url) - locker := rs.NewMutex(lockKey, redsync.WithTries(50), redsync.WithExpiry(time.Second*5), redsync.WithRetryDelay(time.Millisecond*100)) - - if err := locker.Lock(); err != nil { - return "" - } - - urlResponseKey := GetUrlFetcherResponseKey(url) - - outputGeneric, ok, err := redService.Get(urlResponseKey) - if err == nil && ok { - if ok, err := locker.Unlock(); !ok || err != nil { - panic(fmt.Sprintf("getUrlResponse: unlock failed: %s", err.Error())) - } - return outputGeneric.String() - } - - httpClient := http.Client{ - Timeout: time.Duration(timeout) * time.Second, - } - - var response *http.Response - - //nolint: bodyclose // ignore lint error for response.Body.Close() being outside of if else block - // if reqBody is present, perform post request instead - if reqBody != "" { - response, err = httpClient.Post(url, "application/json", bytes.NewBuffer([]byte(reqBody))) - } else { - response, err = httpClient.Get(url) - } - - if err != nil { - return "" - } - - defer response.Body.Close() - - body, readErr := ioutil.ReadAll(response.Body) - - if readErr != nil { - return "" - } - - output := string(body) - - if err := redService.SetNX(urlResponseKey, types.StringToGenericValue(output), time.Second*5); err != nil { - log.Warnf("getUrlResponse: failed to set response cache on redis for oracle: %s, %e", urlResponseKey, err) - return output - } - - if ok, err := locker.Unlock(); !ok || err != nil { - log.Warnf("getUrlResponse: failed to unlock response cache mutex for oracle: %v, %s, %e", ok, urlResponseKey, err) - return output - } - - return output -} - -// GetUrlFetcherLockKey returns the lock key for a given url -func GetUrlFetcherLockKey(url string) string { - return fmt.Sprintf("oracle:url-lock:%s", url) -} - -// GetUrlFetcherResponseKey returns the response key for a given url -func GetUrlFetcherResponseKey(url string) string { - return fmt.Sprintf("oracle:url-response:%s", url) -} diff --git a/oracle/service/adapters/fetcher_multiple.go b/oracle/service/adapters/fetcher_multiple.go deleted file mode 100644 index 7920b2ee11e..00000000000 --- a/oracle/service/adapters/fetcher_multiple.go +++ /dev/null @@ -1,109 +0,0 @@ -package adapters - -import ( - "fmt" - neturl "net/url" - - "github.com/cometbft/cometbft/oracle/service/types" - "github.com/cometbft/cometbft/redis" - log "github.com/sirupsen/logrus" - "github.com/tidwall/gjson" -) - -// FetcherMultiple struct for fetcherMultiple -type FetcherMultiple struct { - redisService *redis.Service -} - -func NewFetcherMultiple(redisService *redis.Service) *FetcherMultiple { - return &FetcherMultiple{ - redisService: redisService, - } -} - -// Id returns fetcherMultiple Id -func (fetcherMultiple *FetcherMultiple) Id() string { - return "fetcher_multiple" -} - -// Validate validate job config -func (fetcherMultiple *FetcherMultiple) Validate(job types.OracleJob) error { - node_key := job.ConfigValue("custom_node_url_key") - timeout := job.ConfigValue("timeout") - paths := job.ConfigValue("paths").StringArray() - switch { - case node_key.IsEmpty(): - return fmt.Errorf("custom_node_url_key cannot be blank") - case timeout.Uint64() == 0: - return fmt.Errorf("invalid timeout") - case len(paths) == 0: - return fmt.Errorf("no paths") - } - return nil -} - -func GetUrl(job types.OracleJob, config types.CustomNodeConfig) (string, error) { - nodeHost := job.ConfigValue("default_node_host").String() - nodePath := job.ConfigValue("default_node_path").String() - nodeKey := job.ConfigValue("custom_node_url_key").String() - - customNode, exists := config[nodeKey] - - if exists && customNode.Host != "" && customNode.Path != "" { - nodeHost = customNode.Host - nodePath = customNode.Path - baseUrl, err := neturl.Parse(nodeHost) - if err != nil { - log.Warnf("%s: fetcher_multiple: error parsing custom url, using default url instead: %s", nodeKey, err) - } else { - url := baseUrl.String() + nodePath - return url, nil - } - } - - baseUrl, err := neturl.Parse(nodeHost) - if err != nil { - return "", fmt.Errorf("fetcher_multiple: error parsing default url: %s", err) - } - url := baseUrl.String() + nodePath - - return url, nil -} - -// Perform performs a network request -func (fetcherMultiple *FetcherMultiple) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, _ *types.AdapterStore) (types.AdapterResult, error) { - url, err := GetUrl(job, runTimeInput.Config) - if err != nil { - return result, err - } - - timeout := job.ConfigValue("timeout").Uint64() - reqBody := job.ConfigValue("request_body").String() - - responseStr := GetUrlResponse(url, timeout, reqBody) - if responseStr == "" { - return result, fmt.Errorf("empty response from %s", url) - } - - paths := job.ConfigValue("paths").StringArray() - outputs := []string{} - for idx := range paths { - output := "" - if paths[idx] != "" { - value := gjson.Get(responseStr, paths[idx]) - output = value.String() - } - - if output == "" { - result = job.SetOutput(result, types.StringToGenericValue("")) - return result, fmt.Errorf("empty output for %s at %s", url, paths[idx]) - } - outputs = append(outputs, output) - } - if len(paths) == 1 { - result = job.SetOutput(result, types.StringToGenericValue(outputs[0])) - return result, nil - } - result = job.SetOutputList(result, outputs) - return result, nil -} diff --git a/oracle/service/adapters/float_handler.go b/oracle/service/adapters/float_handler.go deleted file mode 100644 index 7d3c6d2479d..00000000000 --- a/oracle/service/adapters/float_handler.go +++ /dev/null @@ -1,71 +0,0 @@ -package adapters - -import ( - "fmt" - - "cosmossdk.io/math" - "github.com/cometbft/cometbft/oracle/service/types" - "github.com/cometbft/cometbft/redis" -) - -// FloatHandler struct for float handler -type FloatHandler struct { - redisService *redis.Service -} - -func NewFloatHandler(redisService *redis.Service) *FloatHandler { - return &FloatHandler{ - redisService: redisService, - } -} - -// Id returns float handler Id -func (handler *FloatHandler) Id() string { - return "float_handler" -} - -// Validate validate job config -func (handler *FloatHandler) Validate(job types.OracleJob) error { - op := job.ConfigValue("operation").String() - switch op { - case "round": - // check the precision is a valid uint - job.ConfigValue("precision").Uint64() - default: - return fmt.Errorf("unsupported operation: '%s'", op) - } - return nil -} - -// Round round to the specified precision -func Round(value math.LegacyDec, precision uint64) string { - multiplier := math.NewIntWithDecimal(1, int(precision)) - val := math.LegacyNewDecFromInt(value.MulInt(multiplier).RoundInt()).QuoInt(multiplier) - return val.String() -} - -// Perform handles float operations -func (handler *FloatHandler) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, _ *types.AdapterStore) (types.AdapterResult, error) { - input := job.GetInput(result) - if input.IsEmpty() { - return result, fmt.Errorf("%s: input cannot be empty", job.InputId) - } - value, err := math.LegacyNewDecFromStr(input.String()) - if err != nil { - return result, err - } - - var output redis.GenericValue - op := job.ConfigValue("operation").String() - switch op { - case "round": - rounded := Round(value, job.ConfigValue("precision").Uint64()) - output = types.StringToGenericValue(rounded) - default: - panic(fmt.Sprintf("unsupported operation: %s", op)) - } - - job.SetOutput(result, output) - - return result, nil -} diff --git a/oracle/service/adapters/math_filter.go b/oracle/service/adapters/math_filter.go deleted file mode 100644 index 82a6f690c18..00000000000 --- a/oracle/service/adapters/math_filter.go +++ /dev/null @@ -1,145 +0,0 @@ -package adapters - -import ( - "fmt" - - "github.com/cometbft/cometbft/redis" - - sdkmath "cosmossdk.io/math" - "github.com/cometbft/cometbft/oracle/service/types" -) - -// MathFilter struct for float handler -type MathFilter struct { - redisService *redis.Service -} - -func NewMathFilter(redisService *redis.Service) *MathFilter { - return &MathFilter{ - redisService: redisService, - } -} - -// Id returns math filter Id -func (handler *MathFilter) Id() string { - return "math_filter" -} - -var SUPPORTED_OPS = []string{"divide", "/", "multiply", "*", "add", "+", "subtract", "-", "min", "max"} - -// Validate validate job config -func (handler *MathFilter) Validate(job types.OracleJob) error { - _, err := getOperations(job) - if err != nil { - return err - } - return nil -} - -// getOperations returns the array of operations to be performed. -// Ops can either be a single string or an array of strings, the single string is to keep backwards compatibility, -// specs should use array of strings even if just for a single operation e.g. ["divide"] -func getOperations(job types.OracleJob) ([]string, error) { - ops := []string{job.ConfigValue("operation").String()} - if ops[0] == "" || !contains(SUPPORTED_OPS, ops[0]) { - ops = job.ConfigValue("operation").StringArray() - for _, op := range ops { - if !contains(SUPPORTED_OPS, op) { - return nil, fmt.Errorf("unsupported operation '%s'", op) - } - } - } - return ops, nil -} - -// contains checks if a string is present in a slice -func contains(s []string, str string) bool { - for _, v := range s { - if v == str { - return true - } - } - return false -} - -// checks if any of the input values for the math_filter job is empty -func isValidInputs(inputs []redis.GenericValue) bool { - for _, input := range inputs { - if input.IsEmpty() { - return false - } - } - return true -} - -// Combine combines two feeds into one -// e.g. swth/usdc, osmo/swth => osmo/usdc -func Combine(vals []types.GenericValue, ops []string) (sdkmath.LegacyDec, error) { - res, err := sdkmath.LegacyNewDecFromStr(vals[0].String()) - if err != nil { - return sdkmath.LegacyDec{}, err - } - for i := 1; i < len(vals); i++ { - op := ops[i-1] - val, err := sdkmath.LegacyNewDecFromStr(vals[i].String()) - if err != nil { - return sdkmath.LegacyDec{}, err - } - switch op { - case "divide", "/": - if val.IsZero() { - return sdkmath.LegacyDec{}, fmt.Errorf("val at index %d is zero, cannot divide", i) - } - res = res.Quo(val) - case "multiply", "*": - res = res.Mul(val) - case "add", "+": - res = res.Add(val) - case "subtract", "-": - if res.LT(val) { - return sdkmath.LegacyDec{}, fmt.Errorf("val at index %d is greater than res, cannot subtract", i) - } - res = res.Sub(val) - case "max": - res = sdkmath.LegacyMaxDec(res, val) - case "min": - res = sdkmath.LegacyMinDec(res, val) - default: - panic("unsupported operation " + op) - } - } - return res, nil -} - -// Perform handles math filter operations -func (handler *MathFilter) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, _ *types.AdapterStore) (types.AdapterResult, error) { - ops, err := getOperations(job) - if err != nil { - return result, fmt.Errorf("%s: unable to get operations for job: %s", job.OutputId, err) - } - - vals, err := job.GetInputs(result) - if err != nil { - return result, fmt.Errorf("%s: unable to get inputs for job: %s", job.OutputId, err) - } - - if !isValidInputs(vals) { - return result, fmt.Errorf("%s: empty inputs detected, skipping job", job.OutputId) - } - - if len(vals) < 2 { - return result, fmt.Errorf("number of val input %d for math filter not supported", len(vals)) - } - - if len(ops) != len(vals)-1 { - return result, fmt.Errorf("number of values != number of operations - 1 for oracle_id") - } - - outputVal, err := Combine(vals, ops) - if err != nil { - return result, fmt.Errorf("error combining values: %s", err.Error()) - } - output := types.StringToGenericValue(outputVal.String()) - job.SetOutput(result, output) - return result, nil -} diff --git a/oracle/service/adapters/median_filter.go b/oracle/service/adapters/median_filter.go deleted file mode 100644 index 4aa17652874..00000000000 --- a/oracle/service/adapters/median_filter.go +++ /dev/null @@ -1,86 +0,0 @@ -package adapters - -import ( - "fmt" - "sort" - - "github.com/cometbft/cometbft/oracle/service/types" - "github.com/cometbft/cometbft/redis" -) - -// MedianFilter struct for median filter -type MedianFilter struct { - redisService *redis.Service -} - -// Id returns median filter Id -func (filter *MedianFilter) Id() string { - return "median_filter" -} - -func NewMedianFilter(redisService *redis.Service) *MedianFilter { - return &MedianFilter{ - redisService: redisService, - } -} - -// Validate validate job config -func (filter *MedianFilter) Validate(job types.OracleJob) error { - valueIds := job.ConfigValue("value_ids").StringArray() - percentage := job.ConfigValue("tolerance_percentage").Float64() - switch { - case len(valueIds) == 0: - return fmt.Errorf("value_ids cannot be blank") - case percentage < 0 || percentage > 100: - return fmt.Errorf("tolerance_percentage must be in range [0, 100]") - } - return nil -} - -// CalcMedian calculate the median of an array of float64 values -func CalcMedian(values []float64) float64 { - sort.Float64s(values) - mid := len(values) / 2 - - if len(values)%2 == 1 { - return values[mid] - } - - sum := values[mid-1] + values[mid] - return sum / 2 -} - -// Perform sets the input value to an empty string if its deviation from the median exceeds the specified threshold -func (filter *MedianFilter) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, _ *types.AdapterStore) (types.AdapterResult, error) { - input := job.GetInput(result) - if input.IsEmpty() { - return result, fmt.Errorf("%s: input cannot be empty", job.InputId) - } - - valueIds := job.ConfigValue("value_ids").StringArray() - tolerancePercentage := job.ConfigValue("tolerance_percentage").Float64() - var values []float64 - for _, valueId := range valueIds { - value := result.GetData(valueId) - if value.Present() { - values = append(values, value.Float64()) - } - } - - if len(values) == 0 { - return result, fmt.Errorf("%s: no values found for value_ids: %v", job.InputId, valueIds) - } - - median := CalcMedian(values) - output := input - minValue := median - median/100*tolerancePercentage - maxValue := median + median/100*tolerancePercentage - - if input.Float64() < minValue || input.Float64() > maxValue { - output = types.StringToGenericValue("") - } - - result = job.SetOutput(result, output) - - return result, nil -} diff --git a/oracle/service/adapters/oracle_result_fetcher.go b/oracle/service/adapters/oracle_result_fetcher.go deleted file mode 100644 index ab9553b1fa9..00000000000 --- a/oracle/service/adapters/oracle_result_fetcher.go +++ /dev/null @@ -1,126 +0,0 @@ -package adapters - -import ( - "encoding/json" - "fmt" - "strconv" - "time" - - "github.com/cometbft/cometbft/oracle/service/types" - "github.com/cometbft/cometbft/proto/tendermint/oracle" - "github.com/cometbft/cometbft/redis" - "github.com/sirupsen/logrus" -) - -const ORACLE_ID = "oracle_id" -const STALE_ALLOWANCE = "stale_allowance" - -// OracleResultFetcher struct for float handler -type OracleResultFetcher struct { - redisService *redis.Service - restUrl string -} - -func NewOracleResultFetcher(redisService *redis.Service, restUrl string) *OracleResultFetcher { - return &OracleResultFetcher{ - redisService: redisService, - restUrl: restUrl, - } -} - -// Id returns cache fetcher Id -func (oracleResultFetcher *OracleResultFetcher) Id() string { - return "oracle_result_fetcher" -} - -// Validate validate job config -func (oracleResultFetcher *OracleResultFetcher) Validate(job types.OracleJob) error { - oracleId := job.ConfigValue(ORACLE_ID) - staleAllowance := job.ConfigValue(STALE_ALLOWANCE) - if oracleId.IsEmpty() { - return fmt.Errorf("oracle ID cannot be blank") - } - if staleAllowance.IsEmpty() { - return fmt.Errorf("stale allowance cannot be blank") - } - return nil -} - -// Perform handles cache fetcher operations -func (oracleResultFetcher *OracleResultFetcher) Perform(job types.OracleJob, result types.AdapterResult, _ types.AdapterRunTimeInput, _ *types.AdapterStore) (types.AdapterResult, error) { - oracleID := job.ConfigValue(ORACLE_ID).String() - staleAllowance := job.ConfigValue(STALE_ALLOWANCE).String() - - price, cacheErr := getOracleResultFromCache(oracleID, staleAllowance, *oracleResultFetcher.redisService) - - if cacheErr != nil { - logrus.Error(cacheErr) - var apiErr error - price, apiErr = getOracleResultFromAPI(oracleID, oracleResultFetcher.restUrl) - if apiErr != nil { - return result, apiErr - } - } - - job.SetOutput(result, types.StringToGenericValue(price)) - - return result, nil -} - -// GetOracleResultKey returns the redis key for a given oracle -func GetOracleResultKey(oracleId string) string { - return fmt.Sprintf("oracle-result:%s", oracleId) -} - -func getOracleResultFromCache(oracleId string, staleAllowance string, redisService redis.Service) (string, error) { - key := GetOracleResultKey(oracleId) - outputGeneric, ok, err := redisService.Get(key) - if err != nil || !ok { - return "", err - } - - outputString := outputGeneric.String() - var oracleCache types.OracleCache - unmarshalErr := json.Unmarshal([]byte(outputString), &oracleCache) - if unmarshalErr != nil { - return "", unmarshalErr - } - - elapsedTime := time.Since(oracleCache.Timestamp.Time) - timeout, err := strconv.ParseUint(staleAllowance, 10, 64) - if err != nil { - return "", err - } - - if elapsedTime.Seconds() > float64(timeout) { - return "", fmt.Errorf("oracle: %s stale allowance exceeded", oracleId) - } - - return oracleCache.Price, nil -} - -func getOracleResultFromAPI(oracleID, restUrl string) (string, error) { - if restUrl == "" { - restUrl = "https://test-api.carbon.network" - } - restUrl = restUrl + "/carbon/oracle/v1/results/" + oracleID - response := HTTPRequest(restUrl, 10) - - if len(response) == 0 { - return "", fmt.Errorf("empty response from %s", restUrl) - } - - type Response struct { - Results []oracle.Result `json:"results"` - } - - var parsedResponse Response - - if err := json.Unmarshal(response, &parsedResponse); err != nil { - return "", err - } - - grpcResult := []oracle.Result{parsedResponse.Results[len(parsedResponse.Results)-1]} - - return grpcResult[0].Data, nil -} diff --git a/oracle/service/adapters/static_handler.go b/oracle/service/adapters/static_handler.go deleted file mode 100644 index b2d6d05e50f..00000000000 --- a/oracle/service/adapters/static_handler.go +++ /dev/null @@ -1,48 +0,0 @@ -package adapters - -import ( - "fmt" - - sdkmath "cosmossdk.io/math" - "github.com/cometbft/cometbft/oracle/service/types" - "github.com/cometbft/cometbft/redis" -) - -// StaticHandler struct for decimal handler -type StaticHandler struct { - redisService *redis.Service -} - -func NewStaticHandler(redisService *redis.Service) *StaticHandler { - return &StaticHandler{ - redisService: redisService, - } -} - -// Id returns float handler Id -func (handler *StaticHandler) Id() string { - return "static_handler" -} - -// Validate validate job config -func (handler *StaticHandler) Validate(job types.OracleJob) error { - valStr := job.ConfigValue("value").String() - _, err := sdkmath.LegacyNewDecFromStr(valStr) - if err != nil { - return fmt.Errorf("value %s cannot be cast to sdk.Dec error: %s", valStr, err.Error()) - } - return nil -} - -// Perform handles float operations -func (handler *StaticHandler) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, _ *types.AdapterStore) (types.AdapterResult, error) { - valStr := job.ConfigValue("value").String() - val, err := sdkmath.LegacyNewDecFromStr(valStr) - if err != nil { - return result, fmt.Errorf("value %s cannot be cast to sdk.Dec error: %s", valStr, err.Error()) - } - output := types.StringToGenericValue(val.String()) - - job.SetOutput(result, output) - return result, nil -} diff --git a/oracle/service/adapters/unchanged_handler.go b/oracle/service/adapters/unchanged_handler.go deleted file mode 100644 index f711b9cf99d..00000000000 --- a/oracle/service/adapters/unchanged_handler.go +++ /dev/null @@ -1,78 +0,0 @@ -package adapters - -import ( - "fmt" - - "github.com/cometbft/cometbft/oracle/service/types" - "github.com/cometbft/cometbft/redis" - log "github.com/sirupsen/logrus" -) - -// UnchangedHandler struct for unresponsive handler -type UnchangedHandler struct { - redisService *redis.Service -} - -func NewUnchangedHandler(redisService *redis.Service) *UnchangedHandler { - return &UnchangedHandler{ - redisService: redisService, - } -} - -// Id returns unchanged handler Id -func (handler *UnchangedHandler) Id() string { - return "unchanged_handler" -} - -// Validate validate job config -func (handler *UnchangedHandler) Validate(job types.OracleJob) error { - strategy := job.ConfigValue("strategy").String() - switch strategy { - case "nullify": - default: - return fmt.Errorf("unsupported strategy '%s'", strategy) - } - // check that threshold_duration is a valid uint - job.ConfigValue("threshold_duration").Uint64() - return nil -} - -// StoreHash struct for store hash -type StoreHash struct { - Value string - LastUpdateTime uint64 -} - -// Perform handles unchanged responses -func (handler *UnchangedHandler) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, store *types.AdapterStore) (types.AdapterResult, error) { - input := job.GetInput(result) - - var lastUpdateTime types.GenericValue - var lastValue types.GenericValue - if runTimeInput.LastStoreDataExists { - lastUpdateTime = runTimeInput.GetLastStoreData("last_update_time") - lastValue = runTimeInput.GetLastStoreData("value") - } - - thresholdDuration := job.ConfigValue("threshold_duration").Uint64() - - valueWasChanged := input.String() != lastValue.String() - valueIsStale := lastUpdateTime.Present() && lastUpdateTime.Uint64() < runTimeInput.BeginTime-thresholdDuration - - if runTimeInput.LastStoreDataExists && !valueWasChanged && valueIsStale { - log.Warnf("[oracle] Unchanged value for %+v, %+v", job.InputId, job.OutputId) - job.SetOutput(result, types.StringToGenericValue("")) - } else { - job.SetOutput(result, input) - } - - store.ShouldPersist = true - - store.SetData("value", input) - store.SetData("last_update_time", lastUpdateTime) - if valueWasChanged { - store.SetData("last_update_time", types.Uint64ToGenericValue(runTimeInput.BeginTime)) - } - - return result, nil -} diff --git a/oracle/service/adapters/unresponsive_handler.go b/oracle/service/adapters/unresponsive_handler.go deleted file mode 100644 index df27ef26469..00000000000 --- a/oracle/service/adapters/unresponsive_handler.go +++ /dev/null @@ -1,67 +0,0 @@ -package adapters - -import ( - "fmt" - - "github.com/cometbft/cometbft/oracle/service/types" - "github.com/cometbft/cometbft/redis" -) - -// UnresponsiveHandler struct for unresponsive handler -type UnresponsiveHandler struct { - redisService *redis.Service -} - -func NewUnresponsiveHandler(redisService *redis.Service) *UnresponsiveHandler { - return &UnresponsiveHandler{ - redisService: redisService, - } -} - -// Id returns unresponsive handler Id -func (handler *UnresponsiveHandler) Id() string { - return "unresponsive_handler" -} - -// Validate validate job config -func (handler *UnresponsiveHandler) Validate(job types.OracleJob) error { - strategy := job.ConfigValue("strategy").String() - switch strategy { - case "use_last": - default: - return fmt.Errorf("unsupported strategy '%s'", strategy) - } - // check that grace_duration is a valid uint - // TODO: refactor GenericValue to not panic - job.ConfigValue("grace_duration").Uint64() - return nil -} - -// Perform handles empty responses -func (handler *UnresponsiveHandler) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, store *types.AdapterStore) (types.AdapterResult, error) { - input := job.GetInput(result) - output := input - - graceDuration := job.ConfigValue("grace_duration").Uint64() - var lastResponsiveTime uint64 - if runTimeInput.LastStoreDataExists && runTimeInput.GetLastStoreData("last_responsive_time").Present() { - lastResponsiveTime = runTimeInput.GetLastStoreData("last_responsive_time").Uint64() - } - - store.SetData("last_responsive_time", types.Uint64ToGenericValue(lastResponsiveTime)) - - withinGraceDuration := lastResponsiveTime > runTimeInput.BeginTime-graceDuration - - if output.IsEmpty() && runTimeInput.LastStoreDataExists && withinGraceDuration { - output = runTimeInput.GetLastStoreData("value") - } else { - store.SetData("last_responsive_time", types.Uint64ToGenericValue(runTimeInput.BeginTime)) - } - - store.ShouldPersist = true - store.SetData("value", output) - - result = job.SetOutput(result, output) - - return result, nil -} diff --git a/oracle/service/adapters/weighted_average.go b/oracle/service/adapters/weighted_average.go deleted file mode 100644 index 9db1b182dc2..00000000000 --- a/oracle/service/adapters/weighted_average.go +++ /dev/null @@ -1,87 +0,0 @@ -package adapters - -import ( - "fmt" - - "github.com/cometbft/cometbft/oracle/service/types" - "github.com/cometbft/cometbft/redis" -) - -// WeightedAverage struct for weighted average -type WeightedAverage struct { - redisService *redis.Service -} - -func NewWeightedAverage(redisService *redis.Service) *WeightedAverage { - return &WeightedAverage{ - redisService: redisService, - } -} - -// Id returns weighted average Id -func (adapter *WeightedAverage) Id() string { - return "weighted_average" -} - -// Validate validate job config -func (adapter *WeightedAverage) Validate(job types.OracleJob) error { - valueIds := job.ConfigValue("value_ids").StringArray() - weights := job.ConfigValue("weights").Float64Array() - switch { - case len(valueIds) != len(weights): - return fmt.Errorf("len(value_ids) != len(weights)") - case len(valueIds) == 0: - return fmt.Errorf("value_ids cannot be 0") - } - return nil -} - -// CalcWeightedAverage calculate the mean of an array of float64 values -func CalcWeightedAverage(values []float64, weights []float64) float64 { - var sum float64 - var weightSum float64 - - for index, value := range values { - weight := weights[index] - if value == 0 || weight == 0 { - continue - } - sum += value * weight - weightSum += weight - } - - if weightSum < 0.5 { - return 0 - } - - return sum / weightSum -} - -// Perform calculates the weighted average -func (adapter *WeightedAverage) Perform(job types.OracleJob, result types.AdapterResult, runTimeInput types.AdapterRunTimeInput, _ *types.AdapterStore) (types.AdapterResult, error) { - valueIds := job.ConfigValue("value_ids").StringArray() - weights := job.ConfigValue("weights").Float64Array() - var filteredWeights []float64 - var values []float64 - for index, valueId := range valueIds { - value := result.GetData(valueId) - if value.Present() { - values = append(values, value.Float64()) - filteredWeights = append(filteredWeights, weights[index]) - } - } - - if len(values) == 0 { - return result, fmt.Errorf("no values found for weighted_average") - } - - average := CalcWeightedAverage(values, filteredWeights) - - if average == 0 { - return result, fmt.Errorf("weighted_average is 0") - } - - result = job.SetOutput(result, types.Float64ToGenericValue(average)) - - return result, nil -} diff --git a/oracle/service/parser/parser.go b/oracle/service/parser/parser.go deleted file mode 100644 index 2c137c64603..00000000000 --- a/oracle/service/parser/parser.go +++ /dev/null @@ -1,101 +0,0 @@ -package parser - -import ( - "fmt" - - "github.com/cometbft/cometbft/oracle/service/types" -) - -// ConstructTemplateMap create a map of templates -func ConstructTemplateMap(templates []types.OracleTemplate) (map[string]types.OracleTemplate, error) { - templateMap := make(map[string]types.OracleTemplate, len(templates)) - - for _, template := range templates { - if _, ok := templateMap[template.TemplateId]; ok { - return nil, fmt.Errorf("duplicate template id: %s", template.TemplateId) - } - templateMap[template.TemplateId] = template - } - return templateMap, nil -} - -// UnrollSubAdapters convert sub adapter templates to full sub adapters -func UnrollSubAdapters(subAdapters []types.OracleJobSubAdapter, templateMap map[string]types.OracleTemplate) ([]types.OracleJobSubAdapter, error) { - var unrolledAdapters []types.OracleJobSubAdapter - for _, subAdapter := range subAdapters { - switch { - case len(subAdapter.Adapter) > 0: - unrolledAdapters = append(unrolledAdapters, subAdapter) - - case len(subAdapter.Template) > 0: - template, ok := templateMap[subAdapter.Template] - if !ok { - return nil, fmt.Errorf("template not found in map: %s", subAdapter.Template) - } - unrolledAdapters = append(unrolledAdapters, template.SubAdapters...) - - default: - return nil, fmt.Errorf("invalid subadapter") - } - } - return unrolledAdapters, nil -} - -// UnrollOracleJobs convert sub adapter declarations to full jobs -func UnrollOracleJobs(jobs []types.OracleJob) (unrolledJobs []types.OracleJob, err error) { - for _, job := range jobs { - switch { - case len(job.Adapter) > 0: - unrolledJobs = append(unrolledJobs, job) - - case len(job.SubAdapters) > 0: - for _, subAdapter := range job.SubAdapters { - unrolledJob := types.OracleJob{} - unrolledJob.OutputId = job.OutputId - unrolledJob.InputId = job.InputId - if len(unrolledJob.InputId) == 0 { - unrolledJob.InputId = job.OutputId - } - unrolledJob.Adapter = subAdapter.Adapter - unrolledJob.Config = subAdapter.Config - unrolledJobs = append(unrolledJobs, unrolledJob) - } - default: - return nil, fmt.Errorf("job has no adapters or subadapters") - } - } - return -} - -func ParseSpec(spec types.OracleSpec) (unrolledSpec types.OracleSpec, err error) { - templateMap, err := ConstructTemplateMap(spec.Templates) - if err != nil { - return - } - for i, job := range spec.Jobs { - spec.Jobs[i].SubAdapters, err = UnrollSubAdapters(job.SubAdapters, templateMap) - if err != nil { - return - } - } - spec.Jobs, err = UnrollOracleJobs(spec.Jobs) - if err != nil { - return - } - return spec, nil -} - -// ValidateOracleJobs validates oracle jobs -func ValidateOracleJobs(oracleInfo *types.OracleInfo, jobs []types.OracleJob) error { - for _, job := range jobs { - adapter, ok := oracleInfo.AdapterMap[job.Adapter] - if !ok { - return fmt.Errorf("adapter not found: '%s'", job.Adapter) - } - err := adapter.Validate(job) - if err != nil { - return fmt.Errorf("%s: %s", adapter.Id(), err.Error()) - } - } - return nil -} diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 3a1ff05340b..726d1ad1635 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -1,10 +1,8 @@ package runner import ( - "encoding/json" - "errors" - "fmt" - "strconv" + "io/ioutil" + "net/http" "time" log "github.com/sirupsen/logrus" @@ -12,272 +10,11 @@ import ( "google.golang.org/grpc/connectivity" "google.golang.org/grpc/credentials/insecure" - "github.com/cometbft/cometbft/oracle/service/adapters" - "github.com/cometbft/cometbft/oracle/service/parser" "github.com/cometbft/cometbft/oracle/service/types" oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" - "github.com/cometbft/cometbft/redis" ) -var ( - OracleOverwriteData string -) - -// OracleInfoResult oracle info result -type OracleInfoResult struct { - Id string `json:"id"` - Status string `json:"status"` -} - -// OracleInfoResponse oracle info response -type OracleInfoResponse struct { - Height string `json:"height"` - Result OracleInfoResult `json:"result"` -} - -// LastSubmissionTimeKey key for last submission time -const LastSubmissionTimeKey = "oracle:submitter:last-submission-time" - -// LastStoreDataKey returns the key for the given adapter and job -func LastStoreDataKey(adapter types.Adapter, job types.OracleJob) string { - return fmt.Sprintf("oracle:adapter-store:%s:%s", adapter.Id(), job.InputId) -} - -// GetLastStoreData returns the last stored value for the given adapter and job -func GetLastStoreData(service redis.Service, adapter types.Adapter, job types.OracleJob) (data map[string]types.GenericValue, exists bool, err error) { - key := LastStoreDataKey(adapter, job) - value, exists, err := service.Get(key) - if err != nil { - return - } - data = make(map[string]types.GenericValue) - if exists { - err := json.Unmarshal([]byte(value.String()), &data) - if err != nil { - panic(err) - } - } - return data, exists, nil -} - -// SetLastStoreData sets the last store data for the given adapter and job -func SetLastStoreData(service redis.Service, adapter types.Adapter, job types.OracleJob, store types.AdapterStore) error { - key := LastStoreDataKey(adapter, job) - dataBytes, err := json.Marshal(&store.Data) - if err != nil { - panic(err) - } - err = service.Set(key, types.StringToGenericValue(string(dataBytes)), 0) - if err != nil { - return err - } - return nil -} - -// GetOracleLockKey returns the lock key for a given oracle and time -func GetOracleLockKey(oracle types.Oracle, normalizedTime uint64) string { - return fmt.Sprintf("oracle:oracle-lock:%s:%d", oracle.Id, normalizedTime) -} - -func overwriteData(oracleId string, data string) string { - if oracleId != "DXBT" { // if we want to overwrite DETH: `&& oracleID != "DETH"` - return data - } - - var min, max, interval int64 - switch oracleId { - case "DXBT": - min, max = 15000, 10000 // this was how it was before the refactor, maybe intended? - interval = 20 - case "DETH": - min, max = 500, 1500 - interval = 5 - } - - // create a price based on current system time - t := time.Now().Unix() - minute := t / 60 - seconds := t - (t/60)*60 - // round to the nearest 10th second, e.g. 10, 20, 30... - roundedSeconds := (seconds / 10) * 10 - isEvenMinute := minute%2 == 0 - // if the minute is exactly an even minute - if isEvenMinute { - if roundedSeconds == 0 { - return strconv.FormatUint(uint64(min), 10) - } - - price := strconv.FormatUint(uint64(min+roundedSeconds*interval), 10) - decimalPrice := strconv.FormatUint(uint64(seconds/10), 10) - decimalPrice += strconv.FormatUint(10-uint64(seconds/10), 10) - return price + "." + decimalPrice - } - - if roundedSeconds == 0 { - return strconv.FormatUint(uint64(max), 10) - } - - price := strconv.FormatUint(uint64(max-roundedSeconds*interval), 10) - decimalPrice := strconv.FormatUint(uint64(seconds/10)+4, 10) - decimalPrice += strconv.FormatUint(10-uint64(seconds/10), 10) - return price + "." + decimalPrice -} - -// SyncOracles sync oracles with active on-chain oracles -func SyncOracles(oracleInfo *types.OracleInfo) (oracles []types.Oracle, err error) { - oraclesURL := oracleInfo.Config.RestApiAddress - if oraclesURL == "" { - oraclesURL = "https://test-api.carbon.network" - } - oraclesURL += "/carbon/oracle/v1/oracles" - - response := adapters.HTTPRequest(oraclesURL, 10) - - if len(response) == 0 { - return nil, fmt.Errorf("empty response from %s", oraclesURL) - } - - type Response struct { - Oracles []oracleproto.Oracle `json:"oracles"` - } - - var parsedResponse Response - - if err := json.Unmarshal(response, &parsedResponse); err != nil { - return nil, err - } - - oraclesData := parsedResponse - - for _, oracle := range oraclesData.Oracles { - var spec types.OracleSpec - err = json.Unmarshal([]byte(oracle.Spec), &spec) - if err != nil { - log.Errorf("[oracle:%v] invalid oracle spec: %+v", oracle.Id, err) - continue - } - spec, err := parser.ParseSpec(spec) - if err != nil { - log.Warnf("[oracle:%v] unable to unroll spec: %v", oracle.Id, err) - continue - } - err = parser.ValidateOracleJobs(oracleInfo, spec.Jobs) - if err != nil { - log.Warnf("[oracle: %v,] invalid oracle jobs: %v", oracle.Id, err) - continue - } - - resoUint64, err := strconv.ParseUint(oracle.Resolution, 10, 64) - if err != nil { - log.Warnf("[oracle: %v,] unable to parse reso to uint64: %v", oracle.Id, err) - continue - } - - oracles = append(oracles, types.Oracle{ - Id: oracle.Id, - Resolution: resoUint64, - Spec: spec, - }) - } - log.Info("[oracle] Synced oracle specs") - return oracles, err -} - -func SaveOracleResult(price string, oracleId string, redisService redis.Service) { - if price != "" { - key := adapters.GetOracleResultKey(oracleId) - data, err := json.Marshal(types.OracleCache{Price: price, Timestamp: types.JSONTime{Time: time.Now()}}) - if err != nil { - panic(err) - } - jsonString := string(data) - setErr := redisService.Set(key, types.StringToGenericValue(jsonString), 0) - if setErr != nil { - log.Error(err) - } - } -} - -// RunOracle run oracle submission -func RunOracle(oracleInfo *types.OracleInfo, oracle types.Oracle, currentTime uint64) error { - red := oracleInfo.Redis - normalizedTime := (currentTime / oracle.Resolution) * oracle.Resolution - lastSubmissionTime, exists, err := red.Get(LastSubmissionTimeKey) - if err != nil { - return err - } - if exists && normalizedTime <= lastSubmissionTime.Uint64() { - return nil - } - lockKey := GetOracleLockKey(oracle, normalizedTime) - err = red.SetNX(lockKey, types.StringToGenericValue("1"), time.Minute*5) - //nolint:nilerr //already processed/processing - if err != nil { - return nil - } - - jobs := oracle.Spec.Jobs - shouldEarlyTerminate := oracle.Spec.ShouldEarlyTerminate - result := types.NewAdapterResult() - - input := types.AdapterRunTimeInput{ - BeginTime: currentTime, - Config: oracleInfo.CustomNodeConfig, - } - - for _, job := range jobs { - adapter, ok := oracleInfo.AdapterMap[job.Adapter] - if !ok { - // panic("adapter should exist: " + job.Adapter) - return fmt.Errorf("invalid adapter: %s, skipping oracle :%s", job.Adapter, oracle.Id) - } - input.LastStoreData, input.LastStoreDataExists, err = GetLastStoreData(red, adapter, job) - if err != nil { - return err - } - store := types.NewAdapterStore() - result, err = adapter.Perform(job, result, input, &store) - if err != nil { - log.Error(fmt.Errorf("%s: %s: %s", oracle.Id, adapter.Id(), err.Error())) - if shouldEarlyTerminate { - break - } - } - if store.ShouldPersist { - if err := SetLastStoreData(red, adapter, job, store); err != nil { - return err - } - } - } - - err = red.Set(LastSubmissionTimeKey, types.Uint64ToGenericValue(normalizedTime), 0) - if err != nil { - return err - } - - resultData := result.GetData(oracle.Spec.OutputId).String() - - SaveOracleResult(resultData, oracle.Id, red) - - if OracleOverwriteData == "true" { - resultData = overwriteData(oracle.Id, resultData) // if we want to override oracle price - } - - if resultData == "" { - return errors.New("skipping submission for " + oracle.Id + " as result is empty") - } - - vote := oracleproto.Vote{ - OracleId: oracle.Id, - Timestamp: normalizedTime, - Data: resultData, - } - - oracleInfo.SignVotesChan <- &vote - return nil -} - func RunProcessSignVoteQueue(oracleInfo *types.OracleInfo) { go func(oracleInfo *types.OracleInfo) { for { @@ -410,18 +147,6 @@ func PruneUnsignedVoteBuffer(oracleInfo *types.OracleInfo) { }(oracleInfo) } -// RunOracles run oracle submissions -func RunOracles(oracleInfo *types.OracleInfo, t uint64) { - for _, oracle := range oracleInfo.Oracles { - go func(currOracle types.Oracle) { - err := RunOracle(oracleInfo, currOracle, t) - if err != nil { - log.Warnln(err) - } - }(oracle) - } -} - // Run run oracles func Run(oracleInfo *types.OracleInfo) { log.Info("[oracle] Service started.") @@ -431,23 +156,11 @@ func Run(oracleInfo *types.OracleInfo) { RunProcessSignVoteQueue(oracleInfo) PruneUnsignedVoteBuffer(oracleInfo) PruneGossipVoteBuffer(oracleInfo) + // start to take votes from app for { if count == 0 { // on init, and every minute - oracles, err := SyncOracles(oracleInfo) - oracleInfo.GossipVoteBuffer.UpdateMtx.RLock() - for address := range oracleInfo.GossipVoteBuffer.Buffer { - log.Infof("THIS IS MY VALIDATOR ADDRESS: %s \n\n\n", address) - } - oracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() - if err != nil { - log.Warn(err) - time.Sleep(time.Second) - continue - } - oracleInfo.Oracles = oracles } - RunOracles(oracleInfo, uint64(time.Now().Unix())) time.Sleep(100 * time.Millisecond) count++ @@ -468,7 +181,7 @@ func waitForRestAPI(address string) { } time.Sleep(sleepTime) - res := adapters.HTTPRequest(address, 10) + res := HTTPRequest(address, 10) if len(res) != 0 { break } @@ -512,3 +225,26 @@ func waitForGrpc(address string) { sleepTime *= 2 } } + +func HTTPRequest(url string, timeout uint64) []byte { + httpClient := http.Client{ + Timeout: time.Duration(timeout) * time.Second, + } + + var response *http.Response + response, err := httpClient.Get(url) + + if err != nil { + return []byte{} + } + + defer response.Body.Close() + + body, readErr := ioutil.ReadAll(response.Body) + + if readErr != nil { + return []byte{} + } + + return body +} diff --git a/oracle/service/types/adapter.go b/oracle/service/types/adapter.go deleted file mode 100644 index 74fdf053a2e..00000000000 --- a/oracle/service/types/adapter.go +++ /dev/null @@ -1,61 +0,0 @@ -package types - -// Adapter interface for adapter -type Adapter interface { - Id() string - Perform(job OracleJob, result AdapterResult, runTimeInput AdapterRunTimeInput, store *AdapterStore) (AdapterResult, error) - Validate(job OracleJob) error -} - -// AdapterResult struct for adapter results -type AdapterResult struct { - Data map[string]GenericValue -} - -// GetData get data for given key -func (result AdapterResult) GetData(key string) GenericValue { - return result.Data[key] -} - -// SetData sets data for the given key, value pair -func (result *AdapterResult) SetData(key string, value GenericValue) { - result.Data[key] = value -} - -// NewAdapterResult returns an initialized AdapterResult -func NewAdapterResult() AdapterResult { - result := AdapterResult{} - result.Data = make(map[string]GenericValue) - return result -} - -// AdapterRunTimeInput struct for adapter input -type AdapterRunTimeInput struct { - LastStoreData map[string]GenericValue - LastStoreDataExists bool - BeginTime uint64 - Config CustomNodeConfig -} - -// GetLastStoreData gets data for the given key -func (input AdapterRunTimeInput) GetLastStoreData(key string) GenericValue { - return input.LastStoreData[key] -} - -// AdapterStore struct for adapter store -type AdapterStore struct { - ShouldPersist bool - Data map[string]GenericValue -} - -// NewAdapterStore returns an initialized adapter store -func NewAdapterStore() AdapterStore { - store := AdapterStore{} - store.Data = make(map[string]GenericValue) - return store -} - -// SetData sets data for the given key, value pair -func (store *AdapterStore) SetData(key string, value GenericValue) { - store.Data[key] = value -} diff --git a/oracle/service/types/alias.go b/oracle/service/types/alias.go deleted file mode 100644 index 3db04a21667..00000000000 --- a/oracle/service/types/alias.go +++ /dev/null @@ -1,15 +0,0 @@ -package types - -import ( - r "github.com/cometbft/cometbft/redis" -) - -type ( - GenericValue = r.GenericValue -) - -var ( - StringToGenericValue = r.StringToGenericValue - Float64ToGenericValue = r.Float64ToGenericValue - Uint64ToGenericValue = r.Uint64ToGenericValue -) diff --git a/oracle/service/types/config.go b/oracle/service/types/config.go deleted file mode 100644 index 1da159a6a19..00000000000 --- a/oracle/service/types/config.go +++ /dev/null @@ -1,9 +0,0 @@ -package types - -// Config struct for app -type CustomNodeConfig map[string]CustomNode - -type CustomNode struct { - Host string `json:"host"` - Path string `json:"path"` -} diff --git a/oracle/service/types/info.go b/oracle/service/types/info.go index 6615f0b19e3..d2540a089e6 100644 --- a/oracle/service/types/info.go +++ b/oracle/service/types/info.go @@ -5,24 +5,18 @@ import ( "github.com/cometbft/cometbft/crypto" cmtsync "github.com/cometbft/cometbft/libs/sync" oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" - "github.com/cometbft/cometbft/redis" "github.com/cometbft/cometbft/types" ) // App struct for app type OracleInfo struct { - Oracles []Oracle - AdapterMap map[string]Adapter - Redis redis.Service Config *config.OracleConfig - CustomNodeConfig CustomNodeConfig UnsignedVoteBuffer *UnsignedVoteBuffer GossipVoteBuffer *GossipVoteBuffer SignVotesChan chan *oracleproto.Vote PubKey crypto.PubKey PrivValidator types.PrivValidator StopChannel chan int - ValidatorSet *types.ValidatorSet } type UnsignedVotes struct { diff --git a/oracle/service/types/oracle.go b/oracle/service/types/oracle.go deleted file mode 100644 index 77c45fea3a9..00000000000 --- a/oracle/service/types/oracle.go +++ /dev/null @@ -1,134 +0,0 @@ -package types - -import ( - "encoding/json" - "fmt" - "strings" - "time" - - "github.com/cometbft/cometbft/redis" -) - -// Oracle struct for oracles -type Oracle struct { - Id string `json:"id"` - Resolution uint64 `json:"resolution"` - Spec OracleSpec `json:"spec"` -} - -// OracleSpec struct for oracle specs -type OracleSpec struct { - OutputId string `json:"output_id"` - Jobs []OracleJob `json:"jobs"` - Templates []OracleTemplate `json:"templates"` - // flag to determine if oracle jobs should terminate upon error (should terminate for specs that do not use weighted_average in their calcs.) - ShouldEarlyTerminate bool `json:"should_early_terminate"` -} - -// OracleJob struct for oracle jobs -type OracleJob struct { - OutputId string `json:"output_id"` - InputId string `json:"input_id"` - Adapter string `json:"adapter"` - Config map[string]string `json:"config"` - SubAdapters []OracleJobSubAdapter `json:"adapters"` -} - -// OracleTemplate struct for oracle template -type OracleTemplate struct { - TemplateId string `json:"template_id"` - SubAdapters []OracleJobSubAdapter `json:"adapters"` -} - -// OracleJobSubAdapter struct for sub adapters -type OracleJobSubAdapter struct { - Adapter string `json:"adapter"` - Config map[string]string `json:"config"` - Template string `json:"template"` -} - -type JSONTime struct { - Time time.Time -} - -func (t JSONTime) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf("\"%s\"", t.Time.Format(time.RFC3339Nano))), nil -} - -func (t *JSONTime) UnmarshalJSON(data []byte) error { - var timestamp string - err := json.Unmarshal(data, ×tamp) - if err != nil { - return err - } - - parsedTime, err := time.Parse(time.RFC3339Nano, timestamp) - if err != nil { - return err - } - - t.Time = parsedTime - return nil -} - -type OracleCache struct { - Price string `json:"price"` - Timestamp JSONTime `json:"timestamp"` -} - -// ConfigValue returns the config for a specified key -func (job OracleJob) ConfigValue(key string) GenericValue { - return StringToGenericValue(job.Config[key]) -} - -// GetInput gets job input for the specified adapter result -func (job OracleJob) GetInput(result AdapterResult) GenericValue { - return result.GetData(job.InputId) -} - -// GetInputs gets list of job input for the specified adapter result -func (job OracleJob) GetInputs(result AdapterResult) ([]GenericValue, error) { - res := []GenericValue{} - input := result.GetData(job.InputId) - if input.IsEmpty() { - valueIdsStr := job.ConfigValue("input_ids") - if !valueIdsStr.Present() || valueIdsStr.IsEmpty() { - return res, fmt.Errorf("GetInputs: input_ids not found in job config for job with outputID: %s", job.OutputId) - } - valueIds := valueIdsStr.StringArray() - for _, valueId := range valueIds { - res = append(res, result.GetData(valueId)) - } - } else { - values := strings.Split(input.String(), " ") - for _, val := range values { - res = append(res, redis.StringToGenericValue(val)) - } - } - return res, nil -} - -// SetOutput sets the job output on the adapter result -func (job OracleJob) SetOutput(result AdapterResult, output GenericValue) AdapterResult { - result.SetData(job.OutputId, output) - return result -} - -// SetOutputList sets the job output of an array of strings on the adapter result -func (job OracleJob) SetOutputList(result AdapterResult, output []string) AdapterResult { - job.SetOutput(result, StringArrayToGenericValue(output)) - return result -} - -// SetOutputs sets the job outputs on the adapter results -func (job OracleJob) SetOutputs(result AdapterResult, outputIds []string, outputs []GenericValue) AdapterResult { - for idx := range outputIds { - result.SetData(outputIds[idx], outputs[idx]) - } - return result -} - -func StringArrayToGenericValue(stringArray []string) GenericValue { - strings := strings.Join(stringArray, " ") - return StringToGenericValue(strings) -} diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto index ff394363f76..7af07b27e10 100644 --- a/proto/tendermint/abci/types.proto +++ b/proto/tendermint/abci/types.proto @@ -36,6 +36,7 @@ service ABCI { rpc VerifyVoteExtension(RequestVerifyVoteExtension) returns (ResponseVerifyVoteExtension); rpc FinalizeBlock(RequestFinalizeBlock) returns (ResponseFinalizeBlock); rpc SignGossipVote(RequestSignGossipVote) returns (ResponseSignGossipVote); + rpc PrepareOracleVotes(RequestPrepareOracleVotes) returns (ResponsePrepareOracleVotes); } //---------------------------------------- @@ -60,6 +61,7 @@ message Request { RequestVerifyVoteExtension verify_vote_extension = 19; RequestFinalizeBlock finalize_block = 20; RequestSignGossipVote sign_gossip_vote = 21; + RequestPrepareOracleVotes prepare_oracle_votes = 22; } reserved 4, 7, 9, 10; // SetOption, BeginBlock, DeliverTx, EndBlock } @@ -202,6 +204,8 @@ message RequestSignGossipVote { int64 height = 3; } +message RequestPrepareOracleVotes {} + //---------------------------------------- // Response types @@ -225,6 +229,7 @@ message Response { ResponseVerifyVoteExtension verify_vote_extension = 20; ResponseFinalizeBlock finalize_block = 21; ResponseSignGossipVote sign_gossip_vote = 22; + ResponsePrepareOracleVotes prepare_oracle_votes = 22; } reserved 5, 8, 10, 11; // SetOption, BeginBlock, DeliverTx, EndBlock } @@ -379,6 +384,16 @@ message ResponseSignGossipVote { bytes encoded_tx = 1; } +message Vote { + string oracle_id = 1; + int64 timestamp = 2; + string data = 3; +} + +message ResponsePrepareOracleVotes { + repeated Vote votes = 1 [(gogoproto.nullable) = false]; +} + //---------------------------------------- // Misc. diff --git a/redis/generic_value.go b/redis/generic_value.go deleted file mode 100644 index 00681d28146..00000000000 --- a/redis/generic_value.go +++ /dev/null @@ -1,113 +0,0 @@ -package redis - -import ( - "encoding/json" - "strconv" -) - -// GenericValue provides convenience methods for transforming between different types -type GenericValue struct { - Raw string `json:"raw"` -} - -// IsEmpty checks if the value is empty -func (generic GenericValue) IsEmpty() bool { - return len(generic.Raw) == 0 -} - -// Present checks if the value is not empty -func (generic GenericValue) Present() bool { - return len(generic.Raw) > 0 -} - -// String Returns GenericValue as a string -func (generic GenericValue) String() string { - return generic.Raw -} - -// StringArray Returns GenericValue as a string array -func (generic GenericValue) StringArray() []string { - var array []string - err := json.Unmarshal([]byte(generic.Raw), &array) - if err != nil { - panic(err) - } - return array -} - -// Uint64 Returns GenericValue as a uint64 -func (generic GenericValue) Uint64() uint64 { - if generic.IsEmpty() { - panic("Invalid Uint64") - } - parsedValue, err := strconv.ParseUint(generic.Raw, 10, 64) - if err != nil { - panic(err) - } - - return parsedValue -} - -// Int64 Returns GenericValue as a int64 -func (generic GenericValue) Int64() int64 { - if generic.IsEmpty() { - panic("Invalid Int64") - } - parsedValue, err := strconv.ParseInt(generic.Raw, 10, 64) - if err != nil { - panic(err) - } - - return parsedValue -} - -// Float64 Returns GenericValue as a uint64 -func (generic GenericValue) Float64() float64 { - if generic.IsEmpty() { - panic("Invalid Float64") - } - parsedValue, err := strconv.ParseFloat(generic.Raw, 64) - if err != nil { - panic(err) - } - - return parsedValue -} - -// Float64Array Returns GenericValue as a float64 array -func (generic GenericValue) Float64Array() []float64 { - var array []float64 - err := json.Unmarshal([]byte(generic.Raw), &array) - if err != nil { - panic(err) - } - return array -} - -// StringToGenericValue converts a string to a generic value -func StringToGenericValue(value string) GenericValue { - return GenericValue{ - Raw: value, - } -} - -// Uint64ToGenericValue converts a uint64 to a generic value -func Uint64ToGenericValue(value uint64) GenericValue { - return GenericValue{ - Raw: strconv.FormatUint(value, 10), - } -} - -// Int64ToGenericValue converts an int64 to a generic value -func Int64ToGenericValue(value int64) GenericValue { - return GenericValue{ - Raw: strconv.FormatInt(value, 10), - } -} - -// Float64ToGenericValue converts a float64 to a generic value -func Float64ToGenericValue(value float64) GenericValue { - return GenericValue{ - Raw: strconv.FormatFloat(value, 'f', -1, 64), - } -} diff --git a/redis/redis.go b/redis/redis.go deleted file mode 100644 index 101a3153300..00000000000 --- a/redis/redis.go +++ /dev/null @@ -1,64 +0,0 @@ -package redis - -import ( - "os" - "strings" - "time" - - "github.com/go-redis/redis" - log "github.com/sirupsen/logrus" -) - -// Client is a reexport of the redis client -type Client = redis.Client - -func GetEnvOr(key string, defaultValue string) string { - value, found := os.LookupEnv(key) - if !found { - return defaultValue - } - return value -} - -func GetSettings(db int) *redis.Options { - dbString := GetEnvOr("REDIS_URL", "") - if dbString != "" { - url, err := redis.ParseURL(dbString) - if err != nil { - panic(err) - } - url.DB = 0 - return url - } - - host := GetEnvOr("REDIS_HOST", "localhost") - port := GetEnvOr("REDIS_PORT", "6379") - password := GetEnvOr("REDIS_PASSWORD", "") - log.Debugf("REDIS_HOST=%v REDIS_HOST=%v REDIS_PASSWORD=%v", host, port, password) - - return &redis.Options{ - Addr: host + ":" + port, - Password: password, // no password set - DB: db, // use default DB - } -} - -// ConnectClient returns a redis client -func ConnectClient(db int) *redis.Client { - client := redis.NewClient(GetSettings(db)) - - // Polling for redis - for { - err := client.Ping().Err() - if err == nil { - break - } - if !strings.HasSuffix(err.Error(), ": connect: connection refused") { - panic("Cannot connect to redis: " + err.Error()) - } - log.Warn("Redis: Unable to connect, retrying in 5 seconds...") - time.Sleep(time.Second) - } - - return client -} diff --git a/redis/service.go b/redis/service.go deleted file mode 100644 index ef1f4b51a5f..00000000000 --- a/redis/service.go +++ /dev/null @@ -1,75 +0,0 @@ -package redis - -import ( - "fmt" - "time" - - "github.com/go-redis/redis" -) - -// Service is a wrapper around redis.Client -type Service struct { - Client *Client -} - -// NewService constructor for Service -func NewService(db int) Service { - return Service{ - Client: ConnectClient(db), - } -} - -// Exists checks if a redis key exists -func (s Service) Exists(key string) (bool, error) { - exists, err := s.Client.Exists(key).Result() - if err != nil { - return false, err - } - return exists != 0, nil -} - -// Get get redis value -func (s Service) Get(key string) (GenericValue, bool, error) { - value, err := s.Client.Get(key).Result() - if err != nil { - if err == redis.Nil { - return GenericValue{}, false, nil - } - return GenericValue{}, false, err - } - return StringToGenericValue(value), true, nil -} - -// Del clears the value for the given key -func (s Service) Del(key string) error { - err := s.Client.Del(key).Err() - if err != nil { - return err - } - return nil -} - -// Set sets redis value -func (s Service) Set(key string, value GenericValue, t time.Duration) error { - err := s.Client.Set(key, value.String(), t).Err() - if err != nil { - return err - } - return nil -} - -func (s Service) SetNX(key string, value GenericValue, t time.Duration) error { - setnx := s.Client.SetNX(key, value.String(), t) - err := setnx.Err() - if err != nil { - return err - } - res, err := setnx.Result() - if err != nil { - return err - } - if !res { // already exist - return fmt.Errorf("SetNX for key: %s exists", key) - } - return nil -} diff --git a/state/execution_test.go b/state/execution_test.go index e36d9e5c568..09de813f34f 100644 --- a/state/execution_test.go +++ b/state/execution_test.go @@ -974,12 +974,14 @@ func TestPrepareProposalCountSerializationOverhead(t *testing.T) { require.NoError(t, err) defer proxyApp.Stop() //nolint:errcheck // ignore for tests + oracleInfo := oracletypes.OracleInfo{} blockStore := store.NewBlockStore(dbm.NewMemDB()) blockExec := sm.NewBlockExecutor( stateStore, log.NewNopLogger(), proxyApp.Consensus(), mp, + &oracleInfo, evpool, blockStore, ) From 5ddda97279f516aa3d2dddb2aaec1c875386b4e4 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 16 Apr 2024 18:09:51 +0800 Subject: [PATCH 042/150] add new prepareOracleVotes hook --- abci/client/grpc_client.go | 4 + abci/client/mocks/client.go | 26 + abci/client/socket_client.go | 11 + abci/types/application.go | 5 + abci/types/messages.go | 6 + abci/types/mocks/application.go | 26 + abci/types/types.pb.go | 1346 ++++++++++++++++++++++------- proto/tendermint/abci/types.proto | 2 +- proxy/app_conn.go | 6 + proxy/mocks/app_conn_consensus.go | 26 + 10 files changed, 1167 insertions(+), 291 deletions(-) diff --git a/abci/client/grpc_client.go b/abci/client/grpc_client.go index 4a0ac155474..9da15a5a27d 100644 --- a/abci/client/grpc_client.go +++ b/abci/client/grpc_client.go @@ -249,3 +249,7 @@ func (cli *grpcClient) FinalizeBlock(ctx context.Context, req *types.RequestFina func (cli *grpcClient) SignGossipVote(ctx context.Context, req *types.RequestSignGossipVote) (*types.ResponseSignGossipVote, error) { return cli.client.SignGossipVote(ctx, types.ToRequestSignGossipVote(req).GetSignGossipVote(), grpc.WaitForReady(true)) } + +func (cli *grpcClient) PrepareOracleVotes(ctx context.Context, req *types.RequestPrepareOracleVotes) (*types.ResponsePrepareOracleVotes, error) { + return cli.client.PrepareOracleVotes(ctx, types.ToRequestPrepareOracleVotes(req).GetPrepareOracleVotes(), grpc.WaitForReady(true)) +} diff --git a/abci/client/mocks/client.go b/abci/client/mocks/client.go index aa34ab74c1c..bd0cb9d3545 100644 --- a/abci/client/mocks/client.go +++ b/abci/client/mocks/client.go @@ -406,6 +406,32 @@ func (_m *Client) OnStop() { _m.Called() } +// PrepareOracleVotes provides a mock function with given fields: _a0, _a1 +func (_m *Client) PrepareOracleVotes(_a0 context.Context, _a1 *types.RequestPrepareOracleVotes) (*types.ResponsePrepareOracleVotes, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponsePrepareOracleVotes + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestPrepareOracleVotes) (*types.ResponsePrepareOracleVotes, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestPrepareOracleVotes) *types.ResponsePrepareOracleVotes); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponsePrepareOracleVotes) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestPrepareOracleVotes) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // PrepareProposal provides a mock function with given fields: _a0, _a1 func (_m *Client) PrepareProposal(_a0 context.Context, _a1 *types.RequestPrepareProposal) (*types.ResponsePrepareProposal, error) { ret := _m.Called(_a0, _a1) diff --git a/abci/client/socket_client.go b/abci/client/socket_client.go index a9a50fc2958..50061df42e8 100644 --- a/abci/client/socket_client.go +++ b/abci/client/socket_client.go @@ -423,6 +423,17 @@ func (cli *socketClient) SignGossipVote(ctx context.Context, req *types.RequestS return reqRes.Response.GetSignGossipVote(), cli.Error() } +func (cli *socketClient) PrepareOracleVotes(ctx context.Context, req *types.RequestPrepareOracleVotes) (*types.ResponsePrepareOracleVotes, error) { + reqRes, err := cli.queueRequest(ctx, types.ToRequestPrepareOracleVotes(req)) + if err != nil { + return nil, err + } + if err := cli.Flush(ctx); err != nil { + return nil, err + } + return reqRes.Response.GetPrepareOracleVotes(), cli.Error() +} + func (cli *socketClient) queueRequest(ctx context.Context, req *types.Request) (*ReqRes, error) { reqres := NewReqRes(req) diff --git a/abci/types/application.go b/abci/types/application.go index e07f99e7bb3..53efb1df743 100644 --- a/abci/types/application.go +++ b/abci/types/application.go @@ -37,6 +37,7 @@ type Application interface { // Hooks SignGossipVote(context.Context, *RequestSignGossipVote) (*ResponseSignGossipVote, error) + PrepareOracleVotes(context.Context, *RequestPrepareOracleVotes) (*ResponsePrepareOracleVotes, error) } //------------------------------------------------------- @@ -126,3 +127,7 @@ func (BaseApplication) FinalizeBlock(_ context.Context, req *RequestFinalizeBloc func (BaseApplication) SignGossipVote(_ context.Context, req *RequestSignGossipVote) (*ResponseSignGossipVote, error) { return &ResponseSignGossipVote{}, nil } + +func (BaseApplication) PrepareOracleVotes(_ context.Context, req *RequestPrepareOracleVotes) (*ResponsePrepareOracleVotes, error) { + return &ResponsePrepareOracleVotes{}, nil +} diff --git a/abci/types/messages.go b/abci/types/messages.go index 26c08379685..57bd2d4271b 100644 --- a/abci/types/messages.go +++ b/abci/types/messages.go @@ -130,6 +130,12 @@ func ToRequestSignGossipVote(req *RequestSignGossipVote) *Request { } } +func ToRequestPrepareOracleVotes(req *RequestPrepareOracleVotes) *Request { + return &Request{ + Value: &Request_PrepareOracleVotes{req}, + } +} + //---------------------------------------- func ToResponseException(errStr string) *Response { diff --git a/abci/types/mocks/application.go b/abci/types/mocks/application.go index 46bab165959..7a26813b53c 100644 --- a/abci/types/mocks/application.go +++ b/abci/types/mocks/application.go @@ -274,6 +274,32 @@ func (_m *Application) OfferSnapshot(_a0 context.Context, _a1 *types.RequestOffe return r0, r1 } +// PrepareOracleVotes provides a mock function with given fields: _a0, _a1 +func (_m *Application) PrepareOracleVotes(_a0 context.Context, _a1 *types.RequestPrepareOracleVotes) (*types.ResponsePrepareOracleVotes, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponsePrepareOracleVotes + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestPrepareOracleVotes) (*types.ResponsePrepareOracleVotes, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestPrepareOracleVotes) *types.ResponsePrepareOracleVotes); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponsePrepareOracleVotes) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestPrepareOracleVotes) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // PrepareProposal provides a mock function with given fields: _a0, _a1 func (_m *Application) PrepareProposal(_a0 context.Context, _a1 *types.RequestPrepareProposal) (*types.ResponsePrepareProposal, error) { ret := _m.Called(_a0, _a1) diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go index fc9fe5d83af..9518b4054ba 100644 --- a/abci/types/types.pb.go +++ b/abci/types/types.pb.go @@ -122,7 +122,7 @@ func (x ResponseOfferSnapshot_Result) String() string { } func (ResponseOfferSnapshot_Result) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{28, 0} + return fileDescriptor_252557cfdd89a31a, []int{29, 0} } type ResponseApplySnapshotChunk_Result int32 @@ -159,7 +159,7 @@ func (x ResponseApplySnapshotChunk_Result) String() string { } func (ResponseApplySnapshotChunk_Result) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{30, 0} + return fileDescriptor_252557cfdd89a31a, []int{31, 0} } type ResponseProcessProposal_ProposalStatus int32 @@ -187,7 +187,7 @@ func (x ResponseProcessProposal_ProposalStatus) String() string { } func (ResponseProcessProposal_ProposalStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{32, 0} + return fileDescriptor_252557cfdd89a31a, []int{33, 0} } type ResponseVerifyVoteExtension_VerifyStatus int32 @@ -219,7 +219,7 @@ func (x ResponseVerifyVoteExtension_VerifyStatus) String() string { } func (ResponseVerifyVoteExtension_VerifyStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{34, 0} + return fileDescriptor_252557cfdd89a31a, []int{35, 0} } type Request struct { @@ -241,6 +241,7 @@ type Request struct { // *Request_VerifyVoteExtension // *Request_FinalizeBlock // *Request_SignGossipVote + // *Request_PrepareOracleVotes Value isRequest_Value `protobuf_oneof:"value"` } @@ -334,6 +335,9 @@ type Request_FinalizeBlock struct { type Request_SignGossipVote struct { SignGossipVote *RequestSignGossipVote `protobuf:"bytes,21,opt,name=sign_gossip_vote,json=signGossipVote,proto3,oneof" json:"sign_gossip_vote,omitempty"` } +type Request_PrepareOracleVotes struct { + PrepareOracleVotes *RequestPrepareOracleVotes `protobuf:"bytes,22,opt,name=prepare_oracle_votes,json=prepareOracleVotes,proto3,oneof" json:"prepare_oracle_votes,omitempty"` +} func (*Request_Echo) isRequest_Value() {} func (*Request_Flush) isRequest_Value() {} @@ -352,6 +356,7 @@ func (*Request_ExtendVote) isRequest_Value() {} func (*Request_VerifyVoteExtension) isRequest_Value() {} func (*Request_FinalizeBlock) isRequest_Value() {} func (*Request_SignGossipVote) isRequest_Value() {} +func (*Request_PrepareOracleVotes) isRequest_Value() {} func (m *Request) GetValue() isRequest_Value { if m != nil { @@ -479,6 +484,13 @@ func (m *Request) GetSignGossipVote() *RequestSignGossipVote { return nil } +func (m *Request) GetPrepareOracleVotes() *RequestPrepareOracleVotes { + if x, ok := m.GetValue().(*Request_PrepareOracleVotes); ok { + return x.PrepareOracleVotes + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*Request) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -499,6 +511,7 @@ func (*Request) XXX_OneofWrappers() []interface{} { (*Request_VerifyVoteExtension)(nil), (*Request_FinalizeBlock)(nil), (*Request_SignGossipVote)(nil), + (*Request_PrepareOracleVotes)(nil), } } @@ -1646,6 +1659,42 @@ func (m *RequestSignGossipVote) GetHeight() int64 { return 0 } +type RequestPrepareOracleVotes struct { +} + +func (m *RequestPrepareOracleVotes) Reset() { *m = RequestPrepareOracleVotes{} } +func (m *RequestPrepareOracleVotes) String() string { return proto.CompactTextString(m) } +func (*RequestPrepareOracleVotes) ProtoMessage() {} +func (*RequestPrepareOracleVotes) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{18} +} +func (m *RequestPrepareOracleVotes) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RequestPrepareOracleVotes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RequestPrepareOracleVotes.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RequestPrepareOracleVotes) XXX_Merge(src proto.Message) { + xxx_messageInfo_RequestPrepareOracleVotes.Merge(m, src) +} +func (m *RequestPrepareOracleVotes) XXX_Size() int { + return m.Size() +} +func (m *RequestPrepareOracleVotes) XXX_DiscardUnknown() { + xxx_messageInfo_RequestPrepareOracleVotes.DiscardUnknown(m) +} + +var xxx_messageInfo_RequestPrepareOracleVotes proto.InternalMessageInfo + type Response struct { // Types that are valid to be assigned to Value: // @@ -1667,6 +1716,7 @@ type Response struct { // *Response_VerifyVoteExtension // *Response_FinalizeBlock // *Response_SignGossipVote + // *Response_PrepareOracleVotes Value isResponse_Value `protobuf_oneof:"value"` } @@ -1674,7 +1724,7 @@ func (m *Response) Reset() { *m = Response{} } func (m *Response) String() string { return proto.CompactTextString(m) } func (*Response) ProtoMessage() {} func (*Response) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{18} + return fileDescriptor_252557cfdd89a31a, []int{19} } func (m *Response) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1763,6 +1813,9 @@ type Response_FinalizeBlock struct { type Response_SignGossipVote struct { SignGossipVote *ResponseSignGossipVote `protobuf:"bytes,22,opt,name=sign_gossip_vote,json=signGossipVote,proto3,oneof" json:"sign_gossip_vote,omitempty"` } +type Response_PrepareOracleVotes struct { + PrepareOracleVotes *ResponsePrepareOracleVotes `protobuf:"bytes,23,opt,name=prepare_oracle_votes,json=prepareOracleVotes,proto3,oneof" json:"prepare_oracle_votes,omitempty"` +} func (*Response_Exception) isResponse_Value() {} func (*Response_Echo) isResponse_Value() {} @@ -1782,6 +1835,7 @@ func (*Response_ExtendVote) isResponse_Value() {} func (*Response_VerifyVoteExtension) isResponse_Value() {} func (*Response_FinalizeBlock) isResponse_Value() {} func (*Response_SignGossipVote) isResponse_Value() {} +func (*Response_PrepareOracleVotes) isResponse_Value() {} func (m *Response) GetValue() isResponse_Value { if m != nil { @@ -1916,6 +1970,13 @@ func (m *Response) GetSignGossipVote() *ResponseSignGossipVote { return nil } +func (m *Response) GetPrepareOracleVotes() *ResponsePrepareOracleVotes { + if x, ok := m.GetValue().(*Response_PrepareOracleVotes); ok { + return x.PrepareOracleVotes + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*Response) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -1937,6 +1998,7 @@ func (*Response) XXX_OneofWrappers() []interface{} { (*Response_VerifyVoteExtension)(nil), (*Response_FinalizeBlock)(nil), (*Response_SignGossipVote)(nil), + (*Response_PrepareOracleVotes)(nil), } } @@ -1949,7 +2011,7 @@ func (m *ResponseException) Reset() { *m = ResponseException{} } func (m *ResponseException) String() string { return proto.CompactTextString(m) } func (*ResponseException) ProtoMessage() {} func (*ResponseException) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{19} + return fileDescriptor_252557cfdd89a31a, []int{20} } func (m *ResponseException) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1993,7 +2055,7 @@ func (m *ResponseEcho) Reset() { *m = ResponseEcho{} } func (m *ResponseEcho) String() string { return proto.CompactTextString(m) } func (*ResponseEcho) ProtoMessage() {} func (*ResponseEcho) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{20} + return fileDescriptor_252557cfdd89a31a, []int{21} } func (m *ResponseEcho) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2036,7 +2098,7 @@ func (m *ResponseFlush) Reset() { *m = ResponseFlush{} } func (m *ResponseFlush) String() string { return proto.CompactTextString(m) } func (*ResponseFlush) ProtoMessage() {} func (*ResponseFlush) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{21} + return fileDescriptor_252557cfdd89a31a, []int{22} } func (m *ResponseFlush) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2077,7 +2139,7 @@ func (m *ResponseInfo) Reset() { *m = ResponseInfo{} } func (m *ResponseInfo) String() string { return proto.CompactTextString(m) } func (*ResponseInfo) ProtoMessage() {} func (*ResponseInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{22} + return fileDescriptor_252557cfdd89a31a, []int{23} } func (m *ResponseInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2151,7 +2213,7 @@ func (m *ResponseInitChain) Reset() { *m = ResponseInitChain{} } func (m *ResponseInitChain) String() string { return proto.CompactTextString(m) } func (*ResponseInitChain) ProtoMessage() {} func (*ResponseInitChain) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{23} + return fileDescriptor_252557cfdd89a31a, []int{24} } func (m *ResponseInitChain) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2218,7 +2280,7 @@ func (m *ResponseQuery) Reset() { *m = ResponseQuery{} } func (m *ResponseQuery) String() string { return proto.CompactTextString(m) } func (*ResponseQuery) ProtoMessage() {} func (*ResponseQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{24} + return fileDescriptor_252557cfdd89a31a, []int{25} } func (m *ResponseQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2325,7 +2387,7 @@ func (m *ResponseCheckTx) Reset() { *m = ResponseCheckTx{} } func (m *ResponseCheckTx) String() string { return proto.CompactTextString(m) } func (*ResponseCheckTx) ProtoMessage() {} func (*ResponseCheckTx) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{25} + return fileDescriptor_252557cfdd89a31a, []int{26} } func (m *ResponseCheckTx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2418,7 +2480,7 @@ func (m *ResponseCommit) Reset() { *m = ResponseCommit{} } func (m *ResponseCommit) String() string { return proto.CompactTextString(m) } func (*ResponseCommit) ProtoMessage() {} func (*ResponseCommit) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{26} + return fileDescriptor_252557cfdd89a31a, []int{27} } func (m *ResponseCommit) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2462,7 +2524,7 @@ func (m *ResponseListSnapshots) Reset() { *m = ResponseListSnapshots{} } func (m *ResponseListSnapshots) String() string { return proto.CompactTextString(m) } func (*ResponseListSnapshots) ProtoMessage() {} func (*ResponseListSnapshots) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{27} + return fileDescriptor_252557cfdd89a31a, []int{28} } func (m *ResponseListSnapshots) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2506,7 +2568,7 @@ func (m *ResponseOfferSnapshot) Reset() { *m = ResponseOfferSnapshot{} } func (m *ResponseOfferSnapshot) String() string { return proto.CompactTextString(m) } func (*ResponseOfferSnapshot) ProtoMessage() {} func (*ResponseOfferSnapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{28} + return fileDescriptor_252557cfdd89a31a, []int{29} } func (m *ResponseOfferSnapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2550,7 +2612,7 @@ func (m *ResponseLoadSnapshotChunk) Reset() { *m = ResponseLoadSnapshotC func (m *ResponseLoadSnapshotChunk) String() string { return proto.CompactTextString(m) } func (*ResponseLoadSnapshotChunk) ProtoMessage() {} func (*ResponseLoadSnapshotChunk) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{29} + return fileDescriptor_252557cfdd89a31a, []int{30} } func (m *ResponseLoadSnapshotChunk) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2596,7 +2658,7 @@ func (m *ResponseApplySnapshotChunk) Reset() { *m = ResponseApplySnapsho func (m *ResponseApplySnapshotChunk) String() string { return proto.CompactTextString(m) } func (*ResponseApplySnapshotChunk) ProtoMessage() {} func (*ResponseApplySnapshotChunk) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{30} + return fileDescriptor_252557cfdd89a31a, []int{31} } func (m *ResponseApplySnapshotChunk) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2654,7 +2716,7 @@ func (m *ResponsePrepareProposal) Reset() { *m = ResponsePrepareProposal func (m *ResponsePrepareProposal) String() string { return proto.CompactTextString(m) } func (*ResponsePrepareProposal) ProtoMessage() {} func (*ResponsePrepareProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{31} + return fileDescriptor_252557cfdd89a31a, []int{32} } func (m *ResponsePrepareProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2698,7 +2760,7 @@ func (m *ResponseProcessProposal) Reset() { *m = ResponseProcessProposal func (m *ResponseProcessProposal) String() string { return proto.CompactTextString(m) } func (*ResponseProcessProposal) ProtoMessage() {} func (*ResponseProcessProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{32} + return fileDescriptor_252557cfdd89a31a, []int{33} } func (m *ResponseProcessProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2742,7 +2804,7 @@ func (m *ResponseExtendVote) Reset() { *m = ResponseExtendVote{} } func (m *ResponseExtendVote) String() string { return proto.CompactTextString(m) } func (*ResponseExtendVote) ProtoMessage() {} func (*ResponseExtendVote) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{33} + return fileDescriptor_252557cfdd89a31a, []int{34} } func (m *ResponseExtendVote) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2786,7 +2848,7 @@ func (m *ResponseVerifyVoteExtension) Reset() { *m = ResponseVerifyVoteE func (m *ResponseVerifyVoteExtension) String() string { return proto.CompactTextString(m) } func (*ResponseVerifyVoteExtension) ProtoMessage() {} func (*ResponseVerifyVoteExtension) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{34} + return fileDescriptor_252557cfdd89a31a, []int{35} } func (m *ResponseVerifyVoteExtension) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2841,7 +2903,7 @@ func (m *ResponseFinalizeBlock) Reset() { *m = ResponseFinalizeBlock{} } func (m *ResponseFinalizeBlock) String() string { return proto.CompactTextString(m) } func (*ResponseFinalizeBlock) ProtoMessage() {} func (*ResponseFinalizeBlock) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{35} + return fileDescriptor_252557cfdd89a31a, []int{36} } func (m *ResponseFinalizeBlock) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2913,7 +2975,7 @@ func (m *ResponseSignGossipVote) Reset() { *m = ResponseSignGossipVote{} func (m *ResponseSignGossipVote) String() string { return proto.CompactTextString(m) } func (*ResponseSignGossipVote) ProtoMessage() {} func (*ResponseSignGossipVote) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{36} + return fileDescriptor_252557cfdd89a31a, []int{37} } func (m *ResponseSignGossipVote) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2949,6 +3011,110 @@ func (m *ResponseSignGossipVote) GetEncodedTx() []byte { return nil } +type Vote struct { + OracleId string `protobuf:"bytes,1,opt,name=oracle_id,json=oracleId,proto3" json:"oracle_id,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Data string `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` +} + +func (m *Vote) Reset() { *m = Vote{} } +func (m *Vote) String() string { return proto.CompactTextString(m) } +func (*Vote) ProtoMessage() {} +func (*Vote) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{38} +} +func (m *Vote) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Vote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Vote.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Vote) XXX_Merge(src proto.Message) { + xxx_messageInfo_Vote.Merge(m, src) +} +func (m *Vote) XXX_Size() int { + return m.Size() +} +func (m *Vote) XXX_DiscardUnknown() { + xxx_messageInfo_Vote.DiscardUnknown(m) +} + +var xxx_messageInfo_Vote proto.InternalMessageInfo + +func (m *Vote) GetOracleId() string { + if m != nil { + return m.OracleId + } + return "" +} + +func (m *Vote) GetTimestamp() int64 { + if m != nil { + return m.Timestamp + } + return 0 +} + +func (m *Vote) GetData() string { + if m != nil { + return m.Data + } + return "" +} + +type ResponsePrepareOracleVotes struct { + Votes []Vote `protobuf:"bytes,1,rep,name=votes,proto3" json:"votes"` +} + +func (m *ResponsePrepareOracleVotes) Reset() { *m = ResponsePrepareOracleVotes{} } +func (m *ResponsePrepareOracleVotes) String() string { return proto.CompactTextString(m) } +func (*ResponsePrepareOracleVotes) ProtoMessage() {} +func (*ResponsePrepareOracleVotes) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{39} +} +func (m *ResponsePrepareOracleVotes) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResponsePrepareOracleVotes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ResponsePrepareOracleVotes.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ResponsePrepareOracleVotes) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponsePrepareOracleVotes.Merge(m, src) +} +func (m *ResponsePrepareOracleVotes) XXX_Size() int { + return m.Size() +} +func (m *ResponsePrepareOracleVotes) XXX_DiscardUnknown() { + xxx_messageInfo_ResponsePrepareOracleVotes.DiscardUnknown(m) +} + +var xxx_messageInfo_ResponsePrepareOracleVotes proto.InternalMessageInfo + +func (m *ResponsePrepareOracleVotes) GetVotes() []Vote { + if m != nil { + return m.Votes + } + return nil +} + type CommitInfo struct { Round int32 `protobuf:"varint,1,opt,name=round,proto3" json:"round,omitempty"` Votes []VoteInfo `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes"` @@ -2958,7 +3124,7 @@ func (m *CommitInfo) Reset() { *m = CommitInfo{} } func (m *CommitInfo) String() string { return proto.CompactTextString(m) } func (*CommitInfo) ProtoMessage() {} func (*CommitInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{37} + return fileDescriptor_252557cfdd89a31a, []int{40} } func (m *CommitInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3016,7 +3182,7 @@ func (m *ExtendedCommitInfo) Reset() { *m = ExtendedCommitInfo{} } func (m *ExtendedCommitInfo) String() string { return proto.CompactTextString(m) } func (*ExtendedCommitInfo) ProtoMessage() {} func (*ExtendedCommitInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{38} + return fileDescriptor_252557cfdd89a31a, []int{41} } func (m *ExtendedCommitInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3071,7 +3237,7 @@ func (m *Event) Reset() { *m = Event{} } func (m *Event) String() string { return proto.CompactTextString(m) } func (*Event) ProtoMessage() {} func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{39} + return fileDescriptor_252557cfdd89a31a, []int{42} } func (m *Event) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3125,7 +3291,7 @@ func (m *EventAttribute) Reset() { *m = EventAttribute{} } func (m *EventAttribute) String() string { return proto.CompactTextString(m) } func (*EventAttribute) ProtoMessage() {} func (*EventAttribute) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{40} + return fileDescriptor_252557cfdd89a31a, []int{43} } func (m *EventAttribute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3193,7 +3359,7 @@ func (m *ExecTxResult) Reset() { *m = ExecTxResult{} } func (m *ExecTxResult) String() string { return proto.CompactTextString(m) } func (*ExecTxResult) ProtoMessage() {} func (*ExecTxResult) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{41} + return fileDescriptor_252557cfdd89a31a, []int{44} } func (m *ExecTxResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3292,7 +3458,7 @@ func (m *TxResult) Reset() { *m = TxResult{} } func (m *TxResult) String() string { return proto.CompactTextString(m) } func (*TxResult) ProtoMessage() {} func (*TxResult) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{42} + return fileDescriptor_252557cfdd89a31a, []int{45} } func (m *TxResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3359,7 +3525,7 @@ func (m *Validator) Reset() { *m = Validator{} } func (m *Validator) String() string { return proto.CompactTextString(m) } func (*Validator) ProtoMessage() {} func (*Validator) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{43} + return fileDescriptor_252557cfdd89a31a, []int{46} } func (m *Validator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3411,7 +3577,7 @@ func (m *ValidatorUpdate) Reset() { *m = ValidatorUpdate{} } func (m *ValidatorUpdate) String() string { return proto.CompactTextString(m) } func (*ValidatorUpdate) ProtoMessage() {} func (*ValidatorUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{44} + return fileDescriptor_252557cfdd89a31a, []int{47} } func (m *ValidatorUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3463,7 +3629,7 @@ 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_252557cfdd89a31a, []int{45} + return fileDescriptor_252557cfdd89a31a, []int{48} } func (m *VoteInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3521,7 +3687,7 @@ func (m *ExtendedVoteInfo) Reset() { *m = ExtendedVoteInfo{} } func (m *ExtendedVoteInfo) String() string { return proto.CompactTextString(m) } func (*ExtendedVoteInfo) ProtoMessage() {} func (*ExtendedVoteInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{46} + return fileDescriptor_252557cfdd89a31a, []int{49} } func (m *ExtendedVoteInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3596,7 +3762,7 @@ func (m *Misbehavior) Reset() { *m = Misbehavior{} } func (m *Misbehavior) String() string { return proto.CompactTextString(m) } func (*Misbehavior) ProtoMessage() {} func (*Misbehavior) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{47} + return fileDescriptor_252557cfdd89a31a, []int{50} } func (m *Misbehavior) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3672,7 +3838,7 @@ func (m *Snapshot) Reset() { *m = Snapshot{} } func (m *Snapshot) String() string { return proto.CompactTextString(m) } func (*Snapshot) ProtoMessage() {} func (*Snapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{48} + return fileDescriptor_252557cfdd89a31a, []int{51} } func (m *Snapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3761,6 +3927,7 @@ func init() { proto.RegisterType((*RequestVerifyVoteExtension)(nil), "tendermint.abci.RequestVerifyVoteExtension") proto.RegisterType((*RequestFinalizeBlock)(nil), "tendermint.abci.RequestFinalizeBlock") proto.RegisterType((*RequestSignGossipVote)(nil), "tendermint.abci.RequestSignGossipVote") + proto.RegisterType((*RequestPrepareOracleVotes)(nil), "tendermint.abci.RequestPrepareOracleVotes") proto.RegisterType((*Response)(nil), "tendermint.abci.Response") proto.RegisterType((*ResponseException)(nil), "tendermint.abci.ResponseException") proto.RegisterType((*ResponseEcho)(nil), "tendermint.abci.ResponseEcho") @@ -3780,6 +3947,8 @@ func init() { proto.RegisterType((*ResponseVerifyVoteExtension)(nil), "tendermint.abci.ResponseVerifyVoteExtension") proto.RegisterType((*ResponseFinalizeBlock)(nil), "tendermint.abci.ResponseFinalizeBlock") proto.RegisterType((*ResponseSignGossipVote)(nil), "tendermint.abci.ResponseSignGossipVote") + proto.RegisterType((*Vote)(nil), "tendermint.abci.Vote") + proto.RegisterType((*ResponsePrepareOracleVotes)(nil), "tendermint.abci.ResponsePrepareOracleVotes") proto.RegisterType((*CommitInfo)(nil), "tendermint.abci.CommitInfo") proto.RegisterType((*ExtendedCommitInfo)(nil), "tendermint.abci.ExtendedCommitInfo") proto.RegisterType((*Event)(nil), "tendermint.abci.Event") @@ -3797,212 +3966,220 @@ func init() { func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) } var fileDescriptor_252557cfdd89a31a = []byte{ - // 3278 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0xcb, 0x73, 0x23, 0xd5, - 0xd5, 0x57, 0xeb, 0xad, 0xa3, 0x87, 0xdb, 0xd7, 0x1e, 0xa3, 0x11, 0x83, 0x6d, 0x9a, 0x02, 0x86, - 0x01, 0x6c, 0x3e, 0xcf, 0x37, 0x3c, 0x6a, 0x20, 0x15, 0x59, 0xa3, 0x41, 0xf6, 0x18, 0xdb, 0xb4, - 0xe5, 0xa1, 0xc8, 0x83, 0xa6, 0x2d, 0x5d, 0x49, 0xcd, 0x48, 0xea, 0xa6, 0xbb, 0x65, 0x64, 0x56, - 0x54, 0x48, 0xaa, 0x52, 0xac, 0xa8, 0x62, 0xc3, 0x22, 0x2c, 0xb2, 0xc8, 0x26, 0x7f, 0x41, 0x56, - 0x59, 0x65, 0xc1, 0x22, 0x0b, 0x96, 0x59, 0x91, 0x14, 0xac, 0xc2, 0x36, 0x8b, 0x6c, 0x53, 0xf7, - 0xd1, 0x2f, 0xa9, 0xdb, 0x92, 0x06, 0xb2, 0x48, 0x25, 0xbb, 0x7b, 0x4f, 0x9f, 0x73, 0x6e, 0xdf, - 0x73, 0xef, 0x3d, 0x8f, 0xdf, 0xbd, 0xf0, 0xa8, 0x8d, 0x87, 0x6d, 0x6c, 0x0e, 0xb4, 0xa1, 0xbd, - 0xad, 0x9e, 0xb5, 0xb4, 0x6d, 0xfb, 0xc2, 0xc0, 0xd6, 0x96, 0x61, 0xea, 0xb6, 0x8e, 0x96, 0xbc, - 0x8f, 0x5b, 0xe4, 0x63, 0xe5, 0x31, 0x1f, 0x77, 0xcb, 0xbc, 0x30, 0x6c, 0x7d, 0xdb, 0x30, 0x75, - 0xbd, 0xc3, 0xf8, 0x2b, 0xd7, 0xa6, 0x3f, 0x3f, 0xc0, 0x17, 0x5c, 0x5b, 0x40, 0x98, 0x8e, 0xb2, - 0x6d, 0xa8, 0xa6, 0x3a, 0x70, 0x3e, 0x6f, 0x4e, 0x7d, 0x3e, 0x57, 0xfb, 0x5a, 0x5b, 0xb5, 0x75, - 0x93, 0x73, 0x6c, 0x74, 0x75, 0xbd, 0xdb, 0xc7, 0xdb, 0xb4, 0x77, 0x36, 0xea, 0x6c, 0xdb, 0xda, - 0x00, 0x5b, 0xb6, 0x3a, 0x30, 0x38, 0xc3, 0x6a, 0x57, 0xef, 0xea, 0xb4, 0xb9, 0x4d, 0x5a, 0x21, - 0xe3, 0xea, 0xa6, 0xda, 0xea, 0x63, 0xff, 0x24, 0xa5, 0xcf, 0x00, 0x32, 0x32, 0x7e, 0x7f, 0x84, - 0x2d, 0x1b, 0xed, 0x40, 0x12, 0xb7, 0x7a, 0x7a, 0x59, 0xd8, 0x14, 0xae, 0xe7, 0x77, 0xae, 0x6d, - 0x4d, 0xcc, 0x7f, 0x8b, 0xf3, 0xd5, 0x5b, 0x3d, 0xbd, 0x11, 0x93, 0x29, 0x2f, 0xba, 0x05, 0xa9, - 0x4e, 0x7f, 0x64, 0xf5, 0xca, 0x71, 0x2a, 0xf4, 0x58, 0x94, 0xd0, 0x5d, 0xc2, 0xd4, 0x88, 0xc9, - 0x8c, 0x9b, 0x0c, 0xa5, 0x0d, 0x3b, 0x7a, 0x39, 0x71, 0xf9, 0x50, 0x7b, 0xc3, 0x0e, 0x1d, 0x8a, - 0xf0, 0xa2, 0x5d, 0x00, 0x6d, 0xa8, 0xd9, 0x4a, 0xab, 0xa7, 0x6a, 0xc3, 0x72, 0x8a, 0x4a, 0x3e, - 0x1e, 0x2d, 0xa9, 0xd9, 0x35, 0xc2, 0xd8, 0x88, 0xc9, 0x39, 0xcd, 0xe9, 0x90, 0xdf, 0x7d, 0x7f, - 0x84, 0xcd, 0x8b, 0x72, 0xfa, 0xf2, 0xdf, 0x7d, 0x93, 0x30, 0x91, 0xdf, 0xa5, 0xdc, 0xe8, 0x55, - 0xc8, 0xb6, 0x7a, 0xb8, 0xf5, 0x40, 0xb1, 0xc7, 0xe5, 0x2c, 0x95, 0xdc, 0x88, 0x92, 0xac, 0x11, - 0xbe, 0xe6, 0xb8, 0x11, 0x93, 0x33, 0x2d, 0xd6, 0x44, 0x2f, 0x43, 0xba, 0xa5, 0x0f, 0x06, 0x9a, - 0x5d, 0xce, 0x53, 0xd9, 0xf5, 0x48, 0x59, 0xca, 0xd5, 0x88, 0xc9, 0x9c, 0x1f, 0x1d, 0x42, 0xa9, - 0xaf, 0x59, 0xb6, 0x62, 0x0d, 0x55, 0xc3, 0xea, 0xe9, 0xb6, 0x55, 0x2e, 0x50, 0x0d, 0x4f, 0x46, - 0x69, 0x38, 0xd0, 0x2c, 0xfb, 0xc4, 0x61, 0x6e, 0xc4, 0xe4, 0x62, 0xdf, 0x4f, 0x20, 0xfa, 0xf4, - 0x4e, 0x07, 0x9b, 0xae, 0xc2, 0x72, 0xf1, 0x72, 0x7d, 0x47, 0x84, 0xdb, 0x91, 0x27, 0xfa, 0x74, - 0x3f, 0x01, 0xfd, 0x14, 0x56, 0xfa, 0xba, 0xda, 0x76, 0xd5, 0x29, 0xad, 0xde, 0x68, 0xf8, 0xa0, - 0x5c, 0xa2, 0x4a, 0x9f, 0x89, 0xfc, 0x49, 0x5d, 0x6d, 0x3b, 0x2a, 0x6a, 0x44, 0xa0, 0x11, 0x93, - 0x97, 0xfb, 0x93, 0x44, 0xf4, 0x0e, 0xac, 0xaa, 0x86, 0xd1, 0xbf, 0x98, 0xd4, 0xbe, 0x44, 0xb5, - 0xdf, 0x88, 0xd2, 0x5e, 0x25, 0x32, 0x93, 0xea, 0x91, 0x3a, 0x45, 0x45, 0x4d, 0x10, 0x0d, 0x13, - 0x1b, 0xaa, 0x89, 0x15, 0xc3, 0xd4, 0x0d, 0xdd, 0x52, 0xfb, 0x65, 0x91, 0xea, 0x7e, 0x3a, 0x4a, - 0xf7, 0x31, 0xe3, 0x3f, 0xe6, 0xec, 0x8d, 0x98, 0xbc, 0x64, 0x04, 0x49, 0x4c, 0xab, 0xde, 0xc2, - 0x96, 0xe5, 0x69, 0x5d, 0x9e, 0xa5, 0x95, 0xf2, 0x07, 0xb5, 0x06, 0x48, 0xa8, 0x0e, 0x79, 0x3c, - 0x26, 0xe2, 0xca, 0xb9, 0x6e, 0xe3, 0x32, 0xa2, 0x0a, 0xa5, 0xc8, 0x13, 0x4a, 0x59, 0xef, 0xeb, - 0x36, 0x6e, 0xc4, 0x64, 0xc0, 0x6e, 0x0f, 0xa9, 0x70, 0xe5, 0x1c, 0x9b, 0x5a, 0xe7, 0x82, 0xaa, - 0x51, 0xe8, 0x17, 0x4b, 0xd3, 0x87, 0xe5, 0x15, 0xaa, 0xf0, 0xd9, 0x28, 0x85, 0xf7, 0xa9, 0x10, - 0x51, 0x51, 0x77, 0x44, 0x1a, 0x31, 0x79, 0xe5, 0x7c, 0x9a, 0x4c, 0xb6, 0x58, 0x47, 0x1b, 0xaa, - 0x7d, 0xed, 0x43, 0xac, 0x9c, 0xf5, 0xf5, 0xd6, 0x83, 0xf2, 0xea, 0xe5, 0x5b, 0xec, 0x2e, 0xe7, - 0xde, 0x25, 0xcc, 0x64, 0x8b, 0x75, 0xfc, 0x04, 0x24, 0x83, 0x68, 0x69, 0xdd, 0xa1, 0xd2, 0xd5, - 0x2d, 0x4b, 0x33, 0xd8, 0xf4, 0xaf, 0x50, 0x8d, 0x4f, 0x45, 0x69, 0x3c, 0xd1, 0xba, 0xc3, 0xd7, - 0x29, 0x3b, 0x37, 0x41, 0xc9, 0x0a, 0x50, 0x76, 0x33, 0x90, 0x3a, 0x57, 0xfb, 0x23, 0xbc, 0x9f, - 0xcc, 0x26, 0xc5, 0xd4, 0x7e, 0x32, 0x9b, 0x11, 0xb3, 0xfb, 0xc9, 0x6c, 0x4e, 0x84, 0xfd, 0x64, - 0x16, 0xc4, 0xbc, 0xf4, 0x34, 0xe4, 0x7d, 0xce, 0x0e, 0x95, 0x21, 0x33, 0xc0, 0x96, 0xa5, 0x76, - 0x31, 0xf5, 0x8d, 0x39, 0xd9, 0xe9, 0x4a, 0x25, 0x28, 0xf8, 0x1d, 0x9c, 0xf4, 0xa9, 0xe0, 0x4a, - 0x12, 0xdf, 0x45, 0x24, 0xcf, 0xb1, 0x49, 0x4d, 0xcc, 0x25, 0x79, 0x17, 0x3d, 0x01, 0x45, 0x6a, - 0x1e, 0xc5, 0xf9, 0x4e, 0x1c, 0x68, 0x52, 0x2e, 0x50, 0xe2, 0x7d, 0xce, 0xb4, 0x01, 0x79, 0x63, - 0xc7, 0x70, 0x59, 0x12, 0x94, 0x05, 0x8c, 0x1d, 0xc3, 0x61, 0x78, 0x1c, 0x0a, 0x64, 0xe6, 0x2e, - 0x47, 0x92, 0x0e, 0x92, 0x27, 0x34, 0xce, 0x22, 0xfd, 0x39, 0x0e, 0xe2, 0xa4, 0x53, 0x44, 0x2f, - 0x43, 0x92, 0x84, 0x0f, 0xee, 0xea, 0x2b, 0x5b, 0x2c, 0xb6, 0x6c, 0x39, 0xb1, 0x65, 0xab, 0xe9, - 0xc4, 0x96, 0xdd, 0xec, 0x97, 0x5f, 0x6f, 0xc4, 0x3e, 0xfd, 0xeb, 0x86, 0x20, 0x53, 0x09, 0x74, - 0x95, 0xb8, 0x42, 0x55, 0x1b, 0x2a, 0x5a, 0x9b, 0xfe, 0x72, 0x8e, 0xf8, 0x39, 0x55, 0x1b, 0xee, - 0xb5, 0xd1, 0x01, 0x88, 0x2d, 0x7d, 0x68, 0xe1, 0xa1, 0x35, 0xb2, 0x14, 0x16, 0xdd, 0xb8, 0x83, - 0x0f, 0xb8, 0x69, 0x16, 0x7e, 0x6a, 0x0e, 0xe7, 0x31, 0x65, 0x94, 0x97, 0x5a, 0x41, 0x02, 0xba, - 0x0b, 0xe0, 0x86, 0x40, 0xab, 0x9c, 0xdc, 0x4c, 0x5c, 0xcf, 0xef, 0x6c, 0x4e, 0x2d, 0xf9, 0x7d, - 0x87, 0xe5, 0xd4, 0x68, 0xab, 0x36, 0xde, 0x4d, 0x92, 0xdf, 0x95, 0x7d, 0x92, 0xe8, 0x29, 0x58, - 0x52, 0x0d, 0x43, 0xb1, 0x6c, 0xd5, 0xc6, 0xca, 0xd9, 0x85, 0x8d, 0x2d, 0x1a, 0x3b, 0x0a, 0x72, - 0x51, 0x35, 0x8c, 0x13, 0x42, 0xdd, 0x25, 0x44, 0xf4, 0x24, 0x94, 0x48, 0x9c, 0xd0, 0xd4, 0xbe, - 0xd2, 0xc3, 0x5a, 0xb7, 0x67, 0xd3, 0x18, 0x91, 0x90, 0x8b, 0x9c, 0xda, 0xa0, 0x44, 0xa9, 0xed, - 0xae, 0x38, 0x8d, 0x11, 0x08, 0x41, 0xb2, 0xad, 0xda, 0x2a, 0xb5, 0x64, 0x41, 0xa6, 0x6d, 0x42, - 0x33, 0x54, 0xbb, 0xc7, 0xed, 0x43, 0xdb, 0x68, 0x0d, 0xd2, 0x5c, 0x6d, 0x82, 0xaa, 0xe5, 0x3d, - 0xb4, 0x0a, 0x29, 0xc3, 0xd4, 0xcf, 0x31, 0x5d, 0xba, 0xac, 0xcc, 0x3a, 0x92, 0x0c, 0xa5, 0x60, - 0x3c, 0x41, 0x25, 0x88, 0xdb, 0x63, 0x3e, 0x4a, 0xdc, 0x1e, 0xa3, 0x17, 0x20, 0x49, 0x0c, 0x49, - 0xc7, 0x28, 0x85, 0x44, 0x50, 0x2e, 0xd7, 0xbc, 0x30, 0xb0, 0x4c, 0x39, 0xa5, 0x25, 0x28, 0x06, - 0xe2, 0x8c, 0xb4, 0x06, 0xab, 0x61, 0x61, 0x43, 0xea, 0xb9, 0xf4, 0x80, 0xfb, 0x47, 0xb7, 0x20, - 0xeb, 0xc6, 0x0d, 0xb6, 0x71, 0xae, 0x4e, 0x0d, 0xeb, 0x30, 0xcb, 0x2e, 0x2b, 0xd9, 0x31, 0x64, - 0x01, 0x7a, 0x2a, 0xcf, 0x12, 0x0a, 0x72, 0x46, 0x35, 0x8c, 0x86, 0x6a, 0xf5, 0xa4, 0x77, 0xa1, - 0x1c, 0x15, 0x13, 0x7c, 0x06, 0x13, 0xe8, 0xb6, 0x77, 0x0c, 0xb6, 0x06, 0xe9, 0x8e, 0x6e, 0x0e, - 0x54, 0x9b, 0x2a, 0x2b, 0xca, 0xbc, 0x47, 0x0c, 0xc9, 0xe2, 0x43, 0x82, 0x92, 0x59, 0x47, 0x52, - 0xe0, 0x6a, 0x64, 0x5c, 0x20, 0x22, 0xda, 0xb0, 0x8d, 0x99, 0x59, 0x8b, 0x32, 0xeb, 0x78, 0x8a, - 0xd8, 0xcf, 0xb2, 0x0e, 0x19, 0xd6, 0xa2, 0x73, 0xa5, 0xfa, 0x73, 0x32, 0xef, 0x49, 0x9f, 0x27, - 0x60, 0x2d, 0x3c, 0x3a, 0xa0, 0x4d, 0x28, 0x0c, 0xd4, 0xb1, 0x62, 0x8f, 0xf9, 0xb6, 0x13, 0xe8, - 0xc2, 0xc3, 0x40, 0x1d, 0x37, 0xc7, 0x6c, 0xcf, 0x89, 0x90, 0xb0, 0xc7, 0x56, 0x39, 0xbe, 0x99, - 0xb8, 0x5e, 0x90, 0x49, 0x13, 0x9d, 0xc2, 0x72, 0x5f, 0x6f, 0xa9, 0x7d, 0xa5, 0xaf, 0x5a, 0xb6, - 0xc2, 0xd3, 0x06, 0x76, 0x88, 0x9e, 0x98, 0x32, 0x36, 0xf3, 0xf3, 0xb8, 0xcd, 0xd6, 0x93, 0x38, - 0x1c, 0xbe, 0xff, 0x97, 0xa8, 0x8e, 0x03, 0xd5, 0x59, 0x6a, 0x74, 0x07, 0xf2, 0x03, 0xcd, 0x3a, - 0xc3, 0x3d, 0xf5, 0x5c, 0xd3, 0x4d, 0x7e, 0x9a, 0xa6, 0x37, 0xcd, 0x1b, 0x1e, 0x0f, 0xd7, 0xe4, - 0x17, 0xf3, 0x2d, 0x49, 0x2a, 0xb0, 0x87, 0x1d, 0x6f, 0x92, 0x5e, 0xd8, 0x9b, 0xbc, 0x00, 0xab, - 0x43, 0x3c, 0xb6, 0x15, 0xef, 0xbc, 0xb2, 0x7d, 0x92, 0xa1, 0xa6, 0x47, 0xe4, 0x9b, 0x7b, 0xc2, - 0x2d, 0xb2, 0x65, 0xd0, 0x33, 0x34, 0xbe, 0x1a, 0xba, 0x85, 0x4d, 0x45, 0x6d, 0xb7, 0x4d, 0x6c, - 0x59, 0x34, 0x25, 0x2b, 0xd0, 0xa0, 0x49, 0xe9, 0x55, 0x46, 0x96, 0x7e, 0xed, 0x5f, 0x9a, 0x60, - 0x3c, 0xe5, 0x86, 0x17, 0x3c, 0xc3, 0x9f, 0xc0, 0x2a, 0x97, 0x6f, 0x07, 0x6c, 0xcf, 0xf2, 0xda, - 0x47, 0xa7, 0xcf, 0xd7, 0xa4, 0xcd, 0x91, 0x23, 0x1e, 0x6d, 0xf6, 0xc4, 0xc3, 0x99, 0x1d, 0x41, - 0x92, 0x1a, 0x25, 0xc9, 0x5c, 0x0c, 0x69, 0xff, 0xa7, 0x2d, 0xc5, 0xc7, 0x09, 0x58, 0x9e, 0x4a, - 0x4e, 0xdc, 0x89, 0x09, 0xa1, 0x13, 0x8b, 0x87, 0x4e, 0x2c, 0xb1, 0xf0, 0xc4, 0xf8, 0x5a, 0x27, - 0x67, 0xaf, 0x75, 0xea, 0x07, 0x5c, 0xeb, 0xf4, 0xc3, 0xad, 0xf5, 0xbf, 0x75, 0x15, 0x7e, 0x23, - 0x40, 0x25, 0x3a, 0xa3, 0x0b, 0x5d, 0x8e, 0x67, 0x61, 0xd9, 0xfd, 0x15, 0x57, 0x3d, 0x73, 0x8c, - 0xa2, 0xfb, 0x81, 0xeb, 0x8f, 0x8c, 0x71, 0x4f, 0x42, 0x69, 0x22, 0xdf, 0x64, 0x5b, 0xb9, 0x78, - 0xee, 0x1f, 0x5f, 0xfa, 0x65, 0xc2, 0x0d, 0x3c, 0x81, 0xa4, 0x30, 0xe4, 0xb4, 0xbe, 0x09, 0x2b, - 0x6d, 0xdc, 0xd2, 0xda, 0x0f, 0x7b, 0x58, 0x97, 0xb9, 0xf4, 0xff, 0xce, 0x6a, 0xe8, 0x2e, 0xb9, - 0x12, 0x9a, 0x49, 0x87, 0x2a, 0x11, 0x42, 0x95, 0xa0, 0x1f, 0x43, 0xc1, 0x97, 0xb1, 0xb3, 0x10, - 0x37, 0x51, 0x6f, 0x33, 0x34, 0x62, 0xcb, 0xd3, 0x2f, 0xe7, 0xbb, 0x6e, 0x3b, 0x72, 0x33, 0x49, - 0x7f, 0x07, 0xc8, 0xca, 0xd8, 0x32, 0x48, 0xba, 0x88, 0x76, 0x21, 0x87, 0xc7, 0x2d, 0x6c, 0xd8, - 0x4e, 0x86, 0x1d, 0x5e, 0x15, 0x31, 0xee, 0xba, 0xc3, 0xd9, 0x88, 0xc9, 0x9e, 0x18, 0xba, 0xc9, - 0x61, 0x8f, 0x68, 0x04, 0x83, 0x8b, 0xfb, 0x71, 0x8f, 0x17, 0x1d, 0xdc, 0x23, 0x11, 0x59, 0xd2, - 0x33, 0xa9, 0x09, 0xe0, 0xe3, 0x26, 0x07, 0x3e, 0x92, 0x33, 0x06, 0x0b, 0x20, 0x1f, 0xb5, 0x00, - 0xf2, 0x91, 0x9e, 0x31, 0xcd, 0x08, 0xe8, 0xe3, 0x45, 0x07, 0xfa, 0xc8, 0xcc, 0xf8, 0xe3, 0x09, - 0xec, 0xe3, 0x35, 0x1f, 0xf6, 0x91, 0xa3, 0xa2, 0x9b, 0x91, 0xa2, 0x21, 0xe0, 0xc7, 0x2b, 0x2e, - 0xf8, 0x51, 0x88, 0x04, 0x4e, 0xb8, 0xf0, 0x24, 0xfa, 0x71, 0x34, 0x85, 0x7e, 0x14, 0x23, 0x0b, - 0x3f, 0xa6, 0x62, 0x06, 0xfc, 0x71, 0x34, 0x05, 0x7f, 0x94, 0x66, 0x28, 0x9c, 0x81, 0x7f, 0xfc, - 0x2c, 0x1c, 0xff, 0x88, 0x46, 0x28, 0xf8, 0x6f, 0xce, 0x07, 0x80, 0x28, 0x11, 0x00, 0x88, 0x18, - 0x59, 0xac, 0x33, 0xf5, 0x73, 0x23, 0x20, 0xa7, 0x21, 0x08, 0x08, 0xc3, 0x2a, 0xae, 0x47, 0x2a, - 0x9f, 0x03, 0x02, 0x39, 0x0d, 0x81, 0x40, 0xd0, 0x4c, 0xb5, 0x33, 0x31, 0x90, 0xbb, 0x41, 0x0c, - 0x64, 0x25, 0x22, 0x29, 0xf6, 0x4e, 0x7b, 0x04, 0x08, 0x72, 0x16, 0x05, 0x82, 0x30, 0xa0, 0xe2, - 0xb9, 0x48, 0x8d, 0x0b, 0xa0, 0x20, 0x47, 0x53, 0x28, 0xc8, 0x95, 0x19, 0x3b, 0x6d, 0x06, 0x0c, - 0x72, 0x12, 0x02, 0x83, 0xac, 0x45, 0xc2, 0x4a, 0x4c, 0xe5, 0x22, 0x38, 0x48, 0x4a, 0x4c, 0xef, - 0x27, 0xb3, 0x59, 0x31, 0xc7, 0x10, 0x90, 0xfd, 0x64, 0x36, 0x2f, 0x16, 0xa4, 0x67, 0x48, 0xd6, - 0x36, 0xe1, 0x3c, 0x49, 0x7d, 0x84, 0x4d, 0x53, 0x37, 0x39, 0xa2, 0xc1, 0x3a, 0xd2, 0x75, 0x52, - 0x17, 0x7b, 0x8e, 0xf2, 0x12, 0xcc, 0x84, 0xd6, 0xa1, 0x3e, 0xe7, 0x28, 0xfd, 0x41, 0xf0, 0x64, - 0x29, 0x6a, 0xe2, 0xaf, 0xa9, 0x73, 0xbc, 0xa6, 0xf6, 0x21, 0x29, 0xf1, 0x20, 0x92, 0xb2, 0x01, - 0x79, 0x52, 0x5f, 0x4e, 0x80, 0x24, 0xaa, 0xe1, 0x82, 0x24, 0x37, 0x60, 0x99, 0x26, 0x09, 0x0c, - 0x6f, 0xe1, 0x41, 0x25, 0x49, 0x83, 0xca, 0x12, 0xf9, 0xc0, 0x4c, 0xce, 0x62, 0xf2, 0xf3, 0xb0, - 0xe2, 0xe3, 0x75, 0xeb, 0x56, 0x86, 0x18, 0x88, 0x2e, 0x77, 0x95, 0x17, 0xb0, 0x7f, 0x12, 0x3c, - 0x0b, 0x79, 0xe8, 0x4a, 0x18, 0x10, 0x22, 0xfc, 0x40, 0x40, 0x48, 0xfc, 0xa1, 0x81, 0x10, 0x7f, - 0x1d, 0x9e, 0x08, 0xd6, 0xe1, 0xff, 0x14, 0xbc, 0x35, 0x71, 0x61, 0x8d, 0x96, 0xde, 0xc6, 0xbc, - 0x32, 0xa6, 0x6d, 0x92, 0x86, 0xf5, 0xf5, 0x2e, 0xaf, 0x7f, 0x49, 0x93, 0x70, 0xb9, 0xd1, 0x2c, - 0xc7, 0x83, 0x95, 0x5b, 0x54, 0xb3, 0x64, 0x87, 0x17, 0xd5, 0x22, 0x24, 0x1e, 0x60, 0x06, 0xbb, - 0x17, 0x64, 0xd2, 0x24, 0x7c, 0x74, 0xf3, 0xf1, 0xa4, 0x85, 0x75, 0xd0, 0xcb, 0x90, 0xa3, 0x77, - 0x2a, 0x8a, 0x6e, 0x58, 0x1c, 0x6a, 0x0f, 0xa4, 0x73, 0xec, 0x62, 0x65, 0xeb, 0x98, 0xf0, 0x1c, - 0x19, 0x96, 0x9c, 0x35, 0x78, 0xcb, 0x97, 0x2f, 0xe4, 0x02, 0x59, 0xd6, 0x35, 0xc8, 0x91, 0xbf, - 0xb7, 0x0c, 0xb5, 0x85, 0xcb, 0x40, 0x7f, 0xd4, 0x23, 0x48, 0xbf, 0x8f, 0xc3, 0xd2, 0x44, 0xf4, - 0x0a, 0x9d, 0xbb, 0xb3, 0x25, 0xe3, 0x3e, 0x98, 0x67, 0x3e, 0x7b, 0xac, 0x03, 0x74, 0x55, 0x4b, - 0xf9, 0x40, 0x1d, 0xda, 0xb8, 0xcd, 0x8d, 0xe2, 0xa3, 0xa0, 0x0a, 0x64, 0x49, 0x6f, 0x64, 0xe1, - 0x36, 0x47, 0x9c, 0xdc, 0x3e, 0x6a, 0x40, 0x1a, 0x9f, 0xe3, 0xa1, 0x6d, 0x95, 0x33, 0x74, 0xd9, - 0xd7, 0xa6, 0x21, 0x00, 0xf2, 0x79, 0xb7, 0x4c, 0x16, 0xfb, 0xbb, 0xaf, 0x37, 0x44, 0xc6, 0xfd, - 0x9c, 0x3e, 0xd0, 0x6c, 0x3c, 0x30, 0xec, 0x0b, 0x99, 0xcb, 0x07, 0xad, 0x90, 0x9d, 0xb0, 0x02, - 0xc5, 0x3e, 0x0b, 0x0e, 0xa4, 0x41, 0x6c, 0xaa, 0xe9, 0xa6, 0x66, 0x5f, 0xc8, 0xc5, 0x01, 0x1e, - 0x18, 0xba, 0xde, 0x57, 0xd8, 0x19, 0xaf, 0x42, 0x29, 0x18, 0xac, 0xd1, 0x13, 0x50, 0x34, 0xb1, - 0xad, 0x6a, 0x43, 0x25, 0x90, 0xab, 0x15, 0x18, 0x91, 0x9d, 0xa9, 0xfd, 0x64, 0x56, 0x10, 0xe3, - 0xfb, 0xc9, 0x6c, 0x5c, 0x4c, 0x48, 0xc7, 0x24, 0xb7, 0x0c, 0x09, 0xd6, 0xe8, 0x25, 0xc8, 0x79, - 0x71, 0x5e, 0xa0, 0xb3, 0xbd, 0x04, 0x5d, 0xf2, 0x78, 0xa5, 0x3f, 0x0a, 0x9e, 0xca, 0x20, 0x5e, - 0x55, 0x87, 0xb4, 0x89, 0xad, 0x51, 0x9f, 0x21, 0x48, 0xa5, 0x9d, 0xe7, 0xe7, 0x0b, 0xf3, 0x84, - 0x3a, 0xea, 0xdb, 0x32, 0x17, 0x96, 0xde, 0x81, 0x34, 0xa3, 0xa0, 0x3c, 0x64, 0x4e, 0x0f, 0xef, - 0x1d, 0x1e, 0xbd, 0x75, 0x28, 0xc6, 0x10, 0x40, 0xba, 0x5a, 0xab, 0xd5, 0x8f, 0x9b, 0xa2, 0x80, - 0x72, 0x90, 0xaa, 0xee, 0x1e, 0xc9, 0x4d, 0x31, 0x4e, 0xc8, 0x72, 0x7d, 0xbf, 0x5e, 0x6b, 0x8a, - 0x09, 0xb4, 0x0c, 0x45, 0xd6, 0x56, 0xee, 0x1e, 0xc9, 0x6f, 0x54, 0x9b, 0x62, 0xd2, 0x47, 0x3a, - 0xa9, 0x1f, 0xde, 0xa9, 0xcb, 0x62, 0x4a, 0xfa, 0x3f, 0xb8, 0x1a, 0x99, 0x18, 0x78, 0x60, 0x94, - 0xe0, 0x03, 0xa3, 0xa4, 0xcf, 0xe3, 0xa4, 0x90, 0x8b, 0x8a, 0xf6, 0x68, 0x7f, 0x62, 0xe2, 0x3b, - 0x0b, 0xa4, 0x0a, 0x13, 0xb3, 0x27, 0xb5, 0x9b, 0x89, 0x3b, 0xd8, 0x6e, 0xf5, 0x58, 0xf6, 0xc1, - 0x3c, 0x50, 0x51, 0x2e, 0x72, 0x2a, 0x15, 0xb2, 0x18, 0xdb, 0x7b, 0xb8, 0x65, 0x2b, 0x6c, 0x13, - 0x59, 0xb4, 0x80, 0xca, 0x11, 0x36, 0x42, 0x3d, 0x61, 0x44, 0xe9, 0xdd, 0x85, 0x6c, 0x99, 0x83, - 0x94, 0x5c, 0x6f, 0xca, 0x6f, 0x8b, 0x09, 0x84, 0xa0, 0x44, 0x9b, 0xca, 0xc9, 0x61, 0xf5, 0xf8, - 0xa4, 0x71, 0x44, 0x6c, 0xb9, 0x02, 0x4b, 0x8e, 0x2d, 0x1d, 0x62, 0x4a, 0x7a, 0x16, 0x1e, 0x89, - 0x48, 0x55, 0xa6, 0xcb, 0x48, 0xe9, 0xb7, 0x82, 0x9f, 0x3b, 0x98, 0x6e, 0x1c, 0x41, 0xda, 0xb2, - 0x55, 0x7b, 0x64, 0x71, 0x23, 0xbe, 0x34, 0x6f, 0xee, 0xb2, 0xe5, 0x34, 0x4e, 0xa8, 0xb8, 0xcc, - 0xd5, 0x48, 0xb7, 0xa0, 0x14, 0xfc, 0x12, 0x6d, 0x03, 0x6f, 0x13, 0xc5, 0xa5, 0xdb, 0x80, 0xa6, - 0x53, 0x9a, 0x90, 0x92, 0x5a, 0x08, 0x2b, 0xa9, 0x7f, 0x27, 0xc0, 0xa3, 0x97, 0xa4, 0x2f, 0xe8, - 0xcd, 0x89, 0x49, 0xbe, 0xb2, 0x48, 0xf2, 0xb3, 0xc5, 0x68, 0x13, 0xd3, 0xbc, 0x09, 0x05, 0x3f, - 0x7d, 0xbe, 0x49, 0x7e, 0x17, 0xf7, 0x0e, 0x71, 0xb0, 0xf6, 0xf7, 0x5c, 0xa0, 0xf0, 0x3d, 0x5d, - 0xe0, 0xab, 0x00, 0xf6, 0x58, 0x61, 0xdb, 0x3a, 0xb4, 0x20, 0xe5, 0x98, 0x2a, 0x6e, 0x35, 0xc7, - 0xfc, 0x10, 0xe4, 0x6c, 0xde, 0xb2, 0xd0, 0x89, 0x1f, 0x08, 0x19, 0xd1, 0x18, 0x6b, 0x71, 0x90, - 0x60, 0xde, 0x60, 0xec, 0x01, 0x26, 0x8c, 0x6c, 0xa1, 0xb7, 0xe1, 0x91, 0x89, 0x44, 0xc1, 0x55, - 0x9d, 0x9c, 0x37, 0x5f, 0xb8, 0x12, 0xcc, 0x17, 0x1c, 0xd5, 0xfe, 0x68, 0x9f, 0x0a, 0x46, 0xfb, - 0x97, 0x60, 0x2d, 0x3c, 0x45, 0x44, 0x8f, 0x01, 0xe0, 0x21, 0x09, 0x0b, 0x6d, 0xc5, 0xbd, 0x6c, - 0xc8, 0x71, 0x4a, 0x73, 0x2c, 0xbd, 0x0d, 0xe0, 0x21, 0x29, 0xc4, 0x35, 0x99, 0xfa, 0x68, 0xd8, - 0xa6, 0x7c, 0x29, 0x99, 0x75, 0xd0, 0x2d, 0x48, 0xf9, 0x2b, 0xfe, 0x69, 0x1f, 0x4e, 0x06, 0xf2, - 0x21, 0x31, 0x8c, 0x5b, 0xd2, 0x00, 0x4d, 0xa3, 0xd9, 0x11, 0x43, 0xbc, 0x16, 0x1c, 0xe2, 0xf1, - 0x48, 0x5c, 0x3c, 0x7c, 0xa8, 0x0f, 0x21, 0x45, 0xb7, 0x0c, 0x89, 0xd6, 0xf4, 0x0a, 0x85, 0xa7, - 0x99, 0xa4, 0x8d, 0x7e, 0x0e, 0xa0, 0xda, 0xb6, 0xa9, 0x9d, 0x8d, 0xbc, 0x01, 0x36, 0xc2, 0xb7, - 0x5c, 0xd5, 0xe1, 0xdb, 0xbd, 0xc6, 0xf7, 0xde, 0xaa, 0x27, 0xea, 0xdb, 0x7f, 0x3e, 0x85, 0xd2, - 0x21, 0x94, 0x82, 0xb2, 0x4e, 0x62, 0xc4, 0xfe, 0x21, 0x98, 0x18, 0xb1, 0x3c, 0x97, 0x27, 0x46, - 0x6e, 0x5a, 0x95, 0x60, 0xf7, 0x44, 0xb4, 0x23, 0x7d, 0x14, 0x87, 0x82, 0x7f, 0xc7, 0xfe, 0xf7, - 0xe5, 0x2e, 0xd2, 0xaf, 0x04, 0xc8, 0xba, 0xd3, 0x0f, 0x5e, 0x1a, 0x05, 0x6e, 0xd9, 0x98, 0xf5, - 0xe2, 0xfe, 0x9b, 0x1e, 0x76, 0xa7, 0x96, 0x70, 0xef, 0xd4, 0x6e, 0xbb, 0x71, 0x33, 0x0a, 0x9e, - 0xf1, 0xdb, 0x9a, 0xef, 0x2a, 0x27, 0x4d, 0xb8, 0x0d, 0x39, 0xf7, 0xd8, 0x93, 0x6a, 0x25, 0x08, - 0x90, 0x39, 0x5d, 0x7a, 0xdf, 0xa7, 0x7f, 0xc0, 0xaf, 0x91, 0x12, 0x32, 0xeb, 0x48, 0x6d, 0x58, - 0x9a, 0xf0, 0x19, 0xe8, 0x36, 0x64, 0x8c, 0xd1, 0x99, 0xe2, 0x6c, 0x8e, 0x09, 0x2c, 0xd2, 0xc9, - 0x83, 0x47, 0x67, 0x7d, 0xad, 0x75, 0x0f, 0x5f, 0x38, 0x3f, 0x63, 0x8c, 0xce, 0xee, 0xb1, 0x3d, - 0xc4, 0x46, 0x89, 0xfb, 0x47, 0xf9, 0x4c, 0x80, 0xac, 0x73, 0x26, 0xd0, 0x8f, 0x20, 0xe7, 0xfa, - 0x23, 0xf7, 0x1e, 0x38, 0xd2, 0x91, 0x71, 0xfd, 0x9e, 0x08, 0xaa, 0x3a, 0x17, 0xd8, 0x5a, 0x5b, - 0xe9, 0xf4, 0x55, 0xb6, 0x97, 0x4a, 0x41, 0x9b, 0x31, 0x8f, 0x45, 0x1d, 0xf9, 0xde, 0x9d, 0xbb, - 0x7d, 0xb5, 0x2b, 0xe7, 0xa9, 0xcc, 0x5e, 0x9b, 0x74, 0x78, 0x4a, 0xf8, 0x0f, 0x01, 0xc4, 0xc9, - 0x13, 0xfb, 0xbd, 0xff, 0x6e, 0x3a, 0x3e, 0x26, 0x42, 0xe2, 0x23, 0xda, 0x86, 0x15, 0x97, 0x43, - 0x21, 0xd5, 0xb1, 0x6a, 0x8f, 0x4c, 0xcc, 0xd1, 0x5b, 0xe4, 0x7e, 0x3a, 0x71, 0xbe, 0x4c, 0xcf, - 0x3a, 0xf5, 0x90, 0xb3, 0xfe, 0x38, 0x0e, 0x79, 0x1f, 0x96, 0x8c, 0xfe, 0xdf, 0xe7, 0x8c, 0x4a, - 0x21, 0x21, 0xc5, 0xc7, 0xeb, 0xdd, 0xe9, 0x06, 0xcd, 0x14, 0x5f, 0xdc, 0x4c, 0x51, 0x88, 0xbd, - 0x03, 0x4d, 0x27, 0x17, 0x86, 0xa6, 0x9f, 0x03, 0x64, 0xeb, 0xb6, 0xda, 0x57, 0xce, 0x75, 0x5b, - 0x1b, 0x76, 0x15, 0xb6, 0x0d, 0x99, 0xeb, 0x10, 0xe9, 0x97, 0xfb, 0xf4, 0xc3, 0x31, 0xdd, 0x91, - 0xbf, 0x10, 0x20, 0xeb, 0xe6, 0xeb, 0x8b, 0xde, 0xf8, 0xae, 0x41, 0x9a, 0xa7, 0xa4, 0xec, 0xca, - 0x97, 0xf7, 0x42, 0x31, 0xf8, 0x0a, 0x64, 0x07, 0xd8, 0x56, 0xa9, 0x1f, 0x64, 0xe1, 0xd0, 0xed, - 0xdf, 0x78, 0x05, 0xf2, 0xbe, 0xdb, 0x72, 0xe2, 0x1a, 0x0f, 0xeb, 0x6f, 0x89, 0xb1, 0x4a, 0xe6, - 0x93, 0x2f, 0x36, 0x13, 0x87, 0xf8, 0x03, 0x72, 0x9a, 0xe5, 0x7a, 0xad, 0x51, 0xaf, 0xdd, 0x13, - 0x85, 0x4a, 0xfe, 0x93, 0x2f, 0x36, 0x33, 0x32, 0xa6, 0xf8, 0xe6, 0x8d, 0x7b, 0xb0, 0x34, 0xb1, - 0x30, 0xc1, 0x7c, 0x07, 0x41, 0xe9, 0xce, 0xe9, 0xf1, 0xc1, 0x5e, 0xad, 0xda, 0xac, 0x2b, 0xf7, - 0x8f, 0x9a, 0x75, 0x51, 0x40, 0x8f, 0xc0, 0xca, 0xc1, 0xde, 0xeb, 0x8d, 0xa6, 0x52, 0x3b, 0xd8, - 0xab, 0x1f, 0x36, 0x95, 0x6a, 0xb3, 0x59, 0xad, 0xdd, 0x13, 0xe3, 0x3b, 0x1f, 0x15, 0x20, 0x59, - 0xdd, 0xad, 0xed, 0xa1, 0x1a, 0x24, 0x29, 0x86, 0x72, 0xe9, 0x13, 0xbc, 0xca, 0xe5, 0x48, 0x35, - 0xba, 0x0b, 0x29, 0x0a, 0xaf, 0xa0, 0xcb, 0xdf, 0xe4, 0x55, 0x66, 0x40, 0xd7, 0xe4, 0x67, 0xe8, - 0x89, 0xbc, 0xf4, 0x91, 0x5e, 0xe5, 0x72, 0x24, 0x1b, 0x1d, 0x40, 0xc6, 0xa9, 0xae, 0x67, 0xbd, - 0x9c, 0xab, 0xcc, 0x84, 0x97, 0xc9, 0xd4, 0x18, 0x4a, 0x71, 0xf9, 0xfb, 0xbd, 0xca, 0x0c, 0x8c, - 0x1b, 0xed, 0x41, 0x9a, 0xd7, 0xb1, 0x33, 0x9e, 0xe4, 0x55, 0x66, 0xa1, 0xd6, 0x48, 0x86, 0x9c, - 0x87, 0xff, 0xcc, 0x7e, 0x95, 0x58, 0x99, 0x03, 0xbe, 0x47, 0xef, 0x40, 0x31, 0x58, 0x23, 0xcf, - 0xf7, 0xec, 0xaf, 0x32, 0x27, 0x3e, 0x4e, 0xf4, 0x07, 0x0b, 0xe6, 0xf9, 0x9e, 0x01, 0x56, 0xe6, - 0x84, 0xcb, 0xd1, 0x7b, 0xb0, 0x3c, 0x5d, 0xd0, 0xce, 0xff, 0x2a, 0xb0, 0xb2, 0x00, 0x80, 0x8e, - 0x06, 0x80, 0x42, 0x0a, 0xe1, 0x05, 0x1e, 0x09, 0x56, 0x16, 0xc1, 0xd3, 0x51, 0x1b, 0x96, 0x26, - 0xab, 0xcb, 0x79, 0x1f, 0x0d, 0x56, 0xe6, 0xc6, 0xd6, 0xd9, 0x28, 0xc1, 0xaa, 0x74, 0xde, 0x47, - 0x84, 0x95, 0xb9, 0xa1, 0x76, 0x74, 0x0a, 0xe0, 0x2b, 0x2c, 0xe7, 0x78, 0x54, 0x58, 0x99, 0x07, - 0x74, 0x47, 0x06, 0xac, 0x84, 0x55, 0x9c, 0x8b, 0xbc, 0x31, 0xac, 0x2c, 0x84, 0xc5, 0x93, 0xfd, - 0x1c, 0xac, 0x1d, 0xe7, 0x7b, 0x73, 0x58, 0x99, 0x13, 0x94, 0x47, 0x2a, 0x94, 0x26, 0xea, 0xa5, - 0x39, 0x9f, 0x20, 0x56, 0xe6, 0xc5, 0xe8, 0x77, 0xab, 0x5f, 0x7e, 0xb3, 0x2e, 0x7c, 0xf5, 0xcd, - 0xba, 0xf0, 0xb7, 0x6f, 0xd6, 0x85, 0x4f, 0xbf, 0x5d, 0x8f, 0x7d, 0xf5, 0xed, 0x7a, 0xec, 0x2f, - 0xdf, 0xae, 0xc7, 0x7e, 0xf2, 0x74, 0x57, 0xb3, 0x7b, 0xa3, 0xb3, 0xad, 0x96, 0x3e, 0xd8, 0x6e, - 0xe9, 0x03, 0x6c, 0x9f, 0x75, 0x6c, 0xaf, 0xe1, 0x3d, 0x5e, 0x3f, 0x4b, 0xd3, 0x20, 0x7d, 0xf3, - 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x13, 0x56, 0x3f, 0x46, 0xdc, 0x2e, 0x00, 0x00, + // 3400 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcd, 0x73, 0x23, 0xc5, + 0x15, 0xd7, 0x48, 0x23, 0x59, 0x7a, 0xfa, 0xf0, 0xb8, 0xbd, 0xeb, 0x15, 0xda, 0xc5, 0x36, 0x43, + 0x01, 0xcb, 0x02, 0x36, 0x78, 0xb3, 0x7c, 0xd4, 0x42, 0x2a, 0xb2, 0x56, 0x8b, 0xec, 0x35, 0xb6, + 0x19, 0xcb, 0x4b, 0x91, 0x0f, 0x86, 0xb1, 0xd4, 0x96, 0x86, 0x95, 0x34, 0xc3, 0xcc, 0xc8, 0xc8, + 0x9c, 0x52, 0x21, 0xa9, 0x4a, 0x71, 0xa2, 0x2a, 0x17, 0x0e, 0xe1, 0x90, 0x43, 0x2e, 0xf9, 0x0b, + 0x72, 0xca, 0x29, 0x07, 0x2a, 0x95, 0x03, 0xc7, 0x9c, 0x48, 0x0a, 0x6e, 0x5c, 0x72, 0xe0, 0x90, + 0x6b, 0xaa, 0x3f, 0xe6, 0x4b, 0x9a, 0xb1, 0xa4, 0x85, 0x1c, 0x52, 0xc9, 0xad, 0xfb, 0xe9, 0xbd, + 0xd7, 0xd3, 0xaf, 0x5f, 0xf7, 0x7b, 0xef, 0xd7, 0x2d, 0xb8, 0xea, 0xe0, 0x41, 0x1b, 0x5b, 0x7d, + 0x7d, 0xe0, 0x6c, 0x6a, 0x27, 0x2d, 0x7d, 0xd3, 0x39, 0x37, 0xb1, 0xbd, 0x61, 0x5a, 0x86, 0x63, + 0xa0, 0x45, 0xff, 0xc7, 0x0d, 0xf2, 0x63, 0xe5, 0xd1, 0x00, 0x77, 0xcb, 0x3a, 0x37, 0x1d, 0x63, + 0xd3, 0xb4, 0x0c, 0xe3, 0x94, 0xf1, 0x57, 0xae, 0x4d, 0xfe, 0xfc, 0x00, 0x9f, 0x73, 0x6d, 0x21, + 0x61, 0x3a, 0xca, 0xa6, 0xa9, 0x59, 0x5a, 0xdf, 0xfd, 0x79, 0x7d, 0xe2, 0xe7, 0x33, 0xad, 0xa7, + 0xb7, 0x35, 0xc7, 0xb0, 0x38, 0xc7, 0x5a, 0xc7, 0x30, 0x3a, 0x3d, 0xbc, 0x49, 0x7b, 0x27, 0xc3, + 0xd3, 0x4d, 0x47, 0xef, 0x63, 0xdb, 0xd1, 0xfa, 0x26, 0x67, 0xb8, 0xd4, 0x31, 0x3a, 0x06, 0x6d, + 0x6e, 0x92, 0x56, 0xc4, 0xb8, 0x86, 0xa5, 0xb5, 0x7a, 0x38, 0x38, 0x49, 0xf9, 0x5b, 0x80, 0x05, + 0x05, 0xbf, 0x3f, 0xc4, 0xb6, 0x83, 0xb6, 0x40, 0xc4, 0xad, 0xae, 0x51, 0x16, 0xd6, 0x85, 0xeb, + 0xf9, 0xad, 0x6b, 0x1b, 0x63, 0xf3, 0xdf, 0xe0, 0x7c, 0xf5, 0x56, 0xd7, 0x68, 0x24, 0x14, 0xca, + 0x8b, 0x6e, 0x41, 0xfa, 0xb4, 0x37, 0xb4, 0xbb, 0xe5, 0x24, 0x15, 0x7a, 0x34, 0x4e, 0xe8, 0x2e, + 0x61, 0x6a, 0x24, 0x14, 0xc6, 0x4d, 0x86, 0xd2, 0x07, 0xa7, 0x46, 0x39, 0x75, 0xf1, 0x50, 0x3b, + 0x83, 0x53, 0x3a, 0x14, 0xe1, 0x45, 0xdb, 0x00, 0xfa, 0x40, 0x77, 0xd4, 0x56, 0x57, 0xd3, 0x07, + 0xe5, 0x34, 0x95, 0x7c, 0x2c, 0x5e, 0x52, 0x77, 0x6a, 0x84, 0xb1, 0x91, 0x50, 0x72, 0xba, 0xdb, + 0x21, 0x9f, 0xfb, 0xfe, 0x10, 0x5b, 0xe7, 0xe5, 0xcc, 0xc5, 0x9f, 0xfb, 0x26, 0x61, 0x22, 0x9f, + 0x4b, 0xb9, 0xd1, 0xab, 0x90, 0x6d, 0x75, 0x71, 0xeb, 0x81, 0xea, 0x8c, 0xca, 0x59, 0x2a, 0xb9, + 0x16, 0x27, 0x59, 0x23, 0x7c, 0xcd, 0x51, 0x23, 0xa1, 0x2c, 0xb4, 0x58, 0x13, 0xbd, 0x0c, 0x99, + 0x96, 0xd1, 0xef, 0xeb, 0x4e, 0x39, 0x4f, 0x65, 0x57, 0x63, 0x65, 0x29, 0x57, 0x23, 0xa1, 0x70, + 0x7e, 0xb4, 0x0f, 0xa5, 0x9e, 0x6e, 0x3b, 0xaa, 0x3d, 0xd0, 0x4c, 0xbb, 0x6b, 0x38, 0x76, 0xb9, + 0x40, 0x35, 0x3c, 0x11, 0xa7, 0x61, 0x4f, 0xb7, 0x9d, 0x23, 0x97, 0xb9, 0x91, 0x50, 0x8a, 0xbd, + 0x20, 0x81, 0xe8, 0x33, 0x4e, 0x4f, 0xb1, 0xe5, 0x29, 0x2c, 0x17, 0x2f, 0xd6, 0x77, 0x40, 0xb8, + 0x5d, 0x79, 0xa2, 0xcf, 0x08, 0x12, 0xd0, 0x4f, 0x60, 0xb9, 0x67, 0x68, 0x6d, 0x4f, 0x9d, 0xda, + 0xea, 0x0e, 0x07, 0x0f, 0xca, 0x25, 0xaa, 0xf4, 0xe9, 0xd8, 0x8f, 0x34, 0xb4, 0xb6, 0xab, 0xa2, + 0x46, 0x04, 0x1a, 0x09, 0x65, 0xa9, 0x37, 0x4e, 0x44, 0xef, 0xc0, 0x25, 0xcd, 0x34, 0x7b, 0xe7, + 0xe3, 0xda, 0x17, 0xa9, 0xf6, 0x1b, 0x71, 0xda, 0xab, 0x44, 0x66, 0x5c, 0x3d, 0xd2, 0x26, 0xa8, + 0xa8, 0x09, 0x92, 0x69, 0x61, 0x53, 0xb3, 0xb0, 0x6a, 0x5a, 0x86, 0x69, 0xd8, 0x5a, 0xaf, 0x2c, + 0x51, 0xdd, 0x4f, 0xc5, 0xe9, 0x3e, 0x64, 0xfc, 0x87, 0x9c, 0xbd, 0x91, 0x50, 0x16, 0xcd, 0x30, + 0x89, 0x69, 0x35, 0x5a, 0xd8, 0xb6, 0x7d, 0xad, 0x4b, 0xd3, 0xb4, 0x52, 0xfe, 0xb0, 0xd6, 0x10, + 0x09, 0xd5, 0x21, 0x8f, 0x47, 0x44, 0x5c, 0x3d, 0x33, 0x1c, 0x5c, 0x46, 0x54, 0xa1, 0x1c, 0xbb, + 0x43, 0x29, 0xeb, 0x7d, 0xc3, 0xc1, 0x8d, 0x84, 0x02, 0xd8, 0xeb, 0x21, 0x0d, 0x2e, 0x9f, 0x61, + 0x4b, 0x3f, 0x3d, 0xa7, 0x6a, 0x54, 0xfa, 0x8b, 0xad, 0x1b, 0x83, 0xf2, 0x32, 0x55, 0xf8, 0x4c, + 0x9c, 0xc2, 0xfb, 0x54, 0x88, 0xa8, 0xa8, 0xbb, 0x22, 0x8d, 0x84, 0xb2, 0x7c, 0x36, 0x49, 0x26, + 0x2e, 0x76, 0xaa, 0x0f, 0xb4, 0x9e, 0xfe, 0x21, 0x56, 0x4f, 0x7a, 0x46, 0xeb, 0x41, 0xf9, 0xd2, + 0xc5, 0x2e, 0x76, 0x97, 0x73, 0x6f, 0x13, 0x66, 0xe2, 0x62, 0xa7, 0x41, 0x02, 0x52, 0x40, 0xb2, + 0xf5, 0xce, 0x40, 0xed, 0x18, 0xb6, 0xad, 0x9b, 0x6c, 0xfa, 0x97, 0xa9, 0xc6, 0x27, 0xe3, 0x34, + 0x1e, 0xe9, 0x9d, 0xc1, 0xeb, 0x94, 0x9d, 0x9b, 0xa0, 0x64, 0x87, 0x28, 0xc4, 0xb3, 0xdc, 0x95, + 0x67, 0x47, 0x22, 0x55, 0x6b, 0x97, 0x57, 0x2e, 0xf6, 0x2c, 0xbe, 0xfa, 0x07, 0x54, 0x84, 0x28, + 0x22, 0x3b, 0x0c, 0x99, 0x13, 0xd4, 0xed, 0x05, 0x48, 0x9f, 0x69, 0xbd, 0x21, 0xde, 0x15, 0xb3, + 0xa2, 0x94, 0xde, 0x15, 0xb3, 0x0b, 0x52, 0x76, 0x57, 0xcc, 0xe6, 0x24, 0xd8, 0x15, 0xb3, 0x20, + 0xe5, 0xe5, 0xa7, 0x20, 0x1f, 0x38, 0x4c, 0x51, 0x19, 0x16, 0xfa, 0xd8, 0xb6, 0xb5, 0x0e, 0xa6, + 0x67, 0x6f, 0x4e, 0x71, 0xbb, 0x72, 0x09, 0x0a, 0xc1, 0x03, 0x54, 0xfe, 0x44, 0xf0, 0x24, 0xc9, + 0xd9, 0x48, 0x24, 0xcf, 0xb0, 0x45, 0x97, 0x90, 0x4b, 0xf2, 0x2e, 0x7a, 0x1c, 0x8a, 0xd4, 0xfc, + 0xaa, 0xfb, 0x3b, 0x39, 0xa0, 0x45, 0xa5, 0x40, 0x89, 0xf7, 0x39, 0xd3, 0x1a, 0xe4, 0xcd, 0x2d, + 0xd3, 0x63, 0x49, 0x51, 0x16, 0x30, 0xb7, 0x4c, 0x97, 0xe1, 0x31, 0x28, 0x10, 0x0b, 0x78, 0x1c, + 0x22, 0x1d, 0x24, 0x4f, 0x68, 0x9c, 0x45, 0xfe, 0x6b, 0x12, 0xa4, 0xf1, 0x43, 0x17, 0xbd, 0x0c, + 0x22, 0x09, 0x4f, 0x3c, 0x94, 0x54, 0x36, 0x58, 0xec, 0xda, 0x70, 0x63, 0xd7, 0x46, 0xd3, 0x8d, + 0x5d, 0xdb, 0xd9, 0xcf, 0xbf, 0x5c, 0x4b, 0x7c, 0xf2, 0xf7, 0x35, 0x41, 0xa1, 0x12, 0xe8, 0x11, + 0x72, 0xd4, 0x6a, 0xfa, 0x40, 0xd5, 0xdb, 0xf4, 0x93, 0x73, 0xe4, 0x1c, 0xd5, 0xf4, 0xc1, 0x4e, + 0x1b, 0xed, 0x81, 0xd4, 0x32, 0x06, 0x36, 0x1e, 0xd8, 0x43, 0x5b, 0x65, 0xd1, 0x93, 0x07, 0x90, + 0x50, 0x18, 0x60, 0xe1, 0xad, 0xe6, 0x72, 0x1e, 0x52, 0x46, 0x65, 0xb1, 0x15, 0x26, 0xa0, 0xbb, + 0x00, 0x5e, 0x88, 0xb5, 0xcb, 0xe2, 0x7a, 0xea, 0x7a, 0x7e, 0x6b, 0x7d, 0x62, 0xe9, 0xef, 0xbb, + 0x2c, 0xc7, 0x66, 0x5b, 0x73, 0xf0, 0xb6, 0x48, 0x3e, 0x57, 0x09, 0x48, 0xa2, 0x27, 0x61, 0x51, + 0x33, 0x4d, 0xd5, 0x76, 0x34, 0x07, 0xab, 0x27, 0xe7, 0xc4, 0x8f, 0x48, 0x6c, 0x2a, 0x28, 0x45, + 0xcd, 0x34, 0x8f, 0x08, 0x75, 0x9b, 0x10, 0xd1, 0x13, 0x50, 0x22, 0x71, 0x48, 0xd7, 0x7a, 0x6a, + 0x17, 0xeb, 0x9d, 0xae, 0x43, 0x63, 0x50, 0x4a, 0x29, 0x72, 0x6a, 0x83, 0x12, 0xe5, 0xb6, 0xb7, + 0xe2, 0x34, 0x06, 0x21, 0x04, 0x62, 0x5b, 0x73, 0x34, 0x6a, 0xc9, 0x82, 0x42, 0xdb, 0x84, 0x66, + 0x6a, 0x4e, 0x97, 0xdb, 0x87, 0xb6, 0xd1, 0x0a, 0x64, 0xb8, 0xda, 0x14, 0x55, 0xcb, 0x7b, 0xe8, + 0x12, 0xa4, 0x4d, 0xcb, 0x38, 0xc3, 0x74, 0xe9, 0xb2, 0x0a, 0xeb, 0xc8, 0x0a, 0x94, 0xc2, 0xf1, + 0x0a, 0x95, 0x20, 0xe9, 0x8c, 0xf8, 0x28, 0x49, 0x67, 0x84, 0x9e, 0x07, 0x91, 0x18, 0x92, 0x8e, + 0x51, 0x8a, 0x88, 0xd0, 0x5c, 0xae, 0x79, 0x6e, 0x62, 0x85, 0x72, 0xca, 0x8b, 0x50, 0x0c, 0xc5, + 0x31, 0x79, 0x05, 0x2e, 0x45, 0x85, 0x25, 0xb9, 0xeb, 0xd1, 0x43, 0xe1, 0x05, 0xdd, 0x82, 0xac, + 0x17, 0x97, 0x98, 0xe3, 0x3c, 0x32, 0x31, 0xac, 0xcb, 0xac, 0x78, 0xac, 0xc4, 0x63, 0xc8, 0x02, + 0x74, 0x35, 0x9e, 0x85, 0x14, 0x94, 0x05, 0xcd, 0x34, 0x1b, 0x9a, 0xdd, 0x95, 0xdf, 0x85, 0x72, + 0x5c, 0xcc, 0x09, 0x18, 0x4c, 0xa0, 0x6e, 0xef, 0x1a, 0x6c, 0x05, 0x32, 0xa7, 0x86, 0xd5, 0xd7, + 0x1c, 0xaa, 0xac, 0xa8, 0xf0, 0x1e, 0x31, 0x24, 0x8b, 0x3f, 0x29, 0x4a, 0x66, 0x1d, 0x59, 0x85, + 0x47, 0x62, 0xe3, 0x0e, 0x11, 0xd1, 0x07, 0x6d, 0xcc, 0xcc, 0x5a, 0x54, 0x58, 0xc7, 0x57, 0xc4, + 0x3e, 0x96, 0x75, 0xc8, 0xb0, 0x36, 0x9d, 0x2b, 0xd5, 0x9f, 0x53, 0x78, 0x4f, 0xfe, 0x34, 0x05, + 0x2b, 0xd1, 0xd1, 0x07, 0xad, 0x43, 0xa1, 0xaf, 0x8d, 0x54, 0x67, 0xc4, 0xdd, 0x4e, 0xa0, 0x0b, + 0x0f, 0x7d, 0x6d, 0xd4, 0x1c, 0x31, 0x9f, 0x93, 0x20, 0xe5, 0x8c, 0xec, 0x72, 0x72, 0x3d, 0x75, + 0xbd, 0xa0, 0x90, 0x26, 0x3a, 0x86, 0xa5, 0x9e, 0xd1, 0xd2, 0x7a, 0x6a, 0x4f, 0xb3, 0x1d, 0x95, + 0xa7, 0x25, 0x6c, 0x13, 0x3d, 0x3e, 0x61, 0x6c, 0x16, 0x47, 0x70, 0x9b, 0xad, 0x27, 0x39, 0x70, + 0xb8, 0xff, 0x2f, 0x52, 0x1d, 0x7b, 0x9a, 0xbb, 0xd4, 0xe8, 0x0e, 0xe4, 0xfb, 0xba, 0x7d, 0x82, + 0xbb, 0xda, 0x99, 0x6e, 0x58, 0x7c, 0x37, 0x4d, 0x3a, 0xcd, 0x1b, 0x3e, 0x0f, 0xd7, 0x14, 0x14, + 0x0b, 0x2c, 0x49, 0x3a, 0xe4, 0xc3, 0xee, 0x69, 0x92, 0x99, 0xfb, 0x34, 0x79, 0x1e, 0x2e, 0x0d, + 0xf0, 0xc8, 0x51, 0xfd, 0xfd, 0xca, 0xfc, 0x64, 0x81, 0x9a, 0x1e, 0x91, 0xdf, 0xbc, 0x1d, 0x6e, + 0x13, 0x97, 0x41, 0x4f, 0xd3, 0xf8, 0x6d, 0x1a, 0x36, 0xb6, 0x54, 0xad, 0xdd, 0xb6, 0xb0, 0x6d, + 0xd3, 0x94, 0xaf, 0x40, 0x83, 0x32, 0xa5, 0x57, 0x19, 0x59, 0xfe, 0x75, 0x70, 0x69, 0xc2, 0xf1, + 0x9a, 0x1b, 0x5e, 0xf0, 0x0d, 0x7f, 0x44, 0x62, 0x0e, 0x95, 0x6f, 0x87, 0x6c, 0xcf, 0xf2, 0xe6, + 0xab, 0x93, 0xfb, 0x6b, 0xdc, 0xe6, 0xc8, 0x15, 0x8f, 0x37, 0x7b, 0xea, 0xe1, 0xcc, 0x8e, 0x40, + 0xa4, 0x46, 0x11, 0xd9, 0x11, 0x43, 0xda, 0xff, 0x6d, 0x4b, 0xf1, 0x51, 0x0a, 0x96, 0x26, 0x92, + 0x1f, 0x6f, 0x62, 0x42, 0xe4, 0xc4, 0x92, 0x91, 0x13, 0x4b, 0xcd, 0x3d, 0x31, 0xbe, 0xd6, 0xe2, + 0xf4, 0xb5, 0x4e, 0x7f, 0x8f, 0x6b, 0x9d, 0x79, 0xb8, 0xb5, 0xfe, 0x8f, 0xae, 0xc2, 0x6f, 0x05, + 0xa8, 0xc4, 0x67, 0x8c, 0x91, 0xcb, 0xf1, 0x0c, 0x2c, 0x79, 0x9f, 0xe2, 0xa9, 0x67, 0x07, 0xa3, + 0xe4, 0xfd, 0xc0, 0xf5, 0xc7, 0xc6, 0xb8, 0x27, 0xa0, 0x34, 0x96, 0xcf, 0x32, 0x57, 0x2e, 0x9e, + 0x05, 0xc7, 0x97, 0x7f, 0x99, 0xf2, 0x02, 0x4f, 0x28, 0xe9, 0x8c, 0xd8, 0xad, 0x6f, 0xc2, 0x72, + 0x1b, 0xb7, 0xf4, 0xf6, 0xc3, 0x6e, 0xd6, 0x25, 0x2e, 0xfd, 0xff, 0xbd, 0x1a, 0xe9, 0x25, 0x97, + 0x23, 0x33, 0xf5, 0x48, 0x25, 0x42, 0xa4, 0x12, 0xf4, 0x23, 0x28, 0x04, 0x2a, 0x02, 0x16, 0xe2, + 0xc6, 0xea, 0x79, 0x96, 0xda, 0x6f, 0xf8, 0xfa, 0x95, 0x7c, 0xc7, 0x6b, 0xc7, 0x3a, 0x93, 0x7c, + 0xd5, 0x8b, 0xe8, 0x93, 0xf9, 0xbe, 0xfc, 0x97, 0x3c, 0x64, 0x15, 0x6c, 0x9b, 0x24, 0x97, 0x44, + 0xdb, 0x90, 0xc3, 0xa3, 0x16, 0x36, 0x1d, 0x37, 0xfd, 0x8e, 0x2e, 0xc9, 0x18, 0x77, 0xdd, 0xe5, + 0x6c, 0x24, 0x14, 0x5f, 0x0c, 0xdd, 0xe4, 0x98, 0x4b, 0x3c, 0x7c, 0xc2, 0xc5, 0x83, 0xa0, 0xcb, + 0x8b, 0x2e, 0xe8, 0x92, 0x8a, 0xc5, 0x13, 0x98, 0xd4, 0x18, 0xea, 0x72, 0x93, 0xa3, 0x2e, 0xe2, + 0x94, 0xc1, 0x42, 0xb0, 0x4b, 0x2d, 0x04, 0xbb, 0x64, 0xa6, 0x4c, 0x33, 0x06, 0x77, 0x79, 0xd1, + 0xc5, 0x5d, 0x16, 0xa6, 0x7c, 0xf1, 0x18, 0xf0, 0xf2, 0x5a, 0x00, 0x78, 0xc9, 0x51, 0xd1, 0xf5, + 0x58, 0xd1, 0x08, 0xe4, 0xe5, 0x15, 0x0f, 0x79, 0x29, 0xc4, 0xa2, 0x36, 0x5c, 0x78, 0x1c, 0x7a, + 0x39, 0x98, 0x80, 0x5e, 0x8a, 0xb1, 0x55, 0x27, 0x53, 0x31, 0x05, 0x7b, 0x39, 0x98, 0xc0, 0x5e, + 0x4a, 0x53, 0x14, 0x4e, 0x01, 0x5f, 0x7e, 0x1a, 0x0d, 0xbe, 0xc4, 0xc3, 0x23, 0xfc, 0x33, 0x67, + 0x43, 0x5f, 0xd4, 0x18, 0xf4, 0x45, 0x8a, 0x45, 0x0a, 0x98, 0xfa, 0x99, 0xe1, 0x97, 0xe3, 0x08, + 0xf8, 0x85, 0x01, 0x25, 0xd7, 0x63, 0x95, 0xcf, 0x80, 0xbf, 0x1c, 0x47, 0xe0, 0x2f, 0x68, 0xaa, + 0xda, 0xa9, 0x00, 0xcc, 0xdd, 0x30, 0x00, 0xb3, 0x1c, 0x93, 0x31, 0xfb, 0xbb, 0x3d, 0x06, 0x81, + 0x39, 0x89, 0x43, 0x60, 0x18, 0x4a, 0xf2, 0x6c, 0xac, 0xc6, 0x39, 0x20, 0x98, 0x83, 0x09, 0x08, + 0xe6, 0xf2, 0x14, 0x4f, 0x9b, 0x82, 0xc1, 0x1c, 0x45, 0x60, 0x30, 0x2b, 0xb1, 0x98, 0x16, 0x53, + 0x39, 0x15, 0x84, 0x51, 0x63, 0x40, 0x98, 0x2b, 0x53, 0x1c, 0xec, 0x61, 0x50, 0x98, 0xb4, 0x94, + 0xd9, 0x15, 0xb3, 0x59, 0x29, 0xc7, 0xf0, 0x97, 0x5d, 0x31, 0x9b, 0x97, 0x0a, 0xf2, 0xd3, 0x24, + 0x67, 0x1c, 0x3b, 0x9d, 0x49, 0x75, 0x86, 0x2d, 0xcb, 0xb0, 0x38, 0x9e, 0xc2, 0x3a, 0xf2, 0x75, + 0x52, 0x95, 0xfb, 0x27, 0xf1, 0x05, 0x88, 0x0d, 0xad, 0x82, 0x03, 0xa7, 0xaf, 0xfc, 0x47, 0xc1, + 0x97, 0xa5, 0x98, 0x4d, 0xb0, 0xa2, 0xcf, 0xf1, 0x8a, 0x3e, 0x80, 0xe3, 0x24, 0xc3, 0x38, 0xce, + 0x1a, 0xe4, 0x49, 0x75, 0x3b, 0x06, 0xd1, 0x68, 0xa6, 0x07, 0xd1, 0xdc, 0x80, 0x25, 0x9a, 0xa2, + 0x30, 0xb4, 0x87, 0x87, 0x34, 0x91, 0x86, 0xb4, 0x45, 0xf2, 0x03, 0x5b, 0x53, 0x96, 0x11, 0x3c, + 0x07, 0xcb, 0x01, 0x5e, 0xaf, 0x6a, 0x66, 0x78, 0x85, 0xe4, 0x71, 0x57, 0x79, 0xf9, 0xfc, 0x67, + 0xc1, 0xb7, 0x90, 0x8f, 0xed, 0x44, 0xc1, 0x30, 0xc2, 0xf7, 0x04, 0xc3, 0x24, 0x1f, 0x1a, 0x86, + 0x09, 0xa2, 0x00, 0xa9, 0x30, 0x0a, 0xf0, 0x2f, 0xc1, 0x5f, 0x13, 0x0f, 0x54, 0x69, 0x19, 0x6d, + 0xcc, 0xeb, 0x72, 0xda, 0x26, 0x49, 0x60, 0xcf, 0xe8, 0xf0, 0xea, 0x9b, 0x34, 0x09, 0x97, 0x17, + 0x2e, 0x73, 0x3c, 0x1a, 0x7a, 0x25, 0x3d, 0x4b, 0xb5, 0x78, 0x49, 0x2f, 0x41, 0xea, 0x01, 0x66, + 0x97, 0x0a, 0x05, 0x85, 0x34, 0x09, 0x1f, 0x75, 0x3e, 0x9e, 0x32, 0xb1, 0x0e, 0x7a, 0x19, 0x72, + 0xf4, 0xc6, 0x48, 0x35, 0x4c, 0x9b, 0x5f, 0x24, 0x84, 0x92, 0x49, 0x76, 0x6d, 0xb4, 0x71, 0x48, + 0x78, 0x0e, 0x4c, 0x5b, 0xc9, 0x9a, 0xbc, 0x15, 0xc8, 0x56, 0x72, 0xa1, 0x1c, 0xef, 0x1a, 0xe4, + 0xc8, 0xd7, 0xdb, 0xa6, 0xd6, 0xc2, 0x65, 0xa0, 0x1f, 0xea, 0x13, 0xe4, 0x3f, 0x24, 0x61, 0x71, + 0x2c, 0x3c, 0x46, 0xce, 0xdd, 0x75, 0xc9, 0x64, 0x00, 0x64, 0x9a, 0xcd, 0x1e, 0xab, 0x00, 0x1d, + 0xcd, 0x56, 0x3f, 0xd0, 0x06, 0x0e, 0x6e, 0x73, 0xa3, 0x04, 0x28, 0xa8, 0x02, 0x59, 0xd2, 0x1b, + 0xda, 0xb8, 0xcd, 0xf1, 0x2e, 0xaf, 0x8f, 0x1a, 0x90, 0xc1, 0x67, 0x78, 0xe0, 0xd8, 0xe5, 0x05, + 0xba, 0xec, 0x2b, 0x93, 0x00, 0x04, 0xf9, 0x79, 0xbb, 0x4c, 0x16, 0xfb, 0x9b, 0x2f, 0xd7, 0x24, + 0xc6, 0xfd, 0xac, 0xd1, 0xd7, 0x1d, 0xdc, 0x37, 0x9d, 0x73, 0x85, 0xcb, 0x87, 0xad, 0x90, 0x1d, + 0xb3, 0x02, 0x45, 0x5e, 0x0b, 0x2e, 0xa0, 0x42, 0x6c, 0xaa, 0x1b, 0x96, 0xee, 0x9c, 0x2b, 0xc5, + 0x3e, 0xee, 0x9b, 0x86, 0xd1, 0x53, 0xd9, 0x1e, 0xaf, 0x42, 0x29, 0x9c, 0x0d, 0xa0, 0xc7, 0xa1, + 0x68, 0x61, 0x47, 0xd3, 0x07, 0x6a, 0x28, 0x53, 0x2c, 0x30, 0x22, 0xdb, 0x53, 0xbb, 0x62, 0x56, + 0x90, 0x92, 0xbb, 0x62, 0x36, 0x29, 0xa5, 0xe4, 0x43, 0x92, 0xd9, 0x46, 0x64, 0x03, 0xe8, 0x25, + 0xc8, 0xf9, 0x89, 0x84, 0x40, 0x67, 0x7b, 0x01, 0xb6, 0xe5, 0xf3, 0xca, 0x7f, 0x12, 0x7c, 0x95, + 0x61, 0xb4, 0xac, 0x0e, 0x19, 0x0b, 0xdb, 0xc3, 0x1e, 0xc3, 0xaf, 0x4a, 0x5b, 0xcf, 0xcd, 0x96, + 0x47, 0x10, 0xea, 0xb0, 0xe7, 0x28, 0x5c, 0x58, 0x7e, 0x07, 0x32, 0x8c, 0x82, 0xf2, 0xb0, 0x70, + 0xbc, 0x7f, 0x6f, 0xff, 0xe0, 0xad, 0x7d, 0x29, 0x81, 0x00, 0x32, 0xd5, 0x5a, 0xad, 0x7e, 0xd8, + 0x94, 0x04, 0x94, 0x83, 0x74, 0x75, 0xfb, 0x40, 0x69, 0x4a, 0x49, 0x42, 0x56, 0xea, 0xbb, 0xf5, + 0x5a, 0x53, 0x4a, 0xa1, 0x25, 0x28, 0xb2, 0xb6, 0x7a, 0xf7, 0x40, 0x79, 0xa3, 0xda, 0x94, 0xc4, + 0x00, 0xe9, 0xa8, 0xbe, 0x7f, 0xa7, 0xae, 0x48, 0x69, 0xf9, 0x05, 0x92, 0x4e, 0xc7, 0x64, 0x1e, + 0x3e, 0x14, 0x26, 0x04, 0xa0, 0x30, 0xf9, 0xd3, 0x24, 0x29, 0x23, 0xe3, 0xd2, 0x09, 0xb4, 0x3b, + 0x36, 0xf1, 0xad, 0x39, 0x72, 0x91, 0xb1, 0xd9, 0x93, 0xca, 0xd1, 0xc2, 0xa7, 0xd8, 0x69, 0x75, + 0x59, 0x7a, 0xc3, 0x4e, 0xa0, 0xa2, 0x52, 0xe4, 0x54, 0x2a, 0x64, 0x33, 0xb6, 0xf7, 0x70, 0xcb, + 0x51, 0x99, 0x13, 0xd9, 0xb4, 0x7c, 0xcb, 0x11, 0x36, 0x42, 0x3d, 0x62, 0x44, 0xf9, 0xdd, 0xb9, + 0x6c, 0x99, 0x83, 0xb4, 0x52, 0x6f, 0x2a, 0x6f, 0x4b, 0x29, 0x84, 0xa0, 0x44, 0x9b, 0xea, 0xd1, + 0x7e, 0xf5, 0xf0, 0xa8, 0x71, 0x40, 0x6c, 0xb9, 0x0c, 0x8b, 0xae, 0x2d, 0x5d, 0x62, 0x5a, 0x7e, + 0x06, 0xae, 0xc4, 0xe4, 0x42, 0x93, 0x45, 0xac, 0xfc, 0x3b, 0x21, 0xc8, 0x1d, 0xce, 0x67, 0x0e, + 0x20, 0x63, 0x3b, 0x9a, 0x33, 0xb4, 0xb9, 0x11, 0x5f, 0x9a, 0x35, 0x39, 0xda, 0x70, 0x1b, 0x47, + 0x54, 0x5c, 0xe1, 0x6a, 0xe4, 0x5b, 0x50, 0x0a, 0xff, 0x12, 0x6f, 0x03, 0xdf, 0x89, 0x92, 0xf2, + 0x6d, 0x40, 0x93, 0x39, 0x53, 0x44, 0x41, 0x2f, 0x44, 0x15, 0xf4, 0xbf, 0x17, 0xe0, 0xea, 0x05, + 0xf9, 0x11, 0x7a, 0x73, 0x6c, 0x92, 0xaf, 0xcc, 0x93, 0x5d, 0x6d, 0x30, 0xda, 0xd8, 0x34, 0x6f, + 0x42, 0x21, 0x48, 0x9f, 0x6d, 0x92, 0xdf, 0x24, 0xfd, 0x4d, 0x1c, 0x46, 0x1e, 0xfc, 0x23, 0x50, + 0xf8, 0x8e, 0x47, 0xe0, 0xab, 0x00, 0xce, 0x48, 0x65, 0x6e, 0x1d, 0x59, 0x0e, 0x73, 0x44, 0x17, + 0xb7, 0x9a, 0x23, 0xbe, 0x09, 0x72, 0x0e, 0x6f, 0xd9, 0xe8, 0x28, 0x08, 0xc3, 0x0c, 0x69, 0x8c, + 0xb5, 0x39, 0x44, 0x31, 0x6b, 0x30, 0xf6, 0xe1, 0x1a, 0x46, 0xb6, 0xd1, 0xdb, 0x70, 0x65, 0x2c, + 0x51, 0xf0, 0x54, 0x8b, 0xb3, 0xe6, 0x0b, 0x97, 0xc3, 0xf9, 0x82, 0xab, 0x3a, 0x18, 0xed, 0xd3, + 0xe1, 0x68, 0xff, 0x12, 0xac, 0x44, 0xe7, 0xa0, 0xe8, 0x51, 0x00, 0x3c, 0x20, 0x61, 0xa1, 0xad, + 0x7a, 0x57, 0x1d, 0x39, 0x4e, 0x69, 0x8e, 0xe4, 0x63, 0x10, 0x29, 0xdb, 0x55, 0xc8, 0xf1, 0x84, + 0x54, 0x6f, 0xf3, 0x24, 0x2d, 0xcb, 0x08, 0x3b, 0x6d, 0x12, 0x69, 0xbc, 0x77, 0x17, 0x1c, 0x41, + 0xf4, 0x09, 0x5e, 0x1c, 0x4d, 0xf9, 0xa9, 0x9d, 0x7c, 0xe0, 0x1f, 0x66, 0x93, 0xa9, 0x2b, 0x7a, + 0x01, 0xd2, 0x2c, 0xed, 0x65, 0xeb, 0x7f, 0x79, 0xd2, 0xd8, 0x86, 0x67, 0x61, 0xc6, 0x29, 0xbf, + 0x0d, 0xe0, 0xe3, 0x4d, 0xe4, 0x08, 0xb5, 0x8c, 0xe1, 0x80, 0x7d, 0x69, 0x5a, 0x61, 0x1d, 0x74, + 0xcb, 0x55, 0x9b, 0x8c, 0x89, 0x35, 0x44, 0x6d, 0x00, 0xaf, 0xe2, 0xaa, 0x75, 0x40, 0x93, 0x98, + 0x7f, 0xcc, 0x10, 0xaf, 0x85, 0x87, 0x78, 0x2c, 0xf6, 0xf6, 0x20, 0x7a, 0xa8, 0x0f, 0x21, 0x4d, + 0x5d, 0x9b, 0xd8, 0x8c, 0x5e, 0x34, 0xf1, 0x74, 0x98, 0xb4, 0xd1, 0xcf, 0x00, 0x34, 0xc7, 0xb1, + 0xf4, 0x93, 0xa1, 0x3f, 0xc0, 0x5a, 0xf4, 0xd6, 0xa8, 0xba, 0x7c, 0xdb, 0xd7, 0xf8, 0x1e, 0xb9, + 0xe4, 0x8b, 0x06, 0xf6, 0x49, 0x40, 0xa1, 0xbc, 0x0f, 0xa5, 0xb0, 0xac, 0x9b, 0xc0, 0xb1, 0x6f, + 0x08, 0x27, 0x70, 0x2c, 0x1f, 0xe7, 0x09, 0x9c, 0x97, 0xfe, 0xa5, 0xd8, 0x6d, 0x1a, 0xed, 0xc8, + 0x3f, 0x4f, 0x42, 0x21, 0xb8, 0xb3, 0xfe, 0xf7, 0x72, 0x2c, 0xf9, 0x57, 0x02, 0x64, 0xbd, 0xe9, + 0x87, 0xaf, 0xd6, 0x42, 0x77, 0x91, 0xcc, 0x7a, 0xc9, 0xe0, 0x7d, 0x18, 0xbb, 0x79, 0x4c, 0x79, + 0x37, 0x8f, 0xb7, 0xbd, 0xf8, 0x1e, 0x87, 0x53, 0x05, 0x6d, 0xcd, 0xbd, 0xca, 0x4d, 0x67, 0x6e, + 0x43, 0xce, 0x3b, 0x9e, 0x48, 0x55, 0x15, 0x86, 0x11, 0xdd, 0x2e, 0xbd, 0x15, 0x35, 0x3e, 0xe0, + 0x97, 0x6d, 0x29, 0x85, 0x75, 0xe4, 0x36, 0x2c, 0x8e, 0x9d, 0x6d, 0xe8, 0x36, 0x2c, 0x98, 0xc3, + 0x13, 0xd5, 0x75, 0x8e, 0x31, 0xc4, 0xd6, 0xcd, 0xd7, 0x87, 0x27, 0x3d, 0xbd, 0x75, 0x0f, 0x9f, + 0xbb, 0x1f, 0x63, 0x0e, 0x4f, 0xee, 0x31, 0x1f, 0x62, 0xa3, 0x24, 0x83, 0xa3, 0xfc, 0x46, 0x80, + 0xac, 0xbb, 0x27, 0xd0, 0x0f, 0x21, 0xe7, 0x9d, 0x9b, 0xde, 0x6d, 0x79, 0xec, 0x81, 0xcb, 0xf5, + 0xfb, 0x22, 0xa8, 0xea, 0x5e, 0xf3, 0xeb, 0x6d, 0xf5, 0xb4, 0xa7, 0x31, 0x5f, 0x2a, 0x85, 0x6d, + 0xc6, 0x4e, 0x56, 0x1a, 0x70, 0x76, 0xee, 0xdc, 0xed, 0x69, 0x1d, 0x25, 0x4f, 0x65, 0x76, 0xda, + 0xa4, 0xc3, 0x53, 0xd7, 0x6f, 0x05, 0x90, 0xc6, 0x77, 0xec, 0x77, 0xfe, 0xba, 0xc9, 0x38, 0x9e, + 0x8a, 0x88, 0xe3, 0x68, 0x13, 0x96, 0x3d, 0x0e, 0xd5, 0xd6, 0x3b, 0x03, 0xcd, 0x19, 0x5a, 0x98, + 0x63, 0xdc, 0xc8, 0xfb, 0xe9, 0xc8, 0xfd, 0x65, 0x72, 0xd6, 0xe9, 0x87, 0x9c, 0xf5, 0x47, 0x49, + 0xc8, 0x07, 0x10, 0x77, 0xf4, 0x83, 0xc0, 0x61, 0x54, 0x8a, 0x08, 0x7d, 0x01, 0x5e, 0xff, 0xe6, + 0x3b, 0x6c, 0xa6, 0xe4, 0xfc, 0x66, 0x8a, 0xbb, 0xd7, 0x70, 0x01, 0x7c, 0x71, 0x6e, 0x00, 0xff, + 0x59, 0x40, 0x8e, 0xe1, 0x68, 0x3d, 0xf5, 0xcc, 0x70, 0xf4, 0x41, 0x47, 0x65, 0x6e, 0xc8, 0x8e, + 0x0e, 0x89, 0xfe, 0x72, 0x9f, 0xfe, 0x70, 0x48, 0x3d, 0xf2, 0x17, 0x02, 0x64, 0xbd, 0xba, 0x62, + 0xde, 0x7b, 0xf1, 0x15, 0xc8, 0xf0, 0xd4, 0x99, 0x5d, 0x8c, 0xf3, 0x5e, 0xe4, 0x4d, 0x45, 0x05, + 0xb2, 0x7d, 0xec, 0x68, 0xf4, 0x1c, 0x64, 0x61, 0xdb, 0xeb, 0xdf, 0x78, 0x05, 0xf2, 0x81, 0x37, + 0x05, 0xe4, 0x68, 0xdc, 0xaf, 0xbf, 0x25, 0x25, 0x2a, 0x0b, 0x1f, 0x7f, 0xb6, 0x9e, 0xda, 0xc7, + 0x1f, 0x90, 0xdd, 0xac, 0xd4, 0x6b, 0x8d, 0x7a, 0xed, 0x9e, 0x24, 0x54, 0xf2, 0x1f, 0x7f, 0xb6, + 0xbe, 0xa0, 0x60, 0x0a, 0xf4, 0xde, 0xb8, 0x07, 0x8b, 0x63, 0x0b, 0x13, 0xce, 0xcb, 0x10, 0x94, + 0xee, 0x1c, 0x1f, 0xee, 0xed, 0xd4, 0xaa, 0xcd, 0xba, 0x7a, 0xff, 0xa0, 0x59, 0x97, 0x04, 0x74, + 0x05, 0x96, 0xf7, 0x76, 0x5e, 0x6f, 0x34, 0xd5, 0xda, 0xde, 0x4e, 0x7d, 0xbf, 0xa9, 0x56, 0x9b, + 0xcd, 0x6a, 0xed, 0x9e, 0x94, 0xdc, 0xfa, 0x67, 0x01, 0xc4, 0xea, 0x76, 0x6d, 0x07, 0xd5, 0x40, + 0xa4, 0x58, 0xcf, 0x85, 0x0f, 0x21, 0x2b, 0x17, 0x43, 0xf6, 0xe8, 0x2e, 0xa4, 0x29, 0x0c, 0x84, + 0x2e, 0x7e, 0x19, 0x59, 0x99, 0x82, 0xe1, 0x93, 0x8f, 0xa1, 0x3b, 0xf2, 0xc2, 0xa7, 0x92, 0x95, + 0x8b, 0x21, 0x7d, 0xb4, 0x07, 0x0b, 0x2e, 0x0a, 0x30, 0xed, 0xfd, 0x62, 0x65, 0x2a, 0xce, 0x4e, + 0xa6, 0xc6, 0xd0, 0x94, 0x8b, 0x5f, 0x51, 0x56, 0xa6, 0x80, 0xfd, 0x68, 0x07, 0x32, 0xbc, 0xde, + 0x9e, 0xf2, 0x30, 0xb2, 0x32, 0x0d, 0xbe, 0x47, 0x0a, 0xe4, 0x7c, 0x9c, 0x6a, 0xfa, 0xdb, 0xd0, + 0xca, 0x0c, 0xf7, 0x18, 0xe8, 0x1d, 0x28, 0x86, 0x6b, 0xf9, 0xd9, 0x1e, 0x5f, 0x56, 0x66, 0xbc, + 0x28, 0x20, 0xfa, 0xc3, 0x85, 0xfd, 0x6c, 0x8f, 0x31, 0x2b, 0x33, 0xde, 0x1b, 0xa0, 0xf7, 0x60, + 0x69, 0xb2, 0xf0, 0x9e, 0xfd, 0x6d, 0x66, 0x65, 0x8e, 0x9b, 0x04, 0xd4, 0x07, 0x14, 0x51, 0xb0, + 0xcf, 0xf1, 0x54, 0xb3, 0x32, 0xcf, 0xc5, 0x02, 0x6a, 0xc3, 0xe2, 0x78, 0x15, 0x3c, 0xeb, 0xd3, + 0xcd, 0xca, 0xcc, 0x97, 0x0c, 0x6c, 0x94, 0x70, 0xf5, 0x3c, 0xeb, 0x53, 0xce, 0xca, 0xcc, 0x77, + 0x0e, 0xe8, 0x18, 0x20, 0x50, 0x00, 0xcf, 0xf0, 0xb4, 0xb3, 0x32, 0xcb, 0xed, 0x03, 0x32, 0x61, + 0x39, 0xaa, 0x32, 0x9e, 0xe7, 0xa5, 0x67, 0x65, 0xae, 0x4b, 0x09, 0xe2, 0xcf, 0xe1, 0x1a, 0x77, + 0xb6, 0x97, 0x9f, 0x95, 0x19, 0x6f, 0x27, 0x90, 0x06, 0xa5, 0xb1, 0xba, 0x6e, 0xc6, 0x87, 0xa0, + 0x95, 0x59, 0x2f, 0x2b, 0x88, 0x1b, 0x47, 0x94, 0x6a, 0x73, 0xbc, 0x0b, 0xad, 0xcc, 0x73, 0x7d, + 0xb1, 0x5d, 0xfd, 0xfc, 0xab, 0x55, 0xe1, 0x8b, 0xaf, 0x56, 0x85, 0x7f, 0x7c, 0xb5, 0x2a, 0x7c, + 0xf2, 0xf5, 0x6a, 0xe2, 0x8b, 0xaf, 0x57, 0x13, 0x7f, 0xfb, 0x7a, 0x35, 0xf1, 0xe3, 0xa7, 0x3a, + 0xba, 0xd3, 0x1d, 0x9e, 0x6c, 0xb4, 0x8c, 0xfe, 0x66, 0xcb, 0xe8, 0x63, 0xe7, 0xe4, 0xd4, 0xf1, + 0x1b, 0xfe, 0x3f, 0x16, 0x4e, 0x32, 0x34, 0x27, 0xb8, 0xf9, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xce, 0xf1, 0xaf, 0xd9, 0xd1, 0x30, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4034,6 +4211,7 @@ type ABCIClient interface { VerifyVoteExtension(ctx context.Context, in *RequestVerifyVoteExtension, opts ...grpc.CallOption) (*ResponseVerifyVoteExtension, error) FinalizeBlock(ctx context.Context, in *RequestFinalizeBlock, opts ...grpc.CallOption) (*ResponseFinalizeBlock, error) SignGossipVote(ctx context.Context, in *RequestSignGossipVote, opts ...grpc.CallOption) (*ResponseSignGossipVote, error) + PrepareOracleVotes(ctx context.Context, in *RequestPrepareOracleVotes, opts ...grpc.CallOption) (*ResponsePrepareOracleVotes, error) } type aBCIClient struct { @@ -4197,6 +4375,15 @@ func (c *aBCIClient) SignGossipVote(ctx context.Context, in *RequestSignGossipVo return out, nil } +func (c *aBCIClient) PrepareOracleVotes(ctx context.Context, in *RequestPrepareOracleVotes, opts ...grpc.CallOption) (*ResponsePrepareOracleVotes, error) { + out := new(ResponsePrepareOracleVotes) + err := c.cc.Invoke(ctx, "/tendermint.abci.ABCI/PrepareOracleVotes", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ABCIServer is the server API for ABCI service. type ABCIServer interface { Echo(context.Context, *RequestEcho) (*ResponseEcho, error) @@ -4216,6 +4403,7 @@ type ABCIServer interface { VerifyVoteExtension(context.Context, *RequestVerifyVoteExtension) (*ResponseVerifyVoteExtension, error) FinalizeBlock(context.Context, *RequestFinalizeBlock) (*ResponseFinalizeBlock, error) SignGossipVote(context.Context, *RequestSignGossipVote) (*ResponseSignGossipVote, error) + PrepareOracleVotes(context.Context, *RequestPrepareOracleVotes) (*ResponsePrepareOracleVotes, error) } // UnimplementedABCIServer can be embedded to have forward compatible implementations. @@ -4273,6 +4461,9 @@ func (*UnimplementedABCIServer) FinalizeBlock(ctx context.Context, req *RequestF func (*UnimplementedABCIServer) SignGossipVote(ctx context.Context, req *RequestSignGossipVote) (*ResponseSignGossipVote, error) { return nil, status.Errorf(codes.Unimplemented, "method SignGossipVote not implemented") } +func (*UnimplementedABCIServer) PrepareOracleVotes(ctx context.Context, req *RequestPrepareOracleVotes) (*ResponsePrepareOracleVotes, error) { + return nil, status.Errorf(codes.Unimplemented, "method PrepareOracleVotes not implemented") +} func RegisterABCIServer(s grpc1.Server, srv ABCIServer) { s.RegisterService(&_ABCI_serviceDesc, srv) @@ -4584,6 +4775,24 @@ func _ABCI_SignGossipVote_Handler(srv interface{}, ctx context.Context, dec func return interceptor(ctx, in, info, handler) } +func _ABCI_PrepareOracleVotes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestPrepareOracleVotes) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ABCIServer).PrepareOracleVotes(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tendermint.abci.ABCI/PrepareOracleVotes", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ABCIServer).PrepareOracleVotes(ctx, req.(*RequestPrepareOracleVotes)) + } + return interceptor(ctx, in, info, handler) +} + var _ABCI_serviceDesc = grpc.ServiceDesc{ ServiceName: "tendermint.abci.ABCI", HandlerType: (*ABCIServer)(nil), @@ -4656,6 +4865,10 @@ var _ABCI_serviceDesc = grpc.ServiceDesc{ MethodName: "SignGossipVote", Handler: _ABCI_SignGossipVote_Handler, }, + { + MethodName: "PrepareOracleVotes", + Handler: _ABCI_PrepareOracleVotes_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "tendermint/abci/types.proto", @@ -5062,6 +5275,29 @@ func (m *Request_SignGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) } return len(dAtA) - i, nil } +func (m *Request_PrepareOracleVotes) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Request_PrepareOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.PrepareOracleVotes != nil { + { + size, err := m.PrepareOracleVotes.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xb2 + } + return len(dAtA) - i, nil +} func (m *RequestEcho) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -5227,12 +5463,12 @@ func (m *RequestInitChain) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x12 } - n19, err19 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err19 != nil { - return 0, err19 + n20, err20 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err20 != nil { + return 0, err20 } - i -= n19 - i = encodeVarintTypes(dAtA, i, uint64(n19)) + i -= n20 + i = encodeVarintTypes(dAtA, i, uint64(n20)) i-- dAtA[i] = 0xa return len(dAtA) - i, nil @@ -5527,12 +5763,12 @@ func (m *RequestPrepareProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x3a } - n21, err21 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err21 != nil { - return 0, err21 + n22, err22 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err22 != nil { + return 0, err22 } - i -= n21 - i = encodeVarintTypes(dAtA, i, uint64(n21)) + i -= n22 + i = encodeVarintTypes(dAtA, i, uint64(n22)) i-- dAtA[i] = 0x32 if m.Height != 0 { @@ -5615,12 +5851,12 @@ func (m *RequestProcessProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x3a } - n23, err23 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err23 != nil { - return 0, err23 + n24, err24 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err24 != nil { + return 0, err24 } - i -= n23 - i = encodeVarintTypes(dAtA, i, uint64(n23)) + i -= n24 + i = encodeVarintTypes(dAtA, i, uint64(n24)) i-- dAtA[i] = 0x32 if m.Height != 0 { @@ -5738,12 +5974,12 @@ func (m *RequestExtendVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x22 } } - n26, err26 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err26 != nil { - return 0, err26 + n27, err27 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err27 != nil { + return 0, err27 } - i -= n26 - i = encodeVarintTypes(dAtA, i, uint64(n26)) + i -= n27 + i = encodeVarintTypes(dAtA, i, uint64(n27)) i-- dAtA[i] = 0x1a if m.Height != 0 { @@ -5844,12 +6080,12 @@ func (m *RequestFinalizeBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x3a } - n27, err27 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err27 != nil { - return 0, err27 + n28, err28 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err28 != nil { + return 0, err28 } - i -= n27 - i = encodeVarintTypes(dAtA, i, uint64(n27)) + i -= n28 + i = encodeVarintTypes(dAtA, i, uint64(n28)) i-- dAtA[i] = 0x32 if m.Height != 0 { @@ -5949,6 +6185,29 @@ func (m *RequestSignGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *RequestPrepareOracleVotes) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RequestPrepareOracleVotes) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RequestPrepareOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + func (m *Response) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -6373,6 +6632,29 @@ func (m *Response_SignGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) } return len(dAtA) - i, nil } +func (m *Response_PrepareOracleVotes) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Response_PrepareOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.PrepareOracleVotes != nil { + { + size, err := m.PrepareOracleVotes.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xba + } + return len(dAtA) - i, nil +} func (m *ResponseException) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -6884,20 +7166,20 @@ func (m *ResponseApplySnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, err } } if len(m.RefetchChunks) > 0 { - dAtA50 := make([]byte, len(m.RefetchChunks)*10) - var j49 int + dAtA52 := make([]byte, len(m.RefetchChunks)*10) + var j51 int for _, num := range m.RefetchChunks { for num >= 1<<7 { - dAtA50[j49] = uint8(uint64(num)&0x7f | 0x80) + dAtA52[j51] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j49++ + j51++ } - dAtA50[j49] = uint8(num) - j49++ + dAtA52[j51] = uint8(num) + j51++ } - i -= j49 - copy(dAtA[i:], dAtA50[:j49]) - i = encodeVarintTypes(dAtA, i, uint64(j49)) + i -= j51 + copy(dAtA[i:], dAtA52[:j51]) + i = encodeVarintTypes(dAtA, i, uint64(j51)) i-- dAtA[i] = 0x12 } @@ -7141,7 +7423,7 @@ func (m *ResponseSignGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func (m *CommitInfo) Marshal() (dAtA []byte, err error) { +func (m *Vote) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -7151,23 +7433,102 @@ func (m *CommitInfo) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *CommitInfo) MarshalTo(dAtA []byte) (int, error) { +func (m *Vote) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *CommitInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Vote) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.Votes) > 0 { - for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Votes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0x1a + } + if m.Timestamp != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Timestamp)) + i-- + dAtA[i] = 0x10 + } + if len(m.OracleId) > 0 { + i -= len(m.OracleId) + copy(dAtA[i:], m.OracleId) + i = encodeVarintTypes(dAtA, i, uint64(len(m.OracleId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ResponsePrepareOracleVotes) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResponsePrepareOracleVotes) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResponsePrepareOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Votes) > 0 { + for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Votes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *CommitInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CommitInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CommitInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Votes) > 0 { + for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Votes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } i -= size i = encodeVarintTypes(dAtA, i, uint64(size)) } @@ -7634,12 +7995,12 @@ func (m *Misbehavior) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x28 } - n56, err56 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err56 != nil { - return 0, err56 + n58, err58 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err58 != nil { + return 0, err58 } - i -= n56 - i = encodeVarintTypes(dAtA, i, uint64(n56)) + i -= n58 + i = encodeVarintTypes(dAtA, i, uint64(n58)) i-- dAtA[i] = 0x22 if m.Height != 0 { @@ -7944,6 +8305,18 @@ func (m *Request_SignGossipVote) Size() (n int) { } return n } +func (m *Request_PrepareOracleVotes) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PrepareOracleVotes != nil { + l = m.PrepareOracleVotes.Size() + n += 2 + l + sovTypes(uint64(l)) + } + return n +} func (m *RequestEcho) Size() (n int) { if m == nil { return 0 @@ -8338,6 +8711,15 @@ func (m *RequestSignGossipVote) Size() (n int) { return n } +func (m *RequestPrepareOracleVotes) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + func (m *Response) Size() (n int) { if m == nil { return 0 @@ -8566,6 +8948,18 @@ func (m *Response_SignGossipVote) Size() (n int) { } return n } +func (m *Response_PrepareOracleVotes) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PrepareOracleVotes != nil { + l = m.PrepareOracleVotes.Size() + n += 2 + l + sovTypes(uint64(l)) + } + return n +} func (m *ResponseException) Size() (n int) { if m == nil { return 0 @@ -8910,6 +9304,41 @@ func (m *ResponseSignGossipVote) Size() (n int) { return n } +func (m *Vote) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.OracleId) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.Timestamp != 0 { + n += 1 + sovTypes(uint64(m.Timestamp)) + } + l = len(m.Data) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *ResponsePrepareOracleVotes) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Votes) > 0 { + for _, e := range m.Votes { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + return n +} + func (m *CommitInfo) Size() (n int) { if m == nil { return 0 @@ -9790,6 +10219,41 @@ func (m *Request) Unmarshal(dAtA []byte) error { } m.Value = &Request_SignGossipVote{v} iNdEx = postIndex + case 22: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PrepareOracleVotes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RequestPrepareOracleVotes{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Request_PrepareOracleVotes{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -12558,6 +13022,56 @@ func (m *RequestSignGossipVote) Unmarshal(dAtA []byte) error { } return nil } +func (m *RequestPrepareOracleVotes) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestPrepareOracleVotes: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestPrepareOracleVotes: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Response) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -13217,6 +13731,41 @@ func (m *Response) Unmarshal(dAtA []byte) error { } m.Value = &Response_SignGossipVote{v} iNdEx = postIndex + case 23: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PrepareOracleVotes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &ResponsePrepareOracleVotes{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Response_PrepareOracleVotes{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -15463,6 +16012,223 @@ func (m *ResponseSignGossipVote) Unmarshal(dAtA []byte) error { } return nil } +func (m *Vote) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Vote: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Vote: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OracleId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.OracleId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) + } + m.Timestamp = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Timestamp |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResponsePrepareOracleVotes) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResponsePrepareOracleVotes: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResponsePrepareOracleVotes: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Votes = append(m.Votes, Vote{}) + if err := m.Votes[len(m.Votes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *CommitInfo) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto index 7af07b27e10..59f6ceb6965 100644 --- a/proto/tendermint/abci/types.proto +++ b/proto/tendermint/abci/types.proto @@ -229,7 +229,7 @@ message Response { ResponseVerifyVoteExtension verify_vote_extension = 20; ResponseFinalizeBlock finalize_block = 21; ResponseSignGossipVote sign_gossip_vote = 22; - ResponsePrepareOracleVotes prepare_oracle_votes = 22; + ResponsePrepareOracleVotes prepare_oracle_votes = 23; } reserved 5, 8, 10, 11; // SetOption, BeginBlock, DeliverTx, EndBlock } diff --git a/proxy/app_conn.go b/proxy/app_conn.go index fefa235afe4..4b94a1b8f46 100644 --- a/proxy/app_conn.go +++ b/proxy/app_conn.go @@ -25,6 +25,7 @@ type AppConnConsensus interface { FinalizeBlock(context.Context, *types.RequestFinalizeBlock) (*types.ResponseFinalizeBlock, error) Commit(context.Context) (*types.ResponseCommit, error) SignGossipVote(context.Context, *types.RequestSignGossipVote) (*types.ResponseSignGossipVote, error) + PrepareOracleVotes(context.Context, *types.RequestPrepareOracleVotes) (*types.ResponsePrepareOracleVotes, error) } type AppConnMempool interface { @@ -115,6 +116,11 @@ func (app *appConnConsensus) SignGossipVote(ctx context.Context, req *types.Requ return app.appConn.SignGossipVote(ctx, req) } +func (app *appConnConsensus) PrepareOracleVotes(ctx context.Context, req *types.RequestPrepareOracleVotes) (*types.ResponsePrepareOracleVotes, error) { + defer addTimeSample(app.metrics.MethodTimingSeconds.With("method", "commit", "type", "sync"))() + return app.appConn.PrepareOracleVotes(ctx, req) +} + //------------------------------------------------ // Implements AppConnMempool (subset of abcicli.Client) diff --git a/proxy/mocks/app_conn_consensus.go b/proxy/mocks/app_conn_consensus.go index 85ab06717f3..006412f74b4 100644 --- a/proxy/mocks/app_conn_consensus.go +++ b/proxy/mocks/app_conn_consensus.go @@ -133,6 +133,32 @@ func (_m *AppConnConsensus) InitChain(_a0 context.Context, _a1 *types.RequestIni return r0, r1 } +// PrepareOracleVotes provides a mock function with given fields: _a0, _a1 +func (_m *AppConnConsensus) PrepareOracleVotes(_a0 context.Context, _a1 *types.RequestPrepareOracleVotes) (*types.ResponsePrepareOracleVotes, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponsePrepareOracleVotes + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestPrepareOracleVotes) (*types.ResponsePrepareOracleVotes, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestPrepareOracleVotes) *types.ResponsePrepareOracleVotes); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponsePrepareOracleVotes) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestPrepareOracleVotes) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // PrepareProposal provides a mock function with given fields: _a0, _a1 func (_m *AppConnConsensus) PrepareProposal(_a0 context.Context, _a1 *types.RequestPrepareProposal) (*types.ResponsePrepareProposal, error) { ret := _m.Called(_a0, _a1) From 617f655ac780f10792321e3ee2b69bf9fdc62e07 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 16 Apr 2024 19:16:59 +0800 Subject: [PATCH 043/150] add prepareOracleVotes impl --- node/node.go | 2 +- oracle/reactor.go | 4 +++- oracle/service/runner/runner.go | 18 +++++++++--------- oracle/service/types/info.go | 2 ++ 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/node/node.go b/node/node.go index 1658f792815..7d9c548dae6 100644 --- a/node/node.go +++ b/node/node.go @@ -379,7 +379,7 @@ func NewNodeWithContext(ctx context.Context, } // Make OracleReactor - oracleReactor := oracle.NewReactor(config.Oracle, pubKey, privValidator) + oracleReactor := oracle.NewReactor(config.Oracle, pubKey, privValidator, proxyApp.Consensus()) oracleInfo := oracleReactor.OracleInfo // make block executor for consensus and blocksync reactors to execute blocks diff --git a/oracle/reactor.go b/oracle/reactor.go index 4a3f42e0826..67239c48b16 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -8,6 +8,7 @@ import ( "github.com/cometbft/cometbft/config" "github.com/cometbft/cometbft/crypto/ed25519" "github.com/cometbft/cometbft/crypto/sr25519" + "github.com/cometbft/cometbft/proxy" "github.com/sirupsen/logrus" // cfg "github.com/cometbft/cometbft/config" @@ -48,7 +49,7 @@ type Reactor struct { } // NewReactor returns a new Reactor with the given config and mempool. -func NewReactor(config *config.OracleConfig, pubKey crypto.PubKey, privValidator types.PrivValidator) *Reactor { +func NewReactor(config *config.OracleConfig, pubKey crypto.PubKey, privValidator types.PrivValidator, proxyApp proxy.AppConnConsensus) *Reactor { gossipVoteBuffer := &oracletypes.GossipVoteBuffer{ Buffer: make(map[string]*oracleproto.GossipVote), } @@ -64,6 +65,7 @@ func NewReactor(config *config.OracleConfig, pubKey crypto.PubKey, privValidator SignVotesChan: make(chan *oracleproto.Vote), PubKey: pubKey, PrivValidator: privValidator, + ProxyApp: proxyApp, } oracleR := &Reactor{ diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 726d1ad1635..5689d8570d7 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -1,7 +1,8 @@ package runner import ( - "io/ioutil" + "context" + "io" "net/http" "time" @@ -12,6 +13,7 @@ import ( "github.com/cometbft/cometbft/oracle/service/types" + abcitypes "github.com/cometbft/cometbft/abci/types" oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" ) @@ -152,21 +154,19 @@ func Run(oracleInfo *types.OracleInfo) { log.Info("[oracle] Service started.") waitForGrpc(oracleInfo.Config.GrpcAddress) waitForRestAPI(oracleInfo.Config.RestApiAddress) - count := 0 RunProcessSignVoteQueue(oracleInfo) PruneUnsignedVoteBuffer(oracleInfo) PruneGossipVoteBuffer(oracleInfo) // start to take votes from app for { - if count == 0 { // on init, and every minute + res, err := oracleInfo.ProxyApp.PrepareOracleVotes(context.Background(), &abcitypes.RequestPrepareOracleVotes{}) + if err != nil { + log.Error(err) } - time.Sleep(100 * time.Millisecond) + log.Infof("RESULTS: %v", res.Votes) - count++ - if count > 600 { // 600 * 0.1s = 60s = every minute - count = 0 - } + time.Sleep(100 * time.Millisecond) } } @@ -240,7 +240,7 @@ func HTTPRequest(url string, timeout uint64) []byte { defer response.Body.Close() - body, readErr := ioutil.ReadAll(response.Body) + body, readErr := io.ReadAll(response.Body) if readErr != nil { return []byte{} diff --git a/oracle/service/types/info.go b/oracle/service/types/info.go index d2540a089e6..2a98b9b654c 100644 --- a/oracle/service/types/info.go +++ b/oracle/service/types/info.go @@ -5,6 +5,7 @@ import ( "github.com/cometbft/cometbft/crypto" cmtsync "github.com/cometbft/cometbft/libs/sync" oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" + "github.com/cometbft/cometbft/proxy" "github.com/cometbft/cometbft/types" ) @@ -17,6 +18,7 @@ type OracleInfo struct { PubKey crypto.PubKey PrivValidator types.PrivValidator StopChannel chan int + ProxyApp proxy.AppConnConsensus } type UnsignedVotes struct { From 5d9a887f48d98b564a81ba44488a2864740cc55f Mon Sep 17 00:00:00 2001 From: yan-soon Date: Wed, 17 Apr 2024 13:23:58 +0800 Subject: [PATCH 044/150] test new flow --- oracle/reactor.go | 2 +- oracle/service/runner/runner.go | 97 +++++++++++++++++---------------- oracle/service/types/info.go | 2 +- 3 files changed, 53 insertions(+), 48 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 67239c48b16..c93e0226de0 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -62,7 +62,7 @@ func NewReactor(config *config.OracleConfig, pubKey crypto.PubKey, privValidator Config: config, GossipVoteBuffer: gossipVoteBuffer, UnsignedVoteBuffer: unsignedVoteBuffer, - SignVotesChan: make(chan *oracleproto.Vote), + SignVotesChan: make(chan []*oracleproto.Vote), PubKey: pubKey, PrivValidator: privValidator, ProxyApp: proxyApp, diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 5689d8570d7..5b6cf3c5fcb 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -36,59 +36,50 @@ func RunProcessSignVoteQueue(oracleInfo *types.OracleInfo) { } func ProcessSignVoteQueue(oracleInfo *types.OracleInfo) { - votes := []*oracleproto.Vote{} - for { - select { - case vote := <-oracleInfo.SignVotesChan: - votes = append(votes, vote) - continue - default: + for votes := range oracleInfo.SignVotesChan { + if len(votes) == 0 { + return } - break - } - if len(votes) == 0 { - return - } - - // new batch of unsigned votes - newUnsignedVotes := &types.UnsignedVotes{ - Timestamp: uint64(time.Now().Unix()), - Votes: votes, - } + // new batch of unsigned votes + newUnsignedVotes := &types.UnsignedVotes{ + Timestamp: uint64(time.Now().Unix()), + Votes: votes, + } - // append new batch into unsignedVotesBuffer, need to mutex lock as it will clash with concurrent pruning - oracleInfo.UnsignedVoteBuffer.UpdateMtx.Lock() - oracleInfo.UnsignedVoteBuffer.Buffer = append(oracleInfo.UnsignedVoteBuffer.Buffer, newUnsignedVotes) - oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() + // append new batch into unsignedVotesBuffer, need to mutex lock as it will clash with concurrent pruning + oracleInfo.UnsignedVoteBuffer.UpdateMtx.Lock() + oracleInfo.UnsignedVoteBuffer.Buffer = append(oracleInfo.UnsignedVoteBuffer.Buffer, newUnsignedVotes) + oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() - // loop through unsignedVoteBuffer and combine all votes - var batchVotes = []*oracleproto.Vote{} - oracleInfo.UnsignedVoteBuffer.UpdateMtx.RLock() - for _, unsignedVotes := range oracleInfo.UnsignedVoteBuffer.Buffer { - batchVotes = append(batchVotes, unsignedVotes.Votes...) - } - oracleInfo.UnsignedVoteBuffer.UpdateMtx.RUnlock() + // loop through unsignedVoteBuffer and combine all votes + var batchVotes = []*oracleproto.Vote{} + oracleInfo.UnsignedVoteBuffer.UpdateMtx.RLock() + for _, unsignedVotes := range oracleInfo.UnsignedVoteBuffer.Buffer { + batchVotes = append(batchVotes, unsignedVotes.Votes...) + } + oracleInfo.UnsignedVoteBuffer.UpdateMtx.RUnlock() - // batch sign the entire unsignedVoteBuffer and add to gossipBuffer - newGossipVote := &oracleproto.GossipVote{ - PublicKey: oracleInfo.PubKey.Bytes(), - SignType: oracleInfo.PubKey.Type(), - Votes: batchVotes, - } + // batch sign the entire unsignedVoteBuffer and add to gossipBuffer + newGossipVote := &oracleproto.GossipVote{ + PublicKey: oracleInfo.PubKey.Bytes(), + SignType: oracleInfo.PubKey.Type(), + Votes: batchVotes, + } - // signing of vote should append the signature field and timestamp field of gossipVote - if err := oracleInfo.PrivValidator.SignOracleVote("", newGossipVote); err != nil { - log.Errorf("error signing oracle votes") - } + // signing of vote should append the signature field and timestamp field of gossipVote + if err := oracleInfo.PrivValidator.SignOracleVote("", newGossipVote); err != nil { + log.Errorf("error signing oracle votes") + } - // replace current gossipVoteBuffer with new one - address := oracleInfo.PubKey.Address().String() + // replace current gossipVoteBuffer with new one + address := oracleInfo.PubKey.Address().String() - // need to mutex lock as it will clash with concurrent gossip - oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() - oracleInfo.GossipVoteBuffer.Buffer[address] = newGossipVote - oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() + // need to mutex lock as it will clash with concurrent gossip + oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() + oracleInfo.GossipVoteBuffer.Buffer[address] = newGossipVote + oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() + } } func PruneGossipVoteBuffer(oracleInfo *types.OracleInfo) { @@ -164,9 +155,23 @@ func Run(oracleInfo *types.OracleInfo) { log.Error(err) } + votes := []*oracleproto.Vote{} + + for _, vote := range res.Votes { + newVote := oracleproto.Vote{ + Validator: oracleInfo.PubKey.Address(), + OracleId: vote.OracleId, + Data: vote.Data, + Timestamp: uint64(vote.Timestamp), + } + votes = append(votes, &newVote) + } + log.Infof("RESULTS: %v", res.Votes) - time.Sleep(100 * time.Millisecond) + oracleInfo.SignVotesChan <- votes + + time.Sleep(1000 * time.Millisecond) } } diff --git a/oracle/service/types/info.go b/oracle/service/types/info.go index 2a98b9b654c..768fa745cab 100644 --- a/oracle/service/types/info.go +++ b/oracle/service/types/info.go @@ -14,7 +14,7 @@ type OracleInfo struct { Config *config.OracleConfig UnsignedVoteBuffer *UnsignedVoteBuffer GossipVoteBuffer *GossipVoteBuffer - SignVotesChan chan *oracleproto.Vote + SignVotesChan chan []*oracleproto.Vote PubKey crypto.PubKey PrivValidator types.PrivValidator StopChannel chan int From 66e1120911576b41f38ae93a86e61196bf91949a Mon Sep 17 00:00:00 2001 From: yan-soon Date: Thu, 18 Apr 2024 15:09:45 +0800 Subject: [PATCH 045/150] impl inject oracleTx in prepareProposal and validate oracleTx in processProposal --- oracle/service/runner/runner.go | 1 + proto/tendermint/oracle/types.pb.go | 257 ++++++++++++++++++++++++---- proto/tendermint/oracle/types.proto | 4 + state/execution.go | 101 ++++++++++- 4 files changed, 318 insertions(+), 45 deletions(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 5b6cf3c5fcb..05c2393833a 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -62,6 +62,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo) { // batch sign the entire unsignedVoteBuffer and add to gossipBuffer newGossipVote := &oracleproto.GossipVote{ + Validator: oracleInfo.PubKey.Address(), PublicKey: oracleInfo.PubKey.Bytes(), SignType: oracleInfo.PubKey.Type(), Votes: batchVotes, diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index 50d30104adb..bfa6155b91c 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -419,54 +419,101 @@ func (m *Result) GetData() string { return "" } +type GossipVotes struct { + GossipVotes []*GossipVote `protobuf:"bytes,1,rep,name=GossipVotes,proto3" json:"GossipVotes,omitempty"` +} + +func (m *GossipVotes) Reset() { *m = GossipVotes{} } +func (m *GossipVotes) String() string { return proto.CompactTextString(m) } +func (*GossipVotes) ProtoMessage() {} +func (*GossipVotes) Descriptor() ([]byte, []int) { + return fileDescriptor_ed9227d272ed5d90, []int{5} +} +func (m *GossipVotes) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GossipVotes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GossipVotes.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *GossipVotes) XXX_Merge(src proto.Message) { + xxx_messageInfo_GossipVotes.Merge(m, src) +} +func (m *GossipVotes) XXX_Size() int { + return m.Size() +} +func (m *GossipVotes) XXX_DiscardUnknown() { + xxx_messageInfo_GossipVotes.DiscardUnknown(m) +} + +var xxx_messageInfo_GossipVotes proto.InternalMessageInfo + +func (m *GossipVotes) GetGossipVotes() []*GossipVote { + if m != nil { + return m.GossipVotes + } + return nil +} + func init() { proto.RegisterType((*Vote)(nil), "tendermint.oracle.Vote") proto.RegisterType((*GossipVote)(nil), "tendermint.oracle.GossipVote") proto.RegisterType((*CanonicalGossipVote)(nil), "tendermint.oracle.CanonicalGossipVote") proto.RegisterType((*Oracle)(nil), "tendermint.oracle.Oracle") proto.RegisterType((*Result)(nil), "tendermint.oracle.Result") + proto.RegisterType((*GossipVotes)(nil), "tendermint.oracle.GossipVotes") } func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 572 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x54, 0xbd, 0x6e, 0xd4, 0x4c, - 0x14, 0x8d, 0x37, 0x9b, 0x4d, 0x7c, 0x93, 0x6c, 0xbe, 0x6f, 0x88, 0x82, 0x05, 0x89, 0xb3, 0x18, - 0x24, 0x96, 0x82, 0x5d, 0x04, 0xa9, 0xe8, 0x08, 0x05, 0x42, 0x48, 0x80, 0x4c, 0x44, 0x41, 0x63, - 0xcd, 0xda, 0x17, 0x33, 0x62, 0xed, 0xb1, 0x66, 0xae, 0xa3, 0xf8, 0x25, 0x10, 0x4f, 0xc0, 0xf3, - 0x20, 0xaa, 0x94, 0x54, 0x11, 0x4a, 0xde, 0x20, 0x4f, 0x80, 0x3c, 0xb3, 0xb1, 0x2d, 0xd2, 0x50, - 0xd2, 0x5d, 0x9f, 0x73, 0xae, 0xef, 0xcf, 0xcc, 0x19, 0xd8, 0x23, 0xcc, 0x13, 0x54, 0x99, 0xc8, - 0x69, 0x2a, 0x15, 0x8f, 0xe7, 0x38, 0xa5, 0xaa, 0x40, 0x3d, 0x29, 0x94, 0x24, 0xc9, 0xfe, 0x6f, - 0xe9, 0x89, 0xa5, 0x6f, 0x6d, 0xa7, 0x32, 0x95, 0x86, 0x9d, 0xd6, 0x91, 0x15, 0x06, 0x1a, 0xfa, - 0xef, 0x25, 0x21, 0xdb, 0x05, 0xf7, 0x98, 0xcf, 0x45, 0xc2, 0x49, 0x2a, 0xcf, 0x19, 0x39, 0xe3, - 0x8d, 0xb0, 0x05, 0xd8, 0x6d, 0x70, 0xed, 0x5f, 0x22, 0x91, 0x78, 0xbd, 0x91, 0x33, 0x76, 0xc3, - 0x35, 0x0b, 0xbc, 0x4c, 0xea, 0x54, 0x12, 0x19, 0x6a, 0xe2, 0x59, 0xe1, 0x2d, 0x8f, 0x9c, 0x71, - 0x3f, 0x6c, 0x01, 0xc6, 0xa0, 0x9f, 0x70, 0xe2, 0x5e, 0xdf, 0x64, 0x99, 0x38, 0x38, 0x73, 0x00, - 0x5e, 0x48, 0xad, 0x45, 0xf1, 0x17, 0xb5, 0xf7, 0x00, 0x8a, 0x72, 0x36, 0x17, 0x71, 0xf4, 0x19, - 0x2b, 0x53, 0x7c, 0x23, 0x74, 0x2d, 0xf2, 0x0a, 0xab, 0xba, 0x35, 0x2d, 0xd2, 0x3c, 0xaa, 0xa7, - 0x37, 0xd5, 0xdd, 0x70, 0xad, 0x06, 0x8e, 0xaa, 0x02, 0xd9, 0x43, 0x58, 0x39, 0x96, 0x84, 0xda, - 0xeb, 0x8f, 0x96, 0xc7, 0xeb, 0x8f, 0x6f, 0x4e, 0xae, 0xad, 0x65, 0x52, 0x77, 0x10, 0x5a, 0x15, - 0x7b, 0x00, 0xff, 0xd5, 0xa9, 0x98, 0x44, 0xed, 0x40, 0x2b, 0x66, 0xa0, 0x2d, 0x8b, 0x1f, 0x35, - 0x63, 0xed, 0xda, 0xb2, 0x9c, 0x4a, 0x85, 0xde, 0xc0, 0x36, 0xd5, 0x00, 0xc1, 0x37, 0x07, 0x6e, - 0x3c, 0xe7, 0xb9, 0xcc, 0x45, 0xcc, 0xe7, 0xff, 0xe0, 0xa4, 0xc1, 0x8f, 0x1e, 0x0c, 0xde, 0x18, - 0x98, 0x79, 0xb0, 0x1a, 0x2b, 0x6c, 0x3a, 0x72, 0xc3, 0xab, 0x4f, 0x36, 0x84, 0x5e, 0x73, 0xdc, - 0x3d, 0x91, 0xb0, 0x11, 0xac, 0x27, 0xa8, 0x63, 0x25, 0x0a, 0x12, 0x32, 0x5f, 0xb4, 0xd0, 0x85, - 0xd8, 0x0e, 0x0c, 0x34, 0x71, 0x2a, 0xf5, 0xe2, 0xb8, 0x17, 0x5f, 0xec, 0x00, 0x76, 0x32, 0x91, - 0x47, 0x54, 0xaa, 0x5c, 0x96, 0x14, 0x15, 0xa8, 0x62, 0xcc, 0x89, 0xa7, 0x68, 0xd6, 0xeb, 0x86, - 0xdb, 0x99, 0xc8, 0x8f, 0x2c, 0xf9, 0xb6, 0xe1, 0xd8, 0x3d, 0x18, 0x66, 0xfc, 0x24, 0x52, 0xa8, - 0xcb, 0x39, 0x45, 0xb5, 0x7a, 0x60, 0xd4, 0x1b, 0x19, 0x3f, 0x09, 0x0d, 0xf8, 0x2c, 0x45, 0x76, - 0x17, 0x36, 0x35, 0xc6, 0xa5, 0x12, 0x54, 0xd9, 0xd5, 0xac, 0x5a, 0xd1, 0x15, 0x68, 0xd6, 0x73, - 0x1f, 0xb6, 0x16, 0xbf, 0xd1, 0xa4, 0x38, 0x61, 0x5a, 0x79, 0x6b, 0x46, 0x36, 0xb4, 0xf0, 0xbb, - 0x05, 0xca, 0x7c, 0x00, 0x85, 0x5a, 0xce, 0x4b, 0x33, 0xa2, 0x6b, 0x34, 0x1d, 0xa4, 0xbe, 0xce, - 0xba, 0xc0, 0xd8, 0x03, 0x7b, 0x9d, 0xeb, 0x38, 0xf8, 0xe2, 0xc0, 0xc0, 0xf6, 0xc3, 0xa6, 0x5d, - 0xa3, 0x98, 0x75, 0x1e, 0xb2, 0xcb, 0xb3, 0xfd, 0x61, 0x32, 0x7b, 0x1a, 0x34, 0x44, 0xd0, 0x31, - 0xcf, 0xa3, 0x3f, 0xcd, 0xb3, 0xdc, 0x26, 0x34, 0x44, 0xd0, 0x35, 0xd4, 0x9d, 0xae, 0xa1, 0x0e, - 0x37, 0x2f, 0xcf, 0xf6, 0xdd, 0x5a, 0x6c, 0x8c, 0x65, 0xfd, 0x75, 0xf8, 0xfa, 0xfb, 0xb9, 0xef, - 0x9c, 0x9e, 0xfb, 0xce, 0xaf, 0x73, 0xdf, 0xf9, 0x7a, 0xe1, 0x2f, 0x9d, 0x5e, 0xf8, 0x4b, 0x3f, - 0x2f, 0xfc, 0xa5, 0x0f, 0x07, 0xa9, 0xa0, 0x4f, 0xe5, 0x6c, 0x12, 0xcb, 0x6c, 0x1a, 0xcb, 0x0c, - 0x69, 0xf6, 0x91, 0xda, 0xc0, 0xbe, 0x0e, 0xd7, 0x5e, 0x96, 0xd9, 0xc0, 0x10, 0x4f, 0x7e, 0x07, - 0x00, 0x00, 0xff, 0xff, 0xe5, 0xd0, 0x69, 0x5d, 0x75, 0x04, 0x00, 0x00, + // 595 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x54, 0xbf, 0x6e, 0xd4, 0x4e, + 0x10, 0x8e, 0x2f, 0x97, 0x4b, 0x3c, 0x49, 0x2e, 0xbf, 0xdf, 0x12, 0x05, 0x0b, 0x12, 0xe7, 0x30, + 0x48, 0x1c, 0x05, 0x77, 0x08, 0x52, 0xd1, 0x20, 0x42, 0x81, 0x10, 0x52, 0x40, 0x26, 0xa2, 0xa0, + 0xb1, 0xf6, 0xec, 0xc1, 0xac, 0x38, 0x7b, 0xad, 0xdd, 0x71, 0x94, 0x7b, 0x09, 0xc4, 0x13, 0xf0, + 0x3c, 0x88, 0x2a, 0x25, 0x55, 0x84, 0x92, 0x37, 0xc8, 0x13, 0x20, 0xef, 0x5e, 0x6c, 0x43, 0x28, + 0x28, 0xe9, 0x66, 0xbf, 0xef, 0x9b, 0x9d, 0x3f, 0x3b, 0xb3, 0xb0, 0x43, 0x98, 0x27, 0xa8, 0x32, + 0x91, 0xd3, 0x58, 0x2a, 0x1e, 0x4f, 0x71, 0x4c, 0xb3, 0x02, 0xf5, 0xa8, 0x50, 0x92, 0x24, 0xfb, + 0xbf, 0xa1, 0x47, 0x96, 0xbe, 0xb1, 0x99, 0xca, 0x54, 0x1a, 0x76, 0x5c, 0x59, 0x56, 0x18, 0x68, + 0xe8, 0xbe, 0x95, 0x84, 0x6c, 0x1b, 0xdc, 0x23, 0x3e, 0x15, 0x09, 0x27, 0xa9, 0x3c, 0x67, 0xe0, + 0x0c, 0xd7, 0xc2, 0x06, 0x60, 0x37, 0xc1, 0xb5, 0xb7, 0x44, 0x22, 0xf1, 0x3a, 0x03, 0x67, 0xe8, + 0x86, 0x2b, 0x16, 0x78, 0x91, 0x54, 0xae, 0x24, 0x32, 0xd4, 0xc4, 0xb3, 0xc2, 0x5b, 0x1c, 0x38, + 0xc3, 0x6e, 0xd8, 0x00, 0x8c, 0x41, 0x37, 0xe1, 0xc4, 0xbd, 0xae, 0xf1, 0x32, 0x76, 0x70, 0xea, + 0x00, 0x3c, 0x97, 0x5a, 0x8b, 0xe2, 0x2f, 0x62, 0xef, 0x00, 0x14, 0xe5, 0x64, 0x2a, 0xe2, 0xe8, + 0x23, 0xce, 0x4c, 0xf0, 0xb5, 0xd0, 0xb5, 0xc8, 0x4b, 0x9c, 0x55, 0xa9, 0x69, 0x91, 0xe6, 0x51, + 0x55, 0xbd, 0x89, 0xee, 0x86, 0x2b, 0x15, 0x70, 0x38, 0x2b, 0x90, 0xdd, 0x87, 0xa5, 0x23, 0x49, + 0xa8, 0xbd, 0xee, 0x60, 0x71, 0xb8, 0xfa, 0xf0, 0xfa, 0xe8, 0x4a, 0x5b, 0x46, 0x55, 0x06, 0xa1, + 0x55, 0xb1, 0x7b, 0xf0, 0x5f, 0xe5, 0x8a, 0x49, 0xd4, 0x14, 0xb4, 0x64, 0x0a, 0xda, 0xb0, 0xf8, + 0x61, 0x5d, 0xd6, 0xb6, 0x0d, 0xcb, 0xa9, 0x54, 0xe8, 0xf5, 0x6c, 0x52, 0x35, 0x10, 0x7c, 0x71, + 0xe0, 0xda, 0x33, 0x9e, 0xcb, 0x5c, 0xc4, 0x7c, 0xfa, 0x0f, 0x56, 0x1a, 0x7c, 0xeb, 0x40, 0xef, + 0x95, 0x81, 0x99, 0x07, 0xcb, 0xb1, 0xc2, 0x3a, 0x23, 0x37, 0xbc, 0x3c, 0xb2, 0x3e, 0x74, 0xea, + 0xe7, 0xee, 0x88, 0x84, 0x0d, 0x60, 0x35, 0x41, 0x1d, 0x2b, 0x51, 0x90, 0x90, 0xf9, 0x3c, 0x85, + 0x36, 0xc4, 0xb6, 0xa0, 0xa7, 0x89, 0x53, 0xa9, 0xe7, 0xcf, 0x3d, 0x3f, 0xb1, 0x3d, 0xd8, 0xca, + 0x44, 0x1e, 0x51, 0xa9, 0x72, 0x59, 0x52, 0x54, 0xa0, 0x8a, 0x31, 0x27, 0x9e, 0xa2, 0x69, 0xaf, + 0x1b, 0x6e, 0x66, 0x22, 0x3f, 0xb4, 0xe4, 0xeb, 0x9a, 0x63, 0x77, 0xa0, 0x9f, 0xf1, 0xe3, 0x48, + 0xa1, 0x2e, 0xa7, 0x14, 0x55, 0xea, 0x9e, 0x51, 0xaf, 0x65, 0xfc, 0x38, 0x34, 0xe0, 0xd3, 0x14, + 0xd9, 0x6d, 0x58, 0xd7, 0x18, 0x97, 0x4a, 0xd0, 0xcc, 0xb6, 0x66, 0xd9, 0x8a, 0x2e, 0x41, 0xd3, + 0x9e, 0xbb, 0xb0, 0x31, 0xbf, 0x46, 0x93, 0xe2, 0x84, 0xe9, 0xcc, 0x5b, 0x31, 0xb2, 0xbe, 0x85, + 0xdf, 0xcc, 0x51, 0xe6, 0x03, 0x28, 0xd4, 0x72, 0x5a, 0x9a, 0x12, 0x5d, 0xa3, 0x69, 0x21, 0xd5, + 0x38, 0xeb, 0x02, 0x63, 0x0f, 0xec, 0x38, 0x57, 0x76, 0xf0, 0xc9, 0x81, 0x9e, 0xcd, 0x87, 0x8d, + 0xdb, 0x8b, 0x62, 0xda, 0xb9, 0xcf, 0x2e, 0x4e, 0x77, 0xfb, 0xc9, 0xe4, 0x71, 0x50, 0x13, 0x41, + 0x6b, 0x79, 0x1e, 0xfc, 0xbe, 0x3c, 0x8b, 0x8d, 0x43, 0x4d, 0x04, 0xed, 0x85, 0xba, 0xd5, 0x5e, + 0xa8, 0xfd, 0xf5, 0x8b, 0xd3, 0x5d, 0xb7, 0x12, 0x9b, 0xc5, 0x9a, 0xef, 0xd7, 0x01, 0xac, 0x36, + 0x43, 0xa7, 0xd9, 0x93, 0x5f, 0x8e, 0x9e, 0x63, 0x26, 0x64, 0xe7, 0x0f, 0x13, 0xd2, 0xa8, 0xc2, + 0xb6, 0xc7, 0xfe, 0xc1, 0xd7, 0x33, 0xdf, 0x39, 0x39, 0xf3, 0x9d, 0x1f, 0x67, 0xbe, 0xf3, 0xf9, + 0xdc, 0x5f, 0x38, 0x39, 0xf7, 0x17, 0xbe, 0x9f, 0xfb, 0x0b, 0xef, 0xf6, 0x52, 0x41, 0x1f, 0xca, + 0xc9, 0x28, 0x96, 0xd9, 0x38, 0x96, 0x19, 0xd2, 0xe4, 0x3d, 0x35, 0x86, 0xfd, 0x6d, 0xae, 0xfc, + 0x54, 0x93, 0x9e, 0x21, 0x1e, 0xfd, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x34, 0x6a, 0x3d, 0xd4, 0xc5, + 0x04, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -781,6 +828,43 @@ func (m *Result) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *GossipVotes) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GossipVotes) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GossipVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.GossipVotes) > 0 { + for iNdEx := len(m.GossipVotes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.GossipVotes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func encodeVarintTypes(dAtA []byte, offset int, v uint64) int { offset -= sovTypes(v) base := offset @@ -946,6 +1030,21 @@ func (m *Result) Size() (n int) { return n } +func (m *GossipVotes) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.GossipVotes) > 0 { + for _, e := range m.GossipVotes { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + return n +} + func sovTypes(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -2043,6 +2142,90 @@ func (m *Result) Unmarshal(dAtA []byte) error { } return nil } +func (m *GossipVotes) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GossipVotes: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GossipVotes: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GossipVotes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.GossipVotes = append(m.GossipVotes, &GossipVote{}) + if err := m.GossipVotes[len(m.GossipVotes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipTypes(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index 7b22c8611e7..ba3f60481f8 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -45,4 +45,8 @@ message Result { string oracle_id = 1 [ (gogoproto.moretags) = "db:\"oracle_id\"" ]; int64 timestamp = 3 [ (gogoproto.moretags) = "db:\"timestamp\"" ]; string data = 4 [ (gogoproto.moretags) = "db:\"data\"" ]; +} + +message GossipVotes { + repeated GossipVote GossipVotes = 1; } \ No newline at end of file diff --git a/state/execution.go b/state/execution.go index 8b51175eb81..49d1a8d0a57 100644 --- a/state/execution.go +++ b/state/execution.go @@ -7,13 +7,16 @@ import ( "time" abci "github.com/cometbft/cometbft/abci/types" + "github.com/cometbft/cometbft/crypto/ed25519" cryptoenc "github.com/cometbft/cometbft/crypto/encoding" + "github.com/cometbft/cometbft/crypto/sr25519" "github.com/cometbft/cometbft/libs/fail" "github.com/cometbft/cometbft/libs/log" "github.com/cometbft/cometbft/mempool" cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/cometbft/cometbft/proxy" "github.com/cometbft/cometbft/types" + "github.com/sirupsen/logrus" oracletypes "github.com/cometbft/cometbft/oracle/service/types" oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" @@ -141,15 +144,16 @@ func (blockExec *BlockExecutor) CreateProposalBlock( votes = append(votes, vote) } - resp, err := blockExec.proxyApp.SignGossipVote(ctx, &abci.RequestSignGossipVote{ - ProposerAddress: proposerAddr, - GossipVotes: votes, - Height: height, - }) + msg := oracleproto.GossipVotes{ + GossipVotes: votes, + } + + msgBz, err := msg.Marshal() if err != nil { - blockExec.logger.Error("error in proxyAppConn.SignGossipVote", "err", err) + blockExec.logger.Error("error marshalling oracleVotesMsg", "err", err) + } else { + signGossipVoteTxBz = msgBz } - signGossipVoteTxBz = resp.EncodedTx } var txs types.Txs @@ -198,15 +202,96 @@ func (blockExec *BlockExecutor) CreateProposalBlock( return state.MakeBlock(height, txl, commit, evidence, proposerAddr), nil } +func (blockExec *BlockExecutor) validateOracleGossipVotes(oracleTx *oracleproto.GossipVotes, height int64) ([]byte, error) { + // verify if gossipVote is from validator + vals, err := blockExec.store.LoadValidators(height) + if err != nil { + blockExec.logger.Error("error loading validators from store", "err", err) + return nil, err + } + + // validate oracle msg + verifiedGossipVotes := oracleproto.GossipVotes{ + GossipVotes: make([]*oracleproto.GossipVote, 0), + } + + for _, gossipVote := range oracleTx.GossipVotes { + // verify sig + signType := gossipVote.SignType + switch signType { + case "ed25519": + pubkey := ed25519.PubKey(gossipVote.PublicKey) + if success := pubkey.VerifySignature(types.OracleVoteSignBytes(gossipVote), gossipVote.Signature); !success { + err := fmt.Errorf("ed25519: failed to verify signature for gossipVote: %v", gossipVote) + blockExec.logger.Error("discarding gossipVote:", "err", err) + continue + } + case "sr25519": + pubkey := sr25519.PubKey(gossipVote.PublicKey) + if success := pubkey.VerifySignature(types.OracleVoteSignBytes(gossipVote), gossipVote.Signature); !success { + err := fmt.Errorf("sr25519: failed to verify signature for gossipVote: %v", gossipVote) + blockExec.logger.Error("discarding gossipVote:", "err", err) + continue + } + default: + err := fmt.Errorf("signature not supported for gossipVote: %v", gossipVote) + blockExec.logger.Error("discarding gossipVote:", "err", err) + continue + } + + // verify val + if !vals.HasAddress(gossipVote.Validator) { + err := fmt.Errorf("invalid validator: %v", gossipVote) + blockExec.logger.Error("discarding gossipVote:", "err", err) + continue + } + + verifiedGossipVotes.GossipVotes = append(verifiedGossipVotes.GossipVotes, gossipVote) + } + + if len(verifiedGossipVotes.GossipVotes) == 0 { + logrus.Warn("no valid oracle gossip votes found") + return nil, fmt.Errorf("no valid oracle gossip votes found") + } + + newMsg := oracleproto.GossipVotes{ + GossipVotes: verifiedGossipVotes.GossipVotes, + } + newMsgBz, err := newMsg.Marshal() + if err != nil { + blockExec.logger.Error("error marshalling oracleVotesMsg", "err", err) + return nil, err + } + + return newMsgBz, nil +} + func (blockExec *BlockExecutor) ProcessProposal( block *types.Block, state State, ) (bool, error) { + txs := block.Data.Txs.ToSliceOfBytes() + oracleTx := &oracleproto.GossipVotes{} + // check if oracleTx is successfully injected into first position of txs + if err := oracleTx.Unmarshal(txs[0]); err != nil { + // oracleTx is not present, continue normal processProposal flow + blockExec.logger.Error("error unmarshalling oracleVotesMsg or oracleVotesMsg not present", "err", err) + } else { + newTxBz, err := blockExec.validateOracleGossipVotes(oracleTx, block.Header.Height) + if err != nil { + // oracleTx is present but it is invalid, remove from txs + txs = txs[1:] + } else { + // oracleTx is present and valid, update txBz as some of the gossipVotes might have been removed due to invalid sig + txs[0] = newTxBz + } + } + resp, err := blockExec.proxyApp.ProcessProposal(context.TODO(), &abci.RequestProcessProposal{ Hash: block.Header.Hash(), Height: block.Header.Height, Time: block.Header.Time, - Txs: block.Data.Txs.ToSliceOfBytes(), + Txs: txs, ProposedLastCommit: buildLastCommitInfoFromStore(block, blockExec.store, state.InitialHeight), Misbehavior: block.Evidence.Evidence.ToABCI(), ProposerAddress: block.ProposerAddress, From 637ceef668cbe8043a6c70e3d2fb10307ea8880c Mon Sep 17 00:00:00 2001 From: yan-soon Date: Thu, 18 Apr 2024 15:16:31 +0800 Subject: [PATCH 046/150] fix index txs index out of range bug --- state/execution.go | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/state/execution.go b/state/execution.go index 49d1a8d0a57..b61acfbc4e5 100644 --- a/state/execution.go +++ b/state/execution.go @@ -271,19 +271,21 @@ func (blockExec *BlockExecutor) ProcessProposal( state State, ) (bool, error) { txs := block.Data.Txs.ToSliceOfBytes() - oracleTx := &oracleproto.GossipVotes{} - // check if oracleTx is successfully injected into first position of txs - if err := oracleTx.Unmarshal(txs[0]); err != nil { - // oracleTx is not present, continue normal processProposal flow - blockExec.logger.Error("error unmarshalling oracleVotesMsg or oracleVotesMsg not present", "err", err) - } else { - newTxBz, err := blockExec.validateOracleGossipVotes(oracleTx, block.Header.Height) - if err != nil { - // oracleTx is present but it is invalid, remove from txs - txs = txs[1:] + if len(txs) > 0 { + oracleTx := &oracleproto.GossipVotes{} + // check if oracleTx is successfully injected into first position of txs + if err := oracleTx.Unmarshal(txs[0]); err != nil { + // oracleTx is not present, continue normal processProposal flow + blockExec.logger.Error("error unmarshalling oracleVotesMsg or oracleVotesMsg not present", "err", err) } else { - // oracleTx is present and valid, update txBz as some of the gossipVotes might have been removed due to invalid sig - txs[0] = newTxBz + newTxBz, err := blockExec.validateOracleGossipVotes(oracleTx, block.Header.Height) + if err != nil { + // oracleTx is present but it is invalid, remove from txs + txs = txs[1:] + } else { + // oracleTx is present and valid, update txBz as some of the gossipVotes might have been removed due to invalid sig + txs[0] = newTxBz + } } } From d99d272c1e1f35e16d118f1cc0d04cf1db6492c3 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Thu, 18 Apr 2024 16:17:09 +0800 Subject: [PATCH 047/150] update proto --- proto/buf.lock | 4 ++-- proto/buf.yaml | 1 + proto/tendermint/oracle/tx.proto | 25 +++++++++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 proto/tendermint/oracle/tx.proto diff --git a/proto/buf.lock b/proto/buf.lock index 3fa18eb3d65..95f54f6f526 100644 --- a/proto/buf.lock +++ b/proto/buf.lock @@ -14,5 +14,5 @@ deps: - remote: buf.build owner: googleapis repository: googleapis - commit: 7e6f6e774e29406da95bd61cdcdbc8bc - digest: shake256:fe43dd2265ea0c07d76bd925eeba612667cf4c948d2ce53d6e367e1b4b3cb5fa69a51e6acb1a6a50d32f894f054a35e6c0406f6808a483f2752e10c866ffbf73 + commit: 4ed3bc159a8b4ac68fe253218760d035 + digest: shake256:7149cf5e9955c692d381e557830555d4e93f205a0f1b8e2dfdae46d029369aa3fc1980e35df0d310f7cc3b622f93e19ad276769a283a967dd3065ddfd3a40e13 diff --git a/proto/buf.yaml b/proto/buf.yaml index 4e1d99fa43a..976755ad445 100644 --- a/proto/buf.yaml +++ b/proto/buf.yaml @@ -1,6 +1,7 @@ version: v1 name: buf.build/Switcheo/cometbft deps: + - buf.build/cosmos/cosmos-sdk - buf.build/cosmos/cosmos-proto - buf.build/cosmos/gogo-proto - buf.build/googleapis/googleapis diff --git a/proto/tendermint/oracle/tx.proto b/proto/tendermint/oracle/tx.proto new file mode 100644 index 00000000000..f8c1e101d30 --- /dev/null +++ b/proto/tendermint/oracle/tx.proto @@ -0,0 +1,25 @@ +syntax = "proto3"; +package tendermint.oracle; +import "google/protobuf/wrappers.proto"; +import "gogoproto/gogo.proto"; +import "cosmos/msg/v1/msg.proto"; +import "cosmos_proto/cosmos.proto"; +import "tendermint/oracle/types.proto"; +// this line is used by starport scaffolding # proto/tx/import + +option go_package = "github.com/cometbft/cometbft/proto/tendermint/oracle"; +option (gogoproto.goproto_getters_all) = false; + +// Msg defines the Msg service. +service Msg { + option (cosmos.msg.v1.service) = true; + rpc GossipVotes(MsgGossipVotes) returns (MsgGossipVotesResponse); +} + +message MsgGossipVotes { + option (cosmos.msg.v1.signer) = "proposer"; + string proposer = 1 [ (cosmos_proto.scalar) = "cosmos.AddressString" ]; + repeated GossipVote GossipVotes = 1; +} + +message MsgGossipVotesResponse {} From 1dcdefd8c907fbe92021d48ff9ee97a5c32db0e1 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Thu, 18 Apr 2024 16:26:07 +0800 Subject: [PATCH 048/150] fix bug with proto indexing --- proto/tendermint/oracle/tx.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proto/tendermint/oracle/tx.proto b/proto/tendermint/oracle/tx.proto index f8c1e101d30..c2153ff88f5 100644 --- a/proto/tendermint/oracle/tx.proto +++ b/proto/tendermint/oracle/tx.proto @@ -19,7 +19,7 @@ service Msg { message MsgGossipVotes { option (cosmos.msg.v1.signer) = "proposer"; string proposer = 1 [ (cosmos_proto.scalar) = "cosmos.AddressString" ]; - repeated GossipVote GossipVotes = 1; + repeated GossipVote GossipVotes = 2; } message MsgGossipVotesResponse {} From 8149b7110696e943c05774d70ae6adbde50f53c7 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Thu, 18 Apr 2024 18:22:54 +0800 Subject: [PATCH 049/150] add validateOracleVotes hook --- abci/client/grpc_client.go | 4 + abci/client/mocks/client.go | 26 + abci/client/socket_client.go | 11 + abci/types/application.go | 5 + abci/types/messages.go | 6 + abci/types/mocks/application.go | 26 + abci/types/types.pb.go | 1204 ++++++++++++++++++++++------- proto/buf.yaml | 1 - proto/tendermint/abci/types.proto | 21 +- proto/tendermint/oracle/tx.proto | 25 - proxy/app_conn.go | 6 + proxy/mocks/app_conn_consensus.go | 26 + state/execution.go | 21 +- 13 files changed, 1047 insertions(+), 335 deletions(-) delete mode 100644 proto/tendermint/oracle/tx.proto diff --git a/abci/client/grpc_client.go b/abci/client/grpc_client.go index 9da15a5a27d..e2b5a2f3932 100644 --- a/abci/client/grpc_client.go +++ b/abci/client/grpc_client.go @@ -253,3 +253,7 @@ func (cli *grpcClient) SignGossipVote(ctx context.Context, req *types.RequestSig func (cli *grpcClient) PrepareOracleVotes(ctx context.Context, req *types.RequestPrepareOracleVotes) (*types.ResponsePrepareOracleVotes, error) { return cli.client.PrepareOracleVotes(ctx, types.ToRequestPrepareOracleVotes(req).GetPrepareOracleVotes(), grpc.WaitForReady(true)) } + +func (cli *grpcClient) ValidateOracleVotes(ctx context.Context, req *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) { + return cli.client.ValidateOracleVotes(ctx, types.ToRequestValidateOracleVotes(req).GetValidateOracleVotes(), grpc.WaitForReady(true)) +} diff --git a/abci/client/mocks/client.go b/abci/client/mocks/client.go index bd0cb9d3545..71fc6565492 100644 --- a/abci/client/mocks/client.go +++ b/abci/client/mocks/client.go @@ -618,6 +618,32 @@ func (_m *Client) String() string { return r0 } +// ValidateOracleVotes provides a mock function with given fields: _a0, _a1 +func (_m *Client) ValidateOracleVotes(_a0 context.Context, _a1 *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseValidateOracleVotes + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestValidateOracleVotes) *types.ResponseValidateOracleVotes); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseValidateOracleVotes) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestValidateOracleVotes) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // VerifyVoteExtension provides a mock function with given fields: _a0, _a1 func (_m *Client) VerifyVoteExtension(_a0 context.Context, _a1 *types.RequestVerifyVoteExtension) (*types.ResponseVerifyVoteExtension, error) { ret := _m.Called(_a0, _a1) diff --git a/abci/client/socket_client.go b/abci/client/socket_client.go index 50061df42e8..45d383968a6 100644 --- a/abci/client/socket_client.go +++ b/abci/client/socket_client.go @@ -434,6 +434,17 @@ func (cli *socketClient) PrepareOracleVotes(ctx context.Context, req *types.Requ return reqRes.Response.GetPrepareOracleVotes(), cli.Error() } +func (cli *socketClient) ValidateOracleVotes(ctx context.Context, req *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) { + reqRes, err := cli.queueRequest(ctx, types.ToRequestValidateOracleVotes(req)) + if err != nil { + return nil, err + } + if err := cli.Flush(ctx); err != nil { + return nil, err + } + return reqRes.Response.GetValidateOracleVotes(), cli.Error() +} + func (cli *socketClient) queueRequest(ctx context.Context, req *types.Request) (*ReqRes, error) { reqres := NewReqRes(req) diff --git a/abci/types/application.go b/abci/types/application.go index 53efb1df743..aba4b1bc5db 100644 --- a/abci/types/application.go +++ b/abci/types/application.go @@ -38,6 +38,7 @@ type Application interface { // Hooks SignGossipVote(context.Context, *RequestSignGossipVote) (*ResponseSignGossipVote, error) PrepareOracleVotes(context.Context, *RequestPrepareOracleVotes) (*ResponsePrepareOracleVotes, error) + ValidateOracleVotes(context.Context, *RequestValidateOracleVotes) (*ResponseValidateOracleVotes, error) } //------------------------------------------------------- @@ -131,3 +132,7 @@ func (BaseApplication) SignGossipVote(_ context.Context, req *RequestSignGossipV func (BaseApplication) PrepareOracleVotes(_ context.Context, req *RequestPrepareOracleVotes) (*ResponsePrepareOracleVotes, error) { return &ResponsePrepareOracleVotes{}, nil } + +func (BaseApplication) ValidateOracleVotes(_ context.Context, req *RequestValidateOracleVotes) (*ResponseValidateOracleVotes, error) { + return &ResponseValidateOracleVotes{}, nil +} diff --git a/abci/types/messages.go b/abci/types/messages.go index 57bd2d4271b..a9a17d7ebe1 100644 --- a/abci/types/messages.go +++ b/abci/types/messages.go @@ -136,6 +136,12 @@ func ToRequestPrepareOracleVotes(req *RequestPrepareOracleVotes) *Request { } } +func ToRequestValidateOracleVotes(req *RequestValidateOracleVotes) *Request { + return &Request{ + Value: &Request_ValidateOracleVotes{req}, + } +} + //---------------------------------------- func ToResponseException(errStr string) *Response { diff --git a/abci/types/mocks/application.go b/abci/types/mocks/application.go index 7a26813b53c..d9816a6f9ed 100644 --- a/abci/types/mocks/application.go +++ b/abci/types/mocks/application.go @@ -404,6 +404,32 @@ func (_m *Application) SignGossipVote(_a0 context.Context, _a1 *types.RequestSig return r0, r1 } +// ValidateOracleVotes provides a mock function with given fields: _a0, _a1 +func (_m *Application) ValidateOracleVotes(_a0 context.Context, _a1 *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseValidateOracleVotes + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestValidateOracleVotes) *types.ResponseValidateOracleVotes); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseValidateOracleVotes) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestValidateOracleVotes) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // VerifyVoteExtension provides a mock function with given fields: _a0, _a1 func (_m *Application) VerifyVoteExtension(_a0 context.Context, _a1 *types.RequestVerifyVoteExtension) (*types.ResponseVerifyVoteExtension, error) { ret := _m.Called(_a0, _a1) diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go index 9518b4054ba..791f55bd16d 100644 --- a/abci/types/types.pb.go +++ b/abci/types/types.pb.go @@ -122,7 +122,7 @@ func (x ResponseOfferSnapshot_Result) String() string { } func (ResponseOfferSnapshot_Result) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{29, 0} + return fileDescriptor_252557cfdd89a31a, []int{30, 0} } type ResponseApplySnapshotChunk_Result int32 @@ -159,7 +159,7 @@ func (x ResponseApplySnapshotChunk_Result) String() string { } func (ResponseApplySnapshotChunk_Result) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{31, 0} + return fileDescriptor_252557cfdd89a31a, []int{32, 0} } type ResponseProcessProposal_ProposalStatus int32 @@ -187,7 +187,7 @@ func (x ResponseProcessProposal_ProposalStatus) String() string { } func (ResponseProcessProposal_ProposalStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{33, 0} + return fileDescriptor_252557cfdd89a31a, []int{34, 0} } type ResponseVerifyVoteExtension_VerifyStatus int32 @@ -219,7 +219,32 @@ func (x ResponseVerifyVoteExtension_VerifyStatus) String() string { } func (ResponseVerifyVoteExtension_VerifyStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{35, 0} + return fileDescriptor_252557cfdd89a31a, []int{36, 0} +} + +type ResponseValidateOracleVotes_Status int32 + +const ( + ResponseValidateOracleVotes_present ResponseValidateOracleVotes_Status = 0 + ResponseValidateOracleVotes_absent ResponseValidateOracleVotes_Status = 1 +) + +var ResponseValidateOracleVotes_Status_name = map[int32]string{ + 0: "present", + 1: "absent", +} + +var ResponseValidateOracleVotes_Status_value = map[string]int32{ + "present": 0, + "absent": 1, +} + +func (x ResponseValidateOracleVotes_Status) String() string { + return proto.EnumName(ResponseValidateOracleVotes_Status_name, int32(x)) +} + +func (ResponseValidateOracleVotes_Status) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{41, 0} } type Request struct { @@ -242,6 +267,7 @@ type Request struct { // *Request_FinalizeBlock // *Request_SignGossipVote // *Request_PrepareOracleVotes + // *Request_ValidateOracleVotes Value isRequest_Value `protobuf_oneof:"value"` } @@ -338,6 +364,9 @@ type Request_SignGossipVote struct { type Request_PrepareOracleVotes struct { PrepareOracleVotes *RequestPrepareOracleVotes `protobuf:"bytes,22,opt,name=prepare_oracle_votes,json=prepareOracleVotes,proto3,oneof" json:"prepare_oracle_votes,omitempty"` } +type Request_ValidateOracleVotes struct { + ValidateOracleVotes *RequestValidateOracleVotes `protobuf:"bytes,23,opt,name=validate_oracle_votes,json=validateOracleVotes,proto3,oneof" json:"validate_oracle_votes,omitempty"` +} func (*Request_Echo) isRequest_Value() {} func (*Request_Flush) isRequest_Value() {} @@ -357,6 +386,7 @@ func (*Request_VerifyVoteExtension) isRequest_Value() {} func (*Request_FinalizeBlock) isRequest_Value() {} func (*Request_SignGossipVote) isRequest_Value() {} func (*Request_PrepareOracleVotes) isRequest_Value() {} +func (*Request_ValidateOracleVotes) isRequest_Value() {} func (m *Request) GetValue() isRequest_Value { if m != nil { @@ -491,6 +521,13 @@ func (m *Request) GetPrepareOracleVotes() *RequestPrepareOracleVotes { return nil } +func (m *Request) GetValidateOracleVotes() *RequestValidateOracleVotes { + if x, ok := m.GetValue().(*Request_ValidateOracleVotes); ok { + return x.ValidateOracleVotes + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*Request) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -512,6 +549,7 @@ func (*Request) XXX_OneofWrappers() []interface{} { (*Request_FinalizeBlock)(nil), (*Request_SignGossipVote)(nil), (*Request_PrepareOracleVotes)(nil), + (*Request_ValidateOracleVotes)(nil), } } @@ -1695,6 +1733,50 @@ func (m *RequestPrepareOracleVotes) XXX_DiscardUnknown() { var xxx_messageInfo_RequestPrepareOracleVotes proto.InternalMessageInfo +type RequestValidateOracleVotes struct { + OracleTx []byte `protobuf:"bytes,1,opt,name=oracle_tx,json=oracleTx,proto3" json:"oracle_tx,omitempty"` +} + +func (m *RequestValidateOracleVotes) Reset() { *m = RequestValidateOracleVotes{} } +func (m *RequestValidateOracleVotes) String() string { return proto.CompactTextString(m) } +func (*RequestValidateOracleVotes) ProtoMessage() {} +func (*RequestValidateOracleVotes) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{19} +} +func (m *RequestValidateOracleVotes) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RequestValidateOracleVotes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RequestValidateOracleVotes.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RequestValidateOracleVotes) XXX_Merge(src proto.Message) { + xxx_messageInfo_RequestValidateOracleVotes.Merge(m, src) +} +func (m *RequestValidateOracleVotes) XXX_Size() int { + return m.Size() +} +func (m *RequestValidateOracleVotes) XXX_DiscardUnknown() { + xxx_messageInfo_RequestValidateOracleVotes.DiscardUnknown(m) +} + +var xxx_messageInfo_RequestValidateOracleVotes proto.InternalMessageInfo + +func (m *RequestValidateOracleVotes) GetOracleTx() []byte { + if m != nil { + return m.OracleTx + } + return nil +} + type Response struct { // Types that are valid to be assigned to Value: // @@ -1717,6 +1799,7 @@ type Response struct { // *Response_FinalizeBlock // *Response_SignGossipVote // *Response_PrepareOracleVotes + // *Response_ValidateOracleVotes Value isResponse_Value `protobuf_oneof:"value"` } @@ -1724,7 +1807,7 @@ func (m *Response) Reset() { *m = Response{} } func (m *Response) String() string { return proto.CompactTextString(m) } func (*Response) ProtoMessage() {} func (*Response) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{19} + return fileDescriptor_252557cfdd89a31a, []int{20} } func (m *Response) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1816,6 +1899,9 @@ type Response_SignGossipVote struct { type Response_PrepareOracleVotes struct { PrepareOracleVotes *ResponsePrepareOracleVotes `protobuf:"bytes,23,opt,name=prepare_oracle_votes,json=prepareOracleVotes,proto3,oneof" json:"prepare_oracle_votes,omitempty"` } +type Response_ValidateOracleVotes struct { + ValidateOracleVotes *ResponseValidateOracleVotes `protobuf:"bytes,24,opt,name=validate_oracle_votes,json=validateOracleVotes,proto3,oneof" json:"validate_oracle_votes,omitempty"` +} func (*Response_Exception) isResponse_Value() {} func (*Response_Echo) isResponse_Value() {} @@ -1836,6 +1922,7 @@ func (*Response_VerifyVoteExtension) isResponse_Value() {} func (*Response_FinalizeBlock) isResponse_Value() {} func (*Response_SignGossipVote) isResponse_Value() {} func (*Response_PrepareOracleVotes) isResponse_Value() {} +func (*Response_ValidateOracleVotes) isResponse_Value() {} func (m *Response) GetValue() isResponse_Value { if m != nil { @@ -1977,6 +2064,13 @@ func (m *Response) GetPrepareOracleVotes() *ResponsePrepareOracleVotes { return nil } +func (m *Response) GetValidateOracleVotes() *ResponseValidateOracleVotes { + if x, ok := m.GetValue().(*Response_ValidateOracleVotes); ok { + return x.ValidateOracleVotes + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*Response) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -1999,6 +2093,7 @@ func (*Response) XXX_OneofWrappers() []interface{} { (*Response_FinalizeBlock)(nil), (*Response_SignGossipVote)(nil), (*Response_PrepareOracleVotes)(nil), + (*Response_ValidateOracleVotes)(nil), } } @@ -2011,7 +2106,7 @@ func (m *ResponseException) Reset() { *m = ResponseException{} } func (m *ResponseException) String() string { return proto.CompactTextString(m) } func (*ResponseException) ProtoMessage() {} func (*ResponseException) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{20} + return fileDescriptor_252557cfdd89a31a, []int{21} } func (m *ResponseException) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2055,7 +2150,7 @@ func (m *ResponseEcho) Reset() { *m = ResponseEcho{} } func (m *ResponseEcho) String() string { return proto.CompactTextString(m) } func (*ResponseEcho) ProtoMessage() {} func (*ResponseEcho) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{21} + return fileDescriptor_252557cfdd89a31a, []int{22} } func (m *ResponseEcho) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2098,7 +2193,7 @@ func (m *ResponseFlush) Reset() { *m = ResponseFlush{} } func (m *ResponseFlush) String() string { return proto.CompactTextString(m) } func (*ResponseFlush) ProtoMessage() {} func (*ResponseFlush) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{22} + return fileDescriptor_252557cfdd89a31a, []int{23} } func (m *ResponseFlush) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2139,7 +2234,7 @@ func (m *ResponseInfo) Reset() { *m = ResponseInfo{} } func (m *ResponseInfo) String() string { return proto.CompactTextString(m) } func (*ResponseInfo) ProtoMessage() {} func (*ResponseInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{23} + return fileDescriptor_252557cfdd89a31a, []int{24} } func (m *ResponseInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2213,7 +2308,7 @@ func (m *ResponseInitChain) Reset() { *m = ResponseInitChain{} } func (m *ResponseInitChain) String() string { return proto.CompactTextString(m) } func (*ResponseInitChain) ProtoMessage() {} func (*ResponseInitChain) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{24} + return fileDescriptor_252557cfdd89a31a, []int{25} } func (m *ResponseInitChain) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2280,7 +2375,7 @@ func (m *ResponseQuery) Reset() { *m = ResponseQuery{} } func (m *ResponseQuery) String() string { return proto.CompactTextString(m) } func (*ResponseQuery) ProtoMessage() {} func (*ResponseQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{25} + return fileDescriptor_252557cfdd89a31a, []int{26} } func (m *ResponseQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2387,7 +2482,7 @@ func (m *ResponseCheckTx) Reset() { *m = ResponseCheckTx{} } func (m *ResponseCheckTx) String() string { return proto.CompactTextString(m) } func (*ResponseCheckTx) ProtoMessage() {} func (*ResponseCheckTx) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{26} + return fileDescriptor_252557cfdd89a31a, []int{27} } func (m *ResponseCheckTx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2480,7 +2575,7 @@ func (m *ResponseCommit) Reset() { *m = ResponseCommit{} } func (m *ResponseCommit) String() string { return proto.CompactTextString(m) } func (*ResponseCommit) ProtoMessage() {} func (*ResponseCommit) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{27} + return fileDescriptor_252557cfdd89a31a, []int{28} } func (m *ResponseCommit) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2524,7 +2619,7 @@ func (m *ResponseListSnapshots) Reset() { *m = ResponseListSnapshots{} } func (m *ResponseListSnapshots) String() string { return proto.CompactTextString(m) } func (*ResponseListSnapshots) ProtoMessage() {} func (*ResponseListSnapshots) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{28} + return fileDescriptor_252557cfdd89a31a, []int{29} } func (m *ResponseListSnapshots) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2568,7 +2663,7 @@ func (m *ResponseOfferSnapshot) Reset() { *m = ResponseOfferSnapshot{} } func (m *ResponseOfferSnapshot) String() string { return proto.CompactTextString(m) } func (*ResponseOfferSnapshot) ProtoMessage() {} func (*ResponseOfferSnapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{29} + return fileDescriptor_252557cfdd89a31a, []int{30} } func (m *ResponseOfferSnapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2612,7 +2707,7 @@ func (m *ResponseLoadSnapshotChunk) Reset() { *m = ResponseLoadSnapshotC func (m *ResponseLoadSnapshotChunk) String() string { return proto.CompactTextString(m) } func (*ResponseLoadSnapshotChunk) ProtoMessage() {} func (*ResponseLoadSnapshotChunk) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{30} + return fileDescriptor_252557cfdd89a31a, []int{31} } func (m *ResponseLoadSnapshotChunk) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2658,7 +2753,7 @@ func (m *ResponseApplySnapshotChunk) Reset() { *m = ResponseApplySnapsho func (m *ResponseApplySnapshotChunk) String() string { return proto.CompactTextString(m) } func (*ResponseApplySnapshotChunk) ProtoMessage() {} func (*ResponseApplySnapshotChunk) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{31} + return fileDescriptor_252557cfdd89a31a, []int{32} } func (m *ResponseApplySnapshotChunk) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2716,7 +2811,7 @@ func (m *ResponsePrepareProposal) Reset() { *m = ResponsePrepareProposal func (m *ResponsePrepareProposal) String() string { return proto.CompactTextString(m) } func (*ResponsePrepareProposal) ProtoMessage() {} func (*ResponsePrepareProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{32} + return fileDescriptor_252557cfdd89a31a, []int{33} } func (m *ResponsePrepareProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2760,7 +2855,7 @@ func (m *ResponseProcessProposal) Reset() { *m = ResponseProcessProposal func (m *ResponseProcessProposal) String() string { return proto.CompactTextString(m) } func (*ResponseProcessProposal) ProtoMessage() {} func (*ResponseProcessProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{33} + return fileDescriptor_252557cfdd89a31a, []int{34} } func (m *ResponseProcessProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2804,7 +2899,7 @@ func (m *ResponseExtendVote) Reset() { *m = ResponseExtendVote{} } func (m *ResponseExtendVote) String() string { return proto.CompactTextString(m) } func (*ResponseExtendVote) ProtoMessage() {} func (*ResponseExtendVote) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{34} + return fileDescriptor_252557cfdd89a31a, []int{35} } func (m *ResponseExtendVote) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2848,7 +2943,7 @@ func (m *ResponseVerifyVoteExtension) Reset() { *m = ResponseVerifyVoteE func (m *ResponseVerifyVoteExtension) String() string { return proto.CompactTextString(m) } func (*ResponseVerifyVoteExtension) ProtoMessage() {} func (*ResponseVerifyVoteExtension) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{35} + return fileDescriptor_252557cfdd89a31a, []int{36} } func (m *ResponseVerifyVoteExtension) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2903,7 +2998,7 @@ func (m *ResponseFinalizeBlock) Reset() { *m = ResponseFinalizeBlock{} } func (m *ResponseFinalizeBlock) String() string { return proto.CompactTextString(m) } func (*ResponseFinalizeBlock) ProtoMessage() {} func (*ResponseFinalizeBlock) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{36} + return fileDescriptor_252557cfdd89a31a, []int{37} } func (m *ResponseFinalizeBlock) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2975,7 +3070,7 @@ func (m *ResponseSignGossipVote) Reset() { *m = ResponseSignGossipVote{} func (m *ResponseSignGossipVote) String() string { return proto.CompactTextString(m) } func (*ResponseSignGossipVote) ProtoMessage() {} func (*ResponseSignGossipVote) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{37} + return fileDescriptor_252557cfdd89a31a, []int{38} } func (m *ResponseSignGossipVote) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3021,7 +3116,7 @@ func (m *Vote) Reset() { *m = Vote{} } func (m *Vote) String() string { return proto.CompactTextString(m) } func (*Vote) ProtoMessage() {} func (*Vote) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{38} + return fileDescriptor_252557cfdd89a31a, []int{39} } func (m *Vote) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3079,7 +3174,7 @@ func (m *ResponsePrepareOracleVotes) Reset() { *m = ResponsePrepareOracl func (m *ResponsePrepareOracleVotes) String() string { return proto.CompactTextString(m) } func (*ResponsePrepareOracleVotes) ProtoMessage() {} func (*ResponsePrepareOracleVotes) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{39} + return fileDescriptor_252557cfdd89a31a, []int{40} } func (m *ResponsePrepareOracleVotes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3115,6 +3210,58 @@ func (m *ResponsePrepareOracleVotes) GetVotes() []Vote { return nil } +type ResponseValidateOracleVotes struct { + EncodedOracleTx []byte `protobuf:"bytes,1,opt,name=encoded_oracle_tx,json=encodedOracleTx,proto3" json:"encoded_oracle_tx,omitempty"` + Status ResponseValidateOracleVotes_Status `protobuf:"varint,2,opt,name=status,proto3,enum=tendermint.abci.ResponseValidateOracleVotes_Status" json:"status,omitempty"` +} + +func (m *ResponseValidateOracleVotes) Reset() { *m = ResponseValidateOracleVotes{} } +func (m *ResponseValidateOracleVotes) String() string { return proto.CompactTextString(m) } +func (*ResponseValidateOracleVotes) ProtoMessage() {} +func (*ResponseValidateOracleVotes) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{41} +} +func (m *ResponseValidateOracleVotes) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResponseValidateOracleVotes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ResponseValidateOracleVotes.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ResponseValidateOracleVotes) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseValidateOracleVotes.Merge(m, src) +} +func (m *ResponseValidateOracleVotes) XXX_Size() int { + return m.Size() +} +func (m *ResponseValidateOracleVotes) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseValidateOracleVotes.DiscardUnknown(m) +} + +var xxx_messageInfo_ResponseValidateOracleVotes proto.InternalMessageInfo + +func (m *ResponseValidateOracleVotes) GetEncodedOracleTx() []byte { + if m != nil { + return m.EncodedOracleTx + } + return nil +} + +func (m *ResponseValidateOracleVotes) GetStatus() ResponseValidateOracleVotes_Status { + if m != nil { + return m.Status + } + return ResponseValidateOracleVotes_present +} + type CommitInfo struct { Round int32 `protobuf:"varint,1,opt,name=round,proto3" json:"round,omitempty"` Votes []VoteInfo `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes"` @@ -3124,7 +3271,7 @@ func (m *CommitInfo) Reset() { *m = CommitInfo{} } func (m *CommitInfo) String() string { return proto.CompactTextString(m) } func (*CommitInfo) ProtoMessage() {} func (*CommitInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{40} + return fileDescriptor_252557cfdd89a31a, []int{42} } func (m *CommitInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3182,7 +3329,7 @@ func (m *ExtendedCommitInfo) Reset() { *m = ExtendedCommitInfo{} } func (m *ExtendedCommitInfo) String() string { return proto.CompactTextString(m) } func (*ExtendedCommitInfo) ProtoMessage() {} func (*ExtendedCommitInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{41} + return fileDescriptor_252557cfdd89a31a, []int{43} } func (m *ExtendedCommitInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3237,7 +3384,7 @@ func (m *Event) Reset() { *m = Event{} } func (m *Event) String() string { return proto.CompactTextString(m) } func (*Event) ProtoMessage() {} func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{42} + return fileDescriptor_252557cfdd89a31a, []int{44} } func (m *Event) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3291,7 +3438,7 @@ func (m *EventAttribute) Reset() { *m = EventAttribute{} } func (m *EventAttribute) String() string { return proto.CompactTextString(m) } func (*EventAttribute) ProtoMessage() {} func (*EventAttribute) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{43} + return fileDescriptor_252557cfdd89a31a, []int{45} } func (m *EventAttribute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3359,7 +3506,7 @@ func (m *ExecTxResult) Reset() { *m = ExecTxResult{} } func (m *ExecTxResult) String() string { return proto.CompactTextString(m) } func (*ExecTxResult) ProtoMessage() {} func (*ExecTxResult) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{44} + return fileDescriptor_252557cfdd89a31a, []int{46} } func (m *ExecTxResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3458,7 +3605,7 @@ func (m *TxResult) Reset() { *m = TxResult{} } func (m *TxResult) String() string { return proto.CompactTextString(m) } func (*TxResult) ProtoMessage() {} func (*TxResult) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{45} + return fileDescriptor_252557cfdd89a31a, []int{47} } func (m *TxResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3525,7 +3672,7 @@ func (m *Validator) Reset() { *m = Validator{} } func (m *Validator) String() string { return proto.CompactTextString(m) } func (*Validator) ProtoMessage() {} func (*Validator) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{46} + return fileDescriptor_252557cfdd89a31a, []int{48} } func (m *Validator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3577,7 +3724,7 @@ func (m *ValidatorUpdate) Reset() { *m = ValidatorUpdate{} } func (m *ValidatorUpdate) String() string { return proto.CompactTextString(m) } func (*ValidatorUpdate) ProtoMessage() {} func (*ValidatorUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{47} + return fileDescriptor_252557cfdd89a31a, []int{49} } func (m *ValidatorUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3629,7 +3776,7 @@ 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_252557cfdd89a31a, []int{48} + return fileDescriptor_252557cfdd89a31a, []int{50} } func (m *VoteInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3687,7 +3834,7 @@ func (m *ExtendedVoteInfo) Reset() { *m = ExtendedVoteInfo{} } func (m *ExtendedVoteInfo) String() string { return proto.CompactTextString(m) } func (*ExtendedVoteInfo) ProtoMessage() {} func (*ExtendedVoteInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{49} + return fileDescriptor_252557cfdd89a31a, []int{51} } func (m *ExtendedVoteInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3762,7 +3909,7 @@ func (m *Misbehavior) Reset() { *m = Misbehavior{} } func (m *Misbehavior) String() string { return proto.CompactTextString(m) } func (*Misbehavior) ProtoMessage() {} func (*Misbehavior) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{50} + return fileDescriptor_252557cfdd89a31a, []int{52} } func (m *Misbehavior) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3838,7 +3985,7 @@ func (m *Snapshot) Reset() { *m = Snapshot{} } func (m *Snapshot) String() string { return proto.CompactTextString(m) } func (*Snapshot) ProtoMessage() {} func (*Snapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{51} + return fileDescriptor_252557cfdd89a31a, []int{53} } func (m *Snapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3909,6 +4056,7 @@ func init() { proto.RegisterEnum("tendermint.abci.ResponseApplySnapshotChunk_Result", ResponseApplySnapshotChunk_Result_name, ResponseApplySnapshotChunk_Result_value) proto.RegisterEnum("tendermint.abci.ResponseProcessProposal_ProposalStatus", ResponseProcessProposal_ProposalStatus_name, ResponseProcessProposal_ProposalStatus_value) proto.RegisterEnum("tendermint.abci.ResponseVerifyVoteExtension_VerifyStatus", ResponseVerifyVoteExtension_VerifyStatus_name, ResponseVerifyVoteExtension_VerifyStatus_value) + proto.RegisterEnum("tendermint.abci.ResponseValidateOracleVotes_Status", ResponseValidateOracleVotes_Status_name, ResponseValidateOracleVotes_Status_value) proto.RegisterType((*Request)(nil), "tendermint.abci.Request") proto.RegisterType((*RequestEcho)(nil), "tendermint.abci.RequestEcho") proto.RegisterType((*RequestFlush)(nil), "tendermint.abci.RequestFlush") @@ -3928,6 +4076,7 @@ func init() { proto.RegisterType((*RequestFinalizeBlock)(nil), "tendermint.abci.RequestFinalizeBlock") proto.RegisterType((*RequestSignGossipVote)(nil), "tendermint.abci.RequestSignGossipVote") proto.RegisterType((*RequestPrepareOracleVotes)(nil), "tendermint.abci.RequestPrepareOracleVotes") + proto.RegisterType((*RequestValidateOracleVotes)(nil), "tendermint.abci.RequestValidateOracleVotes") proto.RegisterType((*Response)(nil), "tendermint.abci.Response") proto.RegisterType((*ResponseException)(nil), "tendermint.abci.ResponseException") proto.RegisterType((*ResponseEcho)(nil), "tendermint.abci.ResponseEcho") @@ -3949,6 +4098,7 @@ func init() { proto.RegisterType((*ResponseSignGossipVote)(nil), "tendermint.abci.ResponseSignGossipVote") proto.RegisterType((*Vote)(nil), "tendermint.abci.Vote") proto.RegisterType((*ResponsePrepareOracleVotes)(nil), "tendermint.abci.ResponsePrepareOracleVotes") + proto.RegisterType((*ResponseValidateOracleVotes)(nil), "tendermint.abci.ResponseValidateOracleVotes") proto.RegisterType((*CommitInfo)(nil), "tendermint.abci.CommitInfo") proto.RegisterType((*ExtendedCommitInfo)(nil), "tendermint.abci.ExtendedCommitInfo") proto.RegisterType((*Event)(nil), "tendermint.abci.Event") @@ -3966,220 +4116,227 @@ func init() { func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) } var fileDescriptor_252557cfdd89a31a = []byte{ - // 3400 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcd, 0x73, 0x23, 0xc5, - 0x15, 0xd7, 0x48, 0x23, 0x59, 0x7a, 0xfa, 0xf0, 0xb8, 0xbd, 0xeb, 0x15, 0xda, 0xc5, 0x36, 0x43, - 0x01, 0xcb, 0x02, 0x36, 0x78, 0xb3, 0x7c, 0xd4, 0x42, 0x2a, 0xb2, 0x56, 0x8b, 0xec, 0x35, 0xb6, - 0x19, 0xcb, 0x4b, 0x91, 0x0f, 0x86, 0xb1, 0xd4, 0x96, 0x86, 0x95, 0x34, 0xc3, 0xcc, 0xc8, 0xc8, - 0x9c, 0x52, 0x21, 0xa9, 0x4a, 0x71, 0xa2, 0x2a, 0x17, 0x0e, 0xe1, 0x90, 0x43, 0x2e, 0xf9, 0x0b, - 0x72, 0xca, 0x29, 0x07, 0x2a, 0x95, 0x03, 0xc7, 0x9c, 0x48, 0x0a, 0x6e, 0x5c, 0x72, 0xe0, 0x90, - 0x6b, 0xaa, 0x3f, 0xe6, 0x4b, 0x9a, 0xb1, 0xa4, 0x85, 0x1c, 0x52, 0xc9, 0xad, 0xfb, 0xe9, 0xbd, - 0xd7, 0xd3, 0xaf, 0x5f, 0xf7, 0x7b, 0xef, 0xd7, 0x2d, 0xb8, 0xea, 0xe0, 0x41, 0x1b, 0x5b, 0x7d, - 0x7d, 0xe0, 0x6c, 0x6a, 0x27, 0x2d, 0x7d, 0xd3, 0x39, 0x37, 0xb1, 0xbd, 0x61, 0x5a, 0x86, 0x63, - 0xa0, 0x45, 0xff, 0xc7, 0x0d, 0xf2, 0x63, 0xe5, 0xd1, 0x00, 0x77, 0xcb, 0x3a, 0x37, 0x1d, 0x63, - 0xd3, 0xb4, 0x0c, 0xe3, 0x94, 0xf1, 0x57, 0xae, 0x4d, 0xfe, 0xfc, 0x00, 0x9f, 0x73, 0x6d, 0x21, - 0x61, 0x3a, 0xca, 0xa6, 0xa9, 0x59, 0x5a, 0xdf, 0xfd, 0x79, 0x7d, 0xe2, 0xe7, 0x33, 0xad, 0xa7, - 0xb7, 0x35, 0xc7, 0xb0, 0x38, 0xc7, 0x5a, 0xc7, 0x30, 0x3a, 0x3d, 0xbc, 0x49, 0x7b, 0x27, 0xc3, - 0xd3, 0x4d, 0x47, 0xef, 0x63, 0xdb, 0xd1, 0xfa, 0x26, 0x67, 0xb8, 0xd4, 0x31, 0x3a, 0x06, 0x6d, - 0x6e, 0x92, 0x56, 0xc4, 0xb8, 0x86, 0xa5, 0xb5, 0x7a, 0x38, 0x38, 0x49, 0xf9, 0x5b, 0x80, 0x05, - 0x05, 0xbf, 0x3f, 0xc4, 0xb6, 0x83, 0xb6, 0x40, 0xc4, 0xad, 0xae, 0x51, 0x16, 0xd6, 0x85, 0xeb, - 0xf9, 0xad, 0x6b, 0x1b, 0x63, 0xf3, 0xdf, 0xe0, 0x7c, 0xf5, 0x56, 0xd7, 0x68, 0x24, 0x14, 0xca, - 0x8b, 0x6e, 0x41, 0xfa, 0xb4, 0x37, 0xb4, 0xbb, 0xe5, 0x24, 0x15, 0x7a, 0x34, 0x4e, 0xe8, 0x2e, - 0x61, 0x6a, 0x24, 0x14, 0xc6, 0x4d, 0x86, 0xd2, 0x07, 0xa7, 0x46, 0x39, 0x75, 0xf1, 0x50, 0x3b, - 0x83, 0x53, 0x3a, 0x14, 0xe1, 0x45, 0xdb, 0x00, 0xfa, 0x40, 0x77, 0xd4, 0x56, 0x57, 0xd3, 0x07, - 0xe5, 0x34, 0x95, 0x7c, 0x2c, 0x5e, 0x52, 0x77, 0x6a, 0x84, 0xb1, 0x91, 0x50, 0x72, 0xba, 0xdb, - 0x21, 0x9f, 0xfb, 0xfe, 0x10, 0x5b, 0xe7, 0xe5, 0xcc, 0xc5, 0x9f, 0xfb, 0x26, 0x61, 0x22, 0x9f, - 0x4b, 0xb9, 0xd1, 0xab, 0x90, 0x6d, 0x75, 0x71, 0xeb, 0x81, 0xea, 0x8c, 0xca, 0x59, 0x2a, 0xb9, - 0x16, 0x27, 0x59, 0x23, 0x7c, 0xcd, 0x51, 0x23, 0xa1, 0x2c, 0xb4, 0x58, 0x13, 0xbd, 0x0c, 0x99, - 0x96, 0xd1, 0xef, 0xeb, 0x4e, 0x39, 0x4f, 0x65, 0x57, 0x63, 0x65, 0x29, 0x57, 0x23, 0xa1, 0x70, - 0x7e, 0xb4, 0x0f, 0xa5, 0x9e, 0x6e, 0x3b, 0xaa, 0x3d, 0xd0, 0x4c, 0xbb, 0x6b, 0x38, 0x76, 0xb9, - 0x40, 0x35, 0x3c, 0x11, 0xa7, 0x61, 0x4f, 0xb7, 0x9d, 0x23, 0x97, 0xb9, 0x91, 0x50, 0x8a, 0xbd, - 0x20, 0x81, 0xe8, 0x33, 0x4e, 0x4f, 0xb1, 0xe5, 0x29, 0x2c, 0x17, 0x2f, 0xd6, 0x77, 0x40, 0xb8, - 0x5d, 0x79, 0xa2, 0xcf, 0x08, 0x12, 0xd0, 0x4f, 0x60, 0xb9, 0x67, 0x68, 0x6d, 0x4f, 0x9d, 0xda, - 0xea, 0x0e, 0x07, 0x0f, 0xca, 0x25, 0xaa, 0xf4, 0xe9, 0xd8, 0x8f, 0x34, 0xb4, 0xb6, 0xab, 0xa2, - 0x46, 0x04, 0x1a, 0x09, 0x65, 0xa9, 0x37, 0x4e, 0x44, 0xef, 0xc0, 0x25, 0xcd, 0x34, 0x7b, 0xe7, - 0xe3, 0xda, 0x17, 0xa9, 0xf6, 0x1b, 0x71, 0xda, 0xab, 0x44, 0x66, 0x5c, 0x3d, 0xd2, 0x26, 0xa8, - 0xa8, 0x09, 0x92, 0x69, 0x61, 0x53, 0xb3, 0xb0, 0x6a, 0x5a, 0x86, 0x69, 0xd8, 0x5a, 0xaf, 0x2c, - 0x51, 0xdd, 0x4f, 0xc5, 0xe9, 0x3e, 0x64, 0xfc, 0x87, 0x9c, 0xbd, 0x91, 0x50, 0x16, 0xcd, 0x30, - 0x89, 0x69, 0x35, 0x5a, 0xd8, 0xb6, 0x7d, 0xad, 0x4b, 0xd3, 0xb4, 0x52, 0xfe, 0xb0, 0xd6, 0x10, - 0x09, 0xd5, 0x21, 0x8f, 0x47, 0x44, 0x5c, 0x3d, 0x33, 0x1c, 0x5c, 0x46, 0x54, 0xa1, 0x1c, 0xbb, - 0x43, 0x29, 0xeb, 0x7d, 0xc3, 0xc1, 0x8d, 0x84, 0x02, 0xd8, 0xeb, 0x21, 0x0d, 0x2e, 0x9f, 0x61, - 0x4b, 0x3f, 0x3d, 0xa7, 0x6a, 0x54, 0xfa, 0x8b, 0xad, 0x1b, 0x83, 0xf2, 0x32, 0x55, 0xf8, 0x4c, - 0x9c, 0xc2, 0xfb, 0x54, 0x88, 0xa8, 0xa8, 0xbb, 0x22, 0x8d, 0x84, 0xb2, 0x7c, 0x36, 0x49, 0x26, - 0x2e, 0x76, 0xaa, 0x0f, 0xb4, 0x9e, 0xfe, 0x21, 0x56, 0x4f, 0x7a, 0x46, 0xeb, 0x41, 0xf9, 0xd2, - 0xc5, 0x2e, 0x76, 0x97, 0x73, 0x6f, 0x13, 0x66, 0xe2, 0x62, 0xa7, 0x41, 0x02, 0x52, 0x40, 0xb2, - 0xf5, 0xce, 0x40, 0xed, 0x18, 0xb6, 0xad, 0x9b, 0x6c, 0xfa, 0x97, 0xa9, 0xc6, 0x27, 0xe3, 0x34, - 0x1e, 0xe9, 0x9d, 0xc1, 0xeb, 0x94, 0x9d, 0x9b, 0xa0, 0x64, 0x87, 0x28, 0xc4, 0xb3, 0xdc, 0x95, - 0x67, 0x47, 0x22, 0x55, 0x6b, 0x97, 0x57, 0x2e, 0xf6, 0x2c, 0xbe, 0xfa, 0x07, 0x54, 0x84, 0x28, - 0x22, 0x3b, 0x0c, 0x99, 0x13, 0xd4, 0xed, 0x05, 0x48, 0x9f, 0x69, 0xbd, 0x21, 0xde, 0x15, 0xb3, - 0xa2, 0x94, 0xde, 0x15, 0xb3, 0x0b, 0x52, 0x76, 0x57, 0xcc, 0xe6, 0x24, 0xd8, 0x15, 0xb3, 0x20, - 0xe5, 0xe5, 0xa7, 0x20, 0x1f, 0x38, 0x4c, 0x51, 0x19, 0x16, 0xfa, 0xd8, 0xb6, 0xb5, 0x0e, 0xa6, - 0x67, 0x6f, 0x4e, 0x71, 0xbb, 0x72, 0x09, 0x0a, 0xc1, 0x03, 0x54, 0xfe, 0x44, 0xf0, 0x24, 0xc9, - 0xd9, 0x48, 0x24, 0xcf, 0xb0, 0x45, 0x97, 0x90, 0x4b, 0xf2, 0x2e, 0x7a, 0x1c, 0x8a, 0xd4, 0xfc, - 0xaa, 0xfb, 0x3b, 0x39, 0xa0, 0x45, 0xa5, 0x40, 0x89, 0xf7, 0x39, 0xd3, 0x1a, 0xe4, 0xcd, 0x2d, - 0xd3, 0x63, 0x49, 0x51, 0x16, 0x30, 0xb7, 0x4c, 0x97, 0xe1, 0x31, 0x28, 0x10, 0x0b, 0x78, 0x1c, - 0x22, 0x1d, 0x24, 0x4f, 0x68, 0x9c, 0x45, 0xfe, 0x6b, 0x12, 0xa4, 0xf1, 0x43, 0x17, 0xbd, 0x0c, - 0x22, 0x09, 0x4f, 0x3c, 0x94, 0x54, 0x36, 0x58, 0xec, 0xda, 0x70, 0x63, 0xd7, 0x46, 0xd3, 0x8d, - 0x5d, 0xdb, 0xd9, 0xcf, 0xbf, 0x5c, 0x4b, 0x7c, 0xf2, 0xf7, 0x35, 0x41, 0xa1, 0x12, 0xe8, 0x11, - 0x72, 0xd4, 0x6a, 0xfa, 0x40, 0xd5, 0xdb, 0xf4, 0x93, 0x73, 0xe4, 0x1c, 0xd5, 0xf4, 0xc1, 0x4e, - 0x1b, 0xed, 0x81, 0xd4, 0x32, 0x06, 0x36, 0x1e, 0xd8, 0x43, 0x5b, 0x65, 0xd1, 0x93, 0x07, 0x90, - 0x50, 0x18, 0x60, 0xe1, 0xad, 0xe6, 0x72, 0x1e, 0x52, 0x46, 0x65, 0xb1, 0x15, 0x26, 0xa0, 0xbb, - 0x00, 0x5e, 0x88, 0xb5, 0xcb, 0xe2, 0x7a, 0xea, 0x7a, 0x7e, 0x6b, 0x7d, 0x62, 0xe9, 0xef, 0xbb, - 0x2c, 0xc7, 0x66, 0x5b, 0x73, 0xf0, 0xb6, 0x48, 0x3e, 0x57, 0x09, 0x48, 0xa2, 0x27, 0x61, 0x51, - 0x33, 0x4d, 0xd5, 0x76, 0x34, 0x07, 0xab, 0x27, 0xe7, 0xc4, 0x8f, 0x48, 0x6c, 0x2a, 0x28, 0x45, - 0xcd, 0x34, 0x8f, 0x08, 0x75, 0x9b, 0x10, 0xd1, 0x13, 0x50, 0x22, 0x71, 0x48, 0xd7, 0x7a, 0x6a, - 0x17, 0xeb, 0x9d, 0xae, 0x43, 0x63, 0x50, 0x4a, 0x29, 0x72, 0x6a, 0x83, 0x12, 0xe5, 0xb6, 0xb7, - 0xe2, 0x34, 0x06, 0x21, 0x04, 0x62, 0x5b, 0x73, 0x34, 0x6a, 0xc9, 0x82, 0x42, 0xdb, 0x84, 0x66, - 0x6a, 0x4e, 0x97, 0xdb, 0x87, 0xb6, 0xd1, 0x0a, 0x64, 0xb8, 0xda, 0x14, 0x55, 0xcb, 0x7b, 0xe8, - 0x12, 0xa4, 0x4d, 0xcb, 0x38, 0xc3, 0x74, 0xe9, 0xb2, 0x0a, 0xeb, 0xc8, 0x0a, 0x94, 0xc2, 0xf1, - 0x0a, 0x95, 0x20, 0xe9, 0x8c, 0xf8, 0x28, 0x49, 0x67, 0x84, 0x9e, 0x07, 0x91, 0x18, 0x92, 0x8e, - 0x51, 0x8a, 0x88, 0xd0, 0x5c, 0xae, 0x79, 0x6e, 0x62, 0x85, 0x72, 0xca, 0x8b, 0x50, 0x0c, 0xc5, - 0x31, 0x79, 0x05, 0x2e, 0x45, 0x85, 0x25, 0xb9, 0xeb, 0xd1, 0x43, 0xe1, 0x05, 0xdd, 0x82, 0xac, - 0x17, 0x97, 0x98, 0xe3, 0x3c, 0x32, 0x31, 0xac, 0xcb, 0xac, 0x78, 0xac, 0xc4, 0x63, 0xc8, 0x02, - 0x74, 0x35, 0x9e, 0x85, 0x14, 0x94, 0x05, 0xcd, 0x34, 0x1b, 0x9a, 0xdd, 0x95, 0xdf, 0x85, 0x72, - 0x5c, 0xcc, 0x09, 0x18, 0x4c, 0xa0, 0x6e, 0xef, 0x1a, 0x6c, 0x05, 0x32, 0xa7, 0x86, 0xd5, 0xd7, - 0x1c, 0xaa, 0xac, 0xa8, 0xf0, 0x1e, 0x31, 0x24, 0x8b, 0x3f, 0x29, 0x4a, 0x66, 0x1d, 0x59, 0x85, - 0x47, 0x62, 0xe3, 0x0e, 0x11, 0xd1, 0x07, 0x6d, 0xcc, 0xcc, 0x5a, 0x54, 0x58, 0xc7, 0x57, 0xc4, - 0x3e, 0x96, 0x75, 0xc8, 0xb0, 0x36, 0x9d, 0x2b, 0xd5, 0x9f, 0x53, 0x78, 0x4f, 0xfe, 0x34, 0x05, - 0x2b, 0xd1, 0xd1, 0x07, 0xad, 0x43, 0xa1, 0xaf, 0x8d, 0x54, 0x67, 0xc4, 0xdd, 0x4e, 0xa0, 0x0b, - 0x0f, 0x7d, 0x6d, 0xd4, 0x1c, 0x31, 0x9f, 0x93, 0x20, 0xe5, 0x8c, 0xec, 0x72, 0x72, 0x3d, 0x75, - 0xbd, 0xa0, 0x90, 0x26, 0x3a, 0x86, 0xa5, 0x9e, 0xd1, 0xd2, 0x7a, 0x6a, 0x4f, 0xb3, 0x1d, 0x95, - 0xa7, 0x25, 0x6c, 0x13, 0x3d, 0x3e, 0x61, 0x6c, 0x16, 0x47, 0x70, 0x9b, 0xad, 0x27, 0x39, 0x70, - 0xb8, 0xff, 0x2f, 0x52, 0x1d, 0x7b, 0x9a, 0xbb, 0xd4, 0xe8, 0x0e, 0xe4, 0xfb, 0xba, 0x7d, 0x82, - 0xbb, 0xda, 0x99, 0x6e, 0x58, 0x7c, 0x37, 0x4d, 0x3a, 0xcd, 0x1b, 0x3e, 0x0f, 0xd7, 0x14, 0x14, - 0x0b, 0x2c, 0x49, 0x3a, 0xe4, 0xc3, 0xee, 0x69, 0x92, 0x99, 0xfb, 0x34, 0x79, 0x1e, 0x2e, 0x0d, - 0xf0, 0xc8, 0x51, 0xfd, 0xfd, 0xca, 0xfc, 0x64, 0x81, 0x9a, 0x1e, 0x91, 0xdf, 0xbc, 0x1d, 0x6e, - 0x13, 0x97, 0x41, 0x4f, 0xd3, 0xf8, 0x6d, 0x1a, 0x36, 0xb6, 0x54, 0xad, 0xdd, 0xb6, 0xb0, 0x6d, - 0xd3, 0x94, 0xaf, 0x40, 0x83, 0x32, 0xa5, 0x57, 0x19, 0x59, 0xfe, 0x75, 0x70, 0x69, 0xc2, 0xf1, - 0x9a, 0x1b, 0x5e, 0xf0, 0x0d, 0x7f, 0x44, 0x62, 0x0e, 0x95, 0x6f, 0x87, 0x6c, 0xcf, 0xf2, 0xe6, - 0xab, 0x93, 0xfb, 0x6b, 0xdc, 0xe6, 0xc8, 0x15, 0x8f, 0x37, 0x7b, 0xea, 0xe1, 0xcc, 0x8e, 0x40, - 0xa4, 0x46, 0x11, 0xd9, 0x11, 0x43, 0xda, 0xff, 0x6d, 0x4b, 0xf1, 0x51, 0x0a, 0x96, 0x26, 0x92, - 0x1f, 0x6f, 0x62, 0x42, 0xe4, 0xc4, 0x92, 0x91, 0x13, 0x4b, 0xcd, 0x3d, 0x31, 0xbe, 0xd6, 0xe2, - 0xf4, 0xb5, 0x4e, 0x7f, 0x8f, 0x6b, 0x9d, 0x79, 0xb8, 0xb5, 0xfe, 0x8f, 0xae, 0xc2, 0x6f, 0x05, - 0xa8, 0xc4, 0x67, 0x8c, 0x91, 0xcb, 0xf1, 0x0c, 0x2c, 0x79, 0x9f, 0xe2, 0xa9, 0x67, 0x07, 0xa3, - 0xe4, 0xfd, 0xc0, 0xf5, 0xc7, 0xc6, 0xb8, 0x27, 0xa0, 0x34, 0x96, 0xcf, 0x32, 0x57, 0x2e, 0x9e, - 0x05, 0xc7, 0x97, 0x7f, 0x99, 0xf2, 0x02, 0x4f, 0x28, 0xe9, 0x8c, 0xd8, 0xad, 0x6f, 0xc2, 0x72, - 0x1b, 0xb7, 0xf4, 0xf6, 0xc3, 0x6e, 0xd6, 0x25, 0x2e, 0xfd, 0xff, 0xbd, 0x1a, 0xe9, 0x25, 0x97, - 0x23, 0x33, 0xf5, 0x48, 0x25, 0x42, 0xa4, 0x12, 0xf4, 0x23, 0x28, 0x04, 0x2a, 0x02, 0x16, 0xe2, - 0xc6, 0xea, 0x79, 0x96, 0xda, 0x6f, 0xf8, 0xfa, 0x95, 0x7c, 0xc7, 0x6b, 0xc7, 0x3a, 0x93, 0x7c, - 0xd5, 0x8b, 0xe8, 0x93, 0xf9, 0xbe, 0xfc, 0x97, 0x3c, 0x64, 0x15, 0x6c, 0x9b, 0x24, 0x97, 0x44, - 0xdb, 0x90, 0xc3, 0xa3, 0x16, 0x36, 0x1d, 0x37, 0xfd, 0x8e, 0x2e, 0xc9, 0x18, 0x77, 0xdd, 0xe5, - 0x6c, 0x24, 0x14, 0x5f, 0x0c, 0xdd, 0xe4, 0x98, 0x4b, 0x3c, 0x7c, 0xc2, 0xc5, 0x83, 0xa0, 0xcb, - 0x8b, 0x2e, 0xe8, 0x92, 0x8a, 0xc5, 0x13, 0x98, 0xd4, 0x18, 0xea, 0x72, 0x93, 0xa3, 0x2e, 0xe2, - 0x94, 0xc1, 0x42, 0xb0, 0x4b, 0x2d, 0x04, 0xbb, 0x64, 0xa6, 0x4c, 0x33, 0x06, 0x77, 0x79, 0xd1, - 0xc5, 0x5d, 0x16, 0xa6, 0x7c, 0xf1, 0x18, 0xf0, 0xf2, 0x5a, 0x00, 0x78, 0xc9, 0x51, 0xd1, 0xf5, - 0x58, 0xd1, 0x08, 0xe4, 0xe5, 0x15, 0x0f, 0x79, 0x29, 0xc4, 0xa2, 0x36, 0x5c, 0x78, 0x1c, 0x7a, - 0x39, 0x98, 0x80, 0x5e, 0x8a, 0xb1, 0x55, 0x27, 0x53, 0x31, 0x05, 0x7b, 0x39, 0x98, 0xc0, 0x5e, - 0x4a, 0x53, 0x14, 0x4e, 0x01, 0x5f, 0x7e, 0x1a, 0x0d, 0xbe, 0xc4, 0xc3, 0x23, 0xfc, 0x33, 0x67, - 0x43, 0x5f, 0xd4, 0x18, 0xf4, 0x45, 0x8a, 0x45, 0x0a, 0x98, 0xfa, 0x99, 0xe1, 0x97, 0xe3, 0x08, - 0xf8, 0x85, 0x01, 0x25, 0xd7, 0x63, 0x95, 0xcf, 0x80, 0xbf, 0x1c, 0x47, 0xe0, 0x2f, 0x68, 0xaa, - 0xda, 0xa9, 0x00, 0xcc, 0xdd, 0x30, 0x00, 0xb3, 0x1c, 0x93, 0x31, 0xfb, 0xbb, 0x3d, 0x06, 0x81, - 0x39, 0x89, 0x43, 0x60, 0x18, 0x4a, 0xf2, 0x6c, 0xac, 0xc6, 0x39, 0x20, 0x98, 0x83, 0x09, 0x08, - 0xe6, 0xf2, 0x14, 0x4f, 0x9b, 0x82, 0xc1, 0x1c, 0x45, 0x60, 0x30, 0x2b, 0xb1, 0x98, 0x16, 0x53, - 0x39, 0x15, 0x84, 0x51, 0x63, 0x40, 0x98, 0x2b, 0x53, 0x1c, 0xec, 0x61, 0x50, 0x98, 0xb4, 0x94, - 0xd9, 0x15, 0xb3, 0x59, 0x29, 0xc7, 0xf0, 0x97, 0x5d, 0x31, 0x9b, 0x97, 0x0a, 0xf2, 0xd3, 0x24, - 0x67, 0x1c, 0x3b, 0x9d, 0x49, 0x75, 0x86, 0x2d, 0xcb, 0xb0, 0x38, 0x9e, 0xc2, 0x3a, 0xf2, 0x75, - 0x52, 0x95, 0xfb, 0x27, 0xf1, 0x05, 0x88, 0x0d, 0xad, 0x82, 0x03, 0xa7, 0xaf, 0xfc, 0x47, 0xc1, - 0x97, 0xa5, 0x98, 0x4d, 0xb0, 0xa2, 0xcf, 0xf1, 0x8a, 0x3e, 0x80, 0xe3, 0x24, 0xc3, 0x38, 0xce, - 0x1a, 0xe4, 0x49, 0x75, 0x3b, 0x06, 0xd1, 0x68, 0xa6, 0x07, 0xd1, 0xdc, 0x80, 0x25, 0x9a, 0xa2, - 0x30, 0xb4, 0x87, 0x87, 0x34, 0x91, 0x86, 0xb4, 0x45, 0xf2, 0x03, 0x5b, 0x53, 0x96, 0x11, 0x3c, - 0x07, 0xcb, 0x01, 0x5e, 0xaf, 0x6a, 0x66, 0x78, 0x85, 0xe4, 0x71, 0x57, 0x79, 0xf9, 0xfc, 0x67, - 0xc1, 0xb7, 0x90, 0x8f, 0xed, 0x44, 0xc1, 0x30, 0xc2, 0xf7, 0x04, 0xc3, 0x24, 0x1f, 0x1a, 0x86, - 0x09, 0xa2, 0x00, 0xa9, 0x30, 0x0a, 0xf0, 0x2f, 0xc1, 0x5f, 0x13, 0x0f, 0x54, 0x69, 0x19, 0x6d, - 0xcc, 0xeb, 0x72, 0xda, 0x26, 0x49, 0x60, 0xcf, 0xe8, 0xf0, 0xea, 0x9b, 0x34, 0x09, 0x97, 0x17, - 0x2e, 0x73, 0x3c, 0x1a, 0x7a, 0x25, 0x3d, 0x4b, 0xb5, 0x78, 0x49, 0x2f, 0x41, 0xea, 0x01, 0x66, - 0x97, 0x0a, 0x05, 0x85, 0x34, 0x09, 0x1f, 0x75, 0x3e, 0x9e, 0x32, 0xb1, 0x0e, 0x7a, 0x19, 0x72, - 0xf4, 0xc6, 0x48, 0x35, 0x4c, 0x9b, 0x5f, 0x24, 0x84, 0x92, 0x49, 0x76, 0x6d, 0xb4, 0x71, 0x48, - 0x78, 0x0e, 0x4c, 0x5b, 0xc9, 0x9a, 0xbc, 0x15, 0xc8, 0x56, 0x72, 0xa1, 0x1c, 0xef, 0x1a, 0xe4, - 0xc8, 0xd7, 0xdb, 0xa6, 0xd6, 0xc2, 0x65, 0xa0, 0x1f, 0xea, 0x13, 0xe4, 0x3f, 0x24, 0x61, 0x71, - 0x2c, 0x3c, 0x46, 0xce, 0xdd, 0x75, 0xc9, 0x64, 0x00, 0x64, 0x9a, 0xcd, 0x1e, 0xab, 0x00, 0x1d, - 0xcd, 0x56, 0x3f, 0xd0, 0x06, 0x0e, 0x6e, 0x73, 0xa3, 0x04, 0x28, 0xa8, 0x02, 0x59, 0xd2, 0x1b, - 0xda, 0xb8, 0xcd, 0xf1, 0x2e, 0xaf, 0x8f, 0x1a, 0x90, 0xc1, 0x67, 0x78, 0xe0, 0xd8, 0xe5, 0x05, - 0xba, 0xec, 0x2b, 0x93, 0x00, 0x04, 0xf9, 0x79, 0xbb, 0x4c, 0x16, 0xfb, 0x9b, 0x2f, 0xd7, 0x24, - 0xc6, 0xfd, 0xac, 0xd1, 0xd7, 0x1d, 0xdc, 0x37, 0x9d, 0x73, 0x85, 0xcb, 0x87, 0xad, 0x90, 0x1d, - 0xb3, 0x02, 0x45, 0x5e, 0x0b, 0x2e, 0xa0, 0x42, 0x6c, 0xaa, 0x1b, 0x96, 0xee, 0x9c, 0x2b, 0xc5, - 0x3e, 0xee, 0x9b, 0x86, 0xd1, 0x53, 0xd9, 0x1e, 0xaf, 0x42, 0x29, 0x9c, 0x0d, 0xa0, 0xc7, 0xa1, - 0x68, 0x61, 0x47, 0xd3, 0x07, 0x6a, 0x28, 0x53, 0x2c, 0x30, 0x22, 0xdb, 0x53, 0xbb, 0x62, 0x56, - 0x90, 0x92, 0xbb, 0x62, 0x36, 0x29, 0xa5, 0xe4, 0x43, 0x92, 0xd9, 0x46, 0x64, 0x03, 0xe8, 0x25, - 0xc8, 0xf9, 0x89, 0x84, 0x40, 0x67, 0x7b, 0x01, 0xb6, 0xe5, 0xf3, 0xca, 0x7f, 0x12, 0x7c, 0x95, - 0x61, 0xb4, 0xac, 0x0e, 0x19, 0x0b, 0xdb, 0xc3, 0x1e, 0xc3, 0xaf, 0x4a, 0x5b, 0xcf, 0xcd, 0x96, - 0x47, 0x10, 0xea, 0xb0, 0xe7, 0x28, 0x5c, 0x58, 0x7e, 0x07, 0x32, 0x8c, 0x82, 0xf2, 0xb0, 0x70, - 0xbc, 0x7f, 0x6f, 0xff, 0xe0, 0xad, 0x7d, 0x29, 0x81, 0x00, 0x32, 0xd5, 0x5a, 0xad, 0x7e, 0xd8, - 0x94, 0x04, 0x94, 0x83, 0x74, 0x75, 0xfb, 0x40, 0x69, 0x4a, 0x49, 0x42, 0x56, 0xea, 0xbb, 0xf5, - 0x5a, 0x53, 0x4a, 0xa1, 0x25, 0x28, 0xb2, 0xb6, 0x7a, 0xf7, 0x40, 0x79, 0xa3, 0xda, 0x94, 0xc4, - 0x00, 0xe9, 0xa8, 0xbe, 0x7f, 0xa7, 0xae, 0x48, 0x69, 0xf9, 0x05, 0x92, 0x4e, 0xc7, 0x64, 0x1e, - 0x3e, 0x14, 0x26, 0x04, 0xa0, 0x30, 0xf9, 0xd3, 0x24, 0x29, 0x23, 0xe3, 0xd2, 0x09, 0xb4, 0x3b, - 0x36, 0xf1, 0xad, 0x39, 0x72, 0x91, 0xb1, 0xd9, 0x93, 0xca, 0xd1, 0xc2, 0xa7, 0xd8, 0x69, 0x75, - 0x59, 0x7a, 0xc3, 0x4e, 0xa0, 0xa2, 0x52, 0xe4, 0x54, 0x2a, 0x64, 0x33, 0xb6, 0xf7, 0x70, 0xcb, - 0x51, 0x99, 0x13, 0xd9, 0xb4, 0x7c, 0xcb, 0x11, 0x36, 0x42, 0x3d, 0x62, 0x44, 0xf9, 0xdd, 0xb9, - 0x6c, 0x99, 0x83, 0xb4, 0x52, 0x6f, 0x2a, 0x6f, 0x4b, 0x29, 0x84, 0xa0, 0x44, 0x9b, 0xea, 0xd1, - 0x7e, 0xf5, 0xf0, 0xa8, 0x71, 0x40, 0x6c, 0xb9, 0x0c, 0x8b, 0xae, 0x2d, 0x5d, 0x62, 0x5a, 0x7e, - 0x06, 0xae, 0xc4, 0xe4, 0x42, 0x93, 0x45, 0xac, 0xfc, 0x3b, 0x21, 0xc8, 0x1d, 0xce, 0x67, 0x0e, - 0x20, 0x63, 0x3b, 0x9a, 0x33, 0xb4, 0xb9, 0x11, 0x5f, 0x9a, 0x35, 0x39, 0xda, 0x70, 0x1b, 0x47, - 0x54, 0x5c, 0xe1, 0x6a, 0xe4, 0x5b, 0x50, 0x0a, 0xff, 0x12, 0x6f, 0x03, 0xdf, 0x89, 0x92, 0xf2, - 0x6d, 0x40, 0x93, 0x39, 0x53, 0x44, 0x41, 0x2f, 0x44, 0x15, 0xf4, 0xbf, 0x17, 0xe0, 0xea, 0x05, - 0xf9, 0x11, 0x7a, 0x73, 0x6c, 0x92, 0xaf, 0xcc, 0x93, 0x5d, 0x6d, 0x30, 0xda, 0xd8, 0x34, 0x6f, - 0x42, 0x21, 0x48, 0x9f, 0x6d, 0x92, 0xdf, 0x24, 0xfd, 0x4d, 0x1c, 0x46, 0x1e, 0xfc, 0x23, 0x50, - 0xf8, 0x8e, 0x47, 0xe0, 0xab, 0x00, 0xce, 0x48, 0x65, 0x6e, 0x1d, 0x59, 0x0e, 0x73, 0x44, 0x17, - 0xb7, 0x9a, 0x23, 0xbe, 0x09, 0x72, 0x0e, 0x6f, 0xd9, 0xe8, 0x28, 0x08, 0xc3, 0x0c, 0x69, 0x8c, - 0xb5, 0x39, 0x44, 0x31, 0x6b, 0x30, 0xf6, 0xe1, 0x1a, 0x46, 0xb6, 0xd1, 0xdb, 0x70, 0x65, 0x2c, - 0x51, 0xf0, 0x54, 0x8b, 0xb3, 0xe6, 0x0b, 0x97, 0xc3, 0xf9, 0x82, 0xab, 0x3a, 0x18, 0xed, 0xd3, - 0xe1, 0x68, 0xff, 0x12, 0xac, 0x44, 0xe7, 0xa0, 0xe8, 0x51, 0x00, 0x3c, 0x20, 0x61, 0xa1, 0xad, - 0x7a, 0x57, 0x1d, 0x39, 0x4e, 0x69, 0x8e, 0xe4, 0x63, 0x10, 0x29, 0xdb, 0x55, 0xc8, 0xf1, 0x84, - 0x54, 0x6f, 0xf3, 0x24, 0x2d, 0xcb, 0x08, 0x3b, 0x6d, 0x12, 0x69, 0xbc, 0x77, 0x17, 0x1c, 0x41, - 0xf4, 0x09, 0x5e, 0x1c, 0x4d, 0xf9, 0xa9, 0x9d, 0x7c, 0xe0, 0x1f, 0x66, 0x93, 0xa9, 0x2b, 0x7a, - 0x01, 0xd2, 0x2c, 0xed, 0x65, 0xeb, 0x7f, 0x79, 0xd2, 0xd8, 0x86, 0x67, 0x61, 0xc6, 0x29, 0xbf, - 0x0d, 0xe0, 0xe3, 0x4d, 0xe4, 0x08, 0xb5, 0x8c, 0xe1, 0x80, 0x7d, 0x69, 0x5a, 0x61, 0x1d, 0x74, - 0xcb, 0x55, 0x9b, 0x8c, 0x89, 0x35, 0x44, 0x6d, 0x00, 0xaf, 0xe2, 0xaa, 0x75, 0x40, 0x93, 0x98, - 0x7f, 0xcc, 0x10, 0xaf, 0x85, 0x87, 0x78, 0x2c, 0xf6, 0xf6, 0x20, 0x7a, 0xa8, 0x0f, 0x21, 0x4d, - 0x5d, 0x9b, 0xd8, 0x8c, 0x5e, 0x34, 0xf1, 0x74, 0x98, 0xb4, 0xd1, 0xcf, 0x00, 0x34, 0xc7, 0xb1, - 0xf4, 0x93, 0xa1, 0x3f, 0xc0, 0x5a, 0xf4, 0xd6, 0xa8, 0xba, 0x7c, 0xdb, 0xd7, 0xf8, 0x1e, 0xb9, - 0xe4, 0x8b, 0x06, 0xf6, 0x49, 0x40, 0xa1, 0xbc, 0x0f, 0xa5, 0xb0, 0xac, 0x9b, 0xc0, 0xb1, 0x6f, - 0x08, 0x27, 0x70, 0x2c, 0x1f, 0xe7, 0x09, 0x9c, 0x97, 0xfe, 0xa5, 0xd8, 0x6d, 0x1a, 0xed, 0xc8, - 0x3f, 0x4f, 0x42, 0x21, 0xb8, 0xb3, 0xfe, 0xf7, 0x72, 0x2c, 0xf9, 0x57, 0x02, 0x64, 0xbd, 0xe9, - 0x87, 0xaf, 0xd6, 0x42, 0x77, 0x91, 0xcc, 0x7a, 0xc9, 0xe0, 0x7d, 0x18, 0xbb, 0x79, 0x4c, 0x79, - 0x37, 0x8f, 0xb7, 0xbd, 0xf8, 0x1e, 0x87, 0x53, 0x05, 0x6d, 0xcd, 0xbd, 0xca, 0x4d, 0x67, 0x6e, - 0x43, 0xce, 0x3b, 0x9e, 0x48, 0x55, 0x15, 0x86, 0x11, 0xdd, 0x2e, 0xbd, 0x15, 0x35, 0x3e, 0xe0, - 0x97, 0x6d, 0x29, 0x85, 0x75, 0xe4, 0x36, 0x2c, 0x8e, 0x9d, 0x6d, 0xe8, 0x36, 0x2c, 0x98, 0xc3, - 0x13, 0xd5, 0x75, 0x8e, 0x31, 0xc4, 0xd6, 0xcd, 0xd7, 0x87, 0x27, 0x3d, 0xbd, 0x75, 0x0f, 0x9f, - 0xbb, 0x1f, 0x63, 0x0e, 0x4f, 0xee, 0x31, 0x1f, 0x62, 0xa3, 0x24, 0x83, 0xa3, 0xfc, 0x46, 0x80, - 0xac, 0xbb, 0x27, 0xd0, 0x0f, 0x21, 0xe7, 0x9d, 0x9b, 0xde, 0x6d, 0x79, 0xec, 0x81, 0xcb, 0xf5, - 0xfb, 0x22, 0xa8, 0xea, 0x5e, 0xf3, 0xeb, 0x6d, 0xf5, 0xb4, 0xa7, 0x31, 0x5f, 0x2a, 0x85, 0x6d, - 0xc6, 0x4e, 0x56, 0x1a, 0x70, 0x76, 0xee, 0xdc, 0xed, 0x69, 0x1d, 0x25, 0x4f, 0x65, 0x76, 0xda, - 0xa4, 0xc3, 0x53, 0xd7, 0x6f, 0x05, 0x90, 0xc6, 0x77, 0xec, 0x77, 0xfe, 0xba, 0xc9, 0x38, 0x9e, - 0x8a, 0x88, 0xe3, 0x68, 0x13, 0x96, 0x3d, 0x0e, 0xd5, 0xd6, 0x3b, 0x03, 0xcd, 0x19, 0x5a, 0x98, - 0x63, 0xdc, 0xc8, 0xfb, 0xe9, 0xc8, 0xfd, 0x65, 0x72, 0xd6, 0xe9, 0x87, 0x9c, 0xf5, 0x47, 0x49, - 0xc8, 0x07, 0x10, 0x77, 0xf4, 0x83, 0xc0, 0x61, 0x54, 0x8a, 0x08, 0x7d, 0x01, 0x5e, 0xff, 0xe6, - 0x3b, 0x6c, 0xa6, 0xe4, 0xfc, 0x66, 0x8a, 0xbb, 0xd7, 0x70, 0x01, 0x7c, 0x71, 0x6e, 0x00, 0xff, - 0x59, 0x40, 0x8e, 0xe1, 0x68, 0x3d, 0xf5, 0xcc, 0x70, 0xf4, 0x41, 0x47, 0x65, 0x6e, 0xc8, 0x8e, - 0x0e, 0x89, 0xfe, 0x72, 0x9f, 0xfe, 0x70, 0x48, 0x3d, 0xf2, 0x17, 0x02, 0x64, 0xbd, 0xba, 0x62, - 0xde, 0x7b, 0xf1, 0x15, 0xc8, 0xf0, 0xd4, 0x99, 0x5d, 0x8c, 0xf3, 0x5e, 0xe4, 0x4d, 0x45, 0x05, - 0xb2, 0x7d, 0xec, 0x68, 0xf4, 0x1c, 0x64, 0x61, 0xdb, 0xeb, 0xdf, 0x78, 0x05, 0xf2, 0x81, 0x37, - 0x05, 0xe4, 0x68, 0xdc, 0xaf, 0xbf, 0x25, 0x25, 0x2a, 0x0b, 0x1f, 0x7f, 0xb6, 0x9e, 0xda, 0xc7, - 0x1f, 0x90, 0xdd, 0xac, 0xd4, 0x6b, 0x8d, 0x7a, 0xed, 0x9e, 0x24, 0x54, 0xf2, 0x1f, 0x7f, 0xb6, - 0xbe, 0xa0, 0x60, 0x0a, 0xf4, 0xde, 0xb8, 0x07, 0x8b, 0x63, 0x0b, 0x13, 0xce, 0xcb, 0x10, 0x94, - 0xee, 0x1c, 0x1f, 0xee, 0xed, 0xd4, 0xaa, 0xcd, 0xba, 0x7a, 0xff, 0xa0, 0x59, 0x97, 0x04, 0x74, - 0x05, 0x96, 0xf7, 0x76, 0x5e, 0x6f, 0x34, 0xd5, 0xda, 0xde, 0x4e, 0x7d, 0xbf, 0xa9, 0x56, 0x9b, - 0xcd, 0x6a, 0xed, 0x9e, 0x94, 0xdc, 0xfa, 0x67, 0x01, 0xc4, 0xea, 0x76, 0x6d, 0x07, 0xd5, 0x40, - 0xa4, 0x58, 0xcf, 0x85, 0x0f, 0x21, 0x2b, 0x17, 0x43, 0xf6, 0xe8, 0x2e, 0xa4, 0x29, 0x0c, 0x84, - 0x2e, 0x7e, 0x19, 0x59, 0x99, 0x82, 0xe1, 0x93, 0x8f, 0xa1, 0x3b, 0xf2, 0xc2, 0xa7, 0x92, 0x95, - 0x8b, 0x21, 0x7d, 0xb4, 0x07, 0x0b, 0x2e, 0x0a, 0x30, 0xed, 0xfd, 0x62, 0x65, 0x2a, 0xce, 0x4e, - 0xa6, 0xc6, 0xd0, 0x94, 0x8b, 0x5f, 0x51, 0x56, 0xa6, 0x80, 0xfd, 0x68, 0x07, 0x32, 0xbc, 0xde, - 0x9e, 0xf2, 0x30, 0xb2, 0x32, 0x0d, 0xbe, 0x47, 0x0a, 0xe4, 0x7c, 0x9c, 0x6a, 0xfa, 0xdb, 0xd0, - 0xca, 0x0c, 0xf7, 0x18, 0xe8, 0x1d, 0x28, 0x86, 0x6b, 0xf9, 0xd9, 0x1e, 0x5f, 0x56, 0x66, 0xbc, - 0x28, 0x20, 0xfa, 0xc3, 0x85, 0xfd, 0x6c, 0x8f, 0x31, 0x2b, 0x33, 0xde, 0x1b, 0xa0, 0xf7, 0x60, - 0x69, 0xb2, 0xf0, 0x9e, 0xfd, 0x6d, 0x66, 0x65, 0x8e, 0x9b, 0x04, 0xd4, 0x07, 0x14, 0x51, 0xb0, - 0xcf, 0xf1, 0x54, 0xb3, 0x32, 0xcf, 0xc5, 0x02, 0x6a, 0xc3, 0xe2, 0x78, 0x15, 0x3c, 0xeb, 0xd3, - 0xcd, 0xca, 0xcc, 0x97, 0x0c, 0x6c, 0x94, 0x70, 0xf5, 0x3c, 0xeb, 0x53, 0xce, 0xca, 0xcc, 0x77, - 0x0e, 0xe8, 0x18, 0x20, 0x50, 0x00, 0xcf, 0xf0, 0xb4, 0xb3, 0x32, 0xcb, 0xed, 0x03, 0x32, 0x61, - 0x39, 0xaa, 0x32, 0x9e, 0xe7, 0xa5, 0x67, 0x65, 0xae, 0x4b, 0x09, 0xe2, 0xcf, 0xe1, 0x1a, 0x77, - 0xb6, 0x97, 0x9f, 0x95, 0x19, 0x6f, 0x27, 0x90, 0x06, 0xa5, 0xb1, 0xba, 0x6e, 0xc6, 0x87, 0xa0, - 0x95, 0x59, 0x2f, 0x2b, 0x88, 0x1b, 0x47, 0x94, 0x6a, 0x73, 0xbc, 0x0b, 0xad, 0xcc, 0x73, 0x7d, - 0xb1, 0x5d, 0xfd, 0xfc, 0xab, 0x55, 0xe1, 0x8b, 0xaf, 0x56, 0x85, 0x7f, 0x7c, 0xb5, 0x2a, 0x7c, - 0xf2, 0xf5, 0x6a, 0xe2, 0x8b, 0xaf, 0x57, 0x13, 0x7f, 0xfb, 0x7a, 0x35, 0xf1, 0xe3, 0xa7, 0x3a, - 0xba, 0xd3, 0x1d, 0x9e, 0x6c, 0xb4, 0x8c, 0xfe, 0x66, 0xcb, 0xe8, 0x63, 0xe7, 0xe4, 0xd4, 0xf1, - 0x1b, 0xfe, 0x3f, 0x16, 0x4e, 0x32, 0x34, 0x27, 0xb8, 0xf9, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xce, 0xf1, 0xaf, 0xd9, 0xd1, 0x30, 0x00, 0x00, + // 3509 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0x4d, 0x70, 0x23, 0xc5, + 0xf5, 0xd7, 0xe8, 0xcb, 0xd2, 0xd3, 0x87, 0xc7, 0xed, 0x5d, 0xaf, 0xd0, 0x2e, 0xb6, 0x77, 0x28, + 0x60, 0x59, 0xc0, 0x06, 0xef, 0x7f, 0x81, 0xad, 0x85, 0x7f, 0xc5, 0xd6, 0x6a, 0x91, 0xbd, 0x8b, + 0x6d, 0xc6, 0xf2, 0x52, 0xe4, 0x83, 0x61, 0x24, 0xb5, 0xa5, 0x61, 0x25, 0xcd, 0x30, 0x33, 0x32, + 0x32, 0xa7, 0x54, 0x48, 0xaa, 0x52, 0x9c, 0xa8, 0xca, 0x85, 0x43, 0x38, 0xe4, 0x90, 0x4b, 0x0e, + 0x39, 0x27, 0x97, 0x9c, 0x72, 0xe0, 0x90, 0x03, 0xa7, 0x54, 0x4e, 0x24, 0x81, 0x1b, 0xd7, 0x1c, + 0x72, 0x4d, 0xf5, 0xc7, 0x7c, 0x6a, 0xc6, 0x92, 0x16, 0x72, 0x48, 0x25, 0xb7, 0xee, 0x37, 0xef, + 0xbd, 0x56, 0xbf, 0x7e, 0xdd, 0xef, 0xf5, 0xef, 0xb5, 0xe0, 0xb2, 0x8d, 0x87, 0x1d, 0x6c, 0x0e, + 0xb4, 0xa1, 0xbd, 0xa9, 0xb6, 0xda, 0xda, 0xa6, 0x7d, 0x66, 0x60, 0x6b, 0xc3, 0x30, 0x75, 0x5b, + 0x47, 0x8b, 0xde, 0xc7, 0x0d, 0xf2, 0xb1, 0xfa, 0xb8, 0x8f, 0xbb, 0x6d, 0x9e, 0x19, 0xb6, 0xbe, + 0x69, 0x98, 0xba, 0x7e, 0xc2, 0xf8, 0xab, 0x57, 0x26, 0x3f, 0x3f, 0xc4, 0x67, 0x5c, 0x5b, 0x40, + 0x98, 0x8e, 0xb2, 0x69, 0xa8, 0xa6, 0x3a, 0x70, 0x3e, 0xaf, 0x4f, 0x7c, 0x3e, 0x55, 0xfb, 0x5a, + 0x47, 0xb5, 0x75, 0x93, 0x73, 0xac, 0x75, 0x75, 0xbd, 0xdb, 0xc7, 0x9b, 0xb4, 0xd7, 0x1a, 0x9d, + 0x6c, 0xda, 0xda, 0x00, 0x5b, 0xb6, 0x3a, 0x30, 0x38, 0xc3, 0x85, 0xae, 0xde, 0xd5, 0x69, 0x73, + 0x93, 0xb4, 0x22, 0xc6, 0xd5, 0x4d, 0xb5, 0xdd, 0xc7, 0xfe, 0x49, 0x4a, 0x7f, 0x2e, 0xc0, 0x82, + 0x8c, 0xdf, 0x1f, 0x61, 0xcb, 0x46, 0x5b, 0x90, 0xc6, 0xed, 0x9e, 0x5e, 0x11, 0xd6, 0x85, 0x6b, + 0x85, 0xad, 0x2b, 0x1b, 0xa1, 0xf9, 0x6f, 0x70, 0xbe, 0x7a, 0xbb, 0xa7, 0x37, 0x12, 0x32, 0xe5, + 0x45, 0x37, 0x21, 0x73, 0xd2, 0x1f, 0x59, 0xbd, 0x4a, 0x92, 0x0a, 0x3d, 0x1e, 0x27, 0x74, 0x97, + 0x30, 0x35, 0x12, 0x32, 0xe3, 0x26, 0x43, 0x69, 0xc3, 0x13, 0xbd, 0x92, 0x3a, 0x7f, 0xa8, 0xdd, + 0xe1, 0x09, 0x1d, 0x8a, 0xf0, 0xa2, 0x1d, 0x00, 0x6d, 0xa8, 0xd9, 0x4a, 0xbb, 0xa7, 0x6a, 0xc3, + 0x4a, 0x86, 0x4a, 0x5e, 0x8d, 0x97, 0xd4, 0xec, 0x1a, 0x61, 0x6c, 0x24, 0xe4, 0xbc, 0xe6, 0x74, + 0xc8, 0xcf, 0x7d, 0x7f, 0x84, 0xcd, 0xb3, 0x4a, 0xf6, 0xfc, 0x9f, 0xfb, 0x26, 0x61, 0x22, 0x3f, + 0x97, 0x72, 0xa3, 0x57, 0x21, 0xd7, 0xee, 0xe1, 0xf6, 0x43, 0xc5, 0x1e, 0x57, 0x72, 0x54, 0x72, + 0x2d, 0x4e, 0xb2, 0x46, 0xf8, 0x9a, 0xe3, 0x46, 0x42, 0x5e, 0x68, 0xb3, 0x26, 0x7a, 0x05, 0xb2, + 0x6d, 0x7d, 0x30, 0xd0, 0xec, 0x4a, 0x81, 0xca, 0xae, 0xc6, 0xca, 0x52, 0xae, 0x46, 0x42, 0xe6, + 0xfc, 0x68, 0x1f, 0xca, 0x7d, 0xcd, 0xb2, 0x15, 0x6b, 0xa8, 0x1a, 0x56, 0x4f, 0xb7, 0xad, 0x4a, + 0x91, 0x6a, 0x78, 0x32, 0x4e, 0xc3, 0x7d, 0xcd, 0xb2, 0x8f, 0x1c, 0xe6, 0x46, 0x42, 0x2e, 0xf5, + 0xfd, 0x04, 0xa2, 0x4f, 0x3f, 0x39, 0xc1, 0xa6, 0xab, 0xb0, 0x52, 0x3a, 0x5f, 0xdf, 0x01, 0xe1, + 0x76, 0xe4, 0x89, 0x3e, 0xdd, 0x4f, 0x40, 0x3f, 0x80, 0xe5, 0xbe, 0xae, 0x76, 0x5c, 0x75, 0x4a, + 0xbb, 0x37, 0x1a, 0x3e, 0xac, 0x94, 0xa9, 0xd2, 0x67, 0x62, 0x7f, 0xa4, 0xae, 0x76, 0x1c, 0x15, + 0x35, 0x22, 0xd0, 0x48, 0xc8, 0x4b, 0xfd, 0x30, 0x11, 0xbd, 0x03, 0x17, 0x54, 0xc3, 0xe8, 0x9f, + 0x85, 0xb5, 0x2f, 0x52, 0xed, 0xd7, 0xe3, 0xb4, 0x6f, 0x13, 0x99, 0xb0, 0x7a, 0xa4, 0x4e, 0x50, + 0x51, 0x13, 0x44, 0xc3, 0xc4, 0x86, 0x6a, 0x62, 0xc5, 0x30, 0x75, 0x43, 0xb7, 0xd4, 0x7e, 0x45, + 0xa4, 0xba, 0x9f, 0x8e, 0xd3, 0x7d, 0xc8, 0xf8, 0x0f, 0x39, 0x7b, 0x23, 0x21, 0x2f, 0x1a, 0x41, + 0x12, 0xd3, 0xaa, 0xb7, 0xb1, 0x65, 0x79, 0x5a, 0x97, 0xa6, 0x69, 0xa5, 0xfc, 0x41, 0xad, 0x01, + 0x12, 0xaa, 0x43, 0x01, 0x8f, 0x89, 0xb8, 0x72, 0xaa, 0xdb, 0xb8, 0x82, 0xa8, 0x42, 0x29, 0x76, + 0x87, 0x52, 0xd6, 0x07, 0xba, 0x8d, 0x1b, 0x09, 0x19, 0xb0, 0xdb, 0x43, 0x2a, 0x5c, 0x3c, 0xc5, + 0xa6, 0x76, 0x72, 0x46, 0xd5, 0x28, 0xf4, 0x8b, 0xa5, 0xe9, 0xc3, 0xca, 0x32, 0x55, 0xf8, 0x6c, + 0x9c, 0xc2, 0x07, 0x54, 0x88, 0xa8, 0xa8, 0x3b, 0x22, 0x8d, 0x84, 0xbc, 0x7c, 0x3a, 0x49, 0x26, + 0x2e, 0x76, 0xa2, 0x0d, 0xd5, 0xbe, 0xf6, 0x21, 0x56, 0x5a, 0x7d, 0xbd, 0xfd, 0xb0, 0x72, 0xe1, + 0x7c, 0x17, 0xbb, 0xcb, 0xb9, 0x77, 0x08, 0x33, 0x71, 0xb1, 0x13, 0x3f, 0x01, 0xc9, 0x20, 0x5a, + 0x5a, 0x77, 0xa8, 0x74, 0x75, 0xcb, 0xd2, 0x0c, 0x36, 0xfd, 0x8b, 0x54, 0xe3, 0x53, 0x71, 0x1a, + 0x8f, 0xb4, 0xee, 0xf0, 0x75, 0xca, 0xce, 0x4d, 0x50, 0xb6, 0x02, 0x14, 0xe2, 0x59, 0xce, 0xca, + 0xb3, 0x23, 0x91, 0xaa, 0xb5, 0x2a, 0x2b, 0xe7, 0x7b, 0x16, 0x5f, 0xfd, 0x03, 0x2a, 0x42, 0x14, + 0x91, 0x1d, 0x86, 0x8c, 0x09, 0x2a, 0x35, 0x33, 0x3b, 0xbd, 0x43, 0x03, 0x5c, 0x9a, 0x62, 0x66, + 0x2e, 0x14, 0x1c, 0x61, 0xf9, 0x74, 0x92, 0xbc, 0xb3, 0x00, 0x99, 0x53, 0xb5, 0x3f, 0xc2, 0x7b, + 0xe9, 0x5c, 0x5a, 0xcc, 0xec, 0xa5, 0x73, 0x0b, 0x62, 0x6e, 0x2f, 0x9d, 0xcb, 0x8b, 0xb0, 0x97, + 0xce, 0x81, 0x58, 0x90, 0x9e, 0x86, 0x82, 0xef, 0xbc, 0x46, 0x15, 0x58, 0x18, 0x60, 0xcb, 0x52, + 0xbb, 0x98, 0x1e, 0xef, 0x79, 0xd9, 0xe9, 0x4a, 0x65, 0x28, 0xfa, 0xcf, 0x68, 0xe9, 0x13, 0xc1, + 0x95, 0x24, 0xc7, 0x2f, 0x91, 0x3c, 0xc5, 0x26, 0xf5, 0x12, 0x2e, 0xc9, 0xbb, 0xe8, 0x09, 0x28, + 0xd1, 0x15, 0x56, 0x9c, 0xef, 0x24, 0x06, 0xa4, 0xe5, 0x22, 0x25, 0x3e, 0xe0, 0x4c, 0x6b, 0x50, + 0x30, 0xb6, 0x0c, 0x97, 0x25, 0x45, 0x59, 0xc0, 0xd8, 0x32, 0x1c, 0x86, 0xab, 0x50, 0x24, 0x36, + 0x70, 0x39, 0xd2, 0x74, 0x90, 0x02, 0xa1, 0x71, 0x16, 0xe9, 0x4f, 0x49, 0x10, 0xc3, 0xe7, 0x3a, + 0x7a, 0x05, 0xd2, 0x24, 0x02, 0xf2, 0x68, 0x55, 0xdd, 0x60, 0xe1, 0x71, 0xc3, 0x09, 0x8f, 0x1b, + 0x4d, 0x27, 0x3c, 0xee, 0xe4, 0x3e, 0xff, 0x72, 0x2d, 0xf1, 0xc9, 0x5f, 0xd7, 0x04, 0x99, 0x4a, + 0xa0, 0xc7, 0xc8, 0x69, 0xae, 0x6a, 0x43, 0x45, 0xeb, 0xd0, 0x9f, 0x9c, 0x27, 0x47, 0xb5, 0xaa, + 0x0d, 0x77, 0x3b, 0xe8, 0x3e, 0x88, 0x6d, 0x7d, 0x68, 0xe1, 0xa1, 0x35, 0xb2, 0x14, 0x16, 0xa0, + 0x79, 0x8c, 0x0a, 0x44, 0x1a, 0x16, 0x41, 0x6b, 0x0e, 0xe7, 0x21, 0x65, 0x94, 0x17, 0xdb, 0x41, + 0x02, 0xba, 0x0b, 0xe0, 0x46, 0x71, 0xab, 0x92, 0x5e, 0x4f, 0x5d, 0x2b, 0x6c, 0xad, 0x4f, 0x2c, + 0xfe, 0x03, 0x87, 0xe5, 0xd8, 0x20, 0xab, 0xbc, 0x93, 0x26, 0x3f, 0x57, 0xf6, 0x49, 0xa2, 0xa7, + 0x60, 0x51, 0x35, 0x0c, 0xc5, 0xb2, 0x89, 0x43, 0xb5, 0xce, 0x88, 0x27, 0x91, 0xf0, 0x57, 0x94, + 0x4b, 0xaa, 0x61, 0x1c, 0x11, 0xea, 0x0e, 0x21, 0xa2, 0x27, 0xa1, 0x4c, 0x42, 0x9d, 0xa6, 0xf6, + 0x95, 0x1e, 0xd6, 0xba, 0x3d, 0x9b, 0x86, 0xb9, 0x94, 0x5c, 0xe2, 0xd4, 0x06, 0x25, 0x4a, 0x1d, + 0x77, 0xc5, 0x69, 0x98, 0x43, 0x08, 0xd2, 0x1d, 0xd5, 0x56, 0xa9, 0x25, 0x8b, 0x32, 0x6d, 0x13, + 0x9a, 0xa1, 0xda, 0x3d, 0x6e, 0x1f, 0xda, 0x46, 0x2b, 0x90, 0xe5, 0x6a, 0x53, 0x54, 0x2d, 0xef, + 0xa1, 0x0b, 0x90, 0x31, 0x4c, 0xfd, 0x14, 0xd3, 0xa5, 0xcb, 0xc9, 0xac, 0x23, 0xc9, 0x50, 0x0e, + 0x86, 0x44, 0x54, 0x86, 0xa4, 0x3d, 0xe6, 0xa3, 0x24, 0xed, 0x31, 0x7a, 0x01, 0xd2, 0xc4, 0x90, + 0x74, 0x8c, 0x72, 0x44, 0x12, 0xc0, 0xe5, 0x9a, 0x67, 0x06, 0x96, 0x29, 0xa7, 0xb4, 0x08, 0xa5, + 0x40, 0xa8, 0x94, 0x56, 0xe0, 0x42, 0x54, 0xe4, 0x93, 0x7a, 0x2e, 0x3d, 0x10, 0xc1, 0xd0, 0x4d, + 0xc8, 0xb9, 0xa1, 0x8f, 0x39, 0xce, 0x63, 0x13, 0xc3, 0x3a, 0xcc, 0xb2, 0xcb, 0x4a, 0x3c, 0x86, + 0x2c, 0x40, 0x4f, 0xe5, 0x89, 0x4e, 0x51, 0x5e, 0x50, 0x0d, 0xa3, 0xa1, 0x5a, 0x3d, 0xe9, 0x5d, + 0xa8, 0xc4, 0x85, 0x35, 0x9f, 0xc1, 0x04, 0xea, 0xf6, 0x8e, 0xc1, 0x56, 0x20, 0x7b, 0xa2, 0x9b, + 0x03, 0xd5, 0xa6, 0xca, 0x4a, 0x32, 0xef, 0x11, 0x43, 0xb2, 0x10, 0x97, 0xa2, 0x64, 0xd6, 0x91, + 0x14, 0x78, 0x2c, 0x36, 0xb4, 0x11, 0x11, 0x6d, 0xd8, 0xc1, 0xcc, 0xac, 0x25, 0x99, 0x75, 0x3c, + 0x45, 0xec, 0xc7, 0xb2, 0x0e, 0x19, 0xd6, 0xa2, 0x73, 0xa5, 0xfa, 0xf3, 0x32, 0xef, 0x49, 0x9f, + 0xa6, 0x60, 0x25, 0x3a, 0xc0, 0xa1, 0x75, 0x28, 0x0e, 0xd4, 0xb1, 0x62, 0x8f, 0xb9, 0xdb, 0x09, + 0x74, 0xe1, 0x61, 0xa0, 0x8e, 0x9b, 0x63, 0xe6, 0x73, 0x22, 0xa4, 0xec, 0xb1, 0x55, 0x49, 0xae, + 0xa7, 0xae, 0x15, 0x65, 0xd2, 0x44, 0xc7, 0xb0, 0xd4, 0xd7, 0xdb, 0x6a, 0x5f, 0xe9, 0xab, 0x96, + 0xad, 0xf0, 0xcc, 0x87, 0x6d, 0xa2, 0x27, 0x26, 0x8c, 0xcd, 0x42, 0x15, 0xee, 0xb0, 0xf5, 0x24, + 0x07, 0x0e, 0xf7, 0xff, 0x45, 0xaa, 0xe3, 0xbe, 0xea, 0x2c, 0x35, 0xba, 0x03, 0x85, 0x81, 0x66, + 0xb5, 0x70, 0x4f, 0x3d, 0xd5, 0x74, 0x93, 0xef, 0xa6, 0x49, 0xa7, 0x79, 0xc3, 0xe3, 0xe1, 0x9a, + 0xfc, 0x62, 0xbe, 0x25, 0xc9, 0x04, 0x7c, 0xd8, 0x39, 0x4d, 0xb2, 0x73, 0x9f, 0x26, 0x2f, 0xc0, + 0x85, 0x21, 0x1e, 0xdb, 0x8a, 0xb7, 0x5f, 0x99, 0x9f, 0x2c, 0x50, 0xd3, 0x23, 0xf2, 0xcd, 0xdd, + 0xe1, 0x16, 0x71, 0x19, 0xf4, 0x0c, 0x4d, 0x11, 0x0c, 0xdd, 0xc2, 0xa6, 0xa2, 0x76, 0x3a, 0x26, + 0xb6, 0x2c, 0x9a, 0x55, 0x16, 0x69, 0xdc, 0xa7, 0xf4, 0x6d, 0x46, 0x96, 0x7e, 0xee, 0x5f, 0x9a, + 0x60, 0x4a, 0xc0, 0x0d, 0x2f, 0x78, 0x86, 0x3f, 0x22, 0x61, 0x8d, 0xca, 0x77, 0x02, 0xb6, 0x67, + 0xa9, 0xf9, 0xe5, 0xc9, 0xfd, 0x15, 0xb6, 0x39, 0x72, 0xc4, 0xe3, 0xcd, 0x9e, 0x7a, 0x34, 0xb3, + 0x23, 0x48, 0x53, 0xa3, 0xa4, 0xd9, 0x11, 0x43, 0xda, 0xff, 0x69, 0x4b, 0xf1, 0x51, 0x0a, 0x96, + 0x26, 0xf2, 0x2b, 0x77, 0x62, 0x42, 0xe4, 0xc4, 0x92, 0x91, 0x13, 0x4b, 0xcd, 0x3d, 0x31, 0xbe, + 0xd6, 0xe9, 0xe9, 0x6b, 0x9d, 0xf9, 0x0e, 0xd7, 0x3a, 0xfb, 0x68, 0x6b, 0xfd, 0x6f, 0x5d, 0x85, + 0x5f, 0x0a, 0x50, 0x8d, 0x4f, 0x4a, 0x23, 0x97, 0xe3, 0x59, 0x58, 0x72, 0x7f, 0x8a, 0xab, 0x9e, + 0x1d, 0x8c, 0xa2, 0xfb, 0x81, 0xeb, 0x8f, 0x8d, 0x71, 0x4f, 0x42, 0x39, 0x94, 0x32, 0x33, 0x57, + 0x2e, 0x9d, 0xfa, 0xc7, 0x97, 0x7e, 0x9a, 0x72, 0x03, 0x4f, 0x20, 0xaf, 0x8d, 0xd8, 0xad, 0x6f, + 0xc2, 0x72, 0x07, 0xb7, 0xb5, 0xce, 0xa3, 0x6e, 0xd6, 0x25, 0x2e, 0xfd, 0xbf, 0xbd, 0x1a, 0xe9, + 0x25, 0x17, 0x23, 0x2f, 0x03, 0x91, 0x4a, 0x84, 0x48, 0x25, 0xe8, 0x7b, 0x50, 0xf4, 0x5d, 0x3a, + 0x58, 0x88, 0x0b, 0x41, 0x06, 0x2c, 0xb9, 0xdf, 0xf0, 0xf4, 0xcb, 0x85, 0xae, 0xdb, 0x8e, 0x75, + 0x26, 0xe9, 0xb2, 0x1b, 0xd1, 0x27, 0xaf, 0x14, 0xd2, 0x2d, 0xcf, 0xc1, 0x27, 0xf3, 0x7e, 0x74, + 0x19, 0xf2, 0xfc, 0x46, 0xe1, 0xa6, 0x52, 0x39, 0x46, 0x68, 0x8e, 0xa5, 0xdf, 0x16, 0x21, 0x27, + 0x63, 0xcb, 0x20, 0x69, 0x28, 0xda, 0x81, 0x3c, 0x1e, 0xb7, 0xb1, 0x61, 0x3b, 0x99, 0x7b, 0xf4, + 0x85, 0x91, 0x71, 0xd7, 0x1d, 0xce, 0x46, 0x42, 0xf6, 0xc4, 0xd0, 0x0d, 0x8e, 0x08, 0xc5, 0x83, + 0x3b, 0x5c, 0xdc, 0x0f, 0x09, 0xbd, 0xe4, 0x40, 0x42, 0xa9, 0x58, 0xb4, 0x83, 0x49, 0x85, 0x30, + 0xa1, 0x1b, 0x1c, 0x13, 0x4a, 0x4f, 0x19, 0x2c, 0x00, 0x0a, 0xd5, 0x02, 0xa0, 0x50, 0x76, 0xca, + 0x34, 0x63, 0x50, 0xa1, 0x97, 0x1c, 0x54, 0x68, 0x61, 0xca, 0x2f, 0x0e, 0xc1, 0x42, 0xaf, 0xf9, + 0x60, 0xa1, 0x3c, 0x15, 0x5d, 0x8f, 0x15, 0x8d, 0xc0, 0x85, 0x6e, 0xb9, 0xb8, 0x50, 0x31, 0x16, + 0x53, 0xe2, 0xc2, 0x61, 0x60, 0xe8, 0x60, 0x02, 0x18, 0x2a, 0xc5, 0xde, 0x89, 0x99, 0x8a, 0x29, + 0xc8, 0xd0, 0xc1, 0x04, 0x32, 0x54, 0x9e, 0xa2, 0x70, 0x0a, 0x34, 0xf4, 0xc3, 0x68, 0x68, 0x28, + 0x1e, 0xbc, 0xe1, 0x3f, 0x73, 0x36, 0x6c, 0x48, 0x89, 0xc1, 0x86, 0xc4, 0xd8, 0x0b, 0x36, 0x53, + 0x3f, 0x33, 0x38, 0x74, 0x1c, 0x01, 0x0e, 0x31, 0x18, 0xe7, 0x5a, 0xac, 0xf2, 0x19, 0xd0, 0xa1, + 0xe3, 0x08, 0x74, 0x08, 0x4d, 0x55, 0x3b, 0x15, 0x1e, 0xba, 0x1b, 0x84, 0x87, 0x96, 0x63, 0x92, + 0x6d, 0x6f, 0xb7, 0xc7, 0xe0, 0x43, 0xad, 0x38, 0x7c, 0x88, 0x61, 0x38, 0xcf, 0xc5, 0x6a, 0x9c, + 0x03, 0x20, 0x3a, 0x98, 0x00, 0x88, 0x2e, 0x4e, 0xf1, 0xb4, 0x29, 0x08, 0xd1, 0x51, 0x04, 0x42, + 0xb4, 0x12, 0x8b, 0xb8, 0x31, 0x95, 0x53, 0x21, 0x22, 0x25, 0x06, 0x22, 0xba, 0x34, 0xc5, 0xc1, + 0x66, 0xc6, 0x88, 0x5a, 0x71, 0x18, 0x51, 0x65, 0x9a, 0xa9, 0x1f, 0x09, 0x24, 0xca, 0x88, 0xd9, + 0xbd, 0x74, 0x2e, 0x27, 0xe6, 0x19, 0x3c, 0xb4, 0x97, 0xce, 0x15, 0xc4, 0xa2, 0xf4, 0x0c, 0x49, + 0x69, 0x43, 0x11, 0x80, 0x5c, 0x1e, 0xb1, 0x69, 0xea, 0x26, 0x87, 0x7b, 0x58, 0x47, 0xba, 0x06, + 0x45, 0xff, 0x69, 0x7f, 0x0e, 0xa0, 0x44, 0x2f, 0xe9, 0xbe, 0x13, 0x5e, 0xfa, 0x9d, 0xe0, 0xc9, + 0x52, 0x48, 0xc9, 0x0f, 0x38, 0xe4, 0x39, 0xe0, 0xe0, 0x83, 0x99, 0x92, 0x41, 0x98, 0x69, 0x0d, + 0x0a, 0xe4, 0xf2, 0x1d, 0x42, 0x90, 0x54, 0xc3, 0x45, 0x90, 0xae, 0xc3, 0x12, 0xcd, 0xa0, 0x18, + 0x18, 0xc5, 0x23, 0x6e, 0x9a, 0x46, 0xdc, 0x45, 0xf2, 0x81, 0xf9, 0x0d, 0x4b, 0x58, 0x9e, 0x87, + 0x65, 0x1f, 0xaf, 0x7b, 0xa9, 0x67, 0x70, 0x8a, 0xe8, 0x72, 0x6f, 0xf3, 0xdb, 0xfd, 0x1f, 0x05, + 0xcf, 0x42, 0x1e, 0xf4, 0x14, 0x85, 0x12, 0x09, 0xdf, 0x11, 0x4a, 0x94, 0x7c, 0x64, 0x94, 0xc8, + 0x0f, 0x52, 0xa4, 0x82, 0x20, 0xc5, 0x3f, 0x05, 0x6f, 0x4d, 0x5c, 0xcc, 0xa7, 0xad, 0x77, 0x30, + 0x87, 0x0d, 0x68, 0x9b, 0xe4, 0xa8, 0x7d, 0xbd, 0xcb, 0xc1, 0x01, 0xd2, 0x24, 0x5c, 0x6e, 0x48, + 0xce, 0xf3, 0x88, 0xeb, 0x22, 0x0e, 0x2c, 0x13, 0xe4, 0x88, 0x83, 0x08, 0xa9, 0x87, 0x98, 0x95, + 0x55, 0x8a, 0x32, 0x69, 0x12, 0x3e, 0xea, 0x7c, 0x3c, 0xa3, 0x63, 0x1d, 0xf4, 0x0a, 0xe4, 0x69, + 0xcd, 0x4c, 0xd1, 0x0d, 0x8b, 0x97, 0x52, 0x02, 0xb9, 0x2e, 0x2b, 0x9c, 0x6d, 0x1c, 0x12, 0x9e, + 0x03, 0xc3, 0x92, 0x73, 0x06, 0x6f, 0xf9, 0x92, 0xa9, 0x7c, 0x20, 0x05, 0xbd, 0x02, 0x79, 0xf2, + 0xeb, 0x2d, 0x43, 0x6d, 0xe3, 0x0a, 0xd0, 0x1f, 0xea, 0x11, 0xa4, 0xdf, 0x24, 0x61, 0x31, 0x14, + 0x82, 0x23, 0xe7, 0xee, 0xb8, 0x64, 0xd2, 0x87, 0x81, 0xcd, 0x66, 0x8f, 0x55, 0x80, 0xae, 0x6a, + 0x29, 0x1f, 0xa8, 0x43, 0x1b, 0x77, 0xb8, 0x51, 0x7c, 0x14, 0x54, 0x85, 0x1c, 0xe9, 0x8d, 0x2c, + 0xdc, 0xe1, 0x70, 0x9c, 0xdb, 0x47, 0x0d, 0xc8, 0xe2, 0x53, 0x3c, 0xb4, 0xad, 0xca, 0x02, 0x5d, + 0xf6, 0x95, 0x49, 0x7c, 0x84, 0x7c, 0xde, 0xa9, 0x90, 0xc5, 0xfe, 0xe6, 0xcb, 0x35, 0x91, 0x71, + 0x3f, 0xa7, 0x0f, 0x34, 0x1b, 0x0f, 0x0c, 0xfb, 0x4c, 0xe6, 0xf2, 0x41, 0x2b, 0xe4, 0x42, 0x56, + 0xa0, 0xc0, 0x70, 0xd1, 0xc1, 0x7b, 0x88, 0x4d, 0x35, 0xdd, 0xd4, 0xec, 0x33, 0xb9, 0x34, 0xc0, + 0x03, 0x43, 0xd7, 0xfb, 0x0a, 0xdb, 0xe3, 0xdb, 0x50, 0x0e, 0x66, 0x1c, 0xe8, 0x09, 0x28, 0x99, + 0xd8, 0x56, 0xb5, 0xa1, 0x12, 0x48, 0x64, 0x8b, 0x8c, 0xc8, 0xf6, 0xd4, 0x5e, 0x3a, 0x27, 0x88, + 0xc9, 0xbd, 0x74, 0x2e, 0x29, 0xa6, 0xa4, 0x43, 0x92, 0x78, 0x47, 0x64, 0x1c, 0xe8, 0x65, 0xc8, + 0x7b, 0xc9, 0x8a, 0x40, 0x67, 0x7b, 0x0e, 0xf4, 0xe6, 0xf1, 0x4a, 0x7f, 0x10, 0x3c, 0x95, 0x41, + 0x30, 0xaf, 0x0e, 0x59, 0x13, 0x5b, 0xa3, 0x3e, 0x83, 0xd7, 0xca, 0x5b, 0xcf, 0xcf, 0x96, 0xab, + 0x10, 0xea, 0xa8, 0x6f, 0xcb, 0x5c, 0x58, 0x7a, 0x07, 0xb2, 0x8c, 0x82, 0x0a, 0xb0, 0x70, 0xbc, + 0x7f, 0x6f, 0xff, 0xe0, 0xad, 0x7d, 0x31, 0x81, 0x00, 0xb2, 0xdb, 0xb5, 0x5a, 0xfd, 0xb0, 0x29, + 0x0a, 0x28, 0x0f, 0x99, 0xed, 0x9d, 0x03, 0xb9, 0x29, 0x26, 0x09, 0x59, 0xae, 0xef, 0xd5, 0x6b, + 0x4d, 0x31, 0x85, 0x96, 0xa0, 0xc4, 0xda, 0xca, 0xdd, 0x03, 0xf9, 0x8d, 0xed, 0xa6, 0x98, 0xf6, + 0x91, 0x8e, 0xea, 0xfb, 0x77, 0xea, 0xb2, 0x98, 0x91, 0x5e, 0x24, 0xd9, 0x7e, 0x4c, 0x76, 0xe3, + 0x21, 0x75, 0x82, 0x0f, 0xa9, 0x93, 0x3e, 0x4d, 0x92, 0x4b, 0x40, 0x5c, 0xca, 0x82, 0xf6, 0x42, + 0x13, 0xdf, 0x9a, 0x23, 0xdf, 0x09, 0xcd, 0x9e, 0x5c, 0x6c, 0x4d, 0x7c, 0x82, 0xed, 0x76, 0x8f, + 0xa5, 0x50, 0xec, 0x04, 0x2a, 0xc9, 0x25, 0x4e, 0xa5, 0x42, 0x16, 0x63, 0x7b, 0x0f, 0xb7, 0x6d, + 0x85, 0x39, 0x91, 0x45, 0x6f, 0x97, 0x79, 0xc2, 0x46, 0xa8, 0x47, 0x8c, 0x28, 0xbd, 0x3b, 0x97, + 0x2d, 0xf3, 0x90, 0x91, 0xeb, 0x4d, 0xf9, 0x6d, 0x31, 0x85, 0x10, 0x94, 0x69, 0x53, 0x39, 0xda, + 0xdf, 0x3e, 0x3c, 0x6a, 0x1c, 0x10, 0x5b, 0x2e, 0xc3, 0xa2, 0x63, 0x4b, 0x87, 0x98, 0x91, 0x9e, + 0x85, 0x4b, 0x31, 0xf9, 0xd6, 0xe4, 0x1d, 0x5b, 0xfa, 0x95, 0xe0, 0xe7, 0x0e, 0xe6, 0x4c, 0x07, + 0x90, 0xb5, 0x6c, 0xd5, 0x1e, 0x59, 0xdc, 0x88, 0x2f, 0xcf, 0x9a, 0x80, 0x6d, 0x38, 0x8d, 0x23, + 0x2a, 0x2e, 0x73, 0x35, 0xd2, 0x4d, 0x28, 0x07, 0xbf, 0xc4, 0xdb, 0xc0, 0x73, 0xa2, 0xa4, 0x74, + 0x1b, 0xd0, 0x64, 0x5e, 0x16, 0x81, 0x37, 0x08, 0x51, 0x78, 0xc3, 0xaf, 0x05, 0xb8, 0x7c, 0x4e, + 0x0e, 0x86, 0xde, 0x0c, 0x4d, 0xf2, 0xd6, 0x3c, 0x19, 0xdc, 0x06, 0xa3, 0x85, 0xa6, 0x79, 0x03, + 0x8a, 0x7e, 0xfa, 0x6c, 0x93, 0xfc, 0x26, 0xe9, 0x6d, 0xe2, 0x20, 0x30, 0xe2, 0x1d, 0x81, 0xc2, + 0xb7, 0x3c, 0x02, 0x5f, 0x05, 0xb0, 0xc7, 0x0a, 0x73, 0xeb, 0xc8, 0xdb, 0x3a, 0x07, 0x9c, 0x71, + 0xbb, 0x39, 0xe6, 0x9b, 0x20, 0x6f, 0xf3, 0x96, 0x85, 0x8e, 0xfc, 0x28, 0xd1, 0x88, 0xc6, 0x58, + 0x8b, 0x23, 0x28, 0xb3, 0x06, 0x63, 0x0f, 0x4d, 0x62, 0x64, 0x0b, 0xbd, 0x0d, 0x97, 0x42, 0x89, + 0x82, 0xab, 0x3a, 0x3d, 0x6b, 0xbe, 0x70, 0x31, 0x98, 0x2f, 0x38, 0xaa, 0xfd, 0xd1, 0x3e, 0x13, + 0x8c, 0xf6, 0x2f, 0xc3, 0x4a, 0x74, 0x9e, 0x8b, 0x1e, 0x07, 0xc0, 0x43, 0x12, 0x16, 0x3a, 0x1e, + 0x7c, 0x90, 0xe7, 0x94, 0xe6, 0x58, 0x3a, 0x86, 0x34, 0x65, 0xf3, 0x40, 0x06, 0xad, 0xc3, 0x93, + 0x34, 0x0e, 0x32, 0xec, 0x76, 0x48, 0xa4, 0x71, 0x5f, 0x9e, 0x70, 0x80, 0xd3, 0x23, 0xb8, 0x71, + 0x34, 0xe5, 0xa5, 0x76, 0xd2, 0x81, 0x77, 0x98, 0x4d, 0xa6, 0xc7, 0xe8, 0x45, 0xc8, 0xb0, 0xc4, + 0x97, 0xad, 0xff, 0xc5, 0x49, 0x63, 0xeb, 0xae, 0x85, 0x19, 0xa7, 0xf4, 0x7b, 0xbf, 0xd7, 0x47, + 0x80, 0x24, 0xd7, 0x61, 0xc9, 0x99, 0x66, 0x18, 0x2c, 0x59, 0xe4, 0x1f, 0x0e, 0x38, 0x66, 0x82, + 0xee, 0xb9, 0x3b, 0x84, 0x95, 0xa1, 0x6e, 0xcc, 0x93, 0x78, 0x6f, 0x84, 0xf6, 0xc6, 0x55, 0xc8, + 0x7a, 0xbb, 0xc2, 0x30, 0xb1, 0x85, 0x87, 0x36, 0xdb, 0x15, 0x6a, 0x8b, 0xb6, 0x05, 0xe9, 0x6d, + 0x00, 0x0f, 0xca, 0x23, 0xc7, 0xbf, 0xa9, 0x8f, 0x86, 0xcc, 0xca, 0x19, 0x99, 0x75, 0xd0, 0x4d, + 0xc7, 0x24, 0xc9, 0x98, 0x38, 0x49, 0x06, 0xf7, 0x41, 0x81, 0xdc, 0x2c, 0x1a, 0xa0, 0xc9, 0x72, + 0x4a, 0xcc, 0x10, 0xaf, 0x05, 0x87, 0xb8, 0x1a, 0x5b, 0x98, 0x89, 0x1e, 0xea, 0x43, 0xc8, 0xd0, + 0x6d, 0x49, 0xd6, 0x9b, 0xd6, 0xf0, 0x78, 0x2a, 0x4f, 0xda, 0xe8, 0x47, 0x00, 0xaa, 0x6d, 0x9b, + 0x5a, 0x6b, 0xe4, 0x0d, 0xb0, 0x16, 0xbd, 0xad, 0xb7, 0x1d, 0xbe, 0x9d, 0x2b, 0x7c, 0x7f, 0x5f, + 0xf0, 0x44, 0x7d, 0x7b, 0xdc, 0xa7, 0x50, 0xda, 0x87, 0x72, 0x50, 0xd6, 0x49, 0x3e, 0xd9, 0x6f, + 0x08, 0x26, 0x9f, 0xec, 0x2e, 0xc1, 0x93, 0x4f, 0x37, 0x75, 0x4d, 0xb1, 0x42, 0x25, 0xed, 0x48, + 0x3f, 0x4e, 0x42, 0xd1, 0x7f, 0x2a, 0xfc, 0xf7, 0xe5, 0x87, 0xd2, 0xcf, 0x04, 0xc8, 0xb9, 0xd3, + 0x0f, 0x56, 0x2d, 0x03, 0x65, 0x5e, 0x66, 0xbd, 0xa4, 0xbf, 0xd4, 0xc8, 0x8a, 0xba, 0x29, 0xb7, + 0xa8, 0x7b, 0xdb, 0xcd, 0x4d, 0xe2, 0x70, 0x3c, 0xbf, 0xad, 0xb9, 0x57, 0x39, 0xa9, 0xd8, 0x6d, + 0xc8, 0xbb, 0x47, 0x2b, 0xb9, 0x11, 0x06, 0x11, 0x5a, 0xa7, 0x4b, 0x0b, 0xce, 0xfa, 0x07, 0xbc, + 0x8e, 0x99, 0x92, 0x59, 0x47, 0xea, 0xc0, 0x62, 0xe8, 0x5c, 0x46, 0xb7, 0x61, 0xc1, 0x18, 0xb5, + 0x14, 0xc7, 0x39, 0x42, 0x60, 0xb8, 0x73, 0xd7, 0x18, 0xb5, 0xfa, 0x5a, 0xfb, 0x1e, 0x3e, 0x73, + 0x7e, 0x8c, 0x31, 0x6a, 0xdd, 0x63, 0x3e, 0xc4, 0x46, 0x49, 0xfa, 0x47, 0xf9, 0x85, 0x00, 0x39, + 0x67, 0x4f, 0xa0, 0xff, 0x87, 0xbc, 0x7b, 0xe6, 0xbb, 0x0f, 0x11, 0x62, 0x83, 0x05, 0xd7, 0xef, + 0x89, 0xa0, 0x6d, 0xe7, 0x05, 0x85, 0xd6, 0x51, 0x4e, 0xfa, 0x2a, 0xf3, 0xa5, 0x72, 0xd0, 0x66, + 0x2c, 0x2a, 0xd0, 0x60, 0xb9, 0x7b, 0xe7, 0x6e, 0x5f, 0xed, 0xca, 0x05, 0x2a, 0xb3, 0xdb, 0x21, + 0x1d, 0x9e, 0x76, 0xff, 0x43, 0x00, 0x31, 0xbc, 0x63, 0xbf, 0xf5, 0xaf, 0x9b, 0xcc, 0x41, 0x52, + 0x11, 0x39, 0x08, 0xda, 0x84, 0x65, 0x97, 0x43, 0xb1, 0xb4, 0xee, 0x50, 0xb5, 0x47, 0x26, 0xe6, + 0xe5, 0x03, 0xe4, 0x7e, 0x3a, 0x72, 0xbe, 0x4c, 0xce, 0x3a, 0xf3, 0x88, 0xb3, 0xfe, 0x28, 0x09, + 0x05, 0x5f, 0x31, 0x03, 0xfd, 0x9f, 0xef, 0x30, 0x2a, 0x47, 0x84, 0x6d, 0x1f, 0xaf, 0xf7, 0xa8, + 0x20, 0x68, 0xa6, 0xe4, 0xfc, 0x66, 0x8a, 0x2b, 0x19, 0x39, 0xb5, 0x91, 0xf4, 0xdc, 0xb5, 0x91, + 0xe7, 0x00, 0xd9, 0xba, 0xad, 0xf6, 0x95, 0x53, 0xdd, 0xd6, 0x86, 0x5d, 0x85, 0xb9, 0x21, 0x3b, + 0x3a, 0x44, 0xfa, 0xe5, 0x01, 0xfd, 0x70, 0x48, 0x3d, 0xf2, 0x27, 0x02, 0xe4, 0xdc, 0x3b, 0xd1, + 0xbc, 0x4f, 0x0e, 0x56, 0x20, 0xcb, 0xd3, 0x7e, 0xf6, 0xe6, 0x80, 0xf7, 0x22, 0x8b, 0x40, 0x55, + 0xc8, 0x0d, 0xb0, 0xad, 0xd2, 0x73, 0x90, 0xa5, 0x1c, 0x6e, 0xff, 0xfa, 0x2d, 0x28, 0xf8, 0x9e, + 0x6b, 0x90, 0xa3, 0x71, 0xbf, 0xfe, 0x96, 0x98, 0xa8, 0x2e, 0x7c, 0xfc, 0xd9, 0x7a, 0x6a, 0x1f, + 0x7f, 0x40, 0x76, 0xb3, 0x5c, 0xaf, 0x35, 0xea, 0xb5, 0x7b, 0xa2, 0x50, 0x2d, 0x7c, 0xfc, 0xd9, + 0xfa, 0x82, 0x8c, 0x29, 0x10, 0x7e, 0xfd, 0x1e, 0x2c, 0x86, 0x16, 0x26, 0x98, 0x53, 0x22, 0x28, + 0xdf, 0x39, 0x3e, 0xbc, 0xbf, 0x5b, 0xdb, 0x6e, 0xd6, 0x95, 0x07, 0x07, 0xcd, 0xba, 0x28, 0xa0, + 0x4b, 0xb0, 0x7c, 0x7f, 0xf7, 0xf5, 0x46, 0x53, 0xa9, 0xdd, 0xdf, 0xad, 0xef, 0x37, 0x95, 0xed, + 0x66, 0x73, 0xbb, 0x76, 0x4f, 0x4c, 0x6e, 0xfd, 0xbd, 0x04, 0xe9, 0xed, 0x9d, 0xda, 0x2e, 0xaa, + 0x41, 0x9a, 0xe2, 0x54, 0xe7, 0x3e, 0x63, 0xad, 0x9e, 0x5f, 0xd2, 0x40, 0x77, 0x21, 0x43, 0x21, + 0x2c, 0x74, 0xfe, 0xbb, 0xd6, 0xea, 0x94, 0x1a, 0x07, 0xf9, 0x31, 0x74, 0x47, 0x9e, 0xfb, 0xd0, + 0xb5, 0x7a, 0x7e, 0xc9, 0x03, 0xdd, 0x87, 0x05, 0x07, 0xc1, 0x98, 0xf6, 0xfa, 0xb4, 0x3a, 0xb5, + 0x0e, 0x41, 0xa6, 0xc6, 0x90, 0xa0, 0xf3, 0xdf, 0xc0, 0x56, 0xa7, 0x14, 0x43, 0xd0, 0x2e, 0x64, + 0x39, 0x56, 0x30, 0xe5, 0x59, 0x6b, 0x75, 0x5a, 0x79, 0x03, 0xc9, 0x90, 0xf7, 0x30, 0xb6, 0xe9, + 0x2f, 0x7b, 0xab, 0x33, 0xd4, 0x79, 0xd0, 0x3b, 0x50, 0x0a, 0xe2, 0x10, 0xb3, 0x3d, 0x9d, 0xad, + 0xce, 0x58, 0x48, 0x21, 0xfa, 0x83, 0xa0, 0xc4, 0x6c, 0x4f, 0x69, 0xab, 0x33, 0xd6, 0x55, 0xd0, + 0x7b, 0xb0, 0x34, 0x09, 0x1a, 0xcc, 0xfe, 0xb2, 0xb6, 0x3a, 0x47, 0xa5, 0x05, 0x0d, 0x00, 0x45, + 0x80, 0x0d, 0x73, 0x3c, 0xb4, 0xad, 0xce, 0x53, 0x78, 0x41, 0x1d, 0x58, 0x0c, 0xdf, 0xe0, 0x67, + 0x7d, 0x78, 0x5b, 0x9d, 0xb9, 0x08, 0xc3, 0x46, 0x09, 0xde, 0xfc, 0x67, 0x7d, 0x88, 0x5b, 0x9d, + 0xb9, 0x26, 0x83, 0x8e, 0x01, 0x7c, 0x97, 0xf7, 0x19, 0x1e, 0xe6, 0x56, 0x67, 0xa9, 0xce, 0x20, + 0x03, 0x96, 0xa3, 0x6e, 0xf5, 0xf3, 0xbc, 0xd3, 0xad, 0xce, 0x55, 0xb4, 0x21, 0xfe, 0x1c, 0xbc, + 0x9f, 0xcf, 0xf6, 0x6e, 0xb7, 0x3a, 0x63, 0xf5, 0x06, 0xa9, 0x50, 0x0e, 0xdd, 0x49, 0x67, 0x7c, + 0xc6, 0x5b, 0x9d, 0xb5, 0x98, 0x43, 0xdc, 0x38, 0xe2, 0x9a, 0x39, 0xc7, 0xab, 0xde, 0xea, 0x3c, + 0xe5, 0x1d, 0xba, 0x46, 0x11, 0x77, 0xd0, 0x79, 0x1e, 0xf9, 0x56, 0xe7, 0xaa, 0xf6, 0xec, 0x6c, + 0x7f, 0xfe, 0xd5, 0xaa, 0xf0, 0xc5, 0x57, 0xab, 0xc2, 0xdf, 0xbe, 0x5a, 0x15, 0x3e, 0xf9, 0x7a, + 0x35, 0xf1, 0xc5, 0xd7, 0xab, 0x89, 0xbf, 0x7c, 0xbd, 0x9a, 0xf8, 0xfe, 0xd3, 0x5d, 0xcd, 0xee, + 0x8d, 0x5a, 0x1b, 0x6d, 0x7d, 0xb0, 0xd9, 0xd6, 0x07, 0xd8, 0x6e, 0x9d, 0xd8, 0x5e, 0xc3, 0xfb, + 0x87, 0x4b, 0x2b, 0x4b, 0xb3, 0x90, 0x1b, 0xff, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x27, 0x79, 0x3b, + 0x76, 0x01, 0x33, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4212,6 +4369,7 @@ type ABCIClient interface { FinalizeBlock(ctx context.Context, in *RequestFinalizeBlock, opts ...grpc.CallOption) (*ResponseFinalizeBlock, error) SignGossipVote(ctx context.Context, in *RequestSignGossipVote, opts ...grpc.CallOption) (*ResponseSignGossipVote, error) PrepareOracleVotes(ctx context.Context, in *RequestPrepareOracleVotes, opts ...grpc.CallOption) (*ResponsePrepareOracleVotes, error) + ValidateOracleVotes(ctx context.Context, in *RequestValidateOracleVotes, opts ...grpc.CallOption) (*ResponseValidateOracleVotes, error) } type aBCIClient struct { @@ -4384,6 +4542,15 @@ func (c *aBCIClient) PrepareOracleVotes(ctx context.Context, in *RequestPrepareO return out, nil } +func (c *aBCIClient) ValidateOracleVotes(ctx context.Context, in *RequestValidateOracleVotes, opts ...grpc.CallOption) (*ResponseValidateOracleVotes, error) { + out := new(ResponseValidateOracleVotes) + err := c.cc.Invoke(ctx, "/tendermint.abci.ABCI/ValidateOracleVotes", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ABCIServer is the server API for ABCI service. type ABCIServer interface { Echo(context.Context, *RequestEcho) (*ResponseEcho, error) @@ -4404,6 +4571,7 @@ type ABCIServer interface { FinalizeBlock(context.Context, *RequestFinalizeBlock) (*ResponseFinalizeBlock, error) SignGossipVote(context.Context, *RequestSignGossipVote) (*ResponseSignGossipVote, error) PrepareOracleVotes(context.Context, *RequestPrepareOracleVotes) (*ResponsePrepareOracleVotes, error) + ValidateOracleVotes(context.Context, *RequestValidateOracleVotes) (*ResponseValidateOracleVotes, error) } // UnimplementedABCIServer can be embedded to have forward compatible implementations. @@ -4464,6 +4632,9 @@ func (*UnimplementedABCIServer) SignGossipVote(ctx context.Context, req *Request func (*UnimplementedABCIServer) PrepareOracleVotes(ctx context.Context, req *RequestPrepareOracleVotes) (*ResponsePrepareOracleVotes, error) { return nil, status.Errorf(codes.Unimplemented, "method PrepareOracleVotes not implemented") } +func (*UnimplementedABCIServer) ValidateOracleVotes(ctx context.Context, req *RequestValidateOracleVotes) (*ResponseValidateOracleVotes, error) { + return nil, status.Errorf(codes.Unimplemented, "method ValidateOracleVotes not implemented") +} func RegisterABCIServer(s grpc1.Server, srv ABCIServer) { s.RegisterService(&_ABCI_serviceDesc, srv) @@ -4793,6 +4964,24 @@ func _ABCI_PrepareOracleVotes_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _ABCI_ValidateOracleVotes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestValidateOracleVotes) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ABCIServer).ValidateOracleVotes(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tendermint.abci.ABCI/ValidateOracleVotes", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ABCIServer).ValidateOracleVotes(ctx, req.(*RequestValidateOracleVotes)) + } + return interceptor(ctx, in, info, handler) +} + var _ABCI_serviceDesc = grpc.ServiceDesc{ ServiceName: "tendermint.abci.ABCI", HandlerType: (*ABCIServer)(nil), @@ -4869,6 +5058,10 @@ var _ABCI_serviceDesc = grpc.ServiceDesc{ MethodName: "PrepareOracleVotes", Handler: _ABCI_PrepareOracleVotes_Handler, }, + { + MethodName: "ValidateOracleVotes", + Handler: _ABCI_ValidateOracleVotes_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "tendermint/abci/types.proto", @@ -5298,6 +5491,29 @@ func (m *Request_PrepareOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, err } return len(dAtA) - i, nil } +func (m *Request_ValidateOracleVotes) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Request_ValidateOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.ValidateOracleVotes != nil { + { + size, err := m.ValidateOracleVotes.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xba + } + return len(dAtA) - i, nil +} func (m *RequestEcho) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -5463,12 +5679,12 @@ func (m *RequestInitChain) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x12 } - n20, err20 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err20 != nil { - return 0, err20 + n21, err21 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err21 != nil { + return 0, err21 } - i -= n20 - i = encodeVarintTypes(dAtA, i, uint64(n20)) + i -= n21 + i = encodeVarintTypes(dAtA, i, uint64(n21)) i-- dAtA[i] = 0xa return len(dAtA) - i, nil @@ -5763,12 +5979,12 @@ func (m *RequestPrepareProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x3a } - n22, err22 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err22 != nil { - return 0, err22 + n23, err23 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err23 != nil { + return 0, err23 } - i -= n22 - i = encodeVarintTypes(dAtA, i, uint64(n22)) + i -= n23 + i = encodeVarintTypes(dAtA, i, uint64(n23)) i-- dAtA[i] = 0x32 if m.Height != 0 { @@ -5851,12 +6067,12 @@ func (m *RequestProcessProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x3a } - n24, err24 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err24 != nil { - return 0, err24 + n25, err25 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err25 != nil { + return 0, err25 } - i -= n24 - i = encodeVarintTypes(dAtA, i, uint64(n24)) + i -= n25 + i = encodeVarintTypes(dAtA, i, uint64(n25)) i-- dAtA[i] = 0x32 if m.Height != 0 { @@ -5974,12 +6190,12 @@ func (m *RequestExtendVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x22 } } - n27, err27 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err27 != nil { - return 0, err27 + n28, err28 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err28 != nil { + return 0, err28 } - i -= n27 - i = encodeVarintTypes(dAtA, i, uint64(n27)) + i -= n28 + i = encodeVarintTypes(dAtA, i, uint64(n28)) i-- dAtA[i] = 0x1a if m.Height != 0 { @@ -6080,12 +6296,12 @@ func (m *RequestFinalizeBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x3a } - n28, err28 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err28 != nil { - return 0, err28 + n29, err29 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err29 != nil { + return 0, err29 } - i -= n28 - i = encodeVarintTypes(dAtA, i, uint64(n28)) + i -= n29 + i = encodeVarintTypes(dAtA, i, uint64(n29)) i-- dAtA[i] = 0x32 if m.Height != 0 { @@ -6208,6 +6424,36 @@ func (m *RequestPrepareOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, erro return len(dAtA) - i, nil } +func (m *RequestValidateOracleVotes) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RequestValidateOracleVotes) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RequestValidateOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.OracleTx) > 0 { + i -= len(m.OracleTx) + copy(dAtA[i:], m.OracleTx) + i = encodeVarintTypes(dAtA, i, uint64(len(m.OracleTx))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *Response) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -6655,6 +6901,29 @@ func (m *Response_PrepareOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, er } return len(dAtA) - i, nil } +func (m *Response_ValidateOracleVotes) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Response_ValidateOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.ValidateOracleVotes != nil { + { + size, err := m.ValidateOracleVotes.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xc2 + } + return len(dAtA) - i, nil +} func (m *ResponseException) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -7166,20 +7435,20 @@ func (m *ResponseApplySnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, err } } if len(m.RefetchChunks) > 0 { - dAtA52 := make([]byte, len(m.RefetchChunks)*10) - var j51 int + dAtA54 := make([]byte, len(m.RefetchChunks)*10) + var j53 int for _, num := range m.RefetchChunks { for num >= 1<<7 { - dAtA52[j51] = uint8(uint64(num)&0x7f | 0x80) + dAtA54[j53] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j51++ + j53++ } - dAtA52[j51] = uint8(num) - j51++ + dAtA54[j53] = uint8(num) + j53++ } - i -= j51 - copy(dAtA[i:], dAtA52[:j51]) - i = encodeVarintTypes(dAtA, i, uint64(j51)) + i -= j53 + copy(dAtA[i:], dAtA54[:j53]) + i = encodeVarintTypes(dAtA, i, uint64(j53)) i-- dAtA[i] = 0x12 } @@ -7502,6 +7771,41 @@ func (m *ResponsePrepareOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, err return len(dAtA) - i, nil } +func (m *ResponseValidateOracleVotes) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResponseValidateOracleVotes) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResponseValidateOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Status != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Status)) + i-- + dAtA[i] = 0x10 + } + if len(m.EncodedOracleTx) > 0 { + i -= len(m.EncodedOracleTx) + copy(dAtA[i:], m.EncodedOracleTx) + i = encodeVarintTypes(dAtA, i, uint64(len(m.EncodedOracleTx))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *CommitInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -7995,12 +8299,12 @@ func (m *Misbehavior) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x28 } - n58, err58 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err58 != nil { - return 0, err58 + n60, err60 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err60 != nil { + return 0, err60 } - i -= n58 - i = encodeVarintTypes(dAtA, i, uint64(n58)) + i -= n60 + i = encodeVarintTypes(dAtA, i, uint64(n60)) i-- dAtA[i] = 0x22 if m.Height != 0 { @@ -8317,6 +8621,18 @@ func (m *Request_PrepareOracleVotes) Size() (n int) { } return n } +func (m *Request_ValidateOracleVotes) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ValidateOracleVotes != nil { + l = m.ValidateOracleVotes.Size() + n += 2 + l + sovTypes(uint64(l)) + } + return n +} func (m *RequestEcho) Size() (n int) { if m == nil { return 0 @@ -8720,6 +9036,19 @@ func (m *RequestPrepareOracleVotes) Size() (n int) { return n } +func (m *RequestValidateOracleVotes) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.OracleTx) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + func (m *Response) Size() (n int) { if m == nil { return 0 @@ -8942,20 +9271,32 @@ func (m *Response_SignGossipVote) Size() (n int) { } var l int _ = l - if m.SignGossipVote != nil { - l = m.SignGossipVote.Size() + if m.SignGossipVote != nil { + l = m.SignGossipVote.Size() + n += 2 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Response_PrepareOracleVotes) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PrepareOracleVotes != nil { + l = m.PrepareOracleVotes.Size() n += 2 + l + sovTypes(uint64(l)) } return n } -func (m *Response_PrepareOracleVotes) Size() (n int) { +func (m *Response_ValidateOracleVotes) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.PrepareOracleVotes != nil { - l = m.PrepareOracleVotes.Size() + if m.ValidateOracleVotes != nil { + l = m.ValidateOracleVotes.Size() n += 2 + l + sovTypes(uint64(l)) } return n @@ -9339,6 +9680,22 @@ func (m *ResponsePrepareOracleVotes) Size() (n int) { return n } +func (m *ResponseValidateOracleVotes) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.EncodedOracleTx) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.Status != 0 { + n += 1 + sovTypes(uint64(m.Status)) + } + return n +} + func (m *CommitInfo) Size() (n int) { if m == nil { return 0 @@ -10254,6 +10611,41 @@ func (m *Request) Unmarshal(dAtA []byte) error { } m.Value = &Request_PrepareOracleVotes{v} iNdEx = postIndex + case 23: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidateOracleVotes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RequestValidateOracleVotes{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Request_ValidateOracleVotes{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -13072,6 +13464,90 @@ func (m *RequestPrepareOracleVotes) Unmarshal(dAtA []byte) error { } return nil } +func (m *RequestValidateOracleVotes) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestValidateOracleVotes: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestValidateOracleVotes: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OracleTx", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.OracleTx = append(m.OracleTx[:0], dAtA[iNdEx:postIndex]...) + if m.OracleTx == nil { + m.OracleTx = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Response) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -13766,6 +14242,41 @@ func (m *Response) Unmarshal(dAtA []byte) error { } m.Value = &Response_PrepareOracleVotes{v} iNdEx = postIndex + case 24: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidateOracleVotes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &ResponseValidateOracleVotes{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Response_ValidateOracleVotes{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -16229,6 +16740,109 @@ func (m *ResponsePrepareOracleVotes) Unmarshal(dAtA []byte) error { } return nil } +func (m *ResponseValidateOracleVotes) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResponseValidateOracleVotes: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResponseValidateOracleVotes: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EncodedOracleTx", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.EncodedOracleTx = append(m.EncodedOracleTx[:0], dAtA[iNdEx:postIndex]...) + if m.EncodedOracleTx == nil { + m.EncodedOracleTx = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + m.Status = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Status |= ResponseValidateOracleVotes_Status(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *CommitInfo) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/proto/buf.yaml b/proto/buf.yaml index 976755ad445..4e1d99fa43a 100644 --- a/proto/buf.yaml +++ b/proto/buf.yaml @@ -1,7 +1,6 @@ version: v1 name: buf.build/Switcheo/cometbft deps: - - buf.build/cosmos/cosmos-sdk - buf.build/cosmos/cosmos-proto - buf.build/cosmos/gogo-proto - buf.build/googleapis/googleapis diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto index 59f6ceb6965..5d5205ffdcf 100644 --- a/proto/tendermint/abci/types.proto +++ b/proto/tendermint/abci/types.proto @@ -37,6 +37,7 @@ service ABCI { rpc FinalizeBlock(RequestFinalizeBlock) returns (ResponseFinalizeBlock); rpc SignGossipVote(RequestSignGossipVote) returns (ResponseSignGossipVote); rpc PrepareOracleVotes(RequestPrepareOracleVotes) returns (ResponsePrepareOracleVotes); + rpc ValidateOracleVotes(RequestValidateOracleVotes) returns (ResponseValidateOracleVotes); } //---------------------------------------- @@ -61,7 +62,8 @@ message Request { RequestVerifyVoteExtension verify_vote_extension = 19; RequestFinalizeBlock finalize_block = 20; RequestSignGossipVote sign_gossip_vote = 21; - RequestPrepareOracleVotes prepare_oracle_votes = 22; + RequestPrepareOracleVotes prepare_oracle_votes = 22; + RequestValidateOracleVotes validate_oracle_votes = 23; } reserved 4, 7, 9, 10; // SetOption, BeginBlock, DeliverTx, EndBlock } @@ -206,6 +208,10 @@ message RequestSignGossipVote { message RequestPrepareOracleVotes {} +message RequestValidateOracleVotes { + bytes oracle_tx = 1; +} + //---------------------------------------- // Response types @@ -229,7 +235,8 @@ message Response { ResponseVerifyVoteExtension verify_vote_extension = 20; ResponseFinalizeBlock finalize_block = 21; ResponseSignGossipVote sign_gossip_vote = 22; - ResponsePrepareOracleVotes prepare_oracle_votes = 23; + ResponsePrepareOracleVotes prepare_oracle_votes = 23; + ResponseValidateOracleVotes validate_oracle_votes = 24; } reserved 5, 8, 10, 11; // SetOption, BeginBlock, DeliverTx, EndBlock } @@ -394,6 +401,16 @@ message ResponsePrepareOracleVotes { repeated Vote votes = 1 [(gogoproto.nullable) = false]; } +message ResponseValidateOracleVotes { + bytes encoded_oracle_tx = 1; + Status status = 2; + + enum Status { + present = 0; + absent = 1; + } +} + //---------------------------------------- // Misc. diff --git a/proto/tendermint/oracle/tx.proto b/proto/tendermint/oracle/tx.proto deleted file mode 100644 index c2153ff88f5..00000000000 --- a/proto/tendermint/oracle/tx.proto +++ /dev/null @@ -1,25 +0,0 @@ -syntax = "proto3"; -package tendermint.oracle; -import "google/protobuf/wrappers.proto"; -import "gogoproto/gogo.proto"; -import "cosmos/msg/v1/msg.proto"; -import "cosmos_proto/cosmos.proto"; -import "tendermint/oracle/types.proto"; -// this line is used by starport scaffolding # proto/tx/import - -option go_package = "github.com/cometbft/cometbft/proto/tendermint/oracle"; -option (gogoproto.goproto_getters_all) = false; - -// Msg defines the Msg service. -service Msg { - option (cosmos.msg.v1.service) = true; - rpc GossipVotes(MsgGossipVotes) returns (MsgGossipVotesResponse); -} - -message MsgGossipVotes { - option (cosmos.msg.v1.signer) = "proposer"; - string proposer = 1 [ (cosmos_proto.scalar) = "cosmos.AddressString" ]; - repeated GossipVote GossipVotes = 2; -} - -message MsgGossipVotesResponse {} diff --git a/proxy/app_conn.go b/proxy/app_conn.go index 4b94a1b8f46..1a46247ccc2 100644 --- a/proxy/app_conn.go +++ b/proxy/app_conn.go @@ -26,6 +26,7 @@ type AppConnConsensus interface { Commit(context.Context) (*types.ResponseCommit, error) SignGossipVote(context.Context, *types.RequestSignGossipVote) (*types.ResponseSignGossipVote, error) PrepareOracleVotes(context.Context, *types.RequestPrepareOracleVotes) (*types.ResponsePrepareOracleVotes, error) + ValidateOracleVotes(context.Context, *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) } type AppConnMempool interface { @@ -121,6 +122,11 @@ func (app *appConnConsensus) PrepareOracleVotes(ctx context.Context, req *types. return app.appConn.PrepareOracleVotes(ctx, req) } +func (app *appConnConsensus) ValidateOracleVotes(ctx context.Context, req *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) { + defer addTimeSample(app.metrics.MethodTimingSeconds.With("method", "commit", "type", "sync"))() + return app.appConn.ValidateOracleVotes(ctx, req) +} + //------------------------------------------------ // Implements AppConnMempool (subset of abcicli.Client) diff --git a/proxy/mocks/app_conn_consensus.go b/proxy/mocks/app_conn_consensus.go index 006412f74b4..28e114d6357 100644 --- a/proxy/mocks/app_conn_consensus.go +++ b/proxy/mocks/app_conn_consensus.go @@ -237,6 +237,32 @@ func (_m *AppConnConsensus) SignGossipVote(_a0 context.Context, _a1 *types.Reque return r0, r1 } +// ValidateOracleVotes provides a mock function with given fields: _a0, _a1 +func (_m *AppConnConsensus) ValidateOracleVotes(_a0 context.Context, _a1 *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseValidateOracleVotes + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestValidateOracleVotes) *types.ResponseValidateOracleVotes); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseValidateOracleVotes) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestValidateOracleVotes) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // VerifyVoteExtension provides a mock function with given fields: _a0, _a1 func (_m *AppConnConsensus) VerifyVoteExtension(_a0 context.Context, _a1 *types.RequestVerifyVoteExtension) (*types.ResponseVerifyVoteExtension, error) { ret := _m.Called(_a0, _a1) diff --git a/state/execution.go b/state/execution.go index b61acfbc4e5..900ff355678 100644 --- a/state/execution.go +++ b/state/execution.go @@ -272,20 +272,17 @@ func (blockExec *BlockExecutor) ProcessProposal( ) (bool, error) { txs := block.Data.Txs.ToSliceOfBytes() if len(txs) > 0 { - oracleTx := &oracleproto.GossipVotes{} - // check if oracleTx is successfully injected into first position of txs - if err := oracleTx.Unmarshal(txs[0]); err != nil { + res, err := blockExec.proxyApp.ValidateOracleVotes(context.Background(), &abci.RequestValidateOracleVotes{OracleTx: txs[0]}) + + if err != nil && res.Status == abci.ResponseValidateOracleVotes_absent { // oracleTx is not present, continue normal processProposal flow blockExec.logger.Error("error unmarshalling oracleVotesMsg or oracleVotesMsg not present", "err", err) - } else { - newTxBz, err := blockExec.validateOracleGossipVotes(oracleTx, block.Header.Height) - if err != nil { - // oracleTx is present but it is invalid, remove from txs - txs = txs[1:] - } else { - // oracleTx is present and valid, update txBz as some of the gossipVotes might have been removed due to invalid sig - txs[0] = newTxBz - } + } else if err != nil && res.Status == abci.ResponseValidateOracleVotes_present { + // oracleTx is present but it is invalid, remove from txs + txs = txs[1:] + } else if err != nil { + // oracleTx is present and valid, update txBz as some of the gossipVotes might have been removed due to invalid sig + txs[0] = res.EncodedOracleTx } } From 7ba2168a28f3186d2c06eed59fa2e85221d69115 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Thu, 18 Apr 2024 19:29:29 +0800 Subject: [PATCH 050/150] add back signGossipVote hook --- state/execution.go | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/state/execution.go b/state/execution.go index 900ff355678..09bc49469e9 100644 --- a/state/execution.go +++ b/state/execution.go @@ -144,16 +144,15 @@ func (blockExec *BlockExecutor) CreateProposalBlock( votes = append(votes, vote) } - msg := oracleproto.GossipVotes{ - GossipVotes: votes, - } - - msgBz, err := msg.Marshal() + resp, err := blockExec.proxyApp.SignGossipVote(ctx, &abci.RequestSignGossipVote{ + ProposerAddress: proposerAddr, + GossipVotes: votes, + Height: height, + }) if err != nil { - blockExec.logger.Error("error marshalling oracleVotesMsg", "err", err) - } else { - signGossipVoteTxBz = msgBz + blockExec.logger.Error("error in proxyAppConn.SignGossipVote", "err", err) } + signGossipVoteTxBz = resp.EncodedTx } var txs types.Txs From c2f9b72d3d51f6ad5dbf534edb176f482ac53f22 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 19 Apr 2024 17:21:11 +0800 Subject: [PATCH 051/150] add logs --- state/execution.go | 70 +++------------------------------------------- 1 file changed, 4 insertions(+), 66 deletions(-) diff --git a/state/execution.go b/state/execution.go index 09bc49469e9..4dd209c3fcf 100644 --- a/state/execution.go +++ b/state/execution.go @@ -7,9 +7,7 @@ import ( "time" abci "github.com/cometbft/cometbft/abci/types" - "github.com/cometbft/cometbft/crypto/ed25519" cryptoenc "github.com/cometbft/cometbft/crypto/encoding" - "github.com/cometbft/cometbft/crypto/sr25519" "github.com/cometbft/cometbft/libs/fail" "github.com/cometbft/cometbft/libs/log" "github.com/cometbft/cometbft/mempool" @@ -201,86 +199,26 @@ func (blockExec *BlockExecutor) CreateProposalBlock( return state.MakeBlock(height, txl, commit, evidence, proposerAddr), nil } -func (blockExec *BlockExecutor) validateOracleGossipVotes(oracleTx *oracleproto.GossipVotes, height int64) ([]byte, error) { - // verify if gossipVote is from validator - vals, err := blockExec.store.LoadValidators(height) - if err != nil { - blockExec.logger.Error("error loading validators from store", "err", err) - return nil, err - } - - // validate oracle msg - verifiedGossipVotes := oracleproto.GossipVotes{ - GossipVotes: make([]*oracleproto.GossipVote, 0), - } - - for _, gossipVote := range oracleTx.GossipVotes { - // verify sig - signType := gossipVote.SignType - switch signType { - case "ed25519": - pubkey := ed25519.PubKey(gossipVote.PublicKey) - if success := pubkey.VerifySignature(types.OracleVoteSignBytes(gossipVote), gossipVote.Signature); !success { - err := fmt.Errorf("ed25519: failed to verify signature for gossipVote: %v", gossipVote) - blockExec.logger.Error("discarding gossipVote:", "err", err) - continue - } - case "sr25519": - pubkey := sr25519.PubKey(gossipVote.PublicKey) - if success := pubkey.VerifySignature(types.OracleVoteSignBytes(gossipVote), gossipVote.Signature); !success { - err := fmt.Errorf("sr25519: failed to verify signature for gossipVote: %v", gossipVote) - blockExec.logger.Error("discarding gossipVote:", "err", err) - continue - } - default: - err := fmt.Errorf("signature not supported for gossipVote: %v", gossipVote) - blockExec.logger.Error("discarding gossipVote:", "err", err) - continue - } - - // verify val - if !vals.HasAddress(gossipVote.Validator) { - err := fmt.Errorf("invalid validator: %v", gossipVote) - blockExec.logger.Error("discarding gossipVote:", "err", err) - continue - } - - verifiedGossipVotes.GossipVotes = append(verifiedGossipVotes.GossipVotes, gossipVote) - } - - if len(verifiedGossipVotes.GossipVotes) == 0 { - logrus.Warn("no valid oracle gossip votes found") - return nil, fmt.Errorf("no valid oracle gossip votes found") - } - - newMsg := oracleproto.GossipVotes{ - GossipVotes: verifiedGossipVotes.GossipVotes, - } - newMsgBz, err := newMsg.Marshal() - if err != nil { - blockExec.logger.Error("error marshalling oracleVotesMsg", "err", err) - return nil, err - } - - return newMsgBz, nil -} - func (blockExec *BlockExecutor) ProcessProposal( block *types.Block, state State, ) (bool, error) { txs := block.Data.Txs.ToSliceOfBytes() if len(txs) > 0 { + logrus.Infof("no of txs: %d", len(txs)) res, err := blockExec.proxyApp.ValidateOracleVotes(context.Background(), &abci.RequestValidateOracleVotes{OracleTx: txs[0]}) if err != nil && res.Status == abci.ResponseValidateOracleVotes_absent { // oracleTx is not present, continue normal processProposal flow blockExec.logger.Error("error unmarshalling oracleVotesMsg or oracleVotesMsg not present", "err", err) + logrus.Infof("cant even find oracle votes") } else if err != nil && res.Status == abci.ResponseValidateOracleVotes_present { // oracleTx is present but it is invalid, remove from txs + logrus.Infof("unsucessful in validating oracle votes") txs = txs[1:] } else if err != nil { // oracleTx is present and valid, update txBz as some of the gossipVotes might have been removed due to invalid sig + logrus.Infof("success in validating oracle votes") txs[0] = res.EncodedOracleTx } } From 671ffca70588e06a26340d5a0a52b5aee1351e3b Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 19 Apr 2024 17:35:57 +0800 Subject: [PATCH 052/150] remove ununsed code and fix bug w process proposal --- config/config.go | 20 ++------ config/toml.go | 9 ---- oracle/service/runner/runner.go | 86 --------------------------------- state/execution.go | 5 +- 4 files changed, 6 insertions(+), 114 deletions(-) diff --git a/config/config.go b/config/config.go index 3a1af4be2e9..688d07e092c 100644 --- a/config/config.go +++ b/config/config.go @@ -841,12 +841,6 @@ func (cfg *MempoolConfig) ValidateBasic() error { // OracleConfig defines the configuration for the CometBFT oracle service type OracleConfig struct { - // Path to custom oracle spec should validators decide to use a different spec from the default - CustomNodePath string `mapstructure:"custom_node_path"` - // REST API address used to query chain for syncing of oracles and fetching cached oracle results - RestApiAddress string `mapstructure:"rest_api_address"` - // GRPC address used to query chain for syncing of oracles and fetching cached oracle results - GrpcAddress string `mapstructure:"grpc_address"` // Interval determines how long we should keep our gossiped votes before pruning PruneInterval time.Duration `mapstructure:"prune_interval"` // Interval determines how long we should wait before batch signing votes @@ -860,11 +854,9 @@ type OracleConfig struct { // DefaultOracleConfig returns a default configuration for the CometBFT oracle service func DefaultOracleConfig() *OracleConfig { return &OracleConfig{ - RestApiAddress: "http://localhost:1317", // localhost - GrpcAddress: "127.0.0.1:9090", // localhost - PruneInterval: 4 * time.Second, // 4s - SignInterval: 500 * time.Millisecond, // 0.5s - GossipInterval: 100 * time.Millisecond, // 0.1s + PruneInterval: 4 * time.Second, // 4s + SignInterval: 500 * time.Millisecond, // 0.5s + GossipInterval: 100 * time.Millisecond, // 0.1s MaxGossipMsgSize: 65536, } } @@ -878,12 +870,6 @@ func TestOracleConfig() *OracleConfig { // ValidateBasic performs basic validation and returns an error if any check fails. func (cfg *OracleConfig) ValidateBasic() error { - if cfg.RestApiAddress == "" { - return errors.New("rest_api_address can't be empty") - } - if cfg.GrpcAddress == "" { - return errors.New("grpc_address can't be empty") - } if cfg.PruneInterval < 0 { return errors.New("prune_interval can't be negative") } diff --git a/config/toml.go b/config/toml.go index df3fc218e30..44c8d86d74f 100644 --- a/config/toml.go +++ b/config/toml.go @@ -409,15 +409,6 @@ experimental_max_gossip_connections_to_non_persistent_peers = {{ .Mempool.Experi ####################################################### [oracle] -# Path to custom oracle spec should validators decide to use a different spec from the default -custom_node_path = "{{ .Oracle.CustomNodePath }}" - -# REST API address used to query chain for syncing of oracles and fetching cached oracle results -rest_api_address = "{{ .Oracle.RestApiAddress }}" - -# GRPC address used to query chain for syncing of oracles and fetching cached oracle results -grpc_address = "{{ .Oracle.GrpcAddress }}" - # Interval determines how long we should keep our gossiped votes before pruning prune_interval = "{{ .Oracle.PruneInterval }}" diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 05c2393833a..8a4afa5bf9f 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -2,14 +2,9 @@ package runner import ( "context" - "io" - "net/http" "time" log "github.com/sirupsen/logrus" - "google.golang.org/grpc" - "google.golang.org/grpc/connectivity" - "google.golang.org/grpc/credentials/insecure" "github.com/cometbft/cometbft/oracle/service/types" @@ -144,8 +139,6 @@ func PruneUnsignedVoteBuffer(oracleInfo *types.OracleInfo) { // Run run oracles func Run(oracleInfo *types.OracleInfo) { log.Info("[oracle] Service started.") - waitForGrpc(oracleInfo.Config.GrpcAddress) - waitForRestAPI(oracleInfo.Config.RestApiAddress) RunProcessSignVoteQueue(oracleInfo) PruneUnsignedVoteBuffer(oracleInfo) PruneGossipVoteBuffer(oracleInfo) @@ -175,82 +168,3 @@ func Run(oracleInfo *types.OracleInfo) { time.Sleep(1000 * time.Millisecond) } } - -func waitForRestAPI(address string) { - restMaxRetryCount := 12 - retryCount := 0 - sleepTime := time.Second - for { - log.Infof("[oracle] checking if rest endpoint is up %s : %d", address, retryCount) - if retryCount == restMaxRetryCount { - panic("failed to connect to grpc:grpcClient after 12 tries") - } - time.Sleep(sleepTime) - - res := HTTPRequest(address, 10) - if len(res) != 0 { - break - } - - time.Sleep(time.Duration(retryCount*int(time.Second) + 1)) - retryCount++ - sleepTime *= 2 - } -} - -func waitForGrpc(address string) { - grpcMaxRetryCount := 12 - retryCount := 0 - sleepTime := time.Second - var client *grpc.ClientConn - - for { - log.Infof("[oracle] trying to connect to grpc with address %s : %d", address, retryCount) - if retryCount == grpcMaxRetryCount { - panic("failed to connect to grpc:grpcClient after 12 tries") - } - time.Sleep(sleepTime) - - // reinit otherwise connection will be idle, in idle we can't tell if it's really ready - var err error - client, err = grpc.Dial( - address, - grpc.WithTransportCredentials(insecure.NewCredentials()), - ) - if err != nil { - panic(err) - } - // give it some time to connect after dailing, but not too long as connection can become idle - time.Sleep(time.Duration(retryCount*int(time.Second) + 1)) - - if client.GetState() == connectivity.Ready { - break - } - client.Close() - retryCount++ - sleepTime *= 2 - } -} - -func HTTPRequest(url string, timeout uint64) []byte { - httpClient := http.Client{ - Timeout: time.Duration(timeout) * time.Second, - } - - var response *http.Response - response, err := httpClient.Get(url) - - if err != nil { - return []byte{} - } - - defer response.Body.Close() - - body, readErr := io.ReadAll(response.Body) - - if readErr != nil { - return []byte{} - } - - return body -} diff --git a/state/execution.go b/state/execution.go index 4dd209c3fcf..737e4bdeae7 100644 --- a/state/execution.go +++ b/state/execution.go @@ -215,11 +215,12 @@ func (blockExec *BlockExecutor) ProcessProposal( } else if err != nil && res.Status == abci.ResponseValidateOracleVotes_present { // oracleTx is present but it is invalid, remove from txs logrus.Infof("unsucessful in validating oracle votes") - txs = txs[1:] + block.Data.Txs = types.ToTxs(txs[1:]) } else if err != nil { // oracleTx is present and valid, update txBz as some of the gossipVotes might have been removed due to invalid sig logrus.Infof("success in validating oracle votes") txs[0] = res.EncodedOracleTx + block.Data.Txs = types.ToTxs(txs) } } @@ -227,7 +228,7 @@ func (blockExec *BlockExecutor) ProcessProposal( Hash: block.Header.Hash(), Height: block.Header.Height, Time: block.Header.Time, - Txs: txs, + Txs: block.Data.Txs.ToSliceOfBytes(), ProposedLastCommit: buildLastCommitInfoFromStore(block, blockExec.store, state.InitialHeight), Misbehavior: block.Evidence.Evidence.ToABCI(), ProposerAddress: block.ProposerAddress, From 3392e0a7e954bf017d44e61b4c98ffdcd0d3b239 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Sun, 21 Apr 2024 23:52:45 +0800 Subject: [PATCH 053/150] add logs --- oracle/service/runner/runner.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 8a4afa5bf9f..2274eeaa561 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -66,6 +66,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo) { // signing of vote should append the signature field and timestamp field of gossipVote if err := oracleInfo.PrivValidator.SignOracleVote("", newGossipVote); err != nil { log.Errorf("error signing oracle votes") + continue } // replace current gossipVoteBuffer with new one @@ -74,6 +75,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo) { // need to mutex lock as it will clash with concurrent gossip oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() oracleInfo.GossipVoteBuffer.Buffer[address] = newGossipVote + log.Infof("adding new gossipBuffer at time: %v", newGossipVote.SignedTimestamp) oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() } } @@ -90,7 +92,7 @@ func PruneGossipVoteBuffer(oracleInfo *types.OracleInfo) { // prune gossip vote that have signed timestamps older than 60 secs for valAddr, gossipVote := range oracleInfo.GossipVoteBuffer.Buffer { if gossipVote.SignedTimestamp < currTime-uint64(interval) { - log.Infof("DELETING STALE GOSSIP BUFFER FOR VAL: %s", valAddr) + log.Infof("DELETING STALE GOSSIP BUFFER (%v) FOR VAL: %s", gossipVote.SignedTimestamp, valAddr) delete(buffer, valAddr) } } From 8618a17b318a25a52f211fa8f1d655fea453ef1b Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 22 Apr 2024 00:00:22 +0800 Subject: [PATCH 054/150] add more logs --- oracle/service/runner/runner.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 2274eeaa561..b6b0906fa60 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -92,6 +92,7 @@ func PruneGossipVoteBuffer(oracleInfo *types.OracleInfo) { // prune gossip vote that have signed timestamps older than 60 secs for valAddr, gossipVote := range oracleInfo.GossipVoteBuffer.Buffer { if gossipVote.SignedTimestamp < currTime-uint64(interval) { + log.Info(currTime - uint64(interval)) log.Infof("DELETING STALE GOSSIP BUFFER (%v) FOR VAL: %s", gossipVote.SignedTimestamp, valAddr) delete(buffer, valAddr) } @@ -106,12 +107,12 @@ func PruneUnsignedVoteBuffer(oracleInfo *types.OracleInfo) { go func(oracleInfo *types.OracleInfo) { interval := oracleInfo.Config.PruneInterval if interval == 0 { - interval = 1 * time.Second + interval = 4 * time.Second } ticker := time.Tick(interval) for range ticker { oracleInfo.UnsignedVoteBuffer.UpdateMtx.RLock() - // prune everything older than 3 secs + // prune everything older than 4 secs currTime := uint64(time.Now().Unix()) numberOfVotesToPrune := 0 count := 0 From 7e742a30812095a07a19c06ca65ab3d5559551a7 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 22 Apr 2024 00:26:04 +0800 Subject: [PATCH 055/150] clean unused proto and fix uint64 overflow bug --- oracle/service/runner/runner.go | 13 +- oracle/service/types/info.go | 2 +- privval/file.go | 2 +- proto/tendermint/oracle/types.pb.go | 344 ++++------------------------ proto/tendermint/oracle/types.proto | 12 +- types/priv_validator.go | 2 +- 6 files changed, 52 insertions(+), 323 deletions(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index b6b0906fa60..07d959d7032 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -38,7 +38,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo) { // new batch of unsigned votes newUnsignedVotes := &types.UnsignedVotes{ - Timestamp: uint64(time.Now().Unix()), + Timestamp: time.Now().Unix(), Votes: votes, } @@ -86,13 +86,12 @@ func PruneGossipVoteBuffer(oracleInfo *types.OracleInfo) { ticker := time.Tick(interval) for range ticker { oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() - currTime := uint64(time.Now().Unix()) + currTime := time.Now().Unix() buffer := oracleInfo.GossipVoteBuffer.Buffer // prune gossip vote that have signed timestamps older than 60 secs for valAddr, gossipVote := range oracleInfo.GossipVoteBuffer.Buffer { - if gossipVote.SignedTimestamp < currTime-uint64(interval) { - log.Info(currTime - uint64(interval)) + if gossipVote.SignedTimestamp < currTime-int64(interval.Seconds()) { log.Infof("DELETING STALE GOSSIP BUFFER (%v) FOR VAL: %s", gossipVote.SignedTimestamp, valAddr) delete(buffer, valAddr) } @@ -113,14 +112,14 @@ func PruneUnsignedVoteBuffer(oracleInfo *types.OracleInfo) { for range ticker { oracleInfo.UnsignedVoteBuffer.UpdateMtx.RLock() // prune everything older than 4 secs - currTime := uint64(time.Now().Unix()) + currTime := time.Now().Unix() numberOfVotesToPrune := 0 count := 0 unsignedVoteBuffer := oracleInfo.UnsignedVoteBuffer.Buffer for _, unsignedVotes := range unsignedVoteBuffer { // unsigned votes are arranged from least recent to most recent timestamp := unsignedVotes.Timestamp - if timestamp <= currTime-uint64(interval) { + if timestamp <= currTime-int64(interval.Seconds()) { numberOfVotesToPrune++ count += len(unsignedVotes.Votes) } else { @@ -159,7 +158,7 @@ func Run(oracleInfo *types.OracleInfo) { Validator: oracleInfo.PubKey.Address(), OracleId: vote.OracleId, Data: vote.Data, - Timestamp: uint64(vote.Timestamp), + Timestamp: vote.Timestamp, } votes = append(votes, &newVote) } diff --git a/oracle/service/types/info.go b/oracle/service/types/info.go index 768fa745cab..fef589405cf 100644 --- a/oracle/service/types/info.go +++ b/oracle/service/types/info.go @@ -22,7 +22,7 @@ type OracleInfo struct { } type UnsignedVotes struct { - Timestamp uint64 + Timestamp int64 Votes []*oracleproto.Vote } diff --git a/privval/file.go b/privval/file.go index f50421711cd..6b4a415077c 100644 --- a/privval/file.go +++ b/privval/file.go @@ -315,7 +315,7 @@ func (pv *FilePV) signOracleVote(vote *oracleproto.GossipVote) error { if err != nil { return err } - vote.SignedTimestamp = uint64(time.Now().Unix()) + vote.SignedTimestamp = time.Now().Unix() vote.Signature = sig return nil diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index bfa6155b91c..5ab59c68806 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -5,7 +5,6 @@ package oracle import ( fmt "fmt" - _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" io "io" math "math" @@ -26,7 +25,7 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type Vote struct { Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` OracleId string `protobuf:"bytes,2,opt,name=oracle_id,json=oracleId,proto3" json:"oracle_id,omitempty"` - Timestamp uint64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` Data string `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` } @@ -77,7 +76,7 @@ func (m *Vote) GetOracleId() string { return "" } -func (m *Vote) GetTimestamp() uint64 { +func (m *Vote) GetTimestamp() int64 { if m != nil { return m.Timestamp } @@ -96,7 +95,7 @@ type GossipVote struct { PublicKey []byte `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` SignType string `protobuf:"bytes,3,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` Votes []*Vote `protobuf:"bytes,4,rep,name=votes,proto3" json:"votes,omitempty"` - SignedTimestamp uint64 `protobuf:"varint,5,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` + SignedTimestamp int64 `protobuf:"varint,5,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` Signature []byte `protobuf:"bytes,6,opt,name=signature,proto3" json:"signature,omitempty"` } @@ -161,7 +160,7 @@ func (m *GossipVote) GetVotes() []*Vote { return nil } -func (m *GossipVote) GetSignedTimestamp() uint64 { +func (m *GossipVote) GetSignedTimestamp() int64 { if m != nil { return m.SignedTimestamp } @@ -359,66 +358,6 @@ func (m *Oracle) GetSpec() string { return "" } -type Result struct { - OracleId string `protobuf:"bytes,1,opt,name=oracle_id,json=oracleId,proto3" json:"oracle_id,omitempty" db:"oracle_id"` - Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty" db:"timestamp"` - Data string `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty" db:"data"` -} - -func (m *Result) Reset() { *m = Result{} } -func (m *Result) String() string { return proto.CompactTextString(m) } -func (*Result) ProtoMessage() {} -func (*Result) Descriptor() ([]byte, []int) { - return fileDescriptor_ed9227d272ed5d90, []int{4} -} -func (m *Result) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Result) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Result.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Result) XXX_Merge(src proto.Message) { - xxx_messageInfo_Result.Merge(m, src) -} -func (m *Result) XXX_Size() int { - return m.Size() -} -func (m *Result) XXX_DiscardUnknown() { - xxx_messageInfo_Result.DiscardUnknown(m) -} - -var xxx_messageInfo_Result proto.InternalMessageInfo - -func (m *Result) GetOracleId() string { - if m != nil { - return m.OracleId - } - return "" -} - -func (m *Result) GetTimestamp() int64 { - if m != nil { - return m.Timestamp - } - return 0 -} - -func (m *Result) GetData() string { - if m != nil { - return m.Data - } - return "" -} - type GossipVotes struct { GossipVotes []*GossipVote `protobuf:"bytes,1,rep,name=GossipVotes,proto3" json:"GossipVotes,omitempty"` } @@ -427,7 +366,7 @@ func (m *GossipVotes) Reset() { *m = GossipVotes{} } func (m *GossipVotes) String() string { return proto.CompactTextString(m) } func (*GossipVotes) ProtoMessage() {} func (*GossipVotes) Descriptor() ([]byte, []int) { - return fileDescriptor_ed9227d272ed5d90, []int{5} + return fileDescriptor_ed9227d272ed5d90, []int{4} } func (m *GossipVotes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -468,52 +407,46 @@ func init() { proto.RegisterType((*GossipVote)(nil), "tendermint.oracle.GossipVote") proto.RegisterType((*CanonicalGossipVote)(nil), "tendermint.oracle.CanonicalGossipVote") proto.RegisterType((*Oracle)(nil), "tendermint.oracle.Oracle") - proto.RegisterType((*Result)(nil), "tendermint.oracle.Result") proto.RegisterType((*GossipVotes)(nil), "tendermint.oracle.GossipVotes") } func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 595 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x54, 0xbf, 0x6e, 0xd4, 0x4e, - 0x10, 0x8e, 0x2f, 0x97, 0x4b, 0x3c, 0x49, 0x2e, 0xbf, 0xdf, 0x12, 0x05, 0x0b, 0x12, 0xe7, 0x30, - 0x48, 0x1c, 0x05, 0x77, 0x08, 0x52, 0xd1, 0x20, 0x42, 0x81, 0x10, 0x52, 0x40, 0x26, 0xa2, 0xa0, - 0xb1, 0xf6, 0xec, 0xc1, 0xac, 0x38, 0x7b, 0xad, 0xdd, 0x71, 0x94, 0x7b, 0x09, 0xc4, 0x13, 0xf0, - 0x3c, 0x88, 0x2a, 0x25, 0x55, 0x84, 0x92, 0x37, 0xc8, 0x13, 0x20, 0xef, 0x5e, 0x6c, 0x43, 0x28, - 0x28, 0xe9, 0x66, 0xbf, 0xef, 0x9b, 0x9d, 0x3f, 0x3b, 0xb3, 0xb0, 0x43, 0x98, 0x27, 0xa8, 0x32, - 0x91, 0xd3, 0x58, 0x2a, 0x1e, 0x4f, 0x71, 0x4c, 0xb3, 0x02, 0xf5, 0xa8, 0x50, 0x92, 0x24, 0xfb, - 0xbf, 0xa1, 0x47, 0x96, 0xbe, 0xb1, 0x99, 0xca, 0x54, 0x1a, 0x76, 0x5c, 0x59, 0x56, 0x18, 0x68, - 0xe8, 0xbe, 0x95, 0x84, 0x6c, 0x1b, 0xdc, 0x23, 0x3e, 0x15, 0x09, 0x27, 0xa9, 0x3c, 0x67, 0xe0, - 0x0c, 0xd7, 0xc2, 0x06, 0x60, 0x37, 0xc1, 0xb5, 0xb7, 0x44, 0x22, 0xf1, 0x3a, 0x03, 0x67, 0xe8, - 0x86, 0x2b, 0x16, 0x78, 0x91, 0x54, 0xae, 0x24, 0x32, 0xd4, 0xc4, 0xb3, 0xc2, 0x5b, 0x1c, 0x38, - 0xc3, 0x6e, 0xd8, 0x00, 0x8c, 0x41, 0x37, 0xe1, 0xc4, 0xbd, 0xae, 0xf1, 0x32, 0x76, 0x70, 0xea, - 0x00, 0x3c, 0x97, 0x5a, 0x8b, 0xe2, 0x2f, 0x62, 0xef, 0x00, 0x14, 0xe5, 0x64, 0x2a, 0xe2, 0xe8, - 0x23, 0xce, 0x4c, 0xf0, 0xb5, 0xd0, 0xb5, 0xc8, 0x4b, 0x9c, 0x55, 0xa9, 0x69, 0x91, 0xe6, 0x51, - 0x55, 0xbd, 0x89, 0xee, 0x86, 0x2b, 0x15, 0x70, 0x38, 0x2b, 0x90, 0xdd, 0x87, 0xa5, 0x23, 0x49, - 0xa8, 0xbd, 0xee, 0x60, 0x71, 0xb8, 0xfa, 0xf0, 0xfa, 0xe8, 0x4a, 0x5b, 0x46, 0x55, 0x06, 0xa1, - 0x55, 0xb1, 0x7b, 0xf0, 0x5f, 0xe5, 0x8a, 0x49, 0xd4, 0x14, 0xb4, 0x64, 0x0a, 0xda, 0xb0, 0xf8, - 0x61, 0x5d, 0xd6, 0xb6, 0x0d, 0xcb, 0xa9, 0x54, 0xe8, 0xf5, 0x6c, 0x52, 0x35, 0x10, 0x7c, 0x71, - 0xe0, 0xda, 0x33, 0x9e, 0xcb, 0x5c, 0xc4, 0x7c, 0xfa, 0x0f, 0x56, 0x1a, 0x7c, 0xeb, 0x40, 0xef, - 0x95, 0x81, 0x99, 0x07, 0xcb, 0xb1, 0xc2, 0x3a, 0x23, 0x37, 0xbc, 0x3c, 0xb2, 0x3e, 0x74, 0xea, - 0xe7, 0xee, 0x88, 0x84, 0x0d, 0x60, 0x35, 0x41, 0x1d, 0x2b, 0x51, 0x90, 0x90, 0xf9, 0x3c, 0x85, - 0x36, 0xc4, 0xb6, 0xa0, 0xa7, 0x89, 0x53, 0xa9, 0xe7, 0xcf, 0x3d, 0x3f, 0xb1, 0x3d, 0xd8, 0xca, - 0x44, 0x1e, 0x51, 0xa9, 0x72, 0x59, 0x52, 0x54, 0xa0, 0x8a, 0x31, 0x27, 0x9e, 0xa2, 0x69, 0xaf, - 0x1b, 0x6e, 0x66, 0x22, 0x3f, 0xb4, 0xe4, 0xeb, 0x9a, 0x63, 0x77, 0xa0, 0x9f, 0xf1, 0xe3, 0x48, - 0xa1, 0x2e, 0xa7, 0x14, 0x55, 0xea, 0x9e, 0x51, 0xaf, 0x65, 0xfc, 0x38, 0x34, 0xe0, 0xd3, 0x14, - 0xd9, 0x6d, 0x58, 0xd7, 0x18, 0x97, 0x4a, 0xd0, 0xcc, 0xb6, 0x66, 0xd9, 0x8a, 0x2e, 0x41, 0xd3, - 0x9e, 0xbb, 0xb0, 0x31, 0xbf, 0x46, 0x93, 0xe2, 0x84, 0xe9, 0xcc, 0x5b, 0x31, 0xb2, 0xbe, 0x85, - 0xdf, 0xcc, 0x51, 0xe6, 0x03, 0x28, 0xd4, 0x72, 0x5a, 0x9a, 0x12, 0x5d, 0xa3, 0x69, 0x21, 0xd5, - 0x38, 0xeb, 0x02, 0x63, 0x0f, 0xec, 0x38, 0x57, 0x76, 0xf0, 0xc9, 0x81, 0x9e, 0xcd, 0x87, 0x8d, - 0xdb, 0x8b, 0x62, 0xda, 0xb9, 0xcf, 0x2e, 0x4e, 0x77, 0xfb, 0xc9, 0xe4, 0x71, 0x50, 0x13, 0x41, - 0x6b, 0x79, 0x1e, 0xfc, 0xbe, 0x3c, 0x8b, 0x8d, 0x43, 0x4d, 0x04, 0xed, 0x85, 0xba, 0xd5, 0x5e, - 0xa8, 0xfd, 0xf5, 0x8b, 0xd3, 0x5d, 0xb7, 0x12, 0x9b, 0xc5, 0x9a, 0xef, 0xd7, 0x01, 0xac, 0x36, - 0x43, 0xa7, 0xd9, 0x93, 0x5f, 0x8e, 0x9e, 0x63, 0x26, 0x64, 0xe7, 0x0f, 0x13, 0xd2, 0xa8, 0xc2, - 0xb6, 0xc7, 0xfe, 0xc1, 0xd7, 0x33, 0xdf, 0x39, 0x39, 0xf3, 0x9d, 0x1f, 0x67, 0xbe, 0xf3, 0xf9, - 0xdc, 0x5f, 0x38, 0x39, 0xf7, 0x17, 0xbe, 0x9f, 0xfb, 0x0b, 0xef, 0xf6, 0x52, 0x41, 0x1f, 0xca, - 0xc9, 0x28, 0x96, 0xd9, 0x38, 0x96, 0x19, 0xd2, 0xe4, 0x3d, 0x35, 0x86, 0xfd, 0x6d, 0xae, 0xfc, - 0x54, 0x93, 0x9e, 0x21, 0x1e, 0xfd, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x34, 0x6a, 0x3d, 0xd4, 0xc5, - 0x04, 0x00, 0x00, + // 528 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x94, 0xc1, 0x6e, 0xd3, 0x4c, + 0x10, 0xc7, 0xe3, 0x24, 0x4d, 0xe3, 0x49, 0xbe, 0xf4, 0x63, 0x41, 0xc5, 0x12, 0x8d, 0x15, 0x05, + 0x24, 0xc2, 0x81, 0x44, 0x82, 0xde, 0x11, 0x70, 0x40, 0x08, 0xa9, 0x20, 0x13, 0x71, 0xe0, 0x62, + 0x6d, 0xec, 0x21, 0xac, 0xb0, 0xbd, 0xd6, 0xee, 0xb8, 0xaa, 0xdf, 0x82, 0x27, 0xe0, 0x79, 0x10, + 0xa7, 0x1e, 0x39, 0x21, 0x94, 0xbc, 0x08, 0xf2, 0x6e, 0x6a, 0x07, 0x95, 0x03, 0x47, 0x6e, 0xbb, + 0xbf, 0xf9, 0x4f, 0x66, 0xfe, 0x33, 0x1b, 0xc3, 0x98, 0x30, 0x8b, 0x51, 0xa5, 0x22, 0xa3, 0x85, + 0x54, 0x3c, 0x4a, 0x70, 0x41, 0x65, 0x8e, 0x7a, 0x9e, 0x2b, 0x49, 0x92, 0xdd, 0x68, 0xc2, 0x73, + 0x1b, 0x9e, 0x6a, 0xe8, 0xbe, 0x93, 0x84, 0xec, 0x04, 0xdc, 0x73, 0x9e, 0x88, 0x98, 0x93, 0x54, + 0x9e, 0x33, 0x71, 0x66, 0xc3, 0xa0, 0x01, 0xec, 0x0e, 0xb8, 0x56, 0x1f, 0x8a, 0xd8, 0x6b, 0x4f, + 0x9c, 0x99, 0x1b, 0xf4, 0x2d, 0x78, 0x19, 0x57, 0xa9, 0x24, 0x52, 0xd4, 0xc4, 0xd3, 0xdc, 0xeb, + 0x4c, 0x9c, 0x59, 0x27, 0x68, 0x00, 0x63, 0xd0, 0x8d, 0x39, 0x71, 0xaf, 0x6b, 0xb2, 0xcc, 0x79, + 0xfa, 0xc3, 0x01, 0x78, 0x21, 0xb5, 0x16, 0xf9, 0x5f, 0xd4, 0x1e, 0x03, 0xe4, 0xc5, 0x2a, 0x11, + 0x51, 0xf8, 0x09, 0x4b, 0x53, 0x7c, 0x18, 0xb8, 0x96, 0xbc, 0xc2, 0xb2, 0x6a, 0x4d, 0x8b, 0x75, + 0x16, 0x56, 0x3e, 0x4d, 0x75, 0x37, 0xe8, 0x57, 0x60, 0x59, 0xe6, 0xc8, 0x1e, 0xc2, 0xc1, 0xb9, + 0x24, 0xd4, 0x5e, 0x77, 0xd2, 0x99, 0x0d, 0x1e, 0xdd, 0x9e, 0x5f, 0x1b, 0xc0, 0xbc, 0xea, 0x20, + 0xb0, 0x2a, 0xf6, 0x00, 0xfe, 0xaf, 0x52, 0x31, 0x0e, 0x1b, 0x43, 0x07, 0xc6, 0xd0, 0x91, 0xe5, + 0xcb, 0xda, 0xd6, 0x89, 0x2d, 0xcb, 0xa9, 0x50, 0xe8, 0xf5, 0x6c, 0x53, 0x35, 0x98, 0x7e, 0x71, + 0xe0, 0xe6, 0x73, 0x9e, 0xc9, 0x4c, 0x44, 0x3c, 0xf9, 0x07, 0x9d, 0x4e, 0xbf, 0xb5, 0xa1, 0xf7, + 0xda, 0x60, 0xe6, 0xc1, 0x61, 0xa4, 0xb0, 0xee, 0xc8, 0x0d, 0xae, 0xae, 0x6c, 0x04, 0xed, 0x7a, + 0xdd, 0x6d, 0x11, 0xb3, 0x09, 0x0c, 0x62, 0xd4, 0x91, 0x12, 0x39, 0x09, 0x99, 0xed, 0x5a, 0xd8, + 0x47, 0xec, 0x18, 0x7a, 0x9a, 0x38, 0x15, 0x7a, 0xb7, 0xee, 0xdd, 0x8d, 0x9d, 0xc2, 0x71, 0x2a, + 0xb2, 0x90, 0x0a, 0x95, 0xc9, 0x82, 0xc2, 0x1c, 0x55, 0x84, 0x19, 0xf1, 0x35, 0x9a, 0xf1, 0xba, + 0xc1, 0xad, 0x54, 0x64, 0x4b, 0x1b, 0x7c, 0x53, 0xc7, 0xd8, 0x3d, 0x18, 0xa5, 0xfc, 0x22, 0x54, + 0xa8, 0x8b, 0x84, 0xc2, 0x4a, 0xdd, 0x33, 0xea, 0x61, 0xca, 0x2f, 0x02, 0x03, 0x9f, 0xae, 0x91, + 0xdd, 0x85, 0xff, 0x34, 0x46, 0x85, 0x12, 0x54, 0xda, 0xd1, 0x1c, 0x5a, 0xd1, 0x15, 0x34, 0xe3, + 0xb9, 0x0f, 0x47, 0xbb, 0x9f, 0xd1, 0xa4, 0x38, 0xe1, 0xba, 0xf4, 0xfa, 0x46, 0x36, 0xb2, 0xf8, + 0xed, 0x8e, 0x32, 0x1f, 0x40, 0xa1, 0x96, 0x49, 0x61, 0x2c, 0xba, 0x46, 0xb3, 0x47, 0xaa, 0xe7, + 0xac, 0x73, 0x8c, 0x3c, 0xb0, 0xcf, 0xb9, 0x3a, 0x4f, 0xcf, 0x60, 0xd0, 0xec, 0x58, 0xb3, 0x27, + 0xbf, 0x5d, 0x3d, 0xc7, 0x2c, 0x64, 0xfc, 0x87, 0x85, 0x34, 0xaa, 0x60, 0x3f, 0xe3, 0xd9, 0xd9, + 0xd7, 0x8d, 0xef, 0x5c, 0x6e, 0x7c, 0xe7, 0xe7, 0xc6, 0x77, 0x3e, 0x6f, 0xfd, 0xd6, 0xe5, 0xd6, + 0x6f, 0x7d, 0xdf, 0xfa, 0xad, 0xf7, 0xa7, 0x6b, 0x41, 0x1f, 0x8b, 0xd5, 0x3c, 0x92, 0xe9, 0x22, + 0x92, 0x29, 0xd2, 0xea, 0x03, 0x35, 0x07, 0xf3, 0x27, 0x5f, 0x5c, 0xfb, 0x04, 0xac, 0x7a, 0x26, + 0xf0, 0xf8, 0x57, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb7, 0x1f, 0x18, 0xf7, 0x1e, 0x04, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -786,48 +719,6 @@ func (m *Oracle) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *Result) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Result) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Result) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Data) > 0 { - i -= len(m.Data) - copy(dAtA[i:], m.Data) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Data))) - i-- - dAtA[i] = 0x22 - } - if m.Timestamp != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Timestamp)) - i-- - dAtA[i] = 0x18 - } - if len(m.OracleId) > 0 { - i -= len(m.OracleId) - copy(dAtA[i:], m.OracleId) - i = encodeVarintTypes(dAtA, i, uint64(len(m.OracleId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - func (m *GossipVotes) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1010,26 +901,6 @@ func (m *Oracle) Size() (n int) { return n } -func (m *Result) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.OracleId) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - if m.Timestamp != 0 { - n += 1 + sovTypes(uint64(m.Timestamp)) - } - l = len(m.Data) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - func (m *GossipVotes) Size() (n int) { if m == nil { return 0 @@ -1160,7 +1031,7 @@ func (m *Vote) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Timestamp |= uint64(b&0x7F) << shift + m.Timestamp |= int64(b&0x7F) << shift if b < 0x80 { break } @@ -1395,7 +1266,7 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.SignedTimestamp |= uint64(b&0x7F) << shift + m.SignedTimestamp |= int64(b&0x7F) << shift if b < 0x80 { break } @@ -2009,139 +1880,6 @@ func (m *Oracle) Unmarshal(dAtA []byte) error { } return nil } -func (m *Result) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Result: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Result: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OracleId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.OracleId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) - } - m.Timestamp = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Timestamp |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Data = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *GossipVotes) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index ba3f60481f8..f104eefeda6 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -3,12 +3,10 @@ package tendermint.oracle; option go_package = "github.com/cometbft/cometbft/proto/tendermint/oracle"; -import "gogoproto/gogo.proto"; - message Vote { bytes validator = 1; string oracle_id = 2; - uint64 timestamp = 3; + int64 timestamp = 3; string data = 4; } @@ -17,7 +15,7 @@ message GossipVote { bytes public_key = 2; string sign_type = 3; repeated Vote votes = 4; - uint64 signed_timestamp = 5; + int64 signed_timestamp = 5; bytes signature = 6; } @@ -41,12 +39,6 @@ message Oracle { string spec = 10; } -message Result { - string oracle_id = 1 [ (gogoproto.moretags) = "db:\"oracle_id\"" ]; - int64 timestamp = 3 [ (gogoproto.moretags) = "db:\"timestamp\"" ]; - string data = 4 [ (gogoproto.moretags) = "db:\"data\"" ]; -} - message GossipVotes { repeated GossipVote GossipVotes = 1; } \ No newline at end of file diff --git a/types/priv_validator.go b/types/priv_validator.go index 9f6b9f0822b..c0e79e08102 100644 --- a/types/priv_validator.go +++ b/types/priv_validator.go @@ -109,7 +109,7 @@ func (pv MockPV) SignOracleVote(chainID string, vote *oracleproto.GossipVote) er if err != nil { return err } - vote.SignedTimestamp = uint64(time.Now().Unix()) + vote.SignedTimestamp = time.Now().Unix() vote.Signature = sig return nil From 7d2ae5cddff9eb4c59757b59ae239576f20b2468 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 23 Apr 2024 12:14:34 +0800 Subject: [PATCH 056/150] update config, remove unsignedBuffer, change getting of oracleVotes to blocking, some compression work --- abci/types/types.pb.go | 778 +++++++------------ config/config.go | 12 +- config/toml.go | 4 +- node/node.go | 3 - oracle/reactor.go | 29 +- oracle/service/runner/runner.go | 205 +++-- oracle/service/types/info.go | 27 +- oracle/service/utils/compress.go | 36 - privval/file.go | 1 - privval/retry_signer_client.go | 1 - privval/signer_client.go | 1 - proto/tendermint/abci/types.proto | 8 +- proto/tendermint/oracle/types.pb.go | 1092 ++------------------------- proto/tendermint/oracle/types.proto | 35 +- types/oracle.go | 6 +- types/priv_validator.go | 3 - 16 files changed, 459 insertions(+), 1782 deletions(-) delete mode 100644 oracle/service/utils/compress.go diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go index 791f55bd16d..ea5e446be2b 100644 --- a/abci/types/types.pb.go +++ b/abci/types/types.pb.go @@ -244,7 +244,7 @@ func (x ResponseValidateOracleVotes_Status) String() string { } func (ResponseValidateOracleVotes_Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{41, 0} + return fileDescriptor_252557cfdd89a31a, []int{40, 0} } type Request struct { @@ -3106,75 +3106,15 @@ func (m *ResponseSignGossipVote) GetEncodedTx() []byte { return nil } -type Vote struct { - OracleId string `protobuf:"bytes,1,opt,name=oracle_id,json=oracleId,proto3" json:"oracle_id,omitempty"` - Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Data string `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` -} - -func (m *Vote) Reset() { *m = Vote{} } -func (m *Vote) String() string { return proto.CompactTextString(m) } -func (*Vote) ProtoMessage() {} -func (*Vote) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{39} -} -func (m *Vote) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Vote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Vote.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Vote) XXX_Merge(src proto.Message) { - xxx_messageInfo_Vote.Merge(m, src) -} -func (m *Vote) XXX_Size() int { - return m.Size() -} -func (m *Vote) XXX_DiscardUnknown() { - xxx_messageInfo_Vote.DiscardUnknown(m) -} - -var xxx_messageInfo_Vote proto.InternalMessageInfo - -func (m *Vote) GetOracleId() string { - if m != nil { - return m.OracleId - } - return "" -} - -func (m *Vote) GetTimestamp() int64 { - if m != nil { - return m.Timestamp - } - return 0 -} - -func (m *Vote) GetData() string { - if m != nil { - return m.Data - } - return "" -} - type ResponsePrepareOracleVotes struct { - Votes []Vote `protobuf:"bytes,1,rep,name=votes,proto3" json:"votes"` + Vote *oracle.Vote `protobuf:"bytes,1,opt,name=vote,proto3" json:"vote,omitempty"` } func (m *ResponsePrepareOracleVotes) Reset() { *m = ResponsePrepareOracleVotes{} } func (m *ResponsePrepareOracleVotes) String() string { return proto.CompactTextString(m) } func (*ResponsePrepareOracleVotes) ProtoMessage() {} func (*ResponsePrepareOracleVotes) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{40} + return fileDescriptor_252557cfdd89a31a, []int{39} } func (m *ResponsePrepareOracleVotes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3203,9 +3143,9 @@ func (m *ResponsePrepareOracleVotes) XXX_DiscardUnknown() { var xxx_messageInfo_ResponsePrepareOracleVotes proto.InternalMessageInfo -func (m *ResponsePrepareOracleVotes) GetVotes() []Vote { +func (m *ResponsePrepareOracleVotes) GetVote() *oracle.Vote { if m != nil { - return m.Votes + return m.Vote } return nil } @@ -3219,7 +3159,7 @@ func (m *ResponseValidateOracleVotes) Reset() { *m = ResponseValidateOra func (m *ResponseValidateOracleVotes) String() string { return proto.CompactTextString(m) } func (*ResponseValidateOracleVotes) ProtoMessage() {} func (*ResponseValidateOracleVotes) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{41} + return fileDescriptor_252557cfdd89a31a, []int{40} } func (m *ResponseValidateOracleVotes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3271,7 +3211,7 @@ func (m *CommitInfo) Reset() { *m = CommitInfo{} } func (m *CommitInfo) String() string { return proto.CompactTextString(m) } func (*CommitInfo) ProtoMessage() {} func (*CommitInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{42} + return fileDescriptor_252557cfdd89a31a, []int{41} } func (m *CommitInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3329,7 +3269,7 @@ func (m *ExtendedCommitInfo) Reset() { *m = ExtendedCommitInfo{} } func (m *ExtendedCommitInfo) String() string { return proto.CompactTextString(m) } func (*ExtendedCommitInfo) ProtoMessage() {} func (*ExtendedCommitInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{43} + return fileDescriptor_252557cfdd89a31a, []int{42} } func (m *ExtendedCommitInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3384,7 +3324,7 @@ func (m *Event) Reset() { *m = Event{} } func (m *Event) String() string { return proto.CompactTextString(m) } func (*Event) ProtoMessage() {} func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{44} + return fileDescriptor_252557cfdd89a31a, []int{43} } func (m *Event) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3438,7 +3378,7 @@ func (m *EventAttribute) Reset() { *m = EventAttribute{} } func (m *EventAttribute) String() string { return proto.CompactTextString(m) } func (*EventAttribute) ProtoMessage() {} func (*EventAttribute) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{45} + return fileDescriptor_252557cfdd89a31a, []int{44} } func (m *EventAttribute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3506,7 +3446,7 @@ func (m *ExecTxResult) Reset() { *m = ExecTxResult{} } func (m *ExecTxResult) String() string { return proto.CompactTextString(m) } func (*ExecTxResult) ProtoMessage() {} func (*ExecTxResult) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{46} + return fileDescriptor_252557cfdd89a31a, []int{45} } func (m *ExecTxResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3605,7 +3545,7 @@ func (m *TxResult) Reset() { *m = TxResult{} } func (m *TxResult) String() string { return proto.CompactTextString(m) } func (*TxResult) ProtoMessage() {} func (*TxResult) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{47} + return fileDescriptor_252557cfdd89a31a, []int{46} } func (m *TxResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3672,7 +3612,7 @@ func (m *Validator) Reset() { *m = Validator{} } func (m *Validator) String() string { return proto.CompactTextString(m) } func (*Validator) ProtoMessage() {} func (*Validator) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{48} + return fileDescriptor_252557cfdd89a31a, []int{47} } func (m *Validator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3724,7 +3664,7 @@ func (m *ValidatorUpdate) Reset() { *m = ValidatorUpdate{} } func (m *ValidatorUpdate) String() string { return proto.CompactTextString(m) } func (*ValidatorUpdate) ProtoMessage() {} func (*ValidatorUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{49} + return fileDescriptor_252557cfdd89a31a, []int{48} } func (m *ValidatorUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3776,7 +3716,7 @@ 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_252557cfdd89a31a, []int{50} + return fileDescriptor_252557cfdd89a31a, []int{49} } func (m *VoteInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3834,7 +3774,7 @@ func (m *ExtendedVoteInfo) Reset() { *m = ExtendedVoteInfo{} } func (m *ExtendedVoteInfo) String() string { return proto.CompactTextString(m) } func (*ExtendedVoteInfo) ProtoMessage() {} func (*ExtendedVoteInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{51} + return fileDescriptor_252557cfdd89a31a, []int{50} } func (m *ExtendedVoteInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3909,7 +3849,7 @@ func (m *Misbehavior) Reset() { *m = Misbehavior{} } func (m *Misbehavior) String() string { return proto.CompactTextString(m) } func (*Misbehavior) ProtoMessage() {} func (*Misbehavior) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{52} + return fileDescriptor_252557cfdd89a31a, []int{51} } func (m *Misbehavior) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3985,7 +3925,7 @@ func (m *Snapshot) Reset() { *m = Snapshot{} } func (m *Snapshot) String() string { return proto.CompactTextString(m) } func (*Snapshot) ProtoMessage() {} func (*Snapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{53} + return fileDescriptor_252557cfdd89a31a, []int{52} } func (m *Snapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4096,7 +4036,6 @@ func init() { proto.RegisterType((*ResponseVerifyVoteExtension)(nil), "tendermint.abci.ResponseVerifyVoteExtension") proto.RegisterType((*ResponseFinalizeBlock)(nil), "tendermint.abci.ResponseFinalizeBlock") proto.RegisterType((*ResponseSignGossipVote)(nil), "tendermint.abci.ResponseSignGossipVote") - proto.RegisterType((*Vote)(nil), "tendermint.abci.Vote") proto.RegisterType((*ResponsePrepareOracleVotes)(nil), "tendermint.abci.ResponsePrepareOracleVotes") proto.RegisterType((*ResponseValidateOracleVotes)(nil), "tendermint.abci.ResponseValidateOracleVotes") proto.RegisterType((*CommitInfo)(nil), "tendermint.abci.CommitInfo") @@ -4116,227 +4055,225 @@ func init() { func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) } var fileDescriptor_252557cfdd89a31a = []byte{ - // 3509 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0x4d, 0x70, 0x23, 0xc5, - 0xf5, 0xd7, 0xe8, 0xcb, 0xd2, 0xd3, 0x87, 0xc7, 0xed, 0x5d, 0xaf, 0xd0, 0x2e, 0xb6, 0x77, 0x28, - 0x60, 0x59, 0xc0, 0x06, 0xef, 0x7f, 0x81, 0xad, 0x85, 0x7f, 0xc5, 0xd6, 0x6a, 0x91, 0xbd, 0x8b, - 0x6d, 0xc6, 0xf2, 0x52, 0xe4, 0x83, 0x61, 0x24, 0xb5, 0xa5, 0x61, 0x25, 0xcd, 0x30, 0x33, 0x32, - 0x32, 0xa7, 0x54, 0x48, 0xaa, 0x52, 0x9c, 0xa8, 0xca, 0x85, 0x43, 0x38, 0xe4, 0x90, 0x4b, 0x0e, - 0x39, 0x27, 0x97, 0x9c, 0x72, 0xe0, 0x90, 0x03, 0xa7, 0x54, 0x4e, 0x24, 0x81, 0x1b, 0xd7, 0x1c, - 0x72, 0x4d, 0xf5, 0xc7, 0x7c, 0x6a, 0xc6, 0x92, 0x16, 0x72, 0x48, 0x25, 0xb7, 0xee, 0x37, 0xef, - 0xbd, 0x56, 0xbf, 0x7e, 0xdd, 0xef, 0xf5, 0xef, 0xb5, 0xe0, 0xb2, 0x8d, 0x87, 0x1d, 0x6c, 0x0e, - 0xb4, 0xa1, 0xbd, 0xa9, 0xb6, 0xda, 0xda, 0xa6, 0x7d, 0x66, 0x60, 0x6b, 0xc3, 0x30, 0x75, 0x5b, - 0x47, 0x8b, 0xde, 0xc7, 0x0d, 0xf2, 0xb1, 0xfa, 0xb8, 0x8f, 0xbb, 0x6d, 0x9e, 0x19, 0xb6, 0xbe, - 0x69, 0x98, 0xba, 0x7e, 0xc2, 0xf8, 0xab, 0x57, 0x26, 0x3f, 0x3f, 0xc4, 0x67, 0x5c, 0x5b, 0x40, - 0x98, 0x8e, 0xb2, 0x69, 0xa8, 0xa6, 0x3a, 0x70, 0x3e, 0xaf, 0x4f, 0x7c, 0x3e, 0x55, 0xfb, 0x5a, - 0x47, 0xb5, 0x75, 0x93, 0x73, 0xac, 0x75, 0x75, 0xbd, 0xdb, 0xc7, 0x9b, 0xb4, 0xd7, 0x1a, 0x9d, - 0x6c, 0xda, 0xda, 0x00, 0x5b, 0xb6, 0x3a, 0x30, 0x38, 0xc3, 0x85, 0xae, 0xde, 0xd5, 0x69, 0x73, - 0x93, 0xb4, 0x22, 0xc6, 0xd5, 0x4d, 0xb5, 0xdd, 0xc7, 0xfe, 0x49, 0x4a, 0x7f, 0x2e, 0xc0, 0x82, - 0x8c, 0xdf, 0x1f, 0x61, 0xcb, 0x46, 0x5b, 0x90, 0xc6, 0xed, 0x9e, 0x5e, 0x11, 0xd6, 0x85, 0x6b, - 0x85, 0xad, 0x2b, 0x1b, 0xa1, 0xf9, 0x6f, 0x70, 0xbe, 0x7a, 0xbb, 0xa7, 0x37, 0x12, 0x32, 0xe5, - 0x45, 0x37, 0x21, 0x73, 0xd2, 0x1f, 0x59, 0xbd, 0x4a, 0x92, 0x0a, 0x3d, 0x1e, 0x27, 0x74, 0x97, - 0x30, 0x35, 0x12, 0x32, 0xe3, 0x26, 0x43, 0x69, 0xc3, 0x13, 0xbd, 0x92, 0x3a, 0x7f, 0xa8, 0xdd, - 0xe1, 0x09, 0x1d, 0x8a, 0xf0, 0xa2, 0x1d, 0x00, 0x6d, 0xa8, 0xd9, 0x4a, 0xbb, 0xa7, 0x6a, 0xc3, - 0x4a, 0x86, 0x4a, 0x5e, 0x8d, 0x97, 0xd4, 0xec, 0x1a, 0x61, 0x6c, 0x24, 0xe4, 0xbc, 0xe6, 0x74, - 0xc8, 0xcf, 0x7d, 0x7f, 0x84, 0xcd, 0xb3, 0x4a, 0xf6, 0xfc, 0x9f, 0xfb, 0x26, 0x61, 0x22, 0x3f, - 0x97, 0x72, 0xa3, 0x57, 0x21, 0xd7, 0xee, 0xe1, 0xf6, 0x43, 0xc5, 0x1e, 0x57, 0x72, 0x54, 0x72, - 0x2d, 0x4e, 0xb2, 0x46, 0xf8, 0x9a, 0xe3, 0x46, 0x42, 0x5e, 0x68, 0xb3, 0x26, 0x7a, 0x05, 0xb2, - 0x6d, 0x7d, 0x30, 0xd0, 0xec, 0x4a, 0x81, 0xca, 0xae, 0xc6, 0xca, 0x52, 0xae, 0x46, 0x42, 0xe6, - 0xfc, 0x68, 0x1f, 0xca, 0x7d, 0xcd, 0xb2, 0x15, 0x6b, 0xa8, 0x1a, 0x56, 0x4f, 0xb7, 0xad, 0x4a, - 0x91, 0x6a, 0x78, 0x32, 0x4e, 0xc3, 0x7d, 0xcd, 0xb2, 0x8f, 0x1c, 0xe6, 0x46, 0x42, 0x2e, 0xf5, - 0xfd, 0x04, 0xa2, 0x4f, 0x3f, 0x39, 0xc1, 0xa6, 0xab, 0xb0, 0x52, 0x3a, 0x5f, 0xdf, 0x01, 0xe1, - 0x76, 0xe4, 0x89, 0x3e, 0xdd, 0x4f, 0x40, 0x3f, 0x80, 0xe5, 0xbe, 0xae, 0x76, 0x5c, 0x75, 0x4a, - 0xbb, 0x37, 0x1a, 0x3e, 0xac, 0x94, 0xa9, 0xd2, 0x67, 0x62, 0x7f, 0xa4, 0xae, 0x76, 0x1c, 0x15, - 0x35, 0x22, 0xd0, 0x48, 0xc8, 0x4b, 0xfd, 0x30, 0x11, 0xbd, 0x03, 0x17, 0x54, 0xc3, 0xe8, 0x9f, - 0x85, 0xb5, 0x2f, 0x52, 0xed, 0xd7, 0xe3, 0xb4, 0x6f, 0x13, 0x99, 0xb0, 0x7a, 0xa4, 0x4e, 0x50, - 0x51, 0x13, 0x44, 0xc3, 0xc4, 0x86, 0x6a, 0x62, 0xc5, 0x30, 0x75, 0x43, 0xb7, 0xd4, 0x7e, 0x45, - 0xa4, 0xba, 0x9f, 0x8e, 0xd3, 0x7d, 0xc8, 0xf8, 0x0f, 0x39, 0x7b, 0x23, 0x21, 0x2f, 0x1a, 0x41, - 0x12, 0xd3, 0xaa, 0xb7, 0xb1, 0x65, 0x79, 0x5a, 0x97, 0xa6, 0x69, 0xa5, 0xfc, 0x41, 0xad, 0x01, - 0x12, 0xaa, 0x43, 0x01, 0x8f, 0x89, 0xb8, 0x72, 0xaa, 0xdb, 0xb8, 0x82, 0xa8, 0x42, 0x29, 0x76, - 0x87, 0x52, 0xd6, 0x07, 0xba, 0x8d, 0x1b, 0x09, 0x19, 0xb0, 0xdb, 0x43, 0x2a, 0x5c, 0x3c, 0xc5, - 0xa6, 0x76, 0x72, 0x46, 0xd5, 0x28, 0xf4, 0x8b, 0xa5, 0xe9, 0xc3, 0xca, 0x32, 0x55, 0xf8, 0x6c, - 0x9c, 0xc2, 0x07, 0x54, 0x88, 0xa8, 0xa8, 0x3b, 0x22, 0x8d, 0x84, 0xbc, 0x7c, 0x3a, 0x49, 0x26, - 0x2e, 0x76, 0xa2, 0x0d, 0xd5, 0xbe, 0xf6, 0x21, 0x56, 0x5a, 0x7d, 0xbd, 0xfd, 0xb0, 0x72, 0xe1, - 0x7c, 0x17, 0xbb, 0xcb, 0xb9, 0x77, 0x08, 0x33, 0x71, 0xb1, 0x13, 0x3f, 0x01, 0xc9, 0x20, 0x5a, - 0x5a, 0x77, 0xa8, 0x74, 0x75, 0xcb, 0xd2, 0x0c, 0x36, 0xfd, 0x8b, 0x54, 0xe3, 0x53, 0x71, 0x1a, - 0x8f, 0xb4, 0xee, 0xf0, 0x75, 0xca, 0xce, 0x4d, 0x50, 0xb6, 0x02, 0x14, 0xe2, 0x59, 0xce, 0xca, - 0xb3, 0x23, 0x91, 0xaa, 0xb5, 0x2a, 0x2b, 0xe7, 0x7b, 0x16, 0x5f, 0xfd, 0x03, 0x2a, 0x42, 0x14, - 0x91, 0x1d, 0x86, 0x8c, 0x09, 0x2a, 0x35, 0x33, 0x3b, 0xbd, 0x43, 0x03, 0x5c, 0x9a, 0x62, 0x66, - 0x2e, 0x14, 0x1c, 0x61, 0xf9, 0x74, 0x92, 0xbc, 0xb3, 0x00, 0x99, 0x53, 0xb5, 0x3f, 0xc2, 0x7b, - 0xe9, 0x5c, 0x5a, 0xcc, 0xec, 0xa5, 0x73, 0x0b, 0x62, 0x6e, 0x2f, 0x9d, 0xcb, 0x8b, 0xb0, 0x97, - 0xce, 0x81, 0x58, 0x90, 0x9e, 0x86, 0x82, 0xef, 0xbc, 0x46, 0x15, 0x58, 0x18, 0x60, 0xcb, 0x52, - 0xbb, 0x98, 0x1e, 0xef, 0x79, 0xd9, 0xe9, 0x4a, 0x65, 0x28, 0xfa, 0xcf, 0x68, 0xe9, 0x13, 0xc1, - 0x95, 0x24, 0xc7, 0x2f, 0x91, 0x3c, 0xc5, 0x26, 0xf5, 0x12, 0x2e, 0xc9, 0xbb, 0xe8, 0x09, 0x28, - 0xd1, 0x15, 0x56, 0x9c, 0xef, 0x24, 0x06, 0xa4, 0xe5, 0x22, 0x25, 0x3e, 0xe0, 0x4c, 0x6b, 0x50, - 0x30, 0xb6, 0x0c, 0x97, 0x25, 0x45, 0x59, 0xc0, 0xd8, 0x32, 0x1c, 0x86, 0xab, 0x50, 0x24, 0x36, - 0x70, 0x39, 0xd2, 0x74, 0x90, 0x02, 0xa1, 0x71, 0x16, 0xe9, 0x4f, 0x49, 0x10, 0xc3, 0xe7, 0x3a, - 0x7a, 0x05, 0xd2, 0x24, 0x02, 0xf2, 0x68, 0x55, 0xdd, 0x60, 0xe1, 0x71, 0xc3, 0x09, 0x8f, 0x1b, - 0x4d, 0x27, 0x3c, 0xee, 0xe4, 0x3e, 0xff, 0x72, 0x2d, 0xf1, 0xc9, 0x5f, 0xd7, 0x04, 0x99, 0x4a, - 0xa0, 0xc7, 0xc8, 0x69, 0xae, 0x6a, 0x43, 0x45, 0xeb, 0xd0, 0x9f, 0x9c, 0x27, 0x47, 0xb5, 0xaa, - 0x0d, 0x77, 0x3b, 0xe8, 0x3e, 0x88, 0x6d, 0x7d, 0x68, 0xe1, 0xa1, 0x35, 0xb2, 0x14, 0x16, 0xa0, - 0x79, 0x8c, 0x0a, 0x44, 0x1a, 0x16, 0x41, 0x6b, 0x0e, 0xe7, 0x21, 0x65, 0x94, 0x17, 0xdb, 0x41, - 0x02, 0xba, 0x0b, 0xe0, 0x46, 0x71, 0xab, 0x92, 0x5e, 0x4f, 0x5d, 0x2b, 0x6c, 0xad, 0x4f, 0x2c, - 0xfe, 0x03, 0x87, 0xe5, 0xd8, 0x20, 0xab, 0xbc, 0x93, 0x26, 0x3f, 0x57, 0xf6, 0x49, 0xa2, 0xa7, - 0x60, 0x51, 0x35, 0x0c, 0xc5, 0xb2, 0x89, 0x43, 0xb5, 0xce, 0x88, 0x27, 0x91, 0xf0, 0x57, 0x94, - 0x4b, 0xaa, 0x61, 0x1c, 0x11, 0xea, 0x0e, 0x21, 0xa2, 0x27, 0xa1, 0x4c, 0x42, 0x9d, 0xa6, 0xf6, - 0x95, 0x1e, 0xd6, 0xba, 0x3d, 0x9b, 0x86, 0xb9, 0x94, 0x5c, 0xe2, 0xd4, 0x06, 0x25, 0x4a, 0x1d, - 0x77, 0xc5, 0x69, 0x98, 0x43, 0x08, 0xd2, 0x1d, 0xd5, 0x56, 0xa9, 0x25, 0x8b, 0x32, 0x6d, 0x13, - 0x9a, 0xa1, 0xda, 0x3d, 0x6e, 0x1f, 0xda, 0x46, 0x2b, 0x90, 0xe5, 0x6a, 0x53, 0x54, 0x2d, 0xef, - 0xa1, 0x0b, 0x90, 0x31, 0x4c, 0xfd, 0x14, 0xd3, 0xa5, 0xcb, 0xc9, 0xac, 0x23, 0xc9, 0x50, 0x0e, - 0x86, 0x44, 0x54, 0x86, 0xa4, 0x3d, 0xe6, 0xa3, 0x24, 0xed, 0x31, 0x7a, 0x01, 0xd2, 0xc4, 0x90, - 0x74, 0x8c, 0x72, 0x44, 0x12, 0xc0, 0xe5, 0x9a, 0x67, 0x06, 0x96, 0x29, 0xa7, 0xb4, 0x08, 0xa5, - 0x40, 0xa8, 0x94, 0x56, 0xe0, 0x42, 0x54, 0xe4, 0x93, 0x7a, 0x2e, 0x3d, 0x10, 0xc1, 0xd0, 0x4d, - 0xc8, 0xb9, 0xa1, 0x8f, 0x39, 0xce, 0x63, 0x13, 0xc3, 0x3a, 0xcc, 0xb2, 0xcb, 0x4a, 0x3c, 0x86, - 0x2c, 0x40, 0x4f, 0xe5, 0x89, 0x4e, 0x51, 0x5e, 0x50, 0x0d, 0xa3, 0xa1, 0x5a, 0x3d, 0xe9, 0x5d, - 0xa8, 0xc4, 0x85, 0x35, 0x9f, 0xc1, 0x04, 0xea, 0xf6, 0x8e, 0xc1, 0x56, 0x20, 0x7b, 0xa2, 0x9b, - 0x03, 0xd5, 0xa6, 0xca, 0x4a, 0x32, 0xef, 0x11, 0x43, 0xb2, 0x10, 0x97, 0xa2, 0x64, 0xd6, 0x91, - 0x14, 0x78, 0x2c, 0x36, 0xb4, 0x11, 0x11, 0x6d, 0xd8, 0xc1, 0xcc, 0xac, 0x25, 0x99, 0x75, 0x3c, - 0x45, 0xec, 0xc7, 0xb2, 0x0e, 0x19, 0xd6, 0xa2, 0x73, 0xa5, 0xfa, 0xf3, 0x32, 0xef, 0x49, 0x9f, - 0xa6, 0x60, 0x25, 0x3a, 0xc0, 0xa1, 0x75, 0x28, 0x0e, 0xd4, 0xb1, 0x62, 0x8f, 0xb9, 0xdb, 0x09, - 0x74, 0xe1, 0x61, 0xa0, 0x8e, 0x9b, 0x63, 0xe6, 0x73, 0x22, 0xa4, 0xec, 0xb1, 0x55, 0x49, 0xae, - 0xa7, 0xae, 0x15, 0x65, 0xd2, 0x44, 0xc7, 0xb0, 0xd4, 0xd7, 0xdb, 0x6a, 0x5f, 0xe9, 0xab, 0x96, - 0xad, 0xf0, 0xcc, 0x87, 0x6d, 0xa2, 0x27, 0x26, 0x8c, 0xcd, 0x42, 0x15, 0xee, 0xb0, 0xf5, 0x24, - 0x07, 0x0e, 0xf7, 0xff, 0x45, 0xaa, 0xe3, 0xbe, 0xea, 0x2c, 0x35, 0xba, 0x03, 0x85, 0x81, 0x66, - 0xb5, 0x70, 0x4f, 0x3d, 0xd5, 0x74, 0x93, 0xef, 0xa6, 0x49, 0xa7, 0x79, 0xc3, 0xe3, 0xe1, 0x9a, - 0xfc, 0x62, 0xbe, 0x25, 0xc9, 0x04, 0x7c, 0xd8, 0x39, 0x4d, 0xb2, 0x73, 0x9f, 0x26, 0x2f, 0xc0, - 0x85, 0x21, 0x1e, 0xdb, 0x8a, 0xb7, 0x5f, 0x99, 0x9f, 0x2c, 0x50, 0xd3, 0x23, 0xf2, 0xcd, 0xdd, - 0xe1, 0x16, 0x71, 0x19, 0xf4, 0x0c, 0x4d, 0x11, 0x0c, 0xdd, 0xc2, 0xa6, 0xa2, 0x76, 0x3a, 0x26, - 0xb6, 0x2c, 0x9a, 0x55, 0x16, 0x69, 0xdc, 0xa7, 0xf4, 0x6d, 0x46, 0x96, 0x7e, 0xee, 0x5f, 0x9a, - 0x60, 0x4a, 0xc0, 0x0d, 0x2f, 0x78, 0x86, 0x3f, 0x22, 0x61, 0x8d, 0xca, 0x77, 0x02, 0xb6, 0x67, - 0xa9, 0xf9, 0xe5, 0xc9, 0xfd, 0x15, 0xb6, 0x39, 0x72, 0xc4, 0xe3, 0xcd, 0x9e, 0x7a, 0x34, 0xb3, - 0x23, 0x48, 0x53, 0xa3, 0xa4, 0xd9, 0x11, 0x43, 0xda, 0xff, 0x69, 0x4b, 0xf1, 0x51, 0x0a, 0x96, - 0x26, 0xf2, 0x2b, 0x77, 0x62, 0x42, 0xe4, 0xc4, 0x92, 0x91, 0x13, 0x4b, 0xcd, 0x3d, 0x31, 0xbe, - 0xd6, 0xe9, 0xe9, 0x6b, 0x9d, 0xf9, 0x0e, 0xd7, 0x3a, 0xfb, 0x68, 0x6b, 0xfd, 0x6f, 0x5d, 0x85, - 0x5f, 0x0a, 0x50, 0x8d, 0x4f, 0x4a, 0x23, 0x97, 0xe3, 0x59, 0x58, 0x72, 0x7f, 0x8a, 0xab, 0x9e, - 0x1d, 0x8c, 0xa2, 0xfb, 0x81, 0xeb, 0x8f, 0x8d, 0x71, 0x4f, 0x42, 0x39, 0x94, 0x32, 0x33, 0x57, - 0x2e, 0x9d, 0xfa, 0xc7, 0x97, 0x7e, 0x9a, 0x72, 0x03, 0x4f, 0x20, 0xaf, 0x8d, 0xd8, 0xad, 0x6f, - 0xc2, 0x72, 0x07, 0xb7, 0xb5, 0xce, 0xa3, 0x6e, 0xd6, 0x25, 0x2e, 0xfd, 0xbf, 0xbd, 0x1a, 0xe9, - 0x25, 0x17, 0x23, 0x2f, 0x03, 0x91, 0x4a, 0x84, 0x48, 0x25, 0xe8, 0x7b, 0x50, 0xf4, 0x5d, 0x3a, - 0x58, 0x88, 0x0b, 0x41, 0x06, 0x2c, 0xb9, 0xdf, 0xf0, 0xf4, 0xcb, 0x85, 0xae, 0xdb, 0x8e, 0x75, - 0x26, 0xe9, 0xb2, 0x1b, 0xd1, 0x27, 0xaf, 0x14, 0xd2, 0x2d, 0xcf, 0xc1, 0x27, 0xf3, 0x7e, 0x74, - 0x19, 0xf2, 0xfc, 0x46, 0xe1, 0xa6, 0x52, 0x39, 0x46, 0x68, 0x8e, 0xa5, 0xdf, 0x16, 0x21, 0x27, - 0x63, 0xcb, 0x20, 0x69, 0x28, 0xda, 0x81, 0x3c, 0x1e, 0xb7, 0xb1, 0x61, 0x3b, 0x99, 0x7b, 0xf4, - 0x85, 0x91, 0x71, 0xd7, 0x1d, 0xce, 0x46, 0x42, 0xf6, 0xc4, 0xd0, 0x0d, 0x8e, 0x08, 0xc5, 0x83, - 0x3b, 0x5c, 0xdc, 0x0f, 0x09, 0xbd, 0xe4, 0x40, 0x42, 0xa9, 0x58, 0xb4, 0x83, 0x49, 0x85, 0x30, - 0xa1, 0x1b, 0x1c, 0x13, 0x4a, 0x4f, 0x19, 0x2c, 0x00, 0x0a, 0xd5, 0x02, 0xa0, 0x50, 0x76, 0xca, - 0x34, 0x63, 0x50, 0xa1, 0x97, 0x1c, 0x54, 0x68, 0x61, 0xca, 0x2f, 0x0e, 0xc1, 0x42, 0xaf, 0xf9, - 0x60, 0xa1, 0x3c, 0x15, 0x5d, 0x8f, 0x15, 0x8d, 0xc0, 0x85, 0x6e, 0xb9, 0xb8, 0x50, 0x31, 0x16, - 0x53, 0xe2, 0xc2, 0x61, 0x60, 0xe8, 0x60, 0x02, 0x18, 0x2a, 0xc5, 0xde, 0x89, 0x99, 0x8a, 0x29, - 0xc8, 0xd0, 0xc1, 0x04, 0x32, 0x54, 0x9e, 0xa2, 0x70, 0x0a, 0x34, 0xf4, 0xc3, 0x68, 0x68, 0x28, - 0x1e, 0xbc, 0xe1, 0x3f, 0x73, 0x36, 0x6c, 0x48, 0x89, 0xc1, 0x86, 0xc4, 0xd8, 0x0b, 0x36, 0x53, - 0x3f, 0x33, 0x38, 0x74, 0x1c, 0x01, 0x0e, 0x31, 0x18, 0xe7, 0x5a, 0xac, 0xf2, 0x19, 0xd0, 0xa1, - 0xe3, 0x08, 0x74, 0x08, 0x4d, 0x55, 0x3b, 0x15, 0x1e, 0xba, 0x1b, 0x84, 0x87, 0x96, 0x63, 0x92, - 0x6d, 0x6f, 0xb7, 0xc7, 0xe0, 0x43, 0xad, 0x38, 0x7c, 0x88, 0x61, 0x38, 0xcf, 0xc5, 0x6a, 0x9c, - 0x03, 0x20, 0x3a, 0x98, 0x00, 0x88, 0x2e, 0x4e, 0xf1, 0xb4, 0x29, 0x08, 0xd1, 0x51, 0x04, 0x42, - 0xb4, 0x12, 0x8b, 0xb8, 0x31, 0x95, 0x53, 0x21, 0x22, 0x25, 0x06, 0x22, 0xba, 0x34, 0xc5, 0xc1, - 0x66, 0xc6, 0x88, 0x5a, 0x71, 0x18, 0x51, 0x65, 0x9a, 0xa9, 0x1f, 0x09, 0x24, 0xca, 0x88, 0xd9, - 0xbd, 0x74, 0x2e, 0x27, 0xe6, 0x19, 0x3c, 0xb4, 0x97, 0xce, 0x15, 0xc4, 0xa2, 0xf4, 0x0c, 0x49, - 0x69, 0x43, 0x11, 0x80, 0x5c, 0x1e, 0xb1, 0x69, 0xea, 0x26, 0x87, 0x7b, 0x58, 0x47, 0xba, 0x06, - 0x45, 0xff, 0x69, 0x7f, 0x0e, 0xa0, 0x44, 0x2f, 0xe9, 0xbe, 0x13, 0x5e, 0xfa, 0x9d, 0xe0, 0xc9, - 0x52, 0x48, 0xc9, 0x0f, 0x38, 0xe4, 0x39, 0xe0, 0xe0, 0x83, 0x99, 0x92, 0x41, 0x98, 0x69, 0x0d, - 0x0a, 0xe4, 0xf2, 0x1d, 0x42, 0x90, 0x54, 0xc3, 0x45, 0x90, 0xae, 0xc3, 0x12, 0xcd, 0xa0, 0x18, - 0x18, 0xc5, 0x23, 0x6e, 0x9a, 0x46, 0xdc, 0x45, 0xf2, 0x81, 0xf9, 0x0d, 0x4b, 0x58, 0x9e, 0x87, - 0x65, 0x1f, 0xaf, 0x7b, 0xa9, 0x67, 0x70, 0x8a, 0xe8, 0x72, 0x6f, 0xf3, 0xdb, 0xfd, 0x1f, 0x05, - 0xcf, 0x42, 0x1e, 0xf4, 0x14, 0x85, 0x12, 0x09, 0xdf, 0x11, 0x4a, 0x94, 0x7c, 0x64, 0x94, 0xc8, - 0x0f, 0x52, 0xa4, 0x82, 0x20, 0xc5, 0x3f, 0x05, 0x6f, 0x4d, 0x5c, 0xcc, 0xa7, 0xad, 0x77, 0x30, - 0x87, 0x0d, 0x68, 0x9b, 0xe4, 0xa8, 0x7d, 0xbd, 0xcb, 0xc1, 0x01, 0xd2, 0x24, 0x5c, 0x6e, 0x48, - 0xce, 0xf3, 0x88, 0xeb, 0x22, 0x0e, 0x2c, 0x13, 0xe4, 0x88, 0x83, 0x08, 0xa9, 0x87, 0x98, 0x95, - 0x55, 0x8a, 0x32, 0x69, 0x12, 0x3e, 0xea, 0x7c, 0x3c, 0xa3, 0x63, 0x1d, 0xf4, 0x0a, 0xe4, 0x69, - 0xcd, 0x4c, 0xd1, 0x0d, 0x8b, 0x97, 0x52, 0x02, 0xb9, 0x2e, 0x2b, 0x9c, 0x6d, 0x1c, 0x12, 0x9e, - 0x03, 0xc3, 0x92, 0x73, 0x06, 0x6f, 0xf9, 0x92, 0xa9, 0x7c, 0x20, 0x05, 0xbd, 0x02, 0x79, 0xf2, - 0xeb, 0x2d, 0x43, 0x6d, 0xe3, 0x0a, 0xd0, 0x1f, 0xea, 0x11, 0xa4, 0xdf, 0x24, 0x61, 0x31, 0x14, - 0x82, 0x23, 0xe7, 0xee, 0xb8, 0x64, 0xd2, 0x87, 0x81, 0xcd, 0x66, 0x8f, 0x55, 0x80, 0xae, 0x6a, - 0x29, 0x1f, 0xa8, 0x43, 0x1b, 0x77, 0xb8, 0x51, 0x7c, 0x14, 0x54, 0x85, 0x1c, 0xe9, 0x8d, 0x2c, - 0xdc, 0xe1, 0x70, 0x9c, 0xdb, 0x47, 0x0d, 0xc8, 0xe2, 0x53, 0x3c, 0xb4, 0xad, 0xca, 0x02, 0x5d, - 0xf6, 0x95, 0x49, 0x7c, 0x84, 0x7c, 0xde, 0xa9, 0x90, 0xc5, 0xfe, 0xe6, 0xcb, 0x35, 0x91, 0x71, - 0x3f, 0xa7, 0x0f, 0x34, 0x1b, 0x0f, 0x0c, 0xfb, 0x4c, 0xe6, 0xf2, 0x41, 0x2b, 0xe4, 0x42, 0x56, - 0xa0, 0xc0, 0x70, 0xd1, 0xc1, 0x7b, 0x88, 0x4d, 0x35, 0xdd, 0xd4, 0xec, 0x33, 0xb9, 0x34, 0xc0, - 0x03, 0x43, 0xd7, 0xfb, 0x0a, 0xdb, 0xe3, 0xdb, 0x50, 0x0e, 0x66, 0x1c, 0xe8, 0x09, 0x28, 0x99, - 0xd8, 0x56, 0xb5, 0xa1, 0x12, 0x48, 0x64, 0x8b, 0x8c, 0xc8, 0xf6, 0xd4, 0x5e, 0x3a, 0x27, 0x88, - 0xc9, 0xbd, 0x74, 0x2e, 0x29, 0xa6, 0xa4, 0x43, 0x92, 0x78, 0x47, 0x64, 0x1c, 0xe8, 0x65, 0xc8, - 0x7b, 0xc9, 0x8a, 0x40, 0x67, 0x7b, 0x0e, 0xf4, 0xe6, 0xf1, 0x4a, 0x7f, 0x10, 0x3c, 0x95, 0x41, - 0x30, 0xaf, 0x0e, 0x59, 0x13, 0x5b, 0xa3, 0x3e, 0x83, 0xd7, 0xca, 0x5b, 0xcf, 0xcf, 0x96, 0xab, - 0x10, 0xea, 0xa8, 0x6f, 0xcb, 0x5c, 0x58, 0x7a, 0x07, 0xb2, 0x8c, 0x82, 0x0a, 0xb0, 0x70, 0xbc, - 0x7f, 0x6f, 0xff, 0xe0, 0xad, 0x7d, 0x31, 0x81, 0x00, 0xb2, 0xdb, 0xb5, 0x5a, 0xfd, 0xb0, 0x29, - 0x0a, 0x28, 0x0f, 0x99, 0xed, 0x9d, 0x03, 0xb9, 0x29, 0x26, 0x09, 0x59, 0xae, 0xef, 0xd5, 0x6b, - 0x4d, 0x31, 0x85, 0x96, 0xa0, 0xc4, 0xda, 0xca, 0xdd, 0x03, 0xf9, 0x8d, 0xed, 0xa6, 0x98, 0xf6, - 0x91, 0x8e, 0xea, 0xfb, 0x77, 0xea, 0xb2, 0x98, 0x91, 0x5e, 0x24, 0xd9, 0x7e, 0x4c, 0x76, 0xe3, - 0x21, 0x75, 0x82, 0x0f, 0xa9, 0x93, 0x3e, 0x4d, 0x92, 0x4b, 0x40, 0x5c, 0xca, 0x82, 0xf6, 0x42, - 0x13, 0xdf, 0x9a, 0x23, 0xdf, 0x09, 0xcd, 0x9e, 0x5c, 0x6c, 0x4d, 0x7c, 0x82, 0xed, 0x76, 0x8f, - 0xa5, 0x50, 0xec, 0x04, 0x2a, 0xc9, 0x25, 0x4e, 0xa5, 0x42, 0x16, 0x63, 0x7b, 0x0f, 0xb7, 0x6d, - 0x85, 0x39, 0x91, 0x45, 0x6f, 0x97, 0x79, 0xc2, 0x46, 0xa8, 0x47, 0x8c, 0x28, 0xbd, 0x3b, 0x97, - 0x2d, 0xf3, 0x90, 0x91, 0xeb, 0x4d, 0xf9, 0x6d, 0x31, 0x85, 0x10, 0x94, 0x69, 0x53, 0x39, 0xda, - 0xdf, 0x3e, 0x3c, 0x6a, 0x1c, 0x10, 0x5b, 0x2e, 0xc3, 0xa2, 0x63, 0x4b, 0x87, 0x98, 0x91, 0x9e, - 0x85, 0x4b, 0x31, 0xf9, 0xd6, 0xe4, 0x1d, 0x5b, 0xfa, 0x95, 0xe0, 0xe7, 0x0e, 0xe6, 0x4c, 0x07, - 0x90, 0xb5, 0x6c, 0xd5, 0x1e, 0x59, 0xdc, 0x88, 0x2f, 0xcf, 0x9a, 0x80, 0x6d, 0x38, 0x8d, 0x23, - 0x2a, 0x2e, 0x73, 0x35, 0xd2, 0x4d, 0x28, 0x07, 0xbf, 0xc4, 0xdb, 0xc0, 0x73, 0xa2, 0xa4, 0x74, - 0x1b, 0xd0, 0x64, 0x5e, 0x16, 0x81, 0x37, 0x08, 0x51, 0x78, 0xc3, 0xaf, 0x05, 0xb8, 0x7c, 0x4e, - 0x0e, 0x86, 0xde, 0x0c, 0x4d, 0xf2, 0xd6, 0x3c, 0x19, 0xdc, 0x06, 0xa3, 0x85, 0xa6, 0x79, 0x03, - 0x8a, 0x7e, 0xfa, 0x6c, 0x93, 0xfc, 0x26, 0xe9, 0x6d, 0xe2, 0x20, 0x30, 0xe2, 0x1d, 0x81, 0xc2, - 0xb7, 0x3c, 0x02, 0x5f, 0x05, 0xb0, 0xc7, 0x0a, 0x73, 0xeb, 0xc8, 0xdb, 0x3a, 0x07, 0x9c, 0x71, - 0xbb, 0x39, 0xe6, 0x9b, 0x20, 0x6f, 0xf3, 0x96, 0x85, 0x8e, 0xfc, 0x28, 0xd1, 0x88, 0xc6, 0x58, - 0x8b, 0x23, 0x28, 0xb3, 0x06, 0x63, 0x0f, 0x4d, 0x62, 0x64, 0x0b, 0xbd, 0x0d, 0x97, 0x42, 0x89, - 0x82, 0xab, 0x3a, 0x3d, 0x6b, 0xbe, 0x70, 0x31, 0x98, 0x2f, 0x38, 0xaa, 0xfd, 0xd1, 0x3e, 0x13, - 0x8c, 0xf6, 0x2f, 0xc3, 0x4a, 0x74, 0x9e, 0x8b, 0x1e, 0x07, 0xc0, 0x43, 0x12, 0x16, 0x3a, 0x1e, - 0x7c, 0x90, 0xe7, 0x94, 0xe6, 0x58, 0x3a, 0x86, 0x34, 0x65, 0xf3, 0x40, 0x06, 0xad, 0xc3, 0x93, - 0x34, 0x0e, 0x32, 0xec, 0x76, 0x48, 0xa4, 0x71, 0x5f, 0x9e, 0x70, 0x80, 0xd3, 0x23, 0xb8, 0x71, - 0x34, 0xe5, 0xa5, 0x76, 0xd2, 0x81, 0x77, 0x98, 0x4d, 0xa6, 0xc7, 0xe8, 0x45, 0xc8, 0xb0, 0xc4, - 0x97, 0xad, 0xff, 0xc5, 0x49, 0x63, 0xeb, 0xae, 0x85, 0x19, 0xa7, 0xf4, 0x7b, 0xbf, 0xd7, 0x47, - 0x80, 0x24, 0xd7, 0x61, 0xc9, 0x99, 0x66, 0x18, 0x2c, 0x59, 0xe4, 0x1f, 0x0e, 0x38, 0x66, 0x82, - 0xee, 0xb9, 0x3b, 0x84, 0x95, 0xa1, 0x6e, 0xcc, 0x93, 0x78, 0x6f, 0x84, 0xf6, 0xc6, 0x55, 0xc8, - 0x7a, 0xbb, 0xc2, 0x30, 0xb1, 0x85, 0x87, 0x36, 0xdb, 0x15, 0x6a, 0x8b, 0xb6, 0x05, 0xe9, 0x6d, - 0x00, 0x0f, 0xca, 0x23, 0xc7, 0xbf, 0xa9, 0x8f, 0x86, 0xcc, 0xca, 0x19, 0x99, 0x75, 0xd0, 0x4d, - 0xc7, 0x24, 0xc9, 0x98, 0x38, 0x49, 0x06, 0xf7, 0x41, 0x81, 0xdc, 0x2c, 0x1a, 0xa0, 0xc9, 0x72, - 0x4a, 0xcc, 0x10, 0xaf, 0x05, 0x87, 0xb8, 0x1a, 0x5b, 0x98, 0x89, 0x1e, 0xea, 0x43, 0xc8, 0xd0, - 0x6d, 0x49, 0xd6, 0x9b, 0xd6, 0xf0, 0x78, 0x2a, 0x4f, 0xda, 0xe8, 0x47, 0x00, 0xaa, 0x6d, 0x9b, - 0x5a, 0x6b, 0xe4, 0x0d, 0xb0, 0x16, 0xbd, 0xad, 0xb7, 0x1d, 0xbe, 0x9d, 0x2b, 0x7c, 0x7f, 0x5f, - 0xf0, 0x44, 0x7d, 0x7b, 0xdc, 0xa7, 0x50, 0xda, 0x87, 0x72, 0x50, 0xd6, 0x49, 0x3e, 0xd9, 0x6f, - 0x08, 0x26, 0x9f, 0xec, 0x2e, 0xc1, 0x93, 0x4f, 0x37, 0x75, 0x4d, 0xb1, 0x42, 0x25, 0xed, 0x48, - 0x3f, 0x4e, 0x42, 0xd1, 0x7f, 0x2a, 0xfc, 0xf7, 0xe5, 0x87, 0xd2, 0xcf, 0x04, 0xc8, 0xb9, 0xd3, - 0x0f, 0x56, 0x2d, 0x03, 0x65, 0x5e, 0x66, 0xbd, 0xa4, 0xbf, 0xd4, 0xc8, 0x8a, 0xba, 0x29, 0xb7, - 0xa8, 0x7b, 0xdb, 0xcd, 0x4d, 0xe2, 0x70, 0x3c, 0xbf, 0xad, 0xb9, 0x57, 0x39, 0xa9, 0xd8, 0x6d, - 0xc8, 0xbb, 0x47, 0x2b, 0xb9, 0x11, 0x06, 0x11, 0x5a, 0xa7, 0x4b, 0x0b, 0xce, 0xfa, 0x07, 0xbc, - 0x8e, 0x99, 0x92, 0x59, 0x47, 0xea, 0xc0, 0x62, 0xe8, 0x5c, 0x46, 0xb7, 0x61, 0xc1, 0x18, 0xb5, - 0x14, 0xc7, 0x39, 0x42, 0x60, 0xb8, 0x73, 0xd7, 0x18, 0xb5, 0xfa, 0x5a, 0xfb, 0x1e, 0x3e, 0x73, - 0x7e, 0x8c, 0x31, 0x6a, 0xdd, 0x63, 0x3e, 0xc4, 0x46, 0x49, 0xfa, 0x47, 0xf9, 0x85, 0x00, 0x39, - 0x67, 0x4f, 0xa0, 0xff, 0x87, 0xbc, 0x7b, 0xe6, 0xbb, 0x0f, 0x11, 0x62, 0x83, 0x05, 0xd7, 0xef, - 0x89, 0xa0, 0x6d, 0xe7, 0x05, 0x85, 0xd6, 0x51, 0x4e, 0xfa, 0x2a, 0xf3, 0xa5, 0x72, 0xd0, 0x66, - 0x2c, 0x2a, 0xd0, 0x60, 0xb9, 0x7b, 0xe7, 0x6e, 0x5f, 0xed, 0xca, 0x05, 0x2a, 0xb3, 0xdb, 0x21, - 0x1d, 0x9e, 0x76, 0xff, 0x43, 0x00, 0x31, 0xbc, 0x63, 0xbf, 0xf5, 0xaf, 0x9b, 0xcc, 0x41, 0x52, - 0x11, 0x39, 0x08, 0xda, 0x84, 0x65, 0x97, 0x43, 0xb1, 0xb4, 0xee, 0x50, 0xb5, 0x47, 0x26, 0xe6, - 0xe5, 0x03, 0xe4, 0x7e, 0x3a, 0x72, 0xbe, 0x4c, 0xce, 0x3a, 0xf3, 0x88, 0xb3, 0xfe, 0x28, 0x09, - 0x05, 0x5f, 0x31, 0x03, 0xfd, 0x9f, 0xef, 0x30, 0x2a, 0x47, 0x84, 0x6d, 0x1f, 0xaf, 0xf7, 0xa8, - 0x20, 0x68, 0xa6, 0xe4, 0xfc, 0x66, 0x8a, 0x2b, 0x19, 0x39, 0xb5, 0x91, 0xf4, 0xdc, 0xb5, 0x91, - 0xe7, 0x00, 0xd9, 0xba, 0xad, 0xf6, 0x95, 0x53, 0xdd, 0xd6, 0x86, 0x5d, 0x85, 0xb9, 0x21, 0x3b, - 0x3a, 0x44, 0xfa, 0xe5, 0x01, 0xfd, 0x70, 0x48, 0x3d, 0xf2, 0x27, 0x02, 0xe4, 0xdc, 0x3b, 0xd1, - 0xbc, 0x4f, 0x0e, 0x56, 0x20, 0xcb, 0xd3, 0x7e, 0xf6, 0xe6, 0x80, 0xf7, 0x22, 0x8b, 0x40, 0x55, - 0xc8, 0x0d, 0xb0, 0xad, 0xd2, 0x73, 0x90, 0xa5, 0x1c, 0x6e, 0xff, 0xfa, 0x2d, 0x28, 0xf8, 0x9e, - 0x6b, 0x90, 0xa3, 0x71, 0xbf, 0xfe, 0x96, 0x98, 0xa8, 0x2e, 0x7c, 0xfc, 0xd9, 0x7a, 0x6a, 0x1f, - 0x7f, 0x40, 0x76, 0xb3, 0x5c, 0xaf, 0x35, 0xea, 0xb5, 0x7b, 0xa2, 0x50, 0x2d, 0x7c, 0xfc, 0xd9, - 0xfa, 0x82, 0x8c, 0x29, 0x10, 0x7e, 0xfd, 0x1e, 0x2c, 0x86, 0x16, 0x26, 0x98, 0x53, 0x22, 0x28, - 0xdf, 0x39, 0x3e, 0xbc, 0xbf, 0x5b, 0xdb, 0x6e, 0xd6, 0x95, 0x07, 0x07, 0xcd, 0xba, 0x28, 0xa0, - 0x4b, 0xb0, 0x7c, 0x7f, 0xf7, 0xf5, 0x46, 0x53, 0xa9, 0xdd, 0xdf, 0xad, 0xef, 0x37, 0x95, 0xed, - 0x66, 0x73, 0xbb, 0x76, 0x4f, 0x4c, 0x6e, 0xfd, 0xbd, 0x04, 0xe9, 0xed, 0x9d, 0xda, 0x2e, 0xaa, - 0x41, 0x9a, 0xe2, 0x54, 0xe7, 0x3e, 0x63, 0xad, 0x9e, 0x5f, 0xd2, 0x40, 0x77, 0x21, 0x43, 0x21, - 0x2c, 0x74, 0xfe, 0xbb, 0xd6, 0xea, 0x94, 0x1a, 0x07, 0xf9, 0x31, 0x74, 0x47, 0x9e, 0xfb, 0xd0, - 0xb5, 0x7a, 0x7e, 0xc9, 0x03, 0xdd, 0x87, 0x05, 0x07, 0xc1, 0x98, 0xf6, 0xfa, 0xb4, 0x3a, 0xb5, - 0x0e, 0x41, 0xa6, 0xc6, 0x90, 0xa0, 0xf3, 0xdf, 0xc0, 0x56, 0xa7, 0x14, 0x43, 0xd0, 0x2e, 0x64, - 0x39, 0x56, 0x30, 0xe5, 0x59, 0x6b, 0x75, 0x5a, 0x79, 0x03, 0xc9, 0x90, 0xf7, 0x30, 0xb6, 0xe9, - 0x2f, 0x7b, 0xab, 0x33, 0xd4, 0x79, 0xd0, 0x3b, 0x50, 0x0a, 0xe2, 0x10, 0xb3, 0x3d, 0x9d, 0xad, - 0xce, 0x58, 0x48, 0x21, 0xfa, 0x83, 0xa0, 0xc4, 0x6c, 0x4f, 0x69, 0xab, 0x33, 0xd6, 0x55, 0xd0, - 0x7b, 0xb0, 0x34, 0x09, 0x1a, 0xcc, 0xfe, 0xb2, 0xb6, 0x3a, 0x47, 0xa5, 0x05, 0x0d, 0x00, 0x45, - 0x80, 0x0d, 0x73, 0x3c, 0xb4, 0xad, 0xce, 0x53, 0x78, 0x41, 0x1d, 0x58, 0x0c, 0xdf, 0xe0, 0x67, - 0x7d, 0x78, 0x5b, 0x9d, 0xb9, 0x08, 0xc3, 0x46, 0x09, 0xde, 0xfc, 0x67, 0x7d, 0x88, 0x5b, 0x9d, - 0xb9, 0x26, 0x83, 0x8e, 0x01, 0x7c, 0x97, 0xf7, 0x19, 0x1e, 0xe6, 0x56, 0x67, 0xa9, 0xce, 0x20, - 0x03, 0x96, 0xa3, 0x6e, 0xf5, 0xf3, 0xbc, 0xd3, 0xad, 0xce, 0x55, 0xb4, 0x21, 0xfe, 0x1c, 0xbc, - 0x9f, 0xcf, 0xf6, 0x6e, 0xb7, 0x3a, 0x63, 0xf5, 0x06, 0xa9, 0x50, 0x0e, 0xdd, 0x49, 0x67, 0x7c, - 0xc6, 0x5b, 0x9d, 0xb5, 0x98, 0x43, 0xdc, 0x38, 0xe2, 0x9a, 0x39, 0xc7, 0xab, 0xde, 0xea, 0x3c, - 0xe5, 0x1d, 0xba, 0x46, 0x11, 0x77, 0xd0, 0x79, 0x1e, 0xf9, 0x56, 0xe7, 0xaa, 0xf6, 0xec, 0x6c, - 0x7f, 0xfe, 0xd5, 0xaa, 0xf0, 0xc5, 0x57, 0xab, 0xc2, 0xdf, 0xbe, 0x5a, 0x15, 0x3e, 0xf9, 0x7a, - 0x35, 0xf1, 0xc5, 0xd7, 0xab, 0x89, 0xbf, 0x7c, 0xbd, 0x9a, 0xf8, 0xfe, 0xd3, 0x5d, 0xcd, 0xee, - 0x8d, 0x5a, 0x1b, 0x6d, 0x7d, 0xb0, 0xd9, 0xd6, 0x07, 0xd8, 0x6e, 0x9d, 0xd8, 0x5e, 0xc3, 0xfb, - 0x87, 0x4b, 0x2b, 0x4b, 0xb3, 0x90, 0x1b, 0xff, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x27, 0x79, 0x3b, - 0x76, 0x01, 0x33, 0x00, 0x00, + // 3484 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0x3d, 0x70, 0x23, 0xc7, + 0xb1, 0xc6, 0xe2, 0x8f, 0x40, 0xe3, 0x87, 0xcb, 0xe1, 0x1d, 0x0f, 0xc2, 0x9d, 0x48, 0xde, 0xaa, + 0x24, 0x9d, 0xee, 0x24, 0x52, 0x8f, 0xf7, 0x4e, 0xd2, 0xd5, 0x49, 0xaf, 0x1e, 0x88, 0xc3, 0x09, + 0xe4, 0x9d, 0x48, 0x6a, 0x89, 0x3b, 0x95, 0xde, 0x8f, 0x56, 0x0b, 0x60, 0x08, 0xac, 0x0e, 0xc0, + 0xae, 0x76, 0x17, 0x14, 0xa8, 0xe8, 0xd5, 0xd3, 0x7b, 0x55, 0x2e, 0x45, 0xaa, 0x72, 0xa2, 0xc0, + 0x0a, 0x1c, 0x38, 0x71, 0xe0, 0xd8, 0x4e, 0x1c, 0x39, 0x50, 0xe0, 0x40, 0x91, 0xcb, 0x91, 0x6c, + 0x4b, 0x99, 0x52, 0x07, 0x4e, 0x5d, 0xf3, 0xb3, 0xbf, 0xd8, 0x25, 0x80, 0x93, 0x1c, 0xb8, 0xec, + 0x6c, 0xa6, 0xd1, 0xdd, 0xb3, 0xd3, 0xd3, 0x33, 0xdd, 0xf3, 0xf5, 0x00, 0x2e, 0xdb, 0x78, 0xd4, + 0xc5, 0xe6, 0x50, 0x1b, 0xd9, 0xdb, 0x6a, 0xbb, 0xa3, 0x6d, 0xdb, 0x67, 0x06, 0xb6, 0xb6, 0x0c, + 0x53, 0xb7, 0x75, 0xb4, 0xec, 0xfd, 0xb8, 0x45, 0x7e, 0xac, 0x3e, 0xed, 0xe3, 0xee, 0x98, 0x67, + 0x86, 0xad, 0x6f, 0x1b, 0xa6, 0xae, 0x9f, 0x30, 0xfe, 0xea, 0x95, 0xe9, 0x9f, 0x1f, 0xe3, 0x33, + 0xae, 0x2d, 0x20, 0x4c, 0x47, 0xd9, 0x36, 0x54, 0x53, 0x1d, 0x3a, 0x3f, 0x6f, 0x4e, 0xfd, 0x7c, + 0xaa, 0x0e, 0xb4, 0xae, 0x6a, 0xeb, 0x26, 0xe7, 0xd8, 0xe8, 0xe9, 0x7a, 0x6f, 0x80, 0xb7, 0x69, + 0xaf, 0x3d, 0x3e, 0xd9, 0xb6, 0xb5, 0x21, 0xb6, 0x6c, 0x75, 0x68, 0x70, 0x86, 0x0b, 0x3d, 0xbd, + 0xa7, 0xd3, 0xe6, 0x36, 0x69, 0x45, 0x8c, 0xab, 0x9b, 0x6a, 0x67, 0x80, 0xfd, 0x93, 0x94, 0x7e, + 0x57, 0x80, 0x25, 0x19, 0x7f, 0x38, 0xc6, 0x96, 0x8d, 0x76, 0x20, 0x8d, 0x3b, 0x7d, 0xbd, 0x22, + 0x6c, 0x0a, 0xd7, 0x0a, 0x3b, 0x57, 0xb6, 0x42, 0xf3, 0xdf, 0xe2, 0x7c, 0x8d, 0x4e, 0x5f, 0x6f, + 0x26, 0x64, 0xca, 0x8b, 0x6e, 0x41, 0xe6, 0x64, 0x30, 0xb6, 0xfa, 0x95, 0x24, 0x15, 0x7a, 0x3a, + 0x4e, 0xe8, 0x1e, 0x61, 0x6a, 0x26, 0x64, 0xc6, 0x4d, 0x86, 0xd2, 0x46, 0x27, 0x7a, 0x25, 0x75, + 0xfe, 0x50, 0x7b, 0xa3, 0x13, 0x3a, 0x14, 0xe1, 0x45, 0xbb, 0x00, 0xda, 0x48, 0xb3, 0x95, 0x4e, + 0x5f, 0xd5, 0x46, 0x95, 0x0c, 0x95, 0xbc, 0x1a, 0x2f, 0xa9, 0xd9, 0x75, 0xc2, 0xd8, 0x4c, 0xc8, + 0x79, 0xcd, 0xe9, 0x90, 0xcf, 0xfd, 0x70, 0x8c, 0xcd, 0xb3, 0x4a, 0xf6, 0xfc, 0xcf, 0x7d, 0x9b, + 0x30, 0x91, 0xcf, 0xa5, 0xdc, 0xe8, 0x75, 0xc8, 0x75, 0xfa, 0xb8, 0xf3, 0x58, 0xb1, 0x27, 0x95, + 0x1c, 0x95, 0xdc, 0x88, 0x93, 0xac, 0x13, 0xbe, 0xd6, 0xa4, 0x99, 0x90, 0x97, 0x3a, 0xac, 0x89, + 0x5e, 0x83, 0x6c, 0x47, 0x1f, 0x0e, 0x35, 0xbb, 0x52, 0xa0, 0xb2, 0xeb, 0xb1, 0xb2, 0x94, 0xab, + 0x99, 0x90, 0x39, 0x3f, 0x3a, 0x80, 0xf2, 0x40, 0xb3, 0x6c, 0xc5, 0x1a, 0xa9, 0x86, 0xd5, 0xd7, + 0x6d, 0xab, 0x52, 0xa4, 0x1a, 0x9e, 0x8d, 0xd3, 0xf0, 0x40, 0xb3, 0xec, 0x63, 0x87, 0xb9, 0x99, + 0x90, 0x4b, 0x03, 0x3f, 0x81, 0xe8, 0xd3, 0x4f, 0x4e, 0xb0, 0xe9, 0x2a, 0xac, 0x94, 0xce, 0xd7, + 0x77, 0x48, 0xb8, 0x1d, 0x79, 0xa2, 0x4f, 0xf7, 0x13, 0xd0, 0x7f, 0xc2, 0xea, 0x40, 0x57, 0xbb, + 0xae, 0x3a, 0xa5, 0xd3, 0x1f, 0x8f, 0x1e, 0x57, 0xca, 0x54, 0xe9, 0x0b, 0xb1, 0x1f, 0xa9, 0xab, + 0x5d, 0x47, 0x45, 0x9d, 0x08, 0x34, 0x13, 0xf2, 0xca, 0x20, 0x4c, 0x44, 0xef, 0xc1, 0x05, 0xd5, + 0x30, 0x06, 0x67, 0x61, 0xed, 0xcb, 0x54, 0xfb, 0xf5, 0x38, 0xed, 0x35, 0x22, 0x13, 0x56, 0x8f, + 0xd4, 0x29, 0x2a, 0x6a, 0x81, 0x68, 0x98, 0xd8, 0x50, 0x4d, 0xac, 0x18, 0xa6, 0x6e, 0xe8, 0x96, + 0x3a, 0xa8, 0x88, 0x54, 0xf7, 0xf3, 0x71, 0xba, 0x8f, 0x18, 0xff, 0x11, 0x67, 0x6f, 0x26, 0xe4, + 0x65, 0x23, 0x48, 0x62, 0x5a, 0xf5, 0x0e, 0xb6, 0x2c, 0x4f, 0xeb, 0xca, 0x2c, 0xad, 0x94, 0x3f, + 0xa8, 0x35, 0x40, 0x42, 0x0d, 0x28, 0xe0, 0x09, 0x11, 0x57, 0x4e, 0x75, 0x1b, 0x57, 0x10, 0x55, + 0x28, 0xc5, 0xee, 0x50, 0xca, 0xfa, 0x48, 0xb7, 0x71, 0x33, 0x21, 0x03, 0x76, 0x7b, 0x48, 0x85, + 0x8b, 0xa7, 0xd8, 0xd4, 0x4e, 0xce, 0xa8, 0x1a, 0x85, 0xfe, 0x62, 0x69, 0xfa, 0xa8, 0xb2, 0x4a, + 0x15, 0xde, 0x88, 0x53, 0xf8, 0x88, 0x0a, 0x11, 0x15, 0x0d, 0x47, 0xa4, 0x99, 0x90, 0x57, 0x4f, + 0xa7, 0xc9, 0xc4, 0xc5, 0x4e, 0xb4, 0x91, 0x3a, 0xd0, 0x3e, 0xc6, 0x4a, 0x7b, 0xa0, 0x77, 0x1e, + 0x57, 0x2e, 0x9c, 0xef, 0x62, 0xf7, 0x38, 0xf7, 0x2e, 0x61, 0x26, 0x2e, 0x76, 0xe2, 0x27, 0x20, + 0x19, 0x44, 0x4b, 0xeb, 0x8d, 0x94, 0x9e, 0x6e, 0x59, 0x9a, 0xc1, 0xa6, 0x7f, 0x91, 0x6a, 0x7c, + 0x2e, 0x4e, 0xe3, 0xb1, 0xd6, 0x1b, 0xbd, 0x49, 0xd9, 0xb9, 0x09, 0xca, 0x56, 0x80, 0x42, 0x3c, + 0xcb, 0x59, 0x79, 0x76, 0x24, 0x52, 0xb5, 0x56, 0x65, 0xed, 0x7c, 0xcf, 0xe2, 0xab, 0x7f, 0x48, + 0x45, 0x88, 0x22, 0xb2, 0xc3, 0x90, 0x31, 0x45, 0xa5, 0x66, 0x66, 0xa7, 0x77, 0x68, 0x80, 0x4b, + 0x33, 0xcc, 0xcc, 0x85, 0x82, 0x23, 0xac, 0x9e, 0x4e, 0x93, 0x77, 0x97, 0x20, 0x73, 0xaa, 0x0e, + 0xc6, 0x78, 0x3f, 0x9d, 0x4b, 0x8b, 0x99, 0xfd, 0x74, 0x6e, 0x49, 0xcc, 0xed, 0xa7, 0x73, 0x79, + 0x11, 0xf6, 0xd3, 0x39, 0x10, 0x0b, 0xd2, 0xf3, 0x50, 0xf0, 0x9d, 0xd7, 0xa8, 0x02, 0x4b, 0x43, + 0x6c, 0x59, 0x6a, 0x0f, 0xd3, 0xe3, 0x3d, 0x2f, 0x3b, 0x5d, 0xa9, 0x0c, 0x45, 0xff, 0x19, 0x2d, + 0x7d, 0x26, 0xb8, 0x92, 0xe4, 0xf8, 0x25, 0x92, 0xa7, 0xd8, 0xa4, 0x5e, 0xc2, 0x25, 0x79, 0x17, + 0x3d, 0x03, 0x25, 0xba, 0xc2, 0x8a, 0xf3, 0x3b, 0x89, 0x01, 0x69, 0xb9, 0x48, 0x89, 0x8f, 0x38, + 0xd3, 0x06, 0x14, 0x8c, 0x1d, 0xc3, 0x65, 0x49, 0x51, 0x16, 0x30, 0x76, 0x0c, 0x87, 0xe1, 0x2a, + 0x14, 0x89, 0x0d, 0x5c, 0x8e, 0x34, 0x1d, 0xa4, 0x40, 0x68, 0x9c, 0x45, 0xfa, 0x6d, 0x12, 0xc4, + 0xf0, 0xb9, 0x8e, 0x5e, 0x83, 0x34, 0x89, 0x80, 0x3c, 0x5a, 0x55, 0xb7, 0x58, 0x78, 0xdc, 0x72, + 0xc2, 0xe3, 0x56, 0xcb, 0x09, 0x8f, 0xbb, 0xb9, 0x2f, 0xbf, 0xde, 0x48, 0x7c, 0xf6, 0x87, 0x0d, + 0x41, 0xa6, 0x12, 0xe8, 0x29, 0x72, 0x9a, 0xab, 0xda, 0x48, 0xd1, 0xba, 0xf4, 0x93, 0xf3, 0xe4, + 0xa8, 0x56, 0xb5, 0xd1, 0x5e, 0x17, 0x3d, 0x00, 0xb1, 0xa3, 0x8f, 0x2c, 0x3c, 0xb2, 0xc6, 0x96, + 0xc2, 0x02, 0x34, 0x8f, 0x51, 0x81, 0x48, 0xc3, 0x22, 0x68, 0xdd, 0xe1, 0x3c, 0xa2, 0x8c, 0xf2, + 0x72, 0x27, 0x48, 0x40, 0xf7, 0x00, 0xdc, 0x28, 0x6e, 0x55, 0xd2, 0x9b, 0xa9, 0x6b, 0x85, 0x9d, + 0xcd, 0xa9, 0xc5, 0x7f, 0xe4, 0xb0, 0x3c, 0x34, 0xc8, 0x2a, 0xef, 0xa6, 0xc9, 0xe7, 0xca, 0x3e, + 0x49, 0xf4, 0x1c, 0x2c, 0xab, 0x86, 0xa1, 0x58, 0x36, 0x71, 0xa8, 0xf6, 0x19, 0xf1, 0x24, 0x12, + 0xfe, 0x8a, 0x72, 0x49, 0x35, 0x8c, 0x63, 0x42, 0xdd, 0x25, 0x44, 0xf4, 0x2c, 0x94, 0x49, 0xa8, + 0xd3, 0xd4, 0x81, 0xd2, 0xc7, 0x5a, 0xaf, 0x6f, 0xd3, 0x30, 0x97, 0x92, 0x4b, 0x9c, 0xda, 0xa4, + 0x44, 0xa9, 0xeb, 0xae, 0x38, 0x0d, 0x73, 0x08, 0x41, 0xba, 0xab, 0xda, 0x2a, 0xb5, 0x64, 0x51, + 0xa6, 0x6d, 0x42, 0x33, 0x54, 0xbb, 0xcf, 0xed, 0x43, 0xdb, 0x68, 0x0d, 0xb2, 0x5c, 0x6d, 0x8a, + 0xaa, 0xe5, 0x3d, 0x74, 0x01, 0x32, 0x86, 0xa9, 0x9f, 0x62, 0xba, 0x74, 0x39, 0x99, 0x75, 0x24, + 0x19, 0xca, 0xc1, 0x90, 0x88, 0xca, 0x90, 0xb4, 0x27, 0x7c, 0x94, 0xa4, 0x3d, 0x41, 0x2f, 0x43, + 0x9a, 0x18, 0x92, 0x8e, 0x51, 0x8e, 0x48, 0x02, 0xb8, 0x5c, 0xeb, 0xcc, 0xc0, 0x32, 0xe5, 0x94, + 0x96, 0xa1, 0x14, 0x08, 0x95, 0xd2, 0x1a, 0x5c, 0x88, 0x8a, 0x7c, 0x52, 0xdf, 0xa5, 0x07, 0x22, + 0x18, 0xba, 0x05, 0x39, 0x37, 0xf4, 0x31, 0xc7, 0x79, 0x6a, 0x6a, 0x58, 0x87, 0x59, 0x76, 0x59, + 0x89, 0xc7, 0x90, 0x05, 0xe8, 0xab, 0x3c, 0xd1, 0x29, 0xca, 0x4b, 0xaa, 0x61, 0x34, 0x55, 0xab, + 0x2f, 0xbd, 0x0f, 0x95, 0xb8, 0xb0, 0xe6, 0x33, 0x98, 0x40, 0xdd, 0xde, 0x31, 0xd8, 0x1a, 0x64, + 0x4f, 0x74, 0x73, 0xa8, 0xda, 0x54, 0x59, 0x49, 0xe6, 0x3d, 0x62, 0x48, 0x16, 0xe2, 0x52, 0x94, + 0xcc, 0x3a, 0x92, 0x02, 0x4f, 0xc5, 0x86, 0x36, 0x22, 0xa2, 0x8d, 0xba, 0x98, 0x99, 0xb5, 0x24, + 0xb3, 0x8e, 0xa7, 0x88, 0x7d, 0x2c, 0xeb, 0x90, 0x61, 0x2d, 0x3a, 0x57, 0xaa, 0x3f, 0x2f, 0xf3, + 0x9e, 0xf4, 0x79, 0x0a, 0xd6, 0xa2, 0x03, 0x1c, 0xda, 0x84, 0xe2, 0x50, 0x9d, 0x28, 0xf6, 0x84, + 0xbb, 0x9d, 0x40, 0x17, 0x1e, 0x86, 0xea, 0xa4, 0x35, 0x61, 0x3e, 0x27, 0x42, 0xca, 0x9e, 0x58, + 0x95, 0xe4, 0x66, 0xea, 0x5a, 0x51, 0x26, 0x4d, 0xf4, 0x10, 0x56, 0x06, 0x7a, 0x47, 0x1d, 0x28, + 0x03, 0xd5, 0xb2, 0x15, 0x9e, 0xf9, 0xb0, 0x4d, 0xf4, 0xcc, 0x94, 0xb1, 0x59, 0xa8, 0xc2, 0x5d, + 0xb6, 0x9e, 0xe4, 0xc0, 0xe1, 0xfe, 0xbf, 0x4c, 0x75, 0x3c, 0x50, 0x9d, 0xa5, 0x46, 0x77, 0xa1, + 0x30, 0xd4, 0xac, 0x36, 0xee, 0xab, 0xa7, 0x9a, 0x6e, 0xf2, 0xdd, 0x34, 0xed, 0x34, 0x6f, 0x79, + 0x3c, 0x5c, 0x93, 0x5f, 0xcc, 0xb7, 0x24, 0x99, 0x80, 0x0f, 0x3b, 0xa7, 0x49, 0x76, 0xe1, 0xd3, + 0xe4, 0x65, 0xb8, 0x30, 0xc2, 0x13, 0x5b, 0xf1, 0xf6, 0x2b, 0xf3, 0x93, 0x25, 0x6a, 0x7a, 0x44, + 0x7e, 0x73, 0x77, 0xb8, 0x45, 0x5c, 0x06, 0xbd, 0x40, 0x53, 0x04, 0x43, 0xb7, 0xb0, 0xa9, 0xa8, + 0xdd, 0xae, 0x89, 0x2d, 0x8b, 0x66, 0x95, 0x45, 0x1a, 0xf7, 0x29, 0xbd, 0xc6, 0xc8, 0xd2, 0x8f, + 0xfc, 0x4b, 0x13, 0x4c, 0x09, 0xb8, 0xe1, 0x05, 0xcf, 0xf0, 0xc7, 0x24, 0xac, 0x51, 0xf9, 0x6e, + 0xc0, 0xf6, 0x2c, 0x35, 0xbf, 0x3c, 0xbd, 0xbf, 0xc2, 0x36, 0x47, 0x8e, 0x78, 0xbc, 0xd9, 0x53, + 0x4f, 0x66, 0x76, 0x04, 0x69, 0x6a, 0x94, 0x34, 0x3b, 0x62, 0x48, 0xfb, 0xef, 0x6d, 0x29, 0x3e, + 0x49, 0xc1, 0xca, 0x54, 0x7e, 0xe5, 0x4e, 0x4c, 0x88, 0x9c, 0x58, 0x32, 0x72, 0x62, 0xa9, 0x85, + 0x27, 0xc6, 0xd7, 0x3a, 0x3d, 0x7b, 0xad, 0x33, 0x3f, 0xe0, 0x5a, 0x67, 0x9f, 0x6c, 0xad, 0xff, + 0xa6, 0xab, 0xf0, 0x13, 0x01, 0xaa, 0xf1, 0x49, 0x69, 0xe4, 0x72, 0xdc, 0x80, 0x15, 0xf7, 0x53, + 0x5c, 0xf5, 0xec, 0x60, 0x14, 0xdd, 0x1f, 0xb8, 0xfe, 0xd8, 0x18, 0xf7, 0x2c, 0x94, 0x43, 0x29, + 0x33, 0x73, 0xe5, 0xd2, 0xa9, 0x7f, 0x7c, 0xe9, 0xff, 0x52, 0x6e, 0xe0, 0x09, 0xe4, 0xb5, 0x11, + 0xbb, 0xf5, 0x6d, 0x58, 0xed, 0xe2, 0x8e, 0xd6, 0x7d, 0xd2, 0xcd, 0xba, 0xc2, 0xa5, 0xff, 0xb9, + 0x57, 0x23, 0xbd, 0xe4, 0x62, 0xe4, 0x65, 0x20, 0x52, 0x89, 0x10, 0xa9, 0x04, 0xfd, 0x3b, 0x14, + 0x7d, 0x97, 0x0e, 0x16, 0xe2, 0x42, 0x90, 0x01, 0x4b, 0xee, 0xb7, 0x3c, 0xfd, 0x72, 0xa1, 0xe7, + 0xb6, 0x63, 0x9d, 0x49, 0xba, 0xec, 0x46, 0xf4, 0xe9, 0x2b, 0x85, 0x74, 0xdb, 0x73, 0xf0, 0xe9, + 0xbc, 0x1f, 0x5d, 0x86, 0x3c, 0xbf, 0x51, 0xb8, 0xa9, 0x54, 0x8e, 0x11, 0x5a, 0x13, 0xe9, 0x17, + 0x45, 0xc8, 0xc9, 0xd8, 0x32, 0x48, 0x1a, 0x8a, 0x76, 0x21, 0x8f, 0x27, 0x1d, 0x6c, 0xd8, 0x4e, + 0xe6, 0x1e, 0x7d, 0x61, 0x64, 0xdc, 0x0d, 0x87, 0xb3, 0x99, 0x90, 0x3d, 0x31, 0x74, 0x93, 0x23, + 0x42, 0xf1, 0xe0, 0x0e, 0x17, 0xf7, 0x43, 0x42, 0xaf, 0x38, 0x90, 0x50, 0x2a, 0x16, 0xed, 0x60, + 0x52, 0x21, 0x4c, 0xe8, 0x26, 0xc7, 0x84, 0xd2, 0x33, 0x06, 0x0b, 0x80, 0x42, 0xf5, 0x00, 0x28, + 0x94, 0x9d, 0x31, 0xcd, 0x18, 0x54, 0xe8, 0x15, 0x07, 0x15, 0x5a, 0x9a, 0xf1, 0xc5, 0x21, 0x58, + 0xe8, 0x0d, 0x1f, 0x2c, 0x94, 0xa7, 0xa2, 0x9b, 0xb1, 0xa2, 0x11, 0xb8, 0xd0, 0x6d, 0x17, 0x17, + 0x2a, 0xc6, 0x62, 0x4a, 0x5c, 0x38, 0x0c, 0x0c, 0x1d, 0x4e, 0x01, 0x43, 0xa5, 0xd8, 0x3b, 0x31, + 0x53, 0x31, 0x03, 0x19, 0x3a, 0x9c, 0x42, 0x86, 0xca, 0x33, 0x14, 0xce, 0x80, 0x86, 0xfe, 0x2b, + 0x1a, 0x1a, 0x8a, 0x07, 0x6f, 0xf8, 0x67, 0xce, 0x87, 0x0d, 0x29, 0x31, 0xd8, 0x90, 0x18, 0x7b, + 0xc1, 0x66, 0xea, 0xe7, 0x06, 0x87, 0x1e, 0x46, 0x80, 0x43, 0x0c, 0xc6, 0xb9, 0x16, 0xab, 0x7c, + 0x0e, 0x74, 0xe8, 0x61, 0x04, 0x3a, 0x84, 0x66, 0xaa, 0x9d, 0x09, 0x0f, 0xdd, 0x0b, 0xc2, 0x43, + 0xab, 0x31, 0xc9, 0xb6, 0xb7, 0xdb, 0x63, 0xf0, 0xa1, 0x76, 0x1c, 0x3e, 0xc4, 0x30, 0x9c, 0x17, + 0x63, 0x35, 0x2e, 0x00, 0x10, 0x1d, 0x4e, 0x01, 0x44, 0x17, 0x67, 0x78, 0xda, 0x0c, 0x84, 0xe8, + 0x38, 0x02, 0x21, 0x5a, 0x8b, 0x45, 0xdc, 0x98, 0xca, 0x99, 0x10, 0x91, 0x12, 0x03, 0x11, 0x5d, + 0x9a, 0xe1, 0x60, 0x73, 0x63, 0x44, 0xed, 0x38, 0x8c, 0xa8, 0x32, 0xcb, 0xd4, 0x4f, 0x04, 0x12, + 0x65, 0xc4, 0xec, 0x7e, 0x3a, 0x97, 0x13, 0xf3, 0x0c, 0x1e, 0xda, 0x4f, 0xe7, 0x0a, 0x62, 0x51, + 0x7a, 0x81, 0xa4, 0xb4, 0xa1, 0x08, 0x40, 0x2e, 0x8f, 0xd8, 0x34, 0x75, 0x93, 0xc3, 0x3d, 0xac, + 0x23, 0x5d, 0x83, 0xa2, 0xff, 0xb4, 0x3f, 0x07, 0x50, 0xa2, 0x97, 0x74, 0xdf, 0x09, 0x2f, 0xfd, + 0x52, 0xf0, 0x64, 0x29, 0xa4, 0xe4, 0x07, 0x1c, 0xf2, 0x1c, 0x70, 0xf0, 0xc1, 0x4c, 0xc9, 0x20, + 0xcc, 0xb4, 0x01, 0x05, 0x72, 0xf9, 0x0e, 0x21, 0x48, 0xaa, 0xe1, 0x22, 0x48, 0xd7, 0x61, 0x85, + 0x66, 0x50, 0x0c, 0x8c, 0xe2, 0x11, 0x37, 0x4d, 0x23, 0xee, 0x32, 0xf9, 0x81, 0xf9, 0x0d, 0x4b, + 0x58, 0x5e, 0x82, 0x55, 0x1f, 0xaf, 0x7b, 0xa9, 0x67, 0x70, 0x8a, 0xe8, 0x72, 0xd7, 0xf8, 0xed, + 0xfe, 0x37, 0x82, 0x67, 0x21, 0x0f, 0x7a, 0x8a, 0x42, 0x89, 0x84, 0x1f, 0x08, 0x25, 0x4a, 0x3e, + 0x31, 0x4a, 0xe4, 0x07, 0x29, 0x52, 0x41, 0x90, 0xe2, 0x2f, 0x82, 0xb7, 0x26, 0x2e, 0xe6, 0xd3, + 0xd1, 0xbb, 0x98, 0xc3, 0x06, 0xb4, 0x4d, 0x72, 0xd4, 0x81, 0xde, 0xe3, 0xe0, 0x00, 0x69, 0x12, + 0x2e, 0x37, 0x24, 0xe7, 0x79, 0xc4, 0x75, 0x11, 0x07, 0x96, 0x09, 0x72, 0xc4, 0x41, 0x84, 0xd4, + 0x63, 0xcc, 0xca, 0x2a, 0x45, 0x99, 0x34, 0x09, 0x1f, 0x75, 0x3e, 0x9e, 0xd1, 0xb1, 0x0e, 0x7a, + 0x0d, 0xf2, 0xb4, 0x66, 0xa6, 0xe8, 0x86, 0xc5, 0x4b, 0x29, 0x81, 0x5c, 0x97, 0x15, 0xce, 0xb6, + 0x8e, 0x08, 0xcf, 0xa1, 0x61, 0xc9, 0x39, 0x83, 0xb7, 0x7c, 0xc9, 0x54, 0x3e, 0x90, 0x82, 0x5e, + 0x81, 0x3c, 0xf9, 0x7a, 0xcb, 0x50, 0x3b, 0xb8, 0x02, 0xf4, 0x43, 0x3d, 0x82, 0xf4, 0xf3, 0x24, + 0x2c, 0x87, 0x42, 0x70, 0xe4, 0xdc, 0x1d, 0x97, 0x4c, 0xfa, 0x30, 0xb0, 0xf9, 0xec, 0xb1, 0x0e, + 0xd0, 0x53, 0x2d, 0xe5, 0x23, 0x75, 0x64, 0xe3, 0x2e, 0x37, 0x8a, 0x8f, 0x82, 0xaa, 0x90, 0x23, + 0xbd, 0xb1, 0x85, 0xbb, 0x1c, 0x8e, 0x73, 0xfb, 0xa8, 0x09, 0x59, 0x7c, 0x8a, 0x47, 0xb6, 0x55, + 0x59, 0xa2, 0xcb, 0xbe, 0x36, 0x8d, 0x8f, 0x90, 0x9f, 0x77, 0x2b, 0x64, 0xb1, 0xbf, 0xfb, 0x7a, + 0x43, 0x64, 0xdc, 0x2f, 0xea, 0x43, 0xcd, 0xc6, 0x43, 0xc3, 0x3e, 0x93, 0xb9, 0x7c, 0xd0, 0x0a, + 0xb9, 0x90, 0x15, 0x28, 0x30, 0x5c, 0x74, 0xf0, 0x1e, 0x62, 0x53, 0x4d, 0x37, 0x35, 0xfb, 0x4c, + 0x2e, 0x0d, 0xf1, 0xd0, 0xd0, 0xf5, 0x81, 0xc2, 0xf6, 0x78, 0x0d, 0xca, 0xc1, 0x8c, 0x03, 0x3d, + 0x03, 0x25, 0x13, 0xdb, 0xaa, 0x36, 0x52, 0x02, 0x89, 0x6c, 0x91, 0x11, 0xd9, 0x9e, 0xda, 0x4f, + 0xe7, 0x04, 0x31, 0xb9, 0x9f, 0xce, 0x25, 0xc5, 0x94, 0x74, 0x44, 0x12, 0xef, 0x88, 0x8c, 0x03, + 0xbd, 0x0a, 0x79, 0x2f, 0x59, 0x11, 0xe8, 0x6c, 0xcf, 0x81, 0xde, 0x3c, 0x5e, 0xe9, 0xd7, 0x82, + 0xa7, 0x32, 0x08, 0xe6, 0x35, 0x20, 0x6b, 0x62, 0x6b, 0x3c, 0x60, 0xf0, 0x5a, 0x79, 0xe7, 0xa5, + 0xf9, 0x72, 0x15, 0x42, 0x1d, 0x0f, 0x6c, 0x99, 0x0b, 0x4b, 0xef, 0x41, 0x96, 0x51, 0x50, 0x01, + 0x96, 0x1e, 0x1e, 0xdc, 0x3f, 0x38, 0x7c, 0xe7, 0x40, 0x4c, 0x20, 0x80, 0x6c, 0xad, 0x5e, 0x6f, + 0x1c, 0xb5, 0x44, 0x01, 0xe5, 0x21, 0x53, 0xdb, 0x3d, 0x94, 0x5b, 0x62, 0x92, 0x90, 0xe5, 0xc6, + 0x7e, 0xa3, 0xde, 0x12, 0x53, 0x68, 0x05, 0x4a, 0xac, 0xad, 0xdc, 0x3b, 0x94, 0xdf, 0xaa, 0xb5, + 0xc4, 0xb4, 0x8f, 0x74, 0xdc, 0x38, 0xb8, 0xdb, 0x90, 0xc5, 0x8c, 0xf4, 0x2f, 0x24, 0xdb, 0x8f, + 0xc9, 0x6e, 0x3c, 0xa4, 0x4e, 0xf0, 0x21, 0x75, 0xd2, 0xe7, 0x49, 0x72, 0x09, 0x88, 0x4b, 0x59, + 0xd0, 0x7e, 0x68, 0xe2, 0x3b, 0x0b, 0xe4, 0x3b, 0xa1, 0xd9, 0x93, 0x8b, 0xad, 0x89, 0x4f, 0xb0, + 0xdd, 0xe9, 0xb3, 0x14, 0x8a, 0x9d, 0x40, 0x25, 0xb9, 0xc4, 0xa9, 0x54, 0xc8, 0x62, 0x6c, 0x1f, + 0xe0, 0x8e, 0xad, 0x30, 0x27, 0xb2, 0xe8, 0xed, 0x32, 0x4f, 0xd8, 0x08, 0xf5, 0x98, 0x11, 0xa5, + 0xf7, 0x17, 0xb2, 0x65, 0x1e, 0x32, 0x72, 0xa3, 0x25, 0xbf, 0x2b, 0xa6, 0x10, 0x82, 0x32, 0x6d, + 0x2a, 0xc7, 0x07, 0xb5, 0xa3, 0xe3, 0xe6, 0x21, 0xb1, 0xe5, 0x2a, 0x2c, 0x3b, 0xb6, 0x74, 0x88, + 0x19, 0xe9, 0x06, 0x5c, 0x8a, 0xc9, 0xb7, 0xa6, 0xef, 0xd8, 0xd2, 0x4f, 0x05, 0x3f, 0x77, 0x30, + 0x67, 0x3a, 0x84, 0xac, 0x65, 0xab, 0xf6, 0xd8, 0xe2, 0x46, 0x7c, 0x75, 0xde, 0x04, 0x6c, 0xcb, + 0x69, 0x1c, 0x53, 0x71, 0x99, 0xab, 0x91, 0x6e, 0x41, 0x39, 0xf8, 0x4b, 0xbc, 0x0d, 0x3c, 0x27, + 0x4a, 0x4a, 0x77, 0x00, 0x4d, 0xe7, 0x65, 0x11, 0x78, 0x83, 0x10, 0x85, 0x37, 0xfc, 0x4c, 0x80, + 0xcb, 0xe7, 0xe4, 0x60, 0xe8, 0xed, 0xd0, 0x24, 0x6f, 0x2f, 0x92, 0xc1, 0x6d, 0x31, 0x5a, 0x68, + 0x9a, 0x37, 0xa1, 0xe8, 0xa7, 0xcf, 0x37, 0xc9, 0xef, 0x92, 0xde, 0x26, 0x0e, 0x02, 0x23, 0xde, + 0x11, 0x28, 0x7c, 0xcf, 0x23, 0xf0, 0x75, 0x00, 0x7b, 0xa2, 0x30, 0xb7, 0x8e, 0xbc, 0xad, 0x73, + 0xc0, 0x19, 0x77, 0x5a, 0x13, 0xbe, 0x09, 0xf2, 0x36, 0x6f, 0x59, 0xe8, 0xd8, 0x8f, 0x12, 0x8d, + 0x69, 0x8c, 0xb5, 0x38, 0x82, 0x32, 0x6f, 0x30, 0xf6, 0xd0, 0x24, 0x46, 0xb6, 0xd0, 0xbb, 0x70, + 0x29, 0x94, 0x28, 0xb8, 0xaa, 0xd3, 0xf3, 0xe6, 0x0b, 0x17, 0x83, 0xf9, 0x82, 0xa3, 0xda, 0x1f, + 0xed, 0x33, 0xc1, 0x68, 0xff, 0x2a, 0xac, 0x45, 0xe7, 0xb9, 0xe8, 0x69, 0x00, 0x3c, 0x22, 0x61, + 0xa1, 0xeb, 0xc1, 0x07, 0x79, 0x4e, 0x69, 0x4d, 0xa4, 0x3d, 0xef, 0xd4, 0x99, 0xce, 0x63, 0xd1, + 0x0d, 0x48, 0xd3, 0xdc, 0x9a, 0x65, 0x3a, 0x97, 0x22, 0x70, 0x10, 0x8a, 0x80, 0x50, 0x26, 0xe9, + 0x57, 0x7e, 0xc7, 0x8c, 0xc0, 0x31, 0xae, 0xc3, 0x8a, 0xf3, 0x25, 0x61, 0x3c, 0x63, 0x99, 0xff, + 0x70, 0xc8, 0x61, 0x0d, 0x74, 0xdf, 0x75, 0x62, 0x56, 0x29, 0xba, 0xb9, 0x48, 0x6e, 0xbc, 0x15, + 0x72, 0xdf, 0xab, 0x90, 0xf5, 0x1c, 0xd7, 0x30, 0xb1, 0x85, 0x47, 0x36, 0x73, 0x5c, 0xb5, 0x4d, + 0xdb, 0x82, 0xf4, 0x2e, 0x80, 0x87, 0xb6, 0x91, 0x13, 0xda, 0xd4, 0xc7, 0xa3, 0x2e, 0xfd, 0xba, + 0x8c, 0xcc, 0x3a, 0xe8, 0x16, 0x64, 0xfc, 0xa8, 0xd0, 0x74, 0x28, 0x23, 0x83, 0xfb, 0xd0, 0x3a, + 0xc6, 0x2d, 0x69, 0x80, 0xa6, 0x2b, 0x1e, 0x31, 0x43, 0xbc, 0x11, 0x1c, 0xe2, 0x6a, 0x6c, 0xed, + 0x24, 0x7a, 0xa8, 0x8f, 0x21, 0x43, 0x77, 0x0e, 0x49, 0x5a, 0x68, 0x99, 0x8d, 0x67, 0xdb, 0xa4, + 0x8d, 0xfe, 0x1b, 0x40, 0xb5, 0x6d, 0x53, 0x6b, 0x8f, 0xbd, 0x01, 0x36, 0xa2, 0x77, 0x5e, 0xcd, + 0xe1, 0xdb, 0xbd, 0xc2, 0xb7, 0xe0, 0x05, 0x4f, 0xd4, 0xb7, 0x0d, 0x7d, 0x0a, 0xa5, 0x03, 0x28, + 0x07, 0x65, 0x9d, 0xfc, 0x90, 0x7d, 0x43, 0x30, 0x3f, 0x64, 0xe9, 0x3e, 0xcf, 0x0f, 0xdd, 0xec, + 0x32, 0xc5, 0x6a, 0x89, 0xb4, 0x23, 0xfd, 0x4f, 0x12, 0x8a, 0xfe, 0x8d, 0xfb, 0x8f, 0x97, 0xc2, + 0x49, 0xff, 0x2f, 0x40, 0xce, 0x9d, 0x7e, 0xb0, 0xb0, 0x18, 0xa8, 0xc4, 0x32, 0xeb, 0x25, 0xfd, + 0xd5, 0x40, 0x56, 0x77, 0x4d, 0xb9, 0x75, 0xd7, 0x3b, 0x6e, 0xfa, 0x10, 0x07, 0xb5, 0xf9, 0x6d, + 0xcd, 0xbd, 0xca, 0xc9, 0x96, 0xee, 0x40, 0xde, 0x3d, 0xfd, 0xc8, 0xa5, 0x2d, 0x08, 0xa2, 0x3a, + 0x5d, 0x5a, 0x13, 0xd6, 0x3f, 0xe2, 0xa5, 0xc6, 0x94, 0xcc, 0x3a, 0x52, 0x17, 0x96, 0x43, 0x47, + 0x27, 0xba, 0x03, 0x4b, 0xc6, 0xb8, 0xad, 0x38, 0xce, 0x11, 0xc2, 0xab, 0x9d, 0xeb, 0xc0, 0xb8, + 0x3d, 0xd0, 0x3a, 0xf7, 0xf1, 0x99, 0xf3, 0x31, 0xc6, 0xb8, 0x7d, 0x9f, 0xf9, 0x10, 0x1b, 0x25, + 0xe9, 0x1f, 0xe5, 0xc7, 0x02, 0xe4, 0x9c, 0x3d, 0x81, 0xfe, 0x0d, 0xf2, 0xee, 0xb1, 0xec, 0xbe, + 0x15, 0x88, 0x3d, 0xcf, 0xb9, 0x7e, 0x4f, 0x04, 0xd5, 0x9c, 0x47, 0x0e, 0x5a, 0x57, 0x39, 0x19, + 0xa8, 0xcc, 0x97, 0xca, 0x41, 0x9b, 0xb1, 0x83, 0x9b, 0xc6, 0xb3, 0xbd, 0xbb, 0xf7, 0x06, 0x6a, + 0x4f, 0x2e, 0x50, 0x99, 0xbd, 0x2e, 0xe9, 0xf0, 0xcc, 0xf8, 0xcf, 0x02, 0x88, 0xe1, 0x1d, 0xfb, + 0xbd, 0xbf, 0x6e, 0x3a, 0x4d, 0x48, 0x45, 0xa4, 0x09, 0x68, 0x1b, 0x56, 0x5d, 0x0e, 0xc5, 0xd2, + 0x7a, 0x23, 0xd5, 0x1e, 0x9b, 0x98, 0x23, 0xfc, 0xc8, 0xfd, 0xe9, 0xd8, 0xf9, 0x65, 0x7a, 0xd6, + 0x99, 0x27, 0x9c, 0xf5, 0x27, 0x49, 0x28, 0xf8, 0xea, 0x0d, 0xe8, 0x5f, 0x7d, 0x87, 0x51, 0x39, + 0x22, 0xb2, 0xfa, 0x78, 0xbd, 0xba, 0x7f, 0xd0, 0x4c, 0xc9, 0xc5, 0xcd, 0x14, 0x57, 0xd5, 0x71, + 0xca, 0x17, 0xe9, 0x85, 0xcb, 0x17, 0x2f, 0x02, 0xb2, 0x75, 0x5b, 0x1d, 0x28, 0xa7, 0xba, 0xad, + 0x8d, 0x7a, 0x0a, 0x73, 0x43, 0x76, 0x74, 0x88, 0xf4, 0x97, 0x47, 0xf4, 0x87, 0x23, 0xea, 0x91, + 0xff, 0x2b, 0x40, 0xce, 0xbd, 0xb6, 0x2c, 0xfa, 0x2a, 0x60, 0x0d, 0xb2, 0x3c, 0x33, 0x67, 0xcf, + 0x02, 0x78, 0x2f, 0xb2, 0x4e, 0x53, 0x85, 0xdc, 0x10, 0xdb, 0x2a, 0x3d, 0x07, 0x59, 0x56, 0xe0, + 0xf6, 0xaf, 0xdf, 0x86, 0x82, 0xef, 0x45, 0x05, 0x39, 0x1a, 0x0f, 0x1a, 0xef, 0x88, 0x89, 0xea, + 0xd2, 0xa7, 0x5f, 0x6c, 0xa6, 0x0e, 0xf0, 0x47, 0x64, 0x37, 0xcb, 0x8d, 0x7a, 0xb3, 0x51, 0xbf, + 0x2f, 0x0a, 0xd5, 0xc2, 0xa7, 0x5f, 0x6c, 0x2e, 0xc9, 0x98, 0x62, 0xd5, 0xd7, 0xef, 0xc3, 0x72, + 0x68, 0x61, 0x82, 0x69, 0x1f, 0x82, 0xf2, 0xdd, 0x87, 0x47, 0x0f, 0xf6, 0xea, 0xb5, 0x56, 0x43, + 0x79, 0x74, 0xd8, 0x6a, 0x88, 0x02, 0xba, 0x04, 0xab, 0x0f, 0xf6, 0xde, 0x6c, 0xb6, 0x94, 0xfa, + 0x83, 0xbd, 0xc6, 0x41, 0x4b, 0xa9, 0xb5, 0x5a, 0xb5, 0xfa, 0x7d, 0x31, 0xb9, 0xf3, 0xa7, 0x12, + 0xa4, 0x6b, 0xbb, 0xf5, 0x3d, 0x54, 0x87, 0x34, 0x85, 0x92, 0xce, 0x7d, 0x69, 0x5a, 0x3d, 0xbf, + 0xea, 0x80, 0xee, 0x41, 0x86, 0xa2, 0x4c, 0xe8, 0xfc, 0xa7, 0xa7, 0xd5, 0x19, 0x65, 0x08, 0xf2, + 0x31, 0x74, 0x47, 0x9e, 0xfb, 0x16, 0xb5, 0x7a, 0x7e, 0x55, 0x02, 0x3d, 0x80, 0x25, 0x07, 0x64, + 0x98, 0xf5, 0x40, 0xb4, 0x3a, 0xb3, 0x54, 0x40, 0xa6, 0xc6, 0xc0, 0x9a, 0xf3, 0x9f, 0xa9, 0x56, + 0x67, 0xd4, 0x2b, 0xd0, 0x1e, 0x64, 0xf9, 0x75, 0x7e, 0xc6, 0xcb, 0xd3, 0xea, 0xac, 0x0a, 0x04, + 0x92, 0x21, 0xef, 0xc1, 0x60, 0xb3, 0x1f, 0xdf, 0x56, 0xe7, 0x28, 0xc5, 0xa0, 0xf7, 0xa0, 0x14, + 0x84, 0x0a, 0xe6, 0x7b, 0xdd, 0x5a, 0x9d, 0xb3, 0xd6, 0x41, 0xf4, 0x07, 0x71, 0x83, 0xf9, 0x5e, + 0xbb, 0x56, 0xe7, 0x2c, 0x7d, 0xa0, 0x0f, 0x60, 0x65, 0xfa, 0x5e, 0x3f, 0xff, 0xe3, 0xd7, 0xea, + 0x02, 0xc5, 0x10, 0x34, 0x04, 0x14, 0x81, 0x07, 0x2c, 0xf0, 0x16, 0xb6, 0xba, 0x48, 0x6d, 0x04, + 0x75, 0x61, 0x39, 0x7c, 0xc9, 0x9e, 0xf7, 0x6d, 0x6c, 0x75, 0xee, 0x3a, 0x09, 0x1b, 0x25, 0x78, + 0x39, 0x9f, 0xf7, 0xad, 0x6c, 0x75, 0xee, 0xb2, 0x09, 0x7a, 0x08, 0xe0, 0xbb, 0x5f, 0xcf, 0xf1, + 0x76, 0xb6, 0x3a, 0x4f, 0x01, 0x05, 0x19, 0xb0, 0x1a, 0x75, 0xf1, 0x5e, 0xe4, 0x29, 0x6d, 0x75, + 0xa1, 0xba, 0x0a, 0xf1, 0xe7, 0xe0, 0x15, 0x7a, 0xbe, 0xa7, 0xb5, 0xd5, 0x39, 0x0b, 0x2c, 0x48, + 0x85, 0x72, 0xe8, 0xda, 0x38, 0xe7, 0x4b, 0xdb, 0xea, 0xbc, 0xf5, 0x16, 0xe2, 0xc6, 0x11, 0x17, + 0xcc, 0x05, 0x1e, 0xde, 0x56, 0x17, 0xa9, 0xc0, 0xd0, 0x35, 0x8a, 0xb8, 0x83, 0x2e, 0xf2, 0x0e, + 0xb7, 0xba, 0x50, 0x41, 0x66, 0xb7, 0xf6, 0xe5, 0x37, 0xeb, 0xc2, 0x57, 0xdf, 0xac, 0x0b, 0x7f, + 0xfc, 0x66, 0x5d, 0xf8, 0xec, 0xdb, 0xf5, 0xc4, 0x57, 0xdf, 0xae, 0x27, 0x7e, 0xff, 0xed, 0x7a, + 0xe2, 0x3f, 0x9e, 0xef, 0x69, 0x76, 0x7f, 0xdc, 0xde, 0xea, 0xe8, 0xc3, 0xed, 0x8e, 0x3e, 0xc4, + 0x76, 0xfb, 0xc4, 0xf6, 0x1a, 0xde, 0x9f, 0x50, 0xda, 0x59, 0x9a, 0x85, 0xdc, 0xfc, 0x6b, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xe9, 0xdb, 0x7e, 0x69, 0xa4, 0x32, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -7692,48 +7629,6 @@ func (m *ResponseSignGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func (m *Vote) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Vote) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Vote) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Data) > 0 { - i -= len(m.Data) - copy(dAtA[i:], m.Data) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Data))) - i-- - dAtA[i] = 0x1a - } - if m.Timestamp != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Timestamp)) - i-- - dAtA[i] = 0x10 - } - if len(m.OracleId) > 0 { - i -= len(m.OracleId) - copy(dAtA[i:], m.OracleId) - i = encodeVarintTypes(dAtA, i, uint64(len(m.OracleId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - func (m *ResponsePrepareOracleVotes) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -7754,19 +7649,17 @@ func (m *ResponsePrepareOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, err _ = i var l int _ = l - if len(m.Votes) > 0 { - for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Votes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) + if m.Vote != nil { + { + size, err := m.Vote.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0xa + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0xa } return len(dAtA) - i, nil } @@ -8299,12 +8192,12 @@ func (m *Misbehavior) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x28 } - n60, err60 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err60 != nil { - return 0, err60 + n61, err61 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err61 != nil { + return 0, err61 } - i -= n60 - i = encodeVarintTypes(dAtA, i, uint64(n60)) + i -= n61 + i = encodeVarintTypes(dAtA, i, uint64(n61)) i-- dAtA[i] = 0x22 if m.Height != 0 { @@ -9645,37 +9538,15 @@ func (m *ResponseSignGossipVote) Size() (n int) { return n } -func (m *Vote) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.OracleId) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - if m.Timestamp != 0 { - n += 1 + sovTypes(uint64(m.Timestamp)) - } - l = len(m.Data) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - func (m *ResponsePrepareOracleVotes) Size() (n int) { if m == nil { return 0 } var l int _ = l - if len(m.Votes) > 0 { - for _, e := range m.Votes { - l = e.Size() - n += 1 + l + sovTypes(uint64(l)) - } + if m.Vote != nil { + l = m.Vote.Size() + n += 1 + l + sovTypes(uint64(l)) } return n } @@ -16523,139 +16394,6 @@ func (m *ResponseSignGossipVote) Unmarshal(dAtA []byte) error { } return nil } -func (m *Vote) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Vote: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Vote: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OracleId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.OracleId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) - } - m.Timestamp = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Timestamp |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Data = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *ResponsePrepareOracleVotes) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -16687,7 +16425,7 @@ func (m *ResponsePrepareOracleVotes) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Vote", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -16714,8 +16452,10 @@ func (m *ResponsePrepareOracleVotes) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Votes = append(m.Votes, Vote{}) - if err := m.Votes[len(m.Votes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.Vote == nil { + m.Vote = &oracle.Vote{} + } + if err := m.Vote.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/config/config.go b/config/config.go index 688d07e092c..631733ef0bb 100644 --- a/config/config.go +++ b/config/config.go @@ -841,8 +841,8 @@ func (cfg *MempoolConfig) ValidateBasic() error { // OracleConfig defines the configuration for the CometBFT oracle service type OracleConfig struct { - // Interval determines how long we should keep our gossiped votes before pruning - PruneInterval time.Duration `mapstructure:"prune_interval"` + // MaxGossipVoteAge determines how long we should keep the gossip votes in terms of block height + MaxGossipVoteAge int `mapstructure:"max_gossip_vote_age"` // Interval determines how long we should wait before batch signing votes SignInterval time.Duration `mapstructure:"sign_interval"` // Interval determines how long we should wait between gossiping of votes @@ -854,8 +854,8 @@ type OracleConfig struct { // DefaultOracleConfig returns a default configuration for the CometBFT oracle service func DefaultOracleConfig() *OracleConfig { return &OracleConfig{ - PruneInterval: 4 * time.Second, // 4s - SignInterval: 500 * time.Millisecond, // 0.5s + MaxGossipVoteAge: 3, // keep all gossipVotes from 3 blocks behind + SignInterval: 100 * time.Millisecond, // 0.1s GossipInterval: 100 * time.Millisecond, // 0.1s MaxGossipMsgSize: 65536, } @@ -870,8 +870,8 @@ func TestOracleConfig() *OracleConfig { // ValidateBasic performs basic validation and returns an error if any check fails. func (cfg *OracleConfig) ValidateBasic() error { - if cfg.PruneInterval < 0 { - return errors.New("prune_interval can't be negative") + if cfg.MaxGossipVoteAge < 0 { + return errors.New("max_gossip_vote_age can't be negative") } if cfg.SignInterval < 0 { return errors.New("sign_interval can't be negative") diff --git a/config/toml.go b/config/toml.go index 44c8d86d74f..36a0cc76b27 100644 --- a/config/toml.go +++ b/config/toml.go @@ -409,8 +409,8 @@ experimental_max_gossip_connections_to_non_persistent_peers = {{ .Mempool.Experi ####################################################### [oracle] -# Interval determines how long we should keep our gossiped votes before pruning -prune_interval = "{{ .Oracle.PruneInterval }}" +# MaxGossipVoteAge determines how long we should keep the gossip votes in terms of block height +max_gossip_vote_age = "{{ .Oracle.MaxGossipVoteAge }}" # Interval determines how long we should wait before batch signing votes sign_interval = "{{ .Oracle.SignInterval }}" diff --git a/node/node.go b/node/node.go index 7d9c548dae6..102a6acbcc1 100644 --- a/node/node.go +++ b/node/node.go @@ -40,7 +40,6 @@ import ( "github.com/cometbft/cometbft/version" "github.com/cometbft/cometbft/oracle" - oracletypes "github.com/cometbft/cometbft/oracle/service/types" _ "net/http/pprof" //nolint: gosec ) @@ -71,7 +70,6 @@ type Node struct { mempoolReactor p2p.Reactor // for gossipping transactions mempool mempl.Mempool oracleReactor oracle.Reactor - oracleInfo *oracletypes.OracleInfo stateSync bool // whether the node should state sync on startup stateSyncReactor *statesync.Reactor // for hosting and restoring state sync snapshots stateSyncProvider statesync.StateProvider // provides state data for bootstrapping a node @@ -495,7 +493,6 @@ func NewNodeWithContext(ctx context.Context, mempoolReactor: mempoolReactor, mempool: mempool, oracleReactor: *oracleReactor, - oracleInfo: oracleInfo, consensusState: consensusState, consensusReactor: consensusReactor, stateSyncReactor: stateSyncReactor, diff --git a/oracle/reactor.go b/oracle/reactor.go index c93e0226de0..fb1ccf11758 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -6,8 +6,6 @@ import ( "time" "github.com/cometbft/cometbft/config" - "github.com/cometbft/cometbft/crypto/ed25519" - "github.com/cometbft/cometbft/crypto/sr25519" "github.com/cometbft/cometbft/proxy" "github.com/sirupsen/logrus" @@ -54,18 +52,14 @@ func NewReactor(config *config.OracleConfig, pubKey crypto.PubKey, privValidator Buffer: make(map[string]*oracleproto.GossipVote), } - unsignedVoteBuffer := &oracletypes.UnsignedVoteBuffer{ - Buffer: []*oracletypes.UnsignedVotes{}, - } - oracleInfo := &oracletypes.OracleInfo{ - Config: config, - GossipVoteBuffer: gossipVoteBuffer, - UnsignedVoteBuffer: unsignedVoteBuffer, - SignVotesChan: make(chan []*oracleproto.Vote), - PubKey: pubKey, - PrivValidator: privValidator, - ProxyApp: proxyApp, + Config: config, + GossipVoteBuffer: gossipVoteBuffer, + SignVotesChan: make(chan *oracleproto.Vote), + PubKey: pubKey, + PrivValidator: privValidator, + ProxyApp: proxyApp, + BlockTimestamps: make([]int64, 0), } oracleR := &Reactor{ @@ -93,7 +87,7 @@ func (oracleR *Reactor) SetLogger(l log.Logger) { func (oracleR *Reactor) OnStart() error { logrus.Info("[oracle] running oracle service...") go func() { - runner.Run(oracleR.OracleInfo) + runner.Run(oracleR.OracleInfo, oracleR.ConsensusState) }() return nil } @@ -140,15 +134,13 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { oracleR.Logger.Debug("Receive", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) switch msg := e.Message.(type) { case *oracleproto.GossipVote: - - // verify if val // verify sig of incoming gossip vote, throw if verification fails signType := msg.SignType - var pubKey crypto.PubKey + _, val := oracleR.ConsensusState.Validators.GetByIndex(msg.ValidatorIndex) + pubKey := val.PubKey switch signType { case "ed25519": - pubKey = ed25519.PubKey(msg.PublicKey) if success := pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature); !success { oracleR.Logger.Error("failed signature verification", msg) logrus.Info("FAILED SIGNATURE VERIFICATION!!!!!!!!!!!!!!") @@ -156,7 +148,6 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { return } case "sr25519": - pubKey = sr25519.PubKey(msg.PublicKey) if success := pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature); !success { oracleR.Logger.Error("failed signature verification", msg) logrus.Info("FAILED SIGNATURE VERIFICATION!!!!!!!!!!!!!!") diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 07d959d7032..b84a14c5629 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -2,6 +2,7 @@ package runner import ( "context" + "sync" "time" log "github.com/sirupsen/logrus" @@ -9,10 +10,11 @@ import ( "github.com/cometbft/cometbft/oracle/service/types" abcitypes "github.com/cometbft/cometbft/abci/types" + cs "github.com/cometbft/cometbft/consensus" oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" ) -func RunProcessSignVoteQueue(oracleInfo *types.OracleInfo) { +func RunProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State) { go func(oracleInfo *types.OracleInfo) { for { select { @@ -24,126 +26,129 @@ func RunProcessSignVoteQueue(oracleInfo *types.OracleInfo) { interval = 100 * time.Millisecond } time.Sleep(interval) - ProcessSignVoteQueue(oracleInfo) + ProcessSignVoteQueue(oracleInfo, consensusState) } } }(oracleInfo) } -func ProcessSignVoteQueue(oracleInfo *types.OracleInfo) { - for votes := range oracleInfo.SignVotesChan { - if len(votes) == 0 { - return - } - - // new batch of unsigned votes - newUnsignedVotes := &types.UnsignedVotes{ - Timestamp: time.Now().Unix(), - Votes: votes, +func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State) { + votes := []*oracleproto.Vote{} + for { + select { + case vote := <-oracleInfo.SignVotesChan: + votes = append(votes, vote) + continue + default: } + break + } - // append new batch into unsignedVotesBuffer, need to mutex lock as it will clash with concurrent pruning - oracleInfo.UnsignedVoteBuffer.UpdateMtx.Lock() - oracleInfo.UnsignedVoteBuffer.Buffer = append(oracleInfo.UnsignedVoteBuffer.Buffer, newUnsignedVotes) - oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() + if len(votes) == 0 { + return + } - // loop through unsignedVoteBuffer and combine all votes - var batchVotes = []*oracleproto.Vote{} - oracleInfo.UnsignedVoteBuffer.UpdateMtx.RLock() - for _, unsignedVotes := range oracleInfo.UnsignedVoteBuffer.Buffer { - batchVotes = append(batchVotes, unsignedVotes.Votes...) - } - oracleInfo.UnsignedVoteBuffer.UpdateMtx.RUnlock() - - // batch sign the entire unsignedVoteBuffer and add to gossipBuffer - newGossipVote := &oracleproto.GossipVote{ - Validator: oracleInfo.PubKey.Address(), - PublicKey: oracleInfo.PubKey.Bytes(), - SignType: oracleInfo.PubKey.Type(), - Votes: batchVotes, - } + // batch sign the new votes, along with existing votes in gossipVoteBuffer, if any + validatorIndex, _ := consensusState.Validators.GetByAddress(oracleInfo.PubKey.Address()) + if validatorIndex == -1 { + log.Errorf("unable to find validator index") + return + } - // signing of vote should append the signature field and timestamp field of gossipVote - if err := oracleInfo.PrivValidator.SignOracleVote("", newGossipVote); err != nil { - log.Errorf("error signing oracle votes") - continue - } + newGossipVote := &oracleproto.GossipVote{ + ValidatorIndex: validatorIndex, + SignType: oracleInfo.PubKey.Type(), + SignedTimestamp: time.Now().Unix(), + Votes: votes, + } - // replace current gossipVoteBuffer with new one - address := oracleInfo.PubKey.Address().String() + address := oracleInfo.PubKey.Address().String() + // need to mutex lock as it will clash with concurrent gossip + oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() + currentGossipVote, ok := oracleInfo.GossipVoteBuffer.Buffer[address] + if ok { + // append existing entry in gossipVoteBuffer + newGossipVote.Votes = append(currentGossipVote.Votes, newGossipVote.Votes...) + } - // need to mutex lock as it will clash with concurrent gossip - oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() - oracleInfo.GossipVoteBuffer.Buffer[address] = newGossipVote - log.Infof("adding new gossipBuffer at time: %v", newGossipVote.SignedTimestamp) + // signing of vote should append the signature field of gossipVote + if err := oracleInfo.PrivValidator.SignOracleVote("", newGossipVote); err != nil { + log.Errorf("error signing oracle votes") + // unlock here to prevent deadlock oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() + return } -} -func PruneGossipVoteBuffer(oracleInfo *types.OracleInfo) { - go func(oracleInfo *types.OracleInfo) { - interval := 60 * time.Second - ticker := time.Tick(interval) - for range ticker { - oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() - currTime := time.Now().Unix() - buffer := oracleInfo.GossipVoteBuffer.Buffer + oracleInfo.GossipVoteBuffer.Buffer[address] = newGossipVote + oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() +} - // prune gossip vote that have signed timestamps older than 60 secs - for valAddr, gossipVote := range oracleInfo.GossipVoteBuffer.Buffer { - if gossipVote.SignedTimestamp < currTime-int64(interval.Seconds()) { - log.Infof("DELETING STALE GOSSIP BUFFER (%v) FOR VAL: %s", gossipVote.SignedTimestamp, valAddr) - delete(buffer, valAddr) - } - } - oracleInfo.GossipVoteBuffer.Buffer = buffer - oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() +func contains(s []int64, e int64) bool { + for _, a := range s { + if a == e { + return true } - }(oracleInfo) + } + return false } -func PruneUnsignedVoteBuffer(oracleInfo *types.OracleInfo) { +func PruneGossipVoteBuffer(oracleInfo *types.OracleInfo, consensusState *cs.State) { go func(oracleInfo *types.OracleInfo) { - interval := oracleInfo.Config.PruneInterval - if interval == 0 { - interval = 4 * time.Second + maxGossipVoteAge := oracleInfo.Config.MaxGossipVoteAge + if maxGossipVoteAge == 0 { + maxGossipVoteAge = 3 } - ticker := time.Tick(interval) + ticker := time.Tick(1 * time.Second) for range ticker { - oracleInfo.UnsignedVoteBuffer.UpdateMtx.RLock() - // prune everything older than 4 secs - currTime := time.Now().Unix() - numberOfVotesToPrune := 0 - count := 0 - unsignedVoteBuffer := oracleInfo.UnsignedVoteBuffer.Buffer - for _, unsignedVotes := range unsignedVoteBuffer { - // unsigned votes are arranged from least recent to most recent - timestamp := unsignedVotes.Timestamp - if timestamp <= currTime-int64(interval.Seconds()) { - numberOfVotesToPrune++ - count += len(unsignedVotes.Votes) - } else { - // everything beyond is more recent hence we can early terminate - break - } + lastHeight := consensusState.GetLastHeight() + lastBlockTime := consensusState.GetState().LastBlockTime + log.Infof("last height: %v, last time: %v", lastHeight, lastBlockTime) + + if !contains(oracleInfo.BlockTimestamps, lastBlockTime.Unix()) { + oracleInfo.BlockTimestamps = append(oracleInfo.BlockTimestamps, lastBlockTime.Unix()) + } + + if len(oracleInfo.BlockTimestamps) < 3 { + continue + } + + if len(oracleInfo.BlockTimestamps) > 3 { + oracleInfo.BlockTimestamps = oracleInfo.BlockTimestamps[1:] } - oracleInfo.UnsignedVoteBuffer.UpdateMtx.RUnlock() - if numberOfVotesToPrune > 0 { - oracleInfo.UnsignedVoteBuffer.UpdateMtx.Lock() - oracleInfo.UnsignedVoteBuffer.Buffer = oracleInfo.UnsignedVoteBuffer.Buffer[numberOfVotesToPrune:] - oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() + oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() + var verifyWg sync.WaitGroup + + // prune votes that are older than the maxGossipVoteAge (in terms of block height) + for valAddr, gossipVote := range oracleInfo.GossipVoteBuffer.Buffer { + verifyWg.Add(1) + go func(valAddr string, gossipVote *oracleproto.GossipVote) { + defer verifyWg.Done() + + newVotes := []*oracleproto.Vote{} + for _, vote := range gossipVote.Votes { + if vote.Timestamp >= oracleInfo.BlockTimestamps[0] { + newVotes = append(newVotes, vote) + } else { + log.Infof("deleting vote: %v, from val addr buffer: %v", vote, valAddr) + } + } + gossipVote.Votes = newVotes + oracleInfo.GossipVoteBuffer.Buffer[valAddr] = gossipVote + }(valAddr, gossipVote) } + + verifyWg.Wait() + oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() } }(oracleInfo) } // Run run oracles -func Run(oracleInfo *types.OracleInfo) { +func Run(oracleInfo *types.OracleInfo, consensusState *cs.State) { log.Info("[oracle] Service started.") - RunProcessSignVoteQueue(oracleInfo) - PruneUnsignedVoteBuffer(oracleInfo) - PruneGossipVoteBuffer(oracleInfo) + RunProcessSignVoteQueue(oracleInfo, consensusState) + PruneGossipVoteBuffer(oracleInfo, consensusState) // start to take votes from app for { res, err := oracleInfo.ProxyApp.PrepareOracleVotes(context.Background(), &abcitypes.RequestPrepareOracleVotes{}) @@ -151,22 +156,8 @@ func Run(oracleInfo *types.OracleInfo) { log.Error(err) } - votes := []*oracleproto.Vote{} - - for _, vote := range res.Votes { - newVote := oracleproto.Vote{ - Validator: oracleInfo.PubKey.Address(), - OracleId: vote.OracleId, - Data: vote.Data, - Timestamp: vote.Timestamp, - } - votes = append(votes, &newVote) - } - - log.Infof("RESULTS: %v", res.Votes) - - oracleInfo.SignVotesChan <- votes + log.Infof("VOTE: %v", res.Vote) - time.Sleep(1000 * time.Millisecond) + oracleInfo.SignVotesChan <- res.Vote } } diff --git a/oracle/service/types/info.go b/oracle/service/types/info.go index fef589405cf..ebc5fa606a2 100644 --- a/oracle/service/types/info.go +++ b/oracle/service/types/info.go @@ -11,27 +11,16 @@ import ( // App struct for app type OracleInfo struct { - Config *config.OracleConfig - UnsignedVoteBuffer *UnsignedVoteBuffer - GossipVoteBuffer *GossipVoteBuffer - SignVotesChan chan []*oracleproto.Vote - PubKey crypto.PubKey - PrivValidator types.PrivValidator - StopChannel chan int - ProxyApp proxy.AppConnConsensus + Config *config.OracleConfig + GossipVoteBuffer *GossipVoteBuffer + SignVotesChan chan *oracleproto.Vote + PubKey crypto.PubKey + PrivValidator types.PrivValidator + StopChannel chan int + ProxyApp proxy.AppConnConsensus + BlockTimestamps []int64 } - -type UnsignedVotes struct { - Timestamp int64 - Votes []*oracleproto.Vote -} - type GossipVoteBuffer struct { Buffer map[string]*oracleproto.GossipVote UpdateMtx cmtsync.RWMutex } - -type UnsignedVoteBuffer struct { - Buffer []*UnsignedVotes // deque of UnsignedVote obj - UpdateMtx cmtsync.RWMutex -} diff --git a/oracle/service/utils/compress.go b/oracle/service/utils/compress.go deleted file mode 100644 index 82891d7f384..00000000000 --- a/oracle/service/utils/compress.go +++ /dev/null @@ -1,36 +0,0 @@ -package utils - -import ( - "bytes" - "compress/gzip" - "io" -) - -func CompressString(input string) ([]byte, error) { - var buf bytes.Buffer - gz := gzip.NewWriter(&buf) - _, err := gz.Write([]byte(input)) - if err != nil { - return nil, err - } - if err := gz.Close(); err != nil { - return nil, err - } - return buf.Bytes(), nil -} - -func DecompressString(compressed []byte) (string, error) { - buf := bytes.NewReader(compressed) - gz, err := gzip.NewReader(buf) - if err != nil { - return "", err - } - decompressed, err := io.ReadAll(gz) - if err != nil { - return "", err - } - if err := gz.Close(); err != nil { - return "", err - } - return string(decompressed), nil -} diff --git a/privval/file.go b/privval/file.go index 6b4a415077c..0442cfa2450 100644 --- a/privval/file.go +++ b/privval/file.go @@ -315,7 +315,6 @@ func (pv *FilePV) signOracleVote(vote *oracleproto.GossipVote) error { if err != nil { return err } - vote.SignedTimestamp = time.Now().Unix() vote.Signature = sig return nil diff --git a/privval/retry_signer_client.go b/privval/retry_signer_client.go index 270aa63473d..e30385b4534 100644 --- a/privval/retry_signer_client.go +++ b/privval/retry_signer_client.go @@ -81,7 +81,6 @@ func (sc *RetrySignerClient) SignVote(chainID string, vote *cmtproto.Vote) error } func (sc *RetrySignerClient) SignOracleVote(chainID string, vote *oracleproto.GossipVote) error { - // TODO TODO TODO: implement sign oracle vote var err error for i := 0; i < sc.retries || sc.retries == 0; i++ { err = sc.next.SignOracleVote(chainID, vote) diff --git a/privval/signer_client.go b/privval/signer_client.go index f2ab27c5d84..39059517fba 100644 --- a/privval/signer_client.go +++ b/privval/signer_client.go @@ -113,7 +113,6 @@ func (sc *SignerClient) SignVote(chainID string, vote *cmtproto.Vote) error { // SignVote requests a remote signer to sign a vote func (sc *SignerClient) SignOracleVote(chainID string, vote *oracleproto.GossipVote) error { - // TODO TODO TODO: implement sign oracle vote response, err := sc.endpoint.SendRequest(mustWrapMsg(&privvalproto.SignOracleVoteRequest{Vote: vote, ChainId: chainID})) if err != nil { return err diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto index 5d5205ffdcf..40fe4cfd1e7 100644 --- a/proto/tendermint/abci/types.proto +++ b/proto/tendermint/abci/types.proto @@ -391,14 +391,8 @@ message ResponseSignGossipVote { bytes encoded_tx = 1; } -message Vote { - string oracle_id = 1; - int64 timestamp = 2; - string data = 3; -} - message ResponsePrepareOracleVotes { - repeated Vote votes = 1 [(gogoproto.nullable) = false]; + tendermint.oracle.Vote vote = 1; } message ResponseValidateOracleVotes { diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index 5ab59c68806..b08c8620276 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -91,12 +91,11 @@ func (m *Vote) GetData() string { } type GossipVote struct { - Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` - PublicKey []byte `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` - SignType string `protobuf:"bytes,3,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` - Votes []*Vote `protobuf:"bytes,4,rep,name=votes,proto3" json:"votes,omitempty"` - SignedTimestamp int64 `protobuf:"varint,5,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` - Signature []byte `protobuf:"bytes,6,opt,name=signature,proto3" json:"signature,omitempty"` + ValidatorIndex int32 `protobuf:"varint,1,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` + SignType string `protobuf:"bytes,2,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` + Votes []*Vote `protobuf:"bytes,3,rep,name=votes,proto3" json:"votes,omitempty"` + SignedTimestamp int64 `protobuf:"varint,4,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` + Signature []byte `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` } func (m *GossipVote) Reset() { *m = GossipVote{} } @@ -132,18 +131,11 @@ func (m *GossipVote) XXX_DiscardUnknown() { var xxx_messageInfo_GossipVote proto.InternalMessageInfo -func (m *GossipVote) GetValidator() []byte { +func (m *GossipVote) GetValidatorIndex() int32 { if m != nil { - return m.Validator - } - return nil -} - -func (m *GossipVote) GetPublicKey() []byte { - if m != nil { - return m.PublicKey + return m.ValidatorIndex } - return nil + return 0 } func (m *GossipVote) GetSignType() string { @@ -175,10 +167,9 @@ func (m *GossipVote) GetSignature() []byte { } type CanonicalGossipVote struct { - Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` - PublicKey []byte `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` - SignType string `protobuf:"bytes,3,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` - Votes []*Vote `protobuf:"bytes,4,rep,name=votes,proto3" json:"votes,omitempty"` + ValidatorIndex int32 `protobuf:"varint,1,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` + SignType string `protobuf:"bytes,2,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` + Votes []*Vote `protobuf:"bytes,3,rep,name=votes,proto3" json:"votes,omitempty"` } func (m *CanonicalGossipVote) Reset() { *m = CanonicalGossipVote{} } @@ -214,18 +205,11 @@ func (m *CanonicalGossipVote) XXX_DiscardUnknown() { var xxx_messageInfo_CanonicalGossipVote proto.InternalMessageInfo -func (m *CanonicalGossipVote) GetValidator() []byte { +func (m *CanonicalGossipVote) GetValidatorIndex() int32 { if m != nil { - return m.Validator - } - return nil -} - -func (m *CanonicalGossipVote) GetPublicKey() []byte { - if m != nil { - return m.PublicKey + return m.ValidatorIndex } - return nil + return 0 } func (m *CanonicalGossipVote) GetSignType() string { @@ -242,211 +226,37 @@ func (m *CanonicalGossipVote) GetVotes() []*Vote { return nil } -type Oracle struct { - Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` - Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` - Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` - MinTurnoutPercentage string `protobuf:"bytes,5,opt,name=min_turnout_percentage,json=minTurnoutPercentage,proto3" json:"min_turnout_percentage,omitempty"` - MaxResultAge string `protobuf:"bytes,6,opt,name=max_result_age,json=maxResultAge,proto3" json:"max_result_age,omitempty"` - SecurityType string `protobuf:"bytes,7,opt,name=security_type,json=securityType,proto3" json:"security_type,omitempty"` - ResultStrategy string `protobuf:"bytes,8,opt,name=result_strategy,json=resultStrategy,proto3" json:"result_strategy,omitempty"` - Resolution string `protobuf:"bytes,9,opt,name=resolution,proto3" json:"resolution,omitempty"` - Spec string `protobuf:"bytes,10,opt,name=spec,proto3" json:"spec,omitempty"` -} - -func (m *Oracle) Reset() { *m = Oracle{} } -func (m *Oracle) String() string { return proto.CompactTextString(m) } -func (*Oracle) ProtoMessage() {} -func (*Oracle) Descriptor() ([]byte, []int) { - return fileDescriptor_ed9227d272ed5d90, []int{3} -} -func (m *Oracle) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Oracle) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Oracle.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Oracle) XXX_Merge(src proto.Message) { - xxx_messageInfo_Oracle.Merge(m, src) -} -func (m *Oracle) XXX_Size() int { - return m.Size() -} -func (m *Oracle) XXX_DiscardUnknown() { - xxx_messageInfo_Oracle.DiscardUnknown(m) -} - -var xxx_messageInfo_Oracle proto.InternalMessageInfo - -func (m *Oracle) GetCreator() string { - if m != nil { - return m.Creator - } - return "" -} - -func (m *Oracle) GetId() string { - if m != nil { - return m.Id - } - return "" -} - -func (m *Oracle) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func (m *Oracle) GetStatus() string { - if m != nil { - return m.Status - } - return "" -} - -func (m *Oracle) GetMinTurnoutPercentage() string { - if m != nil { - return m.MinTurnoutPercentage - } - return "" -} - -func (m *Oracle) GetMaxResultAge() string { - if m != nil { - return m.MaxResultAge - } - return "" -} - -func (m *Oracle) GetSecurityType() string { - if m != nil { - return m.SecurityType - } - return "" -} - -func (m *Oracle) GetResultStrategy() string { - if m != nil { - return m.ResultStrategy - } - return "" -} - -func (m *Oracle) GetResolution() string { - if m != nil { - return m.Resolution - } - return "" -} - -func (m *Oracle) GetSpec() string { - if m != nil { - return m.Spec - } - return "" -} - -type GossipVotes struct { - GossipVotes []*GossipVote `protobuf:"bytes,1,rep,name=GossipVotes,proto3" json:"GossipVotes,omitempty"` -} - -func (m *GossipVotes) Reset() { *m = GossipVotes{} } -func (m *GossipVotes) String() string { return proto.CompactTextString(m) } -func (*GossipVotes) ProtoMessage() {} -func (*GossipVotes) Descriptor() ([]byte, []int) { - return fileDescriptor_ed9227d272ed5d90, []int{4} -} -func (m *GossipVotes) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GossipVotes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GossipVotes.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *GossipVotes) XXX_Merge(src proto.Message) { - xxx_messageInfo_GossipVotes.Merge(m, src) -} -func (m *GossipVotes) XXX_Size() int { - return m.Size() -} -func (m *GossipVotes) XXX_DiscardUnknown() { - xxx_messageInfo_GossipVotes.DiscardUnknown(m) -} - -var xxx_messageInfo_GossipVotes proto.InternalMessageInfo - -func (m *GossipVotes) GetGossipVotes() []*GossipVote { - if m != nil { - return m.GossipVotes - } - return nil -} - func init() { proto.RegisterType((*Vote)(nil), "tendermint.oracle.Vote") proto.RegisterType((*GossipVote)(nil), "tendermint.oracle.GossipVote") proto.RegisterType((*CanonicalGossipVote)(nil), "tendermint.oracle.CanonicalGossipVote") - proto.RegisterType((*Oracle)(nil), "tendermint.oracle.Oracle") - proto.RegisterType((*GossipVotes)(nil), "tendermint.oracle.GossipVotes") } func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 528 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x94, 0xc1, 0x6e, 0xd3, 0x4c, - 0x10, 0xc7, 0xe3, 0x24, 0x4d, 0xe3, 0x49, 0xbe, 0xf4, 0x63, 0x41, 0xc5, 0x12, 0x8d, 0x15, 0x05, - 0x24, 0xc2, 0x81, 0x44, 0x82, 0xde, 0x11, 0x70, 0x40, 0x08, 0xa9, 0x20, 0x13, 0x71, 0xe0, 0x62, - 0x6d, 0xec, 0x21, 0xac, 0xb0, 0xbd, 0xd6, 0xee, 0xb8, 0xaa, 0xdf, 0x82, 0x27, 0xe0, 0x79, 0x10, - 0xa7, 0x1e, 0x39, 0x21, 0x94, 0xbc, 0x08, 0xf2, 0x6e, 0x6a, 0x07, 0x95, 0x03, 0x47, 0x6e, 0xbb, - 0xbf, 0xf9, 0x4f, 0x66, 0xfe, 0x33, 0x1b, 0xc3, 0x98, 0x30, 0x8b, 0x51, 0xa5, 0x22, 0xa3, 0x85, - 0x54, 0x3c, 0x4a, 0x70, 0x41, 0x65, 0x8e, 0x7a, 0x9e, 0x2b, 0x49, 0x92, 0xdd, 0x68, 0xc2, 0x73, - 0x1b, 0x9e, 0x6a, 0xe8, 0xbe, 0x93, 0x84, 0xec, 0x04, 0xdc, 0x73, 0x9e, 0x88, 0x98, 0x93, 0x54, - 0x9e, 0x33, 0x71, 0x66, 0xc3, 0xa0, 0x01, 0xec, 0x0e, 0xb8, 0x56, 0x1f, 0x8a, 0xd8, 0x6b, 0x4f, - 0x9c, 0x99, 0x1b, 0xf4, 0x2d, 0x78, 0x19, 0x57, 0xa9, 0x24, 0x52, 0xd4, 0xc4, 0xd3, 0xdc, 0xeb, - 0x4c, 0x9c, 0x59, 0x27, 0x68, 0x00, 0x63, 0xd0, 0x8d, 0x39, 0x71, 0xaf, 0x6b, 0xb2, 0xcc, 0x79, - 0xfa, 0xc3, 0x01, 0x78, 0x21, 0xb5, 0x16, 0xf9, 0x5f, 0xd4, 0x1e, 0x03, 0xe4, 0xc5, 0x2a, 0x11, - 0x51, 0xf8, 0x09, 0x4b, 0x53, 0x7c, 0x18, 0xb8, 0x96, 0xbc, 0xc2, 0xb2, 0x6a, 0x4d, 0x8b, 0x75, - 0x16, 0x56, 0x3e, 0x4d, 0x75, 0x37, 0xe8, 0x57, 0x60, 0x59, 0xe6, 0xc8, 0x1e, 0xc2, 0xc1, 0xb9, - 0x24, 0xd4, 0x5e, 0x77, 0xd2, 0x99, 0x0d, 0x1e, 0xdd, 0x9e, 0x5f, 0x1b, 0xc0, 0xbc, 0xea, 0x20, - 0xb0, 0x2a, 0xf6, 0x00, 0xfe, 0xaf, 0x52, 0x31, 0x0e, 0x1b, 0x43, 0x07, 0xc6, 0xd0, 0x91, 0xe5, - 0xcb, 0xda, 0xd6, 0x89, 0x2d, 0xcb, 0xa9, 0x50, 0xe8, 0xf5, 0x6c, 0x53, 0x35, 0x98, 0x7e, 0x71, - 0xe0, 0xe6, 0x73, 0x9e, 0xc9, 0x4c, 0x44, 0x3c, 0xf9, 0x07, 0x9d, 0x4e, 0xbf, 0xb5, 0xa1, 0xf7, - 0xda, 0x60, 0xe6, 0xc1, 0x61, 0xa4, 0xb0, 0xee, 0xc8, 0x0d, 0xae, 0xae, 0x6c, 0x04, 0xed, 0x7a, - 0xdd, 0x6d, 0x11, 0xb3, 0x09, 0x0c, 0x62, 0xd4, 0x91, 0x12, 0x39, 0x09, 0x99, 0xed, 0x5a, 0xd8, - 0x47, 0xec, 0x18, 0x7a, 0x9a, 0x38, 0x15, 0x7a, 0xb7, 0xee, 0xdd, 0x8d, 0x9d, 0xc2, 0x71, 0x2a, - 0xb2, 0x90, 0x0a, 0x95, 0xc9, 0x82, 0xc2, 0x1c, 0x55, 0x84, 0x19, 0xf1, 0x35, 0x9a, 0xf1, 0xba, - 0xc1, 0xad, 0x54, 0x64, 0x4b, 0x1b, 0x7c, 0x53, 0xc7, 0xd8, 0x3d, 0x18, 0xa5, 0xfc, 0x22, 0x54, - 0xa8, 0x8b, 0x84, 0xc2, 0x4a, 0xdd, 0x33, 0xea, 0x61, 0xca, 0x2f, 0x02, 0x03, 0x9f, 0xae, 0x91, - 0xdd, 0x85, 0xff, 0x34, 0x46, 0x85, 0x12, 0x54, 0xda, 0xd1, 0x1c, 0x5a, 0xd1, 0x15, 0x34, 0xe3, - 0xb9, 0x0f, 0x47, 0xbb, 0x9f, 0xd1, 0xa4, 0x38, 0xe1, 0xba, 0xf4, 0xfa, 0x46, 0x36, 0xb2, 0xf8, - 0xed, 0x8e, 0x32, 0x1f, 0x40, 0xa1, 0x96, 0x49, 0x61, 0x2c, 0xba, 0x46, 0xb3, 0x47, 0xaa, 0xe7, - 0xac, 0x73, 0x8c, 0x3c, 0xb0, 0xcf, 0xb9, 0x3a, 0x4f, 0xcf, 0x60, 0xd0, 0xec, 0x58, 0xb3, 0x27, - 0xbf, 0x5d, 0x3d, 0xc7, 0x2c, 0x64, 0xfc, 0x87, 0x85, 0x34, 0xaa, 0x60, 0x3f, 0xe3, 0xd9, 0xd9, - 0xd7, 0x8d, 0xef, 0x5c, 0x6e, 0x7c, 0xe7, 0xe7, 0xc6, 0x77, 0x3e, 0x6f, 0xfd, 0xd6, 0xe5, 0xd6, - 0x6f, 0x7d, 0xdf, 0xfa, 0xad, 0xf7, 0xa7, 0x6b, 0x41, 0x1f, 0x8b, 0xd5, 0x3c, 0x92, 0xe9, 0x22, - 0x92, 0x29, 0xd2, 0xea, 0x03, 0x35, 0x07, 0xf3, 0x27, 0x5f, 0x5c, 0xfb, 0x04, 0xac, 0x7a, 0x26, - 0xf0, 0xf8, 0x57, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb7, 0x1f, 0x18, 0xf7, 0x1e, 0x04, 0x00, 0x00, + // 328 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x92, 0x31, 0x4e, 0xc3, 0x30, + 0x14, 0x86, 0x6b, 0x92, 0x22, 0x6a, 0x10, 0x05, 0x33, 0x10, 0x89, 0x12, 0x45, 0x5d, 0x08, 0x03, + 0x89, 0x04, 0x9c, 0x00, 0x06, 0xd4, 0x85, 0x21, 0xaa, 0x18, 0x58, 0x22, 0x37, 0x36, 0xc5, 0x52, + 0x63, 0x47, 0xf1, 0x6b, 0x45, 0xaf, 0xc0, 0xc4, 0xb1, 0x10, 0x53, 0x47, 0x46, 0xd4, 0x5e, 0x04, + 0xd9, 0x16, 0xc9, 0xd0, 0x03, 0xb0, 0x59, 0xdf, 0x7b, 0xbf, 0xfe, 0xff, 0xb7, 0x1e, 0x3e, 0x07, + 0x2e, 0x19, 0xaf, 0x4b, 0x21, 0x21, 0x55, 0x35, 0x2d, 0x66, 0x3c, 0x85, 0x65, 0xc5, 0x75, 0x52, + 0xd5, 0x0a, 0x14, 0x39, 0x6e, 0xc7, 0x89, 0x1b, 0x0f, 0x35, 0xf6, 0x9f, 0x14, 0x70, 0x32, 0xc0, + 0xbd, 0x05, 0x9d, 0x09, 0x46, 0x41, 0xd5, 0x01, 0x8a, 0x50, 0x7c, 0x90, 0xb5, 0x80, 0x9c, 0xe1, + 0x9e, 0xdb, 0xcf, 0x05, 0x0b, 0x76, 0x22, 0x14, 0xf7, 0xb2, 0x3d, 0x07, 0x46, 0xcc, 0x48, 0x41, + 0x94, 0x5c, 0x03, 0x2d, 0xab, 0xc0, 0x8b, 0x50, 0xec, 0x65, 0x2d, 0x20, 0x04, 0xfb, 0x8c, 0x02, + 0x0d, 0x7c, 0xab, 0xb2, 0xef, 0xe1, 0x17, 0xc2, 0xf8, 0x41, 0x69, 0x2d, 0x2a, 0xeb, 0x7d, 0x81, + 0xfb, 0x8d, 0x55, 0x2e, 0x24, 0xe3, 0x6f, 0x36, 0x41, 0x37, 0x3b, 0x6c, 0xf0, 0xc8, 0x50, 0x13, + 0x43, 0x8b, 0xa9, 0xcc, 0x4d, 0xa7, 0xbf, 0x18, 0x06, 0x8c, 0x97, 0x15, 0x27, 0x57, 0xb8, 0xbb, + 0x50, 0xc0, 0x75, 0xe0, 0x45, 0x5e, 0xbc, 0x7f, 0x7d, 0x9a, 0x6c, 0x95, 0x4d, 0x8c, 0x5b, 0xe6, + 0xb6, 0xc8, 0x25, 0x3e, 0x32, 0x52, 0xce, 0xf2, 0x36, 0xbc, 0x6f, 0xc3, 0xf7, 0x1d, 0x1f, 0x37, + 0x15, 0x06, 0xce, 0x96, 0xc2, 0xbc, 0xe6, 0x41, 0xd7, 0xfd, 0x4d, 0x03, 0x86, 0xef, 0x08, 0x9f, + 0xdc, 0x53, 0xa9, 0xa4, 0x28, 0xe8, 0xec, 0x9f, 0x5b, 0xdd, 0x3d, 0x7e, 0xae, 0x43, 0xb4, 0x5a, + 0x87, 0xe8, 0x67, 0x1d, 0xa2, 0x8f, 0x4d, 0xd8, 0x59, 0x6d, 0xc2, 0xce, 0xf7, 0x26, 0xec, 0x3c, + 0xdf, 0x4e, 0x05, 0xbc, 0xce, 0x27, 0x49, 0xa1, 0xca, 0xb4, 0x50, 0x25, 0x87, 0xc9, 0x0b, 0xb4, + 0x0f, 0x7b, 0x1f, 0xe9, 0xd6, 0xf5, 0x4c, 0x76, 0xed, 0xe0, 0xe6, 0x37, 0x00, 0x00, 0xff, 0xff, + 0x58, 0x6b, 0x3b, 0xa5, 0x59, 0x02, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -523,12 +333,12 @@ func (m *GossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.Signature) i = encodeVarintTypes(dAtA, i, uint64(len(m.Signature))) i-- - dAtA[i] = 0x32 + dAtA[i] = 0x2a } if m.SignedTimestamp != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.SignedTimestamp)) i-- - dAtA[i] = 0x28 + dAtA[i] = 0x20 } if len(m.Votes) > 0 { for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { @@ -541,7 +351,7 @@ func (m *GossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x22 + dAtA[i] = 0x1a } } if len(m.SignType) > 0 { @@ -549,21 +359,12 @@ func (m *GossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.SignType) i = encodeVarintTypes(dAtA, i, uint64(len(m.SignType))) i-- - dAtA[i] = 0x1a - } - if len(m.PublicKey) > 0 { - i -= len(m.PublicKey) - copy(dAtA[i:], m.PublicKey) - i = encodeVarintTypes(dAtA, i, uint64(len(m.PublicKey))) - i-- dAtA[i] = 0x12 } - if len(m.Validator) > 0 { - i -= len(m.Validator) - copy(dAtA[i:], m.Validator) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Validator))) + if m.ValidatorIndex != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.ValidatorIndex)) i-- - dAtA[i] = 0xa + dAtA[i] = 0x8 } return len(dAtA) - i, nil } @@ -599,7 +400,7 @@ func (m *CanonicalGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x22 + dAtA[i] = 0x1a } } if len(m.SignType) > 0 { @@ -607,151 +408,12 @@ func (m *CanonicalGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.SignType) i = encodeVarintTypes(dAtA, i, uint64(len(m.SignType))) i-- - dAtA[i] = 0x1a - } - if len(m.PublicKey) > 0 { - i -= len(m.PublicKey) - copy(dAtA[i:], m.PublicKey) - i = encodeVarintTypes(dAtA, i, uint64(len(m.PublicKey))) - i-- - dAtA[i] = 0x12 - } - if len(m.Validator) > 0 { - i -= len(m.Validator) - copy(dAtA[i:], m.Validator) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Validator))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Oracle) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Oracle) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Oracle) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Spec) > 0 { - i -= len(m.Spec) - copy(dAtA[i:], m.Spec) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Spec))) - i-- - dAtA[i] = 0x52 - } - if len(m.Resolution) > 0 { - i -= len(m.Resolution) - copy(dAtA[i:], m.Resolution) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Resolution))) - i-- - dAtA[i] = 0x4a - } - if len(m.ResultStrategy) > 0 { - i -= len(m.ResultStrategy) - copy(dAtA[i:], m.ResultStrategy) - i = encodeVarintTypes(dAtA, i, uint64(len(m.ResultStrategy))) - i-- - dAtA[i] = 0x42 - } - if len(m.SecurityType) > 0 { - i -= len(m.SecurityType) - copy(dAtA[i:], m.SecurityType) - i = encodeVarintTypes(dAtA, i, uint64(len(m.SecurityType))) - i-- - dAtA[i] = 0x3a - } - if len(m.MaxResultAge) > 0 { - i -= len(m.MaxResultAge) - copy(dAtA[i:], m.MaxResultAge) - i = encodeVarintTypes(dAtA, i, uint64(len(m.MaxResultAge))) - i-- - dAtA[i] = 0x32 - } - if len(m.MinTurnoutPercentage) > 0 { - i -= len(m.MinTurnoutPercentage) - copy(dAtA[i:], m.MinTurnoutPercentage) - i = encodeVarintTypes(dAtA, i, uint64(len(m.MinTurnoutPercentage))) - i-- - dAtA[i] = 0x2a - } - if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Status))) - i-- - dAtA[i] = 0x22 - } - if len(m.Description) > 0 { - i -= len(m.Description) - copy(dAtA[i:], m.Description) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Description))) - i-- - dAtA[i] = 0x1a - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Id))) - i-- dAtA[i] = 0x12 } - if len(m.Creator) > 0 { - i -= len(m.Creator) - copy(dAtA[i:], m.Creator) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Creator))) + if m.ValidatorIndex != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.ValidatorIndex)) i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GossipVotes) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GossipVotes) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GossipVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.GossipVotes) > 0 { - for iNdEx := len(m.GossipVotes) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.GossipVotes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } + dAtA[i] = 0x8 } return len(dAtA) - i, nil } @@ -797,13 +459,8 @@ func (m *GossipVote) Size() (n int) { } var l int _ = l - l = len(m.Validator) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.PublicKey) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + if m.ValidatorIndex != 0 { + n += 1 + sovTypes(uint64(m.ValidatorIndex)) } l = len(m.SignType) if l > 0 { @@ -831,13 +488,8 @@ func (m *CanonicalGossipVote) Size() (n int) { } var l int _ = l - l = len(m.Validator) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.PublicKey) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + if m.ValidatorIndex != 0 { + n += 1 + sovTypes(uint64(m.ValidatorIndex)) } l = len(m.SignType) if l > 0 { @@ -852,72 +504,8 @@ func (m *CanonicalGossipVote) Size() (n int) { return n } -func (m *Oracle) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Creator) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.Id) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.Description) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.Status) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.MinTurnoutPercentage) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.MaxResultAge) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.SecurityType) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.ResultStrategy) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.Resolution) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.Spec) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *GossipVotes) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.GossipVotes) > 0 { - for _, e := range m.GossipVotes { - l = e.Size() - n += 1 + l + sovTypes(uint64(l)) - } - } - return n -} - -func sovTypes(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 +func sovTypes(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 } func sozTypes(x uint64) (n int) { return sovTypes(uint64((x << 1) ^ uint64((int64(x) >> 63)))) @@ -1119,10 +707,10 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorIndex", wireType) } - var byteLen int + m.ValidatorIndex = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -1132,61 +720,12 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + m.ValidatorIndex |= int32(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) - if m.Validator == nil { - m.Validator = []byte{} - } - iNdEx = postIndex case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PublicKey", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PublicKey = append(m.PublicKey[:0], dAtA[iNdEx:postIndex]...) - if m.PublicKey == nil { - m.PublicKey = []byte{} - } - iNdEx = postIndex - case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field SignType", wireType) } @@ -1218,7 +757,7 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { } m.SignType = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) } @@ -1252,7 +791,7 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 5: + case 4: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field SignedTimestamp", wireType) } @@ -1271,7 +810,7 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { break } } - case 6: + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) } @@ -1356,10 +895,10 @@ func (m *CanonicalGossipVote) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorIndex", wireType) } - var byteLen int + m.ValidatorIndex = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -1369,61 +908,12 @@ func (m *CanonicalGossipVote) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + m.ValidatorIndex |= int32(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) - if m.Validator == nil { - m.Validator = []byte{} - } - iNdEx = postIndex case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PublicKey", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PublicKey = append(m.PublicKey[:0], dAtA[iNdEx:postIndex]...) - if m.PublicKey == nil { - m.PublicKey = []byte{} - } - iNdEx = postIndex - case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field SignType", wireType) } @@ -1455,7 +945,7 @@ func (m *CanonicalGossipVote) Unmarshal(dAtA []byte) error { } m.SignType = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) } @@ -1510,460 +1000,6 @@ func (m *CanonicalGossipVote) Unmarshal(dAtA []byte) error { } return nil } -func (m *Oracle) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Oracle: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Oracle: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Creator = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Description = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Status = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MinTurnoutPercentage", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.MinTurnoutPercentage = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxResultAge", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.MaxResultAge = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SecurityType", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SecurityType = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResultStrategy", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ResultStrategy = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Resolution", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Resolution = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 10: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Spec = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GossipVotes) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: GossipVotes: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GossipVotes: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GossipVotes", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.GossipVotes = append(m.GossipVotes, &GossipVote{}) - if err := m.GossipVotes[len(m.GossipVotes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func skipTypes(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index f104eefeda6..2cff39123c1 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -11,34 +11,15 @@ message Vote { } message GossipVote { - bytes validator = 1; - bytes public_key = 2; - string sign_type = 3; - repeated Vote votes = 4; - int64 signed_timestamp = 5; - bytes signature = 6; + int32 validator_index = 1; + string sign_type = 2; + repeated Vote votes = 3; + int64 signed_timestamp = 4; + bytes signature = 5; } message CanonicalGossipVote { - bytes validator = 1; - bytes public_key = 2; - string sign_type = 3; - repeated Vote votes = 4; + int32 validator_index = 1; + string sign_type = 2; + repeated Vote votes = 3; } - -message Oracle { - string creator = 1; - string id = 2; - string description = 3; - string status = 4; - string min_turnout_percentage = 5; - string max_result_age = 6; - string security_type = 7; - string result_strategy = 8; - string resolution = 9; - string spec = 10; -} - -message GossipVotes { - repeated GossipVote GossipVotes = 1; -} \ No newline at end of file diff --git a/types/oracle.go b/types/oracle.go index 6cf4532a1a3..081513cae25 100644 --- a/types/oracle.go +++ b/types/oracle.go @@ -17,8 +17,8 @@ func OracleVoteSignBytes(vote *oracleproto.GossipVote) []byte { func CanonicalizeOracleVote(vote *oracleproto.GossipVote) oracleproto.CanonicalGossipVote { return oracleproto.CanonicalGossipVote{ - PublicKey: vote.PublicKey, - SignType: vote.SignType, - Votes: vote.Votes, + ValidatorIndex: vote.ValidatorIndex, + SignType: vote.SignType, + Votes: vote.Votes, } } diff --git a/types/priv_validator.go b/types/priv_validator.go index c0e79e08102..0481370329d 100644 --- a/types/priv_validator.go +++ b/types/priv_validator.go @@ -4,7 +4,6 @@ import ( "bytes" "errors" "fmt" - "time" "github.com/cometbft/cometbft/crypto" "github.com/cometbft/cometbft/crypto/ed25519" @@ -103,13 +102,11 @@ func (pv MockPV) SignVote(chainID string, vote *cmtproto.Vote) error { // Implements PrivValidator. func (pv MockPV) SignOracleVote(chainID string, vote *oracleproto.GossipVote) error { - // TODO TODO TODO: implement sign oracle vote signBytes := OracleVoteSignBytes(vote) sig, err := pv.PrivKey.Sign(signBytes) if err != nil { return err } - vote.SignedTimestamp = time.Now().Unix() vote.Signature = sig return nil From 5ede911d3ce9b56d8512de6c19c80a38fb412e32 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 23 Apr 2024 15:28:55 +0800 Subject: [PATCH 057/150] fix prepareOracleVotes bug --- oracle/service/runner/runner.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index b84a14c5629..c0f0e14a6ad 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -153,7 +153,9 @@ func Run(oracleInfo *types.OracleInfo, consensusState *cs.State) { for { res, err := oracleInfo.ProxyApp.PrepareOracleVotes(context.Background(), &abcitypes.RequestPrepareOracleVotes{}) if err != nil { - log.Error(err) + log.Errorf("app not ready: %v, retrying...", err) + time.Sleep(1 * time.Second) + continue } log.Infof("VOTE: %v", res.Vote) From ec4493608a8360cd0d74182e30433f4a2a904805 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 23 Apr 2024 16:21:09 +0800 Subject: [PATCH 058/150] add logs --- oracle/service/runner/runner.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index c0f0e14a6ad..01ff5c494e2 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -79,6 +79,8 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State return } + log.Infof("THIS IS MY COMET PUB KEY: %v", oracleInfo.PubKey) + oracleInfo.GossipVoteBuffer.Buffer[address] = newGossipVote oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() } From 8651c1128e40bf5c28c171ddd4ff0be10e711576 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 23 Apr 2024 16:35:49 +0800 Subject: [PATCH 059/150] include signedTimeStamp in signedVote --- proto/tendermint/oracle/types.pb.go | 81 +++++++++++++++++++++-------- proto/tendermint/oracle/types.proto | 1 + types/oracle.go | 7 +-- 3 files changed, 63 insertions(+), 26 deletions(-) diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index b08c8620276..78fd66ab480 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -167,9 +167,10 @@ func (m *GossipVote) GetSignature() []byte { } type CanonicalGossipVote struct { - ValidatorIndex int32 `protobuf:"varint,1,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` - SignType string `protobuf:"bytes,2,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` - Votes []*Vote `protobuf:"bytes,3,rep,name=votes,proto3" json:"votes,omitempty"` + ValidatorIndex int32 `protobuf:"varint,1,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` + SignType string `protobuf:"bytes,2,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` + Votes []*Vote `protobuf:"bytes,3,rep,name=votes,proto3" json:"votes,omitempty"` + SignedTimestamp int64 `protobuf:"varint,4,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` } func (m *CanonicalGossipVote) Reset() { *m = CanonicalGossipVote{} } @@ -226,6 +227,13 @@ func (m *CanonicalGossipVote) GetVotes() []*Vote { return nil } +func (m *CanonicalGossipVote) GetSignedTimestamp() int64 { + if m != nil { + return m.SignedTimestamp + } + return 0 +} + func init() { proto.RegisterType((*Vote)(nil), "tendermint.oracle.Vote") proto.RegisterType((*GossipVote)(nil), "tendermint.oracle.GossipVote") @@ -235,28 +243,28 @@ func init() { func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 328 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x92, 0x31, 0x4e, 0xc3, 0x30, + // 329 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x92, 0x31, 0x4e, 0xc3, 0x30, 0x14, 0x86, 0x6b, 0x92, 0x22, 0x6a, 0x10, 0x05, 0x33, 0x10, 0x89, 0x12, 0x45, 0x5d, 0x08, 0x03, 0x89, 0x04, 0x9c, 0x00, 0x06, 0xd4, 0x85, 0x21, 0xaa, 0x18, 0x58, 0x22, 0x37, 0x36, 0xc5, 0x52, - 0x63, 0x47, 0xf1, 0x6b, 0x45, 0xaf, 0xc0, 0xc4, 0xb1, 0x10, 0x53, 0x47, 0x46, 0xd4, 0x5e, 0x04, - 0xd9, 0x16, 0xc9, 0xd0, 0x03, 0xb0, 0x59, 0xdf, 0x7b, 0xbf, 0xfe, 0xff, 0xb7, 0x1e, 0x3e, 0x07, - 0x2e, 0x19, 0xaf, 0x4b, 0x21, 0x21, 0x55, 0x35, 0x2d, 0x66, 0x3c, 0x85, 0x65, 0xc5, 0x75, 0x52, - 0xd5, 0x0a, 0x14, 0x39, 0x6e, 0xc7, 0x89, 0x1b, 0x0f, 0x35, 0xf6, 0x9f, 0x14, 0x70, 0x32, 0xc0, - 0xbd, 0x05, 0x9d, 0x09, 0x46, 0x41, 0xd5, 0x01, 0x8a, 0x50, 0x7c, 0x90, 0xb5, 0x80, 0x9c, 0xe1, - 0x9e, 0xdb, 0xcf, 0x05, 0x0b, 0x76, 0x22, 0x14, 0xf7, 0xb2, 0x3d, 0x07, 0x46, 0xcc, 0x48, 0x41, - 0x94, 0x5c, 0x03, 0x2d, 0xab, 0xc0, 0x8b, 0x50, 0xec, 0x65, 0x2d, 0x20, 0x04, 0xfb, 0x8c, 0x02, - 0x0d, 0x7c, 0xab, 0xb2, 0xef, 0xe1, 0x17, 0xc2, 0xf8, 0x41, 0x69, 0x2d, 0x2a, 0xeb, 0x7d, 0x81, - 0xfb, 0x8d, 0x55, 0x2e, 0x24, 0xe3, 0x6f, 0x36, 0x41, 0x37, 0x3b, 0x6c, 0xf0, 0xc8, 0x50, 0x13, - 0x43, 0x8b, 0xa9, 0xcc, 0x4d, 0xa7, 0xbf, 0x18, 0x06, 0x8c, 0x97, 0x15, 0x27, 0x57, 0xb8, 0xbb, - 0x50, 0xc0, 0x75, 0xe0, 0x45, 0x5e, 0xbc, 0x7f, 0x7d, 0x9a, 0x6c, 0x95, 0x4d, 0x8c, 0x5b, 0xe6, - 0xb6, 0xc8, 0x25, 0x3e, 0x32, 0x52, 0xce, 0xf2, 0x36, 0xbc, 0x6f, 0xc3, 0xf7, 0x1d, 0x1f, 0x37, - 0x15, 0x06, 0xce, 0x96, 0xc2, 0xbc, 0xe6, 0x41, 0xd7, 0xfd, 0x4d, 0x03, 0x86, 0xef, 0x08, 0x9f, - 0xdc, 0x53, 0xa9, 0xa4, 0x28, 0xe8, 0xec, 0x9f, 0x5b, 0xdd, 0x3d, 0x7e, 0xae, 0x43, 0xb4, 0x5a, - 0x87, 0xe8, 0x67, 0x1d, 0xa2, 0x8f, 0x4d, 0xd8, 0x59, 0x6d, 0xc2, 0xce, 0xf7, 0x26, 0xec, 0x3c, - 0xdf, 0x4e, 0x05, 0xbc, 0xce, 0x27, 0x49, 0xa1, 0xca, 0xb4, 0x50, 0x25, 0x87, 0xc9, 0x0b, 0xb4, - 0x0f, 0x7b, 0x1f, 0xe9, 0xd6, 0xf5, 0x4c, 0x76, 0xed, 0xe0, 0xe6, 0x37, 0x00, 0x00, 0xff, 0xff, - 0x58, 0x6b, 0x3b, 0xa5, 0x59, 0x02, 0x00, 0x00, + 0x63, 0x47, 0xf1, 0x6b, 0x45, 0x6f, 0xc1, 0x65, 0xb8, 0x03, 0x62, 0xea, 0xc8, 0x88, 0xda, 0x8b, + 0x20, 0xdb, 0x22, 0x19, 0x7a, 0x02, 0x36, 0xeb, 0x7b, 0xef, 0xd7, 0xff, 0xff, 0xd6, 0xc3, 0xe7, + 0xc0, 0x25, 0xe3, 0x75, 0x29, 0x24, 0xa4, 0xaa, 0xa6, 0xc5, 0x8c, 0xa7, 0xb0, 0xac, 0xb8, 0x4e, + 0xaa, 0x5a, 0x81, 0x22, 0xc7, 0xed, 0x38, 0x71, 0xe3, 0xa1, 0xc6, 0xfe, 0x93, 0x02, 0x4e, 0x06, + 0xb8, 0xb7, 0xa0, 0x33, 0xc1, 0x28, 0xa8, 0x3a, 0x40, 0x11, 0x8a, 0x0f, 0xb2, 0x16, 0x90, 0x33, + 0xdc, 0x73, 0xfb, 0xb9, 0x60, 0xc1, 0x4e, 0x84, 0xe2, 0x5e, 0xb6, 0xe7, 0xc0, 0x88, 0x19, 0x29, + 0x88, 0x92, 0x6b, 0xa0, 0x65, 0x15, 0x78, 0x11, 0x8a, 0xbd, 0xac, 0x05, 0x84, 0x60, 0x9f, 0x51, + 0xa0, 0x81, 0x6f, 0x55, 0xf6, 0x3d, 0xfc, 0x42, 0x18, 0x3f, 0x28, 0xad, 0x45, 0x65, 0xbd, 0x2f, + 0x70, 0xbf, 0xb1, 0xca, 0x85, 0x64, 0xfc, 0xcd, 0x26, 0xe8, 0x66, 0x87, 0x0d, 0x1e, 0x19, 0x6a, + 0x62, 0x68, 0x31, 0x95, 0xb9, 0xe9, 0xf4, 0x17, 0xc3, 0x80, 0xf1, 0xb2, 0xe2, 0xe4, 0x0a, 0x77, + 0x17, 0x0a, 0xb8, 0x0e, 0xbc, 0xc8, 0x8b, 0xf7, 0xaf, 0x4f, 0x93, 0xad, 0xb2, 0x89, 0x71, 0xcb, + 0xdc, 0x16, 0xb9, 0xc4, 0x47, 0x46, 0xca, 0x59, 0xde, 0x86, 0xf7, 0x6d, 0xf8, 0xbe, 0xe3, 0xe3, + 0xa6, 0xc2, 0xc0, 0xd9, 0x52, 0x98, 0xd7, 0x3c, 0xe8, 0xba, 0xbf, 0x69, 0xc0, 0xf0, 0x03, 0xe1, + 0x93, 0x7b, 0x2a, 0x95, 0x14, 0x05, 0x9d, 0xfd, 0x9f, 0x56, 0x77, 0x8f, 0x9f, 0xeb, 0x10, 0xad, + 0xd6, 0x21, 0xfa, 0x59, 0x87, 0xe8, 0x7d, 0x13, 0x76, 0x56, 0x9b, 0xb0, 0xf3, 0xbd, 0x09, 0x3b, + 0xcf, 0xb7, 0x53, 0x01, 0xaf, 0xf3, 0x49, 0x52, 0xa8, 0x32, 0x2d, 0x54, 0xc9, 0x61, 0xf2, 0x02, + 0xed, 0xc3, 0x9e, 0x52, 0xba, 0x75, 0x68, 0x93, 0x5d, 0x3b, 0xb8, 0xf9, 0x0d, 0x00, 0x00, 0xff, + 0xff, 0x21, 0xea, 0x9d, 0x95, 0x84, 0x02, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -389,6 +397,11 @@ func (m *CanonicalGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.SignedTimestamp != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.SignedTimestamp)) + i-- + dAtA[i] = 0x20 + } if len(m.Votes) > 0 { for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { { @@ -501,6 +514,9 @@ func (m *CanonicalGossipVote) Size() (n int) { n += 1 + l + sovTypes(uint64(l)) } } + if m.SignedTimestamp != 0 { + n += 1 + sovTypes(uint64(m.SignedTimestamp)) + } return n } @@ -979,6 +995,25 @@ func (m *CanonicalGossipVote) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SignedTimestamp", wireType) + } + m.SignedTimestamp = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SignedTimestamp |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index 2cff39123c1..ae21cbbb7c6 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -22,4 +22,5 @@ message CanonicalGossipVote { int32 validator_index = 1; string sign_type = 2; repeated Vote votes = 3; + int64 signed_timestamp = 4; } diff --git a/types/oracle.go b/types/oracle.go index 081513cae25..0144af442ca 100644 --- a/types/oracle.go +++ b/types/oracle.go @@ -17,8 +17,9 @@ func OracleVoteSignBytes(vote *oracleproto.GossipVote) []byte { func CanonicalizeOracleVote(vote *oracleproto.GossipVote) oracleproto.CanonicalGossipVote { return oracleproto.CanonicalGossipVote{ - ValidatorIndex: vote.ValidatorIndex, - SignType: vote.SignType, - Votes: vote.Votes, + ValidatorIndex: vote.ValidatorIndex, + SignType: vote.SignType, + Votes: vote.Votes, + SignedTimestamp: vote.SignedTimestamp, } } From 38b81968d7d85b27d351085f8c698157ea87b837 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 26 Apr 2024 15:39:52 +0800 Subject: [PATCH 060/150] test w pub key --- oracle/service/runner/runner.go | 1 + proto/tendermint/oracle/types.pb.go | 98 ++++++++++++++++++++++------- proto/tendermint/oracle/types.proto | 1 + 3 files changed, 78 insertions(+), 22 deletions(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 01ff5c494e2..849a9e347f4 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -60,6 +60,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State SignType: oracleInfo.PubKey.Type(), SignedTimestamp: time.Now().Unix(), Votes: votes, + PublicKey: oracleInfo.PubKey.Bytes(), } address := oracleInfo.PubKey.Address().String() diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index 78fd66ab480..78ceb5adbe7 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -96,6 +96,7 @@ type GossipVote struct { Votes []*Vote `protobuf:"bytes,3,rep,name=votes,proto3" json:"votes,omitempty"` SignedTimestamp int64 `protobuf:"varint,4,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` Signature []byte `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` + PublicKey []byte `protobuf:"bytes,6,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` } func (m *GossipVote) Reset() { *m = GossipVote{} } @@ -166,6 +167,13 @@ func (m *GossipVote) GetSignature() []byte { return nil } +func (m *GossipVote) GetPublicKey() []byte { + if m != nil { + return m.PublicKey + } + return nil +} + type CanonicalGossipVote struct { ValidatorIndex int32 `protobuf:"varint,1,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` SignType string `protobuf:"bytes,2,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` @@ -243,28 +251,29 @@ func init() { func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 329 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x92, 0x31, 0x4e, 0xc3, 0x30, - 0x14, 0x86, 0x6b, 0x92, 0x22, 0x6a, 0x10, 0x05, 0x33, 0x10, 0x89, 0x12, 0x45, 0x5d, 0x08, 0x03, - 0x89, 0x04, 0x9c, 0x00, 0x06, 0xd4, 0x85, 0x21, 0xaa, 0x18, 0x58, 0x22, 0x37, 0x36, 0xc5, 0x52, - 0x63, 0x47, 0xf1, 0x6b, 0x45, 0x6f, 0xc1, 0x65, 0xb8, 0x03, 0x62, 0xea, 0xc8, 0x88, 0xda, 0x8b, - 0x20, 0xdb, 0x22, 0x19, 0x7a, 0x02, 0x36, 0xeb, 0x7b, 0xef, 0xd7, 0xff, 0xff, 0xd6, 0xc3, 0xe7, - 0xc0, 0x25, 0xe3, 0x75, 0x29, 0x24, 0xa4, 0xaa, 0xa6, 0xc5, 0x8c, 0xa7, 0xb0, 0xac, 0xb8, 0x4e, - 0xaa, 0x5a, 0x81, 0x22, 0xc7, 0xed, 0x38, 0x71, 0xe3, 0xa1, 0xc6, 0xfe, 0x93, 0x02, 0x4e, 0x06, - 0xb8, 0xb7, 0xa0, 0x33, 0xc1, 0x28, 0xa8, 0x3a, 0x40, 0x11, 0x8a, 0x0f, 0xb2, 0x16, 0x90, 0x33, - 0xdc, 0x73, 0xfb, 0xb9, 0x60, 0xc1, 0x4e, 0x84, 0xe2, 0x5e, 0xb6, 0xe7, 0xc0, 0x88, 0x19, 0x29, - 0x88, 0x92, 0x6b, 0xa0, 0x65, 0x15, 0x78, 0x11, 0x8a, 0xbd, 0xac, 0x05, 0x84, 0x60, 0x9f, 0x51, - 0xa0, 0x81, 0x6f, 0x55, 0xf6, 0x3d, 0xfc, 0x42, 0x18, 0x3f, 0x28, 0xad, 0x45, 0x65, 0xbd, 0x2f, - 0x70, 0xbf, 0xb1, 0xca, 0x85, 0x64, 0xfc, 0xcd, 0x26, 0xe8, 0x66, 0x87, 0x0d, 0x1e, 0x19, 0x6a, - 0x62, 0x68, 0x31, 0x95, 0xb9, 0xe9, 0xf4, 0x17, 0xc3, 0x80, 0xf1, 0xb2, 0xe2, 0xe4, 0x0a, 0x77, - 0x17, 0x0a, 0xb8, 0x0e, 0xbc, 0xc8, 0x8b, 0xf7, 0xaf, 0x4f, 0x93, 0xad, 0xb2, 0x89, 0x71, 0xcb, - 0xdc, 0x16, 0xb9, 0xc4, 0x47, 0x46, 0xca, 0x59, 0xde, 0x86, 0xf7, 0x6d, 0xf8, 0xbe, 0xe3, 0xe3, - 0xa6, 0xc2, 0xc0, 0xd9, 0x52, 0x98, 0xd7, 0x3c, 0xe8, 0xba, 0xbf, 0x69, 0xc0, 0xf0, 0x03, 0xe1, - 0x93, 0x7b, 0x2a, 0x95, 0x14, 0x05, 0x9d, 0xfd, 0x9f, 0x56, 0x77, 0x8f, 0x9f, 0xeb, 0x10, 0xad, - 0xd6, 0x21, 0xfa, 0x59, 0x87, 0xe8, 0x7d, 0x13, 0x76, 0x56, 0x9b, 0xb0, 0xf3, 0xbd, 0x09, 0x3b, - 0xcf, 0xb7, 0x53, 0x01, 0xaf, 0xf3, 0x49, 0x52, 0xa8, 0x32, 0x2d, 0x54, 0xc9, 0x61, 0xf2, 0x02, - 0xed, 0xc3, 0x9e, 0x52, 0xba, 0x75, 0x68, 0x93, 0x5d, 0x3b, 0xb8, 0xf9, 0x0d, 0x00, 0x00, 0xff, - 0xff, 0x21, 0xea, 0x9d, 0x95, 0x84, 0x02, 0x00, 0x00, + // 351 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x92, 0xc1, 0x4a, 0xeb, 0x40, + 0x14, 0x86, 0x3b, 0x37, 0x69, 0xb9, 0x9d, 0x7b, 0xb1, 0x3a, 0x2e, 0x0c, 0xd8, 0x86, 0xd0, 0x8d, + 0x71, 0x61, 0x02, 0xea, 0x13, 0xe8, 0x42, 0x8a, 0xe0, 0x22, 0x14, 0x17, 0x6e, 0xc2, 0x24, 0x39, + 0xd6, 0xc1, 0x24, 0x13, 0x92, 0xd3, 0x62, 0xde, 0xc2, 0x97, 0xf1, 0x1d, 0x5c, 0x76, 0xe9, 0x52, + 0xda, 0x95, 0x6f, 0x21, 0x99, 0xc1, 0x64, 0xd1, 0x27, 0x70, 0x37, 0x7c, 0xff, 0x39, 0xfc, 0xff, + 0x3f, 0x1c, 0x3a, 0x41, 0xc8, 0x13, 0x28, 0x33, 0x91, 0xa3, 0x2f, 0x4b, 0x1e, 0xa7, 0xe0, 0x63, + 0x5d, 0x40, 0xe5, 0x15, 0xa5, 0x44, 0xc9, 0x0e, 0x3a, 0xd9, 0xd3, 0xf2, 0xb4, 0xa2, 0xe6, 0xbd, + 0x44, 0x60, 0x63, 0x3a, 0x5c, 0xf1, 0x54, 0x24, 0x1c, 0x65, 0x69, 0x11, 0x87, 0xb8, 0xff, 0x83, + 0x0e, 0xb0, 0x63, 0x3a, 0xd4, 0xf3, 0xa1, 0x48, 0xac, 0x3f, 0x0e, 0x71, 0x87, 0xc1, 0x5f, 0x0d, + 0x66, 0x49, 0xb3, 0x8a, 0x22, 0x83, 0x0a, 0x79, 0x56, 0x58, 0x86, 0x43, 0x5c, 0x23, 0xe8, 0x00, + 0x63, 0xd4, 0x4c, 0x38, 0x72, 0xcb, 0x54, 0x5b, 0xea, 0x3d, 0xfd, 0x22, 0x94, 0xde, 0xc8, 0xaa, + 0x12, 0x85, 0xf2, 0x3e, 0xa1, 0xa3, 0xd6, 0x2a, 0x14, 0x79, 0x02, 0x2f, 0x2a, 0x41, 0x3f, 0xd8, + 0x6b, 0xf1, 0xac, 0xa1, 0x4d, 0x8c, 0x4a, 0x2c, 0xf2, 0xb0, 0xe9, 0xf4, 0x13, 0xa3, 0x01, 0xf3, + 0xba, 0x00, 0x76, 0x46, 0xfb, 0x2b, 0x89, 0x50, 0x59, 0x86, 0x63, 0xb8, 0xff, 0xce, 0x8f, 0xbc, + 0x9d, 0xb2, 0x5e, 0xe3, 0x16, 0xe8, 0x29, 0x76, 0x4a, 0xf7, 0x9b, 0x55, 0x48, 0xc2, 0x2e, 0xbc, + 0xa9, 0xc2, 0x8f, 0x34, 0x9f, 0xb7, 0x15, 0xc6, 0xda, 0x96, 0xe3, 0xb2, 0x04, 0xab, 0xaf, 0xff, + 0xa6, 0x05, 0x6c, 0x42, 0x69, 0xb1, 0x8c, 0x52, 0x11, 0x87, 0xcf, 0x50, 0x5b, 0x03, 0x2d, 0x6b, + 0x72, 0x0b, 0xf5, 0xf4, 0x8d, 0xd0, 0xc3, 0x6b, 0x9e, 0xcb, 0x5c, 0xc4, 0x3c, 0xfd, 0x3d, 0xa5, + 0xaf, 0xee, 0xde, 0x37, 0x36, 0x59, 0x6f, 0x6c, 0xf2, 0xb9, 0xb1, 0xc9, 0xeb, 0xd6, 0xee, 0xad, + 0xb7, 0x76, 0xef, 0x63, 0x6b, 0xf7, 0x1e, 0x2e, 0x17, 0x02, 0x9f, 0x96, 0x91, 0x17, 0xcb, 0xcc, + 0x8f, 0x65, 0x06, 0x18, 0x3d, 0x62, 0xf7, 0x50, 0x97, 0xe6, 0xef, 0xdc, 0x61, 0x34, 0x50, 0xc2, + 0xc5, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfb, 0x98, 0xf5, 0x60, 0xa3, 0x02, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -336,6 +345,13 @@ func (m *GossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.PublicKey) > 0 { + i -= len(m.PublicKey) + copy(dAtA[i:], m.PublicKey) + i = encodeVarintTypes(dAtA, i, uint64(len(m.PublicKey))) + i-- + dAtA[i] = 0x32 + } if len(m.Signature) > 0 { i -= len(m.Signature) copy(dAtA[i:], m.Signature) @@ -492,6 +508,10 @@ func (m *GossipVote) Size() (n int) { if l > 0 { n += 1 + l + sovTypes(uint64(l)) } + l = len(m.PublicKey) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } return n } @@ -860,6 +880,40 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { m.Signature = []byte{} } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PublicKey", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PublicKey = append(m.PublicKey[:0], dAtA[iNdEx:postIndex]...) + if m.PublicKey == nil { + m.PublicKey = []byte{} + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index ae21cbbb7c6..3a550afbe12 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -16,6 +16,7 @@ message GossipVote { repeated Vote votes = 3; int64 signed_timestamp = 4; bytes signature = 5; + bytes public_key = 6; } message CanonicalGossipVote { From 80687bdd8369b943569b49c9a129b55def19ceb2 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 26 Apr 2024 15:49:15 +0800 Subject: [PATCH 061/150] Revert "test w pub key" This reverts commit 38b81968d7d85b27d351085f8c698157ea87b837. --- oracle/service/runner/runner.go | 1 - proto/tendermint/oracle/types.pb.go | 98 +++++++---------------------- proto/tendermint/oracle/types.proto | 1 - 3 files changed, 22 insertions(+), 78 deletions(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 849a9e347f4..01ff5c494e2 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -60,7 +60,6 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State SignType: oracleInfo.PubKey.Type(), SignedTimestamp: time.Now().Unix(), Votes: votes, - PublicKey: oracleInfo.PubKey.Bytes(), } address := oracleInfo.PubKey.Address().String() diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index 78ceb5adbe7..78fd66ab480 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -96,7 +96,6 @@ type GossipVote struct { Votes []*Vote `protobuf:"bytes,3,rep,name=votes,proto3" json:"votes,omitempty"` SignedTimestamp int64 `protobuf:"varint,4,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` Signature []byte `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` - PublicKey []byte `protobuf:"bytes,6,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` } func (m *GossipVote) Reset() { *m = GossipVote{} } @@ -167,13 +166,6 @@ func (m *GossipVote) GetSignature() []byte { return nil } -func (m *GossipVote) GetPublicKey() []byte { - if m != nil { - return m.PublicKey - } - return nil -} - type CanonicalGossipVote struct { ValidatorIndex int32 `protobuf:"varint,1,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` SignType string `protobuf:"bytes,2,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` @@ -251,29 +243,28 @@ func init() { func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 351 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x92, 0xc1, 0x4a, 0xeb, 0x40, - 0x14, 0x86, 0x3b, 0x37, 0x69, 0xb9, 0x9d, 0x7b, 0xb1, 0x3a, 0x2e, 0x0c, 0xd8, 0x86, 0xd0, 0x8d, - 0x71, 0x61, 0x02, 0xea, 0x13, 0xe8, 0x42, 0x8a, 0xe0, 0x22, 0x14, 0x17, 0x6e, 0xc2, 0x24, 0x39, - 0xd6, 0xc1, 0x24, 0x13, 0x92, 0xd3, 0x62, 0xde, 0xc2, 0x97, 0xf1, 0x1d, 0x5c, 0x76, 0xe9, 0x52, - 0xda, 0x95, 0x6f, 0x21, 0x99, 0xc1, 0x64, 0xd1, 0x27, 0x70, 0x37, 0x7c, 0xff, 0x39, 0xfc, 0xff, - 0x3f, 0x1c, 0x3a, 0x41, 0xc8, 0x13, 0x28, 0x33, 0x91, 0xa3, 0x2f, 0x4b, 0x1e, 0xa7, 0xe0, 0x63, - 0x5d, 0x40, 0xe5, 0x15, 0xa5, 0x44, 0xc9, 0x0e, 0x3a, 0xd9, 0xd3, 0xf2, 0xb4, 0xa2, 0xe6, 0xbd, - 0x44, 0x60, 0x63, 0x3a, 0x5c, 0xf1, 0x54, 0x24, 0x1c, 0x65, 0x69, 0x11, 0x87, 0xb8, 0xff, 0x83, - 0x0e, 0xb0, 0x63, 0x3a, 0xd4, 0xf3, 0xa1, 0x48, 0xac, 0x3f, 0x0e, 0x71, 0x87, 0xc1, 0x5f, 0x0d, - 0x66, 0x49, 0xb3, 0x8a, 0x22, 0x83, 0x0a, 0x79, 0x56, 0x58, 0x86, 0x43, 0x5c, 0x23, 0xe8, 0x00, - 0x63, 0xd4, 0x4c, 0x38, 0x72, 0xcb, 0x54, 0x5b, 0xea, 0x3d, 0xfd, 0x22, 0x94, 0xde, 0xc8, 0xaa, - 0x12, 0x85, 0xf2, 0x3e, 0xa1, 0xa3, 0xd6, 0x2a, 0x14, 0x79, 0x02, 0x2f, 0x2a, 0x41, 0x3f, 0xd8, - 0x6b, 0xf1, 0xac, 0xa1, 0x4d, 0x8c, 0x4a, 0x2c, 0xf2, 0xb0, 0xe9, 0xf4, 0x13, 0xa3, 0x01, 0xf3, - 0xba, 0x00, 0x76, 0x46, 0xfb, 0x2b, 0x89, 0x50, 0x59, 0x86, 0x63, 0xb8, 0xff, 0xce, 0x8f, 0xbc, - 0x9d, 0xb2, 0x5e, 0xe3, 0x16, 0xe8, 0x29, 0x76, 0x4a, 0xf7, 0x9b, 0x55, 0x48, 0xc2, 0x2e, 0xbc, - 0xa9, 0xc2, 0x8f, 0x34, 0x9f, 0xb7, 0x15, 0xc6, 0xda, 0x96, 0xe3, 0xb2, 0x04, 0xab, 0xaf, 0xff, - 0xa6, 0x05, 0x6c, 0x42, 0x69, 0xb1, 0x8c, 0x52, 0x11, 0x87, 0xcf, 0x50, 0x5b, 0x03, 0x2d, 0x6b, - 0x72, 0x0b, 0xf5, 0xf4, 0x8d, 0xd0, 0xc3, 0x6b, 0x9e, 0xcb, 0x5c, 0xc4, 0x3c, 0xfd, 0x3d, 0xa5, - 0xaf, 0xee, 0xde, 0x37, 0x36, 0x59, 0x6f, 0x6c, 0xf2, 0xb9, 0xb1, 0xc9, 0xeb, 0xd6, 0xee, 0xad, - 0xb7, 0x76, 0xef, 0x63, 0x6b, 0xf7, 0x1e, 0x2e, 0x17, 0x02, 0x9f, 0x96, 0x91, 0x17, 0xcb, 0xcc, - 0x8f, 0x65, 0x06, 0x18, 0x3d, 0x62, 0xf7, 0x50, 0x97, 0xe6, 0xef, 0xdc, 0x61, 0x34, 0x50, 0xc2, - 0xc5, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfb, 0x98, 0xf5, 0x60, 0xa3, 0x02, 0x00, 0x00, + // 329 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x92, 0x31, 0x4e, 0xc3, 0x30, + 0x14, 0x86, 0x6b, 0x92, 0x22, 0x6a, 0x10, 0x05, 0x33, 0x10, 0x89, 0x12, 0x45, 0x5d, 0x08, 0x03, + 0x89, 0x04, 0x9c, 0x00, 0x06, 0xd4, 0x85, 0x21, 0xaa, 0x18, 0x58, 0x22, 0x37, 0x36, 0xc5, 0x52, + 0x63, 0x47, 0xf1, 0x6b, 0x45, 0x6f, 0xc1, 0x65, 0xb8, 0x03, 0x62, 0xea, 0xc8, 0x88, 0xda, 0x8b, + 0x20, 0xdb, 0x22, 0x19, 0x7a, 0x02, 0x36, 0xeb, 0x7b, 0xef, 0xd7, 0xff, 0xff, 0xd6, 0xc3, 0xe7, + 0xc0, 0x25, 0xe3, 0x75, 0x29, 0x24, 0xa4, 0xaa, 0xa6, 0xc5, 0x8c, 0xa7, 0xb0, 0xac, 0xb8, 0x4e, + 0xaa, 0x5a, 0x81, 0x22, 0xc7, 0xed, 0x38, 0x71, 0xe3, 0xa1, 0xc6, 0xfe, 0x93, 0x02, 0x4e, 0x06, + 0xb8, 0xb7, 0xa0, 0x33, 0xc1, 0x28, 0xa8, 0x3a, 0x40, 0x11, 0x8a, 0x0f, 0xb2, 0x16, 0x90, 0x33, + 0xdc, 0x73, 0xfb, 0xb9, 0x60, 0xc1, 0x4e, 0x84, 0xe2, 0x5e, 0xb6, 0xe7, 0xc0, 0x88, 0x19, 0x29, + 0x88, 0x92, 0x6b, 0xa0, 0x65, 0x15, 0x78, 0x11, 0x8a, 0xbd, 0xac, 0x05, 0x84, 0x60, 0x9f, 0x51, + 0xa0, 0x81, 0x6f, 0x55, 0xf6, 0x3d, 0xfc, 0x42, 0x18, 0x3f, 0x28, 0xad, 0x45, 0x65, 0xbd, 0x2f, + 0x70, 0xbf, 0xb1, 0xca, 0x85, 0x64, 0xfc, 0xcd, 0x26, 0xe8, 0x66, 0x87, 0x0d, 0x1e, 0x19, 0x6a, + 0x62, 0x68, 0x31, 0x95, 0xb9, 0xe9, 0xf4, 0x17, 0xc3, 0x80, 0xf1, 0xb2, 0xe2, 0xe4, 0x0a, 0x77, + 0x17, 0x0a, 0xb8, 0x0e, 0xbc, 0xc8, 0x8b, 0xf7, 0xaf, 0x4f, 0x93, 0xad, 0xb2, 0x89, 0x71, 0xcb, + 0xdc, 0x16, 0xb9, 0xc4, 0x47, 0x46, 0xca, 0x59, 0xde, 0x86, 0xf7, 0x6d, 0xf8, 0xbe, 0xe3, 0xe3, + 0xa6, 0xc2, 0xc0, 0xd9, 0x52, 0x98, 0xd7, 0x3c, 0xe8, 0xba, 0xbf, 0x69, 0xc0, 0xf0, 0x03, 0xe1, + 0x93, 0x7b, 0x2a, 0x95, 0x14, 0x05, 0x9d, 0xfd, 0x9f, 0x56, 0x77, 0x8f, 0x9f, 0xeb, 0x10, 0xad, + 0xd6, 0x21, 0xfa, 0x59, 0x87, 0xe8, 0x7d, 0x13, 0x76, 0x56, 0x9b, 0xb0, 0xf3, 0xbd, 0x09, 0x3b, + 0xcf, 0xb7, 0x53, 0x01, 0xaf, 0xf3, 0x49, 0x52, 0xa8, 0x32, 0x2d, 0x54, 0xc9, 0x61, 0xf2, 0x02, + 0xed, 0xc3, 0x9e, 0x52, 0xba, 0x75, 0x68, 0x93, 0x5d, 0x3b, 0xb8, 0xf9, 0x0d, 0x00, 0x00, 0xff, + 0xff, 0x21, 0xea, 0x9d, 0x95, 0x84, 0x02, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -345,13 +336,6 @@ func (m *GossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.PublicKey) > 0 { - i -= len(m.PublicKey) - copy(dAtA[i:], m.PublicKey) - i = encodeVarintTypes(dAtA, i, uint64(len(m.PublicKey))) - i-- - dAtA[i] = 0x32 - } if len(m.Signature) > 0 { i -= len(m.Signature) copy(dAtA[i:], m.Signature) @@ -508,10 +492,6 @@ func (m *GossipVote) Size() (n int) { if l > 0 { n += 1 + l + sovTypes(uint64(l)) } - l = len(m.PublicKey) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } return n } @@ -880,40 +860,6 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { m.Signature = []byte{} } iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PublicKey", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PublicKey = append(m.PublicKey[:0], dAtA[iNdEx:postIndex]...) - if m.PublicKey == nil { - m.PublicKey = []byte{} - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index 3a550afbe12..ae21cbbb7c6 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -16,7 +16,6 @@ message GossipVote { repeated Vote votes = 3; int64 signed_timestamp = 4; bytes signature = 5; - bytes public_key = 6; } message CanonicalGossipVote { From a5026bc30c987cbe08a620cf6d1a4f7976877280 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 29 Apr 2024 11:50:24 +0800 Subject: [PATCH 062/150] add back unsigned buffer --- oracle/reactor.go | 18 ++++--- oracle/service/runner/runner.go | 86 +++++++++++++++++++-------------- oracle/service/types/info.go | 22 ++++++--- 3 files changed, 76 insertions(+), 50 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index fb1ccf11758..a8ed0dc3222 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -51,15 +51,19 @@ func NewReactor(config *config.OracleConfig, pubKey crypto.PubKey, privValidator gossipVoteBuffer := &oracletypes.GossipVoteBuffer{ Buffer: make(map[string]*oracleproto.GossipVote), } + unsignedVoteBuffer := &oracletypes.UnsignedVoteBuffer{ + Buffer: []*oracleproto.Vote{}, + } oracleInfo := &oracletypes.OracleInfo{ - Config: config, - GossipVoteBuffer: gossipVoteBuffer, - SignVotesChan: make(chan *oracleproto.Vote), - PubKey: pubKey, - PrivValidator: privValidator, - ProxyApp: proxyApp, - BlockTimestamps: make([]int64, 0), + Config: config, + UnsignedVoteBuffer: unsignedVoteBuffer, + GossipVoteBuffer: gossipVoteBuffer, + SignVotesChan: make(chan *oracleproto.Vote), + PubKey: pubKey, + PrivValidator: privValidator, + ProxyApp: proxyApp, + BlockTimestamps: make([]int64, 0), } oracleR := &Reactor{ diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 01ff5c494e2..0a011251239 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -2,7 +2,6 @@ package runner import ( "context" - "sync" "time" log "github.com/sirupsen/logrus" @@ -55,20 +54,27 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State return } + // append new batch into unsignedVotesBuffer, need to mutex lock as it will clash with concurrent pruning + oracleInfo.UnsignedVoteBuffer.UpdateMtx.Lock() + oracleInfo.UnsignedVoteBuffer.Buffer = append(oracleInfo.UnsignedVoteBuffer.Buffer, votes...) + + // batch sign the entire unsignedVoteBuffer and add to gossipBuffer newGossipVote := &oracleproto.GossipVote{ ValidatorIndex: validatorIndex, SignType: oracleInfo.PubKey.Type(), SignedTimestamp: time.Now().Unix(), - Votes: votes, + Votes: oracleInfo.UnsignedVoteBuffer.Buffer, } + oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() + address := oracleInfo.PubKey.Address().String() // need to mutex lock as it will clash with concurrent gossip oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() currentGossipVote, ok := oracleInfo.GossipVoteBuffer.Buffer[address] if ok { // append existing entry in gossipVoteBuffer - newGossipVote.Votes = append(currentGossipVote.Votes, newGossipVote.Votes...) + newGossipVote.Votes = append(newGossipVote.Votes, currentGossipVote.Votes...) } // signing of vote should append the signature field of gossipVote @@ -79,22 +85,11 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State return } - log.Infof("THIS IS MY COMET PUB KEY: %v", oracleInfo.PubKey) - oracleInfo.GossipVoteBuffer.Buffer[address] = newGossipVote oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() } -func contains(s []int64, e int64) bool { - for _, a := range s { - if a == e { - return true - } - } - return false -} - -func PruneGossipVoteBuffer(oracleInfo *types.OracleInfo, consensusState *cs.State) { +func PruneUnsignedVoteBuffer(oracleInfo *types.OracleInfo, consensusState *cs.State) { go func(oracleInfo *types.OracleInfo) { maxGossipVoteAge := oracleInfo.Config.MaxGossipVoteAge if maxGossipVoteAge == 0 { @@ -118,29 +113,49 @@ func PruneGossipVoteBuffer(oracleInfo *types.OracleInfo, consensusState *cs.Stat oracleInfo.BlockTimestamps = oracleInfo.BlockTimestamps[1:] } + oracleInfo.UnsignedVoteBuffer.UpdateMtx.Lock() + // prune votes that are older than the maxGossipVoteAge (in terms of block height) + newVotes := []*oracleproto.Vote{} + unsignedVoteBuffer := oracleInfo.UnsignedVoteBuffer.Buffer + for _, vote := range unsignedVoteBuffer { + if vote.Timestamp >= oracleInfo.BlockTimestamps[0] { + newVotes = append(newVotes, vote) + } else { + log.Infof("deleting vote timestamp: %v, block timestamp: %v", vote.Timestamp, oracleInfo.BlockTimestamps[0]) + } + } + oracleInfo.UnsignedVoteBuffer.Buffer = newVotes + oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() + } + }(oracleInfo) +} + +func contains(s []int64, e int64) bool { + for _, a := range s { + if a == e { + return true + } + } + return false +} + +func PruneGossipVoteBuffer(oracleInfo *types.OracleInfo) { + go func(oracleInfo *types.OracleInfo) { + interval := 60 * time.Second + ticker := time.Tick(interval) + for range ticker { oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() - var verifyWg sync.WaitGroup + currTime := time.Now().Unix() + buffer := oracleInfo.GossipVoteBuffer.Buffer - // prune votes that are older than the maxGossipVoteAge (in terms of block height) + // prune gossip vote that have signed timestamps older than 60 secs for valAddr, gossipVote := range oracleInfo.GossipVoteBuffer.Buffer { - verifyWg.Add(1) - go func(valAddr string, gossipVote *oracleproto.GossipVote) { - defer verifyWg.Done() - - newVotes := []*oracleproto.Vote{} - for _, vote := range gossipVote.Votes { - if vote.Timestamp >= oracleInfo.BlockTimestamps[0] { - newVotes = append(newVotes, vote) - } else { - log.Infof("deleting vote: %v, from val addr buffer: %v", vote, valAddr) - } - } - gossipVote.Votes = newVotes - oracleInfo.GossipVoteBuffer.Buffer[valAddr] = gossipVote - }(valAddr, gossipVote) + if gossipVote.SignedTimestamp < currTime-int64(interval.Seconds()) { + log.Infof("DELETING STALE GOSSIP BUFFER (%v) FOR VAL: %s", gossipVote.SignedTimestamp, valAddr) + delete(buffer, valAddr) + } } - - verifyWg.Wait() + oracleInfo.GossipVoteBuffer.Buffer = buffer oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() } }(oracleInfo) @@ -150,7 +165,8 @@ func PruneGossipVoteBuffer(oracleInfo *types.OracleInfo, consensusState *cs.Stat func Run(oracleInfo *types.OracleInfo, consensusState *cs.State) { log.Info("[oracle] Service started.") RunProcessSignVoteQueue(oracleInfo, consensusState) - PruneGossipVoteBuffer(oracleInfo, consensusState) + PruneUnsignedVoteBuffer(oracleInfo, consensusState) + PruneGossipVoteBuffer(oracleInfo) // start to take votes from app for { res, err := oracleInfo.ProxyApp.PrepareOracleVotes(context.Background(), &abcitypes.RequestPrepareOracleVotes{}) diff --git a/oracle/service/types/info.go b/oracle/service/types/info.go index ebc5fa606a2..88c8a9a4b68 100644 --- a/oracle/service/types/info.go +++ b/oracle/service/types/info.go @@ -11,16 +11,22 @@ import ( // App struct for app type OracleInfo struct { - Config *config.OracleConfig - GossipVoteBuffer *GossipVoteBuffer - SignVotesChan chan *oracleproto.Vote - PubKey crypto.PubKey - PrivValidator types.PrivValidator - StopChannel chan int - ProxyApp proxy.AppConnConsensus - BlockTimestamps []int64 + Config *config.OracleConfig + UnsignedVoteBuffer *UnsignedVoteBuffer + GossipVoteBuffer *GossipVoteBuffer + SignVotesChan chan *oracleproto.Vote + PubKey crypto.PubKey + PrivValidator types.PrivValidator + StopChannel chan int + ProxyApp proxy.AppConnConsensus + BlockTimestamps []int64 } type GossipVoteBuffer struct { Buffer map[string]*oracleproto.GossipVote UpdateMtx cmtsync.RWMutex } + +type UnsignedVoteBuffer struct { + Buffer []*oracleproto.Vote + UpdateMtx cmtsync.RWMutex +} From 3d218ff704615a7ad188c267b11946fe68e9620c Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 29 Apr 2024 11:57:42 +0800 Subject: [PATCH 063/150] remove signType from gossipVote --- oracle/reactor.go | 24 +--- oracle/service/runner/runner.go | 1 - proto/tendermint/oracle/types.pb.go | 171 ++++++---------------------- proto/tendermint/oracle/types.proto | 12 +- types/oracle.go | 1 - 5 files changed, 43 insertions(+), 166 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index a8ed0dc3222..6d62032f196 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -139,29 +139,13 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { switch msg := e.Message.(type) { case *oracleproto.GossipVote: // verify sig of incoming gossip vote, throw if verification fails - signType := msg.SignType _, val := oracleR.ConsensusState.Validators.GetByIndex(msg.ValidatorIndex) pubKey := val.PubKey - switch signType { - case "ed25519": - if success := pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature); !success { - oracleR.Logger.Error("failed signature verification", msg) - logrus.Info("FAILED SIGNATURE VERIFICATION!!!!!!!!!!!!!!") - oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("oracle failed ed25519 signature verification: %T", e.Message)) - return - } - case "sr25519": - if success := pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature); !success { - oracleR.Logger.Error("failed signature verification", msg) - logrus.Info("FAILED SIGNATURE VERIFICATION!!!!!!!!!!!!!!") - oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("oracle failed sr25519 signature verification: %T", e.Message)) - return - } - default: - logrus.Error("SIGNATURE NOT SUPPORTED NOOOOOOOOO") - oracleR.Logger.Error("signature type not supported", msg) - oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("oracle does not support the following signature type: %T", e.Message)) + if success := pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature); !success { + oracleR.Logger.Error("failed signature verification", msg) + logrus.Info("FAILED SIGNATURE VERIFICATION!!!!!!!!!!!!!!") + oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("oracle failed signature verification: %T", e.Message)) return } diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 0a011251239..452384bd91c 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -61,7 +61,6 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State // batch sign the entire unsignedVoteBuffer and add to gossipBuffer newGossipVote := &oracleproto.GossipVote{ ValidatorIndex: validatorIndex, - SignType: oracleInfo.PubKey.Type(), SignedTimestamp: time.Now().Unix(), Votes: oracleInfo.UnsignedVoteBuffer.Buffer, } diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index 78fd66ab480..75efa3b427d 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -92,10 +92,9 @@ func (m *Vote) GetData() string { type GossipVote struct { ValidatorIndex int32 `protobuf:"varint,1,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` - SignType string `protobuf:"bytes,2,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` - Votes []*Vote `protobuf:"bytes,3,rep,name=votes,proto3" json:"votes,omitempty"` - SignedTimestamp int64 `protobuf:"varint,4,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` - Signature []byte `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` + Votes []*Vote `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes,omitempty"` + SignedTimestamp int64 `protobuf:"varint,3,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` + Signature []byte `protobuf:"bytes,4,opt,name=signature,proto3" json:"signature,omitempty"` } func (m *GossipVote) Reset() { *m = GossipVote{} } @@ -138,13 +137,6 @@ func (m *GossipVote) GetValidatorIndex() int32 { return 0 } -func (m *GossipVote) GetSignType() string { - if m != nil { - return m.SignType - } - return "" -} - func (m *GossipVote) GetVotes() []*Vote { if m != nil { return m.Votes @@ -168,9 +160,8 @@ func (m *GossipVote) GetSignature() []byte { type CanonicalGossipVote struct { ValidatorIndex int32 `protobuf:"varint,1,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` - SignType string `protobuf:"bytes,2,opt,name=sign_type,json=signType,proto3" json:"sign_type,omitempty"` - Votes []*Vote `protobuf:"bytes,3,rep,name=votes,proto3" json:"votes,omitempty"` - SignedTimestamp int64 `protobuf:"varint,4,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` + Votes []*Vote `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes,omitempty"` + SignedTimestamp int64 `protobuf:"varint,3,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` } func (m *CanonicalGossipVote) Reset() { *m = CanonicalGossipVote{} } @@ -213,13 +204,6 @@ func (m *CanonicalGossipVote) GetValidatorIndex() int32 { return 0 } -func (m *CanonicalGossipVote) GetSignType() string { - if m != nil { - return m.SignType - } - return "" -} - func (m *CanonicalGossipVote) GetVotes() []*Vote { if m != nil { return m.Votes @@ -243,28 +227,27 @@ func init() { func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 329 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x92, 0x31, 0x4e, 0xc3, 0x30, - 0x14, 0x86, 0x6b, 0x92, 0x22, 0x6a, 0x10, 0x05, 0x33, 0x10, 0x89, 0x12, 0x45, 0x5d, 0x08, 0x03, - 0x89, 0x04, 0x9c, 0x00, 0x06, 0xd4, 0x85, 0x21, 0xaa, 0x18, 0x58, 0x22, 0x37, 0x36, 0xc5, 0x52, - 0x63, 0x47, 0xf1, 0x6b, 0x45, 0x6f, 0xc1, 0x65, 0xb8, 0x03, 0x62, 0xea, 0xc8, 0x88, 0xda, 0x8b, - 0x20, 0xdb, 0x22, 0x19, 0x7a, 0x02, 0x36, 0xeb, 0x7b, 0xef, 0xd7, 0xff, 0xff, 0xd6, 0xc3, 0xe7, - 0xc0, 0x25, 0xe3, 0x75, 0x29, 0x24, 0xa4, 0xaa, 0xa6, 0xc5, 0x8c, 0xa7, 0xb0, 0xac, 0xb8, 0x4e, - 0xaa, 0x5a, 0x81, 0x22, 0xc7, 0xed, 0x38, 0x71, 0xe3, 0xa1, 0xc6, 0xfe, 0x93, 0x02, 0x4e, 0x06, - 0xb8, 0xb7, 0xa0, 0x33, 0xc1, 0x28, 0xa8, 0x3a, 0x40, 0x11, 0x8a, 0x0f, 0xb2, 0x16, 0x90, 0x33, - 0xdc, 0x73, 0xfb, 0xb9, 0x60, 0xc1, 0x4e, 0x84, 0xe2, 0x5e, 0xb6, 0xe7, 0xc0, 0x88, 0x19, 0x29, - 0x88, 0x92, 0x6b, 0xa0, 0x65, 0x15, 0x78, 0x11, 0x8a, 0xbd, 0xac, 0x05, 0x84, 0x60, 0x9f, 0x51, - 0xa0, 0x81, 0x6f, 0x55, 0xf6, 0x3d, 0xfc, 0x42, 0x18, 0x3f, 0x28, 0xad, 0x45, 0x65, 0xbd, 0x2f, - 0x70, 0xbf, 0xb1, 0xca, 0x85, 0x64, 0xfc, 0xcd, 0x26, 0xe8, 0x66, 0x87, 0x0d, 0x1e, 0x19, 0x6a, - 0x62, 0x68, 0x31, 0x95, 0xb9, 0xe9, 0xf4, 0x17, 0xc3, 0x80, 0xf1, 0xb2, 0xe2, 0xe4, 0x0a, 0x77, - 0x17, 0x0a, 0xb8, 0x0e, 0xbc, 0xc8, 0x8b, 0xf7, 0xaf, 0x4f, 0x93, 0xad, 0xb2, 0x89, 0x71, 0xcb, - 0xdc, 0x16, 0xb9, 0xc4, 0x47, 0x46, 0xca, 0x59, 0xde, 0x86, 0xf7, 0x6d, 0xf8, 0xbe, 0xe3, 0xe3, - 0xa6, 0xc2, 0xc0, 0xd9, 0x52, 0x98, 0xd7, 0x3c, 0xe8, 0xba, 0xbf, 0x69, 0xc0, 0xf0, 0x03, 0xe1, - 0x93, 0x7b, 0x2a, 0x95, 0x14, 0x05, 0x9d, 0xfd, 0x9f, 0x56, 0x77, 0x8f, 0x9f, 0xeb, 0x10, 0xad, - 0xd6, 0x21, 0xfa, 0x59, 0x87, 0xe8, 0x7d, 0x13, 0x76, 0x56, 0x9b, 0xb0, 0xf3, 0xbd, 0x09, 0x3b, - 0xcf, 0xb7, 0x53, 0x01, 0xaf, 0xf3, 0x49, 0x52, 0xa8, 0x32, 0x2d, 0x54, 0xc9, 0x61, 0xf2, 0x02, - 0xed, 0xc3, 0x9e, 0x52, 0xba, 0x75, 0x68, 0x93, 0x5d, 0x3b, 0xb8, 0xf9, 0x0d, 0x00, 0x00, 0xff, - 0xff, 0x21, 0xea, 0x9d, 0x95, 0x84, 0x02, 0x00, 0x00, + // 316 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x92, 0xbf, 0x4e, 0xc3, 0x30, + 0x10, 0x87, 0xeb, 0xfe, 0x41, 0xe4, 0xa8, 0x28, 0x98, 0x81, 0x48, 0x94, 0x28, 0xea, 0x42, 0x18, + 0x48, 0x24, 0xe0, 0x09, 0x60, 0x40, 0x5d, 0x18, 0x2c, 0xc4, 0xc0, 0x52, 0xb9, 0xb1, 0x29, 0x96, + 0x1a, 0x3b, 0x8a, 0xaf, 0x15, 0xbc, 0x05, 0x23, 0x2f, 0xc1, 0x7b, 0x30, 0x76, 0x64, 0x44, 0xed, + 0x8b, 0xa0, 0x38, 0x52, 0x22, 0xd1, 0x17, 0x60, 0x3b, 0x7d, 0xbf, 0x3b, 0xdf, 0x67, 0xe9, 0xe0, + 0x14, 0xa5, 0x16, 0xb2, 0xc8, 0x94, 0xc6, 0xc4, 0x14, 0x3c, 0x9d, 0xcb, 0x04, 0xdf, 0x72, 0x69, + 0xe3, 0xbc, 0x30, 0x68, 0xe8, 0x61, 0x13, 0xc7, 0x55, 0x3c, 0xb2, 0xd0, 0x7d, 0x34, 0x28, 0xe9, + 0x10, 0xbc, 0x25, 0x9f, 0x2b, 0xc1, 0xd1, 0x14, 0x3e, 0x09, 0x49, 0xd4, 0x67, 0x0d, 0xa0, 0x27, + 0xe0, 0x55, 0xfd, 0x13, 0x25, 0xfc, 0x76, 0x48, 0x22, 0x8f, 0xed, 0x56, 0x60, 0x2c, 0xca, 0x51, + 0x54, 0x99, 0xb4, 0xc8, 0xb3, 0xdc, 0xef, 0x84, 0x24, 0xea, 0xb0, 0x06, 0x50, 0x0a, 0x5d, 0xc1, + 0x91, 0xfb, 0x5d, 0x37, 0xe5, 0xea, 0xd1, 0x27, 0x01, 0xb8, 0x33, 0xd6, 0xaa, 0xdc, 0xed, 0x3e, + 0x83, 0x41, 0xbd, 0x6a, 0xa2, 0xb4, 0x90, 0xaf, 0xce, 0xa0, 0xc7, 0xf6, 0x6b, 0x3c, 0x2e, 0x29, + 0xbd, 0x80, 0xde, 0xd2, 0xa0, 0xb4, 0x7e, 0x3b, 0xec, 0x44, 0x7b, 0x97, 0xc7, 0xf1, 0xd6, 0x7f, + 0xe2, 0xf2, 0x41, 0x56, 0x75, 0xd1, 0x73, 0x38, 0xb0, 0x6a, 0xa6, 0xa5, 0x98, 0xfc, 0xf5, 0x1b, + 0x54, 0xfc, 0xa1, 0xb6, 0x1c, 0x82, 0x57, 0x22, 0x8e, 0x8b, 0x42, 0x3a, 0xd5, 0x3e, 0x6b, 0xc0, + 0xe8, 0x83, 0xc0, 0xd1, 0x2d, 0xd7, 0x46, 0xab, 0x94, 0xcf, 0xff, 0x95, 0xf8, 0xcd, 0xfd, 0xd7, + 0x3a, 0x20, 0xab, 0x75, 0x40, 0x7e, 0xd6, 0x01, 0x79, 0xdf, 0x04, 0xad, 0xd5, 0x26, 0x68, 0x7d, + 0x6f, 0x82, 0xd6, 0xd3, 0xf5, 0x4c, 0xe1, 0xcb, 0x62, 0x1a, 0xa7, 0x26, 0x4b, 0x52, 0x93, 0x49, + 0x9c, 0x3e, 0x63, 0x53, 0xb8, 0x83, 0x48, 0xb6, 0xce, 0x65, 0xba, 0xe3, 0x82, 0xab, 0xdf, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xc9, 0xaa, 0x6d, 0xe3, 0x4a, 0x02, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -341,12 +324,12 @@ func (m *GossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.Signature) i = encodeVarintTypes(dAtA, i, uint64(len(m.Signature))) i-- - dAtA[i] = 0x2a + dAtA[i] = 0x22 } if m.SignedTimestamp != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.SignedTimestamp)) i-- - dAtA[i] = 0x20 + dAtA[i] = 0x18 } if len(m.Votes) > 0 { for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { @@ -359,16 +342,9 @@ func (m *GossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a + dAtA[i] = 0x12 } } - if len(m.SignType) > 0 { - i -= len(m.SignType) - copy(dAtA[i:], m.SignType) - i = encodeVarintTypes(dAtA, i, uint64(len(m.SignType))) - i-- - dAtA[i] = 0x12 - } if m.ValidatorIndex != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.ValidatorIndex)) i-- @@ -400,7 +376,7 @@ func (m *CanonicalGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { if m.SignedTimestamp != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.SignedTimestamp)) i-- - dAtA[i] = 0x20 + dAtA[i] = 0x18 } if len(m.Votes) > 0 { for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { @@ -413,16 +389,9 @@ func (m *CanonicalGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a + dAtA[i] = 0x12 } } - if len(m.SignType) > 0 { - i -= len(m.SignType) - copy(dAtA[i:], m.SignType) - i = encodeVarintTypes(dAtA, i, uint64(len(m.SignType))) - i-- - dAtA[i] = 0x12 - } if m.ValidatorIndex != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.ValidatorIndex)) i-- @@ -475,10 +444,6 @@ func (m *GossipVote) Size() (n int) { if m.ValidatorIndex != 0 { n += 1 + sovTypes(uint64(m.ValidatorIndex)) } - l = len(m.SignType) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } if len(m.Votes) > 0 { for _, e := range m.Votes { l = e.Size() @@ -504,10 +469,6 @@ func (m *CanonicalGossipVote) Size() (n int) { if m.ValidatorIndex != 0 { n += 1 + sovTypes(uint64(m.ValidatorIndex)) } - l = len(m.SignType) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } if len(m.Votes) > 0 { for _, e := range m.Votes { l = e.Size() @@ -742,38 +703,6 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { } } case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SignType", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SignType = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) } @@ -807,7 +736,7 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 4: + case 3: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field SignedTimestamp", wireType) } @@ -826,7 +755,7 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { break } } - case 5: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) } @@ -930,38 +859,6 @@ func (m *CanonicalGossipVote) Unmarshal(dAtA []byte) error { } } case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SignType", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SignType = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) } @@ -995,7 +892,7 @@ func (m *CanonicalGossipVote) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 4: + case 3: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field SignedTimestamp", wireType) } diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index ae21cbbb7c6..623e9295cd2 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -12,15 +12,13 @@ message Vote { message GossipVote { int32 validator_index = 1; - string sign_type = 2; - repeated Vote votes = 3; - int64 signed_timestamp = 4; - bytes signature = 5; + repeated Vote votes = 2; + int64 signed_timestamp = 3; + bytes signature = 4; } message CanonicalGossipVote { int32 validator_index = 1; - string sign_type = 2; - repeated Vote votes = 3; - int64 signed_timestamp = 4; + repeated Vote votes = 2; + int64 signed_timestamp = 3; } diff --git a/types/oracle.go b/types/oracle.go index 0144af442ca..2c7db74597c 100644 --- a/types/oracle.go +++ b/types/oracle.go @@ -18,7 +18,6 @@ func OracleVoteSignBytes(vote *oracleproto.GossipVote) []byte { func CanonicalizeOracleVote(vote *oracleproto.GossipVote) oracleproto.CanonicalGossipVote { return oracleproto.CanonicalGossipVote{ ValidatorIndex: vote.ValidatorIndex, - SignType: vote.SignType, Votes: vote.Votes, SignedTimestamp: vote.SignedTimestamp, } From 19d31dd19233e36afe1c2ff5891e0a06d5f8b1f3 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 29 Apr 2024 14:16:42 +0800 Subject: [PATCH 064/150] convert oracleId type to int64 --- proto/tendermint/oracle/types.pb.go | 66 +++++++++++------------------ proto/tendermint/oracle/types.proto | 2 +- 2 files changed, 26 insertions(+), 42 deletions(-) diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index 75efa3b427d..72dddff3dd2 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -24,7 +24,7 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type Vote struct { Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` - OracleId string `protobuf:"bytes,2,opt,name=oracle_id,json=oracleId,proto3" json:"oracle_id,omitempty"` + OracleId int64 `protobuf:"varint,2,opt,name=oracle_id,json=oracleId,proto3" json:"oracle_id,omitempty"` Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` Data string `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` } @@ -69,11 +69,11 @@ func (m *Vote) GetValidator() []byte { return nil } -func (m *Vote) GetOracleId() string { +func (m *Vote) GetOracleId() int64 { if m != nil { return m.OracleId } - return "" + return 0 } func (m *Vote) GetTimestamp() int64 { @@ -227,27 +227,27 @@ func init() { func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 316 bytes of a gzipped FileDescriptorProto + // 315 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x92, 0xbf, 0x4e, 0xc3, 0x30, 0x10, 0x87, 0xeb, 0xfe, 0x41, 0xe4, 0xa8, 0x28, 0x98, 0x81, 0x48, 0x94, 0x28, 0xea, 0x42, 0x18, 0x48, 0x24, 0xe0, 0x09, 0x60, 0x40, 0x5d, 0x18, 0x2c, 0xc4, 0xc0, 0x52, 0xb9, 0xb1, 0x29, 0x96, 0x1a, 0x3b, 0x8a, 0xaf, 0x15, 0xbc, 0x05, 0x23, 0x2f, 0xc1, 0x7b, 0x30, 0x76, 0x64, 0x44, 0xed, - 0x8b, 0xa0, 0x38, 0x52, 0x22, 0xd1, 0x17, 0x60, 0x3b, 0x7d, 0xbf, 0x3b, 0xdf, 0x67, 0xe9, 0xe0, + 0x8b, 0xa0, 0x38, 0x52, 0x22, 0xd1, 0x17, 0x60, 0x3b, 0x7d, 0xbf, 0xb3, 0xef, 0x3b, 0xe9, 0xe0, 0x14, 0xa5, 0x16, 0xb2, 0xc8, 0x94, 0xc6, 0xc4, 0x14, 0x3c, 0x9d, 0xcb, 0x04, 0xdf, 0x72, 0x69, 0xe3, 0xbc, 0x30, 0x68, 0xe8, 0x61, 0x13, 0xc7, 0x55, 0x3c, 0xb2, 0xd0, 0x7d, 0x34, 0x28, 0xe9, 0x10, 0xbc, 0x25, 0x9f, 0x2b, 0xc1, 0xd1, 0x14, 0x3e, 0x09, 0x49, 0xd4, 0x67, 0x0d, 0xa0, 0x27, - 0xe0, 0x55, 0xfd, 0x13, 0x25, 0xfc, 0x76, 0x48, 0x22, 0x8f, 0xed, 0x56, 0x60, 0x2c, 0xca, 0x51, - 0x54, 0x99, 0xb4, 0xc8, 0xb3, 0xdc, 0xef, 0x84, 0x24, 0xea, 0xb0, 0x06, 0x50, 0x0a, 0x5d, 0xc1, - 0x91, 0xfb, 0x5d, 0x37, 0xe5, 0xea, 0xd1, 0x27, 0x01, 0xb8, 0x33, 0xd6, 0xaa, 0xdc, 0xed, 0x3e, - 0x83, 0x41, 0xbd, 0x6a, 0xa2, 0xb4, 0x90, 0xaf, 0xce, 0xa0, 0xc7, 0xf6, 0x6b, 0x3c, 0x2e, 0x29, - 0xbd, 0x80, 0xde, 0xd2, 0xa0, 0xb4, 0x7e, 0x3b, 0xec, 0x44, 0x7b, 0x97, 0xc7, 0xf1, 0xd6, 0x7f, - 0xe2, 0xf2, 0x41, 0x56, 0x75, 0xd1, 0x73, 0x38, 0xb0, 0x6a, 0xa6, 0xa5, 0x98, 0xfc, 0xf5, 0x1b, - 0x54, 0xfc, 0xa1, 0xb6, 0x1c, 0x82, 0x57, 0x22, 0x8e, 0x8b, 0x42, 0x3a, 0xd5, 0x3e, 0x6b, 0xc0, - 0xe8, 0x83, 0xc0, 0xd1, 0x2d, 0xd7, 0x46, 0xab, 0x94, 0xcf, 0xff, 0x95, 0xf8, 0xcd, 0xfd, 0xd7, - 0x3a, 0x20, 0xab, 0x75, 0x40, 0x7e, 0xd6, 0x01, 0x79, 0xdf, 0x04, 0xad, 0xd5, 0x26, 0x68, 0x7d, - 0x6f, 0x82, 0xd6, 0xd3, 0xf5, 0x4c, 0xe1, 0xcb, 0x62, 0x1a, 0xa7, 0x26, 0x4b, 0x52, 0x93, 0x49, - 0x9c, 0x3e, 0x63, 0x53, 0xb8, 0x83, 0x48, 0xb6, 0xce, 0x65, 0xba, 0xe3, 0x82, 0xab, 0xdf, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xc9, 0xaa, 0x6d, 0xe3, 0x4a, 0x02, 0x00, 0x00, + 0xe0, 0x55, 0xfd, 0x13, 0x25, 0xfc, 0x76, 0x48, 0xa2, 0x0e, 0xdb, 0xad, 0xc0, 0x58, 0x94, 0x4f, + 0x51, 0x65, 0xd2, 0x22, 0xcf, 0x72, 0xbf, 0xe3, 0xc2, 0x06, 0x50, 0x0a, 0x5d, 0xc1, 0x91, 0xfb, + 0xdd, 0x90, 0x44, 0x1e, 0x73, 0xf5, 0xe8, 0x93, 0x00, 0xdc, 0x19, 0x6b, 0x55, 0xee, 0x66, 0x9f, + 0xc1, 0xa0, 0x1e, 0x35, 0x51, 0x5a, 0xc8, 0x57, 0x67, 0xd0, 0x63, 0xfb, 0x35, 0x1e, 0x97, 0x94, + 0x5e, 0x40, 0x6f, 0x69, 0x50, 0x5a, 0xbf, 0x1d, 0x76, 0xa2, 0xbd, 0xcb, 0xe3, 0x78, 0x6b, 0x9f, + 0xb8, 0xfc, 0x90, 0x55, 0x5d, 0xf4, 0x1c, 0x0e, 0xac, 0x9a, 0x69, 0x29, 0x26, 0x7f, 0xfd, 0x06, + 0x15, 0x7f, 0xa8, 0x2d, 0x87, 0xe0, 0x95, 0x88, 0xe3, 0xa2, 0x90, 0x4e, 0xb5, 0xcf, 0x1a, 0x30, + 0xfa, 0x20, 0x70, 0x74, 0xcb, 0xb5, 0xd1, 0x2a, 0xe5, 0xf3, 0x7f, 0x25, 0x7e, 0x73, 0xff, 0xb5, + 0x0e, 0xc8, 0x6a, 0x1d, 0x90, 0x9f, 0x75, 0x40, 0xde, 0x37, 0x41, 0x6b, 0xb5, 0x09, 0x5a, 0xdf, + 0x9b, 0xa0, 0xf5, 0x74, 0x3d, 0x53, 0xf8, 0xb2, 0x98, 0xc6, 0xa9, 0xc9, 0x92, 0xd4, 0x64, 0x12, + 0xa7, 0xcf, 0xd8, 0x14, 0xee, 0x20, 0x92, 0xad, 0x73, 0x99, 0xee, 0xb8, 0xe0, 0xea, 0x37, 0x00, + 0x00, 0xff, 0xff, 0x3b, 0x18, 0xf6, 0x1d, 0x4a, 0x02, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -282,12 +282,10 @@ func (m *Vote) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x18 } - if len(m.OracleId) > 0 { - i -= len(m.OracleId) - copy(dAtA[i:], m.OracleId) - i = encodeVarintTypes(dAtA, i, uint64(len(m.OracleId))) + if m.OracleId != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.OracleId)) i-- - dAtA[i] = 0x12 + dAtA[i] = 0x10 } if len(m.Validator) > 0 { i -= len(m.Validator) @@ -421,9 +419,8 @@ func (m *Vote) Size() (n int) { if l > 0 { n += 1 + l + sovTypes(uint64(l)) } - l = len(m.OracleId) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + if m.OracleId != 0 { + n += 1 + sovTypes(uint64(m.OracleId)) } if m.Timestamp != 0 { n += 1 + sovTypes(uint64(m.Timestamp)) @@ -551,10 +548,10 @@ func (m *Vote) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 2: - if wireType != 2 { + if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field OracleId", wireType) } - var stringLen uint64 + m.OracleId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -564,24 +561,11 @@ func (m *Vote) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + m.OracleId |= int64(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.OracleId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex case 3: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index 623e9295cd2..02be6b235bd 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -5,7 +5,7 @@ option go_package = "github.com/cometbft/cometbft/proto/tendermint/oracle"; message Vote { bytes validator = 1; - string oracle_id = 2; + int64 oracle_id = 2; int64 timestamp = 3; string data = 4; } From a067adec2878c1c940a6271a4dbe688127a98b56 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 29 Apr 2024 14:56:07 +0800 Subject: [PATCH 065/150] test logs --- oracle/service/runner/runner.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 452384bd91c..870b5049ffc 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -84,10 +84,28 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State return } + log.Infof("NORMAL SIGNATURE: %v", newGossipVote.Signature) + + testGossipVote := &oracleproto.GossipVote{ + ValidatorIndex: newGossipVote.ValidatorIndex, + SignedTimestamp: newGossipVote.SignedTimestamp, + Votes: reverseInts(newGossipVote.Votes), + } + oracleInfo.PrivValidator.SignOracleVote("", testGossipVote) + + log.Infof("REVERSE SIGNATURE: %v", testGossipVote.Signature) + oracleInfo.GossipVoteBuffer.Buffer[address] = newGossipVote oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() } +func reverseInts(input []*oracleproto.Vote) []*oracleproto.Vote { + if len(input) == 0 { + return input + } + return append(reverseInts(input[1:]), input[0]) +} + func PruneUnsignedVoteBuffer(oracleInfo *types.OracleInfo, consensusState *cs.State) { go func(oracleInfo *types.OracleInfo) { maxGossipVoteAge := oracleInfo.Config.MaxGossipVoteAge From f7083a3d28bc15285feed7206418e4dc5c2285d0 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 29 Apr 2024 16:21:21 +0800 Subject: [PATCH 066/150] test sort --- oracle/service/runner/runner.go | 38 +++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 870b5049ffc..6d6d407123f 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -2,6 +2,7 @@ package runner import ( "context" + "sort" "time" log "github.com/sirupsen/logrus" @@ -76,6 +77,13 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State newGossipVote.Votes = append(newGossipVote.Votes, currentGossipVote.Votes...) } + log.Infof("PRESORT: %v", newGossipVote.Votes) + + // sort the votes so that we can rebuild it in a deterministic order, when uncompressing + sort.Sort(ByVote(newGossipVote.Votes)) + + log.Infof("POSTSORT: %v", newGossipVote.Votes) + // signing of vote should append the signature field of gossipVote if err := oracleInfo.PrivValidator.SignOracleVote("", newGossipVote); err != nil { log.Errorf("error signing oracle votes") @@ -84,17 +92,6 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State return } - log.Infof("NORMAL SIGNATURE: %v", newGossipVote.Signature) - - testGossipVote := &oracleproto.GossipVote{ - ValidatorIndex: newGossipVote.ValidatorIndex, - SignedTimestamp: newGossipVote.SignedTimestamp, - Votes: reverseInts(newGossipVote.Votes), - } - oracleInfo.PrivValidator.SignOracleVote("", testGossipVote) - - log.Infof("REVERSE SIGNATURE: %v", testGossipVote.Signature) - oracleInfo.GossipVoteBuffer.Buffer[address] = newGossipVote oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() } @@ -198,3 +195,22 @@ func Run(oracleInfo *types.OracleInfo, consensusState *cs.State) { oracleInfo.SignVotesChan <- res.Vote } } + +type ByVote []*oracleproto.Vote + +func (b ByVote) Len() int { + return len(b) +} + +func (b ByVote) Swap(i, j int) { b[i], b[j] = b[j], b[i] } + +// Define custom sorting rules +func (b ByVote) Less(i, j int) bool { + if b[i].OracleId != b[j].OracleId { + return b[i].OracleId < b[j].OracleId + } + if b[i].Timestamp != b[j].Timestamp { + return b[i].Timestamp < b[j].Timestamp + } + return b[i].Data < b[j].Data +} From a161e3e906d2b669e815d8f3f710c690d6ae927f Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 29 Apr 2024 16:37:38 +0800 Subject: [PATCH 067/150] fix bug where gossipBuffer was not pruning properly --- oracle/service/runner/runner.go | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 6d6d407123f..e1c12e1ff6f 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -68,22 +68,9 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() - address := oracleInfo.PubKey.Address().String() - // need to mutex lock as it will clash with concurrent gossip - oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() - currentGossipVote, ok := oracleInfo.GossipVoteBuffer.Buffer[address] - if ok { - // append existing entry in gossipVoteBuffer - newGossipVote.Votes = append(newGossipVote.Votes, currentGossipVote.Votes...) - } - - log.Infof("PRESORT: %v", newGossipVote.Votes) - // sort the votes so that we can rebuild it in a deterministic order, when uncompressing sort.Sort(ByVote(newGossipVote.Votes)) - log.Infof("POSTSORT: %v", newGossipVote.Votes) - // signing of vote should append the signature field of gossipVote if err := oracleInfo.PrivValidator.SignOracleVote("", newGossipVote); err != nil { log.Errorf("error signing oracle votes") @@ -92,6 +79,9 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State return } + // need to mutex lock as it will clash with concurrent gossip + oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() + address := oracleInfo.PubKey.Address().String() oracleInfo.GossipVoteBuffer.Buffer[address] = newGossipVote oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() } From cd285d38d31eebb641f589c621ad02c24b2fa31e Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 29 Apr 2024 16:58:07 +0800 Subject: [PATCH 068/150] revert oracleId type to int64 --- proto/tendermint/oracle/types.pb.go | 66 ++++++++++++++++++----------- proto/tendermint/oracle/types.proto | 2 +- 2 files changed, 42 insertions(+), 26 deletions(-) diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index 72dddff3dd2..75efa3b427d 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -24,7 +24,7 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type Vote struct { Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` - OracleId int64 `protobuf:"varint,2,opt,name=oracle_id,json=oracleId,proto3" json:"oracle_id,omitempty"` + OracleId string `protobuf:"bytes,2,opt,name=oracle_id,json=oracleId,proto3" json:"oracle_id,omitempty"` Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` Data string `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` } @@ -69,11 +69,11 @@ func (m *Vote) GetValidator() []byte { return nil } -func (m *Vote) GetOracleId() int64 { +func (m *Vote) GetOracleId() string { if m != nil { return m.OracleId } - return 0 + return "" } func (m *Vote) GetTimestamp() int64 { @@ -227,27 +227,27 @@ func init() { func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 315 bytes of a gzipped FileDescriptorProto + // 316 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x92, 0xbf, 0x4e, 0xc3, 0x30, 0x10, 0x87, 0xeb, 0xfe, 0x41, 0xe4, 0xa8, 0x28, 0x98, 0x81, 0x48, 0x94, 0x28, 0xea, 0x42, 0x18, 0x48, 0x24, 0xe0, 0x09, 0x60, 0x40, 0x5d, 0x18, 0x2c, 0xc4, 0xc0, 0x52, 0xb9, 0xb1, 0x29, 0x96, 0x1a, 0x3b, 0x8a, 0xaf, 0x15, 0xbc, 0x05, 0x23, 0x2f, 0xc1, 0x7b, 0x30, 0x76, 0x64, 0x44, 0xed, - 0x8b, 0xa0, 0x38, 0x52, 0x22, 0xd1, 0x17, 0x60, 0x3b, 0x7d, 0xbf, 0xb3, 0xef, 0x3b, 0xe9, 0xe0, + 0x8b, 0xa0, 0x38, 0x52, 0x22, 0xd1, 0x17, 0x60, 0x3b, 0x7d, 0xbf, 0x3b, 0xdf, 0x67, 0xe9, 0xe0, 0x14, 0xa5, 0x16, 0xb2, 0xc8, 0x94, 0xc6, 0xc4, 0x14, 0x3c, 0x9d, 0xcb, 0x04, 0xdf, 0x72, 0x69, 0xe3, 0xbc, 0x30, 0x68, 0xe8, 0x61, 0x13, 0xc7, 0x55, 0x3c, 0xb2, 0xd0, 0x7d, 0x34, 0x28, 0xe9, 0x10, 0xbc, 0x25, 0x9f, 0x2b, 0xc1, 0xd1, 0x14, 0x3e, 0x09, 0x49, 0xd4, 0x67, 0x0d, 0xa0, 0x27, - 0xe0, 0x55, 0xfd, 0x13, 0x25, 0xfc, 0x76, 0x48, 0xa2, 0x0e, 0xdb, 0xad, 0xc0, 0x58, 0x94, 0x4f, - 0x51, 0x65, 0xd2, 0x22, 0xcf, 0x72, 0xbf, 0xe3, 0xc2, 0x06, 0x50, 0x0a, 0x5d, 0xc1, 0x91, 0xfb, - 0xdd, 0x90, 0x44, 0x1e, 0x73, 0xf5, 0xe8, 0x93, 0x00, 0xdc, 0x19, 0x6b, 0x55, 0xee, 0x66, 0x9f, - 0xc1, 0xa0, 0x1e, 0x35, 0x51, 0x5a, 0xc8, 0x57, 0x67, 0xd0, 0x63, 0xfb, 0x35, 0x1e, 0x97, 0x94, - 0x5e, 0x40, 0x6f, 0x69, 0x50, 0x5a, 0xbf, 0x1d, 0x76, 0xa2, 0xbd, 0xcb, 0xe3, 0x78, 0x6b, 0x9f, - 0xb8, 0xfc, 0x90, 0x55, 0x5d, 0xf4, 0x1c, 0x0e, 0xac, 0x9a, 0x69, 0x29, 0x26, 0x7f, 0xfd, 0x06, - 0x15, 0x7f, 0xa8, 0x2d, 0x87, 0xe0, 0x95, 0x88, 0xe3, 0xa2, 0x90, 0x4e, 0xb5, 0xcf, 0x1a, 0x30, - 0xfa, 0x20, 0x70, 0x74, 0xcb, 0xb5, 0xd1, 0x2a, 0xe5, 0xf3, 0x7f, 0x25, 0x7e, 0x73, 0xff, 0xb5, - 0x0e, 0xc8, 0x6a, 0x1d, 0x90, 0x9f, 0x75, 0x40, 0xde, 0x37, 0x41, 0x6b, 0xb5, 0x09, 0x5a, 0xdf, - 0x9b, 0xa0, 0xf5, 0x74, 0x3d, 0x53, 0xf8, 0xb2, 0x98, 0xc6, 0xa9, 0xc9, 0x92, 0xd4, 0x64, 0x12, - 0xa7, 0xcf, 0xd8, 0x14, 0xee, 0x20, 0x92, 0xad, 0x73, 0x99, 0xee, 0xb8, 0xe0, 0xea, 0x37, 0x00, - 0x00, 0xff, 0xff, 0x3b, 0x18, 0xf6, 0x1d, 0x4a, 0x02, 0x00, 0x00, + 0xe0, 0x55, 0xfd, 0x13, 0x25, 0xfc, 0x76, 0x48, 0x22, 0x8f, 0xed, 0x56, 0x60, 0x2c, 0xca, 0x51, + 0x54, 0x99, 0xb4, 0xc8, 0xb3, 0xdc, 0xef, 0x84, 0x24, 0xea, 0xb0, 0x06, 0x50, 0x0a, 0x5d, 0xc1, + 0x91, 0xfb, 0x5d, 0x37, 0xe5, 0xea, 0xd1, 0x27, 0x01, 0xb8, 0x33, 0xd6, 0xaa, 0xdc, 0xed, 0x3e, + 0x83, 0x41, 0xbd, 0x6a, 0xa2, 0xb4, 0x90, 0xaf, 0xce, 0xa0, 0xc7, 0xf6, 0x6b, 0x3c, 0x2e, 0x29, + 0xbd, 0x80, 0xde, 0xd2, 0xa0, 0xb4, 0x7e, 0x3b, 0xec, 0x44, 0x7b, 0x97, 0xc7, 0xf1, 0xd6, 0x7f, + 0xe2, 0xf2, 0x41, 0x56, 0x75, 0xd1, 0x73, 0x38, 0xb0, 0x6a, 0xa6, 0xa5, 0x98, 0xfc, 0xf5, 0x1b, + 0x54, 0xfc, 0xa1, 0xb6, 0x1c, 0x82, 0x57, 0x22, 0x8e, 0x8b, 0x42, 0x3a, 0xd5, 0x3e, 0x6b, 0xc0, + 0xe8, 0x83, 0xc0, 0xd1, 0x2d, 0xd7, 0x46, 0xab, 0x94, 0xcf, 0xff, 0x95, 0xf8, 0xcd, 0xfd, 0xd7, + 0x3a, 0x20, 0xab, 0x75, 0x40, 0x7e, 0xd6, 0x01, 0x79, 0xdf, 0x04, 0xad, 0xd5, 0x26, 0x68, 0x7d, + 0x6f, 0x82, 0xd6, 0xd3, 0xf5, 0x4c, 0xe1, 0xcb, 0x62, 0x1a, 0xa7, 0x26, 0x4b, 0x52, 0x93, 0x49, + 0x9c, 0x3e, 0x63, 0x53, 0xb8, 0x83, 0x48, 0xb6, 0xce, 0x65, 0xba, 0xe3, 0x82, 0xab, 0xdf, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xc9, 0xaa, 0x6d, 0xe3, 0x4a, 0x02, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -282,10 +282,12 @@ func (m *Vote) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x18 } - if m.OracleId != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.OracleId)) + if len(m.OracleId) > 0 { + i -= len(m.OracleId) + copy(dAtA[i:], m.OracleId) + i = encodeVarintTypes(dAtA, i, uint64(len(m.OracleId))) i-- - dAtA[i] = 0x10 + dAtA[i] = 0x12 } if len(m.Validator) > 0 { i -= len(m.Validator) @@ -419,8 +421,9 @@ func (m *Vote) Size() (n int) { if l > 0 { n += 1 + l + sovTypes(uint64(l)) } - if m.OracleId != 0 { - n += 1 + sovTypes(uint64(m.OracleId)) + l = len(m.OracleId) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) } if m.Timestamp != 0 { n += 1 + sovTypes(uint64(m.Timestamp)) @@ -548,10 +551,10 @@ func (m *Vote) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 2: - if wireType != 0 { + if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field OracleId", wireType) } - m.OracleId = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -561,11 +564,24 @@ func (m *Vote) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.OracleId |= int64(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.OracleId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex case 3: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index 02be6b235bd..623e9295cd2 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -5,7 +5,7 @@ option go_package = "github.com/cometbft/cometbft/proto/tendermint/oracle"; message Vote { bytes validator = 1; - int64 oracle_id = 2; + string oracle_id = 2; int64 timestamp = 3; string data = 4; } From 7091d6cfc494f7618d34f45d216244ffc3f66d3d Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 30 Apr 2024 11:21:52 +0800 Subject: [PATCH 069/150] remove some logs --- oracle/reactor.go | 4 ++-- oracle/service/runner/runner.go | 4 ---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 6d62032f196..dbc43d93de1 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -133,15 +133,15 @@ func (oracleR *Reactor) RemovePeer(peer p2p.Peer, _ interface{}) { } // // Receive implements Reactor. -// // It adds any received transactions to the mempool. func (oracleR *Reactor) Receive(e p2p.Envelope) { oracleR.Logger.Debug("Receive", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) switch msg := e.Message.(type) { case *oracleproto.GossipVote: + _, vals := oracleR.ConsensusState.GetValidators() + logrus.Infof("$$$$$$$$$$THESE ARE MY VALS:$$$$$$$$$$ %v", vals) // verify sig of incoming gossip vote, throw if verification fails _, val := oracleR.ConsensusState.Validators.GetByIndex(msg.ValidatorIndex) pubKey := val.PubKey - if success := pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature); !success { oracleR.Logger.Error("failed signature verification", msg) logrus.Info("FAILED SIGNATURE VERIFICATION!!!!!!!!!!!!!!") diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index e1c12e1ff6f..2e3ddbed3e5 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -101,9 +101,7 @@ func PruneUnsignedVoteBuffer(oracleInfo *types.OracleInfo, consensusState *cs.St } ticker := time.Tick(1 * time.Second) for range ticker { - lastHeight := consensusState.GetLastHeight() lastBlockTime := consensusState.GetState().LastBlockTime - log.Infof("last height: %v, last time: %v", lastHeight, lastBlockTime) if !contains(oracleInfo.BlockTimestamps, lastBlockTime.Unix()) { oracleInfo.BlockTimestamps = append(oracleInfo.BlockTimestamps, lastBlockTime.Unix()) @@ -180,8 +178,6 @@ func Run(oracleInfo *types.OracleInfo, consensusState *cs.State) { continue } - log.Infof("VOTE: %v", res.Vote) - oracleInfo.SignVotesChan <- res.Vote } } From 1fb4a5c613afec415477c687a0386926dc38a50a Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 30 Apr 2024 12:13:56 +0800 Subject: [PATCH 070/150] remove more logs --- oracle/reactor.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index dbc43d93de1..a8f89a53df4 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -138,9 +138,8 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { switch msg := e.Message.(type) { case *oracleproto.GossipVote: _, vals := oracleR.ConsensusState.GetValidators() - logrus.Infof("$$$$$$$$$$THESE ARE MY VALS:$$$$$$$$$$ %v", vals) // verify sig of incoming gossip vote, throw if verification fails - _, val := oracleR.ConsensusState.Validators.GetByIndex(msg.ValidatorIndex) + val := vals[msg.ValidatorIndex] pubKey := val.PubKey if success := pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature); !success { oracleR.Logger.Error("failed signature verification", msg) From 7144c7f4e571765fa94e3e345be2e1269a3c076a Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 30 Apr 2024 12:55:58 +0800 Subject: [PATCH 071/150] fix bug for verifying vals in gossip --- oracle/reactor.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index a8f89a53df4..721b3192507 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -137,9 +137,12 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { oracleR.Logger.Debug("Receive", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) switch msg := e.Message.(type) { case *oracleproto.GossipVote: - _, vals := oracleR.ConsensusState.GetValidators() // verify sig of incoming gossip vote, throw if verification fails - val := vals[msg.ValidatorIndex] + _, val := oracleR.ConsensusState.Validators.GetByIndex(msg.ValidatorIndex) + if val == nil { + logrus.Infof("validator with index: %v not found in validator set, skipping gossip", msg.ValidatorIndex) + return + } pubKey := val.PubKey if success := pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature); !success { oracleR.Logger.Error("failed signature verification", msg) From afc8c9b5a1cb32b422e87309fa4a206987da2b58 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 30 Apr 2024 14:23:50 +0800 Subject: [PATCH 072/150] update configs for maxGossipAge --- config/config.go | 2 +- oracle/service/runner/runner.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/config/config.go b/config/config.go index 631733ef0bb..cde8969c719 100644 --- a/config/config.go +++ b/config/config.go @@ -854,7 +854,7 @@ type OracleConfig struct { // DefaultOracleConfig returns a default configuration for the CometBFT oracle service func DefaultOracleConfig() *OracleConfig { return &OracleConfig{ - MaxGossipVoteAge: 3, // keep all gossipVotes from 3 blocks behind + MaxGossipVoteAge: 2, // keep all gossipVotes from 2 blocks behind SignInterval: 100 * time.Millisecond, // 0.1s GossipInterval: 100 * time.Millisecond, // 0.1s MaxGossipMsgSize: 65536, diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 2e3ddbed3e5..6884151792d 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -97,7 +97,7 @@ func PruneUnsignedVoteBuffer(oracleInfo *types.OracleInfo, consensusState *cs.St go func(oracleInfo *types.OracleInfo) { maxGossipVoteAge := oracleInfo.Config.MaxGossipVoteAge if maxGossipVoteAge == 0 { - maxGossipVoteAge = 3 + maxGossipVoteAge = 2 } ticker := time.Tick(1 * time.Second) for range ticker { @@ -107,11 +107,11 @@ func PruneUnsignedVoteBuffer(oracleInfo *types.OracleInfo, consensusState *cs.St oracleInfo.BlockTimestamps = append(oracleInfo.BlockTimestamps, lastBlockTime.Unix()) } - if len(oracleInfo.BlockTimestamps) < 3 { + if len(oracleInfo.BlockTimestamps) < maxGossipVoteAge { continue } - if len(oracleInfo.BlockTimestamps) > 3 { + if len(oracleInfo.BlockTimestamps) > maxGossipVoteAge { oracleInfo.BlockTimestamps = oracleInfo.BlockTimestamps[1:] } From 6d3c7357d5c16be904652aedd1690a6e0fa84570 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 30 Apr 2024 15:50:54 +0800 Subject: [PATCH 073/150] remove unused code --- oracle/reactor.go | 11 ++++------- oracle/service/runner/runner.go | 15 ++++----------- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 721b3192507..5363c485899 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -39,9 +39,7 @@ const ( // peers you received it from. type Reactor struct { p2p.BaseReactor - OracleInfo *oracletypes.OracleInfo - // config *cfg.MempoolConfig - // mempool *CListMempool + OracleInfo *oracletypes.OracleInfo ids *oracleIDs ConsensusState *cs.State } @@ -99,8 +97,6 @@ func (oracleR *Reactor) OnStart() error { // GetChannels implements Reactor by returning the list of channels for this // reactor. func (oracleR *Reactor) GetChannels() []*p2p.ChannelDescriptor { - // largestTx := make([]byte, oracleR.config.MaxTxBytes) - // TODO, confirm these params messageCap := oracleR.OracleInfo.Config.MaxGossipMsgSize if messageCap == 0 { messageCap = 65536 @@ -118,12 +114,10 @@ func (oracleR *Reactor) GetChannels() []*p2p.ChannelDescriptor { // AddPeer implements Reactor. // It starts a broadcast routine ensuring all txs are forwarded to the given peer. func (oracleR *Reactor) AddPeer(peer p2p.Peer) { - // if oracleR.config.Broadcast { go func() { oracleR.broadcastVoteRoutine(peer) time.Sleep(100 * time.Millisecond) }() - // } } // RemovePeer implements Reactor. @@ -144,6 +138,9 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { return } pubKey := val.PubKey + + logrus.Infof("gossip: %v:%v", pubKey.Address(), msg.ValidatorIndex) + if success := pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature); !success { oracleR.Logger.Error("failed signature verification", msg) logrus.Info("FAILED SIGNATURE VERIFICATION!!!!!!!!!!!!!!") diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 6884151792d..b94dbb4dbf1 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -51,10 +51,12 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State // batch sign the new votes, along with existing votes in gossipVoteBuffer, if any validatorIndex, _ := consensusState.Validators.GetByAddress(oracleInfo.PubKey.Address()) if validatorIndex == -1 { - log.Errorf("unable to find validator index") + log.Errorf("processSignVoteQueue: unable to find validator index") return } + log.Infof("runner: %v:%v", oracleInfo.PubKey.Address(), validatorIndex) + // append new batch into unsignedVotesBuffer, need to mutex lock as it will clash with concurrent pruning oracleInfo.UnsignedVoteBuffer.UpdateMtx.Lock() oracleInfo.UnsignedVoteBuffer.Buffer = append(oracleInfo.UnsignedVoteBuffer.Buffer, votes...) @@ -73,9 +75,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State // signing of vote should append the signature field of gossipVote if err := oracleInfo.PrivValidator.SignOracleVote("", newGossipVote); err != nil { - log.Errorf("error signing oracle votes") - // unlock here to prevent deadlock - oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() + log.Errorf("processSignVoteQueue: error signing oracle votes") return } @@ -86,13 +86,6 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() } -func reverseInts(input []*oracleproto.Vote) []*oracleproto.Vote { - if len(input) == 0 { - return input - } - return append(reverseInts(input[1:]), input[0]) -} - func PruneUnsignedVoteBuffer(oracleInfo *types.OracleInfo, consensusState *cs.State) { go func(oracleInfo *types.OracleInfo) { maxGossipVoteAge := oracleInfo.Config.MaxGossipVoteAge From b691924a4e4e757c16458beb56ed459ed689ce12 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 30 Apr 2024 16:19:09 +0800 Subject: [PATCH 074/150] optimise gossip slightly --- oracle/reactor.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 5363c485899..f69b53278ff 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -139,7 +139,10 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { } pubKey := val.PubKey - logrus.Infof("gossip: %v:%v", pubKey.Address(), msg.ValidatorIndex) + // skip if its own buffer + if oracleR.OracleInfo.PubKey.Equals(pubKey) { + return + } if success := pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature); !success { oracleR.Logger.Error("failed signature verification", msg) From 7cbec644b4f00d8c9f74bb5df7eeb807e4fcab4f Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 30 Apr 2024 17:27:08 +0800 Subject: [PATCH 075/150] fix bug where invalid gossipVotes are not removed during validation --- oracle/service/runner/runner.go | 2 -- state/execution.go | 9 ++++----- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index b94dbb4dbf1..08a20f8de8b 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -55,8 +55,6 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State return } - log.Infof("runner: %v:%v", oracleInfo.PubKey.Address(), validatorIndex) - // append new batch into unsignedVotesBuffer, need to mutex lock as it will clash with concurrent pruning oracleInfo.UnsignedVoteBuffer.UpdateMtx.Lock() oracleInfo.UnsignedVoteBuffer.Buffer = append(oracleInfo.UnsignedVoteBuffer.Buffer, votes...) diff --git a/state/execution.go b/state/execution.go index 737e4bdeae7..393f050338e 100644 --- a/state/execution.go +++ b/state/execution.go @@ -205,20 +205,19 @@ func (blockExec *BlockExecutor) ProcessProposal( ) (bool, error) { txs := block.Data.Txs.ToSliceOfBytes() if len(txs) > 0 { - logrus.Infof("no of txs: %d", len(txs)) res, err := blockExec.proxyApp.ValidateOracleVotes(context.Background(), &abci.RequestValidateOracleVotes{OracleTx: txs[0]}) if err != nil && res.Status == abci.ResponseValidateOracleVotes_absent { // oracleTx is not present, continue normal processProposal flow blockExec.logger.Error("error unmarshalling oracleVotesMsg or oracleVotesMsg not present", "err", err) - logrus.Infof("cant even find oracle votes") + logrus.Infof("processProposal: cant even find oracle votes") } else if err != nil && res.Status == abci.ResponseValidateOracleVotes_present { // oracleTx is present but it is invalid, remove from txs - logrus.Infof("unsucessful in validating oracle votes") + logrus.Infof("processProposal: unsucessful in validating oracle votes") block.Data.Txs = types.ToTxs(txs[1:]) - } else if err != nil { + } else if err == nil { // oracleTx is present and valid, update txBz as some of the gossipVotes might have been removed due to invalid sig - logrus.Infof("success in validating oracle votes") + logrus.Infof("processProposal: success in validating oracle votes") txs[0] = res.EncodedOracleTx block.Data.Txs = types.ToTxs(txs) } From f3f5ee5e5e05b7228755f4cac21e67db5ad14d3e Mon Sep 17 00:00:00 2001 From: yan-soon Date: Thu, 2 May 2024 11:28:55 +0800 Subject: [PATCH 076/150] improve naming for abci oracle hook methods --- abci/client/grpc_client.go | 8 +- abci/client/mocks/client.go | 28 +- abci/client/socket_client.go | 16 +- abci/types/application.go | 12 +- abci/types/messages.go | 12 +- abci/types/mocks/application.go | 28 +- abci/types/types.pb.go | 919 ++++++++++++++------------- oracle/reactor.go | 6 +- oracle/service/runner/runner.go | 4 +- oracle/service/types/info.go | 2 +- privval/file.go | 4 +- privval/retry_signer_client.go | 2 +- privval/signer_client.go | 2 +- proto/tendermint/abci/types.proto | 26 +- proto/tendermint/oracle/types.pb.go | 144 ++--- proto/tendermint/oracle/types.proto | 4 +- proto/tendermint/privval/types.pb.go | 124 ++-- proto/tendermint/privval/types.proto | 4 +- proxy/app_conn.go | 12 +- proxy/mocks/app_conn_consensus.go | 28 +- state/execution.go | 20 +- types/oracle.go | 6 +- types/priv_validator.go | 4 +- 23 files changed, 708 insertions(+), 707 deletions(-) diff --git a/abci/client/grpc_client.go b/abci/client/grpc_client.go index e2b5a2f3932..0b337eb8d43 100644 --- a/abci/client/grpc_client.go +++ b/abci/client/grpc_client.go @@ -246,12 +246,12 @@ func (cli *grpcClient) FinalizeBlock(ctx context.Context, req *types.RequestFina return cli.client.FinalizeBlock(ctx, types.ToRequestFinalizeBlock(req).GetFinalizeBlock(), grpc.WaitForReady(true)) } -func (cli *grpcClient) SignGossipVote(ctx context.Context, req *types.RequestSignGossipVote) (*types.ResponseSignGossipVote, error) { - return cli.client.SignGossipVote(ctx, types.ToRequestSignGossipVote(req).GetSignGossipVote(), grpc.WaitForReady(true)) +func (cli *grpcClient) CreateOracleResultTx(ctx context.Context, req *types.RequestCreateOracleResultTx) (*types.ResponseCreateOracleResultTx, error) { + return cli.client.CreateOracleResultTx(ctx, types.ToRequestCreateOracleResultTx(req).GetCreateOracleResultTx(), grpc.WaitForReady(true)) } -func (cli *grpcClient) PrepareOracleVotes(ctx context.Context, req *types.RequestPrepareOracleVotes) (*types.ResponsePrepareOracleVotes, error) { - return cli.client.PrepareOracleVotes(ctx, types.ToRequestPrepareOracleVotes(req).GetPrepareOracleVotes(), grpc.WaitForReady(true)) +func (cli *grpcClient) FetchOracleVotes(ctx context.Context, req *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error) { + return cli.client.FetchOracleVotes(ctx, types.ToRequestFetchOracleVotes(req).GetFetchOracleVotes(), grpc.WaitForReady(true)) } func (cli *grpcClient) ValidateOracleVotes(ctx context.Context, req *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) { diff --git a/abci/client/mocks/client.go b/abci/client/mocks/client.go index 71fc6565492..b48cbdd19f1 100644 --- a/abci/client/mocks/client.go +++ b/abci/client/mocks/client.go @@ -406,24 +406,24 @@ func (_m *Client) OnStop() { _m.Called() } -// PrepareOracleVotes provides a mock function with given fields: _a0, _a1 -func (_m *Client) PrepareOracleVotes(_a0 context.Context, _a1 *types.RequestPrepareOracleVotes) (*types.ResponsePrepareOracleVotes, error) { +// FetchOracleVotes provides a mock function with given fields: _a0, _a1 +func (_m *Client) FetchOracleVotes(_a0 context.Context, _a1 *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error) { ret := _m.Called(_a0, _a1) - var r0 *types.ResponsePrepareOracleVotes + var r0 *types.ResponseFetchOracleVotes var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestPrepareOracleVotes) (*types.ResponsePrepareOracleVotes, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error)); ok { return rf(_a0, _a1) } - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestPrepareOracleVotes) *types.ResponsePrepareOracleVotes); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFetchOracleVotes) *types.ResponseFetchOracleVotes); ok { r0 = rf(_a0, _a1) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.ResponsePrepareOracleVotes) + r0 = ret.Get(0).(*types.ResponseFetchOracleVotes) } } - if rf, ok := ret.Get(1).(func(context.Context, *types.RequestPrepareOracleVotes) error); ok { + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestFetchOracleVotes) error); ok { r1 = rf(_a0, _a1) } else { r1 = ret.Error(1) @@ -550,24 +550,24 @@ func (_m *Client) SetResponseCallback(_a0 abcicli.Callback) { _m.Called(_a0) } -// SignGossipVote provides a mock function with given fields: _a0, _a1 -func (_m *Client) SignGossipVote(_a0 context.Context, _a1 *types.RequestSignGossipVote) (*types.ResponseSignGossipVote, error) { +// CreateOracleResultTx provides a mock function with given fields: _a0, _a1 +func (_m *Client) CreateOracleResultTx(_a0 context.Context, _a1 *types.RequestCreateOracleResultTx) (*types.ResponseCreateOracleResultTx, error) { ret := _m.Called(_a0, _a1) - var r0 *types.ResponseSignGossipVote + var r0 *types.ResponseCreateOracleResultTx var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestSignGossipVote) (*types.ResponseSignGossipVote, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestCreateOracleResultTx) (*types.ResponseCreateOracleResultTx, error)); ok { return rf(_a0, _a1) } - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestSignGossipVote) *types.ResponseSignGossipVote); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestCreateOracleResultTx) *types.ResponseCreateOracleResultTx); ok { r0 = rf(_a0, _a1) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.ResponseSignGossipVote) + r0 = ret.Get(0).(*types.ResponseCreateOracleResultTx) } } - if rf, ok := ret.Get(1).(func(context.Context, *types.RequestSignGossipVote) error); ok { + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestCreateOracleResultTx) error); ok { r1 = rf(_a0, _a1) } else { r1 = ret.Error(1) diff --git a/abci/client/socket_client.go b/abci/client/socket_client.go index 45d383968a6..d997c0a4310 100644 --- a/abci/client/socket_client.go +++ b/abci/client/socket_client.go @@ -412,26 +412,26 @@ func (cli *socketClient) FinalizeBlock(ctx context.Context, req *types.RequestFi return reqRes.Response.GetFinalizeBlock(), cli.Error() } -func (cli *socketClient) SignGossipVote(ctx context.Context, req *types.RequestSignGossipVote) (*types.ResponseSignGossipVote, error) { - reqRes, err := cli.queueRequest(ctx, types.ToRequestSignGossipVote(req)) +func (cli *socketClient) CreateOracleResultTx(ctx context.Context, req *types.RequestCreateOracleResultTx) (*types.ResponseCreateOracleResultTx, error) { + reqRes, err := cli.queueRequest(ctx, types.ToRequestCreateOracleResultTx(req)) if err != nil { return nil, err } if err := cli.Flush(ctx); err != nil { return nil, err } - return reqRes.Response.GetSignGossipVote(), cli.Error() + return reqRes.Response.GetCreateOracleResultTx(), cli.Error() } -func (cli *socketClient) PrepareOracleVotes(ctx context.Context, req *types.RequestPrepareOracleVotes) (*types.ResponsePrepareOracleVotes, error) { - reqRes, err := cli.queueRequest(ctx, types.ToRequestPrepareOracleVotes(req)) +func (cli *socketClient) FetchOracleVotes(ctx context.Context, req *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error) { + reqRes, err := cli.queueRequest(ctx, types.ToRequestFetchOracleVotes(req)) if err != nil { return nil, err } if err := cli.Flush(ctx); err != nil { return nil, err } - return reqRes.Response.GetPrepareOracleVotes(), cli.Error() + return reqRes.Response.GetFetchOracleVotes(), cli.Error() } func (cli *socketClient) ValidateOracleVotes(ctx context.Context, req *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) { @@ -526,8 +526,8 @@ func resMatchesReq(req *types.Request, res *types.Response) (ok bool) { _, ok = res.Value.(*types.Response_ProcessProposal) case *types.Request_FinalizeBlock: _, ok = res.Value.(*types.Response_FinalizeBlock) - case *types.Request_SignGossipVote: - _, ok = res.Value.(*types.Response_SignGossipVote) + case *types.Request_CreateOracleResultTx: + _, ok = res.Value.(*types.Response_CreateOracleResultTx) } return ok } diff --git a/abci/types/application.go b/abci/types/application.go index aba4b1bc5db..ffb43865dd1 100644 --- a/abci/types/application.go +++ b/abci/types/application.go @@ -36,8 +36,8 @@ type Application interface { ApplySnapshotChunk(context.Context, *RequestApplySnapshotChunk) (*ResponseApplySnapshotChunk, error) // Apply a shapshot chunk // Hooks - SignGossipVote(context.Context, *RequestSignGossipVote) (*ResponseSignGossipVote, error) - PrepareOracleVotes(context.Context, *RequestPrepareOracleVotes) (*ResponsePrepareOracleVotes, error) + CreateOracleResultTx(context.Context, *RequestCreateOracleResultTx) (*ResponseCreateOracleResultTx, error) + FetchOracleVotes(context.Context, *RequestFetchOracleVotes) (*ResponseFetchOracleVotes, error) ValidateOracleVotes(context.Context, *RequestValidateOracleVotes) (*ResponseValidateOracleVotes, error) } @@ -125,12 +125,12 @@ func (BaseApplication) FinalizeBlock(_ context.Context, req *RequestFinalizeBloc }, nil } -func (BaseApplication) SignGossipVote(_ context.Context, req *RequestSignGossipVote) (*ResponseSignGossipVote, error) { - return &ResponseSignGossipVote{}, nil +func (BaseApplication) CreateOracleResultTx(_ context.Context, req *RequestCreateOracleResultTx) (*ResponseCreateOracleResultTx, error) { + return &ResponseCreateOracleResultTx{}, nil } -func (BaseApplication) PrepareOracleVotes(_ context.Context, req *RequestPrepareOracleVotes) (*ResponsePrepareOracleVotes, error) { - return &ResponsePrepareOracleVotes{}, nil +func (BaseApplication) FetchOracleVotes(_ context.Context, req *RequestFetchOracleVotes) (*ResponseFetchOracleVotes, error) { + return &ResponseFetchOracleVotes{}, nil } func (BaseApplication) ValidateOracleVotes(_ context.Context, req *RequestValidateOracleVotes) (*ResponseValidateOracleVotes, error) { diff --git a/abci/types/messages.go b/abci/types/messages.go index a9a17d7ebe1..2bd4421de53 100644 --- a/abci/types/messages.go +++ b/abci/types/messages.go @@ -124,15 +124,15 @@ func ToRequestFinalizeBlock(req *RequestFinalizeBlock) *Request { } } -func ToRequestSignGossipVote(req *RequestSignGossipVote) *Request { +func ToRequestCreateOracleResultTx(req *RequestCreateOracleResultTx) *Request { return &Request{ - Value: &Request_SignGossipVote{req}, + Value: &Request_CreateOracleResultTx{req}, } } -func ToRequestPrepareOracleVotes(req *RequestPrepareOracleVotes) *Request { +func ToRequestFetchOracleVotes(req *RequestFetchOracleVotes) *Request { return &Request{ - Value: &Request_PrepareOracleVotes{req}, + Value: &Request_FetchOracleVotes{req}, } } @@ -246,8 +246,8 @@ func ToResponseFinalizeBlock(res *ResponseFinalizeBlock) *Response { } } -func ToResponseSignGossipVote(res *ResponseSignGossipVote) *Response { +func ToResponseCreateOracleResultTx(res *ResponseCreateOracleResultTx) *Response { return &Response{ - Value: &Response_SignGossipVote{res}, + Value: &Response_CreateOracleResultTx{res}, } } diff --git a/abci/types/mocks/application.go b/abci/types/mocks/application.go index d9816a6f9ed..061bee9c225 100644 --- a/abci/types/mocks/application.go +++ b/abci/types/mocks/application.go @@ -274,24 +274,24 @@ func (_m *Application) OfferSnapshot(_a0 context.Context, _a1 *types.RequestOffe return r0, r1 } -// PrepareOracleVotes provides a mock function with given fields: _a0, _a1 -func (_m *Application) PrepareOracleVotes(_a0 context.Context, _a1 *types.RequestPrepareOracleVotes) (*types.ResponsePrepareOracleVotes, error) { +// FetchOracleVotes provides a mock function with given fields: _a0, _a1 +func (_m *Application) FetchOracleVotes(_a0 context.Context, _a1 *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error) { ret := _m.Called(_a0, _a1) - var r0 *types.ResponsePrepareOracleVotes + var r0 *types.ResponseFetchOracleVotes var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestPrepareOracleVotes) (*types.ResponsePrepareOracleVotes, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error)); ok { return rf(_a0, _a1) } - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestPrepareOracleVotes) *types.ResponsePrepareOracleVotes); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFetchOracleVotes) *types.ResponseFetchOracleVotes); ok { r0 = rf(_a0, _a1) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.ResponsePrepareOracleVotes) + r0 = ret.Get(0).(*types.ResponseFetchOracleVotes) } } - if rf, ok := ret.Get(1).(func(context.Context, *types.RequestPrepareOracleVotes) error); ok { + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestFetchOracleVotes) error); ok { r1 = rf(_a0, _a1) } else { r1 = ret.Error(1) @@ -378,24 +378,24 @@ func (_m *Application) Query(_a0 context.Context, _a1 *types.RequestQuery) (*typ return r0, r1 } -// SignGossipVote provides a mock function with given fields: _a0, _a1 -func (_m *Application) SignGossipVote(_a0 context.Context, _a1 *types.RequestSignGossipVote) (*types.ResponseSignGossipVote, error) { +// CreateOracleResultTx provides a mock function with given fields: _a0, _a1 +func (_m *Application) CreateOracleResultTx(_a0 context.Context, _a1 *types.RequestCreateOracleResultTx) (*types.ResponseCreateOracleResultTx, error) { ret := _m.Called(_a0, _a1) - var r0 *types.ResponseSignGossipVote + var r0 *types.ResponseCreateOracleResultTx var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestSignGossipVote) (*types.ResponseSignGossipVote, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestCreateOracleResultTx) (*types.ResponseCreateOracleResultTx, error)); ok { return rf(_a0, _a1) } - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestSignGossipVote) *types.ResponseSignGossipVote); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestCreateOracleResultTx) *types.ResponseCreateOracleResultTx); ok { r0 = rf(_a0, _a1) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.ResponseSignGossipVote) + r0 = ret.Get(0).(*types.ResponseCreateOracleResultTx) } } - if rf, ok := ret.Get(1).(func(context.Context, *types.RequestSignGossipVote) error); ok { + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestCreateOracleResultTx) error); ok { r1 = rf(_a0, _a1) } else { r1 = ret.Error(1) diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go index ea5e446be2b..9c94f319924 100644 --- a/abci/types/types.pb.go +++ b/abci/types/types.pb.go @@ -265,8 +265,8 @@ type Request struct { // *Request_ExtendVote // *Request_VerifyVoteExtension // *Request_FinalizeBlock - // *Request_SignGossipVote - // *Request_PrepareOracleVotes + // *Request_CreateOracleResultTx + // *Request_FetchOracleVotes // *Request_ValidateOracleVotes Value isRequest_Value `protobuf_oneof:"value"` } @@ -358,35 +358,35 @@ type Request_VerifyVoteExtension struct { type Request_FinalizeBlock struct { FinalizeBlock *RequestFinalizeBlock `protobuf:"bytes,20,opt,name=finalize_block,json=finalizeBlock,proto3,oneof" json:"finalize_block,omitempty"` } -type Request_SignGossipVote struct { - SignGossipVote *RequestSignGossipVote `protobuf:"bytes,21,opt,name=sign_gossip_vote,json=signGossipVote,proto3,oneof" json:"sign_gossip_vote,omitempty"` +type Request_CreateOracleResultTx struct { + CreateOracleResultTx *RequestCreateOracleResultTx `protobuf:"bytes,21,opt,name=create_oracle_result_tx,json=createOracleResultTx,proto3,oneof" json:"create_oracle_result_tx,omitempty"` } -type Request_PrepareOracleVotes struct { - PrepareOracleVotes *RequestPrepareOracleVotes `protobuf:"bytes,22,opt,name=prepare_oracle_votes,json=prepareOracleVotes,proto3,oneof" json:"prepare_oracle_votes,omitempty"` +type Request_FetchOracleVotes struct { + FetchOracleVotes *RequestFetchOracleVotes `protobuf:"bytes,22,opt,name=fetch_oracle_votes,json=fetchOracleVotes,proto3,oneof" json:"fetch_oracle_votes,omitempty"` } type Request_ValidateOracleVotes struct { ValidateOracleVotes *RequestValidateOracleVotes `protobuf:"bytes,23,opt,name=validate_oracle_votes,json=validateOracleVotes,proto3,oneof" json:"validate_oracle_votes,omitempty"` } -func (*Request_Echo) isRequest_Value() {} -func (*Request_Flush) isRequest_Value() {} -func (*Request_Info) isRequest_Value() {} -func (*Request_InitChain) isRequest_Value() {} -func (*Request_Query) isRequest_Value() {} -func (*Request_CheckTx) isRequest_Value() {} -func (*Request_Commit) isRequest_Value() {} -func (*Request_ListSnapshots) isRequest_Value() {} -func (*Request_OfferSnapshot) isRequest_Value() {} -func (*Request_LoadSnapshotChunk) isRequest_Value() {} -func (*Request_ApplySnapshotChunk) isRequest_Value() {} -func (*Request_PrepareProposal) isRequest_Value() {} -func (*Request_ProcessProposal) isRequest_Value() {} -func (*Request_ExtendVote) isRequest_Value() {} -func (*Request_VerifyVoteExtension) isRequest_Value() {} -func (*Request_FinalizeBlock) isRequest_Value() {} -func (*Request_SignGossipVote) isRequest_Value() {} -func (*Request_PrepareOracleVotes) isRequest_Value() {} -func (*Request_ValidateOracleVotes) isRequest_Value() {} +func (*Request_Echo) isRequest_Value() {} +func (*Request_Flush) isRequest_Value() {} +func (*Request_Info) isRequest_Value() {} +func (*Request_InitChain) isRequest_Value() {} +func (*Request_Query) isRequest_Value() {} +func (*Request_CheckTx) isRequest_Value() {} +func (*Request_Commit) isRequest_Value() {} +func (*Request_ListSnapshots) isRequest_Value() {} +func (*Request_OfferSnapshot) isRequest_Value() {} +func (*Request_LoadSnapshotChunk) isRequest_Value() {} +func (*Request_ApplySnapshotChunk) isRequest_Value() {} +func (*Request_PrepareProposal) isRequest_Value() {} +func (*Request_ProcessProposal) isRequest_Value() {} +func (*Request_ExtendVote) isRequest_Value() {} +func (*Request_VerifyVoteExtension) isRequest_Value() {} +func (*Request_FinalizeBlock) isRequest_Value() {} +func (*Request_CreateOracleResultTx) isRequest_Value() {} +func (*Request_FetchOracleVotes) isRequest_Value() {} +func (*Request_ValidateOracleVotes) isRequest_Value() {} func (m *Request) GetValue() isRequest_Value { if m != nil { @@ -507,16 +507,16 @@ func (m *Request) GetFinalizeBlock() *RequestFinalizeBlock { return nil } -func (m *Request) GetSignGossipVote() *RequestSignGossipVote { - if x, ok := m.GetValue().(*Request_SignGossipVote); ok { - return x.SignGossipVote +func (m *Request) GetCreateOracleResultTx() *RequestCreateOracleResultTx { + if x, ok := m.GetValue().(*Request_CreateOracleResultTx); ok { + return x.CreateOracleResultTx } return nil } -func (m *Request) GetPrepareOracleVotes() *RequestPrepareOracleVotes { - if x, ok := m.GetValue().(*Request_PrepareOracleVotes); ok { - return x.PrepareOracleVotes +func (m *Request) GetFetchOracleVotes() *RequestFetchOracleVotes { + if x, ok := m.GetValue().(*Request_FetchOracleVotes); ok { + return x.FetchOracleVotes } return nil } @@ -547,8 +547,8 @@ func (*Request) XXX_OneofWrappers() []interface{} { (*Request_ExtendVote)(nil), (*Request_VerifyVoteExtension)(nil), (*Request_FinalizeBlock)(nil), - (*Request_SignGossipVote)(nil), - (*Request_PrepareOracleVotes)(nil), + (*Request_CreateOracleResultTx)(nil), + (*Request_FetchOracleVotes)(nil), (*Request_ValidateOracleVotes)(nil), } } @@ -1637,24 +1637,24 @@ func (m *RequestFinalizeBlock) GetProposerAddress() []byte { return nil } -type RequestSignGossipVote struct { - ProposerAddress []byte `protobuf:"bytes,1,opt,name=proposer_address,json=proposerAddress,proto3" json:"proposer_address,omitempty"` - GossipVotes []*oracle.GossipVote `protobuf:"bytes,2,rep,name=gossip_votes,json=gossipVotes,proto3" json:"gossip_votes,omitempty"` - Height int64 `protobuf:"varint,3,opt,name=height,proto3" json:"height,omitempty"` +type RequestCreateOracleResultTx struct { + ProposerAddress []byte `protobuf:"bytes,1,opt,name=proposer_address,json=proposerAddress,proto3" json:"proposer_address,omitempty"` + GossipedVotes []*oracle.GossipedVotes `protobuf:"bytes,2,rep,name=gossiped_votes,json=gossipedVotes,proto3" json:"gossiped_votes,omitempty"` + Height int64 `protobuf:"varint,3,opt,name=height,proto3" json:"height,omitempty"` } -func (m *RequestSignGossipVote) Reset() { *m = RequestSignGossipVote{} } -func (m *RequestSignGossipVote) String() string { return proto.CompactTextString(m) } -func (*RequestSignGossipVote) ProtoMessage() {} -func (*RequestSignGossipVote) Descriptor() ([]byte, []int) { +func (m *RequestCreateOracleResultTx) Reset() { *m = RequestCreateOracleResultTx{} } +func (m *RequestCreateOracleResultTx) String() string { return proto.CompactTextString(m) } +func (*RequestCreateOracleResultTx) ProtoMessage() {} +func (*RequestCreateOracleResultTx) Descriptor() ([]byte, []int) { return fileDescriptor_252557cfdd89a31a, []int{17} } -func (m *RequestSignGossipVote) XXX_Unmarshal(b []byte) error { +func (m *RequestCreateOracleResultTx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *RequestSignGossipVote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *RequestCreateOracleResultTx) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_RequestSignGossipVote.Marshal(b, m, deterministic) + return xxx_messageInfo_RequestCreateOracleResultTx.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1664,54 +1664,54 @@ func (m *RequestSignGossipVote) XXX_Marshal(b []byte, deterministic bool) ([]byt return b[:n], nil } } -func (m *RequestSignGossipVote) XXX_Merge(src proto.Message) { - xxx_messageInfo_RequestSignGossipVote.Merge(m, src) +func (m *RequestCreateOracleResultTx) XXX_Merge(src proto.Message) { + xxx_messageInfo_RequestCreateOracleResultTx.Merge(m, src) } -func (m *RequestSignGossipVote) XXX_Size() int { +func (m *RequestCreateOracleResultTx) XXX_Size() int { return m.Size() } -func (m *RequestSignGossipVote) XXX_DiscardUnknown() { - xxx_messageInfo_RequestSignGossipVote.DiscardUnknown(m) +func (m *RequestCreateOracleResultTx) XXX_DiscardUnknown() { + xxx_messageInfo_RequestCreateOracleResultTx.DiscardUnknown(m) } -var xxx_messageInfo_RequestSignGossipVote proto.InternalMessageInfo +var xxx_messageInfo_RequestCreateOracleResultTx proto.InternalMessageInfo -func (m *RequestSignGossipVote) GetProposerAddress() []byte { +func (m *RequestCreateOracleResultTx) GetProposerAddress() []byte { if m != nil { return m.ProposerAddress } return nil } -func (m *RequestSignGossipVote) GetGossipVotes() []*oracle.GossipVote { +func (m *RequestCreateOracleResultTx) GetGossipedVotes() []*oracle.GossipedVotes { if m != nil { - return m.GossipVotes + return m.GossipedVotes } return nil } -func (m *RequestSignGossipVote) GetHeight() int64 { +func (m *RequestCreateOracleResultTx) GetHeight() int64 { if m != nil { return m.Height } return 0 } -type RequestPrepareOracleVotes struct { +type RequestFetchOracleVotes struct { } -func (m *RequestPrepareOracleVotes) Reset() { *m = RequestPrepareOracleVotes{} } -func (m *RequestPrepareOracleVotes) String() string { return proto.CompactTextString(m) } -func (*RequestPrepareOracleVotes) ProtoMessage() {} -func (*RequestPrepareOracleVotes) Descriptor() ([]byte, []int) { +func (m *RequestFetchOracleVotes) Reset() { *m = RequestFetchOracleVotes{} } +func (m *RequestFetchOracleVotes) String() string { return proto.CompactTextString(m) } +func (*RequestFetchOracleVotes) ProtoMessage() {} +func (*RequestFetchOracleVotes) Descriptor() ([]byte, []int) { return fileDescriptor_252557cfdd89a31a, []int{18} } -func (m *RequestPrepareOracleVotes) XXX_Unmarshal(b []byte) error { +func (m *RequestFetchOracleVotes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *RequestPrepareOracleVotes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *RequestFetchOracleVotes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_RequestPrepareOracleVotes.Marshal(b, m, deterministic) + return xxx_messageInfo_RequestFetchOracleVotes.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1721,17 +1721,17 @@ func (m *RequestPrepareOracleVotes) XXX_Marshal(b []byte, deterministic bool) ([ return b[:n], nil } } -func (m *RequestPrepareOracleVotes) XXX_Merge(src proto.Message) { - xxx_messageInfo_RequestPrepareOracleVotes.Merge(m, src) +func (m *RequestFetchOracleVotes) XXX_Merge(src proto.Message) { + xxx_messageInfo_RequestFetchOracleVotes.Merge(m, src) } -func (m *RequestPrepareOracleVotes) XXX_Size() int { +func (m *RequestFetchOracleVotes) XXX_Size() int { return m.Size() } -func (m *RequestPrepareOracleVotes) XXX_DiscardUnknown() { - xxx_messageInfo_RequestPrepareOracleVotes.DiscardUnknown(m) +func (m *RequestFetchOracleVotes) XXX_DiscardUnknown() { + xxx_messageInfo_RequestFetchOracleVotes.DiscardUnknown(m) } -var xxx_messageInfo_RequestPrepareOracleVotes proto.InternalMessageInfo +var xxx_messageInfo_RequestFetchOracleVotes proto.InternalMessageInfo type RequestValidateOracleVotes struct { OracleTx []byte `protobuf:"bytes,1,opt,name=oracle_tx,json=oracleTx,proto3" json:"oracle_tx,omitempty"` @@ -1797,8 +1797,8 @@ type Response struct { // *Response_ExtendVote // *Response_VerifyVoteExtension // *Response_FinalizeBlock - // *Response_SignGossipVote - // *Response_PrepareOracleVotes + // *Response_CreateOracleResultTx + // *Response_FetchOracleVotes // *Response_ValidateOracleVotes Value isResponse_Value `protobuf_oneof:"value"` } @@ -1893,36 +1893,36 @@ type Response_VerifyVoteExtension struct { type Response_FinalizeBlock struct { FinalizeBlock *ResponseFinalizeBlock `protobuf:"bytes,21,opt,name=finalize_block,json=finalizeBlock,proto3,oneof" json:"finalize_block,omitempty"` } -type Response_SignGossipVote struct { - SignGossipVote *ResponseSignGossipVote `protobuf:"bytes,22,opt,name=sign_gossip_vote,json=signGossipVote,proto3,oneof" json:"sign_gossip_vote,omitempty"` +type Response_CreateOracleResultTx struct { + CreateOracleResultTx *ResponseCreateOracleResultTx `protobuf:"bytes,22,opt,name=create_oracle_result_tx,json=createOracleResultTx,proto3,oneof" json:"create_oracle_result_tx,omitempty"` } -type Response_PrepareOracleVotes struct { - PrepareOracleVotes *ResponsePrepareOracleVotes `protobuf:"bytes,23,opt,name=prepare_oracle_votes,json=prepareOracleVotes,proto3,oneof" json:"prepare_oracle_votes,omitempty"` +type Response_FetchOracleVotes struct { + FetchOracleVotes *ResponseFetchOracleVotes `protobuf:"bytes,23,opt,name=fetch_oracle_votes,json=fetchOracleVotes,proto3,oneof" json:"fetch_oracle_votes,omitempty"` } type Response_ValidateOracleVotes struct { ValidateOracleVotes *ResponseValidateOracleVotes `protobuf:"bytes,24,opt,name=validate_oracle_votes,json=validateOracleVotes,proto3,oneof" json:"validate_oracle_votes,omitempty"` } -func (*Response_Exception) isResponse_Value() {} -func (*Response_Echo) isResponse_Value() {} -func (*Response_Flush) isResponse_Value() {} -func (*Response_Info) isResponse_Value() {} -func (*Response_InitChain) isResponse_Value() {} -func (*Response_Query) isResponse_Value() {} -func (*Response_CheckTx) isResponse_Value() {} -func (*Response_Commit) isResponse_Value() {} -func (*Response_ListSnapshots) isResponse_Value() {} -func (*Response_OfferSnapshot) isResponse_Value() {} -func (*Response_LoadSnapshotChunk) isResponse_Value() {} -func (*Response_ApplySnapshotChunk) isResponse_Value() {} -func (*Response_PrepareProposal) isResponse_Value() {} -func (*Response_ProcessProposal) isResponse_Value() {} -func (*Response_ExtendVote) isResponse_Value() {} -func (*Response_VerifyVoteExtension) isResponse_Value() {} -func (*Response_FinalizeBlock) isResponse_Value() {} -func (*Response_SignGossipVote) isResponse_Value() {} -func (*Response_PrepareOracleVotes) isResponse_Value() {} -func (*Response_ValidateOracleVotes) isResponse_Value() {} +func (*Response_Exception) isResponse_Value() {} +func (*Response_Echo) isResponse_Value() {} +func (*Response_Flush) isResponse_Value() {} +func (*Response_Info) isResponse_Value() {} +func (*Response_InitChain) isResponse_Value() {} +func (*Response_Query) isResponse_Value() {} +func (*Response_CheckTx) isResponse_Value() {} +func (*Response_Commit) isResponse_Value() {} +func (*Response_ListSnapshots) isResponse_Value() {} +func (*Response_OfferSnapshot) isResponse_Value() {} +func (*Response_LoadSnapshotChunk) isResponse_Value() {} +func (*Response_ApplySnapshotChunk) isResponse_Value() {} +func (*Response_PrepareProposal) isResponse_Value() {} +func (*Response_ProcessProposal) isResponse_Value() {} +func (*Response_ExtendVote) isResponse_Value() {} +func (*Response_VerifyVoteExtension) isResponse_Value() {} +func (*Response_FinalizeBlock) isResponse_Value() {} +func (*Response_CreateOracleResultTx) isResponse_Value() {} +func (*Response_FetchOracleVotes) isResponse_Value() {} +func (*Response_ValidateOracleVotes) isResponse_Value() {} func (m *Response) GetValue() isResponse_Value { if m != nil { @@ -2050,16 +2050,16 @@ func (m *Response) GetFinalizeBlock() *ResponseFinalizeBlock { return nil } -func (m *Response) GetSignGossipVote() *ResponseSignGossipVote { - if x, ok := m.GetValue().(*Response_SignGossipVote); ok { - return x.SignGossipVote +func (m *Response) GetCreateOracleResultTx() *ResponseCreateOracleResultTx { + if x, ok := m.GetValue().(*Response_CreateOracleResultTx); ok { + return x.CreateOracleResultTx } return nil } -func (m *Response) GetPrepareOracleVotes() *ResponsePrepareOracleVotes { - if x, ok := m.GetValue().(*Response_PrepareOracleVotes); ok { - return x.PrepareOracleVotes +func (m *Response) GetFetchOracleVotes() *ResponseFetchOracleVotes { + if x, ok := m.GetValue().(*Response_FetchOracleVotes); ok { + return x.FetchOracleVotes } return nil } @@ -2091,8 +2091,8 @@ func (*Response) XXX_OneofWrappers() []interface{} { (*Response_ExtendVote)(nil), (*Response_VerifyVoteExtension)(nil), (*Response_FinalizeBlock)(nil), - (*Response_SignGossipVote)(nil), - (*Response_PrepareOracleVotes)(nil), + (*Response_CreateOracleResultTx)(nil), + (*Response_FetchOracleVotes)(nil), (*Response_ValidateOracleVotes)(nil), } } @@ -3062,22 +3062,22 @@ func (m *ResponseFinalizeBlock) GetAppHash() []byte { return nil } -type ResponseSignGossipVote struct { +type ResponseCreateOracleResultTx struct { EncodedTx []byte `protobuf:"bytes,1,opt,name=encoded_tx,json=encodedTx,proto3" json:"encoded_tx,omitempty"` } -func (m *ResponseSignGossipVote) Reset() { *m = ResponseSignGossipVote{} } -func (m *ResponseSignGossipVote) String() string { return proto.CompactTextString(m) } -func (*ResponseSignGossipVote) ProtoMessage() {} -func (*ResponseSignGossipVote) Descriptor() ([]byte, []int) { +func (m *ResponseCreateOracleResultTx) Reset() { *m = ResponseCreateOracleResultTx{} } +func (m *ResponseCreateOracleResultTx) String() string { return proto.CompactTextString(m) } +func (*ResponseCreateOracleResultTx) ProtoMessage() {} +func (*ResponseCreateOracleResultTx) Descriptor() ([]byte, []int) { return fileDescriptor_252557cfdd89a31a, []int{38} } -func (m *ResponseSignGossipVote) XXX_Unmarshal(b []byte) error { +func (m *ResponseCreateOracleResultTx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ResponseSignGossipVote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ResponseCreateOracleResultTx) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ResponseSignGossipVote.Marshal(b, m, deterministic) + return xxx_messageInfo_ResponseCreateOracleResultTx.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -3087,41 +3087,41 @@ func (m *ResponseSignGossipVote) XXX_Marshal(b []byte, deterministic bool) ([]by return b[:n], nil } } -func (m *ResponseSignGossipVote) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResponseSignGossipVote.Merge(m, src) +func (m *ResponseCreateOracleResultTx) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseCreateOracleResultTx.Merge(m, src) } -func (m *ResponseSignGossipVote) XXX_Size() int { +func (m *ResponseCreateOracleResultTx) XXX_Size() int { return m.Size() } -func (m *ResponseSignGossipVote) XXX_DiscardUnknown() { - xxx_messageInfo_ResponseSignGossipVote.DiscardUnknown(m) +func (m *ResponseCreateOracleResultTx) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseCreateOracleResultTx.DiscardUnknown(m) } -var xxx_messageInfo_ResponseSignGossipVote proto.InternalMessageInfo +var xxx_messageInfo_ResponseCreateOracleResultTx proto.InternalMessageInfo -func (m *ResponseSignGossipVote) GetEncodedTx() []byte { +func (m *ResponseCreateOracleResultTx) GetEncodedTx() []byte { if m != nil { return m.EncodedTx } return nil } -type ResponsePrepareOracleVotes struct { +type ResponseFetchOracleVotes struct { Vote *oracle.Vote `protobuf:"bytes,1,opt,name=vote,proto3" json:"vote,omitempty"` } -func (m *ResponsePrepareOracleVotes) Reset() { *m = ResponsePrepareOracleVotes{} } -func (m *ResponsePrepareOracleVotes) String() string { return proto.CompactTextString(m) } -func (*ResponsePrepareOracleVotes) ProtoMessage() {} -func (*ResponsePrepareOracleVotes) Descriptor() ([]byte, []int) { +func (m *ResponseFetchOracleVotes) Reset() { *m = ResponseFetchOracleVotes{} } +func (m *ResponseFetchOracleVotes) String() string { return proto.CompactTextString(m) } +func (*ResponseFetchOracleVotes) ProtoMessage() {} +func (*ResponseFetchOracleVotes) Descriptor() ([]byte, []int) { return fileDescriptor_252557cfdd89a31a, []int{39} } -func (m *ResponsePrepareOracleVotes) XXX_Unmarshal(b []byte) error { +func (m *ResponseFetchOracleVotes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ResponsePrepareOracleVotes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ResponseFetchOracleVotes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ResponsePrepareOracleVotes.Marshal(b, m, deterministic) + return xxx_messageInfo_ResponseFetchOracleVotes.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -3131,19 +3131,19 @@ func (m *ResponsePrepareOracleVotes) XXX_Marshal(b []byte, deterministic bool) ( return b[:n], nil } } -func (m *ResponsePrepareOracleVotes) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResponsePrepareOracleVotes.Merge(m, src) +func (m *ResponseFetchOracleVotes) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseFetchOracleVotes.Merge(m, src) } -func (m *ResponsePrepareOracleVotes) XXX_Size() int { +func (m *ResponseFetchOracleVotes) XXX_Size() int { return m.Size() } -func (m *ResponsePrepareOracleVotes) XXX_DiscardUnknown() { - xxx_messageInfo_ResponsePrepareOracleVotes.DiscardUnknown(m) +func (m *ResponseFetchOracleVotes) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseFetchOracleVotes.DiscardUnknown(m) } -var xxx_messageInfo_ResponsePrepareOracleVotes proto.InternalMessageInfo +var xxx_messageInfo_ResponseFetchOracleVotes proto.InternalMessageInfo -func (m *ResponsePrepareOracleVotes) GetVote() *oracle.Vote { +func (m *ResponseFetchOracleVotes) GetVote() *oracle.Vote { if m != nil { return m.Vote } @@ -4014,8 +4014,8 @@ func init() { proto.RegisterType((*RequestExtendVote)(nil), "tendermint.abci.RequestExtendVote") proto.RegisterType((*RequestVerifyVoteExtension)(nil), "tendermint.abci.RequestVerifyVoteExtension") proto.RegisterType((*RequestFinalizeBlock)(nil), "tendermint.abci.RequestFinalizeBlock") - proto.RegisterType((*RequestSignGossipVote)(nil), "tendermint.abci.RequestSignGossipVote") - proto.RegisterType((*RequestPrepareOracleVotes)(nil), "tendermint.abci.RequestPrepareOracleVotes") + proto.RegisterType((*RequestCreateOracleResultTx)(nil), "tendermint.abci.RequestCreateOracleResultTx") + proto.RegisterType((*RequestFetchOracleVotes)(nil), "tendermint.abci.RequestFetchOracleVotes") proto.RegisterType((*RequestValidateOracleVotes)(nil), "tendermint.abci.RequestValidateOracleVotes") proto.RegisterType((*Response)(nil), "tendermint.abci.Response") proto.RegisterType((*ResponseException)(nil), "tendermint.abci.ResponseException") @@ -4035,8 +4035,8 @@ func init() { proto.RegisterType((*ResponseExtendVote)(nil), "tendermint.abci.ResponseExtendVote") proto.RegisterType((*ResponseVerifyVoteExtension)(nil), "tendermint.abci.ResponseVerifyVoteExtension") proto.RegisterType((*ResponseFinalizeBlock)(nil), "tendermint.abci.ResponseFinalizeBlock") - proto.RegisterType((*ResponseSignGossipVote)(nil), "tendermint.abci.ResponseSignGossipVote") - proto.RegisterType((*ResponsePrepareOracleVotes)(nil), "tendermint.abci.ResponsePrepareOracleVotes") + proto.RegisterType((*ResponseCreateOracleResultTx)(nil), "tendermint.abci.ResponseCreateOracleResultTx") + proto.RegisterType((*ResponseFetchOracleVotes)(nil), "tendermint.abci.ResponseFetchOracleVotes") proto.RegisterType((*ResponseValidateOracleVotes)(nil), "tendermint.abci.ResponseValidateOracleVotes") proto.RegisterType((*CommitInfo)(nil), "tendermint.abci.CommitInfo") proto.RegisterType((*ExtendedCommitInfo)(nil), "tendermint.abci.ExtendedCommitInfo") @@ -4055,225 +4055,226 @@ func init() { func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) } var fileDescriptor_252557cfdd89a31a = []byte{ - // 3484 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0x3d, 0x70, 0x23, 0xc7, - 0xb1, 0xc6, 0xe2, 0x8f, 0x40, 0xe3, 0x87, 0xcb, 0xe1, 0x1d, 0x0f, 0xc2, 0x9d, 0x48, 0xde, 0xaa, - 0x24, 0x9d, 0xee, 0x24, 0x52, 0x8f, 0xf7, 0x4e, 0xd2, 0xd5, 0x49, 0xaf, 0x1e, 0x88, 0xc3, 0x09, - 0xe4, 0x9d, 0x48, 0x6a, 0x89, 0x3b, 0x95, 0xde, 0x8f, 0x56, 0x0b, 0x60, 0x08, 0xac, 0x0e, 0xc0, - 0xae, 0x76, 0x17, 0x14, 0xa8, 0xe8, 0xd5, 0xd3, 0x7b, 0x55, 0x2e, 0x45, 0xaa, 0x72, 0xa2, 0xc0, - 0x0a, 0x1c, 0x38, 0x71, 0xe0, 0xd8, 0x4e, 0x1c, 0x39, 0x50, 0xe0, 0x40, 0x91, 0xcb, 0x91, 0x6c, - 0x4b, 0x99, 0x52, 0x07, 0x4e, 0x5d, 0xf3, 0xb3, 0xbf, 0xd8, 0x25, 0x80, 0x93, 0x1c, 0xb8, 0xec, - 0x6c, 0xa6, 0xd1, 0xdd, 0xb3, 0xd3, 0xd3, 0x33, 0xdd, 0xf3, 0xf5, 0x00, 0x2e, 0xdb, 0x78, 0xd4, - 0xc5, 0xe6, 0x50, 0x1b, 0xd9, 0xdb, 0x6a, 0xbb, 0xa3, 0x6d, 0xdb, 0x67, 0x06, 0xb6, 0xb6, 0x0c, - 0x53, 0xb7, 0x75, 0xb4, 0xec, 0xfd, 0xb8, 0x45, 0x7e, 0xac, 0x3e, 0xed, 0xe3, 0xee, 0x98, 0x67, - 0x86, 0xad, 0x6f, 0x1b, 0xa6, 0xae, 0x9f, 0x30, 0xfe, 0xea, 0x95, 0xe9, 0x9f, 0x1f, 0xe3, 0x33, - 0xae, 0x2d, 0x20, 0x4c, 0x47, 0xd9, 0x36, 0x54, 0x53, 0x1d, 0x3a, 0x3f, 0x6f, 0x4e, 0xfd, 0x7c, - 0xaa, 0x0e, 0xb4, 0xae, 0x6a, 0xeb, 0x26, 0xe7, 0xd8, 0xe8, 0xe9, 0x7a, 0x6f, 0x80, 0xb7, 0x69, - 0xaf, 0x3d, 0x3e, 0xd9, 0xb6, 0xb5, 0x21, 0xb6, 0x6c, 0x75, 0x68, 0x70, 0x86, 0x0b, 0x3d, 0xbd, - 0xa7, 0xd3, 0xe6, 0x36, 0x69, 0x45, 0x8c, 0xab, 0x9b, 0x6a, 0x67, 0x80, 0xfd, 0x93, 0x94, 0x7e, - 0x57, 0x80, 0x25, 0x19, 0x7f, 0x38, 0xc6, 0x96, 0x8d, 0x76, 0x20, 0x8d, 0x3b, 0x7d, 0xbd, 0x22, - 0x6c, 0x0a, 0xd7, 0x0a, 0x3b, 0x57, 0xb6, 0x42, 0xf3, 0xdf, 0xe2, 0x7c, 0x8d, 0x4e, 0x5f, 0x6f, - 0x26, 0x64, 0xca, 0x8b, 0x6e, 0x41, 0xe6, 0x64, 0x30, 0xb6, 0xfa, 0x95, 0x24, 0x15, 0x7a, 0x3a, - 0x4e, 0xe8, 0x1e, 0x61, 0x6a, 0x26, 0x64, 0xc6, 0x4d, 0x86, 0xd2, 0x46, 0x27, 0x7a, 0x25, 0x75, - 0xfe, 0x50, 0x7b, 0xa3, 0x13, 0x3a, 0x14, 0xe1, 0x45, 0xbb, 0x00, 0xda, 0x48, 0xb3, 0x95, 0x4e, - 0x5f, 0xd5, 0x46, 0x95, 0x0c, 0x95, 0xbc, 0x1a, 0x2f, 0xa9, 0xd9, 0x75, 0xc2, 0xd8, 0x4c, 0xc8, - 0x79, 0xcd, 0xe9, 0x90, 0xcf, 0xfd, 0x70, 0x8c, 0xcd, 0xb3, 0x4a, 0xf6, 0xfc, 0xcf, 0x7d, 0x9b, - 0x30, 0x91, 0xcf, 0xa5, 0xdc, 0xe8, 0x75, 0xc8, 0x75, 0xfa, 0xb8, 0xf3, 0x58, 0xb1, 0x27, 0x95, - 0x1c, 0x95, 0xdc, 0x88, 0x93, 0xac, 0x13, 0xbe, 0xd6, 0xa4, 0x99, 0x90, 0x97, 0x3a, 0xac, 0x89, - 0x5e, 0x83, 0x6c, 0x47, 0x1f, 0x0e, 0x35, 0xbb, 0x52, 0xa0, 0xb2, 0xeb, 0xb1, 0xb2, 0x94, 0xab, - 0x99, 0x90, 0x39, 0x3f, 0x3a, 0x80, 0xf2, 0x40, 0xb3, 0x6c, 0xc5, 0x1a, 0xa9, 0x86, 0xd5, 0xd7, - 0x6d, 0xab, 0x52, 0xa4, 0x1a, 0x9e, 0x8d, 0xd3, 0xf0, 0x40, 0xb3, 0xec, 0x63, 0x87, 0xb9, 0x99, - 0x90, 0x4b, 0x03, 0x3f, 0x81, 0xe8, 0xd3, 0x4f, 0x4e, 0xb0, 0xe9, 0x2a, 0xac, 0x94, 0xce, 0xd7, - 0x77, 0x48, 0xb8, 0x1d, 0x79, 0xa2, 0x4f, 0xf7, 0x13, 0xd0, 0x7f, 0xc2, 0xea, 0x40, 0x57, 0xbb, - 0xae, 0x3a, 0xa5, 0xd3, 0x1f, 0x8f, 0x1e, 0x57, 0xca, 0x54, 0xe9, 0x0b, 0xb1, 0x1f, 0xa9, 0xab, - 0x5d, 0x47, 0x45, 0x9d, 0x08, 0x34, 0x13, 0xf2, 0xca, 0x20, 0x4c, 0x44, 0xef, 0xc1, 0x05, 0xd5, - 0x30, 0x06, 0x67, 0x61, 0xed, 0xcb, 0x54, 0xfb, 0xf5, 0x38, 0xed, 0x35, 0x22, 0x13, 0x56, 0x8f, - 0xd4, 0x29, 0x2a, 0x6a, 0x81, 0x68, 0x98, 0xd8, 0x50, 0x4d, 0xac, 0x18, 0xa6, 0x6e, 0xe8, 0x96, - 0x3a, 0xa8, 0x88, 0x54, 0xf7, 0xf3, 0x71, 0xba, 0x8f, 0x18, 0xff, 0x11, 0x67, 0x6f, 0x26, 0xe4, - 0x65, 0x23, 0x48, 0x62, 0x5a, 0xf5, 0x0e, 0xb6, 0x2c, 0x4f, 0xeb, 0xca, 0x2c, 0xad, 0x94, 0x3f, - 0xa8, 0x35, 0x40, 0x42, 0x0d, 0x28, 0xe0, 0x09, 0x11, 0x57, 0x4e, 0x75, 0x1b, 0x57, 0x10, 0x55, - 0x28, 0xc5, 0xee, 0x50, 0xca, 0xfa, 0x48, 0xb7, 0x71, 0x33, 0x21, 0x03, 0x76, 0x7b, 0x48, 0x85, - 0x8b, 0xa7, 0xd8, 0xd4, 0x4e, 0xce, 0xa8, 0x1a, 0x85, 0xfe, 0x62, 0x69, 0xfa, 0xa8, 0xb2, 0x4a, - 0x15, 0xde, 0x88, 0x53, 0xf8, 0x88, 0x0a, 0x11, 0x15, 0x0d, 0x47, 0xa4, 0x99, 0x90, 0x57, 0x4f, - 0xa7, 0xc9, 0xc4, 0xc5, 0x4e, 0xb4, 0x91, 0x3a, 0xd0, 0x3e, 0xc6, 0x4a, 0x7b, 0xa0, 0x77, 0x1e, - 0x57, 0x2e, 0x9c, 0xef, 0x62, 0xf7, 0x38, 0xf7, 0x2e, 0x61, 0x26, 0x2e, 0x76, 0xe2, 0x27, 0x20, - 0x19, 0x44, 0x4b, 0xeb, 0x8d, 0x94, 0x9e, 0x6e, 0x59, 0x9a, 0xc1, 0xa6, 0x7f, 0x91, 0x6a, 0x7c, - 0x2e, 0x4e, 0xe3, 0xb1, 0xd6, 0x1b, 0xbd, 0x49, 0xd9, 0xb9, 0x09, 0xca, 0x56, 0x80, 0x42, 0x3c, - 0xcb, 0x59, 0x79, 0x76, 0x24, 0x52, 0xb5, 0x56, 0x65, 0xed, 0x7c, 0xcf, 0xe2, 0xab, 0x7f, 0x48, - 0x45, 0x88, 0x22, 0xb2, 0xc3, 0x90, 0x31, 0x45, 0xa5, 0x66, 0x66, 0xa7, 0x77, 0x68, 0x80, 0x4b, - 0x33, 0xcc, 0xcc, 0x85, 0x82, 0x23, 0xac, 0x9e, 0x4e, 0x93, 0x77, 0x97, 0x20, 0x73, 0xaa, 0x0e, - 0xc6, 0x78, 0x3f, 0x9d, 0x4b, 0x8b, 0x99, 0xfd, 0x74, 0x6e, 0x49, 0xcc, 0xed, 0xa7, 0x73, 0x79, - 0x11, 0xf6, 0xd3, 0x39, 0x10, 0x0b, 0xd2, 0xf3, 0x50, 0xf0, 0x9d, 0xd7, 0xa8, 0x02, 0x4b, 0x43, - 0x6c, 0x59, 0x6a, 0x0f, 0xd3, 0xe3, 0x3d, 0x2f, 0x3b, 0x5d, 0xa9, 0x0c, 0x45, 0xff, 0x19, 0x2d, - 0x7d, 0x26, 0xb8, 0x92, 0xe4, 0xf8, 0x25, 0x92, 0xa7, 0xd8, 0xa4, 0x5e, 0xc2, 0x25, 0x79, 0x17, - 0x3d, 0x03, 0x25, 0xba, 0xc2, 0x8a, 0xf3, 0x3b, 0x89, 0x01, 0x69, 0xb9, 0x48, 0x89, 0x8f, 0x38, - 0xd3, 0x06, 0x14, 0x8c, 0x1d, 0xc3, 0x65, 0x49, 0x51, 0x16, 0x30, 0x76, 0x0c, 0x87, 0xe1, 0x2a, - 0x14, 0x89, 0x0d, 0x5c, 0x8e, 0x34, 0x1d, 0xa4, 0x40, 0x68, 0x9c, 0x45, 0xfa, 0x6d, 0x12, 0xc4, - 0xf0, 0xb9, 0x8e, 0x5e, 0x83, 0x34, 0x89, 0x80, 0x3c, 0x5a, 0x55, 0xb7, 0x58, 0x78, 0xdc, 0x72, - 0xc2, 0xe3, 0x56, 0xcb, 0x09, 0x8f, 0xbb, 0xb9, 0x2f, 0xbf, 0xde, 0x48, 0x7c, 0xf6, 0x87, 0x0d, - 0x41, 0xa6, 0x12, 0xe8, 0x29, 0x72, 0x9a, 0xab, 0xda, 0x48, 0xd1, 0xba, 0xf4, 0x93, 0xf3, 0xe4, - 0xa8, 0x56, 0xb5, 0xd1, 0x5e, 0x17, 0x3d, 0x00, 0xb1, 0xa3, 0x8f, 0x2c, 0x3c, 0xb2, 0xc6, 0x96, - 0xc2, 0x02, 0x34, 0x8f, 0x51, 0x81, 0x48, 0xc3, 0x22, 0x68, 0xdd, 0xe1, 0x3c, 0xa2, 0x8c, 0xf2, - 0x72, 0x27, 0x48, 0x40, 0xf7, 0x00, 0xdc, 0x28, 0x6e, 0x55, 0xd2, 0x9b, 0xa9, 0x6b, 0x85, 0x9d, - 0xcd, 0xa9, 0xc5, 0x7f, 0xe4, 0xb0, 0x3c, 0x34, 0xc8, 0x2a, 0xef, 0xa6, 0xc9, 0xe7, 0xca, 0x3e, - 0x49, 0xf4, 0x1c, 0x2c, 0xab, 0x86, 0xa1, 0x58, 0x36, 0x71, 0xa8, 0xf6, 0x19, 0xf1, 0x24, 0x12, - 0xfe, 0x8a, 0x72, 0x49, 0x35, 0x8c, 0x63, 0x42, 0xdd, 0x25, 0x44, 0xf4, 0x2c, 0x94, 0x49, 0xa8, - 0xd3, 0xd4, 0x81, 0xd2, 0xc7, 0x5a, 0xaf, 0x6f, 0xd3, 0x30, 0x97, 0x92, 0x4b, 0x9c, 0xda, 0xa4, - 0x44, 0xa9, 0xeb, 0xae, 0x38, 0x0d, 0x73, 0x08, 0x41, 0xba, 0xab, 0xda, 0x2a, 0xb5, 0x64, 0x51, - 0xa6, 0x6d, 0x42, 0x33, 0x54, 0xbb, 0xcf, 0xed, 0x43, 0xdb, 0x68, 0x0d, 0xb2, 0x5c, 0x6d, 0x8a, - 0xaa, 0xe5, 0x3d, 0x74, 0x01, 0x32, 0x86, 0xa9, 0x9f, 0x62, 0xba, 0x74, 0x39, 0x99, 0x75, 0x24, - 0x19, 0xca, 0xc1, 0x90, 0x88, 0xca, 0x90, 0xb4, 0x27, 0x7c, 0x94, 0xa4, 0x3d, 0x41, 0x2f, 0x43, - 0x9a, 0x18, 0x92, 0x8e, 0x51, 0x8e, 0x48, 0x02, 0xb8, 0x5c, 0xeb, 0xcc, 0xc0, 0x32, 0xe5, 0x94, - 0x96, 0xa1, 0x14, 0x08, 0x95, 0xd2, 0x1a, 0x5c, 0x88, 0x8a, 0x7c, 0x52, 0xdf, 0xa5, 0x07, 0x22, - 0x18, 0xba, 0x05, 0x39, 0x37, 0xf4, 0x31, 0xc7, 0x79, 0x6a, 0x6a, 0x58, 0x87, 0x59, 0x76, 0x59, - 0x89, 0xc7, 0x90, 0x05, 0xe8, 0xab, 0x3c, 0xd1, 0x29, 0xca, 0x4b, 0xaa, 0x61, 0x34, 0x55, 0xab, - 0x2f, 0xbd, 0x0f, 0x95, 0xb8, 0xb0, 0xe6, 0x33, 0x98, 0x40, 0xdd, 0xde, 0x31, 0xd8, 0x1a, 0x64, - 0x4f, 0x74, 0x73, 0xa8, 0xda, 0x54, 0x59, 0x49, 0xe6, 0x3d, 0x62, 0x48, 0x16, 0xe2, 0x52, 0x94, - 0xcc, 0x3a, 0x92, 0x02, 0x4f, 0xc5, 0x86, 0x36, 0x22, 0xa2, 0x8d, 0xba, 0x98, 0x99, 0xb5, 0x24, - 0xb3, 0x8e, 0xa7, 0x88, 0x7d, 0x2c, 0xeb, 0x90, 0x61, 0x2d, 0x3a, 0x57, 0xaa, 0x3f, 0x2f, 0xf3, - 0x9e, 0xf4, 0x79, 0x0a, 0xd6, 0xa2, 0x03, 0x1c, 0xda, 0x84, 0xe2, 0x50, 0x9d, 0x28, 0xf6, 0x84, - 0xbb, 0x9d, 0x40, 0x17, 0x1e, 0x86, 0xea, 0xa4, 0x35, 0x61, 0x3e, 0x27, 0x42, 0xca, 0x9e, 0x58, - 0x95, 0xe4, 0x66, 0xea, 0x5a, 0x51, 0x26, 0x4d, 0xf4, 0x10, 0x56, 0x06, 0x7a, 0x47, 0x1d, 0x28, - 0x03, 0xd5, 0xb2, 0x15, 0x9e, 0xf9, 0xb0, 0x4d, 0xf4, 0xcc, 0x94, 0xb1, 0x59, 0xa8, 0xc2, 0x5d, - 0xb6, 0x9e, 0xe4, 0xc0, 0xe1, 0xfe, 0xbf, 0x4c, 0x75, 0x3c, 0x50, 0x9d, 0xa5, 0x46, 0x77, 0xa1, - 0x30, 0xd4, 0xac, 0x36, 0xee, 0xab, 0xa7, 0x9a, 0x6e, 0xf2, 0xdd, 0x34, 0xed, 0x34, 0x6f, 0x79, - 0x3c, 0x5c, 0x93, 0x5f, 0xcc, 0xb7, 0x24, 0x99, 0x80, 0x0f, 0x3b, 0xa7, 0x49, 0x76, 0xe1, 0xd3, - 0xe4, 0x65, 0xb8, 0x30, 0xc2, 0x13, 0x5b, 0xf1, 0xf6, 0x2b, 0xf3, 0x93, 0x25, 0x6a, 0x7a, 0x44, - 0x7e, 0x73, 0x77, 0xb8, 0x45, 0x5c, 0x06, 0xbd, 0x40, 0x53, 0x04, 0x43, 0xb7, 0xb0, 0xa9, 0xa8, - 0xdd, 0xae, 0x89, 0x2d, 0x8b, 0x66, 0x95, 0x45, 0x1a, 0xf7, 0x29, 0xbd, 0xc6, 0xc8, 0xd2, 0x8f, - 0xfc, 0x4b, 0x13, 0x4c, 0x09, 0xb8, 0xe1, 0x05, 0xcf, 0xf0, 0xc7, 0x24, 0xac, 0x51, 0xf9, 0x6e, - 0xc0, 0xf6, 0x2c, 0x35, 0xbf, 0x3c, 0xbd, 0xbf, 0xc2, 0x36, 0x47, 0x8e, 0x78, 0xbc, 0xd9, 0x53, - 0x4f, 0x66, 0x76, 0x04, 0x69, 0x6a, 0x94, 0x34, 0x3b, 0x62, 0x48, 0xfb, 0xef, 0x6d, 0x29, 0x3e, - 0x49, 0xc1, 0xca, 0x54, 0x7e, 0xe5, 0x4e, 0x4c, 0x88, 0x9c, 0x58, 0x32, 0x72, 0x62, 0xa9, 0x85, - 0x27, 0xc6, 0xd7, 0x3a, 0x3d, 0x7b, 0xad, 0x33, 0x3f, 0xe0, 0x5a, 0x67, 0x9f, 0x6c, 0xad, 0xff, - 0xa6, 0xab, 0xf0, 0x13, 0x01, 0xaa, 0xf1, 0x49, 0x69, 0xe4, 0x72, 0xdc, 0x80, 0x15, 0xf7, 0x53, - 0x5c, 0xf5, 0xec, 0x60, 0x14, 0xdd, 0x1f, 0xb8, 0xfe, 0xd8, 0x18, 0xf7, 0x2c, 0x94, 0x43, 0x29, - 0x33, 0x73, 0xe5, 0xd2, 0xa9, 0x7f, 0x7c, 0xe9, 0xff, 0x52, 0x6e, 0xe0, 0x09, 0xe4, 0xb5, 0x11, - 0xbb, 0xf5, 0x6d, 0x58, 0xed, 0xe2, 0x8e, 0xd6, 0x7d, 0xd2, 0xcd, 0xba, 0xc2, 0xa5, 0xff, 0xb9, - 0x57, 0x23, 0xbd, 0xe4, 0x62, 0xe4, 0x65, 0x20, 0x52, 0x89, 0x10, 0xa9, 0x04, 0xfd, 0x3b, 0x14, - 0x7d, 0x97, 0x0e, 0x16, 0xe2, 0x42, 0x90, 0x01, 0x4b, 0xee, 0xb7, 0x3c, 0xfd, 0x72, 0xa1, 0xe7, - 0xb6, 0x63, 0x9d, 0x49, 0xba, 0xec, 0x46, 0xf4, 0xe9, 0x2b, 0x85, 0x74, 0xdb, 0x73, 0xf0, 0xe9, - 0xbc, 0x1f, 0x5d, 0x86, 0x3c, 0xbf, 0x51, 0xb8, 0xa9, 0x54, 0x8e, 0x11, 0x5a, 0x13, 0xe9, 0x17, - 0x45, 0xc8, 0xc9, 0xd8, 0x32, 0x48, 0x1a, 0x8a, 0x76, 0x21, 0x8f, 0x27, 0x1d, 0x6c, 0xd8, 0x4e, - 0xe6, 0x1e, 0x7d, 0x61, 0x64, 0xdc, 0x0d, 0x87, 0xb3, 0x99, 0x90, 0x3d, 0x31, 0x74, 0x93, 0x23, - 0x42, 0xf1, 0xe0, 0x0e, 0x17, 0xf7, 0x43, 0x42, 0xaf, 0x38, 0x90, 0x50, 0x2a, 0x16, 0xed, 0x60, - 0x52, 0x21, 0x4c, 0xe8, 0x26, 0xc7, 0x84, 0xd2, 0x33, 0x06, 0x0b, 0x80, 0x42, 0xf5, 0x00, 0x28, - 0x94, 0x9d, 0x31, 0xcd, 0x18, 0x54, 0xe8, 0x15, 0x07, 0x15, 0x5a, 0x9a, 0xf1, 0xc5, 0x21, 0x58, - 0xe8, 0x0d, 0x1f, 0x2c, 0x94, 0xa7, 0xa2, 0x9b, 0xb1, 0xa2, 0x11, 0xb8, 0xd0, 0x6d, 0x17, 0x17, - 0x2a, 0xc6, 0x62, 0x4a, 0x5c, 0x38, 0x0c, 0x0c, 0x1d, 0x4e, 0x01, 0x43, 0xa5, 0xd8, 0x3b, 0x31, - 0x53, 0x31, 0x03, 0x19, 0x3a, 0x9c, 0x42, 0x86, 0xca, 0x33, 0x14, 0xce, 0x80, 0x86, 0xfe, 0x2b, - 0x1a, 0x1a, 0x8a, 0x07, 0x6f, 0xf8, 0x67, 0xce, 0x87, 0x0d, 0x29, 0x31, 0xd8, 0x90, 0x18, 0x7b, - 0xc1, 0x66, 0xea, 0xe7, 0x06, 0x87, 0x1e, 0x46, 0x80, 0x43, 0x0c, 0xc6, 0xb9, 0x16, 0xab, 0x7c, - 0x0e, 0x74, 0xe8, 0x61, 0x04, 0x3a, 0x84, 0x66, 0xaa, 0x9d, 0x09, 0x0f, 0xdd, 0x0b, 0xc2, 0x43, - 0xab, 0x31, 0xc9, 0xb6, 0xb7, 0xdb, 0x63, 0xf0, 0xa1, 0x76, 0x1c, 0x3e, 0xc4, 0x30, 0x9c, 0x17, - 0x63, 0x35, 0x2e, 0x00, 0x10, 0x1d, 0x4e, 0x01, 0x44, 0x17, 0x67, 0x78, 0xda, 0x0c, 0x84, 0xe8, - 0x38, 0x02, 0x21, 0x5a, 0x8b, 0x45, 0xdc, 0x98, 0xca, 0x99, 0x10, 0x91, 0x12, 0x03, 0x11, 0x5d, - 0x9a, 0xe1, 0x60, 0x73, 0x63, 0x44, 0xed, 0x38, 0x8c, 0xa8, 0x32, 0xcb, 0xd4, 0x4f, 0x04, 0x12, - 0x65, 0xc4, 0xec, 0x7e, 0x3a, 0x97, 0x13, 0xf3, 0x0c, 0x1e, 0xda, 0x4f, 0xe7, 0x0a, 0x62, 0x51, - 0x7a, 0x81, 0xa4, 0xb4, 0xa1, 0x08, 0x40, 0x2e, 0x8f, 0xd8, 0x34, 0x75, 0x93, 0xc3, 0x3d, 0xac, - 0x23, 0x5d, 0x83, 0xa2, 0xff, 0xb4, 0x3f, 0x07, 0x50, 0xa2, 0x97, 0x74, 0xdf, 0x09, 0x2f, 0xfd, - 0x52, 0xf0, 0x64, 0x29, 0xa4, 0xe4, 0x07, 0x1c, 0xf2, 0x1c, 0x70, 0xf0, 0xc1, 0x4c, 0xc9, 0x20, - 0xcc, 0xb4, 0x01, 0x05, 0x72, 0xf9, 0x0e, 0x21, 0x48, 0xaa, 0xe1, 0x22, 0x48, 0xd7, 0x61, 0x85, - 0x66, 0x50, 0x0c, 0x8c, 0xe2, 0x11, 0x37, 0x4d, 0x23, 0xee, 0x32, 0xf9, 0x81, 0xf9, 0x0d, 0x4b, - 0x58, 0x5e, 0x82, 0x55, 0x1f, 0xaf, 0x7b, 0xa9, 0x67, 0x70, 0x8a, 0xe8, 0x72, 0xd7, 0xf8, 0xed, - 0xfe, 0x37, 0x82, 0x67, 0x21, 0x0f, 0x7a, 0x8a, 0x42, 0x89, 0x84, 0x1f, 0x08, 0x25, 0x4a, 0x3e, - 0x31, 0x4a, 0xe4, 0x07, 0x29, 0x52, 0x41, 0x90, 0xe2, 0x2f, 0x82, 0xb7, 0x26, 0x2e, 0xe6, 0xd3, - 0xd1, 0xbb, 0x98, 0xc3, 0x06, 0xb4, 0x4d, 0x72, 0xd4, 0x81, 0xde, 0xe3, 0xe0, 0x00, 0x69, 0x12, - 0x2e, 0x37, 0x24, 0xe7, 0x79, 0xc4, 0x75, 0x11, 0x07, 0x96, 0x09, 0x72, 0xc4, 0x41, 0x84, 0xd4, - 0x63, 0xcc, 0xca, 0x2a, 0x45, 0x99, 0x34, 0x09, 0x1f, 0x75, 0x3e, 0x9e, 0xd1, 0xb1, 0x0e, 0x7a, - 0x0d, 0xf2, 0xb4, 0x66, 0xa6, 0xe8, 0x86, 0xc5, 0x4b, 0x29, 0x81, 0x5c, 0x97, 0x15, 0xce, 0xb6, - 0x8e, 0x08, 0xcf, 0xa1, 0x61, 0xc9, 0x39, 0x83, 0xb7, 0x7c, 0xc9, 0x54, 0x3e, 0x90, 0x82, 0x5e, - 0x81, 0x3c, 0xf9, 0x7a, 0xcb, 0x50, 0x3b, 0xb8, 0x02, 0xf4, 0x43, 0x3d, 0x82, 0xf4, 0xf3, 0x24, - 0x2c, 0x87, 0x42, 0x70, 0xe4, 0xdc, 0x1d, 0x97, 0x4c, 0xfa, 0x30, 0xb0, 0xf9, 0xec, 0xb1, 0x0e, - 0xd0, 0x53, 0x2d, 0xe5, 0x23, 0x75, 0x64, 0xe3, 0x2e, 0x37, 0x8a, 0x8f, 0x82, 0xaa, 0x90, 0x23, - 0xbd, 0xb1, 0x85, 0xbb, 0x1c, 0x8e, 0x73, 0xfb, 0xa8, 0x09, 0x59, 0x7c, 0x8a, 0x47, 0xb6, 0x55, - 0x59, 0xa2, 0xcb, 0xbe, 0x36, 0x8d, 0x8f, 0x90, 0x9f, 0x77, 0x2b, 0x64, 0xb1, 0xbf, 0xfb, 0x7a, - 0x43, 0x64, 0xdc, 0x2f, 0xea, 0x43, 0xcd, 0xc6, 0x43, 0xc3, 0x3e, 0x93, 0xb9, 0x7c, 0xd0, 0x0a, - 0xb9, 0x90, 0x15, 0x28, 0x30, 0x5c, 0x74, 0xf0, 0x1e, 0x62, 0x53, 0x4d, 0x37, 0x35, 0xfb, 0x4c, - 0x2e, 0x0d, 0xf1, 0xd0, 0xd0, 0xf5, 0x81, 0xc2, 0xf6, 0x78, 0x0d, 0xca, 0xc1, 0x8c, 0x03, 0x3d, - 0x03, 0x25, 0x13, 0xdb, 0xaa, 0x36, 0x52, 0x02, 0x89, 0x6c, 0x91, 0x11, 0xd9, 0x9e, 0xda, 0x4f, - 0xe7, 0x04, 0x31, 0xb9, 0x9f, 0xce, 0x25, 0xc5, 0x94, 0x74, 0x44, 0x12, 0xef, 0x88, 0x8c, 0x03, - 0xbd, 0x0a, 0x79, 0x2f, 0x59, 0x11, 0xe8, 0x6c, 0xcf, 0x81, 0xde, 0x3c, 0x5e, 0xe9, 0xd7, 0x82, - 0xa7, 0x32, 0x08, 0xe6, 0x35, 0x20, 0x6b, 0x62, 0x6b, 0x3c, 0x60, 0xf0, 0x5a, 0x79, 0xe7, 0xa5, - 0xf9, 0x72, 0x15, 0x42, 0x1d, 0x0f, 0x6c, 0x99, 0x0b, 0x4b, 0xef, 0x41, 0x96, 0x51, 0x50, 0x01, - 0x96, 0x1e, 0x1e, 0xdc, 0x3f, 0x38, 0x7c, 0xe7, 0x40, 0x4c, 0x20, 0x80, 0x6c, 0xad, 0x5e, 0x6f, - 0x1c, 0xb5, 0x44, 0x01, 0xe5, 0x21, 0x53, 0xdb, 0x3d, 0x94, 0x5b, 0x62, 0x92, 0x90, 0xe5, 0xc6, - 0x7e, 0xa3, 0xde, 0x12, 0x53, 0x68, 0x05, 0x4a, 0xac, 0xad, 0xdc, 0x3b, 0x94, 0xdf, 0xaa, 0xb5, - 0xc4, 0xb4, 0x8f, 0x74, 0xdc, 0x38, 0xb8, 0xdb, 0x90, 0xc5, 0x8c, 0xf4, 0x2f, 0x24, 0xdb, 0x8f, - 0xc9, 0x6e, 0x3c, 0xa4, 0x4e, 0xf0, 0x21, 0x75, 0xd2, 0xe7, 0x49, 0x72, 0x09, 0x88, 0x4b, 0x59, - 0xd0, 0x7e, 0x68, 0xe2, 0x3b, 0x0b, 0xe4, 0x3b, 0xa1, 0xd9, 0x93, 0x8b, 0xad, 0x89, 0x4f, 0xb0, - 0xdd, 0xe9, 0xb3, 0x14, 0x8a, 0x9d, 0x40, 0x25, 0xb9, 0xc4, 0xa9, 0x54, 0xc8, 0x62, 0x6c, 0x1f, - 0xe0, 0x8e, 0xad, 0x30, 0x27, 0xb2, 0xe8, 0xed, 0x32, 0x4f, 0xd8, 0x08, 0xf5, 0x98, 0x11, 0xa5, - 0xf7, 0x17, 0xb2, 0x65, 0x1e, 0x32, 0x72, 0xa3, 0x25, 0xbf, 0x2b, 0xa6, 0x10, 0x82, 0x32, 0x6d, - 0x2a, 0xc7, 0x07, 0xb5, 0xa3, 0xe3, 0xe6, 0x21, 0xb1, 0xe5, 0x2a, 0x2c, 0x3b, 0xb6, 0x74, 0x88, - 0x19, 0xe9, 0x06, 0x5c, 0x8a, 0xc9, 0xb7, 0xa6, 0xef, 0xd8, 0xd2, 0x4f, 0x05, 0x3f, 0x77, 0x30, - 0x67, 0x3a, 0x84, 0xac, 0x65, 0xab, 0xf6, 0xd8, 0xe2, 0x46, 0x7c, 0x75, 0xde, 0x04, 0x6c, 0xcb, - 0x69, 0x1c, 0x53, 0x71, 0x99, 0xab, 0x91, 0x6e, 0x41, 0x39, 0xf8, 0x4b, 0xbc, 0x0d, 0x3c, 0x27, - 0x4a, 0x4a, 0x77, 0x00, 0x4d, 0xe7, 0x65, 0x11, 0x78, 0x83, 0x10, 0x85, 0x37, 0xfc, 0x4c, 0x80, - 0xcb, 0xe7, 0xe4, 0x60, 0xe8, 0xed, 0xd0, 0x24, 0x6f, 0x2f, 0x92, 0xc1, 0x6d, 0x31, 0x5a, 0x68, - 0x9a, 0x37, 0xa1, 0xe8, 0xa7, 0xcf, 0x37, 0xc9, 0xef, 0x92, 0xde, 0x26, 0x0e, 0x02, 0x23, 0xde, - 0x11, 0x28, 0x7c, 0xcf, 0x23, 0xf0, 0x75, 0x00, 0x7b, 0xa2, 0x30, 0xb7, 0x8e, 0xbc, 0xad, 0x73, - 0xc0, 0x19, 0x77, 0x5a, 0x13, 0xbe, 0x09, 0xf2, 0x36, 0x6f, 0x59, 0xe8, 0xd8, 0x8f, 0x12, 0x8d, - 0x69, 0x8c, 0xb5, 0x38, 0x82, 0x32, 0x6f, 0x30, 0xf6, 0xd0, 0x24, 0x46, 0xb6, 0xd0, 0xbb, 0x70, - 0x29, 0x94, 0x28, 0xb8, 0xaa, 0xd3, 0xf3, 0xe6, 0x0b, 0x17, 0x83, 0xf9, 0x82, 0xa3, 0xda, 0x1f, - 0xed, 0x33, 0xc1, 0x68, 0xff, 0x2a, 0xac, 0x45, 0xe7, 0xb9, 0xe8, 0x69, 0x00, 0x3c, 0x22, 0x61, - 0xa1, 0xeb, 0xc1, 0x07, 0x79, 0x4e, 0x69, 0x4d, 0xa4, 0x3d, 0xef, 0xd4, 0x99, 0xce, 0x63, 0xd1, - 0x0d, 0x48, 0xd3, 0xdc, 0x9a, 0x65, 0x3a, 0x97, 0x22, 0x70, 0x10, 0x8a, 0x80, 0x50, 0x26, 0xe9, - 0x57, 0x7e, 0xc7, 0x8c, 0xc0, 0x31, 0xae, 0xc3, 0x8a, 0xf3, 0x25, 0x61, 0x3c, 0x63, 0x99, 0xff, - 0x70, 0xc8, 0x61, 0x0d, 0x74, 0xdf, 0x75, 0x62, 0x56, 0x29, 0xba, 0xb9, 0x48, 0x6e, 0xbc, 0x15, - 0x72, 0xdf, 0xab, 0x90, 0xf5, 0x1c, 0xd7, 0x30, 0xb1, 0x85, 0x47, 0x36, 0x73, 0x5c, 0xb5, 0x4d, - 0xdb, 0x82, 0xf4, 0x2e, 0x80, 0x87, 0xb6, 0x91, 0x13, 0xda, 0xd4, 0xc7, 0xa3, 0x2e, 0xfd, 0xba, - 0x8c, 0xcc, 0x3a, 0xe8, 0x16, 0x64, 0xfc, 0xa8, 0xd0, 0x74, 0x28, 0x23, 0x83, 0xfb, 0xd0, 0x3a, - 0xc6, 0x2d, 0x69, 0x80, 0xa6, 0x2b, 0x1e, 0x31, 0x43, 0xbc, 0x11, 0x1c, 0xe2, 0x6a, 0x6c, 0xed, - 0x24, 0x7a, 0xa8, 0x8f, 0x21, 0x43, 0x77, 0x0e, 0x49, 0x5a, 0x68, 0x99, 0x8d, 0x67, 0xdb, 0xa4, - 0x8d, 0xfe, 0x1b, 0x40, 0xb5, 0x6d, 0x53, 0x6b, 0x8f, 0xbd, 0x01, 0x36, 0xa2, 0x77, 0x5e, 0xcd, - 0xe1, 0xdb, 0xbd, 0xc2, 0xb7, 0xe0, 0x05, 0x4f, 0xd4, 0xb7, 0x0d, 0x7d, 0x0a, 0xa5, 0x03, 0x28, - 0x07, 0x65, 0x9d, 0xfc, 0x90, 0x7d, 0x43, 0x30, 0x3f, 0x64, 0xe9, 0x3e, 0xcf, 0x0f, 0xdd, 0xec, - 0x32, 0xc5, 0x6a, 0x89, 0xb4, 0x23, 0xfd, 0x4f, 0x12, 0x8a, 0xfe, 0x8d, 0xfb, 0x8f, 0x97, 0xc2, - 0x49, 0xff, 0x2f, 0x40, 0xce, 0x9d, 0x7e, 0xb0, 0xb0, 0x18, 0xa8, 0xc4, 0x32, 0xeb, 0x25, 0xfd, - 0xd5, 0x40, 0x56, 0x77, 0x4d, 0xb9, 0x75, 0xd7, 0x3b, 0x6e, 0xfa, 0x10, 0x07, 0xb5, 0xf9, 0x6d, - 0xcd, 0xbd, 0xca, 0xc9, 0x96, 0xee, 0x40, 0xde, 0x3d, 0xfd, 0xc8, 0xa5, 0x2d, 0x08, 0xa2, 0x3a, - 0x5d, 0x5a, 0x13, 0xd6, 0x3f, 0xe2, 0xa5, 0xc6, 0x94, 0xcc, 0x3a, 0x52, 0x17, 0x96, 0x43, 0x47, - 0x27, 0xba, 0x03, 0x4b, 0xc6, 0xb8, 0xad, 0x38, 0xce, 0x11, 0xc2, 0xab, 0x9d, 0xeb, 0xc0, 0xb8, - 0x3d, 0xd0, 0x3a, 0xf7, 0xf1, 0x99, 0xf3, 0x31, 0xc6, 0xb8, 0x7d, 0x9f, 0xf9, 0x10, 0x1b, 0x25, - 0xe9, 0x1f, 0xe5, 0xc7, 0x02, 0xe4, 0x9c, 0x3d, 0x81, 0xfe, 0x0d, 0xf2, 0xee, 0xb1, 0xec, 0xbe, - 0x15, 0x88, 0x3d, 0xcf, 0xb9, 0x7e, 0x4f, 0x04, 0xd5, 0x9c, 0x47, 0x0e, 0x5a, 0x57, 0x39, 0x19, - 0xa8, 0xcc, 0x97, 0xca, 0x41, 0x9b, 0xb1, 0x83, 0x9b, 0xc6, 0xb3, 0xbd, 0xbb, 0xf7, 0x06, 0x6a, - 0x4f, 0x2e, 0x50, 0x99, 0xbd, 0x2e, 0xe9, 0xf0, 0xcc, 0xf8, 0xcf, 0x02, 0x88, 0xe1, 0x1d, 0xfb, - 0xbd, 0xbf, 0x6e, 0x3a, 0x4d, 0x48, 0x45, 0xa4, 0x09, 0x68, 0x1b, 0x56, 0x5d, 0x0e, 0xc5, 0xd2, - 0x7a, 0x23, 0xd5, 0x1e, 0x9b, 0x98, 0x23, 0xfc, 0xc8, 0xfd, 0xe9, 0xd8, 0xf9, 0x65, 0x7a, 0xd6, - 0x99, 0x27, 0x9c, 0xf5, 0x27, 0x49, 0x28, 0xf8, 0xea, 0x0d, 0xe8, 0x5f, 0x7d, 0x87, 0x51, 0x39, - 0x22, 0xb2, 0xfa, 0x78, 0xbd, 0xba, 0x7f, 0xd0, 0x4c, 0xc9, 0xc5, 0xcd, 0x14, 0x57, 0xd5, 0x71, - 0xca, 0x17, 0xe9, 0x85, 0xcb, 0x17, 0x2f, 0x02, 0xb2, 0x75, 0x5b, 0x1d, 0x28, 0xa7, 0xba, 0xad, - 0x8d, 0x7a, 0x0a, 0x73, 0x43, 0x76, 0x74, 0x88, 0xf4, 0x97, 0x47, 0xf4, 0x87, 0x23, 0xea, 0x91, - 0xff, 0x2b, 0x40, 0xce, 0xbd, 0xb6, 0x2c, 0xfa, 0x2a, 0x60, 0x0d, 0xb2, 0x3c, 0x33, 0x67, 0xcf, - 0x02, 0x78, 0x2f, 0xb2, 0x4e, 0x53, 0x85, 0xdc, 0x10, 0xdb, 0x2a, 0x3d, 0x07, 0x59, 0x56, 0xe0, - 0xf6, 0xaf, 0xdf, 0x86, 0x82, 0xef, 0x45, 0x05, 0x39, 0x1a, 0x0f, 0x1a, 0xef, 0x88, 0x89, 0xea, - 0xd2, 0xa7, 0x5f, 0x6c, 0xa6, 0x0e, 0xf0, 0x47, 0x64, 0x37, 0xcb, 0x8d, 0x7a, 0xb3, 0x51, 0xbf, - 0x2f, 0x0a, 0xd5, 0xc2, 0xa7, 0x5f, 0x6c, 0x2e, 0xc9, 0x98, 0x62, 0xd5, 0xd7, 0xef, 0xc3, 0x72, - 0x68, 0x61, 0x82, 0x69, 0x1f, 0x82, 0xf2, 0xdd, 0x87, 0x47, 0x0f, 0xf6, 0xea, 0xb5, 0x56, 0x43, - 0x79, 0x74, 0xd8, 0x6a, 0x88, 0x02, 0xba, 0x04, 0xab, 0x0f, 0xf6, 0xde, 0x6c, 0xb6, 0x94, 0xfa, - 0x83, 0xbd, 0xc6, 0x41, 0x4b, 0xa9, 0xb5, 0x5a, 0xb5, 0xfa, 0x7d, 0x31, 0xb9, 0xf3, 0xa7, 0x12, - 0xa4, 0x6b, 0xbb, 0xf5, 0x3d, 0x54, 0x87, 0x34, 0x85, 0x92, 0xce, 0x7d, 0x69, 0x5a, 0x3d, 0xbf, - 0xea, 0x80, 0xee, 0x41, 0x86, 0xa2, 0x4c, 0xe8, 0xfc, 0xa7, 0xa7, 0xd5, 0x19, 0x65, 0x08, 0xf2, - 0x31, 0x74, 0x47, 0x9e, 0xfb, 0x16, 0xb5, 0x7a, 0x7e, 0x55, 0x02, 0x3d, 0x80, 0x25, 0x07, 0x64, - 0x98, 0xf5, 0x40, 0xb4, 0x3a, 0xb3, 0x54, 0x40, 0xa6, 0xc6, 0xc0, 0x9a, 0xf3, 0x9f, 0xa9, 0x56, - 0x67, 0xd4, 0x2b, 0xd0, 0x1e, 0x64, 0xf9, 0x75, 0x7e, 0xc6, 0xcb, 0xd3, 0xea, 0xac, 0x0a, 0x04, - 0x92, 0x21, 0xef, 0xc1, 0x60, 0xb3, 0x1f, 0xdf, 0x56, 0xe7, 0x28, 0xc5, 0xa0, 0xf7, 0xa0, 0x14, - 0x84, 0x0a, 0xe6, 0x7b, 0xdd, 0x5a, 0x9d, 0xb3, 0xd6, 0x41, 0xf4, 0x07, 0x71, 0x83, 0xf9, 0x5e, - 0xbb, 0x56, 0xe7, 0x2c, 0x7d, 0xa0, 0x0f, 0x60, 0x65, 0xfa, 0x5e, 0x3f, 0xff, 0xe3, 0xd7, 0xea, - 0x02, 0xc5, 0x10, 0x34, 0x04, 0x14, 0x81, 0x07, 0x2c, 0xf0, 0x16, 0xb6, 0xba, 0x48, 0x6d, 0x04, - 0x75, 0x61, 0x39, 0x7c, 0xc9, 0x9e, 0xf7, 0x6d, 0x6c, 0x75, 0xee, 0x3a, 0x09, 0x1b, 0x25, 0x78, - 0x39, 0x9f, 0xf7, 0xad, 0x6c, 0x75, 0xee, 0xb2, 0x09, 0x7a, 0x08, 0xe0, 0xbb, 0x5f, 0xcf, 0xf1, - 0x76, 0xb6, 0x3a, 0x4f, 0x01, 0x05, 0x19, 0xb0, 0x1a, 0x75, 0xf1, 0x5e, 0xe4, 0x29, 0x6d, 0x75, - 0xa1, 0xba, 0x0a, 0xf1, 0xe7, 0xe0, 0x15, 0x7a, 0xbe, 0xa7, 0xb5, 0xd5, 0x39, 0x0b, 0x2c, 0x48, - 0x85, 0x72, 0xe8, 0xda, 0x38, 0xe7, 0x4b, 0xdb, 0xea, 0xbc, 0xf5, 0x16, 0xe2, 0xc6, 0x11, 0x17, - 0xcc, 0x05, 0x1e, 0xde, 0x56, 0x17, 0xa9, 0xc0, 0xd0, 0x35, 0x8a, 0xb8, 0x83, 0x2e, 0xf2, 0x0e, - 0xb7, 0xba, 0x50, 0x41, 0x66, 0xb7, 0xf6, 0xe5, 0x37, 0xeb, 0xc2, 0x57, 0xdf, 0xac, 0x0b, 0x7f, - 0xfc, 0x66, 0x5d, 0xf8, 0xec, 0xdb, 0xf5, 0xc4, 0x57, 0xdf, 0xae, 0x27, 0x7e, 0xff, 0xed, 0x7a, - 0xe2, 0x3f, 0x9e, 0xef, 0x69, 0x76, 0x7f, 0xdc, 0xde, 0xea, 0xe8, 0xc3, 0xed, 0x8e, 0x3e, 0xc4, - 0x76, 0xfb, 0xc4, 0xf6, 0x1a, 0xde, 0x9f, 0x50, 0xda, 0x59, 0x9a, 0x85, 0xdc, 0xfc, 0x6b, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xe9, 0xdb, 0x7e, 0x69, 0xa4, 0x32, 0x00, 0x00, + // 3503 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcb, 0x73, 0x1b, 0xc7, + 0xd1, 0xc7, 0xe2, 0x45, 0xa0, 0xf1, 0xe0, 0x72, 0x48, 0x49, 0x10, 0x24, 0x91, 0xd4, 0xba, 0x6c, + 0xcb, 0x92, 0x4d, 0xfa, 0x93, 0x3e, 0xd9, 0x56, 0xc9, 0xfe, 0xaa, 0x48, 0x08, 0x12, 0x48, 0xc9, + 0x24, 0xbd, 0x84, 0xe4, 0x4f, 0xdf, 0xc3, 0xeb, 0x05, 0x30, 0x00, 0xd6, 0x02, 0xb0, 0xeb, 0xdd, + 0x05, 0x0d, 0xfa, 0x94, 0x8a, 0x93, 0xaa, 0x94, 0x4f, 0xae, 0xca, 0xc5, 0x87, 0xf8, 0x90, 0x43, + 0x0e, 0xc9, 0x5f, 0x90, 0x54, 0xaa, 0x72, 0xca, 0xc1, 0x87, 0x1c, 0x7c, 0xcc, 0xc9, 0x49, 0x59, + 0x37, 0x57, 0xe5, 0x94, 0x43, 0xae, 0xa9, 0x79, 0xec, 0x0b, 0xd8, 0xc5, 0x43, 0x76, 0x0e, 0xa9, + 0xe4, 0xb6, 0xd3, 0xe8, 0xee, 0x99, 0xe9, 0xe9, 0x99, 0xee, 0xf9, 0xf5, 0x00, 0x2e, 0xd8, 0x78, + 0xd0, 0xc2, 0x66, 0x5f, 0x1b, 0xd8, 0xdb, 0x6a, 0xa3, 0xa9, 0x6d, 0xdb, 0xa7, 0x06, 0xb6, 0xb6, + 0x0c, 0x53, 0xb7, 0x75, 0xb4, 0xec, 0xfd, 0xb8, 0x45, 0x7e, 0x2c, 0x5f, 0xf2, 0x71, 0x37, 0xcd, + 0x53, 0xc3, 0xd6, 0xb7, 0x0d, 0x53, 0xd7, 0xdb, 0x8c, 0xbf, 0x7c, 0x71, 0xf2, 0xe7, 0x27, 0xf8, + 0x94, 0x6b, 0x0b, 0x08, 0xd3, 0x5e, 0xb6, 0x0d, 0xd5, 0x54, 0xfb, 0xce, 0xcf, 0x9b, 0x13, 0x3f, + 0x9f, 0xa8, 0x3d, 0xad, 0xa5, 0xda, 0xba, 0xc9, 0x39, 0x36, 0x3a, 0xba, 0xde, 0xe9, 0xe1, 0x6d, + 0xda, 0x6a, 0x0c, 0xdb, 0xdb, 0xb6, 0xd6, 0xc7, 0x96, 0xad, 0xf6, 0x0d, 0xce, 0xb0, 0xd6, 0xd1, + 0x3b, 0x3a, 0xfd, 0xdc, 0x26, 0x5f, 0x21, 0xfd, 0xea, 0xa6, 0xda, 0xec, 0x61, 0xff, 0x24, 0xa5, + 0xa7, 0x39, 0x58, 0x92, 0xf1, 0x87, 0x43, 0x6c, 0xd9, 0xe8, 0x3a, 0x24, 0x71, 0xb3, 0xab, 0x97, + 0x84, 0x4d, 0xe1, 0x4a, 0xee, 0xfa, 0xc5, 0xad, 0xb1, 0xf9, 0x6f, 0x71, 0xbe, 0x6a, 0xb3, 0xab, + 0xd7, 0x62, 0x32, 0xe5, 0x45, 0x37, 0x21, 0xd5, 0xee, 0x0d, 0xad, 0x6e, 0x29, 0x4e, 0x85, 0x2e, + 0x45, 0x09, 0xdd, 0x25, 0x4c, 0xb5, 0x98, 0xcc, 0xb8, 0x49, 0x57, 0xda, 0xa0, 0xad, 0x97, 0x12, + 0xd3, 0xbb, 0xda, 0x1b, 0xb4, 0x69, 0x57, 0x84, 0x17, 0xed, 0x02, 0x68, 0x03, 0xcd, 0x56, 0x9a, + 0x5d, 0x55, 0x1b, 0x94, 0x52, 0x54, 0xf2, 0x72, 0xb4, 0xa4, 0x66, 0x57, 0x08, 0x63, 0x2d, 0x26, + 0x67, 0x35, 0xa7, 0x41, 0x86, 0xfb, 0xe1, 0x10, 0x9b, 0xa7, 0xa5, 0xf4, 0xf4, 0xe1, 0xbe, 0x43, + 0x98, 0xc8, 0x70, 0x29, 0x37, 0x7a, 0x13, 0x32, 0xcd, 0x2e, 0x6e, 0x3e, 0x51, 0xec, 0x51, 0x29, + 0x43, 0x25, 0x37, 0xa2, 0x24, 0x2b, 0x84, 0xaf, 0x3e, 0xaa, 0xc5, 0xe4, 0xa5, 0x26, 0xfb, 0x44, + 0x6f, 0x40, 0xba, 0xa9, 0xf7, 0xfb, 0x9a, 0x5d, 0xca, 0x51, 0xd9, 0xf5, 0x48, 0x59, 0xca, 0x55, + 0x8b, 0xc9, 0x9c, 0x1f, 0x1d, 0x40, 0xb1, 0xa7, 0x59, 0xb6, 0x62, 0x0d, 0x54, 0xc3, 0xea, 0xea, + 0xb6, 0x55, 0xca, 0x53, 0x0d, 0xcf, 0x47, 0x69, 0x78, 0xa0, 0x59, 0xf6, 0xb1, 0xc3, 0x5c, 0x8b, + 0xc9, 0x85, 0x9e, 0x9f, 0x40, 0xf4, 0xe9, 0xed, 0x36, 0x36, 0x5d, 0x85, 0xa5, 0xc2, 0x74, 0x7d, + 0x87, 0x84, 0xdb, 0x91, 0x27, 0xfa, 0x74, 0x3f, 0x01, 0xfd, 0x2f, 0xac, 0xf6, 0x74, 0xb5, 0xe5, + 0xaa, 0x53, 0x9a, 0xdd, 0xe1, 0xe0, 0x49, 0xa9, 0x48, 0x95, 0xbe, 0x14, 0x39, 0x48, 0x5d, 0x6d, + 0x39, 0x2a, 0x2a, 0x44, 0xa0, 0x16, 0x93, 0x57, 0x7a, 0xe3, 0x44, 0xf4, 0x1e, 0xac, 0xa9, 0x86, + 0xd1, 0x3b, 0x1d, 0xd7, 0xbe, 0x4c, 0xb5, 0x5f, 0x8d, 0xd2, 0xbe, 0x43, 0x64, 0xc6, 0xd5, 0x23, + 0x75, 0x82, 0x8a, 0xea, 0x20, 0x1a, 0x26, 0x36, 0x54, 0x13, 0x2b, 0x86, 0xa9, 0x1b, 0xba, 0xa5, + 0xf6, 0x4a, 0x22, 0xd5, 0xfd, 0x62, 0x94, 0xee, 0x23, 0xc6, 0x7f, 0xc4, 0xd9, 0x6b, 0x31, 0x79, + 0xd9, 0x08, 0x92, 0x98, 0x56, 0xbd, 0x89, 0x2d, 0xcb, 0xd3, 0xba, 0x32, 0x4b, 0x2b, 0xe5, 0x0f, + 0x6a, 0x0d, 0x90, 0x50, 0x15, 0x72, 0x78, 0x44, 0xc4, 0x95, 0x13, 0xdd, 0xc6, 0x25, 0x44, 0x15, + 0x4a, 0x91, 0x3b, 0x94, 0xb2, 0x3e, 0xd2, 0x6d, 0x5c, 0x8b, 0xc9, 0x80, 0xdd, 0x16, 0x52, 0xe1, + 0xcc, 0x09, 0x36, 0xb5, 0xf6, 0x29, 0x55, 0xa3, 0xd0, 0x5f, 0x2c, 0x4d, 0x1f, 0x94, 0x56, 0xa9, + 0xc2, 0x6b, 0x51, 0x0a, 0x1f, 0x51, 0x21, 0xa2, 0xa2, 0xea, 0x88, 0xd4, 0x62, 0xf2, 0xea, 0xc9, + 0x24, 0x99, 0xb8, 0x58, 0x5b, 0x1b, 0xa8, 0x3d, 0xed, 0x63, 0xac, 0x34, 0x7a, 0x7a, 0xf3, 0x49, + 0x69, 0x6d, 0xba, 0x8b, 0xdd, 0xe5, 0xdc, 0xbb, 0x84, 0x99, 0xb8, 0x58, 0xdb, 0x4f, 0x40, 0x18, + 0xce, 0x35, 0x4d, 0xac, 0xda, 0x58, 0x61, 0xa7, 0x97, 0x62, 0x62, 0x6b, 0xd8, 0xb3, 0xc9, 0x4e, + 0x3c, 0x43, 0x15, 0xbf, 0x1c, 0xb9, 0x9b, 0xa8, 0xd8, 0x21, 0x95, 0x92, 0xa9, 0x10, 0xdd, 0x96, + 0x6b, 0xcd, 0x10, 0x3a, 0xfa, 0x6f, 0x40, 0x6d, 0x6c, 0x37, 0xbb, 0x4e, 0x2f, 0xc4, 0x3e, 0x56, + 0xe9, 0x2c, 0xed, 0xe1, 0x4a, 0xe4, 0xd0, 0x89, 0x04, 0x53, 0x44, 0x8c, 0x40, 0x36, 0x9c, 0xd8, + 0x1e, 0xa3, 0x51, 0x9b, 0xb3, 0xa3, 0x1c, 0x07, 0x95, 0x9f, 0x9b, 0x61, 0x73, 0x2e, 0x14, 0xd4, + 0xbf, 0x7a, 0x32, 0x49, 0xde, 0x5d, 0x82, 0xd4, 0x89, 0xda, 0x1b, 0xe2, 0xfd, 0x64, 0x26, 0x29, + 0xa6, 0xf6, 0x93, 0x99, 0x25, 0x31, 0xb3, 0x9f, 0xcc, 0x64, 0x45, 0xd8, 0x4f, 0x66, 0x40, 0xcc, + 0x49, 0x2f, 0x42, 0xce, 0x77, 0x78, 0xa3, 0x12, 0x2c, 0xf5, 0xb1, 0x65, 0xa9, 0x1d, 0x4c, 0xcf, + 0xfa, 0xac, 0xec, 0x34, 0xa5, 0x22, 0xe4, 0xfd, 0x07, 0xb6, 0xf4, 0x99, 0xe0, 0x4a, 0x92, 0xb3, + 0x98, 0x48, 0x9e, 0x60, 0x93, 0xba, 0x0c, 0x97, 0xe4, 0x4d, 0xf4, 0x1c, 0x14, 0xe8, 0x72, 0x2b, + 0xce, 0xef, 0x24, 0x20, 0x24, 0xe5, 0x3c, 0x25, 0x3e, 0xe2, 0x4c, 0x1b, 0x90, 0x33, 0xae, 0x1b, + 0x2e, 0x4b, 0x82, 0xb2, 0x80, 0x71, 0xdd, 0x70, 0x18, 0x2e, 0x43, 0x9e, 0xd8, 0xc0, 0xe5, 0x48, + 0xd2, 0x4e, 0x72, 0x84, 0xc6, 0x59, 0xa4, 0x3f, 0xc4, 0x41, 0x1c, 0x3f, 0xe4, 0xd1, 0x1b, 0x90, + 0x24, 0xe1, 0x90, 0x87, 0xae, 0xf2, 0x16, 0x8b, 0x95, 0x5b, 0x4e, 0xac, 0xdc, 0xaa, 0x3b, 0xb1, + 0x72, 0x37, 0xf3, 0xe5, 0xd7, 0x1b, 0xb1, 0xcf, 0xfe, 0xb4, 0x21, 0xc8, 0x54, 0x02, 0x9d, 0x27, + 0x47, 0xbb, 0xaa, 0x0d, 0x14, 0xad, 0x45, 0x87, 0x9c, 0x25, 0xe7, 0xb6, 0xaa, 0x0d, 0xf6, 0x5a, + 0xe8, 0x01, 0x88, 0x4d, 0x7d, 0x60, 0xe1, 0x81, 0x35, 0xb4, 0x14, 0x16, 0xad, 0x79, 0xc0, 0x0a, + 0x84, 0x1d, 0x16, 0x4e, 0x2b, 0x0e, 0xe7, 0x11, 0x65, 0x94, 0x97, 0x9b, 0x41, 0x02, 0xba, 0x0b, + 0xe0, 0x86, 0x74, 0xab, 0x94, 0xdc, 0x4c, 0x5c, 0xc9, 0x5d, 0xdf, 0x9c, 0x58, 0xfc, 0x47, 0x0e, + 0xcb, 0x43, 0x83, 0xac, 0xf2, 0x6e, 0x92, 0x0c, 0x57, 0xf6, 0x49, 0xa2, 0x17, 0x60, 0x59, 0x35, + 0x0c, 0xc5, 0xb2, 0x89, 0x43, 0x35, 0x4e, 0x89, 0x27, 0x91, 0x58, 0x98, 0x97, 0x0b, 0xaa, 0x61, + 0x1c, 0x13, 0xea, 0x2e, 0x21, 0xa2, 0xe7, 0xa1, 0x48, 0xe2, 0x9e, 0xa6, 0xf6, 0x94, 0x2e, 0xd6, + 0x3a, 0x5d, 0x9b, 0xc6, 0xbc, 0x84, 0x5c, 0xe0, 0xd4, 0x1a, 0x25, 0x4a, 0x2d, 0x77, 0xc5, 0x69, + 0xcc, 0x43, 0x08, 0x92, 0x2d, 0xd5, 0x56, 0xa9, 0x25, 0xf3, 0x32, 0xfd, 0x26, 0x34, 0x43, 0xb5, + 0xbb, 0xdc, 0x3e, 0xf4, 0x1b, 0x9d, 0x85, 0x34, 0x57, 0x9b, 0xa0, 0x6a, 0x79, 0x0b, 0xad, 0x41, + 0xca, 0x30, 0xf5, 0x13, 0x4c, 0x97, 0x2e, 0x23, 0xb3, 0x86, 0x24, 0x43, 0x31, 0x18, 0x1f, 0x51, + 0x11, 0xe2, 0xf6, 0x88, 0xf7, 0x12, 0xb7, 0x47, 0xe8, 0x55, 0x48, 0x12, 0x43, 0xd2, 0x3e, 0x8a, + 0x21, 0x19, 0x01, 0x97, 0xab, 0x9f, 0x1a, 0x58, 0xa6, 0x9c, 0xd2, 0x32, 0x14, 0x02, 0x71, 0x53, + 0x3a, 0x0b, 0x6b, 0x61, 0x61, 0x50, 0xea, 0xba, 0xf4, 0x40, 0x38, 0x43, 0x37, 0x21, 0xe3, 0xc6, + 0x41, 0xe6, 0x38, 0xe7, 0x27, 0xba, 0x75, 0x98, 0x65, 0x97, 0x95, 0x78, 0x0c, 0x59, 0x80, 0xae, + 0xca, 0xb3, 0x9e, 0xbc, 0xbc, 0xa4, 0x1a, 0x46, 0x4d, 0xb5, 0xba, 0xd2, 0xfb, 0x50, 0x8a, 0x8a, + 0x71, 0x3e, 0x83, 0x09, 0xd4, 0xed, 0x1d, 0x83, 0x9d, 0x85, 0x74, 0x5b, 0x37, 0xfb, 0xaa, 0x4d, + 0x95, 0x15, 0x64, 0xde, 0x22, 0x86, 0x64, 0xf1, 0x2e, 0x41, 0xc9, 0xac, 0x21, 0x29, 0x70, 0x3e, + 0x32, 0xce, 0x11, 0x11, 0x6d, 0xd0, 0xc2, 0xcc, 0xac, 0x05, 0x99, 0x35, 0x3c, 0x45, 0x6c, 0xb0, + 0xac, 0x41, 0xba, 0xb5, 0xe8, 0x5c, 0xa9, 0xfe, 0xac, 0xcc, 0x5b, 0xd2, 0xe7, 0x09, 0x38, 0x1b, + 0x1e, 0xed, 0xd0, 0x26, 0xe4, 0xfb, 0xea, 0x48, 0xb1, 0x47, 0xdc, 0xed, 0x04, 0xba, 0xf0, 0xd0, + 0x57, 0x47, 0xf5, 0x11, 0xf3, 0x39, 0x11, 0x12, 0xf6, 0xc8, 0x2a, 0xc5, 0x37, 0x13, 0x57, 0xf2, + 0x32, 0xf9, 0x44, 0x0f, 0x61, 0xa5, 0xa7, 0x37, 0xd5, 0x9e, 0xd2, 0x53, 0x2d, 0x5b, 0xe1, 0x69, + 0x10, 0xdb, 0x44, 0xcf, 0x4d, 0x18, 0x9b, 0xc5, 0x2d, 0xdc, 0x62, 0xeb, 0x49, 0x0e, 0x1c, 0xee, + 0xff, 0xcb, 0x54, 0xc7, 0x03, 0xd5, 0x59, 0x6a, 0x74, 0x07, 0x72, 0x7d, 0xcd, 0x6a, 0xe0, 0xae, + 0x7a, 0xa2, 0xe9, 0x26, 0xdf, 0x4d, 0x93, 0x4e, 0xf3, 0xb6, 0xc7, 0xc3, 0x35, 0xf9, 0xc5, 0x7c, + 0x4b, 0x92, 0x0a, 0xf8, 0xb0, 0x73, 0x9a, 0xa4, 0x17, 0x3e, 0x4d, 0x5e, 0x85, 0xb5, 0x01, 0x1e, + 0xd9, 0x8a, 0xb7, 0x5f, 0x99, 0x9f, 0x2c, 0x51, 0xd3, 0x23, 0xf2, 0x9b, 0xbb, 0xc3, 0x2d, 0xe2, + 0x32, 0xe8, 0x25, 0x9a, 0x2f, 0x18, 0xba, 0x85, 0x4d, 0x45, 0x6d, 0xb5, 0x4c, 0x6c, 0x59, 0x34, + 0xc5, 0xcc, 0xd3, 0x24, 0x80, 0xd2, 0x77, 0x18, 0x59, 0xfa, 0x89, 0x7f, 0x69, 0x82, 0xf9, 0x01, + 0x37, 0xbc, 0xe0, 0x19, 0xfe, 0x18, 0xd6, 0xb8, 0x7c, 0x2b, 0x60, 0x7b, 0x96, 0xa7, 0x5f, 0x98, + 0xdc, 0x5f, 0xe3, 0x36, 0x47, 0x8e, 0x78, 0xb4, 0xd9, 0x13, 0xcf, 0x66, 0x76, 0x04, 0x49, 0x6a, + 0x94, 0x24, 0x3b, 0x62, 0xc8, 0xf7, 0x3f, 0xdb, 0x52, 0x7c, 0x92, 0x80, 0x95, 0x89, 0x64, 0xcb, + 0x9d, 0x98, 0x10, 0x3a, 0xb1, 0x78, 0xe8, 0xc4, 0x12, 0x0b, 0x4f, 0x8c, 0xaf, 0x75, 0x72, 0xf6, + 0x5a, 0xa7, 0xbe, 0xc7, 0xb5, 0x4e, 0x3f, 0xdb, 0x5a, 0xff, 0x43, 0x57, 0xe1, 0x67, 0x02, 0x94, + 0xa3, 0x33, 0xd4, 0xd0, 0xe5, 0xb8, 0x06, 0x2b, 0xee, 0x50, 0x5c, 0xf5, 0xec, 0x60, 0x14, 0xdd, + 0x1f, 0xb8, 0xfe, 0xc8, 0x18, 0xf7, 0x3c, 0x14, 0xc7, 0xf2, 0x67, 0xe6, 0xca, 0x85, 0x13, 0x7f, + 0xff, 0xd2, 0x8f, 0x12, 0x6e, 0xe0, 0x09, 0x24, 0xb9, 0x21, 0xbb, 0xf5, 0x1d, 0x58, 0x6d, 0xe1, + 0xa6, 0xd6, 0x7a, 0xd6, 0xcd, 0xba, 0xc2, 0xa5, 0xff, 0xbd, 0x57, 0x27, 0xbd, 0xe4, 0x97, 0x02, + 0x5c, 0x98, 0x72, 0x25, 0x08, 0x55, 0x25, 0x84, 0xaa, 0x42, 0xf7, 0xa0, 0xd8, 0xd1, 0x2d, 0x4b, + 0x33, 0x70, 0x8b, 0x27, 0xf1, 0xf1, 0xc9, 0x3c, 0x8e, 0x25, 0xf9, 0x5b, 0xf7, 0x38, 0x23, 0x4d, + 0xd1, 0xe5, 0x42, 0xc7, 0xdf, 0x8c, 0xf2, 0x2c, 0xe9, 0x3c, 0x9c, 0x8b, 0xb8, 0x5b, 0x48, 0xb7, + 0x3c, 0x5f, 0x9f, 0xbc, 0x02, 0xa0, 0x0b, 0x90, 0xe5, 0x97, 0x0b, 0x37, 0xab, 0xca, 0x30, 0x42, + 0x7d, 0x24, 0xfd, 0x36, 0x0f, 0x19, 0x19, 0x5b, 0x06, 0xc9, 0x48, 0xd1, 0x2e, 0x64, 0xf1, 0xa8, + 0x89, 0x0d, 0xdb, 0x49, 0xe2, 0xc3, 0x2f, 0x92, 0x8c, 0xbb, 0xea, 0x70, 0xd6, 0x62, 0xb2, 0x27, + 0x86, 0x6e, 0x70, 0xa4, 0x28, 0x1a, 0xf4, 0xe1, 0xe2, 0x7e, 0xa8, 0xe8, 0x35, 0x07, 0x2a, 0x4a, + 0x44, 0xa2, 0x20, 0x4c, 0x6a, 0x0c, 0x2b, 0xba, 0xc1, 0xb1, 0xa2, 0xe4, 0x8c, 0xce, 0x02, 0x60, + 0x51, 0x25, 0x00, 0x16, 0xa5, 0x67, 0x4c, 0x33, 0x02, 0x2d, 0x7a, 0xcd, 0x41, 0x8b, 0x96, 0x66, + 0x8c, 0x78, 0x0c, 0x2e, 0x7a, 0xcb, 0x07, 0x17, 0x65, 0xa9, 0xe8, 0x66, 0xa4, 0x68, 0x08, 0x5e, + 0x74, 0xcb, 0xc5, 0x8b, 0xf2, 0x91, 0x58, 0x13, 0x17, 0x1e, 0x07, 0x8c, 0x0e, 0x27, 0x00, 0x23, + 0x06, 0xf0, 0xbc, 0x10, 0xa9, 0x62, 0x06, 0x62, 0x74, 0x38, 0x81, 0x18, 0x15, 0x67, 0x28, 0x9c, + 0x01, 0x19, 0xfd, 0x5f, 0x38, 0x64, 0x14, 0x0d, 0xea, 0xf0, 0x61, 0xce, 0x87, 0x19, 0x29, 0x11, + 0x98, 0x91, 0x18, 0x79, 0xd7, 0x66, 0xea, 0xe7, 0x06, 0x8d, 0x1e, 0x86, 0x80, 0x46, 0x2b, 0x91, + 0x28, 0x01, 0x53, 0x3e, 0x07, 0x6a, 0xf4, 0x30, 0x04, 0x35, 0x42, 0x33, 0xd5, 0xce, 0x84, 0x8d, + 0xee, 0x06, 0x61, 0xa3, 0xd5, 0x88, 0xbc, 0xdb, 0xdb, 0xed, 0x11, 0xb8, 0x51, 0x23, 0x0a, 0x37, + 0x5a, 0x8b, 0x84, 0x60, 0x98, 0xc6, 0x05, 0x80, 0xa3, 0xc3, 0x09, 0xe0, 0xe8, 0xcc, 0x0c, 0x4f, + 0x9b, 0x81, 0x1c, 0xb5, 0xa3, 0x91, 0x23, 0x86, 0xeb, 0xbc, 0x12, 0xbd, 0xaf, 0x16, 0x81, 0x8e, + 0x1e, 0x87, 0x42, 0x47, 0xe7, 0x22, 0x31, 0x50, 0x3e, 0xf8, 0x79, 0xb0, 0xa3, 0x46, 0x14, 0x76, + 0x54, 0x9a, 0x65, 0xf7, 0x67, 0x02, 0x8f, 0x52, 0x62, 0x7a, 0x3f, 0x99, 0xc9, 0x88, 0x59, 0x06, + 0x1b, 0xed, 0x27, 0x33, 0x39, 0x31, 0x2f, 0xbd, 0x44, 0x52, 0xdd, 0xb1, 0x70, 0x40, 0x2e, 0x95, + 0xd8, 0x34, 0x75, 0x93, 0xc3, 0x40, 0xac, 0x21, 0x5d, 0x81, 0xbc, 0xff, 0xe8, 0x9f, 0x02, 0x34, + 0xd1, 0xcb, 0xbb, 0xef, 0xb8, 0x97, 0x7e, 0x2d, 0x78, 0xb2, 0x14, 0x6a, 0xf2, 0x03, 0x11, 0x59, + 0x0e, 0x44, 0xf8, 0xe0, 0xa7, 0x78, 0x10, 0x7e, 0xda, 0x80, 0x1c, 0xb9, 0x94, 0x8f, 0x21, 0x4b, + 0xaa, 0xe1, 0x22, 0x4b, 0x57, 0x61, 0x85, 0x66, 0x56, 0x0c, 0xa4, 0xe2, 0xc1, 0x37, 0x49, 0x83, + 0xef, 0x32, 0xf9, 0x81, 0x39, 0x11, 0x4b, 0x64, 0x5e, 0x81, 0x55, 0x1f, 0xaf, 0x7b, 0xd9, 0x67, + 0x30, 0x8b, 0xe8, 0x72, 0xef, 0xf0, 0x5b, 0xff, 0xef, 0x05, 0xcf, 0x42, 0x1e, 0x24, 0x15, 0x86, + 0x1e, 0x09, 0xdf, 0x13, 0x7a, 0x14, 0x7f, 0x66, 0xf4, 0xc8, 0x0f, 0x5e, 0x24, 0x82, 0xe0, 0xc5, + 0xdf, 0x04, 0x6f, 0x4d, 0x5c, 0x2c, 0xa8, 0xa9, 0xb7, 0x30, 0x87, 0x13, 0xe8, 0x37, 0xc9, 0x5d, + 0x7b, 0x7a, 0x87, 0x83, 0x06, 0xe4, 0x93, 0x70, 0xb9, 0xf1, 0x39, 0xcb, 0xc3, 0xaf, 0x8b, 0x44, + 0xb0, 0x0c, 0x91, 0x23, 0x11, 0x22, 0x24, 0x9e, 0x60, 0x56, 0x7b, 0xc9, 0xcb, 0xe4, 0x93, 0xf0, + 0x51, 0xe7, 0xe3, 0x99, 0x1e, 0x6b, 0xa0, 0x37, 0x20, 0x4b, 0x0b, 0x6b, 0x8a, 0x6e, 0x58, 0xbc, + 0xde, 0x12, 0xc8, 0x81, 0x59, 0x75, 0x6d, 0xeb, 0x88, 0xf0, 0x1c, 0x1a, 0x96, 0x9c, 0x31, 0xf8, + 0x97, 0x2f, 0xaf, 0xca, 0x06, 0x52, 0xd3, 0x8b, 0x90, 0x25, 0xa3, 0xb7, 0x0c, 0xb5, 0x89, 0x4b, + 0x40, 0x07, 0xea, 0x11, 0xa4, 0x5f, 0xc5, 0x61, 0x79, 0x2c, 0x1e, 0x87, 0xce, 0xdd, 0x71, 0xc9, + 0xb8, 0x0f, 0x1b, 0x9b, 0xcf, 0x1e, 0xeb, 0x00, 0x1d, 0xd5, 0x52, 0x3e, 0x52, 0x07, 0x36, 0x6e, + 0x71, 0xa3, 0xf8, 0x28, 0xa8, 0x0c, 0x19, 0xd2, 0x1a, 0x5a, 0xb8, 0xc5, 0x61, 0x3a, 0xb7, 0x8d, + 0x6a, 0x90, 0xc6, 0x27, 0x78, 0x60, 0x5b, 0xa5, 0x25, 0xba, 0xec, 0x67, 0x27, 0x71, 0x13, 0xf2, + 0xf3, 0x6e, 0x89, 0x2c, 0xf6, 0xb7, 0x5f, 0x6f, 0x88, 0x8c, 0xfb, 0x65, 0xbd, 0xaf, 0xd9, 0xb8, + 0x6f, 0xd8, 0xa7, 0x32, 0x97, 0x0f, 0x5a, 0x21, 0x33, 0x66, 0x05, 0x0a, 0x18, 0xe7, 0x1d, 0x1c, + 0x88, 0xd8, 0x54, 0xd3, 0x4d, 0xcd, 0x3e, 0x95, 0x0b, 0x7d, 0xdc, 0x37, 0x74, 0xbd, 0xa7, 0xb0, + 0x3d, 0xbe, 0x03, 0xc5, 0x60, 0xfa, 0x81, 0x9e, 0x83, 0x82, 0x89, 0x6d, 0x55, 0x1b, 0x28, 0x81, + 0x9c, 0x36, 0xcf, 0x88, 0x6c, 0x4f, 0xed, 0x27, 0x33, 0x82, 0x18, 0xdf, 0x4f, 0x66, 0xe2, 0x62, + 0x42, 0x3a, 0x82, 0x33, 0xa1, 0xe9, 0x07, 0x7a, 0x1d, 0xb2, 0x5e, 0xe6, 0x22, 0xd0, 0xd9, 0x4e, + 0x81, 0xe4, 0x3c, 0x5e, 0xe9, 0x77, 0x82, 0xa7, 0x32, 0x08, 0xf2, 0x55, 0x21, 0xcd, 0xce, 0x7d, + 0xba, 0x92, 0xc5, 0x29, 0x87, 0x7e, 0x40, 0x6e, 0x8b, 0x1d, 0xef, 0x32, 0x17, 0x96, 0xde, 0x83, + 0x34, 0xa3, 0xa0, 0x1c, 0x2c, 0x3d, 0x3c, 0xb8, 0x7f, 0x70, 0xf8, 0xee, 0x81, 0x18, 0x43, 0x00, + 0xe9, 0x9d, 0x4a, 0xa5, 0x7a, 0x54, 0x17, 0x05, 0x94, 0x85, 0xd4, 0xce, 0xee, 0xa1, 0x5c, 0x17, + 0xe3, 0x84, 0x2c, 0x57, 0xf7, 0xab, 0x95, 0xba, 0x98, 0x40, 0x2b, 0x50, 0x60, 0xdf, 0xca, 0xdd, + 0x43, 0xf9, 0xed, 0x9d, 0xba, 0x98, 0xf4, 0x91, 0x8e, 0xab, 0x07, 0x77, 0xaa, 0xb2, 0x98, 0x92, + 0xfe, 0x03, 0xce, 0x47, 0xa6, 0x3a, 0x1e, 0x82, 0x27, 0xf8, 0x10, 0x3c, 0xe9, 0xf3, 0x38, 0xb9, + 0x11, 0x44, 0xe5, 0x2f, 0x68, 0x7f, 0x6c, 0xe2, 0xd7, 0x17, 0x48, 0x7e, 0xc6, 0x66, 0x4f, 0x2e, + 0xbc, 0x26, 0x66, 0x41, 0x8e, 0xf6, 0xcd, 0x4e, 0xa0, 0x82, 0x5c, 0xe0, 0x54, 0x2a, 0x64, 0x31, + 0xb6, 0x0f, 0x70, 0xd3, 0x56, 0x98, 0x13, 0x59, 0xf4, 0xd6, 0x99, 0x25, 0x6c, 0x84, 0x7a, 0xcc, + 0x88, 0xd2, 0xfb, 0x0b, 0xd9, 0x32, 0x0b, 0x29, 0xb9, 0x5a, 0x97, 0x1f, 0x8b, 0x09, 0x84, 0xa0, + 0x48, 0x3f, 0x95, 0xe3, 0x83, 0x9d, 0xa3, 0xe3, 0xda, 0x21, 0xb1, 0xe5, 0x2a, 0x2c, 0x3b, 0xb6, + 0x74, 0x88, 0x29, 0xe9, 0x1a, 0xb9, 0x46, 0x85, 0x26, 0x5f, 0x93, 0x77, 0x6f, 0xe9, 0xe7, 0x82, + 0x9f, 0x3b, 0x98, 0x40, 0x1d, 0x42, 0xda, 0xb2, 0x55, 0x7b, 0x68, 0x71, 0x23, 0xbe, 0x3e, 0x6f, + 0x36, 0xb6, 0xe5, 0x7c, 0x1c, 0x53, 0x71, 0x99, 0xab, 0x91, 0x6e, 0x42, 0x31, 0xf8, 0x4b, 0xb4, + 0x0d, 0x3c, 0x27, 0x8a, 0x4b, 0xb7, 0x01, 0x4d, 0x26, 0x69, 0x21, 0x38, 0x84, 0x10, 0x86, 0x43, + 0xfc, 0x82, 0x5e, 0x80, 0x23, 0x13, 0x32, 0xf4, 0xce, 0xd8, 0x24, 0x6f, 0x2d, 0x92, 0xce, 0x6d, + 0x31, 0xda, 0xd8, 0x34, 0x6f, 0x40, 0xde, 0x4f, 0x9f, 0x6f, 0x92, 0xdf, 0xc6, 0xbd, 0x4d, 0x1c, + 0x04, 0x4c, 0xbc, 0x23, 0x50, 0xf8, 0x8e, 0x47, 0xe0, 0x9b, 0x00, 0xf6, 0x88, 0x67, 0x82, 0x4e, + 0x1c, 0xbd, 0x14, 0x02, 0x44, 0xe3, 0x66, 0x7d, 0xc4, 0x37, 0x41, 0xd6, 0xe6, 0x5f, 0x16, 0x3a, + 0xf6, 0xa3, 0x47, 0x43, 0x1a, 0x63, 0x2d, 0x8e, 0xac, 0xcc, 0x1b, 0x8c, 0x3d, 0x94, 0x89, 0x91, + 0x2d, 0xf4, 0x18, 0xce, 0x8d, 0x25, 0x0a, 0xae, 0xea, 0xe4, 0xbc, 0xf9, 0xc2, 0x99, 0x60, 0xbe, + 0xe0, 0xa8, 0xf6, 0x47, 0xfb, 0x54, 0x30, 0xda, 0xbf, 0x05, 0x17, 0xa7, 0x65, 0xbb, 0xe8, 0x12, + 0x00, 0x1e, 0x90, 0xe0, 0xd0, 0xf2, 0x10, 0x85, 0x2c, 0xa7, 0xd4, 0x47, 0xd2, 0x3d, 0x28, 0x45, + 0x65, 0xb2, 0xe8, 0x1a, 0x24, 0xe9, 0x75, 0x83, 0x65, 0x3b, 0xe7, 0x42, 0xb0, 0x11, 0xc2, 0x27, + 0x53, 0x26, 0xe9, 0x37, 0x7e, 0xe7, 0x0c, 0x01, 0x36, 0xae, 0xc2, 0x8a, 0x33, 0x8e, 0x71, 0x80, + 0x63, 0x99, 0xff, 0x70, 0xc8, 0x71, 0x0e, 0x74, 0xdf, 0x75, 0x64, 0x56, 0x45, 0xba, 0xb1, 0x48, + 0x7e, 0xbc, 0x35, 0xe6, 0xc2, 0x97, 0x21, 0xed, 0x39, 0xaf, 0x61, 0x62, 0x0b, 0x0f, 0x6c, 0xe6, + 0xbc, 0x6a, 0x83, 0x7e, 0x0b, 0xd2, 0x63, 0x00, 0x0f, 0x89, 0x23, 0xa7, 0xb4, 0xa9, 0x0f, 0x07, + 0x2d, 0x3a, 0xba, 0x94, 0xcc, 0x1a, 0xe8, 0x26, 0xa4, 0xfc, 0x48, 0xd1, 0x64, 0x38, 0x23, 0x9d, + 0xfb, 0x90, 0x3c, 0xc6, 0x2d, 0x69, 0x80, 0x26, 0xab, 0x21, 0x11, 0x5d, 0xbc, 0x15, 0xec, 0xe2, + 0x72, 0x64, 0x5d, 0x25, 0xbc, 0xab, 0x8f, 0x21, 0x45, 0x77, 0x0f, 0x49, 0x5c, 0x68, 0x09, 0x8e, + 0x67, 0xdc, 0xe4, 0x1b, 0xfd, 0x3f, 0x80, 0x6a, 0xdb, 0xa6, 0xd6, 0x18, 0x7a, 0x1d, 0x6c, 0x84, + 0xef, 0xbe, 0x1d, 0x87, 0x6f, 0xf7, 0x22, 0xdf, 0x86, 0x6b, 0x9e, 0xa8, 0x6f, 0x2b, 0xfa, 0x14, + 0x4a, 0x07, 0x50, 0x0c, 0xca, 0x3a, 0x39, 0x22, 0x1b, 0x43, 0x30, 0x47, 0x64, 0x29, 0x3f, 0xcf, + 0x11, 0xdd, 0x0c, 0x33, 0xc1, 0xea, 0x8c, 0xb4, 0x21, 0xfd, 0x20, 0x0e, 0x79, 0xff, 0xe6, 0xfd, + 0xd7, 0x4b, 0xe3, 0xa4, 0x1f, 0x0b, 0x90, 0x71, 0xa7, 0x1f, 0x2c, 0x3a, 0x06, 0xaa, 0xb4, 0xcc, + 0x7a, 0x71, 0x7f, 0xa5, 0x90, 0xd5, 0x64, 0x13, 0x6e, 0x4d, 0xf6, 0xb6, 0x9b, 0x42, 0x44, 0x61, + 0x6f, 0x7e, 0x5b, 0x73, 0xaf, 0x72, 0x32, 0xa6, 0xdb, 0x90, 0x75, 0x4f, 0x40, 0x72, 0x71, 0x0b, + 0x42, 0xab, 0x4e, 0x93, 0xd6, 0x8b, 0xf5, 0x8f, 0x78, 0x19, 0x32, 0x21, 0xb3, 0x86, 0xd4, 0x82, + 0xe5, 0xb1, 0xe3, 0x13, 0xdd, 0x86, 0x25, 0x63, 0xd8, 0x50, 0x1c, 0xe7, 0x18, 0xc3, 0xb2, 0x9d, + 0x2b, 0xc1, 0xb0, 0xd1, 0xd3, 0x9a, 0xf7, 0xf1, 0xa9, 0x33, 0x18, 0x63, 0xd8, 0xb8, 0xcf, 0x7c, + 0x88, 0xf5, 0x12, 0xf7, 0xf7, 0xf2, 0x53, 0x01, 0x32, 0xce, 0x9e, 0x40, 0xff, 0x05, 0x59, 0xf7, + 0x68, 0x76, 0xdf, 0x11, 0x44, 0x9e, 0xe9, 0x5c, 0xbf, 0x27, 0x82, 0x76, 0x9c, 0x07, 0x10, 0x5a, + 0x4b, 0x69, 0xf7, 0x54, 0xe6, 0x4b, 0xc5, 0xa0, 0xcd, 0xd8, 0xe1, 0x4d, 0x63, 0xda, 0xde, 0x9d, + 0xbb, 0x3d, 0xb5, 0x23, 0xe7, 0xa8, 0xcc, 0x5e, 0x8b, 0x34, 0x78, 0x76, 0xfc, 0x57, 0x01, 0xc4, + 0xf1, 0x1d, 0xfb, 0x9d, 0x47, 0x37, 0x99, 0x2a, 0x24, 0x42, 0x52, 0x05, 0xb4, 0x0d, 0xab, 0x2e, + 0x87, 0x62, 0x69, 0x9d, 0x81, 0x6a, 0x0f, 0x4d, 0xcc, 0xd1, 0x7f, 0xe4, 0xfe, 0x74, 0xec, 0xfc, + 0x32, 0x39, 0xeb, 0xd4, 0x33, 0xce, 0xfa, 0x93, 0x38, 0xe4, 0x7c, 0xb5, 0x08, 0xf4, 0x9f, 0xbe, + 0xc3, 0xa8, 0x18, 0x12, 0x5d, 0x7d, 0xbc, 0xde, 0x9b, 0x80, 0xa0, 0x99, 0xe2, 0x8b, 0x9b, 0x29, + 0xaa, 0xe2, 0xe3, 0x94, 0x36, 0x92, 0x0b, 0x97, 0x36, 0x5e, 0x06, 0x64, 0xeb, 0xb6, 0xda, 0x53, + 0x4e, 0x74, 0x5b, 0x1b, 0x74, 0x14, 0xe6, 0x86, 0xec, 0xe8, 0x10, 0xe9, 0x2f, 0x8f, 0xe8, 0x0f, + 0x47, 0xd4, 0x23, 0x7f, 0x28, 0x40, 0xc6, 0xbd, 0xba, 0x2c, 0xfa, 0x62, 0xe0, 0x2c, 0xa4, 0x79, + 0x76, 0xce, 0x9e, 0x0c, 0xf0, 0x56, 0x68, 0x0d, 0xa7, 0x0c, 0x99, 0x3e, 0xb6, 0x55, 0x7a, 0x0e, + 0xb2, 0xcc, 0xc0, 0x6d, 0x5f, 0xbd, 0x05, 0x39, 0xdf, 0x6b, 0x0b, 0x72, 0x34, 0x1e, 0x54, 0xdf, + 0x15, 0x63, 0xe5, 0xa5, 0x4f, 0xbf, 0xd8, 0x4c, 0x1c, 0xe0, 0x8f, 0xc8, 0x6e, 0x96, 0xab, 0x95, + 0x5a, 0xb5, 0x72, 0x5f, 0x14, 0xca, 0xb9, 0x4f, 0xbf, 0xd8, 0x5c, 0x92, 0x31, 0x05, 0xaf, 0xaf, + 0xde, 0x87, 0xe5, 0xb1, 0x85, 0x09, 0xa6, 0x7e, 0x08, 0x8a, 0x77, 0x1e, 0x1e, 0x3d, 0xd8, 0xab, + 0xec, 0xd4, 0xab, 0xca, 0xa3, 0xc3, 0x7a, 0x55, 0x14, 0xd0, 0x39, 0x58, 0x7d, 0xb0, 0x77, 0xaf, + 0x56, 0x57, 0x2a, 0x0f, 0xf6, 0xaa, 0x07, 0x75, 0x65, 0xa7, 0x5e, 0xdf, 0xa9, 0xdc, 0x17, 0xe3, + 0xd7, 0xff, 0x52, 0x80, 0xe4, 0xce, 0x6e, 0x65, 0x0f, 0x55, 0x20, 0x49, 0xe1, 0xa4, 0xa9, 0x4f, + 0x52, 0xcb, 0xd3, 0xcb, 0x10, 0xe8, 0x2e, 0xa4, 0x28, 0xd2, 0x84, 0xa6, 0xbf, 0x51, 0x2d, 0xcf, + 0xa8, 0x4b, 0x90, 0xc1, 0xd0, 0x1d, 0x39, 0xf5, 0xd1, 0x6a, 0x79, 0x7a, 0x99, 0x02, 0x3d, 0x80, + 0x25, 0x07, 0x68, 0x98, 0xf5, 0x92, 0xb4, 0x3c, 0xb3, 0x76, 0x40, 0xa6, 0xc6, 0x00, 0x9b, 0xe9, + 0xef, 0x59, 0xcb, 0x33, 0x0a, 0x18, 0x68, 0x0f, 0xd2, 0xfc, 0x4a, 0x3f, 0xe3, 0x89, 0x6a, 0x79, + 0x56, 0x49, 0x02, 0xc9, 0x90, 0xf5, 0xa0, 0xb0, 0xd9, 0xaf, 0x74, 0xcb, 0x73, 0xd4, 0x66, 0xd0, + 0x7b, 0x50, 0x08, 0xc2, 0x05, 0xf3, 0x3d, 0x83, 0x2d, 0xcf, 0x59, 0xfc, 0x20, 0xfa, 0x83, 0xd8, + 0xc1, 0x7c, 0xcf, 0x62, 0xcb, 0x73, 0xd6, 0x42, 0xd0, 0x07, 0xb0, 0x32, 0x79, 0xb7, 0x9f, 0xff, + 0x95, 0x6c, 0x79, 0x81, 0xea, 0x08, 0xea, 0x03, 0x0a, 0xc1, 0x04, 0x16, 0x78, 0x34, 0x5b, 0x5e, + 0xa4, 0x58, 0x82, 0x5a, 0xb0, 0x3c, 0x7e, 0xd1, 0x9e, 0xf7, 0x11, 0x6d, 0x79, 0xee, 0xc2, 0x09, + 0xeb, 0x25, 0x78, 0x41, 0x9f, 0xf7, 0x51, 0x6d, 0x79, 0xee, 0x3a, 0x0a, 0x7a, 0x08, 0xe0, 0xbb, + 0x63, 0xcf, 0xf1, 0xc8, 0xb6, 0x3c, 0x4f, 0x45, 0x05, 0x19, 0xb0, 0x1a, 0x76, 0xf9, 0x5e, 0xe4, + 0xcd, 0x6d, 0x79, 0xa1, 0x42, 0x0b, 0xf1, 0xe7, 0xe0, 0x35, 0x7a, 0xbe, 0x37, 0xb8, 0xe5, 0x39, + 0x2b, 0x2e, 0xc8, 0x82, 0xb5, 0xd0, 0xab, 0xe3, 0x42, 0x2f, 0x72, 0xcb, 0x8b, 0x55, 0x61, 0x50, + 0x07, 0xc4, 0x89, 0x0b, 0xe7, 0xdc, 0x0f, 0x74, 0xcb, 0xf3, 0xd7, 0x63, 0xe8, 0x7a, 0x85, 0xdc, + 0x47, 0x17, 0x79, 0xaf, 0x5b, 0x5e, 0xa8, 0x40, 0xb3, 0xbb, 0xf3, 0xe5, 0x37, 0xeb, 0xc2, 0x57, + 0xdf, 0xac, 0x0b, 0x7f, 0xfe, 0x66, 0x5d, 0xf8, 0xec, 0xe9, 0x7a, 0xec, 0xab, 0xa7, 0xeb, 0xb1, + 0x3f, 0x3e, 0x5d, 0x8f, 0xfd, 0xcf, 0x8b, 0x1d, 0xcd, 0xee, 0x0e, 0x1b, 0x5b, 0x4d, 0xbd, 0xbf, + 0xdd, 0xd4, 0xfb, 0xd8, 0x6e, 0xb4, 0x6d, 0xef, 0xc3, 0xfb, 0xe7, 0x4a, 0x23, 0x4d, 0x33, 0x92, + 0x1b, 0x7f, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xc6, 0x9f, 0x5f, 0x24, 0xd9, 0x32, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4304,8 +4305,8 @@ type ABCIClient interface { ExtendVote(ctx context.Context, in *RequestExtendVote, opts ...grpc.CallOption) (*ResponseExtendVote, error) VerifyVoteExtension(ctx context.Context, in *RequestVerifyVoteExtension, opts ...grpc.CallOption) (*ResponseVerifyVoteExtension, error) FinalizeBlock(ctx context.Context, in *RequestFinalizeBlock, opts ...grpc.CallOption) (*ResponseFinalizeBlock, error) - SignGossipVote(ctx context.Context, in *RequestSignGossipVote, opts ...grpc.CallOption) (*ResponseSignGossipVote, error) - PrepareOracleVotes(ctx context.Context, in *RequestPrepareOracleVotes, opts ...grpc.CallOption) (*ResponsePrepareOracleVotes, error) + CreateOracleResultTx(ctx context.Context, in *RequestCreateOracleResultTx, opts ...grpc.CallOption) (*ResponseCreateOracleResultTx, error) + FetchOracleVotes(ctx context.Context, in *RequestFetchOracleVotes, opts ...grpc.CallOption) (*ResponseFetchOracleVotes, error) ValidateOracleVotes(ctx context.Context, in *RequestValidateOracleVotes, opts ...grpc.CallOption) (*ResponseValidateOracleVotes, error) } @@ -4461,18 +4462,18 @@ func (c *aBCIClient) FinalizeBlock(ctx context.Context, in *RequestFinalizeBlock return out, nil } -func (c *aBCIClient) SignGossipVote(ctx context.Context, in *RequestSignGossipVote, opts ...grpc.CallOption) (*ResponseSignGossipVote, error) { - out := new(ResponseSignGossipVote) - err := c.cc.Invoke(ctx, "/tendermint.abci.ABCI/SignGossipVote", in, out, opts...) +func (c *aBCIClient) CreateOracleResultTx(ctx context.Context, in *RequestCreateOracleResultTx, opts ...grpc.CallOption) (*ResponseCreateOracleResultTx, error) { + out := new(ResponseCreateOracleResultTx) + err := c.cc.Invoke(ctx, "/tendermint.abci.ABCI/CreateOracleResultTx", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *aBCIClient) PrepareOracleVotes(ctx context.Context, in *RequestPrepareOracleVotes, opts ...grpc.CallOption) (*ResponsePrepareOracleVotes, error) { - out := new(ResponsePrepareOracleVotes) - err := c.cc.Invoke(ctx, "/tendermint.abci.ABCI/PrepareOracleVotes", in, out, opts...) +func (c *aBCIClient) FetchOracleVotes(ctx context.Context, in *RequestFetchOracleVotes, opts ...grpc.CallOption) (*ResponseFetchOracleVotes, error) { + out := new(ResponseFetchOracleVotes) + err := c.cc.Invoke(ctx, "/tendermint.abci.ABCI/FetchOracleVotes", in, out, opts...) if err != nil { return nil, err } @@ -4506,8 +4507,8 @@ type ABCIServer interface { ExtendVote(context.Context, *RequestExtendVote) (*ResponseExtendVote, error) VerifyVoteExtension(context.Context, *RequestVerifyVoteExtension) (*ResponseVerifyVoteExtension, error) FinalizeBlock(context.Context, *RequestFinalizeBlock) (*ResponseFinalizeBlock, error) - SignGossipVote(context.Context, *RequestSignGossipVote) (*ResponseSignGossipVote, error) - PrepareOracleVotes(context.Context, *RequestPrepareOracleVotes) (*ResponsePrepareOracleVotes, error) + CreateOracleResultTx(context.Context, *RequestCreateOracleResultTx) (*ResponseCreateOracleResultTx, error) + FetchOracleVotes(context.Context, *RequestFetchOracleVotes) (*ResponseFetchOracleVotes, error) ValidateOracleVotes(context.Context, *RequestValidateOracleVotes) (*ResponseValidateOracleVotes, error) } @@ -4563,11 +4564,11 @@ func (*UnimplementedABCIServer) VerifyVoteExtension(ctx context.Context, req *Re func (*UnimplementedABCIServer) FinalizeBlock(ctx context.Context, req *RequestFinalizeBlock) (*ResponseFinalizeBlock, error) { return nil, status.Errorf(codes.Unimplemented, "method FinalizeBlock not implemented") } -func (*UnimplementedABCIServer) SignGossipVote(ctx context.Context, req *RequestSignGossipVote) (*ResponseSignGossipVote, error) { - return nil, status.Errorf(codes.Unimplemented, "method SignGossipVote not implemented") +func (*UnimplementedABCIServer) CreateOracleResultTx(ctx context.Context, req *RequestCreateOracleResultTx) (*ResponseCreateOracleResultTx, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateOracleResultTx not implemented") } -func (*UnimplementedABCIServer) PrepareOracleVotes(ctx context.Context, req *RequestPrepareOracleVotes) (*ResponsePrepareOracleVotes, error) { - return nil, status.Errorf(codes.Unimplemented, "method PrepareOracleVotes not implemented") +func (*UnimplementedABCIServer) FetchOracleVotes(ctx context.Context, req *RequestFetchOracleVotes) (*ResponseFetchOracleVotes, error) { + return nil, status.Errorf(codes.Unimplemented, "method FetchOracleVotes not implemented") } func (*UnimplementedABCIServer) ValidateOracleVotes(ctx context.Context, req *RequestValidateOracleVotes) (*ResponseValidateOracleVotes, error) { return nil, status.Errorf(codes.Unimplemented, "method ValidateOracleVotes not implemented") @@ -4865,38 +4866,38 @@ func _ABCI_FinalizeBlock_Handler(srv interface{}, ctx context.Context, dec func( return interceptor(ctx, in, info, handler) } -func _ABCI_SignGossipVote_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RequestSignGossipVote) +func _ABCI_CreateOracleResultTx_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestCreateOracleResultTx) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ABCIServer).SignGossipVote(ctx, in) + return srv.(ABCIServer).CreateOracleResultTx(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/tendermint.abci.ABCI/SignGossipVote", + FullMethod: "/tendermint.abci.ABCI/CreateOracleResultTx", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ABCIServer).SignGossipVote(ctx, req.(*RequestSignGossipVote)) + return srv.(ABCIServer).CreateOracleResultTx(ctx, req.(*RequestCreateOracleResultTx)) } return interceptor(ctx, in, info, handler) } -func _ABCI_PrepareOracleVotes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RequestPrepareOracleVotes) +func _ABCI_FetchOracleVotes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestFetchOracleVotes) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ABCIServer).PrepareOracleVotes(ctx, in) + return srv.(ABCIServer).FetchOracleVotes(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/tendermint.abci.ABCI/PrepareOracleVotes", + FullMethod: "/tendermint.abci.ABCI/FetchOracleVotes", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ABCIServer).PrepareOracleVotes(ctx, req.(*RequestPrepareOracleVotes)) + return srv.(ABCIServer).FetchOracleVotes(ctx, req.(*RequestFetchOracleVotes)) } return interceptor(ctx, in, info, handler) } @@ -4988,12 +4989,12 @@ var _ABCI_serviceDesc = grpc.ServiceDesc{ Handler: _ABCI_FinalizeBlock_Handler, }, { - MethodName: "SignGossipVote", - Handler: _ABCI_SignGossipVote_Handler, + MethodName: "CreateOracleResultTx", + Handler: _ABCI_CreateOracleResultTx_Handler, }, { - MethodName: "PrepareOracleVotes", - Handler: _ABCI_PrepareOracleVotes_Handler, + MethodName: "FetchOracleVotes", + Handler: _ABCI_FetchOracleVotes_Handler, }, { MethodName: "ValidateOracleVotes", @@ -5382,16 +5383,16 @@ func (m *Request_FinalizeBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { } return len(dAtA) - i, nil } -func (m *Request_SignGossipVote) MarshalTo(dAtA []byte) (int, error) { +func (m *Request_CreateOracleResultTx) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Request_SignGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Request_CreateOracleResultTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - if m.SignGossipVote != nil { + if m.CreateOracleResultTx != nil { { - size, err := m.SignGossipVote.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.CreateOracleResultTx.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -5405,16 +5406,16 @@ func (m *Request_SignGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) } return len(dAtA) - i, nil } -func (m *Request_PrepareOracleVotes) MarshalTo(dAtA []byte) (int, error) { +func (m *Request_FetchOracleVotes) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Request_PrepareOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Request_FetchOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - if m.PrepareOracleVotes != nil { + if m.FetchOracleVotes != nil { { - size, err := m.PrepareOracleVotes.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.FetchOracleVotes.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -6289,7 +6290,7 @@ func (m *RequestFinalizeBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *RequestSignGossipVote) Marshal() (dAtA []byte, err error) { +func (m *RequestCreateOracleResultTx) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6299,12 +6300,12 @@ func (m *RequestSignGossipVote) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *RequestSignGossipVote) MarshalTo(dAtA []byte) (int, error) { +func (m *RequestCreateOracleResultTx) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *RequestSignGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *RequestCreateOracleResultTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6314,10 +6315,10 @@ func (m *RequestSignGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x18 } - if len(m.GossipVotes) > 0 { - for iNdEx := len(m.GossipVotes) - 1; iNdEx >= 0; iNdEx-- { + if len(m.GossipedVotes) > 0 { + for iNdEx := len(m.GossipedVotes) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.GossipVotes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.GossipedVotes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -6338,7 +6339,7 @@ func (m *RequestSignGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *RequestPrepareOracleVotes) Marshal() (dAtA []byte, err error) { +func (m *RequestFetchOracleVotes) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6348,12 +6349,12 @@ func (m *RequestPrepareOracleVotes) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *RequestPrepareOracleVotes) MarshalTo(dAtA []byte) (int, error) { +func (m *RequestFetchOracleVotes) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *RequestPrepareOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *RequestFetchOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6792,16 +6793,16 @@ func (m *Response_FinalizeBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) } return len(dAtA) - i, nil } -func (m *Response_SignGossipVote) MarshalTo(dAtA []byte) (int, error) { +func (m *Response_CreateOracleResultTx) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Response_SignGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Response_CreateOracleResultTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - if m.SignGossipVote != nil { + if m.CreateOracleResultTx != nil { { - size, err := m.SignGossipVote.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.CreateOracleResultTx.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -6815,16 +6816,16 @@ func (m *Response_SignGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) } return len(dAtA) - i, nil } -func (m *Response_PrepareOracleVotes) MarshalTo(dAtA []byte) (int, error) { +func (m *Response_FetchOracleVotes) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Response_PrepareOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Response_FetchOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - if m.PrepareOracleVotes != nil { + if m.FetchOracleVotes != nil { { - size, err := m.PrepareOracleVotes.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.FetchOracleVotes.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -7599,7 +7600,7 @@ func (m *ResponseFinalizeBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ResponseSignGossipVote) Marshal() (dAtA []byte, err error) { +func (m *ResponseCreateOracleResultTx) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -7609,12 +7610,12 @@ func (m *ResponseSignGossipVote) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ResponseSignGossipVote) MarshalTo(dAtA []byte) (int, error) { +func (m *ResponseCreateOracleResultTx) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ResponseSignGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ResponseCreateOracleResultTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -7629,7 +7630,7 @@ func (m *ResponseSignGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func (m *ResponsePrepareOracleVotes) Marshal() (dAtA []byte, err error) { +func (m *ResponseFetchOracleVotes) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -7639,12 +7640,12 @@ func (m *ResponsePrepareOracleVotes) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ResponsePrepareOracleVotes) MarshalTo(dAtA []byte) (int, error) { +func (m *ResponseFetchOracleVotes) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ResponsePrepareOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ResponseFetchOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -8490,26 +8491,26 @@ func (m *Request_FinalizeBlock) Size() (n int) { } return n } -func (m *Request_SignGossipVote) Size() (n int) { +func (m *Request_CreateOracleResultTx) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.SignGossipVote != nil { - l = m.SignGossipVote.Size() + if m.CreateOracleResultTx != nil { + l = m.CreateOracleResultTx.Size() n += 2 + l + sovTypes(uint64(l)) } return n } -func (m *Request_PrepareOracleVotes) Size() (n int) { +func (m *Request_FetchOracleVotes) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.PrepareOracleVotes != nil { - l = m.PrepareOracleVotes.Size() + if m.FetchOracleVotes != nil { + l = m.FetchOracleVotes.Size() n += 2 + l + sovTypes(uint64(l)) } return n @@ -8898,7 +8899,7 @@ func (m *RequestFinalizeBlock) Size() (n int) { return n } -func (m *RequestSignGossipVote) Size() (n int) { +func (m *RequestCreateOracleResultTx) Size() (n int) { if m == nil { return 0 } @@ -8908,8 +8909,8 @@ func (m *RequestSignGossipVote) Size() (n int) { if l > 0 { n += 1 + l + sovTypes(uint64(l)) } - if len(m.GossipVotes) > 0 { - for _, e := range m.GossipVotes { + if len(m.GossipedVotes) > 0 { + for _, e := range m.GossipedVotes { l = e.Size() n += 1 + l + sovTypes(uint64(l)) } @@ -8920,7 +8921,7 @@ func (m *RequestSignGossipVote) Size() (n int) { return n } -func (m *RequestPrepareOracleVotes) Size() (n int) { +func (m *RequestFetchOracleVotes) Size() (n int) { if m == nil { return 0 } @@ -9158,26 +9159,26 @@ func (m *Response_FinalizeBlock) Size() (n int) { } return n } -func (m *Response_SignGossipVote) Size() (n int) { +func (m *Response_CreateOracleResultTx) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.SignGossipVote != nil { - l = m.SignGossipVote.Size() + if m.CreateOracleResultTx != nil { + l = m.CreateOracleResultTx.Size() n += 2 + l + sovTypes(uint64(l)) } return n } -func (m *Response_PrepareOracleVotes) Size() (n int) { +func (m *Response_FetchOracleVotes) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.PrepareOracleVotes != nil { - l = m.PrepareOracleVotes.Size() + if m.FetchOracleVotes != nil { + l = m.FetchOracleVotes.Size() n += 2 + l + sovTypes(uint64(l)) } return n @@ -9525,7 +9526,7 @@ func (m *ResponseFinalizeBlock) Size() (n int) { return n } -func (m *ResponseSignGossipVote) Size() (n int) { +func (m *ResponseCreateOracleResultTx) Size() (n int) { if m == nil { return 0 } @@ -9538,7 +9539,7 @@ func (m *ResponseSignGossipVote) Size() (n int) { return n } -func (m *ResponsePrepareOracleVotes) Size() (n int) { +func (m *ResponseFetchOracleVotes) Size() (n int) { if m == nil { return 0 } @@ -10414,7 +10415,7 @@ func (m *Request) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 21: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SignGossipVote", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CreateOracleResultTx", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -10441,15 +10442,15 @@ func (m *Request) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &RequestSignGossipVote{} + v := &RequestCreateOracleResultTx{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &Request_SignGossipVote{v} + m.Value = &Request_CreateOracleResultTx{v} iNdEx = postIndex case 22: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PrepareOracleVotes", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field FetchOracleVotes", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -10476,11 +10477,11 @@ func (m *Request) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &RequestPrepareOracleVotes{} + v := &RequestFetchOracleVotes{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &Request_PrepareOracleVotes{v} + m.Value = &Request_FetchOracleVotes{v} iNdEx = postIndex case 23: if wireType != 2 { @@ -13148,7 +13149,7 @@ func (m *RequestFinalizeBlock) Unmarshal(dAtA []byte) error { } return nil } -func (m *RequestSignGossipVote) Unmarshal(dAtA []byte) error { +func (m *RequestCreateOracleResultTx) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -13171,10 +13172,10 @@ func (m *RequestSignGossipVote) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RequestSignGossipVote: wiretype end group for non-group") + return fmt.Errorf("proto: RequestCreateOracleResultTx: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RequestSignGossipVote: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RequestCreateOracleResultTx: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -13213,7 +13214,7 @@ func (m *RequestSignGossipVote) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GossipVotes", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field GossipedVotes", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -13240,8 +13241,8 @@ func (m *RequestSignGossipVote) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.GossipVotes = append(m.GossipVotes, &oracle.GossipVote{}) - if err := m.GossipVotes[len(m.GossipVotes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.GossipedVotes = append(m.GossipedVotes, &oracle.GossipedVotes{}) + if err := m.GossipedVotes[len(m.GossipedVotes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -13285,7 +13286,7 @@ func (m *RequestSignGossipVote) Unmarshal(dAtA []byte) error { } return nil } -func (m *RequestPrepareOracleVotes) Unmarshal(dAtA []byte) error { +func (m *RequestFetchOracleVotes) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -13308,10 +13309,10 @@ func (m *RequestPrepareOracleVotes) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RequestPrepareOracleVotes: wiretype end group for non-group") + return fmt.Errorf("proto: RequestFetchOracleVotes: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RequestPrepareOracleVotes: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RequestFetchOracleVotes: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { default: @@ -14045,7 +14046,7 @@ func (m *Response) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 22: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SignGossipVote", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CreateOracleResultTx", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -14072,15 +14073,15 @@ func (m *Response) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &ResponseSignGossipVote{} + v := &ResponseCreateOracleResultTx{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &Response_SignGossipVote{v} + m.Value = &Response_CreateOracleResultTx{v} iNdEx = postIndex case 23: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PrepareOracleVotes", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field FetchOracleVotes", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -14107,11 +14108,11 @@ func (m *Response) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &ResponsePrepareOracleVotes{} + v := &ResponseFetchOracleVotes{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &Response_PrepareOracleVotes{v} + m.Value = &Response_FetchOracleVotes{v} iNdEx = postIndex case 24: if wireType != 2 { @@ -16310,7 +16311,7 @@ func (m *ResponseFinalizeBlock) Unmarshal(dAtA []byte) error { } return nil } -func (m *ResponseSignGossipVote) Unmarshal(dAtA []byte) error { +func (m *ResponseCreateOracleResultTx) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -16333,10 +16334,10 @@ func (m *ResponseSignGossipVote) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ResponseSignGossipVote: wiretype end group for non-group") + return fmt.Errorf("proto: ResponseCreateOracleResultTx: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ResponseSignGossipVote: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ResponseCreateOracleResultTx: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -16394,7 +16395,7 @@ func (m *ResponseSignGossipVote) Unmarshal(dAtA []byte) error { } return nil } -func (m *ResponsePrepareOracleVotes) Unmarshal(dAtA []byte) error { +func (m *ResponseFetchOracleVotes) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -16417,10 +16418,10 @@ func (m *ResponsePrepareOracleVotes) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ResponsePrepareOracleVotes: wiretype end group for non-group") + return fmt.Errorf("proto: ResponseFetchOracleVotes: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ResponsePrepareOracleVotes: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ResponseFetchOracleVotes: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: diff --git a/oracle/reactor.go b/oracle/reactor.go index f69b53278ff..3889bf430b9 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -47,7 +47,7 @@ type Reactor struct { // NewReactor returns a new Reactor with the given config and mempool. func NewReactor(config *config.OracleConfig, pubKey crypto.PubKey, privValidator types.PrivValidator, proxyApp proxy.AppConnConsensus) *Reactor { gossipVoteBuffer := &oracletypes.GossipVoteBuffer{ - Buffer: make(map[string]*oracleproto.GossipVote), + Buffer: make(map[string]*oracleproto.GossipedVotes), } unsignedVoteBuffer := &oracletypes.UnsignedVoteBuffer{ Buffer: []*oracleproto.Vote{}, @@ -106,7 +106,7 @@ func (oracleR *Reactor) GetChannels() []*p2p.ChannelDescriptor { ID: OracleChannel, Priority: 5, RecvMessageCapacity: messageCap, - MessageType: &oracleproto.GossipVote{}, + MessageType: &oracleproto.GossipedVotes{}, }, } } @@ -130,7 +130,7 @@ func (oracleR *Reactor) RemovePeer(peer p2p.Peer, _ interface{}) { func (oracleR *Reactor) Receive(e p2p.Envelope) { oracleR.Logger.Debug("Receive", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) switch msg := e.Message.(type) { - case *oracleproto.GossipVote: + case *oracleproto.GossipedVotes: // verify sig of incoming gossip vote, throw if verification fails _, val := oracleR.ConsensusState.Validators.GetByIndex(msg.ValidatorIndex) if val == nil { diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 08a20f8de8b..5eebf6b7b0a 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -60,7 +60,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State oracleInfo.UnsignedVoteBuffer.Buffer = append(oracleInfo.UnsignedVoteBuffer.Buffer, votes...) // batch sign the entire unsignedVoteBuffer and add to gossipBuffer - newGossipVote := &oracleproto.GossipVote{ + newGossipVote := &oracleproto.GossipedVotes{ ValidatorIndex: validatorIndex, SignedTimestamp: time.Now().Unix(), Votes: oracleInfo.UnsignedVoteBuffer.Buffer, @@ -162,7 +162,7 @@ func Run(oracleInfo *types.OracleInfo, consensusState *cs.State) { PruneGossipVoteBuffer(oracleInfo) // start to take votes from app for { - res, err := oracleInfo.ProxyApp.PrepareOracleVotes(context.Background(), &abcitypes.RequestPrepareOracleVotes{}) + res, err := oracleInfo.ProxyApp.FetchOracleVotes(context.Background(), &abcitypes.RequestFetchOracleVotes{}) if err != nil { log.Errorf("app not ready: %v, retrying...", err) time.Sleep(1 * time.Second) diff --git a/oracle/service/types/info.go b/oracle/service/types/info.go index 88c8a9a4b68..3bfed9b532f 100644 --- a/oracle/service/types/info.go +++ b/oracle/service/types/info.go @@ -22,7 +22,7 @@ type OracleInfo struct { BlockTimestamps []int64 } type GossipVoteBuffer struct { - Buffer map[string]*oracleproto.GossipVote + Buffer map[string]*oracleproto.GossipedVotes UpdateMtx cmtsync.RWMutex } diff --git a/privval/file.go b/privval/file.go index 0442cfa2450..287e13d9e5e 100644 --- a/privval/file.go +++ b/privval/file.go @@ -278,7 +278,7 @@ func (pv *FilePV) SignProposal(chainID string, proposal *cmtproto.Proposal) erro // SignOracleVote signs a canonical representation of the vote, along with the // chainID. Implements PrivValidator. -func (pv *FilePV) SignOracleVote(chainID string, vote *oracleproto.GossipVote) error { +func (pv *FilePV) SignOracleVote(chainID string, vote *oracleproto.GossipedVotes) error { if err := pv.signOracleVote(vote); err != nil { return fmt.Errorf("error signing vote: %v", err) } @@ -309,7 +309,7 @@ func (pv *FilePV) String() string { ) } -func (pv *FilePV) signOracleVote(vote *oracleproto.GossipVote) error { +func (pv *FilePV) signOracleVote(vote *oracleproto.GossipedVotes) error { signBytes := types.OracleVoteSignBytes(vote) sig, err := pv.Key.PrivKey.Sign(signBytes) if err != nil { diff --git a/privval/retry_signer_client.go b/privval/retry_signer_client.go index e30385b4534..74151c7d4e2 100644 --- a/privval/retry_signer_client.go +++ b/privval/retry_signer_client.go @@ -80,7 +80,7 @@ func (sc *RetrySignerClient) SignVote(chainID string, vote *cmtproto.Vote) error return fmt.Errorf("exhausted all attempts to sign vote: %w", err) } -func (sc *RetrySignerClient) SignOracleVote(chainID string, vote *oracleproto.GossipVote) error { +func (sc *RetrySignerClient) SignOracleVote(chainID string, vote *oracleproto.GossipedVotes) error { var err error for i := 0; i < sc.retries || sc.retries == 0; i++ { err = sc.next.SignOracleVote(chainID, vote) diff --git a/privval/signer_client.go b/privval/signer_client.go index 39059517fba..5c5f3dbf4ac 100644 --- a/privval/signer_client.go +++ b/privval/signer_client.go @@ -112,7 +112,7 @@ func (sc *SignerClient) SignVote(chainID string, vote *cmtproto.Vote) error { } // SignVote requests a remote signer to sign a vote -func (sc *SignerClient) SignOracleVote(chainID string, vote *oracleproto.GossipVote) error { +func (sc *SignerClient) SignOracleVote(chainID string, vote *oracleproto.GossipedVotes) error { response, err := sc.endpoint.SendRequest(mustWrapMsg(&privvalproto.SignOracleVoteRequest{Vote: vote, ChainId: chainID})) if err != nil { return err diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto index 40fe4cfd1e7..90c6ba09711 100644 --- a/proto/tendermint/abci/types.proto +++ b/proto/tendermint/abci/types.proto @@ -35,8 +35,8 @@ service ABCI { rpc ExtendVote(RequestExtendVote) returns (ResponseExtendVote); rpc VerifyVoteExtension(RequestVerifyVoteExtension) returns (ResponseVerifyVoteExtension); rpc FinalizeBlock(RequestFinalizeBlock) returns (ResponseFinalizeBlock); - rpc SignGossipVote(RequestSignGossipVote) returns (ResponseSignGossipVote); - rpc PrepareOracleVotes(RequestPrepareOracleVotes) returns (ResponsePrepareOracleVotes); + rpc CreateOracleResultTx(RequestCreateOracleResultTx) returns (ResponseCreateOracleResultTx); + rpc FetchOracleVotes(RequestFetchOracleVotes) returns (ResponseFetchOracleVotes); rpc ValidateOracleVotes(RequestValidateOracleVotes) returns (ResponseValidateOracleVotes); } @@ -61,8 +61,8 @@ message Request { RequestExtendVote extend_vote = 18; RequestVerifyVoteExtension verify_vote_extension = 19; RequestFinalizeBlock finalize_block = 20; - RequestSignGossipVote sign_gossip_vote = 21; - RequestPrepareOracleVotes prepare_oracle_votes = 22; + RequestCreateOracleResultTx create_oracle_result_tx = 21; + RequestFetchOracleVotes fetch_oracle_votes = 22; RequestValidateOracleVotes validate_oracle_votes = 23; } reserved 4, 7, 9, 10; // SetOption, BeginBlock, DeliverTx, EndBlock @@ -200,13 +200,13 @@ message RequestFinalizeBlock { bytes proposer_address = 8; } -message RequestSignGossipVote { - bytes proposer_address = 1; - repeated tendermint.oracle.GossipVote gossip_votes = 2; - int64 height = 3; +message RequestCreateOracleResultTx { + bytes proposer_address = 1; + repeated tendermint.oracle.GossipedVotes gossiped_votes = 2; + int64 height = 3; } -message RequestPrepareOracleVotes {} +message RequestFetchOracleVotes {} message RequestValidateOracleVotes { bytes oracle_tx = 1; @@ -234,8 +234,8 @@ message Response { ResponseExtendVote extend_vote = 19; ResponseVerifyVoteExtension verify_vote_extension = 20; ResponseFinalizeBlock finalize_block = 21; - ResponseSignGossipVote sign_gossip_vote = 22; - ResponsePrepareOracleVotes prepare_oracle_votes = 23; + ResponseCreateOracleResultTx create_oracle_result_tx = 22; + ResponseFetchOracleVotes fetch_oracle_votes = 23; ResponseValidateOracleVotes validate_oracle_votes = 24; } reserved 5, 8, 10, 11; // SetOption, BeginBlock, DeliverTx, EndBlock @@ -387,11 +387,11 @@ message ResponseFinalizeBlock { bytes app_hash = 5; } -message ResponseSignGossipVote { +message ResponseCreateOracleResultTx { bytes encoded_tx = 1; } -message ResponsePrepareOracleVotes { +message ResponseFetchOracleVotes { tendermint.oracle.Vote vote = 1; } diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index 75efa3b427d..fb5a7230901 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -90,25 +90,25 @@ func (m *Vote) GetData() string { return "" } -type GossipVote struct { +type GossipedVotes struct { ValidatorIndex int32 `protobuf:"varint,1,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` Votes []*Vote `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes,omitempty"` SignedTimestamp int64 `protobuf:"varint,3,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` Signature []byte `protobuf:"bytes,4,opt,name=signature,proto3" json:"signature,omitempty"` } -func (m *GossipVote) Reset() { *m = GossipVote{} } -func (m *GossipVote) String() string { return proto.CompactTextString(m) } -func (*GossipVote) ProtoMessage() {} -func (*GossipVote) Descriptor() ([]byte, []int) { +func (m *GossipedVotes) Reset() { *m = GossipedVotes{} } +func (m *GossipedVotes) String() string { return proto.CompactTextString(m) } +func (*GossipedVotes) ProtoMessage() {} +func (*GossipedVotes) Descriptor() ([]byte, []int) { return fileDescriptor_ed9227d272ed5d90, []int{1} } -func (m *GossipVote) XXX_Unmarshal(b []byte) error { +func (m *GossipedVotes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GossipVote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *GossipedVotes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GossipVote.Marshal(b, m, deterministic) + return xxx_messageInfo_GossipedVotes.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -118,64 +118,64 @@ func (m *GossipVote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (m *GossipVote) XXX_Merge(src proto.Message) { - xxx_messageInfo_GossipVote.Merge(m, src) +func (m *GossipedVotes) XXX_Merge(src proto.Message) { + xxx_messageInfo_GossipedVotes.Merge(m, src) } -func (m *GossipVote) XXX_Size() int { +func (m *GossipedVotes) XXX_Size() int { return m.Size() } -func (m *GossipVote) XXX_DiscardUnknown() { - xxx_messageInfo_GossipVote.DiscardUnknown(m) +func (m *GossipedVotes) XXX_DiscardUnknown() { + xxx_messageInfo_GossipedVotes.DiscardUnknown(m) } -var xxx_messageInfo_GossipVote proto.InternalMessageInfo +var xxx_messageInfo_GossipedVotes proto.InternalMessageInfo -func (m *GossipVote) GetValidatorIndex() int32 { +func (m *GossipedVotes) GetValidatorIndex() int32 { if m != nil { return m.ValidatorIndex } return 0 } -func (m *GossipVote) GetVotes() []*Vote { +func (m *GossipedVotes) GetVotes() []*Vote { if m != nil { return m.Votes } return nil } -func (m *GossipVote) GetSignedTimestamp() int64 { +func (m *GossipedVotes) GetSignedTimestamp() int64 { if m != nil { return m.SignedTimestamp } return 0 } -func (m *GossipVote) GetSignature() []byte { +func (m *GossipedVotes) GetSignature() []byte { if m != nil { return m.Signature } return nil } -type CanonicalGossipVote struct { +type CanonicalGossipedVotes struct { ValidatorIndex int32 `protobuf:"varint,1,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` Votes []*Vote `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes,omitempty"` SignedTimestamp int64 `protobuf:"varint,3,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` } -func (m *CanonicalGossipVote) Reset() { *m = CanonicalGossipVote{} } -func (m *CanonicalGossipVote) String() string { return proto.CompactTextString(m) } -func (*CanonicalGossipVote) ProtoMessage() {} -func (*CanonicalGossipVote) Descriptor() ([]byte, []int) { +func (m *CanonicalGossipedVotes) Reset() { *m = CanonicalGossipedVotes{} } +func (m *CanonicalGossipedVotes) String() string { return proto.CompactTextString(m) } +func (*CanonicalGossipedVotes) ProtoMessage() {} +func (*CanonicalGossipedVotes) Descriptor() ([]byte, []int) { return fileDescriptor_ed9227d272ed5d90, []int{2} } -func (m *CanonicalGossipVote) XXX_Unmarshal(b []byte) error { +func (m *CanonicalGossipedVotes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *CanonicalGossipVote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *CanonicalGossipedVotes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_CanonicalGossipVote.Marshal(b, m, deterministic) + return xxx_messageInfo_CanonicalGossipedVotes.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -185,33 +185,33 @@ func (m *CanonicalGossipVote) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } -func (m *CanonicalGossipVote) XXX_Merge(src proto.Message) { - xxx_messageInfo_CanonicalGossipVote.Merge(m, src) +func (m *CanonicalGossipedVotes) XXX_Merge(src proto.Message) { + xxx_messageInfo_CanonicalGossipedVotes.Merge(m, src) } -func (m *CanonicalGossipVote) XXX_Size() int { +func (m *CanonicalGossipedVotes) XXX_Size() int { return m.Size() } -func (m *CanonicalGossipVote) XXX_DiscardUnknown() { - xxx_messageInfo_CanonicalGossipVote.DiscardUnknown(m) +func (m *CanonicalGossipedVotes) XXX_DiscardUnknown() { + xxx_messageInfo_CanonicalGossipedVotes.DiscardUnknown(m) } -var xxx_messageInfo_CanonicalGossipVote proto.InternalMessageInfo +var xxx_messageInfo_CanonicalGossipedVotes proto.InternalMessageInfo -func (m *CanonicalGossipVote) GetValidatorIndex() int32 { +func (m *CanonicalGossipedVotes) GetValidatorIndex() int32 { if m != nil { return m.ValidatorIndex } return 0 } -func (m *CanonicalGossipVote) GetVotes() []*Vote { +func (m *CanonicalGossipedVotes) GetVotes() []*Vote { if m != nil { return m.Votes } return nil } -func (m *CanonicalGossipVote) GetSignedTimestamp() int64 { +func (m *CanonicalGossipedVotes) GetSignedTimestamp() int64 { if m != nil { return m.SignedTimestamp } @@ -220,34 +220,34 @@ func (m *CanonicalGossipVote) GetSignedTimestamp() int64 { func init() { proto.RegisterType((*Vote)(nil), "tendermint.oracle.Vote") - proto.RegisterType((*GossipVote)(nil), "tendermint.oracle.GossipVote") - proto.RegisterType((*CanonicalGossipVote)(nil), "tendermint.oracle.CanonicalGossipVote") + proto.RegisterType((*GossipedVotes)(nil), "tendermint.oracle.GossipedVotes") + proto.RegisterType((*CanonicalGossipedVotes)(nil), "tendermint.oracle.CanonicalGossipedVotes") } func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 316 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x92, 0xbf, 0x4e, 0xc3, 0x30, - 0x10, 0x87, 0xeb, 0xfe, 0x41, 0xe4, 0xa8, 0x28, 0x98, 0x81, 0x48, 0x94, 0x28, 0xea, 0x42, 0x18, - 0x48, 0x24, 0xe0, 0x09, 0x60, 0x40, 0x5d, 0x18, 0x2c, 0xc4, 0xc0, 0x52, 0xb9, 0xb1, 0x29, 0x96, - 0x1a, 0x3b, 0x8a, 0xaf, 0x15, 0xbc, 0x05, 0x23, 0x2f, 0xc1, 0x7b, 0x30, 0x76, 0x64, 0x44, 0xed, - 0x8b, 0xa0, 0x38, 0x52, 0x22, 0xd1, 0x17, 0x60, 0x3b, 0x7d, 0xbf, 0x3b, 0xdf, 0x67, 0xe9, 0xe0, - 0x14, 0xa5, 0x16, 0xb2, 0xc8, 0x94, 0xc6, 0xc4, 0x14, 0x3c, 0x9d, 0xcb, 0x04, 0xdf, 0x72, 0x69, - 0xe3, 0xbc, 0x30, 0x68, 0xe8, 0x61, 0x13, 0xc7, 0x55, 0x3c, 0xb2, 0xd0, 0x7d, 0x34, 0x28, 0xe9, - 0x10, 0xbc, 0x25, 0x9f, 0x2b, 0xc1, 0xd1, 0x14, 0x3e, 0x09, 0x49, 0xd4, 0x67, 0x0d, 0xa0, 0x27, - 0xe0, 0x55, 0xfd, 0x13, 0x25, 0xfc, 0x76, 0x48, 0x22, 0x8f, 0xed, 0x56, 0x60, 0x2c, 0xca, 0x51, - 0x54, 0x99, 0xb4, 0xc8, 0xb3, 0xdc, 0xef, 0x84, 0x24, 0xea, 0xb0, 0x06, 0x50, 0x0a, 0x5d, 0xc1, - 0x91, 0xfb, 0x5d, 0x37, 0xe5, 0xea, 0xd1, 0x27, 0x01, 0xb8, 0x33, 0xd6, 0xaa, 0xdc, 0xed, 0x3e, - 0x83, 0x41, 0xbd, 0x6a, 0xa2, 0xb4, 0x90, 0xaf, 0xce, 0xa0, 0xc7, 0xf6, 0x6b, 0x3c, 0x2e, 0x29, - 0xbd, 0x80, 0xde, 0xd2, 0xa0, 0xb4, 0x7e, 0x3b, 0xec, 0x44, 0x7b, 0x97, 0xc7, 0xf1, 0xd6, 0x7f, - 0xe2, 0xf2, 0x41, 0x56, 0x75, 0xd1, 0x73, 0x38, 0xb0, 0x6a, 0xa6, 0xa5, 0x98, 0xfc, 0xf5, 0x1b, - 0x54, 0xfc, 0xa1, 0xb6, 0x1c, 0x82, 0x57, 0x22, 0x8e, 0x8b, 0x42, 0x3a, 0xd5, 0x3e, 0x6b, 0xc0, - 0xe8, 0x83, 0xc0, 0xd1, 0x2d, 0xd7, 0x46, 0xab, 0x94, 0xcf, 0xff, 0x95, 0xf8, 0xcd, 0xfd, 0xd7, - 0x3a, 0x20, 0xab, 0x75, 0x40, 0x7e, 0xd6, 0x01, 0x79, 0xdf, 0x04, 0xad, 0xd5, 0x26, 0x68, 0x7d, - 0x6f, 0x82, 0xd6, 0xd3, 0xf5, 0x4c, 0xe1, 0xcb, 0x62, 0x1a, 0xa7, 0x26, 0x4b, 0x52, 0x93, 0x49, - 0x9c, 0x3e, 0x63, 0x53, 0xb8, 0x83, 0x48, 0xb6, 0xce, 0x65, 0xba, 0xe3, 0x82, 0xab, 0xdf, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xc9, 0xaa, 0x6d, 0xe3, 0x4a, 0x02, 0x00, 0x00, + // 320 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x92, 0x3f, 0x4e, 0xfb, 0x30, + 0x14, 0xc7, 0xeb, 0xfe, 0xf9, 0xe9, 0x17, 0x53, 0x28, 0x78, 0x80, 0x48, 0x14, 0x2b, 0xea, 0x42, + 0x18, 0x48, 0x24, 0xe0, 0x04, 0x30, 0xa0, 0x2e, 0x0c, 0x16, 0x62, 0x60, 0xa9, 0xdc, 0xd8, 0x14, + 0x4b, 0x8d, 0x1d, 0xc5, 0xaf, 0x15, 0xdc, 0x82, 0x9d, 0x4b, 0x70, 0x0c, 0xc6, 0x8e, 0x8c, 0xa8, + 0xbd, 0x08, 0xb2, 0x23, 0x25, 0x12, 0xbd, 0x00, 0xdb, 0xd3, 0xe7, 0xbd, 0xaf, 0xdf, 0xc7, 0xd2, + 0xc3, 0x27, 0x20, 0xb5, 0x90, 0x65, 0xae, 0x34, 0xa4, 0xa6, 0xe4, 0xd9, 0x5c, 0xa6, 0xf0, 0x5a, + 0x48, 0x9b, 0x14, 0xa5, 0x01, 0x43, 0x0e, 0x9a, 0x76, 0x52, 0xb5, 0x47, 0x16, 0x77, 0x1f, 0x0c, + 0x48, 0x32, 0xc4, 0xc1, 0x92, 0xcf, 0x95, 0xe0, 0x60, 0xca, 0x10, 0x45, 0x28, 0xee, 0xb3, 0x06, + 0x90, 0x63, 0x1c, 0x54, 0xf3, 0x13, 0x25, 0xc2, 0x76, 0x84, 0xe2, 0x80, 0xfd, 0xaf, 0xc0, 0x58, + 0xb8, 0x28, 0xa8, 0x5c, 0x5a, 0xe0, 0x79, 0x11, 0x76, 0x22, 0x14, 0x77, 0x58, 0x03, 0x08, 0xc1, + 0x5d, 0xc1, 0x81, 0x87, 0x5d, 0x9f, 0xf2, 0xf5, 0xe8, 0x03, 0xe1, 0xdd, 0x5b, 0x63, 0xad, 0x2a, + 0xa4, 0x70, 0xdb, 0x2d, 0x39, 0xc5, 0x83, 0x7a, 0xdb, 0x44, 0x69, 0x21, 0x5f, 0xbc, 0x44, 0x8f, + 0xed, 0xd5, 0x78, 0xec, 0x28, 0x39, 0xc7, 0xbd, 0xa5, 0x4b, 0x84, 0xed, 0xa8, 0x13, 0xef, 0x5c, + 0x1c, 0x25, 0x5b, 0x5f, 0x4a, 0xdc, 0x8b, 0xac, 0x9a, 0x22, 0x67, 0x78, 0xdf, 0xaa, 0x99, 0x96, + 0x62, 0xf2, 0x5b, 0x71, 0x50, 0xf1, 0xfb, 0x5a, 0x74, 0x88, 0x03, 0x87, 0x38, 0x2c, 0x4a, 0xe9, + 0x6d, 0xfb, 0xac, 0x01, 0xa3, 0x77, 0x84, 0x0f, 0x6f, 0xb8, 0x36, 0x5a, 0x65, 0x7c, 0xfe, 0xd7, + 0xdc, 0xaf, 0xef, 0x3e, 0xd7, 0x14, 0xad, 0xd6, 0x14, 0x7d, 0xaf, 0x29, 0x7a, 0xdb, 0xd0, 0xd6, + 0x6a, 0x43, 0x5b, 0x5f, 0x1b, 0xda, 0x7a, 0xbc, 0x9a, 0x29, 0x78, 0x5e, 0x4c, 0x93, 0xcc, 0xe4, + 0x69, 0x66, 0x72, 0x09, 0xd3, 0x27, 0x68, 0x0a, 0x7f, 0x16, 0xe9, 0xd6, 0xd1, 0x4c, 0xff, 0xf9, + 0xc6, 0xe5, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb6, 0xa6, 0x0c, 0x3d, 0x50, 0x02, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -299,7 +299,7 @@ func (m *Vote) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *GossipVote) Marshal() (dAtA []byte, err error) { +func (m *GossipedVotes) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -309,12 +309,12 @@ func (m *GossipVote) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GossipVote) MarshalTo(dAtA []byte) (int, error) { +func (m *GossipedVotes) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -353,7 +353,7 @@ func (m *GossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *CanonicalGossipVote) Marshal() (dAtA []byte, err error) { +func (m *CanonicalGossipedVotes) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -363,12 +363,12 @@ func (m *CanonicalGossipVote) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *CanonicalGossipVote) MarshalTo(dAtA []byte) (int, error) { +func (m *CanonicalGossipedVotes) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *CanonicalGossipVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *CanonicalGossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -435,7 +435,7 @@ func (m *Vote) Size() (n int) { return n } -func (m *GossipVote) Size() (n int) { +func (m *GossipedVotes) Size() (n int) { if m == nil { return 0 } @@ -460,7 +460,7 @@ func (m *GossipVote) Size() (n int) { return n } -func (m *CanonicalGossipVote) Size() (n int) { +func (m *CanonicalGossipedVotes) Size() (n int) { if m == nil { return 0 } @@ -654,7 +654,7 @@ func (m *Vote) Unmarshal(dAtA []byte) error { } return nil } -func (m *GossipVote) Unmarshal(dAtA []byte) error { +func (m *GossipedVotes) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -677,10 +677,10 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GossipVote: wiretype end group for non-group") + return fmt.Errorf("proto: GossipedVotes: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GossipVote: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GossipedVotes: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -810,7 +810,7 @@ func (m *GossipVote) Unmarshal(dAtA []byte) error { } return nil } -func (m *CanonicalGossipVote) Unmarshal(dAtA []byte) error { +func (m *CanonicalGossipedVotes) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -833,10 +833,10 @@ func (m *CanonicalGossipVote) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: CanonicalGossipVote: wiretype end group for non-group") + return fmt.Errorf("proto: CanonicalGossipedVotes: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: CanonicalGossipVote: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CanonicalGossipedVotes: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index 623e9295cd2..779c8260ddf 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -10,14 +10,14 @@ message Vote { string data = 4; } -message GossipVote { +message GossipedVotes { int32 validator_index = 1; repeated Vote votes = 2; int64 signed_timestamp = 3; bytes signature = 4; } -message CanonicalGossipVote { +message CanonicalGossipedVotes { int32 validator_index = 1; repeated Vote votes = 2; int64 signed_timestamp = 3; diff --git a/proto/tendermint/privval/types.pb.go b/proto/tendermint/privval/types.pb.go index 8e2eb18d26d..133c9defc17 100644 --- a/proto/tendermint/privval/types.pb.go +++ b/proto/tendermint/privval/types.pb.go @@ -427,8 +427,8 @@ func (m *SignedProposalResponse) GetError() *RemoteSignerError { // SignOracleVoteRequest is a request to sign a vote type SignOracleVoteRequest struct { - Vote *oracle.GossipVote `protobuf:"bytes,1,opt,name=vote,proto3" json:"vote,omitempty"` - ChainId string `protobuf:"bytes,2,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + Vote *oracle.GossipedVotes `protobuf:"bytes,1,opt,name=vote,proto3" json:"vote,omitempty"` + ChainId string `protobuf:"bytes,2,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` } func (m *SignOracleVoteRequest) Reset() { *m = SignOracleVoteRequest{} } @@ -464,7 +464,7 @@ func (m *SignOracleVoteRequest) XXX_DiscardUnknown() { var xxx_messageInfo_SignOracleVoteRequest proto.InternalMessageInfo -func (m *SignOracleVoteRequest) GetVote() *oracle.GossipVote { +func (m *SignOracleVoteRequest) GetVote() *oracle.GossipedVotes { if m != nil { return m.Vote } @@ -480,8 +480,8 @@ func (m *SignOracleVoteRequest) GetChainId() string { // SignedOracleVoteResponse is a response containing a signed vote or an error type SignedOracleVoteResponse struct { - Vote oracle.GossipVote `protobuf:"bytes,1,opt,name=vote,proto3" json:"vote"` - Error *RemoteSignerError `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` + Vote oracle.GossipedVotes `protobuf:"bytes,1,opt,name=vote,proto3" json:"vote"` + Error *RemoteSignerError `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` } func (m *SignedOracleVoteResponse) Reset() { *m = SignedOracleVoteResponse{} } @@ -517,11 +517,11 @@ func (m *SignedOracleVoteResponse) XXX_DiscardUnknown() { var xxx_messageInfo_SignedOracleVoteResponse proto.InternalMessageInfo -func (m *SignedOracleVoteResponse) GetVote() oracle.GossipVote { +func (m *SignedOracleVoteResponse) GetVote() oracle.GossipedVotes { if m != nil { return m.Vote } - return oracle.GossipVote{} + return oracle.GossipedVotes{} } func (m *SignedOracleVoteResponse) GetError() *RemoteSignerError { @@ -813,61 +813,61 @@ func init() { func init() { proto.RegisterFile("tendermint/privval/types.proto", fileDescriptor_cb4e437a5328cf9c) } var fileDescriptor_cb4e437a5328cf9c = []byte{ - // 861 bytes of a gzipped FileDescriptorProto + // 862 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0x4d, 0x6f, 0xdb, 0x46, - 0x10, 0x25, 0x6d, 0xc9, 0xb2, 0x47, 0xfe, 0x50, 0xd6, 0x8e, 0xab, 0xb8, 0xb1, 0xe2, 0xaa, 0x68, - 0x9b, 0x1a, 0x05, 0xd5, 0xa6, 0x68, 0x7b, 0x48, 0x2f, 0xb5, 0x4d, 0x84, 0x82, 0x11, 0x52, 0x5d, - 0x2b, 0x4d, 0x10, 0xa0, 0x20, 0x24, 0x6a, 0x43, 0x13, 0xb1, 0xb8, 0x5b, 0x2e, 0x65, 0x40, 0xe7, - 0x1e, 0x0a, 0xf4, 0x14, 0xa0, 0x7f, 0xa2, 0x3f, 0x25, 0xc7, 0x1c, 0x7b, 0x2a, 0x0a, 0xfb, 0x8f, - 0x14, 0xda, 0x5d, 0xf1, 0x43, 0x94, 0x82, 0x04, 0xce, 0x6d, 0x77, 0x66, 0xf6, 0xcd, 0x7b, 0x33, - 0x7c, 0x82, 0xa0, 0x11, 0x93, 0x70, 0x40, 0xa2, 0x61, 0x10, 0xc6, 0x2d, 0x16, 0x05, 0x97, 0x97, - 0xbd, 0x8b, 0x56, 0x3c, 0x66, 0x84, 0x1b, 0x2c, 0xa2, 0x31, 0x45, 0x28, 0xcd, 0x1b, 0x2a, 0xbf, - 0x77, 0x37, 0xf3, 0xc6, 0x8b, 0xc6, 0x2c, 0xa6, 0xad, 0x97, 0x64, 0xac, 0x5e, 0xe4, 0xb2, 0x02, - 0x29, 0x8b, 0xb7, 0xb7, 0x9f, 0xc9, 0xd2, 0xa8, 0xe7, 0x5d, 0x90, 0x5c, 0x7a, 0xc7, 0xa7, 0x3e, - 0x15, 0xc7, 0xd6, 0xe4, 0x24, 0xa3, 0xcd, 0x36, 0xdc, 0xc2, 0x64, 0x48, 0x63, 0x72, 0x16, 0xf8, - 0x21, 0x89, 0xcc, 0x28, 0xa2, 0x11, 0x42, 0x50, 0xf2, 0xe8, 0x80, 0xd4, 0xf5, 0x03, 0xfd, 0x7e, - 0x19, 0x8b, 0x33, 0x3a, 0x80, 0xea, 0x80, 0x70, 0x2f, 0x0a, 0x58, 0x1c, 0xd0, 0xb0, 0xbe, 0x74, - 0xa0, 0xdf, 0x5f, 0xc3, 0xd9, 0x50, 0xf3, 0x10, 0x36, 0x3a, 0xa3, 0xfe, 0x29, 0x19, 0x63, 0xf2, - 0xdb, 0x88, 0xf0, 0x18, 0xdd, 0x81, 0x55, 0xef, 0xbc, 0x17, 0x84, 0x6e, 0x30, 0x10, 0x50, 0x6b, - 0xb8, 0x22, 0xee, 0xed, 0x41, 0xf3, 0x4f, 0x1d, 0x36, 0xa7, 0xc5, 0x9c, 0xd1, 0x90, 0x13, 0xf4, - 0x10, 0x2a, 0x6c, 0xd4, 0x77, 0x5f, 0x92, 0xb1, 0x28, 0xae, 0x3e, 0xb8, 0x6b, 0x64, 0x06, 0x24, - 0x87, 0x61, 0x74, 0x46, 0xfd, 0x8b, 0xc0, 0x3b, 0x25, 0xe3, 0xa3, 0xd2, 0xeb, 0x7f, 0xef, 0x69, - 0x78, 0x85, 0x09, 0x10, 0xf4, 0x10, 0xca, 0x64, 0x42, 0x5d, 0xf0, 0xaa, 0x3e, 0xf8, 0xcc, 0x28, - 0xce, 0xd6, 0x28, 0xe8, 0xc4, 0xf2, 0x4d, 0xf3, 0x19, 0x6c, 0x4d, 0xa2, 0xbf, 0xd0, 0x98, 0x4c, - 0xa9, 0x1f, 0x42, 0xe9, 0x92, 0xc6, 0x44, 0x31, 0xd9, 0xcd, 0xc2, 0xc9, 0x99, 0x8a, 0x62, 0x51, - 0x93, 0x93, 0xb9, 0x94, 0x97, 0xf9, 0xbb, 0x0e, 0x48, 0x34, 0x1c, 0x48, 0x70, 0x25, 0xf5, 0xeb, - 0x77, 0x41, 0x57, 0x0a, 0x65, 0x8f, 0x1b, 0xe9, 0x3b, 0x87, 0xed, 0x49, 0xb4, 0x13, 0x51, 0x46, - 0x79, 0xef, 0x62, 0xaa, 0xf1, 0x7b, 0x58, 0x65, 0x2a, 0xa4, 0x98, 0xec, 0x15, 0x99, 0x24, 0x8f, - 0x92, 0xda, 0xb7, 0xe9, 0xfd, 0x4b, 0x87, 0x5d, 0xa9, 0x37, 0x6d, 0xa6, 0x34, 0xff, 0xf8, 0x3e, - 0xdd, 0x94, 0xf6, 0xb4, 0xe7, 0x8d, 0xf4, 0x13, 0xb8, 0x3d, 0x89, 0x3a, 0xc2, 0x13, 0xd9, 0x2d, - 0x7f, 0x93, 0xdb, 0xc3, 0x7e, 0x16, 0x54, 0x1a, 0xc8, 0x78, 0x44, 0x39, 0x0f, 0xd8, 0xbb, 0x2d, - 0xfb, 0x95, 0x0e, 0x75, 0x29, 0x3e, 0xdb, 0x49, 0xc9, 0xff, 0xe1, 0x3d, 0x5a, 0x7d, 0xb8, 0xcd, - 0x6f, 0x40, 0xb5, 0x13, 0x84, 0xbe, 0xd2, 0xdb, 0xdc, 0x84, 0x75, 0x79, 0x95, 0xa4, 0x9a, 0x7f, - 0x54, 0xa0, 0xf2, 0x98, 0x70, 0xde, 0xf3, 0x09, 0x3a, 0x85, 0x2d, 0x65, 0x3f, 0x37, 0x92, 0xe5, - 0x8a, 0xeb, 0x27, 0xf3, 0x3a, 0xe6, 0x8c, 0x6e, 0x69, 0x78, 0x83, 0xe5, 0x9c, 0x6f, 0x43, 0x2d, - 0x05, 0x93, 0xcd, 0x14, 0xff, 0xe6, 0xdb, 0xd0, 0x64, 0xa5, 0xa5, 0xe1, 0x4d, 0x96, 0xff, 0x6d, - 0xf8, 0x19, 0x6e, 0xf1, 0xc0, 0x0f, 0xdd, 0xc9, 0x44, 0x12, 0x7a, 0xcb, 0x02, 0xf0, 0xd3, 0x79, - 0x80, 0x33, 0x76, 0xb6, 0x34, 0xbc, 0xc5, 0x67, 0x1c, 0xfe, 0x1c, 0x76, 0xb8, 0x58, 0xd6, 0x14, - 0x54, 0xd1, 0x2c, 0x09, 0xd4, 0xcf, 0x17, 0xa1, 0xe6, 0x9d, 0x6c, 0x69, 0x18, 0xf1, 0xa2, 0xbf, - 0x7f, 0x85, 0xdb, 0x82, 0xee, 0xf4, 0xf3, 0x4d, 0x28, 0x97, 0x05, 0xf8, 0x17, 0x8b, 0xc0, 0x67, - 0x1c, 0x6a, 0x69, 0x78, 0x9b, 0xcf, 0x31, 0xee, 0x0b, 0xa8, 0x2b, 0xea, 0x99, 0x06, 0x8a, 0xfe, - 0x8a, 0xe8, 0x70, 0xb8, 0x98, 0xfe, 0xac, 0x31, 0x2d, 0x0d, 0xef, 0xf2, 0xf9, 0x96, 0x3d, 0x81, - 0x75, 0x16, 0x84, 0x7e, 0xc2, 0xbe, 0x22, 0xb0, 0xef, 0xcd, 0xdd, 0x60, 0xfa, 0x95, 0x59, 0x1a, - 0xae, 0xb2, 0xf4, 0x8a, 0x1e, 0xc1, 0x86, 0x42, 0x51, 0x14, 0x57, 0x05, 0xcc, 0xc1, 0x62, 0x98, - 0x84, 0xd8, 0x3a, 0xcb, 0xdc, 0xd1, 0x40, 0xca, 0x76, 0xa5, 0x5f, 0xf2, 0xdf, 0xc2, 0x9a, 0xc0, - 0xfc, 0x72, 0x91, 0xec, 0x82, 0xf5, 0x2d, 0x0d, 0x8b, 0x15, 0x15, 0x7f, 0x13, 0x86, 0xf0, 0xb1, - 0x1a, 0x6e, 0xbe, 0x8f, 0x22, 0x0f, 0xa2, 0xd1, 0x57, 0x8b, 0xe7, 0x5b, 0xf4, 0xbe, 0xa5, 0x61, - 0xb5, 0xaf, 0x62, 0xee, 0xa8, 0x0c, 0xcb, 0x7c, 0x34, 0x3c, 0xfc, 0x5b, 0x87, 0x15, 0xe1, 0x5c, - 0x8e, 0x10, 0x6c, 0x9a, 0x18, 0x3b, 0xf8, 0xcc, 0x7d, 0x62, 0x9f, 0xda, 0xce, 0x53, 0xbb, 0xa6, - 0xa1, 0x06, 0xec, 0x25, 0x31, 0xf3, 0x59, 0xc7, 0x3c, 0xee, 0x9a, 0x27, 0x2e, 0x36, 0xcf, 0x3a, - 0x8e, 0x7d, 0x66, 0xd6, 0x74, 0x54, 0x87, 0x1d, 0x95, 0xb7, 0x1d, 0xf7, 0xd8, 0xb1, 0x6d, 0xf3, - 0xb8, 0xdb, 0x76, 0xec, 0xda, 0x12, 0xda, 0x87, 0x3b, 0x2a, 0x93, 0x86, 0xdd, 0x6e, 0xfb, 0xb1, - 0xe9, 0x3c, 0xe9, 0xd6, 0x96, 0xd1, 0x47, 0xb0, 0xad, 0xd2, 0xd8, 0xfc, 0xe9, 0x24, 0x49, 0x94, - 0x32, 0x88, 0x4f, 0x71, 0xbb, 0x6b, 0x26, 0x99, 0xf2, 0x91, 0xf3, 0xfa, 0xaa, 0xa1, 0xbf, 0xb9, - 0x6a, 0xe8, 0xff, 0x5d, 0x35, 0xf4, 0x57, 0xd7, 0x0d, 0xed, 0xcd, 0x75, 0x43, 0xfb, 0xe7, 0xba, - 0xa1, 0x3d, 0xff, 0xce, 0x0f, 0xe2, 0xf3, 0x51, 0xdf, 0xf0, 0xe8, 0xb0, 0xe5, 0xd1, 0x21, 0x89, - 0xfb, 0x2f, 0xe2, 0xf4, 0x20, 0xff, 0x7a, 0x14, 0xff, 0x13, 0xf5, 0x57, 0x44, 0xe6, 0xdb, 0xff, - 0x03, 0x00, 0x00, 0xff, 0xff, 0x72, 0xcc, 0x3e, 0x3c, 0x30, 0x09, 0x00, 0x00, + 0x10, 0x25, 0x6d, 0xc9, 0xb2, 0x47, 0xfe, 0x50, 0xd6, 0x8e, 0xab, 0xb8, 0x09, 0xe3, 0xaa, 0x68, + 0x9b, 0x1a, 0x05, 0x55, 0xa4, 0x1f, 0x87, 0xa6, 0x97, 0xda, 0x26, 0x42, 0xc1, 0x08, 0xa9, 0xae, + 0x95, 0x26, 0x08, 0x50, 0x10, 0x12, 0xb5, 0xa1, 0x89, 0x58, 0xdc, 0x2d, 0x97, 0x32, 0xa0, 0x73, + 0x0f, 0x05, 0x7a, 0x2a, 0x90, 0x3f, 0xd1, 0x9f, 0x92, 0x63, 0x8e, 0x3d, 0x15, 0x85, 0xfd, 0x47, + 0x0a, 0xed, 0xae, 0xf8, 0x61, 0x4a, 0x69, 0x83, 0xe4, 0xc6, 0x9d, 0x99, 0x7d, 0xf3, 0xde, 0x0c, + 0x1f, 0x41, 0x30, 0x12, 0x12, 0x0d, 0x49, 0x3c, 0x0a, 0xa3, 0xa4, 0xcd, 0xe2, 0xf0, 0xe2, 0xa2, + 0x7f, 0xde, 0x4e, 0x26, 0x8c, 0x70, 0x93, 0xc5, 0x34, 0xa1, 0x08, 0x65, 0x79, 0x53, 0xe5, 0xf7, + 0x6e, 0xe7, 0xee, 0xf8, 0xf1, 0x84, 0x25, 0xb4, 0xfd, 0x82, 0x4c, 0xd4, 0x8d, 0x42, 0x56, 0x20, + 0xe5, 0xf1, 0xf6, 0xee, 0xe4, 0xb2, 0x34, 0xee, 0xfb, 0xe7, 0xa4, 0x90, 0xde, 0x09, 0x68, 0x40, + 0xc5, 0x63, 0x7b, 0xfa, 0x24, 0xa3, 0xad, 0x0e, 0xdc, 0xc0, 0x64, 0x44, 0x13, 0x72, 0x1a, 0x06, + 0x11, 0x89, 0xad, 0x38, 0xa6, 0x31, 0x42, 0x50, 0xf1, 0xe9, 0x90, 0x34, 0xf5, 0x7d, 0xfd, 0x5e, + 0x15, 0x8b, 0x67, 0xb4, 0x0f, 0xf5, 0x21, 0xe1, 0x7e, 0x1c, 0xb2, 0x24, 0xa4, 0x51, 0x73, 0x69, + 0x5f, 0xbf, 0xb7, 0x86, 0xf3, 0xa1, 0xd6, 0x01, 0x6c, 0x74, 0xc7, 0x83, 0x13, 0x32, 0xc1, 0xe4, + 0x97, 0x31, 0xe1, 0x09, 0xba, 0x05, 0xab, 0xfe, 0x59, 0x3f, 0x8c, 0xbc, 0x70, 0x28, 0xa0, 0xd6, + 0x70, 0x4d, 0x9c, 0x3b, 0xc3, 0xd6, 0xef, 0x3a, 0x6c, 0xce, 0x8a, 0x39, 0xa3, 0x11, 0x27, 0xe8, + 0x01, 0xd4, 0xd8, 0x78, 0xe0, 0xbd, 0x20, 0x13, 0x51, 0x5c, 0xbf, 0x7f, 0xdb, 0xcc, 0x0d, 0x48, + 0x0e, 0xc3, 0xec, 0x8e, 0x07, 0xe7, 0xa1, 0x7f, 0x42, 0x26, 0x87, 0x95, 0x57, 0x7f, 0xdf, 0xd5, + 0xf0, 0x0a, 0x13, 0x20, 0xe8, 0x01, 0x54, 0xc9, 0x94, 0xba, 0xe0, 0x55, 0xbf, 0xff, 0x89, 0x59, + 0x9e, 0xad, 0x59, 0xd2, 0x89, 0xe5, 0x9d, 0xd6, 0x53, 0xd8, 0x9a, 0x46, 0x7f, 0xa2, 0x09, 0x99, + 0x51, 0x3f, 0x80, 0xca, 0x05, 0x4d, 0x88, 0x62, 0xb2, 0x9b, 0x87, 0x93, 0x33, 0x15, 0xc5, 0xa2, + 0xa6, 0x20, 0x73, 0xa9, 0x28, 0xf3, 0x57, 0x1d, 0x90, 0x68, 0x38, 0x94, 0xe0, 0x4a, 0xea, 0x97, + 0xff, 0x07, 0x5d, 0x29, 0x94, 0x3d, 0xde, 0x49, 0xdf, 0x19, 0x6c, 0x4f, 0xa3, 0xdd, 0x98, 0x32, + 0xca, 0xfb, 0xe7, 0x33, 0x8d, 0xdf, 0xc2, 0x2a, 0x53, 0x21, 0xc5, 0x64, 0xaf, 0xcc, 0x24, 0xbd, + 0x94, 0xd6, 0xbe, 0x49, 0xef, 0x4b, 0x1d, 0x76, 0xa5, 0xde, 0xac, 0x99, 0xd2, 0xfc, 0xfd, 0xdb, + 0x74, 0x53, 0xda, 0xb3, 0x9e, 0xef, 0xa8, 0xff, 0xe6, 0x34, 0xea, 0x0a, 0x4f, 0xe4, 0xb7, 0xfc, + 0x75, 0x61, 0x0f, 0xfb, 0x79, 0x50, 0x69, 0x20, 0xf3, 0x21, 0xe5, 0x3c, 0x64, 0x72, 0x7d, 0xfc, + 0xbf, 0xf7, 0xfd, 0x52, 0x87, 0xa6, 0xd4, 0x9f, 0x6f, 0xa6, 0x26, 0xf0, 0xdd, 0xdb, 0x75, 0x7b, + 0x7f, 0xfb, 0xdf, 0x80, 0x7a, 0x37, 0x8c, 0x02, 0xa5, 0xba, 0xb5, 0x09, 0xeb, 0xf2, 0x28, 0x79, + 0xb5, 0x7e, 0xab, 0x41, 0xed, 0x11, 0xe1, 0xbc, 0x1f, 0x10, 0x74, 0x02, 0x5b, 0xca, 0x84, 0x5e, + 0x2c, 0xcb, 0x15, 0xdd, 0x8f, 0xe6, 0x75, 0x2c, 0xd8, 0xdd, 0xd6, 0xf0, 0x06, 0x2b, 0xf8, 0xdf, + 0x81, 0x46, 0x06, 0x26, 0x9b, 0x29, 0xfe, 0xad, 0x37, 0xa1, 0xc9, 0x4a, 0x5b, 0xc3, 0x9b, 0xac, + 0xf8, 0x85, 0xf8, 0x11, 0x6e, 0xf0, 0x30, 0x88, 0xbc, 0xe9, 0x44, 0x52, 0x7a, 0xcb, 0x02, 0xf0, + 0xe3, 0x79, 0x80, 0xd7, 0x4c, 0x6d, 0x6b, 0x78, 0x8b, 0x5f, 0xf3, 0xf9, 0x33, 0xd8, 0xe1, 0x62, + 0x5f, 0x33, 0x50, 0x45, 0xb3, 0x22, 0x50, 0x3f, 0x5d, 0x84, 0x5a, 0xf4, 0xb3, 0xad, 0x61, 0xc4, + 0xcb, 0x2e, 0xff, 0x19, 0x6e, 0x0a, 0xba, 0xb3, 0x97, 0x38, 0xa5, 0x5c, 0x15, 0xe0, 0x9f, 0x2d, + 0x02, 0xbf, 0xe6, 0x53, 0x5b, 0xc3, 0xdb, 0x7c, 0x8e, 0x7d, 0x9f, 0x43, 0x53, 0x51, 0xcf, 0x35, + 0x50, 0xf4, 0x57, 0x44, 0x87, 0x83, 0xc5, 0xf4, 0xaf, 0xdb, 0xd3, 0xd6, 0xf0, 0x2e, 0x9f, 0x6f, + 0xdc, 0x63, 0x58, 0x67, 0x61, 0x14, 0xa4, 0xec, 0x6b, 0x02, 0xfb, 0xee, 0xdc, 0x0d, 0x66, 0x6f, + 0x99, 0xad, 0xe1, 0x3a, 0xcb, 0x8e, 0xe8, 0x21, 0x6c, 0x28, 0x14, 0x45, 0x71, 0xb5, 0xec, 0x82, + 0x22, 0x4c, 0x4a, 0x6c, 0x9d, 0xe5, 0xce, 0x68, 0x28, 0x65, 0x7b, 0xd2, 0x32, 0xc5, 0x77, 0x61, + 0x4d, 0x60, 0x7e, 0xbe, 0x48, 0x76, 0xe9, 0x03, 0x60, 0x6b, 0x58, 0xac, 0xa8, 0xfc, 0x65, 0x18, + 0xc1, 0x87, 0x6a, 0xb8, 0xc5, 0x3e, 0x8a, 0x3c, 0x88, 0x46, 0x5f, 0x2c, 0x9e, 0x6f, 0xd9, 0xfe, + 0xb6, 0x86, 0xd5, 0xbe, 0xca, 0xb9, 0xc3, 0x2a, 0x2c, 0xf3, 0xf1, 0xe8, 0xe0, 0x4f, 0x1d, 0x56, + 0x84, 0x73, 0x39, 0x42, 0xb0, 0x69, 0x61, 0xec, 0xe2, 0x53, 0xef, 0xb1, 0x73, 0xe2, 0xb8, 0x4f, + 0x9c, 0x86, 0x86, 0x0c, 0xd8, 0x4b, 0x63, 0xd6, 0xd3, 0xae, 0x75, 0xd4, 0xb3, 0x8e, 0x3d, 0x6c, + 0x9d, 0x76, 0x5d, 0xe7, 0xd4, 0x6a, 0xe8, 0xa8, 0x09, 0x3b, 0x2a, 0xef, 0xb8, 0xde, 0x91, 0xeb, + 0x38, 0xd6, 0x51, 0xaf, 0xe3, 0x3a, 0x8d, 0x25, 0x74, 0x07, 0x6e, 0xa9, 0x4c, 0x16, 0xf6, 0x7a, + 0x9d, 0x47, 0x96, 0xfb, 0xb8, 0xd7, 0x58, 0x46, 0x1f, 0xc0, 0xb6, 0x4a, 0x63, 0xeb, 0x87, 0xe3, + 0x34, 0x51, 0xc9, 0x21, 0x3e, 0xc1, 0x9d, 0x9e, 0x95, 0x66, 0xaa, 0x87, 0xee, 0xab, 0x4b, 0x43, + 0x7f, 0x7d, 0x69, 0xe8, 0xff, 0x5c, 0x1a, 0xfa, 0x1f, 0x57, 0x86, 0xf6, 0xfa, 0xca, 0xd0, 0xfe, + 0xba, 0x32, 0xb4, 0x67, 0xdf, 0x04, 0x61, 0x72, 0x36, 0x1e, 0x98, 0x3e, 0x1d, 0xb5, 0x7d, 0x3a, + 0x22, 0xc9, 0xe0, 0x79, 0x92, 0x3d, 0xc8, 0x1f, 0x90, 0xf2, 0x9f, 0xd1, 0x60, 0x45, 0x64, 0xbe, + 0xfa, 0x37, 0x00, 0x00, 0xff, 0xff, 0x84, 0xfc, 0x98, 0x3d, 0x36, 0x09, 0x00, 0x00, } func (m *RemoteSignerError) Marshal() (dAtA []byte, err error) { @@ -2672,7 +2672,7 @@ func (m *SignOracleVoteRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Vote == nil { - m.Vote = &oracle.GossipVote{} + m.Vote = &oracle.GossipedVotes{} } if err := m.Vote.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err diff --git a/proto/tendermint/privval/types.proto b/proto/tendermint/privval/types.proto index bc3f3932cc7..2ac38a702d7 100644 --- a/proto/tendermint/privval/types.proto +++ b/proto/tendermint/privval/types.proto @@ -59,13 +59,13 @@ message SignedProposalResponse { // SignOracleVoteRequest is a request to sign a vote message SignOracleVoteRequest { - tendermint.oracle.GossipVote vote = 1; + tendermint.oracle.GossipedVotes vote = 1; string chain_id = 2; } // SignedOracleVoteResponse is a response containing a signed vote or an error message SignedOracleVoteResponse { - tendermint.oracle.GossipVote vote = 1 [(gogoproto.nullable) = false]; + tendermint.oracle.GossipedVotes vote = 1 [(gogoproto.nullable) = false]; RemoteSignerError error = 2; } diff --git a/proxy/app_conn.go b/proxy/app_conn.go index 1a46247ccc2..6d411b91c29 100644 --- a/proxy/app_conn.go +++ b/proxy/app_conn.go @@ -24,8 +24,8 @@ type AppConnConsensus interface { VerifyVoteExtension(context.Context, *types.RequestVerifyVoteExtension) (*types.ResponseVerifyVoteExtension, error) FinalizeBlock(context.Context, *types.RequestFinalizeBlock) (*types.ResponseFinalizeBlock, error) Commit(context.Context) (*types.ResponseCommit, error) - SignGossipVote(context.Context, *types.RequestSignGossipVote) (*types.ResponseSignGossipVote, error) - PrepareOracleVotes(context.Context, *types.RequestPrepareOracleVotes) (*types.ResponsePrepareOracleVotes, error) + CreateOracleResultTx(context.Context, *types.RequestCreateOracleResultTx) (*types.ResponseCreateOracleResultTx, error) + FetchOracleVotes(context.Context, *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error) ValidateOracleVotes(context.Context, *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) } @@ -112,14 +112,14 @@ func (app *appConnConsensus) Commit(ctx context.Context) (*types.ResponseCommit, return app.appConn.Commit(ctx, &types.RequestCommit{}) } -func (app *appConnConsensus) SignGossipVote(ctx context.Context, req *types.RequestSignGossipVote) (*types.ResponseSignGossipVote, error) { +func (app *appConnConsensus) CreateOracleResultTx(ctx context.Context, req *types.RequestCreateOracleResultTx) (*types.ResponseCreateOracleResultTx, error) { defer addTimeSample(app.metrics.MethodTimingSeconds.With("method", "commit", "type", "sync"))() - return app.appConn.SignGossipVote(ctx, req) + return app.appConn.CreateOracleResultTx(ctx, req) } -func (app *appConnConsensus) PrepareOracleVotes(ctx context.Context, req *types.RequestPrepareOracleVotes) (*types.ResponsePrepareOracleVotes, error) { +func (app *appConnConsensus) FetchOracleVotes(ctx context.Context, req *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error) { defer addTimeSample(app.metrics.MethodTimingSeconds.With("method", "commit", "type", "sync"))() - return app.appConn.PrepareOracleVotes(ctx, req) + return app.appConn.FetchOracleVotes(ctx, req) } func (app *appConnConsensus) ValidateOracleVotes(ctx context.Context, req *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) { diff --git a/proxy/mocks/app_conn_consensus.go b/proxy/mocks/app_conn_consensus.go index 28e114d6357..5b4e653e0ec 100644 --- a/proxy/mocks/app_conn_consensus.go +++ b/proxy/mocks/app_conn_consensus.go @@ -133,24 +133,24 @@ func (_m *AppConnConsensus) InitChain(_a0 context.Context, _a1 *types.RequestIni return r0, r1 } -// PrepareOracleVotes provides a mock function with given fields: _a0, _a1 -func (_m *AppConnConsensus) PrepareOracleVotes(_a0 context.Context, _a1 *types.RequestPrepareOracleVotes) (*types.ResponsePrepareOracleVotes, error) { +// FetchOracleVotes provides a mock function with given fields: _a0, _a1 +func (_m *AppConnConsensus) FetchOracleVotes(_a0 context.Context, _a1 *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error) { ret := _m.Called(_a0, _a1) - var r0 *types.ResponsePrepareOracleVotes + var r0 *types.ResponseFetchOracleVotes var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestPrepareOracleVotes) (*types.ResponsePrepareOracleVotes, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error)); ok { return rf(_a0, _a1) } - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestPrepareOracleVotes) *types.ResponsePrepareOracleVotes); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFetchOracleVotes) *types.ResponseFetchOracleVotes); ok { r0 = rf(_a0, _a1) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.ResponsePrepareOracleVotes) + r0 = ret.Get(0).(*types.ResponseFetchOracleVotes) } } - if rf, ok := ret.Get(1).(func(context.Context, *types.RequestPrepareOracleVotes) error); ok { + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestFetchOracleVotes) error); ok { r1 = rf(_a0, _a1) } else { r1 = ret.Error(1) @@ -211,24 +211,24 @@ func (_m *AppConnConsensus) ProcessProposal(_a0 context.Context, _a1 *types.Requ return r0, r1 } -// SignGossipVote provides a mock function with given fields: _a0, _a1 -func (_m *AppConnConsensus) SignGossipVote(_a0 context.Context, _a1 *types.RequestSignGossipVote) (*types.ResponseSignGossipVote, error) { +// CreateOracleResultTx provides a mock function with given fields: _a0, _a1 +func (_m *AppConnConsensus) CreateOracleResultTx(_a0 context.Context, _a1 *types.RequestCreateOracleResultTx) (*types.ResponseCreateOracleResultTx, error) { ret := _m.Called(_a0, _a1) - var r0 *types.ResponseSignGossipVote + var r0 *types.ResponseCreateOracleResultTx var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestSignGossipVote) (*types.ResponseSignGossipVote, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestCreateOracleResultTx) (*types.ResponseCreateOracleResultTx, error)); ok { return rf(_a0, _a1) } - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestSignGossipVote) *types.ResponseSignGossipVote); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestCreateOracleResultTx) *types.ResponseCreateOracleResultTx); ok { r0 = rf(_a0, _a1) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.ResponseSignGossipVote) + r0 = ret.Get(0).(*types.ResponseCreateOracleResultTx) } } - if rf, ok := ret.Get(1).(func(context.Context, *types.RequestSignGossipVote) error); ok { + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestCreateOracleResultTx) error); ok { r1 = rf(_a0, _a1) } else { r1 = ret.Error(1) diff --git a/state/execution.go b/state/execution.go index 393f050338e..355e77569a3 100644 --- a/state/execution.go +++ b/state/execution.go @@ -135,32 +135,32 @@ func (blockExec *BlockExecutor) CreateProposalBlock( oracleVotesBuffer := blockExec.oracleInfo.GossipVoteBuffer.Buffer blockExec.oracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() - var signGossipVoteTxBz []byte + var CreateOracleResultTxBz []byte if len(oracleVotesBuffer) > 0 { - votes := []*oracleproto.GossipVote{} + votes := []*oracleproto.GossipedVotes{} for _, vote := range oracleVotesBuffer { votes = append(votes, vote) } - resp, err := blockExec.proxyApp.SignGossipVote(ctx, &abci.RequestSignGossipVote{ + resp, err := blockExec.proxyApp.CreateOracleResultTx(ctx, &abci.RequestCreateOracleResultTx{ ProposerAddress: proposerAddr, - GossipVotes: votes, + GossipedVotes: votes, Height: height, }) if err != nil { - blockExec.logger.Error("error in proxyAppConn.SignGossipVote", "err", err) + blockExec.logger.Error("error in proxyAppConn.CreateOracleResultTx", "err", err) } - signGossipVoteTxBz = resp.EncodedTx + CreateOracleResultTxBz = resp.EncodedTx } var txs types.Txs commit := lastExtCommit.ToCommit() - if len(signGossipVoteTxBz) > 0 { - maxReapBytes -= int64(len(signGossipVoteTxBz)) + if len(CreateOracleResultTxBz) > 0 { + maxReapBytes -= int64(len(CreateOracleResultTxBz)) txs = blockExec.mempool.ReapMaxBytesMaxGas(maxReapBytes, maxGas) - signGossipVoteTx := types.Tx(signGossipVoteTxBz) - txs = append([]types.Tx{signGossipVoteTx}, txs...) + CreateOracleResultTx := types.Tx(CreateOracleResultTxBz) + txs = append([]types.Tx{CreateOracleResultTx}, txs...) } block := state.MakeBlock(height, txs, commit, evidence, proposerAddr) diff --git a/types/oracle.go b/types/oracle.go index 2c7db74597c..fca713cf2ae 100644 --- a/types/oracle.go +++ b/types/oracle.go @@ -5,7 +5,7 @@ import ( oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" ) -func OracleVoteSignBytes(vote *oracleproto.GossipVote) []byte { +func OracleVoteSignBytes(vote *oracleproto.GossipedVotes) []byte { pb := CanonicalizeOracleVote(vote) bz, err := protoio.MarshalDelimited(&pb) if err != nil { @@ -15,8 +15,8 @@ func OracleVoteSignBytes(vote *oracleproto.GossipVote) []byte { return bz } -func CanonicalizeOracleVote(vote *oracleproto.GossipVote) oracleproto.CanonicalGossipVote { - return oracleproto.CanonicalGossipVote{ +func CanonicalizeOracleVote(vote *oracleproto.GossipedVotes) oracleproto.CanonicalGossipedVotes { + return oracleproto.CanonicalGossipedVotes{ ValidatorIndex: vote.ValidatorIndex, Votes: vote.Votes, SignedTimestamp: vote.SignedTimestamp, diff --git a/types/priv_validator.go b/types/priv_validator.go index 0481370329d..45da4d6a337 100644 --- a/types/priv_validator.go +++ b/types/priv_validator.go @@ -18,7 +18,7 @@ type PrivValidator interface { SignVote(chainID string, vote *cmtproto.Vote) error SignProposal(chainID string, proposal *cmtproto.Proposal) error - SignOracleVote(chainID string, oracleVote *oracleproto.GossipVote) error + SignOracleVote(chainID string, oracleVote *oracleproto.GossipedVotes) error } type PrivValidatorsByAddress []PrivValidator @@ -101,7 +101,7 @@ func (pv MockPV) SignVote(chainID string, vote *cmtproto.Vote) error { } // Implements PrivValidator. -func (pv MockPV) SignOracleVote(chainID string, vote *oracleproto.GossipVote) error { +func (pv MockPV) SignOracleVote(chainID string, vote *oracleproto.GossipedVotes) error { signBytes := OracleVoteSignBytes(vote) sig, err := pv.PrivKey.Sign(signBytes) if err != nil { From 42fab7ff720fb9235168a3394993e22b6ae98aa8 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Thu, 2 May 2024 12:59:59 +0800 Subject: [PATCH 077/150] update val address type to string --- proto/tendermint/oracle/types.pb.go | 62 ++++++++++++++--------------- proto/tendermint/oracle/types.proto | 2 +- 2 files changed, 31 insertions(+), 33 deletions(-) diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index fb5a7230901..725073f07f0 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -23,7 +23,7 @@ var _ = math.Inf const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type Vote struct { - Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` + Validator string `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` OracleId string `protobuf:"bytes,2,opt,name=oracle_id,json=oracleId,proto3" json:"oracle_id,omitempty"` Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` Data string `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` @@ -62,11 +62,11 @@ func (m *Vote) XXX_DiscardUnknown() { var xxx_messageInfo_Vote proto.InternalMessageInfo -func (m *Vote) GetValidator() []byte { +func (m *Vote) GetValidator() string { if m != nil { return m.Validator } - return nil + return "" } func (m *Vote) GetOracleId() string { @@ -227,27 +227,27 @@ func init() { func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 320 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x92, 0x3f, 0x4e, 0xfb, 0x30, - 0x14, 0xc7, 0xeb, 0xfe, 0xf9, 0xe9, 0x17, 0x53, 0x28, 0x78, 0x80, 0x48, 0x14, 0x2b, 0xea, 0x42, - 0x18, 0x48, 0x24, 0xe0, 0x04, 0x30, 0xa0, 0x2e, 0x0c, 0x16, 0x62, 0x60, 0xa9, 0xdc, 0xd8, 0x14, - 0x4b, 0x8d, 0x1d, 0xc5, 0xaf, 0x15, 0xdc, 0x82, 0x9d, 0x4b, 0x70, 0x0c, 0xc6, 0x8e, 0x8c, 0xa8, - 0xbd, 0x08, 0xb2, 0x23, 0x25, 0x12, 0xbd, 0x00, 0xdb, 0xd3, 0xe7, 0xbd, 0xaf, 0xdf, 0xc7, 0xd2, - 0xc3, 0x27, 0x20, 0xb5, 0x90, 0x65, 0xae, 0x34, 0xa4, 0xa6, 0xe4, 0xd9, 0x5c, 0xa6, 0xf0, 0x5a, - 0x48, 0x9b, 0x14, 0xa5, 0x01, 0x43, 0x0e, 0x9a, 0x76, 0x52, 0xb5, 0x47, 0x16, 0x77, 0x1f, 0x0c, - 0x48, 0x32, 0xc4, 0xc1, 0x92, 0xcf, 0x95, 0xe0, 0x60, 0xca, 0x10, 0x45, 0x28, 0xee, 0xb3, 0x06, - 0x90, 0x63, 0x1c, 0x54, 0xf3, 0x13, 0x25, 0xc2, 0x76, 0x84, 0xe2, 0x80, 0xfd, 0xaf, 0xc0, 0x58, - 0xb8, 0x28, 0xa8, 0x5c, 0x5a, 0xe0, 0x79, 0x11, 0x76, 0x22, 0x14, 0x77, 0x58, 0x03, 0x08, 0xc1, - 0x5d, 0xc1, 0x81, 0x87, 0x5d, 0x9f, 0xf2, 0xf5, 0xe8, 0x03, 0xe1, 0xdd, 0x5b, 0x63, 0xad, 0x2a, - 0xa4, 0x70, 0xdb, 0x2d, 0x39, 0xc5, 0x83, 0x7a, 0xdb, 0x44, 0x69, 0x21, 0x5f, 0xbc, 0x44, 0x8f, - 0xed, 0xd5, 0x78, 0xec, 0x28, 0x39, 0xc7, 0xbd, 0xa5, 0x4b, 0x84, 0xed, 0xa8, 0x13, 0xef, 0x5c, - 0x1c, 0x25, 0x5b, 0x5f, 0x4a, 0xdc, 0x8b, 0xac, 0x9a, 0x22, 0x67, 0x78, 0xdf, 0xaa, 0x99, 0x96, - 0x62, 0xf2, 0x5b, 0x71, 0x50, 0xf1, 0xfb, 0x5a, 0x74, 0x88, 0x03, 0x87, 0x38, 0x2c, 0x4a, 0xe9, - 0x6d, 0xfb, 0xac, 0x01, 0xa3, 0x77, 0x84, 0x0f, 0x6f, 0xb8, 0x36, 0x5a, 0x65, 0x7c, 0xfe, 0xd7, - 0xdc, 0xaf, 0xef, 0x3e, 0xd7, 0x14, 0xad, 0xd6, 0x14, 0x7d, 0xaf, 0x29, 0x7a, 0xdb, 0xd0, 0xd6, - 0x6a, 0x43, 0x5b, 0x5f, 0x1b, 0xda, 0x7a, 0xbc, 0x9a, 0x29, 0x78, 0x5e, 0x4c, 0x93, 0xcc, 0xe4, - 0x69, 0x66, 0x72, 0x09, 0xd3, 0x27, 0x68, 0x0a, 0x7f, 0x16, 0xe9, 0xd6, 0xd1, 0x4c, 0xff, 0xf9, - 0xc6, 0xe5, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb6, 0xa6, 0x0c, 0x3d, 0x50, 0x02, 0x00, 0x00, + // 316 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x92, 0x3d, 0x4e, 0xc3, 0x30, + 0x14, 0xc7, 0xeb, 0x7e, 0x20, 0x62, 0x3e, 0x0a, 0x1e, 0x20, 0x12, 0xc5, 0xaa, 0xba, 0x50, 0x06, + 0x12, 0x09, 0x38, 0x01, 0x0c, 0xa8, 0x0b, 0x43, 0x84, 0x18, 0x58, 0x2a, 0x27, 0x36, 0xc5, 0x52, + 0x62, 0x47, 0xf1, 0x6b, 0x05, 0xb7, 0x60, 0xe7, 0x12, 0x1c, 0x83, 0xb1, 0x23, 0x23, 0x4a, 0x2e, + 0x82, 0xec, 0x48, 0x89, 0x44, 0x2f, 0xc0, 0xf6, 0xf4, 0xfb, 0xbf, 0xe7, 0xf7, 0xb3, 0xf4, 0xf0, + 0x29, 0x08, 0xc5, 0x45, 0x91, 0x49, 0x05, 0xa1, 0x2e, 0x58, 0x92, 0x8a, 0x10, 0xde, 0x72, 0x61, + 0x82, 0xbc, 0xd0, 0xa0, 0xc9, 0x61, 0x1b, 0x07, 0x75, 0x3c, 0x31, 0xb8, 0xff, 0xa8, 0x41, 0x90, + 0x11, 0xf6, 0x56, 0x2c, 0x95, 0x9c, 0x81, 0x2e, 0x7c, 0x34, 0x46, 0x53, 0x2f, 0x6a, 0x01, 0x39, + 0xc1, 0x5e, 0xdd, 0x3f, 0x97, 0xdc, 0xef, 0xba, 0x74, 0xbb, 0x06, 0x33, 0x6e, 0x47, 0x41, 0x66, + 0xc2, 0x00, 0xcb, 0x72, 0xbf, 0x37, 0x46, 0xd3, 0x5e, 0xd4, 0x02, 0x42, 0x70, 0x9f, 0x33, 0x60, + 0x7e, 0xdf, 0x4d, 0xb9, 0x7a, 0xf2, 0x89, 0xf0, 0xde, 0x9d, 0x36, 0x46, 0xe6, 0x82, 0xdb, 0xed, + 0x86, 0x9c, 0xe1, 0x61, 0xb3, 0x6d, 0x2e, 0x15, 0x17, 0xaf, 0x4e, 0x62, 0x10, 0xed, 0x37, 0x78, + 0x66, 0x29, 0xb9, 0xc0, 0x83, 0x95, 0x9d, 0xf0, 0xbb, 0xe3, 0xde, 0x74, 0xe7, 0xf2, 0x38, 0xd8, + 0xf8, 0x52, 0x60, 0x5f, 0x8c, 0xea, 0x2e, 0x72, 0x8e, 0x0f, 0x8c, 0x5c, 0x28, 0xc1, 0xe7, 0x7f, + 0x15, 0x87, 0x35, 0x7f, 0x68, 0x44, 0x47, 0xd8, 0xb3, 0x88, 0xc1, 0xb2, 0x10, 0xce, 0x76, 0x37, + 0x6a, 0xc1, 0xe4, 0x03, 0xe1, 0xa3, 0x5b, 0xa6, 0xb4, 0x92, 0x09, 0x4b, 0xff, 0x9b, 0xfb, 0xcd, + 0xfd, 0x57, 0x49, 0xd1, 0xba, 0xa4, 0xe8, 0xa7, 0xa4, 0xe8, 0xbd, 0xa2, 0x9d, 0x75, 0x45, 0x3b, + 0xdf, 0x15, 0xed, 0x3c, 0x5d, 0x2f, 0x24, 0xbc, 0x2c, 0xe3, 0x20, 0xd1, 0x59, 0x98, 0xe8, 0x4c, + 0x40, 0xfc, 0x0c, 0x6d, 0xe1, 0xce, 0x22, 0xdc, 0x38, 0x9a, 0x78, 0xcb, 0x05, 0x57, 0xbf, 0x01, + 0x00, 0x00, 0xff, 0xff, 0x64, 0xa4, 0x9b, 0xfc, 0x50, 0x02, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -520,7 +520,7 @@ func (m *Vote) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) } - var byteLen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -530,25 +530,23 @@ func (m *Vote) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + byteLen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) - if m.Validator == nil { - m.Validator = []byte{} - } + m.Validator = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index 779c8260ddf..fc1986cda46 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -4,7 +4,7 @@ package tendermint.oracle; option go_package = "github.com/cometbft/cometbft/proto/tendermint/oracle"; message Vote { - bytes validator = 1; + string validator = 1; string oracle_id = 2; int64 timestamp = 3; string data = 4; From 7ef4c204e30ade56da01ef1fcc5d79e53ea69fdc Mon Sep 17 00:00:00 2001 From: yan-soon Date: Thu, 2 May 2024 16:24:18 +0800 Subject: [PATCH 078/150] fix bug with prepareProposal when nil oracleCreateTx is found --- oracle/reactor.go | 1 - state/execution.go | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 3889bf430b9..d7b2bb9c383 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -116,7 +116,6 @@ func (oracleR *Reactor) GetChannels() []*p2p.ChannelDescriptor { func (oracleR *Reactor) AddPeer(peer p2p.Peer) { go func() { oracleR.broadcastVoteRoutine(peer) - time.Sleep(100 * time.Millisecond) }() } diff --git a/state/execution.go b/state/execution.go index 355e77569a3..d0041ee059d 100644 --- a/state/execution.go +++ b/state/execution.go @@ -153,10 +153,11 @@ func (blockExec *BlockExecutor) CreateProposalBlock( CreateOracleResultTxBz = resp.EncodedTx } - var txs types.Txs + txs := blockExec.mempool.ReapMaxBytesMaxGas(maxReapBytes, maxGas) commit := lastExtCommit.ToCommit() if len(CreateOracleResultTxBz) > 0 { + txs = types.Txs{} maxReapBytes -= int64(len(CreateOracleResultTxBz)) txs = blockExec.mempool.ReapMaxBytesMaxGas(maxReapBytes, maxGas) CreateOracleResultTx := types.Tx(CreateOracleResultTxBz) From 5ac3eba06b6f54262f78cce87d3d2485635d20d1 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Thu, 2 May 2024 18:10:21 +0800 Subject: [PATCH 079/150] update validateOracleVotes response --- abci/types/types.pb.go | 415 +++++++++++++++--------------- proto/tendermint/abci/types.proto | 4 +- 2 files changed, 210 insertions(+), 209 deletions(-) diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go index 9c94f319924..a327a2fd576 100644 --- a/abci/types/types.pb.go +++ b/abci/types/types.pb.go @@ -225,18 +225,18 @@ func (ResponseVerifyVoteExtension_VerifyStatus) EnumDescriptor() ([]byte, []int) type ResponseValidateOracleVotes_Status int32 const ( - ResponseValidateOracleVotes_present ResponseValidateOracleVotes_Status = 0 - ResponseValidateOracleVotes_absent ResponseValidateOracleVotes_Status = 1 + ResponseValidateOracleVotes_absent ResponseValidateOracleVotes_Status = 0 + ResponseValidateOracleVotes_present ResponseValidateOracleVotes_Status = 1 ) var ResponseValidateOracleVotes_Status_name = map[int32]string{ - 0: "present", - 1: "absent", + 0: "absent", + 1: "present", } var ResponseValidateOracleVotes_Status_value = map[string]int32{ - "present": 0, - "absent": 1, + "absent": 0, + "present": 1, } func (x ResponseValidateOracleVotes_Status) String() string { @@ -3199,7 +3199,7 @@ func (m *ResponseValidateOracleVotes) GetStatus() ResponseValidateOracleVotes_St if m != nil { return m.Status } - return ResponseValidateOracleVotes_present + return ResponseValidateOracleVotes_absent } type CommitInfo struct { @@ -4055,7 +4055,7 @@ func init() { func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) } var fileDescriptor_252557cfdd89a31a = []byte{ - // 3503 bytes of a gzipped FileDescriptorProto + // 3506 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcb, 0x73, 0x1b, 0xc7, 0xd1, 0xc7, 0xe2, 0x45, 0xa0, 0xf1, 0xe0, 0x72, 0x48, 0x49, 0x10, 0x24, 0x91, 0xd4, 0xba, 0x6c, 0xcb, 0x92, 0x4d, 0xfa, 0x93, 0x3e, 0xd9, 0x56, 0xc9, 0xfe, 0xaa, 0x48, 0x08, 0x12, 0x48, 0xc9, @@ -4063,132 +4063,132 @@ var fileDescriptor_252557cfdd89a31a = []byte{ 0x05, 0x0d, 0xfa, 0x94, 0x8a, 0x93, 0xaa, 0x94, 0x4f, 0xae, 0xca, 0xc5, 0x87, 0xf8, 0x90, 0x43, 0x0e, 0xc9, 0x5f, 0x90, 0x54, 0xaa, 0x72, 0xca, 0xc1, 0x87, 0x1c, 0x7c, 0xcc, 0xc9, 0x49, 0x59, 0x37, 0x57, 0xe5, 0x94, 0x43, 0xae, 0xa9, 0x79, 0xec, 0x0b, 0xd8, 0xc5, 0x43, 0x76, 0x0e, 0xa9, - 0xe4, 0xb6, 0xd3, 0xe8, 0xee, 0x99, 0xe9, 0xe9, 0x99, 0xee, 0xf9, 0xf5, 0x00, 0x2e, 0xd8, 0x78, + 0xe4, 0x86, 0xe9, 0xed, 0xee, 0x99, 0xe9, 0xe9, 0x99, 0xee, 0xf9, 0xf5, 0x00, 0x2e, 0xd8, 0x78, 0xd0, 0xc2, 0x66, 0x5f, 0x1b, 0xd8, 0xdb, 0x6a, 0xa3, 0xa9, 0x6d, 0xdb, 0xa7, 0x06, 0xb6, 0xb6, - 0x0c, 0x53, 0xb7, 0x75, 0xb4, 0xec, 0xfd, 0xb8, 0x45, 0x7e, 0x2c, 0x5f, 0xf2, 0x71, 0x37, 0xcd, - 0x53, 0xc3, 0xd6, 0xb7, 0x0d, 0x53, 0xd7, 0xdb, 0x8c, 0xbf, 0x7c, 0x71, 0xf2, 0xe7, 0x27, 0xf8, - 0x94, 0x6b, 0x0b, 0x08, 0xd3, 0x5e, 0xb6, 0x0d, 0xd5, 0x54, 0xfb, 0xce, 0xcf, 0x9b, 0x13, 0x3f, - 0x9f, 0xa8, 0x3d, 0xad, 0xa5, 0xda, 0xba, 0xc9, 0x39, 0x36, 0x3a, 0xba, 0xde, 0xe9, 0xe1, 0x6d, - 0xda, 0x6a, 0x0c, 0xdb, 0xdb, 0xb6, 0xd6, 0xc7, 0x96, 0xad, 0xf6, 0x0d, 0xce, 0xb0, 0xd6, 0xd1, - 0x3b, 0x3a, 0xfd, 0xdc, 0x26, 0x5f, 0x21, 0xfd, 0xea, 0xa6, 0xda, 0xec, 0x61, 0xff, 0x24, 0xa5, - 0xa7, 0x39, 0x58, 0x92, 0xf1, 0x87, 0x43, 0x6c, 0xd9, 0xe8, 0x3a, 0x24, 0x71, 0xb3, 0xab, 0x97, - 0x84, 0x4d, 0xe1, 0x4a, 0xee, 0xfa, 0xc5, 0xad, 0xb1, 0xf9, 0x6f, 0x71, 0xbe, 0x6a, 0xb3, 0xab, - 0xd7, 0x62, 0x32, 0xe5, 0x45, 0x37, 0x21, 0xd5, 0xee, 0x0d, 0xad, 0x6e, 0x29, 0x4e, 0x85, 0x2e, - 0x45, 0x09, 0xdd, 0x25, 0x4c, 0xb5, 0x98, 0xcc, 0xb8, 0x49, 0x57, 0xda, 0xa0, 0xad, 0x97, 0x12, - 0xd3, 0xbb, 0xda, 0x1b, 0xb4, 0x69, 0x57, 0x84, 0x17, 0xed, 0x02, 0x68, 0x03, 0xcd, 0x56, 0x9a, - 0x5d, 0x55, 0x1b, 0x94, 0x52, 0x54, 0xf2, 0x72, 0xb4, 0xa4, 0x66, 0x57, 0x08, 0x63, 0x2d, 0x26, - 0x67, 0x35, 0xa7, 0x41, 0x86, 0xfb, 0xe1, 0x10, 0x9b, 0xa7, 0xa5, 0xf4, 0xf4, 0xe1, 0xbe, 0x43, - 0x98, 0xc8, 0x70, 0x29, 0x37, 0x7a, 0x13, 0x32, 0xcd, 0x2e, 0x6e, 0x3e, 0x51, 0xec, 0x51, 0x29, - 0x43, 0x25, 0x37, 0xa2, 0x24, 0x2b, 0x84, 0xaf, 0x3e, 0xaa, 0xc5, 0xe4, 0xa5, 0x26, 0xfb, 0x44, - 0x6f, 0x40, 0xba, 0xa9, 0xf7, 0xfb, 0x9a, 0x5d, 0xca, 0x51, 0xd9, 0xf5, 0x48, 0x59, 0xca, 0x55, - 0x8b, 0xc9, 0x9c, 0x1f, 0x1d, 0x40, 0xb1, 0xa7, 0x59, 0xb6, 0x62, 0x0d, 0x54, 0xc3, 0xea, 0xea, - 0xb6, 0x55, 0xca, 0x53, 0x0d, 0xcf, 0x47, 0x69, 0x78, 0xa0, 0x59, 0xf6, 0xb1, 0xc3, 0x5c, 0x8b, - 0xc9, 0x85, 0x9e, 0x9f, 0x40, 0xf4, 0xe9, 0xed, 0x36, 0x36, 0x5d, 0x85, 0xa5, 0xc2, 0x74, 0x7d, - 0x87, 0x84, 0xdb, 0x91, 0x27, 0xfa, 0x74, 0x3f, 0x01, 0xfd, 0x2f, 0xac, 0xf6, 0x74, 0xb5, 0xe5, - 0xaa, 0x53, 0x9a, 0xdd, 0xe1, 0xe0, 0x49, 0xa9, 0x48, 0x95, 0xbe, 0x14, 0x39, 0x48, 0x5d, 0x6d, - 0x39, 0x2a, 0x2a, 0x44, 0xa0, 0x16, 0x93, 0x57, 0x7a, 0xe3, 0x44, 0xf4, 0x1e, 0xac, 0xa9, 0x86, - 0xd1, 0x3b, 0x1d, 0xd7, 0xbe, 0x4c, 0xb5, 0x5f, 0x8d, 0xd2, 0xbe, 0x43, 0x64, 0xc6, 0xd5, 0x23, - 0x75, 0x82, 0x8a, 0xea, 0x20, 0x1a, 0x26, 0x36, 0x54, 0x13, 0x2b, 0x86, 0xa9, 0x1b, 0xba, 0xa5, - 0xf6, 0x4a, 0x22, 0xd5, 0xfd, 0x62, 0x94, 0xee, 0x23, 0xc6, 0x7f, 0xc4, 0xd9, 0x6b, 0x31, 0x79, - 0xd9, 0x08, 0x92, 0x98, 0x56, 0xbd, 0x89, 0x2d, 0xcb, 0xd3, 0xba, 0x32, 0x4b, 0x2b, 0xe5, 0x0f, - 0x6a, 0x0d, 0x90, 0x50, 0x15, 0x72, 0x78, 0x44, 0xc4, 0x95, 0x13, 0xdd, 0xc6, 0x25, 0x44, 0x15, - 0x4a, 0x91, 0x3b, 0x94, 0xb2, 0x3e, 0xd2, 0x6d, 0x5c, 0x8b, 0xc9, 0x80, 0xdd, 0x16, 0x52, 0xe1, - 0xcc, 0x09, 0x36, 0xb5, 0xf6, 0x29, 0x55, 0xa3, 0xd0, 0x5f, 0x2c, 0x4d, 0x1f, 0x94, 0x56, 0xa9, - 0xc2, 0x6b, 0x51, 0x0a, 0x1f, 0x51, 0x21, 0xa2, 0xa2, 0xea, 0x88, 0xd4, 0x62, 0xf2, 0xea, 0xc9, - 0x24, 0x99, 0xb8, 0x58, 0x5b, 0x1b, 0xa8, 0x3d, 0xed, 0x63, 0xac, 0x34, 0x7a, 0x7a, 0xf3, 0x49, - 0x69, 0x6d, 0xba, 0x8b, 0xdd, 0xe5, 0xdc, 0xbb, 0x84, 0x99, 0xb8, 0x58, 0xdb, 0x4f, 0x40, 0x18, - 0xce, 0x35, 0x4d, 0xac, 0xda, 0x58, 0x61, 0xa7, 0x97, 0x62, 0x62, 0x6b, 0xd8, 0xb3, 0xc9, 0x4e, - 0x3c, 0x43, 0x15, 0xbf, 0x1c, 0xb9, 0x9b, 0xa8, 0xd8, 0x21, 0x95, 0x92, 0xa9, 0x10, 0xdd, 0x96, - 0x6b, 0xcd, 0x10, 0x3a, 0xfa, 0x6f, 0x40, 0x6d, 0x6c, 0x37, 0xbb, 0x4e, 0x2f, 0xc4, 0x3e, 0x56, - 0xe9, 0x2c, 0xed, 0xe1, 0x4a, 0xe4, 0xd0, 0x89, 0x04, 0x53, 0x44, 0x8c, 0x40, 0x36, 0x9c, 0xd8, - 0x1e, 0xa3, 0x51, 0x9b, 0xb3, 0xa3, 0x1c, 0x07, 0x95, 0x9f, 0x9b, 0x61, 0x73, 0x2e, 0x14, 0xd4, - 0xbf, 0x7a, 0x32, 0x49, 0xde, 0x5d, 0x82, 0xd4, 0x89, 0xda, 0x1b, 0xe2, 0xfd, 0x64, 0x26, 0x29, - 0xa6, 0xf6, 0x93, 0x99, 0x25, 0x31, 0xb3, 0x9f, 0xcc, 0x64, 0x45, 0xd8, 0x4f, 0x66, 0x40, 0xcc, - 0x49, 0x2f, 0x42, 0xce, 0x77, 0x78, 0xa3, 0x12, 0x2c, 0xf5, 0xb1, 0x65, 0xa9, 0x1d, 0x4c, 0xcf, - 0xfa, 0xac, 0xec, 0x34, 0xa5, 0x22, 0xe4, 0xfd, 0x07, 0xb6, 0xf4, 0x99, 0xe0, 0x4a, 0x92, 0xb3, - 0x98, 0x48, 0x9e, 0x60, 0x93, 0xba, 0x0c, 0x97, 0xe4, 0x4d, 0xf4, 0x1c, 0x14, 0xe8, 0x72, 0x2b, - 0xce, 0xef, 0x24, 0x20, 0x24, 0xe5, 0x3c, 0x25, 0x3e, 0xe2, 0x4c, 0x1b, 0x90, 0x33, 0xae, 0x1b, - 0x2e, 0x4b, 0x82, 0xb2, 0x80, 0x71, 0xdd, 0x70, 0x18, 0x2e, 0x43, 0x9e, 0xd8, 0xc0, 0xe5, 0x48, - 0xd2, 0x4e, 0x72, 0x84, 0xc6, 0x59, 0xa4, 0x3f, 0xc4, 0x41, 0x1c, 0x3f, 0xe4, 0xd1, 0x1b, 0x90, - 0x24, 0xe1, 0x90, 0x87, 0xae, 0xf2, 0x16, 0x8b, 0x95, 0x5b, 0x4e, 0xac, 0xdc, 0xaa, 0x3b, 0xb1, - 0x72, 0x37, 0xf3, 0xe5, 0xd7, 0x1b, 0xb1, 0xcf, 0xfe, 0xb4, 0x21, 0xc8, 0x54, 0x02, 0x9d, 0x27, - 0x47, 0xbb, 0xaa, 0x0d, 0x14, 0xad, 0x45, 0x87, 0x9c, 0x25, 0xe7, 0xb6, 0xaa, 0x0d, 0xf6, 0x5a, - 0xe8, 0x01, 0x88, 0x4d, 0x7d, 0x60, 0xe1, 0x81, 0x35, 0xb4, 0x14, 0x16, 0xad, 0x79, 0xc0, 0x0a, - 0x84, 0x1d, 0x16, 0x4e, 0x2b, 0x0e, 0xe7, 0x11, 0x65, 0x94, 0x97, 0x9b, 0x41, 0x02, 0xba, 0x0b, - 0xe0, 0x86, 0x74, 0xab, 0x94, 0xdc, 0x4c, 0x5c, 0xc9, 0x5d, 0xdf, 0x9c, 0x58, 0xfc, 0x47, 0x0e, - 0xcb, 0x43, 0x83, 0xac, 0xf2, 0x6e, 0x92, 0x0c, 0x57, 0xf6, 0x49, 0xa2, 0x17, 0x60, 0x59, 0x35, - 0x0c, 0xc5, 0xb2, 0x89, 0x43, 0x35, 0x4e, 0x89, 0x27, 0x91, 0x58, 0x98, 0x97, 0x0b, 0xaa, 0x61, - 0x1c, 0x13, 0xea, 0x2e, 0x21, 0xa2, 0xe7, 0xa1, 0x48, 0xe2, 0x9e, 0xa6, 0xf6, 0x94, 0x2e, 0xd6, - 0x3a, 0x5d, 0x9b, 0xc6, 0xbc, 0x84, 0x5c, 0xe0, 0xd4, 0x1a, 0x25, 0x4a, 0x2d, 0x77, 0xc5, 0x69, - 0xcc, 0x43, 0x08, 0x92, 0x2d, 0xd5, 0x56, 0xa9, 0x25, 0xf3, 0x32, 0xfd, 0x26, 0x34, 0x43, 0xb5, - 0xbb, 0xdc, 0x3e, 0xf4, 0x1b, 0x9d, 0x85, 0x34, 0x57, 0x9b, 0xa0, 0x6a, 0x79, 0x0b, 0xad, 0x41, - 0xca, 0x30, 0xf5, 0x13, 0x4c, 0x97, 0x2e, 0x23, 0xb3, 0x86, 0x24, 0x43, 0x31, 0x18, 0x1f, 0x51, - 0x11, 0xe2, 0xf6, 0x88, 0xf7, 0x12, 0xb7, 0x47, 0xe8, 0x55, 0x48, 0x12, 0x43, 0xd2, 0x3e, 0x8a, - 0x21, 0x19, 0x01, 0x97, 0xab, 0x9f, 0x1a, 0x58, 0xa6, 0x9c, 0xd2, 0x32, 0x14, 0x02, 0x71, 0x53, - 0x3a, 0x0b, 0x6b, 0x61, 0x61, 0x50, 0xea, 0xba, 0xf4, 0x40, 0x38, 0x43, 0x37, 0x21, 0xe3, 0xc6, - 0x41, 0xe6, 0x38, 0xe7, 0x27, 0xba, 0x75, 0x98, 0x65, 0x97, 0x95, 0x78, 0x0c, 0x59, 0x80, 0xae, - 0xca, 0xb3, 0x9e, 0xbc, 0xbc, 0xa4, 0x1a, 0x46, 0x4d, 0xb5, 0xba, 0xd2, 0xfb, 0x50, 0x8a, 0x8a, - 0x71, 0x3e, 0x83, 0x09, 0xd4, 0xed, 0x1d, 0x83, 0x9d, 0x85, 0x74, 0x5b, 0x37, 0xfb, 0xaa, 0x4d, - 0x95, 0x15, 0x64, 0xde, 0x22, 0x86, 0x64, 0xf1, 0x2e, 0x41, 0xc9, 0xac, 0x21, 0x29, 0x70, 0x3e, - 0x32, 0xce, 0x11, 0x11, 0x6d, 0xd0, 0xc2, 0xcc, 0xac, 0x05, 0x99, 0x35, 0x3c, 0x45, 0x6c, 0xb0, - 0xac, 0x41, 0xba, 0xb5, 0xe8, 0x5c, 0xa9, 0xfe, 0xac, 0xcc, 0x5b, 0xd2, 0xe7, 0x09, 0x38, 0x1b, - 0x1e, 0xed, 0xd0, 0x26, 0xe4, 0xfb, 0xea, 0x48, 0xb1, 0x47, 0xdc, 0xed, 0x04, 0xba, 0xf0, 0xd0, - 0x57, 0x47, 0xf5, 0x11, 0xf3, 0x39, 0x11, 0x12, 0xf6, 0xc8, 0x2a, 0xc5, 0x37, 0x13, 0x57, 0xf2, - 0x32, 0xf9, 0x44, 0x0f, 0x61, 0xa5, 0xa7, 0x37, 0xd5, 0x9e, 0xd2, 0x53, 0x2d, 0x5b, 0xe1, 0x69, - 0x10, 0xdb, 0x44, 0xcf, 0x4d, 0x18, 0x9b, 0xc5, 0x2d, 0xdc, 0x62, 0xeb, 0x49, 0x0e, 0x1c, 0xee, - 0xff, 0xcb, 0x54, 0xc7, 0x03, 0xd5, 0x59, 0x6a, 0x74, 0x07, 0x72, 0x7d, 0xcd, 0x6a, 0xe0, 0xae, - 0x7a, 0xa2, 0xe9, 0x26, 0xdf, 0x4d, 0x93, 0x4e, 0xf3, 0xb6, 0xc7, 0xc3, 0x35, 0xf9, 0xc5, 0x7c, - 0x4b, 0x92, 0x0a, 0xf8, 0xb0, 0x73, 0x9a, 0xa4, 0x17, 0x3e, 0x4d, 0x5e, 0x85, 0xb5, 0x01, 0x1e, - 0xd9, 0x8a, 0xb7, 0x5f, 0x99, 0x9f, 0x2c, 0x51, 0xd3, 0x23, 0xf2, 0x9b, 0xbb, 0xc3, 0x2d, 0xe2, - 0x32, 0xe8, 0x25, 0x9a, 0x2f, 0x18, 0xba, 0x85, 0x4d, 0x45, 0x6d, 0xb5, 0x4c, 0x6c, 0x59, 0x34, - 0xc5, 0xcc, 0xd3, 0x24, 0x80, 0xd2, 0x77, 0x18, 0x59, 0xfa, 0x89, 0x7f, 0x69, 0x82, 0xf9, 0x01, - 0x37, 0xbc, 0xe0, 0x19, 0xfe, 0x18, 0xd6, 0xb8, 0x7c, 0x2b, 0x60, 0x7b, 0x96, 0xa7, 0x5f, 0x98, - 0xdc, 0x5f, 0xe3, 0x36, 0x47, 0x8e, 0x78, 0xb4, 0xd9, 0x13, 0xcf, 0x66, 0x76, 0x04, 0x49, 0x6a, - 0x94, 0x24, 0x3b, 0x62, 0xc8, 0xf7, 0x3f, 0xdb, 0x52, 0x7c, 0x92, 0x80, 0x95, 0x89, 0x64, 0xcb, - 0x9d, 0x98, 0x10, 0x3a, 0xb1, 0x78, 0xe8, 0xc4, 0x12, 0x0b, 0x4f, 0x8c, 0xaf, 0x75, 0x72, 0xf6, - 0x5a, 0xa7, 0xbe, 0xc7, 0xb5, 0x4e, 0x3f, 0xdb, 0x5a, 0xff, 0x43, 0x57, 0xe1, 0x67, 0x02, 0x94, - 0xa3, 0x33, 0xd4, 0xd0, 0xe5, 0xb8, 0x06, 0x2b, 0xee, 0x50, 0x5c, 0xf5, 0xec, 0x60, 0x14, 0xdd, - 0x1f, 0xb8, 0xfe, 0xc8, 0x18, 0xf7, 0x3c, 0x14, 0xc7, 0xf2, 0x67, 0xe6, 0xca, 0x85, 0x13, 0x7f, - 0xff, 0xd2, 0x8f, 0x12, 0x6e, 0xe0, 0x09, 0x24, 0xb9, 0x21, 0xbb, 0xf5, 0x1d, 0x58, 0x6d, 0xe1, - 0xa6, 0xd6, 0x7a, 0xd6, 0xcd, 0xba, 0xc2, 0xa5, 0xff, 0xbd, 0x57, 0x27, 0xbd, 0xe4, 0x97, 0x02, - 0x5c, 0x98, 0x72, 0x25, 0x08, 0x55, 0x25, 0x84, 0xaa, 0x42, 0xf7, 0xa0, 0xd8, 0xd1, 0x2d, 0x4b, - 0x33, 0x70, 0x8b, 0x27, 0xf1, 0xf1, 0xc9, 0x3c, 0x8e, 0x25, 0xf9, 0x5b, 0xf7, 0x38, 0x23, 0x4d, - 0xd1, 0xe5, 0x42, 0xc7, 0xdf, 0x8c, 0xf2, 0x2c, 0xe9, 0x3c, 0x9c, 0x8b, 0xb8, 0x5b, 0x48, 0xb7, - 0x3c, 0x5f, 0x9f, 0xbc, 0x02, 0xa0, 0x0b, 0x90, 0xe5, 0x97, 0x0b, 0x37, 0xab, 0xca, 0x30, 0x42, - 0x7d, 0x24, 0xfd, 0x36, 0x0f, 0x19, 0x19, 0x5b, 0x06, 0xc9, 0x48, 0xd1, 0x2e, 0x64, 0xf1, 0xa8, - 0x89, 0x0d, 0xdb, 0x49, 0xe2, 0xc3, 0x2f, 0x92, 0x8c, 0xbb, 0xea, 0x70, 0xd6, 0x62, 0xb2, 0x27, - 0x86, 0x6e, 0x70, 0xa4, 0x28, 0x1a, 0xf4, 0xe1, 0xe2, 0x7e, 0xa8, 0xe8, 0x35, 0x07, 0x2a, 0x4a, - 0x44, 0xa2, 0x20, 0x4c, 0x6a, 0x0c, 0x2b, 0xba, 0xc1, 0xb1, 0xa2, 0xe4, 0x8c, 0xce, 0x02, 0x60, - 0x51, 0x25, 0x00, 0x16, 0xa5, 0x67, 0x4c, 0x33, 0x02, 0x2d, 0x7a, 0xcd, 0x41, 0x8b, 0x96, 0x66, - 0x8c, 0x78, 0x0c, 0x2e, 0x7a, 0xcb, 0x07, 0x17, 0x65, 0xa9, 0xe8, 0x66, 0xa4, 0x68, 0x08, 0x5e, - 0x74, 0xcb, 0xc5, 0x8b, 0xf2, 0x91, 0x58, 0x13, 0x17, 0x1e, 0x07, 0x8c, 0x0e, 0x27, 0x00, 0x23, - 0x06, 0xf0, 0xbc, 0x10, 0xa9, 0x62, 0x06, 0x62, 0x74, 0x38, 0x81, 0x18, 0x15, 0x67, 0x28, 0x9c, - 0x01, 0x19, 0xfd, 0x5f, 0x38, 0x64, 0x14, 0x0d, 0xea, 0xf0, 0x61, 0xce, 0x87, 0x19, 0x29, 0x11, - 0x98, 0x91, 0x18, 0x79, 0xd7, 0x66, 0xea, 0xe7, 0x06, 0x8d, 0x1e, 0x86, 0x80, 0x46, 0x2b, 0x91, - 0x28, 0x01, 0x53, 0x3e, 0x07, 0x6a, 0xf4, 0x30, 0x04, 0x35, 0x42, 0x33, 0xd5, 0xce, 0x84, 0x8d, - 0xee, 0x06, 0x61, 0xa3, 0xd5, 0x88, 0xbc, 0xdb, 0xdb, 0xed, 0x11, 0xb8, 0x51, 0x23, 0x0a, 0x37, - 0x5a, 0x8b, 0x84, 0x60, 0x98, 0xc6, 0x05, 0x80, 0xa3, 0xc3, 0x09, 0xe0, 0xe8, 0xcc, 0x0c, 0x4f, - 0x9b, 0x81, 0x1c, 0xb5, 0xa3, 0x91, 0x23, 0x86, 0xeb, 0xbc, 0x12, 0xbd, 0xaf, 0x16, 0x81, 0x8e, - 0x1e, 0x87, 0x42, 0x47, 0xe7, 0x22, 0x31, 0x50, 0x3e, 0xf8, 0x79, 0xb0, 0xa3, 0x46, 0x14, 0x76, - 0x54, 0x9a, 0x65, 0xf7, 0x67, 0x02, 0x8f, 0x52, 0x62, 0x7a, 0x3f, 0x99, 0xc9, 0x88, 0x59, 0x06, - 0x1b, 0xed, 0x27, 0x33, 0x39, 0x31, 0x2f, 0xbd, 0x44, 0x52, 0xdd, 0xb1, 0x70, 0x40, 0x2e, 0x95, - 0xd8, 0x34, 0x75, 0x93, 0xc3, 0x40, 0xac, 0x21, 0x5d, 0x81, 0xbc, 0xff, 0xe8, 0x9f, 0x02, 0x34, - 0xd1, 0xcb, 0xbb, 0xef, 0xb8, 0x97, 0x7e, 0x2d, 0x78, 0xb2, 0x14, 0x6a, 0xf2, 0x03, 0x11, 0x59, - 0x0e, 0x44, 0xf8, 0xe0, 0xa7, 0x78, 0x10, 0x7e, 0xda, 0x80, 0x1c, 0xb9, 0x94, 0x8f, 0x21, 0x4b, - 0xaa, 0xe1, 0x22, 0x4b, 0x57, 0x61, 0x85, 0x66, 0x56, 0x0c, 0xa4, 0xe2, 0xc1, 0x37, 0x49, 0x83, - 0xef, 0x32, 0xf9, 0x81, 0x39, 0x11, 0x4b, 0x64, 0x5e, 0x81, 0x55, 0x1f, 0xaf, 0x7b, 0xd9, 0x67, - 0x30, 0x8b, 0xe8, 0x72, 0xef, 0xf0, 0x5b, 0xff, 0xef, 0x05, 0xcf, 0x42, 0x1e, 0x24, 0x15, 0x86, - 0x1e, 0x09, 0xdf, 0x13, 0x7a, 0x14, 0x7f, 0x66, 0xf4, 0xc8, 0x0f, 0x5e, 0x24, 0x82, 0xe0, 0xc5, - 0xdf, 0x04, 0x6f, 0x4d, 0x5c, 0x2c, 0xa8, 0xa9, 0xb7, 0x30, 0x87, 0x13, 0xe8, 0x37, 0xc9, 0x5d, - 0x7b, 0x7a, 0x87, 0x83, 0x06, 0xe4, 0x93, 0x70, 0xb9, 0xf1, 0x39, 0xcb, 0xc3, 0xaf, 0x8b, 0x44, - 0xb0, 0x0c, 0x91, 0x23, 0x11, 0x22, 0x24, 0x9e, 0x60, 0x56, 0x7b, 0xc9, 0xcb, 0xe4, 0x93, 0xf0, + 0x0c, 0x53, 0xb7, 0x75, 0xb4, 0xec, 0x7d, 0xdc, 0x22, 0x1f, 0xcb, 0x97, 0x7c, 0xdc, 0x4d, 0xf3, + 0xd4, 0xb0, 0xf5, 0x6d, 0xc3, 0xd4, 0xf5, 0x36, 0xe3, 0x2f, 0x5f, 0x9c, 0xfc, 0xfc, 0x04, 0x9f, + 0x72, 0x6d, 0x01, 0x61, 0xda, 0xcb, 0xb6, 0xa1, 0x9a, 0x6a, 0xdf, 0xf9, 0xbc, 0x39, 0xf1, 0xf9, + 0x44, 0xed, 0x69, 0x2d, 0xd5, 0xd6, 0x4d, 0xce, 0xb1, 0xd1, 0xd1, 0xf5, 0x4e, 0x0f, 0x6f, 0xd3, + 0x56, 0x63, 0xd8, 0xde, 0xb6, 0xb5, 0x3e, 0xb6, 0x6c, 0xb5, 0x6f, 0x70, 0x86, 0xb5, 0x8e, 0xde, + 0xd1, 0xe9, 0xcf, 0x6d, 0xf2, 0x2b, 0xa4, 0x5f, 0xdd, 0x54, 0x9b, 0x3d, 0xec, 0x9f, 0xa4, 0xf4, + 0x34, 0x07, 0x4b, 0x32, 0xfe, 0x70, 0x88, 0x2d, 0x1b, 0x5d, 0x87, 0x24, 0x6e, 0x76, 0xf5, 0x92, + 0xb0, 0x29, 0x5c, 0xc9, 0x5d, 0xbf, 0xb8, 0x35, 0x36, 0xff, 0x2d, 0xce, 0x57, 0x6d, 0x76, 0xf5, + 0x5a, 0x4c, 0xa6, 0xbc, 0xe8, 0x26, 0xa4, 0xda, 0xbd, 0xa1, 0xd5, 0x2d, 0xc5, 0xa9, 0xd0, 0xa5, + 0x28, 0xa1, 0xbb, 0x84, 0xa9, 0x16, 0x93, 0x19, 0x37, 0xe9, 0x4a, 0x1b, 0xb4, 0xf5, 0x52, 0x62, + 0x7a, 0x57, 0x7b, 0x83, 0x36, 0xed, 0x8a, 0xf0, 0xa2, 0x5d, 0x00, 0x6d, 0xa0, 0xd9, 0x4a, 0xb3, + 0xab, 0x6a, 0x83, 0x52, 0x8a, 0x4a, 0x5e, 0x8e, 0x96, 0xd4, 0xec, 0x0a, 0x61, 0xac, 0xc5, 0xe4, + 0xac, 0xe6, 0x34, 0xc8, 0x70, 0x3f, 0x1c, 0x62, 0xf3, 0xb4, 0x94, 0x9e, 0x3e, 0xdc, 0x77, 0x08, + 0x13, 0x19, 0x2e, 0xe5, 0x46, 0x6f, 0x42, 0xa6, 0xd9, 0xc5, 0xcd, 0x27, 0x8a, 0x3d, 0x2a, 0x65, + 0xa8, 0xe4, 0x46, 0x94, 0x64, 0x85, 0xf0, 0xd5, 0x47, 0xb5, 0x98, 0xbc, 0xd4, 0x64, 0x3f, 0xd1, + 0x1b, 0x90, 0x6e, 0xea, 0xfd, 0xbe, 0x66, 0x97, 0x72, 0x54, 0x76, 0x3d, 0x52, 0x96, 0x72, 0xd5, + 0x62, 0x32, 0xe7, 0x47, 0x07, 0x50, 0xec, 0x69, 0x96, 0xad, 0x58, 0x03, 0xd5, 0xb0, 0xba, 0xba, + 0x6d, 0x95, 0xf2, 0x54, 0xc3, 0xf3, 0x51, 0x1a, 0x1e, 0x68, 0x96, 0x7d, 0xec, 0x30, 0xd7, 0x62, + 0x72, 0xa1, 0xe7, 0x27, 0x10, 0x7d, 0x7a, 0xbb, 0x8d, 0x4d, 0x57, 0x61, 0xa9, 0x30, 0x5d, 0xdf, + 0x21, 0xe1, 0x76, 0xe4, 0x89, 0x3e, 0xdd, 0x4f, 0x40, 0xff, 0x0b, 0xab, 0x3d, 0x5d, 0x6d, 0xb9, + 0xea, 0x94, 0x66, 0x77, 0x38, 0x78, 0x52, 0x2a, 0x52, 0xa5, 0x2f, 0x45, 0x0e, 0x52, 0x57, 0x5b, + 0x8e, 0x8a, 0x0a, 0x11, 0xa8, 0xc5, 0xe4, 0x95, 0xde, 0x38, 0x11, 0xbd, 0x07, 0x6b, 0xaa, 0x61, + 0xf4, 0x4e, 0xc7, 0xb5, 0x2f, 0x53, 0xed, 0x57, 0xa3, 0xb4, 0xef, 0x10, 0x99, 0x71, 0xf5, 0x48, + 0x9d, 0xa0, 0xa2, 0x3a, 0x88, 0x86, 0x89, 0x0d, 0xd5, 0xc4, 0x8a, 0x61, 0xea, 0x86, 0x6e, 0xa9, + 0xbd, 0x92, 0x48, 0x75, 0xbf, 0x18, 0xa5, 0xfb, 0x88, 0xf1, 0x1f, 0x71, 0xf6, 0x5a, 0x4c, 0x5e, + 0x36, 0x82, 0x24, 0xa6, 0x55, 0x6f, 0x62, 0xcb, 0xf2, 0xb4, 0xae, 0xcc, 0xd2, 0x4a, 0xf9, 0x83, + 0x5a, 0x03, 0x24, 0x54, 0x85, 0x1c, 0x1e, 0x11, 0x71, 0xe5, 0x44, 0xb7, 0x71, 0x09, 0x51, 0x85, + 0x52, 0xe4, 0x0e, 0xa5, 0xac, 0x8f, 0x74, 0x1b, 0xd7, 0x62, 0x32, 0x60, 0xb7, 0x85, 0x54, 0x38, + 0x73, 0x82, 0x4d, 0xad, 0x7d, 0x4a, 0xd5, 0x28, 0xf4, 0x8b, 0xa5, 0xe9, 0x83, 0xd2, 0x2a, 0x55, + 0x78, 0x2d, 0x4a, 0xe1, 0x23, 0x2a, 0x44, 0x54, 0x54, 0x1d, 0x91, 0x5a, 0x4c, 0x5e, 0x3d, 0x99, + 0x24, 0x13, 0x17, 0x6b, 0x6b, 0x03, 0xb5, 0xa7, 0x7d, 0x8c, 0x95, 0x46, 0x4f, 0x6f, 0x3e, 0x29, + 0xad, 0x4d, 0x77, 0xb1, 0xbb, 0x9c, 0x7b, 0x97, 0x30, 0x13, 0x17, 0x6b, 0xfb, 0x09, 0x08, 0xc3, + 0xb9, 0xa6, 0x89, 0x55, 0x1b, 0x2b, 0xec, 0xf4, 0x52, 0x4c, 0x6c, 0x0d, 0x7b, 0x36, 0xd9, 0x89, + 0x67, 0xa8, 0xe2, 0x97, 0x23, 0x77, 0x13, 0x15, 0x3b, 0xa4, 0x52, 0x32, 0x15, 0xa2, 0xdb, 0x72, + 0xad, 0x19, 0x42, 0x47, 0xff, 0x0d, 0xa8, 0x8d, 0xed, 0x66, 0xd7, 0xe9, 0x85, 0xd8, 0xc7, 0x2a, + 0x9d, 0xa5, 0x3d, 0x5c, 0x89, 0x1c, 0x3a, 0x91, 0x60, 0x8a, 0x88, 0x11, 0xc8, 0x86, 0x13, 0xdb, + 0x63, 0x34, 0x6a, 0x73, 0x76, 0x94, 0xe3, 0xa0, 0xf2, 0x73, 0x33, 0x6c, 0xce, 0x85, 0x82, 0xfa, + 0x57, 0x4f, 0x26, 0xc9, 0xbb, 0x4b, 0x90, 0x3a, 0x51, 0x7b, 0x43, 0xbc, 0x9f, 0xcc, 0x24, 0xc5, + 0xd4, 0x7e, 0x32, 0xb3, 0x24, 0x66, 0xf6, 0x93, 0x99, 0xac, 0x08, 0xfb, 0xc9, 0x0c, 0x88, 0x39, + 0xe9, 0x45, 0xc8, 0xf9, 0x0e, 0x6f, 0x54, 0x82, 0xa5, 0x3e, 0xb6, 0x2c, 0xb5, 0x83, 0xe9, 0x59, + 0x9f, 0x95, 0x9d, 0xa6, 0x54, 0x84, 0xbc, 0xff, 0xc0, 0x96, 0x3e, 0x13, 0x5c, 0x49, 0x72, 0x16, + 0x13, 0xc9, 0x13, 0x6c, 0x52, 0x97, 0xe1, 0x92, 0xbc, 0x89, 0x9e, 0x83, 0x02, 0x5d, 0x6e, 0xc5, + 0xf9, 0x4e, 0x02, 0x42, 0x52, 0xce, 0x53, 0xe2, 0x23, 0xce, 0xb4, 0x01, 0x39, 0xe3, 0xba, 0xe1, + 0xb2, 0x24, 0x28, 0x0b, 0x18, 0xd7, 0x0d, 0x87, 0xe1, 0x32, 0xe4, 0x89, 0x0d, 0x5c, 0x8e, 0x24, + 0xed, 0x24, 0x47, 0x68, 0x9c, 0x45, 0xfa, 0x43, 0x1c, 0xc4, 0xf1, 0x43, 0x1e, 0xbd, 0x01, 0x49, + 0x12, 0x0e, 0x79, 0xe8, 0x2a, 0x6f, 0xb1, 0x58, 0xb9, 0xe5, 0xc4, 0xca, 0xad, 0xba, 0x13, 0x2b, + 0x77, 0x33, 0x5f, 0x7e, 0xbd, 0x11, 0xfb, 0xec, 0x4f, 0x1b, 0x82, 0x4c, 0x25, 0xd0, 0x79, 0x72, + 0xb4, 0xab, 0xda, 0x40, 0xd1, 0x5a, 0x74, 0xc8, 0x59, 0x72, 0x6e, 0xab, 0xda, 0x60, 0xaf, 0x85, + 0x1e, 0x80, 0xd8, 0xd4, 0x07, 0x16, 0x1e, 0x58, 0x43, 0x4b, 0x61, 0xd1, 0x9a, 0x07, 0xac, 0x40, + 0xd8, 0x61, 0xe1, 0xb4, 0xe2, 0x70, 0x1e, 0x51, 0x46, 0x79, 0xb9, 0x19, 0x24, 0xa0, 0xbb, 0x00, + 0x6e, 0x48, 0xb7, 0x4a, 0xc9, 0xcd, 0xc4, 0x95, 0xdc, 0xf5, 0xcd, 0x89, 0xc5, 0x7f, 0xe4, 0xb0, + 0x3c, 0x34, 0xc8, 0x2a, 0xef, 0x26, 0xc9, 0x70, 0x65, 0x9f, 0x24, 0x7a, 0x01, 0x96, 0x55, 0xc3, + 0x50, 0x2c, 0x9b, 0x38, 0x54, 0xe3, 0x94, 0x78, 0x12, 0x89, 0x85, 0x79, 0xb9, 0xa0, 0x1a, 0xc6, + 0x31, 0xa1, 0xee, 0x12, 0x22, 0x7a, 0x1e, 0x8a, 0x24, 0xee, 0x69, 0x6a, 0x4f, 0xe9, 0x62, 0xad, + 0xd3, 0xb5, 0x69, 0xcc, 0x4b, 0xc8, 0x05, 0x4e, 0xad, 0x51, 0xa2, 0xd4, 0x72, 0x57, 0x9c, 0xc6, + 0x3c, 0x84, 0x20, 0xd9, 0x52, 0x6d, 0x95, 0x5a, 0x32, 0x2f, 0xd3, 0xdf, 0x84, 0x66, 0xa8, 0x76, + 0x97, 0xdb, 0x87, 0xfe, 0x46, 0x67, 0x21, 0xcd, 0xd5, 0x26, 0xa8, 0x5a, 0xde, 0x42, 0x6b, 0x90, + 0x32, 0x4c, 0xfd, 0x04, 0xd3, 0xa5, 0xcb, 0xc8, 0xac, 0x21, 0xc9, 0x50, 0x0c, 0xc6, 0x47, 0x54, + 0x84, 0xb8, 0x3d, 0xe2, 0xbd, 0xc4, 0xed, 0x11, 0x7a, 0x15, 0x92, 0xc4, 0x90, 0xb4, 0x8f, 0x62, + 0x48, 0x46, 0xc0, 0xe5, 0xea, 0xa7, 0x06, 0x96, 0x29, 0xa7, 0xb4, 0x0c, 0x85, 0x40, 0xdc, 0x94, + 0xce, 0xc2, 0x5a, 0x58, 0x18, 0x94, 0xba, 0x2e, 0x3d, 0x10, 0xce, 0xd0, 0x4d, 0xc8, 0xb8, 0x71, + 0x90, 0x39, 0xce, 0xf9, 0x89, 0x6e, 0x1d, 0x66, 0xd9, 0x65, 0x25, 0x1e, 0x43, 0x16, 0xa0, 0xab, + 0xf2, 0xac, 0x27, 0x2f, 0x2f, 0xa9, 0x86, 0x51, 0x53, 0xad, 0xae, 0xf4, 0x3e, 0x94, 0xa2, 0x62, + 0x9c, 0xcf, 0x60, 0x02, 0x75, 0x7b, 0xc7, 0x60, 0x67, 0x21, 0xdd, 0xd6, 0xcd, 0xbe, 0x6a, 0x53, + 0x65, 0x05, 0x99, 0xb7, 0x88, 0x21, 0x59, 0xbc, 0x4b, 0x50, 0x32, 0x6b, 0x48, 0x0a, 0x9c, 0x8f, + 0x8c, 0x73, 0x44, 0x44, 0x1b, 0xb4, 0x30, 0x33, 0x6b, 0x41, 0x66, 0x0d, 0x4f, 0x11, 0x1b, 0x2c, + 0x6b, 0x90, 0x6e, 0x2d, 0x3a, 0x57, 0xaa, 0x3f, 0x2b, 0xf3, 0x96, 0xf4, 0x79, 0x02, 0xce, 0x86, + 0x47, 0x3b, 0xb4, 0x09, 0xf9, 0xbe, 0x3a, 0x52, 0xec, 0x11, 0x77, 0x3b, 0x81, 0x2e, 0x3c, 0xf4, + 0xd5, 0x51, 0x7d, 0xc4, 0x7c, 0x4e, 0x84, 0x84, 0x3d, 0xb2, 0x4a, 0xf1, 0xcd, 0xc4, 0x95, 0xbc, + 0x4c, 0x7e, 0xa2, 0x87, 0xb0, 0xd2, 0xd3, 0x9b, 0x6a, 0x4f, 0xe9, 0xa9, 0x96, 0xad, 0xf0, 0x34, + 0x88, 0x6d, 0xa2, 0xe7, 0x26, 0x8c, 0xcd, 0xe2, 0x16, 0x6e, 0xb1, 0xf5, 0x24, 0x07, 0x0e, 0xf7, + 0xff, 0x65, 0xaa, 0xe3, 0x81, 0xea, 0x2c, 0x35, 0xba, 0x03, 0xb9, 0xbe, 0x66, 0x35, 0x70, 0x57, + 0x3d, 0xd1, 0x74, 0x93, 0xef, 0xa6, 0x49, 0xa7, 0x79, 0xdb, 0xe3, 0xe1, 0x9a, 0xfc, 0x62, 0xbe, + 0x25, 0x49, 0x05, 0x7c, 0xd8, 0x39, 0x4d, 0xd2, 0x0b, 0x9f, 0x26, 0xaf, 0xc2, 0xda, 0x00, 0x8f, + 0x6c, 0xc5, 0xdb, 0xaf, 0xcc, 0x4f, 0x96, 0xa8, 0xe9, 0x11, 0xf9, 0xe6, 0xee, 0x70, 0x8b, 0xb8, + 0x0c, 0x7a, 0x89, 0xe6, 0x0b, 0x86, 0x6e, 0x61, 0x53, 0x51, 0x5b, 0x2d, 0x13, 0x5b, 0x16, 0x4d, + 0x31, 0xf3, 0x34, 0x09, 0xa0, 0xf4, 0x1d, 0x46, 0x96, 0x7e, 0xe2, 0x5f, 0x9a, 0x60, 0x7e, 0xc0, + 0x0d, 0x2f, 0x78, 0x86, 0x3f, 0x86, 0x35, 0x2e, 0xdf, 0x0a, 0xd8, 0x9e, 0xe5, 0xe9, 0x17, 0x26, + 0xf7, 0xd7, 0xb8, 0xcd, 0x91, 0x23, 0x1e, 0x6d, 0xf6, 0xc4, 0xb3, 0x99, 0x1d, 0x41, 0x92, 0x1a, + 0x25, 0xc9, 0x8e, 0x18, 0xf2, 0xfb, 0x9f, 0x6d, 0x29, 0x3e, 0x49, 0xc0, 0xca, 0x44, 0xb2, 0xe5, + 0x4e, 0x4c, 0x08, 0x9d, 0x58, 0x3c, 0x74, 0x62, 0x89, 0x85, 0x27, 0xc6, 0xd7, 0x3a, 0x39, 0x7b, + 0xad, 0x53, 0xdf, 0xe3, 0x5a, 0xa7, 0x9f, 0x6d, 0xad, 0xff, 0xa1, 0xab, 0xf0, 0x33, 0x01, 0xca, + 0xd1, 0x19, 0x6a, 0xe8, 0x72, 0x5c, 0x83, 0x15, 0x77, 0x28, 0xae, 0x7a, 0x76, 0x30, 0x8a, 0xee, + 0x07, 0xae, 0x3f, 0x32, 0xc6, 0x3d, 0x0f, 0xc5, 0xb1, 0xfc, 0x99, 0xb9, 0x72, 0xe1, 0xc4, 0xdf, + 0xbf, 0xf4, 0xa3, 0x84, 0x1b, 0x78, 0x02, 0x49, 0x6e, 0xc8, 0x6e, 0x7d, 0x07, 0x56, 0x5b, 0xb8, + 0xa9, 0xb5, 0x9e, 0x75, 0xb3, 0xae, 0x70, 0xe9, 0x7f, 0xef, 0xd5, 0x49, 0x2f, 0xf9, 0xa5, 0x00, + 0x17, 0xa6, 0x5c, 0x09, 0x42, 0x55, 0x09, 0xa1, 0xaa, 0xd0, 0x3d, 0x28, 0x76, 0x74, 0xcb, 0xd2, + 0x0c, 0xdc, 0xe2, 0x49, 0x7c, 0x7c, 0x32, 0x8f, 0x63, 0x49, 0xfe, 0xd6, 0x3d, 0xce, 0x48, 0x53, + 0x74, 0xb9, 0xd0, 0xf1, 0x37, 0xa3, 0x3c, 0x4b, 0x3a, 0x0f, 0xe7, 0x22, 0xee, 0x16, 0xd2, 0x2d, + 0xcf, 0xd7, 0x27, 0xaf, 0x00, 0xe8, 0x02, 0x64, 0xf9, 0xe5, 0xc2, 0xcd, 0xaa, 0x32, 0x8c, 0x50, + 0x1f, 0x49, 0xbf, 0xcd, 0x43, 0x46, 0xc6, 0x96, 0x41, 0x32, 0x52, 0xb4, 0x0b, 0x59, 0x3c, 0x6a, + 0x62, 0xc3, 0x76, 0x92, 0xf8, 0xf0, 0x8b, 0x24, 0xe3, 0xae, 0x3a, 0x9c, 0xb5, 0x98, 0xec, 0x89, + 0xa1, 0x1b, 0x1c, 0x29, 0x8a, 0x06, 0x7d, 0xb8, 0xb8, 0x1f, 0x2a, 0x7a, 0xcd, 0x81, 0x8a, 0x12, + 0x91, 0x28, 0x08, 0x93, 0x1a, 0xc3, 0x8a, 0x6e, 0x70, 0xac, 0x28, 0x39, 0xa3, 0xb3, 0x00, 0x58, + 0x54, 0x09, 0x80, 0x45, 0xe9, 0x19, 0xd3, 0x8c, 0x40, 0x8b, 0x5e, 0x73, 0xd0, 0xa2, 0xa5, 0x19, + 0x23, 0x1e, 0x83, 0x8b, 0xde, 0xf2, 0xc1, 0x45, 0x59, 0x2a, 0xba, 0x19, 0x29, 0x1a, 0x82, 0x17, + 0xdd, 0x72, 0xf1, 0xa2, 0x7c, 0x24, 0xd6, 0xc4, 0x85, 0xc7, 0x01, 0xa3, 0xc3, 0x09, 0xc0, 0x88, + 0x01, 0x3c, 0x2f, 0x44, 0xaa, 0x98, 0x81, 0x18, 0x1d, 0x4e, 0x20, 0x46, 0xc5, 0x19, 0x0a, 0x67, + 0x40, 0x46, 0xff, 0x17, 0x0e, 0x19, 0x45, 0x83, 0x3a, 0x7c, 0x98, 0xf3, 0x61, 0x46, 0x4a, 0x04, + 0x66, 0x24, 0x46, 0xde, 0xb5, 0x99, 0xfa, 0xb9, 0x41, 0xa3, 0x87, 0x21, 0xa0, 0xd1, 0x4a, 0x24, + 0x4a, 0xc0, 0x94, 0xcf, 0x81, 0x1a, 0x3d, 0x0c, 0x41, 0x8d, 0xd0, 0x4c, 0xb5, 0x33, 0x61, 0xa3, + 0xbb, 0x41, 0xd8, 0x68, 0x35, 0x22, 0xef, 0xf6, 0x76, 0x7b, 0x04, 0x6e, 0xd4, 0x88, 0xc2, 0x8d, + 0xd6, 0x22, 0x21, 0x18, 0xa6, 0x71, 0x01, 0xe0, 0xe8, 0x70, 0x02, 0x38, 0x3a, 0x33, 0xc3, 0xd3, + 0x66, 0x20, 0x47, 0xed, 0x68, 0xe4, 0x88, 0xe1, 0x3a, 0xaf, 0x44, 0xef, 0xab, 0x45, 0xa0, 0xa3, + 0xc7, 0xa1, 0xd0, 0xd1, 0xb9, 0x48, 0x0c, 0x94, 0x0f, 0x7e, 0x1e, 0xec, 0xa8, 0x11, 0x85, 0x1d, + 0x95, 0x66, 0xd9, 0xfd, 0x99, 0xc0, 0xa3, 0x94, 0x98, 0xde, 0x4f, 0x66, 0x32, 0x62, 0x96, 0xc1, + 0x46, 0xfb, 0xc9, 0x4c, 0x4e, 0xcc, 0x4b, 0x2f, 0x91, 0x54, 0x77, 0x2c, 0x1c, 0x90, 0x4b, 0x25, + 0x36, 0x4d, 0xdd, 0xe4, 0x30, 0x10, 0x6b, 0x48, 0x57, 0x20, 0xef, 0x3f, 0xfa, 0xa7, 0x00, 0x4d, + 0xf4, 0xf2, 0xee, 0x3b, 0xee, 0xa5, 0x5f, 0x0b, 0x9e, 0x2c, 0x85, 0x9a, 0xfc, 0x40, 0x44, 0x96, + 0x03, 0x11, 0x3e, 0xf8, 0x29, 0x1e, 0x84, 0x9f, 0x36, 0x20, 0x47, 0x2e, 0xe5, 0x63, 0xc8, 0x92, + 0x6a, 0xb8, 0xc8, 0xd2, 0x55, 0x58, 0xa1, 0x99, 0x15, 0x03, 0xa9, 0x78, 0xf0, 0x4d, 0xd2, 0xe0, + 0xbb, 0x4c, 0x3e, 0x30, 0x27, 0x62, 0x89, 0xcc, 0x2b, 0xb0, 0xea, 0xe3, 0x75, 0x2f, 0xfb, 0x0c, + 0x66, 0x11, 0x5d, 0xee, 0x1d, 0x7e, 0xeb, 0xff, 0xbd, 0xe0, 0x59, 0xc8, 0x83, 0xa4, 0xc2, 0xd0, + 0x23, 0xe1, 0x7b, 0x42, 0x8f, 0xe2, 0xcf, 0x8c, 0x1e, 0xf9, 0xc1, 0x8b, 0x44, 0x10, 0xbc, 0xf8, + 0x9b, 0xe0, 0xad, 0x89, 0x8b, 0x05, 0x35, 0xf5, 0x16, 0xe6, 0x70, 0x02, 0xfd, 0x4d, 0x72, 0xd7, + 0x9e, 0xde, 0xe1, 0xa0, 0x01, 0xf9, 0x49, 0xb8, 0xdc, 0xf8, 0x9c, 0xe5, 0xe1, 0xd7, 0x45, 0x22, + 0x58, 0x86, 0xc8, 0x91, 0x08, 0x11, 0x12, 0x4f, 0x30, 0xab, 0xbd, 0xe4, 0x65, 0xf2, 0x93, 0xf0, 0x51, 0xe7, 0xe3, 0x99, 0x1e, 0x6b, 0xa0, 0x37, 0x20, 0x4b, 0x0b, 0x6b, 0x8a, 0x6e, 0x58, 0xbc, 0xde, 0x12, 0xc8, 0x81, 0x59, 0x75, 0x6d, 0xeb, 0x88, 0xf0, 0x1c, 0x1a, 0x96, 0x9c, 0x31, 0xf8, - 0x97, 0x2f, 0xaf, 0xca, 0x06, 0x52, 0xd3, 0x8b, 0x90, 0x25, 0xa3, 0xb7, 0x0c, 0xb5, 0x89, 0x4b, - 0x40, 0x07, 0xea, 0x11, 0xa4, 0x5f, 0xc5, 0x61, 0x79, 0x2c, 0x1e, 0x87, 0xce, 0xdd, 0x71, 0xc9, - 0xb8, 0x0f, 0x1b, 0x9b, 0xcf, 0x1e, 0xeb, 0x00, 0x1d, 0xd5, 0x52, 0x3e, 0x52, 0x07, 0x36, 0x6e, - 0x71, 0xa3, 0xf8, 0x28, 0xa8, 0x0c, 0x19, 0xd2, 0x1a, 0x5a, 0xb8, 0xc5, 0x61, 0x3a, 0xb7, 0x8d, - 0x6a, 0x90, 0xc6, 0x27, 0x78, 0x60, 0x5b, 0xa5, 0x25, 0xba, 0xec, 0x67, 0x27, 0x71, 0x13, 0xf2, + 0x2f, 0x5f, 0x5e, 0x95, 0x0d, 0xa4, 0xa6, 0x17, 0x21, 0x4b, 0x46, 0x6f, 0x19, 0x6a, 0x13, 0x97, + 0x80, 0x0e, 0xd4, 0x23, 0x48, 0xbf, 0x8a, 0xc3, 0xf2, 0x58, 0x3c, 0x0e, 0x9d, 0xbb, 0xe3, 0x92, + 0x71, 0x1f, 0x36, 0x36, 0x9f, 0x3d, 0xd6, 0x01, 0x3a, 0xaa, 0xa5, 0x7c, 0xa4, 0x0e, 0x6c, 0xdc, + 0xe2, 0x46, 0xf1, 0x51, 0x50, 0x19, 0x32, 0xa4, 0x35, 0xb4, 0x70, 0x8b, 0xc3, 0x74, 0x6e, 0x1b, + 0xd5, 0x20, 0x8d, 0x4f, 0xf0, 0xc0, 0xb6, 0x4a, 0x4b, 0x74, 0xd9, 0xcf, 0x4e, 0xe2, 0x26, 0xe4, 0xf3, 0x6e, 0x89, 0x2c, 0xf6, 0xb7, 0x5f, 0x6f, 0x88, 0x8c, 0xfb, 0x65, 0xbd, 0xaf, 0xd9, 0xb8, 0x6f, 0xd8, 0xa7, 0x32, 0x97, 0x0f, 0x5a, 0x21, 0x33, 0x66, 0x05, 0x0a, 0x18, 0xe7, 0x1d, 0x1c, 0x88, 0xd8, 0x54, 0xd3, 0x4d, 0xcd, 0x3e, 0x95, 0x0b, 0x7d, 0xdc, 0x37, 0x74, 0xbd, 0xa7, 0xb0, @@ -4199,82 +4199,83 @@ var fileDescriptor_252557cfdd89a31a = []byte{ 0xba, 0x92, 0xc5, 0x29, 0x87, 0x7e, 0x40, 0x6e, 0x8b, 0x1d, 0xef, 0x32, 0x17, 0x96, 0xde, 0x83, 0x34, 0xa3, 0xa0, 0x1c, 0x2c, 0x3d, 0x3c, 0xb8, 0x7f, 0x70, 0xf8, 0xee, 0x81, 0x18, 0x43, 0x00, 0xe9, 0x9d, 0x4a, 0xa5, 0x7a, 0x54, 0x17, 0x05, 0x94, 0x85, 0xd4, 0xce, 0xee, 0xa1, 0x5c, 0x17, - 0xe3, 0x84, 0x2c, 0x57, 0xf7, 0xab, 0x95, 0xba, 0x98, 0x40, 0x2b, 0x50, 0x60, 0xdf, 0xca, 0xdd, - 0x43, 0xf9, 0xed, 0x9d, 0xba, 0x98, 0xf4, 0x91, 0x8e, 0xab, 0x07, 0x77, 0xaa, 0xb2, 0x98, 0x92, - 0xfe, 0x03, 0xce, 0x47, 0xa6, 0x3a, 0x1e, 0x82, 0x27, 0xf8, 0x10, 0x3c, 0xe9, 0xf3, 0x38, 0xb9, - 0x11, 0x44, 0xe5, 0x2f, 0x68, 0x7f, 0x6c, 0xe2, 0xd7, 0x17, 0x48, 0x7e, 0xc6, 0x66, 0x4f, 0x2e, - 0xbc, 0x26, 0x66, 0x41, 0x8e, 0xf6, 0xcd, 0x4e, 0xa0, 0x82, 0x5c, 0xe0, 0x54, 0x2a, 0x64, 0x31, - 0xb6, 0x0f, 0x70, 0xd3, 0x56, 0x98, 0x13, 0x59, 0xf4, 0xd6, 0x99, 0x25, 0x6c, 0x84, 0x7a, 0xcc, - 0x88, 0xd2, 0xfb, 0x0b, 0xd9, 0x32, 0x0b, 0x29, 0xb9, 0x5a, 0x97, 0x1f, 0x8b, 0x09, 0x84, 0xa0, - 0x48, 0x3f, 0x95, 0xe3, 0x83, 0x9d, 0xa3, 0xe3, 0xda, 0x21, 0xb1, 0xe5, 0x2a, 0x2c, 0x3b, 0xb6, - 0x74, 0x88, 0x29, 0xe9, 0x1a, 0xb9, 0x46, 0x85, 0x26, 0x5f, 0x93, 0x77, 0x6f, 0xe9, 0xe7, 0x82, - 0x9f, 0x3b, 0x98, 0x40, 0x1d, 0x42, 0xda, 0xb2, 0x55, 0x7b, 0x68, 0x71, 0x23, 0xbe, 0x3e, 0x6f, - 0x36, 0xb6, 0xe5, 0x7c, 0x1c, 0x53, 0x71, 0x99, 0xab, 0x91, 0x6e, 0x42, 0x31, 0xf8, 0x4b, 0xb4, - 0x0d, 0x3c, 0x27, 0x8a, 0x4b, 0xb7, 0x01, 0x4d, 0x26, 0x69, 0x21, 0x38, 0x84, 0x10, 0x86, 0x43, - 0xfc, 0x82, 0x5e, 0x80, 0x23, 0x13, 0x32, 0xf4, 0xce, 0xd8, 0x24, 0x6f, 0x2d, 0x92, 0xce, 0x6d, - 0x31, 0xda, 0xd8, 0x34, 0x6f, 0x40, 0xde, 0x4f, 0x9f, 0x6f, 0x92, 0xdf, 0xc6, 0xbd, 0x4d, 0x1c, - 0x04, 0x4c, 0xbc, 0x23, 0x50, 0xf8, 0x8e, 0x47, 0xe0, 0x9b, 0x00, 0xf6, 0x88, 0x67, 0x82, 0x4e, - 0x1c, 0xbd, 0x14, 0x02, 0x44, 0xe3, 0x66, 0x7d, 0xc4, 0x37, 0x41, 0xd6, 0xe6, 0x5f, 0x16, 0x3a, - 0xf6, 0xa3, 0x47, 0x43, 0x1a, 0x63, 0x2d, 0x8e, 0xac, 0xcc, 0x1b, 0x8c, 0x3d, 0x94, 0x89, 0x91, - 0x2d, 0xf4, 0x18, 0xce, 0x8d, 0x25, 0x0a, 0xae, 0xea, 0xe4, 0xbc, 0xf9, 0xc2, 0x99, 0x60, 0xbe, - 0xe0, 0xa8, 0xf6, 0x47, 0xfb, 0x54, 0x30, 0xda, 0xbf, 0x05, 0x17, 0xa7, 0x65, 0xbb, 0xe8, 0x12, - 0x00, 0x1e, 0x90, 0xe0, 0xd0, 0xf2, 0x10, 0x85, 0x2c, 0xa7, 0xd4, 0x47, 0xd2, 0x3d, 0x28, 0x45, - 0x65, 0xb2, 0xe8, 0x1a, 0x24, 0xe9, 0x75, 0x83, 0x65, 0x3b, 0xe7, 0x42, 0xb0, 0x11, 0xc2, 0x27, - 0x53, 0x26, 0xe9, 0x37, 0x7e, 0xe7, 0x0c, 0x01, 0x36, 0xae, 0xc2, 0x8a, 0x33, 0x8e, 0x71, 0x80, - 0x63, 0x99, 0xff, 0x70, 0xc8, 0x71, 0x0e, 0x74, 0xdf, 0x75, 0x64, 0x56, 0x45, 0xba, 0xb1, 0x48, - 0x7e, 0xbc, 0x35, 0xe6, 0xc2, 0x97, 0x21, 0xed, 0x39, 0xaf, 0x61, 0x62, 0x0b, 0x0f, 0x6c, 0xe6, - 0xbc, 0x6a, 0x83, 0x7e, 0x0b, 0xd2, 0x63, 0x00, 0x0f, 0x89, 0x23, 0xa7, 0xb4, 0xa9, 0x0f, 0x07, - 0x2d, 0x3a, 0xba, 0x94, 0xcc, 0x1a, 0xe8, 0x26, 0xa4, 0xfc, 0x48, 0xd1, 0x64, 0x38, 0x23, 0x9d, - 0xfb, 0x90, 0x3c, 0xc6, 0x2d, 0x69, 0x80, 0x26, 0xab, 0x21, 0x11, 0x5d, 0xbc, 0x15, 0xec, 0xe2, - 0x72, 0x64, 0x5d, 0x25, 0xbc, 0xab, 0x8f, 0x21, 0x45, 0x77, 0x0f, 0x49, 0x5c, 0x68, 0x09, 0x8e, - 0x67, 0xdc, 0xe4, 0x1b, 0xfd, 0x3f, 0x80, 0x6a, 0xdb, 0xa6, 0xd6, 0x18, 0x7a, 0x1d, 0x6c, 0x84, - 0xef, 0xbe, 0x1d, 0x87, 0x6f, 0xf7, 0x22, 0xdf, 0x86, 0x6b, 0x9e, 0xa8, 0x6f, 0x2b, 0xfa, 0x14, - 0x4a, 0x07, 0x50, 0x0c, 0xca, 0x3a, 0x39, 0x22, 0x1b, 0x43, 0x30, 0x47, 0x64, 0x29, 0x3f, 0xcf, - 0x11, 0xdd, 0x0c, 0x33, 0xc1, 0xea, 0x8c, 0xb4, 0x21, 0xfd, 0x20, 0x0e, 0x79, 0xff, 0xe6, 0xfd, - 0xd7, 0x4b, 0xe3, 0xa4, 0x1f, 0x0b, 0x90, 0x71, 0xa7, 0x1f, 0x2c, 0x3a, 0x06, 0xaa, 0xb4, 0xcc, - 0x7a, 0x71, 0x7f, 0xa5, 0x90, 0xd5, 0x64, 0x13, 0x6e, 0x4d, 0xf6, 0xb6, 0x9b, 0x42, 0x44, 0x61, - 0x6f, 0x7e, 0x5b, 0x73, 0xaf, 0x72, 0x32, 0xa6, 0xdb, 0x90, 0x75, 0x4f, 0x40, 0x72, 0x71, 0x0b, - 0x42, 0xab, 0x4e, 0x93, 0xd6, 0x8b, 0xf5, 0x8f, 0x78, 0x19, 0x32, 0x21, 0xb3, 0x86, 0xd4, 0x82, - 0xe5, 0xb1, 0xe3, 0x13, 0xdd, 0x86, 0x25, 0x63, 0xd8, 0x50, 0x1c, 0xe7, 0x18, 0xc3, 0xb2, 0x9d, - 0x2b, 0xc1, 0xb0, 0xd1, 0xd3, 0x9a, 0xf7, 0xf1, 0xa9, 0x33, 0x18, 0x63, 0xd8, 0xb8, 0xcf, 0x7c, - 0x88, 0xf5, 0x12, 0xf7, 0xf7, 0xf2, 0x53, 0x01, 0x32, 0xce, 0x9e, 0x40, 0xff, 0x05, 0x59, 0xf7, - 0x68, 0x76, 0xdf, 0x11, 0x44, 0x9e, 0xe9, 0x5c, 0xbf, 0x27, 0x82, 0x76, 0x9c, 0x07, 0x10, 0x5a, - 0x4b, 0x69, 0xf7, 0x54, 0xe6, 0x4b, 0xc5, 0xa0, 0xcd, 0xd8, 0xe1, 0x4d, 0x63, 0xda, 0xde, 0x9d, - 0xbb, 0x3d, 0xb5, 0x23, 0xe7, 0xa8, 0xcc, 0x5e, 0x8b, 0x34, 0x78, 0x76, 0xfc, 0x57, 0x01, 0xc4, - 0xf1, 0x1d, 0xfb, 0x9d, 0x47, 0x37, 0x99, 0x2a, 0x24, 0x42, 0x52, 0x05, 0xb4, 0x0d, 0xab, 0x2e, - 0x87, 0x62, 0x69, 0x9d, 0x81, 0x6a, 0x0f, 0x4d, 0xcc, 0xd1, 0x7f, 0xe4, 0xfe, 0x74, 0xec, 0xfc, - 0x32, 0x39, 0xeb, 0xd4, 0x33, 0xce, 0xfa, 0x93, 0x38, 0xe4, 0x7c, 0xb5, 0x08, 0xf4, 0x9f, 0xbe, - 0xc3, 0xa8, 0x18, 0x12, 0x5d, 0x7d, 0xbc, 0xde, 0x9b, 0x80, 0xa0, 0x99, 0xe2, 0x8b, 0x9b, 0x29, - 0xaa, 0xe2, 0xe3, 0x94, 0x36, 0x92, 0x0b, 0x97, 0x36, 0x5e, 0x06, 0x64, 0xeb, 0xb6, 0xda, 0x53, - 0x4e, 0x74, 0x5b, 0x1b, 0x74, 0x14, 0xe6, 0x86, 0xec, 0xe8, 0x10, 0xe9, 0x2f, 0x8f, 0xe8, 0x0f, - 0x47, 0xd4, 0x23, 0x7f, 0x28, 0x40, 0xc6, 0xbd, 0xba, 0x2c, 0xfa, 0x62, 0xe0, 0x2c, 0xa4, 0x79, - 0x76, 0xce, 0x9e, 0x0c, 0xf0, 0x56, 0x68, 0x0d, 0xa7, 0x0c, 0x99, 0x3e, 0xb6, 0x55, 0x7a, 0x0e, - 0xb2, 0xcc, 0xc0, 0x6d, 0x5f, 0xbd, 0x05, 0x39, 0xdf, 0x6b, 0x0b, 0x72, 0x34, 0x1e, 0x54, 0xdf, - 0x15, 0x63, 0xe5, 0xa5, 0x4f, 0xbf, 0xd8, 0x4c, 0x1c, 0xe0, 0x8f, 0xc8, 0x6e, 0x96, 0xab, 0x95, - 0x5a, 0xb5, 0x72, 0x5f, 0x14, 0xca, 0xb9, 0x4f, 0xbf, 0xd8, 0x5c, 0x92, 0x31, 0x05, 0xaf, 0xaf, - 0xde, 0x87, 0xe5, 0xb1, 0x85, 0x09, 0xa6, 0x7e, 0x08, 0x8a, 0x77, 0x1e, 0x1e, 0x3d, 0xd8, 0xab, - 0xec, 0xd4, 0xab, 0xca, 0xa3, 0xc3, 0x7a, 0x55, 0x14, 0xd0, 0x39, 0x58, 0x7d, 0xb0, 0x77, 0xaf, - 0x56, 0x57, 0x2a, 0x0f, 0xf6, 0xaa, 0x07, 0x75, 0x65, 0xa7, 0x5e, 0xdf, 0xa9, 0xdc, 0x17, 0xe3, - 0xd7, 0xff, 0x52, 0x80, 0xe4, 0xce, 0x6e, 0x65, 0x0f, 0x55, 0x20, 0x49, 0xe1, 0xa4, 0xa9, 0x4f, - 0x52, 0xcb, 0xd3, 0xcb, 0x10, 0xe8, 0x2e, 0xa4, 0x28, 0xd2, 0x84, 0xa6, 0xbf, 0x51, 0x2d, 0xcf, - 0xa8, 0x4b, 0x90, 0xc1, 0xd0, 0x1d, 0x39, 0xf5, 0xd1, 0x6a, 0x79, 0x7a, 0x99, 0x02, 0x3d, 0x80, - 0x25, 0x07, 0x68, 0x98, 0xf5, 0x92, 0xb4, 0x3c, 0xb3, 0x76, 0x40, 0xa6, 0xc6, 0x00, 0x9b, 0xe9, - 0xef, 0x59, 0xcb, 0x33, 0x0a, 0x18, 0x68, 0x0f, 0xd2, 0xfc, 0x4a, 0x3f, 0xe3, 0x89, 0x6a, 0x79, - 0x56, 0x49, 0x02, 0xc9, 0x90, 0xf5, 0xa0, 0xb0, 0xd9, 0xaf, 0x74, 0xcb, 0x73, 0xd4, 0x66, 0xd0, - 0x7b, 0x50, 0x08, 0xc2, 0x05, 0xf3, 0x3d, 0x83, 0x2d, 0xcf, 0x59, 0xfc, 0x20, 0xfa, 0x83, 0xd8, - 0xc1, 0x7c, 0xcf, 0x62, 0xcb, 0x73, 0xd6, 0x42, 0xd0, 0x07, 0xb0, 0x32, 0x79, 0xb7, 0x9f, 0xff, - 0x95, 0x6c, 0x79, 0x81, 0xea, 0x08, 0xea, 0x03, 0x0a, 0xc1, 0x04, 0x16, 0x78, 0x34, 0x5b, 0x5e, - 0xa4, 0x58, 0x82, 0x5a, 0xb0, 0x3c, 0x7e, 0xd1, 0x9e, 0xf7, 0x11, 0x6d, 0x79, 0xee, 0xc2, 0x09, - 0xeb, 0x25, 0x78, 0x41, 0x9f, 0xf7, 0x51, 0x6d, 0x79, 0xee, 0x3a, 0x0a, 0x7a, 0x08, 0xe0, 0xbb, - 0x63, 0xcf, 0xf1, 0xc8, 0xb6, 0x3c, 0x4f, 0x45, 0x05, 0x19, 0xb0, 0x1a, 0x76, 0xf9, 0x5e, 0xe4, - 0xcd, 0x6d, 0x79, 0xa1, 0x42, 0x0b, 0xf1, 0xe7, 0xe0, 0x35, 0x7a, 0xbe, 0x37, 0xb8, 0xe5, 0x39, - 0x2b, 0x2e, 0xc8, 0x82, 0xb5, 0xd0, 0xab, 0xe3, 0x42, 0x2f, 0x72, 0xcb, 0x8b, 0x55, 0x61, 0x50, - 0x07, 0xc4, 0x89, 0x0b, 0xe7, 0xdc, 0x0f, 0x74, 0xcb, 0xf3, 0xd7, 0x63, 0xe8, 0x7a, 0x85, 0xdc, - 0x47, 0x17, 0x79, 0xaf, 0x5b, 0x5e, 0xa8, 0x40, 0xb3, 0xbb, 0xf3, 0xe5, 0x37, 0xeb, 0xc2, 0x57, - 0xdf, 0xac, 0x0b, 0x7f, 0xfe, 0x66, 0x5d, 0xf8, 0xec, 0xe9, 0x7a, 0xec, 0xab, 0xa7, 0xeb, 0xb1, - 0x3f, 0x3e, 0x5d, 0x8f, 0xfd, 0xcf, 0x8b, 0x1d, 0xcd, 0xee, 0x0e, 0x1b, 0x5b, 0x4d, 0xbd, 0xbf, - 0xdd, 0xd4, 0xfb, 0xd8, 0x6e, 0xb4, 0x6d, 0xef, 0xc3, 0xfb, 0xe7, 0x4a, 0x23, 0x4d, 0x33, 0x92, - 0x1b, 0x7f, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xc6, 0x9f, 0x5f, 0x24, 0xd9, 0x32, 0x00, 0x00, + 0xe3, 0x84, 0x2c, 0x57, 0xf7, 0xab, 0x95, 0xba, 0x98, 0x40, 0x2b, 0x50, 0x60, 0xbf, 0x95, 0xbb, + 0x87, 0xf2, 0xdb, 0x3b, 0x75, 0x31, 0xe9, 0x23, 0x1d, 0x57, 0x0f, 0xee, 0x54, 0x65, 0x31, 0x25, + 0xfd, 0x07, 0x9c, 0x8f, 0x4c, 0x75, 0x3c, 0x04, 0x4f, 0xf0, 0x21, 0x78, 0xd2, 0xe7, 0x71, 0x72, + 0x23, 0x88, 0xca, 0x5f, 0xd0, 0xfe, 0xd8, 0xc4, 0xaf, 0x2f, 0x90, 0xfc, 0x8c, 0xcd, 0x9e, 0x5c, + 0x78, 0x4d, 0xcc, 0x82, 0x1c, 0xed, 0x9b, 0x9d, 0x40, 0x05, 0xb9, 0xc0, 0xa9, 0x54, 0xc8, 0x62, + 0x6c, 0x1f, 0xe0, 0xa6, 0xad, 0x30, 0x27, 0xb2, 0xe8, 0xad, 0x33, 0x4b, 0xd8, 0x08, 0xf5, 0x98, + 0x11, 0xa5, 0xf7, 0x17, 0xb2, 0x65, 0x16, 0x52, 0x72, 0xb5, 0x2e, 0x3f, 0x16, 0x13, 0x08, 0x41, + 0x91, 0xfe, 0x54, 0x8e, 0x0f, 0x76, 0x8e, 0x8e, 0x6b, 0x87, 0xc4, 0x96, 0xab, 0xb0, 0xec, 0xd8, + 0xd2, 0x21, 0xa6, 0xa4, 0x6b, 0xe4, 0x1a, 0x15, 0x9a, 0x7c, 0x4d, 0xde, 0xbd, 0xa5, 0x9f, 0x0b, + 0x7e, 0xee, 0x60, 0x02, 0x75, 0x08, 0x69, 0xcb, 0x56, 0xed, 0xa1, 0xc5, 0x8d, 0xf8, 0xfa, 0xbc, + 0xd9, 0xd8, 0x96, 0xf3, 0xe3, 0x98, 0x8a, 0xcb, 0x5c, 0x8d, 0x74, 0x13, 0x8a, 0xc1, 0x2f, 0xd1, + 0x36, 0xf0, 0x9c, 0x28, 0x2e, 0xdd, 0x06, 0x34, 0x99, 0xa4, 0x85, 0xe0, 0x10, 0x42, 0x18, 0x0e, + 0xf1, 0x0b, 0x7a, 0x01, 0x8e, 0x4c, 0xc8, 0xd0, 0x3b, 0x63, 0x93, 0xbc, 0xb5, 0x48, 0x3a, 0xb7, + 0xc5, 0x68, 0x63, 0xd3, 0xbc, 0x01, 0x79, 0x3f, 0x7d, 0xbe, 0x49, 0x7e, 0x1b, 0xf7, 0x36, 0x71, + 0x10, 0x30, 0xf1, 0x8e, 0x40, 0xe1, 0x3b, 0x1e, 0x81, 0x6f, 0x02, 0xd8, 0x23, 0x9e, 0x09, 0x3a, + 0x71, 0xf4, 0x52, 0x08, 0x10, 0x8d, 0x9b, 0xf5, 0x11, 0xdf, 0x04, 0x59, 0x9b, 0xff, 0xb2, 0xd0, + 0xb1, 0x1f, 0x3d, 0x1a, 0xd2, 0x18, 0x6b, 0x71, 0x64, 0x65, 0xde, 0x60, 0xec, 0xa1, 0x4c, 0x8c, + 0x6c, 0xa1, 0xc7, 0x70, 0x6e, 0x2c, 0x51, 0x70, 0x55, 0x27, 0xe7, 0xcd, 0x17, 0xce, 0x04, 0xf3, + 0x05, 0x47, 0xb5, 0x3f, 0xda, 0xa7, 0x82, 0xd1, 0xfe, 0x2d, 0xb8, 0x38, 0x2d, 0xdb, 0x45, 0x97, + 0x00, 0xf0, 0x80, 0x04, 0x87, 0x96, 0x87, 0x28, 0x64, 0x39, 0xa5, 0x3e, 0x92, 0xee, 0x41, 0x29, + 0x2a, 0x93, 0x45, 0xd7, 0x20, 0x49, 0xaf, 0x1b, 0x2c, 0xdb, 0x39, 0x17, 0x82, 0x8d, 0x10, 0x3e, + 0x99, 0x32, 0x49, 0xbf, 0xf1, 0x3b, 0x67, 0x08, 0xb0, 0x71, 0x15, 0x56, 0x9c, 0x71, 0x8c, 0x03, + 0x1c, 0xcb, 0xfc, 0xc3, 0x21, 0xc7, 0x39, 0xd0, 0x7d, 0xd7, 0x91, 0x59, 0x15, 0xe9, 0xc6, 0x22, + 0xf9, 0xf1, 0xd6, 0x98, 0x0b, 0x5f, 0x86, 0x34, 0x77, 0x5e, 0x80, 0xb4, 0xda, 0xb0, 0xf0, 0xc0, + 0x16, 0x63, 0xc4, 0x91, 0x0d, 0x13, 0xd3, 0x86, 0x20, 0x3d, 0x06, 0xf0, 0x90, 0x38, 0x72, 0x4a, + 0x9b, 0xfa, 0x70, 0xd0, 0xa2, 0xa3, 0x4b, 0xc9, 0xac, 0x81, 0x6e, 0x42, 0xca, 0x8f, 0x14, 0x4d, + 0x86, 0x33, 0xd2, 0xb9, 0x0f, 0xc9, 0x63, 0xdc, 0x92, 0x06, 0x68, 0xb2, 0x1a, 0x12, 0xd1, 0xc5, + 0x5b, 0xc1, 0x2e, 0x2e, 0x47, 0xd6, 0x55, 0xc2, 0xbb, 0xfa, 0x18, 0x52, 0x74, 0xf7, 0x90, 0xc4, + 0x85, 0x96, 0xe0, 0x78, 0xc6, 0x4d, 0x7e, 0xa3, 0xff, 0x07, 0x50, 0x6d, 0xdb, 0xd4, 0x1a, 0x43, + 0xaf, 0x83, 0x8d, 0xf0, 0xdd, 0xb7, 0xe3, 0xf0, 0xed, 0x5e, 0xe4, 0xdb, 0x70, 0xcd, 0x13, 0xf5, + 0x6d, 0x45, 0x9f, 0x42, 0xe9, 0x00, 0x8a, 0x41, 0x59, 0x27, 0x47, 0x64, 0x63, 0x08, 0xe6, 0x88, + 0x2c, 0xe5, 0xe7, 0x39, 0xa2, 0x9b, 0x61, 0x26, 0x58, 0x9d, 0x91, 0x36, 0xa4, 0x1f, 0xc4, 0x21, + 0xef, 0xdf, 0xbc, 0xff, 0x7a, 0x69, 0x9c, 0xf4, 0x63, 0x01, 0x32, 0xee, 0xf4, 0x83, 0x45, 0xc7, + 0x40, 0x95, 0x96, 0x59, 0x2f, 0xee, 0xaf, 0x14, 0xb2, 0x9a, 0x6c, 0xc2, 0xad, 0xc9, 0xde, 0x76, + 0x53, 0x88, 0x28, 0xec, 0xcd, 0x6f, 0x6b, 0xee, 0x55, 0x4e, 0xc6, 0x74, 0x1b, 0xb2, 0xee, 0x09, + 0x48, 0x2e, 0x6e, 0x41, 0x68, 0xd5, 0x69, 0xd2, 0x7a, 0xb1, 0xfe, 0x11, 0x2f, 0x43, 0x26, 0x64, + 0xd6, 0x90, 0x5a, 0xb0, 0x3c, 0x76, 0x7c, 0xa2, 0xdb, 0xb0, 0x64, 0x0c, 0x1b, 0x8a, 0xe3, 0x1c, + 0x63, 0x58, 0xb6, 0x73, 0x25, 0x18, 0x36, 0x7a, 0x5a, 0xf3, 0x3e, 0x3e, 0x75, 0x06, 0x63, 0x0c, + 0x1b, 0xf7, 0x99, 0x0f, 0xb1, 0x5e, 0xe2, 0xfe, 0x5e, 0x7e, 0x2a, 0x40, 0xc6, 0xd9, 0x13, 0xe8, + 0xbf, 0x20, 0xeb, 0x1e, 0xcd, 0xee, 0x3b, 0x82, 0xc8, 0x33, 0x9d, 0xeb, 0xf7, 0x44, 0xd0, 0x8e, + 0xf3, 0x00, 0x42, 0x6b, 0x29, 0xed, 0x9e, 0xca, 0x7c, 0xa9, 0x18, 0xb4, 0x19, 0x3b, 0xbc, 0x69, + 0x4c, 0xdb, 0xbb, 0x73, 0xb7, 0xa7, 0x76, 0xe4, 0x1c, 0x95, 0xd9, 0x6b, 0x91, 0x06, 0xcf, 0x8e, + 0xff, 0x2a, 0x80, 0x38, 0xbe, 0x63, 0xbf, 0xf3, 0xe8, 0x26, 0x53, 0x85, 0x44, 0x48, 0xaa, 0x80, + 0xb6, 0x61, 0xd5, 0xe5, 0x50, 0x2c, 0xad, 0x33, 0x50, 0xed, 0xa1, 0x89, 0x39, 0xfa, 0x8f, 0xdc, + 0x4f, 0xc7, 0xce, 0x97, 0xc9, 0x59, 0xa7, 0x9e, 0x71, 0xd6, 0x9f, 0xc4, 0x21, 0xe7, 0xab, 0x45, + 0xa0, 0xff, 0xf4, 0x1d, 0x46, 0xc5, 0x90, 0xe8, 0xea, 0xe3, 0xf5, 0xde, 0x04, 0x04, 0xcd, 0x14, + 0x5f, 0xdc, 0x4c, 0x51, 0x15, 0x1f, 0xa7, 0xb4, 0x91, 0x5c, 0xb8, 0xb4, 0xf1, 0x32, 0x20, 0x5b, + 0xb7, 0xd5, 0x9e, 0x72, 0xa2, 0xdb, 0xda, 0xa0, 0xa3, 0x30, 0x37, 0x64, 0x47, 0x87, 0x48, 0xbf, + 0x3c, 0xa2, 0x1f, 0x8e, 0xa8, 0x47, 0xfe, 0x50, 0x80, 0x8c, 0x7b, 0x75, 0x59, 0xf4, 0xc5, 0xc0, + 0x59, 0x48, 0xf3, 0xec, 0x9c, 0x3d, 0x19, 0xe0, 0xad, 0xd0, 0x1a, 0x4e, 0x19, 0x32, 0x7d, 0x6c, + 0xab, 0xf4, 0x1c, 0x64, 0x99, 0x81, 0xdb, 0xbe, 0x7a, 0x0b, 0x72, 0xbe, 0xd7, 0x16, 0xe4, 0x68, + 0x3c, 0xa8, 0xbe, 0x2b, 0xc6, 0xca, 0x4b, 0x9f, 0x7e, 0xb1, 0x99, 0x38, 0xc0, 0x1f, 0x91, 0xdd, + 0x2c, 0x57, 0x2b, 0xb5, 0x6a, 0xe5, 0xbe, 0x28, 0x94, 0x73, 0x9f, 0x7e, 0xb1, 0xb9, 0x24, 0x63, + 0x0a, 0x5e, 0x5f, 0xbd, 0x0f, 0xcb, 0x63, 0x0b, 0x13, 0x4c, 0xfd, 0x10, 0x14, 0xef, 0x3c, 0x3c, + 0x7a, 0xb0, 0x57, 0xd9, 0xa9, 0x57, 0x95, 0x47, 0x87, 0xf5, 0xaa, 0x28, 0xa0, 0x73, 0xb0, 0xfa, + 0x60, 0xef, 0x5e, 0xad, 0xae, 0x54, 0x1e, 0xec, 0x55, 0x0f, 0xea, 0xca, 0x4e, 0xbd, 0xbe, 0x53, + 0xb9, 0x2f, 0xc6, 0xaf, 0xff, 0xa5, 0x00, 0xc9, 0x9d, 0xdd, 0xca, 0x1e, 0xaa, 0x40, 0x92, 0xc2, + 0x49, 0x53, 0x9f, 0xa4, 0x96, 0xa7, 0x97, 0x21, 0xd0, 0x5d, 0x48, 0x51, 0xa4, 0x09, 0x4d, 0x7f, + 0xa3, 0x5a, 0x9e, 0x51, 0x97, 0x20, 0x83, 0xa1, 0x3b, 0x72, 0xea, 0xa3, 0xd5, 0xf2, 0xf4, 0x32, + 0x05, 0x7a, 0x00, 0x4b, 0x0e, 0xd0, 0x30, 0xeb, 0x25, 0x69, 0x79, 0x66, 0xed, 0x80, 0x4c, 0x8d, + 0x01, 0x36, 0xd3, 0xdf, 0xb3, 0x96, 0x67, 0x14, 0x30, 0xd0, 0x1e, 0xa4, 0xf9, 0x95, 0x7e, 0xc6, + 0x13, 0xd5, 0xf2, 0xac, 0x92, 0x04, 0x92, 0x21, 0xeb, 0x41, 0x61, 0xb3, 0x5f, 0xe9, 0x96, 0xe7, + 0xa8, 0xcd, 0xa0, 0xf7, 0xa0, 0x10, 0x84, 0x0b, 0xe6, 0x7b, 0x06, 0x5b, 0x9e, 0xb3, 0xf8, 0x41, + 0xf4, 0x07, 0xb1, 0x83, 0xf9, 0x9e, 0xc5, 0x96, 0xe7, 0xac, 0x85, 0xa0, 0x0f, 0x60, 0x65, 0xf2, + 0x6e, 0x3f, 0xff, 0x2b, 0xd9, 0xf2, 0x02, 0xd5, 0x11, 0xd4, 0x07, 0x14, 0x82, 0x09, 0x2c, 0xf0, + 0x68, 0xb6, 0xbc, 0x48, 0xb1, 0x04, 0xb5, 0x60, 0x79, 0xfc, 0xa2, 0x3d, 0xef, 0x23, 0xda, 0xf2, + 0xdc, 0x85, 0x13, 0xd6, 0x4b, 0xf0, 0x82, 0x3e, 0xef, 0xa3, 0xda, 0xf2, 0xdc, 0x75, 0x14, 0xf4, + 0x10, 0xc0, 0x77, 0xc7, 0x9e, 0xe3, 0x91, 0x6d, 0x79, 0x9e, 0x8a, 0x0a, 0x32, 0x60, 0x35, 0xec, + 0xf2, 0xbd, 0xc8, 0x9b, 0xdb, 0xf2, 0x42, 0x85, 0x16, 0xe2, 0xcf, 0xc1, 0x6b, 0xf4, 0x7c, 0x6f, + 0x70, 0xcb, 0x73, 0x56, 0x5c, 0x90, 0x05, 0x6b, 0xa1, 0x57, 0xc7, 0x85, 0x5e, 0xe4, 0x96, 0x17, + 0xab, 0xc2, 0xa0, 0x0e, 0x88, 0x13, 0x17, 0xce, 0xb9, 0x1f, 0xe8, 0x96, 0xe7, 0xaf, 0xc7, 0xd0, + 0xf5, 0x0a, 0xb9, 0x8f, 0x2e, 0xf2, 0x5e, 0xb7, 0xbc, 0x50, 0x81, 0x66, 0x77, 0xe7, 0xcb, 0x6f, + 0xd6, 0x85, 0xaf, 0xbe, 0x59, 0x17, 0xfe, 0xfc, 0xcd, 0xba, 0xf0, 0xd9, 0xd3, 0xf5, 0xd8, 0x57, + 0x4f, 0xd7, 0x63, 0x7f, 0x7c, 0xba, 0x1e, 0xfb, 0x9f, 0x17, 0x3b, 0x9a, 0xdd, 0x1d, 0x36, 0xb6, + 0x9a, 0x7a, 0x7f, 0xbb, 0xa9, 0xf7, 0xb1, 0xdd, 0x68, 0xdb, 0xde, 0x0f, 0xef, 0x9f, 0x2b, 0x8d, + 0x34, 0xcd, 0x48, 0x6e, 0xfc, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x1d, 0x43, 0x6c, 0xa3, 0xd9, 0x32, + 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto index 90c6ba09711..458db58f29e 100644 --- a/proto/tendermint/abci/types.proto +++ b/proto/tendermint/abci/types.proto @@ -400,8 +400,8 @@ message ResponseValidateOracleVotes { Status status = 2; enum Status { - present = 0; - absent = 1; + absent = 0; + present = 1; } } From 62aef7ded29174a7e0d1c93824c6f876a1d1f73b Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 3 May 2024 01:09:28 +0800 Subject: [PATCH 080/150] test without validator index for gossip votes --- oracle/reactor.go | 4 +- oracle/service/runner/runner.go | 9 +- proto/tendermint/oracle/types.pb.go | 129 ++++++++++++++++++---------- proto/tendermint/oracle/types.proto | 4 +- types/oracle.go | 2 +- 5 files changed, 88 insertions(+), 60 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index d7b2bb9c383..d2e1985f33d 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -131,9 +131,9 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { switch msg := e.Message.(type) { case *oracleproto.GossipedVotes: // verify sig of incoming gossip vote, throw if verification fails - _, val := oracleR.ConsensusState.Validators.GetByIndex(msg.ValidatorIndex) + _, val := oracleR.ConsensusState.Validators.GetByAddress(msg.Validator) if val == nil { - logrus.Infof("validator with index: %v not found in validator set, skipping gossip", msg.ValidatorIndex) + logrus.Infof("validator with index: %v not found in validator set, skipping gossip", msg.Validator) return } pubKey := val.PubKey diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 5eebf6b7b0a..2ea5e881414 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -48,20 +48,13 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State return } - // batch sign the new votes, along with existing votes in gossipVoteBuffer, if any - validatorIndex, _ := consensusState.Validators.GetByAddress(oracleInfo.PubKey.Address()) - if validatorIndex == -1 { - log.Errorf("processSignVoteQueue: unable to find validator index") - return - } - // append new batch into unsignedVotesBuffer, need to mutex lock as it will clash with concurrent pruning oracleInfo.UnsignedVoteBuffer.UpdateMtx.Lock() oracleInfo.UnsignedVoteBuffer.Buffer = append(oracleInfo.UnsignedVoteBuffer.Buffer, votes...) // batch sign the entire unsignedVoteBuffer and add to gossipBuffer newGossipVote := &oracleproto.GossipedVotes{ - ValidatorIndex: validatorIndex, + Validator: oracleInfo.PubKey.Address(), SignedTimestamp: time.Now().Unix(), Votes: oracleInfo.UnsignedVoteBuffer.Buffer, } diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index 725073f07f0..9932768d2ab 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -91,7 +91,7 @@ func (m *Vote) GetData() string { } type GossipedVotes struct { - ValidatorIndex int32 `protobuf:"varint,1,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` + Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` Votes []*Vote `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes,omitempty"` SignedTimestamp int64 `protobuf:"varint,3,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` Signature []byte `protobuf:"bytes,4,opt,name=signature,proto3" json:"signature,omitempty"` @@ -130,11 +130,11 @@ func (m *GossipedVotes) XXX_DiscardUnknown() { var xxx_messageInfo_GossipedVotes proto.InternalMessageInfo -func (m *GossipedVotes) GetValidatorIndex() int32 { +func (m *GossipedVotes) GetValidator() []byte { if m != nil { - return m.ValidatorIndex + return m.Validator } - return 0 + return nil } func (m *GossipedVotes) GetVotes() []*Vote { @@ -159,7 +159,7 @@ func (m *GossipedVotes) GetSignature() []byte { } type CanonicalGossipedVotes struct { - ValidatorIndex int32 `protobuf:"varint,1,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` + Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` Votes []*Vote `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes,omitempty"` SignedTimestamp int64 `protobuf:"varint,3,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` } @@ -197,11 +197,11 @@ func (m *CanonicalGossipedVotes) XXX_DiscardUnknown() { var xxx_messageInfo_CanonicalGossipedVotes proto.InternalMessageInfo -func (m *CanonicalGossipedVotes) GetValidatorIndex() int32 { +func (m *CanonicalGossipedVotes) GetValidator() []byte { if m != nil { - return m.ValidatorIndex + return m.Validator } - return 0 + return nil } func (m *CanonicalGossipedVotes) GetVotes() []*Vote { @@ -227,27 +227,26 @@ func init() { func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 316 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x92, 0x3d, 0x4e, 0xc3, 0x30, - 0x14, 0xc7, 0xeb, 0x7e, 0x20, 0x62, 0x3e, 0x0a, 0x1e, 0x20, 0x12, 0xc5, 0xaa, 0xba, 0x50, 0x06, - 0x12, 0x09, 0x38, 0x01, 0x0c, 0xa8, 0x0b, 0x43, 0x84, 0x18, 0x58, 0x2a, 0x27, 0x36, 0xc5, 0x52, - 0x62, 0x47, 0xf1, 0x6b, 0x05, 0xb7, 0x60, 0xe7, 0x12, 0x1c, 0x83, 0xb1, 0x23, 0x23, 0x4a, 0x2e, - 0x82, 0xec, 0x48, 0x89, 0x44, 0x2f, 0xc0, 0xf6, 0xf4, 0xfb, 0xbf, 0xe7, 0xf7, 0xb3, 0xf4, 0xf0, - 0x29, 0x08, 0xc5, 0x45, 0x91, 0x49, 0x05, 0xa1, 0x2e, 0x58, 0x92, 0x8a, 0x10, 0xde, 0x72, 0x61, - 0x82, 0xbc, 0xd0, 0xa0, 0xc9, 0x61, 0x1b, 0x07, 0x75, 0x3c, 0x31, 0xb8, 0xff, 0xa8, 0x41, 0x90, - 0x11, 0xf6, 0x56, 0x2c, 0x95, 0x9c, 0x81, 0x2e, 0x7c, 0x34, 0x46, 0x53, 0x2f, 0x6a, 0x01, 0x39, - 0xc1, 0x5e, 0xdd, 0x3f, 0x97, 0xdc, 0xef, 0xba, 0x74, 0xbb, 0x06, 0x33, 0x6e, 0x47, 0x41, 0x66, - 0xc2, 0x00, 0xcb, 0x72, 0xbf, 0x37, 0x46, 0xd3, 0x5e, 0xd4, 0x02, 0x42, 0x70, 0x9f, 0x33, 0x60, - 0x7e, 0xdf, 0x4d, 0xb9, 0x7a, 0xf2, 0x89, 0xf0, 0xde, 0x9d, 0x36, 0x46, 0xe6, 0x82, 0xdb, 0xed, - 0x86, 0x9c, 0xe1, 0x61, 0xb3, 0x6d, 0x2e, 0x15, 0x17, 0xaf, 0x4e, 0x62, 0x10, 0xed, 0x37, 0x78, - 0x66, 0x29, 0xb9, 0xc0, 0x83, 0x95, 0x9d, 0xf0, 0xbb, 0xe3, 0xde, 0x74, 0xe7, 0xf2, 0x38, 0xd8, - 0xf8, 0x52, 0x60, 0x5f, 0x8c, 0xea, 0x2e, 0x72, 0x8e, 0x0f, 0x8c, 0x5c, 0x28, 0xc1, 0xe7, 0x7f, - 0x15, 0x87, 0x35, 0x7f, 0x68, 0x44, 0x47, 0xd8, 0xb3, 0x88, 0xc1, 0xb2, 0x10, 0xce, 0x76, 0x37, - 0x6a, 0xc1, 0xe4, 0x03, 0xe1, 0xa3, 0x5b, 0xa6, 0xb4, 0x92, 0x09, 0x4b, 0xff, 0x9b, 0xfb, 0xcd, - 0xfd, 0x57, 0x49, 0xd1, 0xba, 0xa4, 0xe8, 0xa7, 0xa4, 0xe8, 0xbd, 0xa2, 0x9d, 0x75, 0x45, 0x3b, - 0xdf, 0x15, 0xed, 0x3c, 0x5d, 0x2f, 0x24, 0xbc, 0x2c, 0xe3, 0x20, 0xd1, 0x59, 0x98, 0xe8, 0x4c, - 0x40, 0xfc, 0x0c, 0x6d, 0xe1, 0xce, 0x22, 0xdc, 0x38, 0x9a, 0x78, 0xcb, 0x05, 0x57, 0xbf, 0x01, - 0x00, 0x00, 0xff, 0xff, 0x64, 0xa4, 0x9b, 0xfc, 0x50, 0x02, 0x00, 0x00, + // 300 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x92, 0x41, 0x4a, 0xc4, 0x30, + 0x14, 0x86, 0x9b, 0x69, 0x15, 0x1b, 0x47, 0xd4, 0x2c, 0xb4, 0xe0, 0x18, 0x4a, 0x57, 0x75, 0x61, + 0x0b, 0xea, 0x09, 0x74, 0x21, 0x6e, 0x5c, 0x14, 0x71, 0xe1, 0x66, 0x48, 0x9b, 0x38, 0x06, 0xda, + 0xa6, 0x34, 0x6f, 0x06, 0xbc, 0xc5, 0x5c, 0xc2, 0xbb, 0xb8, 0x9c, 0xa5, 0x4b, 0x69, 0x2f, 0x22, + 0x4d, 0xc1, 0x8a, 0xbd, 0xc0, 0xec, 0x1e, 0xdf, 0xff, 0xbf, 0xfc, 0x7f, 0xe0, 0xe1, 0x73, 0x10, + 0x25, 0x17, 0x75, 0x21, 0x4b, 0x88, 0x55, 0xcd, 0xb2, 0x5c, 0xc4, 0xf0, 0x5e, 0x09, 0x1d, 0x55, + 0xb5, 0x02, 0x45, 0x8e, 0x07, 0x39, 0xea, 0xe5, 0x40, 0x63, 0xe7, 0x59, 0x81, 0x20, 0x33, 0xec, + 0xae, 0x58, 0x2e, 0x39, 0x03, 0x55, 0x7b, 0xc8, 0x47, 0xa1, 0x9b, 0x0c, 0x80, 0x9c, 0x61, 0xb7, + 0xf7, 0xcf, 0x25, 0xf7, 0x26, 0x46, 0xdd, 0xeb, 0xc1, 0x03, 0xef, 0x56, 0x41, 0x16, 0x42, 0x03, + 0x2b, 0x2a, 0xcf, 0xf6, 0x51, 0x68, 0x27, 0x03, 0x20, 0x04, 0x3b, 0x9c, 0x01, 0xf3, 0x1c, 0xb3, + 0x65, 0xe6, 0xe0, 0x03, 0xe1, 0x83, 0x7b, 0xa5, 0xb5, 0xac, 0x04, 0xef, 0xd2, 0xf5, 0x38, 0x7e, + 0xfa, 0x37, 0xfe, 0x12, 0xef, 0xac, 0x3a, 0x9b, 0x37, 0xf1, 0xed, 0x70, 0xff, 0xea, 0x34, 0x1a, + 0xfd, 0x23, 0xea, 0x9e, 0x49, 0x7a, 0x17, 0xb9, 0xc0, 0x47, 0x5a, 0x2e, 0x4a, 0xc1, 0xe7, 0xff, + 0x7b, 0x1d, 0xf6, 0xfc, 0xe9, 0xb7, 0xdd, 0x0c, 0xbb, 0x1d, 0x62, 0xb0, 0xac, 0x85, 0xa9, 0x38, + 0x4d, 0x06, 0x10, 0xac, 0x11, 0x3e, 0xb9, 0x63, 0xa5, 0x2a, 0x65, 0xc6, 0xf2, 0xad, 0x28, 0x7c, + 0xfb, 0xf8, 0xd9, 0x50, 0xb4, 0x69, 0x28, 0xfa, 0x6e, 0x28, 0x5a, 0xb7, 0xd4, 0xda, 0xb4, 0xd4, + 0xfa, 0x6a, 0xa9, 0xf5, 0x72, 0xb3, 0x90, 0xf0, 0xb6, 0x4c, 0xa3, 0x4c, 0x15, 0x71, 0xa6, 0x0a, + 0x01, 0xe9, 0x2b, 0x0c, 0x83, 0x39, 0x80, 0x78, 0x74, 0x1e, 0xe9, 0xae, 0x11, 0xae, 0x7f, 0x02, + 0x00, 0x00, 0xff, 0xff, 0xc4, 0x33, 0x57, 0xc2, 0x3a, 0x02, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -345,10 +344,12 @@ func (m *GossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x12 } } - if m.ValidatorIndex != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.ValidatorIndex)) + if len(m.Validator) > 0 { + i -= len(m.Validator) + copy(dAtA[i:], m.Validator) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Validator))) i-- - dAtA[i] = 0x8 + dAtA[i] = 0xa } return len(dAtA) - i, nil } @@ -392,10 +393,12 @@ func (m *CanonicalGossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) dAtA[i] = 0x12 } } - if m.ValidatorIndex != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.ValidatorIndex)) + if len(m.Validator) > 0 { + i -= len(m.Validator) + copy(dAtA[i:], m.Validator) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Validator))) i-- - dAtA[i] = 0x8 + dAtA[i] = 0xa } return len(dAtA) - i, nil } @@ -441,8 +444,9 @@ func (m *GossipedVotes) Size() (n int) { } var l int _ = l - if m.ValidatorIndex != 0 { - n += 1 + sovTypes(uint64(m.ValidatorIndex)) + l = len(m.Validator) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) } if len(m.Votes) > 0 { for _, e := range m.Votes { @@ -466,8 +470,9 @@ func (m *CanonicalGossipedVotes) Size() (n int) { } var l int _ = l - if m.ValidatorIndex != 0 { - n += 1 + sovTypes(uint64(m.ValidatorIndex)) + l = len(m.Validator) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) } if len(m.Votes) > 0 { for _, e := range m.Votes { @@ -682,10 +687,10 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorIndex", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) } - m.ValidatorIndex = 0 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -695,11 +700,26 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.ValidatorIndex |= int32(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) + if m.Validator == nil { + m.Validator = []byte{} + } + iNdEx = postIndex case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) @@ -838,10 +858,10 @@ func (m *CanonicalGossipedVotes) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorIndex", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) } - m.ValidatorIndex = 0 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -851,11 +871,26 @@ func (m *CanonicalGossipedVotes) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.ValidatorIndex |= int32(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) + if m.Validator == nil { + m.Validator = []byte{} + } + iNdEx = postIndex case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index fc1986cda46..ac73cf30bed 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -11,14 +11,14 @@ message Vote { } message GossipedVotes { - int32 validator_index = 1; + bytes validator = 1; repeated Vote votes = 2; int64 signed_timestamp = 3; bytes signature = 4; } message CanonicalGossipedVotes { - int32 validator_index = 1; + bytes validator = 1; repeated Vote votes = 2; int64 signed_timestamp = 3; } diff --git a/types/oracle.go b/types/oracle.go index fca713cf2ae..c917140e9af 100644 --- a/types/oracle.go +++ b/types/oracle.go @@ -17,7 +17,7 @@ func OracleVoteSignBytes(vote *oracleproto.GossipedVotes) []byte { func CanonicalizeOracleVote(vote *oracleproto.GossipedVotes) oracleproto.CanonicalGossipedVotes { return oracleproto.CanonicalGossipedVotes{ - ValidatorIndex: vote.ValidatorIndex, + Validator: vote.Validator, Votes: vote.Votes, SignedTimestamp: vote.SignedTimestamp, } From 664182f4ab4ae1dc1309bf44031da4de0916ee8a Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 3 May 2024 10:47:47 +0800 Subject: [PATCH 081/150] test with both val index and val addr in gossipedVotes --- oracle/reactor.go | 2 +- oracle/service/runner/runner.go | 8 ++ proto/tendermint/oracle/types.pb.go | 138 +++++++++++++++++++++------- proto/tendermint/oracle/types.proto | 12 ++- 4 files changed, 121 insertions(+), 39 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index d2e1985f33d..0010854a437 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -133,7 +133,7 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { // verify sig of incoming gossip vote, throw if verification fails _, val := oracleR.ConsensusState.Validators.GetByAddress(msg.Validator) if val == nil { - logrus.Infof("validator with index: %v not found in validator set, skipping gossip", msg.Validator) + logrus.Infof("validator: %v not found in validator set, skipping gossip", msg.Validator) return } pubKey := val.PubKey diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 2ea5e881414..6b787dcb33d 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -48,6 +48,13 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State return } + // batch sign the new votes, along with existing votes in gossipVoteBuffer, if any + validatorIndex, _ := consensusState.Validators.GetByAddress(oracleInfo.PubKey.Address()) + if validatorIndex == -1 { + log.Errorf("processSignVoteQueue: unable to find validator index") + return + } + // append new batch into unsignedVotesBuffer, need to mutex lock as it will clash with concurrent pruning oracleInfo.UnsignedVoteBuffer.UpdateMtx.Lock() oracleInfo.UnsignedVoteBuffer.Buffer = append(oracleInfo.UnsignedVoteBuffer.Buffer, votes...) @@ -55,6 +62,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State // batch sign the entire unsignedVoteBuffer and add to gossipBuffer newGossipVote := &oracleproto.GossipedVotes{ Validator: oracleInfo.PubKey.Address(), + ValidatorIndex: validatorIndex, SignedTimestamp: time.Now().Unix(), Votes: oracleInfo.UnsignedVoteBuffer.Buffer, } diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index 9932768d2ab..43b0a7b7c49 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -92,9 +92,10 @@ func (m *Vote) GetData() string { type GossipedVotes struct { Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` - Votes []*Vote `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes,omitempty"` - SignedTimestamp int64 `protobuf:"varint,3,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` - Signature []byte `protobuf:"bytes,4,opt,name=signature,proto3" json:"signature,omitempty"` + ValidatorIndex int32 `protobuf:"varint,2,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` + Votes []*Vote `protobuf:"bytes,3,rep,name=votes,proto3" json:"votes,omitempty"` + SignedTimestamp int64 `protobuf:"varint,4,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` + Signature []byte `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` } func (m *GossipedVotes) Reset() { *m = GossipedVotes{} } @@ -137,6 +138,13 @@ func (m *GossipedVotes) GetValidator() []byte { return nil } +func (m *GossipedVotes) GetValidatorIndex() int32 { + if m != nil { + return m.ValidatorIndex + } + return 0 +} + func (m *GossipedVotes) GetVotes() []*Vote { if m != nil { return m.Votes @@ -160,8 +168,9 @@ func (m *GossipedVotes) GetSignature() []byte { type CanonicalGossipedVotes struct { Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` - Votes []*Vote `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes,omitempty"` - SignedTimestamp int64 `protobuf:"varint,3,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` + ValidatorIndex int32 `protobuf:"varint,2,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` + Votes []*Vote `protobuf:"bytes,3,rep,name=votes,proto3" json:"votes,omitempty"` + SignedTimestamp int64 `protobuf:"varint,4,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` } func (m *CanonicalGossipedVotes) Reset() { *m = CanonicalGossipedVotes{} } @@ -204,6 +213,13 @@ func (m *CanonicalGossipedVotes) GetValidator() []byte { return nil } +func (m *CanonicalGossipedVotes) GetValidatorIndex() int32 { + if m != nil { + return m.ValidatorIndex + } + return 0 +} + func (m *CanonicalGossipedVotes) GetVotes() []*Vote { if m != nil { return m.Votes @@ -227,26 +243,28 @@ func init() { func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 300 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x92, 0x41, 0x4a, 0xc4, 0x30, - 0x14, 0x86, 0x9b, 0x69, 0x15, 0x1b, 0x47, 0xd4, 0x2c, 0xb4, 0xe0, 0x18, 0x4a, 0x57, 0x75, 0x61, - 0x0b, 0xea, 0x09, 0x74, 0x21, 0x6e, 0x5c, 0x14, 0x71, 0xe1, 0x66, 0x48, 0x9b, 0x38, 0x06, 0xda, - 0xa6, 0x34, 0x6f, 0x06, 0xbc, 0xc5, 0x5c, 0xc2, 0xbb, 0xb8, 0x9c, 0xa5, 0x4b, 0x69, 0x2f, 0x22, - 0x4d, 0xc1, 0x8a, 0xbd, 0xc0, 0xec, 0x1e, 0xdf, 0xff, 0xbf, 0xfc, 0x7f, 0xe0, 0xe1, 0x73, 0x10, - 0x25, 0x17, 0x75, 0x21, 0x4b, 0x88, 0x55, 0xcd, 0xb2, 0x5c, 0xc4, 0xf0, 0x5e, 0x09, 0x1d, 0x55, - 0xb5, 0x02, 0x45, 0x8e, 0x07, 0x39, 0xea, 0xe5, 0x40, 0x63, 0xe7, 0x59, 0x81, 0x20, 0x33, 0xec, - 0xae, 0x58, 0x2e, 0x39, 0x03, 0x55, 0x7b, 0xc8, 0x47, 0xa1, 0x9b, 0x0c, 0x80, 0x9c, 0x61, 0xb7, - 0xf7, 0xcf, 0x25, 0xf7, 0x26, 0x46, 0xdd, 0xeb, 0xc1, 0x03, 0xef, 0x56, 0x41, 0x16, 0x42, 0x03, - 0x2b, 0x2a, 0xcf, 0xf6, 0x51, 0x68, 0x27, 0x03, 0x20, 0x04, 0x3b, 0x9c, 0x01, 0xf3, 0x1c, 0xb3, - 0x65, 0xe6, 0xe0, 0x03, 0xe1, 0x83, 0x7b, 0xa5, 0xb5, 0xac, 0x04, 0xef, 0xd2, 0xf5, 0x38, 0x7e, - 0xfa, 0x37, 0xfe, 0x12, 0xef, 0xac, 0x3a, 0x9b, 0x37, 0xf1, 0xed, 0x70, 0xff, 0xea, 0x34, 0x1a, - 0xfd, 0x23, 0xea, 0x9e, 0x49, 0x7a, 0x17, 0xb9, 0xc0, 0x47, 0x5a, 0x2e, 0x4a, 0xc1, 0xe7, 0xff, - 0x7b, 0x1d, 0xf6, 0xfc, 0xe9, 0xb7, 0xdd, 0x0c, 0xbb, 0x1d, 0x62, 0xb0, 0xac, 0x85, 0xa9, 0x38, - 0x4d, 0x06, 0x10, 0xac, 0x11, 0x3e, 0xb9, 0x63, 0xa5, 0x2a, 0x65, 0xc6, 0xf2, 0xad, 0x28, 0x7c, - 0xfb, 0xf8, 0xd9, 0x50, 0xb4, 0x69, 0x28, 0xfa, 0x6e, 0x28, 0x5a, 0xb7, 0xd4, 0xda, 0xb4, 0xd4, - 0xfa, 0x6a, 0xa9, 0xf5, 0x72, 0xb3, 0x90, 0xf0, 0xb6, 0x4c, 0xa3, 0x4c, 0x15, 0x71, 0xa6, 0x0a, - 0x01, 0xe9, 0x2b, 0x0c, 0x83, 0x39, 0x80, 0x78, 0x74, 0x1e, 0xe9, 0xae, 0x11, 0xae, 0x7f, 0x02, - 0x00, 0x00, 0xff, 0xff, 0xc4, 0x33, 0x57, 0xc2, 0x3a, 0x02, 0x00, 0x00, + // 324 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x92, 0xbf, 0x4e, 0xf3, 0x30, + 0x14, 0xc5, 0xeb, 0x2f, 0xe9, 0x27, 0x62, 0xfe, 0x14, 0x3c, 0x40, 0x24, 0x8a, 0x55, 0x75, 0xa1, + 0x0c, 0x24, 0x12, 0xf0, 0x04, 0x30, 0xa0, 0x2e, 0x0c, 0x11, 0x62, 0x60, 0xa9, 0xdc, 0xd8, 0x14, + 0x4b, 0x8d, 0x1d, 0xc5, 0xb7, 0x15, 0xbc, 0x05, 0xaf, 0xc3, 0x1b, 0x30, 0xa1, 0x8e, 0x8c, 0xa8, + 0x7d, 0x11, 0x64, 0x5b, 0x4a, 0x90, 0xf2, 0x04, 0x6c, 0xd7, 0xbf, 0x73, 0xaf, 0xcf, 0x3d, 0xd2, + 0xc5, 0x27, 0x20, 0x14, 0x17, 0x55, 0x21, 0x15, 0xa4, 0xba, 0x62, 0xf9, 0x5c, 0xa4, 0xf0, 0x5a, + 0x0a, 0x93, 0x94, 0x95, 0x06, 0x4d, 0x0e, 0x1a, 0x39, 0xf1, 0xf2, 0xd0, 0xe0, 0xf0, 0x41, 0x83, + 0x20, 0x7d, 0x1c, 0x2d, 0xd9, 0x5c, 0x72, 0x06, 0xba, 0x8a, 0xd1, 0x00, 0x8d, 0xa2, 0xac, 0x01, + 0xe4, 0x18, 0x47, 0xbe, 0x7f, 0x22, 0x79, 0xfc, 0xcf, 0xa9, 0x5b, 0x1e, 0x8c, 0xb9, 0x1d, 0x05, + 0x59, 0x08, 0x03, 0xac, 0x28, 0xe3, 0x60, 0x80, 0x46, 0x41, 0xd6, 0x00, 0x42, 0x70, 0xc8, 0x19, + 0xb0, 0x38, 0x74, 0x53, 0xae, 0x1e, 0x7e, 0x22, 0xbc, 0x7b, 0xab, 0x8d, 0x91, 0xa5, 0xe0, 0xd6, + 0xdd, 0xb4, 0xed, 0x77, 0x7e, 0xdb, 0x9f, 0xe2, 0x5e, 0xfd, 0x98, 0x48, 0xc5, 0xc5, 0x8b, 0x5b, + 0xa2, 0x9b, 0xed, 0xd5, 0x78, 0x6c, 0x29, 0x39, 0xc7, 0xdd, 0xa5, 0xfd, 0x2f, 0x0e, 0x06, 0xc1, + 0x68, 0xfb, 0xe2, 0x28, 0x69, 0x05, 0x4e, 0xac, 0x5f, 0xe6, 0xbb, 0xc8, 0x19, 0xde, 0x37, 0x72, + 0xa6, 0x04, 0x9f, 0x34, 0x01, 0x42, 0x17, 0xa0, 0xe7, 0xf9, 0x7d, 0x1d, 0xa3, 0x8f, 0x23, 0x8b, + 0x18, 0x2c, 0x2a, 0x11, 0x77, 0xfd, 0x82, 0x35, 0x18, 0xbe, 0x23, 0x7c, 0x78, 0xc3, 0x94, 0x56, + 0x32, 0x67, 0xf3, 0xbf, 0x95, 0xec, 0xfa, 0xee, 0x63, 0x4d, 0xd1, 0x6a, 0x4d, 0xd1, 0xf7, 0x9a, + 0xa2, 0xb7, 0x0d, 0xed, 0xac, 0x36, 0xb4, 0xf3, 0xb5, 0xa1, 0x9d, 0xc7, 0xab, 0x99, 0x84, 0xe7, + 0xc5, 0x34, 0xc9, 0x75, 0x91, 0xe6, 0xba, 0x10, 0x30, 0x7d, 0x82, 0xa6, 0x70, 0x27, 0x95, 0xb6, + 0x0e, 0x6e, 0xfa, 0xdf, 0x09, 0x97, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xf1, 0xb8, 0xf7, 0x83, + 0x8c, 0x02, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -323,12 +341,12 @@ func (m *GossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.Signature) i = encodeVarintTypes(dAtA, i, uint64(len(m.Signature))) i-- - dAtA[i] = 0x22 + dAtA[i] = 0x2a } if m.SignedTimestamp != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.SignedTimestamp)) i-- - dAtA[i] = 0x18 + dAtA[i] = 0x20 } if len(m.Votes) > 0 { for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { @@ -341,9 +359,14 @@ func (m *GossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x12 + dAtA[i] = 0x1a } } + if m.ValidatorIndex != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.ValidatorIndex)) + i-- + dAtA[i] = 0x10 + } if len(m.Validator) > 0 { i -= len(m.Validator) copy(dAtA[i:], m.Validator) @@ -377,7 +400,7 @@ func (m *CanonicalGossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) if m.SignedTimestamp != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.SignedTimestamp)) i-- - dAtA[i] = 0x18 + dAtA[i] = 0x20 } if len(m.Votes) > 0 { for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { @@ -390,9 +413,14 @@ func (m *CanonicalGossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x12 + dAtA[i] = 0x1a } } + if m.ValidatorIndex != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.ValidatorIndex)) + i-- + dAtA[i] = 0x10 + } if len(m.Validator) > 0 { i -= len(m.Validator) copy(dAtA[i:], m.Validator) @@ -448,6 +476,9 @@ func (m *GossipedVotes) Size() (n int) { if l > 0 { n += 1 + l + sovTypes(uint64(l)) } + if m.ValidatorIndex != 0 { + n += 1 + sovTypes(uint64(m.ValidatorIndex)) + } if len(m.Votes) > 0 { for _, e := range m.Votes { l = e.Size() @@ -474,6 +505,9 @@ func (m *CanonicalGossipedVotes) Size() (n int) { if l > 0 { n += 1 + l + sovTypes(uint64(l)) } + if m.ValidatorIndex != 0 { + n += 1 + sovTypes(uint64(m.ValidatorIndex)) + } if len(m.Votes) > 0 { for _, e := range m.Votes { l = e.Size() @@ -721,6 +755,25 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorIndex", wireType) + } + m.ValidatorIndex = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ValidatorIndex |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) } @@ -754,7 +807,7 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 3: + case 4: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field SignedTimestamp", wireType) } @@ -773,7 +826,7 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { break } } - case 4: + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) } @@ -892,6 +945,25 @@ func (m *CanonicalGossipedVotes) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorIndex", wireType) + } + m.ValidatorIndex = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ValidatorIndex |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) } @@ -925,7 +997,7 @@ func (m *CanonicalGossipedVotes) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 3: + case 4: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field SignedTimestamp", wireType) } diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index ac73cf30bed..fc60f0e68b4 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -12,13 +12,15 @@ message Vote { message GossipedVotes { bytes validator = 1; - repeated Vote votes = 2; - int64 signed_timestamp = 3; - bytes signature = 4; + int32 validator_index = 2; + repeated Vote votes = 3; + int64 signed_timestamp = 4; + bytes signature = 5; } message CanonicalGossipedVotes { bytes validator = 1; - repeated Vote votes = 2; - int64 signed_timestamp = 3; + int32 validator_index = 2; + repeated Vote votes = 3; + int64 signed_timestamp = 4; } From cb5abc05c4795ca99477e6b2018cf9ad0fcc95eb Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 3 May 2024 10:54:25 +0800 Subject: [PATCH 082/150] add val index as part of signature --- types/oracle.go | 1 + 1 file changed, 1 insertion(+) diff --git a/types/oracle.go b/types/oracle.go index c917140e9af..bbf3de08b45 100644 --- a/types/oracle.go +++ b/types/oracle.go @@ -18,6 +18,7 @@ func OracleVoteSignBytes(vote *oracleproto.GossipedVotes) []byte { func CanonicalizeOracleVote(vote *oracleproto.GossipedVotes) oracleproto.CanonicalGossipedVotes { return oracleproto.CanonicalGossipedVotes{ Validator: vote.Validator, + ValidatorIndex: vote.ValidatorIndex, Votes: vote.Votes, SignedTimestamp: vote.SignedTimestamp, } From 8de22c96998638cd909bb606804bafb1101e31bb Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 3 May 2024 12:44:55 +0800 Subject: [PATCH 083/150] add logs --- consensus/reactor.go | 2 -- oracle/reactor.go | 1 - oracle/service/runner/runner.go | 29 ++++++++++++++++++++++------- state/execution.go | 5 ++--- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/consensus/reactor.go b/consensus/reactor.go index 5b6bb19d26e..ee87b7ba637 100644 --- a/consensus/reactor.go +++ b/consensus/reactor.go @@ -19,7 +19,6 @@ import ( sm "github.com/cometbft/cometbft/state" "github.com/cometbft/cometbft/types" cmttime "github.com/cometbft/cometbft/types/time" - "github.com/sirupsen/logrus" ) const ( @@ -343,7 +342,6 @@ func (conR *Reactor) Receive(e p2p.Envelope) { cs := conR.conS cs.mtx.RLock() height, valSize, lastCommitSize := cs.Height, cs.Validators.Size(), cs.LastCommit.Size() - logrus.Infof("@@@@@@@@@@@@@ VAL SIZE: %v @@@@@@@@@@@@@@@", cs.Validators.Size()) cs.mtx.RUnlock() ps.EnsureVoteBitArrays(height, valSize) ps.EnsureVoteBitArrays(height-1, lastCommitSize) diff --git a/oracle/reactor.go b/oracle/reactor.go index 0010854a437..d2104f56508 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -145,7 +145,6 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { if success := pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature); !success { oracleR.Logger.Error("failed signature verification", msg) - logrus.Info("FAILED SIGNATURE VERIFICATION!!!!!!!!!!!!!!") oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("oracle failed signature verification: %T", e.Message)) return } diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 6b787dcb33d..c5b379343d8 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -133,18 +133,33 @@ func contains(s []int64, e int64) bool { return false } -func PruneGossipVoteBuffer(oracleInfo *types.OracleInfo) { +func PruneGossipVoteBuffer(oracleInfo *types.OracleInfo, consensusState *cs.State) { go func(oracleInfo *types.OracleInfo) { - interval := 60 * time.Second - ticker := time.Tick(interval) + maxGossipVoteAge := oracleInfo.Config.MaxGossipVoteAge + if maxGossipVoteAge == 0 { + maxGossipVoteAge = 2 + } + ticker := time.Tick(1 * time.Second) for range ticker { + lastBlockTime := consensusState.GetState().LastBlockTime + + if !contains(oracleInfo.BlockTimestamps, lastBlockTime.Unix()) { + oracleInfo.BlockTimestamps = append(oracleInfo.BlockTimestamps, lastBlockTime.Unix()) + } + + if len(oracleInfo.BlockTimestamps) < maxGossipVoteAge { + continue + } + + if len(oracleInfo.BlockTimestamps) > maxGossipVoteAge { + oracleInfo.BlockTimestamps = oracleInfo.BlockTimestamps[1:] + } oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() - currTime := time.Now().Unix() buffer := oracleInfo.GossipVoteBuffer.Buffer - // prune gossip vote that have signed timestamps older than 60 secs + // prune gossip votes that have not been updated in the last x amt of blocks, where x is the maxGossipVoteAge for valAddr, gossipVote := range oracleInfo.GossipVoteBuffer.Buffer { - if gossipVote.SignedTimestamp < currTime-int64(interval.Seconds()) { + if gossipVote.SignedTimestamp < oracleInfo.BlockTimestamps[0] { log.Infof("DELETING STALE GOSSIP BUFFER (%v) FOR VAL: %s", gossipVote.SignedTimestamp, valAddr) delete(buffer, valAddr) } @@ -160,7 +175,7 @@ func Run(oracleInfo *types.OracleInfo, consensusState *cs.State) { log.Info("[oracle] Service started.") RunProcessSignVoteQueue(oracleInfo, consensusState) PruneUnsignedVoteBuffer(oracleInfo, consensusState) - PruneGossipVoteBuffer(oracleInfo) + PruneGossipVoteBuffer(oracleInfo, consensusState) // start to take votes from app for { res, err := oracleInfo.ProxyApp.FetchOracleVotes(context.Background(), &abcitypes.RequestFetchOracleVotes{}) diff --git a/state/execution.go b/state/execution.go index d0041ee059d..e7787453335 100644 --- a/state/execution.go +++ b/state/execution.go @@ -210,11 +210,10 @@ func (blockExec *BlockExecutor) ProcessProposal( if err != nil && res.Status == abci.ResponseValidateOracleVotes_absent { // oracleTx is not present, continue normal processProposal flow - blockExec.logger.Error("error unmarshalling oracleVotesMsg or oracleVotesMsg not present", "err", err) - logrus.Infof("processProposal: cant even find oracle votes") + blockExec.logger.Error("error validating oracle votes:", "err", err) } else if err != nil && res.Status == abci.ResponseValidateOracleVotes_present { // oracleTx is present but it is invalid, remove from txs - logrus.Infof("processProposal: unsucessful in validating oracle votes") + blockExec.logger.Error("error validating oracle votes:", "err", err) block.Data.Txs = types.ToTxs(txs[1:]) } else if err == nil { // oracleTx is present and valid, update txBz as some of the gossipVotes might have been removed due to invalid sig From efb590d35d0bf07474bbb6c7c32d790b6dc0ffb4 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 3 May 2024 13:26:02 +0800 Subject: [PATCH 084/150] improve logs and add check to not gossip stale votes --- oracle/reactor.go | 12 +++++++++--- oracle/service/runner/runner.go | 2 -- state/execution.go | 3 +++ 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index d2104f56508..8462598a1a6 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -1,6 +1,7 @@ package oracle import ( + "encoding/hex" "fmt" "math" "time" @@ -61,7 +62,7 @@ func NewReactor(config *config.OracleConfig, pubKey crypto.PubKey, privValidator PubKey: pubKey, PrivValidator: privValidator, ProxyApp: proxyApp, - BlockTimestamps: make([]int64, 0), + BlockTimestamps: []int64{}, } oracleR := &Reactor{ @@ -133,7 +134,7 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { // verify sig of incoming gossip vote, throw if verification fails _, val := oracleR.ConsensusState.Validators.GetByAddress(msg.Validator) if val == nil { - logrus.Infof("validator: %v not found in validator set, skipping gossip", msg.Validator) + logrus.Infof("validator: %v not found in validator set, skipping gossip", hex.EncodeToString(msg.Validator)) return } pubKey := val.PubKey @@ -144,7 +145,7 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { } if success := pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature); !success { - oracleR.Logger.Error("failed signature verification", msg) + oracleR.Logger.Error("failed signature verification for validator: %v", hex.EncodeToString(msg.Validator)) oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("oracle failed signature verification: %T", e.Message)) return } @@ -212,6 +213,11 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RLock() for _, gossipVote := range oracleR.OracleInfo.GossipVoteBuffer.Buffer { + // stop sending gossip votes that have passed the maxGossipVoteAge + if len(oracleR.OracleInfo.BlockTimestamps) > 0 && gossipVote.SignedTimestamp < oracleR.OracleInfo.BlockTimestamps[0] { + continue + } + success := peer.Send(p2p.Envelope{ ChannelID: OracleChannel, Message: gossipVote, diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index c5b379343d8..5d5522a8d0b 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -114,8 +114,6 @@ func PruneUnsignedVoteBuffer(oracleInfo *types.OracleInfo, consensusState *cs.St for _, vote := range unsignedVoteBuffer { if vote.Timestamp >= oracleInfo.BlockTimestamps[0] { newVotes = append(newVotes, vote) - } else { - log.Infof("deleting vote timestamp: %v, block timestamp: %v", vote.Timestamp, oracleInfo.BlockTimestamps[0]) } } oracleInfo.UnsignedVoteBuffer.Buffer = newVotes diff --git a/state/execution.go b/state/execution.go index e7787453335..ef07ff191b1 100644 --- a/state/execution.go +++ b/state/execution.go @@ -151,6 +151,9 @@ func (blockExec *BlockExecutor) CreateProposalBlock( blockExec.logger.Error("error in proxyAppConn.CreateOracleResultTx", "err", err) } CreateOracleResultTxBz = resp.EncodedTx + logrus.Info("submitting oracle results...") + } else { + logrus.Info("skipping submitting of oracle results as no votes") } txs := blockExec.mempool.ReapMaxBytesMaxGas(maxReapBytes, maxGas) From b4640f27cad328daf9fcb2992c43105a02d3e3b2 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 3 May 2024 14:04:27 +0800 Subject: [PATCH 085/150] improve check for stale gossip votes on gossip protocol --- oracle/reactor.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 8462598a1a6..46a32a4da12 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -214,7 +214,8 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RLock() for _, gossipVote := range oracleR.OracleInfo.GossipVoteBuffer.Buffer { // stop sending gossip votes that have passed the maxGossipVoteAge - if len(oracleR.OracleInfo.BlockTimestamps) > 0 && gossipVote.SignedTimestamp < oracleR.OracleInfo.BlockTimestamps[0] { + if len(oracleR.OracleInfo.BlockTimestamps) >= oracleR.OracleInfo.Config.MaxGossipVoteAge && + gossipVote.SignedTimestamp < oracleR.OracleInfo.BlockTimestamps[0] { continue } From bd45f6c0836c0d2bc75bdca55e1d0b0240f0ca9a Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 3 May 2024 14:24:36 +0800 Subject: [PATCH 086/150] fix nil bug on gossip --- oracle/reactor.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/oracle/reactor.go b/oracle/reactor.go index 46a32a4da12..e523b913b6d 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -219,6 +219,10 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { continue } + if gossipVote == nil { + continue + } + success := peer.Send(p2p.Envelope{ ChannelID: OracleChannel, Message: gossipVote, From 4410992ed2e94e34eda64eefd14694bb67cbb543 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 3 May 2024 14:53:20 +0800 Subject: [PATCH 087/150] simplify pruning for vote buffers --- oracle/reactor.go | 1 - oracle/service/runner/runner.go | 47 ++++++++------------------------- 2 files changed, 11 insertions(+), 37 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index e523b913b6d..1634335426c 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -229,7 +229,6 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { }) if !success { logrus.Info("FAILED TO SEND!!!!!!!!!!!!!!!!!!!!!!!!!!!!") - time.Sleep(PeerCatchupSleepIntervalMS * time.Millisecond) continue } } diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 5d5522a8d0b..eb0e52e0731 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -85,7 +85,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() } -func PruneUnsignedVoteBuffer(oracleInfo *types.OracleInfo, consensusState *cs.State) { +func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { go func(oracleInfo *types.OracleInfo) { maxGossipVoteAge := oracleInfo.Config.MaxGossipVoteAge if maxGossipVoteAge == 0 { @@ -118,40 +118,7 @@ func PruneUnsignedVoteBuffer(oracleInfo *types.OracleInfo, consensusState *cs.St } oracleInfo.UnsignedVoteBuffer.Buffer = newVotes oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() - } - }(oracleInfo) -} - -func contains(s []int64, e int64) bool { - for _, a := range s { - if a == e { - return true - } - } - return false -} - -func PruneGossipVoteBuffer(oracleInfo *types.OracleInfo, consensusState *cs.State) { - go func(oracleInfo *types.OracleInfo) { - maxGossipVoteAge := oracleInfo.Config.MaxGossipVoteAge - if maxGossipVoteAge == 0 { - maxGossipVoteAge = 2 - } - ticker := time.Tick(1 * time.Second) - for range ticker { - lastBlockTime := consensusState.GetState().LastBlockTime - if !contains(oracleInfo.BlockTimestamps, lastBlockTime.Unix()) { - oracleInfo.BlockTimestamps = append(oracleInfo.BlockTimestamps, lastBlockTime.Unix()) - } - - if len(oracleInfo.BlockTimestamps) < maxGossipVoteAge { - continue - } - - if len(oracleInfo.BlockTimestamps) > maxGossipVoteAge { - oracleInfo.BlockTimestamps = oracleInfo.BlockTimestamps[1:] - } oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() buffer := oracleInfo.GossipVoteBuffer.Buffer @@ -168,12 +135,20 @@ func PruneGossipVoteBuffer(oracleInfo *types.OracleInfo, consensusState *cs.Stat }(oracleInfo) } +func contains(s []int64, e int64) bool { + for _, a := range s { + if a == e { + return true + } + } + return false +} + // Run run oracles func Run(oracleInfo *types.OracleInfo, consensusState *cs.State) { log.Info("[oracle] Service started.") RunProcessSignVoteQueue(oracleInfo, consensusState) - PruneUnsignedVoteBuffer(oracleInfo, consensusState) - PruneGossipVoteBuffer(oracleInfo, consensusState) + PruneVoteBuffers(oracleInfo, consensusState) // start to take votes from app for { res, err := oracleInfo.ProxyApp.FetchOracleVotes(context.Background(), &abcitypes.RequestFetchOracleVotes{}) From ee4638fad14c70ebe642c982f1a84b330470b826 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 3 May 2024 15:34:29 +0800 Subject: [PATCH 088/150] edit prune interval --- oracle/service/runner/runner.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index eb0e52e0731..7d7ff2f1c38 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -91,7 +91,7 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { if maxGossipVoteAge == 0 { maxGossipVoteAge = 2 } - ticker := time.Tick(1 * time.Second) + ticker := time.Tick(500 * time.Millisecond) for range ticker { lastBlockTime := consensusState.GetState().LastBlockTime From bcb8cd1f014251fb5b6e3aeb991f0564dc5a3038 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 3 May 2024 16:46:24 +0800 Subject: [PATCH 089/150] test without pruning gossip buffer --- oracle/service/runner/runner.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 7d7ff2f1c38..d7f4e6e190d 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -119,18 +119,18 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { oracleInfo.UnsignedVoteBuffer.Buffer = newVotes oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() - oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() - buffer := oracleInfo.GossipVoteBuffer.Buffer - - // prune gossip votes that have not been updated in the last x amt of blocks, where x is the maxGossipVoteAge - for valAddr, gossipVote := range oracleInfo.GossipVoteBuffer.Buffer { - if gossipVote.SignedTimestamp < oracleInfo.BlockTimestamps[0] { - log.Infof("DELETING STALE GOSSIP BUFFER (%v) FOR VAL: %s", gossipVote.SignedTimestamp, valAddr) - delete(buffer, valAddr) - } - } - oracleInfo.GossipVoteBuffer.Buffer = buffer - oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() + // oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() + // buffer := oracleInfo.GossipVoteBuffer.Buffer + + // // prune gossip votes that have not been updated in the last x amt of blocks, where x is the maxGossipVoteAge + // for valAddr, gossipVote := range oracleInfo.GossipVoteBuffer.Buffer { + // if gossipVote.SignedTimestamp < oracleInfo.BlockTimestamps[0] { + // log.Infof("DELETING STALE GOSSIP BUFFER (%v) FOR VAL: %s", gossipVote.SignedTimestamp, valAddr) + // delete(buffer, valAddr) + // } + // } + // oracleInfo.GossipVoteBuffer.Buffer = buffer + // oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() } }(oracleInfo) } From 782e945f4596bda92f76a81a40af38d10f436799 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Sat, 4 May 2024 23:13:26 +0800 Subject: [PATCH 090/150] regen proto --- oracle/reactor.go | 4 + proto/tendermint/oracle/types.pb.go | 117 ++++++++++++++-------------- proto/tendermint/oracle/types.proto | 4 +- 3 files changed, 65 insertions(+), 60 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 1634335426c..a8d9e112e6f 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -131,6 +131,10 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { oracleR.Logger.Debug("Receive", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) switch msg := e.Message.(type) { case *oracleproto.GossipedVotes: + if msg == nil { + return + } + // verify sig of incoming gossip vote, throw if verification fails _, val := oracleR.ConsensusState.Validators.GetByAddress(msg.Validator) if val == nil { diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index 43b0a7b7c49..80d3372a81a 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -91,8 +91,8 @@ func (m *Vote) GetData() string { } type GossipedVotes struct { - Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` - ValidatorIndex int32 `protobuf:"varint,2,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` + ValidatorIndex int32 `protobuf:"varint,1,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` + Validator []byte `protobuf:"bytes,2,opt,name=validator,proto3" json:"validator,omitempty"` Votes []*Vote `protobuf:"bytes,3,rep,name=votes,proto3" json:"votes,omitempty"` SignedTimestamp int64 `protobuf:"varint,4,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` Signature []byte `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` @@ -131,18 +131,18 @@ func (m *GossipedVotes) XXX_DiscardUnknown() { var xxx_messageInfo_GossipedVotes proto.InternalMessageInfo -func (m *GossipedVotes) GetValidator() []byte { +func (m *GossipedVotes) GetValidatorIndex() int32 { if m != nil { - return m.Validator + return m.ValidatorIndex } - return nil + return 0 } -func (m *GossipedVotes) GetValidatorIndex() int32 { +func (m *GossipedVotes) GetValidator() []byte { if m != nil { - return m.ValidatorIndex + return m.Validator } - return 0 + return nil } func (m *GossipedVotes) GetVotes() []*Vote { @@ -243,28 +243,29 @@ func init() { func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 324 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x92, 0xbf, 0x4e, 0xf3, 0x30, - 0x14, 0xc5, 0xeb, 0x2f, 0xe9, 0x27, 0x62, 0xfe, 0x14, 0x3c, 0x40, 0x24, 0x8a, 0x55, 0x75, 0xa1, - 0x0c, 0x24, 0x12, 0xf0, 0x04, 0x30, 0xa0, 0x2e, 0x0c, 0x11, 0x62, 0x60, 0xa9, 0xdc, 0xd8, 0x14, - 0x4b, 0x8d, 0x1d, 0xc5, 0xb7, 0x15, 0xbc, 0x05, 0xaf, 0xc3, 0x1b, 0x30, 0xa1, 0x8e, 0x8c, 0xa8, - 0x7d, 0x11, 0x64, 0x5b, 0x4a, 0x90, 0xf2, 0x04, 0x6c, 0xd7, 0xbf, 0x73, 0xaf, 0xcf, 0x3d, 0xd2, - 0xc5, 0x27, 0x20, 0x14, 0x17, 0x55, 0x21, 0x15, 0xa4, 0xba, 0x62, 0xf9, 0x5c, 0xa4, 0xf0, 0x5a, - 0x0a, 0x93, 0x94, 0x95, 0x06, 0x4d, 0x0e, 0x1a, 0x39, 0xf1, 0xf2, 0xd0, 0xe0, 0xf0, 0x41, 0x83, - 0x20, 0x7d, 0x1c, 0x2d, 0xd9, 0x5c, 0x72, 0x06, 0xba, 0x8a, 0xd1, 0x00, 0x8d, 0xa2, 0xac, 0x01, - 0xe4, 0x18, 0x47, 0xbe, 0x7f, 0x22, 0x79, 0xfc, 0xcf, 0xa9, 0x5b, 0x1e, 0x8c, 0xb9, 0x1d, 0x05, - 0x59, 0x08, 0x03, 0xac, 0x28, 0xe3, 0x60, 0x80, 0x46, 0x41, 0xd6, 0x00, 0x42, 0x70, 0xc8, 0x19, - 0xb0, 0x38, 0x74, 0x53, 0xae, 0x1e, 0x7e, 0x22, 0xbc, 0x7b, 0xab, 0x8d, 0x91, 0xa5, 0xe0, 0xd6, - 0xdd, 0xb4, 0xed, 0x77, 0x7e, 0xdb, 0x9f, 0xe2, 0x5e, 0xfd, 0x98, 0x48, 0xc5, 0xc5, 0x8b, 0x5b, - 0xa2, 0x9b, 0xed, 0xd5, 0x78, 0x6c, 0x29, 0x39, 0xc7, 0xdd, 0xa5, 0xfd, 0x2f, 0x0e, 0x06, 0xc1, - 0x68, 0xfb, 0xe2, 0x28, 0x69, 0x05, 0x4e, 0xac, 0x5f, 0xe6, 0xbb, 0xc8, 0x19, 0xde, 0x37, 0x72, - 0xa6, 0x04, 0x9f, 0x34, 0x01, 0x42, 0x17, 0xa0, 0xe7, 0xf9, 0x7d, 0x1d, 0xa3, 0x8f, 0x23, 0x8b, - 0x18, 0x2c, 0x2a, 0x11, 0x77, 0xfd, 0x82, 0x35, 0x18, 0xbe, 0x23, 0x7c, 0x78, 0xc3, 0x94, 0x56, - 0x32, 0x67, 0xf3, 0xbf, 0x95, 0xec, 0xfa, 0xee, 0x63, 0x4d, 0xd1, 0x6a, 0x4d, 0xd1, 0xf7, 0x9a, - 0xa2, 0xb7, 0x0d, 0xed, 0xac, 0x36, 0xb4, 0xf3, 0xb5, 0xa1, 0x9d, 0xc7, 0xab, 0x99, 0x84, 0xe7, - 0xc5, 0x34, 0xc9, 0x75, 0x91, 0xe6, 0xba, 0x10, 0x30, 0x7d, 0x82, 0xa6, 0x70, 0x27, 0x95, 0xb6, - 0x0e, 0x6e, 0xfa, 0xdf, 0x09, 0x97, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xf1, 0xb8, 0xf7, 0x83, - 0x8c, 0x02, 0x00, 0x00, + // 337 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x92, 0x3f, 0x4e, 0xc3, 0x30, + 0x14, 0xc6, 0xeb, 0x26, 0x45, 0xc4, 0xfc, 0x29, 0x78, 0x80, 0x48, 0x94, 0xa8, 0xea, 0x42, 0x19, + 0x48, 0x24, 0xe0, 0x04, 0x30, 0xa0, 0x2e, 0x0c, 0x11, 0x62, 0x60, 0xa9, 0xdc, 0xd8, 0x14, 0x4b, + 0x8d, 0x1d, 0xc5, 0xaf, 0x15, 0xdc, 0x82, 0xeb, 0x70, 0x03, 0x26, 0xd4, 0x91, 0x11, 0xb5, 0x17, + 0x41, 0xb6, 0xa5, 0x84, 0xaa, 0x5d, 0xd9, 0xac, 0xdf, 0xb3, 0xf3, 0x7d, 0xbf, 0xe8, 0xe1, 0x53, + 0xe0, 0x92, 0xf1, 0x32, 0x17, 0x12, 0x12, 0x55, 0xd2, 0x6c, 0xc2, 0x13, 0x78, 0x2b, 0xb8, 0x8e, + 0x8b, 0x52, 0x81, 0x22, 0x87, 0xf5, 0x38, 0x76, 0xe3, 0x9e, 0xc6, 0xfe, 0xa3, 0x02, 0x4e, 0x3a, + 0x38, 0x98, 0xd1, 0x89, 0x60, 0x14, 0x54, 0x19, 0xa2, 0x2e, 0xea, 0x07, 0x69, 0x0d, 0xc8, 0x09, + 0x0e, 0xdc, 0xfd, 0xa1, 0x60, 0x61, 0xd3, 0x4e, 0xb7, 0x1d, 0x18, 0x30, 0xf3, 0x14, 0x44, 0xce, + 0x35, 0xd0, 0xbc, 0x08, 0xbd, 0x2e, 0xea, 0x7b, 0x69, 0x0d, 0x08, 0xc1, 0x3e, 0xa3, 0x40, 0x43, + 0xdf, 0xbe, 0xb2, 0xe7, 0xde, 0x17, 0xc2, 0x7b, 0x77, 0x4a, 0x6b, 0x51, 0x70, 0x66, 0xd2, 0x35, + 0x39, 0xc3, 0xed, 0x2a, 0x6d, 0x28, 0x24, 0xe3, 0xaf, 0xb6, 0x44, 0x2b, 0xdd, 0xaf, 0xf0, 0xc0, + 0xd0, 0xd5, 0x9e, 0xa6, 0xc9, 0xee, 0xdf, 0x9e, 0x17, 0xb8, 0x35, 0x33, 0xdf, 0x0b, 0xbd, 0xae, + 0xd7, 0xdf, 0xb9, 0x3c, 0x8e, 0xd7, 0x84, 0x63, 0x93, 0x97, 0xba, 0x5b, 0xe4, 0x1c, 0x1f, 0x68, + 0x31, 0x96, 0x9c, 0x0d, 0x6b, 0x01, 0xdf, 0x0a, 0xb4, 0x1d, 0x7f, 0xa8, 0x34, 0x3a, 0x38, 0x30, + 0x88, 0xc2, 0xb4, 0xe4, 0x61, 0xcb, 0xe5, 0x56, 0xa0, 0xf7, 0x81, 0xf0, 0xd1, 0x2d, 0x95, 0x4a, + 0x8a, 0x8c, 0x4e, 0x56, 0xcd, 0xd6, 0x7e, 0xec, 0x4a, 0xe1, 0x0d, 0xde, 0xcd, 0x8d, 0xde, 0xff, + 0x66, 0x76, 0x73, 0xff, 0xb9, 0x88, 0xd0, 0x7c, 0x11, 0xa1, 0x9f, 0x45, 0x84, 0xde, 0x97, 0x51, + 0x63, 0xbe, 0x8c, 0x1a, 0xdf, 0xcb, 0xa8, 0xf1, 0x74, 0x3d, 0x16, 0xf0, 0x32, 0x1d, 0xc5, 0x99, + 0xca, 0x93, 0x4c, 0xe5, 0x1c, 0x46, 0xcf, 0x50, 0x1f, 0xec, 0x4a, 0x25, 0x6b, 0x0b, 0x37, 0xda, + 0xb2, 0x83, 0xab, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x8f, 0x7e, 0x73, 0xa0, 0x8c, 0x02, 0x00, + 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -362,17 +363,17 @@ func (m *GossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x1a } } - if m.ValidatorIndex != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.ValidatorIndex)) - i-- - dAtA[i] = 0x10 - } if len(m.Validator) > 0 { i -= len(m.Validator) copy(dAtA[i:], m.Validator) i = encodeVarintTypes(dAtA, i, uint64(len(m.Validator))) i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 + } + if m.ValidatorIndex != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.ValidatorIndex)) + i-- + dAtA[i] = 0x8 } return len(dAtA) - i, nil } @@ -472,13 +473,13 @@ func (m *GossipedVotes) Size() (n int) { } var l int _ = l + if m.ValidatorIndex != 0 { + n += 1 + sovTypes(uint64(m.ValidatorIndex)) + } l = len(m.Validator) if l > 0 { n += 1 + l + sovTypes(uint64(l)) } - if m.ValidatorIndex != 0 { - n += 1 + sovTypes(uint64(m.ValidatorIndex)) - } if len(m.Votes) > 0 { for _, e := range m.Votes { l = e.Size() @@ -721,6 +722,25 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorIndex", wireType) + } + m.ValidatorIndex = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ValidatorIndex |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) } @@ -754,25 +774,6 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { m.Validator = []byte{} } iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorIndex", wireType) - } - m.ValidatorIndex = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.ValidatorIndex |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index fc60f0e68b4..a0932e973ff 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -11,8 +11,8 @@ message Vote { } message GossipedVotes { - bytes validator = 1; - int32 validator_index = 2; + int32 validator_index = 1; + bytes validator = 2; repeated Vote votes = 3; int64 signed_timestamp = 4; bytes signature = 5; From a554af9149296a4fea3fe46607984705c3696774 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Sun, 5 May 2024 00:24:14 +0800 Subject: [PATCH 091/150] add test logs --- oracle/reactor.go | 13 +++++++++---- oracle/service/runner/runner.go | 26 ++++++++++++++------------ state/execution.go | 6 ++---- 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index a8d9e112e6f..29106f535fe 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -148,6 +148,8 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { return } + logrus.Infof("RECEIVE GOSSIP: THIS IS MY VALIDATOR: %v", hex.EncodeToString(msg.Validator)) + if success := pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature); !success { oracleR.Logger.Error("failed signature verification for validator: %v", hex.EncodeToString(msg.Validator)) oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("oracle failed signature verification: %T", e.Message)) @@ -190,6 +192,11 @@ type PeerState interface { // // Send new oracle votes to peer. func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { + interval := oracleR.OracleInfo.Config.GossipInterval + if interval == 0 { + interval = 100 * time.Millisecond + } + for { // In case of both next.NextWaitChan() and peer.Quit() are variable at the same time if !oracleR.IsRunning() || !peer.IsRunning() { @@ -227,6 +234,8 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { continue } + logrus.Infof("SEND GOSSIP: THIS IS MY VALIDATOR: %v", hex.EncodeToString(gossipVote.Validator)) + success := peer.Send(p2p.Envelope{ ChannelID: OracleChannel, Message: gossipVote, @@ -238,10 +247,6 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { } oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() - interval := oracleR.OracleInfo.Config.GossipInterval - if interval == 0 { - interval = 100 * time.Millisecond - } time.Sleep(interval) } } diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index d7f4e6e190d..42621f116b0 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -2,6 +2,7 @@ package runner import ( "context" + "encoding/hex" "sort" "time" @@ -60,6 +61,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State oracleInfo.UnsignedVoteBuffer.Buffer = append(oracleInfo.UnsignedVoteBuffer.Buffer, votes...) // batch sign the entire unsignedVoteBuffer and add to gossipBuffer + log.Infof("signVoteQueue: THIS IS MY VALIDATOR: %v", hex.EncodeToString(oracleInfo.PubKey.Address())) newGossipVote := &oracleproto.GossipedVotes{ Validator: oracleInfo.PubKey.Address(), ValidatorIndex: validatorIndex, @@ -119,18 +121,18 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { oracleInfo.UnsignedVoteBuffer.Buffer = newVotes oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() - // oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() - // buffer := oracleInfo.GossipVoteBuffer.Buffer - - // // prune gossip votes that have not been updated in the last x amt of blocks, where x is the maxGossipVoteAge - // for valAddr, gossipVote := range oracleInfo.GossipVoteBuffer.Buffer { - // if gossipVote.SignedTimestamp < oracleInfo.BlockTimestamps[0] { - // log.Infof("DELETING STALE GOSSIP BUFFER (%v) FOR VAL: %s", gossipVote.SignedTimestamp, valAddr) - // delete(buffer, valAddr) - // } - // } - // oracleInfo.GossipVoteBuffer.Buffer = buffer - // oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() + oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() + buffer := oracleInfo.GossipVoteBuffer.Buffer + + // prune gossip votes that have not been updated in the last x amt of blocks, where x is the maxGossipVoteAge + for valAddr, gossipVote := range oracleInfo.GossipVoteBuffer.Buffer { + if gossipVote.SignedTimestamp < oracleInfo.BlockTimestamps[0] { + log.Infof("DELETING STALE GOSSIP BUFFER (%v) FOR VAL: %s", gossipVote.SignedTimestamp, valAddr) + delete(buffer, valAddr) + } + } + oracleInfo.GossipVoteBuffer.Buffer = buffer + oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() } }(oracleInfo) } diff --git a/state/execution.go b/state/execution.go index ef07ff191b1..4f9a9b83329 100644 --- a/state/execution.go +++ b/state/execution.go @@ -149,11 +149,9 @@ func (blockExec *BlockExecutor) CreateProposalBlock( }) if err != nil { blockExec.logger.Error("error in proxyAppConn.CreateOracleResultTx", "err", err) + } else { + CreateOracleResultTxBz = resp.EncodedTx } - CreateOracleResultTxBz = resp.EncodedTx - logrus.Info("submitting oracle results...") - } else { - logrus.Info("skipping submitting of oracle results as no votes") } txs := blockExec.mempool.ReapMaxBytesMaxGas(maxReapBytes, maxGas) From c19c7939d967fbcd0056d2bcc136c4aefb3ed214 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Sun, 5 May 2024 00:48:15 +0800 Subject: [PATCH 092/150] test without pruning --- oracle/reactor.go | 5 +---- oracle/service/runner/runner.go | 4 +--- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 29106f535fe..45e2894f154 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -148,9 +148,8 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { return } - logrus.Infof("RECEIVE GOSSIP: THIS IS MY VALIDATOR: %v", hex.EncodeToString(msg.Validator)) - if success := pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature); !success { + logrus.Warnf("failed signature for validator: %v", hex.EncodeToString(msg.Validator)) oracleR.Logger.Error("failed signature verification for validator: %v", hex.EncodeToString(msg.Validator)) oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("oracle failed signature verification: %T", e.Message)) return @@ -234,8 +233,6 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { continue } - logrus.Infof("SEND GOSSIP: THIS IS MY VALIDATOR: %v", hex.EncodeToString(gossipVote.Validator)) - success := peer.Send(p2p.Envelope{ ChannelID: OracleChannel, Message: gossipVote, diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 42621f116b0..425e83a825e 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -2,7 +2,6 @@ package runner import ( "context" - "encoding/hex" "sort" "time" @@ -61,7 +60,6 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State oracleInfo.UnsignedVoteBuffer.Buffer = append(oracleInfo.UnsignedVoteBuffer.Buffer, votes...) // batch sign the entire unsignedVoteBuffer and add to gossipBuffer - log.Infof("signVoteQueue: THIS IS MY VALIDATOR: %v", hex.EncodeToString(oracleInfo.PubKey.Address())) newGossipVote := &oracleproto.GossipedVotes{ Validator: oracleInfo.PubKey.Address(), ValidatorIndex: validatorIndex, @@ -150,7 +148,7 @@ func contains(s []int64, e int64) bool { func Run(oracleInfo *types.OracleInfo, consensusState *cs.State) { log.Info("[oracle] Service started.") RunProcessSignVoteQueue(oracleInfo, consensusState) - PruneVoteBuffers(oracleInfo, consensusState) + // PruneVoteBuffers(oracleInfo, consensusState) // start to take votes from app for { res, err := oracleInfo.ProxyApp.FetchOracleVotes(context.Background(), &abcitypes.RequestFetchOracleVotes{}) From f22af4cdb90fde2885d3b4ca4066b670e34466bc Mon Sep 17 00:00:00 2001 From: yan-soon Date: Sun, 5 May 2024 01:29:21 +0800 Subject: [PATCH 093/150] test gossiping without validator addr --- oracle/reactor.go | 14 +++++--------- oracle/service/runner/runner.go | 4 ++-- types/oracle.go | 2 +- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 45e2894f154..3112e20cbdb 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -131,12 +131,8 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { oracleR.Logger.Debug("Receive", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) switch msg := e.Message.(type) { case *oracleproto.GossipedVotes: - if msg == nil { - return - } - // verify sig of incoming gossip vote, throw if verification fails - _, val := oracleR.ConsensusState.Validators.GetByAddress(msg.Validator) + _, val := oracleR.ConsensusState.Validators.GetByIndex(msg.ValidatorIndex) if val == nil { logrus.Infof("validator: %v not found in validator set, skipping gossip", hex.EncodeToString(msg.Validator)) return @@ -223,13 +219,13 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RLock() for _, gossipVote := range oracleR.OracleInfo.GossipVoteBuffer.Buffer { - // stop sending gossip votes that have passed the maxGossipVoteAge - if len(oracleR.OracleInfo.BlockTimestamps) >= oracleR.OracleInfo.Config.MaxGossipVoteAge && - gossipVote.SignedTimestamp < oracleR.OracleInfo.BlockTimestamps[0] { + if gossipVote == nil { continue } - if gossipVote == nil { + // stop sending gossip votes that have passed the maxGossipVoteAge + if len(oracleR.OracleInfo.BlockTimestamps) >= oracleR.OracleInfo.Config.MaxGossipVoteAge && + gossipVote.SignedTimestamp < oracleR.OracleInfo.BlockTimestamps[0] { continue } diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 425e83a825e..d76d945ceef 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -61,7 +61,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State // batch sign the entire unsignedVoteBuffer and add to gossipBuffer newGossipVote := &oracleproto.GossipedVotes{ - Validator: oracleInfo.PubKey.Address(), + // Validator: oracleInfo.PubKey.Address(), ValidatorIndex: validatorIndex, SignedTimestamp: time.Now().Unix(), Votes: oracleInfo.UnsignedVoteBuffer.Buffer, @@ -148,7 +148,7 @@ func contains(s []int64, e int64) bool { func Run(oracleInfo *types.OracleInfo, consensusState *cs.State) { log.Info("[oracle] Service started.") RunProcessSignVoteQueue(oracleInfo, consensusState) - // PruneVoteBuffers(oracleInfo, consensusState) + PruneVoteBuffers(oracleInfo, consensusState) // start to take votes from app for { res, err := oracleInfo.ProxyApp.FetchOracleVotes(context.Background(), &abcitypes.RequestFetchOracleVotes{}) diff --git a/types/oracle.go b/types/oracle.go index bbf3de08b45..4ffba9a71a1 100644 --- a/types/oracle.go +++ b/types/oracle.go @@ -17,7 +17,7 @@ func OracleVoteSignBytes(vote *oracleproto.GossipedVotes) []byte { func CanonicalizeOracleVote(vote *oracleproto.GossipedVotes) oracleproto.CanonicalGossipedVotes { return oracleproto.CanonicalGossipedVotes{ - Validator: vote.Validator, + // Validator: vote.Validator, ValidatorIndex: vote.ValidatorIndex, Votes: vote.Votes, SignedTimestamp: vote.SignedTimestamp, From d2b1ecfc8078c435e367563459bcfc8d4f903c3a Mon Sep 17 00:00:00 2001 From: yan-soon Date: Sun, 5 May 2024 02:14:11 +0800 Subject: [PATCH 094/150] test with gossip backoff --- oracle/reactor.go | 5 +- oracle/service/runner/runner.go | 2 +- proto/tendermint/oracle/types.pb.go | 117 ++++++++++++++-------------- proto/tendermint/oracle/types.proto | 4 +- types/oracle.go | 2 +- 5 files changed, 65 insertions(+), 65 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 3112e20cbdb..538aa77b968 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -145,7 +145,7 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { } if success := pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature); !success { - logrus.Warnf("failed signature for validator: %v", hex.EncodeToString(msg.Validator)) + logrus.Warnf("failed signature verification for validator: %v", hex.EncodeToString(msg.Validator)) oracleR.Logger.Error("failed signature verification for validator: %v", hex.EncodeToString(msg.Validator)) oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("oracle failed signature verification: %T", e.Message)) return @@ -235,7 +235,8 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { }) if !success { logrus.Info("FAILED TO SEND!!!!!!!!!!!!!!!!!!!!!!!!!!!!") - continue + time.Sleep(PeerCatchupSleepIntervalMS * time.Millisecond) + break } } oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index d76d945ceef..7d7ff2f1c38 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -61,7 +61,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State // batch sign the entire unsignedVoteBuffer and add to gossipBuffer newGossipVote := &oracleproto.GossipedVotes{ - // Validator: oracleInfo.PubKey.Address(), + Validator: oracleInfo.PubKey.Address(), ValidatorIndex: validatorIndex, SignedTimestamp: time.Now().Unix(), Votes: oracleInfo.UnsignedVoteBuffer.Buffer, diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index 80d3372a81a..43b0a7b7c49 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -91,8 +91,8 @@ func (m *Vote) GetData() string { } type GossipedVotes struct { - ValidatorIndex int32 `protobuf:"varint,1,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` - Validator []byte `protobuf:"bytes,2,opt,name=validator,proto3" json:"validator,omitempty"` + Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` + ValidatorIndex int32 `protobuf:"varint,2,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` Votes []*Vote `protobuf:"bytes,3,rep,name=votes,proto3" json:"votes,omitempty"` SignedTimestamp int64 `protobuf:"varint,4,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` Signature []byte `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` @@ -131,18 +131,18 @@ func (m *GossipedVotes) XXX_DiscardUnknown() { var xxx_messageInfo_GossipedVotes proto.InternalMessageInfo -func (m *GossipedVotes) GetValidatorIndex() int32 { +func (m *GossipedVotes) GetValidator() []byte { if m != nil { - return m.ValidatorIndex + return m.Validator } - return 0 + return nil } -func (m *GossipedVotes) GetValidator() []byte { +func (m *GossipedVotes) GetValidatorIndex() int32 { if m != nil { - return m.Validator + return m.ValidatorIndex } - return nil + return 0 } func (m *GossipedVotes) GetVotes() []*Vote { @@ -243,29 +243,28 @@ func init() { func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 337 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x92, 0x3f, 0x4e, 0xc3, 0x30, - 0x14, 0xc6, 0xeb, 0x26, 0x45, 0xc4, 0xfc, 0x29, 0x78, 0x80, 0x48, 0x94, 0xa8, 0xea, 0x42, 0x19, - 0x48, 0x24, 0xe0, 0x04, 0x30, 0xa0, 0x2e, 0x0c, 0x11, 0x62, 0x60, 0xa9, 0xdc, 0xd8, 0x14, 0x4b, - 0x8d, 0x1d, 0xc5, 0xaf, 0x15, 0xdc, 0x82, 0xeb, 0x70, 0x03, 0x26, 0xd4, 0x91, 0x11, 0xb5, 0x17, - 0x41, 0xb6, 0xa5, 0x84, 0xaa, 0x5d, 0xd9, 0xac, 0xdf, 0xb3, 0xf3, 0x7d, 0xbf, 0xe8, 0xe1, 0x53, - 0xe0, 0x92, 0xf1, 0x32, 0x17, 0x12, 0x12, 0x55, 0xd2, 0x6c, 0xc2, 0x13, 0x78, 0x2b, 0xb8, 0x8e, - 0x8b, 0x52, 0x81, 0x22, 0x87, 0xf5, 0x38, 0x76, 0xe3, 0x9e, 0xc6, 0xfe, 0xa3, 0x02, 0x4e, 0x3a, - 0x38, 0x98, 0xd1, 0x89, 0x60, 0x14, 0x54, 0x19, 0xa2, 0x2e, 0xea, 0x07, 0x69, 0x0d, 0xc8, 0x09, - 0x0e, 0xdc, 0xfd, 0xa1, 0x60, 0x61, 0xd3, 0x4e, 0xb7, 0x1d, 0x18, 0x30, 0xf3, 0x14, 0x44, 0xce, - 0x35, 0xd0, 0xbc, 0x08, 0xbd, 0x2e, 0xea, 0x7b, 0x69, 0x0d, 0x08, 0xc1, 0x3e, 0xa3, 0x40, 0x43, - 0xdf, 0xbe, 0xb2, 0xe7, 0xde, 0x17, 0xc2, 0x7b, 0x77, 0x4a, 0x6b, 0x51, 0x70, 0x66, 0xd2, 0x35, - 0x39, 0xc3, 0xed, 0x2a, 0x6d, 0x28, 0x24, 0xe3, 0xaf, 0xb6, 0x44, 0x2b, 0xdd, 0xaf, 0xf0, 0xc0, - 0xd0, 0xd5, 0x9e, 0xa6, 0xc9, 0xee, 0xdf, 0x9e, 0x17, 0xb8, 0x35, 0x33, 0xdf, 0x0b, 0xbd, 0xae, - 0xd7, 0xdf, 0xb9, 0x3c, 0x8e, 0xd7, 0x84, 0x63, 0x93, 0x97, 0xba, 0x5b, 0xe4, 0x1c, 0x1f, 0x68, - 0x31, 0x96, 0x9c, 0x0d, 0x6b, 0x01, 0xdf, 0x0a, 0xb4, 0x1d, 0x7f, 0xa8, 0x34, 0x3a, 0x38, 0x30, - 0x88, 0xc2, 0xb4, 0xe4, 0x61, 0xcb, 0xe5, 0x56, 0xa0, 0xf7, 0x81, 0xf0, 0xd1, 0x2d, 0x95, 0x4a, - 0x8a, 0x8c, 0x4e, 0x56, 0xcd, 0xd6, 0x7e, 0xec, 0x4a, 0xe1, 0x0d, 0xde, 0xcd, 0x8d, 0xde, 0xff, - 0x66, 0x76, 0x73, 0xff, 0xb9, 0x88, 0xd0, 0x7c, 0x11, 0xa1, 0x9f, 0x45, 0x84, 0xde, 0x97, 0x51, - 0x63, 0xbe, 0x8c, 0x1a, 0xdf, 0xcb, 0xa8, 0xf1, 0x74, 0x3d, 0x16, 0xf0, 0x32, 0x1d, 0xc5, 0x99, - 0xca, 0x93, 0x4c, 0xe5, 0x1c, 0x46, 0xcf, 0x50, 0x1f, 0xec, 0x4a, 0x25, 0x6b, 0x0b, 0x37, 0xda, - 0xb2, 0x83, 0xab, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x8f, 0x7e, 0x73, 0xa0, 0x8c, 0x02, 0x00, - 0x00, + // 324 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x92, 0xbf, 0x4e, 0xf3, 0x30, + 0x14, 0xc5, 0xeb, 0x2f, 0xe9, 0x27, 0x62, 0xfe, 0x14, 0x3c, 0x40, 0x24, 0x8a, 0x55, 0x75, 0xa1, + 0x0c, 0x24, 0x12, 0xf0, 0x04, 0x30, 0xa0, 0x2e, 0x0c, 0x11, 0x62, 0x60, 0xa9, 0xdc, 0xd8, 0x14, + 0x4b, 0x8d, 0x1d, 0xc5, 0xb7, 0x15, 0xbc, 0x05, 0xaf, 0xc3, 0x1b, 0x30, 0xa1, 0x8e, 0x8c, 0xa8, + 0x7d, 0x11, 0x64, 0x5b, 0x4a, 0x90, 0xf2, 0x04, 0x6c, 0xd7, 0xbf, 0x73, 0xaf, 0xcf, 0x3d, 0xd2, + 0xc5, 0x27, 0x20, 0x14, 0x17, 0x55, 0x21, 0x15, 0xa4, 0xba, 0x62, 0xf9, 0x5c, 0xa4, 0xf0, 0x5a, + 0x0a, 0x93, 0x94, 0x95, 0x06, 0x4d, 0x0e, 0x1a, 0x39, 0xf1, 0xf2, 0xd0, 0xe0, 0xf0, 0x41, 0x83, + 0x20, 0x7d, 0x1c, 0x2d, 0xd9, 0x5c, 0x72, 0x06, 0xba, 0x8a, 0xd1, 0x00, 0x8d, 0xa2, 0xac, 0x01, + 0xe4, 0x18, 0x47, 0xbe, 0x7f, 0x22, 0x79, 0xfc, 0xcf, 0xa9, 0x5b, 0x1e, 0x8c, 0xb9, 0x1d, 0x05, + 0x59, 0x08, 0x03, 0xac, 0x28, 0xe3, 0x60, 0x80, 0x46, 0x41, 0xd6, 0x00, 0x42, 0x70, 0xc8, 0x19, + 0xb0, 0x38, 0x74, 0x53, 0xae, 0x1e, 0x7e, 0x22, 0xbc, 0x7b, 0xab, 0x8d, 0x91, 0xa5, 0xe0, 0xd6, + 0xdd, 0xb4, 0xed, 0x77, 0x7e, 0xdb, 0x9f, 0xe2, 0x5e, 0xfd, 0x98, 0x48, 0xc5, 0xc5, 0x8b, 0x5b, + 0xa2, 0x9b, 0xed, 0xd5, 0x78, 0x6c, 0x29, 0x39, 0xc7, 0xdd, 0xa5, 0xfd, 0x2f, 0x0e, 0x06, 0xc1, + 0x68, 0xfb, 0xe2, 0x28, 0x69, 0x05, 0x4e, 0xac, 0x5f, 0xe6, 0xbb, 0xc8, 0x19, 0xde, 0x37, 0x72, + 0xa6, 0x04, 0x9f, 0x34, 0x01, 0x42, 0x17, 0xa0, 0xe7, 0xf9, 0x7d, 0x1d, 0xa3, 0x8f, 0x23, 0x8b, + 0x18, 0x2c, 0x2a, 0x11, 0x77, 0xfd, 0x82, 0x35, 0x18, 0xbe, 0x23, 0x7c, 0x78, 0xc3, 0x94, 0x56, + 0x32, 0x67, 0xf3, 0xbf, 0x95, 0xec, 0xfa, 0xee, 0x63, 0x4d, 0xd1, 0x6a, 0x4d, 0xd1, 0xf7, 0x9a, + 0xa2, 0xb7, 0x0d, 0xed, 0xac, 0x36, 0xb4, 0xf3, 0xb5, 0xa1, 0x9d, 0xc7, 0xab, 0x99, 0x84, 0xe7, + 0xc5, 0x34, 0xc9, 0x75, 0x91, 0xe6, 0xba, 0x10, 0x30, 0x7d, 0x82, 0xa6, 0x70, 0x27, 0x95, 0xb6, + 0x0e, 0x6e, 0xfa, 0xdf, 0x09, 0x97, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xf1, 0xb8, 0xf7, 0x83, + 0x8c, 0x02, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -363,17 +362,17 @@ func (m *GossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x1a } } + if m.ValidatorIndex != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.ValidatorIndex)) + i-- + dAtA[i] = 0x10 + } if len(m.Validator) > 0 { i -= len(m.Validator) copy(dAtA[i:], m.Validator) i = encodeVarintTypes(dAtA, i, uint64(len(m.Validator))) i-- - dAtA[i] = 0x12 - } - if m.ValidatorIndex != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.ValidatorIndex)) - i-- - dAtA[i] = 0x8 + dAtA[i] = 0xa } return len(dAtA) - i, nil } @@ -473,13 +472,13 @@ func (m *GossipedVotes) Size() (n int) { } var l int _ = l - if m.ValidatorIndex != 0 { - n += 1 + sovTypes(uint64(m.ValidatorIndex)) - } l = len(m.Validator) if l > 0 { n += 1 + l + sovTypes(uint64(l)) } + if m.ValidatorIndex != 0 { + n += 1 + sovTypes(uint64(m.ValidatorIndex)) + } if len(m.Votes) > 0 { for _, e := range m.Votes { l = e.Size() @@ -722,25 +721,6 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorIndex", wireType) - } - m.ValidatorIndex = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.ValidatorIndex |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) } @@ -774,6 +754,25 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { m.Validator = []byte{} } iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorIndex", wireType) + } + m.ValidatorIndex = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ValidatorIndex |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index a0932e973ff..fc60f0e68b4 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -11,8 +11,8 @@ message Vote { } message GossipedVotes { - int32 validator_index = 1; - bytes validator = 2; + bytes validator = 1; + int32 validator_index = 2; repeated Vote votes = 3; int64 signed_timestamp = 4; bytes signature = 5; diff --git a/types/oracle.go b/types/oracle.go index 4ffba9a71a1..bbf3de08b45 100644 --- a/types/oracle.go +++ b/types/oracle.go @@ -17,7 +17,7 @@ func OracleVoteSignBytes(vote *oracleproto.GossipedVotes) []byte { func CanonicalizeOracleVote(vote *oracleproto.GossipedVotes) oracleproto.CanonicalGossipedVotes { return oracleproto.CanonicalGossipedVotes{ - // Validator: vote.Validator, + Validator: vote.Validator, ValidatorIndex: vote.ValidatorIndex, Votes: vote.Votes, SignedTimestamp: vote.SignedTimestamp, From 30ee7487a59b7661d38b513098bb01e90f711dba Mon Sep 17 00:00:00 2001 From: yan-soon Date: Sun, 5 May 2024 03:32:03 +0800 Subject: [PATCH 095/150] more tests --- oracle/service/runner/runner.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 7d7ff2f1c38..b223a61c687 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -64,7 +64,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State Validator: oracleInfo.PubKey.Address(), ValidatorIndex: validatorIndex, SignedTimestamp: time.Now().Unix(), - Votes: oracleInfo.UnsignedVoteBuffer.Buffer, + // Votes: oracleInfo.UnsignedVoteBuffer.Buffer, } oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() From 4484f3d0ada319f7fc3cd14c3e27ea1918a7b848 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Sun, 5 May 2024 15:22:20 +0800 Subject: [PATCH 096/150] test bug fix with votes in unsignedBuffer --- oracle/service/runner/runner.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index b223a61c687..d7d27444c9e 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -58,13 +58,14 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State // append new batch into unsignedVotesBuffer, need to mutex lock as it will clash with concurrent pruning oracleInfo.UnsignedVoteBuffer.UpdateMtx.Lock() oracleInfo.UnsignedVoteBuffer.Buffer = append(oracleInfo.UnsignedVoteBuffer.Buffer, votes...) + unsignedVotes := oracleInfo.UnsignedVoteBuffer.Buffer // batch sign the entire unsignedVoteBuffer and add to gossipBuffer newGossipVote := &oracleproto.GossipedVotes{ Validator: oracleInfo.PubKey.Address(), ValidatorIndex: validatorIndex, SignedTimestamp: time.Now().Unix(), - // Votes: oracleInfo.UnsignedVoteBuffer.Buffer, + Votes: unsignedVotes, } oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() @@ -120,16 +121,16 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() - buffer := oracleInfo.GossipVoteBuffer.Buffer + gossipBuffer := oracleInfo.GossipVoteBuffer.Buffer // prune gossip votes that have not been updated in the last x amt of blocks, where x is the maxGossipVoteAge - for valAddr, gossipVote := range oracleInfo.GossipVoteBuffer.Buffer { + for valAddr, gossipVote := range gossipBuffer { if gossipVote.SignedTimestamp < oracleInfo.BlockTimestamps[0] { log.Infof("DELETING STALE GOSSIP BUFFER (%v) FOR VAL: %s", gossipVote.SignedTimestamp, valAddr) - delete(buffer, valAddr) + delete(gossipBuffer, valAddr) } } - oracleInfo.GossipVoteBuffer.Buffer = buffer + oracleInfo.GossipVoteBuffer.Buffer = gossipBuffer oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() } }(oracleInfo) From 8abbfbda19b9b32fb1b2a899892eed2901fda83e Mon Sep 17 00:00:00 2001 From: yan-soon Date: Sun, 5 May 2024 17:36:19 +0800 Subject: [PATCH 097/150] test with validator field as bytes --- proto/tendermint/oracle/types.pb.go | 58 +++++++++++++++-------------- proto/tendermint/oracle/types.proto | 2 +- 2 files changed, 31 insertions(+), 29 deletions(-) diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index 43b0a7b7c49..602afc27a73 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -23,7 +23,7 @@ var _ = math.Inf const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type Vote struct { - Validator string `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` + Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` OracleId string `protobuf:"bytes,2,opt,name=oracle_id,json=oracleId,proto3" json:"oracle_id,omitempty"` Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` Data string `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` @@ -62,11 +62,11 @@ func (m *Vote) XXX_DiscardUnknown() { var xxx_messageInfo_Vote proto.InternalMessageInfo -func (m *Vote) GetValidator() string { +func (m *Vote) GetValidator() []byte { if m != nil { return m.Validator } - return "" + return nil } func (m *Vote) GetOracleId() string { @@ -243,28 +243,28 @@ func init() { func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 324 bytes of a gzipped FileDescriptorProto + // 323 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x92, 0xbf, 0x4e, 0xf3, 0x30, - 0x14, 0xc5, 0xeb, 0x2f, 0xe9, 0x27, 0x62, 0xfe, 0x14, 0x3c, 0x40, 0x24, 0x8a, 0x55, 0x75, 0xa1, + 0x14, 0xc5, 0xeb, 0x2f, 0xe9, 0x27, 0x62, 0xfe, 0x14, 0x3c, 0x40, 0x24, 0x4a, 0x14, 0x75, 0x21, 0x0c, 0x24, 0x12, 0xf0, 0x04, 0x30, 0xa0, 0x2e, 0x0c, 0x11, 0x62, 0x60, 0xa9, 0xdc, 0xd8, 0x14, 0x4b, 0x8d, 0x1d, 0xc5, 0xb7, 0x15, 0xbc, 0x05, 0xaf, 0xc3, 0x1b, 0x30, 0xa1, 0x8e, 0x8c, 0xa8, - 0x7d, 0x11, 0x64, 0x5b, 0x4a, 0x90, 0xf2, 0x04, 0x6c, 0xd7, 0xbf, 0x73, 0xaf, 0xcf, 0x3d, 0xd2, - 0xc5, 0x27, 0x20, 0x14, 0x17, 0x55, 0x21, 0x15, 0xa4, 0xba, 0x62, 0xf9, 0x5c, 0xa4, 0xf0, 0x5a, - 0x0a, 0x93, 0x94, 0x95, 0x06, 0x4d, 0x0e, 0x1a, 0x39, 0xf1, 0xf2, 0xd0, 0xe0, 0xf0, 0x41, 0x83, - 0x20, 0x7d, 0x1c, 0x2d, 0xd9, 0x5c, 0x72, 0x06, 0xba, 0x8a, 0xd1, 0x00, 0x8d, 0xa2, 0xac, 0x01, - 0xe4, 0x18, 0x47, 0xbe, 0x7f, 0x22, 0x79, 0xfc, 0xcf, 0xa9, 0x5b, 0x1e, 0x8c, 0xb9, 0x1d, 0x05, - 0x59, 0x08, 0x03, 0xac, 0x28, 0xe3, 0x60, 0x80, 0x46, 0x41, 0xd6, 0x00, 0x42, 0x70, 0xc8, 0x19, - 0xb0, 0x38, 0x74, 0x53, 0xae, 0x1e, 0x7e, 0x22, 0xbc, 0x7b, 0xab, 0x8d, 0x91, 0xa5, 0xe0, 0xd6, - 0xdd, 0xb4, 0xed, 0x77, 0x7e, 0xdb, 0x9f, 0xe2, 0x5e, 0xfd, 0x98, 0x48, 0xc5, 0xc5, 0x8b, 0x5b, - 0xa2, 0x9b, 0xed, 0xd5, 0x78, 0x6c, 0x29, 0x39, 0xc7, 0xdd, 0xa5, 0xfd, 0x2f, 0x0e, 0x06, 0xc1, - 0x68, 0xfb, 0xe2, 0x28, 0x69, 0x05, 0x4e, 0xac, 0x5f, 0xe6, 0xbb, 0xc8, 0x19, 0xde, 0x37, 0x72, - 0xa6, 0x04, 0x9f, 0x34, 0x01, 0x42, 0x17, 0xa0, 0xe7, 0xf9, 0x7d, 0x1d, 0xa3, 0x8f, 0x23, 0x8b, - 0x18, 0x2c, 0x2a, 0x11, 0x77, 0xfd, 0x82, 0x35, 0x18, 0xbe, 0x23, 0x7c, 0x78, 0xc3, 0x94, 0x56, - 0x32, 0x67, 0xf3, 0xbf, 0x95, 0xec, 0xfa, 0xee, 0x63, 0x4d, 0xd1, 0x6a, 0x4d, 0xd1, 0xf7, 0x9a, - 0xa2, 0xb7, 0x0d, 0xed, 0xac, 0x36, 0xb4, 0xf3, 0xb5, 0xa1, 0x9d, 0xc7, 0xab, 0x99, 0x84, 0xe7, - 0xc5, 0x34, 0xc9, 0x75, 0x91, 0xe6, 0xba, 0x10, 0x30, 0x7d, 0x82, 0xa6, 0x70, 0x27, 0x95, 0xb6, - 0x0e, 0x6e, 0xfa, 0xdf, 0x09, 0x97, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xf1, 0xb8, 0xf7, 0x83, - 0x8c, 0x02, 0x00, 0x00, + 0x79, 0x11, 0x64, 0x5b, 0x4a, 0x86, 0x0e, 0xcc, 0x6c, 0xd7, 0xbf, 0x73, 0xaf, 0xcf, 0x3d, 0xd2, + 0xc5, 0x27, 0xc0, 0x25, 0xe3, 0x75, 0x29, 0x24, 0x64, 0xaa, 0xa6, 0xc5, 0x9c, 0x67, 0xf0, 0x5a, + 0x71, 0x9d, 0x56, 0xb5, 0x02, 0x45, 0x0e, 0x3a, 0x39, 0x75, 0xf2, 0x48, 0x63, 0xff, 0x41, 0x01, + 0x27, 0x43, 0x1c, 0x2c, 0xe9, 0x5c, 0x30, 0x0a, 0xaa, 0x0e, 0x51, 0x8c, 0x92, 0x9d, 0xbc, 0x03, + 0xe4, 0x18, 0x07, 0xae, 0x7f, 0x22, 0x58, 0xf8, 0x2f, 0x46, 0x49, 0x90, 0x6f, 0x39, 0x30, 0x66, + 0x66, 0x14, 0x44, 0xc9, 0x35, 0xd0, 0xb2, 0x0a, 0xbd, 0x18, 0x25, 0x5e, 0xde, 0x01, 0x42, 0xb0, + 0xcf, 0x28, 0xd0, 0xd0, 0xb7, 0x53, 0xb6, 0x1e, 0x7d, 0x22, 0xbc, 0x7b, 0xab, 0xb4, 0x16, 0x15, + 0x67, 0xc6, 0x5d, 0xff, 0x62, 0x7f, 0x8a, 0x07, 0xed, 0x63, 0x22, 0x24, 0xe3, 0x2f, 0x76, 0x89, + 0x7e, 0xbe, 0xd7, 0xe2, 0xb1, 0xa1, 0xe4, 0x1c, 0xf7, 0x97, 0xe6, 0xbf, 0xd0, 0x8b, 0xbd, 0x64, + 0xfb, 0xe2, 0x28, 0xdd, 0x08, 0x9c, 0x1a, 0xbf, 0xdc, 0x75, 0x91, 0x33, 0xbc, 0xaf, 0xc5, 0x4c, + 0x72, 0x36, 0xe9, 0x02, 0xf8, 0x36, 0xc0, 0xc0, 0xf1, 0xfb, 0x36, 0xc6, 0x10, 0x07, 0x06, 0x51, + 0x58, 0xd4, 0x3c, 0xec, 0xbb, 0x05, 0x5b, 0x30, 0x7a, 0x47, 0xf8, 0xf0, 0x86, 0x4a, 0x25, 0x45, + 0x41, 0xe7, 0x7f, 0x2b, 0xd9, 0xf5, 0xdd, 0xc7, 0x3a, 0x42, 0xab, 0x75, 0x84, 0xbe, 0xd7, 0x11, + 0x7a, 0x6b, 0xa2, 0xde, 0xaa, 0x89, 0x7a, 0x5f, 0x4d, 0xd4, 0x7b, 0xbc, 0x9a, 0x09, 0x78, 0x5e, + 0x4c, 0xd3, 0x42, 0x95, 0x59, 0xa1, 0x4a, 0x0e, 0xd3, 0x27, 0xe8, 0x0a, 0x7b, 0x52, 0xd9, 0xc6, + 0xc1, 0x4d, 0xff, 0x5b, 0xe1, 0xf2, 0x27, 0x00, 0x00, 0xff, 0xff, 0x95, 0x4a, 0xf5, 0x82, 0x8c, + 0x02, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -559,7 +559,7 @@ func (m *Vote) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -569,23 +569,25 @@ func (m *Vote) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Validator = string(dAtA[iNdEx:postIndex]) + m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) + if m.Validator == nil { + m.Validator = []byte{} + } iNdEx = postIndex case 2: if wireType != 2 { diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index fc60f0e68b4..9f2bb75d288 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -4,7 +4,7 @@ package tendermint.oracle; option go_package = "github.com/cometbft/cometbft/proto/tendermint/oracle"; message Vote { - string validator = 1; + bytes validator = 1; string oracle_id = 2; int64 timestamp = 3; string data = 4; From c16062f22450c7838b201f703917f61ba145e42f Mon Sep 17 00:00:00 2001 From: yan-soon Date: Sun, 5 May 2024 17:58:42 +0800 Subject: [PATCH 098/150] test without sort --- oracle/service/runner/runner.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index d7d27444c9e..3c3438af0be 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -2,7 +2,7 @@ package runner import ( "context" - "sort" + // "sort" "time" log "github.com/sirupsen/logrus" @@ -71,7 +71,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() // sort the votes so that we can rebuild it in a deterministic order, when uncompressing - sort.Sort(ByVote(newGossipVote.Votes)) + // sort.Sort(ByVote(newGossipVote.Votes)) // signing of vote should append the signature field of gossipVote if err := oracleInfo.PrivValidator.SignOracleVote("", newGossipVote); err != nil { From 3b11cbfd0961bcc6d240e688c746e620c7de3737 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 6 May 2024 10:26:31 +0800 Subject: [PATCH 099/150] revert back to no validator field test --- oracle/reactor.go | 7 +- oracle/service/runner/runner.go | 1 - proto/tendermint/oracle/types.pb.go | 207 +++++++--------------------- proto/tendermint/oracle/types.proto | 18 ++- types/oracle.go | 1 - 5 files changed, 60 insertions(+), 174 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 538aa77b968..80a148e4b75 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -1,7 +1,6 @@ package oracle import ( - "encoding/hex" "fmt" "math" "time" @@ -134,7 +133,7 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { // verify sig of incoming gossip vote, throw if verification fails _, val := oracleR.ConsensusState.Validators.GetByIndex(msg.ValidatorIndex) if val == nil { - logrus.Infof("validator: %v not found in validator set, skipping gossip", hex.EncodeToString(msg.Validator)) + logrus.Infof("validator with index: %v not found in validator set, skipping gossip", msg.ValidatorIndex) return } pubKey := val.PubKey @@ -145,8 +144,8 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { } if success := pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature); !success { - logrus.Warnf("failed signature verification for validator: %v", hex.EncodeToString(msg.Validator)) - oracleR.Logger.Error("failed signature verification for validator: %v", hex.EncodeToString(msg.Validator)) + logrus.Warnf("failed signature verification for validator with index: %v", msg.ValidatorIndex) + oracleR.Logger.Error("failed signature verification for validator with index: %v", msg.ValidatorIndex) oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("oracle failed signature verification: %T", e.Message)) return } diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 3c3438af0be..f5b4453200c 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -62,7 +62,6 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State // batch sign the entire unsignedVoteBuffer and add to gossipBuffer newGossipVote := &oracleproto.GossipedVotes{ - Validator: oracleInfo.PubKey.Address(), ValidatorIndex: validatorIndex, SignedTimestamp: time.Now().Unix(), Votes: unsignedVotes, diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index 602afc27a73..725073f07f0 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -23,7 +23,7 @@ var _ = math.Inf const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type Vote struct { - Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` + Validator string `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` OracleId string `protobuf:"bytes,2,opt,name=oracle_id,json=oracleId,proto3" json:"oracle_id,omitempty"` Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` Data string `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` @@ -62,11 +62,11 @@ func (m *Vote) XXX_DiscardUnknown() { var xxx_messageInfo_Vote proto.InternalMessageInfo -func (m *Vote) GetValidator() []byte { +func (m *Vote) GetValidator() string { if m != nil { return m.Validator } - return nil + return "" } func (m *Vote) GetOracleId() string { @@ -91,11 +91,10 @@ func (m *Vote) GetData() string { } type GossipedVotes struct { - Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` - ValidatorIndex int32 `protobuf:"varint,2,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` - Votes []*Vote `protobuf:"bytes,3,rep,name=votes,proto3" json:"votes,omitempty"` - SignedTimestamp int64 `protobuf:"varint,4,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` - Signature []byte `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` + ValidatorIndex int32 `protobuf:"varint,1,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` + Votes []*Vote `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes,omitempty"` + SignedTimestamp int64 `protobuf:"varint,3,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` + Signature []byte `protobuf:"bytes,4,opt,name=signature,proto3" json:"signature,omitempty"` } func (m *GossipedVotes) Reset() { *m = GossipedVotes{} } @@ -131,13 +130,6 @@ func (m *GossipedVotes) XXX_DiscardUnknown() { var xxx_messageInfo_GossipedVotes proto.InternalMessageInfo -func (m *GossipedVotes) GetValidator() []byte { - if m != nil { - return m.Validator - } - return nil -} - func (m *GossipedVotes) GetValidatorIndex() int32 { if m != nil { return m.ValidatorIndex @@ -167,10 +159,9 @@ func (m *GossipedVotes) GetSignature() []byte { } type CanonicalGossipedVotes struct { - Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` - ValidatorIndex int32 `protobuf:"varint,2,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` - Votes []*Vote `protobuf:"bytes,3,rep,name=votes,proto3" json:"votes,omitempty"` - SignedTimestamp int64 `protobuf:"varint,4,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` + ValidatorIndex int32 `protobuf:"varint,1,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` + Votes []*Vote `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes,omitempty"` + SignedTimestamp int64 `protobuf:"varint,3,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` } func (m *CanonicalGossipedVotes) Reset() { *m = CanonicalGossipedVotes{} } @@ -206,13 +197,6 @@ func (m *CanonicalGossipedVotes) XXX_DiscardUnknown() { var xxx_messageInfo_CanonicalGossipedVotes proto.InternalMessageInfo -func (m *CanonicalGossipedVotes) GetValidator() []byte { - if m != nil { - return m.Validator - } - return nil -} - func (m *CanonicalGossipedVotes) GetValidatorIndex() int32 { if m != nil { return m.ValidatorIndex @@ -243,28 +227,27 @@ func init() { func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 323 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x92, 0xbf, 0x4e, 0xf3, 0x30, - 0x14, 0xc5, 0xeb, 0x2f, 0xe9, 0x27, 0x62, 0xfe, 0x14, 0x3c, 0x40, 0x24, 0x4a, 0x14, 0x75, 0x21, - 0x0c, 0x24, 0x12, 0xf0, 0x04, 0x30, 0xa0, 0x2e, 0x0c, 0x11, 0x62, 0x60, 0xa9, 0xdc, 0xd8, 0x14, - 0x4b, 0x8d, 0x1d, 0xc5, 0xb7, 0x15, 0xbc, 0x05, 0xaf, 0xc3, 0x1b, 0x30, 0xa1, 0x8e, 0x8c, 0xa8, - 0x79, 0x11, 0x64, 0x5b, 0x4a, 0x86, 0x0e, 0xcc, 0x6c, 0xd7, 0xbf, 0x73, 0xaf, 0xcf, 0x3d, 0xd2, - 0xc5, 0x27, 0xc0, 0x25, 0xe3, 0x75, 0x29, 0x24, 0x64, 0xaa, 0xa6, 0xc5, 0x9c, 0x67, 0xf0, 0x5a, - 0x71, 0x9d, 0x56, 0xb5, 0x02, 0x45, 0x0e, 0x3a, 0x39, 0x75, 0xf2, 0x48, 0x63, 0xff, 0x41, 0x01, - 0x27, 0x43, 0x1c, 0x2c, 0xe9, 0x5c, 0x30, 0x0a, 0xaa, 0x0e, 0x51, 0x8c, 0x92, 0x9d, 0xbc, 0x03, - 0xe4, 0x18, 0x07, 0xae, 0x7f, 0x22, 0x58, 0xf8, 0x2f, 0x46, 0x49, 0x90, 0x6f, 0x39, 0x30, 0x66, - 0x66, 0x14, 0x44, 0xc9, 0x35, 0xd0, 0xb2, 0x0a, 0xbd, 0x18, 0x25, 0x5e, 0xde, 0x01, 0x42, 0xb0, - 0xcf, 0x28, 0xd0, 0xd0, 0xb7, 0x53, 0xb6, 0x1e, 0x7d, 0x22, 0xbc, 0x7b, 0xab, 0xb4, 0x16, 0x15, - 0x67, 0xc6, 0x5d, 0xff, 0x62, 0x7f, 0x8a, 0x07, 0xed, 0x63, 0x22, 0x24, 0xe3, 0x2f, 0x76, 0x89, - 0x7e, 0xbe, 0xd7, 0xe2, 0xb1, 0xa1, 0xe4, 0x1c, 0xf7, 0x97, 0xe6, 0xbf, 0xd0, 0x8b, 0xbd, 0x64, - 0xfb, 0xe2, 0x28, 0xdd, 0x08, 0x9c, 0x1a, 0xbf, 0xdc, 0x75, 0x91, 0x33, 0xbc, 0xaf, 0xc5, 0x4c, - 0x72, 0x36, 0xe9, 0x02, 0xf8, 0x36, 0xc0, 0xc0, 0xf1, 0xfb, 0x36, 0xc6, 0x10, 0x07, 0x06, 0x51, - 0x58, 0xd4, 0x3c, 0xec, 0xbb, 0x05, 0x5b, 0x30, 0x7a, 0x47, 0xf8, 0xf0, 0x86, 0x4a, 0x25, 0x45, - 0x41, 0xe7, 0x7f, 0x2b, 0xd9, 0xf5, 0xdd, 0xc7, 0x3a, 0x42, 0xab, 0x75, 0x84, 0xbe, 0xd7, 0x11, - 0x7a, 0x6b, 0xa2, 0xde, 0xaa, 0x89, 0x7a, 0x5f, 0x4d, 0xd4, 0x7b, 0xbc, 0x9a, 0x09, 0x78, 0x5e, - 0x4c, 0xd3, 0x42, 0x95, 0x59, 0xa1, 0x4a, 0x0e, 0xd3, 0x27, 0xe8, 0x0a, 0x7b, 0x52, 0xd9, 0xc6, - 0xc1, 0x4d, 0xff, 0x5b, 0xe1, 0xf2, 0x27, 0x00, 0x00, 0xff, 0xff, 0x95, 0x4a, 0xf5, 0x82, 0x8c, - 0x02, 0x00, 0x00, + // 316 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x92, 0x3d, 0x4e, 0xc3, 0x30, + 0x14, 0xc7, 0xeb, 0x7e, 0x20, 0x62, 0x3e, 0x0a, 0x1e, 0x20, 0x12, 0xc5, 0xaa, 0xba, 0x50, 0x06, + 0x12, 0x09, 0x38, 0x01, 0x0c, 0xa8, 0x0b, 0x43, 0x84, 0x18, 0x58, 0x2a, 0x27, 0x36, 0xc5, 0x52, + 0x62, 0x47, 0xf1, 0x6b, 0x05, 0xb7, 0x60, 0xe7, 0x12, 0x1c, 0x83, 0xb1, 0x23, 0x23, 0x4a, 0x2e, + 0x82, 0xec, 0x48, 0x89, 0x44, 0x2f, 0xc0, 0xf6, 0xf4, 0xfb, 0xbf, 0xe7, 0xf7, 0xb3, 0xf4, 0xf0, + 0x29, 0x08, 0xc5, 0x45, 0x91, 0x49, 0x05, 0xa1, 0x2e, 0x58, 0x92, 0x8a, 0x10, 0xde, 0x72, 0x61, + 0x82, 0xbc, 0xd0, 0xa0, 0xc9, 0x61, 0x1b, 0x07, 0x75, 0x3c, 0x31, 0xb8, 0xff, 0xa8, 0x41, 0x90, + 0x11, 0xf6, 0x56, 0x2c, 0x95, 0x9c, 0x81, 0x2e, 0x7c, 0x34, 0x46, 0x53, 0x2f, 0x6a, 0x01, 0x39, + 0xc1, 0x5e, 0xdd, 0x3f, 0x97, 0xdc, 0xef, 0xba, 0x74, 0xbb, 0x06, 0x33, 0x6e, 0x47, 0x41, 0x66, + 0xc2, 0x00, 0xcb, 0x72, 0xbf, 0x37, 0x46, 0xd3, 0x5e, 0xd4, 0x02, 0x42, 0x70, 0x9f, 0x33, 0x60, + 0x7e, 0xdf, 0x4d, 0xb9, 0x7a, 0xf2, 0x89, 0xf0, 0xde, 0x9d, 0x36, 0x46, 0xe6, 0x82, 0xdb, 0xed, + 0x86, 0x9c, 0xe1, 0x61, 0xb3, 0x6d, 0x2e, 0x15, 0x17, 0xaf, 0x4e, 0x62, 0x10, 0xed, 0x37, 0x78, + 0x66, 0x29, 0xb9, 0xc0, 0x83, 0x95, 0x9d, 0xf0, 0xbb, 0xe3, 0xde, 0x74, 0xe7, 0xf2, 0x38, 0xd8, + 0xf8, 0x52, 0x60, 0x5f, 0x8c, 0xea, 0x2e, 0x72, 0x8e, 0x0f, 0x8c, 0x5c, 0x28, 0xc1, 0xe7, 0x7f, + 0x15, 0x87, 0x35, 0x7f, 0x68, 0x44, 0x47, 0xd8, 0xb3, 0x88, 0xc1, 0xb2, 0x10, 0xce, 0x76, 0x37, + 0x6a, 0xc1, 0xe4, 0x03, 0xe1, 0xa3, 0x5b, 0xa6, 0xb4, 0x92, 0x09, 0x4b, 0xff, 0x9b, 0xfb, 0xcd, + 0xfd, 0x57, 0x49, 0xd1, 0xba, 0xa4, 0xe8, 0xa7, 0xa4, 0xe8, 0xbd, 0xa2, 0x9d, 0x75, 0x45, 0x3b, + 0xdf, 0x15, 0xed, 0x3c, 0x5d, 0x2f, 0x24, 0xbc, 0x2c, 0xe3, 0x20, 0xd1, 0x59, 0x98, 0xe8, 0x4c, + 0x40, 0xfc, 0x0c, 0x6d, 0xe1, 0xce, 0x22, 0xdc, 0x38, 0x9a, 0x78, 0xcb, 0x05, 0x57, 0xbf, 0x01, + 0x00, 0x00, 0xff, 0xff, 0x64, 0xa4, 0x9b, 0xfc, 0x50, 0x02, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -341,12 +324,12 @@ func (m *GossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.Signature) i = encodeVarintTypes(dAtA, i, uint64(len(m.Signature))) i-- - dAtA[i] = 0x2a + dAtA[i] = 0x22 } if m.SignedTimestamp != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.SignedTimestamp)) i-- - dAtA[i] = 0x20 + dAtA[i] = 0x18 } if len(m.Votes) > 0 { for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { @@ -359,20 +342,13 @@ func (m *GossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a + dAtA[i] = 0x12 } } if m.ValidatorIndex != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.ValidatorIndex)) i-- - dAtA[i] = 0x10 - } - if len(m.Validator) > 0 { - i -= len(m.Validator) - copy(dAtA[i:], m.Validator) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Validator))) - i-- - dAtA[i] = 0xa + dAtA[i] = 0x8 } return len(dAtA) - i, nil } @@ -400,7 +376,7 @@ func (m *CanonicalGossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) if m.SignedTimestamp != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.SignedTimestamp)) i-- - dAtA[i] = 0x20 + dAtA[i] = 0x18 } if len(m.Votes) > 0 { for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { @@ -413,20 +389,13 @@ func (m *CanonicalGossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a + dAtA[i] = 0x12 } } if m.ValidatorIndex != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.ValidatorIndex)) i-- - dAtA[i] = 0x10 - } - if len(m.Validator) > 0 { - i -= len(m.Validator) - copy(dAtA[i:], m.Validator) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Validator))) - i-- - dAtA[i] = 0xa + dAtA[i] = 0x8 } return len(dAtA) - i, nil } @@ -472,10 +441,6 @@ func (m *GossipedVotes) Size() (n int) { } var l int _ = l - l = len(m.Validator) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } if m.ValidatorIndex != 0 { n += 1 + sovTypes(uint64(m.ValidatorIndex)) } @@ -501,10 +466,6 @@ func (m *CanonicalGossipedVotes) Size() (n int) { } var l int _ = l - l = len(m.Validator) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } if m.ValidatorIndex != 0 { n += 1 + sovTypes(uint64(m.ValidatorIndex)) } @@ -559,7 +520,7 @@ func (m *Vote) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) } - var byteLen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -569,25 +530,23 @@ func (m *Vote) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + byteLen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) - if m.Validator == nil { - m.Validator = []byte{} - } + m.Validator = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { @@ -723,40 +682,6 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) - if m.Validator == nil { - m.Validator = []byte{} - } - iNdEx = postIndex - case 2: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field ValidatorIndex", wireType) } @@ -775,7 +700,7 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { break } } - case 3: + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) } @@ -809,7 +734,7 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 4: + case 3: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field SignedTimestamp", wireType) } @@ -828,7 +753,7 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { break } } - case 5: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) } @@ -913,40 +838,6 @@ func (m *CanonicalGossipedVotes) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) - if m.Validator == nil { - m.Validator = []byte{} - } - iNdEx = postIndex - case 2: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field ValidatorIndex", wireType) } @@ -965,7 +856,7 @@ func (m *CanonicalGossipedVotes) Unmarshal(dAtA []byte) error { break } } - case 3: + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) } @@ -999,7 +890,7 @@ func (m *CanonicalGossipedVotes) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 4: + case 3: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field SignedTimestamp", wireType) } diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index 9f2bb75d288..fc1986cda46 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -4,23 +4,21 @@ package tendermint.oracle; option go_package = "github.com/cometbft/cometbft/proto/tendermint/oracle"; message Vote { - bytes validator = 1; + string validator = 1; string oracle_id = 2; int64 timestamp = 3; string data = 4; } message GossipedVotes { - bytes validator = 1; - int32 validator_index = 2; - repeated Vote votes = 3; - int64 signed_timestamp = 4; - bytes signature = 5; + int32 validator_index = 1; + repeated Vote votes = 2; + int64 signed_timestamp = 3; + bytes signature = 4; } message CanonicalGossipedVotes { - bytes validator = 1; - int32 validator_index = 2; - repeated Vote votes = 3; - int64 signed_timestamp = 4; + int32 validator_index = 1; + repeated Vote votes = 2; + int64 signed_timestamp = 3; } diff --git a/types/oracle.go b/types/oracle.go index bbf3de08b45..fca713cf2ae 100644 --- a/types/oracle.go +++ b/types/oracle.go @@ -17,7 +17,6 @@ func OracleVoteSignBytes(vote *oracleproto.GossipedVotes) []byte { func CanonicalizeOracleVote(vote *oracleproto.GossipedVotes) oracleproto.CanonicalGossipedVotes { return oracleproto.CanonicalGossipedVotes{ - Validator: vote.Validator, ValidatorIndex: vote.ValidatorIndex, Votes: vote.Votes, SignedTimestamp: vote.SignedTimestamp, From 455b2520953951ab5a8fa77268a6726402853410 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 6 May 2024 11:07:52 +0800 Subject: [PATCH 100/150] test with sort again --- oracle/reactor.go | 2 +- oracle/service/runner/runner.go | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 80a148e4b75..17767ec945c 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -50,7 +50,7 @@ func NewReactor(config *config.OracleConfig, pubKey crypto.PubKey, privValidator Buffer: make(map[string]*oracleproto.GossipedVotes), } unsignedVoteBuffer := &oracletypes.UnsignedVoteBuffer{ - Buffer: []*oracleproto.Vote{}, + Buffer: make([]*oracleproto.Vote, 0), } oracleInfo := &oracletypes.OracleInfo{ diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index f5b4453200c..92b3e521cdd 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -2,6 +2,7 @@ package runner import ( "context" + "sort" // "sort" "time" @@ -70,7 +71,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() // sort the votes so that we can rebuild it in a deterministic order, when uncompressing - // sort.Sort(ByVote(newGossipVote.Votes)) + sort.Sort(ByVote(newGossipVote.Votes)) // signing of vote should append the signature field of gossipVote if err := oracleInfo.PrivValidator.SignOracleVote("", newGossipVote); err != nil { From 7894d8c01e4822fdc8ceedd65dda9029346a1c98 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 6 May 2024 13:59:41 +0800 Subject: [PATCH 101/150] test sort fix --- oracle/reactor.go | 2 +- oracle/service/runner/runner.go | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 17767ec945c..80a148e4b75 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -50,7 +50,7 @@ func NewReactor(config *config.OracleConfig, pubKey crypto.PubKey, privValidator Buffer: make(map[string]*oracleproto.GossipedVotes), } unsignedVoteBuffer := &oracletypes.UnsignedVoteBuffer{ - Buffer: make([]*oracleproto.Vote, 0), + Buffer: []*oracleproto.Vote{}, } oracleInfo := &oracletypes.OracleInfo{ diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 92b3e521cdd..e6faf1b025a 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -3,6 +3,7 @@ package runner import ( "context" "sort" + // "sort" "time" @@ -61,6 +62,9 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State oracleInfo.UnsignedVoteBuffer.Buffer = append(oracleInfo.UnsignedVoteBuffer.Buffer, votes...) unsignedVotes := oracleInfo.UnsignedVoteBuffer.Buffer + // sort the votes so that we can rebuild it in a deterministic order, when uncompressing + sort.Sort(ByVote(unsignedVotes)) + // batch sign the entire unsignedVoteBuffer and add to gossipBuffer newGossipVote := &oracleproto.GossipedVotes{ ValidatorIndex: validatorIndex, @@ -70,9 +74,6 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() - // sort the votes so that we can rebuild it in a deterministic order, when uncompressing - sort.Sort(ByVote(newGossipVote.Votes)) - // signing of vote should append the signature field of gossipVote if err := oracleInfo.PrivValidator.SignOracleVote("", newGossipVote); err != nil { log.Errorf("processSignVoteQueue: error signing oracle votes") From ee9dd54f15f5c6a0d090739c12065930dd2dcb7c Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 6 May 2024 15:24:09 +0800 Subject: [PATCH 102/150] add back validator field for gossipedVotes struct --- oracle/service/runner/runner.go | 1 + proto/tendermint/oracle/types.pb.go | 187 ++++++++++++++++++++++------ proto/tendermint/oracle/types.proto | 16 +-- types/oracle.go | 1 + 4 files changed, 158 insertions(+), 47 deletions(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index e6faf1b025a..ed9a29dc1b7 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -67,6 +67,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State // batch sign the entire unsignedVoteBuffer and add to gossipBuffer newGossipVote := &oracleproto.GossipedVotes{ + Validator: oracleInfo.PubKey.Address(), ValidatorIndex: validatorIndex, SignedTimestamp: time.Now().Unix(), Votes: unsignedVotes, diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index 725073f07f0..43b0a7b7c49 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -91,10 +91,11 @@ func (m *Vote) GetData() string { } type GossipedVotes struct { - ValidatorIndex int32 `protobuf:"varint,1,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` - Votes []*Vote `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes,omitempty"` - SignedTimestamp int64 `protobuf:"varint,3,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` - Signature []byte `protobuf:"bytes,4,opt,name=signature,proto3" json:"signature,omitempty"` + Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` + ValidatorIndex int32 `protobuf:"varint,2,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` + Votes []*Vote `protobuf:"bytes,3,rep,name=votes,proto3" json:"votes,omitempty"` + SignedTimestamp int64 `protobuf:"varint,4,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` + Signature []byte `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` } func (m *GossipedVotes) Reset() { *m = GossipedVotes{} } @@ -130,6 +131,13 @@ func (m *GossipedVotes) XXX_DiscardUnknown() { var xxx_messageInfo_GossipedVotes proto.InternalMessageInfo +func (m *GossipedVotes) GetValidator() []byte { + if m != nil { + return m.Validator + } + return nil +} + func (m *GossipedVotes) GetValidatorIndex() int32 { if m != nil { return m.ValidatorIndex @@ -159,9 +167,10 @@ func (m *GossipedVotes) GetSignature() []byte { } type CanonicalGossipedVotes struct { - ValidatorIndex int32 `protobuf:"varint,1,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` - Votes []*Vote `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes,omitempty"` - SignedTimestamp int64 `protobuf:"varint,3,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` + Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` + ValidatorIndex int32 `protobuf:"varint,2,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` + Votes []*Vote `protobuf:"bytes,3,rep,name=votes,proto3" json:"votes,omitempty"` + SignedTimestamp int64 `protobuf:"varint,4,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` } func (m *CanonicalGossipedVotes) Reset() { *m = CanonicalGossipedVotes{} } @@ -197,6 +206,13 @@ func (m *CanonicalGossipedVotes) XXX_DiscardUnknown() { var xxx_messageInfo_CanonicalGossipedVotes proto.InternalMessageInfo +func (m *CanonicalGossipedVotes) GetValidator() []byte { + if m != nil { + return m.Validator + } + return nil +} + func (m *CanonicalGossipedVotes) GetValidatorIndex() int32 { if m != nil { return m.ValidatorIndex @@ -227,27 +243,28 @@ func init() { func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 316 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x92, 0x3d, 0x4e, 0xc3, 0x30, - 0x14, 0xc7, 0xeb, 0x7e, 0x20, 0x62, 0x3e, 0x0a, 0x1e, 0x20, 0x12, 0xc5, 0xaa, 0xba, 0x50, 0x06, - 0x12, 0x09, 0x38, 0x01, 0x0c, 0xa8, 0x0b, 0x43, 0x84, 0x18, 0x58, 0x2a, 0x27, 0x36, 0xc5, 0x52, - 0x62, 0x47, 0xf1, 0x6b, 0x05, 0xb7, 0x60, 0xe7, 0x12, 0x1c, 0x83, 0xb1, 0x23, 0x23, 0x4a, 0x2e, - 0x82, 0xec, 0x48, 0x89, 0x44, 0x2f, 0xc0, 0xf6, 0xf4, 0xfb, 0xbf, 0xe7, 0xf7, 0xb3, 0xf4, 0xf0, - 0x29, 0x08, 0xc5, 0x45, 0x91, 0x49, 0x05, 0xa1, 0x2e, 0x58, 0x92, 0x8a, 0x10, 0xde, 0x72, 0x61, - 0x82, 0xbc, 0xd0, 0xa0, 0xc9, 0x61, 0x1b, 0x07, 0x75, 0x3c, 0x31, 0xb8, 0xff, 0xa8, 0x41, 0x90, - 0x11, 0xf6, 0x56, 0x2c, 0x95, 0x9c, 0x81, 0x2e, 0x7c, 0x34, 0x46, 0x53, 0x2f, 0x6a, 0x01, 0x39, - 0xc1, 0x5e, 0xdd, 0x3f, 0x97, 0xdc, 0xef, 0xba, 0x74, 0xbb, 0x06, 0x33, 0x6e, 0x47, 0x41, 0x66, - 0xc2, 0x00, 0xcb, 0x72, 0xbf, 0x37, 0x46, 0xd3, 0x5e, 0xd4, 0x02, 0x42, 0x70, 0x9f, 0x33, 0x60, - 0x7e, 0xdf, 0x4d, 0xb9, 0x7a, 0xf2, 0x89, 0xf0, 0xde, 0x9d, 0x36, 0x46, 0xe6, 0x82, 0xdb, 0xed, - 0x86, 0x9c, 0xe1, 0x61, 0xb3, 0x6d, 0x2e, 0x15, 0x17, 0xaf, 0x4e, 0x62, 0x10, 0xed, 0x37, 0x78, - 0x66, 0x29, 0xb9, 0xc0, 0x83, 0x95, 0x9d, 0xf0, 0xbb, 0xe3, 0xde, 0x74, 0xe7, 0xf2, 0x38, 0xd8, - 0xf8, 0x52, 0x60, 0x5f, 0x8c, 0xea, 0x2e, 0x72, 0x8e, 0x0f, 0x8c, 0x5c, 0x28, 0xc1, 0xe7, 0x7f, - 0x15, 0x87, 0x35, 0x7f, 0x68, 0x44, 0x47, 0xd8, 0xb3, 0x88, 0xc1, 0xb2, 0x10, 0xce, 0x76, 0x37, - 0x6a, 0xc1, 0xe4, 0x03, 0xe1, 0xa3, 0x5b, 0xa6, 0xb4, 0x92, 0x09, 0x4b, 0xff, 0x9b, 0xfb, 0xcd, - 0xfd, 0x57, 0x49, 0xd1, 0xba, 0xa4, 0xe8, 0xa7, 0xa4, 0xe8, 0xbd, 0xa2, 0x9d, 0x75, 0x45, 0x3b, - 0xdf, 0x15, 0xed, 0x3c, 0x5d, 0x2f, 0x24, 0xbc, 0x2c, 0xe3, 0x20, 0xd1, 0x59, 0x98, 0xe8, 0x4c, - 0x40, 0xfc, 0x0c, 0x6d, 0xe1, 0xce, 0x22, 0xdc, 0x38, 0x9a, 0x78, 0xcb, 0x05, 0x57, 0xbf, 0x01, - 0x00, 0x00, 0xff, 0xff, 0x64, 0xa4, 0x9b, 0xfc, 0x50, 0x02, 0x00, 0x00, + // 324 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x92, 0xbf, 0x4e, 0xf3, 0x30, + 0x14, 0xc5, 0xeb, 0x2f, 0xe9, 0x27, 0x62, 0xfe, 0x14, 0x3c, 0x40, 0x24, 0x8a, 0x55, 0x75, 0xa1, + 0x0c, 0x24, 0x12, 0xf0, 0x04, 0x30, 0xa0, 0x2e, 0x0c, 0x11, 0x62, 0x60, 0xa9, 0xdc, 0xd8, 0x14, + 0x4b, 0x8d, 0x1d, 0xc5, 0xb7, 0x15, 0xbc, 0x05, 0xaf, 0xc3, 0x1b, 0x30, 0xa1, 0x8e, 0x8c, 0xa8, + 0x7d, 0x11, 0x64, 0x5b, 0x4a, 0x90, 0xf2, 0x04, 0x6c, 0xd7, 0xbf, 0x73, 0xaf, 0xcf, 0x3d, 0xd2, + 0xc5, 0x27, 0x20, 0x14, 0x17, 0x55, 0x21, 0x15, 0xa4, 0xba, 0x62, 0xf9, 0x5c, 0xa4, 0xf0, 0x5a, + 0x0a, 0x93, 0x94, 0x95, 0x06, 0x4d, 0x0e, 0x1a, 0x39, 0xf1, 0xf2, 0xd0, 0xe0, 0xf0, 0x41, 0x83, + 0x20, 0x7d, 0x1c, 0x2d, 0xd9, 0x5c, 0x72, 0x06, 0xba, 0x8a, 0xd1, 0x00, 0x8d, 0xa2, 0xac, 0x01, + 0xe4, 0x18, 0x47, 0xbe, 0x7f, 0x22, 0x79, 0xfc, 0xcf, 0xa9, 0x5b, 0x1e, 0x8c, 0xb9, 0x1d, 0x05, + 0x59, 0x08, 0x03, 0xac, 0x28, 0xe3, 0x60, 0x80, 0x46, 0x41, 0xd6, 0x00, 0x42, 0x70, 0xc8, 0x19, + 0xb0, 0x38, 0x74, 0x53, 0xae, 0x1e, 0x7e, 0x22, 0xbc, 0x7b, 0xab, 0x8d, 0x91, 0xa5, 0xe0, 0xd6, + 0xdd, 0xb4, 0xed, 0x77, 0x7e, 0xdb, 0x9f, 0xe2, 0x5e, 0xfd, 0x98, 0x48, 0xc5, 0xc5, 0x8b, 0x5b, + 0xa2, 0x9b, 0xed, 0xd5, 0x78, 0x6c, 0x29, 0x39, 0xc7, 0xdd, 0xa5, 0xfd, 0x2f, 0x0e, 0x06, 0xc1, + 0x68, 0xfb, 0xe2, 0x28, 0x69, 0x05, 0x4e, 0xac, 0x5f, 0xe6, 0xbb, 0xc8, 0x19, 0xde, 0x37, 0x72, + 0xa6, 0x04, 0x9f, 0x34, 0x01, 0x42, 0x17, 0xa0, 0xe7, 0xf9, 0x7d, 0x1d, 0xa3, 0x8f, 0x23, 0x8b, + 0x18, 0x2c, 0x2a, 0x11, 0x77, 0xfd, 0x82, 0x35, 0x18, 0xbe, 0x23, 0x7c, 0x78, 0xc3, 0x94, 0x56, + 0x32, 0x67, 0xf3, 0xbf, 0x95, 0xec, 0xfa, 0xee, 0x63, 0x4d, 0xd1, 0x6a, 0x4d, 0xd1, 0xf7, 0x9a, + 0xa2, 0xb7, 0x0d, 0xed, 0xac, 0x36, 0xb4, 0xf3, 0xb5, 0xa1, 0x9d, 0xc7, 0xab, 0x99, 0x84, 0xe7, + 0xc5, 0x34, 0xc9, 0x75, 0x91, 0xe6, 0xba, 0x10, 0x30, 0x7d, 0x82, 0xa6, 0x70, 0x27, 0x95, 0xb6, + 0x0e, 0x6e, 0xfa, 0xdf, 0x09, 0x97, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xf1, 0xb8, 0xf7, 0x83, + 0x8c, 0x02, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -324,12 +341,12 @@ func (m *GossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.Signature) i = encodeVarintTypes(dAtA, i, uint64(len(m.Signature))) i-- - dAtA[i] = 0x22 + dAtA[i] = 0x2a } if m.SignedTimestamp != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.SignedTimestamp)) i-- - dAtA[i] = 0x18 + dAtA[i] = 0x20 } if len(m.Votes) > 0 { for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { @@ -342,13 +359,20 @@ func (m *GossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x12 + dAtA[i] = 0x1a } } if m.ValidatorIndex != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.ValidatorIndex)) i-- - dAtA[i] = 0x8 + dAtA[i] = 0x10 + } + if len(m.Validator) > 0 { + i -= len(m.Validator) + copy(dAtA[i:], m.Validator) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Validator))) + i-- + dAtA[i] = 0xa } return len(dAtA) - i, nil } @@ -376,7 +400,7 @@ func (m *CanonicalGossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) if m.SignedTimestamp != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.SignedTimestamp)) i-- - dAtA[i] = 0x18 + dAtA[i] = 0x20 } if len(m.Votes) > 0 { for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { @@ -389,13 +413,20 @@ func (m *CanonicalGossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x12 + dAtA[i] = 0x1a } } if m.ValidatorIndex != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.ValidatorIndex)) i-- - dAtA[i] = 0x8 + dAtA[i] = 0x10 + } + if len(m.Validator) > 0 { + i -= len(m.Validator) + copy(dAtA[i:], m.Validator) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Validator))) + i-- + dAtA[i] = 0xa } return len(dAtA) - i, nil } @@ -441,6 +472,10 @@ func (m *GossipedVotes) Size() (n int) { } var l int _ = l + l = len(m.Validator) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } if m.ValidatorIndex != 0 { n += 1 + sovTypes(uint64(m.ValidatorIndex)) } @@ -466,6 +501,10 @@ func (m *CanonicalGossipedVotes) Size() (n int) { } var l int _ = l + l = len(m.Validator) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } if m.ValidatorIndex != 0 { n += 1 + sovTypes(uint64(m.ValidatorIndex)) } @@ -682,6 +721,40 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) + if m.Validator == nil { + m.Validator = []byte{} + } + iNdEx = postIndex + case 2: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field ValidatorIndex", wireType) } @@ -700,7 +773,7 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { break } } - case 2: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) } @@ -734,7 +807,7 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 3: + case 4: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field SignedTimestamp", wireType) } @@ -753,7 +826,7 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { break } } - case 4: + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) } @@ -838,6 +911,40 @@ func (m *CanonicalGossipedVotes) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) + if m.Validator == nil { + m.Validator = []byte{} + } + iNdEx = postIndex + case 2: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field ValidatorIndex", wireType) } @@ -856,7 +963,7 @@ func (m *CanonicalGossipedVotes) Unmarshal(dAtA []byte) error { break } } - case 2: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) } @@ -890,7 +997,7 @@ func (m *CanonicalGossipedVotes) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 3: + case 4: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field SignedTimestamp", wireType) } diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index fc1986cda46..fc60f0e68b4 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -11,14 +11,16 @@ message Vote { } message GossipedVotes { - int32 validator_index = 1; - repeated Vote votes = 2; - int64 signed_timestamp = 3; - bytes signature = 4; + bytes validator = 1; + int32 validator_index = 2; + repeated Vote votes = 3; + int64 signed_timestamp = 4; + bytes signature = 5; } message CanonicalGossipedVotes { - int32 validator_index = 1; - repeated Vote votes = 2; - int64 signed_timestamp = 3; + bytes validator = 1; + int32 validator_index = 2; + repeated Vote votes = 3; + int64 signed_timestamp = 4; } diff --git a/types/oracle.go b/types/oracle.go index fca713cf2ae..bbf3de08b45 100644 --- a/types/oracle.go +++ b/types/oracle.go @@ -17,6 +17,7 @@ func OracleVoteSignBytes(vote *oracleproto.GossipedVotes) []byte { func CanonicalizeOracleVote(vote *oracleproto.GossipedVotes) oracleproto.CanonicalGossipedVotes { return oracleproto.CanonicalGossipedVotes{ + Validator: vote.Validator, ValidatorIndex: vote.ValidatorIndex, Votes: vote.Votes, SignedTimestamp: vote.SignedTimestamp, From 884ee67cb6016fb05a12396e5c72fee41d5ad218 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 6 May 2024 16:18:14 +0800 Subject: [PATCH 103/150] test no sort, with validator field --- oracle/service/runner/runner.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index ed9a29dc1b7..623e86cdad0 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -2,9 +2,7 @@ package runner import ( "context" - "sort" - // "sort" "time" log "github.com/sirupsen/logrus" @@ -63,7 +61,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State unsignedVotes := oracleInfo.UnsignedVoteBuffer.Buffer // sort the votes so that we can rebuild it in a deterministic order, when uncompressing - sort.Sort(ByVote(unsignedVotes)) + // sort.Sort(ByVote(unsignedVotes)) // batch sign the entire unsignedVoteBuffer and add to gossipBuffer newGossipVote := &oracleproto.GossipedVotes{ From 9d8eb96106466f68af52816084fd0d94b34aa26e Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 6 May 2024 17:48:56 +0800 Subject: [PATCH 104/150] shift oracle validation logic --- oracle/service/runner/runner.go | 3 ++- state/execution.go | 20 -------------------- 2 files changed, 2 insertions(+), 21 deletions(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 623e86cdad0..d0dd4d703db 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -2,6 +2,7 @@ package runner import ( "context" + "sort" "time" @@ -61,7 +62,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State unsignedVotes := oracleInfo.UnsignedVoteBuffer.Buffer // sort the votes so that we can rebuild it in a deterministic order, when uncompressing - // sort.Sort(ByVote(unsignedVotes)) + sort.Sort(ByVote(unsignedVotes)) // batch sign the entire unsignedVoteBuffer and add to gossipBuffer newGossipVote := &oracleproto.GossipedVotes{ diff --git a/state/execution.go b/state/execution.go index 4f9a9b83329..b92f5b8290e 100644 --- a/state/execution.go +++ b/state/execution.go @@ -14,7 +14,6 @@ import ( cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/cometbft/cometbft/proxy" "github.com/cometbft/cometbft/types" - "github.com/sirupsen/logrus" oracletypes "github.com/cometbft/cometbft/oracle/service/types" oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" @@ -205,25 +204,6 @@ func (blockExec *BlockExecutor) ProcessProposal( block *types.Block, state State, ) (bool, error) { - txs := block.Data.Txs.ToSliceOfBytes() - if len(txs) > 0 { - res, err := blockExec.proxyApp.ValidateOracleVotes(context.Background(), &abci.RequestValidateOracleVotes{OracleTx: txs[0]}) - - if err != nil && res.Status == abci.ResponseValidateOracleVotes_absent { - // oracleTx is not present, continue normal processProposal flow - blockExec.logger.Error("error validating oracle votes:", "err", err) - } else if err != nil && res.Status == abci.ResponseValidateOracleVotes_present { - // oracleTx is present but it is invalid, remove from txs - blockExec.logger.Error("error validating oracle votes:", "err", err) - block.Data.Txs = types.ToTxs(txs[1:]) - } else if err == nil { - // oracleTx is present and valid, update txBz as some of the gossipVotes might have been removed due to invalid sig - logrus.Infof("processProposal: success in validating oracle votes") - txs[0] = res.EncodedOracleTx - block.Data.Txs = types.ToTxs(txs) - } - } - resp, err := blockExec.proxyApp.ProcessProposal(context.TODO(), &abci.RequestProcessProposal{ Hash: block.Header.Hash(), Height: block.Header.Height, From 2d973d75f9676d19004cde25a60704a3036def10 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 6 May 2024 18:35:44 +0800 Subject: [PATCH 105/150] test with updated sort --- oracle/service/runner/runner.go | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index d0dd4d703db..f4358b10f06 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -61,9 +61,13 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State oracleInfo.UnsignedVoteBuffer.Buffer = append(oracleInfo.UnsignedVoteBuffer.Buffer, votes...) unsignedVotes := oracleInfo.UnsignedVoteBuffer.Buffer + log.Infof("VOTES PRE SORT: %v, %v", len(unsignedVotes), unsignedVotes) + // sort the votes so that we can rebuild it in a deterministic order, when uncompressing sort.Sort(ByVote(unsignedVotes)) + log.Infof("VOTES POST SORT: %v, %v", len(unsignedVotes), unsignedVotes) + // batch sign the entire unsignedVoteBuffer and add to gossipBuffer newGossipVote := &oracleproto.GossipedVotes{ Validator: oracleInfo.PubKey.Address(), @@ -174,11 +178,5 @@ func (b ByVote) Swap(i, j int) { b[i], b[j] = b[j], b[i] } // Define custom sorting rules func (b ByVote) Less(i, j int) bool { - if b[i].OracleId != b[j].OracleId { - return b[i].OracleId < b[j].OracleId - } - if b[i].Timestamp != b[j].Timestamp { - return b[i].Timestamp < b[j].Timestamp - } - return b[i].Data < b[j].Data + return b[i].Timestamp < b[j].Timestamp } From 117174e665eb36cf14f3eaba6605798108ea5dc2 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 7 May 2024 02:12:45 +0800 Subject: [PATCH 106/150] update sort func to be stricter --- oracle/service/runner/runner.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index f4358b10f06..d0dd4d703db 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -61,13 +61,9 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State oracleInfo.UnsignedVoteBuffer.Buffer = append(oracleInfo.UnsignedVoteBuffer.Buffer, votes...) unsignedVotes := oracleInfo.UnsignedVoteBuffer.Buffer - log.Infof("VOTES PRE SORT: %v, %v", len(unsignedVotes), unsignedVotes) - // sort the votes so that we can rebuild it in a deterministic order, when uncompressing sort.Sort(ByVote(unsignedVotes)) - log.Infof("VOTES POST SORT: %v, %v", len(unsignedVotes), unsignedVotes) - // batch sign the entire unsignedVoteBuffer and add to gossipBuffer newGossipVote := &oracleproto.GossipedVotes{ Validator: oracleInfo.PubKey.Address(), @@ -178,5 +174,11 @@ func (b ByVote) Swap(i, j int) { b[i], b[j] = b[j], b[i] } // Define custom sorting rules func (b ByVote) Less(i, j int) bool { - return b[i].Timestamp < b[j].Timestamp + if b[i].OracleId != b[j].OracleId { + return b[i].OracleId < b[j].OracleId + } + if b[i].Timestamp != b[j].Timestamp { + return b[i].Timestamp < b[j].Timestamp + } + return b[i].Data < b[j].Data } From a3f55e82911554b485bd2eaeba55e83e17fa392b Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 7 May 2024 12:24:06 +0800 Subject: [PATCH 107/150] test with stable sort --- oracle/service/runner/runner.go | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index d0dd4d703db..66b5e743a4b 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -62,7 +62,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State unsignedVotes := oracleInfo.UnsignedVoteBuffer.Buffer // sort the votes so that we can rebuild it in a deterministic order, when uncompressing - sort.Sort(ByVote(unsignedVotes)) + SortOracleVotes(unsignedVotes) // batch sign the entire unsignedVoteBuffer and add to gossipBuffer newGossipVote := &oracleproto.GossipedVotes{ @@ -164,21 +164,15 @@ func Run(oracleInfo *types.OracleInfo, consensusState *cs.State) { } } -type ByVote []*oracleproto.Vote - -func (b ByVote) Len() int { - return len(b) -} - -func (b ByVote) Swap(i, j int) { b[i], b[j] = b[j], b[i] } - -// Define custom sorting rules -func (b ByVote) Less(i, j int) bool { - if b[i].OracleId != b[j].OracleId { - return b[i].OracleId < b[j].OracleId - } - if b[i].Timestamp != b[j].Timestamp { - return b[i].Timestamp < b[j].Timestamp - } - return b[i].Data < b[j].Data +func SortOracleVotes(votes []*oracleproto.Vote) { + sort.SliceStable(votes, + func(i, j int) bool { + if votes[i].OracleId != votes[j].OracleId { + return votes[i].OracleId < votes[j].OracleId + } + if votes[i].Timestamp != votes[j].Timestamp { + return votes[i].Timestamp < votes[j].Timestamp + } + return votes[i].Data < votes[j].Data + }) } From 241668b699171f838f5f2ef62750efa125f9501b Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 7 May 2024 14:09:07 +0800 Subject: [PATCH 108/150] add logs for gossip --- oracle/reactor.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 80a148e4b75..835496a3841 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -233,7 +233,7 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { Message: gossipVote, }) if !success { - logrus.Info("FAILED TO SEND!!!!!!!!!!!!!!!!!!!!!!!!!!!!") + logrus.Infof("FAILED TO SEND!!!!!!!!!!!!!!!!!!!!!!!!!!!!: %v", gossipVote) time.Sleep(PeerCatchupSleepIntervalMS * time.Millisecond) break } From 00a4e74e64e57a5679d4d4336e295c666ba6eee3 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 7 May 2024 14:51:52 +0800 Subject: [PATCH 109/150] fix sorting bug --- oracle/service/runner/runner.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 66b5e743a4b..e3018bc12a9 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -59,7 +59,12 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State // append new batch into unsignedVotesBuffer, need to mutex lock as it will clash with concurrent pruning oracleInfo.UnsignedVoteBuffer.UpdateMtx.Lock() oracleInfo.UnsignedVoteBuffer.Buffer = append(oracleInfo.UnsignedVoteBuffer.Buffer, votes...) - unsignedVotes := oracleInfo.UnsignedVoteBuffer.Buffer + + unsignedVotes := []*oracleproto.Vote{} + + for _, vote := range oracleInfo.UnsignedVoteBuffer.Buffer { + unsignedVotes = append(unsignedVotes, vote) + } // sort the votes so that we can rebuild it in a deterministic order, when uncompressing SortOracleVotes(unsignedVotes) From e692837041dd3166cb432cf7e13f04d1f909f604 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 7 May 2024 15:36:22 +0800 Subject: [PATCH 110/150] add pruning logs --- oracle/reactor.go | 3 ++- oracle/service/runner/runner.go | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 835496a3841..22f2ebff3f6 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -228,12 +228,13 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { continue } + logrus.Infof("SIZE OF GOSSIP VOTE: %v", gossipVote.Size()) + success := peer.Send(p2p.Envelope{ ChannelID: OracleChannel, Message: gossipVote, }) if !success { - logrus.Infof("FAILED TO SEND!!!!!!!!!!!!!!!!!!!!!!!!!!!!: %v", gossipVote) time.Sleep(PeerCatchupSleepIntervalMS * time.Millisecond) break } diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index e3018bc12a9..d7d34255251 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -102,6 +102,9 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { for range ticker { lastBlockTime := consensusState.GetState().LastBlockTime + log.Infof("LAST BLOCK TIME: %v", lastBlockTime.Unix()) + log.Infof("BLOCK TIME STAMPS: %v", oracleInfo.BlockTimestamps) + if !contains(oracleInfo.BlockTimestamps, lastBlockTime.Unix()) { oracleInfo.BlockTimestamps = append(oracleInfo.BlockTimestamps, lastBlockTime.Unix()) } @@ -121,6 +124,8 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { for _, vote := range unsignedVoteBuffer { if vote.Timestamp >= oracleInfo.BlockTimestamps[0] { newVotes = append(newVotes, vote) + } else { + log.Infof("LASTEST ALLOWABLE TIMESTAMP: %v, DELETING VOTE: %v", oracleInfo.BlockTimestamps[0], vote) } } oracleInfo.UnsignedVoteBuffer.Buffer = newVotes From c21f1019bd5036048c940a0c5fddafe7c771d39b Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 7 May 2024 15:47:05 +0800 Subject: [PATCH 111/150] sort vote by timestamp first --- oracle/service/runner/runner.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index d7d34255251..ecc1600a937 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -177,12 +177,12 @@ func Run(oracleInfo *types.OracleInfo, consensusState *cs.State) { func SortOracleVotes(votes []*oracleproto.Vote) { sort.SliceStable(votes, func(i, j int) bool { - if votes[i].OracleId != votes[j].OracleId { - return votes[i].OracleId < votes[j].OracleId - } if votes[i].Timestamp != votes[j].Timestamp { return votes[i].Timestamp < votes[j].Timestamp } + if votes[i].OracleId != votes[j].OracleId { + return votes[i].OracleId < votes[j].OracleId + } return votes[i].Data < votes[j].Data }) } From 4c67e19f3c8e690fb2666a79d0b816df2bf52664 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 7 May 2024 16:38:07 +0800 Subject: [PATCH 112/150] remove validateOracleVotes hook --- abci/client/grpc_client.go | 4 - abci/client/mocks/client.go | 26 - abci/client/socket_client.go | 11 - abci/types/application.go | 5 - abci/types/messages.go | 6 - abci/types/mocks/application.go | 26 - abci/types/types.pb.go | 1201 +++++++---------------------- proto/tendermint/abci/types.proto | 17 - proxy/app_conn.go | 6 - proxy/mocks/app_conn_consensus.go | 26 - 10 files changed, 293 insertions(+), 1035 deletions(-) diff --git a/abci/client/grpc_client.go b/abci/client/grpc_client.go index 0b337eb8d43..b34f40c5b0e 100644 --- a/abci/client/grpc_client.go +++ b/abci/client/grpc_client.go @@ -253,7 +253,3 @@ func (cli *grpcClient) CreateOracleResultTx(ctx context.Context, req *types.Requ func (cli *grpcClient) FetchOracleVotes(ctx context.Context, req *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error) { return cli.client.FetchOracleVotes(ctx, types.ToRequestFetchOracleVotes(req).GetFetchOracleVotes(), grpc.WaitForReady(true)) } - -func (cli *grpcClient) ValidateOracleVotes(ctx context.Context, req *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) { - return cli.client.ValidateOracleVotes(ctx, types.ToRequestValidateOracleVotes(req).GetValidateOracleVotes(), grpc.WaitForReady(true)) -} diff --git a/abci/client/mocks/client.go b/abci/client/mocks/client.go index b48cbdd19f1..2a5ce456be3 100644 --- a/abci/client/mocks/client.go +++ b/abci/client/mocks/client.go @@ -618,32 +618,6 @@ func (_m *Client) String() string { return r0 } -// ValidateOracleVotes provides a mock function with given fields: _a0, _a1 -func (_m *Client) ValidateOracleVotes(_a0 context.Context, _a1 *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) { - ret := _m.Called(_a0, _a1) - - var r0 *types.ResponseValidateOracleVotes - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error)); ok { - return rf(_a0, _a1) - } - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestValidateOracleVotes) *types.ResponseValidateOracleVotes); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.ResponseValidateOracleVotes) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *types.RequestValidateOracleVotes) error); ok { - r1 = rf(_a0, _a1) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - // VerifyVoteExtension provides a mock function with given fields: _a0, _a1 func (_m *Client) VerifyVoteExtension(_a0 context.Context, _a1 *types.RequestVerifyVoteExtension) (*types.ResponseVerifyVoteExtension, error) { ret := _m.Called(_a0, _a1) diff --git a/abci/client/socket_client.go b/abci/client/socket_client.go index d997c0a4310..8de6847c5cc 100644 --- a/abci/client/socket_client.go +++ b/abci/client/socket_client.go @@ -434,17 +434,6 @@ func (cli *socketClient) FetchOracleVotes(ctx context.Context, req *types.Reques return reqRes.Response.GetFetchOracleVotes(), cli.Error() } -func (cli *socketClient) ValidateOracleVotes(ctx context.Context, req *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) { - reqRes, err := cli.queueRequest(ctx, types.ToRequestValidateOracleVotes(req)) - if err != nil { - return nil, err - } - if err := cli.Flush(ctx); err != nil { - return nil, err - } - return reqRes.Response.GetValidateOracleVotes(), cli.Error() -} - func (cli *socketClient) queueRequest(ctx context.Context, req *types.Request) (*ReqRes, error) { reqres := NewReqRes(req) diff --git a/abci/types/application.go b/abci/types/application.go index ffb43865dd1..ede57135c5f 100644 --- a/abci/types/application.go +++ b/abci/types/application.go @@ -38,7 +38,6 @@ type Application interface { // Hooks CreateOracleResultTx(context.Context, *RequestCreateOracleResultTx) (*ResponseCreateOracleResultTx, error) FetchOracleVotes(context.Context, *RequestFetchOracleVotes) (*ResponseFetchOracleVotes, error) - ValidateOracleVotes(context.Context, *RequestValidateOracleVotes) (*ResponseValidateOracleVotes, error) } //------------------------------------------------------- @@ -132,7 +131,3 @@ func (BaseApplication) CreateOracleResultTx(_ context.Context, req *RequestCreat func (BaseApplication) FetchOracleVotes(_ context.Context, req *RequestFetchOracleVotes) (*ResponseFetchOracleVotes, error) { return &ResponseFetchOracleVotes{}, nil } - -func (BaseApplication) ValidateOracleVotes(_ context.Context, req *RequestValidateOracleVotes) (*ResponseValidateOracleVotes, error) { - return &ResponseValidateOracleVotes{}, nil -} diff --git a/abci/types/messages.go b/abci/types/messages.go index 2bd4421de53..beddfaac30c 100644 --- a/abci/types/messages.go +++ b/abci/types/messages.go @@ -136,12 +136,6 @@ func ToRequestFetchOracleVotes(req *RequestFetchOracleVotes) *Request { } } -func ToRequestValidateOracleVotes(req *RequestValidateOracleVotes) *Request { - return &Request{ - Value: &Request_ValidateOracleVotes{req}, - } -} - //---------------------------------------- func ToResponseException(errStr string) *Response { diff --git a/abci/types/mocks/application.go b/abci/types/mocks/application.go index 061bee9c225..ee78763ae41 100644 --- a/abci/types/mocks/application.go +++ b/abci/types/mocks/application.go @@ -404,32 +404,6 @@ func (_m *Application) CreateOracleResultTx(_a0 context.Context, _a1 *types.Requ return r0, r1 } -// ValidateOracleVotes provides a mock function with given fields: _a0, _a1 -func (_m *Application) ValidateOracleVotes(_a0 context.Context, _a1 *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) { - ret := _m.Called(_a0, _a1) - - var r0 *types.ResponseValidateOracleVotes - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error)); ok { - return rf(_a0, _a1) - } - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestValidateOracleVotes) *types.ResponseValidateOracleVotes); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.ResponseValidateOracleVotes) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *types.RequestValidateOracleVotes) error); ok { - r1 = rf(_a0, _a1) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - // VerifyVoteExtension provides a mock function with given fields: _a0, _a1 func (_m *Application) VerifyVoteExtension(_a0 context.Context, _a1 *types.RequestVerifyVoteExtension) (*types.ResponseVerifyVoteExtension, error) { ret := _m.Called(_a0, _a1) diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go index a327a2fd576..94e94a5e2fe 100644 --- a/abci/types/types.pb.go +++ b/abci/types/types.pb.go @@ -122,7 +122,7 @@ func (x ResponseOfferSnapshot_Result) String() string { } func (ResponseOfferSnapshot_Result) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{30, 0} + return fileDescriptor_252557cfdd89a31a, []int{29, 0} } type ResponseApplySnapshotChunk_Result int32 @@ -159,7 +159,7 @@ func (x ResponseApplySnapshotChunk_Result) String() string { } func (ResponseApplySnapshotChunk_Result) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{32, 0} + return fileDescriptor_252557cfdd89a31a, []int{31, 0} } type ResponseProcessProposal_ProposalStatus int32 @@ -187,7 +187,7 @@ func (x ResponseProcessProposal_ProposalStatus) String() string { } func (ResponseProcessProposal_ProposalStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{34, 0} + return fileDescriptor_252557cfdd89a31a, []int{33, 0} } type ResponseVerifyVoteExtension_VerifyStatus int32 @@ -219,32 +219,7 @@ func (x ResponseVerifyVoteExtension_VerifyStatus) String() string { } func (ResponseVerifyVoteExtension_VerifyStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{36, 0} -} - -type ResponseValidateOracleVotes_Status int32 - -const ( - ResponseValidateOracleVotes_absent ResponseValidateOracleVotes_Status = 0 - ResponseValidateOracleVotes_present ResponseValidateOracleVotes_Status = 1 -) - -var ResponseValidateOracleVotes_Status_name = map[int32]string{ - 0: "absent", - 1: "present", -} - -var ResponseValidateOracleVotes_Status_value = map[string]int32{ - "absent": 0, - "present": 1, -} - -func (x ResponseValidateOracleVotes_Status) String() string { - return proto.EnumName(ResponseValidateOracleVotes_Status_name, int32(x)) -} - -func (ResponseValidateOracleVotes_Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{40, 0} + return fileDescriptor_252557cfdd89a31a, []int{35, 0} } type Request struct { @@ -267,7 +242,6 @@ type Request struct { // *Request_FinalizeBlock // *Request_CreateOracleResultTx // *Request_FetchOracleVotes - // *Request_ValidateOracleVotes Value isRequest_Value `protobuf_oneof:"value"` } @@ -364,9 +338,6 @@ type Request_CreateOracleResultTx struct { type Request_FetchOracleVotes struct { FetchOracleVotes *RequestFetchOracleVotes `protobuf:"bytes,22,opt,name=fetch_oracle_votes,json=fetchOracleVotes,proto3,oneof" json:"fetch_oracle_votes,omitempty"` } -type Request_ValidateOracleVotes struct { - ValidateOracleVotes *RequestValidateOracleVotes `protobuf:"bytes,23,opt,name=validate_oracle_votes,json=validateOracleVotes,proto3,oneof" json:"validate_oracle_votes,omitempty"` -} func (*Request_Echo) isRequest_Value() {} func (*Request_Flush) isRequest_Value() {} @@ -386,7 +357,6 @@ func (*Request_VerifyVoteExtension) isRequest_Value() {} func (*Request_FinalizeBlock) isRequest_Value() {} func (*Request_CreateOracleResultTx) isRequest_Value() {} func (*Request_FetchOracleVotes) isRequest_Value() {} -func (*Request_ValidateOracleVotes) isRequest_Value() {} func (m *Request) GetValue() isRequest_Value { if m != nil { @@ -521,13 +491,6 @@ func (m *Request) GetFetchOracleVotes() *RequestFetchOracleVotes { return nil } -func (m *Request) GetValidateOracleVotes() *RequestValidateOracleVotes { - if x, ok := m.GetValue().(*Request_ValidateOracleVotes); ok { - return x.ValidateOracleVotes - } - return nil -} - // XXX_OneofWrappers is for the internal use of the proto package. func (*Request) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -549,7 +512,6 @@ func (*Request) XXX_OneofWrappers() []interface{} { (*Request_FinalizeBlock)(nil), (*Request_CreateOracleResultTx)(nil), (*Request_FetchOracleVotes)(nil), - (*Request_ValidateOracleVotes)(nil), } } @@ -1733,50 +1695,6 @@ func (m *RequestFetchOracleVotes) XXX_DiscardUnknown() { var xxx_messageInfo_RequestFetchOracleVotes proto.InternalMessageInfo -type RequestValidateOracleVotes struct { - OracleTx []byte `protobuf:"bytes,1,opt,name=oracle_tx,json=oracleTx,proto3" json:"oracle_tx,omitempty"` -} - -func (m *RequestValidateOracleVotes) Reset() { *m = RequestValidateOracleVotes{} } -func (m *RequestValidateOracleVotes) String() string { return proto.CompactTextString(m) } -func (*RequestValidateOracleVotes) ProtoMessage() {} -func (*RequestValidateOracleVotes) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{19} -} -func (m *RequestValidateOracleVotes) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RequestValidateOracleVotes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RequestValidateOracleVotes.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *RequestValidateOracleVotes) XXX_Merge(src proto.Message) { - xxx_messageInfo_RequestValidateOracleVotes.Merge(m, src) -} -func (m *RequestValidateOracleVotes) XXX_Size() int { - return m.Size() -} -func (m *RequestValidateOracleVotes) XXX_DiscardUnknown() { - xxx_messageInfo_RequestValidateOracleVotes.DiscardUnknown(m) -} - -var xxx_messageInfo_RequestValidateOracleVotes proto.InternalMessageInfo - -func (m *RequestValidateOracleVotes) GetOracleTx() []byte { - if m != nil { - return m.OracleTx - } - return nil -} - type Response struct { // Types that are valid to be assigned to Value: // @@ -1799,7 +1717,6 @@ type Response struct { // *Response_FinalizeBlock // *Response_CreateOracleResultTx // *Response_FetchOracleVotes - // *Response_ValidateOracleVotes Value isResponse_Value `protobuf_oneof:"value"` } @@ -1807,7 +1724,7 @@ func (m *Response) Reset() { *m = Response{} } func (m *Response) String() string { return proto.CompactTextString(m) } func (*Response) ProtoMessage() {} func (*Response) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{20} + return fileDescriptor_252557cfdd89a31a, []int{19} } func (m *Response) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1899,9 +1816,6 @@ type Response_CreateOracleResultTx struct { type Response_FetchOracleVotes struct { FetchOracleVotes *ResponseFetchOracleVotes `protobuf:"bytes,23,opt,name=fetch_oracle_votes,json=fetchOracleVotes,proto3,oneof" json:"fetch_oracle_votes,omitempty"` } -type Response_ValidateOracleVotes struct { - ValidateOracleVotes *ResponseValidateOracleVotes `protobuf:"bytes,24,opt,name=validate_oracle_votes,json=validateOracleVotes,proto3,oneof" json:"validate_oracle_votes,omitempty"` -} func (*Response_Exception) isResponse_Value() {} func (*Response_Echo) isResponse_Value() {} @@ -1922,7 +1836,6 @@ func (*Response_VerifyVoteExtension) isResponse_Value() {} func (*Response_FinalizeBlock) isResponse_Value() {} func (*Response_CreateOracleResultTx) isResponse_Value() {} func (*Response_FetchOracleVotes) isResponse_Value() {} -func (*Response_ValidateOracleVotes) isResponse_Value() {} func (m *Response) GetValue() isResponse_Value { if m != nil { @@ -2064,13 +1977,6 @@ func (m *Response) GetFetchOracleVotes() *ResponseFetchOracleVotes { return nil } -func (m *Response) GetValidateOracleVotes() *ResponseValidateOracleVotes { - if x, ok := m.GetValue().(*Response_ValidateOracleVotes); ok { - return x.ValidateOracleVotes - } - return nil -} - // XXX_OneofWrappers is for the internal use of the proto package. func (*Response) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -2093,7 +1999,6 @@ func (*Response) XXX_OneofWrappers() []interface{} { (*Response_FinalizeBlock)(nil), (*Response_CreateOracleResultTx)(nil), (*Response_FetchOracleVotes)(nil), - (*Response_ValidateOracleVotes)(nil), } } @@ -2106,7 +2011,7 @@ func (m *ResponseException) Reset() { *m = ResponseException{} } func (m *ResponseException) String() string { return proto.CompactTextString(m) } func (*ResponseException) ProtoMessage() {} func (*ResponseException) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{21} + return fileDescriptor_252557cfdd89a31a, []int{20} } func (m *ResponseException) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2150,7 +2055,7 @@ func (m *ResponseEcho) Reset() { *m = ResponseEcho{} } func (m *ResponseEcho) String() string { return proto.CompactTextString(m) } func (*ResponseEcho) ProtoMessage() {} func (*ResponseEcho) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{22} + return fileDescriptor_252557cfdd89a31a, []int{21} } func (m *ResponseEcho) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2193,7 +2098,7 @@ func (m *ResponseFlush) Reset() { *m = ResponseFlush{} } func (m *ResponseFlush) String() string { return proto.CompactTextString(m) } func (*ResponseFlush) ProtoMessage() {} func (*ResponseFlush) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{23} + return fileDescriptor_252557cfdd89a31a, []int{22} } func (m *ResponseFlush) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2234,7 +2139,7 @@ func (m *ResponseInfo) Reset() { *m = ResponseInfo{} } func (m *ResponseInfo) String() string { return proto.CompactTextString(m) } func (*ResponseInfo) ProtoMessage() {} func (*ResponseInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{24} + return fileDescriptor_252557cfdd89a31a, []int{23} } func (m *ResponseInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2308,7 +2213,7 @@ func (m *ResponseInitChain) Reset() { *m = ResponseInitChain{} } func (m *ResponseInitChain) String() string { return proto.CompactTextString(m) } func (*ResponseInitChain) ProtoMessage() {} func (*ResponseInitChain) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{25} + return fileDescriptor_252557cfdd89a31a, []int{24} } func (m *ResponseInitChain) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2375,7 +2280,7 @@ func (m *ResponseQuery) Reset() { *m = ResponseQuery{} } func (m *ResponseQuery) String() string { return proto.CompactTextString(m) } func (*ResponseQuery) ProtoMessage() {} func (*ResponseQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{26} + return fileDescriptor_252557cfdd89a31a, []int{25} } func (m *ResponseQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2482,7 +2387,7 @@ func (m *ResponseCheckTx) Reset() { *m = ResponseCheckTx{} } func (m *ResponseCheckTx) String() string { return proto.CompactTextString(m) } func (*ResponseCheckTx) ProtoMessage() {} func (*ResponseCheckTx) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{27} + return fileDescriptor_252557cfdd89a31a, []int{26} } func (m *ResponseCheckTx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2575,7 +2480,7 @@ func (m *ResponseCommit) Reset() { *m = ResponseCommit{} } func (m *ResponseCommit) String() string { return proto.CompactTextString(m) } func (*ResponseCommit) ProtoMessage() {} func (*ResponseCommit) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{28} + return fileDescriptor_252557cfdd89a31a, []int{27} } func (m *ResponseCommit) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2619,7 +2524,7 @@ func (m *ResponseListSnapshots) Reset() { *m = ResponseListSnapshots{} } func (m *ResponseListSnapshots) String() string { return proto.CompactTextString(m) } func (*ResponseListSnapshots) ProtoMessage() {} func (*ResponseListSnapshots) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{29} + return fileDescriptor_252557cfdd89a31a, []int{28} } func (m *ResponseListSnapshots) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2663,7 +2568,7 @@ func (m *ResponseOfferSnapshot) Reset() { *m = ResponseOfferSnapshot{} } func (m *ResponseOfferSnapshot) String() string { return proto.CompactTextString(m) } func (*ResponseOfferSnapshot) ProtoMessage() {} func (*ResponseOfferSnapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{30} + return fileDescriptor_252557cfdd89a31a, []int{29} } func (m *ResponseOfferSnapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2707,7 +2612,7 @@ func (m *ResponseLoadSnapshotChunk) Reset() { *m = ResponseLoadSnapshotC func (m *ResponseLoadSnapshotChunk) String() string { return proto.CompactTextString(m) } func (*ResponseLoadSnapshotChunk) ProtoMessage() {} func (*ResponseLoadSnapshotChunk) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{31} + return fileDescriptor_252557cfdd89a31a, []int{30} } func (m *ResponseLoadSnapshotChunk) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2753,7 +2658,7 @@ func (m *ResponseApplySnapshotChunk) Reset() { *m = ResponseApplySnapsho func (m *ResponseApplySnapshotChunk) String() string { return proto.CompactTextString(m) } func (*ResponseApplySnapshotChunk) ProtoMessage() {} func (*ResponseApplySnapshotChunk) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{32} + return fileDescriptor_252557cfdd89a31a, []int{31} } func (m *ResponseApplySnapshotChunk) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2811,7 +2716,7 @@ func (m *ResponsePrepareProposal) Reset() { *m = ResponsePrepareProposal func (m *ResponsePrepareProposal) String() string { return proto.CompactTextString(m) } func (*ResponsePrepareProposal) ProtoMessage() {} func (*ResponsePrepareProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{33} + return fileDescriptor_252557cfdd89a31a, []int{32} } func (m *ResponsePrepareProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2855,7 +2760,7 @@ func (m *ResponseProcessProposal) Reset() { *m = ResponseProcessProposal func (m *ResponseProcessProposal) String() string { return proto.CompactTextString(m) } func (*ResponseProcessProposal) ProtoMessage() {} func (*ResponseProcessProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{34} + return fileDescriptor_252557cfdd89a31a, []int{33} } func (m *ResponseProcessProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2899,7 +2804,7 @@ func (m *ResponseExtendVote) Reset() { *m = ResponseExtendVote{} } func (m *ResponseExtendVote) String() string { return proto.CompactTextString(m) } func (*ResponseExtendVote) ProtoMessage() {} func (*ResponseExtendVote) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{35} + return fileDescriptor_252557cfdd89a31a, []int{34} } func (m *ResponseExtendVote) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2943,7 +2848,7 @@ func (m *ResponseVerifyVoteExtension) Reset() { *m = ResponseVerifyVoteE func (m *ResponseVerifyVoteExtension) String() string { return proto.CompactTextString(m) } func (*ResponseVerifyVoteExtension) ProtoMessage() {} func (*ResponseVerifyVoteExtension) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{36} + return fileDescriptor_252557cfdd89a31a, []int{35} } func (m *ResponseVerifyVoteExtension) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2998,7 +2903,7 @@ func (m *ResponseFinalizeBlock) Reset() { *m = ResponseFinalizeBlock{} } func (m *ResponseFinalizeBlock) String() string { return proto.CompactTextString(m) } func (*ResponseFinalizeBlock) ProtoMessage() {} func (*ResponseFinalizeBlock) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{37} + return fileDescriptor_252557cfdd89a31a, []int{36} } func (m *ResponseFinalizeBlock) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3070,7 +2975,7 @@ func (m *ResponseCreateOracleResultTx) Reset() { *m = ResponseCreateOrac func (m *ResponseCreateOracleResultTx) String() string { return proto.CompactTextString(m) } func (*ResponseCreateOracleResultTx) ProtoMessage() {} func (*ResponseCreateOracleResultTx) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{38} + return fileDescriptor_252557cfdd89a31a, []int{37} } func (m *ResponseCreateOracleResultTx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3114,7 +3019,7 @@ func (m *ResponseFetchOracleVotes) Reset() { *m = ResponseFetchOracleVot func (m *ResponseFetchOracleVotes) String() string { return proto.CompactTextString(m) } func (*ResponseFetchOracleVotes) ProtoMessage() {} func (*ResponseFetchOracleVotes) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{39} + return fileDescriptor_252557cfdd89a31a, []int{38} } func (m *ResponseFetchOracleVotes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3150,58 +3055,6 @@ func (m *ResponseFetchOracleVotes) GetVote() *oracle.Vote { return nil } -type ResponseValidateOracleVotes struct { - EncodedOracleTx []byte `protobuf:"bytes,1,opt,name=encoded_oracle_tx,json=encodedOracleTx,proto3" json:"encoded_oracle_tx,omitempty"` - Status ResponseValidateOracleVotes_Status `protobuf:"varint,2,opt,name=status,proto3,enum=tendermint.abci.ResponseValidateOracleVotes_Status" json:"status,omitempty"` -} - -func (m *ResponseValidateOracleVotes) Reset() { *m = ResponseValidateOracleVotes{} } -func (m *ResponseValidateOracleVotes) String() string { return proto.CompactTextString(m) } -func (*ResponseValidateOracleVotes) ProtoMessage() {} -func (*ResponseValidateOracleVotes) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{40} -} -func (m *ResponseValidateOracleVotes) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ResponseValidateOracleVotes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ResponseValidateOracleVotes.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *ResponseValidateOracleVotes) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResponseValidateOracleVotes.Merge(m, src) -} -func (m *ResponseValidateOracleVotes) XXX_Size() int { - return m.Size() -} -func (m *ResponseValidateOracleVotes) XXX_DiscardUnknown() { - xxx_messageInfo_ResponseValidateOracleVotes.DiscardUnknown(m) -} - -var xxx_messageInfo_ResponseValidateOracleVotes proto.InternalMessageInfo - -func (m *ResponseValidateOracleVotes) GetEncodedOracleTx() []byte { - if m != nil { - return m.EncodedOracleTx - } - return nil -} - -func (m *ResponseValidateOracleVotes) GetStatus() ResponseValidateOracleVotes_Status { - if m != nil { - return m.Status - } - return ResponseValidateOracleVotes_absent -} - type CommitInfo struct { Round int32 `protobuf:"varint,1,opt,name=round,proto3" json:"round,omitempty"` Votes []VoteInfo `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes"` @@ -3211,7 +3064,7 @@ func (m *CommitInfo) Reset() { *m = CommitInfo{} } func (m *CommitInfo) String() string { return proto.CompactTextString(m) } func (*CommitInfo) ProtoMessage() {} func (*CommitInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{41} + return fileDescriptor_252557cfdd89a31a, []int{39} } func (m *CommitInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3269,7 +3122,7 @@ func (m *ExtendedCommitInfo) Reset() { *m = ExtendedCommitInfo{} } func (m *ExtendedCommitInfo) String() string { return proto.CompactTextString(m) } func (*ExtendedCommitInfo) ProtoMessage() {} func (*ExtendedCommitInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{42} + return fileDescriptor_252557cfdd89a31a, []int{40} } func (m *ExtendedCommitInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3324,7 +3177,7 @@ func (m *Event) Reset() { *m = Event{} } func (m *Event) String() string { return proto.CompactTextString(m) } func (*Event) ProtoMessage() {} func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{43} + return fileDescriptor_252557cfdd89a31a, []int{41} } func (m *Event) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3378,7 +3231,7 @@ func (m *EventAttribute) Reset() { *m = EventAttribute{} } func (m *EventAttribute) String() string { return proto.CompactTextString(m) } func (*EventAttribute) ProtoMessage() {} func (*EventAttribute) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{44} + return fileDescriptor_252557cfdd89a31a, []int{42} } func (m *EventAttribute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3446,7 +3299,7 @@ func (m *ExecTxResult) Reset() { *m = ExecTxResult{} } func (m *ExecTxResult) String() string { return proto.CompactTextString(m) } func (*ExecTxResult) ProtoMessage() {} func (*ExecTxResult) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{45} + return fileDescriptor_252557cfdd89a31a, []int{43} } func (m *ExecTxResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3545,7 +3398,7 @@ func (m *TxResult) Reset() { *m = TxResult{} } func (m *TxResult) String() string { return proto.CompactTextString(m) } func (*TxResult) ProtoMessage() {} func (*TxResult) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{46} + return fileDescriptor_252557cfdd89a31a, []int{44} } func (m *TxResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3612,7 +3465,7 @@ func (m *Validator) Reset() { *m = Validator{} } func (m *Validator) String() string { return proto.CompactTextString(m) } func (*Validator) ProtoMessage() {} func (*Validator) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{47} + return fileDescriptor_252557cfdd89a31a, []int{45} } func (m *Validator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3664,7 +3517,7 @@ func (m *ValidatorUpdate) Reset() { *m = ValidatorUpdate{} } func (m *ValidatorUpdate) String() string { return proto.CompactTextString(m) } func (*ValidatorUpdate) ProtoMessage() {} func (*ValidatorUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{48} + return fileDescriptor_252557cfdd89a31a, []int{46} } func (m *ValidatorUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3716,7 +3569,7 @@ 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_252557cfdd89a31a, []int{49} + return fileDescriptor_252557cfdd89a31a, []int{47} } func (m *VoteInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3774,7 +3627,7 @@ func (m *ExtendedVoteInfo) Reset() { *m = ExtendedVoteInfo{} } func (m *ExtendedVoteInfo) String() string { return proto.CompactTextString(m) } func (*ExtendedVoteInfo) ProtoMessage() {} func (*ExtendedVoteInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{50} + return fileDescriptor_252557cfdd89a31a, []int{48} } func (m *ExtendedVoteInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3849,7 +3702,7 @@ func (m *Misbehavior) Reset() { *m = Misbehavior{} } func (m *Misbehavior) String() string { return proto.CompactTextString(m) } func (*Misbehavior) ProtoMessage() {} func (*Misbehavior) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{51} + return fileDescriptor_252557cfdd89a31a, []int{49} } func (m *Misbehavior) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3925,7 +3778,7 @@ func (m *Snapshot) Reset() { *m = Snapshot{} } func (m *Snapshot) String() string { return proto.CompactTextString(m) } func (*Snapshot) ProtoMessage() {} func (*Snapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{52} + return fileDescriptor_252557cfdd89a31a, []int{50} } func (m *Snapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3996,7 +3849,6 @@ func init() { proto.RegisterEnum("tendermint.abci.ResponseApplySnapshotChunk_Result", ResponseApplySnapshotChunk_Result_name, ResponseApplySnapshotChunk_Result_value) proto.RegisterEnum("tendermint.abci.ResponseProcessProposal_ProposalStatus", ResponseProcessProposal_ProposalStatus_name, ResponseProcessProposal_ProposalStatus_value) proto.RegisterEnum("tendermint.abci.ResponseVerifyVoteExtension_VerifyStatus", ResponseVerifyVoteExtension_VerifyStatus_name, ResponseVerifyVoteExtension_VerifyStatus_value) - proto.RegisterEnum("tendermint.abci.ResponseValidateOracleVotes_Status", ResponseValidateOracleVotes_Status_name, ResponseValidateOracleVotes_Status_value) proto.RegisterType((*Request)(nil), "tendermint.abci.Request") proto.RegisterType((*RequestEcho)(nil), "tendermint.abci.RequestEcho") proto.RegisterType((*RequestFlush)(nil), "tendermint.abci.RequestFlush") @@ -4016,7 +3868,6 @@ func init() { proto.RegisterType((*RequestFinalizeBlock)(nil), "tendermint.abci.RequestFinalizeBlock") proto.RegisterType((*RequestCreateOracleResultTx)(nil), "tendermint.abci.RequestCreateOracleResultTx") proto.RegisterType((*RequestFetchOracleVotes)(nil), "tendermint.abci.RequestFetchOracleVotes") - proto.RegisterType((*RequestValidateOracleVotes)(nil), "tendermint.abci.RequestValidateOracleVotes") proto.RegisterType((*Response)(nil), "tendermint.abci.Response") proto.RegisterType((*ResponseException)(nil), "tendermint.abci.ResponseException") proto.RegisterType((*ResponseEcho)(nil), "tendermint.abci.ResponseEcho") @@ -4037,7 +3888,6 @@ func init() { proto.RegisterType((*ResponseFinalizeBlock)(nil), "tendermint.abci.ResponseFinalizeBlock") proto.RegisterType((*ResponseCreateOracleResultTx)(nil), "tendermint.abci.ResponseCreateOracleResultTx") proto.RegisterType((*ResponseFetchOracleVotes)(nil), "tendermint.abci.ResponseFetchOracleVotes") - proto.RegisterType((*ResponseValidateOracleVotes)(nil), "tendermint.abci.ResponseValidateOracleVotes") proto.RegisterType((*CommitInfo)(nil), "tendermint.abci.CommitInfo") proto.RegisterType((*ExtendedCommitInfo)(nil), "tendermint.abci.ExtendedCommitInfo") proto.RegisterType((*Event)(nil), "tendermint.abci.Event") @@ -4055,227 +3905,219 @@ func init() { func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) } var fileDescriptor_252557cfdd89a31a = []byte{ - // 3506 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcb, 0x73, 0x1b, 0xc7, - 0xd1, 0xc7, 0xe2, 0x45, 0xa0, 0xf1, 0xe0, 0x72, 0x48, 0x49, 0x10, 0x24, 0x91, 0xd4, 0xba, 0x6c, - 0xcb, 0x92, 0x4d, 0xfa, 0x93, 0x3e, 0xd9, 0x56, 0xc9, 0xfe, 0xaa, 0x48, 0x08, 0x12, 0x48, 0xc9, - 0x24, 0xbd, 0x84, 0xe4, 0x4f, 0xdf, 0xc3, 0xeb, 0x05, 0x30, 0x00, 0xd6, 0x02, 0xb0, 0xeb, 0xdd, - 0x05, 0x0d, 0xfa, 0x94, 0x8a, 0x93, 0xaa, 0x94, 0x4f, 0xae, 0xca, 0xc5, 0x87, 0xf8, 0x90, 0x43, - 0x0e, 0xc9, 0x5f, 0x90, 0x54, 0xaa, 0x72, 0xca, 0xc1, 0x87, 0x1c, 0x7c, 0xcc, 0xc9, 0x49, 0x59, - 0x37, 0x57, 0xe5, 0x94, 0x43, 0xae, 0xa9, 0x79, 0xec, 0x0b, 0xd8, 0xc5, 0x43, 0x76, 0x0e, 0xa9, - 0xe4, 0x86, 0xe9, 0xed, 0xee, 0x99, 0xe9, 0xe9, 0x99, 0xee, 0xf9, 0xf5, 0x00, 0x2e, 0xd8, 0x78, - 0xd0, 0xc2, 0x66, 0x5f, 0x1b, 0xd8, 0xdb, 0x6a, 0xa3, 0xa9, 0x6d, 0xdb, 0xa7, 0x06, 0xb6, 0xb6, - 0x0c, 0x53, 0xb7, 0x75, 0xb4, 0xec, 0x7d, 0xdc, 0x22, 0x1f, 0xcb, 0x97, 0x7c, 0xdc, 0x4d, 0xf3, - 0xd4, 0xb0, 0xf5, 0x6d, 0xc3, 0xd4, 0xf5, 0x36, 0xe3, 0x2f, 0x5f, 0x9c, 0xfc, 0xfc, 0x04, 0x9f, - 0x72, 0x6d, 0x01, 0x61, 0xda, 0xcb, 0xb6, 0xa1, 0x9a, 0x6a, 0xdf, 0xf9, 0xbc, 0x39, 0xf1, 0xf9, - 0x44, 0xed, 0x69, 0x2d, 0xd5, 0xd6, 0x4d, 0xce, 0xb1, 0xd1, 0xd1, 0xf5, 0x4e, 0x0f, 0x6f, 0xd3, - 0x56, 0x63, 0xd8, 0xde, 0xb6, 0xb5, 0x3e, 0xb6, 0x6c, 0xb5, 0x6f, 0x70, 0x86, 0xb5, 0x8e, 0xde, - 0xd1, 0xe9, 0xcf, 0x6d, 0xf2, 0x2b, 0xa4, 0x5f, 0xdd, 0x54, 0x9b, 0x3d, 0xec, 0x9f, 0xa4, 0xf4, - 0x34, 0x07, 0x4b, 0x32, 0xfe, 0x70, 0x88, 0x2d, 0x1b, 0x5d, 0x87, 0x24, 0x6e, 0x76, 0xf5, 0x92, - 0xb0, 0x29, 0x5c, 0xc9, 0x5d, 0xbf, 0xb8, 0x35, 0x36, 0xff, 0x2d, 0xce, 0x57, 0x6d, 0x76, 0xf5, - 0x5a, 0x4c, 0xa6, 0xbc, 0xe8, 0x26, 0xa4, 0xda, 0xbd, 0xa1, 0xd5, 0x2d, 0xc5, 0xa9, 0xd0, 0xa5, - 0x28, 0xa1, 0xbb, 0x84, 0xa9, 0x16, 0x93, 0x19, 0x37, 0xe9, 0x4a, 0x1b, 0xb4, 0xf5, 0x52, 0x62, - 0x7a, 0x57, 0x7b, 0x83, 0x36, 0xed, 0x8a, 0xf0, 0xa2, 0x5d, 0x00, 0x6d, 0xa0, 0xd9, 0x4a, 0xb3, - 0xab, 0x6a, 0x83, 0x52, 0x8a, 0x4a, 0x5e, 0x8e, 0x96, 0xd4, 0xec, 0x0a, 0x61, 0xac, 0xc5, 0xe4, - 0xac, 0xe6, 0x34, 0xc8, 0x70, 0x3f, 0x1c, 0x62, 0xf3, 0xb4, 0x94, 0x9e, 0x3e, 0xdc, 0x77, 0x08, - 0x13, 0x19, 0x2e, 0xe5, 0x46, 0x6f, 0x42, 0xa6, 0xd9, 0xc5, 0xcd, 0x27, 0x8a, 0x3d, 0x2a, 0x65, - 0xa8, 0xe4, 0x46, 0x94, 0x64, 0x85, 0xf0, 0xd5, 0x47, 0xb5, 0x98, 0xbc, 0xd4, 0x64, 0x3f, 0xd1, - 0x1b, 0x90, 0x6e, 0xea, 0xfd, 0xbe, 0x66, 0x97, 0x72, 0x54, 0x76, 0x3d, 0x52, 0x96, 0x72, 0xd5, - 0x62, 0x32, 0xe7, 0x47, 0x07, 0x50, 0xec, 0x69, 0x96, 0xad, 0x58, 0x03, 0xd5, 0xb0, 0xba, 0xba, - 0x6d, 0x95, 0xf2, 0x54, 0xc3, 0xf3, 0x51, 0x1a, 0x1e, 0x68, 0x96, 0x7d, 0xec, 0x30, 0xd7, 0x62, - 0x72, 0xa1, 0xe7, 0x27, 0x10, 0x7d, 0x7a, 0xbb, 0x8d, 0x4d, 0x57, 0x61, 0xa9, 0x30, 0x5d, 0xdf, - 0x21, 0xe1, 0x76, 0xe4, 0x89, 0x3e, 0xdd, 0x4f, 0x40, 0xff, 0x0b, 0xab, 0x3d, 0x5d, 0x6d, 0xb9, - 0xea, 0x94, 0x66, 0x77, 0x38, 0x78, 0x52, 0x2a, 0x52, 0xa5, 0x2f, 0x45, 0x0e, 0x52, 0x57, 0x5b, - 0x8e, 0x8a, 0x0a, 0x11, 0xa8, 0xc5, 0xe4, 0x95, 0xde, 0x38, 0x11, 0xbd, 0x07, 0x6b, 0xaa, 0x61, - 0xf4, 0x4e, 0xc7, 0xb5, 0x2f, 0x53, 0xed, 0x57, 0xa3, 0xb4, 0xef, 0x10, 0x99, 0x71, 0xf5, 0x48, - 0x9d, 0xa0, 0xa2, 0x3a, 0x88, 0x86, 0x89, 0x0d, 0xd5, 0xc4, 0x8a, 0x61, 0xea, 0x86, 0x6e, 0xa9, - 0xbd, 0x92, 0x48, 0x75, 0xbf, 0x18, 0xa5, 0xfb, 0x88, 0xf1, 0x1f, 0x71, 0xf6, 0x5a, 0x4c, 0x5e, - 0x36, 0x82, 0x24, 0xa6, 0x55, 0x6f, 0x62, 0xcb, 0xf2, 0xb4, 0xae, 0xcc, 0xd2, 0x4a, 0xf9, 0x83, - 0x5a, 0x03, 0x24, 0x54, 0x85, 0x1c, 0x1e, 0x11, 0x71, 0xe5, 0x44, 0xb7, 0x71, 0x09, 0x51, 0x85, - 0x52, 0xe4, 0x0e, 0xa5, 0xac, 0x8f, 0x74, 0x1b, 0xd7, 0x62, 0x32, 0x60, 0xb7, 0x85, 0x54, 0x38, - 0x73, 0x82, 0x4d, 0xad, 0x7d, 0x4a, 0xd5, 0x28, 0xf4, 0x8b, 0xa5, 0xe9, 0x83, 0xd2, 0x2a, 0x55, - 0x78, 0x2d, 0x4a, 0xe1, 0x23, 0x2a, 0x44, 0x54, 0x54, 0x1d, 0x91, 0x5a, 0x4c, 0x5e, 0x3d, 0x99, - 0x24, 0x13, 0x17, 0x6b, 0x6b, 0x03, 0xb5, 0xa7, 0x7d, 0x8c, 0x95, 0x46, 0x4f, 0x6f, 0x3e, 0x29, - 0xad, 0x4d, 0x77, 0xb1, 0xbb, 0x9c, 0x7b, 0x97, 0x30, 0x13, 0x17, 0x6b, 0xfb, 0x09, 0x08, 0xc3, - 0xb9, 0xa6, 0x89, 0x55, 0x1b, 0x2b, 0xec, 0xf4, 0x52, 0x4c, 0x6c, 0x0d, 0x7b, 0x36, 0xd9, 0x89, - 0x67, 0xa8, 0xe2, 0x97, 0x23, 0x77, 0x13, 0x15, 0x3b, 0xa4, 0x52, 0x32, 0x15, 0xa2, 0xdb, 0x72, - 0xad, 0x19, 0x42, 0x47, 0xff, 0x0d, 0xa8, 0x8d, 0xed, 0x66, 0xd7, 0xe9, 0x85, 0xd8, 0xc7, 0x2a, - 0x9d, 0xa5, 0x3d, 0x5c, 0x89, 0x1c, 0x3a, 0x91, 0x60, 0x8a, 0x88, 0x11, 0xc8, 0x86, 0x13, 0xdb, - 0x63, 0x34, 0x6a, 0x73, 0x76, 0x94, 0xe3, 0xa0, 0xf2, 0x73, 0x33, 0x6c, 0xce, 0x85, 0x82, 0xfa, - 0x57, 0x4f, 0x26, 0xc9, 0xbb, 0x4b, 0x90, 0x3a, 0x51, 0x7b, 0x43, 0xbc, 0x9f, 0xcc, 0x24, 0xc5, - 0xd4, 0x7e, 0x32, 0xb3, 0x24, 0x66, 0xf6, 0x93, 0x99, 0xac, 0x08, 0xfb, 0xc9, 0x0c, 0x88, 0x39, - 0xe9, 0x45, 0xc8, 0xf9, 0x0e, 0x6f, 0x54, 0x82, 0xa5, 0x3e, 0xb6, 0x2c, 0xb5, 0x83, 0xe9, 0x59, - 0x9f, 0x95, 0x9d, 0xa6, 0x54, 0x84, 0xbc, 0xff, 0xc0, 0x96, 0x3e, 0x13, 0x5c, 0x49, 0x72, 0x16, - 0x13, 0xc9, 0x13, 0x6c, 0x52, 0x97, 0xe1, 0x92, 0xbc, 0x89, 0x9e, 0x83, 0x02, 0x5d, 0x6e, 0xc5, - 0xf9, 0x4e, 0x02, 0x42, 0x52, 0xce, 0x53, 0xe2, 0x23, 0xce, 0xb4, 0x01, 0x39, 0xe3, 0xba, 0xe1, - 0xb2, 0x24, 0x28, 0x0b, 0x18, 0xd7, 0x0d, 0x87, 0xe1, 0x32, 0xe4, 0x89, 0x0d, 0x5c, 0x8e, 0x24, - 0xed, 0x24, 0x47, 0x68, 0x9c, 0x45, 0xfa, 0x43, 0x1c, 0xc4, 0xf1, 0x43, 0x1e, 0xbd, 0x01, 0x49, - 0x12, 0x0e, 0x79, 0xe8, 0x2a, 0x6f, 0xb1, 0x58, 0xb9, 0xe5, 0xc4, 0xca, 0xad, 0xba, 0x13, 0x2b, - 0x77, 0x33, 0x5f, 0x7e, 0xbd, 0x11, 0xfb, 0xec, 0x4f, 0x1b, 0x82, 0x4c, 0x25, 0xd0, 0x79, 0x72, - 0xb4, 0xab, 0xda, 0x40, 0xd1, 0x5a, 0x74, 0xc8, 0x59, 0x72, 0x6e, 0xab, 0xda, 0x60, 0xaf, 0x85, - 0x1e, 0x80, 0xd8, 0xd4, 0x07, 0x16, 0x1e, 0x58, 0x43, 0x4b, 0x61, 0xd1, 0x9a, 0x07, 0xac, 0x40, - 0xd8, 0x61, 0xe1, 0xb4, 0xe2, 0x70, 0x1e, 0x51, 0x46, 0x79, 0xb9, 0x19, 0x24, 0xa0, 0xbb, 0x00, - 0x6e, 0x48, 0xb7, 0x4a, 0xc9, 0xcd, 0xc4, 0x95, 0xdc, 0xf5, 0xcd, 0x89, 0xc5, 0x7f, 0xe4, 0xb0, - 0x3c, 0x34, 0xc8, 0x2a, 0xef, 0x26, 0xc9, 0x70, 0x65, 0x9f, 0x24, 0x7a, 0x01, 0x96, 0x55, 0xc3, - 0x50, 0x2c, 0x9b, 0x38, 0x54, 0xe3, 0x94, 0x78, 0x12, 0x89, 0x85, 0x79, 0xb9, 0xa0, 0x1a, 0xc6, - 0x31, 0xa1, 0xee, 0x12, 0x22, 0x7a, 0x1e, 0x8a, 0x24, 0xee, 0x69, 0x6a, 0x4f, 0xe9, 0x62, 0xad, - 0xd3, 0xb5, 0x69, 0xcc, 0x4b, 0xc8, 0x05, 0x4e, 0xad, 0x51, 0xa2, 0xd4, 0x72, 0x57, 0x9c, 0xc6, - 0x3c, 0x84, 0x20, 0xd9, 0x52, 0x6d, 0x95, 0x5a, 0x32, 0x2f, 0xd3, 0xdf, 0x84, 0x66, 0xa8, 0x76, - 0x97, 0xdb, 0x87, 0xfe, 0x46, 0x67, 0x21, 0xcd, 0xd5, 0x26, 0xa8, 0x5a, 0xde, 0x42, 0x6b, 0x90, - 0x32, 0x4c, 0xfd, 0x04, 0xd3, 0xa5, 0xcb, 0xc8, 0xac, 0x21, 0xc9, 0x50, 0x0c, 0xc6, 0x47, 0x54, - 0x84, 0xb8, 0x3d, 0xe2, 0xbd, 0xc4, 0xed, 0x11, 0x7a, 0x15, 0x92, 0xc4, 0x90, 0xb4, 0x8f, 0x62, - 0x48, 0x46, 0xc0, 0xe5, 0xea, 0xa7, 0x06, 0x96, 0x29, 0xa7, 0xb4, 0x0c, 0x85, 0x40, 0xdc, 0x94, - 0xce, 0xc2, 0x5a, 0x58, 0x18, 0x94, 0xba, 0x2e, 0x3d, 0x10, 0xce, 0xd0, 0x4d, 0xc8, 0xb8, 0x71, - 0x90, 0x39, 0xce, 0xf9, 0x89, 0x6e, 0x1d, 0x66, 0xd9, 0x65, 0x25, 0x1e, 0x43, 0x16, 0xa0, 0xab, - 0xf2, 0xac, 0x27, 0x2f, 0x2f, 0xa9, 0x86, 0x51, 0x53, 0xad, 0xae, 0xf4, 0x3e, 0x94, 0xa2, 0x62, - 0x9c, 0xcf, 0x60, 0x02, 0x75, 0x7b, 0xc7, 0x60, 0x67, 0x21, 0xdd, 0xd6, 0xcd, 0xbe, 0x6a, 0x53, - 0x65, 0x05, 0x99, 0xb7, 0x88, 0x21, 0x59, 0xbc, 0x4b, 0x50, 0x32, 0x6b, 0x48, 0x0a, 0x9c, 0x8f, - 0x8c, 0x73, 0x44, 0x44, 0x1b, 0xb4, 0x30, 0x33, 0x6b, 0x41, 0x66, 0x0d, 0x4f, 0x11, 0x1b, 0x2c, - 0x6b, 0x90, 0x6e, 0x2d, 0x3a, 0x57, 0xaa, 0x3f, 0x2b, 0xf3, 0x96, 0xf4, 0x79, 0x02, 0xce, 0x86, - 0x47, 0x3b, 0xb4, 0x09, 0xf9, 0xbe, 0x3a, 0x52, 0xec, 0x11, 0x77, 0x3b, 0x81, 0x2e, 0x3c, 0xf4, - 0xd5, 0x51, 0x7d, 0xc4, 0x7c, 0x4e, 0x84, 0x84, 0x3d, 0xb2, 0x4a, 0xf1, 0xcd, 0xc4, 0x95, 0xbc, - 0x4c, 0x7e, 0xa2, 0x87, 0xb0, 0xd2, 0xd3, 0x9b, 0x6a, 0x4f, 0xe9, 0xa9, 0x96, 0xad, 0xf0, 0x34, - 0x88, 0x6d, 0xa2, 0xe7, 0x26, 0x8c, 0xcd, 0xe2, 0x16, 0x6e, 0xb1, 0xf5, 0x24, 0x07, 0x0e, 0xf7, - 0xff, 0x65, 0xaa, 0xe3, 0x81, 0xea, 0x2c, 0x35, 0xba, 0x03, 0xb9, 0xbe, 0x66, 0x35, 0x70, 0x57, - 0x3d, 0xd1, 0x74, 0x93, 0xef, 0xa6, 0x49, 0xa7, 0x79, 0xdb, 0xe3, 0xe1, 0x9a, 0xfc, 0x62, 0xbe, - 0x25, 0x49, 0x05, 0x7c, 0xd8, 0x39, 0x4d, 0xd2, 0x0b, 0x9f, 0x26, 0xaf, 0xc2, 0xda, 0x00, 0x8f, - 0x6c, 0xc5, 0xdb, 0xaf, 0xcc, 0x4f, 0x96, 0xa8, 0xe9, 0x11, 0xf9, 0xe6, 0xee, 0x70, 0x8b, 0xb8, - 0x0c, 0x7a, 0x89, 0xe6, 0x0b, 0x86, 0x6e, 0x61, 0x53, 0x51, 0x5b, 0x2d, 0x13, 0x5b, 0x16, 0x4d, - 0x31, 0xf3, 0x34, 0x09, 0xa0, 0xf4, 0x1d, 0x46, 0x96, 0x7e, 0xe2, 0x5f, 0x9a, 0x60, 0x7e, 0xc0, - 0x0d, 0x2f, 0x78, 0x86, 0x3f, 0x86, 0x35, 0x2e, 0xdf, 0x0a, 0xd8, 0x9e, 0xe5, 0xe9, 0x17, 0x26, - 0xf7, 0xd7, 0xb8, 0xcd, 0x91, 0x23, 0x1e, 0x6d, 0xf6, 0xc4, 0xb3, 0x99, 0x1d, 0x41, 0x92, 0x1a, - 0x25, 0xc9, 0x8e, 0x18, 0xf2, 0xfb, 0x9f, 0x6d, 0x29, 0x3e, 0x49, 0xc0, 0xca, 0x44, 0xb2, 0xe5, - 0x4e, 0x4c, 0x08, 0x9d, 0x58, 0x3c, 0x74, 0x62, 0x89, 0x85, 0x27, 0xc6, 0xd7, 0x3a, 0x39, 0x7b, - 0xad, 0x53, 0xdf, 0xe3, 0x5a, 0xa7, 0x9f, 0x6d, 0xad, 0xff, 0xa1, 0xab, 0xf0, 0x33, 0x01, 0xca, - 0xd1, 0x19, 0x6a, 0xe8, 0x72, 0x5c, 0x83, 0x15, 0x77, 0x28, 0xae, 0x7a, 0x76, 0x30, 0x8a, 0xee, - 0x07, 0xae, 0x3f, 0x32, 0xc6, 0x3d, 0x0f, 0xc5, 0xb1, 0xfc, 0x99, 0xb9, 0x72, 0xe1, 0xc4, 0xdf, - 0xbf, 0xf4, 0xa3, 0x84, 0x1b, 0x78, 0x02, 0x49, 0x6e, 0xc8, 0x6e, 0x7d, 0x07, 0x56, 0x5b, 0xb8, - 0xa9, 0xb5, 0x9e, 0x75, 0xb3, 0xae, 0x70, 0xe9, 0x7f, 0xef, 0xd5, 0x49, 0x2f, 0xf9, 0xa5, 0x00, - 0x17, 0xa6, 0x5c, 0x09, 0x42, 0x55, 0x09, 0xa1, 0xaa, 0xd0, 0x3d, 0x28, 0x76, 0x74, 0xcb, 0xd2, - 0x0c, 0xdc, 0xe2, 0x49, 0x7c, 0x7c, 0x32, 0x8f, 0x63, 0x49, 0xfe, 0xd6, 0x3d, 0xce, 0x48, 0x53, - 0x74, 0xb9, 0xd0, 0xf1, 0x37, 0xa3, 0x3c, 0x4b, 0x3a, 0x0f, 0xe7, 0x22, 0xee, 0x16, 0xd2, 0x2d, - 0xcf, 0xd7, 0x27, 0xaf, 0x00, 0xe8, 0x02, 0x64, 0xf9, 0xe5, 0xc2, 0xcd, 0xaa, 0x32, 0x8c, 0x50, - 0x1f, 0x49, 0xbf, 0xcd, 0x43, 0x46, 0xc6, 0x96, 0x41, 0x32, 0x52, 0xb4, 0x0b, 0x59, 0x3c, 0x6a, - 0x62, 0xc3, 0x76, 0x92, 0xf8, 0xf0, 0x8b, 0x24, 0xe3, 0xae, 0x3a, 0x9c, 0xb5, 0x98, 0xec, 0x89, - 0xa1, 0x1b, 0x1c, 0x29, 0x8a, 0x06, 0x7d, 0xb8, 0xb8, 0x1f, 0x2a, 0x7a, 0xcd, 0x81, 0x8a, 0x12, - 0x91, 0x28, 0x08, 0x93, 0x1a, 0xc3, 0x8a, 0x6e, 0x70, 0xac, 0x28, 0x39, 0xa3, 0xb3, 0x00, 0x58, - 0x54, 0x09, 0x80, 0x45, 0xe9, 0x19, 0xd3, 0x8c, 0x40, 0x8b, 0x5e, 0x73, 0xd0, 0xa2, 0xa5, 0x19, - 0x23, 0x1e, 0x83, 0x8b, 0xde, 0xf2, 0xc1, 0x45, 0x59, 0x2a, 0xba, 0x19, 0x29, 0x1a, 0x82, 0x17, - 0xdd, 0x72, 0xf1, 0xa2, 0x7c, 0x24, 0xd6, 0xc4, 0x85, 0xc7, 0x01, 0xa3, 0xc3, 0x09, 0xc0, 0x88, - 0x01, 0x3c, 0x2f, 0x44, 0xaa, 0x98, 0x81, 0x18, 0x1d, 0x4e, 0x20, 0x46, 0xc5, 0x19, 0x0a, 0x67, - 0x40, 0x46, 0xff, 0x17, 0x0e, 0x19, 0x45, 0x83, 0x3a, 0x7c, 0x98, 0xf3, 0x61, 0x46, 0x4a, 0x04, - 0x66, 0x24, 0x46, 0xde, 0xb5, 0x99, 0xfa, 0xb9, 0x41, 0xa3, 0x87, 0x21, 0xa0, 0xd1, 0x4a, 0x24, - 0x4a, 0xc0, 0x94, 0xcf, 0x81, 0x1a, 0x3d, 0x0c, 0x41, 0x8d, 0xd0, 0x4c, 0xb5, 0x33, 0x61, 0xa3, - 0xbb, 0x41, 0xd8, 0x68, 0x35, 0x22, 0xef, 0xf6, 0x76, 0x7b, 0x04, 0x6e, 0xd4, 0x88, 0xc2, 0x8d, - 0xd6, 0x22, 0x21, 0x18, 0xa6, 0x71, 0x01, 0xe0, 0xe8, 0x70, 0x02, 0x38, 0x3a, 0x33, 0xc3, 0xd3, - 0x66, 0x20, 0x47, 0xed, 0x68, 0xe4, 0x88, 0xe1, 0x3a, 0xaf, 0x44, 0xef, 0xab, 0x45, 0xa0, 0xa3, - 0xc7, 0xa1, 0xd0, 0xd1, 0xb9, 0x48, 0x0c, 0x94, 0x0f, 0x7e, 0x1e, 0xec, 0xa8, 0x11, 0x85, 0x1d, - 0x95, 0x66, 0xd9, 0xfd, 0x99, 0xc0, 0xa3, 0x94, 0x98, 0xde, 0x4f, 0x66, 0x32, 0x62, 0x96, 0xc1, - 0x46, 0xfb, 0xc9, 0x4c, 0x4e, 0xcc, 0x4b, 0x2f, 0x91, 0x54, 0x77, 0x2c, 0x1c, 0x90, 0x4b, 0x25, - 0x36, 0x4d, 0xdd, 0xe4, 0x30, 0x10, 0x6b, 0x48, 0x57, 0x20, 0xef, 0x3f, 0xfa, 0xa7, 0x00, 0x4d, - 0xf4, 0xf2, 0xee, 0x3b, 0xee, 0xa5, 0x5f, 0x0b, 0x9e, 0x2c, 0x85, 0x9a, 0xfc, 0x40, 0x44, 0x96, - 0x03, 0x11, 0x3e, 0xf8, 0x29, 0x1e, 0x84, 0x9f, 0x36, 0x20, 0x47, 0x2e, 0xe5, 0x63, 0xc8, 0x92, - 0x6a, 0xb8, 0xc8, 0xd2, 0x55, 0x58, 0xa1, 0x99, 0x15, 0x03, 0xa9, 0x78, 0xf0, 0x4d, 0xd2, 0xe0, - 0xbb, 0x4c, 0x3e, 0x30, 0x27, 0x62, 0x89, 0xcc, 0x2b, 0xb0, 0xea, 0xe3, 0x75, 0x2f, 0xfb, 0x0c, - 0x66, 0x11, 0x5d, 0xee, 0x1d, 0x7e, 0xeb, 0xff, 0xbd, 0xe0, 0x59, 0xc8, 0x83, 0xa4, 0xc2, 0xd0, - 0x23, 0xe1, 0x7b, 0x42, 0x8f, 0xe2, 0xcf, 0x8c, 0x1e, 0xf9, 0xc1, 0x8b, 0x44, 0x10, 0xbc, 0xf8, - 0x9b, 0xe0, 0xad, 0x89, 0x8b, 0x05, 0x35, 0xf5, 0x16, 0xe6, 0x70, 0x02, 0xfd, 0x4d, 0x72, 0xd7, - 0x9e, 0xde, 0xe1, 0xa0, 0x01, 0xf9, 0x49, 0xb8, 0xdc, 0xf8, 0x9c, 0xe5, 0xe1, 0xd7, 0x45, 0x22, - 0x58, 0x86, 0xc8, 0x91, 0x08, 0x11, 0x12, 0x4f, 0x30, 0xab, 0xbd, 0xe4, 0x65, 0xf2, 0x93, 0xf0, - 0x51, 0xe7, 0xe3, 0x99, 0x1e, 0x6b, 0xa0, 0x37, 0x20, 0x4b, 0x0b, 0x6b, 0x8a, 0x6e, 0x58, 0xbc, - 0xde, 0x12, 0xc8, 0x81, 0x59, 0x75, 0x6d, 0xeb, 0x88, 0xf0, 0x1c, 0x1a, 0x96, 0x9c, 0x31, 0xf8, - 0x2f, 0x5f, 0x5e, 0x95, 0x0d, 0xa4, 0xa6, 0x17, 0x21, 0x4b, 0x46, 0x6f, 0x19, 0x6a, 0x13, 0x97, - 0x80, 0x0e, 0xd4, 0x23, 0x48, 0xbf, 0x8a, 0xc3, 0xf2, 0x58, 0x3c, 0x0e, 0x9d, 0xbb, 0xe3, 0x92, - 0x71, 0x1f, 0x36, 0x36, 0x9f, 0x3d, 0xd6, 0x01, 0x3a, 0xaa, 0xa5, 0x7c, 0xa4, 0x0e, 0x6c, 0xdc, - 0xe2, 0x46, 0xf1, 0x51, 0x50, 0x19, 0x32, 0xa4, 0x35, 0xb4, 0x70, 0x8b, 0xc3, 0x74, 0x6e, 0x1b, - 0xd5, 0x20, 0x8d, 0x4f, 0xf0, 0xc0, 0xb6, 0x4a, 0x4b, 0x74, 0xd9, 0xcf, 0x4e, 0xe2, 0x26, 0xe4, - 0xf3, 0x6e, 0x89, 0x2c, 0xf6, 0xb7, 0x5f, 0x6f, 0x88, 0x8c, 0xfb, 0x65, 0xbd, 0xaf, 0xd9, 0xb8, - 0x6f, 0xd8, 0xa7, 0x32, 0x97, 0x0f, 0x5a, 0x21, 0x33, 0x66, 0x05, 0x0a, 0x18, 0xe7, 0x1d, 0x1c, - 0x88, 0xd8, 0x54, 0xd3, 0x4d, 0xcd, 0x3e, 0x95, 0x0b, 0x7d, 0xdc, 0x37, 0x74, 0xbd, 0xa7, 0xb0, - 0x3d, 0xbe, 0x03, 0xc5, 0x60, 0xfa, 0x81, 0x9e, 0x83, 0x82, 0x89, 0x6d, 0x55, 0x1b, 0x28, 0x81, - 0x9c, 0x36, 0xcf, 0x88, 0x6c, 0x4f, 0xed, 0x27, 0x33, 0x82, 0x18, 0xdf, 0x4f, 0x66, 0xe2, 0x62, - 0x42, 0x3a, 0x82, 0x33, 0xa1, 0xe9, 0x07, 0x7a, 0x1d, 0xb2, 0x5e, 0xe6, 0x22, 0xd0, 0xd9, 0x4e, - 0x81, 0xe4, 0x3c, 0x5e, 0xe9, 0x77, 0x82, 0xa7, 0x32, 0x08, 0xf2, 0x55, 0x21, 0xcd, 0xce, 0x7d, - 0xba, 0x92, 0xc5, 0x29, 0x87, 0x7e, 0x40, 0x6e, 0x8b, 0x1d, 0xef, 0x32, 0x17, 0x96, 0xde, 0x83, - 0x34, 0xa3, 0xa0, 0x1c, 0x2c, 0x3d, 0x3c, 0xb8, 0x7f, 0x70, 0xf8, 0xee, 0x81, 0x18, 0x43, 0x00, - 0xe9, 0x9d, 0x4a, 0xa5, 0x7a, 0x54, 0x17, 0x05, 0x94, 0x85, 0xd4, 0xce, 0xee, 0xa1, 0x5c, 0x17, - 0xe3, 0x84, 0x2c, 0x57, 0xf7, 0xab, 0x95, 0xba, 0x98, 0x40, 0x2b, 0x50, 0x60, 0xbf, 0x95, 0xbb, - 0x87, 0xf2, 0xdb, 0x3b, 0x75, 0x31, 0xe9, 0x23, 0x1d, 0x57, 0x0f, 0xee, 0x54, 0x65, 0x31, 0x25, - 0xfd, 0x07, 0x9c, 0x8f, 0x4c, 0x75, 0x3c, 0x04, 0x4f, 0xf0, 0x21, 0x78, 0xd2, 0xe7, 0x71, 0x72, - 0x23, 0x88, 0xca, 0x5f, 0xd0, 0xfe, 0xd8, 0xc4, 0xaf, 0x2f, 0x90, 0xfc, 0x8c, 0xcd, 0x9e, 0x5c, - 0x78, 0x4d, 0xcc, 0x82, 0x1c, 0xed, 0x9b, 0x9d, 0x40, 0x05, 0xb9, 0xc0, 0xa9, 0x54, 0xc8, 0x62, - 0x6c, 0x1f, 0xe0, 0xa6, 0xad, 0x30, 0x27, 0xb2, 0xe8, 0xad, 0x33, 0x4b, 0xd8, 0x08, 0xf5, 0x98, - 0x11, 0xa5, 0xf7, 0x17, 0xb2, 0x65, 0x16, 0x52, 0x72, 0xb5, 0x2e, 0x3f, 0x16, 0x13, 0x08, 0x41, - 0x91, 0xfe, 0x54, 0x8e, 0x0f, 0x76, 0x8e, 0x8e, 0x6b, 0x87, 0xc4, 0x96, 0xab, 0xb0, 0xec, 0xd8, - 0xd2, 0x21, 0xa6, 0xa4, 0x6b, 0xe4, 0x1a, 0x15, 0x9a, 0x7c, 0x4d, 0xde, 0xbd, 0xa5, 0x9f, 0x0b, - 0x7e, 0xee, 0x60, 0x02, 0x75, 0x08, 0x69, 0xcb, 0x56, 0xed, 0xa1, 0xc5, 0x8d, 0xf8, 0xfa, 0xbc, - 0xd9, 0xd8, 0x96, 0xf3, 0xe3, 0x98, 0x8a, 0xcb, 0x5c, 0x8d, 0x74, 0x13, 0x8a, 0xc1, 0x2f, 0xd1, - 0x36, 0xf0, 0x9c, 0x28, 0x2e, 0xdd, 0x06, 0x34, 0x99, 0xa4, 0x85, 0xe0, 0x10, 0x42, 0x18, 0x0e, - 0xf1, 0x0b, 0x7a, 0x01, 0x8e, 0x4c, 0xc8, 0xd0, 0x3b, 0x63, 0x93, 0xbc, 0xb5, 0x48, 0x3a, 0xb7, - 0xc5, 0x68, 0x63, 0xd3, 0xbc, 0x01, 0x79, 0x3f, 0x7d, 0xbe, 0x49, 0x7e, 0x1b, 0xf7, 0x36, 0x71, - 0x10, 0x30, 0xf1, 0x8e, 0x40, 0xe1, 0x3b, 0x1e, 0x81, 0x6f, 0x02, 0xd8, 0x23, 0x9e, 0x09, 0x3a, - 0x71, 0xf4, 0x52, 0x08, 0x10, 0x8d, 0x9b, 0xf5, 0x11, 0xdf, 0x04, 0x59, 0x9b, 0xff, 0xb2, 0xd0, - 0xb1, 0x1f, 0x3d, 0x1a, 0xd2, 0x18, 0x6b, 0x71, 0x64, 0x65, 0xde, 0x60, 0xec, 0xa1, 0x4c, 0x8c, - 0x6c, 0xa1, 0xc7, 0x70, 0x6e, 0x2c, 0x51, 0x70, 0x55, 0x27, 0xe7, 0xcd, 0x17, 0xce, 0x04, 0xf3, - 0x05, 0x47, 0xb5, 0x3f, 0xda, 0xa7, 0x82, 0xd1, 0xfe, 0x2d, 0xb8, 0x38, 0x2d, 0xdb, 0x45, 0x97, - 0x00, 0xf0, 0x80, 0x04, 0x87, 0x96, 0x87, 0x28, 0x64, 0x39, 0xa5, 0x3e, 0x92, 0xee, 0x41, 0x29, - 0x2a, 0x93, 0x45, 0xd7, 0x20, 0x49, 0xaf, 0x1b, 0x2c, 0xdb, 0x39, 0x17, 0x82, 0x8d, 0x10, 0x3e, - 0x99, 0x32, 0x49, 0xbf, 0xf1, 0x3b, 0x67, 0x08, 0xb0, 0x71, 0x15, 0x56, 0x9c, 0x71, 0x8c, 0x03, - 0x1c, 0xcb, 0xfc, 0xc3, 0x21, 0xc7, 0x39, 0xd0, 0x7d, 0xd7, 0x91, 0x59, 0x15, 0xe9, 0xc6, 0x22, - 0xf9, 0xf1, 0xd6, 0x98, 0x0b, 0x5f, 0x86, 0x34, 0x77, 0x5e, 0x80, 0xb4, 0xda, 0xb0, 0xf0, 0xc0, - 0x16, 0x63, 0xc4, 0x91, 0x0d, 0x13, 0xd3, 0x86, 0x20, 0x3d, 0x06, 0xf0, 0x90, 0x38, 0x72, 0x4a, - 0x9b, 0xfa, 0x70, 0xd0, 0xa2, 0xa3, 0x4b, 0xc9, 0xac, 0x81, 0x6e, 0x42, 0xca, 0x8f, 0x14, 0x4d, - 0x86, 0x33, 0xd2, 0xb9, 0x0f, 0xc9, 0x63, 0xdc, 0x92, 0x06, 0x68, 0xb2, 0x1a, 0x12, 0xd1, 0xc5, - 0x5b, 0xc1, 0x2e, 0x2e, 0x47, 0xd6, 0x55, 0xc2, 0xbb, 0xfa, 0x18, 0x52, 0x74, 0xf7, 0x90, 0xc4, - 0x85, 0x96, 0xe0, 0x78, 0xc6, 0x4d, 0x7e, 0xa3, 0xff, 0x07, 0x50, 0x6d, 0xdb, 0xd4, 0x1a, 0x43, - 0xaf, 0x83, 0x8d, 0xf0, 0xdd, 0xb7, 0xe3, 0xf0, 0xed, 0x5e, 0xe4, 0xdb, 0x70, 0xcd, 0x13, 0xf5, - 0x6d, 0x45, 0x9f, 0x42, 0xe9, 0x00, 0x8a, 0x41, 0x59, 0x27, 0x47, 0x64, 0x63, 0x08, 0xe6, 0x88, - 0x2c, 0xe5, 0xe7, 0x39, 0xa2, 0x9b, 0x61, 0x26, 0x58, 0x9d, 0x91, 0x36, 0xa4, 0x1f, 0xc4, 0x21, - 0xef, 0xdf, 0xbc, 0xff, 0x7a, 0x69, 0x9c, 0xf4, 0x63, 0x01, 0x32, 0xee, 0xf4, 0x83, 0x45, 0xc7, - 0x40, 0x95, 0x96, 0x59, 0x2f, 0xee, 0xaf, 0x14, 0xb2, 0x9a, 0x6c, 0xc2, 0xad, 0xc9, 0xde, 0x76, - 0x53, 0x88, 0x28, 0xec, 0xcd, 0x6f, 0x6b, 0xee, 0x55, 0x4e, 0xc6, 0x74, 0x1b, 0xb2, 0xee, 0x09, - 0x48, 0x2e, 0x6e, 0x41, 0x68, 0xd5, 0x69, 0xd2, 0x7a, 0xb1, 0xfe, 0x11, 0x2f, 0x43, 0x26, 0x64, - 0xd6, 0x90, 0x5a, 0xb0, 0x3c, 0x76, 0x7c, 0xa2, 0xdb, 0xb0, 0x64, 0x0c, 0x1b, 0x8a, 0xe3, 0x1c, - 0x63, 0x58, 0xb6, 0x73, 0x25, 0x18, 0x36, 0x7a, 0x5a, 0xf3, 0x3e, 0x3e, 0x75, 0x06, 0x63, 0x0c, - 0x1b, 0xf7, 0x99, 0x0f, 0xb1, 0x5e, 0xe2, 0xfe, 0x5e, 0x7e, 0x2a, 0x40, 0xc6, 0xd9, 0x13, 0xe8, - 0xbf, 0x20, 0xeb, 0x1e, 0xcd, 0xee, 0x3b, 0x82, 0xc8, 0x33, 0x9d, 0xeb, 0xf7, 0x44, 0xd0, 0x8e, - 0xf3, 0x00, 0x42, 0x6b, 0x29, 0xed, 0x9e, 0xca, 0x7c, 0xa9, 0x18, 0xb4, 0x19, 0x3b, 0xbc, 0x69, - 0x4c, 0xdb, 0xbb, 0x73, 0xb7, 0xa7, 0x76, 0xe4, 0x1c, 0x95, 0xd9, 0x6b, 0x91, 0x06, 0xcf, 0x8e, - 0xff, 0x2a, 0x80, 0x38, 0xbe, 0x63, 0xbf, 0xf3, 0xe8, 0x26, 0x53, 0x85, 0x44, 0x48, 0xaa, 0x80, - 0xb6, 0x61, 0xd5, 0xe5, 0x50, 0x2c, 0xad, 0x33, 0x50, 0xed, 0xa1, 0x89, 0x39, 0xfa, 0x8f, 0xdc, - 0x4f, 0xc7, 0xce, 0x97, 0xc9, 0x59, 0xa7, 0x9e, 0x71, 0xd6, 0x9f, 0xc4, 0x21, 0xe7, 0xab, 0x45, - 0xa0, 0xff, 0xf4, 0x1d, 0x46, 0xc5, 0x90, 0xe8, 0xea, 0xe3, 0xf5, 0xde, 0x04, 0x04, 0xcd, 0x14, - 0x5f, 0xdc, 0x4c, 0x51, 0x15, 0x1f, 0xa7, 0xb4, 0x91, 0x5c, 0xb8, 0xb4, 0xf1, 0x32, 0x20, 0x5b, - 0xb7, 0xd5, 0x9e, 0x72, 0xa2, 0xdb, 0xda, 0xa0, 0xa3, 0x30, 0x37, 0x64, 0x47, 0x87, 0x48, 0xbf, - 0x3c, 0xa2, 0x1f, 0x8e, 0xa8, 0x47, 0xfe, 0x50, 0x80, 0x8c, 0x7b, 0x75, 0x59, 0xf4, 0xc5, 0xc0, - 0x59, 0x48, 0xf3, 0xec, 0x9c, 0x3d, 0x19, 0xe0, 0xad, 0xd0, 0x1a, 0x4e, 0x19, 0x32, 0x7d, 0x6c, - 0xab, 0xf4, 0x1c, 0x64, 0x99, 0x81, 0xdb, 0xbe, 0x7a, 0x0b, 0x72, 0xbe, 0xd7, 0x16, 0xe4, 0x68, - 0x3c, 0xa8, 0xbe, 0x2b, 0xc6, 0xca, 0x4b, 0x9f, 0x7e, 0xb1, 0x99, 0x38, 0xc0, 0x1f, 0x91, 0xdd, - 0x2c, 0x57, 0x2b, 0xb5, 0x6a, 0xe5, 0xbe, 0x28, 0x94, 0x73, 0x9f, 0x7e, 0xb1, 0xb9, 0x24, 0x63, - 0x0a, 0x5e, 0x5f, 0xbd, 0x0f, 0xcb, 0x63, 0x0b, 0x13, 0x4c, 0xfd, 0x10, 0x14, 0xef, 0x3c, 0x3c, - 0x7a, 0xb0, 0x57, 0xd9, 0xa9, 0x57, 0x95, 0x47, 0x87, 0xf5, 0xaa, 0x28, 0xa0, 0x73, 0xb0, 0xfa, - 0x60, 0xef, 0x5e, 0xad, 0xae, 0x54, 0x1e, 0xec, 0x55, 0x0f, 0xea, 0xca, 0x4e, 0xbd, 0xbe, 0x53, - 0xb9, 0x2f, 0xc6, 0xaf, 0xff, 0xa5, 0x00, 0xc9, 0x9d, 0xdd, 0xca, 0x1e, 0xaa, 0x40, 0x92, 0xc2, - 0x49, 0x53, 0x9f, 0xa4, 0x96, 0xa7, 0x97, 0x21, 0xd0, 0x5d, 0x48, 0x51, 0xa4, 0x09, 0x4d, 0x7f, - 0xa3, 0x5a, 0x9e, 0x51, 0x97, 0x20, 0x83, 0xa1, 0x3b, 0x72, 0xea, 0xa3, 0xd5, 0xf2, 0xf4, 0x32, - 0x05, 0x7a, 0x00, 0x4b, 0x0e, 0xd0, 0x30, 0xeb, 0x25, 0x69, 0x79, 0x66, 0xed, 0x80, 0x4c, 0x8d, - 0x01, 0x36, 0xd3, 0xdf, 0xb3, 0x96, 0x67, 0x14, 0x30, 0xd0, 0x1e, 0xa4, 0xf9, 0x95, 0x7e, 0xc6, - 0x13, 0xd5, 0xf2, 0xac, 0x92, 0x04, 0x92, 0x21, 0xeb, 0x41, 0x61, 0xb3, 0x5f, 0xe9, 0x96, 0xe7, - 0xa8, 0xcd, 0xa0, 0xf7, 0xa0, 0x10, 0x84, 0x0b, 0xe6, 0x7b, 0x06, 0x5b, 0x9e, 0xb3, 0xf8, 0x41, - 0xf4, 0x07, 0xb1, 0x83, 0xf9, 0x9e, 0xc5, 0x96, 0xe7, 0xac, 0x85, 0xa0, 0x0f, 0x60, 0x65, 0xf2, - 0x6e, 0x3f, 0xff, 0x2b, 0xd9, 0xf2, 0x02, 0xd5, 0x11, 0xd4, 0x07, 0x14, 0x82, 0x09, 0x2c, 0xf0, - 0x68, 0xb6, 0xbc, 0x48, 0xb1, 0x04, 0xb5, 0x60, 0x79, 0xfc, 0xa2, 0x3d, 0xef, 0x23, 0xda, 0xf2, - 0xdc, 0x85, 0x13, 0xd6, 0x4b, 0xf0, 0x82, 0x3e, 0xef, 0xa3, 0xda, 0xf2, 0xdc, 0x75, 0x14, 0xf4, - 0x10, 0xc0, 0x77, 0xc7, 0x9e, 0xe3, 0x91, 0x6d, 0x79, 0x9e, 0x8a, 0x0a, 0x32, 0x60, 0x35, 0xec, - 0xf2, 0xbd, 0xc8, 0x9b, 0xdb, 0xf2, 0x42, 0x85, 0x16, 0xe2, 0xcf, 0xc1, 0x6b, 0xf4, 0x7c, 0x6f, - 0x70, 0xcb, 0x73, 0x56, 0x5c, 0x90, 0x05, 0x6b, 0xa1, 0x57, 0xc7, 0x85, 0x5e, 0xe4, 0x96, 0x17, - 0xab, 0xc2, 0xa0, 0x0e, 0x88, 0x13, 0x17, 0xce, 0xb9, 0x1f, 0xe8, 0x96, 0xe7, 0xaf, 0xc7, 0xd0, - 0xf5, 0x0a, 0xb9, 0x8f, 0x2e, 0xf2, 0x5e, 0xb7, 0xbc, 0x50, 0x81, 0x66, 0x77, 0xe7, 0xcb, 0x6f, - 0xd6, 0x85, 0xaf, 0xbe, 0x59, 0x17, 0xfe, 0xfc, 0xcd, 0xba, 0xf0, 0xd9, 0xd3, 0xf5, 0xd8, 0x57, - 0x4f, 0xd7, 0x63, 0x7f, 0x7c, 0xba, 0x1e, 0xfb, 0x9f, 0x17, 0x3b, 0x9a, 0xdd, 0x1d, 0x36, 0xb6, - 0x9a, 0x7a, 0x7f, 0xbb, 0xa9, 0xf7, 0xb1, 0xdd, 0x68, 0xdb, 0xde, 0x0f, 0xef, 0x9f, 0x2b, 0x8d, - 0x34, 0xcd, 0x48, 0x6e, 0xfc, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x1d, 0x43, 0x6c, 0xa3, 0xd9, 0x32, - 0x00, 0x00, + // 3386 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xbd, 0x73, 0x1b, 0xc7, + 0x15, 0xc7, 0xe1, 0x8b, 0xc0, 0xc3, 0x07, 0x8f, 0x4b, 0x4a, 0x82, 0x60, 0x89, 0xa4, 0xcf, 0x63, + 0x5b, 0x96, 0x6c, 0xd2, 0x91, 0x22, 0x7f, 0x8c, 0xec, 0xcc, 0x80, 0x10, 0x24, 0x90, 0x92, 0x49, + 0xfa, 0x08, 0xca, 0x51, 0x3e, 0x7c, 0x3e, 0x02, 0x0b, 0xe0, 0x2c, 0x00, 0x77, 0xbe, 0x3b, 0xd0, + 0xa0, 0x2b, 0x4f, 0x9c, 0xcc, 0x64, 0x5c, 0x79, 0x26, 0x8d, 0x8b, 0xb8, 0x48, 0x91, 0x22, 0xf9, + 0x0b, 0x52, 0xa5, 0x4a, 0xe1, 0x22, 0x85, 0xbb, 0xa4, 0x72, 0x32, 0x76, 0xe7, 0x36, 0x45, 0x8a, + 0x34, 0x99, 0xfd, 0xb8, 0x2f, 0xe0, 0x0e, 0x1f, 0xb2, 0x53, 0x64, 0x92, 0xee, 0xf6, 0xe1, 0xbd, + 0xb7, 0xbb, 0x6f, 0xdf, 0xee, 0x7b, 0xef, 0xb7, 0x0b, 0x78, 0xc2, 0xc6, 0x83, 0x16, 0x36, 0xfb, + 0xda, 0xc0, 0xde, 0x56, 0x4f, 0x9a, 0xda, 0xb6, 0x7d, 0x66, 0x60, 0x6b, 0xcb, 0x30, 0x75, 0x5b, + 0x47, 0xcb, 0xde, 0x8f, 0x5b, 0xe4, 0xc7, 0xf2, 0x65, 0x1f, 0x77, 0xd3, 0x3c, 0x33, 0x6c, 0x7d, + 0xdb, 0x30, 0x75, 0xbd, 0xcd, 0xf8, 0xcb, 0x97, 0x26, 0x7f, 0x7e, 0x84, 0xcf, 0xb8, 0xb6, 0x80, + 0x30, 0xed, 0x65, 0xdb, 0x50, 0x4d, 0xb5, 0xef, 0xfc, 0xbc, 0x39, 0xf1, 0xf3, 0xa9, 0xda, 0xd3, + 0x5a, 0xaa, 0xad, 0x9b, 0x9c, 0x63, 0xa3, 0xa3, 0xeb, 0x9d, 0x1e, 0xde, 0xa6, 0xad, 0x93, 0x61, + 0x7b, 0xdb, 0xd6, 0xfa, 0xd8, 0xb2, 0xd5, 0xbe, 0xc1, 0x19, 0xd6, 0x3a, 0x7a, 0x47, 0xa7, 0x9f, + 0xdb, 0xe4, 0x2b, 0xa4, 0x5f, 0xdd, 0x54, 0x9b, 0x3d, 0xec, 0x9f, 0xa4, 0xf4, 0x61, 0x0e, 0x96, + 0x64, 0xfc, 0xde, 0x10, 0x5b, 0x36, 0xba, 0x0e, 0x49, 0xdc, 0xec, 0xea, 0x25, 0x61, 0x53, 0xb8, + 0x92, 0xbb, 0x7e, 0x69, 0x6b, 0x6c, 0xfe, 0x5b, 0x9c, 0xaf, 0xd6, 0xec, 0xea, 0xf5, 0x98, 0x4c, + 0x79, 0xd1, 0x4d, 0x48, 0xb5, 0x7b, 0x43, 0xab, 0x5b, 0x8a, 0x53, 0xa1, 0xcb, 0x51, 0x42, 0x77, + 0x08, 0x53, 0x3d, 0x26, 0x33, 0x6e, 0xd2, 0x95, 0x36, 0x68, 0xeb, 0xa5, 0xc4, 0xf4, 0xae, 0x76, + 0x07, 0x6d, 0xda, 0x15, 0xe1, 0x45, 0x3b, 0x00, 0xda, 0x40, 0xb3, 0x95, 0x66, 0x57, 0xd5, 0x06, + 0xa5, 0x14, 0x95, 0x7c, 0x32, 0x5a, 0x52, 0xb3, 0xab, 0x84, 0xb1, 0x1e, 0x93, 0xb3, 0x9a, 0xd3, + 0x20, 0xc3, 0x7d, 0x6f, 0x88, 0xcd, 0xb3, 0x52, 0x7a, 0xfa, 0x70, 0xdf, 0x24, 0x4c, 0x64, 0xb8, + 0x94, 0x1b, 0xbd, 0x06, 0x99, 0x66, 0x17, 0x37, 0x1f, 0x29, 0xf6, 0xa8, 0x94, 0xa1, 0x92, 0x1b, + 0x51, 0x92, 0x55, 0xc2, 0xd7, 0x18, 0xd5, 0x63, 0xf2, 0x52, 0x93, 0x7d, 0xa2, 0x57, 0x20, 0xdd, + 0xd4, 0xfb, 0x7d, 0xcd, 0x2e, 0xe5, 0xa8, 0xec, 0x7a, 0xa4, 0x2c, 0xe5, 0xaa, 0xc7, 0x64, 0xce, + 0x8f, 0xf6, 0xa1, 0xd8, 0xd3, 0x2c, 0x5b, 0xb1, 0x06, 0xaa, 0x61, 0x75, 0x75, 0xdb, 0x2a, 0xe5, + 0xa9, 0x86, 0xa7, 0xa3, 0x34, 0xdc, 0xd7, 0x2c, 0xfb, 0xc8, 0x61, 0xae, 0xc7, 0xe4, 0x42, 0xcf, + 0x4f, 0x20, 0xfa, 0xf4, 0x76, 0x1b, 0x9b, 0xae, 0xc2, 0x52, 0x61, 0xba, 0xbe, 0x03, 0xc2, 0xed, + 0xc8, 0x13, 0x7d, 0xba, 0x9f, 0x80, 0x7e, 0x0c, 0xab, 0x3d, 0x5d, 0x6d, 0xb9, 0xea, 0x94, 0x66, + 0x77, 0x38, 0x78, 0x54, 0x2a, 0x52, 0xa5, 0xcf, 0x45, 0x0e, 0x52, 0x57, 0x5b, 0x8e, 0x8a, 0x2a, + 0x11, 0xa8, 0xc7, 0xe4, 0x95, 0xde, 0x38, 0x11, 0xbd, 0x0d, 0x6b, 0xaa, 0x61, 0xf4, 0xce, 0xc6, + 0xb5, 0x2f, 0x53, 0xed, 0x57, 0xa3, 0xb4, 0x57, 0x88, 0xcc, 0xb8, 0x7a, 0xa4, 0x4e, 0x50, 0x51, + 0x03, 0x44, 0xc3, 0xc4, 0x86, 0x6a, 0x62, 0xc5, 0x30, 0x75, 0x43, 0xb7, 0xd4, 0x5e, 0x49, 0xa4, + 0xba, 0x9f, 0x8d, 0xd2, 0x7d, 0xc8, 0xf8, 0x0f, 0x39, 0x7b, 0x3d, 0x26, 0x2f, 0x1b, 0x41, 0x12, + 0xd3, 0xaa, 0x37, 0xb1, 0x65, 0x79, 0x5a, 0x57, 0x66, 0x69, 0xa5, 0xfc, 0x41, 0xad, 0x01, 0x12, + 0xaa, 0x41, 0x0e, 0x8f, 0x88, 0xb8, 0x72, 0xaa, 0xdb, 0xb8, 0x84, 0xa8, 0x42, 0x29, 0x72, 0x87, + 0x52, 0xd6, 0x07, 0xba, 0x8d, 0xeb, 0x31, 0x19, 0xb0, 0xdb, 0x42, 0x2a, 0x9c, 0x3b, 0xc5, 0xa6, + 0xd6, 0x3e, 0xa3, 0x6a, 0x14, 0xfa, 0x8b, 0xa5, 0xe9, 0x83, 0xd2, 0x2a, 0x55, 0x78, 0x2d, 0x4a, + 0xe1, 0x03, 0x2a, 0x44, 0x54, 0xd4, 0x1c, 0x91, 0x7a, 0x4c, 0x5e, 0x3d, 0x9d, 0x24, 0x13, 0x17, + 0x6b, 0x6b, 0x03, 0xb5, 0xa7, 0x7d, 0x80, 0x95, 0x93, 0x9e, 0xde, 0x7c, 0x54, 0x5a, 0x9b, 0xee, + 0x62, 0x77, 0x38, 0xf7, 0x0e, 0x61, 0x26, 0x2e, 0xd6, 0xf6, 0x13, 0x10, 0x86, 0x0b, 0x4d, 0x13, + 0xab, 0x36, 0x56, 0xd8, 0xe9, 0xa5, 0x98, 0xd8, 0x1a, 0xf6, 0x6c, 0xb2, 0x13, 0xcf, 0x51, 0xc5, + 0xcf, 0x47, 0xee, 0x26, 0x2a, 0x76, 0x40, 0xa5, 0x64, 0x2a, 0x44, 0xb7, 0xe5, 0x5a, 0x33, 0x84, + 0x8e, 0x7e, 0x08, 0xa8, 0x8d, 0xed, 0x66, 0xd7, 0xe9, 0x85, 0xd8, 0xc7, 0x2a, 0x9d, 0xa7, 0x3d, + 0x5c, 0x89, 0x1c, 0x3a, 0x91, 0x60, 0x8a, 0x88, 0x11, 0xc8, 0x86, 0x13, 0xdb, 0x63, 0xb4, 0x9d, + 0x25, 0x48, 0x9d, 0xaa, 0xbd, 0x21, 0xde, 0x4b, 0x66, 0x92, 0x62, 0x6a, 0x2f, 0x99, 0x59, 0x12, + 0x33, 0x7b, 0xc9, 0x4c, 0x56, 0x84, 0xbd, 0x64, 0x06, 0xc4, 0x9c, 0xf4, 0x2c, 0xe4, 0x7c, 0x27, + 0x2b, 0x2a, 0xc1, 0x52, 0x1f, 0x5b, 0x96, 0xda, 0xc1, 0xf4, 0x20, 0xce, 0xca, 0x4e, 0x53, 0x2a, + 0x42, 0xde, 0x7f, 0x9a, 0x4a, 0x9f, 0x08, 0xae, 0x24, 0x39, 0x28, 0x89, 0xe4, 0x29, 0x36, 0xe9, + 0x7a, 0x72, 0x49, 0xde, 0x44, 0x4f, 0x41, 0x81, 0xae, 0x85, 0xe2, 0xfc, 0x4e, 0x4e, 0xeb, 0xa4, + 0x9c, 0xa7, 0xc4, 0x07, 0x9c, 0x69, 0x03, 0x72, 0xc6, 0x75, 0xc3, 0x65, 0x49, 0x50, 0x16, 0x30, + 0xae, 0x1b, 0x0e, 0xc3, 0x93, 0x90, 0x27, 0xb3, 0x77, 0x39, 0x92, 0xb4, 0x93, 0x1c, 0xa1, 0x71, + 0x16, 0xe9, 0xcf, 0x71, 0x10, 0xc7, 0x4f, 0x60, 0xf4, 0x0a, 0x24, 0x49, 0xac, 0xe2, 0x71, 0xa5, + 0xbc, 0xc5, 0x02, 0xd9, 0x96, 0x13, 0xc8, 0xb6, 0x1a, 0x4e, 0x20, 0xdb, 0xc9, 0x7c, 0xfe, 0xe5, + 0x46, 0xec, 0x93, 0xbf, 0x6d, 0x08, 0x32, 0x95, 0x40, 0x17, 0xc9, 0xb9, 0xab, 0x6a, 0x03, 0x45, + 0x6b, 0xd1, 0x21, 0x67, 0xc9, 0xa1, 0xaa, 0x6a, 0x83, 0xdd, 0x16, 0xba, 0x0f, 0x62, 0x53, 0x1f, + 0x58, 0x78, 0x60, 0x0d, 0x2d, 0x85, 0x85, 0x52, 0x1e, 0x4d, 0x02, 0x31, 0x81, 0xc5, 0xba, 0xaa, + 0xc3, 0x79, 0x48, 0x19, 0xe5, 0xe5, 0x66, 0x90, 0x80, 0xee, 0x00, 0xb8, 0xf1, 0xd6, 0x2a, 0x25, + 0x37, 0x13, 0x57, 0x72, 0xd7, 0x37, 0x27, 0x96, 0xfd, 0x81, 0xc3, 0x72, 0x6c, 0xb4, 0x54, 0x1b, + 0xef, 0x24, 0xc9, 0x70, 0x65, 0x9f, 0x24, 0x7a, 0x06, 0x96, 0x55, 0xc3, 0x50, 0x2c, 0x9b, 0x38, + 0xec, 0xc9, 0x19, 0xf1, 0x21, 0x12, 0xa8, 0xf2, 0x72, 0x41, 0x35, 0x8c, 0x23, 0x42, 0xdd, 0x21, + 0x44, 0xf4, 0x34, 0x14, 0x49, 0x50, 0xd2, 0xd4, 0x9e, 0xd2, 0xc5, 0x5a, 0xa7, 0x6b, 0xd3, 0x80, + 0x94, 0x90, 0x0b, 0x9c, 0x5a, 0xa7, 0x44, 0xa9, 0xe5, 0xae, 0x38, 0x0d, 0x48, 0x08, 0x41, 0xb2, + 0xa5, 0xda, 0x2a, 0xb5, 0x64, 0x5e, 0xa6, 0xdf, 0x84, 0x66, 0xa8, 0x76, 0x97, 0xdb, 0x87, 0x7e, + 0xa3, 0xf3, 0x90, 0xe6, 0x6a, 0x13, 0x54, 0x2d, 0x6f, 0xa1, 0x35, 0x48, 0x19, 0xa6, 0x7e, 0x8a, + 0xe9, 0xd2, 0x65, 0x64, 0xd6, 0x90, 0x64, 0x28, 0x06, 0x83, 0x17, 0x2a, 0x42, 0xdc, 0x1e, 0xf1, + 0x5e, 0xe2, 0xf6, 0x08, 0xbd, 0x08, 0x49, 0x62, 0x48, 0xda, 0x47, 0x31, 0x24, 0x5c, 0x73, 0xb9, + 0xc6, 0x99, 0x81, 0x65, 0xca, 0x29, 0x2d, 0x43, 0x21, 0x10, 0xd4, 0xa4, 0xf3, 0xb0, 0x16, 0x16, + 0xa3, 0xa4, 0xae, 0x4b, 0x0f, 0xc4, 0x1a, 0x74, 0x13, 0x32, 0x6e, 0x90, 0x62, 0x8e, 0x73, 0x71, + 0xa2, 0x5b, 0x87, 0x59, 0x76, 0x59, 0x89, 0xc7, 0x90, 0x05, 0xe8, 0xaa, 0x3c, 0x25, 0xc9, 0xcb, + 0x4b, 0xaa, 0x61, 0xd4, 0x55, 0xab, 0x2b, 0xbd, 0x03, 0xa5, 0xa8, 0x00, 0xe4, 0x33, 0x98, 0x40, + 0xdd, 0xde, 0x31, 0xd8, 0x79, 0x48, 0xb7, 0x75, 0xb3, 0xaf, 0xda, 0x54, 0x59, 0x41, 0xe6, 0x2d, + 0x62, 0x48, 0x16, 0x8c, 0x12, 0x94, 0xcc, 0x1a, 0x92, 0x02, 0x17, 0x23, 0x83, 0x10, 0x11, 0xd1, + 0x06, 0x2d, 0xcc, 0xcc, 0x5a, 0x90, 0x59, 0xc3, 0x53, 0xc4, 0x06, 0xcb, 0x1a, 0xa4, 0x5b, 0x8b, + 0xce, 0x95, 0xea, 0xcf, 0xca, 0xbc, 0x25, 0x7d, 0x9a, 0x80, 0xf3, 0xe1, 0xa1, 0x08, 0x6d, 0x42, + 0xbe, 0xaf, 0x8e, 0x14, 0x7b, 0xc4, 0xdd, 0x4e, 0xa0, 0x0b, 0x0f, 0x7d, 0x75, 0xd4, 0x18, 0x31, + 0x9f, 0x13, 0x21, 0x61, 0x8f, 0xac, 0x52, 0x7c, 0x33, 0x71, 0x25, 0x2f, 0x93, 0x4f, 0x74, 0x0c, + 0x2b, 0x3d, 0xbd, 0xa9, 0xf6, 0x94, 0x9e, 0x6a, 0xd9, 0x0a, 0xcf, 0x51, 0xd8, 0x26, 0x7a, 0x6a, + 0xc2, 0xd8, 0x2c, 0xa8, 0xe0, 0x16, 0x5b, 0x4f, 0x72, 0xe0, 0x70, 0xff, 0x5f, 0xa6, 0x3a, 0xee, + 0xab, 0xce, 0x52, 0xa3, 0xdb, 0x90, 0xeb, 0x6b, 0xd6, 0x09, 0xee, 0xaa, 0xa7, 0x9a, 0x6e, 0xf2, + 0xdd, 0x34, 0xe9, 0x34, 0x6f, 0x78, 0x3c, 0x5c, 0x93, 0x5f, 0xcc, 0xb7, 0x24, 0xa9, 0x80, 0x0f, + 0x3b, 0xa7, 0x49, 0x7a, 0xe1, 0xd3, 0xe4, 0x45, 0x58, 0x1b, 0xe0, 0x91, 0xad, 0x78, 0xfb, 0x95, + 0xf9, 0xc9, 0x12, 0x35, 0x3d, 0x22, 0xbf, 0xb9, 0x3b, 0xdc, 0x22, 0x2e, 0x83, 0x9e, 0xa3, 0xc1, + 0xdc, 0xd0, 0x2d, 0x6c, 0x2a, 0x6a, 0xab, 0x65, 0x62, 0xcb, 0xa2, 0xf9, 0x5f, 0x9e, 0x46, 0x68, + 0x4a, 0xaf, 0x30, 0xb2, 0xf4, 0x4b, 0xff, 0xd2, 0x04, 0x83, 0x37, 0x37, 0xbc, 0xe0, 0x19, 0xfe, + 0x08, 0xd6, 0xb8, 0x7c, 0x2b, 0x60, 0x7b, 0x96, 0x44, 0x3f, 0x31, 0xb9, 0xbf, 0xc6, 0x6d, 0x8e, + 0x1c, 0xf1, 0x68, 0xb3, 0x27, 0x1e, 0xcf, 0xec, 0x08, 0x92, 0xd4, 0x28, 0x49, 0x76, 0xc4, 0x90, + 0xef, 0xff, 0xb6, 0xa5, 0xf8, 0x28, 0x01, 0x2b, 0x13, 0x99, 0x90, 0x3b, 0x31, 0x21, 0x74, 0x62, + 0xf1, 0xd0, 0x89, 0x25, 0x16, 0x9e, 0x18, 0x5f, 0xeb, 0xe4, 0xec, 0xb5, 0x4e, 0x7d, 0x87, 0x6b, + 0x9d, 0x7e, 0xbc, 0xb5, 0xfe, 0x8f, 0xae, 0xc2, 0xaf, 0x05, 0x28, 0x47, 0xa7, 0x8f, 0xa1, 0xcb, + 0x71, 0x0d, 0x56, 0xdc, 0xa1, 0xb8, 0xea, 0xd9, 0xc1, 0x28, 0xba, 0x3f, 0x70, 0xfd, 0x91, 0x31, + 0xee, 0x69, 0x28, 0x8e, 0x25, 0xb7, 0xcc, 0x95, 0x0b, 0xa7, 0xfe, 0xfe, 0xa5, 0x9f, 0x27, 0xdc, + 0xc0, 0x13, 0xc8, 0x40, 0x43, 0x76, 0xeb, 0x9b, 0xb0, 0xda, 0xc2, 0x4d, 0xad, 0xf5, 0xb8, 0x9b, + 0x75, 0x85, 0x4b, 0xff, 0x7f, 0xaf, 0x4e, 0x7a, 0xc9, 0xef, 0x04, 0x78, 0x62, 0x4a, 0xbe, 0x1e, + 0xaa, 0x4a, 0x08, 0x55, 0x85, 0xee, 0x42, 0xb1, 0xa3, 0x5b, 0x96, 0x66, 0xe0, 0x16, 0x4f, 0xdf, + 0xe3, 0x93, 0x79, 0x1c, 0x4b, 0xef, 0xb7, 0xee, 0x72, 0x46, 0x9a, 0xa2, 0xcb, 0x85, 0x8e, 0xbf, + 0x19, 0xe5, 0x59, 0xd2, 0x45, 0xb8, 0x10, 0x91, 0xf8, 0x4b, 0x7f, 0xc9, 0x41, 0x46, 0xc6, 0x96, + 0x41, 0xd2, 0x4a, 0xb4, 0x03, 0x59, 0x3c, 0x6a, 0x62, 0xc3, 0x76, 0x32, 0xf1, 0xf0, 0x52, 0x8d, + 0x71, 0xd7, 0x1c, 0xce, 0x7a, 0x4c, 0xf6, 0xc4, 0xd0, 0x0d, 0x8e, 0xc5, 0x44, 0xc3, 0x2a, 0x5c, + 0xdc, 0x0f, 0xc6, 0xbc, 0xe4, 0x80, 0x31, 0x89, 0x48, 0x9c, 0x81, 0x49, 0x8d, 0xa1, 0x31, 0x37, + 0x38, 0x1a, 0x93, 0x9c, 0xd1, 0x59, 0x00, 0x8e, 0xa9, 0x06, 0xe0, 0x98, 0xf4, 0x8c, 0x69, 0x46, + 0xe0, 0x31, 0x2f, 0x39, 0x78, 0xcc, 0xd2, 0x8c, 0x11, 0x8f, 0x01, 0x32, 0xaf, 0xfb, 0x00, 0x99, + 0x2c, 0x15, 0xdd, 0x8c, 0x14, 0x0d, 0x41, 0x64, 0x5e, 0x75, 0x11, 0x99, 0x7c, 0x24, 0x9a, 0xc3, + 0x85, 0xc7, 0x21, 0x99, 0x83, 0x09, 0x48, 0x86, 0x41, 0x28, 0xcf, 0x44, 0xaa, 0x98, 0x81, 0xc9, + 0x1c, 0x4c, 0x60, 0x32, 0xc5, 0x19, 0x0a, 0x67, 0x80, 0x32, 0x3f, 0x09, 0x07, 0x65, 0xa2, 0x61, + 0x13, 0x3e, 0xcc, 0xf9, 0x50, 0x19, 0x25, 0x02, 0x95, 0x11, 0x23, 0x11, 0x04, 0xa6, 0x7e, 0x6e, + 0x58, 0xe6, 0x38, 0x04, 0x96, 0x59, 0x89, 0xac, 0xc3, 0x99, 0xf2, 0x39, 0x70, 0x99, 0xe3, 0x10, + 0x5c, 0x06, 0xcd, 0x54, 0x3b, 0x13, 0x98, 0xb9, 0x13, 0x04, 0x66, 0x56, 0x23, 0x92, 0x67, 0x6f, + 0xb7, 0x47, 0x20, 0x33, 0x27, 0x51, 0xc8, 0xcc, 0x5a, 0x24, 0xc8, 0xc1, 0x34, 0x2e, 0x00, 0xcd, + 0x1c, 0x4c, 0x40, 0x33, 0xe7, 0x66, 0x78, 0xda, 0x0c, 0x6c, 0xa6, 0x1d, 0x8d, 0xcd, 0x30, 0xe4, + 0xe4, 0x85, 0xe8, 0x7d, 0xb5, 0x08, 0x38, 0xf3, 0x30, 0x14, 0x9c, 0xb9, 0x10, 0x89, 0x32, 0xf2, + 0xc1, 0x2f, 0x88, 0xce, 0xa4, 0xc4, 0xf4, 0x5e, 0x32, 0x93, 0x11, 0xb3, 0x0c, 0x97, 0xd9, 0x4b, + 0x66, 0x72, 0x62, 0x5e, 0x7a, 0x8e, 0xe4, 0x92, 0x63, 0x47, 0x35, 0xa9, 0xda, 0xb0, 0x69, 0xea, + 0x26, 0xc7, 0x59, 0x58, 0x43, 0xba, 0x42, 0xaa, 0x75, 0xef, 0x58, 0x9e, 0x82, 0xe4, 0xd0, 0xea, + 0xd8, 0x77, 0x14, 0x4b, 0x7f, 0x10, 0x3c, 0x59, 0x8a, 0xe5, 0xf8, 0x2b, 0xfd, 0x2c, 0xaf, 0xf4, + 0x7d, 0xf8, 0x4e, 0x3c, 0x88, 0xef, 0x6c, 0x40, 0x8e, 0x54, 0xbd, 0x63, 0xd0, 0x8d, 0x6a, 0xb8, + 0xd0, 0xcd, 0x55, 0x58, 0xa1, 0xa9, 0x0b, 0x43, 0x81, 0x78, 0x74, 0x4b, 0xd2, 0xe8, 0xb6, 0x4c, + 0x7e, 0x60, 0x0b, 0xcc, 0x32, 0x85, 0x17, 0x60, 0xd5, 0xc7, 0xeb, 0x56, 0xd3, 0x0c, 0xc7, 0x10, + 0x5d, 0xee, 0x0a, 0x2f, 0xab, 0xff, 0x24, 0x78, 0x16, 0xf2, 0x30, 0x9f, 0x30, 0x78, 0x46, 0xf8, + 0x8e, 0xe0, 0x99, 0xf8, 0x63, 0xc3, 0x33, 0x7e, 0x74, 0x20, 0x11, 0x44, 0x07, 0xfe, 0x29, 0x78, + 0x6b, 0xe2, 0x82, 0x2d, 0x4d, 0xbd, 0x85, 0x79, 0xbd, 0x4e, 0xbf, 0x49, 0x72, 0xd8, 0xd3, 0x3b, + 0xbc, 0x2a, 0x27, 0x9f, 0x84, 0xcb, 0x8d, 0x9d, 0x59, 0x1e, 0x1a, 0xdd, 0x52, 0x9f, 0xa5, 0x60, + 0xbc, 0xd4, 0x17, 0x21, 0xf1, 0x08, 0xb3, 0x9b, 0x87, 0xbc, 0x4c, 0x3e, 0x09, 0x1f, 0x75, 0x3e, + 0x9e, 0x4a, 0xb1, 0x06, 0x7a, 0x05, 0xb2, 0xf4, 0x5a, 0x49, 0xd1, 0x0d, 0x8b, 0xdf, 0x36, 0x04, + 0x92, 0x4c, 0x76, 0xb7, 0xb4, 0x75, 0x48, 0x78, 0x0e, 0x0c, 0x4b, 0xce, 0x18, 0xfc, 0xcb, 0x97, + 0xb8, 0x64, 0x03, 0xb9, 0xdf, 0x25, 0xc8, 0x92, 0xd1, 0x5b, 0x86, 0xda, 0xc4, 0x25, 0xa0, 0x03, + 0xf5, 0x08, 0xd2, 0xef, 0xe3, 0xb0, 0x3c, 0x16, 0x2b, 0x43, 0xe7, 0xee, 0xb8, 0x64, 0xdc, 0x07, + 0x3e, 0xcd, 0x67, 0x8f, 0x75, 0x80, 0x8e, 0x6a, 0x29, 0xef, 0xab, 0x03, 0x1b, 0xb7, 0xb8, 0x51, + 0x7c, 0x14, 0x54, 0x86, 0x0c, 0x69, 0x0d, 0x2d, 0xdc, 0xe2, 0x38, 0x98, 0xdb, 0x46, 0x75, 0x48, + 0xe3, 0x53, 0x3c, 0xb0, 0xad, 0xd2, 0x12, 0x5d, 0xf6, 0xf3, 0x93, 0xc0, 0x04, 0xf9, 0x79, 0xa7, + 0x44, 0x16, 0xfb, 0x9b, 0x2f, 0x37, 0x44, 0xc6, 0xfd, 0xbc, 0xde, 0xd7, 0x6c, 0xdc, 0x37, 0xec, + 0x33, 0x99, 0xcb, 0x07, 0xad, 0x90, 0x19, 0xb3, 0x02, 0x45, 0x64, 0xf3, 0x0e, 0xd0, 0x42, 0x6c, + 0xaa, 0xe9, 0xa6, 0x66, 0x9f, 0xc9, 0x85, 0x3e, 0xee, 0x1b, 0xba, 0xde, 0x53, 0xd8, 0x1e, 0xaf, + 0x40, 0x31, 0x98, 0x1a, 0xa0, 0xa7, 0xa0, 0x60, 0x62, 0x5b, 0xd5, 0x06, 0x4a, 0x20, 0x69, 0xcc, + 0x33, 0x22, 0xdb, 0x53, 0x7b, 0xc9, 0x8c, 0x20, 0xc6, 0xf7, 0x92, 0x99, 0xb8, 0x98, 0x90, 0x0e, + 0xe1, 0x5c, 0x68, 0x6a, 0x80, 0x5e, 0x86, 0xac, 0x97, 0x55, 0x08, 0x74, 0xb6, 0x53, 0x30, 0x2f, + 0x8f, 0x57, 0xfa, 0xa3, 0xe0, 0xa9, 0x0c, 0xa2, 0x68, 0x35, 0x48, 0xb3, 0x33, 0x99, 0xae, 0x64, + 0x71, 0xca, 0x81, 0x1c, 0x90, 0xdb, 0x62, 0x47, 0xaf, 0xcc, 0x85, 0xa5, 0xb7, 0x21, 0xcd, 0x28, + 0x28, 0x07, 0x4b, 0xc7, 0xfb, 0xf7, 0xf6, 0x0f, 0xde, 0xda, 0x17, 0x63, 0x08, 0x20, 0x5d, 0xa9, + 0x56, 0x6b, 0x87, 0x0d, 0x51, 0x40, 0x59, 0x48, 0x55, 0x76, 0x0e, 0xe4, 0x86, 0x18, 0x27, 0x64, + 0xb9, 0xb6, 0x57, 0xab, 0x36, 0xc4, 0x04, 0x5a, 0x81, 0x02, 0xfb, 0x56, 0xee, 0x1c, 0xc8, 0x6f, + 0x54, 0x1a, 0x62, 0xd2, 0x47, 0x3a, 0xaa, 0xed, 0xdf, 0xae, 0xc9, 0x62, 0x4a, 0xfa, 0x1e, 0x5c, + 0x8c, 0x4c, 0x43, 0x3c, 0x88, 0x4c, 0xf0, 0x41, 0x64, 0xd2, 0xa7, 0x71, 0x52, 0x5e, 0x46, 0xe5, + 0x16, 0x68, 0x6f, 0x6c, 0xe2, 0xd7, 0x17, 0x48, 0x4c, 0xc6, 0x66, 0x4f, 0x2a, 0x4a, 0x13, 0xb3, + 0x00, 0x44, 0xfb, 0x66, 0x27, 0x50, 0x41, 0x2e, 0x70, 0x2a, 0x15, 0xb2, 0x18, 0xdb, 0xbb, 0xb8, + 0x69, 0x2b, 0xcc, 0x89, 0x2c, 0x5a, 0xd6, 0x65, 0x09, 0x1b, 0xa1, 0x1e, 0x31, 0xa2, 0xf4, 0xce, + 0x42, 0xb6, 0xcc, 0x42, 0x4a, 0xae, 0x35, 0xe4, 0x87, 0x62, 0x02, 0x21, 0x28, 0xd2, 0x4f, 0xe5, + 0x68, 0xbf, 0x72, 0x78, 0x54, 0x3f, 0x20, 0xb6, 0x5c, 0x85, 0x65, 0xc7, 0x96, 0x0e, 0x31, 0x25, + 0x5d, 0x23, 0x75, 0x4a, 0x68, 0x62, 0x34, 0x59, 0xdc, 0x4a, 0xbf, 0x11, 0xfc, 0xdc, 0xc1, 0xe4, + 0xe6, 0x00, 0xd2, 0x96, 0xad, 0xda, 0x43, 0x8b, 0x1b, 0xf1, 0xe5, 0x79, 0x33, 0xa5, 0x2d, 0xe7, + 0xe3, 0x88, 0x8a, 0xcb, 0x5c, 0x8d, 0x74, 0x13, 0x8a, 0xc1, 0x5f, 0xa2, 0x6d, 0xe0, 0x39, 0x51, + 0x5c, 0xba, 0x05, 0x68, 0x32, 0x81, 0x0a, 0x29, 0xf4, 0x85, 0xb0, 0x42, 0xff, 0xb7, 0xb4, 0xc2, + 0x8c, 0x4c, 0x96, 0xd0, 0x9b, 0x63, 0x93, 0x7c, 0x75, 0x91, 0x54, 0x6b, 0x8b, 0xd1, 0xc6, 0xa6, + 0x79, 0x03, 0xf2, 0x7e, 0xfa, 0x7c, 0x93, 0xfc, 0x26, 0xee, 0x6d, 0xe2, 0x20, 0x22, 0xe1, 0x1d, + 0x81, 0xc2, 0xb7, 0x3c, 0x02, 0x5f, 0x03, 0xb0, 0x47, 0x3c, 0x4b, 0x73, 0xe2, 0xe8, 0xe5, 0x10, + 0xa4, 0x17, 0x37, 0x1b, 0x23, 0xbe, 0x09, 0xb2, 0x36, 0xff, 0xb2, 0xd0, 0x91, 0x1f, 0x9e, 0x19, + 0xd2, 0x18, 0x6b, 0x71, 0xe8, 0x62, 0xde, 0x60, 0xec, 0xc1, 0x38, 0x8c, 0x6c, 0xa1, 0x87, 0x70, + 0x61, 0x2c, 0x51, 0x70, 0x55, 0x27, 0xe7, 0xcd, 0x17, 0xce, 0x05, 0xf3, 0x05, 0x47, 0xb5, 0x3f, + 0xda, 0xa7, 0x82, 0xd1, 0xfe, 0x75, 0xb8, 0x34, 0x2d, 0x13, 0x45, 0x97, 0x01, 0xf0, 0x80, 0x04, + 0x87, 0x96, 0xe2, 0x5e, 0x84, 0x64, 0x39, 0xa5, 0x31, 0x92, 0xee, 0x42, 0x29, 0x2a, 0xcb, 0x44, + 0xd7, 0x20, 0x49, 0x4b, 0x01, 0x96, 0xed, 0x5c, 0x08, 0x01, 0x1f, 0x08, 0x9f, 0x4c, 0x99, 0xa4, + 0x87, 0x00, 0x1e, 0x5c, 0x44, 0x4e, 0x3a, 0x53, 0x1f, 0x0e, 0x5a, 0x54, 0x36, 0x25, 0xb3, 0x06, + 0xba, 0x09, 0x29, 0x3f, 0x9c, 0x31, 0x19, 0x12, 0x88, 0x3e, 0x1f, 0xdc, 0xc4, 0xb8, 0x25, 0x0d, + 0xd0, 0x24, 0x64, 0x1f, 0xd1, 0xc5, 0xeb, 0xc1, 0x2e, 0x9e, 0x8c, 0x04, 0xff, 0xc3, 0xbb, 0xfa, + 0x00, 0x52, 0xd4, 0x03, 0x49, 0xf0, 0xa7, 0xf7, 0x44, 0x3c, 0x6b, 0x25, 0xdf, 0xe8, 0xa7, 0x00, + 0xaa, 0x6d, 0x9b, 0xda, 0xc9, 0xd0, 0xeb, 0x60, 0x23, 0xdc, 0x83, 0x2b, 0x0e, 0xdf, 0xce, 0x25, + 0xee, 0xca, 0x6b, 0x9e, 0xa8, 0xcf, 0x9d, 0x7d, 0x0a, 0xa5, 0x7d, 0x28, 0x06, 0x65, 0x9d, 0x3c, + 0x8b, 0x8d, 0x21, 0x98, 0x67, 0xb1, 0xb4, 0x99, 0xe7, 0x59, 0x6e, 0x96, 0x96, 0x60, 0x97, 0x61, + 0xb4, 0x21, 0x7d, 0x18, 0x87, 0xbc, 0x7f, 0x03, 0xfc, 0xef, 0xa5, 0x42, 0xd2, 0x2f, 0x04, 0xc8, + 0xb8, 0xd3, 0x0f, 0xde, 0x8c, 0x05, 0xae, 0x12, 0x99, 0xf5, 0xe2, 0xfe, 0xeb, 0x2c, 0x76, 0x71, + 0x98, 0x70, 0x2f, 0x0e, 0x6f, 0xb9, 0x61, 0x38, 0x0a, 0x5b, 0xf2, 0xdb, 0x9a, 0x7b, 0x95, 0x93, + 0x75, 0xdc, 0x82, 0xac, 0x7b, 0x8a, 0x90, 0xe2, 0x27, 0x88, 0xff, 0x39, 0x4d, 0x7a, 0xa9, 0xa9, + 0xbf, 0xcf, 0xef, 0xca, 0x12, 0x32, 0x6b, 0x48, 0x2d, 0x58, 0x1e, 0x3b, 0x82, 0xd0, 0x2d, 0x58, + 0x32, 0x86, 0x27, 0x8a, 0xe3, 0x1c, 0x63, 0x80, 0xab, 0x93, 0x56, 0x0f, 0x4f, 0x7a, 0x5a, 0xf3, + 0x1e, 0x3e, 0x73, 0x06, 0x63, 0x0c, 0x4f, 0xee, 0x31, 0x1f, 0x62, 0xbd, 0xc4, 0xfd, 0xbd, 0xfc, + 0x4a, 0x80, 0x8c, 0xb3, 0x27, 0xd0, 0x0f, 0x20, 0xeb, 0x1e, 0x6f, 0xee, 0x65, 0x77, 0xe4, 0xb9, + 0xc8, 0xf5, 0x7b, 0x22, 0xa8, 0xe2, 0xdc, 0xd2, 0x6b, 0x2d, 0xa5, 0xdd, 0x53, 0x99, 0x2f, 0x15, + 0x83, 0x36, 0x63, 0x07, 0x20, 0x8d, 0x0b, 0xbb, 0xb7, 0xef, 0xf4, 0xd4, 0x8e, 0x9c, 0xa3, 0x32, + 0xbb, 0x2d, 0xd2, 0xe0, 0x19, 0xe6, 0x3f, 0x04, 0x10, 0xc7, 0x77, 0xec, 0xb7, 0x1e, 0xdd, 0x64, + 0xb8, 0x4d, 0x84, 0x84, 0x5b, 0xb4, 0x0d, 0xab, 0x2e, 0x87, 0x62, 0x69, 0x9d, 0x81, 0x6a, 0x0f, + 0x4d, 0xcc, 0x21, 0x6a, 0xe4, 0xfe, 0x74, 0xe4, 0xfc, 0x32, 0x39, 0xeb, 0xd4, 0x63, 0xce, 0xfa, + 0xa3, 0x38, 0xe4, 0x7c, 0x80, 0x39, 0xfa, 0xbe, 0xef, 0x30, 0x2a, 0x86, 0x44, 0x28, 0x1f, 0xaf, + 0x77, 0x71, 0x1d, 0x34, 0x53, 0x7c, 0x71, 0x33, 0x45, 0x5d, 0x4b, 0x38, 0xf8, 0x7b, 0x72, 0x61, + 0xfc, 0xfd, 0x79, 0x40, 0xb6, 0x6e, 0xab, 0x3d, 0xe5, 0x54, 0xb7, 0xb5, 0x41, 0x47, 0x61, 0x6e, + 0xc8, 0x8e, 0x0e, 0x91, 0xfe, 0xf2, 0x80, 0xfe, 0x70, 0x48, 0x3d, 0xf2, 0x67, 0x02, 0x64, 0xdc, + 0xf4, 0x7f, 0xd1, 0x6b, 0xed, 0xf3, 0x90, 0xe6, 0x19, 0x2e, 0xbb, 0xd7, 0xe6, 0xad, 0xd0, 0x8b, + 0x86, 0x32, 0x64, 0xfa, 0xd8, 0x56, 0xe9, 0x39, 0xc8, 0xa2, 0xab, 0xdb, 0xbe, 0xfa, 0x2a, 0xe4, + 0x7c, 0x4f, 0x02, 0xc8, 0xd1, 0xb8, 0x5f, 0x7b, 0x4b, 0x8c, 0x95, 0x97, 0x3e, 0xfe, 0x6c, 0x33, + 0xb1, 0x8f, 0xdf, 0x27, 0xbb, 0x59, 0xae, 0x55, 0xeb, 0xb5, 0xea, 0x3d, 0x51, 0x28, 0xe7, 0x3e, + 0xfe, 0x6c, 0x73, 0x49, 0xc6, 0x14, 0x9c, 0xbd, 0x7a, 0x0f, 0x96, 0xc7, 0x16, 0x26, 0x98, 0x3e, + 0x21, 0x28, 0xde, 0x3e, 0x3e, 0xbc, 0xbf, 0x5b, 0xad, 0x34, 0x6a, 0xca, 0x83, 0x83, 0x46, 0x4d, + 0x14, 0xd0, 0x05, 0x58, 0xbd, 0xbf, 0x7b, 0xb7, 0xde, 0x50, 0xaa, 0xf7, 0x77, 0x6b, 0xfb, 0x0d, + 0xa5, 0xd2, 0x68, 0x54, 0xaa, 0xf7, 0xc4, 0xf8, 0xf5, 0x7f, 0xe5, 0x21, 0x59, 0xd9, 0xa9, 0xee, + 0xa2, 0x2a, 0x24, 0x29, 0x24, 0x33, 0xf5, 0x51, 0x63, 0x79, 0x3a, 0xcc, 0x8e, 0xee, 0x40, 0x8a, + 0xa2, 0x35, 0x68, 0xfa, 0x2b, 0xc7, 0xf2, 0x0c, 0xdc, 0x9d, 0x0c, 0x86, 0xee, 0xc8, 0xa9, 0xcf, + 0x1e, 0xcb, 0xd3, 0x61, 0x78, 0x74, 0x1f, 0x96, 0x9c, 0x62, 0x7d, 0xd6, 0x5b, 0xc4, 0xf2, 0x4c, + 0x6c, 0x9c, 0x4c, 0x8d, 0x81, 0x1e, 0xd3, 0x5f, 0x44, 0x96, 0x67, 0x00, 0xf4, 0x68, 0x17, 0xd2, + 0xbc, 0x2c, 0x9e, 0xf1, 0xc8, 0xb1, 0x3c, 0x0b, 0x72, 0x47, 0x32, 0x64, 0x3d, 0x38, 0x69, 0xf6, + 0x3b, 0xcf, 0xf2, 0x1c, 0x77, 0x0f, 0xe8, 0x6d, 0x28, 0x04, 0x4b, 0xee, 0xf9, 0x1e, 0x52, 0x96, + 0xe7, 0x04, 0xf7, 0x89, 0xfe, 0x60, 0xfd, 0x3d, 0xdf, 0xc3, 0xca, 0xf2, 0x9c, 0x58, 0x3f, 0x7a, + 0x17, 0x56, 0x26, 0xeb, 0xe3, 0xf9, 0xdf, 0x59, 0x96, 0x17, 0x40, 0xff, 0x51, 0x1f, 0x50, 0x48, + 0x5d, 0xbd, 0xc0, 0xb3, 0xcb, 0xf2, 0x22, 0x97, 0x01, 0xa8, 0x05, 0xcb, 0xe3, 0xc5, 0xea, 0xbc, + 0xcf, 0x30, 0xcb, 0x73, 0x5f, 0x0c, 0xb0, 0x5e, 0x82, 0x45, 0xee, 0xbc, 0xcf, 0x32, 0xcb, 0x73, + 0xdf, 0x13, 0xa0, 0x63, 0x00, 0x5f, 0x9d, 0x3a, 0xc7, 0x33, 0xcd, 0xf2, 0x3c, 0x37, 0x06, 0xc8, + 0x80, 0xd5, 0xb0, 0x02, 0x76, 0x91, 0x57, 0x9b, 0xe5, 0x85, 0x2e, 0x12, 0x88, 0x3f, 0x07, 0x4b, + 0xd1, 0xf9, 0x5e, 0x71, 0x96, 0xe7, 0xbc, 0x51, 0x40, 0x16, 0xac, 0x85, 0x96, 0x5f, 0x0b, 0xbd, + 0xe9, 0x2c, 0x2f, 0x76, 0xcb, 0x80, 0x3a, 0x20, 0x4e, 0x14, 0x6d, 0x73, 0x3f, 0xf1, 0x2c, 0xcf, + 0x7f, 0xdf, 0xb0, 0x53, 0xf9, 0xfc, 0xab, 0x75, 0xe1, 0x8b, 0xaf, 0xd6, 0x85, 0xbf, 0x7f, 0xb5, + 0x2e, 0x7c, 0xf2, 0xf5, 0x7a, 0xec, 0x8b, 0xaf, 0xd7, 0x63, 0x7f, 0xfd, 0x7a, 0x3d, 0xf6, 0xa3, + 0x67, 0x3b, 0x9a, 0xdd, 0x1d, 0x9e, 0x6c, 0x35, 0xf5, 0xfe, 0x76, 0x53, 0xef, 0x63, 0xfb, 0xa4, + 0x6d, 0x7b, 0x1f, 0xde, 0x3f, 0x11, 0x4e, 0xd2, 0x34, 0x3f, 0xb8, 0xf1, 0xef, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xe4, 0x0a, 0x49, 0x92, 0xa9, 0x30, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4308,7 +4150,6 @@ type ABCIClient interface { FinalizeBlock(ctx context.Context, in *RequestFinalizeBlock, opts ...grpc.CallOption) (*ResponseFinalizeBlock, error) CreateOracleResultTx(ctx context.Context, in *RequestCreateOracleResultTx, opts ...grpc.CallOption) (*ResponseCreateOracleResultTx, error) FetchOracleVotes(ctx context.Context, in *RequestFetchOracleVotes, opts ...grpc.CallOption) (*ResponseFetchOracleVotes, error) - ValidateOracleVotes(ctx context.Context, in *RequestValidateOracleVotes, opts ...grpc.CallOption) (*ResponseValidateOracleVotes, error) } type aBCIClient struct { @@ -4481,15 +4322,6 @@ func (c *aBCIClient) FetchOracleVotes(ctx context.Context, in *RequestFetchOracl return out, nil } -func (c *aBCIClient) ValidateOracleVotes(ctx context.Context, in *RequestValidateOracleVotes, opts ...grpc.CallOption) (*ResponseValidateOracleVotes, error) { - out := new(ResponseValidateOracleVotes) - err := c.cc.Invoke(ctx, "/tendermint.abci.ABCI/ValidateOracleVotes", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - // ABCIServer is the server API for ABCI service. type ABCIServer interface { Echo(context.Context, *RequestEcho) (*ResponseEcho, error) @@ -4510,7 +4342,6 @@ type ABCIServer interface { FinalizeBlock(context.Context, *RequestFinalizeBlock) (*ResponseFinalizeBlock, error) CreateOracleResultTx(context.Context, *RequestCreateOracleResultTx) (*ResponseCreateOracleResultTx, error) FetchOracleVotes(context.Context, *RequestFetchOracleVotes) (*ResponseFetchOracleVotes, error) - ValidateOracleVotes(context.Context, *RequestValidateOracleVotes) (*ResponseValidateOracleVotes, error) } // UnimplementedABCIServer can be embedded to have forward compatible implementations. @@ -4571,9 +4402,6 @@ func (*UnimplementedABCIServer) CreateOracleResultTx(ctx context.Context, req *R func (*UnimplementedABCIServer) FetchOracleVotes(ctx context.Context, req *RequestFetchOracleVotes) (*ResponseFetchOracleVotes, error) { return nil, status.Errorf(codes.Unimplemented, "method FetchOracleVotes not implemented") } -func (*UnimplementedABCIServer) ValidateOracleVotes(ctx context.Context, req *RequestValidateOracleVotes) (*ResponseValidateOracleVotes, error) { - return nil, status.Errorf(codes.Unimplemented, "method ValidateOracleVotes not implemented") -} func RegisterABCIServer(s grpc1.Server, srv ABCIServer) { s.RegisterService(&_ABCI_serviceDesc, srv) @@ -4903,24 +4731,6 @@ func _ABCI_FetchOracleVotes_Handler(srv interface{}, ctx context.Context, dec fu return interceptor(ctx, in, info, handler) } -func _ABCI_ValidateOracleVotes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RequestValidateOracleVotes) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ABCIServer).ValidateOracleVotes(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/tendermint.abci.ABCI/ValidateOracleVotes", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ABCIServer).ValidateOracleVotes(ctx, req.(*RequestValidateOracleVotes)) - } - return interceptor(ctx, in, info, handler) -} - var _ABCI_serviceDesc = grpc.ServiceDesc{ ServiceName: "tendermint.abci.ABCI", HandlerType: (*ABCIServer)(nil), @@ -4997,10 +4807,6 @@ var _ABCI_serviceDesc = grpc.ServiceDesc{ MethodName: "FetchOracleVotes", Handler: _ABCI_FetchOracleVotes_Handler, }, - { - MethodName: "ValidateOracleVotes", - Handler: _ABCI_ValidateOracleVotes_Handler, - }, }, Streams: []grpc.StreamDesc{}, Metadata: "tendermint/abci/types.proto", @@ -5430,29 +5236,6 @@ func (m *Request_FetchOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error } return len(dAtA) - i, nil } -func (m *Request_ValidateOracleVotes) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Request_ValidateOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.ValidateOracleVotes != nil { - { - size, err := m.ValidateOracleVotes.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0xba - } - return len(dAtA) - i, nil -} func (m *RequestEcho) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -5618,12 +5401,12 @@ func (m *RequestInitChain) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x12 } - n21, err21 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err21 != nil { - return 0, err21 + n20, err20 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err20 != nil { + return 0, err20 } - i -= n21 - i = encodeVarintTypes(dAtA, i, uint64(n21)) + i -= n20 + i = encodeVarintTypes(dAtA, i, uint64(n20)) i-- dAtA[i] = 0xa return len(dAtA) - i, nil @@ -5918,12 +5701,12 @@ func (m *RequestPrepareProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x3a } - n23, err23 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err23 != nil { - return 0, err23 + n22, err22 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err22 != nil { + return 0, err22 } - i -= n23 - i = encodeVarintTypes(dAtA, i, uint64(n23)) + i -= n22 + i = encodeVarintTypes(dAtA, i, uint64(n22)) i-- dAtA[i] = 0x32 if m.Height != 0 { @@ -6006,12 +5789,12 @@ func (m *RequestProcessProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x3a } - n25, err25 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err25 != nil { - return 0, err25 + n24, err24 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err24 != nil { + return 0, err24 } - i -= n25 - i = encodeVarintTypes(dAtA, i, uint64(n25)) + i -= n24 + i = encodeVarintTypes(dAtA, i, uint64(n24)) i-- dAtA[i] = 0x32 if m.Height != 0 { @@ -6129,12 +5912,12 @@ func (m *RequestExtendVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x22 } } - n28, err28 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err28 != nil { - return 0, err28 + n27, err27 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err27 != nil { + return 0, err27 } - i -= n28 - i = encodeVarintTypes(dAtA, i, uint64(n28)) + i -= n27 + i = encodeVarintTypes(dAtA, i, uint64(n27)) i-- dAtA[i] = 0x1a if m.Height != 0 { @@ -6235,12 +6018,12 @@ func (m *RequestFinalizeBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x3a } - n29, err29 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err29 != nil { - return 0, err29 + n28, err28 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err28 != nil { + return 0, err28 } - i -= n29 - i = encodeVarintTypes(dAtA, i, uint64(n29)) + i -= n28 + i = encodeVarintTypes(dAtA, i, uint64(n28)) i-- dAtA[i] = 0x32 if m.Height != 0 { @@ -6363,36 +6146,6 @@ func (m *RequestFetchOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func (m *RequestValidateOracleVotes) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RequestValidateOracleVotes) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RequestValidateOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.OracleTx) > 0 { - i -= len(m.OracleTx) - copy(dAtA[i:], m.OracleTx) - i = encodeVarintTypes(dAtA, i, uint64(len(m.OracleTx))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - func (m *Response) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -6840,29 +6593,6 @@ func (m *Response_FetchOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, erro } return len(dAtA) - i, nil } -func (m *Response_ValidateOracleVotes) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Response_ValidateOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.ValidateOracleVotes != nil { - { - size, err := m.ValidateOracleVotes.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0xc2 - } - return len(dAtA) - i, nil -} func (m *ResponseException) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -7374,20 +7104,20 @@ func (m *ResponseApplySnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, err } } if len(m.RefetchChunks) > 0 { - dAtA54 := make([]byte, len(m.RefetchChunks)*10) - var j53 int + dAtA52 := make([]byte, len(m.RefetchChunks)*10) + var j51 int for _, num := range m.RefetchChunks { for num >= 1<<7 { - dAtA54[j53] = uint8(uint64(num)&0x7f | 0x80) + dAtA52[j51] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j53++ + j51++ } - dAtA54[j53] = uint8(num) - j53++ + dAtA52[j51] = uint8(num) + j51++ } - i -= j53 - copy(dAtA[i:], dAtA54[:j53]) - i = encodeVarintTypes(dAtA, i, uint64(j53)) + i -= j51 + copy(dAtA[i:], dAtA52[:j51]) + i = encodeVarintTypes(dAtA, i, uint64(j51)) i-- dAtA[i] = 0x12 } @@ -7666,41 +7396,6 @@ func (m *ResponseFetchOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error return len(dAtA) - i, nil } -func (m *ResponseValidateOracleVotes) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ResponseValidateOracleVotes) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ResponseValidateOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Status != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Status)) - i-- - dAtA[i] = 0x10 - } - if len(m.EncodedOracleTx) > 0 { - i -= len(m.EncodedOracleTx) - copy(dAtA[i:], m.EncodedOracleTx) - i = encodeVarintTypes(dAtA, i, uint64(len(m.EncodedOracleTx))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - func (m *CommitInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -8194,12 +7889,12 @@ func (m *Misbehavior) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x28 } - n61, err61 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err61 != nil { - return 0, err61 + n59, err59 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err59 != nil { + return 0, err59 } - i -= n61 - i = encodeVarintTypes(dAtA, i, uint64(n61)) + i -= n59 + i = encodeVarintTypes(dAtA, i, uint64(n59)) i-- dAtA[i] = 0x22 if m.Height != 0 { @@ -8516,18 +8211,6 @@ func (m *Request_FetchOracleVotes) Size() (n int) { } return n } -func (m *Request_ValidateOracleVotes) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.ValidateOracleVotes != nil { - l = m.ValidateOracleVotes.Size() - n += 2 + l + sovTypes(uint64(l)) - } - return n -} func (m *RequestEcho) Size() (n int) { if m == nil { return 0 @@ -8931,19 +8614,6 @@ func (m *RequestFetchOracleVotes) Size() (n int) { return n } -func (m *RequestValidateOracleVotes) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.OracleTx) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - func (m *Response) Size() (n int) { if m == nil { return 0 @@ -9166,32 +8836,20 @@ func (m *Response_CreateOracleResultTx) Size() (n int) { } var l int _ = l - if m.CreateOracleResultTx != nil { - l = m.CreateOracleResultTx.Size() - n += 2 + l + sovTypes(uint64(l)) - } - return n -} -func (m *Response_FetchOracleVotes) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.FetchOracleVotes != nil { - l = m.FetchOracleVotes.Size() + if m.CreateOracleResultTx != nil { + l = m.CreateOracleResultTx.Size() n += 2 + l + sovTypes(uint64(l)) } return n } -func (m *Response_ValidateOracleVotes) Size() (n int) { +func (m *Response_FetchOracleVotes) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.ValidateOracleVotes != nil { - l = m.ValidateOracleVotes.Size() + if m.FetchOracleVotes != nil { + l = m.FetchOracleVotes.Size() n += 2 + l + sovTypes(uint64(l)) } return n @@ -9553,22 +9211,6 @@ func (m *ResponseFetchOracleVotes) Size() (n int) { return n } -func (m *ResponseValidateOracleVotes) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.EncodedOracleTx) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - if m.Status != 0 { - n += 1 + sovTypes(uint64(m.Status)) - } - return n -} - func (m *CommitInfo) Size() (n int) { if m == nil { return 0 @@ -10484,41 +10126,6 @@ func (m *Request) Unmarshal(dAtA []byte) error { } m.Value = &Request_FetchOracleVotes{v} iNdEx = postIndex - case 23: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidateOracleVotes", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &RequestValidateOracleVotes{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &Request_ValidateOracleVotes{v} - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -13337,90 +12944,6 @@ func (m *RequestFetchOracleVotes) Unmarshal(dAtA []byte) error { } return nil } -func (m *RequestValidateOracleVotes) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: RequestValidateOracleVotes: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RequestValidateOracleVotes: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OracleTx", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.OracleTx = append(m.OracleTx[:0], dAtA[iNdEx:postIndex]...) - if m.OracleTx == nil { - m.OracleTx = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *Response) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -14115,41 +13638,6 @@ func (m *Response) Unmarshal(dAtA []byte) error { } m.Value = &Response_FetchOracleVotes{v} iNdEx = postIndex - case 24: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidateOracleVotes", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &ResponseValidateOracleVotes{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &Response_ValidateOracleVotes{v} - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -16482,109 +15970,6 @@ func (m *ResponseFetchOracleVotes) Unmarshal(dAtA []byte) error { } return nil } -func (m *ResponseValidateOracleVotes) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ResponseValidateOracleVotes: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ResponseValidateOracleVotes: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EncodedOracleTx", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EncodedOracleTx = append(m.EncodedOracleTx[:0], dAtA[iNdEx:postIndex]...) - if m.EncodedOracleTx == nil { - m.EncodedOracleTx = []byte{} - } - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - m.Status = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Status |= ResponseValidateOracleVotes_Status(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *CommitInfo) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto index 458db58f29e..43ca0a12765 100644 --- a/proto/tendermint/abci/types.proto +++ b/proto/tendermint/abci/types.proto @@ -37,7 +37,6 @@ service ABCI { rpc FinalizeBlock(RequestFinalizeBlock) returns (ResponseFinalizeBlock); rpc CreateOracleResultTx(RequestCreateOracleResultTx) returns (ResponseCreateOracleResultTx); rpc FetchOracleVotes(RequestFetchOracleVotes) returns (ResponseFetchOracleVotes); - rpc ValidateOracleVotes(RequestValidateOracleVotes) returns (ResponseValidateOracleVotes); } //---------------------------------------- @@ -63,7 +62,6 @@ message Request { RequestFinalizeBlock finalize_block = 20; RequestCreateOracleResultTx create_oracle_result_tx = 21; RequestFetchOracleVotes fetch_oracle_votes = 22; - RequestValidateOracleVotes validate_oracle_votes = 23; } reserved 4, 7, 9, 10; // SetOption, BeginBlock, DeliverTx, EndBlock } @@ -208,10 +206,6 @@ message RequestCreateOracleResultTx { message RequestFetchOracleVotes {} -message RequestValidateOracleVotes { - bytes oracle_tx = 1; -} - //---------------------------------------- // Response types @@ -236,7 +230,6 @@ message Response { ResponseFinalizeBlock finalize_block = 21; ResponseCreateOracleResultTx create_oracle_result_tx = 22; ResponseFetchOracleVotes fetch_oracle_votes = 23; - ResponseValidateOracleVotes validate_oracle_votes = 24; } reserved 5, 8, 10, 11; // SetOption, BeginBlock, DeliverTx, EndBlock } @@ -395,16 +388,6 @@ message ResponseFetchOracleVotes { tendermint.oracle.Vote vote = 1; } -message ResponseValidateOracleVotes { - bytes encoded_oracle_tx = 1; - Status status = 2; - - enum Status { - absent = 0; - present = 1; - } -} - //---------------------------------------- // Misc. diff --git a/proxy/app_conn.go b/proxy/app_conn.go index 6d411b91c29..ab474d73e71 100644 --- a/proxy/app_conn.go +++ b/proxy/app_conn.go @@ -26,7 +26,6 @@ type AppConnConsensus interface { Commit(context.Context) (*types.ResponseCommit, error) CreateOracleResultTx(context.Context, *types.RequestCreateOracleResultTx) (*types.ResponseCreateOracleResultTx, error) FetchOracleVotes(context.Context, *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error) - ValidateOracleVotes(context.Context, *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) } type AppConnMempool interface { @@ -122,11 +121,6 @@ func (app *appConnConsensus) FetchOracleVotes(ctx context.Context, req *types.Re return app.appConn.FetchOracleVotes(ctx, req) } -func (app *appConnConsensus) ValidateOracleVotes(ctx context.Context, req *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) { - defer addTimeSample(app.metrics.MethodTimingSeconds.With("method", "commit", "type", "sync"))() - return app.appConn.ValidateOracleVotes(ctx, req) -} - //------------------------------------------------ // Implements AppConnMempool (subset of abcicli.Client) diff --git a/proxy/mocks/app_conn_consensus.go b/proxy/mocks/app_conn_consensus.go index 5b4e653e0ec..b4269dd0f41 100644 --- a/proxy/mocks/app_conn_consensus.go +++ b/proxy/mocks/app_conn_consensus.go @@ -237,32 +237,6 @@ func (_m *AppConnConsensus) CreateOracleResultTx(_a0 context.Context, _a1 *types return r0, r1 } -// ValidateOracleVotes provides a mock function with given fields: _a0, _a1 -func (_m *AppConnConsensus) ValidateOracleVotes(_a0 context.Context, _a1 *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) { - ret := _m.Called(_a0, _a1) - - var r0 *types.ResponseValidateOracleVotes - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error)); ok { - return rf(_a0, _a1) - } - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestValidateOracleVotes) *types.ResponseValidateOracleVotes); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.ResponseValidateOracleVotes) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *types.RequestValidateOracleVotes) error); ok { - r1 = rf(_a0, _a1) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - // VerifyVoteExtension provides a mock function with given fields: _a0, _a1 func (_m *AppConnConsensus) VerifyVoteExtension(_a0 context.Context, _a1 *types.RequestVerifyVoteExtension) (*types.ResponseVerifyVoteExtension, error) { ret := _m.Called(_a0, _a1) From 127a875f29a8b6a420cf77e0fe62f45667cc1b7e Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 7 May 2024 16:58:00 +0800 Subject: [PATCH 113/150] remove testing logs --- config/config.go | 2 +- oracle/reactor.go | 13 ------------- oracle/service/runner/runner.go | 6 ------ 3 files changed, 1 insertion(+), 20 deletions(-) diff --git a/config/config.go b/config/config.go index cde8969c719..631733ef0bb 100644 --- a/config/config.go +++ b/config/config.go @@ -854,7 +854,7 @@ type OracleConfig struct { // DefaultOracleConfig returns a default configuration for the CometBFT oracle service func DefaultOracleConfig() *OracleConfig { return &OracleConfig{ - MaxGossipVoteAge: 2, // keep all gossipVotes from 2 blocks behind + MaxGossipVoteAge: 3, // keep all gossipVotes from 3 blocks behind SignInterval: 100 * time.Millisecond, // 0.1s GossipInterval: 100 * time.Millisecond, // 0.1s MaxGossipMsgSize: 65536, diff --git a/oracle/reactor.go b/oracle/reactor.go index 22f2ebff3f6..ccd14df4c2b 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -144,7 +144,6 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { } if success := pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature); !success { - logrus.Warnf("failed signature verification for validator with index: %v", msg.ValidatorIndex) oracleR.Logger.Error("failed signature verification for validator with index: %v", msg.ValidatorIndex) oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("oracle failed signature verification: %T", e.Message)) return @@ -228,8 +227,6 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { continue } - logrus.Infof("SIZE OF GOSSIP VOTE: %v", gossipVote.Size()) - success := peer.Send(p2p.Envelope{ ChannelID: OracleChannel, Message: gossipVote, @@ -244,13 +241,3 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { time.Sleep(interval) } } - -// TxsMessage is a Message containing transactions. -type TxsMessage struct { - Txs []types.Tx -} - -// String returns a string representation of the TxsMessage. -func (m *TxsMessage) String() string { - return fmt.Sprintf("[TxsMessage %v]", m.Txs) -} diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index ecc1600a937..b53674b1521 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -102,9 +102,6 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { for range ticker { lastBlockTime := consensusState.GetState().LastBlockTime - log.Infof("LAST BLOCK TIME: %v", lastBlockTime.Unix()) - log.Infof("BLOCK TIME STAMPS: %v", oracleInfo.BlockTimestamps) - if !contains(oracleInfo.BlockTimestamps, lastBlockTime.Unix()) { oracleInfo.BlockTimestamps = append(oracleInfo.BlockTimestamps, lastBlockTime.Unix()) } @@ -124,8 +121,6 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { for _, vote := range unsignedVoteBuffer { if vote.Timestamp >= oracleInfo.BlockTimestamps[0] { newVotes = append(newVotes, vote) - } else { - log.Infof("LASTEST ALLOWABLE TIMESTAMP: %v, DELETING VOTE: %v", oracleInfo.BlockTimestamps[0], vote) } } oracleInfo.UnsignedVoteBuffer.Buffer = newVotes @@ -137,7 +132,6 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { // prune gossip votes that have not been updated in the last x amt of blocks, where x is the maxGossipVoteAge for valAddr, gossipVote := range gossipBuffer { if gossipVote.SignedTimestamp < oracleInfo.BlockTimestamps[0] { - log.Infof("DELETING STALE GOSSIP BUFFER (%v) FOR VAL: %s", gossipVote.SignedTimestamp, valAddr) delete(gossipBuffer, valAddr) } } From 197c06a41babc440742485084abf0f233d753683 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 7 May 2024 18:13:32 +0800 Subject: [PATCH 114/150] remove validator field from gossipedVotes --- oracle/service/runner/runner.go | 1 - proto/tendermint/oracle/types.pb.go | 187 ++++++---------------------- proto/tendermint/oracle/types.proto | 16 ++- types/oracle.go | 1 - 4 files changed, 47 insertions(+), 158 deletions(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index b53674b1521..8d2e9190cc8 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -71,7 +71,6 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State // batch sign the entire unsignedVoteBuffer and add to gossipBuffer newGossipVote := &oracleproto.GossipedVotes{ - Validator: oracleInfo.PubKey.Address(), ValidatorIndex: validatorIndex, SignedTimestamp: time.Now().Unix(), Votes: unsignedVotes, diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index 43b0a7b7c49..725073f07f0 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -91,11 +91,10 @@ func (m *Vote) GetData() string { } type GossipedVotes struct { - Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` - ValidatorIndex int32 `protobuf:"varint,2,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` - Votes []*Vote `protobuf:"bytes,3,rep,name=votes,proto3" json:"votes,omitempty"` - SignedTimestamp int64 `protobuf:"varint,4,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` - Signature []byte `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` + ValidatorIndex int32 `protobuf:"varint,1,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` + Votes []*Vote `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes,omitempty"` + SignedTimestamp int64 `protobuf:"varint,3,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` + Signature []byte `protobuf:"bytes,4,opt,name=signature,proto3" json:"signature,omitempty"` } func (m *GossipedVotes) Reset() { *m = GossipedVotes{} } @@ -131,13 +130,6 @@ func (m *GossipedVotes) XXX_DiscardUnknown() { var xxx_messageInfo_GossipedVotes proto.InternalMessageInfo -func (m *GossipedVotes) GetValidator() []byte { - if m != nil { - return m.Validator - } - return nil -} - func (m *GossipedVotes) GetValidatorIndex() int32 { if m != nil { return m.ValidatorIndex @@ -167,10 +159,9 @@ func (m *GossipedVotes) GetSignature() []byte { } type CanonicalGossipedVotes struct { - Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` - ValidatorIndex int32 `protobuf:"varint,2,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` - Votes []*Vote `protobuf:"bytes,3,rep,name=votes,proto3" json:"votes,omitempty"` - SignedTimestamp int64 `protobuf:"varint,4,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` + ValidatorIndex int32 `protobuf:"varint,1,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` + Votes []*Vote `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes,omitempty"` + SignedTimestamp int64 `protobuf:"varint,3,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` } func (m *CanonicalGossipedVotes) Reset() { *m = CanonicalGossipedVotes{} } @@ -206,13 +197,6 @@ func (m *CanonicalGossipedVotes) XXX_DiscardUnknown() { var xxx_messageInfo_CanonicalGossipedVotes proto.InternalMessageInfo -func (m *CanonicalGossipedVotes) GetValidator() []byte { - if m != nil { - return m.Validator - } - return nil -} - func (m *CanonicalGossipedVotes) GetValidatorIndex() int32 { if m != nil { return m.ValidatorIndex @@ -243,28 +227,27 @@ func init() { func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 324 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x92, 0xbf, 0x4e, 0xf3, 0x30, - 0x14, 0xc5, 0xeb, 0x2f, 0xe9, 0x27, 0x62, 0xfe, 0x14, 0x3c, 0x40, 0x24, 0x8a, 0x55, 0x75, 0xa1, - 0x0c, 0x24, 0x12, 0xf0, 0x04, 0x30, 0xa0, 0x2e, 0x0c, 0x11, 0x62, 0x60, 0xa9, 0xdc, 0xd8, 0x14, - 0x4b, 0x8d, 0x1d, 0xc5, 0xb7, 0x15, 0xbc, 0x05, 0xaf, 0xc3, 0x1b, 0x30, 0xa1, 0x8e, 0x8c, 0xa8, - 0x7d, 0x11, 0x64, 0x5b, 0x4a, 0x90, 0xf2, 0x04, 0x6c, 0xd7, 0xbf, 0x73, 0xaf, 0xcf, 0x3d, 0xd2, - 0xc5, 0x27, 0x20, 0x14, 0x17, 0x55, 0x21, 0x15, 0xa4, 0xba, 0x62, 0xf9, 0x5c, 0xa4, 0xf0, 0x5a, - 0x0a, 0x93, 0x94, 0x95, 0x06, 0x4d, 0x0e, 0x1a, 0x39, 0xf1, 0xf2, 0xd0, 0xe0, 0xf0, 0x41, 0x83, - 0x20, 0x7d, 0x1c, 0x2d, 0xd9, 0x5c, 0x72, 0x06, 0xba, 0x8a, 0xd1, 0x00, 0x8d, 0xa2, 0xac, 0x01, - 0xe4, 0x18, 0x47, 0xbe, 0x7f, 0x22, 0x79, 0xfc, 0xcf, 0xa9, 0x5b, 0x1e, 0x8c, 0xb9, 0x1d, 0x05, - 0x59, 0x08, 0x03, 0xac, 0x28, 0xe3, 0x60, 0x80, 0x46, 0x41, 0xd6, 0x00, 0x42, 0x70, 0xc8, 0x19, - 0xb0, 0x38, 0x74, 0x53, 0xae, 0x1e, 0x7e, 0x22, 0xbc, 0x7b, 0xab, 0x8d, 0x91, 0xa5, 0xe0, 0xd6, - 0xdd, 0xb4, 0xed, 0x77, 0x7e, 0xdb, 0x9f, 0xe2, 0x5e, 0xfd, 0x98, 0x48, 0xc5, 0xc5, 0x8b, 0x5b, - 0xa2, 0x9b, 0xed, 0xd5, 0x78, 0x6c, 0x29, 0x39, 0xc7, 0xdd, 0xa5, 0xfd, 0x2f, 0x0e, 0x06, 0xc1, - 0x68, 0xfb, 0xe2, 0x28, 0x69, 0x05, 0x4e, 0xac, 0x5f, 0xe6, 0xbb, 0xc8, 0x19, 0xde, 0x37, 0x72, - 0xa6, 0x04, 0x9f, 0x34, 0x01, 0x42, 0x17, 0xa0, 0xe7, 0xf9, 0x7d, 0x1d, 0xa3, 0x8f, 0x23, 0x8b, - 0x18, 0x2c, 0x2a, 0x11, 0x77, 0xfd, 0x82, 0x35, 0x18, 0xbe, 0x23, 0x7c, 0x78, 0xc3, 0x94, 0x56, - 0x32, 0x67, 0xf3, 0xbf, 0x95, 0xec, 0xfa, 0xee, 0x63, 0x4d, 0xd1, 0x6a, 0x4d, 0xd1, 0xf7, 0x9a, - 0xa2, 0xb7, 0x0d, 0xed, 0xac, 0x36, 0xb4, 0xf3, 0xb5, 0xa1, 0x9d, 0xc7, 0xab, 0x99, 0x84, 0xe7, - 0xc5, 0x34, 0xc9, 0x75, 0x91, 0xe6, 0xba, 0x10, 0x30, 0x7d, 0x82, 0xa6, 0x70, 0x27, 0x95, 0xb6, - 0x0e, 0x6e, 0xfa, 0xdf, 0x09, 0x97, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xf1, 0xb8, 0xf7, 0x83, - 0x8c, 0x02, 0x00, 0x00, + // 316 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x92, 0x3d, 0x4e, 0xc3, 0x30, + 0x14, 0xc7, 0xeb, 0x7e, 0x20, 0x62, 0x3e, 0x0a, 0x1e, 0x20, 0x12, 0xc5, 0xaa, 0xba, 0x50, 0x06, + 0x12, 0x09, 0x38, 0x01, 0x0c, 0xa8, 0x0b, 0x43, 0x84, 0x18, 0x58, 0x2a, 0x27, 0x36, 0xc5, 0x52, + 0x62, 0x47, 0xf1, 0x6b, 0x05, 0xb7, 0x60, 0xe7, 0x12, 0x1c, 0x83, 0xb1, 0x23, 0x23, 0x4a, 0x2e, + 0x82, 0xec, 0x48, 0x89, 0x44, 0x2f, 0xc0, 0xf6, 0xf4, 0xfb, 0xbf, 0xe7, 0xf7, 0xb3, 0xf4, 0xf0, + 0x29, 0x08, 0xc5, 0x45, 0x91, 0x49, 0x05, 0xa1, 0x2e, 0x58, 0x92, 0x8a, 0x10, 0xde, 0x72, 0x61, + 0x82, 0xbc, 0xd0, 0xa0, 0xc9, 0x61, 0x1b, 0x07, 0x75, 0x3c, 0x31, 0xb8, 0xff, 0xa8, 0x41, 0x90, + 0x11, 0xf6, 0x56, 0x2c, 0x95, 0x9c, 0x81, 0x2e, 0x7c, 0x34, 0x46, 0x53, 0x2f, 0x6a, 0x01, 0x39, + 0xc1, 0x5e, 0xdd, 0x3f, 0x97, 0xdc, 0xef, 0xba, 0x74, 0xbb, 0x06, 0x33, 0x6e, 0x47, 0x41, 0x66, + 0xc2, 0x00, 0xcb, 0x72, 0xbf, 0x37, 0x46, 0xd3, 0x5e, 0xd4, 0x02, 0x42, 0x70, 0x9f, 0x33, 0x60, + 0x7e, 0xdf, 0x4d, 0xb9, 0x7a, 0xf2, 0x89, 0xf0, 0xde, 0x9d, 0x36, 0x46, 0xe6, 0x82, 0xdb, 0xed, + 0x86, 0x9c, 0xe1, 0x61, 0xb3, 0x6d, 0x2e, 0x15, 0x17, 0xaf, 0x4e, 0x62, 0x10, 0xed, 0x37, 0x78, + 0x66, 0x29, 0xb9, 0xc0, 0x83, 0x95, 0x9d, 0xf0, 0xbb, 0xe3, 0xde, 0x74, 0xe7, 0xf2, 0x38, 0xd8, + 0xf8, 0x52, 0x60, 0x5f, 0x8c, 0xea, 0x2e, 0x72, 0x8e, 0x0f, 0x8c, 0x5c, 0x28, 0xc1, 0xe7, 0x7f, + 0x15, 0x87, 0x35, 0x7f, 0x68, 0x44, 0x47, 0xd8, 0xb3, 0x88, 0xc1, 0xb2, 0x10, 0xce, 0x76, 0x37, + 0x6a, 0xc1, 0xe4, 0x03, 0xe1, 0xa3, 0x5b, 0xa6, 0xb4, 0x92, 0x09, 0x4b, 0xff, 0x9b, 0xfb, 0xcd, + 0xfd, 0x57, 0x49, 0xd1, 0xba, 0xa4, 0xe8, 0xa7, 0xa4, 0xe8, 0xbd, 0xa2, 0x9d, 0x75, 0x45, 0x3b, + 0xdf, 0x15, 0xed, 0x3c, 0x5d, 0x2f, 0x24, 0xbc, 0x2c, 0xe3, 0x20, 0xd1, 0x59, 0x98, 0xe8, 0x4c, + 0x40, 0xfc, 0x0c, 0x6d, 0xe1, 0xce, 0x22, 0xdc, 0x38, 0x9a, 0x78, 0xcb, 0x05, 0x57, 0xbf, 0x01, + 0x00, 0x00, 0xff, 0xff, 0x64, 0xa4, 0x9b, 0xfc, 0x50, 0x02, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -341,12 +324,12 @@ func (m *GossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.Signature) i = encodeVarintTypes(dAtA, i, uint64(len(m.Signature))) i-- - dAtA[i] = 0x2a + dAtA[i] = 0x22 } if m.SignedTimestamp != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.SignedTimestamp)) i-- - dAtA[i] = 0x20 + dAtA[i] = 0x18 } if len(m.Votes) > 0 { for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { @@ -359,20 +342,13 @@ func (m *GossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a + dAtA[i] = 0x12 } } if m.ValidatorIndex != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.ValidatorIndex)) i-- - dAtA[i] = 0x10 - } - if len(m.Validator) > 0 { - i -= len(m.Validator) - copy(dAtA[i:], m.Validator) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Validator))) - i-- - dAtA[i] = 0xa + dAtA[i] = 0x8 } return len(dAtA) - i, nil } @@ -400,7 +376,7 @@ func (m *CanonicalGossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) if m.SignedTimestamp != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.SignedTimestamp)) i-- - dAtA[i] = 0x20 + dAtA[i] = 0x18 } if len(m.Votes) > 0 { for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { @@ -413,20 +389,13 @@ func (m *CanonicalGossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a + dAtA[i] = 0x12 } } if m.ValidatorIndex != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.ValidatorIndex)) i-- - dAtA[i] = 0x10 - } - if len(m.Validator) > 0 { - i -= len(m.Validator) - copy(dAtA[i:], m.Validator) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Validator))) - i-- - dAtA[i] = 0xa + dAtA[i] = 0x8 } return len(dAtA) - i, nil } @@ -472,10 +441,6 @@ func (m *GossipedVotes) Size() (n int) { } var l int _ = l - l = len(m.Validator) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } if m.ValidatorIndex != 0 { n += 1 + sovTypes(uint64(m.ValidatorIndex)) } @@ -501,10 +466,6 @@ func (m *CanonicalGossipedVotes) Size() (n int) { } var l int _ = l - l = len(m.Validator) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } if m.ValidatorIndex != 0 { n += 1 + sovTypes(uint64(m.ValidatorIndex)) } @@ -721,40 +682,6 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) - if m.Validator == nil { - m.Validator = []byte{} - } - iNdEx = postIndex - case 2: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field ValidatorIndex", wireType) } @@ -773,7 +700,7 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { break } } - case 3: + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) } @@ -807,7 +734,7 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 4: + case 3: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field SignedTimestamp", wireType) } @@ -826,7 +753,7 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { break } } - case 5: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) } @@ -911,40 +838,6 @@ func (m *CanonicalGossipedVotes) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) - if m.Validator == nil { - m.Validator = []byte{} - } - iNdEx = postIndex - case 2: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field ValidatorIndex", wireType) } @@ -963,7 +856,7 @@ func (m *CanonicalGossipedVotes) Unmarshal(dAtA []byte) error { break } } - case 3: + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) } @@ -997,7 +890,7 @@ func (m *CanonicalGossipedVotes) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 4: + case 3: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field SignedTimestamp", wireType) } diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index fc60f0e68b4..fc1986cda46 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -11,16 +11,14 @@ message Vote { } message GossipedVotes { - bytes validator = 1; - int32 validator_index = 2; - repeated Vote votes = 3; - int64 signed_timestamp = 4; - bytes signature = 5; + int32 validator_index = 1; + repeated Vote votes = 2; + int64 signed_timestamp = 3; + bytes signature = 4; } message CanonicalGossipedVotes { - bytes validator = 1; - int32 validator_index = 2; - repeated Vote votes = 3; - int64 signed_timestamp = 4; + int32 validator_index = 1; + repeated Vote votes = 2; + int64 signed_timestamp = 3; } diff --git a/types/oracle.go b/types/oracle.go index bbf3de08b45..fca713cf2ae 100644 --- a/types/oracle.go +++ b/types/oracle.go @@ -17,7 +17,6 @@ func OracleVoteSignBytes(vote *oracleproto.GossipedVotes) []byte { func CanonicalizeOracleVote(vote *oracleproto.GossipedVotes) oracleproto.CanonicalGossipedVotes { return oracleproto.CanonicalGossipedVotes{ - Validator: vote.Validator, ValidatorIndex: vote.ValidatorIndex, Votes: vote.Votes, SignedTimestamp: vote.SignedTimestamp, From 361b4d4efa1498d255283514f7574eb47b1c7c3f Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 7 May 2024 19:15:16 +0800 Subject: [PATCH 115/150] Revert "remove validator field from gossipedVotes" This reverts commit 197c06a41babc440742485084abf0f233d753683. --- oracle/service/runner/runner.go | 1 + proto/tendermint/oracle/types.pb.go | 187 ++++++++++++++++++++++------ proto/tendermint/oracle/types.proto | 16 +-- types/oracle.go | 1 + 4 files changed, 158 insertions(+), 47 deletions(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 8d2e9190cc8..b53674b1521 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -71,6 +71,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State // batch sign the entire unsignedVoteBuffer and add to gossipBuffer newGossipVote := &oracleproto.GossipedVotes{ + Validator: oracleInfo.PubKey.Address(), ValidatorIndex: validatorIndex, SignedTimestamp: time.Now().Unix(), Votes: unsignedVotes, diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index 725073f07f0..43b0a7b7c49 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -91,10 +91,11 @@ func (m *Vote) GetData() string { } type GossipedVotes struct { - ValidatorIndex int32 `protobuf:"varint,1,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` - Votes []*Vote `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes,omitempty"` - SignedTimestamp int64 `protobuf:"varint,3,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` - Signature []byte `protobuf:"bytes,4,opt,name=signature,proto3" json:"signature,omitempty"` + Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` + ValidatorIndex int32 `protobuf:"varint,2,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` + Votes []*Vote `protobuf:"bytes,3,rep,name=votes,proto3" json:"votes,omitempty"` + SignedTimestamp int64 `protobuf:"varint,4,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` + Signature []byte `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` } func (m *GossipedVotes) Reset() { *m = GossipedVotes{} } @@ -130,6 +131,13 @@ func (m *GossipedVotes) XXX_DiscardUnknown() { var xxx_messageInfo_GossipedVotes proto.InternalMessageInfo +func (m *GossipedVotes) GetValidator() []byte { + if m != nil { + return m.Validator + } + return nil +} + func (m *GossipedVotes) GetValidatorIndex() int32 { if m != nil { return m.ValidatorIndex @@ -159,9 +167,10 @@ func (m *GossipedVotes) GetSignature() []byte { } type CanonicalGossipedVotes struct { - ValidatorIndex int32 `protobuf:"varint,1,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` - Votes []*Vote `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes,omitempty"` - SignedTimestamp int64 `protobuf:"varint,3,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` + Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` + ValidatorIndex int32 `protobuf:"varint,2,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` + Votes []*Vote `protobuf:"bytes,3,rep,name=votes,proto3" json:"votes,omitempty"` + SignedTimestamp int64 `protobuf:"varint,4,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` } func (m *CanonicalGossipedVotes) Reset() { *m = CanonicalGossipedVotes{} } @@ -197,6 +206,13 @@ func (m *CanonicalGossipedVotes) XXX_DiscardUnknown() { var xxx_messageInfo_CanonicalGossipedVotes proto.InternalMessageInfo +func (m *CanonicalGossipedVotes) GetValidator() []byte { + if m != nil { + return m.Validator + } + return nil +} + func (m *CanonicalGossipedVotes) GetValidatorIndex() int32 { if m != nil { return m.ValidatorIndex @@ -227,27 +243,28 @@ func init() { func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 316 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x92, 0x3d, 0x4e, 0xc3, 0x30, - 0x14, 0xc7, 0xeb, 0x7e, 0x20, 0x62, 0x3e, 0x0a, 0x1e, 0x20, 0x12, 0xc5, 0xaa, 0xba, 0x50, 0x06, - 0x12, 0x09, 0x38, 0x01, 0x0c, 0xa8, 0x0b, 0x43, 0x84, 0x18, 0x58, 0x2a, 0x27, 0x36, 0xc5, 0x52, - 0x62, 0x47, 0xf1, 0x6b, 0x05, 0xb7, 0x60, 0xe7, 0x12, 0x1c, 0x83, 0xb1, 0x23, 0x23, 0x4a, 0x2e, - 0x82, 0xec, 0x48, 0x89, 0x44, 0x2f, 0xc0, 0xf6, 0xf4, 0xfb, 0xbf, 0xe7, 0xf7, 0xb3, 0xf4, 0xf0, - 0x29, 0x08, 0xc5, 0x45, 0x91, 0x49, 0x05, 0xa1, 0x2e, 0x58, 0x92, 0x8a, 0x10, 0xde, 0x72, 0x61, - 0x82, 0xbc, 0xd0, 0xa0, 0xc9, 0x61, 0x1b, 0x07, 0x75, 0x3c, 0x31, 0xb8, 0xff, 0xa8, 0x41, 0x90, - 0x11, 0xf6, 0x56, 0x2c, 0x95, 0x9c, 0x81, 0x2e, 0x7c, 0x34, 0x46, 0x53, 0x2f, 0x6a, 0x01, 0x39, - 0xc1, 0x5e, 0xdd, 0x3f, 0x97, 0xdc, 0xef, 0xba, 0x74, 0xbb, 0x06, 0x33, 0x6e, 0x47, 0x41, 0x66, - 0xc2, 0x00, 0xcb, 0x72, 0xbf, 0x37, 0x46, 0xd3, 0x5e, 0xd4, 0x02, 0x42, 0x70, 0x9f, 0x33, 0x60, - 0x7e, 0xdf, 0x4d, 0xb9, 0x7a, 0xf2, 0x89, 0xf0, 0xde, 0x9d, 0x36, 0x46, 0xe6, 0x82, 0xdb, 0xed, - 0x86, 0x9c, 0xe1, 0x61, 0xb3, 0x6d, 0x2e, 0x15, 0x17, 0xaf, 0x4e, 0x62, 0x10, 0xed, 0x37, 0x78, - 0x66, 0x29, 0xb9, 0xc0, 0x83, 0x95, 0x9d, 0xf0, 0xbb, 0xe3, 0xde, 0x74, 0xe7, 0xf2, 0x38, 0xd8, - 0xf8, 0x52, 0x60, 0x5f, 0x8c, 0xea, 0x2e, 0x72, 0x8e, 0x0f, 0x8c, 0x5c, 0x28, 0xc1, 0xe7, 0x7f, - 0x15, 0x87, 0x35, 0x7f, 0x68, 0x44, 0x47, 0xd8, 0xb3, 0x88, 0xc1, 0xb2, 0x10, 0xce, 0x76, 0x37, - 0x6a, 0xc1, 0xe4, 0x03, 0xe1, 0xa3, 0x5b, 0xa6, 0xb4, 0x92, 0x09, 0x4b, 0xff, 0x9b, 0xfb, 0xcd, - 0xfd, 0x57, 0x49, 0xd1, 0xba, 0xa4, 0xe8, 0xa7, 0xa4, 0xe8, 0xbd, 0xa2, 0x9d, 0x75, 0x45, 0x3b, - 0xdf, 0x15, 0xed, 0x3c, 0x5d, 0x2f, 0x24, 0xbc, 0x2c, 0xe3, 0x20, 0xd1, 0x59, 0x98, 0xe8, 0x4c, - 0x40, 0xfc, 0x0c, 0x6d, 0xe1, 0xce, 0x22, 0xdc, 0x38, 0x9a, 0x78, 0xcb, 0x05, 0x57, 0xbf, 0x01, - 0x00, 0x00, 0xff, 0xff, 0x64, 0xa4, 0x9b, 0xfc, 0x50, 0x02, 0x00, 0x00, + // 324 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x92, 0xbf, 0x4e, 0xf3, 0x30, + 0x14, 0xc5, 0xeb, 0x2f, 0xe9, 0x27, 0x62, 0xfe, 0x14, 0x3c, 0x40, 0x24, 0x8a, 0x55, 0x75, 0xa1, + 0x0c, 0x24, 0x12, 0xf0, 0x04, 0x30, 0xa0, 0x2e, 0x0c, 0x11, 0x62, 0x60, 0xa9, 0xdc, 0xd8, 0x14, + 0x4b, 0x8d, 0x1d, 0xc5, 0xb7, 0x15, 0xbc, 0x05, 0xaf, 0xc3, 0x1b, 0x30, 0xa1, 0x8e, 0x8c, 0xa8, + 0x7d, 0x11, 0x64, 0x5b, 0x4a, 0x90, 0xf2, 0x04, 0x6c, 0xd7, 0xbf, 0x73, 0xaf, 0xcf, 0x3d, 0xd2, + 0xc5, 0x27, 0x20, 0x14, 0x17, 0x55, 0x21, 0x15, 0xa4, 0xba, 0x62, 0xf9, 0x5c, 0xa4, 0xf0, 0x5a, + 0x0a, 0x93, 0x94, 0x95, 0x06, 0x4d, 0x0e, 0x1a, 0x39, 0xf1, 0xf2, 0xd0, 0xe0, 0xf0, 0x41, 0x83, + 0x20, 0x7d, 0x1c, 0x2d, 0xd9, 0x5c, 0x72, 0x06, 0xba, 0x8a, 0xd1, 0x00, 0x8d, 0xa2, 0xac, 0x01, + 0xe4, 0x18, 0x47, 0xbe, 0x7f, 0x22, 0x79, 0xfc, 0xcf, 0xa9, 0x5b, 0x1e, 0x8c, 0xb9, 0x1d, 0x05, + 0x59, 0x08, 0x03, 0xac, 0x28, 0xe3, 0x60, 0x80, 0x46, 0x41, 0xd6, 0x00, 0x42, 0x70, 0xc8, 0x19, + 0xb0, 0x38, 0x74, 0x53, 0xae, 0x1e, 0x7e, 0x22, 0xbc, 0x7b, 0xab, 0x8d, 0x91, 0xa5, 0xe0, 0xd6, + 0xdd, 0xb4, 0xed, 0x77, 0x7e, 0xdb, 0x9f, 0xe2, 0x5e, 0xfd, 0x98, 0x48, 0xc5, 0xc5, 0x8b, 0x5b, + 0xa2, 0x9b, 0xed, 0xd5, 0x78, 0x6c, 0x29, 0x39, 0xc7, 0xdd, 0xa5, 0xfd, 0x2f, 0x0e, 0x06, 0xc1, + 0x68, 0xfb, 0xe2, 0x28, 0x69, 0x05, 0x4e, 0xac, 0x5f, 0xe6, 0xbb, 0xc8, 0x19, 0xde, 0x37, 0x72, + 0xa6, 0x04, 0x9f, 0x34, 0x01, 0x42, 0x17, 0xa0, 0xe7, 0xf9, 0x7d, 0x1d, 0xa3, 0x8f, 0x23, 0x8b, + 0x18, 0x2c, 0x2a, 0x11, 0x77, 0xfd, 0x82, 0x35, 0x18, 0xbe, 0x23, 0x7c, 0x78, 0xc3, 0x94, 0x56, + 0x32, 0x67, 0xf3, 0xbf, 0x95, 0xec, 0xfa, 0xee, 0x63, 0x4d, 0xd1, 0x6a, 0x4d, 0xd1, 0xf7, 0x9a, + 0xa2, 0xb7, 0x0d, 0xed, 0xac, 0x36, 0xb4, 0xf3, 0xb5, 0xa1, 0x9d, 0xc7, 0xab, 0x99, 0x84, 0xe7, + 0xc5, 0x34, 0xc9, 0x75, 0x91, 0xe6, 0xba, 0x10, 0x30, 0x7d, 0x82, 0xa6, 0x70, 0x27, 0x95, 0xb6, + 0x0e, 0x6e, 0xfa, 0xdf, 0x09, 0x97, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xf1, 0xb8, 0xf7, 0x83, + 0x8c, 0x02, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -324,12 +341,12 @@ func (m *GossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.Signature) i = encodeVarintTypes(dAtA, i, uint64(len(m.Signature))) i-- - dAtA[i] = 0x22 + dAtA[i] = 0x2a } if m.SignedTimestamp != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.SignedTimestamp)) i-- - dAtA[i] = 0x18 + dAtA[i] = 0x20 } if len(m.Votes) > 0 { for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { @@ -342,13 +359,20 @@ func (m *GossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x12 + dAtA[i] = 0x1a } } if m.ValidatorIndex != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.ValidatorIndex)) i-- - dAtA[i] = 0x8 + dAtA[i] = 0x10 + } + if len(m.Validator) > 0 { + i -= len(m.Validator) + copy(dAtA[i:], m.Validator) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Validator))) + i-- + dAtA[i] = 0xa } return len(dAtA) - i, nil } @@ -376,7 +400,7 @@ func (m *CanonicalGossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) if m.SignedTimestamp != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.SignedTimestamp)) i-- - dAtA[i] = 0x18 + dAtA[i] = 0x20 } if len(m.Votes) > 0 { for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { @@ -389,13 +413,20 @@ func (m *CanonicalGossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x12 + dAtA[i] = 0x1a } } if m.ValidatorIndex != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.ValidatorIndex)) i-- - dAtA[i] = 0x8 + dAtA[i] = 0x10 + } + if len(m.Validator) > 0 { + i -= len(m.Validator) + copy(dAtA[i:], m.Validator) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Validator))) + i-- + dAtA[i] = 0xa } return len(dAtA) - i, nil } @@ -441,6 +472,10 @@ func (m *GossipedVotes) Size() (n int) { } var l int _ = l + l = len(m.Validator) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } if m.ValidatorIndex != 0 { n += 1 + sovTypes(uint64(m.ValidatorIndex)) } @@ -466,6 +501,10 @@ func (m *CanonicalGossipedVotes) Size() (n int) { } var l int _ = l + l = len(m.Validator) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } if m.ValidatorIndex != 0 { n += 1 + sovTypes(uint64(m.ValidatorIndex)) } @@ -682,6 +721,40 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) + if m.Validator == nil { + m.Validator = []byte{} + } + iNdEx = postIndex + case 2: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field ValidatorIndex", wireType) } @@ -700,7 +773,7 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { break } } - case 2: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) } @@ -734,7 +807,7 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 3: + case 4: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field SignedTimestamp", wireType) } @@ -753,7 +826,7 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { break } } - case 4: + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) } @@ -838,6 +911,40 @@ func (m *CanonicalGossipedVotes) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) + if m.Validator == nil { + m.Validator = []byte{} + } + iNdEx = postIndex + case 2: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field ValidatorIndex", wireType) } @@ -856,7 +963,7 @@ func (m *CanonicalGossipedVotes) Unmarshal(dAtA []byte) error { break } } - case 2: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) } @@ -890,7 +997,7 @@ func (m *CanonicalGossipedVotes) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 3: + case 4: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field SignedTimestamp", wireType) } diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index fc1986cda46..fc60f0e68b4 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -11,14 +11,16 @@ message Vote { } message GossipedVotes { - int32 validator_index = 1; - repeated Vote votes = 2; - int64 signed_timestamp = 3; - bytes signature = 4; + bytes validator = 1; + int32 validator_index = 2; + repeated Vote votes = 3; + int64 signed_timestamp = 4; + bytes signature = 5; } message CanonicalGossipedVotes { - int32 validator_index = 1; - repeated Vote votes = 2; - int64 signed_timestamp = 3; + bytes validator = 1; + int32 validator_index = 2; + repeated Vote votes = 3; + int64 signed_timestamp = 4; } diff --git a/types/oracle.go b/types/oracle.go index fca713cf2ae..bbf3de08b45 100644 --- a/types/oracle.go +++ b/types/oracle.go @@ -17,6 +17,7 @@ func OracleVoteSignBytes(vote *oracleproto.GossipedVotes) []byte { func CanonicalizeOracleVote(vote *oracleproto.GossipedVotes) oracleproto.CanonicalGossipedVotes { return oracleproto.CanonicalGossipedVotes{ + Validator: vote.Validator, ValidatorIndex: vote.ValidatorIndex, Votes: vote.Votes, SignedTimestamp: vote.SignedTimestamp, From 0448cb5f63e336e938d2d243170750a532e4a6b4 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Wed, 8 May 2024 15:16:57 +0800 Subject: [PATCH 116/150] add config for prune interval, revert go.mod go.sum --- config/config.go | 8 +- config/toml.go | 3 + go.mod | 60 ++----- go.sum | 273 +++----------------------------- oracle/service/runner/runner.go | 9 +- 5 files changed, 56 insertions(+), 297 deletions(-) diff --git a/config/config.go b/config/config.go index 631733ef0bb..4dc47ddebe4 100644 --- a/config/config.go +++ b/config/config.go @@ -847,6 +847,8 @@ type OracleConfig struct { SignInterval time.Duration `mapstructure:"sign_interval"` // Interval determines how long we should wait between gossiping of votes GossipInterval time.Duration `mapstructure:"gossip_interval"` + // Interval determines how long we should wait between trying to prune + PruneInterval time.Duration `mapstructure:"prune_interval"` // Max allowable size for votes that can be gossiped from peer to peer MaxGossipMsgSize int `mapstructure:"max_gossip_msg_size"` } @@ -857,6 +859,7 @@ func DefaultOracleConfig() *OracleConfig { MaxGossipVoteAge: 3, // keep all gossipVotes from 3 blocks behind SignInterval: 100 * time.Millisecond, // 0.1s GossipInterval: 100 * time.Millisecond, // 0.1s + PruneInterval: 500 * time.Millisecond, // 0.5s MaxGossipMsgSize: 65536, } } @@ -877,7 +880,10 @@ func (cfg *OracleConfig) ValidateBasic() error { return errors.New("sign_interval can't be negative") } if cfg.GossipInterval < 0 { - return errors.New("sync_interval can't be negative") + return errors.New("gossip_interval can't be negative") + } + if cfg.PruneInterval < 0 { + return errors.New("prune_interval can't be negative") } if cfg.MaxGossipMsgSize < 0 { return errors.New("max_gossip_msg_size can't be negative") diff --git a/config/toml.go b/config/toml.go index 36a0cc76b27..a2379ecc27c 100644 --- a/config/toml.go +++ b/config/toml.go @@ -418,6 +418,9 @@ sign_interval = "{{ .Oracle.SignInterval }}" # Interval determines how long we should wait between gossiping of votes gossip_interval = "{{ .Oracle.GossipInterval }}" +# Interval determines how long we should wait between trying to prune +prune_interval = "{{ .Oracle.PruneInterval }}" + # Max allowable size for votes that can be gossiped from peer to peer max_gossip_msg_size = {{ .Oracle.MaxGossipMsgSize }} diff --git a/go.mod b/go.mod index 87d65edc115..22be3bf0553 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,7 @@ require ( github.com/stretchr/testify v1.8.4 golang.org/x/crypto v0.18.0 golang.org/x/net v0.20.0 - google.golang.org/grpc v1.61.0 + google.golang.org/grpc v1.60.0 ) require ( @@ -41,16 +41,14 @@ require ( ) require ( - cosmossdk.io/math v1.2.0 github.com/Masterminds/semver/v3 v3.2.0 github.com/btcsuite/btcd/btcec/v2 v2.3.2 github.com/btcsuite/btcd/btcutil v1.1.3 - github.com/cometbft/cometbft-db v0.10.0 + github.com/cometbft/cometbft-db v0.7.0 github.com/cosmos/gogoproto v1.4.11 github.com/go-git/go-git/v5 v5.11.0 github.com/gofrs/uuid v4.4.0+incompatible github.com/google/uuid v1.4.0 - github.com/holiman/uint256 v1.2.4 github.com/oasisprotocol/curve25519-voi v0.0.0-20220708102147-0a8a51822cae github.com/vektra/mockery/v2 v2.23.1 golang.org/x/sync v0.5.0 @@ -58,37 +56,6 @@ require ( google.golang.org/protobuf v1.31.0 ) -require ( - github.com/DataDog/zstd v1.4.5 // indirect - github.com/StackExchange/wmi v1.2.1 // indirect - github.com/bits-and-blooms/bitset v1.10.0 // indirect - github.com/cockroachdb/errors v1.8.1 // indirect - github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f // indirect - github.com/cockroachdb/pebble v1.0.0 // indirect - github.com/cockroachdb/redact v1.0.8 // indirect - github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 // indirect - github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.12.1 // indirect - github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect - github.com/deckarep/golang-set/v2 v2.1.0 // indirect - github.com/ethereum/c-kzg-4844 v0.4.0 // indirect - github.com/go-ole/go-ole v1.3.0 // indirect - github.com/kr/pretty v0.3.1 // indirect - github.com/kr/text v0.2.0 // indirect - github.com/linxGnu/grocksdb v1.8.11 // indirect - github.com/mmcloughlin/addchain v0.4.0 // indirect - github.com/rivo/uniseg v0.2.0 // indirect - github.com/rogpeppe/go-internal v1.11.0 // indirect - github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect - github.com/supranational/blst v0.3.11 // indirect - github.com/tidwall/match v1.1.1 // indirect - github.com/tidwall/pretty v1.2.0 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f // indirect - rsc.io/tmplfunc v0.0.3 // indirect -) - require ( 4d63.com/gocheckcompilerdirectives v1.2.1 // indirect 4d63.com/gochecknoglobals v0.2.1 // indirect @@ -143,8 +110,10 @@ require ( github.com/dustin/go-humanize v1.0.1 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/esimonov/ifshort v1.0.4 // indirect - github.com/ethereum/go-ethereum v1.13.11 github.com/ettle/strcase v0.1.1 // indirect + github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c // indirect + github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 // indirect + github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 // indirect github.com/fatih/color v1.15.0 // indirect github.com/fatih/structtag v1.2.0 // indirect github.com/felixge/fgprof v0.9.3 // indirect @@ -157,8 +126,6 @@ require ( github.com/go-git/go-billy/v5 v5.5.0 // indirect github.com/go-logr/logr v1.2.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-redis/redis v6.15.9+incompatible - github.com/go-redsync/redsync/v4 v4.11.0 github.com/go-toolsmith/astcast v1.1.0 // indirect github.com/go-toolsmith/astcopy v1.1.0 // indirect github.com/go-toolsmith/astequal v1.1.0 // indirect @@ -173,7 +140,7 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/glog v1.1.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/golang/snappy v0.0.4 // indirect github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 // indirect github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe // indirect @@ -228,7 +195,7 @@ require ( github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.17 // indirect - github.com/mattn/go-runewidth v0.0.13 // indirect + github.com/mattn/go-runewidth v0.0.9 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mbilski/exhaustivestruct v1.2.0 // indirect github.com/mgechev/revive v1.3.1 // indirect @@ -271,7 +238,7 @@ require ( github.com/securego/gosec/v2 v2.15.0 // indirect github.com/sergi/go-diff v1.2.0 // indirect github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c // indirect - github.com/sirupsen/logrus v1.9.0 + github.com/sirupsen/logrus v1.9.0 // indirect github.com/sivchari/containedctx v1.0.2 // indirect github.com/sivchari/nosnakecase v1.7.0 // indirect github.com/sivchari/tenv v1.7.1 // indirect @@ -288,8 +255,8 @@ require ( github.com/subosito/gotenv v1.6.0 // indirect github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c // indirect github.com/tdakkota/asciicheck v0.2.0 // indirect + github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c // indirect github.com/tetafro/godot v1.4.11 // indirect - github.com/tidwall/gjson v1.17.0 github.com/timakin/bodyclose v0.0.0-20221125081123-e39cf3fc478e // indirect github.com/timonwong/loggercheck v0.9.4 // indirect github.com/tomarrell/wrapcheck/v2 v2.8.1 // indirect @@ -301,20 +268,21 @@ require ( github.com/yagipy/maintidx v1.0.0 // indirect github.com/yeya24/promlinter v0.2.0 // indirect gitlab.com/bosi/decorder v0.2.3 // indirect - go.etcd.io/bbolt v1.3.8 // indirect + go.etcd.io/bbolt v1.3.6 // indirect go.opentelemetry.io/otel v1.14.0 // indirect go.opentelemetry.io/otel/sdk v1.14.0 // indirect go.opentelemetry.io/otel/trace v1.14.0 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.10.0 // indirect go.uber.org/zap v1.24.0 // indirect - golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/exp/typeparams v0.0.0-20230307190834-24139beb5833 // indirect - golang.org/x/mod v0.14.0 // indirect + golang.org/x/mod v0.12.0 // indirect golang.org/x/sys v0.16.0 // indirect golang.org/x/term v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.15.0 // indirect + golang.org/x/tools v0.13.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index d95e3fc8457..b6eeec19b31 100644 --- a/go.sum +++ b/go.sum @@ -34,14 +34,11 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cosmossdk.io/math v1.2.0 h1:8gudhTkkD3NxOP2YyyJIYYmt6dQ55ZfJkDOaxXpy7Ig= -cosmossdk.io/math v1.2.0/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Abirdcfly/dupword v0.0.11 h1:z6v8rMETchZXUIuHxYNmlUAuKuB21PeaSymTed16wgU= github.com/Abirdcfly/dupword v0.0.11/go.mod h1:wH8mVGuf3CP5fsBTkfWwwwKTjDnVVCxtU8d8rgeVYXA= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/Antonboom/errname v0.1.9 h1:BZDX4r3l4TBZxZ2o2LNrlGxSHran4d1u4veZdoORTT4= github.com/Antonboom/errname v0.1.9/go.mod h1:nLTcJzevREuAsgTbG85UsuiWpMpAqbKD1HNZ29OzE58= github.com/Antonboom/nilnil v0.1.3 h1:6RTbx3d2mcEu3Zwq9TowQpQMVpP75zugwOtqY1RTtcE= @@ -52,18 +49,12 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= -github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= -github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM= github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 h1:+r1rSv4gvYn0wmRjC8X7IAzX8QezqtFV9m0MUHFJgts= github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= @@ -79,17 +70,11 @@ github.com/OpenPeeDeeP/depguard v1.1.1 h1:TSUznLjvp/4IUP+OQ0t/4jF4QUyxIcVX8YnghZ github.com/OpenPeeDeeP/depguard v1.1.1/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc= github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 h1:kkhsdkhsCvIsutKu5zLMgWtgh9YxGCNAw8Ad8hjwfYg= github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= -github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= -github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= -github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= -github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -108,15 +93,12 @@ github.com/ashanbrown/forbidigo v1.5.1 h1:WXhzLjOlnuDYPYQo/eFlcFMi8X/kLfvWLYu6CS github.com/ashanbrown/forbidigo v1.5.1/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU= github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s= github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= -github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bkielbasa/cyclop v1.2.0 h1:7Jmnh0yL2DjKfw28p86YTd/B4lRGcNuu12sKE35sM7A= github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M= @@ -186,27 +168,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs= github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= -github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= -github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= -github.com/cockroachdb/errors v1.8.1 h1:A5+txlVZfOqFBDa4mGz2bUWSp0aHElvHX2bKkdbQu+Y= -github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/cockroachdb/pebble v1.0.0 h1:WZWlV/s78glZbY2ylUITDOWSVBD3cLjcWPLRPFbHNYg= -github.com/cockroachdb/pebble v1.0.0/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= -github.com/cockroachdb/redact v1.0.8 h1:8QG/764wK+vmEYoOlfobpe12EQcS81ukx/a4hdVMxNw= -github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= -github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= -github.com/cometbft/cometbft-db v0.10.0 h1:VMBQh88zXn64jXVvj39tlu/IgsGR84T7ImjS523DCiU= -github.com/cometbft/cometbft-db v0.10.0/go.mod h1:7RR7NRv99j7keWJ5IkE9iZibUTKYdtepXTp7Ra0FxKk= -github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= -github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= -github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/cometbft/cometbft-db v0.7.0 h1:uBjbrBx4QzU0zOEnU8KxoDl18dMNgDh+zZRUE0ucsbo= +github.com/cometbft/cometbft-db v0.7.0/go.mod h1:yiKJIm2WKrt6x8Cyxtq9YTEcIMPcEe4XPxhgX59Fzf0= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= @@ -223,11 +186,6 @@ 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/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= -github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= -github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDUstnC9DIo= @@ -242,8 +200,6 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= -github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= @@ -253,18 +209,14 @@ github.com/denis-tingaikin/go-header v0.4.3 h1:tEaZKAlqql6SKCY++utLmkPLd6K8IBM20 github.com/denis-tingaikin/go-header v0.4.3/go.mod h1:0wOCWuN71D5qIgE2nz9KrKmuYBAC2Mra5RassOIQ2/c= github.com/denisenkom/go-mssqldb v0.12.0 h1:VtrkII767ttSPNRfFekePK3sctr+joXgO58stqQbtUA= github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/docker/cli v23.0.1+incompatible h1:LRyWITpGzl2C9e9uGxzisptnxAn1zfZKXy13Ul2Q5oM= github.com/docker/cli v23.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= @@ -281,7 +233,6 @@ github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= @@ -292,26 +243,22 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/esimonov/ifshort v1.0.4 h1:6SID4yGWfRae/M7hkVDVVyppy8q/v9OuxNdmjLQStBA= github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= -github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.11 h1:b51Dsm+rEg7anFRUMGB8hODXHvNfcRKzz9vcj8wSdUs= -github.com/ethereum/go-ethereum v1.13.11/go.mod h1:gFtlVORuUcT+UUIcJ/veCNjkuOSujCi338uSHJrYAew= github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw= github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= +github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= +github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= +github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= +github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= +github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 h1:7HZCaLC5+BZpmbhCOZJ293Lz68O7PYrF2EzeiFMwCLk= +github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g= github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw= github.com/firefart/nonamedreturns v1.0.4 h1:abzI1p7mAEPYuR4A+VLKn4eNDOycjYo2phmY9sfv40Y= github.com/firefart/nonamedreturns v1.0.4/go.mod h1:TDhe/tjI1BXo48CmYbUduTV7BdIga8MAO/xbKdcVsGI= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= -github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= @@ -323,22 +270,12 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= -github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= -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/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-chi/chi/v5 v5.0.8 h1:lD+NLqFcAi1ovnVZpsnObHGW4xb4J8lNmoYVfECH1Y0= github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-critic/go-critic v0.7.0 h1:tqbKzB8pqi0NsRZ+1pyU4aweAF7A7QN0Pi4Q02+rYnQ= github.com/go-critic/go-critic v0.7.0/go.mod h1:moYzd7GdVXE2C2hYTwd7h0CPcqlUeclsyBRwMa38v64= -github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= @@ -367,18 +304,6 @@ github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= -github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= -github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg= -github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= -github.com/go-redis/redis/v7 v7.4.0 h1:7obg6wUoj05T0EpY0o8B59S9w5yeMWql7sw2kwNW1x4= -github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= -github.com/go-redis/redis/v8 v8.11.4 h1:kHoYkfZP6+pe04aFTnhDH6GDROa5yJdHJVNxV3F46Tg= -github.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w= -github.com/go-redsync/redsync/v4 v4.11.0 h1:OPEcAxHBb95EzfwCKWM93ksOwHd5bTce2BD4+R14N6k= -github.com/go-redsync/redsync/v4 v4.11.0/go.mod h1:ZfayzutkgeBmEmBlUR3j+rF6kN44UUGtEdfzhBFZTPc= github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -404,9 +329,6 @@ github.com/go-xmlfmt/xmlfmt v1.1.2 h1:Nea7b4icn8s57fTx1M5AI4qQT5HEM3rVUO8MuE6g80 github.com/go-xmlfmt/xmlfmt v1.1.2/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= @@ -415,15 +337,9 @@ github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1 github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid/v5 v5.0.0 h1:p544++a97kEL+svbcFbCQVM9KFu0Yo25UoISXGNNH9M= github.com/gofrs/uuid/v5 v5.0.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8= -github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188 h1:+eHOFJl1BaXrQxKX+T06f78590z4qA2ZzBTqahsKSE4= @@ -462,9 +378,8 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= @@ -485,9 +400,6 @@ github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 h1:DIPQnGy2Gv2FSA github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6/go.mod h1:0AKcRCkMoKvUvlf89F6O7H2LYdhr1zBh736mBItOdRs= github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys= github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= -github.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws= -github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= @@ -508,10 +420,7 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-containerregistry v0.13.0 h1:y1C7Z3e149OJbOPDBxLYR8ITPz8dTKqQwjErKVHJC8k= github.com/google/go-containerregistry v0.13.0/go.mod h1:J9FQ+eSS4a1aC2GNZxvNpbWhgp0487v+cgiilB4FqDo= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= @@ -529,15 +438,12 @@ github.com/google/pprof v0.0.0-20230228050547-1710fef4ab10/go.mod h1:79YE0hCXdHa github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gordonklaus/ineffassign v0.0.0-20230107090616-13ace0543b28 h1:9alfqbrhuD+9fLZ4iaAVwhlp5PEhmnBt7yvK2Oy5C1U= github.com/gordonklaus/ineffassign v0.0.0-20230107090616-13ace0543b28/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= @@ -557,11 +463,8 @@ github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= -github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= @@ -571,34 +474,18 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= -github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= -github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= -github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= -github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= -github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/informalsystems/tm-load-test v1.3.0 h1:FGjKy7vBw6mXNakt+wmNWKggQZRsKkEYpaFk/zR64VA= github.com/informalsystems/tm-load-test v1.3.0/go.mod h1:OQ5AQ9TbT5hKWBNIwsMjn6Bf4O0U4b1kRc+0qZlQJKw= -github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= -github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= -github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= -github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jdxcode/netrc v0.0.0-20221124155335-4616370d1a84 h1:2uT3aivO7NVpUPGcQX7RbHijHMyWix/yCnIrCWc+5co= @@ -625,24 +512,14 @@ github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= -github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= -github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY= github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= github.com/junk1tm/musttag v0.5.0 h1:bV1DTdi38Hi4pG4OVWa7Kap0hi0o7EczuK6wQt9zPOM= github.com/junk1tm/musttag v0.5.0/go.mod h1:PcR7BA+oREQYvHwgjIDmw3exJeds5JzRcvEJTfjrA0M= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= -github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= -github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw= -github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/errcheck v1.6.3 h1:dEKh+GLHcWm2oN34nMvDzn1sqI0i0WxPvrgiJA5JuM8= github.com/kisielk/errcheck v1.6.3/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= @@ -651,12 +528,9 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/kkHAIKE/contextcheck v1.1.4 h1:B6zAaLhOEEcjvUgIYEqystmnFk1Oemn8bvJhbt0GMb8= github.com/kkHAIKE/contextcheck v1.1.4/go.mod h1:1+i/gWqokIa+dm31mqGLZhZJ7Uh44DJGZVmr6QRBNJg= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE= github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -675,26 +549,18 @@ github.com/kulti/thelper v0.6.3 h1:ElhKf+AlItIu+xGnI990no4cE2+XaSu1ULymV2Yulxs= github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= github.com/kunwardeep/paralleltest v1.0.6 h1:FCKYMF1OF2+RveWlABsdnmsvJrei5aoyZoaGS+Ugg8g= github.com/kunwardeep/paralleltest v1.0.6/go.mod h1:Y0Y0XISdZM5IKm3TREQMZ6iteqn1YuwCsJO/0kL9Zes= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/kyoh86/exportloopref v0.1.11 h1:1Z0bcmTypkL3Q4k+IDHMWTcnCliEZcaPiIe0/ymEyhQ= github.com/kyoh86/exportloopref v0.1.11/go.mod h1:qkV4UF1zGl6EkF1ox8L5t9SwyeBAZ3qLMd6up458uqA= -github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/ldez/gomoddirectives v0.2.3 h1:y7MBaisZVDYmKvt9/l1mjNCiSA1BVn34U0ObUcJwlhA= github.com/ldez/gomoddirectives v0.2.3/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= github.com/ldez/tagliatelle v0.4.0 h1:sylp7d9kh6AdXN2DpVGHBRb5guTVAgOxqNGhbqc4b1c= github.com/ldez/tagliatelle v0.4.0/go.mod h1:mNtTfrHy2haaBAw+VT7IBV6VXBThS7TCreYWbBcJ87I= -github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/leonklingele/grouper v1.1.1 h1:suWXRU57D4/Enn6pXR0QVqqWWrnJ9Osrz+5rjt8ivzU= github.com/leonklingele/grouper v1.1.1/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= -github.com/linxGnu/grocksdb v1.8.11 h1:BGol9e5gB1BrsTvOxloC88pe70TCqgrfLNwkyWW0kD8= -github.com/linxGnu/grocksdb v1.8.11/go.mod h1:xZCIb5Muw+nhbDK4Y5UJuOrin5MceOuiXkVUR7vp4WY= github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCEtOM= github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -708,33 +574,24 @@ github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 h1:gWg6ZQ4JhDfJPqlo2 github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.14.9 h1:10HX2Td0ocZpYEjhilsuo6WWtUqttj2Kb0KtD86/KYA= github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mbilski/exhaustivestruct v1.2.0 h1:wCBmUnSYufAHO6J4AVWY6ff+oxWxsVFrwgOdMUQePUo= github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= -github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= -github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= github.com/mgechev/revive v1.3.1 h1:OlQkcH40IB2cGuprTPcjB0iIUddgVZgGmDX3IAMR8D4= github.com/mgechev/revive v1.3.1/go.mod h1:YlD6TTWl2B8A103R9KWJSPVI9DrEf+oqr15q21Ld+5I= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= @@ -742,11 +599,6 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= -github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= -github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= -github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= -github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/moby/term v0.0.0-20221205130635-1aeaba878587 h1:HfkjXDfhgVaN5rmueG8cL8KKeFNecRCXFhaJ2qZ5SKA= github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= @@ -759,15 +611,11 @@ github.com/moricho/tparallel v0.3.0 h1:8dDx3S3e+jA+xiQXC7O3dvfRTe/J+FYlTDDW01Y7z github.com/moricho/tparallel v0.3.0/go.mod h1:leENX2cUv7Sv2qDgdi0D0fCftN8fRC67Bcn8pqzeYNI= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= -github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= -github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 h1:4kuARK6Y6FxaNu/BnU2OAaLF86eTVhP2hjTB6iMvItA= github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= @@ -786,7 +634,6 @@ github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6 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= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo/v2 v2.8.0 h1:pAM+oBNPrpXRs+E/8spkeGx9QgekbRVyr74EUvRVOUI= @@ -820,13 +667,10 @@ github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6 github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= -github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -875,14 +719,7 @@ github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4l github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/redis/go-redis/v9 v9.0.2 h1:BA426Zqe/7r56kCcvxYLWe1mkaz71LKF77GwgFzSxfE= -github.com/redis/go-redis/v9 v9.0.2/go.mod h1:/xDTe9EF1LM61hek62Poq2nzQSGj0xSrEtEHbBQevps= -github.com/redis/rueidis v1.0.19 h1:s65oWtotzlIFN8eMPhyYwxlwLR1lUdhza2KtWprKYSo= -github.com/redis/rueidis v1.0.19/go.mod h1:8B+r5wdnjwK3lTFml5VtxjzGOQAC+5UmujoD12pDrEo= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= @@ -898,7 +735,6 @@ github.com/ryancurrah/gomodguard v1.3.0 h1:q15RT/pd6UggBXVBuLps8BXRvl5GPBcwVA7BJ github.com/ryancurrah/gomodguard v1.3.0/go.mod h1:ggBxb3luypPEzqVtq33ee7YSN35V28XeGnid8dnni50= github.com/ryanrolds/sqlclosecheck v0.4.0 h1:i8SX60Rppc1wRuyQjMciLqIzV3xnoHB7/tXbr6RGYNI= github.com/ryanrolds/sqlclosecheck v0.4.0/go.mod h1:TBRRjzL31JONc9i4XMinicuo+s+E8yKZ5FN8X3G6CKQ= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= @@ -913,17 +749,13 @@ github.com/sashamelentyev/usestdlibvars v1.23.0 h1:01h+/2Kd+NblNItNeux0veSL5cBF1 github.com/sashamelentyev/usestdlibvars v1.23.0/go.mod h1:YPwr/Y1LATzHI93CqoPUN/2BzGQ/6N/cl/KwgR0B/aU= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/securego/gosec/v2 v2.15.0 h1:v4Ym7FF58/jlykYmmhZ7mTm7FQvN/setNm++0fgIAtw= github.com/securego/gosec/v2 v2.15.0/go.mod h1:VOjTrZOkUtSDt2QLSJmQBMWnvwiQPEjg0l+5juIqGk8= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= @@ -942,8 +774,6 @@ github.com/sivchari/tenv v1.7.1 h1:PSpuD4bu6fSmtWMxSGWcvqUUgIn7k3yOJhOIzVWn8Ak= github.com/sivchari/tenv v1.7.1/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ= github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa h1:YJfZp12Z3AFhSBeXOlv4BO55RMwPn2NoQeDsrdWnBtY= github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= github.com/sonatard/noctx v0.0.2 h1:L7Dz4De2zDQhW8S0t+KUjY0MAQJd6SgVwhzNIc4ok00= @@ -974,8 +804,6 @@ github.com/spf13/viper v1.18.1 h1:rmuU42rScKWlhhJDyXZRKJQHXFX02chSVW1IvkPGiVM= github.com/spf13/viper v1.18.1/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= -github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stbenjam/no-sprintf-host-port v0.1.1 h1:tYugd/yrm1O0dV+ThCbaKZh195Dfm07ysF0U6JQXczc= github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -995,12 +823,8 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stvp/tempredis v0.0.0-20181119212430-b82af8480203 h1:QVqDTf3h2WHt08YuiTGPZLls0Wq99X9bWd0Q5ZSBesM= -github.com/stvp/tempredis v0.0.0-20181119212430-b82af8480203/go.mod h1:oqN97ltKNihBbwlX8dLpwxCl3+HnXKV/R0e+sRLd9C8= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= -github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= @@ -1008,49 +832,30 @@ github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c h1:+aPplB github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c/go.mod h1:SbErYREK7xXdsRiigaQiQkI9McGRzYMvlKYaP3Nimdk= github.com/tdakkota/asciicheck v0.2.0 h1:o8jvnUANo0qXtnslk2d3nMKTFNlOnJjRrNcj0j9qkHM= github.com/tdakkota/asciicheck v0.2.0/go.mod h1:Qb7Y9EgjCLJGup51gDHFzbI08/gbGhL/UVhYIPWG2rg= +github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= +github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA= github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag= github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= github.com/tetafro/godot v1.4.11 h1:BVoBIqAf/2QdbFmSwAWnaIqDivZdOV0ZRwEm6jivLKw= github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= -github.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM= -github.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/timakin/bodyclose v0.0.0-20221125081123-e39cf3fc478e h1:MV6KaVu/hzByHP0UvJ4HcMGE/8a6A4Rggc/0wx2AvJo= github.com/timakin/bodyclose v0.0.0-20221125081123-e39cf3fc478e/go.mod h1:27bSVNWSBOHm+qRp1T9qzaIpsWEP6TbUnei/43HK+PQ= github.com/timonwong/loggercheck v0.9.4 h1:HKKhqrjcVj8sxL7K77beXh0adEm6DLjV/QOGeMXEVi4= github.com/timonwong/loggercheck v0.9.4/go.mod h1:caz4zlPcgvpEkXgVnAJGowHAMW2NwHaNlpS8xDbVhTg= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tomarrell/wrapcheck/v2 v2.8.1 h1:HxSqDSN0sAt0yJYsrcYVoEeyM4aI9yAm3KQpIXDJRhQ= github.com/tomarrell/wrapcheck/v2 v2.8.1/go.mod h1:/n2Q3NZ4XFT50ho6Hbxg+RV1uyo2Uow/Vdm9NQcl5SE= github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw= github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= -github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= -github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ultraware/funlen v0.0.3 h1:5ylVWm8wsNwH5aWo9438pwvsK0QiqVuUrt9bn7S/iLA= github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= github.com/ultraware/whitespace v0.0.5 h1:hh+/cpIcopyMYbZNVov9iSxvJU3OYQg78Sfaqzi/CzI= github.com/ultraware/whitespace v0.0.5/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= -github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= -github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/uudashr/gocognit v1.0.6 h1:2Cgi6MweCsdB6kpcVQp7EW4U23iBFQWfTXiWlyp842Y= github.com/uudashr/gocognit v1.0.6/go.mod h1:nAIUuVBnYU7pcninia3BHOvQkpQCeO76Uscky5BOwcY= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/vbatts/tar-split v0.11.2 h1:Via6XqJr0hceW4wff3QRzD5gAk/tatMw/4ZA7cTlIME= github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= github.com/vektra/mockery/v2 v2.23.1 h1:N59FENM2d/gWE6Ns5JPuf9a7jqQWeheGefZqvuvb1dM= @@ -1059,7 +864,6 @@ github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYp github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= @@ -1067,16 +871,10 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1: github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= github.com/yeya24/promlinter v0.2.0 h1:xFKDQ82orCU5jQujdaD8stOHiv8UN68BSdn2a8u8Y3o= github.com/yeya24/promlinter v0.2.0/go.mod h1:u54lkmBOZrpEbQQ6gox2zWKKLKu2SGe+2KOiextY+IA= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1086,8 +884,8 @@ github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= gitlab.com/bosi/decorder v0.2.3 h1:gX4/RgK16ijY8V+BRQHAySfQAb354T7/xQpDB2n10P0= gitlab.com/bosi/decorder v0.2.3/go.mod h1:9K1RB5+VPNQYtXtTDAzd2OEftsZb1oV0IrJrzChSdGE= -go.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA= -go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= +go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -1113,7 +911,6 @@ golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -1134,8 +931,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/exp/typeparams v0.0.0-20230307190834-24139beb5833 h1:jWGQJV4niP+CCmFW9ekjA9Zx8vYORzOUH2/Nl5WPuLQ= @@ -1168,18 +965,16 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -1188,7 +983,6 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1249,7 +1043,6 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1260,9 +1053,7 @@ golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1288,6 +1079,7 @@ golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1320,8 +1112,6 @@ golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1355,16 +1145,12 @@ golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -1423,8 +1209,8 @@ golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= -golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1453,7 +1239,6 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1485,7 +1270,6 @@ google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f h1:ultW7fxlIvee4HYrtnaRPon9HpEgFk5zYpmfMgtKB5I= google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f/go.mod h1:L9KNLi232K1/xB6f7AlSX692koaRnKaWSR0stBki0Yc= -google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1498,8 +1282,8 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0= -google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= +google.golang.org/grpc v1.60.0 h1:6FQAR0kM31P6MRdeluor2w2gPaS4SVNrD/DNTxrQ15k= +google.golang.org/grpc v1.60.0/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1524,13 +1308,8 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= @@ -1568,8 +1347,4 @@ mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d h1:3rvTIIM22r9pvXk+q3swxUQAQ mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d/go.mod h1:IeHQjmn6TOD+e4Z3RFiZMMsLVL+A96Nvptar8Fj71is= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= -rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= \ No newline at end of file diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index b53674b1521..501085cb2b6 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -98,7 +98,14 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { if maxGossipVoteAge == 0 { maxGossipVoteAge = 2 } - ticker := time.Tick(500 * time.Millisecond) + pruneInterval := oracleInfo.Config.PruneInterval + if pruneInterval == 0 { + if pruneInterval == 0 { + pruneInterval = 500 * time.Millisecond + } + } + + ticker := time.Tick(pruneInterval) for range ticker { lastBlockTime := consensusState.GetState().LastBlockTime From d7bbd24d618bfa1341f292bff6a28d5c83b850b1 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Wed, 8 May 2024 15:24:05 +0800 Subject: [PATCH 117/150] fix logs in oracle reactor and remove unused vars --- oracle/reactor.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index ccd14df4c2b..9f3ebf804c9 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -9,7 +9,6 @@ import ( "github.com/cometbft/cometbft/proxy" "github.com/sirupsen/logrus" - // cfg "github.com/cometbft/cometbft/config" "github.com/cometbft/cometbft/crypto" cs "github.com/cometbft/cometbft/consensus" @@ -27,10 +26,6 @@ const ( // PeerCatchupSleepIntervalMS defines how much time to sleep if a peer is behind PeerCatchupSleepIntervalMS = 100 - // UnknownPeerID is the peer ID to use when running CheckTx when there is - // no peer (e.g. RPC) - UnknownPeerID uint16 = 0 - MaxActiveIDs = math.MaxUint16 ) @@ -133,7 +128,8 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { // verify sig of incoming gossip vote, throw if verification fails _, val := oracleR.ConsensusState.Validators.GetByIndex(msg.ValidatorIndex) if val == nil { - logrus.Infof("validator with index: %v not found in validator set, skipping gossip", msg.ValidatorIndex) + oracleR.Logger.Error("validator with index: %v not found in validator set, skipping gossip", msg.ValidatorIndex) + oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("validator not found in validator set: %T", e.Message)) return } pubKey := val.PubKey From 4b8100803689b59eedfabc358f9843bd6b3575ad Mon Sep 17 00:00:00 2001 From: yan-soon Date: Thu, 9 May 2024 11:47:57 +0800 Subject: [PATCH 118/150] remove unused fields from createOracleResultTx hook --- abci/types/types.pb.go | 518 +++++++++++++----------------- proto/tendermint/abci/types.proto | 4 +- state/execution.go | 4 +- 3 files changed, 217 insertions(+), 309 deletions(-) diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go index 94e94a5e2fe..97379a8c7df 100644 --- a/abci/types/types.pb.go +++ b/abci/types/types.pb.go @@ -1600,9 +1600,7 @@ func (m *RequestFinalizeBlock) GetProposerAddress() []byte { } type RequestCreateOracleResultTx struct { - ProposerAddress []byte `protobuf:"bytes,1,opt,name=proposer_address,json=proposerAddress,proto3" json:"proposer_address,omitempty"` - GossipedVotes []*oracle.GossipedVotes `protobuf:"bytes,2,rep,name=gossiped_votes,json=gossipedVotes,proto3" json:"gossiped_votes,omitempty"` - Height int64 `protobuf:"varint,3,opt,name=height,proto3" json:"height,omitempty"` + GossipedVotes []*oracle.GossipedVotes `protobuf:"bytes,1,rep,name=gossiped_votes,json=gossipedVotes,proto3" json:"gossiped_votes,omitempty"` } func (m *RequestCreateOracleResultTx) Reset() { *m = RequestCreateOracleResultTx{} } @@ -1638,13 +1636,6 @@ func (m *RequestCreateOracleResultTx) XXX_DiscardUnknown() { var xxx_messageInfo_RequestCreateOracleResultTx proto.InternalMessageInfo -func (m *RequestCreateOracleResultTx) GetProposerAddress() []byte { - if m != nil { - return m.ProposerAddress - } - return nil -} - func (m *RequestCreateOracleResultTx) GetGossipedVotes() []*oracle.GossipedVotes { if m != nil { return m.GossipedVotes @@ -1652,13 +1643,6 @@ func (m *RequestCreateOracleResultTx) GetGossipedVotes() []*oracle.GossipedVotes return nil } -func (m *RequestCreateOracleResultTx) GetHeight() int64 { - if m != nil { - return m.Height - } - return 0 -} - type RequestFetchOracleVotes struct { } @@ -3905,219 +3889,219 @@ func init() { func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) } var fileDescriptor_252557cfdd89a31a = []byte{ - // 3386 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xbd, 0x73, 0x1b, 0xc7, - 0x15, 0xc7, 0xe1, 0x8b, 0xc0, 0xc3, 0x07, 0x8f, 0x4b, 0x4a, 0x82, 0x60, 0x89, 0xa4, 0xcf, 0x63, - 0x5b, 0x96, 0x6c, 0xd2, 0x91, 0x22, 0x7f, 0x8c, 0xec, 0xcc, 0x80, 0x10, 0x24, 0x90, 0x92, 0x49, - 0xfa, 0x08, 0xca, 0x51, 0x3e, 0x7c, 0x3e, 0x02, 0x0b, 0xe0, 0x2c, 0x00, 0x77, 0xbe, 0x3b, 0xd0, - 0xa0, 0x2b, 0x4f, 0x9c, 0xcc, 0x64, 0x5c, 0x79, 0x26, 0x8d, 0x8b, 0xb8, 0x48, 0x91, 0x22, 0xf9, - 0x0b, 0x52, 0xa5, 0x4a, 0xe1, 0x22, 0x85, 0xbb, 0xa4, 0x72, 0x32, 0x76, 0xe7, 0x36, 0x45, 0x8a, - 0x34, 0x99, 0xfd, 0xb8, 0x2f, 0xe0, 0x0e, 0x1f, 0xb2, 0x53, 0x64, 0x92, 0xee, 0xf6, 0xe1, 0xbd, - 0xb7, 0xbb, 0x6f, 0xdf, 0xee, 0x7b, 0xef, 0xb7, 0x0b, 0x78, 0xc2, 0xc6, 0x83, 0x16, 0x36, 0xfb, - 0xda, 0xc0, 0xde, 0x56, 0x4f, 0x9a, 0xda, 0xb6, 0x7d, 0x66, 0x60, 0x6b, 0xcb, 0x30, 0x75, 0x5b, - 0x47, 0xcb, 0xde, 0x8f, 0x5b, 0xe4, 0xc7, 0xf2, 0x65, 0x1f, 0x77, 0xd3, 0x3c, 0x33, 0x6c, 0x7d, - 0xdb, 0x30, 0x75, 0xbd, 0xcd, 0xf8, 0xcb, 0x97, 0x26, 0x7f, 0x7e, 0x84, 0xcf, 0xb8, 0xb6, 0x80, - 0x30, 0xed, 0x65, 0xdb, 0x50, 0x4d, 0xb5, 0xef, 0xfc, 0xbc, 0x39, 0xf1, 0xf3, 0xa9, 0xda, 0xd3, - 0x5a, 0xaa, 0xad, 0x9b, 0x9c, 0x63, 0xa3, 0xa3, 0xeb, 0x9d, 0x1e, 0xde, 0xa6, 0xad, 0x93, 0x61, - 0x7b, 0xdb, 0xd6, 0xfa, 0xd8, 0xb2, 0xd5, 0xbe, 0xc1, 0x19, 0xd6, 0x3a, 0x7a, 0x47, 0xa7, 0x9f, - 0xdb, 0xe4, 0x2b, 0xa4, 0x5f, 0xdd, 0x54, 0x9b, 0x3d, 0xec, 0x9f, 0xa4, 0xf4, 0x61, 0x0e, 0x96, - 0x64, 0xfc, 0xde, 0x10, 0x5b, 0x36, 0xba, 0x0e, 0x49, 0xdc, 0xec, 0xea, 0x25, 0x61, 0x53, 0xb8, - 0x92, 0xbb, 0x7e, 0x69, 0x6b, 0x6c, 0xfe, 0x5b, 0x9c, 0xaf, 0xd6, 0xec, 0xea, 0xf5, 0x98, 0x4c, - 0x79, 0xd1, 0x4d, 0x48, 0xb5, 0x7b, 0x43, 0xab, 0x5b, 0x8a, 0x53, 0xa1, 0xcb, 0x51, 0x42, 0x77, - 0x08, 0x53, 0x3d, 0x26, 0x33, 0x6e, 0xd2, 0x95, 0x36, 0x68, 0xeb, 0xa5, 0xc4, 0xf4, 0xae, 0x76, - 0x07, 0x6d, 0xda, 0x15, 0xe1, 0x45, 0x3b, 0x00, 0xda, 0x40, 0xb3, 0x95, 0x66, 0x57, 0xd5, 0x06, - 0xa5, 0x14, 0x95, 0x7c, 0x32, 0x5a, 0x52, 0xb3, 0xab, 0x84, 0xb1, 0x1e, 0x93, 0xb3, 0x9a, 0xd3, - 0x20, 0xc3, 0x7d, 0x6f, 0x88, 0xcd, 0xb3, 0x52, 0x7a, 0xfa, 0x70, 0xdf, 0x24, 0x4c, 0x64, 0xb8, - 0x94, 0x1b, 0xbd, 0x06, 0x99, 0x66, 0x17, 0x37, 0x1f, 0x29, 0xf6, 0xa8, 0x94, 0xa1, 0x92, 0x1b, - 0x51, 0x92, 0x55, 0xc2, 0xd7, 0x18, 0xd5, 0x63, 0xf2, 0x52, 0x93, 0x7d, 0xa2, 0x57, 0x20, 0xdd, - 0xd4, 0xfb, 0x7d, 0xcd, 0x2e, 0xe5, 0xa8, 0xec, 0x7a, 0xa4, 0x2c, 0xe5, 0xaa, 0xc7, 0x64, 0xce, - 0x8f, 0xf6, 0xa1, 0xd8, 0xd3, 0x2c, 0x5b, 0xb1, 0x06, 0xaa, 0x61, 0x75, 0x75, 0xdb, 0x2a, 0xe5, - 0xa9, 0x86, 0xa7, 0xa3, 0x34, 0xdc, 0xd7, 0x2c, 0xfb, 0xc8, 0x61, 0xae, 0xc7, 0xe4, 0x42, 0xcf, - 0x4f, 0x20, 0xfa, 0xf4, 0x76, 0x1b, 0x9b, 0xae, 0xc2, 0x52, 0x61, 0xba, 0xbe, 0x03, 0xc2, 0xed, - 0xc8, 0x13, 0x7d, 0xba, 0x9f, 0x80, 0x7e, 0x0c, 0xab, 0x3d, 0x5d, 0x6d, 0xb9, 0xea, 0x94, 0x66, - 0x77, 0x38, 0x78, 0x54, 0x2a, 0x52, 0xa5, 0xcf, 0x45, 0x0e, 0x52, 0x57, 0x5b, 0x8e, 0x8a, 0x2a, - 0x11, 0xa8, 0xc7, 0xe4, 0x95, 0xde, 0x38, 0x11, 0xbd, 0x0d, 0x6b, 0xaa, 0x61, 0xf4, 0xce, 0xc6, - 0xb5, 0x2f, 0x53, 0xed, 0x57, 0xa3, 0xb4, 0x57, 0x88, 0xcc, 0xb8, 0x7a, 0xa4, 0x4e, 0x50, 0x51, - 0x03, 0x44, 0xc3, 0xc4, 0x86, 0x6a, 0x62, 0xc5, 0x30, 0x75, 0x43, 0xb7, 0xd4, 0x5e, 0x49, 0xa4, - 0xba, 0x9f, 0x8d, 0xd2, 0x7d, 0xc8, 0xf8, 0x0f, 0x39, 0x7b, 0x3d, 0x26, 0x2f, 0x1b, 0x41, 0x12, - 0xd3, 0xaa, 0x37, 0xb1, 0x65, 0x79, 0x5a, 0x57, 0x66, 0x69, 0xa5, 0xfc, 0x41, 0xad, 0x01, 0x12, - 0xaa, 0x41, 0x0e, 0x8f, 0x88, 0xb8, 0x72, 0xaa, 0xdb, 0xb8, 0x84, 0xa8, 0x42, 0x29, 0x72, 0x87, - 0x52, 0xd6, 0x07, 0xba, 0x8d, 0xeb, 0x31, 0x19, 0xb0, 0xdb, 0x42, 0x2a, 0x9c, 0x3b, 0xc5, 0xa6, - 0xd6, 0x3e, 0xa3, 0x6a, 0x14, 0xfa, 0x8b, 0xa5, 0xe9, 0x83, 0xd2, 0x2a, 0x55, 0x78, 0x2d, 0x4a, - 0xe1, 0x03, 0x2a, 0x44, 0x54, 0xd4, 0x1c, 0x91, 0x7a, 0x4c, 0x5e, 0x3d, 0x9d, 0x24, 0x13, 0x17, - 0x6b, 0x6b, 0x03, 0xb5, 0xa7, 0x7d, 0x80, 0x95, 0x93, 0x9e, 0xde, 0x7c, 0x54, 0x5a, 0x9b, 0xee, - 0x62, 0x77, 0x38, 0xf7, 0x0e, 0x61, 0x26, 0x2e, 0xd6, 0xf6, 0x13, 0x10, 0x86, 0x0b, 0x4d, 0x13, - 0xab, 0x36, 0x56, 0xd8, 0xe9, 0xa5, 0x98, 0xd8, 0x1a, 0xf6, 0x6c, 0xb2, 0x13, 0xcf, 0x51, 0xc5, - 0xcf, 0x47, 0xee, 0x26, 0x2a, 0x76, 0x40, 0xa5, 0x64, 0x2a, 0x44, 0xb7, 0xe5, 0x5a, 0x33, 0x84, - 0x8e, 0x7e, 0x08, 0xa8, 0x8d, 0xed, 0x66, 0xd7, 0xe9, 0x85, 0xd8, 0xc7, 0x2a, 0x9d, 0xa7, 0x3d, - 0x5c, 0x89, 0x1c, 0x3a, 0x91, 0x60, 0x8a, 0x88, 0x11, 0xc8, 0x86, 0x13, 0xdb, 0x63, 0xb4, 0x9d, - 0x25, 0x48, 0x9d, 0xaa, 0xbd, 0x21, 0xde, 0x4b, 0x66, 0x92, 0x62, 0x6a, 0x2f, 0x99, 0x59, 0x12, - 0x33, 0x7b, 0xc9, 0x4c, 0x56, 0x84, 0xbd, 0x64, 0x06, 0xc4, 0x9c, 0xf4, 0x2c, 0xe4, 0x7c, 0x27, - 0x2b, 0x2a, 0xc1, 0x52, 0x1f, 0x5b, 0x96, 0xda, 0xc1, 0xf4, 0x20, 0xce, 0xca, 0x4e, 0x53, 0x2a, - 0x42, 0xde, 0x7f, 0x9a, 0x4a, 0x9f, 0x08, 0xae, 0x24, 0x39, 0x28, 0x89, 0xe4, 0x29, 0x36, 0xe9, - 0x7a, 0x72, 0x49, 0xde, 0x44, 0x4f, 0x41, 0x81, 0xae, 0x85, 0xe2, 0xfc, 0x4e, 0x4e, 0xeb, 0xa4, - 0x9c, 0xa7, 0xc4, 0x07, 0x9c, 0x69, 0x03, 0x72, 0xc6, 0x75, 0xc3, 0x65, 0x49, 0x50, 0x16, 0x30, - 0xae, 0x1b, 0x0e, 0xc3, 0x93, 0x90, 0x27, 0xb3, 0x77, 0x39, 0x92, 0xb4, 0x93, 0x1c, 0xa1, 0x71, - 0x16, 0xe9, 0xcf, 0x71, 0x10, 0xc7, 0x4f, 0x60, 0xf4, 0x0a, 0x24, 0x49, 0xac, 0xe2, 0x71, 0xa5, - 0xbc, 0xc5, 0x02, 0xd9, 0x96, 0x13, 0xc8, 0xb6, 0x1a, 0x4e, 0x20, 0xdb, 0xc9, 0x7c, 0xfe, 0xe5, - 0x46, 0xec, 0x93, 0xbf, 0x6d, 0x08, 0x32, 0x95, 0x40, 0x17, 0xc9, 0xb9, 0xab, 0x6a, 0x03, 0x45, - 0x6b, 0xd1, 0x21, 0x67, 0xc9, 0xa1, 0xaa, 0x6a, 0x83, 0xdd, 0x16, 0xba, 0x0f, 0x62, 0x53, 0x1f, - 0x58, 0x78, 0x60, 0x0d, 0x2d, 0x85, 0x85, 0x52, 0x1e, 0x4d, 0x02, 0x31, 0x81, 0xc5, 0xba, 0xaa, - 0xc3, 0x79, 0x48, 0x19, 0xe5, 0xe5, 0x66, 0x90, 0x80, 0xee, 0x00, 0xb8, 0xf1, 0xd6, 0x2a, 0x25, - 0x37, 0x13, 0x57, 0x72, 0xd7, 0x37, 0x27, 0x96, 0xfd, 0x81, 0xc3, 0x72, 0x6c, 0xb4, 0x54, 0x1b, - 0xef, 0x24, 0xc9, 0x70, 0x65, 0x9f, 0x24, 0x7a, 0x06, 0x96, 0x55, 0xc3, 0x50, 0x2c, 0x9b, 0x38, - 0xec, 0xc9, 0x19, 0xf1, 0x21, 0x12, 0xa8, 0xf2, 0x72, 0x41, 0x35, 0x8c, 0x23, 0x42, 0xdd, 0x21, - 0x44, 0xf4, 0x34, 0x14, 0x49, 0x50, 0xd2, 0xd4, 0x9e, 0xd2, 0xc5, 0x5a, 0xa7, 0x6b, 0xd3, 0x80, - 0x94, 0x90, 0x0b, 0x9c, 0x5a, 0xa7, 0x44, 0xa9, 0xe5, 0xae, 0x38, 0x0d, 0x48, 0x08, 0x41, 0xb2, - 0xa5, 0xda, 0x2a, 0xb5, 0x64, 0x5e, 0xa6, 0xdf, 0x84, 0x66, 0xa8, 0x76, 0x97, 0xdb, 0x87, 0x7e, - 0xa3, 0xf3, 0x90, 0xe6, 0x6a, 0x13, 0x54, 0x2d, 0x6f, 0xa1, 0x35, 0x48, 0x19, 0xa6, 0x7e, 0x8a, - 0xe9, 0xd2, 0x65, 0x64, 0xd6, 0x90, 0x64, 0x28, 0x06, 0x83, 0x17, 0x2a, 0x42, 0xdc, 0x1e, 0xf1, - 0x5e, 0xe2, 0xf6, 0x08, 0xbd, 0x08, 0x49, 0x62, 0x48, 0xda, 0x47, 0x31, 0x24, 0x5c, 0x73, 0xb9, - 0xc6, 0x99, 0x81, 0x65, 0xca, 0x29, 0x2d, 0x43, 0x21, 0x10, 0xd4, 0xa4, 0xf3, 0xb0, 0x16, 0x16, - 0xa3, 0xa4, 0xae, 0x4b, 0x0f, 0xc4, 0x1a, 0x74, 0x13, 0x32, 0x6e, 0x90, 0x62, 0x8e, 0x73, 0x71, - 0xa2, 0x5b, 0x87, 0x59, 0x76, 0x59, 0x89, 0xc7, 0x90, 0x05, 0xe8, 0xaa, 0x3c, 0x25, 0xc9, 0xcb, - 0x4b, 0xaa, 0x61, 0xd4, 0x55, 0xab, 0x2b, 0xbd, 0x03, 0xa5, 0xa8, 0x00, 0xe4, 0x33, 0x98, 0x40, - 0xdd, 0xde, 0x31, 0xd8, 0x79, 0x48, 0xb7, 0x75, 0xb3, 0xaf, 0xda, 0x54, 0x59, 0x41, 0xe6, 0x2d, - 0x62, 0x48, 0x16, 0x8c, 0x12, 0x94, 0xcc, 0x1a, 0x92, 0x02, 0x17, 0x23, 0x83, 0x10, 0x11, 0xd1, - 0x06, 0x2d, 0xcc, 0xcc, 0x5a, 0x90, 0x59, 0xc3, 0x53, 0xc4, 0x06, 0xcb, 0x1a, 0xa4, 0x5b, 0x8b, - 0xce, 0x95, 0xea, 0xcf, 0xca, 0xbc, 0x25, 0x7d, 0x9a, 0x80, 0xf3, 0xe1, 0xa1, 0x08, 0x6d, 0x42, - 0xbe, 0xaf, 0x8e, 0x14, 0x7b, 0xc4, 0xdd, 0x4e, 0xa0, 0x0b, 0x0f, 0x7d, 0x75, 0xd4, 0x18, 0x31, - 0x9f, 0x13, 0x21, 0x61, 0x8f, 0xac, 0x52, 0x7c, 0x33, 0x71, 0x25, 0x2f, 0x93, 0x4f, 0x74, 0x0c, - 0x2b, 0x3d, 0xbd, 0xa9, 0xf6, 0x94, 0x9e, 0x6a, 0xd9, 0x0a, 0xcf, 0x51, 0xd8, 0x26, 0x7a, 0x6a, - 0xc2, 0xd8, 0x2c, 0xa8, 0xe0, 0x16, 0x5b, 0x4f, 0x72, 0xe0, 0x70, 0xff, 0x5f, 0xa6, 0x3a, 0xee, - 0xab, 0xce, 0x52, 0xa3, 0xdb, 0x90, 0xeb, 0x6b, 0xd6, 0x09, 0xee, 0xaa, 0xa7, 0x9a, 0x6e, 0xf2, - 0xdd, 0x34, 0xe9, 0x34, 0x6f, 0x78, 0x3c, 0x5c, 0x93, 0x5f, 0xcc, 0xb7, 0x24, 0xa9, 0x80, 0x0f, - 0x3b, 0xa7, 0x49, 0x7a, 0xe1, 0xd3, 0xe4, 0x45, 0x58, 0x1b, 0xe0, 0x91, 0xad, 0x78, 0xfb, 0x95, - 0xf9, 0xc9, 0x12, 0x35, 0x3d, 0x22, 0xbf, 0xb9, 0x3b, 0xdc, 0x22, 0x2e, 0x83, 0x9e, 0xa3, 0xc1, - 0xdc, 0xd0, 0x2d, 0x6c, 0x2a, 0x6a, 0xab, 0x65, 0x62, 0xcb, 0xa2, 0xf9, 0x5f, 0x9e, 0x46, 0x68, - 0x4a, 0xaf, 0x30, 0xb2, 0xf4, 0x4b, 0xff, 0xd2, 0x04, 0x83, 0x37, 0x37, 0xbc, 0xe0, 0x19, 0xfe, - 0x08, 0xd6, 0xb8, 0x7c, 0x2b, 0x60, 0x7b, 0x96, 0x44, 0x3f, 0x31, 0xb9, 0xbf, 0xc6, 0x6d, 0x8e, - 0x1c, 0xf1, 0x68, 0xb3, 0x27, 0x1e, 0xcf, 0xec, 0x08, 0x92, 0xd4, 0x28, 0x49, 0x76, 0xc4, 0x90, - 0xef, 0xff, 0xb6, 0xa5, 0xf8, 0x28, 0x01, 0x2b, 0x13, 0x99, 0x90, 0x3b, 0x31, 0x21, 0x74, 0x62, - 0xf1, 0xd0, 0x89, 0x25, 0x16, 0x9e, 0x18, 0x5f, 0xeb, 0xe4, 0xec, 0xb5, 0x4e, 0x7d, 0x87, 0x6b, - 0x9d, 0x7e, 0xbc, 0xb5, 0xfe, 0x8f, 0xae, 0xc2, 0xaf, 0x05, 0x28, 0x47, 0xa7, 0x8f, 0xa1, 0xcb, - 0x71, 0x0d, 0x56, 0xdc, 0xa1, 0xb8, 0xea, 0xd9, 0xc1, 0x28, 0xba, 0x3f, 0x70, 0xfd, 0x91, 0x31, - 0xee, 0x69, 0x28, 0x8e, 0x25, 0xb7, 0xcc, 0x95, 0x0b, 0xa7, 0xfe, 0xfe, 0xa5, 0x9f, 0x27, 0xdc, - 0xc0, 0x13, 0xc8, 0x40, 0x43, 0x76, 0xeb, 0x9b, 0xb0, 0xda, 0xc2, 0x4d, 0xad, 0xf5, 0xb8, 0x9b, - 0x75, 0x85, 0x4b, 0xff, 0x7f, 0xaf, 0x4e, 0x7a, 0xc9, 0xef, 0x04, 0x78, 0x62, 0x4a, 0xbe, 0x1e, - 0xaa, 0x4a, 0x08, 0x55, 0x85, 0xee, 0x42, 0xb1, 0xa3, 0x5b, 0x96, 0x66, 0xe0, 0x16, 0x4f, 0xdf, - 0xe3, 0x93, 0x79, 0x1c, 0x4b, 0xef, 0xb7, 0xee, 0x72, 0x46, 0x9a, 0xa2, 0xcb, 0x85, 0x8e, 0xbf, - 0x19, 0xe5, 0x59, 0xd2, 0x45, 0xb8, 0x10, 0x91, 0xf8, 0x4b, 0x7f, 0xc9, 0x41, 0x46, 0xc6, 0x96, - 0x41, 0xd2, 0x4a, 0xb4, 0x03, 0x59, 0x3c, 0x6a, 0x62, 0xc3, 0x76, 0x32, 0xf1, 0xf0, 0x52, 0x8d, - 0x71, 0xd7, 0x1c, 0xce, 0x7a, 0x4c, 0xf6, 0xc4, 0xd0, 0x0d, 0x8e, 0xc5, 0x44, 0xc3, 0x2a, 0x5c, - 0xdc, 0x0f, 0xc6, 0xbc, 0xe4, 0x80, 0x31, 0x89, 0x48, 0x9c, 0x81, 0x49, 0x8d, 0xa1, 0x31, 0x37, - 0x38, 0x1a, 0x93, 0x9c, 0xd1, 0x59, 0x00, 0x8e, 0xa9, 0x06, 0xe0, 0x98, 0xf4, 0x8c, 0x69, 0x46, - 0xe0, 0x31, 0x2f, 0x39, 0x78, 0xcc, 0xd2, 0x8c, 0x11, 0x8f, 0x01, 0x32, 0xaf, 0xfb, 0x00, 0x99, - 0x2c, 0x15, 0xdd, 0x8c, 0x14, 0x0d, 0x41, 0x64, 0x5e, 0x75, 0x11, 0x99, 0x7c, 0x24, 0x9a, 0xc3, - 0x85, 0xc7, 0x21, 0x99, 0x83, 0x09, 0x48, 0x86, 0x41, 0x28, 0xcf, 0x44, 0xaa, 0x98, 0x81, 0xc9, - 0x1c, 0x4c, 0x60, 0x32, 0xc5, 0x19, 0x0a, 0x67, 0x80, 0x32, 0x3f, 0x09, 0x07, 0x65, 0xa2, 0x61, - 0x13, 0x3e, 0xcc, 0xf9, 0x50, 0x19, 0x25, 0x02, 0x95, 0x11, 0x23, 0x11, 0x04, 0xa6, 0x7e, 0x6e, - 0x58, 0xe6, 0x38, 0x04, 0x96, 0x59, 0x89, 0xac, 0xc3, 0x99, 0xf2, 0x39, 0x70, 0x99, 0xe3, 0x10, - 0x5c, 0x06, 0xcd, 0x54, 0x3b, 0x13, 0x98, 0xb9, 0x13, 0x04, 0x66, 0x56, 0x23, 0x92, 0x67, 0x6f, - 0xb7, 0x47, 0x20, 0x33, 0x27, 0x51, 0xc8, 0xcc, 0x5a, 0x24, 0xc8, 0xc1, 0x34, 0x2e, 0x00, 0xcd, - 0x1c, 0x4c, 0x40, 0x33, 0xe7, 0x66, 0x78, 0xda, 0x0c, 0x6c, 0xa6, 0x1d, 0x8d, 0xcd, 0x30, 0xe4, - 0xe4, 0x85, 0xe8, 0x7d, 0xb5, 0x08, 0x38, 0xf3, 0x30, 0x14, 0x9c, 0xb9, 0x10, 0x89, 0x32, 0xf2, - 0xc1, 0x2f, 0x88, 0xce, 0xa4, 0xc4, 0xf4, 0x5e, 0x32, 0x93, 0x11, 0xb3, 0x0c, 0x97, 0xd9, 0x4b, - 0x66, 0x72, 0x62, 0x5e, 0x7a, 0x8e, 0xe4, 0x92, 0x63, 0x47, 0x35, 0xa9, 0xda, 0xb0, 0x69, 0xea, - 0x26, 0xc7, 0x59, 0x58, 0x43, 0xba, 0x42, 0xaa, 0x75, 0xef, 0x58, 0x9e, 0x82, 0xe4, 0xd0, 0xea, - 0xd8, 0x77, 0x14, 0x4b, 0x7f, 0x10, 0x3c, 0x59, 0x8a, 0xe5, 0xf8, 0x2b, 0xfd, 0x2c, 0xaf, 0xf4, - 0x7d, 0xf8, 0x4e, 0x3c, 0x88, 0xef, 0x6c, 0x40, 0x8e, 0x54, 0xbd, 0x63, 0xd0, 0x8d, 0x6a, 0xb8, - 0xd0, 0xcd, 0x55, 0x58, 0xa1, 0xa9, 0x0b, 0x43, 0x81, 0x78, 0x74, 0x4b, 0xd2, 0xe8, 0xb6, 0x4c, - 0x7e, 0x60, 0x0b, 0xcc, 0x32, 0x85, 0x17, 0x60, 0xd5, 0xc7, 0xeb, 0x56, 0xd3, 0x0c, 0xc7, 0x10, - 0x5d, 0xee, 0x0a, 0x2f, 0xab, 0xff, 0x24, 0x78, 0x16, 0xf2, 0x30, 0x9f, 0x30, 0x78, 0x46, 0xf8, - 0x8e, 0xe0, 0x99, 0xf8, 0x63, 0xc3, 0x33, 0x7e, 0x74, 0x20, 0x11, 0x44, 0x07, 0xfe, 0x29, 0x78, - 0x6b, 0xe2, 0x82, 0x2d, 0x4d, 0xbd, 0x85, 0x79, 0xbd, 0x4e, 0xbf, 0x49, 0x72, 0xd8, 0xd3, 0x3b, - 0xbc, 0x2a, 0x27, 0x9f, 0x84, 0xcb, 0x8d, 0x9d, 0x59, 0x1e, 0x1a, 0xdd, 0x52, 0x9f, 0xa5, 0x60, - 0xbc, 0xd4, 0x17, 0x21, 0xf1, 0x08, 0xb3, 0x9b, 0x87, 0xbc, 0x4c, 0x3e, 0x09, 0x1f, 0x75, 0x3e, - 0x9e, 0x4a, 0xb1, 0x06, 0x7a, 0x05, 0xb2, 0xf4, 0x5a, 0x49, 0xd1, 0x0d, 0x8b, 0xdf, 0x36, 0x04, - 0x92, 0x4c, 0x76, 0xb7, 0xb4, 0x75, 0x48, 0x78, 0x0e, 0x0c, 0x4b, 0xce, 0x18, 0xfc, 0xcb, 0x97, - 0xb8, 0x64, 0x03, 0xb9, 0xdf, 0x25, 0xc8, 0x92, 0xd1, 0x5b, 0x86, 0xda, 0xc4, 0x25, 0xa0, 0x03, - 0xf5, 0x08, 0xd2, 0xef, 0xe3, 0xb0, 0x3c, 0x16, 0x2b, 0x43, 0xe7, 0xee, 0xb8, 0x64, 0xdc, 0x07, - 0x3e, 0xcd, 0x67, 0x8f, 0x75, 0x80, 0x8e, 0x6a, 0x29, 0xef, 0xab, 0x03, 0x1b, 0xb7, 0xb8, 0x51, - 0x7c, 0x14, 0x54, 0x86, 0x0c, 0x69, 0x0d, 0x2d, 0xdc, 0xe2, 0x38, 0x98, 0xdb, 0x46, 0x75, 0x48, - 0xe3, 0x53, 0x3c, 0xb0, 0xad, 0xd2, 0x12, 0x5d, 0xf6, 0xf3, 0x93, 0xc0, 0x04, 0xf9, 0x79, 0xa7, - 0x44, 0x16, 0xfb, 0x9b, 0x2f, 0x37, 0x44, 0xc6, 0xfd, 0xbc, 0xde, 0xd7, 0x6c, 0xdc, 0x37, 0xec, - 0x33, 0x99, 0xcb, 0x07, 0xad, 0x90, 0x19, 0xb3, 0x02, 0x45, 0x64, 0xf3, 0x0e, 0xd0, 0x42, 0x6c, - 0xaa, 0xe9, 0xa6, 0x66, 0x9f, 0xc9, 0x85, 0x3e, 0xee, 0x1b, 0xba, 0xde, 0x53, 0xd8, 0x1e, 0xaf, - 0x40, 0x31, 0x98, 0x1a, 0xa0, 0xa7, 0xa0, 0x60, 0x62, 0x5b, 0xd5, 0x06, 0x4a, 0x20, 0x69, 0xcc, - 0x33, 0x22, 0xdb, 0x53, 0x7b, 0xc9, 0x8c, 0x20, 0xc6, 0xf7, 0x92, 0x99, 0xb8, 0x98, 0x90, 0x0e, - 0xe1, 0x5c, 0x68, 0x6a, 0x80, 0x5e, 0x86, 0xac, 0x97, 0x55, 0x08, 0x74, 0xb6, 0x53, 0x30, 0x2f, - 0x8f, 0x57, 0xfa, 0xa3, 0xe0, 0xa9, 0x0c, 0xa2, 0x68, 0x35, 0x48, 0xb3, 0x33, 0x99, 0xae, 0x64, - 0x71, 0xca, 0x81, 0x1c, 0x90, 0xdb, 0x62, 0x47, 0xaf, 0xcc, 0x85, 0xa5, 0xb7, 0x21, 0xcd, 0x28, - 0x28, 0x07, 0x4b, 0xc7, 0xfb, 0xf7, 0xf6, 0x0f, 0xde, 0xda, 0x17, 0x63, 0x08, 0x20, 0x5d, 0xa9, - 0x56, 0x6b, 0x87, 0x0d, 0x51, 0x40, 0x59, 0x48, 0x55, 0x76, 0x0e, 0xe4, 0x86, 0x18, 0x27, 0x64, - 0xb9, 0xb6, 0x57, 0xab, 0x36, 0xc4, 0x04, 0x5a, 0x81, 0x02, 0xfb, 0x56, 0xee, 0x1c, 0xc8, 0x6f, - 0x54, 0x1a, 0x62, 0xd2, 0x47, 0x3a, 0xaa, 0xed, 0xdf, 0xae, 0xc9, 0x62, 0x4a, 0xfa, 0x1e, 0x5c, - 0x8c, 0x4c, 0x43, 0x3c, 0x88, 0x4c, 0xf0, 0x41, 0x64, 0xd2, 0xa7, 0x71, 0x52, 0x5e, 0x46, 0xe5, - 0x16, 0x68, 0x6f, 0x6c, 0xe2, 0xd7, 0x17, 0x48, 0x4c, 0xc6, 0x66, 0x4f, 0x2a, 0x4a, 0x13, 0xb3, - 0x00, 0x44, 0xfb, 0x66, 0x27, 0x50, 0x41, 0x2e, 0x70, 0x2a, 0x15, 0xb2, 0x18, 0xdb, 0xbb, 0xb8, - 0x69, 0x2b, 0xcc, 0x89, 0x2c, 0x5a, 0xd6, 0x65, 0x09, 0x1b, 0xa1, 0x1e, 0x31, 0xa2, 0xf4, 0xce, - 0x42, 0xb6, 0xcc, 0x42, 0x4a, 0xae, 0x35, 0xe4, 0x87, 0x62, 0x02, 0x21, 0x28, 0xd2, 0x4f, 0xe5, - 0x68, 0xbf, 0x72, 0x78, 0x54, 0x3f, 0x20, 0xb6, 0x5c, 0x85, 0x65, 0xc7, 0x96, 0x0e, 0x31, 0x25, - 0x5d, 0x23, 0x75, 0x4a, 0x68, 0x62, 0x34, 0x59, 0xdc, 0x4a, 0xbf, 0x11, 0xfc, 0xdc, 0xc1, 0xe4, - 0xe6, 0x00, 0xd2, 0x96, 0xad, 0xda, 0x43, 0x8b, 0x1b, 0xf1, 0xe5, 0x79, 0x33, 0xa5, 0x2d, 0xe7, - 0xe3, 0x88, 0x8a, 0xcb, 0x5c, 0x8d, 0x74, 0x13, 0x8a, 0xc1, 0x5f, 0xa2, 0x6d, 0xe0, 0x39, 0x51, - 0x5c, 0xba, 0x05, 0x68, 0x32, 0x81, 0x0a, 0x29, 0xf4, 0x85, 0xb0, 0x42, 0xff, 0xb7, 0xb4, 0xc2, - 0x8c, 0x4c, 0x96, 0xd0, 0x9b, 0x63, 0x93, 0x7c, 0x75, 0x91, 0x54, 0x6b, 0x8b, 0xd1, 0xc6, 0xa6, - 0x79, 0x03, 0xf2, 0x7e, 0xfa, 0x7c, 0x93, 0xfc, 0x26, 0xee, 0x6d, 0xe2, 0x20, 0x22, 0xe1, 0x1d, - 0x81, 0xc2, 0xb7, 0x3c, 0x02, 0x5f, 0x03, 0xb0, 0x47, 0x3c, 0x4b, 0x73, 0xe2, 0xe8, 0xe5, 0x10, - 0xa4, 0x17, 0x37, 0x1b, 0x23, 0xbe, 0x09, 0xb2, 0x36, 0xff, 0xb2, 0xd0, 0x91, 0x1f, 0x9e, 0x19, - 0xd2, 0x18, 0x6b, 0x71, 0xe8, 0x62, 0xde, 0x60, 0xec, 0xc1, 0x38, 0x8c, 0x6c, 0xa1, 0x87, 0x70, - 0x61, 0x2c, 0x51, 0x70, 0x55, 0x27, 0xe7, 0xcd, 0x17, 0xce, 0x05, 0xf3, 0x05, 0x47, 0xb5, 0x3f, - 0xda, 0xa7, 0x82, 0xd1, 0xfe, 0x75, 0xb8, 0x34, 0x2d, 0x13, 0x45, 0x97, 0x01, 0xf0, 0x80, 0x04, - 0x87, 0x96, 0xe2, 0x5e, 0x84, 0x64, 0x39, 0xa5, 0x31, 0x92, 0xee, 0x42, 0x29, 0x2a, 0xcb, 0x44, - 0xd7, 0x20, 0x49, 0x4b, 0x01, 0x96, 0xed, 0x5c, 0x08, 0x01, 0x1f, 0x08, 0x9f, 0x4c, 0x99, 0xa4, - 0x87, 0x00, 0x1e, 0x5c, 0x44, 0x4e, 0x3a, 0x53, 0x1f, 0x0e, 0x5a, 0x54, 0x36, 0x25, 0xb3, 0x06, - 0xba, 0x09, 0x29, 0x3f, 0x9c, 0x31, 0x19, 0x12, 0x88, 0x3e, 0x1f, 0xdc, 0xc4, 0xb8, 0x25, 0x0d, - 0xd0, 0x24, 0x64, 0x1f, 0xd1, 0xc5, 0xeb, 0xc1, 0x2e, 0x9e, 0x8c, 0x04, 0xff, 0xc3, 0xbb, 0xfa, - 0x00, 0x52, 0xd4, 0x03, 0x49, 0xf0, 0xa7, 0xf7, 0x44, 0x3c, 0x6b, 0x25, 0xdf, 0xe8, 0xa7, 0x00, - 0xaa, 0x6d, 0x9b, 0xda, 0xc9, 0xd0, 0xeb, 0x60, 0x23, 0xdc, 0x83, 0x2b, 0x0e, 0xdf, 0xce, 0x25, - 0xee, 0xca, 0x6b, 0x9e, 0xa8, 0xcf, 0x9d, 0x7d, 0x0a, 0xa5, 0x7d, 0x28, 0x06, 0x65, 0x9d, 0x3c, - 0x8b, 0x8d, 0x21, 0x98, 0x67, 0xb1, 0xb4, 0x99, 0xe7, 0x59, 0x6e, 0x96, 0x96, 0x60, 0x97, 0x61, - 0xb4, 0x21, 0x7d, 0x18, 0x87, 0xbc, 0x7f, 0x03, 0xfc, 0xef, 0xa5, 0x42, 0xd2, 0x2f, 0x04, 0xc8, - 0xb8, 0xd3, 0x0f, 0xde, 0x8c, 0x05, 0xae, 0x12, 0x99, 0xf5, 0xe2, 0xfe, 0xeb, 0x2c, 0x76, 0x71, - 0x98, 0x70, 0x2f, 0x0e, 0x6f, 0xb9, 0x61, 0x38, 0x0a, 0x5b, 0xf2, 0xdb, 0x9a, 0x7b, 0x95, 0x93, - 0x75, 0xdc, 0x82, 0xac, 0x7b, 0x8a, 0x90, 0xe2, 0x27, 0x88, 0xff, 0x39, 0x4d, 0x7a, 0xa9, 0xa9, - 0xbf, 0xcf, 0xef, 0xca, 0x12, 0x32, 0x6b, 0x48, 0x2d, 0x58, 0x1e, 0x3b, 0x82, 0xd0, 0x2d, 0x58, - 0x32, 0x86, 0x27, 0x8a, 0xe3, 0x1c, 0x63, 0x80, 0xab, 0x93, 0x56, 0x0f, 0x4f, 0x7a, 0x5a, 0xf3, - 0x1e, 0x3e, 0x73, 0x06, 0x63, 0x0c, 0x4f, 0xee, 0x31, 0x1f, 0x62, 0xbd, 0xc4, 0xfd, 0xbd, 0xfc, - 0x4a, 0x80, 0x8c, 0xb3, 0x27, 0xd0, 0x0f, 0x20, 0xeb, 0x1e, 0x6f, 0xee, 0x65, 0x77, 0xe4, 0xb9, - 0xc8, 0xf5, 0x7b, 0x22, 0xa8, 0xe2, 0xdc, 0xd2, 0x6b, 0x2d, 0xa5, 0xdd, 0x53, 0x99, 0x2f, 0x15, - 0x83, 0x36, 0x63, 0x07, 0x20, 0x8d, 0x0b, 0xbb, 0xb7, 0xef, 0xf4, 0xd4, 0x8e, 0x9c, 0xa3, 0x32, - 0xbb, 0x2d, 0xd2, 0xe0, 0x19, 0xe6, 0x3f, 0x04, 0x10, 0xc7, 0x77, 0xec, 0xb7, 0x1e, 0xdd, 0x64, - 0xb8, 0x4d, 0x84, 0x84, 0x5b, 0xb4, 0x0d, 0xab, 0x2e, 0x87, 0x62, 0x69, 0x9d, 0x81, 0x6a, 0x0f, - 0x4d, 0xcc, 0x21, 0x6a, 0xe4, 0xfe, 0x74, 0xe4, 0xfc, 0x32, 0x39, 0xeb, 0xd4, 0x63, 0xce, 0xfa, - 0xa3, 0x38, 0xe4, 0x7c, 0x80, 0x39, 0xfa, 0xbe, 0xef, 0x30, 0x2a, 0x86, 0x44, 0x28, 0x1f, 0xaf, - 0x77, 0x71, 0x1d, 0x34, 0x53, 0x7c, 0x71, 0x33, 0x45, 0x5d, 0x4b, 0x38, 0xf8, 0x7b, 0x72, 0x61, - 0xfc, 0xfd, 0x79, 0x40, 0xb6, 0x6e, 0xab, 0x3d, 0xe5, 0x54, 0xb7, 0xb5, 0x41, 0x47, 0x61, 0x6e, - 0xc8, 0x8e, 0x0e, 0x91, 0xfe, 0xf2, 0x80, 0xfe, 0x70, 0x48, 0x3d, 0xf2, 0x67, 0x02, 0x64, 0xdc, - 0xf4, 0x7f, 0xd1, 0x6b, 0xed, 0xf3, 0x90, 0xe6, 0x19, 0x2e, 0xbb, 0xd7, 0xe6, 0xad, 0xd0, 0x8b, - 0x86, 0x32, 0x64, 0xfa, 0xd8, 0x56, 0xe9, 0x39, 0xc8, 0xa2, 0xab, 0xdb, 0xbe, 0xfa, 0x2a, 0xe4, - 0x7c, 0x4f, 0x02, 0xc8, 0xd1, 0xb8, 0x5f, 0x7b, 0x4b, 0x8c, 0x95, 0x97, 0x3e, 0xfe, 0x6c, 0x33, - 0xb1, 0x8f, 0xdf, 0x27, 0xbb, 0x59, 0xae, 0x55, 0xeb, 0xb5, 0xea, 0x3d, 0x51, 0x28, 0xe7, 0x3e, - 0xfe, 0x6c, 0x73, 0x49, 0xc6, 0x14, 0x9c, 0xbd, 0x7a, 0x0f, 0x96, 0xc7, 0x16, 0x26, 0x98, 0x3e, - 0x21, 0x28, 0xde, 0x3e, 0x3e, 0xbc, 0xbf, 0x5b, 0xad, 0x34, 0x6a, 0xca, 0x83, 0x83, 0x46, 0x4d, - 0x14, 0xd0, 0x05, 0x58, 0xbd, 0xbf, 0x7b, 0xb7, 0xde, 0x50, 0xaa, 0xf7, 0x77, 0x6b, 0xfb, 0x0d, - 0xa5, 0xd2, 0x68, 0x54, 0xaa, 0xf7, 0xc4, 0xf8, 0xf5, 0x7f, 0xe5, 0x21, 0x59, 0xd9, 0xa9, 0xee, - 0xa2, 0x2a, 0x24, 0x29, 0x24, 0x33, 0xf5, 0x51, 0x63, 0x79, 0x3a, 0xcc, 0x8e, 0xee, 0x40, 0x8a, - 0xa2, 0x35, 0x68, 0xfa, 0x2b, 0xc7, 0xf2, 0x0c, 0xdc, 0x9d, 0x0c, 0x86, 0xee, 0xc8, 0xa9, 0xcf, - 0x1e, 0xcb, 0xd3, 0x61, 0x78, 0x74, 0x1f, 0x96, 0x9c, 0x62, 0x7d, 0xd6, 0x5b, 0xc4, 0xf2, 0x4c, - 0x6c, 0x9c, 0x4c, 0x8d, 0x81, 0x1e, 0xd3, 0x5f, 0x44, 0x96, 0x67, 0x00, 0xf4, 0x68, 0x17, 0xd2, - 0xbc, 0x2c, 0x9e, 0xf1, 0xc8, 0xb1, 0x3c, 0x0b, 0x72, 0x47, 0x32, 0x64, 0x3d, 0x38, 0x69, 0xf6, - 0x3b, 0xcf, 0xf2, 0x1c, 0x77, 0x0f, 0xe8, 0x6d, 0x28, 0x04, 0x4b, 0xee, 0xf9, 0x1e, 0x52, 0x96, - 0xe7, 0x04, 0xf7, 0x89, 0xfe, 0x60, 0xfd, 0x3d, 0xdf, 0xc3, 0xca, 0xf2, 0x9c, 0x58, 0x3f, 0x7a, - 0x17, 0x56, 0x26, 0xeb, 0xe3, 0xf9, 0xdf, 0x59, 0x96, 0x17, 0x40, 0xff, 0x51, 0x1f, 0x50, 0x48, - 0x5d, 0xbd, 0xc0, 0xb3, 0xcb, 0xf2, 0x22, 0x97, 0x01, 0xa8, 0x05, 0xcb, 0xe3, 0xc5, 0xea, 0xbc, - 0xcf, 0x30, 0xcb, 0x73, 0x5f, 0x0c, 0xb0, 0x5e, 0x82, 0x45, 0xee, 0xbc, 0xcf, 0x32, 0xcb, 0x73, - 0xdf, 0x13, 0xa0, 0x63, 0x00, 0x5f, 0x9d, 0x3a, 0xc7, 0x33, 0xcd, 0xf2, 0x3c, 0x37, 0x06, 0xc8, - 0x80, 0xd5, 0xb0, 0x02, 0x76, 0x91, 0x57, 0x9b, 0xe5, 0x85, 0x2e, 0x12, 0x88, 0x3f, 0x07, 0x4b, - 0xd1, 0xf9, 0x5e, 0x71, 0x96, 0xe7, 0xbc, 0x51, 0x40, 0x16, 0xac, 0x85, 0x96, 0x5f, 0x0b, 0xbd, - 0xe9, 0x2c, 0x2f, 0x76, 0xcb, 0x80, 0x3a, 0x20, 0x4e, 0x14, 0x6d, 0x73, 0x3f, 0xf1, 0x2c, 0xcf, - 0x7f, 0xdf, 0xb0, 0x53, 0xf9, 0xfc, 0xab, 0x75, 0xe1, 0x8b, 0xaf, 0xd6, 0x85, 0xbf, 0x7f, 0xb5, - 0x2e, 0x7c, 0xf2, 0xf5, 0x7a, 0xec, 0x8b, 0xaf, 0xd7, 0x63, 0x7f, 0xfd, 0x7a, 0x3d, 0xf6, 0xa3, - 0x67, 0x3b, 0x9a, 0xdd, 0x1d, 0x9e, 0x6c, 0x35, 0xf5, 0xfe, 0x76, 0x53, 0xef, 0x63, 0xfb, 0xa4, - 0x6d, 0x7b, 0x1f, 0xde, 0x3f, 0x11, 0x4e, 0xd2, 0x34, 0x3f, 0xb8, 0xf1, 0xef, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xe4, 0x0a, 0x49, 0x92, 0xa9, 0x30, 0x00, 0x00, + // 3383 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xbb, 0x93, 0x1b, 0xc7, + 0xd1, 0xc7, 0xe2, 0x8d, 0xc6, 0xe3, 0xf6, 0xe6, 0x8e, 0x24, 0x08, 0x91, 0x77, 0xa7, 0x55, 0x49, + 0xa2, 0x48, 0xe9, 0x4e, 0x1f, 0xf9, 0x51, 0x8f, 0xa2, 0xf4, 0x55, 0xe1, 0x40, 0x90, 0xb8, 0x23, + 0x75, 0x77, 0xda, 0x03, 0xa9, 0x8f, 0xdf, 0x67, 0x6b, 0xb5, 0x07, 0x0c, 0x80, 0x15, 0x01, 0xec, + 0x6a, 0x77, 0x71, 0xc2, 0x29, 0x52, 0x59, 0x76, 0x95, 0x4b, 0x91, 0xaa, 0x9c, 0x28, 0xb0, 0x02, + 0x07, 0x4e, 0xfc, 0x17, 0x38, 0x72, 0xe4, 0x40, 0x81, 0x03, 0x65, 0x76, 0x24, 0xbb, 0xa4, 0x4c, + 0xa9, 0x03, 0x07, 0x4e, 0x5c, 0xf3, 0xd8, 0x17, 0xb0, 0x8b, 0x07, 0x25, 0x07, 0x2e, 0x3b, 0x9b, + 0xe9, 0xed, 0xee, 0x99, 0xe9, 0x79, 0x74, 0xf7, 0x6f, 0x66, 0xe1, 0x29, 0x1b, 0x0f, 0xdb, 0xd8, + 0x1c, 0x68, 0x43, 0x7b, 0x47, 0x3d, 0x69, 0x69, 0x3b, 0xf6, 0x99, 0x81, 0xad, 0x6d, 0xc3, 0xd4, + 0x6d, 0x1d, 0xad, 0x78, 0x1f, 0xb7, 0xc9, 0xc7, 0xca, 0x65, 0x1f, 0x77, 0xcb, 0x3c, 0x33, 0x6c, + 0x7d, 0xc7, 0x30, 0x75, 0xbd, 0xc3, 0xf8, 0x2b, 0x97, 0xa6, 0x3f, 0x3f, 0xc6, 0x67, 0x5c, 0x5b, + 0x40, 0x98, 0xb6, 0xb2, 0x63, 0xa8, 0xa6, 0x3a, 0x70, 0x3e, 0x6f, 0x4d, 0x7d, 0x3e, 0x55, 0xfb, + 0x5a, 0x5b, 0xb5, 0x75, 0x93, 0x73, 0x6c, 0x76, 0x75, 0xbd, 0xdb, 0xc7, 0x3b, 0xb4, 0x76, 0x32, + 0xea, 0xec, 0xd8, 0xda, 0x00, 0x5b, 0xb6, 0x3a, 0x30, 0x38, 0xc3, 0x7a, 0x57, 0xef, 0xea, 0xb4, + 0xb8, 0x43, 0x4a, 0x21, 0xed, 0xea, 0xa6, 0xda, 0xea, 0x63, 0xff, 0x20, 0xa5, 0x8f, 0xf3, 0x90, + 0x91, 0xf1, 0x07, 0x23, 0x6c, 0xd9, 0xe8, 0x3a, 0x24, 0x71, 0xab, 0xa7, 0x97, 0x85, 0x2d, 0xe1, + 0x4a, 0xfe, 0xfa, 0xa5, 0xed, 0x89, 0xf1, 0x6f, 0x73, 0xbe, 0x7a, 0xab, 0xa7, 0x37, 0x62, 0x32, + 0xe5, 0x45, 0x37, 0x21, 0xd5, 0xe9, 0x8f, 0xac, 0x5e, 0x39, 0x4e, 0x85, 0x2e, 0x47, 0x09, 0xdd, + 0x21, 0x4c, 0x8d, 0x98, 0xcc, 0xb8, 0x49, 0x53, 0xda, 0xb0, 0xa3, 0x97, 0x13, 0xb3, 0x9b, 0xda, + 0x1b, 0x76, 0x68, 0x53, 0x84, 0x17, 0xed, 0x02, 0x68, 0x43, 0xcd, 0x56, 0x5a, 0x3d, 0x55, 0x1b, + 0x96, 0x53, 0x54, 0xf2, 0xe9, 0x68, 0x49, 0xcd, 0xae, 0x11, 0xc6, 0x46, 0x4c, 0xce, 0x69, 0x4e, + 0x85, 0x74, 0xf7, 0x83, 0x11, 0x36, 0xcf, 0xca, 0xe9, 0xd9, 0xdd, 0x7d, 0x9b, 0x30, 0x91, 0xee, + 0x52, 0x6e, 0xf4, 0x06, 0x64, 0x5b, 0x3d, 0xdc, 0x7a, 0xac, 0xd8, 0xe3, 0x72, 0x96, 0x4a, 0x6e, + 0x46, 0x49, 0xd6, 0x08, 0x5f, 0x73, 0xdc, 0x88, 0xc9, 0x99, 0x16, 0x2b, 0xa2, 0xd7, 0x20, 0xdd, + 0xd2, 0x07, 0x03, 0xcd, 0x2e, 0xe7, 0xa9, 0xec, 0x46, 0xa4, 0x2c, 0xe5, 0x6a, 0xc4, 0x64, 0xce, + 0x8f, 0x0e, 0xa0, 0xd4, 0xd7, 0x2c, 0x5b, 0xb1, 0x86, 0xaa, 0x61, 0xf5, 0x74, 0xdb, 0x2a, 0x17, + 0xa8, 0x86, 0x67, 0xa3, 0x34, 0xdc, 0xd7, 0x2c, 0xfb, 0xd8, 0x61, 0x6e, 0xc4, 0xe4, 0x62, 0xdf, + 0x4f, 0x20, 0xfa, 0xf4, 0x4e, 0x07, 0x9b, 0xae, 0xc2, 0x72, 0x71, 0xb6, 0xbe, 0x43, 0xc2, 0xed, + 0xc8, 0x13, 0x7d, 0xba, 0x9f, 0x80, 0xfe, 0x1f, 0xd6, 0xfa, 0xba, 0xda, 0x76, 0xd5, 0x29, 0xad, + 0xde, 0x68, 0xf8, 0xb8, 0x5c, 0xa2, 0x4a, 0x5f, 0x88, 0xec, 0xa4, 0xae, 0xb6, 0x1d, 0x15, 0x35, + 0x22, 0xd0, 0x88, 0xc9, 0xab, 0xfd, 0x49, 0x22, 0x7a, 0x17, 0xd6, 0x55, 0xc3, 0xe8, 0x9f, 0x4d, + 0x6a, 0x5f, 0xa1, 0xda, 0xaf, 0x46, 0x69, 0xaf, 0x12, 0x99, 0x49, 0xf5, 0x48, 0x9d, 0xa2, 0xa2, + 0x26, 0x88, 0x86, 0x89, 0x0d, 0xd5, 0xc4, 0x8a, 0x61, 0xea, 0x86, 0x6e, 0xa9, 0xfd, 0xb2, 0x48, + 0x75, 0x3f, 0x1f, 0xa5, 0xfb, 0x88, 0xf1, 0x1f, 0x71, 0xf6, 0x46, 0x4c, 0x5e, 0x31, 0x82, 0x24, + 0xa6, 0x55, 0x6f, 0x61, 0xcb, 0xf2, 0xb4, 0xae, 0xce, 0xd3, 0x4a, 0xf9, 0x83, 0x5a, 0x03, 0x24, + 0x54, 0x87, 0x3c, 0x1e, 0x13, 0x71, 0xe5, 0x54, 0xb7, 0x71, 0x19, 0x51, 0x85, 0x52, 0xe4, 0x0e, + 0xa5, 0xac, 0x0f, 0x75, 0x1b, 0x37, 0x62, 0x32, 0x60, 0xb7, 0x86, 0x54, 0x38, 0x77, 0x8a, 0x4d, + 0xad, 0x73, 0x46, 0xd5, 0x28, 0xf4, 0x8b, 0xa5, 0xe9, 0xc3, 0xf2, 0x1a, 0x55, 0x78, 0x2d, 0x4a, + 0xe1, 0x43, 0x2a, 0x44, 0x54, 0xd4, 0x1d, 0x91, 0x46, 0x4c, 0x5e, 0x3b, 0x9d, 0x26, 0x93, 0x25, + 0xd6, 0xd1, 0x86, 0x6a, 0x5f, 0xfb, 0x08, 0x2b, 0x27, 0x7d, 0xbd, 0xf5, 0xb8, 0xbc, 0x3e, 0x7b, + 0x89, 0xdd, 0xe1, 0xdc, 0xbb, 0x84, 0x99, 0x2c, 0xb1, 0x8e, 0x9f, 0x80, 0x30, 0x5c, 0x68, 0x99, + 0x58, 0xb5, 0xb1, 0xc2, 0x4e, 0x2f, 0xc5, 0xc4, 0xd6, 0xa8, 0x6f, 0x93, 0x9d, 0x78, 0x8e, 0x2a, + 0x7e, 0x31, 0x72, 0x37, 0x51, 0xb1, 0x43, 0x2a, 0x25, 0x53, 0x21, 0xba, 0x2d, 0xd7, 0x5b, 0x21, + 0x74, 0xf4, 0xbf, 0x80, 0x3a, 0xd8, 0x6e, 0xf5, 0x9c, 0x56, 0x88, 0x7d, 0xac, 0xf2, 0x79, 0xda, + 0xc2, 0x95, 0xc8, 0xae, 0x13, 0x09, 0xa6, 0x88, 0x18, 0x81, 0x6c, 0x38, 0xb1, 0x33, 0x41, 0xdb, + 0xcd, 0x40, 0xea, 0x54, 0xed, 0x8f, 0xf0, 0x7e, 0x32, 0x9b, 0x14, 0x53, 0xfb, 0xc9, 0x6c, 0x46, + 0xcc, 0xee, 0x27, 0xb3, 0x39, 0x11, 0xf6, 0x93, 0x59, 0x10, 0xf3, 0xd2, 0xf3, 0x90, 0xf7, 0x9d, + 0xac, 0xa8, 0x0c, 0x99, 0x01, 0xb6, 0x2c, 0xb5, 0x8b, 0xe9, 0x41, 0x9c, 0x93, 0x9d, 0xaa, 0x54, + 0x82, 0x82, 0xff, 0x34, 0x95, 0x3e, 0x13, 0x5c, 0x49, 0x72, 0x50, 0x12, 0xc9, 0x53, 0x6c, 0xd2, + 0xf9, 0xe4, 0x92, 0xbc, 0x8a, 0x9e, 0x81, 0x22, 0x9d, 0x0b, 0xc5, 0xf9, 0x4e, 0x4e, 0xeb, 0xa4, + 0x5c, 0xa0, 0xc4, 0x87, 0x9c, 0x69, 0x13, 0xf2, 0xc6, 0x75, 0xc3, 0x65, 0x49, 0x50, 0x16, 0x30, + 0xae, 0x1b, 0x0e, 0xc3, 0xd3, 0x50, 0x20, 0xa3, 0x77, 0x39, 0x92, 0xb4, 0x91, 0x3c, 0xa1, 0x71, + 0x16, 0xe9, 0x0f, 0x71, 0x10, 0x27, 0x4f, 0x60, 0xf4, 0x1a, 0x24, 0x89, 0xaf, 0xe2, 0x7e, 0xa5, + 0xb2, 0xcd, 0x1c, 0xd9, 0xb6, 0xe3, 0xc8, 0xb6, 0x9b, 0x8e, 0x23, 0xdb, 0xcd, 0x7e, 0xf9, 0xf5, + 0x66, 0xec, 0xb3, 0x3f, 0x6f, 0x0a, 0x32, 0x95, 0x40, 0x17, 0xc9, 0xb9, 0xab, 0x6a, 0x43, 0x45, + 0x6b, 0xd3, 0x2e, 0xe7, 0xc8, 0xa1, 0xaa, 0x6a, 0xc3, 0xbd, 0x36, 0xba, 0x0f, 0x62, 0x4b, 0x1f, + 0x5a, 0x78, 0x68, 0x8d, 0x2c, 0x85, 0xb9, 0x52, 0xee, 0x4d, 0x02, 0x3e, 0x81, 0xf9, 0xba, 0x9a, + 0xc3, 0x79, 0x44, 0x19, 0xe5, 0x95, 0x56, 0x90, 0x80, 0xee, 0x00, 0xb8, 0xfe, 0xd6, 0x2a, 0x27, + 0xb7, 0x12, 0x57, 0xf2, 0xd7, 0xb7, 0xa6, 0xa6, 0xfd, 0xa1, 0xc3, 0xf2, 0xc0, 0x68, 0xab, 0x36, + 0xde, 0x4d, 0x92, 0xee, 0xca, 0x3e, 0x49, 0xf4, 0x1c, 0xac, 0xa8, 0x86, 0xa1, 0x58, 0x36, 0x59, + 0xb0, 0x27, 0x67, 0x64, 0x0d, 0x11, 0x47, 0x55, 0x90, 0x8b, 0xaa, 0x61, 0x1c, 0x13, 0xea, 0x2e, + 0x21, 0xa2, 0x67, 0xa1, 0x44, 0x9c, 0x92, 0xa6, 0xf6, 0x95, 0x1e, 0xd6, 0xba, 0x3d, 0x9b, 0x3a, + 0xa4, 0x84, 0x5c, 0xe4, 0xd4, 0x06, 0x25, 0x4a, 0x6d, 0x77, 0xc6, 0xa9, 0x43, 0x42, 0x08, 0x92, + 0x6d, 0xd5, 0x56, 0xa9, 0x25, 0x0b, 0x32, 0x2d, 0x13, 0x9a, 0xa1, 0xda, 0x3d, 0x6e, 0x1f, 0x5a, + 0x46, 0xe7, 0x21, 0xcd, 0xd5, 0x26, 0xa8, 0x5a, 0x5e, 0x43, 0xeb, 0x90, 0x32, 0x4c, 0xfd, 0x14, + 0xd3, 0xa9, 0xcb, 0xca, 0xac, 0x22, 0xc9, 0x50, 0x0a, 0x3a, 0x2f, 0x54, 0x82, 0xb8, 0x3d, 0xe6, + 0xad, 0xc4, 0xed, 0x31, 0x7a, 0x19, 0x92, 0xc4, 0x90, 0xb4, 0x8d, 0x52, 0x88, 0xbb, 0xe6, 0x72, + 0xcd, 0x33, 0x03, 0xcb, 0x94, 0x53, 0x5a, 0x81, 0x62, 0xc0, 0xa9, 0x49, 0xe7, 0x61, 0x3d, 0xcc, + 0x47, 0x49, 0x3d, 0x97, 0x1e, 0xf0, 0x35, 0xe8, 0x26, 0x64, 0x5d, 0x27, 0xc5, 0x16, 0xce, 0xc5, + 0xa9, 0x66, 0x1d, 0x66, 0xd9, 0x65, 0x25, 0x2b, 0x86, 0x4c, 0x40, 0x4f, 0xe5, 0x21, 0x49, 0x41, + 0xce, 0xa8, 0x86, 0xd1, 0x50, 0xad, 0x9e, 0xf4, 0x1e, 0x94, 0xa3, 0x1c, 0x90, 0xcf, 0x60, 0x02, + 0x5d, 0xf6, 0x8e, 0xc1, 0xce, 0x43, 0xba, 0xa3, 0x9b, 0x03, 0xd5, 0xa6, 0xca, 0x8a, 0x32, 0xaf, + 0x11, 0x43, 0x32, 0x67, 0x94, 0xa0, 0x64, 0x56, 0x91, 0x14, 0xb8, 0x18, 0xe9, 0x84, 0x88, 0x88, + 0x36, 0x6c, 0x63, 0x66, 0xd6, 0xa2, 0xcc, 0x2a, 0x9e, 0x22, 0xd6, 0x59, 0x56, 0x21, 0xcd, 0x5a, + 0x74, 0xac, 0x54, 0x7f, 0x4e, 0xe6, 0x35, 0xe9, 0xf3, 0x04, 0x9c, 0x0f, 0x77, 0x45, 0x68, 0x0b, + 0x0a, 0x03, 0x75, 0xac, 0xd8, 0x63, 0xbe, 0xec, 0x04, 0x3a, 0xf1, 0x30, 0x50, 0xc7, 0xcd, 0x31, + 0x5b, 0x73, 0x22, 0x24, 0xec, 0xb1, 0x55, 0x8e, 0x6f, 0x25, 0xae, 0x14, 0x64, 0x52, 0x44, 0x0f, + 0x60, 0xb5, 0xaf, 0xb7, 0xd4, 0xbe, 0xd2, 0x57, 0x2d, 0x5b, 0xe1, 0x31, 0x0a, 0xdb, 0x44, 0xcf, + 0x4c, 0x19, 0x9b, 0x39, 0x15, 0xdc, 0x66, 0xf3, 0x49, 0x0e, 0x1c, 0xbe, 0xfe, 0x57, 0xa8, 0x8e, + 0xfb, 0xaa, 0x33, 0xd5, 0xe8, 0x36, 0xe4, 0x07, 0x9a, 0x75, 0x82, 0x7b, 0xea, 0xa9, 0xa6, 0x9b, + 0x7c, 0x37, 0x4d, 0x2f, 0x9a, 0xb7, 0x3c, 0x1e, 0xae, 0xc9, 0x2f, 0xe6, 0x9b, 0x92, 0x54, 0x60, + 0x0d, 0x3b, 0xa7, 0x49, 0x7a, 0xe9, 0xd3, 0xe4, 0x65, 0x58, 0x1f, 0xe2, 0xb1, 0xad, 0x78, 0xfb, + 0x95, 0xad, 0x93, 0x0c, 0x35, 0x3d, 0x22, 0xdf, 0xdc, 0x1d, 0x6e, 0x91, 0x25, 0x83, 0x5e, 0xa0, + 0xce, 0xdc, 0xd0, 0x2d, 0x6c, 0x2a, 0x6a, 0xbb, 0x6d, 0x62, 0xcb, 0xa2, 0xf1, 0x5f, 0x81, 0x7a, + 0x68, 0x4a, 0xaf, 0x32, 0xb2, 0xf4, 0x73, 0xff, 0xd4, 0x04, 0x9d, 0x37, 0x37, 0xbc, 0xe0, 0x19, + 0xfe, 0x18, 0xd6, 0xb9, 0x7c, 0x3b, 0x60, 0x7b, 0x16, 0x44, 0x3f, 0x35, 0xbd, 0xbf, 0x26, 0x6d, + 0x8e, 0x1c, 0xf1, 0x68, 0xb3, 0x27, 0x9e, 0xcc, 0xec, 0x08, 0x92, 0xd4, 0x28, 0x49, 0x76, 0xc4, + 0x90, 0xf2, 0xbf, 0xda, 0x54, 0x7c, 0x92, 0x80, 0xd5, 0xa9, 0x48, 0xc8, 0x1d, 0x98, 0x10, 0x3a, + 0xb0, 0x78, 0xe8, 0xc0, 0x12, 0x4b, 0x0f, 0x8c, 0xcf, 0x75, 0x72, 0xfe, 0x5c, 0xa7, 0x7e, 0xc0, + 0xb9, 0x4e, 0x3f, 0xd9, 0x5c, 0xff, 0x53, 0x67, 0xe1, 0x97, 0x02, 0x54, 0xa2, 0xc3, 0xc7, 0xd0, + 0xe9, 0xb8, 0x06, 0xab, 0x6e, 0x57, 0x5c, 0xf5, 0xec, 0x60, 0x14, 0xdd, 0x0f, 0x5c, 0x7f, 0xa4, + 0x8f, 0x7b, 0x16, 0x4a, 0x13, 0xc1, 0x2d, 0x5b, 0xca, 0xc5, 0x53, 0x7f, 0xfb, 0xd2, 0x4f, 0x13, + 0xae, 0xe3, 0x09, 0x44, 0xa0, 0x21, 0xbb, 0xf5, 0x6d, 0x58, 0x6b, 0xe3, 0x96, 0xd6, 0x7e, 0xd2, + 0xcd, 0xba, 0xca, 0xa5, 0xff, 0xb3, 0x57, 0xa7, 0x57, 0x49, 0x07, 0x9e, 0x9a, 0x11, 0xae, 0xa3, + 0xbb, 0x50, 0xea, 0xea, 0x96, 0xa5, 0x19, 0xb8, 0xcd, 0x43, 0x72, 0x61, 0x3a, 0x36, 0x63, 0x21, + 0xfb, 0xf6, 0x5d, 0xce, 0x48, 0xc3, 0x6e, 0xb9, 0xd8, 0xf5, 0x57, 0xa5, 0x8b, 0x70, 0x21, 0x22, + 0x68, 0x97, 0xfe, 0x98, 0x87, 0xac, 0x8c, 0x2d, 0x83, 0x84, 0x84, 0x68, 0x17, 0x72, 0x78, 0xdc, + 0xc2, 0x86, 0xed, 0x44, 0xd1, 0xe1, 0x69, 0x16, 0xe3, 0xae, 0x3b, 0x9c, 0x8d, 0x98, 0xec, 0x89, + 0xa1, 0x1b, 0x1c, 0x47, 0x89, 0x86, 0x44, 0xb8, 0xb8, 0x1f, 0x48, 0x79, 0xc5, 0x01, 0x52, 0x12, + 0x91, 0x18, 0x01, 0x93, 0x9a, 0x40, 0x52, 0x6e, 0x70, 0x24, 0x25, 0x39, 0xa7, 0xb1, 0x00, 0x94, + 0x52, 0x0b, 0x40, 0x29, 0xe9, 0x39, 0xc3, 0x8c, 0xc0, 0x52, 0x5e, 0x71, 0xb0, 0x94, 0xcc, 0x9c, + 0x1e, 0x4f, 0x80, 0x29, 0x6f, 0xfa, 0xc0, 0x94, 0x1c, 0x15, 0xdd, 0x8a, 0x14, 0x0d, 0x41, 0x53, + 0x5e, 0x77, 0xd1, 0x94, 0x42, 0x24, 0x12, 0xc3, 0x85, 0x27, 0xe1, 0x94, 0xc3, 0x29, 0x38, 0x85, + 0xc1, 0x1f, 0xcf, 0x45, 0xaa, 0x98, 0x83, 0xa7, 0x1c, 0x4e, 0xe1, 0x29, 0xa5, 0x39, 0x0a, 0xe7, + 0x00, 0x2a, 0x3f, 0x0a, 0x07, 0x54, 0xa2, 0x21, 0x0f, 0xde, 0xcd, 0xc5, 0x10, 0x15, 0x25, 0x02, + 0x51, 0x11, 0x23, 0xb3, 0x7f, 0xa6, 0x7e, 0x61, 0x48, 0xe5, 0x41, 0x08, 0xa4, 0xb2, 0x1a, 0x99, + 0x43, 0x33, 0xe5, 0x0b, 0x60, 0x2a, 0x0f, 0x42, 0x30, 0x15, 0x34, 0x57, 0xed, 0x5c, 0x50, 0xe5, + 0x4e, 0x10, 0x54, 0x59, 0x8b, 0x08, 0x7c, 0xbd, 0xdd, 0x1e, 0x81, 0xaa, 0x9c, 0x44, 0xa1, 0x2a, + 0xeb, 0x91, 0x00, 0x05, 0xd3, 0xb8, 0x04, 0xac, 0x72, 0x38, 0x05, 0xab, 0x9c, 0x9b, 0xb3, 0xd2, + 0xe6, 0xe0, 0x2a, 0x9d, 0x68, 0x5c, 0x85, 0xa1, 0x1e, 0x2f, 0x45, 0xef, 0xab, 0x65, 0x80, 0x95, + 0x47, 0xa1, 0xc0, 0xca, 0x85, 0x48, 0x84, 0x90, 0x77, 0x7e, 0x49, 0x64, 0x25, 0x25, 0xa6, 0xf7, + 0x93, 0xd9, 0xac, 0x98, 0x63, 0x98, 0xca, 0x7e, 0x32, 0x9b, 0x17, 0x0b, 0xd2, 0x0b, 0x24, 0x0e, + 0x9c, 0x38, 0xaa, 0x49, 0xc6, 0x85, 0x4d, 0x53, 0x37, 0x39, 0x46, 0xc2, 0x2a, 0xd2, 0x15, 0x92, + 0x69, 0x7b, 0xc7, 0xf2, 0x0c, 0x14, 0x86, 0x66, 0xb6, 0xbe, 0xa3, 0x58, 0xfa, 0xad, 0xe0, 0xc9, + 0x52, 0x1c, 0xc6, 0x9f, 0xa5, 0xe7, 0x78, 0x96, 0xee, 0xc3, 0x66, 0xe2, 0x41, 0x6c, 0x66, 0x13, + 0xf2, 0x24, 0x63, 0x9d, 0x80, 0x5d, 0x54, 0xc3, 0x85, 0x5d, 0xae, 0xc2, 0x2a, 0x0d, 0x3b, 0x18, + 0x82, 0xc3, 0x9d, 0x7b, 0x92, 0x3a, 0xf7, 0x15, 0xf2, 0x81, 0x4d, 0x30, 0xf3, 0xf2, 0x2f, 0xc1, + 0x9a, 0x8f, 0xd7, 0xcd, 0x84, 0x19, 0x06, 0x21, 0xba, 0xdc, 0x55, 0x9e, 0x12, 0xff, 0x5e, 0xf0, + 0x2c, 0xe4, 0xe1, 0x35, 0x61, 0xd0, 0x8a, 0xf0, 0x03, 0x41, 0x2b, 0xf1, 0x27, 0x86, 0x56, 0xfc, + 0x99, 0x7d, 0x22, 0x98, 0xd9, 0xff, 0x4d, 0xf0, 0xe6, 0xc4, 0x05, 0x4a, 0x5a, 0x7a, 0x1b, 0xf3, + 0x5c, 0x9b, 0x96, 0x49, 0x60, 0xd7, 0xd7, 0xbb, 0x3c, 0xa3, 0x26, 0x45, 0xc2, 0xe5, 0xfa, 0xce, + 0x1c, 0x77, 0x8d, 0x6e, 0x9a, 0xce, 0xc2, 0x27, 0x9e, 0xa6, 0x8b, 0x90, 0x78, 0x8c, 0xd9, 0xad, + 0x41, 0x41, 0x26, 0x45, 0xc2, 0x47, 0x17, 0x1f, 0x0f, 0x83, 0x58, 0x05, 0xbd, 0x06, 0x39, 0x7a, + 0x25, 0xa4, 0xe8, 0x86, 0xc5, 0x6f, 0x0a, 0x02, 0x01, 0x22, 0xbb, 0x17, 0xda, 0x3e, 0x22, 0x3c, + 0x87, 0x86, 0x25, 0x67, 0x0d, 0x5e, 0xf2, 0xc5, 0x6d, 0xb9, 0x40, 0xdc, 0x76, 0x09, 0x72, 0xa4, + 0xf7, 0x96, 0xa1, 0xb6, 0x70, 0x19, 0x68, 0x47, 0x3d, 0x82, 0xf4, 0x9b, 0x38, 0xac, 0x4c, 0xf8, + 0xca, 0xd0, 0xb1, 0x3b, 0x4b, 0x32, 0xee, 0x03, 0x8e, 0x16, 0xb3, 0xc7, 0x06, 0x40, 0x57, 0xb5, + 0x94, 0x0f, 0xd5, 0xa1, 0x8d, 0xdb, 0xdc, 0x28, 0x3e, 0x0a, 0xaa, 0x40, 0x96, 0xd4, 0x46, 0x16, + 0x6e, 0x73, 0x0c, 0xcb, 0xad, 0xa3, 0x06, 0xa4, 0xf1, 0x29, 0x1e, 0xda, 0x56, 0x39, 0x43, 0xa7, + 0xfd, 0xfc, 0x34, 0xa8, 0x40, 0x3e, 0xef, 0x96, 0xc9, 0x64, 0x7f, 0xf7, 0xf5, 0xa6, 0xc8, 0xb8, + 0x5f, 0xd4, 0x07, 0x9a, 0x8d, 0x07, 0x86, 0x7d, 0x26, 0x73, 0xf9, 0xa0, 0x15, 0xb2, 0x13, 0x56, + 0xa0, 0x68, 0x6a, 0xc1, 0x01, 0x49, 0x88, 0x4d, 0x35, 0xdd, 0xd4, 0xec, 0x33, 0xb9, 0x38, 0xc0, + 0x03, 0x43, 0xd7, 0xfb, 0x0a, 0xdb, 0xe3, 0x55, 0x28, 0x05, 0x43, 0x03, 0xf4, 0x0c, 0x14, 0x4d, + 0x6c, 0xab, 0xda, 0x50, 0x09, 0xa4, 0x12, 0x05, 0x46, 0x64, 0x7b, 0x6a, 0x3f, 0x99, 0x15, 0xc4, + 0xf8, 0x7e, 0x32, 0x1b, 0x17, 0x13, 0xd2, 0x11, 0x9c, 0x0b, 0x0d, 0x0d, 0xd0, 0xab, 0x90, 0xf3, + 0xa2, 0x0a, 0x16, 0xa3, 0xce, 0xc0, 0xab, 0x3c, 0x5e, 0xe9, 0x77, 0x82, 0xa7, 0x32, 0x88, 0x80, + 0xd5, 0x21, 0xcd, 0xce, 0x64, 0x3a, 0x93, 0xa5, 0x19, 0x07, 0x72, 0x40, 0x6e, 0x9b, 0x1d, 0xbd, + 0x32, 0x17, 0x96, 0xde, 0x85, 0x34, 0xa3, 0xa0, 0x3c, 0x64, 0x1e, 0x1c, 0xdc, 0x3b, 0x38, 0x7c, + 0xe7, 0x40, 0x8c, 0x21, 0x80, 0x74, 0xb5, 0x56, 0xab, 0x1f, 0x35, 0x45, 0x01, 0xe5, 0x20, 0x55, + 0xdd, 0x3d, 0x94, 0x9b, 0x62, 0x9c, 0x90, 0xe5, 0xfa, 0x7e, 0xbd, 0xd6, 0x14, 0x13, 0x68, 0x15, + 0x8a, 0xac, 0xac, 0xdc, 0x39, 0x94, 0xdf, 0xaa, 0x36, 0xc5, 0xa4, 0x8f, 0x74, 0x5c, 0x3f, 0xb8, + 0x5d, 0x97, 0xc5, 0x94, 0xf4, 0x5f, 0x70, 0x31, 0x32, 0x0c, 0xf1, 0xe0, 0x2d, 0xc1, 0x07, 0x6f, + 0x49, 0x9f, 0xc7, 0x49, 0x6a, 0x18, 0x15, 0x5b, 0xa0, 0xfd, 0x89, 0x81, 0x5f, 0x5f, 0x22, 0x30, + 0x99, 0x18, 0x3d, 0xc9, 0x06, 0x4d, 0xcc, 0x1c, 0x10, 0x6d, 0x9b, 0x9d, 0x40, 0x45, 0xb9, 0xc8, + 0xa9, 0x54, 0xc8, 0x62, 0x6c, 0xef, 0xe3, 0x96, 0xad, 0xb0, 0x45, 0x64, 0xd1, 0x94, 0x2c, 0x47, + 0xd8, 0x08, 0xf5, 0x98, 0x11, 0xa5, 0xf7, 0x96, 0xb2, 0x65, 0x0e, 0x52, 0x72, 0xbd, 0x29, 0x3f, + 0x12, 0x13, 0x08, 0x41, 0x89, 0x16, 0x95, 0xe3, 0x83, 0xea, 0xd1, 0x71, 0xe3, 0x90, 0xd8, 0x72, + 0x0d, 0x56, 0x1c, 0x5b, 0x3a, 0xc4, 0x94, 0x74, 0x8d, 0xe4, 0x29, 0xa1, 0x81, 0xd1, 0x74, 0x62, + 0x2a, 0xfd, 0x4a, 0xf0, 0x73, 0x07, 0x83, 0x9b, 0x43, 0x48, 0x5b, 0xb6, 0x6a, 0x8f, 0x2c, 0x6e, + 0xc4, 0x57, 0x17, 0x8d, 0x94, 0xb6, 0x9d, 0xc2, 0x31, 0x15, 0x97, 0xb9, 0x1a, 0xe9, 0x26, 0x94, + 0x82, 0x5f, 0xa2, 0x6d, 0xe0, 0x2d, 0xa2, 0xb8, 0x74, 0x0b, 0xd0, 0x74, 0x00, 0x15, 0x92, 0xa4, + 0x0b, 0x61, 0x49, 0xfa, 0xaf, 0x05, 0x92, 0x1e, 0x46, 0x06, 0x4b, 0xe8, 0xed, 0x89, 0x41, 0xbe, + 0xbe, 0x4c, 0xa8, 0xb5, 0xcd, 0x68, 0x13, 0xc3, 0xbc, 0x01, 0x05, 0x3f, 0x7d, 0xb1, 0x41, 0x7e, + 0x17, 0xf7, 0x36, 0x71, 0x10, 0x4d, 0xf0, 0x8e, 0x40, 0xe1, 0x7b, 0x1e, 0x81, 0x6f, 0x00, 0xd8, + 0x63, 0x1e, 0xa5, 0x39, 0x7e, 0xf4, 0x72, 0x08, 0x4a, 0x8b, 0x5b, 0xcd, 0x31, 0xdf, 0x04, 0x39, + 0x9b, 0x97, 0x2c, 0x74, 0xec, 0x87, 0x56, 0x46, 0xd4, 0xc7, 0x5a, 0x1c, 0x76, 0x58, 0xd4, 0x19, + 0x7b, 0x10, 0x0c, 0x23, 0x5b, 0xe8, 0x11, 0x5c, 0x98, 0x08, 0x14, 0x5c, 0xd5, 0xc9, 0x45, 0xe3, + 0x85, 0x73, 0xc1, 0x78, 0xc1, 0x51, 0xed, 0xf7, 0xf6, 0xa9, 0xa0, 0xb7, 0x7f, 0x13, 0x2e, 0xcd, + 0x8a, 0x44, 0xd1, 0x65, 0x00, 0x3c, 0x24, 0xce, 0xa1, 0xad, 0xb8, 0x97, 0x18, 0x39, 0x4e, 0x69, + 0x8e, 0xa5, 0xbb, 0x50, 0x8e, 0x8a, 0x32, 0xd1, 0x35, 0x48, 0xd2, 0x54, 0x80, 0x45, 0x3b, 0x17, + 0x42, 0x40, 0x06, 0xc2, 0x27, 0x53, 0x26, 0xe9, 0x11, 0x80, 0x07, 0xf5, 0x90, 0x93, 0xce, 0xd4, + 0x47, 0xc3, 0x36, 0x95, 0x4d, 0xc9, 0xac, 0x82, 0x6e, 0x42, 0x8a, 0x05, 0xbc, 0xf1, 0x08, 0x97, + 0x40, 0xf4, 0xf9, 0xa0, 0x22, 0xc6, 0x2d, 0x69, 0x80, 0xa6, 0xe1, 0xf6, 0x88, 0x26, 0xde, 0x0c, + 0x36, 0xf1, 0x74, 0x24, 0x70, 0x1f, 0xde, 0xd4, 0x47, 0x90, 0xa2, 0x2b, 0x90, 0x38, 0x7f, 0x7a, + 0xc7, 0xc3, 0xa3, 0x56, 0x52, 0x46, 0x3f, 0x06, 0x50, 0x6d, 0xdb, 0xd4, 0x4e, 0x46, 0x5e, 0x03, + 0x9b, 0xe1, 0x2b, 0xb8, 0xea, 0xf0, 0xed, 0x5e, 0xe2, 0x4b, 0x79, 0xdd, 0x13, 0xf5, 0x2d, 0x67, + 0x9f, 0x42, 0xe9, 0x00, 0x4a, 0x41, 0x59, 0x27, 0xce, 0x62, 0x7d, 0x08, 0xc6, 0x59, 0x2c, 0x6c, + 0xe6, 0x71, 0x96, 0x1b, 0xa5, 0x25, 0xd8, 0x45, 0x16, 0xad, 0x48, 0x1f, 0xc7, 0xa1, 0xe0, 0xdf, + 0x00, 0xff, 0x7e, 0xa1, 0x90, 0xf4, 0x33, 0x01, 0xb2, 0xee, 0xf0, 0x83, 0xb7, 0x5a, 0x81, 0x6b, + 0x40, 0x66, 0xbd, 0xb8, 0xff, 0x2a, 0x8a, 0x5d, 0xfa, 0x25, 0xdc, 0x4b, 0xbf, 0x5b, 0xae, 0x1b, + 0x8e, 0xc2, 0x96, 0xfc, 0xb6, 0xe6, 0xab, 0xca, 0x89, 0x3a, 0x6e, 0x41, 0xce, 0x3d, 0x45, 0x48, + 0xf2, 0xe3, 0xc0, 0x80, 0x02, 0xdf, 0xcb, 0x1c, 0xc4, 0x5d, 0x87, 0x94, 0xa1, 0x7f, 0xc8, 0xef, + 0xb9, 0x12, 0x32, 0xab, 0x48, 0x6d, 0x58, 0x99, 0x38, 0x82, 0xd0, 0x2d, 0xc8, 0x18, 0xa3, 0x13, + 0xc5, 0x59, 0x1c, 0x13, 0x60, 0xa9, 0x13, 0x56, 0x8f, 0x4e, 0xfa, 0x5a, 0xeb, 0x1e, 0x3e, 0x73, + 0x3a, 0x63, 0x8c, 0x4e, 0xee, 0xb1, 0x35, 0xc4, 0x5a, 0x89, 0xfb, 0x5b, 0xf9, 0x85, 0x00, 0x59, + 0x67, 0x4f, 0xa0, 0xff, 0x81, 0x9c, 0x7b, 0xbc, 0xb9, 0x17, 0xd5, 0x91, 0xe7, 0x22, 0xd7, 0xef, + 0x89, 0xa0, 0xaa, 0x73, 0xc3, 0xae, 0xb5, 0x95, 0x4e, 0x5f, 0x65, 0x6b, 0xa9, 0x14, 0xb4, 0x19, + 0x3b, 0x00, 0xa9, 0x5f, 0xd8, 0xbb, 0x7d, 0xa7, 0xaf, 0x76, 0xe5, 0x3c, 0x95, 0xd9, 0x6b, 0x93, + 0x0a, 0x8f, 0x30, 0xff, 0x2a, 0x80, 0x38, 0xb9, 0x63, 0xbf, 0x77, 0xef, 0xa6, 0xdd, 0x6d, 0x22, + 0xc4, 0xdd, 0xa2, 0x1d, 0x58, 0x73, 0x39, 0x14, 0x4b, 0xeb, 0x0e, 0x55, 0x7b, 0x64, 0x62, 0x0e, + 0x2f, 0x23, 0xf7, 0xd3, 0xb1, 0xf3, 0x65, 0x7a, 0xd4, 0xa9, 0x27, 0x1c, 0xf5, 0x27, 0x71, 0xc8, + 0xfb, 0xc0, 0x6e, 0xf4, 0xdf, 0xbe, 0xc3, 0xa8, 0x14, 0xe2, 0xa1, 0x7c, 0xbc, 0xde, 0xa5, 0x73, + 0xd0, 0x4c, 0xf1, 0xe5, 0xcd, 0x14, 0x75, 0xa5, 0xe0, 0x60, 0xe7, 0xc9, 0xa5, 0xb1, 0xf3, 0x17, + 0x01, 0xd9, 0xba, 0xad, 0xf6, 0x95, 0x53, 0xdd, 0xd6, 0x86, 0x5d, 0x85, 0x2d, 0x43, 0x76, 0x74, + 0x88, 0xf4, 0xcb, 0x43, 0xfa, 0xe1, 0x88, 0xae, 0xc8, 0x9f, 0x08, 0x90, 0x75, 0xc3, 0xff, 0x65, + 0xaf, 0xa4, 0xcf, 0x43, 0x9a, 0x47, 0xb8, 0xec, 0x4e, 0x9a, 0xd7, 0x42, 0x2f, 0x09, 0x2a, 0x90, + 0x1d, 0x60, 0x5b, 0xa5, 0xe7, 0x20, 0xf3, 0xae, 0x6e, 0xfd, 0xea, 0xeb, 0x90, 0xf7, 0x5d, 0xe7, + 0x93, 0xa3, 0xf1, 0xa0, 0xfe, 0x8e, 0x18, 0xab, 0x64, 0x3e, 0xfd, 0x62, 0x2b, 0x71, 0x80, 0x3f, + 0x24, 0xbb, 0x59, 0xae, 0xd7, 0x1a, 0xf5, 0xda, 0x3d, 0x51, 0xa8, 0xe4, 0x3f, 0xfd, 0x62, 0x2b, + 0x23, 0x63, 0x0a, 0xce, 0x5e, 0xbd, 0x07, 0x2b, 0x13, 0x13, 0x13, 0x0c, 0x9f, 0x10, 0x94, 0x6e, + 0x3f, 0x38, 0xba, 0xbf, 0x57, 0xab, 0x36, 0xeb, 0xca, 0xc3, 0xc3, 0x66, 0x5d, 0x14, 0xd0, 0x05, + 0x58, 0xbb, 0xbf, 0x77, 0xb7, 0xd1, 0x54, 0x6a, 0xf7, 0xf7, 0xea, 0x07, 0x4d, 0xa5, 0xda, 0x6c, + 0x56, 0x6b, 0xf7, 0xc4, 0xf8, 0xf5, 0xbf, 0x17, 0x20, 0x59, 0xdd, 0xad, 0xed, 0xa1, 0x1a, 0x24, + 0x29, 0x24, 0x33, 0xf3, 0x41, 0x62, 0x65, 0x36, 0xcc, 0x8e, 0xee, 0x40, 0x8a, 0xa2, 0x35, 0x68, + 0xf6, 0x0b, 0xc5, 0xca, 0x1c, 0xdc, 0x9d, 0x74, 0x86, 0xee, 0xc8, 0x99, 0x4f, 0x16, 0x2b, 0xb3, + 0x61, 0x78, 0x74, 0x1f, 0x32, 0x4e, 0xb2, 0x3e, 0xef, 0x1d, 0x61, 0x65, 0x2e, 0x36, 0x4e, 0x86, + 0xc6, 0x40, 0x8f, 0xd9, 0xaf, 0x19, 0x2b, 0x73, 0x00, 0x7a, 0xb4, 0x07, 0x69, 0x9e, 0x16, 0xcf, + 0x79, 0xa0, 0x58, 0x99, 0x07, 0xb9, 0x23, 0x19, 0x72, 0x1e, 0x9c, 0x34, 0xff, 0x8d, 0x66, 0x65, + 0x81, 0xbb, 0x07, 0xf4, 0x2e, 0x14, 0x83, 0x29, 0xf7, 0x62, 0x8f, 0x20, 0x2b, 0x0b, 0x82, 0xfb, + 0x44, 0x7f, 0x30, 0xff, 0x5e, 0xec, 0x51, 0x64, 0x65, 0x41, 0xac, 0x1f, 0xbd, 0x0f, 0xab, 0xd3, + 0xf9, 0xf1, 0xe2, 0x6f, 0x24, 0x2b, 0x4b, 0xa0, 0xff, 0x68, 0x00, 0x28, 0x24, 0xaf, 0x5e, 0xe2, + 0xc9, 0x64, 0x65, 0x99, 0xcb, 0x00, 0xd4, 0x86, 0x95, 0xc9, 0x64, 0x75, 0xd1, 0x27, 0x94, 0x95, + 0x85, 0x2f, 0x06, 0x58, 0x2b, 0xc1, 0x24, 0x77, 0xd1, 0x27, 0x95, 0x95, 0x85, 0xef, 0x09, 0xd0, + 0x03, 0x00, 0x5f, 0x9e, 0xba, 0xc0, 0x13, 0xcb, 0xca, 0x22, 0x37, 0x06, 0xc8, 0x80, 0xb5, 0xb0, + 0x04, 0x76, 0x99, 0x17, 0x97, 0x95, 0xa5, 0x2e, 0x12, 0xc8, 0x7a, 0x0e, 0xa6, 0xa2, 0x8b, 0xbd, + 0xc0, 0xac, 0x2c, 0x78, 0xa3, 0x80, 0x2c, 0x58, 0x0f, 0x4d, 0xbf, 0x96, 0x7a, 0x8f, 0x59, 0x59, + 0xee, 0x96, 0x01, 0x75, 0x41, 0x9c, 0x4a, 0xda, 0x16, 0x7e, 0x9e, 0x59, 0x59, 0xfc, 0xbe, 0x61, + 0xb7, 0xfa, 0xe5, 0x37, 0x1b, 0xc2, 0x57, 0xdf, 0x6c, 0x08, 0x7f, 0xf9, 0x66, 0x43, 0xf8, 0xec, + 0xdb, 0x8d, 0xd8, 0x57, 0xdf, 0x6e, 0xc4, 0xfe, 0xf4, 0xed, 0x46, 0xec, 0xff, 0x9e, 0xef, 0x6a, + 0x76, 0x6f, 0x74, 0xb2, 0xdd, 0xd2, 0x07, 0x3b, 0x2d, 0x7d, 0x80, 0xed, 0x93, 0x8e, 0xed, 0x15, + 0xbc, 0xbf, 0x08, 0x4e, 0xd2, 0x34, 0x3e, 0xb8, 0xf1, 0x8f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0a, + 0x73, 0x9c, 0xec, 0x65, 0x30, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -6094,11 +6078,6 @@ func (m *RequestCreateOracleResultTx) MarshalToSizedBuffer(dAtA []byte) (int, er _ = i var l int _ = l - if m.Height != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x18 - } if len(m.GossipedVotes) > 0 { for iNdEx := len(m.GossipedVotes) - 1; iNdEx >= 0; iNdEx-- { { @@ -6110,16 +6089,9 @@ func (m *RequestCreateOracleResultTx) MarshalToSizedBuffer(dAtA []byte) (int, er i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x12 + dAtA[i] = 0xa } } - if len(m.ProposerAddress) > 0 { - i -= len(m.ProposerAddress) - copy(dAtA[i:], m.ProposerAddress) - i = encodeVarintTypes(dAtA, i, uint64(len(m.ProposerAddress))) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } @@ -8589,19 +8561,12 @@ func (m *RequestCreateOracleResultTx) Size() (n int) { } var l int _ = l - l = len(m.ProposerAddress) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } if len(m.GossipedVotes) > 0 { for _, e := range m.GossipedVotes { l = e.Size() n += 1 + l + sovTypes(uint64(l)) } } - if m.Height != 0 { - n += 1 + sovTypes(uint64(m.Height)) - } return n } @@ -12787,40 +12752,6 @@ func (m *RequestCreateOracleResultTx) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ProposerAddress", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ProposerAddress = append(m.ProposerAddress[:0], dAtA[iNdEx:postIndex]...) - if m.ProposerAddress == nil { - m.ProposerAddress = []byte{} - } - iNdEx = postIndex - case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field GossipedVotes", wireType) } @@ -12854,25 +12785,6 @@ func (m *RequestCreateOracleResultTx) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Height", wireType) - } - m.Height = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Height |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto index 43ca0a12765..ec79ba98691 100644 --- a/proto/tendermint/abci/types.proto +++ b/proto/tendermint/abci/types.proto @@ -199,9 +199,7 @@ message RequestFinalizeBlock { } message RequestCreateOracleResultTx { - bytes proposer_address = 1; - repeated tendermint.oracle.GossipedVotes gossiped_votes = 2; - int64 height = 3; + repeated tendermint.oracle.GossipedVotes gossiped_votes = 1; } message RequestFetchOracleVotes {} diff --git a/state/execution.go b/state/execution.go index b92f5b8290e..1f1f8963899 100644 --- a/state/execution.go +++ b/state/execution.go @@ -142,9 +142,7 @@ func (blockExec *BlockExecutor) CreateProposalBlock( } resp, err := blockExec.proxyApp.CreateOracleResultTx(ctx, &abci.RequestCreateOracleResultTx{ - ProposerAddress: proposerAddr, - GossipedVotes: votes, - Height: height, + GossipedVotes: votes, }) if err != nil { blockExec.logger.Error("error in proxyAppConn.CreateOracleResultTx", "err", err) From 8c4eef2b886c69793b59aa1f79c5f238b75c5618 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Thu, 9 May 2024 17:25:39 +0800 Subject: [PATCH 119/150] add back validateOracleVotes hook --- abci/client/grpc_client.go | 4 + abci/client/mocks/client.go | 26 + abci/client/socket_client.go | 11 + abci/types/application.go | 5 + abci/types/messages.go | 6 + abci/types/mocks/application.go | 26 + abci/types/types.pb.go | 1136 +++++++++++++++++++++-------- proto/tendermint/abci/types.proto | 16 + proxy/app_conn.go | 6 + proxy/mocks/app_conn_consensus.go | 26 + state/execution.go | 14 + 11 files changed, 988 insertions(+), 288 deletions(-) diff --git a/abci/client/grpc_client.go b/abci/client/grpc_client.go index b34f40c5b0e..0b337eb8d43 100644 --- a/abci/client/grpc_client.go +++ b/abci/client/grpc_client.go @@ -253,3 +253,7 @@ func (cli *grpcClient) CreateOracleResultTx(ctx context.Context, req *types.Requ func (cli *grpcClient) FetchOracleVotes(ctx context.Context, req *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error) { return cli.client.FetchOracleVotes(ctx, types.ToRequestFetchOracleVotes(req).GetFetchOracleVotes(), grpc.WaitForReady(true)) } + +func (cli *grpcClient) ValidateOracleVotes(ctx context.Context, req *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) { + return cli.client.ValidateOracleVotes(ctx, types.ToRequestValidateOracleVotes(req).GetValidateOracleVotes(), grpc.WaitForReady(true)) +} diff --git a/abci/client/mocks/client.go b/abci/client/mocks/client.go index 2a5ce456be3..b48cbdd19f1 100644 --- a/abci/client/mocks/client.go +++ b/abci/client/mocks/client.go @@ -618,6 +618,32 @@ func (_m *Client) String() string { return r0 } +// ValidateOracleVotes provides a mock function with given fields: _a0, _a1 +func (_m *Client) ValidateOracleVotes(_a0 context.Context, _a1 *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseValidateOracleVotes + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestValidateOracleVotes) *types.ResponseValidateOracleVotes); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseValidateOracleVotes) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestValidateOracleVotes) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // VerifyVoteExtension provides a mock function with given fields: _a0, _a1 func (_m *Client) VerifyVoteExtension(_a0 context.Context, _a1 *types.RequestVerifyVoteExtension) (*types.ResponseVerifyVoteExtension, error) { ret := _m.Called(_a0, _a1) diff --git a/abci/client/socket_client.go b/abci/client/socket_client.go index 8de6847c5cc..d997c0a4310 100644 --- a/abci/client/socket_client.go +++ b/abci/client/socket_client.go @@ -434,6 +434,17 @@ func (cli *socketClient) FetchOracleVotes(ctx context.Context, req *types.Reques return reqRes.Response.GetFetchOracleVotes(), cli.Error() } +func (cli *socketClient) ValidateOracleVotes(ctx context.Context, req *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) { + reqRes, err := cli.queueRequest(ctx, types.ToRequestValidateOracleVotes(req)) + if err != nil { + return nil, err + } + if err := cli.Flush(ctx); err != nil { + return nil, err + } + return reqRes.Response.GetValidateOracleVotes(), cli.Error() +} + func (cli *socketClient) queueRequest(ctx context.Context, req *types.Request) (*ReqRes, error) { reqres := NewReqRes(req) diff --git a/abci/types/application.go b/abci/types/application.go index ede57135c5f..ffb43865dd1 100644 --- a/abci/types/application.go +++ b/abci/types/application.go @@ -38,6 +38,7 @@ type Application interface { // Hooks CreateOracleResultTx(context.Context, *RequestCreateOracleResultTx) (*ResponseCreateOracleResultTx, error) FetchOracleVotes(context.Context, *RequestFetchOracleVotes) (*ResponseFetchOracleVotes, error) + ValidateOracleVotes(context.Context, *RequestValidateOracleVotes) (*ResponseValidateOracleVotes, error) } //------------------------------------------------------- @@ -131,3 +132,7 @@ func (BaseApplication) CreateOracleResultTx(_ context.Context, req *RequestCreat func (BaseApplication) FetchOracleVotes(_ context.Context, req *RequestFetchOracleVotes) (*ResponseFetchOracleVotes, error) { return &ResponseFetchOracleVotes{}, nil } + +func (BaseApplication) ValidateOracleVotes(_ context.Context, req *RequestValidateOracleVotes) (*ResponseValidateOracleVotes, error) { + return &ResponseValidateOracleVotes{}, nil +} diff --git a/abci/types/messages.go b/abci/types/messages.go index beddfaac30c..2bd4421de53 100644 --- a/abci/types/messages.go +++ b/abci/types/messages.go @@ -136,6 +136,12 @@ func ToRequestFetchOracleVotes(req *RequestFetchOracleVotes) *Request { } } +func ToRequestValidateOracleVotes(req *RequestValidateOracleVotes) *Request { + return &Request{ + Value: &Request_ValidateOracleVotes{req}, + } +} + //---------------------------------------- func ToResponseException(errStr string) *Response { diff --git a/abci/types/mocks/application.go b/abci/types/mocks/application.go index ee78763ae41..061bee9c225 100644 --- a/abci/types/mocks/application.go +++ b/abci/types/mocks/application.go @@ -404,6 +404,32 @@ func (_m *Application) CreateOracleResultTx(_a0 context.Context, _a1 *types.Requ return r0, r1 } +// ValidateOracleVotes provides a mock function with given fields: _a0, _a1 +func (_m *Application) ValidateOracleVotes(_a0 context.Context, _a1 *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseValidateOracleVotes + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestValidateOracleVotes) *types.ResponseValidateOracleVotes); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseValidateOracleVotes) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestValidateOracleVotes) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // VerifyVoteExtension provides a mock function with given fields: _a0, _a1 func (_m *Application) VerifyVoteExtension(_a0 context.Context, _a1 *types.RequestVerifyVoteExtension) (*types.ResponseVerifyVoteExtension, error) { ret := _m.Called(_a0, _a1) diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go index 97379a8c7df..6f4b9a40d7e 100644 --- a/abci/types/types.pb.go +++ b/abci/types/types.pb.go @@ -122,7 +122,7 @@ func (x ResponseOfferSnapshot_Result) String() string { } func (ResponseOfferSnapshot_Result) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{29, 0} + return fileDescriptor_252557cfdd89a31a, []int{30, 0} } type ResponseApplySnapshotChunk_Result int32 @@ -159,7 +159,7 @@ func (x ResponseApplySnapshotChunk_Result) String() string { } func (ResponseApplySnapshotChunk_Result) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{31, 0} + return fileDescriptor_252557cfdd89a31a, []int{32, 0} } type ResponseProcessProposal_ProposalStatus int32 @@ -187,7 +187,7 @@ func (x ResponseProcessProposal_ProposalStatus) String() string { } func (ResponseProcessProposal_ProposalStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{33, 0} + return fileDescriptor_252557cfdd89a31a, []int{34, 0} } type ResponseVerifyVoteExtension_VerifyStatus int32 @@ -219,7 +219,32 @@ func (x ResponseVerifyVoteExtension_VerifyStatus) String() string { } func (ResponseVerifyVoteExtension_VerifyStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{35, 0} + return fileDescriptor_252557cfdd89a31a, []int{36, 0} +} + +type ResponseValidateOracleVotes_Status int32 + +const ( + ResponseValidateOracleVotes_absent ResponseValidateOracleVotes_Status = 0 + ResponseValidateOracleVotes_present ResponseValidateOracleVotes_Status = 1 +) + +var ResponseValidateOracleVotes_Status_name = map[int32]string{ + 0: "absent", + 1: "present", +} + +var ResponseValidateOracleVotes_Status_value = map[string]int32{ + "absent": 0, + "present": 1, +} + +func (x ResponseValidateOracleVotes_Status) String() string { + return proto.EnumName(ResponseValidateOracleVotes_Status_name, int32(x)) +} + +func (ResponseValidateOracleVotes_Status) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{40, 0} } type Request struct { @@ -242,6 +267,7 @@ type Request struct { // *Request_FinalizeBlock // *Request_CreateOracleResultTx // *Request_FetchOracleVotes + // *Request_ValidateOracleVotes Value isRequest_Value `protobuf_oneof:"value"` } @@ -338,6 +364,9 @@ type Request_CreateOracleResultTx struct { type Request_FetchOracleVotes struct { FetchOracleVotes *RequestFetchOracleVotes `protobuf:"bytes,22,opt,name=fetch_oracle_votes,json=fetchOracleVotes,proto3,oneof" json:"fetch_oracle_votes,omitempty"` } +type Request_ValidateOracleVotes struct { + ValidateOracleVotes *RequestValidateOracleVotes `protobuf:"bytes,23,opt,name=validate_oracle_votes,json=validateOracleVotes,proto3,oneof" json:"validate_oracle_votes,omitempty"` +} func (*Request_Echo) isRequest_Value() {} func (*Request_Flush) isRequest_Value() {} @@ -357,6 +386,7 @@ func (*Request_VerifyVoteExtension) isRequest_Value() {} func (*Request_FinalizeBlock) isRequest_Value() {} func (*Request_CreateOracleResultTx) isRequest_Value() {} func (*Request_FetchOracleVotes) isRequest_Value() {} +func (*Request_ValidateOracleVotes) isRequest_Value() {} func (m *Request) GetValue() isRequest_Value { if m != nil { @@ -491,6 +521,13 @@ func (m *Request) GetFetchOracleVotes() *RequestFetchOracleVotes { return nil } +func (m *Request) GetValidateOracleVotes() *RequestValidateOracleVotes { + if x, ok := m.GetValue().(*Request_ValidateOracleVotes); ok { + return x.ValidateOracleVotes + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*Request) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -512,6 +549,7 @@ func (*Request) XXX_OneofWrappers() []interface{} { (*Request_FinalizeBlock)(nil), (*Request_CreateOracleResultTx)(nil), (*Request_FetchOracleVotes)(nil), + (*Request_ValidateOracleVotes)(nil), } } @@ -1679,6 +1717,50 @@ func (m *RequestFetchOracleVotes) XXX_DiscardUnknown() { var xxx_messageInfo_RequestFetchOracleVotes proto.InternalMessageInfo +type RequestValidateOracleVotes struct { + OracleTx []byte `protobuf:"bytes,1,opt,name=oracle_tx,json=oracleTx,proto3" json:"oracle_tx,omitempty"` +} + +func (m *RequestValidateOracleVotes) Reset() { *m = RequestValidateOracleVotes{} } +func (m *RequestValidateOracleVotes) String() string { return proto.CompactTextString(m) } +func (*RequestValidateOracleVotes) ProtoMessage() {} +func (*RequestValidateOracleVotes) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{19} +} +func (m *RequestValidateOracleVotes) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RequestValidateOracleVotes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RequestValidateOracleVotes.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RequestValidateOracleVotes) XXX_Merge(src proto.Message) { + xxx_messageInfo_RequestValidateOracleVotes.Merge(m, src) +} +func (m *RequestValidateOracleVotes) XXX_Size() int { + return m.Size() +} +func (m *RequestValidateOracleVotes) XXX_DiscardUnknown() { + xxx_messageInfo_RequestValidateOracleVotes.DiscardUnknown(m) +} + +var xxx_messageInfo_RequestValidateOracleVotes proto.InternalMessageInfo + +func (m *RequestValidateOracleVotes) GetOracleTx() []byte { + if m != nil { + return m.OracleTx + } + return nil +} + type Response struct { // Types that are valid to be assigned to Value: // @@ -1701,6 +1783,7 @@ type Response struct { // *Response_FinalizeBlock // *Response_CreateOracleResultTx // *Response_FetchOracleVotes + // *Response_ValidateOracleVotes Value isResponse_Value `protobuf_oneof:"value"` } @@ -1708,7 +1791,7 @@ func (m *Response) Reset() { *m = Response{} } func (m *Response) String() string { return proto.CompactTextString(m) } func (*Response) ProtoMessage() {} func (*Response) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{19} + return fileDescriptor_252557cfdd89a31a, []int{20} } func (m *Response) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1800,6 +1883,9 @@ type Response_CreateOracleResultTx struct { type Response_FetchOracleVotes struct { FetchOracleVotes *ResponseFetchOracleVotes `protobuf:"bytes,23,opt,name=fetch_oracle_votes,json=fetchOracleVotes,proto3,oneof" json:"fetch_oracle_votes,omitempty"` } +type Response_ValidateOracleVotes struct { + ValidateOracleVotes *ResponseValidateOracleVotes `protobuf:"bytes,24,opt,name=validate_oracle_votes,json=validateOracleVotes,proto3,oneof" json:"validate_oracle_votes,omitempty"` +} func (*Response_Exception) isResponse_Value() {} func (*Response_Echo) isResponse_Value() {} @@ -1820,6 +1906,7 @@ func (*Response_VerifyVoteExtension) isResponse_Value() {} func (*Response_FinalizeBlock) isResponse_Value() {} func (*Response_CreateOracleResultTx) isResponse_Value() {} func (*Response_FetchOracleVotes) isResponse_Value() {} +func (*Response_ValidateOracleVotes) isResponse_Value() {} func (m *Response) GetValue() isResponse_Value { if m != nil { @@ -1961,6 +2048,13 @@ func (m *Response) GetFetchOracleVotes() *ResponseFetchOracleVotes { return nil } +func (m *Response) GetValidateOracleVotes() *ResponseValidateOracleVotes { + if x, ok := m.GetValue().(*Response_ValidateOracleVotes); ok { + return x.ValidateOracleVotes + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*Response) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -1983,6 +2077,7 @@ func (*Response) XXX_OneofWrappers() []interface{} { (*Response_FinalizeBlock)(nil), (*Response_CreateOracleResultTx)(nil), (*Response_FetchOracleVotes)(nil), + (*Response_ValidateOracleVotes)(nil), } } @@ -1995,7 +2090,7 @@ func (m *ResponseException) Reset() { *m = ResponseException{} } func (m *ResponseException) String() string { return proto.CompactTextString(m) } func (*ResponseException) ProtoMessage() {} func (*ResponseException) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{20} + return fileDescriptor_252557cfdd89a31a, []int{21} } func (m *ResponseException) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2039,7 +2134,7 @@ func (m *ResponseEcho) Reset() { *m = ResponseEcho{} } func (m *ResponseEcho) String() string { return proto.CompactTextString(m) } func (*ResponseEcho) ProtoMessage() {} func (*ResponseEcho) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{21} + return fileDescriptor_252557cfdd89a31a, []int{22} } func (m *ResponseEcho) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2082,7 +2177,7 @@ func (m *ResponseFlush) Reset() { *m = ResponseFlush{} } func (m *ResponseFlush) String() string { return proto.CompactTextString(m) } func (*ResponseFlush) ProtoMessage() {} func (*ResponseFlush) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{22} + return fileDescriptor_252557cfdd89a31a, []int{23} } func (m *ResponseFlush) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2123,7 +2218,7 @@ func (m *ResponseInfo) Reset() { *m = ResponseInfo{} } func (m *ResponseInfo) String() string { return proto.CompactTextString(m) } func (*ResponseInfo) ProtoMessage() {} func (*ResponseInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{23} + return fileDescriptor_252557cfdd89a31a, []int{24} } func (m *ResponseInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2197,7 +2292,7 @@ func (m *ResponseInitChain) Reset() { *m = ResponseInitChain{} } func (m *ResponseInitChain) String() string { return proto.CompactTextString(m) } func (*ResponseInitChain) ProtoMessage() {} func (*ResponseInitChain) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{24} + return fileDescriptor_252557cfdd89a31a, []int{25} } func (m *ResponseInitChain) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2264,7 +2359,7 @@ func (m *ResponseQuery) Reset() { *m = ResponseQuery{} } func (m *ResponseQuery) String() string { return proto.CompactTextString(m) } func (*ResponseQuery) ProtoMessage() {} func (*ResponseQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{25} + return fileDescriptor_252557cfdd89a31a, []int{26} } func (m *ResponseQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2371,7 +2466,7 @@ func (m *ResponseCheckTx) Reset() { *m = ResponseCheckTx{} } func (m *ResponseCheckTx) String() string { return proto.CompactTextString(m) } func (*ResponseCheckTx) ProtoMessage() {} func (*ResponseCheckTx) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{26} + return fileDescriptor_252557cfdd89a31a, []int{27} } func (m *ResponseCheckTx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2464,7 +2559,7 @@ func (m *ResponseCommit) Reset() { *m = ResponseCommit{} } func (m *ResponseCommit) String() string { return proto.CompactTextString(m) } func (*ResponseCommit) ProtoMessage() {} func (*ResponseCommit) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{27} + return fileDescriptor_252557cfdd89a31a, []int{28} } func (m *ResponseCommit) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2508,7 +2603,7 @@ func (m *ResponseListSnapshots) Reset() { *m = ResponseListSnapshots{} } func (m *ResponseListSnapshots) String() string { return proto.CompactTextString(m) } func (*ResponseListSnapshots) ProtoMessage() {} func (*ResponseListSnapshots) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{28} + return fileDescriptor_252557cfdd89a31a, []int{29} } func (m *ResponseListSnapshots) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2552,7 +2647,7 @@ func (m *ResponseOfferSnapshot) Reset() { *m = ResponseOfferSnapshot{} } func (m *ResponseOfferSnapshot) String() string { return proto.CompactTextString(m) } func (*ResponseOfferSnapshot) ProtoMessage() {} func (*ResponseOfferSnapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{29} + return fileDescriptor_252557cfdd89a31a, []int{30} } func (m *ResponseOfferSnapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2596,7 +2691,7 @@ func (m *ResponseLoadSnapshotChunk) Reset() { *m = ResponseLoadSnapshotC func (m *ResponseLoadSnapshotChunk) String() string { return proto.CompactTextString(m) } func (*ResponseLoadSnapshotChunk) ProtoMessage() {} func (*ResponseLoadSnapshotChunk) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{30} + return fileDescriptor_252557cfdd89a31a, []int{31} } func (m *ResponseLoadSnapshotChunk) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2642,7 +2737,7 @@ func (m *ResponseApplySnapshotChunk) Reset() { *m = ResponseApplySnapsho func (m *ResponseApplySnapshotChunk) String() string { return proto.CompactTextString(m) } func (*ResponseApplySnapshotChunk) ProtoMessage() {} func (*ResponseApplySnapshotChunk) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{31} + return fileDescriptor_252557cfdd89a31a, []int{32} } func (m *ResponseApplySnapshotChunk) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2700,7 +2795,7 @@ func (m *ResponsePrepareProposal) Reset() { *m = ResponsePrepareProposal func (m *ResponsePrepareProposal) String() string { return proto.CompactTextString(m) } func (*ResponsePrepareProposal) ProtoMessage() {} func (*ResponsePrepareProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{32} + return fileDescriptor_252557cfdd89a31a, []int{33} } func (m *ResponsePrepareProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2744,7 +2839,7 @@ func (m *ResponseProcessProposal) Reset() { *m = ResponseProcessProposal func (m *ResponseProcessProposal) String() string { return proto.CompactTextString(m) } func (*ResponseProcessProposal) ProtoMessage() {} func (*ResponseProcessProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{33} + return fileDescriptor_252557cfdd89a31a, []int{34} } func (m *ResponseProcessProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2788,7 +2883,7 @@ func (m *ResponseExtendVote) Reset() { *m = ResponseExtendVote{} } func (m *ResponseExtendVote) String() string { return proto.CompactTextString(m) } func (*ResponseExtendVote) ProtoMessage() {} func (*ResponseExtendVote) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{34} + return fileDescriptor_252557cfdd89a31a, []int{35} } func (m *ResponseExtendVote) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2832,7 +2927,7 @@ func (m *ResponseVerifyVoteExtension) Reset() { *m = ResponseVerifyVoteE func (m *ResponseVerifyVoteExtension) String() string { return proto.CompactTextString(m) } func (*ResponseVerifyVoteExtension) ProtoMessage() {} func (*ResponseVerifyVoteExtension) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{35} + return fileDescriptor_252557cfdd89a31a, []int{36} } func (m *ResponseVerifyVoteExtension) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2887,7 +2982,7 @@ func (m *ResponseFinalizeBlock) Reset() { *m = ResponseFinalizeBlock{} } func (m *ResponseFinalizeBlock) String() string { return proto.CompactTextString(m) } func (*ResponseFinalizeBlock) ProtoMessage() {} func (*ResponseFinalizeBlock) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{36} + return fileDescriptor_252557cfdd89a31a, []int{37} } func (m *ResponseFinalizeBlock) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2959,7 +3054,7 @@ func (m *ResponseCreateOracleResultTx) Reset() { *m = ResponseCreateOrac func (m *ResponseCreateOracleResultTx) String() string { return proto.CompactTextString(m) } func (*ResponseCreateOracleResultTx) ProtoMessage() {} func (*ResponseCreateOracleResultTx) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{37} + return fileDescriptor_252557cfdd89a31a, []int{38} } func (m *ResponseCreateOracleResultTx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3003,7 +3098,7 @@ func (m *ResponseFetchOracleVotes) Reset() { *m = ResponseFetchOracleVot func (m *ResponseFetchOracleVotes) String() string { return proto.CompactTextString(m) } func (*ResponseFetchOracleVotes) ProtoMessage() {} func (*ResponseFetchOracleVotes) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{38} + return fileDescriptor_252557cfdd89a31a, []int{39} } func (m *ResponseFetchOracleVotes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3039,6 +3134,50 @@ func (m *ResponseFetchOracleVotes) GetVote() *oracle.Vote { return nil } +type ResponseValidateOracleVotes struct { + Status ResponseValidateOracleVotes_Status `protobuf:"varint,1,opt,name=status,proto3,enum=tendermint.abci.ResponseValidateOracleVotes_Status" json:"status,omitempty"` +} + +func (m *ResponseValidateOracleVotes) Reset() { *m = ResponseValidateOracleVotes{} } +func (m *ResponseValidateOracleVotes) String() string { return proto.CompactTextString(m) } +func (*ResponseValidateOracleVotes) ProtoMessage() {} +func (*ResponseValidateOracleVotes) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{40} +} +func (m *ResponseValidateOracleVotes) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResponseValidateOracleVotes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ResponseValidateOracleVotes.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ResponseValidateOracleVotes) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseValidateOracleVotes.Merge(m, src) +} +func (m *ResponseValidateOracleVotes) XXX_Size() int { + return m.Size() +} +func (m *ResponseValidateOracleVotes) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseValidateOracleVotes.DiscardUnknown(m) +} + +var xxx_messageInfo_ResponseValidateOracleVotes proto.InternalMessageInfo + +func (m *ResponseValidateOracleVotes) GetStatus() ResponseValidateOracleVotes_Status { + if m != nil { + return m.Status + } + return ResponseValidateOracleVotes_absent +} + type CommitInfo struct { Round int32 `protobuf:"varint,1,opt,name=round,proto3" json:"round,omitempty"` Votes []VoteInfo `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes"` @@ -3048,7 +3187,7 @@ func (m *CommitInfo) Reset() { *m = CommitInfo{} } func (m *CommitInfo) String() string { return proto.CompactTextString(m) } func (*CommitInfo) ProtoMessage() {} func (*CommitInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{39} + return fileDescriptor_252557cfdd89a31a, []int{41} } func (m *CommitInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3106,7 +3245,7 @@ func (m *ExtendedCommitInfo) Reset() { *m = ExtendedCommitInfo{} } func (m *ExtendedCommitInfo) String() string { return proto.CompactTextString(m) } func (*ExtendedCommitInfo) ProtoMessage() {} func (*ExtendedCommitInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{40} + return fileDescriptor_252557cfdd89a31a, []int{42} } func (m *ExtendedCommitInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3161,7 +3300,7 @@ func (m *Event) Reset() { *m = Event{} } func (m *Event) String() string { return proto.CompactTextString(m) } func (*Event) ProtoMessage() {} func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{41} + return fileDescriptor_252557cfdd89a31a, []int{43} } func (m *Event) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3215,7 +3354,7 @@ func (m *EventAttribute) Reset() { *m = EventAttribute{} } func (m *EventAttribute) String() string { return proto.CompactTextString(m) } func (*EventAttribute) ProtoMessage() {} func (*EventAttribute) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{42} + return fileDescriptor_252557cfdd89a31a, []int{44} } func (m *EventAttribute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3283,7 +3422,7 @@ func (m *ExecTxResult) Reset() { *m = ExecTxResult{} } func (m *ExecTxResult) String() string { return proto.CompactTextString(m) } func (*ExecTxResult) ProtoMessage() {} func (*ExecTxResult) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{43} + return fileDescriptor_252557cfdd89a31a, []int{45} } func (m *ExecTxResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3382,7 +3521,7 @@ func (m *TxResult) Reset() { *m = TxResult{} } func (m *TxResult) String() string { return proto.CompactTextString(m) } func (*TxResult) ProtoMessage() {} func (*TxResult) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{44} + return fileDescriptor_252557cfdd89a31a, []int{46} } func (m *TxResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3449,7 +3588,7 @@ func (m *Validator) Reset() { *m = Validator{} } func (m *Validator) String() string { return proto.CompactTextString(m) } func (*Validator) ProtoMessage() {} func (*Validator) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{45} + return fileDescriptor_252557cfdd89a31a, []int{47} } func (m *Validator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3501,7 +3640,7 @@ func (m *ValidatorUpdate) Reset() { *m = ValidatorUpdate{} } func (m *ValidatorUpdate) String() string { return proto.CompactTextString(m) } func (*ValidatorUpdate) ProtoMessage() {} func (*ValidatorUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{46} + return fileDescriptor_252557cfdd89a31a, []int{48} } func (m *ValidatorUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3553,7 +3692,7 @@ 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_252557cfdd89a31a, []int{47} + return fileDescriptor_252557cfdd89a31a, []int{49} } func (m *VoteInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3611,7 +3750,7 @@ func (m *ExtendedVoteInfo) Reset() { *m = ExtendedVoteInfo{} } func (m *ExtendedVoteInfo) String() string { return proto.CompactTextString(m) } func (*ExtendedVoteInfo) ProtoMessage() {} func (*ExtendedVoteInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{48} + return fileDescriptor_252557cfdd89a31a, []int{50} } func (m *ExtendedVoteInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3686,7 +3825,7 @@ func (m *Misbehavior) Reset() { *m = Misbehavior{} } func (m *Misbehavior) String() string { return proto.CompactTextString(m) } func (*Misbehavior) ProtoMessage() {} func (*Misbehavior) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{49} + return fileDescriptor_252557cfdd89a31a, []int{51} } func (m *Misbehavior) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3762,7 +3901,7 @@ func (m *Snapshot) Reset() { *m = Snapshot{} } func (m *Snapshot) String() string { return proto.CompactTextString(m) } func (*Snapshot) ProtoMessage() {} func (*Snapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{50} + return fileDescriptor_252557cfdd89a31a, []int{52} } func (m *Snapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3833,6 +3972,7 @@ func init() { proto.RegisterEnum("tendermint.abci.ResponseApplySnapshotChunk_Result", ResponseApplySnapshotChunk_Result_name, ResponseApplySnapshotChunk_Result_value) proto.RegisterEnum("tendermint.abci.ResponseProcessProposal_ProposalStatus", ResponseProcessProposal_ProposalStatus_name, ResponseProcessProposal_ProposalStatus_value) proto.RegisterEnum("tendermint.abci.ResponseVerifyVoteExtension_VerifyStatus", ResponseVerifyVoteExtension_VerifyStatus_name, ResponseVerifyVoteExtension_VerifyStatus_value) + proto.RegisterEnum("tendermint.abci.ResponseValidateOracleVotes_Status", ResponseValidateOracleVotes_Status_name, ResponseValidateOracleVotes_Status_value) proto.RegisterType((*Request)(nil), "tendermint.abci.Request") proto.RegisterType((*RequestEcho)(nil), "tendermint.abci.RequestEcho") proto.RegisterType((*RequestFlush)(nil), "tendermint.abci.RequestFlush") @@ -3852,6 +3992,7 @@ func init() { proto.RegisterType((*RequestFinalizeBlock)(nil), "tendermint.abci.RequestFinalizeBlock") proto.RegisterType((*RequestCreateOracleResultTx)(nil), "tendermint.abci.RequestCreateOracleResultTx") proto.RegisterType((*RequestFetchOracleVotes)(nil), "tendermint.abci.RequestFetchOracleVotes") + proto.RegisterType((*RequestValidateOracleVotes)(nil), "tendermint.abci.RequestValidateOracleVotes") proto.RegisterType((*Response)(nil), "tendermint.abci.Response") proto.RegisterType((*ResponseException)(nil), "tendermint.abci.ResponseException") proto.RegisterType((*ResponseEcho)(nil), "tendermint.abci.ResponseEcho") @@ -3872,6 +4013,7 @@ func init() { proto.RegisterType((*ResponseFinalizeBlock)(nil), "tendermint.abci.ResponseFinalizeBlock") proto.RegisterType((*ResponseCreateOracleResultTx)(nil), "tendermint.abci.ResponseCreateOracleResultTx") proto.RegisterType((*ResponseFetchOracleVotes)(nil), "tendermint.abci.ResponseFetchOracleVotes") + proto.RegisterType((*ResponseValidateOracleVotes)(nil), "tendermint.abci.ResponseValidateOracleVotes") proto.RegisterType((*CommitInfo)(nil), "tendermint.abci.CommitInfo") proto.RegisterType((*ExtendedCommitInfo)(nil), "tendermint.abci.ExtendedCommitInfo") proto.RegisterType((*Event)(nil), "tendermint.abci.Event") @@ -3889,219 +4031,225 @@ func init() { func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) } var fileDescriptor_252557cfdd89a31a = []byte{ - // 3383 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xbb, 0x93, 0x1b, 0xc7, - 0xd1, 0xc7, 0xe2, 0x8d, 0xc6, 0xe3, 0xf6, 0xe6, 0x8e, 0x24, 0x08, 0x91, 0x77, 0xa7, 0x55, 0x49, - 0xa2, 0x48, 0xe9, 0x4e, 0x1f, 0xf9, 0x51, 0x8f, 0xa2, 0xf4, 0x55, 0xe1, 0x40, 0x90, 0xb8, 0x23, - 0x75, 0x77, 0xda, 0x03, 0xa9, 0x8f, 0xdf, 0x67, 0x6b, 0xb5, 0x07, 0x0c, 0x80, 0x15, 0x01, 0xec, - 0x6a, 0x77, 0x71, 0xc2, 0x29, 0x52, 0x59, 0x76, 0x95, 0x4b, 0x91, 0xaa, 0x9c, 0x28, 0xb0, 0x02, - 0x07, 0x4e, 0xfc, 0x17, 0x38, 0x72, 0xe4, 0x40, 0x81, 0x03, 0x65, 0x76, 0x24, 0xbb, 0xa4, 0x4c, - 0xa9, 0x03, 0x07, 0x4e, 0x5c, 0xf3, 0xd8, 0x17, 0xb0, 0x8b, 0x07, 0x25, 0x07, 0x2e, 0x3b, 0x9b, - 0xe9, 0xed, 0xee, 0x99, 0xe9, 0x79, 0x74, 0xf7, 0x6f, 0x66, 0xe1, 0x29, 0x1b, 0x0f, 0xdb, 0xd8, - 0x1c, 0x68, 0x43, 0x7b, 0x47, 0x3d, 0x69, 0x69, 0x3b, 0xf6, 0x99, 0x81, 0xad, 0x6d, 0xc3, 0xd4, - 0x6d, 0x1d, 0xad, 0x78, 0x1f, 0xb7, 0xc9, 0xc7, 0xca, 0x65, 0x1f, 0x77, 0xcb, 0x3c, 0x33, 0x6c, - 0x7d, 0xc7, 0x30, 0x75, 0xbd, 0xc3, 0xf8, 0x2b, 0x97, 0xa6, 0x3f, 0x3f, 0xc6, 0x67, 0x5c, 0x5b, - 0x40, 0x98, 0xb6, 0xb2, 0x63, 0xa8, 0xa6, 0x3a, 0x70, 0x3e, 0x6f, 0x4d, 0x7d, 0x3e, 0x55, 0xfb, - 0x5a, 0x5b, 0xb5, 0x75, 0x93, 0x73, 0x6c, 0x76, 0x75, 0xbd, 0xdb, 0xc7, 0x3b, 0xb4, 0x76, 0x32, - 0xea, 0xec, 0xd8, 0xda, 0x00, 0x5b, 0xb6, 0x3a, 0x30, 0x38, 0xc3, 0x7a, 0x57, 0xef, 0xea, 0xb4, - 0xb8, 0x43, 0x4a, 0x21, 0xed, 0xea, 0xa6, 0xda, 0xea, 0x63, 0xff, 0x20, 0xa5, 0x8f, 0xf3, 0x90, - 0x91, 0xf1, 0x07, 0x23, 0x6c, 0xd9, 0xe8, 0x3a, 0x24, 0x71, 0xab, 0xa7, 0x97, 0x85, 0x2d, 0xe1, - 0x4a, 0xfe, 0xfa, 0xa5, 0xed, 0x89, 0xf1, 0x6f, 0x73, 0xbe, 0x7a, 0xab, 0xa7, 0x37, 0x62, 0x32, - 0xe5, 0x45, 0x37, 0x21, 0xd5, 0xe9, 0x8f, 0xac, 0x5e, 0x39, 0x4e, 0x85, 0x2e, 0x47, 0x09, 0xdd, - 0x21, 0x4c, 0x8d, 0x98, 0xcc, 0xb8, 0x49, 0x53, 0xda, 0xb0, 0xa3, 0x97, 0x13, 0xb3, 0x9b, 0xda, - 0x1b, 0x76, 0x68, 0x53, 0x84, 0x17, 0xed, 0x02, 0x68, 0x43, 0xcd, 0x56, 0x5a, 0x3d, 0x55, 0x1b, - 0x96, 0x53, 0x54, 0xf2, 0xe9, 0x68, 0x49, 0xcd, 0xae, 0x11, 0xc6, 0x46, 0x4c, 0xce, 0x69, 0x4e, - 0x85, 0x74, 0xf7, 0x83, 0x11, 0x36, 0xcf, 0xca, 0xe9, 0xd9, 0xdd, 0x7d, 0x9b, 0x30, 0x91, 0xee, - 0x52, 0x6e, 0xf4, 0x06, 0x64, 0x5b, 0x3d, 0xdc, 0x7a, 0xac, 0xd8, 0xe3, 0x72, 0x96, 0x4a, 0x6e, - 0x46, 0x49, 0xd6, 0x08, 0x5f, 0x73, 0xdc, 0x88, 0xc9, 0x99, 0x16, 0x2b, 0xa2, 0xd7, 0x20, 0xdd, - 0xd2, 0x07, 0x03, 0xcd, 0x2e, 0xe7, 0xa9, 0xec, 0x46, 0xa4, 0x2c, 0xe5, 0x6a, 0xc4, 0x64, 0xce, - 0x8f, 0x0e, 0xa0, 0xd4, 0xd7, 0x2c, 0x5b, 0xb1, 0x86, 0xaa, 0x61, 0xf5, 0x74, 0xdb, 0x2a, 0x17, - 0xa8, 0x86, 0x67, 0xa3, 0x34, 0xdc, 0xd7, 0x2c, 0xfb, 0xd8, 0x61, 0x6e, 0xc4, 0xe4, 0x62, 0xdf, - 0x4f, 0x20, 0xfa, 0xf4, 0x4e, 0x07, 0x9b, 0xae, 0xc2, 0x72, 0x71, 0xb6, 0xbe, 0x43, 0xc2, 0xed, - 0xc8, 0x13, 0x7d, 0xba, 0x9f, 0x80, 0xfe, 0x1f, 0xd6, 0xfa, 0xba, 0xda, 0x76, 0xd5, 0x29, 0xad, - 0xde, 0x68, 0xf8, 0xb8, 0x5c, 0xa2, 0x4a, 0x5f, 0x88, 0xec, 0xa4, 0xae, 0xb6, 0x1d, 0x15, 0x35, - 0x22, 0xd0, 0x88, 0xc9, 0xab, 0xfd, 0x49, 0x22, 0x7a, 0x17, 0xd6, 0x55, 0xc3, 0xe8, 0x9f, 0x4d, - 0x6a, 0x5f, 0xa1, 0xda, 0xaf, 0x46, 0x69, 0xaf, 0x12, 0x99, 0x49, 0xf5, 0x48, 0x9d, 0xa2, 0xa2, - 0x26, 0x88, 0x86, 0x89, 0x0d, 0xd5, 0xc4, 0x8a, 0x61, 0xea, 0x86, 0x6e, 0xa9, 0xfd, 0xb2, 0x48, - 0x75, 0x3f, 0x1f, 0xa5, 0xfb, 0x88, 0xf1, 0x1f, 0x71, 0xf6, 0x46, 0x4c, 0x5e, 0x31, 0x82, 0x24, - 0xa6, 0x55, 0x6f, 0x61, 0xcb, 0xf2, 0xb4, 0xae, 0xce, 0xd3, 0x4a, 0xf9, 0x83, 0x5a, 0x03, 0x24, - 0x54, 0x87, 0x3c, 0x1e, 0x13, 0x71, 0xe5, 0x54, 0xb7, 0x71, 0x19, 0x51, 0x85, 0x52, 0xe4, 0x0e, - 0xa5, 0xac, 0x0f, 0x75, 0x1b, 0x37, 0x62, 0x32, 0x60, 0xb7, 0x86, 0x54, 0x38, 0x77, 0x8a, 0x4d, - 0xad, 0x73, 0x46, 0xd5, 0x28, 0xf4, 0x8b, 0xa5, 0xe9, 0xc3, 0xf2, 0x1a, 0x55, 0x78, 0x2d, 0x4a, - 0xe1, 0x43, 0x2a, 0x44, 0x54, 0xd4, 0x1d, 0x91, 0x46, 0x4c, 0x5e, 0x3b, 0x9d, 0x26, 0x93, 0x25, - 0xd6, 0xd1, 0x86, 0x6a, 0x5f, 0xfb, 0x08, 0x2b, 0x27, 0x7d, 0xbd, 0xf5, 0xb8, 0xbc, 0x3e, 0x7b, - 0x89, 0xdd, 0xe1, 0xdc, 0xbb, 0x84, 0x99, 0x2c, 0xb1, 0x8e, 0x9f, 0x80, 0x30, 0x5c, 0x68, 0x99, - 0x58, 0xb5, 0xb1, 0xc2, 0x4e, 0x2f, 0xc5, 0xc4, 0xd6, 0xa8, 0x6f, 0x93, 0x9d, 0x78, 0x8e, 0x2a, - 0x7e, 0x31, 0x72, 0x37, 0x51, 0xb1, 0x43, 0x2a, 0x25, 0x53, 0x21, 0xba, 0x2d, 0xd7, 0x5b, 0x21, - 0x74, 0xf4, 0xbf, 0x80, 0x3a, 0xd8, 0x6e, 0xf5, 0x9c, 0x56, 0x88, 0x7d, 0xac, 0xf2, 0x79, 0xda, - 0xc2, 0x95, 0xc8, 0xae, 0x13, 0x09, 0xa6, 0x88, 0x18, 0x81, 0x6c, 0x38, 0xb1, 0x33, 0x41, 0xdb, - 0xcd, 0x40, 0xea, 0x54, 0xed, 0x8f, 0xf0, 0x7e, 0x32, 0x9b, 0x14, 0x53, 0xfb, 0xc9, 0x6c, 0x46, - 0xcc, 0xee, 0x27, 0xb3, 0x39, 0x11, 0xf6, 0x93, 0x59, 0x10, 0xf3, 0xd2, 0xf3, 0x90, 0xf7, 0x9d, - 0xac, 0xa8, 0x0c, 0x99, 0x01, 0xb6, 0x2c, 0xb5, 0x8b, 0xe9, 0x41, 0x9c, 0x93, 0x9d, 0xaa, 0x54, - 0x82, 0x82, 0xff, 0x34, 0x95, 0x3e, 0x13, 0x5c, 0x49, 0x72, 0x50, 0x12, 0xc9, 0x53, 0x6c, 0xd2, - 0xf9, 0xe4, 0x92, 0xbc, 0x8a, 0x9e, 0x81, 0x22, 0x9d, 0x0b, 0xc5, 0xf9, 0x4e, 0x4e, 0xeb, 0xa4, - 0x5c, 0xa0, 0xc4, 0x87, 0x9c, 0x69, 0x13, 0xf2, 0xc6, 0x75, 0xc3, 0x65, 0x49, 0x50, 0x16, 0x30, - 0xae, 0x1b, 0x0e, 0xc3, 0xd3, 0x50, 0x20, 0xa3, 0x77, 0x39, 0x92, 0xb4, 0x91, 0x3c, 0xa1, 0x71, - 0x16, 0xe9, 0x0f, 0x71, 0x10, 0x27, 0x4f, 0x60, 0xf4, 0x1a, 0x24, 0x89, 0xaf, 0xe2, 0x7e, 0xa5, - 0xb2, 0xcd, 0x1c, 0xd9, 0xb6, 0xe3, 0xc8, 0xb6, 0x9b, 0x8e, 0x23, 0xdb, 0xcd, 0x7e, 0xf9, 0xf5, - 0x66, 0xec, 0xb3, 0x3f, 0x6f, 0x0a, 0x32, 0x95, 0x40, 0x17, 0xc9, 0xb9, 0xab, 0x6a, 0x43, 0x45, - 0x6b, 0xd3, 0x2e, 0xe7, 0xc8, 0xa1, 0xaa, 0x6a, 0xc3, 0xbd, 0x36, 0xba, 0x0f, 0x62, 0x4b, 0x1f, - 0x5a, 0x78, 0x68, 0x8d, 0x2c, 0x85, 0xb9, 0x52, 0xee, 0x4d, 0x02, 0x3e, 0x81, 0xf9, 0xba, 0x9a, - 0xc3, 0x79, 0x44, 0x19, 0xe5, 0x95, 0x56, 0x90, 0x80, 0xee, 0x00, 0xb8, 0xfe, 0xd6, 0x2a, 0x27, - 0xb7, 0x12, 0x57, 0xf2, 0xd7, 0xb7, 0xa6, 0xa6, 0xfd, 0xa1, 0xc3, 0xf2, 0xc0, 0x68, 0xab, 0x36, - 0xde, 0x4d, 0x92, 0xee, 0xca, 0x3e, 0x49, 0xf4, 0x1c, 0xac, 0xa8, 0x86, 0xa1, 0x58, 0x36, 0x59, - 0xb0, 0x27, 0x67, 0x64, 0x0d, 0x11, 0x47, 0x55, 0x90, 0x8b, 0xaa, 0x61, 0x1c, 0x13, 0xea, 0x2e, - 0x21, 0xa2, 0x67, 0xa1, 0x44, 0x9c, 0x92, 0xa6, 0xf6, 0x95, 0x1e, 0xd6, 0xba, 0x3d, 0x9b, 0x3a, - 0xa4, 0x84, 0x5c, 0xe4, 0xd4, 0x06, 0x25, 0x4a, 0x6d, 0x77, 0xc6, 0xa9, 0x43, 0x42, 0x08, 0x92, - 0x6d, 0xd5, 0x56, 0xa9, 0x25, 0x0b, 0x32, 0x2d, 0x13, 0x9a, 0xa1, 0xda, 0x3d, 0x6e, 0x1f, 0x5a, - 0x46, 0xe7, 0x21, 0xcd, 0xd5, 0x26, 0xa8, 0x5a, 0x5e, 0x43, 0xeb, 0x90, 0x32, 0x4c, 0xfd, 0x14, - 0xd3, 0xa9, 0xcb, 0xca, 0xac, 0x22, 0xc9, 0x50, 0x0a, 0x3a, 0x2f, 0x54, 0x82, 0xb8, 0x3d, 0xe6, - 0xad, 0xc4, 0xed, 0x31, 0x7a, 0x19, 0x92, 0xc4, 0x90, 0xb4, 0x8d, 0x52, 0x88, 0xbb, 0xe6, 0x72, - 0xcd, 0x33, 0x03, 0xcb, 0x94, 0x53, 0x5a, 0x81, 0x62, 0xc0, 0xa9, 0x49, 0xe7, 0x61, 0x3d, 0xcc, - 0x47, 0x49, 0x3d, 0x97, 0x1e, 0xf0, 0x35, 0xe8, 0x26, 0x64, 0x5d, 0x27, 0xc5, 0x16, 0xce, 0xc5, - 0xa9, 0x66, 0x1d, 0x66, 0xd9, 0x65, 0x25, 0x2b, 0x86, 0x4c, 0x40, 0x4f, 0xe5, 0x21, 0x49, 0x41, - 0xce, 0xa8, 0x86, 0xd1, 0x50, 0xad, 0x9e, 0xf4, 0x1e, 0x94, 0xa3, 0x1c, 0x90, 0xcf, 0x60, 0x02, - 0x5d, 0xf6, 0x8e, 0xc1, 0xce, 0x43, 0xba, 0xa3, 0x9b, 0x03, 0xd5, 0xa6, 0xca, 0x8a, 0x32, 0xaf, - 0x11, 0x43, 0x32, 0x67, 0x94, 0xa0, 0x64, 0x56, 0x91, 0x14, 0xb8, 0x18, 0xe9, 0x84, 0x88, 0x88, - 0x36, 0x6c, 0x63, 0x66, 0xd6, 0xa2, 0xcc, 0x2a, 0x9e, 0x22, 0xd6, 0x59, 0x56, 0x21, 0xcd, 0x5a, - 0x74, 0xac, 0x54, 0x7f, 0x4e, 0xe6, 0x35, 0xe9, 0xf3, 0x04, 0x9c, 0x0f, 0x77, 0x45, 0x68, 0x0b, - 0x0a, 0x03, 0x75, 0xac, 0xd8, 0x63, 0xbe, 0xec, 0x04, 0x3a, 0xf1, 0x30, 0x50, 0xc7, 0xcd, 0x31, - 0x5b, 0x73, 0x22, 0x24, 0xec, 0xb1, 0x55, 0x8e, 0x6f, 0x25, 0xae, 0x14, 0x64, 0x52, 0x44, 0x0f, - 0x60, 0xb5, 0xaf, 0xb7, 0xd4, 0xbe, 0xd2, 0x57, 0x2d, 0x5b, 0xe1, 0x31, 0x0a, 0xdb, 0x44, 0xcf, - 0x4c, 0x19, 0x9b, 0x39, 0x15, 0xdc, 0x66, 0xf3, 0x49, 0x0e, 0x1c, 0xbe, 0xfe, 0x57, 0xa8, 0x8e, - 0xfb, 0xaa, 0x33, 0xd5, 0xe8, 0x36, 0xe4, 0x07, 0x9a, 0x75, 0x82, 0x7b, 0xea, 0xa9, 0xa6, 0x9b, - 0x7c, 0x37, 0x4d, 0x2f, 0x9a, 0xb7, 0x3c, 0x1e, 0xae, 0xc9, 0x2f, 0xe6, 0x9b, 0x92, 0x54, 0x60, - 0x0d, 0x3b, 0xa7, 0x49, 0x7a, 0xe9, 0xd3, 0xe4, 0x65, 0x58, 0x1f, 0xe2, 0xb1, 0xad, 0x78, 0xfb, - 0x95, 0xad, 0x93, 0x0c, 0x35, 0x3d, 0x22, 0xdf, 0xdc, 0x1d, 0x6e, 0x91, 0x25, 0x83, 0x5e, 0xa0, - 0xce, 0xdc, 0xd0, 0x2d, 0x6c, 0x2a, 0x6a, 0xbb, 0x6d, 0x62, 0xcb, 0xa2, 0xf1, 0x5f, 0x81, 0x7a, - 0x68, 0x4a, 0xaf, 0x32, 0xb2, 0xf4, 0x73, 0xff, 0xd4, 0x04, 0x9d, 0x37, 0x37, 0xbc, 0xe0, 0x19, - 0xfe, 0x18, 0xd6, 0xb9, 0x7c, 0x3b, 0x60, 0x7b, 0x16, 0x44, 0x3f, 0x35, 0xbd, 0xbf, 0x26, 0x6d, - 0x8e, 0x1c, 0xf1, 0x68, 0xb3, 0x27, 0x9e, 0xcc, 0xec, 0x08, 0x92, 0xd4, 0x28, 0x49, 0x76, 0xc4, - 0x90, 0xf2, 0xbf, 0xda, 0x54, 0x7c, 0x92, 0x80, 0xd5, 0xa9, 0x48, 0xc8, 0x1d, 0x98, 0x10, 0x3a, - 0xb0, 0x78, 0xe8, 0xc0, 0x12, 0x4b, 0x0f, 0x8c, 0xcf, 0x75, 0x72, 0xfe, 0x5c, 0xa7, 0x7e, 0xc0, - 0xb9, 0x4e, 0x3f, 0xd9, 0x5c, 0xff, 0x53, 0x67, 0xe1, 0x97, 0x02, 0x54, 0xa2, 0xc3, 0xc7, 0xd0, - 0xe9, 0xb8, 0x06, 0xab, 0x6e, 0x57, 0x5c, 0xf5, 0xec, 0x60, 0x14, 0xdd, 0x0f, 0x5c, 0x7f, 0xa4, - 0x8f, 0x7b, 0x16, 0x4a, 0x13, 0xc1, 0x2d, 0x5b, 0xca, 0xc5, 0x53, 0x7f, 0xfb, 0xd2, 0x4f, 0x13, - 0xae, 0xe3, 0x09, 0x44, 0xa0, 0x21, 0xbb, 0xf5, 0x6d, 0x58, 0x6b, 0xe3, 0x96, 0xd6, 0x7e, 0xd2, - 0xcd, 0xba, 0xca, 0xa5, 0xff, 0xb3, 0x57, 0xa7, 0x57, 0x49, 0x07, 0x9e, 0x9a, 0x11, 0xae, 0xa3, - 0xbb, 0x50, 0xea, 0xea, 0x96, 0xa5, 0x19, 0xb8, 0xcd, 0x43, 0x72, 0x61, 0x3a, 0x36, 0x63, 0x21, - 0xfb, 0xf6, 0x5d, 0xce, 0x48, 0xc3, 0x6e, 0xb9, 0xd8, 0xf5, 0x57, 0xa5, 0x8b, 0x70, 0x21, 0x22, - 0x68, 0x97, 0xfe, 0x98, 0x87, 0xac, 0x8c, 0x2d, 0x83, 0x84, 0x84, 0x68, 0x17, 0x72, 0x78, 0xdc, - 0xc2, 0x86, 0xed, 0x44, 0xd1, 0xe1, 0x69, 0x16, 0xe3, 0xae, 0x3b, 0x9c, 0x8d, 0x98, 0xec, 0x89, - 0xa1, 0x1b, 0x1c, 0x47, 0x89, 0x86, 0x44, 0xb8, 0xb8, 0x1f, 0x48, 0x79, 0xc5, 0x01, 0x52, 0x12, - 0x91, 0x18, 0x01, 0x93, 0x9a, 0x40, 0x52, 0x6e, 0x70, 0x24, 0x25, 0x39, 0xa7, 0xb1, 0x00, 0x94, - 0x52, 0x0b, 0x40, 0x29, 0xe9, 0x39, 0xc3, 0x8c, 0xc0, 0x52, 0x5e, 0x71, 0xb0, 0x94, 0xcc, 0x9c, - 0x1e, 0x4f, 0x80, 0x29, 0x6f, 0xfa, 0xc0, 0x94, 0x1c, 0x15, 0xdd, 0x8a, 0x14, 0x0d, 0x41, 0x53, - 0x5e, 0x77, 0xd1, 0x94, 0x42, 0x24, 0x12, 0xc3, 0x85, 0x27, 0xe1, 0x94, 0xc3, 0x29, 0x38, 0x85, - 0xc1, 0x1f, 0xcf, 0x45, 0xaa, 0x98, 0x83, 0xa7, 0x1c, 0x4e, 0xe1, 0x29, 0xa5, 0x39, 0x0a, 0xe7, - 0x00, 0x2a, 0x3f, 0x0a, 0x07, 0x54, 0xa2, 0x21, 0x0f, 0xde, 0xcd, 0xc5, 0x10, 0x15, 0x25, 0x02, - 0x51, 0x11, 0x23, 0xb3, 0x7f, 0xa6, 0x7e, 0x61, 0x48, 0xe5, 0x41, 0x08, 0xa4, 0xb2, 0x1a, 0x99, - 0x43, 0x33, 0xe5, 0x0b, 0x60, 0x2a, 0x0f, 0x42, 0x30, 0x15, 0x34, 0x57, 0xed, 0x5c, 0x50, 0xe5, - 0x4e, 0x10, 0x54, 0x59, 0x8b, 0x08, 0x7c, 0xbd, 0xdd, 0x1e, 0x81, 0xaa, 0x9c, 0x44, 0xa1, 0x2a, - 0xeb, 0x91, 0x00, 0x05, 0xd3, 0xb8, 0x04, 0xac, 0x72, 0x38, 0x05, 0xab, 0x9c, 0x9b, 0xb3, 0xd2, - 0xe6, 0xe0, 0x2a, 0x9d, 0x68, 0x5c, 0x85, 0xa1, 0x1e, 0x2f, 0x45, 0xef, 0xab, 0x65, 0x80, 0x95, - 0x47, 0xa1, 0xc0, 0xca, 0x85, 0x48, 0x84, 0x90, 0x77, 0x7e, 0x49, 0x64, 0x25, 0x25, 0xa6, 0xf7, - 0x93, 0xd9, 0xac, 0x98, 0x63, 0x98, 0xca, 0x7e, 0x32, 0x9b, 0x17, 0x0b, 0xd2, 0x0b, 0x24, 0x0e, - 0x9c, 0x38, 0xaa, 0x49, 0xc6, 0x85, 0x4d, 0x53, 0x37, 0x39, 0x46, 0xc2, 0x2a, 0xd2, 0x15, 0x92, - 0x69, 0x7b, 0xc7, 0xf2, 0x0c, 0x14, 0x86, 0x66, 0xb6, 0xbe, 0xa3, 0x58, 0xfa, 0xad, 0xe0, 0xc9, - 0x52, 0x1c, 0xc6, 0x9f, 0xa5, 0xe7, 0x78, 0x96, 0xee, 0xc3, 0x66, 0xe2, 0x41, 0x6c, 0x66, 0x13, - 0xf2, 0x24, 0x63, 0x9d, 0x80, 0x5d, 0x54, 0xc3, 0x85, 0x5d, 0xae, 0xc2, 0x2a, 0x0d, 0x3b, 0x18, - 0x82, 0xc3, 0x9d, 0x7b, 0x92, 0x3a, 0xf7, 0x15, 0xf2, 0x81, 0x4d, 0x30, 0xf3, 0xf2, 0x2f, 0xc1, - 0x9a, 0x8f, 0xd7, 0xcd, 0x84, 0x19, 0x06, 0x21, 0xba, 0xdc, 0x55, 0x9e, 0x12, 0xff, 0x5e, 0xf0, - 0x2c, 0xe4, 0xe1, 0x35, 0x61, 0xd0, 0x8a, 0xf0, 0x03, 0x41, 0x2b, 0xf1, 0x27, 0x86, 0x56, 0xfc, - 0x99, 0x7d, 0x22, 0x98, 0xd9, 0xff, 0x4d, 0xf0, 0xe6, 0xc4, 0x05, 0x4a, 0x5a, 0x7a, 0x1b, 0xf3, - 0x5c, 0x9b, 0x96, 0x49, 0x60, 0xd7, 0xd7, 0xbb, 0x3c, 0xa3, 0x26, 0x45, 0xc2, 0xe5, 0xfa, 0xce, - 0x1c, 0x77, 0x8d, 0x6e, 0x9a, 0xce, 0xc2, 0x27, 0x9e, 0xa6, 0x8b, 0x90, 0x78, 0x8c, 0xd9, 0xad, - 0x41, 0x41, 0x26, 0x45, 0xc2, 0x47, 0x17, 0x1f, 0x0f, 0x83, 0x58, 0x05, 0xbd, 0x06, 0x39, 0x7a, - 0x25, 0xa4, 0xe8, 0x86, 0xc5, 0x6f, 0x0a, 0x02, 0x01, 0x22, 0xbb, 0x17, 0xda, 0x3e, 0x22, 0x3c, - 0x87, 0x86, 0x25, 0x67, 0x0d, 0x5e, 0xf2, 0xc5, 0x6d, 0xb9, 0x40, 0xdc, 0x76, 0x09, 0x72, 0xa4, - 0xf7, 0x96, 0xa1, 0xb6, 0x70, 0x19, 0x68, 0x47, 0x3d, 0x82, 0xf4, 0x9b, 0x38, 0xac, 0x4c, 0xf8, - 0xca, 0xd0, 0xb1, 0x3b, 0x4b, 0x32, 0xee, 0x03, 0x8e, 0x16, 0xb3, 0xc7, 0x06, 0x40, 0x57, 0xb5, - 0x94, 0x0f, 0xd5, 0xa1, 0x8d, 0xdb, 0xdc, 0x28, 0x3e, 0x0a, 0xaa, 0x40, 0x96, 0xd4, 0x46, 0x16, - 0x6e, 0x73, 0x0c, 0xcb, 0xad, 0xa3, 0x06, 0xa4, 0xf1, 0x29, 0x1e, 0xda, 0x56, 0x39, 0x43, 0xa7, - 0xfd, 0xfc, 0x34, 0xa8, 0x40, 0x3e, 0xef, 0x96, 0xc9, 0x64, 0x7f, 0xf7, 0xf5, 0xa6, 0xc8, 0xb8, - 0x5f, 0xd4, 0x07, 0x9a, 0x8d, 0x07, 0x86, 0x7d, 0x26, 0x73, 0xf9, 0xa0, 0x15, 0xb2, 0x13, 0x56, - 0xa0, 0x68, 0x6a, 0xc1, 0x01, 0x49, 0x88, 0x4d, 0x35, 0xdd, 0xd4, 0xec, 0x33, 0xb9, 0x38, 0xc0, - 0x03, 0x43, 0xd7, 0xfb, 0x0a, 0xdb, 0xe3, 0x55, 0x28, 0x05, 0x43, 0x03, 0xf4, 0x0c, 0x14, 0x4d, - 0x6c, 0xab, 0xda, 0x50, 0x09, 0xa4, 0x12, 0x05, 0x46, 0x64, 0x7b, 0x6a, 0x3f, 0x99, 0x15, 0xc4, - 0xf8, 0x7e, 0x32, 0x1b, 0x17, 0x13, 0xd2, 0x11, 0x9c, 0x0b, 0x0d, 0x0d, 0xd0, 0xab, 0x90, 0xf3, - 0xa2, 0x0a, 0x16, 0xa3, 0xce, 0xc0, 0xab, 0x3c, 0x5e, 0xe9, 0x77, 0x82, 0xa7, 0x32, 0x88, 0x80, - 0xd5, 0x21, 0xcd, 0xce, 0x64, 0x3a, 0x93, 0xa5, 0x19, 0x07, 0x72, 0x40, 0x6e, 0x9b, 0x1d, 0xbd, - 0x32, 0x17, 0x96, 0xde, 0x85, 0x34, 0xa3, 0xa0, 0x3c, 0x64, 0x1e, 0x1c, 0xdc, 0x3b, 0x38, 0x7c, - 0xe7, 0x40, 0x8c, 0x21, 0x80, 0x74, 0xb5, 0x56, 0xab, 0x1f, 0x35, 0x45, 0x01, 0xe5, 0x20, 0x55, - 0xdd, 0x3d, 0x94, 0x9b, 0x62, 0x9c, 0x90, 0xe5, 0xfa, 0x7e, 0xbd, 0xd6, 0x14, 0x13, 0x68, 0x15, - 0x8a, 0xac, 0xac, 0xdc, 0x39, 0x94, 0xdf, 0xaa, 0x36, 0xc5, 0xa4, 0x8f, 0x74, 0x5c, 0x3f, 0xb8, - 0x5d, 0x97, 0xc5, 0x94, 0xf4, 0x5f, 0x70, 0x31, 0x32, 0x0c, 0xf1, 0xe0, 0x2d, 0xc1, 0x07, 0x6f, - 0x49, 0x9f, 0xc7, 0x49, 0x6a, 0x18, 0x15, 0x5b, 0xa0, 0xfd, 0x89, 0x81, 0x5f, 0x5f, 0x22, 0x30, - 0x99, 0x18, 0x3d, 0xc9, 0x06, 0x4d, 0xcc, 0x1c, 0x10, 0x6d, 0x9b, 0x9d, 0x40, 0x45, 0xb9, 0xc8, - 0xa9, 0x54, 0xc8, 0x62, 0x6c, 0xef, 0xe3, 0x96, 0xad, 0xb0, 0x45, 0x64, 0xd1, 0x94, 0x2c, 0x47, - 0xd8, 0x08, 0xf5, 0x98, 0x11, 0xa5, 0xf7, 0x96, 0xb2, 0x65, 0x0e, 0x52, 0x72, 0xbd, 0x29, 0x3f, - 0x12, 0x13, 0x08, 0x41, 0x89, 0x16, 0x95, 0xe3, 0x83, 0xea, 0xd1, 0x71, 0xe3, 0x90, 0xd8, 0x72, - 0x0d, 0x56, 0x1c, 0x5b, 0x3a, 0xc4, 0x94, 0x74, 0x8d, 0xe4, 0x29, 0xa1, 0x81, 0xd1, 0x74, 0x62, - 0x2a, 0xfd, 0x4a, 0xf0, 0x73, 0x07, 0x83, 0x9b, 0x43, 0x48, 0x5b, 0xb6, 0x6a, 0x8f, 0x2c, 0x6e, - 0xc4, 0x57, 0x17, 0x8d, 0x94, 0xb6, 0x9d, 0xc2, 0x31, 0x15, 0x97, 0xb9, 0x1a, 0xe9, 0x26, 0x94, - 0x82, 0x5f, 0xa2, 0x6d, 0xe0, 0x2d, 0xa2, 0xb8, 0x74, 0x0b, 0xd0, 0x74, 0x00, 0x15, 0x92, 0xa4, - 0x0b, 0x61, 0x49, 0xfa, 0xaf, 0x05, 0x92, 0x1e, 0x46, 0x06, 0x4b, 0xe8, 0xed, 0x89, 0x41, 0xbe, - 0xbe, 0x4c, 0xa8, 0xb5, 0xcd, 0x68, 0x13, 0xc3, 0xbc, 0x01, 0x05, 0x3f, 0x7d, 0xb1, 0x41, 0x7e, - 0x17, 0xf7, 0x36, 0x71, 0x10, 0x4d, 0xf0, 0x8e, 0x40, 0xe1, 0x7b, 0x1e, 0x81, 0x6f, 0x00, 0xd8, - 0x63, 0x1e, 0xa5, 0x39, 0x7e, 0xf4, 0x72, 0x08, 0x4a, 0x8b, 0x5b, 0xcd, 0x31, 0xdf, 0x04, 0x39, - 0x9b, 0x97, 0x2c, 0x74, 0xec, 0x87, 0x56, 0x46, 0xd4, 0xc7, 0x5a, 0x1c, 0x76, 0x58, 0xd4, 0x19, - 0x7b, 0x10, 0x0c, 0x23, 0x5b, 0xe8, 0x11, 0x5c, 0x98, 0x08, 0x14, 0x5c, 0xd5, 0xc9, 0x45, 0xe3, - 0x85, 0x73, 0xc1, 0x78, 0xc1, 0x51, 0xed, 0xf7, 0xf6, 0xa9, 0xa0, 0xb7, 0x7f, 0x13, 0x2e, 0xcd, - 0x8a, 0x44, 0xd1, 0x65, 0x00, 0x3c, 0x24, 0xce, 0xa1, 0xad, 0xb8, 0x97, 0x18, 0x39, 0x4e, 0x69, - 0x8e, 0xa5, 0xbb, 0x50, 0x8e, 0x8a, 0x32, 0xd1, 0x35, 0x48, 0xd2, 0x54, 0x80, 0x45, 0x3b, 0x17, - 0x42, 0x40, 0x06, 0xc2, 0x27, 0x53, 0x26, 0xe9, 0x11, 0x80, 0x07, 0xf5, 0x90, 0x93, 0xce, 0xd4, - 0x47, 0xc3, 0x36, 0x95, 0x4d, 0xc9, 0xac, 0x82, 0x6e, 0x42, 0x8a, 0x05, 0xbc, 0xf1, 0x08, 0x97, - 0x40, 0xf4, 0xf9, 0xa0, 0x22, 0xc6, 0x2d, 0x69, 0x80, 0xa6, 0xe1, 0xf6, 0x88, 0x26, 0xde, 0x0c, - 0x36, 0xf1, 0x74, 0x24, 0x70, 0x1f, 0xde, 0xd4, 0x47, 0x90, 0xa2, 0x2b, 0x90, 0x38, 0x7f, 0x7a, - 0xc7, 0xc3, 0xa3, 0x56, 0x52, 0x46, 0x3f, 0x06, 0x50, 0x6d, 0xdb, 0xd4, 0x4e, 0x46, 0x5e, 0x03, - 0x9b, 0xe1, 0x2b, 0xb8, 0xea, 0xf0, 0xed, 0x5e, 0xe2, 0x4b, 0x79, 0xdd, 0x13, 0xf5, 0x2d, 0x67, - 0x9f, 0x42, 0xe9, 0x00, 0x4a, 0x41, 0x59, 0x27, 0xce, 0x62, 0x7d, 0x08, 0xc6, 0x59, 0x2c, 0x6c, - 0xe6, 0x71, 0x96, 0x1b, 0xa5, 0x25, 0xd8, 0x45, 0x16, 0xad, 0x48, 0x1f, 0xc7, 0xa1, 0xe0, 0xdf, - 0x00, 0xff, 0x7e, 0xa1, 0x90, 0xf4, 0x33, 0x01, 0xb2, 0xee, 0xf0, 0x83, 0xb7, 0x5a, 0x81, 0x6b, - 0x40, 0x66, 0xbd, 0xb8, 0xff, 0x2a, 0x8a, 0x5d, 0xfa, 0x25, 0xdc, 0x4b, 0xbf, 0x5b, 0xae, 0x1b, - 0x8e, 0xc2, 0x96, 0xfc, 0xb6, 0xe6, 0xab, 0xca, 0x89, 0x3a, 0x6e, 0x41, 0xce, 0x3d, 0x45, 0x48, - 0xf2, 0xe3, 0xc0, 0x80, 0x02, 0xdf, 0xcb, 0x1c, 0xc4, 0x5d, 0x87, 0x94, 0xa1, 0x7f, 0xc8, 0xef, - 0xb9, 0x12, 0x32, 0xab, 0x48, 0x6d, 0x58, 0x99, 0x38, 0x82, 0xd0, 0x2d, 0xc8, 0x18, 0xa3, 0x13, - 0xc5, 0x59, 0x1c, 0x13, 0x60, 0xa9, 0x13, 0x56, 0x8f, 0x4e, 0xfa, 0x5a, 0xeb, 0x1e, 0x3e, 0x73, - 0x3a, 0x63, 0x8c, 0x4e, 0xee, 0xb1, 0x35, 0xc4, 0x5a, 0x89, 0xfb, 0x5b, 0xf9, 0x85, 0x00, 0x59, - 0x67, 0x4f, 0xa0, 0xff, 0x81, 0x9c, 0x7b, 0xbc, 0xb9, 0x17, 0xd5, 0x91, 0xe7, 0x22, 0xd7, 0xef, - 0x89, 0xa0, 0xaa, 0x73, 0xc3, 0xae, 0xb5, 0x95, 0x4e, 0x5f, 0x65, 0x6b, 0xa9, 0x14, 0xb4, 0x19, - 0x3b, 0x00, 0xa9, 0x5f, 0xd8, 0xbb, 0x7d, 0xa7, 0xaf, 0x76, 0xe5, 0x3c, 0x95, 0xd9, 0x6b, 0x93, - 0x0a, 0x8f, 0x30, 0xff, 0x2a, 0x80, 0x38, 0xb9, 0x63, 0xbf, 0x77, 0xef, 0xa6, 0xdd, 0x6d, 0x22, - 0xc4, 0xdd, 0xa2, 0x1d, 0x58, 0x73, 0x39, 0x14, 0x4b, 0xeb, 0x0e, 0x55, 0x7b, 0x64, 0x62, 0x0e, - 0x2f, 0x23, 0xf7, 0xd3, 0xb1, 0xf3, 0x65, 0x7a, 0xd4, 0xa9, 0x27, 0x1c, 0xf5, 0x27, 0x71, 0xc8, - 0xfb, 0xc0, 0x6e, 0xf4, 0xdf, 0xbe, 0xc3, 0xa8, 0x14, 0xe2, 0xa1, 0x7c, 0xbc, 0xde, 0xa5, 0x73, - 0xd0, 0x4c, 0xf1, 0xe5, 0xcd, 0x14, 0x75, 0xa5, 0xe0, 0x60, 0xe7, 0xc9, 0xa5, 0xb1, 0xf3, 0x17, - 0x01, 0xd9, 0xba, 0xad, 0xf6, 0x95, 0x53, 0xdd, 0xd6, 0x86, 0x5d, 0x85, 0x2d, 0x43, 0x76, 0x74, - 0x88, 0xf4, 0xcb, 0x43, 0xfa, 0xe1, 0x88, 0xae, 0xc8, 0x9f, 0x08, 0x90, 0x75, 0xc3, 0xff, 0x65, - 0xaf, 0xa4, 0xcf, 0x43, 0x9a, 0x47, 0xb8, 0xec, 0x4e, 0x9a, 0xd7, 0x42, 0x2f, 0x09, 0x2a, 0x90, - 0x1d, 0x60, 0x5b, 0xa5, 0xe7, 0x20, 0xf3, 0xae, 0x6e, 0xfd, 0xea, 0xeb, 0x90, 0xf7, 0x5d, 0xe7, - 0x93, 0xa3, 0xf1, 0xa0, 0xfe, 0x8e, 0x18, 0xab, 0x64, 0x3e, 0xfd, 0x62, 0x2b, 0x71, 0x80, 0x3f, - 0x24, 0xbb, 0x59, 0xae, 0xd7, 0x1a, 0xf5, 0xda, 0x3d, 0x51, 0xa8, 0xe4, 0x3f, 0xfd, 0x62, 0x2b, - 0x23, 0x63, 0x0a, 0xce, 0x5e, 0xbd, 0x07, 0x2b, 0x13, 0x13, 0x13, 0x0c, 0x9f, 0x10, 0x94, 0x6e, - 0x3f, 0x38, 0xba, 0xbf, 0x57, 0xab, 0x36, 0xeb, 0xca, 0xc3, 0xc3, 0x66, 0x5d, 0x14, 0xd0, 0x05, - 0x58, 0xbb, 0xbf, 0x77, 0xb7, 0xd1, 0x54, 0x6a, 0xf7, 0xf7, 0xea, 0x07, 0x4d, 0xa5, 0xda, 0x6c, - 0x56, 0x6b, 0xf7, 0xc4, 0xf8, 0xf5, 0xbf, 0x17, 0x20, 0x59, 0xdd, 0xad, 0xed, 0xa1, 0x1a, 0x24, - 0x29, 0x24, 0x33, 0xf3, 0x41, 0x62, 0x65, 0x36, 0xcc, 0x8e, 0xee, 0x40, 0x8a, 0xa2, 0x35, 0x68, - 0xf6, 0x0b, 0xc5, 0xca, 0x1c, 0xdc, 0x9d, 0x74, 0x86, 0xee, 0xc8, 0x99, 0x4f, 0x16, 0x2b, 0xb3, - 0x61, 0x78, 0x74, 0x1f, 0x32, 0x4e, 0xb2, 0x3e, 0xef, 0x1d, 0x61, 0x65, 0x2e, 0x36, 0x4e, 0x86, - 0xc6, 0x40, 0x8f, 0xd9, 0xaf, 0x19, 0x2b, 0x73, 0x00, 0x7a, 0xb4, 0x07, 0x69, 0x9e, 0x16, 0xcf, - 0x79, 0xa0, 0x58, 0x99, 0x07, 0xb9, 0x23, 0x19, 0x72, 0x1e, 0x9c, 0x34, 0xff, 0x8d, 0x66, 0x65, - 0x81, 0xbb, 0x07, 0xf4, 0x2e, 0x14, 0x83, 0x29, 0xf7, 0x62, 0x8f, 0x20, 0x2b, 0x0b, 0x82, 0xfb, - 0x44, 0x7f, 0x30, 0xff, 0x5e, 0xec, 0x51, 0x64, 0x65, 0x41, 0xac, 0x1f, 0xbd, 0x0f, 0xab, 0xd3, - 0xf9, 0xf1, 0xe2, 0x6f, 0x24, 0x2b, 0x4b, 0xa0, 0xff, 0x68, 0x00, 0x28, 0x24, 0xaf, 0x5e, 0xe2, - 0xc9, 0x64, 0x65, 0x99, 0xcb, 0x00, 0xd4, 0x86, 0x95, 0xc9, 0x64, 0x75, 0xd1, 0x27, 0x94, 0x95, - 0x85, 0x2f, 0x06, 0x58, 0x2b, 0xc1, 0x24, 0x77, 0xd1, 0x27, 0x95, 0x95, 0x85, 0xef, 0x09, 0xd0, - 0x03, 0x00, 0x5f, 0x9e, 0xba, 0xc0, 0x13, 0xcb, 0xca, 0x22, 0x37, 0x06, 0xc8, 0x80, 0xb5, 0xb0, - 0x04, 0x76, 0x99, 0x17, 0x97, 0x95, 0xa5, 0x2e, 0x12, 0xc8, 0x7a, 0x0e, 0xa6, 0xa2, 0x8b, 0xbd, - 0xc0, 0xac, 0x2c, 0x78, 0xa3, 0x80, 0x2c, 0x58, 0x0f, 0x4d, 0xbf, 0x96, 0x7a, 0x8f, 0x59, 0x59, - 0xee, 0x96, 0x01, 0x75, 0x41, 0x9c, 0x4a, 0xda, 0x16, 0x7e, 0x9e, 0x59, 0x59, 0xfc, 0xbe, 0x61, - 0xb7, 0xfa, 0xe5, 0x37, 0x1b, 0xc2, 0x57, 0xdf, 0x6c, 0x08, 0x7f, 0xf9, 0x66, 0x43, 0xf8, 0xec, - 0xdb, 0x8d, 0xd8, 0x57, 0xdf, 0x6e, 0xc4, 0xfe, 0xf4, 0xed, 0x46, 0xec, 0xff, 0x9e, 0xef, 0x6a, - 0x76, 0x6f, 0x74, 0xb2, 0xdd, 0xd2, 0x07, 0x3b, 0x2d, 0x7d, 0x80, 0xed, 0x93, 0x8e, 0xed, 0x15, - 0xbc, 0xbf, 0x08, 0x4e, 0xd2, 0x34, 0x3e, 0xb8, 0xf1, 0x8f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0a, - 0x73, 0x9c, 0xec, 0x65, 0x30, 0x00, 0x00, + // 3486 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcd, 0x8f, 0x1b, 0xc7, + 0xb1, 0xe7, 0xf0, 0x6b, 0xc9, 0xe2, 0xc7, 0xce, 0xf6, 0xae, 0x24, 0x8a, 0x92, 0x76, 0x57, 0x63, + 0xd8, 0x96, 0x25, 0x7b, 0xd7, 0x4f, 0x7a, 0xb2, 0x2d, 0xc8, 0x7e, 0xc0, 0x2e, 0x45, 0x89, 0xbb, + 0x92, 0x77, 0xd7, 0xb3, 0x94, 0xfc, 0xf4, 0x5e, 0xe2, 0xf1, 0x90, 0x6c, 0x92, 0x63, 0x91, 0x9c, + 0xf1, 0xcc, 0x70, 0xcd, 0xf5, 0x29, 0x88, 0x13, 0x20, 0x30, 0x10, 0xc0, 0x40, 0x2e, 0x3e, 0xc4, + 0x87, 0x1c, 0x72, 0xc9, 0x5f, 0x10, 0x20, 0x40, 0x4e, 0x39, 0xf8, 0x90, 0x83, 0x8f, 0x39, 0x39, + 0x81, 0x75, 0x33, 0x90, 0x53, 0x0e, 0xb9, 0x06, 0xfd, 0x31, 0x5f, 0xe4, 0x0c, 0x3f, 0x64, 0xe7, + 0x10, 0x24, 0xb7, 0xe9, 0x62, 0x55, 0x75, 0x77, 0x75, 0x75, 0x57, 0xf5, 0xaf, 0x9a, 0x70, 0xc1, + 0xc6, 0x83, 0x16, 0x36, 0xfb, 0xda, 0xc0, 0xde, 0x56, 0x1b, 0x4d, 0x6d, 0xdb, 0x3e, 0x35, 0xb0, + 0xb5, 0x65, 0x98, 0xba, 0xad, 0xa3, 0x65, 0xef, 0xc7, 0x2d, 0xf2, 0x63, 0xf9, 0x92, 0x8f, 0xbb, + 0x69, 0x9e, 0x1a, 0xb6, 0xbe, 0x6d, 0x98, 0xba, 0xde, 0x66, 0xfc, 0xe5, 0x8b, 0x93, 0x3f, 0x3f, + 0xc1, 0xa7, 0x5c, 0x5b, 0x40, 0x98, 0xf6, 0xb2, 0x6d, 0xa8, 0xa6, 0xda, 0x77, 0x7e, 0xde, 0x9c, + 0xf8, 0xf9, 0x44, 0xed, 0x69, 0x2d, 0xd5, 0xd6, 0x4d, 0xce, 0xb1, 0xd1, 0xd1, 0xf5, 0x4e, 0x0f, + 0x6f, 0xd3, 0x56, 0x63, 0xd8, 0xde, 0xb6, 0xb5, 0x3e, 0xb6, 0x6c, 0xb5, 0x6f, 0x70, 0x86, 0xb5, + 0x8e, 0xde, 0xd1, 0xe9, 0xe7, 0x36, 0xf9, 0x0a, 0xe9, 0x57, 0x37, 0xd5, 0x66, 0x0f, 0xfb, 0x27, + 0x29, 0x3d, 0xcd, 0xc1, 0x92, 0x8c, 0x3f, 0x1c, 0x62, 0xcb, 0x46, 0xd7, 0x21, 0x89, 0x9b, 0x5d, + 0xbd, 0x24, 0x6c, 0x0a, 0x57, 0x72, 0xd7, 0x2f, 0x6e, 0x8d, 0xcd, 0x7f, 0x8b, 0xf3, 0x55, 0x9b, + 0x5d, 0xbd, 0x16, 0x93, 0x29, 0x2f, 0xba, 0x09, 0xa9, 0x76, 0x6f, 0x68, 0x75, 0x4b, 0x71, 0x2a, + 0x74, 0x29, 0x4a, 0xe8, 0x2e, 0x61, 0xaa, 0xc5, 0x64, 0xc6, 0x4d, 0xba, 0xd2, 0x06, 0x6d, 0xbd, + 0x94, 0x98, 0xde, 0xd5, 0xde, 0xa0, 0x4d, 0xbb, 0x22, 0xbc, 0x68, 0x17, 0x40, 0x1b, 0x68, 0xb6, + 0xd2, 0xec, 0xaa, 0xda, 0xa0, 0x94, 0xa2, 0x92, 0x97, 0xa3, 0x25, 0x35, 0xbb, 0x42, 0x18, 0x6b, + 0x31, 0x39, 0xab, 0x39, 0x0d, 0x32, 0xdc, 0x0f, 0x87, 0xd8, 0x3c, 0x2d, 0xa5, 0xa7, 0x0f, 0xf7, + 0x1d, 0xc2, 0x44, 0x86, 0x4b, 0xb9, 0xd1, 0x9b, 0x90, 0x69, 0x76, 0x71, 0xf3, 0x89, 0x62, 0x8f, + 0x4a, 0x19, 0x2a, 0xb9, 0x11, 0x25, 0x59, 0x21, 0x7c, 0xf5, 0x51, 0x2d, 0x26, 0x2f, 0x35, 0xd9, + 0x27, 0x7a, 0x03, 0xd2, 0x4d, 0xbd, 0xdf, 0xd7, 0xec, 0x52, 0x8e, 0xca, 0xae, 0x47, 0xca, 0x52, + 0xae, 0x5a, 0x4c, 0xe6, 0xfc, 0xe8, 0x00, 0x8a, 0x3d, 0xcd, 0xb2, 0x15, 0x6b, 0xa0, 0x1a, 0x56, + 0x57, 0xb7, 0xad, 0x52, 0x9e, 0x6a, 0x78, 0x3e, 0x4a, 0xc3, 0x03, 0xcd, 0xb2, 0x8f, 0x1d, 0xe6, + 0x5a, 0x4c, 0x2e, 0xf4, 0xfc, 0x04, 0xa2, 0x4f, 0x6f, 0xb7, 0xb1, 0xe9, 0x2a, 0x2c, 0x15, 0xa6, + 0xeb, 0x3b, 0x24, 0xdc, 0x8e, 0x3c, 0xd1, 0xa7, 0xfb, 0x09, 0xe8, 0xff, 0x61, 0xb5, 0xa7, 0xab, + 0x2d, 0x57, 0x9d, 0xd2, 0xec, 0x0e, 0x07, 0x4f, 0x4a, 0x45, 0xaa, 0xf4, 0xa5, 0xc8, 0x41, 0xea, + 0x6a, 0xcb, 0x51, 0x51, 0x21, 0x02, 0xb5, 0x98, 0xbc, 0xd2, 0x1b, 0x27, 0xa2, 0xf7, 0x60, 0x4d, + 0x35, 0x8c, 0xde, 0xe9, 0xb8, 0xf6, 0x65, 0xaa, 0xfd, 0x6a, 0x94, 0xf6, 0x1d, 0x22, 0x33, 0xae, + 0x1e, 0xa9, 0x13, 0x54, 0x54, 0x07, 0xd1, 0x30, 0xb1, 0xa1, 0x9a, 0x58, 0x31, 0x4c, 0xdd, 0xd0, + 0x2d, 0xb5, 0x57, 0x12, 0xa9, 0xee, 0x17, 0xa3, 0x74, 0x1f, 0x31, 0xfe, 0x23, 0xce, 0x5e, 0x8b, + 0xc9, 0xcb, 0x46, 0x90, 0xc4, 0xb4, 0xea, 0x4d, 0x6c, 0x59, 0x9e, 0xd6, 0x95, 0x59, 0x5a, 0x29, + 0x7f, 0x50, 0x6b, 0x80, 0x84, 0xaa, 0x90, 0xc3, 0x23, 0x22, 0xae, 0x9c, 0xe8, 0x36, 0x2e, 0x21, + 0xaa, 0x50, 0x8a, 0xdc, 0xa1, 0x94, 0xf5, 0x91, 0x6e, 0xe3, 0x5a, 0x4c, 0x06, 0xec, 0xb6, 0x90, + 0x0a, 0x67, 0x4e, 0xb0, 0xa9, 0xb5, 0x4f, 0xa9, 0x1a, 0x85, 0xfe, 0x62, 0x69, 0xfa, 0xa0, 0xb4, + 0x4a, 0x15, 0x5e, 0x8b, 0x52, 0xf8, 0x88, 0x0a, 0x11, 0x15, 0x55, 0x47, 0xa4, 0x16, 0x93, 0x57, + 0x4f, 0x26, 0xc9, 0xc4, 0xc5, 0xda, 0xda, 0x40, 0xed, 0x69, 0x1f, 0x63, 0xa5, 0xd1, 0xd3, 0x9b, + 0x4f, 0x4a, 0x6b, 0xd3, 0x5d, 0xec, 0x2e, 0xe7, 0xde, 0x25, 0xcc, 0xc4, 0xc5, 0xda, 0x7e, 0x02, + 0xc2, 0x70, 0xae, 0x69, 0x62, 0xd5, 0xc6, 0x0a, 0x3b, 0xbd, 0x14, 0x13, 0x5b, 0xc3, 0x9e, 0x4d, + 0x76, 0xe2, 0x19, 0xaa, 0xf8, 0xe5, 0xc8, 0xdd, 0x44, 0xc5, 0x0e, 0xa9, 0x94, 0x4c, 0x85, 0xe8, + 0xb6, 0x5c, 0x6b, 0x86, 0xd0, 0xd1, 0xff, 0x02, 0x6a, 0x63, 0xbb, 0xd9, 0x75, 0x7a, 0x21, 0xf6, + 0xb1, 0x4a, 0x67, 0x69, 0x0f, 0x57, 0x22, 0x87, 0x4e, 0x24, 0x98, 0x22, 0x62, 0x04, 0xb2, 0xe1, + 0xc4, 0xf6, 0x18, 0x8d, 0xda, 0x9c, 0x1d, 0xe5, 0x38, 0xa8, 0xfc, 0xdc, 0x0c, 0x9b, 0x73, 0xa1, + 0xa0, 0xfe, 0xd5, 0x93, 0x49, 0xf2, 0xee, 0x12, 0xa4, 0x4e, 0xd4, 0xde, 0x10, 0xef, 0x27, 0x33, + 0x49, 0x31, 0xb5, 0x9f, 0xcc, 0x2c, 0x89, 0x99, 0xfd, 0x64, 0x26, 0x2b, 0xc2, 0x7e, 0x32, 0x03, + 0x62, 0x4e, 0x7a, 0x11, 0x72, 0xbe, 0xc3, 0x1b, 0x95, 0x60, 0xa9, 0x8f, 0x2d, 0x4b, 0xed, 0x60, + 0x7a, 0xd6, 0x67, 0x65, 0xa7, 0x29, 0x15, 0x21, 0xef, 0x3f, 0xb0, 0xa5, 0xcf, 0x04, 0x57, 0x92, + 0x9c, 0xc5, 0x44, 0xf2, 0x04, 0x9b, 0xd4, 0x65, 0xb8, 0x24, 0x6f, 0xa2, 0xe7, 0xa0, 0x40, 0x97, + 0x5b, 0x71, 0x7e, 0x27, 0x01, 0x21, 0x29, 0xe7, 0x29, 0xf1, 0x11, 0x67, 0xda, 0x80, 0x9c, 0x71, + 0xdd, 0x70, 0x59, 0x12, 0x94, 0x05, 0x8c, 0xeb, 0x86, 0xc3, 0x70, 0x19, 0xf2, 0xc4, 0x06, 0x2e, + 0x47, 0x92, 0x76, 0x92, 0x23, 0x34, 0xce, 0x22, 0xfd, 0x31, 0x0e, 0xe2, 0xf8, 0x21, 0x8f, 0xde, + 0x80, 0x24, 0x09, 0x87, 0x3c, 0x74, 0x95, 0xb7, 0x58, 0xac, 0xdc, 0x72, 0x62, 0xe5, 0x56, 0xdd, + 0x89, 0x95, 0xbb, 0x99, 0x2f, 0xbf, 0xde, 0x88, 0x7d, 0xf6, 0xe7, 0x0d, 0x41, 0xa6, 0x12, 0xe8, + 0x3c, 0x39, 0xda, 0x55, 0x6d, 0xa0, 0x68, 0x2d, 0x3a, 0xe4, 0x2c, 0x39, 0xb7, 0x55, 0x6d, 0xb0, + 0xd7, 0x42, 0x0f, 0x40, 0x6c, 0xea, 0x03, 0x0b, 0x0f, 0xac, 0xa1, 0xa5, 0xb0, 0x68, 0xcd, 0x03, + 0x56, 0x20, 0xec, 0xb0, 0x70, 0x5a, 0x71, 0x38, 0x8f, 0x28, 0xa3, 0xbc, 0xdc, 0x0c, 0x12, 0xd0, + 0x5d, 0x00, 0x37, 0xa4, 0x5b, 0xa5, 0xe4, 0x66, 0xe2, 0x4a, 0xee, 0xfa, 0xe6, 0xc4, 0xe2, 0x3f, + 0x72, 0x58, 0x1e, 0x1a, 0x64, 0x95, 0x77, 0x93, 0x64, 0xb8, 0xb2, 0x4f, 0x12, 0xbd, 0x00, 0xcb, + 0xaa, 0x61, 0x28, 0x96, 0x4d, 0x1c, 0xaa, 0x71, 0x4a, 0x3c, 0x89, 0xc4, 0xc2, 0xbc, 0x5c, 0x50, + 0x0d, 0xe3, 0x98, 0x50, 0x77, 0x09, 0x11, 0x3d, 0x0f, 0x45, 0x12, 0xf7, 0x34, 0xb5, 0xa7, 0x74, + 0xb1, 0xd6, 0xe9, 0xda, 0x34, 0xe6, 0x25, 0xe4, 0x02, 0xa7, 0xd6, 0x28, 0x51, 0x6a, 0xb9, 0x2b, + 0x4e, 0x63, 0x1e, 0x42, 0x90, 0x6c, 0xa9, 0xb6, 0x4a, 0x2d, 0x99, 0x97, 0xe9, 0x37, 0xa1, 0x19, + 0xaa, 0xdd, 0xe5, 0xf6, 0xa1, 0xdf, 0xe8, 0x2c, 0xa4, 0xb9, 0xda, 0x04, 0x55, 0xcb, 0x5b, 0x68, + 0x0d, 0x52, 0x86, 0xa9, 0x9f, 0x60, 0xba, 0x74, 0x19, 0x99, 0x35, 0x24, 0x19, 0x8a, 0xc1, 0xf8, + 0x88, 0x8a, 0x10, 0xb7, 0x47, 0xbc, 0x97, 0xb8, 0x3d, 0x42, 0xaf, 0x42, 0x92, 0x18, 0x92, 0xf6, + 0x51, 0x0c, 0xc9, 0x08, 0xb8, 0x5c, 0xfd, 0xd4, 0xc0, 0x32, 0xe5, 0x94, 0x96, 0xa1, 0x10, 0x88, + 0x9b, 0xd2, 0x59, 0x58, 0x0b, 0x0b, 0x83, 0x52, 0xd7, 0xa5, 0x07, 0xc2, 0x19, 0xba, 0x09, 0x19, + 0x37, 0x0e, 0x32, 0xc7, 0x39, 0x3f, 0xd1, 0xad, 0xc3, 0x2c, 0xbb, 0xac, 0xc4, 0x63, 0xc8, 0x02, + 0x74, 0x55, 0x9e, 0xf5, 0xe4, 0xe5, 0x25, 0xd5, 0x30, 0x6a, 0xaa, 0xd5, 0x95, 0xde, 0x87, 0x52, + 0x54, 0x8c, 0xf3, 0x19, 0x4c, 0xa0, 0x6e, 0xef, 0x18, 0xec, 0x2c, 0xa4, 0xdb, 0xba, 0xd9, 0x57, + 0x6d, 0xaa, 0xac, 0x20, 0xf3, 0x16, 0x31, 0x24, 0x8b, 0x77, 0x09, 0x4a, 0x66, 0x0d, 0x49, 0x81, + 0xf3, 0x91, 0x71, 0x8e, 0x88, 0x68, 0x83, 0x16, 0x66, 0x66, 0x2d, 0xc8, 0xac, 0xe1, 0x29, 0x62, + 0x83, 0x65, 0x0d, 0xd2, 0xad, 0x45, 0xe7, 0x4a, 0xf5, 0x67, 0x65, 0xde, 0x92, 0x3e, 0x4f, 0xc0, + 0xd9, 0xf0, 0x68, 0x87, 0x36, 0x21, 0xdf, 0x57, 0x47, 0x8a, 0x3d, 0xe2, 0x6e, 0x27, 0xd0, 0x85, + 0x87, 0xbe, 0x3a, 0xaa, 0x8f, 0x98, 0xcf, 0x89, 0x90, 0xb0, 0x47, 0x56, 0x29, 0xbe, 0x99, 0xb8, + 0x92, 0x97, 0xc9, 0x27, 0x7a, 0x08, 0x2b, 0x3d, 0xbd, 0xa9, 0xf6, 0x94, 0x9e, 0x6a, 0xd9, 0x0a, + 0x4f, 0x83, 0xd8, 0x26, 0x7a, 0x6e, 0xc2, 0xd8, 0x2c, 0x6e, 0xe1, 0x16, 0x5b, 0x4f, 0x72, 0xe0, + 0x70, 0xff, 0x5f, 0xa6, 0x3a, 0x1e, 0xa8, 0xce, 0x52, 0xa3, 0x3b, 0x90, 0xeb, 0x6b, 0x56, 0x03, + 0x77, 0xd5, 0x13, 0x4d, 0x37, 0xf9, 0x6e, 0x9a, 0x74, 0x9a, 0xb7, 0x3d, 0x1e, 0xae, 0xc9, 0x2f, + 0xe6, 0x5b, 0x92, 0x54, 0xc0, 0x87, 0x9d, 0xd3, 0x24, 0xbd, 0xf0, 0x69, 0xf2, 0x2a, 0xac, 0x0d, + 0xf0, 0xc8, 0x56, 0xbc, 0xfd, 0xca, 0xfc, 0x64, 0x89, 0x9a, 0x1e, 0x91, 0xdf, 0xdc, 0x1d, 0x6e, + 0x11, 0x97, 0x41, 0x2f, 0xd1, 0x7c, 0xc1, 0xd0, 0x2d, 0x6c, 0x2a, 0x6a, 0xab, 0x65, 0x62, 0xcb, + 0xa2, 0x29, 0x66, 0x9e, 0x26, 0x01, 0x94, 0xbe, 0xc3, 0xc8, 0xd2, 0xcf, 0xfc, 0x4b, 0x13, 0xcc, + 0x0f, 0xb8, 0xe1, 0x05, 0xcf, 0xf0, 0xc7, 0xb0, 0xc6, 0xe5, 0x5b, 0x01, 0xdb, 0xb3, 0x3c, 0xfd, + 0xc2, 0xe4, 0xfe, 0x1a, 0xb7, 0x39, 0x72, 0xc4, 0xa3, 0xcd, 0x9e, 0x78, 0x36, 0xb3, 0x23, 0x48, + 0x52, 0xa3, 0x24, 0xd9, 0x11, 0x43, 0xbe, 0xff, 0xd5, 0x96, 0xe2, 0x93, 0x04, 0xac, 0x4c, 0x24, + 0x5b, 0xee, 0xc4, 0x84, 0xd0, 0x89, 0xc5, 0x43, 0x27, 0x96, 0x58, 0x78, 0x62, 0x7c, 0xad, 0x93, + 0xb3, 0xd7, 0x3a, 0xf5, 0x3d, 0xae, 0x75, 0xfa, 0xd9, 0xd6, 0xfa, 0x9f, 0xba, 0x0a, 0xbf, 0x14, + 0xa0, 0x1c, 0x9d, 0xa1, 0x86, 0x2e, 0xc7, 0x35, 0x58, 0x71, 0x87, 0xe2, 0xaa, 0x67, 0x07, 0xa3, + 0xe8, 0xfe, 0xc0, 0xf5, 0x47, 0xc6, 0xb8, 0xe7, 0xa1, 0x38, 0x96, 0x3f, 0x33, 0x57, 0x2e, 0x9c, + 0xf8, 0xfb, 0x97, 0x7e, 0x92, 0x70, 0x03, 0x4f, 0x20, 0xc9, 0x0d, 0xd9, 0xad, 0xef, 0xc0, 0x6a, + 0x0b, 0x37, 0xb5, 0xd6, 0xb3, 0x6e, 0xd6, 0x15, 0x2e, 0xfd, 0x9f, 0xbd, 0x3a, 0xe9, 0x25, 0x6d, + 0xb8, 0x30, 0xe5, 0x46, 0x80, 0xee, 0x41, 0xb1, 0xa3, 0x5b, 0x96, 0x66, 0xe0, 0x16, 0x4f, 0xcc, + 0x85, 0xc9, 0xdc, 0x8c, 0x25, 0xee, 0x5b, 0xf7, 0x38, 0x23, 0x4d, 0xbb, 0xe5, 0x42, 0xc7, 0xdf, + 0x94, 0xce, 0xc3, 0xb9, 0x88, 0x7b, 0x81, 0x74, 0xcb, 0xf3, 0xd3, 0xc9, 0xf4, 0x1d, 0x5d, 0x80, + 0x2c, 0xbf, 0x18, 0xb8, 0x19, 0x51, 0x86, 0x11, 0xea, 0x23, 0xe9, 0x77, 0x79, 0xc8, 0xc8, 0xd8, + 0x32, 0x48, 0x36, 0x89, 0x76, 0x21, 0x8b, 0x47, 0x4d, 0x6c, 0xd8, 0x4e, 0x02, 0x1e, 0x7e, 0x09, + 0x64, 0xdc, 0x55, 0x87, 0xb3, 0x16, 0x93, 0x3d, 0x31, 0x74, 0x83, 0xa3, 0x3c, 0xd1, 0x80, 0x0d, + 0x17, 0xf7, 0xc3, 0x3c, 0xaf, 0x39, 0x30, 0x4f, 0x22, 0x12, 0xc1, 0x60, 0x52, 0x63, 0x38, 0xcf, + 0x0d, 0x8e, 0xf3, 0x24, 0x67, 0x74, 0x16, 0x00, 0x7a, 0x2a, 0x01, 0xa0, 0x27, 0x3d, 0x63, 0x9a, + 0x11, 0x48, 0xcf, 0x6b, 0x0e, 0xd2, 0xb3, 0x34, 0x63, 0xc4, 0x63, 0x50, 0xcf, 0x5b, 0x3e, 0xa8, + 0x27, 0x4b, 0x45, 0x37, 0x23, 0x45, 0x43, 0xb0, 0x9e, 0x5b, 0x2e, 0xd6, 0x93, 0x8f, 0xc4, 0x89, + 0xb8, 0xf0, 0x38, 0xd8, 0x73, 0x38, 0x01, 0xf6, 0x30, 0x70, 0xe6, 0x85, 0x48, 0x15, 0x33, 0xd0, + 0x9e, 0xc3, 0x09, 0xb4, 0xa7, 0x38, 0x43, 0xe1, 0x0c, 0xb8, 0xe7, 0x07, 0xe1, 0x70, 0x4f, 0x34, + 0x20, 0xc3, 0x87, 0x39, 0x1f, 0xde, 0xa3, 0x44, 0xe0, 0x3d, 0x62, 0xe4, 0x3d, 0x99, 0xa9, 0x9f, + 0x1b, 0xf0, 0x79, 0x18, 0x02, 0xf8, 0xac, 0x44, 0xde, 0xf0, 0x99, 0xf2, 0x39, 0x10, 0x9f, 0x87, + 0x21, 0x88, 0x0f, 0x9a, 0xa9, 0x76, 0x26, 0xe4, 0x73, 0x37, 0x08, 0xf9, 0xac, 0x46, 0xe4, 0xcc, + 0xde, 0x6e, 0x8f, 0xc0, 0x7c, 0x1a, 0x51, 0x98, 0xcf, 0x5a, 0x24, 0x7c, 0xc2, 0x34, 0x2e, 0x00, + 0xfa, 0x1c, 0x4e, 0x80, 0x3e, 0x67, 0x66, 0x78, 0xda, 0x0c, 0xd4, 0xa7, 0x1d, 0x8d, 0xfa, 0x30, + 0x4c, 0xe6, 0x95, 0xe8, 0x7d, 0xb5, 0x08, 0xec, 0xf3, 0x38, 0x14, 0xf6, 0x39, 0x17, 0x89, 0x5f, + 0xf2, 0xc1, 0xcf, 0x83, 0xfb, 0x34, 0xa2, 0x70, 0x9f, 0xd2, 0x2c, 0xbb, 0x3f, 0x13, 0xf0, 0x93, + 0x12, 0xd3, 0xfb, 0xc9, 0x4c, 0x46, 0xcc, 0x32, 0xc8, 0x67, 0x3f, 0x99, 0xc9, 0x89, 0x79, 0xe9, + 0x25, 0x92, 0xa6, 0x8e, 0x85, 0x03, 0x72, 0x21, 0xc4, 0xa6, 0xa9, 0x9b, 0x1c, 0xc2, 0x61, 0x0d, + 0xe9, 0x0a, 0xe4, 0xfd, 0x47, 0xff, 0x14, 0x90, 0x88, 0x5e, 0xbc, 0x7d, 0xc7, 0xbd, 0xf4, 0x5b, + 0xc1, 0x93, 0xa5, 0x30, 0x91, 0x1f, 0x44, 0xc8, 0x72, 0x10, 0xc1, 0x07, 0x1d, 0xc5, 0x83, 0xd0, + 0xd1, 0x06, 0xe4, 0xc8, 0x85, 0x7a, 0x0c, 0x15, 0x52, 0x0d, 0x17, 0x15, 0xba, 0x0a, 0x2b, 0x34, + 0x2b, 0x62, 0x00, 0x13, 0xcf, 0x3d, 0x92, 0x34, 0xf7, 0x58, 0x26, 0x3f, 0x30, 0x27, 0x62, 0x49, + 0xc8, 0x2b, 0xb0, 0xea, 0xe3, 0x75, 0x2f, 0xea, 0x0c, 0x22, 0x11, 0x5d, 0xee, 0x1d, 0x7e, 0x63, + 0xff, 0x83, 0xe0, 0x59, 0xc8, 0x83, 0x93, 0xc2, 0x90, 0x1f, 0xe1, 0x7b, 0x42, 0x7e, 0xe2, 0xcf, + 0x8c, 0xfc, 0xf8, 0x81, 0x87, 0x44, 0x10, 0x78, 0xf8, 0xbb, 0xe0, 0xad, 0x89, 0x8b, 0xe3, 0x34, + 0xf5, 0x16, 0xe6, 0x50, 0x00, 0xfd, 0x26, 0x79, 0x67, 0x4f, 0xef, 0xf0, 0x0b, 0x3f, 0xf9, 0x24, + 0x5c, 0x6e, 0x7c, 0xce, 0xf2, 0xf0, 0xeb, 0xa2, 0x08, 0x2c, 0xbb, 0xe3, 0x28, 0x82, 0x08, 0x89, + 0x27, 0x98, 0xd5, 0x4d, 0xf2, 0x32, 0xf9, 0x24, 0x7c, 0xd4, 0xf9, 0x78, 0x96, 0xc6, 0x1a, 0xe8, + 0x0d, 0xc8, 0xd2, 0xa2, 0x98, 0xa2, 0x1b, 0x16, 0xaf, 0x95, 0x04, 0xf2, 0x57, 0x56, 0x19, 0xdb, + 0x3a, 0x22, 0x3c, 0x87, 0x86, 0x25, 0x67, 0x0c, 0xfe, 0xe5, 0x4b, 0x2b, 0xb3, 0x81, 0xb4, 0xf2, + 0x22, 0x64, 0xc9, 0xe8, 0x2d, 0x43, 0x6d, 0xe2, 0x12, 0xd0, 0x81, 0x7a, 0x04, 0xe9, 0x37, 0x71, + 0x58, 0x1e, 0x8b, 0xc7, 0xa1, 0x73, 0x77, 0x5c, 0x32, 0xee, 0xc3, 0xb5, 0xe6, 0xb3, 0xc7, 0x3a, + 0x40, 0x47, 0xb5, 0x94, 0x8f, 0xd4, 0x81, 0x8d, 0x5b, 0xdc, 0x28, 0x3e, 0x0a, 0x2a, 0x43, 0x86, + 0xb4, 0x86, 0x16, 0x6e, 0x71, 0x88, 0xcd, 0x6d, 0xa3, 0x1a, 0xa4, 0xf1, 0x09, 0x1e, 0xd8, 0x56, + 0x69, 0x89, 0x2e, 0xfb, 0xd9, 0x49, 0xcc, 0x83, 0xfc, 0xbc, 0x5b, 0x22, 0x8b, 0xfd, 0xed, 0xd7, + 0x1b, 0x22, 0xe3, 0x7e, 0x59, 0xef, 0x6b, 0x36, 0xee, 0x1b, 0xf6, 0xa9, 0xcc, 0xe5, 0x83, 0x56, + 0xc8, 0x8c, 0x59, 0x81, 0x82, 0xbd, 0x79, 0x07, 0xc3, 0x21, 0x36, 0xd5, 0x74, 0x53, 0xb3, 0x4f, + 0xe5, 0x42, 0x1f, 0xf7, 0x0d, 0x5d, 0xef, 0x29, 0x6c, 0x8f, 0xef, 0x40, 0x31, 0x98, 0x7e, 0xa0, + 0xe7, 0xa0, 0x60, 0x62, 0x5b, 0xd5, 0x06, 0x4a, 0xe0, 0xa6, 0x93, 0x67, 0x44, 0xb6, 0xa7, 0xf6, + 0x93, 0x19, 0x41, 0x8c, 0xef, 0x27, 0x33, 0x71, 0x31, 0x21, 0x1d, 0xc1, 0x99, 0xd0, 0xf4, 0x03, + 0xbd, 0x0e, 0x59, 0x2f, 0x73, 0x61, 0x29, 0xf4, 0x14, 0x38, 0xcd, 0xe3, 0x95, 0x7e, 0x2f, 0x78, + 0x2a, 0x83, 0x00, 0x5d, 0x15, 0xd2, 0xec, 0xdc, 0xa7, 0x2b, 0x59, 0x9c, 0x72, 0xe8, 0x07, 0xe4, + 0xb6, 0xd8, 0xf1, 0x2e, 0x73, 0x61, 0xe9, 0x3d, 0x48, 0x33, 0x0a, 0xca, 0xc1, 0xd2, 0xc3, 0x83, + 0xfb, 0x07, 0x87, 0xef, 0x1e, 0x88, 0x31, 0x04, 0x90, 0xde, 0xa9, 0x54, 0xaa, 0x47, 0x75, 0x51, + 0x40, 0x59, 0x48, 0xed, 0xec, 0x1e, 0xca, 0x75, 0x31, 0x4e, 0xc8, 0x72, 0x75, 0xbf, 0x5a, 0xa9, + 0x8b, 0x09, 0xb4, 0x02, 0x05, 0xf6, 0xad, 0xdc, 0x3d, 0x94, 0xdf, 0xde, 0xa9, 0x8b, 0x49, 0x1f, + 0xe9, 0xb8, 0x7a, 0x70, 0xa7, 0x2a, 0x8b, 0x29, 0xe9, 0xbf, 0xe0, 0x7c, 0x64, 0xaa, 0xe3, 0xa1, + 0x6f, 0x82, 0x0f, 0x7d, 0x93, 0x3e, 0x8f, 0x93, 0x1b, 0x41, 0x54, 0xfe, 0x82, 0xf6, 0xc7, 0x26, + 0x7e, 0x7d, 0x81, 0xe4, 0x67, 0x6c, 0xf6, 0xe4, 0xb2, 0x6a, 0x62, 0x16, 0xe4, 0x68, 0xdf, 0xec, + 0x04, 0x2a, 0xc8, 0x05, 0x4e, 0xa5, 0x42, 0x16, 0x63, 0xfb, 0x00, 0x37, 0x6d, 0x85, 0x39, 0x91, + 0x45, 0x6f, 0x8c, 0x59, 0xc2, 0x46, 0xa8, 0xc7, 0x8c, 0x28, 0xbd, 0xbf, 0x90, 0x2d, 0xb3, 0x90, + 0x92, 0xab, 0x75, 0xf9, 0xb1, 0x98, 0x40, 0x08, 0x8a, 0xf4, 0x53, 0x39, 0x3e, 0xd8, 0x39, 0x3a, + 0xae, 0x1d, 0x12, 0x5b, 0xae, 0xc2, 0xb2, 0x63, 0x4b, 0x87, 0x98, 0x92, 0xae, 0x91, 0x6b, 0x54, + 0x68, 0xf2, 0x35, 0x79, 0x6f, 0x96, 0x7e, 0x25, 0xf8, 0xb9, 0x83, 0x09, 0xd4, 0x21, 0xa4, 0x2d, + 0x5b, 0xb5, 0x87, 0x16, 0x37, 0xe2, 0xeb, 0xf3, 0x66, 0x63, 0x5b, 0xce, 0xc7, 0x31, 0x15, 0x97, + 0xb9, 0x1a, 0xe9, 0x26, 0x14, 0x83, 0xbf, 0x44, 0xdb, 0xc0, 0x73, 0xa2, 0xb8, 0x74, 0x1b, 0xd0, + 0x64, 0x92, 0x16, 0x82, 0x21, 0x08, 0x61, 0x18, 0xc2, 0xaf, 0x05, 0x72, 0x7b, 0x8d, 0x4c, 0xc8, + 0xd0, 0x3b, 0x63, 0x93, 0xbc, 0xb5, 0x48, 0x3a, 0xb7, 0xc5, 0x68, 0x63, 0xd3, 0xbc, 0x01, 0x79, + 0x3f, 0x7d, 0xbe, 0x49, 0x7e, 0x1b, 0xf7, 0x36, 0x71, 0x10, 0xec, 0xf0, 0x8e, 0x40, 0xe1, 0x3b, + 0x1e, 0x81, 0x6f, 0x02, 0xd8, 0x23, 0x9e, 0x09, 0x3a, 0x71, 0xf4, 0x52, 0x08, 0x88, 0x8c, 0x9b, + 0xf5, 0x11, 0xdf, 0x04, 0x59, 0x9b, 0x7f, 0x59, 0xe8, 0xd8, 0x8f, 0xfc, 0x0c, 0x69, 0x8c, 0xb5, + 0x38, 0x2a, 0x32, 0x6f, 0x30, 0xf6, 0x10, 0x22, 0x46, 0xb6, 0xd0, 0x63, 0x38, 0x37, 0x96, 0x28, + 0xb8, 0xaa, 0x93, 0xf3, 0xe6, 0x0b, 0x67, 0x82, 0xf9, 0x82, 0xa3, 0xda, 0x1f, 0xed, 0x53, 0xc1, + 0x68, 0xff, 0x16, 0x5c, 0x9c, 0x96, 0xed, 0xa2, 0x4b, 0x00, 0x78, 0x40, 0x82, 0x43, 0xcb, 0x43, + 0x14, 0xb2, 0x9c, 0x52, 0x1f, 0x49, 0xf7, 0xa0, 0x14, 0x95, 0xc9, 0xa2, 0x6b, 0x90, 0xa4, 0xd7, + 0x0d, 0x96, 0xed, 0x9c, 0x0b, 0xc1, 0x40, 0x08, 0x9f, 0x4c, 0x99, 0xa4, 0x9f, 0xfb, 0x9d, 0x33, + 0x04, 0xd8, 0xb8, 0x3f, 0xe6, 0x9c, 0x37, 0x16, 0xc9, 0x79, 0xb7, 0xc6, 0xdc, 0xf2, 0x32, 0xa4, + 0xb9, 0x43, 0x02, 0xa4, 0xd5, 0x86, 0x85, 0x07, 0xb6, 0x18, 0x23, 0xce, 0x69, 0x98, 0x98, 0x36, + 0x04, 0xe9, 0x31, 0x80, 0x87, 0x8c, 0x91, 0x93, 0xd7, 0xd4, 0x87, 0x83, 0x16, 0xed, 0x3c, 0x25, + 0xb3, 0x06, 0xba, 0x09, 0x29, 0x96, 0x86, 0xc7, 0x23, 0x42, 0x14, 0xe9, 0xdc, 0x87, 0xac, 0x31, + 0x6e, 0x49, 0x03, 0x34, 0x59, 0x9d, 0x88, 0xe8, 0xe2, 0xad, 0x60, 0x17, 0x97, 0x23, 0xeb, 0x1c, + 0xe1, 0x5d, 0x7d, 0x0c, 0x29, 0xba, 0x23, 0x48, 0x32, 0x42, 0x4b, 0x62, 0x3c, 0x8b, 0x26, 0xdf, + 0xe8, 0x87, 0x00, 0xaa, 0x6d, 0x9b, 0x5a, 0x63, 0xe8, 0x75, 0xb0, 0x11, 0xbe, 0xa3, 0x76, 0x1c, + 0xbe, 0xdd, 0x8b, 0x7c, 0x6b, 0xad, 0x79, 0xa2, 0xbe, 0xed, 0xe5, 0x53, 0x28, 0x1d, 0x40, 0x31, + 0x28, 0xeb, 0xe4, 0x7d, 0x6c, 0x0c, 0xc1, 0xbc, 0x8f, 0xa5, 0xf1, 0x3c, 0xef, 0x73, 0xb3, 0xc6, + 0x04, 0xab, 0xfb, 0xd1, 0x86, 0xf4, 0xa3, 0x38, 0xe4, 0xfd, 0x1b, 0xf2, 0xdf, 0x2f, 0x35, 0x93, + 0x7e, 0x2a, 0x40, 0xc6, 0x9d, 0x7e, 0xb0, 0x08, 0x18, 0xa8, 0x9a, 0x32, 0xeb, 0xc5, 0xfd, 0x95, + 0x3b, 0x56, 0x23, 0x4d, 0xb8, 0x35, 0xd2, 0xdb, 0x6e, 0x5a, 0x10, 0x85, 0xa7, 0xf9, 0x6d, 0xcd, + 0xbd, 0xca, 0xc9, 0x82, 0x6e, 0x43, 0xd6, 0x3d, 0xd5, 0xc8, 0x65, 0xcc, 0x41, 0x4d, 0x05, 0x7e, + 0xb6, 0x70, 0xcc, 0x7b, 0x0d, 0x52, 0x86, 0xfe, 0x11, 0x2f, 0x0b, 0x26, 0x64, 0xd6, 0x90, 0x5a, + 0xb0, 0x3c, 0x76, 0x24, 0xa2, 0xdb, 0xb0, 0x64, 0x0c, 0x1b, 0x8a, 0xe3, 0x1c, 0x63, 0xd8, 0xb2, + 0x93, 0xe6, 0x0f, 0x1b, 0x3d, 0xad, 0x79, 0x1f, 0x9f, 0x3a, 0x83, 0x31, 0x86, 0x8d, 0xfb, 0xcc, + 0x87, 0x58, 0x2f, 0x71, 0x7f, 0x2f, 0xbf, 0x10, 0x20, 0xe3, 0xec, 0x09, 0xf4, 0x3f, 0x90, 0x75, + 0x8f, 0x5b, 0xb7, 0xae, 0x1f, 0x79, 0x4e, 0x73, 0xfd, 0x9e, 0x08, 0xda, 0x71, 0x1e, 0x24, 0x68, + 0x2d, 0xa5, 0xdd, 0x53, 0x99, 0x2f, 0x15, 0x83, 0x36, 0x63, 0x07, 0x32, 0x8d, 0x53, 0x7b, 0x77, + 0xee, 0xf6, 0xd4, 0x8e, 0x9c, 0xa3, 0x32, 0x7b, 0x2d, 0xd2, 0xe0, 0x19, 0xef, 0xdf, 0x04, 0x10, + 0xc7, 0x77, 0xec, 0x77, 0x1e, 0xdd, 0x64, 0xf8, 0x4f, 0x84, 0x84, 0x7f, 0xb4, 0x0d, 0xab, 0x2e, + 0x87, 0x62, 0x69, 0x9d, 0x81, 0x6a, 0x0f, 0x4d, 0xcc, 0xd1, 0x78, 0xe4, 0xfe, 0x74, 0xec, 0xfc, + 0x32, 0x39, 0xeb, 0xd4, 0x33, 0xce, 0xfa, 0x93, 0x38, 0xe4, 0x7c, 0xb5, 0x01, 0xf4, 0xdf, 0xbe, + 0xc3, 0xa8, 0x18, 0x12, 0x31, 0x7d, 0xbc, 0x5e, 0x8d, 0x3e, 0x68, 0xa6, 0xf8, 0xe2, 0x66, 0x8a, + 0xaa, 0xc0, 0x38, 0xa5, 0x86, 0xe4, 0xc2, 0xa5, 0x86, 0x97, 0x01, 0xd9, 0xba, 0xad, 0xf6, 0x94, + 0x13, 0xdd, 0xd6, 0x06, 0x1d, 0x85, 0xb9, 0x21, 0x3b, 0x3a, 0x44, 0xfa, 0xcb, 0x23, 0xfa, 0xc3, + 0x11, 0xf5, 0xc8, 0x1f, 0x0b, 0x90, 0x71, 0xaf, 0x23, 0x8b, 0x56, 0xf0, 0xcf, 0x42, 0x9a, 0x67, + 0xdc, 0xac, 0x84, 0xcf, 0x5b, 0xa1, 0x35, 0x95, 0x32, 0x64, 0xfa, 0xd8, 0x56, 0xe9, 0x39, 0xc8, + 0xa2, 0xbd, 0xdb, 0xbe, 0x7a, 0x0b, 0x72, 0xbe, 0xd7, 0x0f, 0xe4, 0x68, 0x3c, 0xa8, 0xbe, 0x2b, + 0xc6, 0xca, 0x4b, 0x9f, 0x7e, 0xb1, 0x99, 0x38, 0xc0, 0x1f, 0x91, 0xdd, 0x2c, 0x57, 0x2b, 0xb5, + 0x6a, 0xe5, 0xbe, 0x28, 0x94, 0x73, 0x9f, 0x7e, 0xb1, 0xb9, 0x24, 0x63, 0x0a, 0x48, 0x5f, 0xbd, + 0x0f, 0xcb, 0x63, 0x0b, 0x13, 0x4c, 0xe7, 0x10, 0x14, 0xef, 0x3c, 0x3c, 0x7a, 0xb0, 0x57, 0xd9, + 0xa9, 0x57, 0x95, 0x47, 0x87, 0xf5, 0xaa, 0x28, 0xa0, 0x73, 0xb0, 0xfa, 0x60, 0xef, 0x5e, 0xad, + 0xae, 0x54, 0x1e, 0xec, 0x55, 0x0f, 0xea, 0xca, 0x4e, 0xbd, 0xbe, 0x53, 0xb9, 0x2f, 0xc6, 0xaf, + 0xff, 0xb5, 0x00, 0xc9, 0x9d, 0xdd, 0xca, 0x1e, 0xaa, 0x40, 0x92, 0x42, 0x44, 0x53, 0x9f, 0x88, + 0x96, 0xa7, 0x97, 0x16, 0xd0, 0x5d, 0x48, 0x51, 0xf4, 0x08, 0x4d, 0x7f, 0x33, 0x5a, 0x9e, 0x51, + 0x6b, 0x20, 0x83, 0xa1, 0x3b, 0x72, 0xea, 0x23, 0xd2, 0xf2, 0xf4, 0xd2, 0x03, 0x7a, 0x00, 0x4b, + 0x0e, 0x78, 0x30, 0xeb, 0x65, 0x67, 0x79, 0x66, 0x3d, 0x80, 0x4c, 0x8d, 0x81, 0x30, 0xd3, 0xdf, + 0x97, 0x96, 0x67, 0x14, 0x25, 0xd0, 0x1e, 0xa4, 0xf9, 0x35, 0x7d, 0xc6, 0x93, 0xd1, 0xf2, 0xac, + 0x32, 0x03, 0x92, 0x21, 0xeb, 0xc1, 0x5b, 0xb3, 0x5f, 0xcd, 0x96, 0xe7, 0xa8, 0xb7, 0xa0, 0xf7, + 0xa0, 0x10, 0x84, 0x00, 0xe6, 0x7b, 0x96, 0x5a, 0x9e, 0xb3, 0xa0, 0x41, 0xf4, 0x07, 0xf1, 0x80, + 0xf9, 0x9e, 0xa9, 0x96, 0xe7, 0xac, 0x6f, 0xa0, 0x0f, 0x60, 0x65, 0xf2, 0xbe, 0x3e, 0xff, 0xab, + 0xd5, 0xf2, 0x02, 0x15, 0x0f, 0xd4, 0x07, 0x14, 0x72, 0xcf, 0x5f, 0xe0, 0x11, 0x6b, 0x79, 0x91, + 0x02, 0x08, 0x6a, 0xc1, 0xf2, 0xf8, 0xe5, 0x79, 0xde, 0x47, 0xad, 0xe5, 0xb9, 0x8b, 0x21, 0xac, + 0x97, 0xe0, 0xa5, 0x7b, 0xde, 0x47, 0xae, 0xe5, 0xb9, 0x6b, 0x23, 0xe8, 0x21, 0x80, 0xef, 0xde, + 0x3c, 0xc7, 0xa3, 0xd7, 0xf2, 0x3c, 0x55, 0x12, 0x64, 0xc0, 0x6a, 0xd8, 0x85, 0x7a, 0x91, 0x37, + 0xb0, 0xe5, 0x85, 0x8a, 0x27, 0xc4, 0x9f, 0x83, 0x57, 0xe3, 0xf9, 0xde, 0xc4, 0x96, 0xe7, 0xac, + 0xa2, 0x20, 0x0b, 0xd6, 0x42, 0xaf, 0x83, 0x0b, 0xbd, 0x90, 0x2d, 0x2f, 0x56, 0x59, 0x41, 0x1d, + 0x10, 0x27, 0x2e, 0x91, 0x73, 0x3f, 0x98, 0x2d, 0xcf, 0x5f, 0x63, 0xa1, 0xeb, 0x15, 0x72, 0xc7, + 0x5c, 0xe4, 0xfd, 0x6c, 0x79, 0xa1, 0xa2, 0xcb, 0xee, 0xce, 0x97, 0xdf, 0xac, 0x0b, 0x5f, 0x7d, + 0xb3, 0x2e, 0xfc, 0xe5, 0x9b, 0x75, 0xe1, 0xb3, 0xa7, 0xeb, 0xb1, 0xaf, 0x9e, 0xae, 0xc7, 0xfe, + 0xf4, 0x74, 0x3d, 0xf6, 0x7f, 0x2f, 0x76, 0x34, 0xbb, 0x3b, 0x6c, 0x6c, 0x35, 0xf5, 0xfe, 0x76, + 0x53, 0xef, 0x63, 0xbb, 0xd1, 0xb6, 0xbd, 0x0f, 0xef, 0x9f, 0x24, 0x8d, 0x34, 0xcd, 0x48, 0x6e, + 0xfc, 0x23, 0x00, 0x00, 0xff, 0xff, 0x2d, 0x0f, 0x04, 0x5b, 0x69, 0x32, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4134,6 +4282,7 @@ type ABCIClient interface { FinalizeBlock(ctx context.Context, in *RequestFinalizeBlock, opts ...grpc.CallOption) (*ResponseFinalizeBlock, error) CreateOracleResultTx(ctx context.Context, in *RequestCreateOracleResultTx, opts ...grpc.CallOption) (*ResponseCreateOracleResultTx, error) FetchOracleVotes(ctx context.Context, in *RequestFetchOracleVotes, opts ...grpc.CallOption) (*ResponseFetchOracleVotes, error) + ValidateOracleVotes(ctx context.Context, in *RequestValidateOracleVotes, opts ...grpc.CallOption) (*ResponseValidateOracleVotes, error) } type aBCIClient struct { @@ -4306,6 +4455,15 @@ func (c *aBCIClient) FetchOracleVotes(ctx context.Context, in *RequestFetchOracl return out, nil } +func (c *aBCIClient) ValidateOracleVotes(ctx context.Context, in *RequestValidateOracleVotes, opts ...grpc.CallOption) (*ResponseValidateOracleVotes, error) { + out := new(ResponseValidateOracleVotes) + err := c.cc.Invoke(ctx, "/tendermint.abci.ABCI/ValidateOracleVotes", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ABCIServer is the server API for ABCI service. type ABCIServer interface { Echo(context.Context, *RequestEcho) (*ResponseEcho, error) @@ -4326,6 +4484,7 @@ type ABCIServer interface { FinalizeBlock(context.Context, *RequestFinalizeBlock) (*ResponseFinalizeBlock, error) CreateOracleResultTx(context.Context, *RequestCreateOracleResultTx) (*ResponseCreateOracleResultTx, error) FetchOracleVotes(context.Context, *RequestFetchOracleVotes) (*ResponseFetchOracleVotes, error) + ValidateOracleVotes(context.Context, *RequestValidateOracleVotes) (*ResponseValidateOracleVotes, error) } // UnimplementedABCIServer can be embedded to have forward compatible implementations. @@ -4386,6 +4545,9 @@ func (*UnimplementedABCIServer) CreateOracleResultTx(ctx context.Context, req *R func (*UnimplementedABCIServer) FetchOracleVotes(ctx context.Context, req *RequestFetchOracleVotes) (*ResponseFetchOracleVotes, error) { return nil, status.Errorf(codes.Unimplemented, "method FetchOracleVotes not implemented") } +func (*UnimplementedABCIServer) ValidateOracleVotes(ctx context.Context, req *RequestValidateOracleVotes) (*ResponseValidateOracleVotes, error) { + return nil, status.Errorf(codes.Unimplemented, "method ValidateOracleVotes not implemented") +} func RegisterABCIServer(s grpc1.Server, srv ABCIServer) { s.RegisterService(&_ABCI_serviceDesc, srv) @@ -4715,6 +4877,24 @@ func _ABCI_FetchOracleVotes_Handler(srv interface{}, ctx context.Context, dec fu return interceptor(ctx, in, info, handler) } +func _ABCI_ValidateOracleVotes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestValidateOracleVotes) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ABCIServer).ValidateOracleVotes(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tendermint.abci.ABCI/ValidateOracleVotes", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ABCIServer).ValidateOracleVotes(ctx, req.(*RequestValidateOracleVotes)) + } + return interceptor(ctx, in, info, handler) +} + var _ABCI_serviceDesc = grpc.ServiceDesc{ ServiceName: "tendermint.abci.ABCI", HandlerType: (*ABCIServer)(nil), @@ -4791,6 +4971,10 @@ var _ABCI_serviceDesc = grpc.ServiceDesc{ MethodName: "FetchOracleVotes", Handler: _ABCI_FetchOracleVotes_Handler, }, + { + MethodName: "ValidateOracleVotes", + Handler: _ABCI_ValidateOracleVotes_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "tendermint/abci/types.proto", @@ -5220,6 +5404,29 @@ func (m *Request_FetchOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error } return len(dAtA) - i, nil } +func (m *Request_ValidateOracleVotes) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Request_ValidateOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.ValidateOracleVotes != nil { + { + size, err := m.ValidateOracleVotes.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xba + } + return len(dAtA) - i, nil +} func (m *RequestEcho) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -5385,12 +5592,12 @@ func (m *RequestInitChain) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x12 } - n20, err20 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err20 != nil { - return 0, err20 + n21, err21 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err21 != nil { + return 0, err21 } - i -= n20 - i = encodeVarintTypes(dAtA, i, uint64(n20)) + i -= n21 + i = encodeVarintTypes(dAtA, i, uint64(n21)) i-- dAtA[i] = 0xa return len(dAtA) - i, nil @@ -5685,12 +5892,12 @@ func (m *RequestPrepareProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x3a } - n22, err22 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err22 != nil { - return 0, err22 + n23, err23 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err23 != nil { + return 0, err23 } - i -= n22 - i = encodeVarintTypes(dAtA, i, uint64(n22)) + i -= n23 + i = encodeVarintTypes(dAtA, i, uint64(n23)) i-- dAtA[i] = 0x32 if m.Height != 0 { @@ -5773,12 +5980,12 @@ func (m *RequestProcessProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x3a } - n24, err24 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err24 != nil { - return 0, err24 + n25, err25 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err25 != nil { + return 0, err25 } - i -= n24 - i = encodeVarintTypes(dAtA, i, uint64(n24)) + i -= n25 + i = encodeVarintTypes(dAtA, i, uint64(n25)) i-- dAtA[i] = 0x32 if m.Height != 0 { @@ -5896,12 +6103,12 @@ func (m *RequestExtendVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x22 } } - n27, err27 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err27 != nil { - return 0, err27 + n28, err28 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err28 != nil { + return 0, err28 } - i -= n27 - i = encodeVarintTypes(dAtA, i, uint64(n27)) + i -= n28 + i = encodeVarintTypes(dAtA, i, uint64(n28)) i-- dAtA[i] = 0x1a if m.Height != 0 { @@ -6002,12 +6209,12 @@ func (m *RequestFinalizeBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x3a } - n28, err28 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err28 != nil { - return 0, err28 + n29, err29 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err29 != nil { + return 0, err29 } - i -= n28 - i = encodeVarintTypes(dAtA, i, uint64(n28)) + i -= n29 + i = encodeVarintTypes(dAtA, i, uint64(n29)) i-- dAtA[i] = 0x32 if m.Height != 0 { @@ -6118,6 +6325,36 @@ func (m *RequestFetchOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } +func (m *RequestValidateOracleVotes) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RequestValidateOracleVotes) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RequestValidateOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.OracleTx) > 0 { + i -= len(m.OracleTx) + copy(dAtA[i:], m.OracleTx) + i = encodeVarintTypes(dAtA, i, uint64(len(m.OracleTx))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *Response) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -6565,6 +6802,29 @@ func (m *Response_FetchOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, erro } return len(dAtA) - i, nil } +func (m *Response_ValidateOracleVotes) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Response_ValidateOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.ValidateOracleVotes != nil { + { + size, err := m.ValidateOracleVotes.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xc2 + } + return len(dAtA) - i, nil +} func (m *ResponseException) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -7076,20 +7336,20 @@ func (m *ResponseApplySnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, err } } if len(m.RefetchChunks) > 0 { - dAtA52 := make([]byte, len(m.RefetchChunks)*10) - var j51 int + dAtA54 := make([]byte, len(m.RefetchChunks)*10) + var j53 int for _, num := range m.RefetchChunks { for num >= 1<<7 { - dAtA52[j51] = uint8(uint64(num)&0x7f | 0x80) + dAtA54[j53] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j51++ + j53++ } - dAtA52[j51] = uint8(num) - j51++ + dAtA54[j53] = uint8(num) + j53++ } - i -= j51 - copy(dAtA[i:], dAtA52[:j51]) - i = encodeVarintTypes(dAtA, i, uint64(j51)) + i -= j53 + copy(dAtA[i:], dAtA54[:j53]) + i = encodeVarintTypes(dAtA, i, uint64(j53)) i-- dAtA[i] = 0x12 } @@ -7368,6 +7628,34 @@ func (m *ResponseFetchOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error return len(dAtA) - i, nil } +func (m *ResponseValidateOracleVotes) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResponseValidateOracleVotes) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResponseValidateOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Status != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Status)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *CommitInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -7861,12 +8149,12 @@ func (m *Misbehavior) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x28 } - n59, err59 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err59 != nil { - return 0, err59 + n61, err61 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err61 != nil { + return 0, err61 } - i -= n59 - i = encodeVarintTypes(dAtA, i, uint64(n59)) + i -= n61 + i = encodeVarintTypes(dAtA, i, uint64(n61)) i-- dAtA[i] = 0x22 if m.Height != 0 { @@ -8183,6 +8471,18 @@ func (m *Request_FetchOracleVotes) Size() (n int) { } return n } +func (m *Request_ValidateOracleVotes) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ValidateOracleVotes != nil { + l = m.ValidateOracleVotes.Size() + n += 2 + l + sovTypes(uint64(l)) + } + return n +} func (m *RequestEcho) Size() (n int) { if m == nil { return 0 @@ -8579,6 +8879,19 @@ func (m *RequestFetchOracleVotes) Size() (n int) { return n } +func (m *RequestValidateOracleVotes) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.OracleTx) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + func (m *Response) Size() (n int) { if m == nil { return 0 @@ -8819,6 +9132,18 @@ func (m *Response_FetchOracleVotes) Size() (n int) { } return n } +func (m *Response_ValidateOracleVotes) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ValidateOracleVotes != nil { + l = m.ValidateOracleVotes.Size() + n += 2 + l + sovTypes(uint64(l)) + } + return n +} func (m *ResponseException) Size() (n int) { if m == nil { return 0 @@ -9176,6 +9501,18 @@ func (m *ResponseFetchOracleVotes) Size() (n int) { return n } +func (m *ResponseValidateOracleVotes) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Status != 0 { + n += 1 + sovTypes(uint64(m.Status)) + } + return n +} + func (m *CommitInfo) Size() (n int) { if m == nil { return 0 @@ -10091,6 +10428,41 @@ func (m *Request) Unmarshal(dAtA []byte) error { } m.Value = &Request_FetchOracleVotes{v} iNdEx = postIndex + case 23: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidateOracleVotes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RequestValidateOracleVotes{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Request_ValidateOracleVotes{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -12856,6 +13228,90 @@ func (m *RequestFetchOracleVotes) Unmarshal(dAtA []byte) error { } return nil } +func (m *RequestValidateOracleVotes) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestValidateOracleVotes: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestValidateOracleVotes: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OracleTx", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.OracleTx = append(m.OracleTx[:0], dAtA[iNdEx:postIndex]...) + if m.OracleTx == nil { + m.OracleTx = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Response) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -13550,6 +14006,41 @@ func (m *Response) Unmarshal(dAtA []byte) error { } m.Value = &Response_FetchOracleVotes{v} iNdEx = postIndex + case 24: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidateOracleVotes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &ResponseValidateOracleVotes{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Response_ValidateOracleVotes{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -15882,6 +16373,75 @@ func (m *ResponseFetchOracleVotes) Unmarshal(dAtA []byte) error { } return nil } +func (m *ResponseValidateOracleVotes) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResponseValidateOracleVotes: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResponseValidateOracleVotes: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + m.Status = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Status |= ResponseValidateOracleVotes_Status(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *CommitInfo) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto index ec79ba98691..618124bdacf 100644 --- a/proto/tendermint/abci/types.proto +++ b/proto/tendermint/abci/types.proto @@ -37,6 +37,7 @@ service ABCI { rpc FinalizeBlock(RequestFinalizeBlock) returns (ResponseFinalizeBlock); rpc CreateOracleResultTx(RequestCreateOracleResultTx) returns (ResponseCreateOracleResultTx); rpc FetchOracleVotes(RequestFetchOracleVotes) returns (ResponseFetchOracleVotes); + rpc ValidateOracleVotes(RequestValidateOracleVotes) returns (ResponseValidateOracleVotes); } //---------------------------------------- @@ -62,6 +63,7 @@ message Request { RequestFinalizeBlock finalize_block = 20; RequestCreateOracleResultTx create_oracle_result_tx = 21; RequestFetchOracleVotes fetch_oracle_votes = 22; + RequestValidateOracleVotes validate_oracle_votes = 23; } reserved 4, 7, 9, 10; // SetOption, BeginBlock, DeliverTx, EndBlock } @@ -204,6 +206,10 @@ message RequestCreateOracleResultTx { message RequestFetchOracleVotes {} +message RequestValidateOracleVotes { + bytes oracle_tx = 1; +} + //---------------------------------------- // Response types @@ -228,6 +234,7 @@ message Response { ResponseFinalizeBlock finalize_block = 21; ResponseCreateOracleResultTx create_oracle_result_tx = 22; ResponseFetchOracleVotes fetch_oracle_votes = 23; + ResponseValidateOracleVotes validate_oracle_votes = 24; } reserved 5, 8, 10, 11; // SetOption, BeginBlock, DeliverTx, EndBlock } @@ -386,6 +393,15 @@ message ResponseFetchOracleVotes { tendermint.oracle.Vote vote = 1; } +message ResponseValidateOracleVotes { + Status status = 1; + + enum Status { + absent = 0; + present = 1; + } +} + //---------------------------------------- // Misc. diff --git a/proxy/app_conn.go b/proxy/app_conn.go index ab474d73e71..6d411b91c29 100644 --- a/proxy/app_conn.go +++ b/proxy/app_conn.go @@ -26,6 +26,7 @@ type AppConnConsensus interface { Commit(context.Context) (*types.ResponseCommit, error) CreateOracleResultTx(context.Context, *types.RequestCreateOracleResultTx) (*types.ResponseCreateOracleResultTx, error) FetchOracleVotes(context.Context, *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error) + ValidateOracleVotes(context.Context, *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) } type AppConnMempool interface { @@ -121,6 +122,11 @@ func (app *appConnConsensus) FetchOracleVotes(ctx context.Context, req *types.Re return app.appConn.FetchOracleVotes(ctx, req) } +func (app *appConnConsensus) ValidateOracleVotes(ctx context.Context, req *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) { + defer addTimeSample(app.metrics.MethodTimingSeconds.With("method", "commit", "type", "sync"))() + return app.appConn.ValidateOracleVotes(ctx, req) +} + //------------------------------------------------ // Implements AppConnMempool (subset of abcicli.Client) diff --git a/proxy/mocks/app_conn_consensus.go b/proxy/mocks/app_conn_consensus.go index b4269dd0f41..5b4e653e0ec 100644 --- a/proxy/mocks/app_conn_consensus.go +++ b/proxy/mocks/app_conn_consensus.go @@ -237,6 +237,32 @@ func (_m *AppConnConsensus) CreateOracleResultTx(_a0 context.Context, _a1 *types return r0, r1 } +// ValidateOracleVotes provides a mock function with given fields: _a0, _a1 +func (_m *AppConnConsensus) ValidateOracleVotes(_a0 context.Context, _a1 *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseValidateOracleVotes + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestValidateOracleVotes) *types.ResponseValidateOracleVotes); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseValidateOracleVotes) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestValidateOracleVotes) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // VerifyVoteExtension provides a mock function with given fields: _a0, _a1 func (_m *AppConnConsensus) VerifyVoteExtension(_a0 context.Context, _a1 *types.RequestVerifyVoteExtension) (*types.ResponseVerifyVoteExtension, error) { ret := _m.Called(_a0, _a1) diff --git a/state/execution.go b/state/execution.go index 1f1f8963899..2ae6d5c4d05 100644 --- a/state/execution.go +++ b/state/execution.go @@ -202,6 +202,20 @@ func (blockExec *BlockExecutor) ProcessProposal( block *types.Block, state State, ) (bool, error) { + txs := block.Data.Txs.ToSliceOfBytes() + if len(txs) > 0 { + res, err := blockExec.proxyApp.ValidateOracleVotes(context.Background(), &abci.RequestValidateOracleVotes{OracleTx: txs[0]}) + + if err != nil && res.Status == abci.ResponseValidateOracleVotes_absent { + // oracleTx is not present, continue normal processProposal flow + blockExec.logger.Error("error validating oracle votes:", "err", err) + } else if err != nil && res.Status == abci.ResponseValidateOracleVotes_present { + // oracleTx is present but it is invalid, remove from txs + blockExec.logger.Error("error validating oracle votes:", "err", err) + return false, fmt.Errorf("processProposal: invalid oracle votes submitted: %v", err) + } + } + resp, err := blockExec.proxyApp.ProcessProposal(context.TODO(), &abci.RequestProcessProposal{ Hash: block.Header.Hash(), Height: block.Header.Height, From 3144a6b7181c4a0e34840f6b647f3ed02bdd3571 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 10 May 2024 02:56:59 +0800 Subject: [PATCH 120/150] resolve comments and minor fixes --- oracle/reactor.go | 1 - oracle/service/runner/runner.go | 23 +++++++++-------------- state/execution.go | 11 +++++------ 3 files changed, 14 insertions(+), 21 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 9f3ebf804c9..6e2f1618c54 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -228,7 +228,6 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { Message: gossipVote, }) if !success { - time.Sleep(PeerCatchupSleepIntervalMS * time.Millisecond) break } } diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 501085cb2b6..215c98ec7cc 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -16,16 +16,17 @@ import ( ) func RunProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State) { + interval := oracleInfo.Config.SignInterval + if interval == 0 { + interval = 100 * time.Millisecond + } + go func(oracleInfo *types.OracleInfo) { for { select { case <-oracleInfo.StopChannel: return default: - interval := oracleInfo.Config.SignInterval - if interval == 0 { - interval = 100 * time.Millisecond - } time.Sleep(interval) ProcessSignVoteQueue(oracleInfo, consensusState) } @@ -35,14 +36,8 @@ func RunProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.St func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State) { votes := []*oracleproto.Vote{} - for { - select { - case vote := <-oracleInfo.SignVotesChan: - votes = append(votes, vote) - continue - default: - } - break + for vote := range oracleInfo.SignVotesChan { + votes = append(votes, vote) } if len(votes) == 0 { @@ -66,6 +61,8 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State unsignedVotes = append(unsignedVotes, vote) } + oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() + // sort the votes so that we can rebuild it in a deterministic order, when uncompressing SortOracleVotes(unsignedVotes) @@ -77,8 +74,6 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State Votes: unsignedVotes, } - oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() - // signing of vote should append the signature field of gossipVote if err := oracleInfo.PrivValidator.SignOracleVote("", newGossipVote); err != nil { log.Errorf("processSignVoteQueue: error signing oracle votes") diff --git a/state/execution.go b/state/execution.go index 2ae6d5c4d05..77f3cdc21ef 100644 --- a/state/execution.go +++ b/state/execution.go @@ -134,7 +134,7 @@ func (blockExec *BlockExecutor) CreateProposalBlock( oracleVotesBuffer := blockExec.oracleInfo.GossipVoteBuffer.Buffer blockExec.oracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() - var CreateOracleResultTxBz []byte + var createOracleResultTxBz []byte if len(oracleVotesBuffer) > 0 { votes := []*oracleproto.GossipedVotes{} for _, vote := range oracleVotesBuffer { @@ -147,18 +147,17 @@ func (blockExec *BlockExecutor) CreateProposalBlock( if err != nil { blockExec.logger.Error("error in proxyAppConn.CreateOracleResultTx", "err", err) } else { - CreateOracleResultTxBz = resp.EncodedTx + createOracleResultTxBz = resp.EncodedTx } } txs := blockExec.mempool.ReapMaxBytesMaxGas(maxReapBytes, maxGas) commit := lastExtCommit.ToCommit() - if len(CreateOracleResultTxBz) > 0 { - txs = types.Txs{} - maxReapBytes -= int64(len(CreateOracleResultTxBz)) + if len(createOracleResultTxBz) > 0 { + maxReapBytes -= int64(len(createOracleResultTxBz)) txs = blockExec.mempool.ReapMaxBytesMaxGas(maxReapBytes, maxGas) - CreateOracleResultTx := types.Tx(CreateOracleResultTxBz) + CreateOracleResultTx := types.Tx(createOracleResultTxBz) txs = append([]types.Tx{CreateOracleResultTx}, txs...) } From 2ee55784f5df9d61bb7b7dfc5f85003192514c0c Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 10 May 2024 15:26:36 +0800 Subject: [PATCH 121/150] update fetchOracleVotes hook to take in multiple votes at once --- abci/types/types.pb.go | 488 +++++++++++++++--------------- oracle/reactor.go | 2 +- oracle/service/runner/runner.go | 18 +- oracle/service/types/info.go | 2 +- proto/tendermint/abci/types.proto | 2 +- 5 files changed, 259 insertions(+), 253 deletions(-) diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go index 6f4b9a40d7e..02308642ffd 100644 --- a/abci/types/types.pb.go +++ b/abci/types/types.pb.go @@ -3091,7 +3091,7 @@ func (m *ResponseCreateOracleResultTx) GetEncodedTx() []byte { } type ResponseFetchOracleVotes struct { - Vote *oracle.Vote `protobuf:"bytes,1,opt,name=vote,proto3" json:"vote,omitempty"` + Votes []*oracle.Vote `protobuf:"bytes,1,rep,name=votes,proto3" json:"votes,omitempty"` } func (m *ResponseFetchOracleVotes) Reset() { *m = ResponseFetchOracleVotes{} } @@ -3127,9 +3127,9 @@ func (m *ResponseFetchOracleVotes) XXX_DiscardUnknown() { var xxx_messageInfo_ResponseFetchOracleVotes proto.InternalMessageInfo -func (m *ResponseFetchOracleVotes) GetVote() *oracle.Vote { +func (m *ResponseFetchOracleVotes) GetVotes() []*oracle.Vote { if m != nil { - return m.Vote + return m.Votes } return nil } @@ -4031,225 +4031,225 @@ func init() { func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) } var fileDescriptor_252557cfdd89a31a = []byte{ - // 3486 bytes of a gzipped FileDescriptorProto + // 3483 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcd, 0x8f, 0x1b, 0xc7, - 0xb1, 0xe7, 0xf0, 0x6b, 0xc9, 0xe2, 0xc7, 0xce, 0xf6, 0xae, 0x24, 0x8a, 0x92, 0x76, 0x57, 0x63, - 0xd8, 0x96, 0x25, 0x7b, 0xd7, 0x4f, 0x7a, 0xb2, 0x2d, 0xc8, 0x7e, 0xc0, 0x2e, 0x45, 0x89, 0xbb, - 0x92, 0x77, 0xd7, 0xb3, 0x94, 0xfc, 0xf4, 0x5e, 0xe2, 0xf1, 0x90, 0x6c, 0x92, 0x63, 0x91, 0x9c, - 0xf1, 0xcc, 0x70, 0xcd, 0xf5, 0x29, 0x88, 0x13, 0x20, 0x30, 0x10, 0xc0, 0x40, 0x2e, 0x3e, 0xc4, - 0x87, 0x1c, 0x72, 0xc9, 0x5f, 0x10, 0x20, 0x40, 0x4e, 0x39, 0xf8, 0x90, 0x83, 0x8f, 0x39, 0x39, - 0x81, 0x75, 0x33, 0x90, 0x53, 0x0e, 0xb9, 0x06, 0xfd, 0x31, 0x5f, 0xe4, 0x0c, 0x3f, 0x64, 0xe7, - 0x10, 0x24, 0xb7, 0xe9, 0x62, 0x55, 0x75, 0x77, 0x75, 0x75, 0x57, 0xf5, 0xaf, 0x9a, 0x70, 0xc1, - 0xc6, 0x83, 0x16, 0x36, 0xfb, 0xda, 0xc0, 0xde, 0x56, 0x1b, 0x4d, 0x6d, 0xdb, 0x3e, 0x35, 0xb0, - 0xb5, 0x65, 0x98, 0xba, 0xad, 0xa3, 0x65, 0xef, 0xc7, 0x2d, 0xf2, 0x63, 0xf9, 0x92, 0x8f, 0xbb, - 0x69, 0x9e, 0x1a, 0xb6, 0xbe, 0x6d, 0x98, 0xba, 0xde, 0x66, 0xfc, 0xe5, 0x8b, 0x93, 0x3f, 0x3f, - 0xc1, 0xa7, 0x5c, 0x5b, 0x40, 0x98, 0xf6, 0xb2, 0x6d, 0xa8, 0xa6, 0xda, 0x77, 0x7e, 0xde, 0x9c, - 0xf8, 0xf9, 0x44, 0xed, 0x69, 0x2d, 0xd5, 0xd6, 0x4d, 0xce, 0xb1, 0xd1, 0xd1, 0xf5, 0x4e, 0x0f, - 0x6f, 0xd3, 0x56, 0x63, 0xd8, 0xde, 0xb6, 0xb5, 0x3e, 0xb6, 0x6c, 0xb5, 0x6f, 0x70, 0x86, 0xb5, - 0x8e, 0xde, 0xd1, 0xe9, 0xe7, 0x36, 0xf9, 0x0a, 0xe9, 0x57, 0x37, 0xd5, 0x66, 0x0f, 0xfb, 0x27, - 0x29, 0x3d, 0xcd, 0xc1, 0x92, 0x8c, 0x3f, 0x1c, 0x62, 0xcb, 0x46, 0xd7, 0x21, 0x89, 0x9b, 0x5d, - 0xbd, 0x24, 0x6c, 0x0a, 0x57, 0x72, 0xd7, 0x2f, 0x6e, 0x8d, 0xcd, 0x7f, 0x8b, 0xf3, 0x55, 0x9b, - 0x5d, 0xbd, 0x16, 0x93, 0x29, 0x2f, 0xba, 0x09, 0xa9, 0x76, 0x6f, 0x68, 0x75, 0x4b, 0x71, 0x2a, - 0x74, 0x29, 0x4a, 0xe8, 0x2e, 0x61, 0xaa, 0xc5, 0x64, 0xc6, 0x4d, 0xba, 0xd2, 0x06, 0x6d, 0xbd, - 0x94, 0x98, 0xde, 0xd5, 0xde, 0xa0, 0x4d, 0xbb, 0x22, 0xbc, 0x68, 0x17, 0x40, 0x1b, 0x68, 0xb6, - 0xd2, 0xec, 0xaa, 0xda, 0xa0, 0x94, 0xa2, 0x92, 0x97, 0xa3, 0x25, 0x35, 0xbb, 0x42, 0x18, 0x6b, - 0x31, 0x39, 0xab, 0x39, 0x0d, 0x32, 0xdc, 0x0f, 0x87, 0xd8, 0x3c, 0x2d, 0xa5, 0xa7, 0x0f, 0xf7, - 0x1d, 0xc2, 0x44, 0x86, 0x4b, 0xb9, 0xd1, 0x9b, 0x90, 0x69, 0x76, 0x71, 0xf3, 0x89, 0x62, 0x8f, - 0x4a, 0x19, 0x2a, 0xb9, 0x11, 0x25, 0x59, 0x21, 0x7c, 0xf5, 0x51, 0x2d, 0x26, 0x2f, 0x35, 0xd9, - 0x27, 0x7a, 0x03, 0xd2, 0x4d, 0xbd, 0xdf, 0xd7, 0xec, 0x52, 0x8e, 0xca, 0xae, 0x47, 0xca, 0x52, - 0xae, 0x5a, 0x4c, 0xe6, 0xfc, 0xe8, 0x00, 0x8a, 0x3d, 0xcd, 0xb2, 0x15, 0x6b, 0xa0, 0x1a, 0x56, - 0x57, 0xb7, 0xad, 0x52, 0x9e, 0x6a, 0x78, 0x3e, 0x4a, 0xc3, 0x03, 0xcd, 0xb2, 0x8f, 0x1d, 0xe6, - 0x5a, 0x4c, 0x2e, 0xf4, 0xfc, 0x04, 0xa2, 0x4f, 0x6f, 0xb7, 0xb1, 0xe9, 0x2a, 0x2c, 0x15, 0xa6, - 0xeb, 0x3b, 0x24, 0xdc, 0x8e, 0x3c, 0xd1, 0xa7, 0xfb, 0x09, 0xe8, 0xff, 0x61, 0xb5, 0xa7, 0xab, - 0x2d, 0x57, 0x9d, 0xd2, 0xec, 0x0e, 0x07, 0x4f, 0x4a, 0x45, 0xaa, 0xf4, 0xa5, 0xc8, 0x41, 0xea, - 0x6a, 0xcb, 0x51, 0x51, 0x21, 0x02, 0xb5, 0x98, 0xbc, 0xd2, 0x1b, 0x27, 0xa2, 0xf7, 0x60, 0x4d, - 0x35, 0x8c, 0xde, 0xe9, 0xb8, 0xf6, 0x65, 0xaa, 0xfd, 0x6a, 0x94, 0xf6, 0x1d, 0x22, 0x33, 0xae, - 0x1e, 0xa9, 0x13, 0x54, 0x54, 0x07, 0xd1, 0x30, 0xb1, 0xa1, 0x9a, 0x58, 0x31, 0x4c, 0xdd, 0xd0, - 0x2d, 0xb5, 0x57, 0x12, 0xa9, 0xee, 0x17, 0xa3, 0x74, 0x1f, 0x31, 0xfe, 0x23, 0xce, 0x5e, 0x8b, - 0xc9, 0xcb, 0x46, 0x90, 0xc4, 0xb4, 0xea, 0x4d, 0x6c, 0x59, 0x9e, 0xd6, 0x95, 0x59, 0x5a, 0x29, - 0x7f, 0x50, 0x6b, 0x80, 0x84, 0xaa, 0x90, 0xc3, 0x23, 0x22, 0xae, 0x9c, 0xe8, 0x36, 0x2e, 0x21, - 0xaa, 0x50, 0x8a, 0xdc, 0xa1, 0x94, 0xf5, 0x91, 0x6e, 0xe3, 0x5a, 0x4c, 0x06, 0xec, 0xb6, 0x90, - 0x0a, 0x67, 0x4e, 0xb0, 0xa9, 0xb5, 0x4f, 0xa9, 0x1a, 0x85, 0xfe, 0x62, 0x69, 0xfa, 0xa0, 0xb4, - 0x4a, 0x15, 0x5e, 0x8b, 0x52, 0xf8, 0x88, 0x0a, 0x11, 0x15, 0x55, 0x47, 0xa4, 0x16, 0x93, 0x57, - 0x4f, 0x26, 0xc9, 0xc4, 0xc5, 0xda, 0xda, 0x40, 0xed, 0x69, 0x1f, 0x63, 0xa5, 0xd1, 0xd3, 0x9b, - 0x4f, 0x4a, 0x6b, 0xd3, 0x5d, 0xec, 0x2e, 0xe7, 0xde, 0x25, 0xcc, 0xc4, 0xc5, 0xda, 0x7e, 0x02, - 0xc2, 0x70, 0xae, 0x69, 0x62, 0xd5, 0xc6, 0x0a, 0x3b, 0xbd, 0x14, 0x13, 0x5b, 0xc3, 0x9e, 0x4d, - 0x76, 0xe2, 0x19, 0xaa, 0xf8, 0xe5, 0xc8, 0xdd, 0x44, 0xc5, 0x0e, 0xa9, 0x94, 0x4c, 0x85, 0xe8, - 0xb6, 0x5c, 0x6b, 0x86, 0xd0, 0xd1, 0xff, 0x02, 0x6a, 0x63, 0xbb, 0xd9, 0x75, 0x7a, 0x21, 0xf6, - 0xb1, 0x4a, 0x67, 0x69, 0x0f, 0x57, 0x22, 0x87, 0x4e, 0x24, 0x98, 0x22, 0x62, 0x04, 0xb2, 0xe1, - 0xc4, 0xf6, 0x18, 0x8d, 0xda, 0x9c, 0x1d, 0xe5, 0x38, 0xa8, 0xfc, 0xdc, 0x0c, 0x9b, 0x73, 0xa1, - 0xa0, 0xfe, 0xd5, 0x93, 0x49, 0xf2, 0xee, 0x12, 0xa4, 0x4e, 0xd4, 0xde, 0x10, 0xef, 0x27, 0x33, - 0x49, 0x31, 0xb5, 0x9f, 0xcc, 0x2c, 0x89, 0x99, 0xfd, 0x64, 0x26, 0x2b, 0xc2, 0x7e, 0x32, 0x03, - 0x62, 0x4e, 0x7a, 0x11, 0x72, 0xbe, 0xc3, 0x1b, 0x95, 0x60, 0xa9, 0x8f, 0x2d, 0x4b, 0xed, 0x60, - 0x7a, 0xd6, 0x67, 0x65, 0xa7, 0x29, 0x15, 0x21, 0xef, 0x3f, 0xb0, 0xa5, 0xcf, 0x04, 0x57, 0x92, - 0x9c, 0xc5, 0x44, 0xf2, 0x04, 0x9b, 0xd4, 0x65, 0xb8, 0x24, 0x6f, 0xa2, 0xe7, 0xa0, 0x40, 0x97, - 0x5b, 0x71, 0x7e, 0x27, 0x01, 0x21, 0x29, 0xe7, 0x29, 0xf1, 0x11, 0x67, 0xda, 0x80, 0x9c, 0x71, - 0xdd, 0x70, 0x59, 0x12, 0x94, 0x05, 0x8c, 0xeb, 0x86, 0xc3, 0x70, 0x19, 0xf2, 0xc4, 0x06, 0x2e, - 0x47, 0x92, 0x76, 0x92, 0x23, 0x34, 0xce, 0x22, 0xfd, 0x31, 0x0e, 0xe2, 0xf8, 0x21, 0x8f, 0xde, - 0x80, 0x24, 0x09, 0x87, 0x3c, 0x74, 0x95, 0xb7, 0x58, 0xac, 0xdc, 0x72, 0x62, 0xe5, 0x56, 0xdd, - 0x89, 0x95, 0xbb, 0x99, 0x2f, 0xbf, 0xde, 0x88, 0x7d, 0xf6, 0xe7, 0x0d, 0x41, 0xa6, 0x12, 0xe8, - 0x3c, 0x39, 0xda, 0x55, 0x6d, 0xa0, 0x68, 0x2d, 0x3a, 0xe4, 0x2c, 0x39, 0xb7, 0x55, 0x6d, 0xb0, - 0xd7, 0x42, 0x0f, 0x40, 0x6c, 0xea, 0x03, 0x0b, 0x0f, 0xac, 0xa1, 0xa5, 0xb0, 0x68, 0xcd, 0x03, - 0x56, 0x20, 0xec, 0xb0, 0x70, 0x5a, 0x71, 0x38, 0x8f, 0x28, 0xa3, 0xbc, 0xdc, 0x0c, 0x12, 0xd0, - 0x5d, 0x00, 0x37, 0xa4, 0x5b, 0xa5, 0xe4, 0x66, 0xe2, 0x4a, 0xee, 0xfa, 0xe6, 0xc4, 0xe2, 0x3f, - 0x72, 0x58, 0x1e, 0x1a, 0x64, 0x95, 0x77, 0x93, 0x64, 0xb8, 0xb2, 0x4f, 0x12, 0xbd, 0x00, 0xcb, - 0xaa, 0x61, 0x28, 0x96, 0x4d, 0x1c, 0xaa, 0x71, 0x4a, 0x3c, 0x89, 0xc4, 0xc2, 0xbc, 0x5c, 0x50, - 0x0d, 0xe3, 0x98, 0x50, 0x77, 0x09, 0x11, 0x3d, 0x0f, 0x45, 0x12, 0xf7, 0x34, 0xb5, 0xa7, 0x74, - 0xb1, 0xd6, 0xe9, 0xda, 0x34, 0xe6, 0x25, 0xe4, 0x02, 0xa7, 0xd6, 0x28, 0x51, 0x6a, 0xb9, 0x2b, - 0x4e, 0x63, 0x1e, 0x42, 0x90, 0x6c, 0xa9, 0xb6, 0x4a, 0x2d, 0x99, 0x97, 0xe9, 0x37, 0xa1, 0x19, - 0xaa, 0xdd, 0xe5, 0xf6, 0xa1, 0xdf, 0xe8, 0x2c, 0xa4, 0xb9, 0xda, 0x04, 0x55, 0xcb, 0x5b, 0x68, - 0x0d, 0x52, 0x86, 0xa9, 0x9f, 0x60, 0xba, 0x74, 0x19, 0x99, 0x35, 0x24, 0x19, 0x8a, 0xc1, 0xf8, - 0x88, 0x8a, 0x10, 0xb7, 0x47, 0xbc, 0x97, 0xb8, 0x3d, 0x42, 0xaf, 0x42, 0x92, 0x18, 0x92, 0xf6, - 0x51, 0x0c, 0xc9, 0x08, 0xb8, 0x5c, 0xfd, 0xd4, 0xc0, 0x32, 0xe5, 0x94, 0x96, 0xa1, 0x10, 0x88, - 0x9b, 0xd2, 0x59, 0x58, 0x0b, 0x0b, 0x83, 0x52, 0xd7, 0xa5, 0x07, 0xc2, 0x19, 0xba, 0x09, 0x19, - 0x37, 0x0e, 0x32, 0xc7, 0x39, 0x3f, 0xd1, 0xad, 0xc3, 0x2c, 0xbb, 0xac, 0xc4, 0x63, 0xc8, 0x02, - 0x74, 0x55, 0x9e, 0xf5, 0xe4, 0xe5, 0x25, 0xd5, 0x30, 0x6a, 0xaa, 0xd5, 0x95, 0xde, 0x87, 0x52, - 0x54, 0x8c, 0xf3, 0x19, 0x4c, 0xa0, 0x6e, 0xef, 0x18, 0xec, 0x2c, 0xa4, 0xdb, 0xba, 0xd9, 0x57, - 0x6d, 0xaa, 0xac, 0x20, 0xf3, 0x16, 0x31, 0x24, 0x8b, 0x77, 0x09, 0x4a, 0x66, 0x0d, 0x49, 0x81, - 0xf3, 0x91, 0x71, 0x8e, 0x88, 0x68, 0x83, 0x16, 0x66, 0x66, 0x2d, 0xc8, 0xac, 0xe1, 0x29, 0x62, - 0x83, 0x65, 0x0d, 0xd2, 0xad, 0x45, 0xe7, 0x4a, 0xf5, 0x67, 0x65, 0xde, 0x92, 0x3e, 0x4f, 0xc0, - 0xd9, 0xf0, 0x68, 0x87, 0x36, 0x21, 0xdf, 0x57, 0x47, 0x8a, 0x3d, 0xe2, 0x6e, 0x27, 0xd0, 0x85, - 0x87, 0xbe, 0x3a, 0xaa, 0x8f, 0x98, 0xcf, 0x89, 0x90, 0xb0, 0x47, 0x56, 0x29, 0xbe, 0x99, 0xb8, - 0x92, 0x97, 0xc9, 0x27, 0x7a, 0x08, 0x2b, 0x3d, 0xbd, 0xa9, 0xf6, 0x94, 0x9e, 0x6a, 0xd9, 0x0a, - 0x4f, 0x83, 0xd8, 0x26, 0x7a, 0x6e, 0xc2, 0xd8, 0x2c, 0x6e, 0xe1, 0x16, 0x5b, 0x4f, 0x72, 0xe0, - 0x70, 0xff, 0x5f, 0xa6, 0x3a, 0x1e, 0xa8, 0xce, 0x52, 0xa3, 0x3b, 0x90, 0xeb, 0x6b, 0x56, 0x03, - 0x77, 0xd5, 0x13, 0x4d, 0x37, 0xf9, 0x6e, 0x9a, 0x74, 0x9a, 0xb7, 0x3d, 0x1e, 0xae, 0xc9, 0x2f, - 0xe6, 0x5b, 0x92, 0x54, 0xc0, 0x87, 0x9d, 0xd3, 0x24, 0xbd, 0xf0, 0x69, 0xf2, 0x2a, 0xac, 0x0d, - 0xf0, 0xc8, 0x56, 0xbc, 0xfd, 0xca, 0xfc, 0x64, 0x89, 0x9a, 0x1e, 0x91, 0xdf, 0xdc, 0x1d, 0x6e, - 0x11, 0x97, 0x41, 0x2f, 0xd1, 0x7c, 0xc1, 0xd0, 0x2d, 0x6c, 0x2a, 0x6a, 0xab, 0x65, 0x62, 0xcb, - 0xa2, 0x29, 0x66, 0x9e, 0x26, 0x01, 0x94, 0xbe, 0xc3, 0xc8, 0xd2, 0xcf, 0xfc, 0x4b, 0x13, 0xcc, - 0x0f, 0xb8, 0xe1, 0x05, 0xcf, 0xf0, 0xc7, 0xb0, 0xc6, 0xe5, 0x5b, 0x01, 0xdb, 0xb3, 0x3c, 0xfd, - 0xc2, 0xe4, 0xfe, 0x1a, 0xb7, 0x39, 0x72, 0xc4, 0xa3, 0xcd, 0x9e, 0x78, 0x36, 0xb3, 0x23, 0x48, - 0x52, 0xa3, 0x24, 0xd9, 0x11, 0x43, 0xbe, 0xff, 0xd5, 0x96, 0xe2, 0x93, 0x04, 0xac, 0x4c, 0x24, - 0x5b, 0xee, 0xc4, 0x84, 0xd0, 0x89, 0xc5, 0x43, 0x27, 0x96, 0x58, 0x78, 0x62, 0x7c, 0xad, 0x93, - 0xb3, 0xd7, 0x3a, 0xf5, 0x3d, 0xae, 0x75, 0xfa, 0xd9, 0xd6, 0xfa, 0x9f, 0xba, 0x0a, 0xbf, 0x14, - 0xa0, 0x1c, 0x9d, 0xa1, 0x86, 0x2e, 0xc7, 0x35, 0x58, 0x71, 0x87, 0xe2, 0xaa, 0x67, 0x07, 0xa3, - 0xe8, 0xfe, 0xc0, 0xf5, 0x47, 0xc6, 0xb8, 0xe7, 0xa1, 0x38, 0x96, 0x3f, 0x33, 0x57, 0x2e, 0x9c, - 0xf8, 0xfb, 0x97, 0x7e, 0x92, 0x70, 0x03, 0x4f, 0x20, 0xc9, 0x0d, 0xd9, 0xad, 0xef, 0xc0, 0x6a, - 0x0b, 0x37, 0xb5, 0xd6, 0xb3, 0x6e, 0xd6, 0x15, 0x2e, 0xfd, 0x9f, 0xbd, 0x3a, 0xe9, 0x25, 0x6d, - 0xb8, 0x30, 0xe5, 0x46, 0x80, 0xee, 0x41, 0xb1, 0xa3, 0x5b, 0x96, 0x66, 0xe0, 0x16, 0x4f, 0xcc, - 0x85, 0xc9, 0xdc, 0x8c, 0x25, 0xee, 0x5b, 0xf7, 0x38, 0x23, 0x4d, 0xbb, 0xe5, 0x42, 0xc7, 0xdf, - 0x94, 0xce, 0xc3, 0xb9, 0x88, 0x7b, 0x81, 0x74, 0xcb, 0xf3, 0xd3, 0xc9, 0xf4, 0x1d, 0x5d, 0x80, - 0x2c, 0xbf, 0x18, 0xb8, 0x19, 0x51, 0x86, 0x11, 0xea, 0x23, 0xe9, 0x77, 0x79, 0xc8, 0xc8, 0xd8, - 0x32, 0x48, 0x36, 0x89, 0x76, 0x21, 0x8b, 0x47, 0x4d, 0x6c, 0xd8, 0x4e, 0x02, 0x1e, 0x7e, 0x09, - 0x64, 0xdc, 0x55, 0x87, 0xb3, 0x16, 0x93, 0x3d, 0x31, 0x74, 0x83, 0xa3, 0x3c, 0xd1, 0x80, 0x0d, - 0x17, 0xf7, 0xc3, 0x3c, 0xaf, 0x39, 0x30, 0x4f, 0x22, 0x12, 0xc1, 0x60, 0x52, 0x63, 0x38, 0xcf, - 0x0d, 0x8e, 0xf3, 0x24, 0x67, 0x74, 0x16, 0x00, 0x7a, 0x2a, 0x01, 0xa0, 0x27, 0x3d, 0x63, 0x9a, - 0x11, 0x48, 0xcf, 0x6b, 0x0e, 0xd2, 0xb3, 0x34, 0x63, 0xc4, 0x63, 0x50, 0xcf, 0x5b, 0x3e, 0xa8, - 0x27, 0x4b, 0x45, 0x37, 0x23, 0x45, 0x43, 0xb0, 0x9e, 0x5b, 0x2e, 0xd6, 0x93, 0x8f, 0xc4, 0x89, - 0xb8, 0xf0, 0x38, 0xd8, 0x73, 0x38, 0x01, 0xf6, 0x30, 0x70, 0xe6, 0x85, 0x48, 0x15, 0x33, 0xd0, - 0x9e, 0xc3, 0x09, 0xb4, 0xa7, 0x38, 0x43, 0xe1, 0x0c, 0xb8, 0xe7, 0x07, 0xe1, 0x70, 0x4f, 0x34, - 0x20, 0xc3, 0x87, 0x39, 0x1f, 0xde, 0xa3, 0x44, 0xe0, 0x3d, 0x62, 0xe4, 0x3d, 0x99, 0xa9, 0x9f, - 0x1b, 0xf0, 0x79, 0x18, 0x02, 0xf8, 0xac, 0x44, 0xde, 0xf0, 0x99, 0xf2, 0x39, 0x10, 0x9f, 0x87, - 0x21, 0x88, 0x0f, 0x9a, 0xa9, 0x76, 0x26, 0xe4, 0x73, 0x37, 0x08, 0xf9, 0xac, 0x46, 0xe4, 0xcc, - 0xde, 0x6e, 0x8f, 0xc0, 0x7c, 0x1a, 0x51, 0x98, 0xcf, 0x5a, 0x24, 0x7c, 0xc2, 0x34, 0x2e, 0x00, - 0xfa, 0x1c, 0x4e, 0x80, 0x3e, 0x67, 0x66, 0x78, 0xda, 0x0c, 0xd4, 0xa7, 0x1d, 0x8d, 0xfa, 0x30, - 0x4c, 0xe6, 0x95, 0xe8, 0x7d, 0xb5, 0x08, 0xec, 0xf3, 0x38, 0x14, 0xf6, 0x39, 0x17, 0x89, 0x5f, - 0xf2, 0xc1, 0xcf, 0x83, 0xfb, 0x34, 0xa2, 0x70, 0x9f, 0xd2, 0x2c, 0xbb, 0x3f, 0x13, 0xf0, 0x93, - 0x12, 0xd3, 0xfb, 0xc9, 0x4c, 0x46, 0xcc, 0x32, 0xc8, 0x67, 0x3f, 0x99, 0xc9, 0x89, 0x79, 0xe9, - 0x25, 0x92, 0xa6, 0x8e, 0x85, 0x03, 0x72, 0x21, 0xc4, 0xa6, 0xa9, 0x9b, 0x1c, 0xc2, 0x61, 0x0d, - 0xe9, 0x0a, 0xe4, 0xfd, 0x47, 0xff, 0x14, 0x90, 0x88, 0x5e, 0xbc, 0x7d, 0xc7, 0xbd, 0xf4, 0x5b, - 0xc1, 0x93, 0xa5, 0x30, 0x91, 0x1f, 0x44, 0xc8, 0x72, 0x10, 0xc1, 0x07, 0x1d, 0xc5, 0x83, 0xd0, - 0xd1, 0x06, 0xe4, 0xc8, 0x85, 0x7a, 0x0c, 0x15, 0x52, 0x0d, 0x17, 0x15, 0xba, 0x0a, 0x2b, 0x34, - 0x2b, 0x62, 0x00, 0x13, 0xcf, 0x3d, 0x92, 0x34, 0xf7, 0x58, 0x26, 0x3f, 0x30, 0x27, 0x62, 0x49, - 0xc8, 0x2b, 0xb0, 0xea, 0xe3, 0x75, 0x2f, 0xea, 0x0c, 0x22, 0x11, 0x5d, 0xee, 0x1d, 0x7e, 0x63, - 0xff, 0x83, 0xe0, 0x59, 0xc8, 0x83, 0x93, 0xc2, 0x90, 0x1f, 0xe1, 0x7b, 0x42, 0x7e, 0xe2, 0xcf, - 0x8c, 0xfc, 0xf8, 0x81, 0x87, 0x44, 0x10, 0x78, 0xf8, 0xbb, 0xe0, 0xad, 0x89, 0x8b, 0xe3, 0x34, - 0xf5, 0x16, 0xe6, 0x50, 0x00, 0xfd, 0x26, 0x79, 0x67, 0x4f, 0xef, 0xf0, 0x0b, 0x3f, 0xf9, 0x24, - 0x5c, 0x6e, 0x7c, 0xce, 0xf2, 0xf0, 0xeb, 0xa2, 0x08, 0x2c, 0xbb, 0xe3, 0x28, 0x82, 0x08, 0x89, - 0x27, 0x98, 0xd5, 0x4d, 0xf2, 0x32, 0xf9, 0x24, 0x7c, 0xd4, 0xf9, 0x78, 0x96, 0xc6, 0x1a, 0xe8, - 0x0d, 0xc8, 0xd2, 0xa2, 0x98, 0xa2, 0x1b, 0x16, 0xaf, 0x95, 0x04, 0xf2, 0x57, 0x56, 0x19, 0xdb, - 0x3a, 0x22, 0x3c, 0x87, 0x86, 0x25, 0x67, 0x0c, 0xfe, 0xe5, 0x4b, 0x2b, 0xb3, 0x81, 0xb4, 0xf2, - 0x22, 0x64, 0xc9, 0xe8, 0x2d, 0x43, 0x6d, 0xe2, 0x12, 0xd0, 0x81, 0x7a, 0x04, 0xe9, 0x37, 0x71, - 0x58, 0x1e, 0x8b, 0xc7, 0xa1, 0x73, 0x77, 0x5c, 0x32, 0xee, 0xc3, 0xb5, 0xe6, 0xb3, 0xc7, 0x3a, - 0x40, 0x47, 0xb5, 0x94, 0x8f, 0xd4, 0x81, 0x8d, 0x5b, 0xdc, 0x28, 0x3e, 0x0a, 0x2a, 0x43, 0x86, - 0xb4, 0x86, 0x16, 0x6e, 0x71, 0x88, 0xcd, 0x6d, 0xa3, 0x1a, 0xa4, 0xf1, 0x09, 0x1e, 0xd8, 0x56, - 0x69, 0x89, 0x2e, 0xfb, 0xd9, 0x49, 0xcc, 0x83, 0xfc, 0xbc, 0x5b, 0x22, 0x8b, 0xfd, 0xed, 0xd7, - 0x1b, 0x22, 0xe3, 0x7e, 0x59, 0xef, 0x6b, 0x36, 0xee, 0x1b, 0xf6, 0xa9, 0xcc, 0xe5, 0x83, 0x56, - 0xc8, 0x8c, 0x59, 0x81, 0x82, 0xbd, 0x79, 0x07, 0xc3, 0x21, 0x36, 0xd5, 0x74, 0x53, 0xb3, 0x4f, - 0xe5, 0x42, 0x1f, 0xf7, 0x0d, 0x5d, 0xef, 0x29, 0x6c, 0x8f, 0xef, 0x40, 0x31, 0x98, 0x7e, 0xa0, - 0xe7, 0xa0, 0x60, 0x62, 0x5b, 0xd5, 0x06, 0x4a, 0xe0, 0xa6, 0x93, 0x67, 0x44, 0xb6, 0xa7, 0xf6, - 0x93, 0x19, 0x41, 0x8c, 0xef, 0x27, 0x33, 0x71, 0x31, 0x21, 0x1d, 0xc1, 0x99, 0xd0, 0xf4, 0x03, - 0xbd, 0x0e, 0x59, 0x2f, 0x73, 0x61, 0x29, 0xf4, 0x14, 0x38, 0xcd, 0xe3, 0x95, 0x7e, 0x2f, 0x78, - 0x2a, 0x83, 0x00, 0x5d, 0x15, 0xd2, 0xec, 0xdc, 0xa7, 0x2b, 0x59, 0x9c, 0x72, 0xe8, 0x07, 0xe4, - 0xb6, 0xd8, 0xf1, 0x2e, 0x73, 0x61, 0xe9, 0x3d, 0x48, 0x33, 0x0a, 0xca, 0xc1, 0xd2, 0xc3, 0x83, - 0xfb, 0x07, 0x87, 0xef, 0x1e, 0x88, 0x31, 0x04, 0x90, 0xde, 0xa9, 0x54, 0xaa, 0x47, 0x75, 0x51, - 0x40, 0x59, 0x48, 0xed, 0xec, 0x1e, 0xca, 0x75, 0x31, 0x4e, 0xc8, 0x72, 0x75, 0xbf, 0x5a, 0xa9, - 0x8b, 0x09, 0xb4, 0x02, 0x05, 0xf6, 0xad, 0xdc, 0x3d, 0x94, 0xdf, 0xde, 0xa9, 0x8b, 0x49, 0x1f, - 0xe9, 0xb8, 0x7a, 0x70, 0xa7, 0x2a, 0x8b, 0x29, 0xe9, 0xbf, 0xe0, 0x7c, 0x64, 0xaa, 0xe3, 0xa1, - 0x6f, 0x82, 0x0f, 0x7d, 0x93, 0x3e, 0x8f, 0x93, 0x1b, 0x41, 0x54, 0xfe, 0x82, 0xf6, 0xc7, 0x26, - 0x7e, 0x7d, 0x81, 0xe4, 0x67, 0x6c, 0xf6, 0xe4, 0xb2, 0x6a, 0x62, 0x16, 0xe4, 0x68, 0xdf, 0xec, - 0x04, 0x2a, 0xc8, 0x05, 0x4e, 0xa5, 0x42, 0x16, 0x63, 0xfb, 0x00, 0x37, 0x6d, 0x85, 0x39, 0x91, - 0x45, 0x6f, 0x8c, 0x59, 0xc2, 0x46, 0xa8, 0xc7, 0x8c, 0x28, 0xbd, 0xbf, 0x90, 0x2d, 0xb3, 0x90, - 0x92, 0xab, 0x75, 0xf9, 0xb1, 0x98, 0x40, 0x08, 0x8a, 0xf4, 0x53, 0x39, 0x3e, 0xd8, 0x39, 0x3a, - 0xae, 0x1d, 0x12, 0x5b, 0xae, 0xc2, 0xb2, 0x63, 0x4b, 0x87, 0x98, 0x92, 0xae, 0x91, 0x6b, 0x54, - 0x68, 0xf2, 0x35, 0x79, 0x6f, 0x96, 0x7e, 0x25, 0xf8, 0xb9, 0x83, 0x09, 0xd4, 0x21, 0xa4, 0x2d, - 0x5b, 0xb5, 0x87, 0x16, 0x37, 0xe2, 0xeb, 0xf3, 0x66, 0x63, 0x5b, 0xce, 0xc7, 0x31, 0x15, 0x97, - 0xb9, 0x1a, 0xe9, 0x26, 0x14, 0x83, 0xbf, 0x44, 0xdb, 0xc0, 0x73, 0xa2, 0xb8, 0x74, 0x1b, 0xd0, - 0x64, 0x92, 0x16, 0x82, 0x21, 0x08, 0x61, 0x18, 0xc2, 0xaf, 0x05, 0x72, 0x7b, 0x8d, 0x4c, 0xc8, - 0xd0, 0x3b, 0x63, 0x93, 0xbc, 0xb5, 0x48, 0x3a, 0xb7, 0xc5, 0x68, 0x63, 0xd3, 0xbc, 0x01, 0x79, - 0x3f, 0x7d, 0xbe, 0x49, 0x7e, 0x1b, 0xf7, 0x36, 0x71, 0x10, 0xec, 0xf0, 0x8e, 0x40, 0xe1, 0x3b, - 0x1e, 0x81, 0x6f, 0x02, 0xd8, 0x23, 0x9e, 0x09, 0x3a, 0x71, 0xf4, 0x52, 0x08, 0x88, 0x8c, 0x9b, - 0xf5, 0x11, 0xdf, 0x04, 0x59, 0x9b, 0x7f, 0x59, 0xe8, 0xd8, 0x8f, 0xfc, 0x0c, 0x69, 0x8c, 0xb5, - 0x38, 0x2a, 0x32, 0x6f, 0x30, 0xf6, 0x10, 0x22, 0x46, 0xb6, 0xd0, 0x63, 0x38, 0x37, 0x96, 0x28, - 0xb8, 0xaa, 0x93, 0xf3, 0xe6, 0x0b, 0x67, 0x82, 0xf9, 0x82, 0xa3, 0xda, 0x1f, 0xed, 0x53, 0xc1, - 0x68, 0xff, 0x16, 0x5c, 0x9c, 0x96, 0xed, 0xa2, 0x4b, 0x00, 0x78, 0x40, 0x82, 0x43, 0xcb, 0x43, - 0x14, 0xb2, 0x9c, 0x52, 0x1f, 0x49, 0xf7, 0xa0, 0x14, 0x95, 0xc9, 0xa2, 0x6b, 0x90, 0xa4, 0xd7, - 0x0d, 0x96, 0xed, 0x9c, 0x0b, 0xc1, 0x40, 0x08, 0x9f, 0x4c, 0x99, 0xa4, 0x9f, 0xfb, 0x9d, 0x33, - 0x04, 0xd8, 0xb8, 0x3f, 0xe6, 0x9c, 0x37, 0x16, 0xc9, 0x79, 0xb7, 0xc6, 0xdc, 0xf2, 0x32, 0xa4, - 0xb9, 0x43, 0x02, 0xa4, 0xd5, 0x86, 0x85, 0x07, 0xb6, 0x18, 0x23, 0xce, 0x69, 0x98, 0x98, 0x36, - 0x04, 0xe9, 0x31, 0x80, 0x87, 0x8c, 0x91, 0x93, 0xd7, 0xd4, 0x87, 0x83, 0x16, 0xed, 0x3c, 0x25, - 0xb3, 0x06, 0xba, 0x09, 0x29, 0x96, 0x86, 0xc7, 0x23, 0x42, 0x14, 0xe9, 0xdc, 0x87, 0xac, 0x31, - 0x6e, 0x49, 0x03, 0x34, 0x59, 0x9d, 0x88, 0xe8, 0xe2, 0xad, 0x60, 0x17, 0x97, 0x23, 0xeb, 0x1c, - 0xe1, 0x5d, 0x7d, 0x0c, 0x29, 0xba, 0x23, 0x48, 0x32, 0x42, 0x4b, 0x62, 0x3c, 0x8b, 0x26, 0xdf, - 0xe8, 0x87, 0x00, 0xaa, 0x6d, 0x9b, 0x5a, 0x63, 0xe8, 0x75, 0xb0, 0x11, 0xbe, 0xa3, 0x76, 0x1c, - 0xbe, 0xdd, 0x8b, 0x7c, 0x6b, 0xad, 0x79, 0xa2, 0xbe, 0xed, 0xe5, 0x53, 0x28, 0x1d, 0x40, 0x31, - 0x28, 0xeb, 0xe4, 0x7d, 0x6c, 0x0c, 0xc1, 0xbc, 0x8f, 0xa5, 0xf1, 0x3c, 0xef, 0x73, 0xb3, 0xc6, - 0x04, 0xab, 0xfb, 0xd1, 0x86, 0xf4, 0xa3, 0x38, 0xe4, 0xfd, 0x1b, 0xf2, 0xdf, 0x2f, 0x35, 0x93, - 0x7e, 0x2a, 0x40, 0xc6, 0x9d, 0x7e, 0xb0, 0x08, 0x18, 0xa8, 0x9a, 0x32, 0xeb, 0xc5, 0xfd, 0x95, - 0x3b, 0x56, 0x23, 0x4d, 0xb8, 0x35, 0xd2, 0xdb, 0x6e, 0x5a, 0x10, 0x85, 0xa7, 0xf9, 0x6d, 0xcd, - 0xbd, 0xca, 0xc9, 0x82, 0x6e, 0x43, 0xd6, 0x3d, 0xd5, 0xc8, 0x65, 0xcc, 0x41, 0x4d, 0x05, 0x7e, - 0xb6, 0x70, 0xcc, 0x7b, 0x0d, 0x52, 0x86, 0xfe, 0x11, 0x2f, 0x0b, 0x26, 0x64, 0xd6, 0x90, 0x5a, - 0xb0, 0x3c, 0x76, 0x24, 0xa2, 0xdb, 0xb0, 0x64, 0x0c, 0x1b, 0x8a, 0xe3, 0x1c, 0x63, 0xd8, 0xb2, - 0x93, 0xe6, 0x0f, 0x1b, 0x3d, 0xad, 0x79, 0x1f, 0x9f, 0x3a, 0x83, 0x31, 0x86, 0x8d, 0xfb, 0xcc, - 0x87, 0x58, 0x2f, 0x71, 0x7f, 0x2f, 0xbf, 0x10, 0x20, 0xe3, 0xec, 0x09, 0xf4, 0x3f, 0x90, 0x75, - 0x8f, 0x5b, 0xb7, 0xae, 0x1f, 0x79, 0x4e, 0x73, 0xfd, 0x9e, 0x08, 0xda, 0x71, 0x1e, 0x24, 0x68, - 0x2d, 0xa5, 0xdd, 0x53, 0x99, 0x2f, 0x15, 0x83, 0x36, 0x63, 0x07, 0x32, 0x8d, 0x53, 0x7b, 0x77, - 0xee, 0xf6, 0xd4, 0x8e, 0x9c, 0xa3, 0x32, 0x7b, 0x2d, 0xd2, 0xe0, 0x19, 0xef, 0xdf, 0x04, 0x10, - 0xc7, 0x77, 0xec, 0x77, 0x1e, 0xdd, 0x64, 0xf8, 0x4f, 0x84, 0x84, 0x7f, 0xb4, 0x0d, 0xab, 0x2e, - 0x87, 0x62, 0x69, 0x9d, 0x81, 0x6a, 0x0f, 0x4d, 0xcc, 0xd1, 0x78, 0xe4, 0xfe, 0x74, 0xec, 0xfc, - 0x32, 0x39, 0xeb, 0xd4, 0x33, 0xce, 0xfa, 0x93, 0x38, 0xe4, 0x7c, 0xb5, 0x01, 0xf4, 0xdf, 0xbe, - 0xc3, 0xa8, 0x18, 0x12, 0x31, 0x7d, 0xbc, 0x5e, 0x8d, 0x3e, 0x68, 0xa6, 0xf8, 0xe2, 0x66, 0x8a, - 0xaa, 0xc0, 0x38, 0xa5, 0x86, 0xe4, 0xc2, 0xa5, 0x86, 0x97, 0x01, 0xd9, 0xba, 0xad, 0xf6, 0x94, - 0x13, 0xdd, 0xd6, 0x06, 0x1d, 0x85, 0xb9, 0x21, 0x3b, 0x3a, 0x44, 0xfa, 0xcb, 0x23, 0xfa, 0xc3, - 0x11, 0xf5, 0xc8, 0x1f, 0x0b, 0x90, 0x71, 0xaf, 0x23, 0x8b, 0x56, 0xf0, 0xcf, 0x42, 0x9a, 0x67, - 0xdc, 0xac, 0x84, 0xcf, 0x5b, 0xa1, 0x35, 0x95, 0x32, 0x64, 0xfa, 0xd8, 0x56, 0xe9, 0x39, 0xc8, - 0xa2, 0xbd, 0xdb, 0xbe, 0x7a, 0x0b, 0x72, 0xbe, 0xd7, 0x0f, 0xe4, 0x68, 0x3c, 0xa8, 0xbe, 0x2b, - 0xc6, 0xca, 0x4b, 0x9f, 0x7e, 0xb1, 0x99, 0x38, 0xc0, 0x1f, 0x91, 0xdd, 0x2c, 0x57, 0x2b, 0xb5, - 0x6a, 0xe5, 0xbe, 0x28, 0x94, 0x73, 0x9f, 0x7e, 0xb1, 0xb9, 0x24, 0x63, 0x0a, 0x48, 0x5f, 0xbd, - 0x0f, 0xcb, 0x63, 0x0b, 0x13, 0x4c, 0xe7, 0x10, 0x14, 0xef, 0x3c, 0x3c, 0x7a, 0xb0, 0x57, 0xd9, - 0xa9, 0x57, 0x95, 0x47, 0x87, 0xf5, 0xaa, 0x28, 0xa0, 0x73, 0xb0, 0xfa, 0x60, 0xef, 0x5e, 0xad, - 0xae, 0x54, 0x1e, 0xec, 0x55, 0x0f, 0xea, 0xca, 0x4e, 0xbd, 0xbe, 0x53, 0xb9, 0x2f, 0xc6, 0xaf, - 0xff, 0xb5, 0x00, 0xc9, 0x9d, 0xdd, 0xca, 0x1e, 0xaa, 0x40, 0x92, 0x42, 0x44, 0x53, 0x9f, 0x88, - 0x96, 0xa7, 0x97, 0x16, 0xd0, 0x5d, 0x48, 0x51, 0xf4, 0x08, 0x4d, 0x7f, 0x33, 0x5a, 0x9e, 0x51, - 0x6b, 0x20, 0x83, 0xa1, 0x3b, 0x72, 0xea, 0x23, 0xd2, 0xf2, 0xf4, 0xd2, 0x03, 0x7a, 0x00, 0x4b, - 0x0e, 0x78, 0x30, 0xeb, 0x65, 0x67, 0x79, 0x66, 0x3d, 0x80, 0x4c, 0x8d, 0x81, 0x30, 0xd3, 0xdf, - 0x97, 0x96, 0x67, 0x14, 0x25, 0xd0, 0x1e, 0xa4, 0xf9, 0x35, 0x7d, 0xc6, 0x93, 0xd1, 0xf2, 0xac, - 0x32, 0x03, 0x92, 0x21, 0xeb, 0xc1, 0x5b, 0xb3, 0x5f, 0xcd, 0x96, 0xe7, 0xa8, 0xb7, 0xa0, 0xf7, - 0xa0, 0x10, 0x84, 0x00, 0xe6, 0x7b, 0x96, 0x5a, 0x9e, 0xb3, 0xa0, 0x41, 0xf4, 0x07, 0xf1, 0x80, - 0xf9, 0x9e, 0xa9, 0x96, 0xe7, 0xac, 0x6f, 0xa0, 0x0f, 0x60, 0x65, 0xf2, 0xbe, 0x3e, 0xff, 0xab, - 0xd5, 0xf2, 0x02, 0x15, 0x0f, 0xd4, 0x07, 0x14, 0x72, 0xcf, 0x5f, 0xe0, 0x11, 0x6b, 0x79, 0x91, - 0x02, 0x08, 0x6a, 0xc1, 0xf2, 0xf8, 0xe5, 0x79, 0xde, 0x47, 0xad, 0xe5, 0xb9, 0x8b, 0x21, 0xac, - 0x97, 0xe0, 0xa5, 0x7b, 0xde, 0x47, 0xae, 0xe5, 0xb9, 0x6b, 0x23, 0xe8, 0x21, 0x80, 0xef, 0xde, - 0x3c, 0xc7, 0xa3, 0xd7, 0xf2, 0x3c, 0x55, 0x12, 0x64, 0xc0, 0x6a, 0xd8, 0x85, 0x7a, 0x91, 0x37, - 0xb0, 0xe5, 0x85, 0x8a, 0x27, 0xc4, 0x9f, 0x83, 0x57, 0xe3, 0xf9, 0xde, 0xc4, 0x96, 0xe7, 0xac, - 0xa2, 0x20, 0x0b, 0xd6, 0x42, 0xaf, 0x83, 0x0b, 0xbd, 0x90, 0x2d, 0x2f, 0x56, 0x59, 0x41, 0x1d, - 0x10, 0x27, 0x2e, 0x91, 0x73, 0x3f, 0x98, 0x2d, 0xcf, 0x5f, 0x63, 0xa1, 0xeb, 0x15, 0x72, 0xc7, - 0x5c, 0xe4, 0xfd, 0x6c, 0x79, 0xa1, 0xa2, 0xcb, 0xee, 0xce, 0x97, 0xdf, 0xac, 0x0b, 0x5f, 0x7d, - 0xb3, 0x2e, 0xfc, 0xe5, 0x9b, 0x75, 0xe1, 0xb3, 0xa7, 0xeb, 0xb1, 0xaf, 0x9e, 0xae, 0xc7, 0xfe, - 0xf4, 0x74, 0x3d, 0xf6, 0x7f, 0x2f, 0x76, 0x34, 0xbb, 0x3b, 0x6c, 0x6c, 0x35, 0xf5, 0xfe, 0x76, - 0x53, 0xef, 0x63, 0xbb, 0xd1, 0xb6, 0xbd, 0x0f, 0xef, 0x9f, 0x24, 0x8d, 0x34, 0xcd, 0x48, 0x6e, - 0xfc, 0x23, 0x00, 0x00, 0xff, 0xff, 0x2d, 0x0f, 0x04, 0x5b, 0x69, 0x32, 0x00, 0x00, + 0x95, 0x67, 0xf3, 0x6b, 0xc8, 0xc7, 0x8f, 0xe9, 0xa9, 0x19, 0x49, 0x14, 0x25, 0xcd, 0x8c, 0xda, + 0xb0, 0x2d, 0xcb, 0xf6, 0x8c, 0x57, 0x5a, 0xd9, 0x16, 0x64, 0x2f, 0xc0, 0xa1, 0x28, 0x73, 0x46, + 0xf2, 0xcc, 0xb8, 0x87, 0x92, 0x57, 0xfb, 0xe1, 0x76, 0x93, 0x2c, 0x92, 0x6d, 0x91, 0xec, 0x76, + 0x77, 0x73, 0xcc, 0xf1, 0x69, 0xb1, 0xde, 0x05, 0x16, 0x06, 0x16, 0x30, 0x90, 0x8b, 0x0f, 0xf1, + 0x21, 0x87, 0x5c, 0xf2, 0x17, 0x04, 0x08, 0x90, 0x53, 0x0e, 0x3e, 0xe4, 0xe0, 0x63, 0x4e, 0x4e, + 0x60, 0xdd, 0x0c, 0xe4, 0x94, 0x43, 0xae, 0x41, 0x7d, 0xf4, 0x17, 0xd9, 0xcd, 0x0f, 0xd9, 0x39, + 0x04, 0xc9, 0xad, 0xeb, 0xf1, 0xbd, 0x57, 0x55, 0xaf, 0x5e, 0xd5, 0x7b, 0xf5, 0x7b, 0x45, 0xb8, + 0x64, 0xe3, 0x61, 0x1b, 0x9b, 0x03, 0x6d, 0x68, 0xef, 0xaa, 0xcd, 0x96, 0xb6, 0x6b, 0x9f, 0x19, + 0xd8, 0xda, 0x31, 0x4c, 0xdd, 0xd6, 0xd1, 0xaa, 0xf7, 0xe3, 0x0e, 0xf9, 0xb1, 0x7c, 0xc5, 0xc7, + 0xdd, 0x32, 0xcf, 0x0c, 0x5b, 0xdf, 0x35, 0x4c, 0x5d, 0xef, 0x30, 0xfe, 0xf2, 0xe5, 0xe9, 0x9f, + 0x9f, 0xe0, 0x33, 0xae, 0x2d, 0x20, 0x4c, 0x7b, 0xd9, 0x35, 0x54, 0x53, 0x1d, 0x38, 0x3f, 0x6f, + 0x4f, 0xfd, 0x7c, 0xaa, 0xf6, 0xb5, 0xb6, 0x6a, 0xeb, 0x26, 0xe7, 0xd8, 0xea, 0xea, 0x7a, 0xb7, + 0x8f, 0x77, 0x69, 0xab, 0x39, 0xea, 0xec, 0xda, 0xda, 0x00, 0x5b, 0xb6, 0x3a, 0x30, 0x38, 0xc3, + 0x46, 0x57, 0xef, 0xea, 0xf4, 0x73, 0x97, 0x7c, 0x85, 0xf4, 0xab, 0x9b, 0x6a, 0xab, 0x8f, 0xfd, + 0x93, 0x94, 0x9e, 0xe6, 0x60, 0x45, 0xc6, 0x1f, 0x8f, 0xb0, 0x65, 0xa3, 0x1b, 0x90, 0xc4, 0xad, + 0x9e, 0x5e, 0x12, 0xb6, 0x85, 0x6b, 0xb9, 0x1b, 0x97, 0x77, 0x26, 0xe6, 0xbf, 0xc3, 0xf9, 0x6a, + 0xad, 0x9e, 0x5e, 0x8f, 0xc9, 0x94, 0x17, 0xdd, 0x82, 0x54, 0xa7, 0x3f, 0xb2, 0x7a, 0xa5, 0x38, + 0x15, 0xba, 0x12, 0x25, 0x74, 0x8f, 0x30, 0xd5, 0x63, 0x32, 0xe3, 0x26, 0x5d, 0x69, 0xc3, 0x8e, + 0x5e, 0x4a, 0xcc, 0xee, 0x6a, 0x7f, 0xd8, 0xa1, 0x5d, 0x11, 0x5e, 0xb4, 0x07, 0xa0, 0x0d, 0x35, + 0x5b, 0x69, 0xf5, 0x54, 0x6d, 0x58, 0x4a, 0x51, 0xc9, 0xab, 0xd1, 0x92, 0x9a, 0x5d, 0x25, 0x8c, + 0xf5, 0x98, 0x9c, 0xd5, 0x9c, 0x06, 0x19, 0xee, 0xc7, 0x23, 0x6c, 0x9e, 0x95, 0xd2, 0xb3, 0x87, + 0xfb, 0x1e, 0x61, 0x22, 0xc3, 0xa5, 0xdc, 0xe8, 0x2d, 0xc8, 0xb4, 0x7a, 0xb8, 0xf5, 0x44, 0xb1, + 0xc7, 0xa5, 0x0c, 0x95, 0xdc, 0x8a, 0x92, 0xac, 0x12, 0xbe, 0xc6, 0xb8, 0x1e, 0x93, 0x57, 0x5a, + 0xec, 0x13, 0xbd, 0x09, 0xe9, 0x96, 0x3e, 0x18, 0x68, 0x76, 0x29, 0x47, 0x65, 0x37, 0x23, 0x65, + 0x29, 0x57, 0x3d, 0x26, 0x73, 0x7e, 0x74, 0x08, 0xc5, 0xbe, 0x66, 0xd9, 0x8a, 0x35, 0x54, 0x0d, + 0xab, 0xa7, 0xdb, 0x56, 0x29, 0x4f, 0x35, 0x3c, 0x1f, 0xa5, 0xe1, 0x81, 0x66, 0xd9, 0x27, 0x0e, + 0x73, 0x3d, 0x26, 0x17, 0xfa, 0x7e, 0x02, 0xd1, 0xa7, 0x77, 0x3a, 0xd8, 0x74, 0x15, 0x96, 0x0a, + 0xb3, 0xf5, 0x1d, 0x11, 0x6e, 0x47, 0x9e, 0xe8, 0xd3, 0xfd, 0x04, 0xf4, 0xef, 0xb0, 0xde, 0xd7, + 0xd5, 0xb6, 0xab, 0x4e, 0x69, 0xf5, 0x46, 0xc3, 0x27, 0xa5, 0x22, 0x55, 0xfa, 0x52, 0xe4, 0x20, + 0x75, 0xb5, 0xed, 0xa8, 0xa8, 0x12, 0x81, 0x7a, 0x4c, 0x5e, 0xeb, 0x4f, 0x12, 0xd1, 0x07, 0xb0, + 0xa1, 0x1a, 0x46, 0xff, 0x6c, 0x52, 0xfb, 0x2a, 0xd5, 0x7e, 0x3d, 0x4a, 0x7b, 0x85, 0xc8, 0x4c, + 0xaa, 0x47, 0xea, 0x14, 0x15, 0x35, 0x40, 0x34, 0x4c, 0x6c, 0xa8, 0x26, 0x56, 0x0c, 0x53, 0x37, + 0x74, 0x4b, 0xed, 0x97, 0x44, 0xaa, 0xfb, 0xc5, 0x28, 0xdd, 0xc7, 0x8c, 0xff, 0x98, 0xb3, 0xd7, + 0x63, 0xf2, 0xaa, 0x11, 0x24, 0x31, 0xad, 0x7a, 0x0b, 0x5b, 0x96, 0xa7, 0x75, 0x6d, 0x9e, 0x56, + 0xca, 0x1f, 0xd4, 0x1a, 0x20, 0xa1, 0x1a, 0xe4, 0xf0, 0x98, 0x88, 0x2b, 0xa7, 0xba, 0x8d, 0x4b, + 0x88, 0x2a, 0x94, 0x22, 0x77, 0x28, 0x65, 0x7d, 0xa4, 0xdb, 0xb8, 0x1e, 0x93, 0x01, 0xbb, 0x2d, + 0xa4, 0xc2, 0xb9, 0x53, 0x6c, 0x6a, 0x9d, 0x33, 0xaa, 0x46, 0xa1, 0xbf, 0x58, 0x9a, 0x3e, 0x2c, + 0xad, 0x53, 0x85, 0x2f, 0x47, 0x29, 0x7c, 0x44, 0x85, 0x88, 0x8a, 0x9a, 0x23, 0x52, 0x8f, 0xc9, + 0xeb, 0xa7, 0xd3, 0x64, 0xe2, 0x62, 0x1d, 0x6d, 0xa8, 0xf6, 0xb5, 0x4f, 0xb1, 0xd2, 0xec, 0xeb, + 0xad, 0x27, 0xa5, 0x8d, 0xd9, 0x2e, 0x76, 0x8f, 0x73, 0xef, 0x11, 0x66, 0xe2, 0x62, 0x1d, 0x3f, + 0x01, 0x61, 0xb8, 0xd0, 0x32, 0xb1, 0x6a, 0x63, 0x85, 0x9d, 0x5e, 0x8a, 0x89, 0xad, 0x51, 0xdf, + 0x26, 0x3b, 0xf1, 0x1c, 0x55, 0xfc, 0x4a, 0xe4, 0x6e, 0xa2, 0x62, 0x47, 0x54, 0x4a, 0xa6, 0x42, + 0x74, 0x5b, 0x6e, 0xb4, 0x42, 0xe8, 0xe8, 0x5f, 0x01, 0x75, 0xb0, 0xdd, 0xea, 0x39, 0xbd, 0x10, + 0xfb, 0x58, 0xa5, 0xf3, 0xb4, 0x87, 0x6b, 0x91, 0x43, 0x27, 0x12, 0x4c, 0x11, 0x31, 0x02, 0xd9, + 0x70, 0x62, 0x67, 0x82, 0x46, 0x6d, 0xce, 0x8e, 0x72, 0x1c, 0x54, 0x7e, 0x61, 0x8e, 0xcd, 0xb9, + 0x50, 0x50, 0xff, 0xfa, 0xe9, 0x34, 0x79, 0x6f, 0x05, 0x52, 0xa7, 0x6a, 0x7f, 0x84, 0x0f, 0x92, + 0x99, 0xa4, 0x98, 0x3a, 0x48, 0x66, 0x56, 0xc4, 0xcc, 0x41, 0x32, 0x93, 0x15, 0xe1, 0x20, 0x99, + 0x01, 0x31, 0x27, 0xbd, 0x08, 0x39, 0xdf, 0xe1, 0x8d, 0x4a, 0xb0, 0x32, 0xc0, 0x96, 0xa5, 0x76, + 0x31, 0x3d, 0xeb, 0xb3, 0xb2, 0xd3, 0x94, 0x8a, 0x90, 0xf7, 0x1f, 0xd8, 0xd2, 0x17, 0x82, 0x2b, + 0x49, 0xce, 0x62, 0x22, 0x79, 0x8a, 0x4d, 0xea, 0x32, 0x5c, 0x92, 0x37, 0xd1, 0x73, 0x50, 0xa0, + 0xcb, 0xad, 0x38, 0xbf, 0x93, 0x80, 0x90, 0x94, 0xf3, 0x94, 0xf8, 0x88, 0x33, 0x6d, 0x41, 0xce, + 0xb8, 0x61, 0xb8, 0x2c, 0x09, 0xca, 0x02, 0xc6, 0x0d, 0xc3, 0x61, 0xb8, 0x0a, 0x79, 0x62, 0x03, + 0x97, 0x23, 0x49, 0x3b, 0xc9, 0x11, 0x1a, 0x67, 0x91, 0x7e, 0x1b, 0x07, 0x71, 0xf2, 0x90, 0x47, + 0x6f, 0x42, 0x92, 0x84, 0x43, 0x1e, 0xba, 0xca, 0x3b, 0x2c, 0x56, 0xee, 0x38, 0xb1, 0x72, 0xa7, + 0xe1, 0xc4, 0xca, 0xbd, 0xcc, 0xd7, 0xdf, 0x6e, 0xc5, 0xbe, 0xf8, 0xfd, 0x96, 0x20, 0x53, 0x09, + 0x74, 0x91, 0x1c, 0xed, 0xaa, 0x36, 0x54, 0xb4, 0x36, 0x1d, 0x72, 0x96, 0x9c, 0xdb, 0xaa, 0x36, + 0xdc, 0x6f, 0xa3, 0x07, 0x20, 0xb6, 0xf4, 0xa1, 0x85, 0x87, 0xd6, 0xc8, 0x52, 0x58, 0xb4, 0xe6, + 0x01, 0x2b, 0x10, 0x76, 0x58, 0x38, 0xad, 0x3a, 0x9c, 0xc7, 0x94, 0x51, 0x5e, 0x6d, 0x05, 0x09, + 0xe8, 0x1e, 0x80, 0x1b, 0xd2, 0xad, 0x52, 0x72, 0x3b, 0x71, 0x2d, 0x77, 0x63, 0x7b, 0x6a, 0xf1, + 0x1f, 0x39, 0x2c, 0x0f, 0x0d, 0xb2, 0xca, 0x7b, 0x49, 0x32, 0x5c, 0xd9, 0x27, 0x89, 0x5e, 0x80, + 0x55, 0xd5, 0x30, 0x14, 0xcb, 0x26, 0x0e, 0xd5, 0x3c, 0x23, 0x9e, 0x44, 0x62, 0x61, 0x5e, 0x2e, + 0xa8, 0x86, 0x71, 0x42, 0xa8, 0x7b, 0x84, 0x88, 0x9e, 0x87, 0x22, 0x89, 0x7b, 0x9a, 0xda, 0x57, + 0x7a, 0x58, 0xeb, 0xf6, 0x6c, 0x1a, 0xf3, 0x12, 0x72, 0x81, 0x53, 0xeb, 0x94, 0x28, 0xb5, 0xdd, + 0x15, 0xa7, 0x31, 0x0f, 0x21, 0x48, 0xb6, 0x55, 0x5b, 0xa5, 0x96, 0xcc, 0xcb, 0xf4, 0x9b, 0xd0, + 0x0c, 0xd5, 0xee, 0x71, 0xfb, 0xd0, 0x6f, 0x74, 0x1e, 0xd2, 0x5c, 0x6d, 0x82, 0xaa, 0xe5, 0x2d, + 0xb4, 0x01, 0x29, 0xc3, 0xd4, 0x4f, 0x31, 0x5d, 0xba, 0x8c, 0xcc, 0x1a, 0x92, 0x0c, 0xc5, 0x60, + 0x7c, 0x44, 0x45, 0x88, 0xdb, 0x63, 0xde, 0x4b, 0xdc, 0x1e, 0xa3, 0xd7, 0x20, 0x49, 0x0c, 0x49, + 0xfb, 0x28, 0x86, 0x64, 0x04, 0x5c, 0xae, 0x71, 0x66, 0x60, 0x99, 0x72, 0x4a, 0xab, 0x50, 0x08, + 0xc4, 0x4d, 0xe9, 0x3c, 0x6c, 0x84, 0x85, 0x41, 0xa9, 0xe7, 0xd2, 0x03, 0xe1, 0x0c, 0xdd, 0x82, + 0x8c, 0x1b, 0x07, 0x99, 0xe3, 0x5c, 0x9c, 0xea, 0xd6, 0x61, 0x96, 0x5d, 0x56, 0xe2, 0x31, 0x64, + 0x01, 0x7a, 0x2a, 0xcf, 0x7a, 0xf2, 0xf2, 0x8a, 0x6a, 0x18, 0x75, 0xd5, 0xea, 0x49, 0x1f, 0x42, + 0x29, 0x2a, 0xc6, 0xf9, 0x0c, 0x26, 0x50, 0xb7, 0x77, 0x0c, 0x76, 0x1e, 0xd2, 0x1d, 0xdd, 0x1c, + 0xa8, 0x36, 0x55, 0x56, 0x90, 0x79, 0x8b, 0x18, 0x92, 0xc5, 0xbb, 0x04, 0x25, 0xb3, 0x86, 0xa4, + 0xc0, 0xc5, 0xc8, 0x38, 0x47, 0x44, 0xb4, 0x61, 0x1b, 0x33, 0xb3, 0x16, 0x64, 0xd6, 0xf0, 0x14, + 0xb1, 0xc1, 0xb2, 0x06, 0xe9, 0xd6, 0xa2, 0x73, 0xa5, 0xfa, 0xb3, 0x32, 0x6f, 0x49, 0x5f, 0x26, + 0xe0, 0x7c, 0x78, 0xb4, 0x43, 0xdb, 0x90, 0x1f, 0xa8, 0x63, 0xc5, 0x1e, 0x73, 0xb7, 0x13, 0xe8, + 0xc2, 0xc3, 0x40, 0x1d, 0x37, 0xc6, 0xcc, 0xe7, 0x44, 0x48, 0xd8, 0x63, 0xab, 0x14, 0xdf, 0x4e, + 0x5c, 0xcb, 0xcb, 0xe4, 0x13, 0x3d, 0x84, 0xb5, 0xbe, 0xde, 0x52, 0xfb, 0x4a, 0x5f, 0xb5, 0x6c, + 0x85, 0xa7, 0x41, 0x6c, 0x13, 0x3d, 0x37, 0x65, 0x6c, 0x16, 0xb7, 0x70, 0x9b, 0xad, 0x27, 0x39, + 0x70, 0xb8, 0xff, 0xaf, 0x52, 0x1d, 0x0f, 0x54, 0x67, 0xa9, 0xd1, 0x5d, 0xc8, 0x0d, 0x34, 0xab, + 0x89, 0x7b, 0xea, 0xa9, 0xa6, 0x9b, 0x7c, 0x37, 0x4d, 0x3b, 0xcd, 0xbb, 0x1e, 0x0f, 0xd7, 0xe4, + 0x17, 0xf3, 0x2d, 0x49, 0x2a, 0xe0, 0xc3, 0xce, 0x69, 0x92, 0x5e, 0xfa, 0x34, 0x79, 0x0d, 0x36, + 0x86, 0x78, 0x6c, 0x2b, 0xde, 0x7e, 0x65, 0x7e, 0xb2, 0x42, 0x4d, 0x8f, 0xc8, 0x6f, 0xee, 0x0e, + 0xb7, 0x88, 0xcb, 0xa0, 0x97, 0x68, 0xbe, 0x60, 0xe8, 0x16, 0x36, 0x15, 0xb5, 0xdd, 0x36, 0xb1, + 0x65, 0xd1, 0x14, 0x33, 0x4f, 0x93, 0x00, 0x4a, 0xaf, 0x30, 0xb2, 0xf4, 0x7f, 0xfe, 0xa5, 0x09, + 0xe6, 0x07, 0xdc, 0xf0, 0x82, 0x67, 0xf8, 0x13, 0xd8, 0xe0, 0xf2, 0xed, 0x80, 0xed, 0x59, 0x9e, + 0x7e, 0x69, 0x7a, 0x7f, 0x4d, 0xda, 0x1c, 0x39, 0xe2, 0xd1, 0x66, 0x4f, 0x3c, 0x9b, 0xd9, 0x11, + 0x24, 0xa9, 0x51, 0x92, 0xec, 0x88, 0x21, 0xdf, 0x7f, 0x6b, 0x4b, 0xf1, 0x59, 0x02, 0xd6, 0xa6, + 0x92, 0x2d, 0x77, 0x62, 0x42, 0xe8, 0xc4, 0xe2, 0xa1, 0x13, 0x4b, 0x2c, 0x3d, 0x31, 0xbe, 0xd6, + 0xc9, 0xf9, 0x6b, 0x9d, 0xfa, 0x11, 0xd7, 0x3a, 0xfd, 0x6c, 0x6b, 0xfd, 0x57, 0x5d, 0x85, 0x9f, + 0x0a, 0x50, 0x8e, 0xce, 0x50, 0x43, 0x97, 0xe3, 0x65, 0x58, 0x73, 0x87, 0xe2, 0xaa, 0x67, 0x07, + 0xa3, 0xe8, 0xfe, 0xc0, 0xf5, 0x47, 0xc6, 0xb8, 0xe7, 0xa1, 0x38, 0x91, 0x3f, 0x33, 0x57, 0x2e, + 0x9c, 0xfa, 0xfb, 0x97, 0xfe, 0x27, 0xe1, 0x06, 0x9e, 0x40, 0x92, 0x1b, 0xb2, 0x5b, 0xdf, 0x83, + 0xf5, 0x36, 0x6e, 0x69, 0xed, 0x67, 0xdd, 0xac, 0x6b, 0x5c, 0xfa, 0x1f, 0x7b, 0x75, 0xda, 0x4b, + 0x3a, 0x70, 0x69, 0xc6, 0x8d, 0x00, 0xbd, 0x03, 0xc5, 0xae, 0x6e, 0x59, 0x9a, 0x81, 0xdb, 0x3c, + 0x31, 0x17, 0xa6, 0x73, 0x33, 0x96, 0xb8, 0xef, 0xbc, 0xc3, 0x19, 0x69, 0xda, 0x2d, 0x17, 0xba, + 0xfe, 0xa6, 0x74, 0x11, 0x2e, 0x44, 0xdc, 0x0b, 0xa4, 0xdb, 0x9e, 0x9f, 0x4e, 0xa7, 0xef, 0xe8, + 0x12, 0x64, 0xf9, 0xc5, 0xc0, 0xcd, 0x88, 0x32, 0x8c, 0xd0, 0x18, 0x4b, 0xbf, 0xca, 0x43, 0x46, + 0xc6, 0x96, 0x41, 0xb2, 0x49, 0xb4, 0x07, 0x59, 0x3c, 0x6e, 0x61, 0xc3, 0x76, 0x12, 0xf0, 0xf0, + 0x4b, 0x20, 0xe3, 0xae, 0x39, 0x9c, 0xf5, 0x98, 0xec, 0x89, 0xa1, 0x9b, 0x1c, 0xe5, 0x89, 0x06, + 0x6c, 0xb8, 0xb8, 0x1f, 0xe6, 0x79, 0xdd, 0x81, 0x79, 0x12, 0x91, 0x08, 0x06, 0x93, 0x9a, 0xc0, + 0x79, 0x6e, 0x72, 0x9c, 0x27, 0x39, 0xa7, 0xb3, 0x00, 0xd0, 0x53, 0x0d, 0x00, 0x3d, 0xe9, 0x39, + 0xd3, 0x8c, 0x40, 0x7a, 0x5e, 0x77, 0x90, 0x9e, 0x95, 0x39, 0x23, 0x9e, 0x80, 0x7a, 0xde, 0xf6, + 0x41, 0x3d, 0x59, 0x2a, 0xba, 0x1d, 0x29, 0x1a, 0x82, 0xf5, 0xdc, 0x76, 0xb1, 0x9e, 0x7c, 0x24, + 0x4e, 0xc4, 0x85, 0x27, 0xc1, 0x9e, 0xa3, 0x29, 0xb0, 0x87, 0x81, 0x33, 0x2f, 0x44, 0xaa, 0x98, + 0x83, 0xf6, 0x1c, 0x4d, 0xa1, 0x3d, 0xc5, 0x39, 0x0a, 0xe7, 0xc0, 0x3d, 0xff, 0x11, 0x0e, 0xf7, + 0x44, 0x03, 0x32, 0x7c, 0x98, 0x8b, 0xe1, 0x3d, 0x4a, 0x04, 0xde, 0x23, 0x46, 0xde, 0x93, 0x99, + 0xfa, 0x85, 0x01, 0x9f, 0x87, 0x21, 0x80, 0xcf, 0x5a, 0xe4, 0x0d, 0x9f, 0x29, 0x5f, 0x00, 0xf1, + 0x79, 0x18, 0x82, 0xf8, 0xa0, 0xb9, 0x6a, 0xe7, 0x42, 0x3e, 0xf7, 0x82, 0x90, 0xcf, 0x7a, 0x44, + 0xce, 0xec, 0xed, 0xf6, 0x08, 0xcc, 0xa7, 0x19, 0x85, 0xf9, 0x6c, 0x44, 0xc2, 0x27, 0x4c, 0xe3, + 0x12, 0xa0, 0xcf, 0xd1, 0x14, 0xe8, 0x73, 0x6e, 0x8e, 0xa7, 0xcd, 0x41, 0x7d, 0x3a, 0xd1, 0xa8, + 0x0f, 0xc3, 0x64, 0x5e, 0x8d, 0xde, 0x57, 0xcb, 0xc0, 0x3e, 0x8f, 0x43, 0x61, 0x9f, 0x0b, 0x91, + 0xf8, 0x25, 0x1f, 0xfc, 0x22, 0xb8, 0x4f, 0x33, 0x0a, 0xf7, 0x29, 0xcd, 0xb3, 0xfb, 0x33, 0x01, + 0x3f, 0x29, 0x31, 0x7d, 0x90, 0xcc, 0x64, 0xc4, 0x2c, 0x83, 0x7c, 0x0e, 0x92, 0x99, 0x9c, 0x98, + 0x97, 0x5e, 0x22, 0x69, 0xea, 0x44, 0x38, 0x20, 0x17, 0x42, 0x6c, 0x9a, 0xba, 0xc9, 0x21, 0x1c, + 0xd6, 0x90, 0xae, 0x41, 0xde, 0x7f, 0xf4, 0xcf, 0x00, 0x89, 0xe8, 0xc5, 0xdb, 0x77, 0xdc, 0x4b, + 0xbf, 0x14, 0x3c, 0x59, 0x0a, 0x13, 0xf9, 0x41, 0x84, 0x2c, 0x07, 0x11, 0x7c, 0xd0, 0x51, 0x3c, + 0x08, 0x1d, 0x6d, 0x41, 0x8e, 0x5c, 0xa8, 0x27, 0x50, 0x21, 0xd5, 0x70, 0x51, 0xa1, 0xeb, 0xb0, + 0x46, 0xb3, 0x22, 0x06, 0x30, 0xf1, 0xdc, 0x23, 0x49, 0x73, 0x8f, 0x55, 0xf2, 0x03, 0x73, 0x22, + 0x96, 0x84, 0xbc, 0x0a, 0xeb, 0x3e, 0x5e, 0xf7, 0xa2, 0xce, 0x20, 0x12, 0xd1, 0xe5, 0xae, 0xf0, + 0x1b, 0xfb, 0x6f, 0x04, 0xcf, 0x42, 0x1e, 0x9c, 0x14, 0x86, 0xfc, 0x08, 0x3f, 0x12, 0xf2, 0x13, + 0x7f, 0x66, 0xe4, 0xc7, 0x0f, 0x3c, 0x24, 0x82, 0xc0, 0xc3, 0x9f, 0x05, 0x6f, 0x4d, 0x5c, 0x1c, + 0xa7, 0xa5, 0xb7, 0x31, 0x87, 0x02, 0xe8, 0x37, 0xc9, 0x3b, 0xfb, 0x7a, 0x97, 0x5f, 0xf8, 0xc9, + 0x27, 0xe1, 0x72, 0xe3, 0x73, 0x96, 0x87, 0x5f, 0x17, 0x45, 0x60, 0xd9, 0x1d, 0x47, 0x11, 0x44, + 0x48, 0x3c, 0xc1, 0xac, 0x6e, 0x92, 0x97, 0xc9, 0x27, 0xe1, 0xa3, 0xce, 0xc7, 0xb3, 0x34, 0xd6, + 0x40, 0x6f, 0x42, 0x96, 0x16, 0xc5, 0x14, 0xdd, 0xb0, 0x78, 0xad, 0x24, 0x90, 0xbf, 0xb2, 0xca, + 0xd8, 0xce, 0x31, 0xe1, 0x39, 0x32, 0x2c, 0x39, 0x63, 0xf0, 0x2f, 0x5f, 0x5a, 0x99, 0x0d, 0xa4, + 0x95, 0x97, 0x21, 0x4b, 0x46, 0x6f, 0x19, 0x6a, 0x0b, 0x97, 0x80, 0x0e, 0xd4, 0x23, 0x48, 0xbf, + 0x88, 0xc3, 0xea, 0x44, 0x3c, 0x0e, 0x9d, 0xbb, 0xe3, 0x92, 0x71, 0x1f, 0xae, 0xb5, 0x98, 0x3d, + 0x36, 0x01, 0xba, 0xaa, 0xa5, 0x7c, 0xa2, 0x0e, 0x6d, 0xdc, 0xe6, 0x46, 0xf1, 0x51, 0x50, 0x19, + 0x32, 0xa4, 0x35, 0xb2, 0x70, 0x9b, 0x43, 0x6c, 0x6e, 0x1b, 0xd5, 0x21, 0x8d, 0x4f, 0xf1, 0xd0, + 0xb6, 0x4a, 0x2b, 0x74, 0xd9, 0xcf, 0x4f, 0x63, 0x1e, 0xe4, 0xe7, 0xbd, 0x12, 0x59, 0xec, 0xef, + 0xbf, 0xdd, 0x12, 0x19, 0xf7, 0x2b, 0xfa, 0x40, 0xb3, 0xf1, 0xc0, 0xb0, 0xcf, 0x64, 0x2e, 0x1f, + 0xb4, 0x42, 0x66, 0xc2, 0x0a, 0x14, 0xec, 0xcd, 0x3b, 0x18, 0x0e, 0xb1, 0xa9, 0xa6, 0x9b, 0x9a, + 0x7d, 0x26, 0x17, 0x06, 0x78, 0x60, 0xe8, 0x7a, 0x5f, 0x61, 0x7b, 0xbc, 0x02, 0xc5, 0x60, 0xfa, + 0x81, 0x9e, 0x83, 0x82, 0x89, 0x6d, 0x55, 0x1b, 0x2a, 0x81, 0x9b, 0x4e, 0x9e, 0x11, 0xd9, 0x9e, + 0x3a, 0x48, 0x66, 0x04, 0x31, 0x7e, 0x90, 0xcc, 0xc4, 0xc5, 0x84, 0x74, 0x0c, 0xe7, 0x42, 0xd3, + 0x0f, 0xf4, 0x06, 0x64, 0xbd, 0xcc, 0x85, 0xa5, 0xd0, 0x33, 0xe0, 0x34, 0x8f, 0x57, 0xfa, 0xb5, + 0xe0, 0xa9, 0x0c, 0x02, 0x74, 0x35, 0x48, 0xb3, 0x73, 0x9f, 0xae, 0x64, 0x71, 0xc6, 0xa1, 0x1f, + 0x90, 0xdb, 0x61, 0xc7, 0xbb, 0xcc, 0x85, 0xa5, 0x0f, 0x20, 0xcd, 0x28, 0x28, 0x07, 0x2b, 0x0f, + 0x0f, 0xef, 0x1f, 0x1e, 0xbd, 0x7f, 0x28, 0xc6, 0x10, 0x40, 0xba, 0x52, 0xad, 0xd6, 0x8e, 0x1b, + 0xa2, 0x80, 0xb2, 0x90, 0xaa, 0xec, 0x1d, 0xc9, 0x0d, 0x31, 0x4e, 0xc8, 0x72, 0xed, 0xa0, 0x56, + 0x6d, 0x88, 0x09, 0xb4, 0x06, 0x05, 0xf6, 0xad, 0xdc, 0x3b, 0x92, 0xdf, 0xad, 0x34, 0xc4, 0xa4, + 0x8f, 0x74, 0x52, 0x3b, 0xbc, 0x5b, 0x93, 0xc5, 0x94, 0xf4, 0x4f, 0x70, 0x31, 0x32, 0xd5, 0xf1, + 0xd0, 0x37, 0xc1, 0x87, 0xbe, 0x49, 0x5f, 0xc6, 0xc9, 0x8d, 0x20, 0x2a, 0x7f, 0x41, 0x07, 0x13, + 0x13, 0xbf, 0xb1, 0x44, 0xf2, 0x33, 0x31, 0x7b, 0x72, 0x59, 0x35, 0x31, 0x0b, 0x72, 0xb4, 0x6f, + 0x76, 0x02, 0x15, 0xe4, 0x02, 0xa7, 0x52, 0x21, 0x8b, 0xb1, 0x7d, 0x84, 0x5b, 0xb6, 0xc2, 0x9c, + 0xc8, 0xa2, 0x37, 0xc6, 0x2c, 0x61, 0x23, 0xd4, 0x13, 0x46, 0x94, 0x3e, 0x5c, 0xca, 0x96, 0x59, + 0x48, 0xc9, 0xb5, 0x86, 0xfc, 0x58, 0x4c, 0x20, 0x04, 0x45, 0xfa, 0xa9, 0x9c, 0x1c, 0x56, 0x8e, + 0x4f, 0xea, 0x47, 0xc4, 0x96, 0xeb, 0xb0, 0xea, 0xd8, 0xd2, 0x21, 0xa6, 0xa4, 0x97, 0xc9, 0x35, + 0x2a, 0x34, 0xf9, 0x9a, 0xbe, 0x37, 0x4b, 0x3f, 0x13, 0xfc, 0xdc, 0xc1, 0x04, 0xea, 0x08, 0xd2, + 0x96, 0xad, 0xda, 0x23, 0x8b, 0x1b, 0xf1, 0x8d, 0x45, 0xb3, 0xb1, 0x1d, 0xe7, 0xe3, 0x84, 0x8a, + 0xcb, 0x5c, 0x8d, 0x74, 0x0b, 0x8a, 0xc1, 0x5f, 0xa2, 0x6d, 0xe0, 0x39, 0x51, 0x5c, 0xba, 0x03, + 0x68, 0x3a, 0x49, 0x0b, 0xc1, 0x10, 0x84, 0x30, 0x0c, 0xe1, 0xe7, 0x02, 0xb9, 0xbd, 0x46, 0x26, + 0x64, 0xe8, 0xbd, 0x89, 0x49, 0xde, 0x5e, 0x26, 0x9d, 0xdb, 0x61, 0xb4, 0x89, 0x69, 0xde, 0x84, + 0xbc, 0x9f, 0xbe, 0xd8, 0x24, 0xbf, 0x8f, 0x7b, 0x9b, 0x38, 0x08, 0x76, 0x78, 0x47, 0xa0, 0xf0, + 0x03, 0x8f, 0xc0, 0xb7, 0x00, 0xec, 0x31, 0xcf, 0x04, 0x9d, 0x38, 0x7a, 0x25, 0x04, 0x44, 0xc6, + 0xad, 0xc6, 0x98, 0x6f, 0x82, 0xac, 0xcd, 0xbf, 0x2c, 0x74, 0xe2, 0x47, 0x7e, 0x46, 0x34, 0xc6, + 0x5a, 0x1c, 0x15, 0x59, 0x34, 0x18, 0x7b, 0x08, 0x11, 0x23, 0x5b, 0xe8, 0x31, 0x5c, 0x98, 0x48, + 0x14, 0x5c, 0xd5, 0xc9, 0x45, 0xf3, 0x85, 0x73, 0xc1, 0x7c, 0xc1, 0x51, 0xed, 0x8f, 0xf6, 0xa9, + 0x60, 0xb4, 0x7f, 0x1b, 0x2e, 0xcf, 0xca, 0x76, 0xd1, 0x15, 0x00, 0x3c, 0x24, 0xc1, 0xa1, 0xed, + 0x21, 0x0a, 0x59, 0x4e, 0x69, 0x8c, 0xa5, 0x7d, 0x28, 0x45, 0x65, 0xb2, 0xe8, 0x55, 0x48, 0xf9, + 0x41, 0x90, 0x0b, 0x21, 0x20, 0x08, 0x61, 0x94, 0x19, 0x97, 0xf4, 0xff, 0x7e, 0xf7, 0x0c, 0x81, + 0x36, 0xee, 0x4f, 0xb8, 0xe7, 0xcd, 0x65, 0xb2, 0xde, 0x9d, 0x09, 0xc7, 0xbc, 0x0a, 0x69, 0xee, + 0x92, 0x00, 0x69, 0xb5, 0x69, 0xe1, 0xa1, 0x2d, 0xc6, 0x88, 0x7b, 0x1a, 0x26, 0xa6, 0x0d, 0x41, + 0x7a, 0x0c, 0xe0, 0x61, 0x63, 0xe4, 0xec, 0x35, 0xf5, 0xd1, 0xb0, 0x4d, 0x3b, 0x4f, 0xc9, 0xac, + 0x81, 0x6e, 0x39, 0x53, 0x8c, 0x47, 0x04, 0x29, 0xd2, 0xb9, 0x0f, 0x5b, 0xe3, 0x53, 0xd5, 0x00, + 0x4d, 0xd7, 0x27, 0x22, 0xba, 0x78, 0x3b, 0xd8, 0xc5, 0xd5, 0xc8, 0x4a, 0x47, 0x78, 0x57, 0x9f, + 0x42, 0x8a, 0xee, 0x09, 0x92, 0x8e, 0xd0, 0xa2, 0x18, 0xcf, 0xa3, 0xc9, 0x37, 0xfa, 0x4f, 0x00, + 0xd5, 0xb6, 0x4d, 0xad, 0x39, 0xf2, 0x3a, 0xd8, 0x0a, 0xdf, 0x53, 0x15, 0x87, 0x6f, 0xef, 0x32, + 0xdf, 0x5c, 0x1b, 0x9e, 0xa8, 0x6f, 0x83, 0xf9, 0x14, 0x4a, 0x87, 0x50, 0x0c, 0xca, 0x3a, 0x99, + 0x1f, 0x1b, 0x43, 0x30, 0xf3, 0x63, 0x89, 0x3c, 0xcf, 0xfc, 0xdc, 0xbc, 0x31, 0xc1, 0x2a, 0x7f, + 0xb4, 0x21, 0xfd, 0x57, 0x1c, 0xf2, 0xfe, 0x2d, 0xf9, 0xf7, 0x97, 0x9c, 0x49, 0xff, 0x2b, 0x40, + 0xc6, 0x9d, 0x7e, 0xb0, 0x0c, 0x18, 0xa8, 0x9b, 0x32, 0xeb, 0xc5, 0xfd, 0xb5, 0x3b, 0x56, 0x25, + 0x4d, 0xb8, 0x55, 0xd2, 0x3b, 0x6e, 0x62, 0x10, 0x85, 0xa8, 0xf9, 0x6d, 0xcd, 0xbd, 0xca, 0xc9, + 0x83, 0xee, 0x40, 0xd6, 0x3d, 0xd7, 0xc8, 0x75, 0xcc, 0xc1, 0x4d, 0x05, 0x7e, 0xba, 0x70, 0xd4, + 0x7b, 0x03, 0x52, 0x86, 0xfe, 0x09, 0x2f, 0x0c, 0x26, 0x64, 0xd6, 0x90, 0xda, 0xb0, 0x3a, 0x71, + 0x28, 0xa2, 0x3b, 0xb0, 0x62, 0x8c, 0x9a, 0x8a, 0xe3, 0x1c, 0x13, 0xe8, 0xb2, 0x93, 0xe8, 0x8f, + 0x9a, 0x7d, 0xad, 0x75, 0x1f, 0x9f, 0x39, 0x83, 0x31, 0x46, 0xcd, 0xfb, 0xcc, 0x87, 0x58, 0x2f, + 0x71, 0x7f, 0x2f, 0x3f, 0x11, 0x20, 0xe3, 0xec, 0x09, 0xf4, 0x2f, 0x90, 0x75, 0x0f, 0x5c, 0xb7, + 0xb2, 0x1f, 0x79, 0x52, 0x73, 0xfd, 0x9e, 0x08, 0xaa, 0x38, 0x4f, 0x12, 0xb4, 0xb6, 0xd2, 0xe9, + 0xab, 0xcc, 0x97, 0x8a, 0x41, 0x9b, 0xb1, 0x23, 0x99, 0x46, 0xaa, 0xfd, 0xbb, 0xf7, 0xfa, 0x6a, + 0x57, 0xce, 0x51, 0x99, 0xfd, 0x36, 0x69, 0xf0, 0x9c, 0xf7, 0x4f, 0x02, 0x88, 0x93, 0x3b, 0xf6, + 0x07, 0x8f, 0x6e, 0x3a, 0x01, 0x48, 0x84, 0x24, 0x00, 0x68, 0x17, 0xd6, 0x5d, 0x0e, 0xc5, 0xd2, + 0xba, 0x43, 0xd5, 0x1e, 0x99, 0x98, 0xe3, 0xf1, 0xc8, 0xfd, 0xe9, 0xc4, 0xf9, 0x65, 0x7a, 0xd6, + 0xa9, 0x67, 0x9c, 0xf5, 0x67, 0x71, 0xc8, 0xf9, 0xaa, 0x03, 0xe8, 0x9f, 0x7d, 0x87, 0x51, 0x31, + 0x24, 0x66, 0xfa, 0x78, 0xbd, 0x2a, 0x7d, 0xd0, 0x4c, 0xf1, 0xe5, 0xcd, 0x14, 0x55, 0x83, 0x71, + 0x8a, 0x0d, 0xc9, 0xa5, 0x8b, 0x0d, 0xaf, 0x00, 0xb2, 0x75, 0x5b, 0xed, 0x2b, 0xa7, 0xba, 0xad, + 0x0d, 0xbb, 0x0a, 0x73, 0x43, 0x76, 0x74, 0x88, 0xf4, 0x97, 0x47, 0xf4, 0x87, 0x63, 0xea, 0x91, + 0xff, 0x2d, 0x40, 0xc6, 0xbd, 0x90, 0x2c, 0x5b, 0xc3, 0x3f, 0x0f, 0x69, 0x9e, 0x73, 0xb3, 0x22, + 0x3e, 0x6f, 0x85, 0x56, 0x55, 0xca, 0x90, 0x19, 0x60, 0x5b, 0xa5, 0xe7, 0x20, 0x8b, 0xf7, 0x6e, + 0xfb, 0xfa, 0x6d, 0xc8, 0xf9, 0xde, 0x3f, 0x90, 0xa3, 0xf1, 0xb0, 0xf6, 0xbe, 0x18, 0x2b, 0xaf, + 0x7c, 0xfe, 0xd5, 0x76, 0xe2, 0x10, 0x7f, 0x42, 0x76, 0xb3, 0x5c, 0xab, 0xd6, 0x6b, 0xd5, 0xfb, + 0xa2, 0x50, 0xce, 0x7d, 0xfe, 0xd5, 0xf6, 0x8a, 0x8c, 0x29, 0x24, 0x7d, 0xfd, 0x3e, 0xac, 0x4e, + 0x2c, 0x4c, 0x30, 0xa1, 0x43, 0x50, 0xbc, 0xfb, 0xf0, 0xf8, 0xc1, 0x7e, 0xb5, 0xd2, 0xa8, 0x29, + 0x8f, 0x8e, 0x1a, 0x35, 0x51, 0x40, 0x17, 0x60, 0xfd, 0xc1, 0xfe, 0x3b, 0xf5, 0x86, 0x52, 0x7d, + 0xb0, 0x5f, 0x3b, 0x6c, 0x28, 0x95, 0x46, 0xa3, 0x52, 0xbd, 0x2f, 0xc6, 0x6f, 0xfc, 0xb1, 0x00, + 0xc9, 0xca, 0x5e, 0x75, 0x1f, 0x55, 0x21, 0x49, 0x41, 0xa2, 0x99, 0x8f, 0x44, 0xcb, 0xb3, 0x8b, + 0x0b, 0xe8, 0x1e, 0xa4, 0x28, 0x7e, 0x84, 0x66, 0xbf, 0x1a, 0x2d, 0xcf, 0xa9, 0x36, 0x90, 0xc1, + 0xd0, 0x1d, 0x39, 0xf3, 0x19, 0x69, 0x79, 0x76, 0xf1, 0x01, 0x3d, 0x80, 0x15, 0x07, 0x3e, 0x98, + 0xf7, 0xb6, 0xb3, 0x3c, 0xb7, 0x22, 0x40, 0xa6, 0xc6, 0x60, 0x98, 0xd9, 0x2f, 0x4c, 0xcb, 0x73, + 0xca, 0x12, 0x68, 0x1f, 0xd2, 0xfc, 0xa2, 0x3e, 0xe7, 0xd1, 0x68, 0x79, 0x5e, 0xa1, 0x01, 0xc9, + 0x90, 0xf5, 0x00, 0xae, 0xf9, 0xef, 0x66, 0xcb, 0x0b, 0x54, 0x5c, 0xd0, 0x07, 0x50, 0x08, 0x82, + 0x00, 0x8b, 0x3d, 0x4c, 0x2d, 0x2f, 0x58, 0xd2, 0x20, 0xfa, 0x83, 0x88, 0xc0, 0x62, 0x0f, 0x55, + 0xcb, 0x0b, 0x56, 0x38, 0xd0, 0x47, 0xb0, 0x36, 0x7d, 0x63, 0x5f, 0xfc, 0xdd, 0x6a, 0x79, 0x89, + 0x9a, 0x07, 0x1a, 0x00, 0x0a, 0xb9, 0xe9, 0x2f, 0xf1, 0x8c, 0xb5, 0xbc, 0x4c, 0x09, 0x04, 0xb5, + 0x61, 0x75, 0xf2, 0xfa, 0xbc, 0xe8, 0xb3, 0xd6, 0xf2, 0xc2, 0xe5, 0x10, 0xd6, 0x4b, 0xf0, 0xda, + 0xbd, 0xe8, 0x33, 0xd7, 0xf2, 0xc2, 0xd5, 0x11, 0xf4, 0x10, 0xc0, 0x77, 0x73, 0x5e, 0xe0, 0xd9, + 0x6b, 0x79, 0x91, 0x3a, 0x09, 0x32, 0x60, 0x3d, 0xec, 0x4a, 0xbd, 0xcc, 0x2b, 0xd8, 0xf2, 0x52, + 0xe5, 0x13, 0xe2, 0xcf, 0xc1, 0xcb, 0xf1, 0x62, 0xaf, 0x62, 0xcb, 0x0b, 0xd6, 0x51, 0x90, 0x05, + 0x1b, 0xa1, 0x17, 0xc2, 0xa5, 0xde, 0xc8, 0x96, 0x97, 0xab, 0xad, 0xa0, 0x2e, 0x88, 0x53, 0xd7, + 0xc8, 0x85, 0x9f, 0xcc, 0x96, 0x17, 0xaf, 0xb2, 0xd0, 0xf5, 0x0a, 0xb9, 0x63, 0x2e, 0xf3, 0x82, + 0xb6, 0xbc, 0x54, 0xd9, 0x65, 0xaf, 0xf2, 0xf5, 0x77, 0x9b, 0xc2, 0x37, 0xdf, 0x6d, 0x0a, 0x7f, + 0xf8, 0x6e, 0x53, 0xf8, 0xe2, 0xe9, 0x66, 0xec, 0x9b, 0xa7, 0x9b, 0xb1, 0xdf, 0x3d, 0xdd, 0x8c, + 0xfd, 0xdb, 0x8b, 0x5d, 0xcd, 0xee, 0x8d, 0x9a, 0x3b, 0x2d, 0x7d, 0xb0, 0xdb, 0xd2, 0x07, 0xd8, + 0x6e, 0x76, 0x6c, 0xef, 0xc3, 0xfb, 0x2f, 0x49, 0x33, 0x4d, 0x33, 0x92, 0x9b, 0x7f, 0x09, 0x00, + 0x00, 0xff, 0xff, 0x30, 0xed, 0xc1, 0x51, 0x6b, 0x32, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -7613,17 +7613,19 @@ func (m *ResponseFetchOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error _ = i var l int _ = l - if m.Vote != nil { - { - size, err := m.Vote.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if len(m.Votes) > 0 { + for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Votes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa } - i-- - dAtA[i] = 0xa } return len(dAtA) - i, nil } @@ -8149,12 +8151,12 @@ func (m *Misbehavior) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x28 } - n61, err61 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err61 != nil { - return 0, err61 + n60, err60 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err60 != nil { + return 0, err60 } - i -= n61 - i = encodeVarintTypes(dAtA, i, uint64(n61)) + i -= n60 + i = encodeVarintTypes(dAtA, i, uint64(n60)) i-- dAtA[i] = 0x22 if m.Height != 0 { @@ -9494,9 +9496,11 @@ func (m *ResponseFetchOracleVotes) Size() (n int) { } var l int _ = l - if m.Vote != nil { - l = m.Vote.Size() - n += 1 + l + sovTypes(uint64(l)) + if len(m.Votes) > 0 { + for _, e := range m.Votes { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } } return n } @@ -16318,7 +16322,7 @@ func (m *ResponseFetchOracleVotes) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Vote", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -16345,10 +16349,8 @@ func (m *ResponseFetchOracleVotes) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Vote == nil { - m.Vote = &oracle.Vote{} - } - if err := m.Vote.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Votes = append(m.Votes, &oracle.Vote{}) + if err := m.Votes[len(m.Votes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/oracle/reactor.go b/oracle/reactor.go index 6e2f1618c54..0c2b73d9da3 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -52,7 +52,7 @@ func NewReactor(config *config.OracleConfig, pubKey crypto.PubKey, privValidator Config: config, UnsignedVoteBuffer: unsignedVoteBuffer, GossipVoteBuffer: gossipVoteBuffer, - SignVotesChan: make(chan *oracleproto.Vote), + SignVotesChan: make(chan []*oracleproto.Vote, 1024), PubKey: pubKey, PrivValidator: privValidator, ProxyApp: proxyApp, diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 215c98ec7cc..a0082a88a30 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -36,8 +36,15 @@ func RunProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.St func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State) { votes := []*oracleproto.Vote{} - for vote := range oracleInfo.SignVotesChan { - votes = append(votes, vote) + + for { + select { + case votes := <-oracleInfo.SignVotesChan: + votes = append(votes, votes...) + continue + default: + } + break } if len(votes) == 0 { @@ -56,10 +63,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State oracleInfo.UnsignedVoteBuffer.Buffer = append(oracleInfo.UnsignedVoteBuffer.Buffer, votes...) unsignedVotes := []*oracleproto.Vote{} - - for _, vote := range oracleInfo.UnsignedVoteBuffer.Buffer { - unsignedVotes = append(unsignedVotes, vote) - } + unsignedVotes = append(unsignedVotes, oracleInfo.UnsignedVoteBuffer.Buffer...) oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() @@ -166,7 +170,7 @@ func Run(oracleInfo *types.OracleInfo, consensusState *cs.State) { continue } - oracleInfo.SignVotesChan <- res.Vote + oracleInfo.SignVotesChan <- res.Votes } } diff --git a/oracle/service/types/info.go b/oracle/service/types/info.go index 3bfed9b532f..1cd6d14a71c 100644 --- a/oracle/service/types/info.go +++ b/oracle/service/types/info.go @@ -14,7 +14,7 @@ type OracleInfo struct { Config *config.OracleConfig UnsignedVoteBuffer *UnsignedVoteBuffer GossipVoteBuffer *GossipVoteBuffer - SignVotesChan chan *oracleproto.Vote + SignVotesChan chan []*oracleproto.Vote PubKey crypto.PubKey PrivValidator types.PrivValidator StopChannel chan int diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto index 618124bdacf..89578d9f84e 100644 --- a/proto/tendermint/abci/types.proto +++ b/proto/tendermint/abci/types.proto @@ -390,7 +390,7 @@ message ResponseCreateOracleResultTx { } message ResponseFetchOracleVotes { - tendermint.oracle.Vote vote = 1; + repeated tendermint.oracle.Vote votes = 1; } message ResponseValidateOracleVotes { From 3f70d300ea558dc67a94c7e28372ee626e5d98f4 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 10 May 2024 16:03:18 +0800 Subject: [PATCH 122/150] fix bug with sign votes channel --- oracle/reactor.go | 2 -- oracle/service/runner/runner.go | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 0c2b73d9da3..332744d54e9 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -7,7 +7,6 @@ import ( "github.com/cometbft/cometbft/config" "github.com/cometbft/cometbft/proxy" - "github.com/sirupsen/logrus" "github.com/cometbft/cometbft/crypto" @@ -82,7 +81,6 @@ func (oracleR *Reactor) SetLogger(l log.Logger) { // OnStart implements p2p.BaseReactor. func (oracleR *Reactor) OnStart() error { - logrus.Info("[oracle] running oracle service...") go func() { runner.Run(oracleR.OracleInfo, oracleR.ConsensusState) }() diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index a0082a88a30..adb301495db 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -39,8 +39,8 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State for { select { - case votes := <-oracleInfo.SignVotesChan: - votes = append(votes, votes...) + case newVotes := <-oracleInfo.SignVotesChan: + votes = append(votes, newVotes...) continue default: } From 1e4948b02f9878d7966c8c7e5b340258c618d06d Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 10 May 2024 16:26:33 +0800 Subject: [PATCH 123/150] re-implement blocking on fetchOracleVotes --- abci/types/types.pb.go | 488 +++++++++++++++--------------- oracle/reactor.go | 2 +- oracle/service/runner/runner.go | 6 +- oracle/service/types/info.go | 2 +- proto/tendermint/abci/types.proto | 2 +- 5 files changed, 249 insertions(+), 251 deletions(-) diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go index 02308642ffd..6f4b9a40d7e 100644 --- a/abci/types/types.pb.go +++ b/abci/types/types.pb.go @@ -3091,7 +3091,7 @@ func (m *ResponseCreateOracleResultTx) GetEncodedTx() []byte { } type ResponseFetchOracleVotes struct { - Votes []*oracle.Vote `protobuf:"bytes,1,rep,name=votes,proto3" json:"votes,omitempty"` + Vote *oracle.Vote `protobuf:"bytes,1,opt,name=vote,proto3" json:"vote,omitempty"` } func (m *ResponseFetchOracleVotes) Reset() { *m = ResponseFetchOracleVotes{} } @@ -3127,9 +3127,9 @@ func (m *ResponseFetchOracleVotes) XXX_DiscardUnknown() { var xxx_messageInfo_ResponseFetchOracleVotes proto.InternalMessageInfo -func (m *ResponseFetchOracleVotes) GetVotes() []*oracle.Vote { +func (m *ResponseFetchOracleVotes) GetVote() *oracle.Vote { if m != nil { - return m.Votes + return m.Vote } return nil } @@ -4031,225 +4031,225 @@ func init() { func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) } var fileDescriptor_252557cfdd89a31a = []byte{ - // 3483 bytes of a gzipped FileDescriptorProto + // 3486 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcd, 0x8f, 0x1b, 0xc7, - 0x95, 0x67, 0xf3, 0x6b, 0xc8, 0xc7, 0x8f, 0xe9, 0xa9, 0x19, 0x49, 0x14, 0x25, 0xcd, 0x8c, 0xda, - 0xb0, 0x2d, 0xcb, 0xf6, 0x8c, 0x57, 0x5a, 0xd9, 0x16, 0x64, 0x2f, 0xc0, 0xa1, 0x28, 0x73, 0x46, - 0xf2, 0xcc, 0xb8, 0x87, 0x92, 0x57, 0xfb, 0xe1, 0x76, 0x93, 0x2c, 0x92, 0x6d, 0x91, 0xec, 0x76, - 0x77, 0x73, 0xcc, 0xf1, 0x69, 0xb1, 0xde, 0x05, 0x16, 0x06, 0x16, 0x30, 0x90, 0x8b, 0x0f, 0xf1, - 0x21, 0x87, 0x5c, 0xf2, 0x17, 0x04, 0x08, 0x90, 0x53, 0x0e, 0x3e, 0xe4, 0xe0, 0x63, 0x4e, 0x4e, - 0x60, 0xdd, 0x0c, 0xe4, 0x94, 0x43, 0xae, 0x41, 0x7d, 0xf4, 0x17, 0xd9, 0xcd, 0x0f, 0xd9, 0x39, - 0x04, 0xc9, 0xad, 0xeb, 0xf1, 0xbd, 0x57, 0x55, 0xaf, 0x5e, 0xd5, 0x7b, 0xf5, 0x7b, 0x45, 0xb8, - 0x64, 0xe3, 0x61, 0x1b, 0x9b, 0x03, 0x6d, 0x68, 0xef, 0xaa, 0xcd, 0x96, 0xb6, 0x6b, 0x9f, 0x19, - 0xd8, 0xda, 0x31, 0x4c, 0xdd, 0xd6, 0xd1, 0xaa, 0xf7, 0xe3, 0x0e, 0xf9, 0xb1, 0x7c, 0xc5, 0xc7, - 0xdd, 0x32, 0xcf, 0x0c, 0x5b, 0xdf, 0x35, 0x4c, 0x5d, 0xef, 0x30, 0xfe, 0xf2, 0xe5, 0xe9, 0x9f, - 0x9f, 0xe0, 0x33, 0xae, 0x2d, 0x20, 0x4c, 0x7b, 0xd9, 0x35, 0x54, 0x53, 0x1d, 0x38, 0x3f, 0x6f, - 0x4f, 0xfd, 0x7c, 0xaa, 0xf6, 0xb5, 0xb6, 0x6a, 0xeb, 0x26, 0xe7, 0xd8, 0xea, 0xea, 0x7a, 0xb7, - 0x8f, 0x77, 0x69, 0xab, 0x39, 0xea, 0xec, 0xda, 0xda, 0x00, 0x5b, 0xb6, 0x3a, 0x30, 0x38, 0xc3, - 0x46, 0x57, 0xef, 0xea, 0xf4, 0x73, 0x97, 0x7c, 0x85, 0xf4, 0xab, 0x9b, 0x6a, 0xab, 0x8f, 0xfd, - 0x93, 0x94, 0x9e, 0xe6, 0x60, 0x45, 0xc6, 0x1f, 0x8f, 0xb0, 0x65, 0xa3, 0x1b, 0x90, 0xc4, 0xad, - 0x9e, 0x5e, 0x12, 0xb6, 0x85, 0x6b, 0xb9, 0x1b, 0x97, 0x77, 0x26, 0xe6, 0xbf, 0xc3, 0xf9, 0x6a, - 0xad, 0x9e, 0x5e, 0x8f, 0xc9, 0x94, 0x17, 0xdd, 0x82, 0x54, 0xa7, 0x3f, 0xb2, 0x7a, 0xa5, 0x38, - 0x15, 0xba, 0x12, 0x25, 0x74, 0x8f, 0x30, 0xd5, 0x63, 0x32, 0xe3, 0x26, 0x5d, 0x69, 0xc3, 0x8e, - 0x5e, 0x4a, 0xcc, 0xee, 0x6a, 0x7f, 0xd8, 0xa1, 0x5d, 0x11, 0x5e, 0xb4, 0x07, 0xa0, 0x0d, 0x35, - 0x5b, 0x69, 0xf5, 0x54, 0x6d, 0x58, 0x4a, 0x51, 0xc9, 0xab, 0xd1, 0x92, 0x9a, 0x5d, 0x25, 0x8c, - 0xf5, 0x98, 0x9c, 0xd5, 0x9c, 0x06, 0x19, 0xee, 0xc7, 0x23, 0x6c, 0x9e, 0x95, 0xd2, 0xb3, 0x87, - 0xfb, 0x1e, 0x61, 0x22, 0xc3, 0xa5, 0xdc, 0xe8, 0x2d, 0xc8, 0xb4, 0x7a, 0xb8, 0xf5, 0x44, 0xb1, - 0xc7, 0xa5, 0x0c, 0x95, 0xdc, 0x8a, 0x92, 0xac, 0x12, 0xbe, 0xc6, 0xb8, 0x1e, 0x93, 0x57, 0x5a, - 0xec, 0x13, 0xbd, 0x09, 0xe9, 0x96, 0x3e, 0x18, 0x68, 0x76, 0x29, 0x47, 0x65, 0x37, 0x23, 0x65, - 0x29, 0x57, 0x3d, 0x26, 0x73, 0x7e, 0x74, 0x08, 0xc5, 0xbe, 0x66, 0xd9, 0x8a, 0x35, 0x54, 0x0d, - 0xab, 0xa7, 0xdb, 0x56, 0x29, 0x4f, 0x35, 0x3c, 0x1f, 0xa5, 0xe1, 0x81, 0x66, 0xd9, 0x27, 0x0e, - 0x73, 0x3d, 0x26, 0x17, 0xfa, 0x7e, 0x02, 0xd1, 0xa7, 0x77, 0x3a, 0xd8, 0x74, 0x15, 0x96, 0x0a, - 0xb3, 0xf5, 0x1d, 0x11, 0x6e, 0x47, 0x9e, 0xe8, 0xd3, 0xfd, 0x04, 0xf4, 0xef, 0xb0, 0xde, 0xd7, - 0xd5, 0xb6, 0xab, 0x4e, 0x69, 0xf5, 0x46, 0xc3, 0x27, 0xa5, 0x22, 0x55, 0xfa, 0x52, 0xe4, 0x20, - 0x75, 0xb5, 0xed, 0xa8, 0xa8, 0x12, 0x81, 0x7a, 0x4c, 0x5e, 0xeb, 0x4f, 0x12, 0xd1, 0x07, 0xb0, - 0xa1, 0x1a, 0x46, 0xff, 0x6c, 0x52, 0xfb, 0x2a, 0xd5, 0x7e, 0x3d, 0x4a, 0x7b, 0x85, 0xc8, 0x4c, - 0xaa, 0x47, 0xea, 0x14, 0x15, 0x35, 0x40, 0x34, 0x4c, 0x6c, 0xa8, 0x26, 0x56, 0x0c, 0x53, 0x37, - 0x74, 0x4b, 0xed, 0x97, 0x44, 0xaa, 0xfb, 0xc5, 0x28, 0xdd, 0xc7, 0x8c, 0xff, 0x98, 0xb3, 0xd7, - 0x63, 0xf2, 0xaa, 0x11, 0x24, 0x31, 0xad, 0x7a, 0x0b, 0x5b, 0x96, 0xa7, 0x75, 0x6d, 0x9e, 0x56, - 0xca, 0x1f, 0xd4, 0x1a, 0x20, 0xa1, 0x1a, 0xe4, 0xf0, 0x98, 0x88, 0x2b, 0xa7, 0xba, 0x8d, 0x4b, - 0x88, 0x2a, 0x94, 0x22, 0x77, 0x28, 0x65, 0x7d, 0xa4, 0xdb, 0xb8, 0x1e, 0x93, 0x01, 0xbb, 0x2d, - 0xa4, 0xc2, 0xb9, 0x53, 0x6c, 0x6a, 0x9d, 0x33, 0xaa, 0x46, 0xa1, 0xbf, 0x58, 0x9a, 0x3e, 0x2c, - 0xad, 0x53, 0x85, 0x2f, 0x47, 0x29, 0x7c, 0x44, 0x85, 0x88, 0x8a, 0x9a, 0x23, 0x52, 0x8f, 0xc9, - 0xeb, 0xa7, 0xd3, 0x64, 0xe2, 0x62, 0x1d, 0x6d, 0xa8, 0xf6, 0xb5, 0x4f, 0xb1, 0xd2, 0xec, 0xeb, - 0xad, 0x27, 0xa5, 0x8d, 0xd9, 0x2e, 0x76, 0x8f, 0x73, 0xef, 0x11, 0x66, 0xe2, 0x62, 0x1d, 0x3f, - 0x01, 0x61, 0xb8, 0xd0, 0x32, 0xb1, 0x6a, 0x63, 0x85, 0x9d, 0x5e, 0x8a, 0x89, 0xad, 0x51, 0xdf, - 0x26, 0x3b, 0xf1, 0x1c, 0x55, 0xfc, 0x4a, 0xe4, 0x6e, 0xa2, 0x62, 0x47, 0x54, 0x4a, 0xa6, 0x42, - 0x74, 0x5b, 0x6e, 0xb4, 0x42, 0xe8, 0xe8, 0x5f, 0x01, 0x75, 0xb0, 0xdd, 0xea, 0x39, 0xbd, 0x10, - 0xfb, 0x58, 0xa5, 0xf3, 0xb4, 0x87, 0x6b, 0x91, 0x43, 0x27, 0x12, 0x4c, 0x11, 0x31, 0x02, 0xd9, - 0x70, 0x62, 0x67, 0x82, 0x46, 0x6d, 0xce, 0x8e, 0x72, 0x1c, 0x54, 0x7e, 0x61, 0x8e, 0xcd, 0xb9, - 0x50, 0x50, 0xff, 0xfa, 0xe9, 0x34, 0x79, 0x6f, 0x05, 0x52, 0xa7, 0x6a, 0x7f, 0x84, 0x0f, 0x92, - 0x99, 0xa4, 0x98, 0x3a, 0x48, 0x66, 0x56, 0xc4, 0xcc, 0x41, 0x32, 0x93, 0x15, 0xe1, 0x20, 0x99, - 0x01, 0x31, 0x27, 0xbd, 0x08, 0x39, 0xdf, 0xe1, 0x8d, 0x4a, 0xb0, 0x32, 0xc0, 0x96, 0xa5, 0x76, - 0x31, 0x3d, 0xeb, 0xb3, 0xb2, 0xd3, 0x94, 0x8a, 0x90, 0xf7, 0x1f, 0xd8, 0xd2, 0x17, 0x82, 0x2b, - 0x49, 0xce, 0x62, 0x22, 0x79, 0x8a, 0x4d, 0xea, 0x32, 0x5c, 0x92, 0x37, 0xd1, 0x73, 0x50, 0xa0, - 0xcb, 0xad, 0x38, 0xbf, 0x93, 0x80, 0x90, 0x94, 0xf3, 0x94, 0xf8, 0x88, 0x33, 0x6d, 0x41, 0xce, - 0xb8, 0x61, 0xb8, 0x2c, 0x09, 0xca, 0x02, 0xc6, 0x0d, 0xc3, 0x61, 0xb8, 0x0a, 0x79, 0x62, 0x03, - 0x97, 0x23, 0x49, 0x3b, 0xc9, 0x11, 0x1a, 0x67, 0x91, 0x7e, 0x1b, 0x07, 0x71, 0xf2, 0x90, 0x47, - 0x6f, 0x42, 0x92, 0x84, 0x43, 0x1e, 0xba, 0xca, 0x3b, 0x2c, 0x56, 0xee, 0x38, 0xb1, 0x72, 0xa7, - 0xe1, 0xc4, 0xca, 0xbd, 0xcc, 0xd7, 0xdf, 0x6e, 0xc5, 0xbe, 0xf8, 0xfd, 0x96, 0x20, 0x53, 0x09, - 0x74, 0x91, 0x1c, 0xed, 0xaa, 0x36, 0x54, 0xb4, 0x36, 0x1d, 0x72, 0x96, 0x9c, 0xdb, 0xaa, 0x36, - 0xdc, 0x6f, 0xa3, 0x07, 0x20, 0xb6, 0xf4, 0xa1, 0x85, 0x87, 0xd6, 0xc8, 0x52, 0x58, 0xb4, 0xe6, - 0x01, 0x2b, 0x10, 0x76, 0x58, 0x38, 0xad, 0x3a, 0x9c, 0xc7, 0x94, 0x51, 0x5e, 0x6d, 0x05, 0x09, - 0xe8, 0x1e, 0x80, 0x1b, 0xd2, 0xad, 0x52, 0x72, 0x3b, 0x71, 0x2d, 0x77, 0x63, 0x7b, 0x6a, 0xf1, - 0x1f, 0x39, 0x2c, 0x0f, 0x0d, 0xb2, 0xca, 0x7b, 0x49, 0x32, 0x5c, 0xd9, 0x27, 0x89, 0x5e, 0x80, - 0x55, 0xd5, 0x30, 0x14, 0xcb, 0x26, 0x0e, 0xd5, 0x3c, 0x23, 0x9e, 0x44, 0x62, 0x61, 0x5e, 0x2e, - 0xa8, 0x86, 0x71, 0x42, 0xa8, 0x7b, 0x84, 0x88, 0x9e, 0x87, 0x22, 0x89, 0x7b, 0x9a, 0xda, 0x57, - 0x7a, 0x58, 0xeb, 0xf6, 0x6c, 0x1a, 0xf3, 0x12, 0x72, 0x81, 0x53, 0xeb, 0x94, 0x28, 0xb5, 0xdd, - 0x15, 0xa7, 0x31, 0x0f, 0x21, 0x48, 0xb6, 0x55, 0x5b, 0xa5, 0x96, 0xcc, 0xcb, 0xf4, 0x9b, 0xd0, - 0x0c, 0xd5, 0xee, 0x71, 0xfb, 0xd0, 0x6f, 0x74, 0x1e, 0xd2, 0x5c, 0x6d, 0x82, 0xaa, 0xe5, 0x2d, - 0xb4, 0x01, 0x29, 0xc3, 0xd4, 0x4f, 0x31, 0x5d, 0xba, 0x8c, 0xcc, 0x1a, 0x92, 0x0c, 0xc5, 0x60, - 0x7c, 0x44, 0x45, 0x88, 0xdb, 0x63, 0xde, 0x4b, 0xdc, 0x1e, 0xa3, 0xd7, 0x20, 0x49, 0x0c, 0x49, - 0xfb, 0x28, 0x86, 0x64, 0x04, 0x5c, 0xae, 0x71, 0x66, 0x60, 0x99, 0x72, 0x4a, 0xab, 0x50, 0x08, - 0xc4, 0x4d, 0xe9, 0x3c, 0x6c, 0x84, 0x85, 0x41, 0xa9, 0xe7, 0xd2, 0x03, 0xe1, 0x0c, 0xdd, 0x82, - 0x8c, 0x1b, 0x07, 0x99, 0xe3, 0x5c, 0x9c, 0xea, 0xd6, 0x61, 0x96, 0x5d, 0x56, 0xe2, 0x31, 0x64, - 0x01, 0x7a, 0x2a, 0xcf, 0x7a, 0xf2, 0xf2, 0x8a, 0x6a, 0x18, 0x75, 0xd5, 0xea, 0x49, 0x1f, 0x42, - 0x29, 0x2a, 0xc6, 0xf9, 0x0c, 0x26, 0x50, 0xb7, 0x77, 0x0c, 0x76, 0x1e, 0xd2, 0x1d, 0xdd, 0x1c, - 0xa8, 0x36, 0x55, 0x56, 0x90, 0x79, 0x8b, 0x18, 0x92, 0xc5, 0xbb, 0x04, 0x25, 0xb3, 0x86, 0xa4, - 0xc0, 0xc5, 0xc8, 0x38, 0x47, 0x44, 0xb4, 0x61, 0x1b, 0x33, 0xb3, 0x16, 0x64, 0xd6, 0xf0, 0x14, - 0xb1, 0xc1, 0xb2, 0x06, 0xe9, 0xd6, 0xa2, 0x73, 0xa5, 0xfa, 0xb3, 0x32, 0x6f, 0x49, 0x5f, 0x26, - 0xe0, 0x7c, 0x78, 0xb4, 0x43, 0xdb, 0x90, 0x1f, 0xa8, 0x63, 0xc5, 0x1e, 0x73, 0xb7, 0x13, 0xe8, - 0xc2, 0xc3, 0x40, 0x1d, 0x37, 0xc6, 0xcc, 0xe7, 0x44, 0x48, 0xd8, 0x63, 0xab, 0x14, 0xdf, 0x4e, - 0x5c, 0xcb, 0xcb, 0xe4, 0x13, 0x3d, 0x84, 0xb5, 0xbe, 0xde, 0x52, 0xfb, 0x4a, 0x5f, 0xb5, 0x6c, - 0x85, 0xa7, 0x41, 0x6c, 0x13, 0x3d, 0x37, 0x65, 0x6c, 0x16, 0xb7, 0x70, 0x9b, 0xad, 0x27, 0x39, - 0x70, 0xb8, 0xff, 0xaf, 0x52, 0x1d, 0x0f, 0x54, 0x67, 0xa9, 0xd1, 0x5d, 0xc8, 0x0d, 0x34, 0xab, - 0x89, 0x7b, 0xea, 0xa9, 0xa6, 0x9b, 0x7c, 0x37, 0x4d, 0x3b, 0xcd, 0xbb, 0x1e, 0x0f, 0xd7, 0xe4, - 0x17, 0xf3, 0x2d, 0x49, 0x2a, 0xe0, 0xc3, 0xce, 0x69, 0x92, 0x5e, 0xfa, 0x34, 0x79, 0x0d, 0x36, - 0x86, 0x78, 0x6c, 0x2b, 0xde, 0x7e, 0x65, 0x7e, 0xb2, 0x42, 0x4d, 0x8f, 0xc8, 0x6f, 0xee, 0x0e, - 0xb7, 0x88, 0xcb, 0xa0, 0x97, 0x68, 0xbe, 0x60, 0xe8, 0x16, 0x36, 0x15, 0xb5, 0xdd, 0x36, 0xb1, - 0x65, 0xd1, 0x14, 0x33, 0x4f, 0x93, 0x00, 0x4a, 0xaf, 0x30, 0xb2, 0xf4, 0x7f, 0xfe, 0xa5, 0x09, - 0xe6, 0x07, 0xdc, 0xf0, 0x82, 0x67, 0xf8, 0x13, 0xd8, 0xe0, 0xf2, 0xed, 0x80, 0xed, 0x59, 0x9e, - 0x7e, 0x69, 0x7a, 0x7f, 0x4d, 0xda, 0x1c, 0x39, 0xe2, 0xd1, 0x66, 0x4f, 0x3c, 0x9b, 0xd9, 0x11, - 0x24, 0xa9, 0x51, 0x92, 0xec, 0x88, 0x21, 0xdf, 0x7f, 0x6b, 0x4b, 0xf1, 0x59, 0x02, 0xd6, 0xa6, - 0x92, 0x2d, 0x77, 0x62, 0x42, 0xe8, 0xc4, 0xe2, 0xa1, 0x13, 0x4b, 0x2c, 0x3d, 0x31, 0xbe, 0xd6, - 0xc9, 0xf9, 0x6b, 0x9d, 0xfa, 0x11, 0xd7, 0x3a, 0xfd, 0x6c, 0x6b, 0xfd, 0x57, 0x5d, 0x85, 0x9f, - 0x0a, 0x50, 0x8e, 0xce, 0x50, 0x43, 0x97, 0xe3, 0x65, 0x58, 0x73, 0x87, 0xe2, 0xaa, 0x67, 0x07, - 0xa3, 0xe8, 0xfe, 0xc0, 0xf5, 0x47, 0xc6, 0xb8, 0xe7, 0xa1, 0x38, 0x91, 0x3f, 0x33, 0x57, 0x2e, - 0x9c, 0xfa, 0xfb, 0x97, 0xfe, 0x27, 0xe1, 0x06, 0x9e, 0x40, 0x92, 0x1b, 0xb2, 0x5b, 0xdf, 0x83, - 0xf5, 0x36, 0x6e, 0x69, 0xed, 0x67, 0xdd, 0xac, 0x6b, 0x5c, 0xfa, 0x1f, 0x7b, 0x75, 0xda, 0x4b, - 0x3a, 0x70, 0x69, 0xc6, 0x8d, 0x00, 0xbd, 0x03, 0xc5, 0xae, 0x6e, 0x59, 0x9a, 0x81, 0xdb, 0x3c, - 0x31, 0x17, 0xa6, 0x73, 0x33, 0x96, 0xb8, 0xef, 0xbc, 0xc3, 0x19, 0x69, 0xda, 0x2d, 0x17, 0xba, - 0xfe, 0xa6, 0x74, 0x11, 0x2e, 0x44, 0xdc, 0x0b, 0xa4, 0xdb, 0x9e, 0x9f, 0x4e, 0xa7, 0xef, 0xe8, - 0x12, 0x64, 0xf9, 0xc5, 0xc0, 0xcd, 0x88, 0x32, 0x8c, 0xd0, 0x18, 0x4b, 0xbf, 0xca, 0x43, 0x46, - 0xc6, 0x96, 0x41, 0xb2, 0x49, 0xb4, 0x07, 0x59, 0x3c, 0x6e, 0x61, 0xc3, 0x76, 0x12, 0xf0, 0xf0, - 0x4b, 0x20, 0xe3, 0xae, 0x39, 0x9c, 0xf5, 0x98, 0xec, 0x89, 0xa1, 0x9b, 0x1c, 0xe5, 0x89, 0x06, - 0x6c, 0xb8, 0xb8, 0x1f, 0xe6, 0x79, 0xdd, 0x81, 0x79, 0x12, 0x91, 0x08, 0x06, 0x93, 0x9a, 0xc0, - 0x79, 0x6e, 0x72, 0x9c, 0x27, 0x39, 0xa7, 0xb3, 0x00, 0xd0, 0x53, 0x0d, 0x00, 0x3d, 0xe9, 0x39, - 0xd3, 0x8c, 0x40, 0x7a, 0x5e, 0x77, 0x90, 0x9e, 0x95, 0x39, 0x23, 0x9e, 0x80, 0x7a, 0xde, 0xf6, - 0x41, 0x3d, 0x59, 0x2a, 0xba, 0x1d, 0x29, 0x1a, 0x82, 0xf5, 0xdc, 0x76, 0xb1, 0x9e, 0x7c, 0x24, - 0x4e, 0xc4, 0x85, 0x27, 0xc1, 0x9e, 0xa3, 0x29, 0xb0, 0x87, 0x81, 0x33, 0x2f, 0x44, 0xaa, 0x98, - 0x83, 0xf6, 0x1c, 0x4d, 0xa1, 0x3d, 0xc5, 0x39, 0x0a, 0xe7, 0xc0, 0x3d, 0xff, 0x11, 0x0e, 0xf7, - 0x44, 0x03, 0x32, 0x7c, 0x98, 0x8b, 0xe1, 0x3d, 0x4a, 0x04, 0xde, 0x23, 0x46, 0xde, 0x93, 0x99, - 0xfa, 0x85, 0x01, 0x9f, 0x87, 0x21, 0x80, 0xcf, 0x5a, 0xe4, 0x0d, 0x9f, 0x29, 0x5f, 0x00, 0xf1, - 0x79, 0x18, 0x82, 0xf8, 0xa0, 0xb9, 0x6a, 0xe7, 0x42, 0x3e, 0xf7, 0x82, 0x90, 0xcf, 0x7a, 0x44, - 0xce, 0xec, 0xed, 0xf6, 0x08, 0xcc, 0xa7, 0x19, 0x85, 0xf9, 0x6c, 0x44, 0xc2, 0x27, 0x4c, 0xe3, - 0x12, 0xa0, 0xcf, 0xd1, 0x14, 0xe8, 0x73, 0x6e, 0x8e, 0xa7, 0xcd, 0x41, 0x7d, 0x3a, 0xd1, 0xa8, - 0x0f, 0xc3, 0x64, 0x5e, 0x8d, 0xde, 0x57, 0xcb, 0xc0, 0x3e, 0x8f, 0x43, 0x61, 0x9f, 0x0b, 0x91, - 0xf8, 0x25, 0x1f, 0xfc, 0x22, 0xb8, 0x4f, 0x33, 0x0a, 0xf7, 0x29, 0xcd, 0xb3, 0xfb, 0x33, 0x01, - 0x3f, 0x29, 0x31, 0x7d, 0x90, 0xcc, 0x64, 0xc4, 0x2c, 0x83, 0x7c, 0x0e, 0x92, 0x99, 0x9c, 0x98, - 0x97, 0x5e, 0x22, 0x69, 0xea, 0x44, 0x38, 0x20, 0x17, 0x42, 0x6c, 0x9a, 0xba, 0xc9, 0x21, 0x1c, - 0xd6, 0x90, 0xae, 0x41, 0xde, 0x7f, 0xf4, 0xcf, 0x00, 0x89, 0xe8, 0xc5, 0xdb, 0x77, 0xdc, 0x4b, - 0xbf, 0x14, 0x3c, 0x59, 0x0a, 0x13, 0xf9, 0x41, 0x84, 0x2c, 0x07, 0x11, 0x7c, 0xd0, 0x51, 0x3c, - 0x08, 0x1d, 0x6d, 0x41, 0x8e, 0x5c, 0xa8, 0x27, 0x50, 0x21, 0xd5, 0x70, 0x51, 0xa1, 0xeb, 0xb0, - 0x46, 0xb3, 0x22, 0x06, 0x30, 0xf1, 0xdc, 0x23, 0x49, 0x73, 0x8f, 0x55, 0xf2, 0x03, 0x73, 0x22, - 0x96, 0x84, 0xbc, 0x0a, 0xeb, 0x3e, 0x5e, 0xf7, 0xa2, 0xce, 0x20, 0x12, 0xd1, 0xe5, 0xae, 0xf0, - 0x1b, 0xfb, 0x6f, 0x04, 0xcf, 0x42, 0x1e, 0x9c, 0x14, 0x86, 0xfc, 0x08, 0x3f, 0x12, 0xf2, 0x13, - 0x7f, 0x66, 0xe4, 0xc7, 0x0f, 0x3c, 0x24, 0x82, 0xc0, 0xc3, 0x9f, 0x05, 0x6f, 0x4d, 0x5c, 0x1c, - 0xa7, 0xa5, 0xb7, 0x31, 0x87, 0x02, 0xe8, 0x37, 0xc9, 0x3b, 0xfb, 0x7a, 0x97, 0x5f, 0xf8, 0xc9, - 0x27, 0xe1, 0x72, 0xe3, 0x73, 0x96, 0x87, 0x5f, 0x17, 0x45, 0x60, 0xd9, 0x1d, 0x47, 0x11, 0x44, - 0x48, 0x3c, 0xc1, 0xac, 0x6e, 0x92, 0x97, 0xc9, 0x27, 0xe1, 0xa3, 0xce, 0xc7, 0xb3, 0x34, 0xd6, - 0x40, 0x6f, 0x42, 0x96, 0x16, 0xc5, 0x14, 0xdd, 0xb0, 0x78, 0xad, 0x24, 0x90, 0xbf, 0xb2, 0xca, - 0xd8, 0xce, 0x31, 0xe1, 0x39, 0x32, 0x2c, 0x39, 0x63, 0xf0, 0x2f, 0x5f, 0x5a, 0x99, 0x0d, 0xa4, - 0x95, 0x97, 0x21, 0x4b, 0x46, 0x6f, 0x19, 0x6a, 0x0b, 0x97, 0x80, 0x0e, 0xd4, 0x23, 0x48, 0xbf, - 0x88, 0xc3, 0xea, 0x44, 0x3c, 0x0e, 0x9d, 0xbb, 0xe3, 0x92, 0x71, 0x1f, 0xae, 0xb5, 0x98, 0x3d, - 0x36, 0x01, 0xba, 0xaa, 0xa5, 0x7c, 0xa2, 0x0e, 0x6d, 0xdc, 0xe6, 0x46, 0xf1, 0x51, 0x50, 0x19, - 0x32, 0xa4, 0x35, 0xb2, 0x70, 0x9b, 0x43, 0x6c, 0x6e, 0x1b, 0xd5, 0x21, 0x8d, 0x4f, 0xf1, 0xd0, - 0xb6, 0x4a, 0x2b, 0x74, 0xd9, 0xcf, 0x4f, 0x63, 0x1e, 0xe4, 0xe7, 0xbd, 0x12, 0x59, 0xec, 0xef, - 0xbf, 0xdd, 0x12, 0x19, 0xf7, 0x2b, 0xfa, 0x40, 0xb3, 0xf1, 0xc0, 0xb0, 0xcf, 0x64, 0x2e, 0x1f, - 0xb4, 0x42, 0x66, 0xc2, 0x0a, 0x14, 0xec, 0xcd, 0x3b, 0x18, 0x0e, 0xb1, 0xa9, 0xa6, 0x9b, 0x9a, - 0x7d, 0x26, 0x17, 0x06, 0x78, 0x60, 0xe8, 0x7a, 0x5f, 0x61, 0x7b, 0xbc, 0x02, 0xc5, 0x60, 0xfa, - 0x81, 0x9e, 0x83, 0x82, 0x89, 0x6d, 0x55, 0x1b, 0x2a, 0x81, 0x9b, 0x4e, 0x9e, 0x11, 0xd9, 0x9e, - 0x3a, 0x48, 0x66, 0x04, 0x31, 0x7e, 0x90, 0xcc, 0xc4, 0xc5, 0x84, 0x74, 0x0c, 0xe7, 0x42, 0xd3, - 0x0f, 0xf4, 0x06, 0x64, 0xbd, 0xcc, 0x85, 0xa5, 0xd0, 0x33, 0xe0, 0x34, 0x8f, 0x57, 0xfa, 0xb5, - 0xe0, 0xa9, 0x0c, 0x02, 0x74, 0x35, 0x48, 0xb3, 0x73, 0x9f, 0xae, 0x64, 0x71, 0xc6, 0xa1, 0x1f, - 0x90, 0xdb, 0x61, 0xc7, 0xbb, 0xcc, 0x85, 0xa5, 0x0f, 0x20, 0xcd, 0x28, 0x28, 0x07, 0x2b, 0x0f, - 0x0f, 0xef, 0x1f, 0x1e, 0xbd, 0x7f, 0x28, 0xc6, 0x10, 0x40, 0xba, 0x52, 0xad, 0xd6, 0x8e, 0x1b, - 0xa2, 0x80, 0xb2, 0x90, 0xaa, 0xec, 0x1d, 0xc9, 0x0d, 0x31, 0x4e, 0xc8, 0x72, 0xed, 0xa0, 0x56, - 0x6d, 0x88, 0x09, 0xb4, 0x06, 0x05, 0xf6, 0xad, 0xdc, 0x3b, 0x92, 0xdf, 0xad, 0x34, 0xc4, 0xa4, - 0x8f, 0x74, 0x52, 0x3b, 0xbc, 0x5b, 0x93, 0xc5, 0x94, 0xf4, 0x4f, 0x70, 0x31, 0x32, 0xd5, 0xf1, - 0xd0, 0x37, 0xc1, 0x87, 0xbe, 0x49, 0x5f, 0xc6, 0xc9, 0x8d, 0x20, 0x2a, 0x7f, 0x41, 0x07, 0x13, - 0x13, 0xbf, 0xb1, 0x44, 0xf2, 0x33, 0x31, 0x7b, 0x72, 0x59, 0x35, 0x31, 0x0b, 0x72, 0xb4, 0x6f, - 0x76, 0x02, 0x15, 0xe4, 0x02, 0xa7, 0x52, 0x21, 0x8b, 0xb1, 0x7d, 0x84, 0x5b, 0xb6, 0xc2, 0x9c, - 0xc8, 0xa2, 0x37, 0xc6, 0x2c, 0x61, 0x23, 0xd4, 0x13, 0x46, 0x94, 0x3e, 0x5c, 0xca, 0x96, 0x59, - 0x48, 0xc9, 0xb5, 0x86, 0xfc, 0x58, 0x4c, 0x20, 0x04, 0x45, 0xfa, 0xa9, 0x9c, 0x1c, 0x56, 0x8e, - 0x4f, 0xea, 0x47, 0xc4, 0x96, 0xeb, 0xb0, 0xea, 0xd8, 0xd2, 0x21, 0xa6, 0xa4, 0x97, 0xc9, 0x35, - 0x2a, 0x34, 0xf9, 0x9a, 0xbe, 0x37, 0x4b, 0x3f, 0x13, 0xfc, 0xdc, 0xc1, 0x04, 0xea, 0x08, 0xd2, - 0x96, 0xad, 0xda, 0x23, 0x8b, 0x1b, 0xf1, 0x8d, 0x45, 0xb3, 0xb1, 0x1d, 0xe7, 0xe3, 0x84, 0x8a, - 0xcb, 0x5c, 0x8d, 0x74, 0x0b, 0x8a, 0xc1, 0x5f, 0xa2, 0x6d, 0xe0, 0x39, 0x51, 0x5c, 0xba, 0x03, - 0x68, 0x3a, 0x49, 0x0b, 0xc1, 0x10, 0x84, 0x30, 0x0c, 0xe1, 0xe7, 0x02, 0xb9, 0xbd, 0x46, 0x26, - 0x64, 0xe8, 0xbd, 0x89, 0x49, 0xde, 0x5e, 0x26, 0x9d, 0xdb, 0x61, 0xb4, 0x89, 0x69, 0xde, 0x84, - 0xbc, 0x9f, 0xbe, 0xd8, 0x24, 0xbf, 0x8f, 0x7b, 0x9b, 0x38, 0x08, 0x76, 0x78, 0x47, 0xa0, 0xf0, - 0x03, 0x8f, 0xc0, 0xb7, 0x00, 0xec, 0x31, 0xcf, 0x04, 0x9d, 0x38, 0x7a, 0x25, 0x04, 0x44, 0xc6, - 0xad, 0xc6, 0x98, 0x6f, 0x82, 0xac, 0xcd, 0xbf, 0x2c, 0x74, 0xe2, 0x47, 0x7e, 0x46, 0x34, 0xc6, - 0x5a, 0x1c, 0x15, 0x59, 0x34, 0x18, 0x7b, 0x08, 0x11, 0x23, 0x5b, 0xe8, 0x31, 0x5c, 0x98, 0x48, - 0x14, 0x5c, 0xd5, 0xc9, 0x45, 0xf3, 0x85, 0x73, 0xc1, 0x7c, 0xc1, 0x51, 0xed, 0x8f, 0xf6, 0xa9, - 0x60, 0xb4, 0x7f, 0x1b, 0x2e, 0xcf, 0xca, 0x76, 0xd1, 0x15, 0x00, 0x3c, 0x24, 0xc1, 0xa1, 0xed, - 0x21, 0x0a, 0x59, 0x4e, 0x69, 0x8c, 0xa5, 0x7d, 0x28, 0x45, 0x65, 0xb2, 0xe8, 0x55, 0x48, 0xf9, - 0x41, 0x90, 0x0b, 0x21, 0x20, 0x08, 0x61, 0x94, 0x19, 0x97, 0xf4, 0xff, 0x7e, 0xf7, 0x0c, 0x81, - 0x36, 0xee, 0x4f, 0xb8, 0xe7, 0xcd, 0x65, 0xb2, 0xde, 0x9d, 0x09, 0xc7, 0xbc, 0x0a, 0x69, 0xee, - 0x92, 0x00, 0x69, 0xb5, 0x69, 0xe1, 0xa1, 0x2d, 0xc6, 0x88, 0x7b, 0x1a, 0x26, 0xa6, 0x0d, 0x41, - 0x7a, 0x0c, 0xe0, 0x61, 0x63, 0xe4, 0xec, 0x35, 0xf5, 0xd1, 0xb0, 0x4d, 0x3b, 0x4f, 0xc9, 0xac, - 0x81, 0x6e, 0x39, 0x53, 0x8c, 0x47, 0x04, 0x29, 0xd2, 0xb9, 0x0f, 0x5b, 0xe3, 0x53, 0xd5, 0x00, - 0x4d, 0xd7, 0x27, 0x22, 0xba, 0x78, 0x3b, 0xd8, 0xc5, 0xd5, 0xc8, 0x4a, 0x47, 0x78, 0x57, 0x9f, - 0x42, 0x8a, 0xee, 0x09, 0x92, 0x8e, 0xd0, 0xa2, 0x18, 0xcf, 0xa3, 0xc9, 0x37, 0xfa, 0x4f, 0x00, - 0xd5, 0xb6, 0x4d, 0xad, 0x39, 0xf2, 0x3a, 0xd8, 0x0a, 0xdf, 0x53, 0x15, 0x87, 0x6f, 0xef, 0x32, - 0xdf, 0x5c, 0x1b, 0x9e, 0xa8, 0x6f, 0x83, 0xf9, 0x14, 0x4a, 0x87, 0x50, 0x0c, 0xca, 0x3a, 0x99, - 0x1f, 0x1b, 0x43, 0x30, 0xf3, 0x63, 0x89, 0x3c, 0xcf, 0xfc, 0xdc, 0xbc, 0x31, 0xc1, 0x2a, 0x7f, - 0xb4, 0x21, 0xfd, 0x57, 0x1c, 0xf2, 0xfe, 0x2d, 0xf9, 0xf7, 0x97, 0x9c, 0x49, 0xff, 0x2b, 0x40, - 0xc6, 0x9d, 0x7e, 0xb0, 0x0c, 0x18, 0xa8, 0x9b, 0x32, 0xeb, 0xc5, 0xfd, 0xb5, 0x3b, 0x56, 0x25, - 0x4d, 0xb8, 0x55, 0xd2, 0x3b, 0x6e, 0x62, 0x10, 0x85, 0xa8, 0xf9, 0x6d, 0xcd, 0xbd, 0xca, 0xc9, - 0x83, 0xee, 0x40, 0xd6, 0x3d, 0xd7, 0xc8, 0x75, 0xcc, 0xc1, 0x4d, 0x05, 0x7e, 0xba, 0x70, 0xd4, - 0x7b, 0x03, 0x52, 0x86, 0xfe, 0x09, 0x2f, 0x0c, 0x26, 0x64, 0xd6, 0x90, 0xda, 0xb0, 0x3a, 0x71, - 0x28, 0xa2, 0x3b, 0xb0, 0x62, 0x8c, 0x9a, 0x8a, 0xe3, 0x1c, 0x13, 0xe8, 0xb2, 0x93, 0xe8, 0x8f, - 0x9a, 0x7d, 0xad, 0x75, 0x1f, 0x9f, 0x39, 0x83, 0x31, 0x46, 0xcd, 0xfb, 0xcc, 0x87, 0x58, 0x2f, - 0x71, 0x7f, 0x2f, 0x3f, 0x11, 0x20, 0xe3, 0xec, 0x09, 0xf4, 0x2f, 0x90, 0x75, 0x0f, 0x5c, 0xb7, - 0xb2, 0x1f, 0x79, 0x52, 0x73, 0xfd, 0x9e, 0x08, 0xaa, 0x38, 0x4f, 0x12, 0xb4, 0xb6, 0xd2, 0xe9, - 0xab, 0xcc, 0x97, 0x8a, 0x41, 0x9b, 0xb1, 0x23, 0x99, 0x46, 0xaa, 0xfd, 0xbb, 0xf7, 0xfa, 0x6a, - 0x57, 0xce, 0x51, 0x99, 0xfd, 0x36, 0x69, 0xf0, 0x9c, 0xf7, 0x4f, 0x02, 0x88, 0x93, 0x3b, 0xf6, - 0x07, 0x8f, 0x6e, 0x3a, 0x01, 0x48, 0x84, 0x24, 0x00, 0x68, 0x17, 0xd6, 0x5d, 0x0e, 0xc5, 0xd2, - 0xba, 0x43, 0xd5, 0x1e, 0x99, 0x98, 0xe3, 0xf1, 0xc8, 0xfd, 0xe9, 0xc4, 0xf9, 0x65, 0x7a, 0xd6, - 0xa9, 0x67, 0x9c, 0xf5, 0x67, 0x71, 0xc8, 0xf9, 0xaa, 0x03, 0xe8, 0x9f, 0x7d, 0x87, 0x51, 0x31, - 0x24, 0x66, 0xfa, 0x78, 0xbd, 0x2a, 0x7d, 0xd0, 0x4c, 0xf1, 0xe5, 0xcd, 0x14, 0x55, 0x83, 0x71, - 0x8a, 0x0d, 0xc9, 0xa5, 0x8b, 0x0d, 0xaf, 0x00, 0xb2, 0x75, 0x5b, 0xed, 0x2b, 0xa7, 0xba, 0xad, - 0x0d, 0xbb, 0x0a, 0x73, 0x43, 0x76, 0x74, 0x88, 0xf4, 0x97, 0x47, 0xf4, 0x87, 0x63, 0xea, 0x91, - 0xff, 0x2d, 0x40, 0xc6, 0xbd, 0x90, 0x2c, 0x5b, 0xc3, 0x3f, 0x0f, 0x69, 0x9e, 0x73, 0xb3, 0x22, - 0x3e, 0x6f, 0x85, 0x56, 0x55, 0xca, 0x90, 0x19, 0x60, 0x5b, 0xa5, 0xe7, 0x20, 0x8b, 0xf7, 0x6e, - 0xfb, 0xfa, 0x6d, 0xc8, 0xf9, 0xde, 0x3f, 0x90, 0xa3, 0xf1, 0xb0, 0xf6, 0xbe, 0x18, 0x2b, 0xaf, - 0x7c, 0xfe, 0xd5, 0x76, 0xe2, 0x10, 0x7f, 0x42, 0x76, 0xb3, 0x5c, 0xab, 0xd6, 0x6b, 0xd5, 0xfb, - 0xa2, 0x50, 0xce, 0x7d, 0xfe, 0xd5, 0xf6, 0x8a, 0x8c, 0x29, 0x24, 0x7d, 0xfd, 0x3e, 0xac, 0x4e, - 0x2c, 0x4c, 0x30, 0xa1, 0x43, 0x50, 0xbc, 0xfb, 0xf0, 0xf8, 0xc1, 0x7e, 0xb5, 0xd2, 0xa8, 0x29, - 0x8f, 0x8e, 0x1a, 0x35, 0x51, 0x40, 0x17, 0x60, 0xfd, 0xc1, 0xfe, 0x3b, 0xf5, 0x86, 0x52, 0x7d, - 0xb0, 0x5f, 0x3b, 0x6c, 0x28, 0x95, 0x46, 0xa3, 0x52, 0xbd, 0x2f, 0xc6, 0x6f, 0xfc, 0xb1, 0x00, - 0xc9, 0xca, 0x5e, 0x75, 0x1f, 0x55, 0x21, 0x49, 0x41, 0xa2, 0x99, 0x8f, 0x44, 0xcb, 0xb3, 0x8b, - 0x0b, 0xe8, 0x1e, 0xa4, 0x28, 0x7e, 0x84, 0x66, 0xbf, 0x1a, 0x2d, 0xcf, 0xa9, 0x36, 0x90, 0xc1, - 0xd0, 0x1d, 0x39, 0xf3, 0x19, 0x69, 0x79, 0x76, 0xf1, 0x01, 0x3d, 0x80, 0x15, 0x07, 0x3e, 0x98, - 0xf7, 0xb6, 0xb3, 0x3c, 0xb7, 0x22, 0x40, 0xa6, 0xc6, 0x60, 0x98, 0xd9, 0x2f, 0x4c, 0xcb, 0x73, - 0xca, 0x12, 0x68, 0x1f, 0xd2, 0xfc, 0xa2, 0x3e, 0xe7, 0xd1, 0x68, 0x79, 0x5e, 0xa1, 0x01, 0xc9, - 0x90, 0xf5, 0x00, 0xae, 0xf9, 0xef, 0x66, 0xcb, 0x0b, 0x54, 0x5c, 0xd0, 0x07, 0x50, 0x08, 0x82, - 0x00, 0x8b, 0x3d, 0x4c, 0x2d, 0x2f, 0x58, 0xd2, 0x20, 0xfa, 0x83, 0x88, 0xc0, 0x62, 0x0f, 0x55, - 0xcb, 0x0b, 0x56, 0x38, 0xd0, 0x47, 0xb0, 0x36, 0x7d, 0x63, 0x5f, 0xfc, 0xdd, 0x6a, 0x79, 0x89, - 0x9a, 0x07, 0x1a, 0x00, 0x0a, 0xb9, 0xe9, 0x2f, 0xf1, 0x8c, 0xb5, 0xbc, 0x4c, 0x09, 0x04, 0xb5, - 0x61, 0x75, 0xf2, 0xfa, 0xbc, 0xe8, 0xb3, 0xd6, 0xf2, 0xc2, 0xe5, 0x10, 0xd6, 0x4b, 0xf0, 0xda, - 0xbd, 0xe8, 0x33, 0xd7, 0xf2, 0xc2, 0xd5, 0x11, 0xf4, 0x10, 0xc0, 0x77, 0x73, 0x5e, 0xe0, 0xd9, - 0x6b, 0x79, 0x91, 0x3a, 0x09, 0x32, 0x60, 0x3d, 0xec, 0x4a, 0xbd, 0xcc, 0x2b, 0xd8, 0xf2, 0x52, - 0xe5, 0x13, 0xe2, 0xcf, 0xc1, 0xcb, 0xf1, 0x62, 0xaf, 0x62, 0xcb, 0x0b, 0xd6, 0x51, 0x90, 0x05, - 0x1b, 0xa1, 0x17, 0xc2, 0xa5, 0xde, 0xc8, 0x96, 0x97, 0xab, 0xad, 0xa0, 0x2e, 0x88, 0x53, 0xd7, - 0xc8, 0x85, 0x9f, 0xcc, 0x96, 0x17, 0xaf, 0xb2, 0xd0, 0xf5, 0x0a, 0xb9, 0x63, 0x2e, 0xf3, 0x82, - 0xb6, 0xbc, 0x54, 0xd9, 0x65, 0xaf, 0xf2, 0xf5, 0x77, 0x9b, 0xc2, 0x37, 0xdf, 0x6d, 0x0a, 0x7f, - 0xf8, 0x6e, 0x53, 0xf8, 0xe2, 0xe9, 0x66, 0xec, 0x9b, 0xa7, 0x9b, 0xb1, 0xdf, 0x3d, 0xdd, 0x8c, - 0xfd, 0xdb, 0x8b, 0x5d, 0xcd, 0xee, 0x8d, 0x9a, 0x3b, 0x2d, 0x7d, 0xb0, 0xdb, 0xd2, 0x07, 0xd8, - 0x6e, 0x76, 0x6c, 0xef, 0xc3, 0xfb, 0x2f, 0x49, 0x33, 0x4d, 0x33, 0x92, 0x9b, 0x7f, 0x09, 0x00, - 0x00, 0xff, 0xff, 0x30, 0xed, 0xc1, 0x51, 0x6b, 0x32, 0x00, 0x00, + 0xb1, 0xe7, 0xf0, 0x6b, 0xc9, 0xe2, 0xc7, 0xce, 0xf6, 0xae, 0x24, 0x8a, 0x92, 0x76, 0x57, 0x63, + 0xd8, 0x96, 0x25, 0x7b, 0xd7, 0x4f, 0x7a, 0xb2, 0x2d, 0xc8, 0x7e, 0xc0, 0x2e, 0x45, 0x89, 0xbb, + 0x92, 0x77, 0xd7, 0xb3, 0x94, 0xfc, 0xf4, 0x5e, 0xe2, 0xf1, 0x90, 0x6c, 0x92, 0x63, 0x91, 0x9c, + 0xf1, 0xcc, 0x70, 0xcd, 0xf5, 0x29, 0x88, 0x13, 0x20, 0x30, 0x10, 0xc0, 0x40, 0x2e, 0x3e, 0xc4, + 0x87, 0x1c, 0x72, 0xc9, 0x5f, 0x10, 0x20, 0x40, 0x4e, 0x39, 0xf8, 0x90, 0x83, 0x8f, 0x39, 0x39, + 0x81, 0x75, 0x33, 0x90, 0x53, 0x0e, 0xb9, 0x06, 0xfd, 0x31, 0x5f, 0xe4, 0x0c, 0x3f, 0x64, 0xe7, + 0x10, 0x24, 0xb7, 0xe9, 0x62, 0x55, 0x75, 0x77, 0x75, 0x75, 0x57, 0xf5, 0xaf, 0x9a, 0x70, 0xc1, + 0xc6, 0x83, 0x16, 0x36, 0xfb, 0xda, 0xc0, 0xde, 0x56, 0x1b, 0x4d, 0x6d, 0xdb, 0x3e, 0x35, 0xb0, + 0xb5, 0x65, 0x98, 0xba, 0xad, 0xa3, 0x65, 0xef, 0xc7, 0x2d, 0xf2, 0x63, 0xf9, 0x92, 0x8f, 0xbb, + 0x69, 0x9e, 0x1a, 0xb6, 0xbe, 0x6d, 0x98, 0xba, 0xde, 0x66, 0xfc, 0xe5, 0x8b, 0x93, 0x3f, 0x3f, + 0xc1, 0xa7, 0x5c, 0x5b, 0x40, 0x98, 0xf6, 0xb2, 0x6d, 0xa8, 0xa6, 0xda, 0x77, 0x7e, 0xde, 0x9c, + 0xf8, 0xf9, 0x44, 0xed, 0x69, 0x2d, 0xd5, 0xd6, 0x4d, 0xce, 0xb1, 0xd1, 0xd1, 0xf5, 0x4e, 0x0f, + 0x6f, 0xd3, 0x56, 0x63, 0xd8, 0xde, 0xb6, 0xb5, 0x3e, 0xb6, 0x6c, 0xb5, 0x6f, 0x70, 0x86, 0xb5, + 0x8e, 0xde, 0xd1, 0xe9, 0xe7, 0x36, 0xf9, 0x0a, 0xe9, 0x57, 0x37, 0xd5, 0x66, 0x0f, 0xfb, 0x27, + 0x29, 0x3d, 0xcd, 0xc1, 0x92, 0x8c, 0x3f, 0x1c, 0x62, 0xcb, 0x46, 0xd7, 0x21, 0x89, 0x9b, 0x5d, + 0xbd, 0x24, 0x6c, 0x0a, 0x57, 0x72, 0xd7, 0x2f, 0x6e, 0x8d, 0xcd, 0x7f, 0x8b, 0xf3, 0x55, 0x9b, + 0x5d, 0xbd, 0x16, 0x93, 0x29, 0x2f, 0xba, 0x09, 0xa9, 0x76, 0x6f, 0x68, 0x75, 0x4b, 0x71, 0x2a, + 0x74, 0x29, 0x4a, 0xe8, 0x2e, 0x61, 0xaa, 0xc5, 0x64, 0xc6, 0x4d, 0xba, 0xd2, 0x06, 0x6d, 0xbd, + 0x94, 0x98, 0xde, 0xd5, 0xde, 0xa0, 0x4d, 0xbb, 0x22, 0xbc, 0x68, 0x17, 0x40, 0x1b, 0x68, 0xb6, + 0xd2, 0xec, 0xaa, 0xda, 0xa0, 0x94, 0xa2, 0x92, 0x97, 0xa3, 0x25, 0x35, 0xbb, 0x42, 0x18, 0x6b, + 0x31, 0x39, 0xab, 0x39, 0x0d, 0x32, 0xdc, 0x0f, 0x87, 0xd8, 0x3c, 0x2d, 0xa5, 0xa7, 0x0f, 0xf7, + 0x1d, 0xc2, 0x44, 0x86, 0x4b, 0xb9, 0xd1, 0x9b, 0x90, 0x69, 0x76, 0x71, 0xf3, 0x89, 0x62, 0x8f, + 0x4a, 0x19, 0x2a, 0xb9, 0x11, 0x25, 0x59, 0x21, 0x7c, 0xf5, 0x51, 0x2d, 0x26, 0x2f, 0x35, 0xd9, + 0x27, 0x7a, 0x03, 0xd2, 0x4d, 0xbd, 0xdf, 0xd7, 0xec, 0x52, 0x8e, 0xca, 0xae, 0x47, 0xca, 0x52, + 0xae, 0x5a, 0x4c, 0xe6, 0xfc, 0xe8, 0x00, 0x8a, 0x3d, 0xcd, 0xb2, 0x15, 0x6b, 0xa0, 0x1a, 0x56, + 0x57, 0xb7, 0xad, 0x52, 0x9e, 0x6a, 0x78, 0x3e, 0x4a, 0xc3, 0x03, 0xcd, 0xb2, 0x8f, 0x1d, 0xe6, + 0x5a, 0x4c, 0x2e, 0xf4, 0xfc, 0x04, 0xa2, 0x4f, 0x6f, 0xb7, 0xb1, 0xe9, 0x2a, 0x2c, 0x15, 0xa6, + 0xeb, 0x3b, 0x24, 0xdc, 0x8e, 0x3c, 0xd1, 0xa7, 0xfb, 0x09, 0xe8, 0xff, 0x61, 0xb5, 0xa7, 0xab, + 0x2d, 0x57, 0x9d, 0xd2, 0xec, 0x0e, 0x07, 0x4f, 0x4a, 0x45, 0xaa, 0xf4, 0xa5, 0xc8, 0x41, 0xea, + 0x6a, 0xcb, 0x51, 0x51, 0x21, 0x02, 0xb5, 0x98, 0xbc, 0xd2, 0x1b, 0x27, 0xa2, 0xf7, 0x60, 0x4d, + 0x35, 0x8c, 0xde, 0xe9, 0xb8, 0xf6, 0x65, 0xaa, 0xfd, 0x6a, 0x94, 0xf6, 0x1d, 0x22, 0x33, 0xae, + 0x1e, 0xa9, 0x13, 0x54, 0x54, 0x07, 0xd1, 0x30, 0xb1, 0xa1, 0x9a, 0x58, 0x31, 0x4c, 0xdd, 0xd0, + 0x2d, 0xb5, 0x57, 0x12, 0xa9, 0xee, 0x17, 0xa3, 0x74, 0x1f, 0x31, 0xfe, 0x23, 0xce, 0x5e, 0x8b, + 0xc9, 0xcb, 0x46, 0x90, 0xc4, 0xb4, 0xea, 0x4d, 0x6c, 0x59, 0x9e, 0xd6, 0x95, 0x59, 0x5a, 0x29, + 0x7f, 0x50, 0x6b, 0x80, 0x84, 0xaa, 0x90, 0xc3, 0x23, 0x22, 0xae, 0x9c, 0xe8, 0x36, 0x2e, 0x21, + 0xaa, 0x50, 0x8a, 0xdc, 0xa1, 0x94, 0xf5, 0x91, 0x6e, 0xe3, 0x5a, 0x4c, 0x06, 0xec, 0xb6, 0x90, + 0x0a, 0x67, 0x4e, 0xb0, 0xa9, 0xb5, 0x4f, 0xa9, 0x1a, 0x85, 0xfe, 0x62, 0x69, 0xfa, 0xa0, 0xb4, + 0x4a, 0x15, 0x5e, 0x8b, 0x52, 0xf8, 0x88, 0x0a, 0x11, 0x15, 0x55, 0x47, 0xa4, 0x16, 0x93, 0x57, + 0x4f, 0x26, 0xc9, 0xc4, 0xc5, 0xda, 0xda, 0x40, 0xed, 0x69, 0x1f, 0x63, 0xa5, 0xd1, 0xd3, 0x9b, + 0x4f, 0x4a, 0x6b, 0xd3, 0x5d, 0xec, 0x2e, 0xe7, 0xde, 0x25, 0xcc, 0xc4, 0xc5, 0xda, 0x7e, 0x02, + 0xc2, 0x70, 0xae, 0x69, 0x62, 0xd5, 0xc6, 0x0a, 0x3b, 0xbd, 0x14, 0x13, 0x5b, 0xc3, 0x9e, 0x4d, + 0x76, 0xe2, 0x19, 0xaa, 0xf8, 0xe5, 0xc8, 0xdd, 0x44, 0xc5, 0x0e, 0xa9, 0x94, 0x4c, 0x85, 0xe8, + 0xb6, 0x5c, 0x6b, 0x86, 0xd0, 0xd1, 0xff, 0x02, 0x6a, 0x63, 0xbb, 0xd9, 0x75, 0x7a, 0x21, 0xf6, + 0xb1, 0x4a, 0x67, 0x69, 0x0f, 0x57, 0x22, 0x87, 0x4e, 0x24, 0x98, 0x22, 0x62, 0x04, 0xb2, 0xe1, + 0xc4, 0xf6, 0x18, 0x8d, 0xda, 0x9c, 0x1d, 0xe5, 0x38, 0xa8, 0xfc, 0xdc, 0x0c, 0x9b, 0x73, 0xa1, + 0xa0, 0xfe, 0xd5, 0x93, 0x49, 0xf2, 0xee, 0x12, 0xa4, 0x4e, 0xd4, 0xde, 0x10, 0xef, 0x27, 0x33, + 0x49, 0x31, 0xb5, 0x9f, 0xcc, 0x2c, 0x89, 0x99, 0xfd, 0x64, 0x26, 0x2b, 0xc2, 0x7e, 0x32, 0x03, + 0x62, 0x4e, 0x7a, 0x11, 0x72, 0xbe, 0xc3, 0x1b, 0x95, 0x60, 0xa9, 0x8f, 0x2d, 0x4b, 0xed, 0x60, + 0x7a, 0xd6, 0x67, 0x65, 0xa7, 0x29, 0x15, 0x21, 0xef, 0x3f, 0xb0, 0xa5, 0xcf, 0x04, 0x57, 0x92, + 0x9c, 0xc5, 0x44, 0xf2, 0x04, 0x9b, 0xd4, 0x65, 0xb8, 0x24, 0x6f, 0xa2, 0xe7, 0xa0, 0x40, 0x97, + 0x5b, 0x71, 0x7e, 0x27, 0x01, 0x21, 0x29, 0xe7, 0x29, 0xf1, 0x11, 0x67, 0xda, 0x80, 0x9c, 0x71, + 0xdd, 0x70, 0x59, 0x12, 0x94, 0x05, 0x8c, 0xeb, 0x86, 0xc3, 0x70, 0x19, 0xf2, 0xc4, 0x06, 0x2e, + 0x47, 0x92, 0x76, 0x92, 0x23, 0x34, 0xce, 0x22, 0xfd, 0x31, 0x0e, 0xe2, 0xf8, 0x21, 0x8f, 0xde, + 0x80, 0x24, 0x09, 0x87, 0x3c, 0x74, 0x95, 0xb7, 0x58, 0xac, 0xdc, 0x72, 0x62, 0xe5, 0x56, 0xdd, + 0x89, 0x95, 0xbb, 0x99, 0x2f, 0xbf, 0xde, 0x88, 0x7d, 0xf6, 0xe7, 0x0d, 0x41, 0xa6, 0x12, 0xe8, + 0x3c, 0x39, 0xda, 0x55, 0x6d, 0xa0, 0x68, 0x2d, 0x3a, 0xe4, 0x2c, 0x39, 0xb7, 0x55, 0x6d, 0xb0, + 0xd7, 0x42, 0x0f, 0x40, 0x6c, 0xea, 0x03, 0x0b, 0x0f, 0xac, 0xa1, 0xa5, 0xb0, 0x68, 0xcd, 0x03, + 0x56, 0x20, 0xec, 0xb0, 0x70, 0x5a, 0x71, 0x38, 0x8f, 0x28, 0xa3, 0xbc, 0xdc, 0x0c, 0x12, 0xd0, + 0x5d, 0x00, 0x37, 0xa4, 0x5b, 0xa5, 0xe4, 0x66, 0xe2, 0x4a, 0xee, 0xfa, 0xe6, 0xc4, 0xe2, 0x3f, + 0x72, 0x58, 0x1e, 0x1a, 0x64, 0x95, 0x77, 0x93, 0x64, 0xb8, 0xb2, 0x4f, 0x12, 0xbd, 0x00, 0xcb, + 0xaa, 0x61, 0x28, 0x96, 0x4d, 0x1c, 0xaa, 0x71, 0x4a, 0x3c, 0x89, 0xc4, 0xc2, 0xbc, 0x5c, 0x50, + 0x0d, 0xe3, 0x98, 0x50, 0x77, 0x09, 0x11, 0x3d, 0x0f, 0x45, 0x12, 0xf7, 0x34, 0xb5, 0xa7, 0x74, + 0xb1, 0xd6, 0xe9, 0xda, 0x34, 0xe6, 0x25, 0xe4, 0x02, 0xa7, 0xd6, 0x28, 0x51, 0x6a, 0xb9, 0x2b, + 0x4e, 0x63, 0x1e, 0x42, 0x90, 0x6c, 0xa9, 0xb6, 0x4a, 0x2d, 0x99, 0x97, 0xe9, 0x37, 0xa1, 0x19, + 0xaa, 0xdd, 0xe5, 0xf6, 0xa1, 0xdf, 0xe8, 0x2c, 0xa4, 0xb9, 0xda, 0x04, 0x55, 0xcb, 0x5b, 0x68, + 0x0d, 0x52, 0x86, 0xa9, 0x9f, 0x60, 0xba, 0x74, 0x19, 0x99, 0x35, 0x24, 0x19, 0x8a, 0xc1, 0xf8, + 0x88, 0x8a, 0x10, 0xb7, 0x47, 0xbc, 0x97, 0xb8, 0x3d, 0x42, 0xaf, 0x42, 0x92, 0x18, 0x92, 0xf6, + 0x51, 0x0c, 0xc9, 0x08, 0xb8, 0x5c, 0xfd, 0xd4, 0xc0, 0x32, 0xe5, 0x94, 0x96, 0xa1, 0x10, 0x88, + 0x9b, 0xd2, 0x59, 0x58, 0x0b, 0x0b, 0x83, 0x52, 0xd7, 0xa5, 0x07, 0xc2, 0x19, 0xba, 0x09, 0x19, + 0x37, 0x0e, 0x32, 0xc7, 0x39, 0x3f, 0xd1, 0xad, 0xc3, 0x2c, 0xbb, 0xac, 0xc4, 0x63, 0xc8, 0x02, + 0x74, 0x55, 0x9e, 0xf5, 0xe4, 0xe5, 0x25, 0xd5, 0x30, 0x6a, 0xaa, 0xd5, 0x95, 0xde, 0x87, 0x52, + 0x54, 0x8c, 0xf3, 0x19, 0x4c, 0xa0, 0x6e, 0xef, 0x18, 0xec, 0x2c, 0xa4, 0xdb, 0xba, 0xd9, 0x57, + 0x6d, 0xaa, 0xac, 0x20, 0xf3, 0x16, 0x31, 0x24, 0x8b, 0x77, 0x09, 0x4a, 0x66, 0x0d, 0x49, 0x81, + 0xf3, 0x91, 0x71, 0x8e, 0x88, 0x68, 0x83, 0x16, 0x66, 0x66, 0x2d, 0xc8, 0xac, 0xe1, 0x29, 0x62, + 0x83, 0x65, 0x0d, 0xd2, 0xad, 0x45, 0xe7, 0x4a, 0xf5, 0x67, 0x65, 0xde, 0x92, 0x3e, 0x4f, 0xc0, + 0xd9, 0xf0, 0x68, 0x87, 0x36, 0x21, 0xdf, 0x57, 0x47, 0x8a, 0x3d, 0xe2, 0x6e, 0x27, 0xd0, 0x85, + 0x87, 0xbe, 0x3a, 0xaa, 0x8f, 0x98, 0xcf, 0x89, 0x90, 0xb0, 0x47, 0x56, 0x29, 0xbe, 0x99, 0xb8, + 0x92, 0x97, 0xc9, 0x27, 0x7a, 0x08, 0x2b, 0x3d, 0xbd, 0xa9, 0xf6, 0x94, 0x9e, 0x6a, 0xd9, 0x0a, + 0x4f, 0x83, 0xd8, 0x26, 0x7a, 0x6e, 0xc2, 0xd8, 0x2c, 0x6e, 0xe1, 0x16, 0x5b, 0x4f, 0x72, 0xe0, + 0x70, 0xff, 0x5f, 0xa6, 0x3a, 0x1e, 0xa8, 0xce, 0x52, 0xa3, 0x3b, 0x90, 0xeb, 0x6b, 0x56, 0x03, + 0x77, 0xd5, 0x13, 0x4d, 0x37, 0xf9, 0x6e, 0x9a, 0x74, 0x9a, 0xb7, 0x3d, 0x1e, 0xae, 0xc9, 0x2f, + 0xe6, 0x5b, 0x92, 0x54, 0xc0, 0x87, 0x9d, 0xd3, 0x24, 0xbd, 0xf0, 0x69, 0xf2, 0x2a, 0xac, 0x0d, + 0xf0, 0xc8, 0x56, 0xbc, 0xfd, 0xca, 0xfc, 0x64, 0x89, 0x9a, 0x1e, 0x91, 0xdf, 0xdc, 0x1d, 0x6e, + 0x11, 0x97, 0x41, 0x2f, 0xd1, 0x7c, 0xc1, 0xd0, 0x2d, 0x6c, 0x2a, 0x6a, 0xab, 0x65, 0x62, 0xcb, + 0xa2, 0x29, 0x66, 0x9e, 0x26, 0x01, 0x94, 0xbe, 0xc3, 0xc8, 0xd2, 0xcf, 0xfc, 0x4b, 0x13, 0xcc, + 0x0f, 0xb8, 0xe1, 0x05, 0xcf, 0xf0, 0xc7, 0xb0, 0xc6, 0xe5, 0x5b, 0x01, 0xdb, 0xb3, 0x3c, 0xfd, + 0xc2, 0xe4, 0xfe, 0x1a, 0xb7, 0x39, 0x72, 0xc4, 0xa3, 0xcd, 0x9e, 0x78, 0x36, 0xb3, 0x23, 0x48, + 0x52, 0xa3, 0x24, 0xd9, 0x11, 0x43, 0xbe, 0xff, 0xd5, 0x96, 0xe2, 0x93, 0x04, 0xac, 0x4c, 0x24, + 0x5b, 0xee, 0xc4, 0x84, 0xd0, 0x89, 0xc5, 0x43, 0x27, 0x96, 0x58, 0x78, 0x62, 0x7c, 0xad, 0x93, + 0xb3, 0xd7, 0x3a, 0xf5, 0x3d, 0xae, 0x75, 0xfa, 0xd9, 0xd6, 0xfa, 0x9f, 0xba, 0x0a, 0xbf, 0x14, + 0xa0, 0x1c, 0x9d, 0xa1, 0x86, 0x2e, 0xc7, 0x35, 0x58, 0x71, 0x87, 0xe2, 0xaa, 0x67, 0x07, 0xa3, + 0xe8, 0xfe, 0xc0, 0xf5, 0x47, 0xc6, 0xb8, 0xe7, 0xa1, 0x38, 0x96, 0x3f, 0x33, 0x57, 0x2e, 0x9c, + 0xf8, 0xfb, 0x97, 0x7e, 0x92, 0x70, 0x03, 0x4f, 0x20, 0xc9, 0x0d, 0xd9, 0xad, 0xef, 0xc0, 0x6a, + 0x0b, 0x37, 0xb5, 0xd6, 0xb3, 0x6e, 0xd6, 0x15, 0x2e, 0xfd, 0x9f, 0xbd, 0x3a, 0xe9, 0x25, 0x6d, + 0xb8, 0x30, 0xe5, 0x46, 0x80, 0xee, 0x41, 0xb1, 0xa3, 0x5b, 0x96, 0x66, 0xe0, 0x16, 0x4f, 0xcc, + 0x85, 0xc9, 0xdc, 0x8c, 0x25, 0xee, 0x5b, 0xf7, 0x38, 0x23, 0x4d, 0xbb, 0xe5, 0x42, 0xc7, 0xdf, + 0x94, 0xce, 0xc3, 0xb9, 0x88, 0x7b, 0x81, 0x74, 0xcb, 0xf3, 0xd3, 0xc9, 0xf4, 0x1d, 0x5d, 0x80, + 0x2c, 0xbf, 0x18, 0xb8, 0x19, 0x51, 0x86, 0x11, 0xea, 0x23, 0xe9, 0x77, 0x79, 0xc8, 0xc8, 0xd8, + 0x32, 0x48, 0x36, 0x89, 0x76, 0x21, 0x8b, 0x47, 0x4d, 0x6c, 0xd8, 0x4e, 0x02, 0x1e, 0x7e, 0x09, + 0x64, 0xdc, 0x55, 0x87, 0xb3, 0x16, 0x93, 0x3d, 0x31, 0x74, 0x83, 0xa3, 0x3c, 0xd1, 0x80, 0x0d, + 0x17, 0xf7, 0xc3, 0x3c, 0xaf, 0x39, 0x30, 0x4f, 0x22, 0x12, 0xc1, 0x60, 0x52, 0x63, 0x38, 0xcf, + 0x0d, 0x8e, 0xf3, 0x24, 0x67, 0x74, 0x16, 0x00, 0x7a, 0x2a, 0x01, 0xa0, 0x27, 0x3d, 0x63, 0x9a, + 0x11, 0x48, 0xcf, 0x6b, 0x0e, 0xd2, 0xb3, 0x34, 0x63, 0xc4, 0x63, 0x50, 0xcf, 0x5b, 0x3e, 0xa8, + 0x27, 0x4b, 0x45, 0x37, 0x23, 0x45, 0x43, 0xb0, 0x9e, 0x5b, 0x2e, 0xd6, 0x93, 0x8f, 0xc4, 0x89, + 0xb8, 0xf0, 0x38, 0xd8, 0x73, 0x38, 0x01, 0xf6, 0x30, 0x70, 0xe6, 0x85, 0x48, 0x15, 0x33, 0xd0, + 0x9e, 0xc3, 0x09, 0xb4, 0xa7, 0x38, 0x43, 0xe1, 0x0c, 0xb8, 0xe7, 0x07, 0xe1, 0x70, 0x4f, 0x34, + 0x20, 0xc3, 0x87, 0x39, 0x1f, 0xde, 0xa3, 0x44, 0xe0, 0x3d, 0x62, 0xe4, 0x3d, 0x99, 0xa9, 0x9f, + 0x1b, 0xf0, 0x79, 0x18, 0x02, 0xf8, 0xac, 0x44, 0xde, 0xf0, 0x99, 0xf2, 0x39, 0x10, 0x9f, 0x87, + 0x21, 0x88, 0x0f, 0x9a, 0xa9, 0x76, 0x26, 0xe4, 0x73, 0x37, 0x08, 0xf9, 0xac, 0x46, 0xe4, 0xcc, + 0xde, 0x6e, 0x8f, 0xc0, 0x7c, 0x1a, 0x51, 0x98, 0xcf, 0x5a, 0x24, 0x7c, 0xc2, 0x34, 0x2e, 0x00, + 0xfa, 0x1c, 0x4e, 0x80, 0x3e, 0x67, 0x66, 0x78, 0xda, 0x0c, 0xd4, 0xa7, 0x1d, 0x8d, 0xfa, 0x30, + 0x4c, 0xe6, 0x95, 0xe8, 0x7d, 0xb5, 0x08, 0xec, 0xf3, 0x38, 0x14, 0xf6, 0x39, 0x17, 0x89, 0x5f, + 0xf2, 0xc1, 0xcf, 0x83, 0xfb, 0x34, 0xa2, 0x70, 0x9f, 0xd2, 0x2c, 0xbb, 0x3f, 0x13, 0xf0, 0x93, + 0x12, 0xd3, 0xfb, 0xc9, 0x4c, 0x46, 0xcc, 0x32, 0xc8, 0x67, 0x3f, 0x99, 0xc9, 0x89, 0x79, 0xe9, + 0x25, 0x92, 0xa6, 0x8e, 0x85, 0x03, 0x72, 0x21, 0xc4, 0xa6, 0xa9, 0x9b, 0x1c, 0xc2, 0x61, 0x0d, + 0xe9, 0x0a, 0xe4, 0xfd, 0x47, 0xff, 0x14, 0x90, 0x88, 0x5e, 0xbc, 0x7d, 0xc7, 0xbd, 0xf4, 0x5b, + 0xc1, 0x93, 0xa5, 0x30, 0x91, 0x1f, 0x44, 0xc8, 0x72, 0x10, 0xc1, 0x07, 0x1d, 0xc5, 0x83, 0xd0, + 0xd1, 0x06, 0xe4, 0xc8, 0x85, 0x7a, 0x0c, 0x15, 0x52, 0x0d, 0x17, 0x15, 0xba, 0x0a, 0x2b, 0x34, + 0x2b, 0x62, 0x00, 0x13, 0xcf, 0x3d, 0x92, 0x34, 0xf7, 0x58, 0x26, 0x3f, 0x30, 0x27, 0x62, 0x49, + 0xc8, 0x2b, 0xb0, 0xea, 0xe3, 0x75, 0x2f, 0xea, 0x0c, 0x22, 0x11, 0x5d, 0xee, 0x1d, 0x7e, 0x63, + 0xff, 0x83, 0xe0, 0x59, 0xc8, 0x83, 0x93, 0xc2, 0x90, 0x1f, 0xe1, 0x7b, 0x42, 0x7e, 0xe2, 0xcf, + 0x8c, 0xfc, 0xf8, 0x81, 0x87, 0x44, 0x10, 0x78, 0xf8, 0xbb, 0xe0, 0xad, 0x89, 0x8b, 0xe3, 0x34, + 0xf5, 0x16, 0xe6, 0x50, 0x00, 0xfd, 0x26, 0x79, 0x67, 0x4f, 0xef, 0xf0, 0x0b, 0x3f, 0xf9, 0x24, + 0x5c, 0x6e, 0x7c, 0xce, 0xf2, 0xf0, 0xeb, 0xa2, 0x08, 0x2c, 0xbb, 0xe3, 0x28, 0x82, 0x08, 0x89, + 0x27, 0x98, 0xd5, 0x4d, 0xf2, 0x32, 0xf9, 0x24, 0x7c, 0xd4, 0xf9, 0x78, 0x96, 0xc6, 0x1a, 0xe8, + 0x0d, 0xc8, 0xd2, 0xa2, 0x98, 0xa2, 0x1b, 0x16, 0xaf, 0x95, 0x04, 0xf2, 0x57, 0x56, 0x19, 0xdb, + 0x3a, 0x22, 0x3c, 0x87, 0x86, 0x25, 0x67, 0x0c, 0xfe, 0xe5, 0x4b, 0x2b, 0xb3, 0x81, 0xb4, 0xf2, + 0x22, 0x64, 0xc9, 0xe8, 0x2d, 0x43, 0x6d, 0xe2, 0x12, 0xd0, 0x81, 0x7a, 0x04, 0xe9, 0x37, 0x71, + 0x58, 0x1e, 0x8b, 0xc7, 0xa1, 0x73, 0x77, 0x5c, 0x32, 0xee, 0xc3, 0xb5, 0xe6, 0xb3, 0xc7, 0x3a, + 0x40, 0x47, 0xb5, 0x94, 0x8f, 0xd4, 0x81, 0x8d, 0x5b, 0xdc, 0x28, 0x3e, 0x0a, 0x2a, 0x43, 0x86, + 0xb4, 0x86, 0x16, 0x6e, 0x71, 0x88, 0xcd, 0x6d, 0xa3, 0x1a, 0xa4, 0xf1, 0x09, 0x1e, 0xd8, 0x56, + 0x69, 0x89, 0x2e, 0xfb, 0xd9, 0x49, 0xcc, 0x83, 0xfc, 0xbc, 0x5b, 0x22, 0x8b, 0xfd, 0xed, 0xd7, + 0x1b, 0x22, 0xe3, 0x7e, 0x59, 0xef, 0x6b, 0x36, 0xee, 0x1b, 0xf6, 0xa9, 0xcc, 0xe5, 0x83, 0x56, + 0xc8, 0x8c, 0x59, 0x81, 0x82, 0xbd, 0x79, 0x07, 0xc3, 0x21, 0x36, 0xd5, 0x74, 0x53, 0xb3, 0x4f, + 0xe5, 0x42, 0x1f, 0xf7, 0x0d, 0x5d, 0xef, 0x29, 0x6c, 0x8f, 0xef, 0x40, 0x31, 0x98, 0x7e, 0xa0, + 0xe7, 0xa0, 0x60, 0x62, 0x5b, 0xd5, 0x06, 0x4a, 0xe0, 0xa6, 0x93, 0x67, 0x44, 0xb6, 0xa7, 0xf6, + 0x93, 0x19, 0x41, 0x8c, 0xef, 0x27, 0x33, 0x71, 0x31, 0x21, 0x1d, 0xc1, 0x99, 0xd0, 0xf4, 0x03, + 0xbd, 0x0e, 0x59, 0x2f, 0x73, 0x61, 0x29, 0xf4, 0x14, 0x38, 0xcd, 0xe3, 0x95, 0x7e, 0x2f, 0x78, + 0x2a, 0x83, 0x00, 0x5d, 0x15, 0xd2, 0xec, 0xdc, 0xa7, 0x2b, 0x59, 0x9c, 0x72, 0xe8, 0x07, 0xe4, + 0xb6, 0xd8, 0xf1, 0x2e, 0x73, 0x61, 0xe9, 0x3d, 0x48, 0x33, 0x0a, 0xca, 0xc1, 0xd2, 0xc3, 0x83, + 0xfb, 0x07, 0x87, 0xef, 0x1e, 0x88, 0x31, 0x04, 0x90, 0xde, 0xa9, 0x54, 0xaa, 0x47, 0x75, 0x51, + 0x40, 0x59, 0x48, 0xed, 0xec, 0x1e, 0xca, 0x75, 0x31, 0x4e, 0xc8, 0x72, 0x75, 0xbf, 0x5a, 0xa9, + 0x8b, 0x09, 0xb4, 0x02, 0x05, 0xf6, 0xad, 0xdc, 0x3d, 0x94, 0xdf, 0xde, 0xa9, 0x8b, 0x49, 0x1f, + 0xe9, 0xb8, 0x7a, 0x70, 0xa7, 0x2a, 0x8b, 0x29, 0xe9, 0xbf, 0xe0, 0x7c, 0x64, 0xaa, 0xe3, 0xa1, + 0x6f, 0x82, 0x0f, 0x7d, 0x93, 0x3e, 0x8f, 0x93, 0x1b, 0x41, 0x54, 0xfe, 0x82, 0xf6, 0xc7, 0x26, + 0x7e, 0x7d, 0x81, 0xe4, 0x67, 0x6c, 0xf6, 0xe4, 0xb2, 0x6a, 0x62, 0x16, 0xe4, 0x68, 0xdf, 0xec, + 0x04, 0x2a, 0xc8, 0x05, 0x4e, 0xa5, 0x42, 0x16, 0x63, 0xfb, 0x00, 0x37, 0x6d, 0x85, 0x39, 0x91, + 0x45, 0x6f, 0x8c, 0x59, 0xc2, 0x46, 0xa8, 0xc7, 0x8c, 0x28, 0xbd, 0xbf, 0x90, 0x2d, 0xb3, 0x90, + 0x92, 0xab, 0x75, 0xf9, 0xb1, 0x98, 0x40, 0x08, 0x8a, 0xf4, 0x53, 0x39, 0x3e, 0xd8, 0x39, 0x3a, + 0xae, 0x1d, 0x12, 0x5b, 0xae, 0xc2, 0xb2, 0x63, 0x4b, 0x87, 0x98, 0x92, 0xae, 0x91, 0x6b, 0x54, + 0x68, 0xf2, 0x35, 0x79, 0x6f, 0x96, 0x7e, 0x25, 0xf8, 0xb9, 0x83, 0x09, 0xd4, 0x21, 0xa4, 0x2d, + 0x5b, 0xb5, 0x87, 0x16, 0x37, 0xe2, 0xeb, 0xf3, 0x66, 0x63, 0x5b, 0xce, 0xc7, 0x31, 0x15, 0x97, + 0xb9, 0x1a, 0xe9, 0x26, 0x14, 0x83, 0xbf, 0x44, 0xdb, 0xc0, 0x73, 0xa2, 0xb8, 0x74, 0x1b, 0xd0, + 0x64, 0x92, 0x16, 0x82, 0x21, 0x08, 0x61, 0x18, 0xc2, 0xaf, 0x05, 0x72, 0x7b, 0x8d, 0x4c, 0xc8, + 0xd0, 0x3b, 0x63, 0x93, 0xbc, 0xb5, 0x48, 0x3a, 0xb7, 0xc5, 0x68, 0x63, 0xd3, 0xbc, 0x01, 0x79, + 0x3f, 0x7d, 0xbe, 0x49, 0x7e, 0x1b, 0xf7, 0x36, 0x71, 0x10, 0xec, 0xf0, 0x8e, 0x40, 0xe1, 0x3b, + 0x1e, 0x81, 0x6f, 0x02, 0xd8, 0x23, 0x9e, 0x09, 0x3a, 0x71, 0xf4, 0x52, 0x08, 0x88, 0x8c, 0x9b, + 0xf5, 0x11, 0xdf, 0x04, 0x59, 0x9b, 0x7f, 0x59, 0xe8, 0xd8, 0x8f, 0xfc, 0x0c, 0x69, 0x8c, 0xb5, + 0x38, 0x2a, 0x32, 0x6f, 0x30, 0xf6, 0x10, 0x22, 0x46, 0xb6, 0xd0, 0x63, 0x38, 0x37, 0x96, 0x28, + 0xb8, 0xaa, 0x93, 0xf3, 0xe6, 0x0b, 0x67, 0x82, 0xf9, 0x82, 0xa3, 0xda, 0x1f, 0xed, 0x53, 0xc1, + 0x68, 0xff, 0x16, 0x5c, 0x9c, 0x96, 0xed, 0xa2, 0x4b, 0x00, 0x78, 0x40, 0x82, 0x43, 0xcb, 0x43, + 0x14, 0xb2, 0x9c, 0x52, 0x1f, 0x49, 0xf7, 0xa0, 0x14, 0x95, 0xc9, 0xa2, 0x6b, 0x90, 0xa4, 0xd7, + 0x0d, 0x96, 0xed, 0x9c, 0x0b, 0xc1, 0x40, 0x08, 0x9f, 0x4c, 0x99, 0xa4, 0x9f, 0xfb, 0x9d, 0x33, + 0x04, 0xd8, 0xb8, 0x3f, 0xe6, 0x9c, 0x37, 0x16, 0xc9, 0x79, 0xb7, 0xc6, 0xdc, 0xf2, 0x32, 0xa4, + 0xb9, 0x43, 0x02, 0xa4, 0xd5, 0x86, 0x85, 0x07, 0xb6, 0x18, 0x23, 0xce, 0x69, 0x98, 0x98, 0x36, + 0x04, 0xe9, 0x31, 0x80, 0x87, 0x8c, 0x91, 0x93, 0xd7, 0xd4, 0x87, 0x83, 0x16, 0xed, 0x3c, 0x25, + 0xb3, 0x06, 0xba, 0x09, 0x29, 0x96, 0x86, 0xc7, 0x23, 0x42, 0x14, 0xe9, 0xdc, 0x87, 0xac, 0x31, + 0x6e, 0x49, 0x03, 0x34, 0x59, 0x9d, 0x88, 0xe8, 0xe2, 0xad, 0x60, 0x17, 0x97, 0x23, 0xeb, 0x1c, + 0xe1, 0x5d, 0x7d, 0x0c, 0x29, 0xba, 0x23, 0x48, 0x32, 0x42, 0x4b, 0x62, 0x3c, 0x8b, 0x26, 0xdf, + 0xe8, 0x87, 0x00, 0xaa, 0x6d, 0x9b, 0x5a, 0x63, 0xe8, 0x75, 0xb0, 0x11, 0xbe, 0xa3, 0x76, 0x1c, + 0xbe, 0xdd, 0x8b, 0x7c, 0x6b, 0xad, 0x79, 0xa2, 0xbe, 0xed, 0xe5, 0x53, 0x28, 0x1d, 0x40, 0x31, + 0x28, 0xeb, 0xe4, 0x7d, 0x6c, 0x0c, 0xc1, 0xbc, 0x8f, 0xa5, 0xf1, 0x3c, 0xef, 0x73, 0xb3, 0xc6, + 0x04, 0xab, 0xfb, 0xd1, 0x86, 0xf4, 0xa3, 0x38, 0xe4, 0xfd, 0x1b, 0xf2, 0xdf, 0x2f, 0x35, 0x93, + 0x7e, 0x2a, 0x40, 0xc6, 0x9d, 0x7e, 0xb0, 0x08, 0x18, 0xa8, 0x9a, 0x32, 0xeb, 0xc5, 0xfd, 0x95, + 0x3b, 0x56, 0x23, 0x4d, 0xb8, 0x35, 0xd2, 0xdb, 0x6e, 0x5a, 0x10, 0x85, 0xa7, 0xf9, 0x6d, 0xcd, + 0xbd, 0xca, 0xc9, 0x82, 0x6e, 0x43, 0xd6, 0x3d, 0xd5, 0xc8, 0x65, 0xcc, 0x41, 0x4d, 0x05, 0x7e, + 0xb6, 0x70, 0xcc, 0x7b, 0x0d, 0x52, 0x86, 0xfe, 0x11, 0x2f, 0x0b, 0x26, 0x64, 0xd6, 0x90, 0x5a, + 0xb0, 0x3c, 0x76, 0x24, 0xa2, 0xdb, 0xb0, 0x64, 0x0c, 0x1b, 0x8a, 0xe3, 0x1c, 0x63, 0xd8, 0xb2, + 0x93, 0xe6, 0x0f, 0x1b, 0x3d, 0xad, 0x79, 0x1f, 0x9f, 0x3a, 0x83, 0x31, 0x86, 0x8d, 0xfb, 0xcc, + 0x87, 0x58, 0x2f, 0x71, 0x7f, 0x2f, 0xbf, 0x10, 0x20, 0xe3, 0xec, 0x09, 0xf4, 0x3f, 0x90, 0x75, + 0x8f, 0x5b, 0xb7, 0xae, 0x1f, 0x79, 0x4e, 0x73, 0xfd, 0x9e, 0x08, 0xda, 0x71, 0x1e, 0x24, 0x68, + 0x2d, 0xa5, 0xdd, 0x53, 0x99, 0x2f, 0x15, 0x83, 0x36, 0x63, 0x07, 0x32, 0x8d, 0x53, 0x7b, 0x77, + 0xee, 0xf6, 0xd4, 0x8e, 0x9c, 0xa3, 0x32, 0x7b, 0x2d, 0xd2, 0xe0, 0x19, 0xef, 0xdf, 0x04, 0x10, + 0xc7, 0x77, 0xec, 0x77, 0x1e, 0xdd, 0x64, 0xf8, 0x4f, 0x84, 0x84, 0x7f, 0xb4, 0x0d, 0xab, 0x2e, + 0x87, 0x62, 0x69, 0x9d, 0x81, 0x6a, 0x0f, 0x4d, 0xcc, 0xd1, 0x78, 0xe4, 0xfe, 0x74, 0xec, 0xfc, + 0x32, 0x39, 0xeb, 0xd4, 0x33, 0xce, 0xfa, 0x93, 0x38, 0xe4, 0x7c, 0xb5, 0x01, 0xf4, 0xdf, 0xbe, + 0xc3, 0xa8, 0x18, 0x12, 0x31, 0x7d, 0xbc, 0x5e, 0x8d, 0x3e, 0x68, 0xa6, 0xf8, 0xe2, 0x66, 0x8a, + 0xaa, 0xc0, 0x38, 0xa5, 0x86, 0xe4, 0xc2, 0xa5, 0x86, 0x97, 0x01, 0xd9, 0xba, 0xad, 0xf6, 0x94, + 0x13, 0xdd, 0xd6, 0x06, 0x1d, 0x85, 0xb9, 0x21, 0x3b, 0x3a, 0x44, 0xfa, 0xcb, 0x23, 0xfa, 0xc3, + 0x11, 0xf5, 0xc8, 0x1f, 0x0b, 0x90, 0x71, 0xaf, 0x23, 0x8b, 0x56, 0xf0, 0xcf, 0x42, 0x9a, 0x67, + 0xdc, 0xac, 0x84, 0xcf, 0x5b, 0xa1, 0x35, 0x95, 0x32, 0x64, 0xfa, 0xd8, 0x56, 0xe9, 0x39, 0xc8, + 0xa2, 0xbd, 0xdb, 0xbe, 0x7a, 0x0b, 0x72, 0xbe, 0xd7, 0x0f, 0xe4, 0x68, 0x3c, 0xa8, 0xbe, 0x2b, + 0xc6, 0xca, 0x4b, 0x9f, 0x7e, 0xb1, 0x99, 0x38, 0xc0, 0x1f, 0x91, 0xdd, 0x2c, 0x57, 0x2b, 0xb5, + 0x6a, 0xe5, 0xbe, 0x28, 0x94, 0x73, 0x9f, 0x7e, 0xb1, 0xb9, 0x24, 0x63, 0x0a, 0x48, 0x5f, 0xbd, + 0x0f, 0xcb, 0x63, 0x0b, 0x13, 0x4c, 0xe7, 0x10, 0x14, 0xef, 0x3c, 0x3c, 0x7a, 0xb0, 0x57, 0xd9, + 0xa9, 0x57, 0x95, 0x47, 0x87, 0xf5, 0xaa, 0x28, 0xa0, 0x73, 0xb0, 0xfa, 0x60, 0xef, 0x5e, 0xad, + 0xae, 0x54, 0x1e, 0xec, 0x55, 0x0f, 0xea, 0xca, 0x4e, 0xbd, 0xbe, 0x53, 0xb9, 0x2f, 0xc6, 0xaf, + 0xff, 0xb5, 0x00, 0xc9, 0x9d, 0xdd, 0xca, 0x1e, 0xaa, 0x40, 0x92, 0x42, 0x44, 0x53, 0x9f, 0x88, + 0x96, 0xa7, 0x97, 0x16, 0xd0, 0x5d, 0x48, 0x51, 0xf4, 0x08, 0x4d, 0x7f, 0x33, 0x5a, 0x9e, 0x51, + 0x6b, 0x20, 0x83, 0xa1, 0x3b, 0x72, 0xea, 0x23, 0xd2, 0xf2, 0xf4, 0xd2, 0x03, 0x7a, 0x00, 0x4b, + 0x0e, 0x78, 0x30, 0xeb, 0x65, 0x67, 0x79, 0x66, 0x3d, 0x80, 0x4c, 0x8d, 0x81, 0x30, 0xd3, 0xdf, + 0x97, 0x96, 0x67, 0x14, 0x25, 0xd0, 0x1e, 0xa4, 0xf9, 0x35, 0x7d, 0xc6, 0x93, 0xd1, 0xf2, 0xac, + 0x32, 0x03, 0x92, 0x21, 0xeb, 0xc1, 0x5b, 0xb3, 0x5f, 0xcd, 0x96, 0xe7, 0xa8, 0xb7, 0xa0, 0xf7, + 0xa0, 0x10, 0x84, 0x00, 0xe6, 0x7b, 0x96, 0x5a, 0x9e, 0xb3, 0xa0, 0x41, 0xf4, 0x07, 0xf1, 0x80, + 0xf9, 0x9e, 0xa9, 0x96, 0xe7, 0xac, 0x6f, 0xa0, 0x0f, 0x60, 0x65, 0xf2, 0xbe, 0x3e, 0xff, 0xab, + 0xd5, 0xf2, 0x02, 0x15, 0x0f, 0xd4, 0x07, 0x14, 0x72, 0xcf, 0x5f, 0xe0, 0x11, 0x6b, 0x79, 0x91, + 0x02, 0x08, 0x6a, 0xc1, 0xf2, 0xf8, 0xe5, 0x79, 0xde, 0x47, 0xad, 0xe5, 0xb9, 0x8b, 0x21, 0xac, + 0x97, 0xe0, 0xa5, 0x7b, 0xde, 0x47, 0xae, 0xe5, 0xb9, 0x6b, 0x23, 0xe8, 0x21, 0x80, 0xef, 0xde, + 0x3c, 0xc7, 0xa3, 0xd7, 0xf2, 0x3c, 0x55, 0x12, 0x64, 0xc0, 0x6a, 0xd8, 0x85, 0x7a, 0x91, 0x37, + 0xb0, 0xe5, 0x85, 0x8a, 0x27, 0xc4, 0x9f, 0x83, 0x57, 0xe3, 0xf9, 0xde, 0xc4, 0x96, 0xe7, 0xac, + 0xa2, 0x20, 0x0b, 0xd6, 0x42, 0xaf, 0x83, 0x0b, 0xbd, 0x90, 0x2d, 0x2f, 0x56, 0x59, 0x41, 0x1d, + 0x10, 0x27, 0x2e, 0x91, 0x73, 0x3f, 0x98, 0x2d, 0xcf, 0x5f, 0x63, 0xa1, 0xeb, 0x15, 0x72, 0xc7, + 0x5c, 0xe4, 0xfd, 0x6c, 0x79, 0xa1, 0xa2, 0xcb, 0xee, 0xce, 0x97, 0xdf, 0xac, 0x0b, 0x5f, 0x7d, + 0xb3, 0x2e, 0xfc, 0xe5, 0x9b, 0x75, 0xe1, 0xb3, 0xa7, 0xeb, 0xb1, 0xaf, 0x9e, 0xae, 0xc7, 0xfe, + 0xf4, 0x74, 0x3d, 0xf6, 0x7f, 0x2f, 0x76, 0x34, 0xbb, 0x3b, 0x6c, 0x6c, 0x35, 0xf5, 0xfe, 0x76, + 0x53, 0xef, 0x63, 0xbb, 0xd1, 0xb6, 0xbd, 0x0f, 0xef, 0x9f, 0x24, 0x8d, 0x34, 0xcd, 0x48, 0x6e, + 0xfc, 0x23, 0x00, 0x00, 0xff, 0xff, 0x2d, 0x0f, 0x04, 0x5b, 0x69, 0x32, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -7613,19 +7613,17 @@ func (m *ResponseFetchOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, error _ = i var l int _ = l - if len(m.Votes) > 0 { - for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Votes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) + if m.Vote != nil { + { + size, err := m.Vote.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0xa + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0xa } return len(dAtA) - i, nil } @@ -8151,12 +8149,12 @@ func (m *Misbehavior) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x28 } - n60, err60 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err60 != nil { - return 0, err60 + n61, err61 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err61 != nil { + return 0, err61 } - i -= n60 - i = encodeVarintTypes(dAtA, i, uint64(n60)) + i -= n61 + i = encodeVarintTypes(dAtA, i, uint64(n61)) i-- dAtA[i] = 0x22 if m.Height != 0 { @@ -9496,11 +9494,9 @@ func (m *ResponseFetchOracleVotes) Size() (n int) { } var l int _ = l - if len(m.Votes) > 0 { - for _, e := range m.Votes { - l = e.Size() - n += 1 + l + sovTypes(uint64(l)) - } + if m.Vote != nil { + l = m.Vote.Size() + n += 1 + l + sovTypes(uint64(l)) } return n } @@ -16322,7 +16318,7 @@ func (m *ResponseFetchOracleVotes) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Vote", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -16349,8 +16345,10 @@ func (m *ResponseFetchOracleVotes) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Votes = append(m.Votes, &oracle.Vote{}) - if err := m.Votes[len(m.Votes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.Vote == nil { + m.Vote = &oracle.Vote{} + } + if err := m.Vote.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/oracle/reactor.go b/oracle/reactor.go index 332744d54e9..ebbbb4be43a 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -51,7 +51,7 @@ func NewReactor(config *config.OracleConfig, pubKey crypto.PubKey, privValidator Config: config, UnsignedVoteBuffer: unsignedVoteBuffer, GossipVoteBuffer: gossipVoteBuffer, - SignVotesChan: make(chan []*oracleproto.Vote, 1024), + SignVotesChan: make(chan *oracleproto.Vote, 1024), PubKey: pubKey, PrivValidator: privValidator, ProxyApp: proxyApp, diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index adb301495db..9a8cc3d6539 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -39,8 +39,8 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State for { select { - case newVotes := <-oracleInfo.SignVotesChan: - votes = append(votes, newVotes...) + case newVote := <-oracleInfo.SignVotesChan: + votes = append(votes, newVote) continue default: } @@ -170,7 +170,7 @@ func Run(oracleInfo *types.OracleInfo, consensusState *cs.State) { continue } - oracleInfo.SignVotesChan <- res.Votes + oracleInfo.SignVotesChan <- res.Vote } } diff --git a/oracle/service/types/info.go b/oracle/service/types/info.go index 1cd6d14a71c..3bfed9b532f 100644 --- a/oracle/service/types/info.go +++ b/oracle/service/types/info.go @@ -14,7 +14,7 @@ type OracleInfo struct { Config *config.OracleConfig UnsignedVoteBuffer *UnsignedVoteBuffer GossipVoteBuffer *GossipVoteBuffer - SignVotesChan chan []*oracleproto.Vote + SignVotesChan chan *oracleproto.Vote PubKey crypto.PubKey PrivValidator types.PrivValidator StopChannel chan int diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto index 89578d9f84e..618124bdacf 100644 --- a/proto/tendermint/abci/types.proto +++ b/proto/tendermint/abci/types.proto @@ -390,7 +390,7 @@ message ResponseCreateOracleResultTx { } message ResponseFetchOracleVotes { - repeated tendermint.oracle.Vote votes = 1; + tendermint.oracle.Vote vote = 1; } message ResponseValidateOracleVotes { From 14a668d3e7c331b8fa944985e8c235e7c679805b Mon Sep 17 00:00:00 2001 From: yan-soon Date: Sat, 11 May 2024 14:49:30 +0800 Subject: [PATCH 124/150] resolve more comments --- abci/client/socket_client.go | 4 ++++ oracle/service/runner/runner.go | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/abci/client/socket_client.go b/abci/client/socket_client.go index d997c0a4310..a5012387047 100644 --- a/abci/client/socket_client.go +++ b/abci/client/socket_client.go @@ -528,6 +528,10 @@ func resMatchesReq(req *types.Request, res *types.Response) (ok bool) { _, ok = res.Value.(*types.Response_FinalizeBlock) case *types.Request_CreateOracleResultTx: _, ok = res.Value.(*types.Response_CreateOracleResultTx) + case *types.Request_ValidateOracleVotes: + _, ok = res.Value.(*types.Response_ValidateOracleVotes) + case *types.Request_FetchOracleVotes: + _, ok = res.Value.(*types.Response_FetchOracleVotes) } return ok } diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 9a8cc3d6539..6a967e48f23 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -107,8 +107,9 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { ticker := time.Tick(pruneInterval) for range ticker { lastBlockTime := consensusState.GetState().LastBlockTime + currTimestampsLen := len(oracleInfo.BlockTimestamps) - if !contains(oracleInfo.BlockTimestamps, lastBlockTime.Unix()) { + if currTimestampsLen > 0 && oracleInfo.BlockTimestamps[currTimestampsLen-1] != lastBlockTime.Unix() { oracleInfo.BlockTimestamps = append(oracleInfo.BlockTimestamps, lastBlockTime.Unix()) } From 2d78b6f4c99f6892be324bdec5bbec4161cf1261 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Sat, 11 May 2024 15:31:30 +0800 Subject: [PATCH 125/150] fix bug with appending last block timestamps --- oracle/service/runner/runner.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 6a967e48f23..877e679bc7e 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -95,7 +95,7 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { go func(oracleInfo *types.OracleInfo) { maxGossipVoteAge := oracleInfo.Config.MaxGossipVoteAge if maxGossipVoteAge == 0 { - maxGossipVoteAge = 2 + maxGossipVoteAge = 3 } pruneInterval := oracleInfo.Config.PruneInterval if pruneInterval == 0 { @@ -106,11 +106,16 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { ticker := time.Tick(pruneInterval) for range ticker { - lastBlockTime := consensusState.GetState().LastBlockTime + lastBlockTime := consensusState.GetState().LastBlockTime.Unix() currTimestampsLen := len(oracleInfo.BlockTimestamps) - if currTimestampsLen > 0 && oracleInfo.BlockTimestamps[currTimestampsLen-1] != lastBlockTime.Unix() { - oracleInfo.BlockTimestamps = append(oracleInfo.BlockTimestamps, lastBlockTime.Unix()) + if currTimestampsLen == 0 { + oracleInfo.BlockTimestamps = append(oracleInfo.BlockTimestamps, lastBlockTime) + continue + } + + if oracleInfo.BlockTimestamps[currTimestampsLen-1] != lastBlockTime { + oracleInfo.BlockTimestamps = append(oracleInfo.BlockTimestamps, lastBlockTime) } if len(oracleInfo.BlockTimestamps) < maxGossipVoteAge { From ce8eb4a2eb668825c9011b504a43b9714665bb8e Mon Sep 17 00:00:00 2001 From: yan-soon Date: Sat, 11 May 2024 16:59:00 +0800 Subject: [PATCH 126/150] add proposerAddr in createOracleResultTx hook --- abci/types/types.pb.go | 496 +++++++++++++++++------------- proto/tendermint/abci/types.proto | 3 +- state/execution.go | 1 + 3 files changed, 278 insertions(+), 222 deletions(-) diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go index 6f4b9a40d7e..e3bb241b58e 100644 --- a/abci/types/types.pb.go +++ b/abci/types/types.pb.go @@ -1638,7 +1638,8 @@ func (m *RequestFinalizeBlock) GetProposerAddress() []byte { } type RequestCreateOracleResultTx struct { - GossipedVotes []*oracle.GossipedVotes `protobuf:"bytes,1,rep,name=gossiped_votes,json=gossipedVotes,proto3" json:"gossiped_votes,omitempty"` + Proposer []byte `protobuf:"bytes,1,opt,name=proposer,proto3" json:"proposer,omitempty"` + GossipedVotes []*oracle.GossipedVotes `protobuf:"bytes,2,rep,name=gossiped_votes,json=gossipedVotes,proto3" json:"gossiped_votes,omitempty"` } func (m *RequestCreateOracleResultTx) Reset() { *m = RequestCreateOracleResultTx{} } @@ -1674,6 +1675,13 @@ func (m *RequestCreateOracleResultTx) XXX_DiscardUnknown() { var xxx_messageInfo_RequestCreateOracleResultTx proto.InternalMessageInfo +func (m *RequestCreateOracleResultTx) GetProposer() []byte { + if m != nil { + return m.Proposer + } + return nil +} + func (m *RequestCreateOracleResultTx) GetGossipedVotes() []*oracle.GossipedVotes { if m != nil { return m.GossipedVotes @@ -4031,225 +4039,226 @@ func init() { func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) } var fileDescriptor_252557cfdd89a31a = []byte{ - // 3486 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcd, 0x8f, 0x1b, 0xc7, - 0xb1, 0xe7, 0xf0, 0x6b, 0xc9, 0xe2, 0xc7, 0xce, 0xf6, 0xae, 0x24, 0x8a, 0x92, 0x76, 0x57, 0x63, - 0xd8, 0x96, 0x25, 0x7b, 0xd7, 0x4f, 0x7a, 0xb2, 0x2d, 0xc8, 0x7e, 0xc0, 0x2e, 0x45, 0x89, 0xbb, - 0x92, 0x77, 0xd7, 0xb3, 0x94, 0xfc, 0xf4, 0x5e, 0xe2, 0xf1, 0x90, 0x6c, 0x92, 0x63, 0x91, 0x9c, - 0xf1, 0xcc, 0x70, 0xcd, 0xf5, 0x29, 0x88, 0x13, 0x20, 0x30, 0x10, 0xc0, 0x40, 0x2e, 0x3e, 0xc4, - 0x87, 0x1c, 0x72, 0xc9, 0x5f, 0x10, 0x20, 0x40, 0x4e, 0x39, 0xf8, 0x90, 0x83, 0x8f, 0x39, 0x39, - 0x81, 0x75, 0x33, 0x90, 0x53, 0x0e, 0xb9, 0x06, 0xfd, 0x31, 0x5f, 0xe4, 0x0c, 0x3f, 0x64, 0xe7, - 0x10, 0x24, 0xb7, 0xe9, 0x62, 0x55, 0x75, 0x77, 0x75, 0x75, 0x57, 0xf5, 0xaf, 0x9a, 0x70, 0xc1, - 0xc6, 0x83, 0x16, 0x36, 0xfb, 0xda, 0xc0, 0xde, 0x56, 0x1b, 0x4d, 0x6d, 0xdb, 0x3e, 0x35, 0xb0, - 0xb5, 0x65, 0x98, 0xba, 0xad, 0xa3, 0x65, 0xef, 0xc7, 0x2d, 0xf2, 0x63, 0xf9, 0x92, 0x8f, 0xbb, - 0x69, 0x9e, 0x1a, 0xb6, 0xbe, 0x6d, 0x98, 0xba, 0xde, 0x66, 0xfc, 0xe5, 0x8b, 0x93, 0x3f, 0x3f, - 0xc1, 0xa7, 0x5c, 0x5b, 0x40, 0x98, 0xf6, 0xb2, 0x6d, 0xa8, 0xa6, 0xda, 0x77, 0x7e, 0xde, 0x9c, - 0xf8, 0xf9, 0x44, 0xed, 0x69, 0x2d, 0xd5, 0xd6, 0x4d, 0xce, 0xb1, 0xd1, 0xd1, 0xf5, 0x4e, 0x0f, - 0x6f, 0xd3, 0x56, 0x63, 0xd8, 0xde, 0xb6, 0xb5, 0x3e, 0xb6, 0x6c, 0xb5, 0x6f, 0x70, 0x86, 0xb5, - 0x8e, 0xde, 0xd1, 0xe9, 0xe7, 0x36, 0xf9, 0x0a, 0xe9, 0x57, 0x37, 0xd5, 0x66, 0x0f, 0xfb, 0x27, - 0x29, 0x3d, 0xcd, 0xc1, 0x92, 0x8c, 0x3f, 0x1c, 0x62, 0xcb, 0x46, 0xd7, 0x21, 0x89, 0x9b, 0x5d, - 0xbd, 0x24, 0x6c, 0x0a, 0x57, 0x72, 0xd7, 0x2f, 0x6e, 0x8d, 0xcd, 0x7f, 0x8b, 0xf3, 0x55, 0x9b, - 0x5d, 0xbd, 0x16, 0x93, 0x29, 0x2f, 0xba, 0x09, 0xa9, 0x76, 0x6f, 0x68, 0x75, 0x4b, 0x71, 0x2a, - 0x74, 0x29, 0x4a, 0xe8, 0x2e, 0x61, 0xaa, 0xc5, 0x64, 0xc6, 0x4d, 0xba, 0xd2, 0x06, 0x6d, 0xbd, - 0x94, 0x98, 0xde, 0xd5, 0xde, 0xa0, 0x4d, 0xbb, 0x22, 0xbc, 0x68, 0x17, 0x40, 0x1b, 0x68, 0xb6, - 0xd2, 0xec, 0xaa, 0xda, 0xa0, 0x94, 0xa2, 0x92, 0x97, 0xa3, 0x25, 0x35, 0xbb, 0x42, 0x18, 0x6b, - 0x31, 0x39, 0xab, 0x39, 0x0d, 0x32, 0xdc, 0x0f, 0x87, 0xd8, 0x3c, 0x2d, 0xa5, 0xa7, 0x0f, 0xf7, - 0x1d, 0xc2, 0x44, 0x86, 0x4b, 0xb9, 0xd1, 0x9b, 0x90, 0x69, 0x76, 0x71, 0xf3, 0x89, 0x62, 0x8f, - 0x4a, 0x19, 0x2a, 0xb9, 0x11, 0x25, 0x59, 0x21, 0x7c, 0xf5, 0x51, 0x2d, 0x26, 0x2f, 0x35, 0xd9, - 0x27, 0x7a, 0x03, 0xd2, 0x4d, 0xbd, 0xdf, 0xd7, 0xec, 0x52, 0x8e, 0xca, 0xae, 0x47, 0xca, 0x52, - 0xae, 0x5a, 0x4c, 0xe6, 0xfc, 0xe8, 0x00, 0x8a, 0x3d, 0xcd, 0xb2, 0x15, 0x6b, 0xa0, 0x1a, 0x56, - 0x57, 0xb7, 0xad, 0x52, 0x9e, 0x6a, 0x78, 0x3e, 0x4a, 0xc3, 0x03, 0xcd, 0xb2, 0x8f, 0x1d, 0xe6, - 0x5a, 0x4c, 0x2e, 0xf4, 0xfc, 0x04, 0xa2, 0x4f, 0x6f, 0xb7, 0xb1, 0xe9, 0x2a, 0x2c, 0x15, 0xa6, - 0xeb, 0x3b, 0x24, 0xdc, 0x8e, 0x3c, 0xd1, 0xa7, 0xfb, 0x09, 0xe8, 0xff, 0x61, 0xb5, 0xa7, 0xab, - 0x2d, 0x57, 0x9d, 0xd2, 0xec, 0x0e, 0x07, 0x4f, 0x4a, 0x45, 0xaa, 0xf4, 0xa5, 0xc8, 0x41, 0xea, - 0x6a, 0xcb, 0x51, 0x51, 0x21, 0x02, 0xb5, 0x98, 0xbc, 0xd2, 0x1b, 0x27, 0xa2, 0xf7, 0x60, 0x4d, - 0x35, 0x8c, 0xde, 0xe9, 0xb8, 0xf6, 0x65, 0xaa, 0xfd, 0x6a, 0x94, 0xf6, 0x1d, 0x22, 0x33, 0xae, - 0x1e, 0xa9, 0x13, 0x54, 0x54, 0x07, 0xd1, 0x30, 0xb1, 0xa1, 0x9a, 0x58, 0x31, 0x4c, 0xdd, 0xd0, - 0x2d, 0xb5, 0x57, 0x12, 0xa9, 0xee, 0x17, 0xa3, 0x74, 0x1f, 0x31, 0xfe, 0x23, 0xce, 0x5e, 0x8b, - 0xc9, 0xcb, 0x46, 0x90, 0xc4, 0xb4, 0xea, 0x4d, 0x6c, 0x59, 0x9e, 0xd6, 0x95, 0x59, 0x5a, 0x29, - 0x7f, 0x50, 0x6b, 0x80, 0x84, 0xaa, 0x90, 0xc3, 0x23, 0x22, 0xae, 0x9c, 0xe8, 0x36, 0x2e, 0x21, - 0xaa, 0x50, 0x8a, 0xdc, 0xa1, 0x94, 0xf5, 0x91, 0x6e, 0xe3, 0x5a, 0x4c, 0x06, 0xec, 0xb6, 0x90, - 0x0a, 0x67, 0x4e, 0xb0, 0xa9, 0xb5, 0x4f, 0xa9, 0x1a, 0x85, 0xfe, 0x62, 0x69, 0xfa, 0xa0, 0xb4, - 0x4a, 0x15, 0x5e, 0x8b, 0x52, 0xf8, 0x88, 0x0a, 0x11, 0x15, 0x55, 0x47, 0xa4, 0x16, 0x93, 0x57, - 0x4f, 0x26, 0xc9, 0xc4, 0xc5, 0xda, 0xda, 0x40, 0xed, 0x69, 0x1f, 0x63, 0xa5, 0xd1, 0xd3, 0x9b, - 0x4f, 0x4a, 0x6b, 0xd3, 0x5d, 0xec, 0x2e, 0xe7, 0xde, 0x25, 0xcc, 0xc4, 0xc5, 0xda, 0x7e, 0x02, - 0xc2, 0x70, 0xae, 0x69, 0x62, 0xd5, 0xc6, 0x0a, 0x3b, 0xbd, 0x14, 0x13, 0x5b, 0xc3, 0x9e, 0x4d, - 0x76, 0xe2, 0x19, 0xaa, 0xf8, 0xe5, 0xc8, 0xdd, 0x44, 0xc5, 0x0e, 0xa9, 0x94, 0x4c, 0x85, 0xe8, - 0xb6, 0x5c, 0x6b, 0x86, 0xd0, 0xd1, 0xff, 0x02, 0x6a, 0x63, 0xbb, 0xd9, 0x75, 0x7a, 0x21, 0xf6, - 0xb1, 0x4a, 0x67, 0x69, 0x0f, 0x57, 0x22, 0x87, 0x4e, 0x24, 0x98, 0x22, 0x62, 0x04, 0xb2, 0xe1, - 0xc4, 0xf6, 0x18, 0x8d, 0xda, 0x9c, 0x1d, 0xe5, 0x38, 0xa8, 0xfc, 0xdc, 0x0c, 0x9b, 0x73, 0xa1, - 0xa0, 0xfe, 0xd5, 0x93, 0x49, 0xf2, 0xee, 0x12, 0xa4, 0x4e, 0xd4, 0xde, 0x10, 0xef, 0x27, 0x33, - 0x49, 0x31, 0xb5, 0x9f, 0xcc, 0x2c, 0x89, 0x99, 0xfd, 0x64, 0x26, 0x2b, 0xc2, 0x7e, 0x32, 0x03, - 0x62, 0x4e, 0x7a, 0x11, 0x72, 0xbe, 0xc3, 0x1b, 0x95, 0x60, 0xa9, 0x8f, 0x2d, 0x4b, 0xed, 0x60, - 0x7a, 0xd6, 0x67, 0x65, 0xa7, 0x29, 0x15, 0x21, 0xef, 0x3f, 0xb0, 0xa5, 0xcf, 0x04, 0x57, 0x92, - 0x9c, 0xc5, 0x44, 0xf2, 0x04, 0x9b, 0xd4, 0x65, 0xb8, 0x24, 0x6f, 0xa2, 0xe7, 0xa0, 0x40, 0x97, - 0x5b, 0x71, 0x7e, 0x27, 0x01, 0x21, 0x29, 0xe7, 0x29, 0xf1, 0x11, 0x67, 0xda, 0x80, 0x9c, 0x71, - 0xdd, 0x70, 0x59, 0x12, 0x94, 0x05, 0x8c, 0xeb, 0x86, 0xc3, 0x70, 0x19, 0xf2, 0xc4, 0x06, 0x2e, - 0x47, 0x92, 0x76, 0x92, 0x23, 0x34, 0xce, 0x22, 0xfd, 0x31, 0x0e, 0xe2, 0xf8, 0x21, 0x8f, 0xde, - 0x80, 0x24, 0x09, 0x87, 0x3c, 0x74, 0x95, 0xb7, 0x58, 0xac, 0xdc, 0x72, 0x62, 0xe5, 0x56, 0xdd, - 0x89, 0x95, 0xbb, 0x99, 0x2f, 0xbf, 0xde, 0x88, 0x7d, 0xf6, 0xe7, 0x0d, 0x41, 0xa6, 0x12, 0xe8, - 0x3c, 0x39, 0xda, 0x55, 0x6d, 0xa0, 0x68, 0x2d, 0x3a, 0xe4, 0x2c, 0x39, 0xb7, 0x55, 0x6d, 0xb0, - 0xd7, 0x42, 0x0f, 0x40, 0x6c, 0xea, 0x03, 0x0b, 0x0f, 0xac, 0xa1, 0xa5, 0xb0, 0x68, 0xcd, 0x03, - 0x56, 0x20, 0xec, 0xb0, 0x70, 0x5a, 0x71, 0x38, 0x8f, 0x28, 0xa3, 0xbc, 0xdc, 0x0c, 0x12, 0xd0, - 0x5d, 0x00, 0x37, 0xa4, 0x5b, 0xa5, 0xe4, 0x66, 0xe2, 0x4a, 0xee, 0xfa, 0xe6, 0xc4, 0xe2, 0x3f, - 0x72, 0x58, 0x1e, 0x1a, 0x64, 0x95, 0x77, 0x93, 0x64, 0xb8, 0xb2, 0x4f, 0x12, 0xbd, 0x00, 0xcb, - 0xaa, 0x61, 0x28, 0x96, 0x4d, 0x1c, 0xaa, 0x71, 0x4a, 0x3c, 0x89, 0xc4, 0xc2, 0xbc, 0x5c, 0x50, - 0x0d, 0xe3, 0x98, 0x50, 0x77, 0x09, 0x11, 0x3d, 0x0f, 0x45, 0x12, 0xf7, 0x34, 0xb5, 0xa7, 0x74, - 0xb1, 0xd6, 0xe9, 0xda, 0x34, 0xe6, 0x25, 0xe4, 0x02, 0xa7, 0xd6, 0x28, 0x51, 0x6a, 0xb9, 0x2b, - 0x4e, 0x63, 0x1e, 0x42, 0x90, 0x6c, 0xa9, 0xb6, 0x4a, 0x2d, 0x99, 0x97, 0xe9, 0x37, 0xa1, 0x19, - 0xaa, 0xdd, 0xe5, 0xf6, 0xa1, 0xdf, 0xe8, 0x2c, 0xa4, 0xb9, 0xda, 0x04, 0x55, 0xcb, 0x5b, 0x68, - 0x0d, 0x52, 0x86, 0xa9, 0x9f, 0x60, 0xba, 0x74, 0x19, 0x99, 0x35, 0x24, 0x19, 0x8a, 0xc1, 0xf8, - 0x88, 0x8a, 0x10, 0xb7, 0x47, 0xbc, 0x97, 0xb8, 0x3d, 0x42, 0xaf, 0x42, 0x92, 0x18, 0x92, 0xf6, - 0x51, 0x0c, 0xc9, 0x08, 0xb8, 0x5c, 0xfd, 0xd4, 0xc0, 0x32, 0xe5, 0x94, 0x96, 0xa1, 0x10, 0x88, - 0x9b, 0xd2, 0x59, 0x58, 0x0b, 0x0b, 0x83, 0x52, 0xd7, 0xa5, 0x07, 0xc2, 0x19, 0xba, 0x09, 0x19, - 0x37, 0x0e, 0x32, 0xc7, 0x39, 0x3f, 0xd1, 0xad, 0xc3, 0x2c, 0xbb, 0xac, 0xc4, 0x63, 0xc8, 0x02, - 0x74, 0x55, 0x9e, 0xf5, 0xe4, 0xe5, 0x25, 0xd5, 0x30, 0x6a, 0xaa, 0xd5, 0x95, 0xde, 0x87, 0x52, - 0x54, 0x8c, 0xf3, 0x19, 0x4c, 0xa0, 0x6e, 0xef, 0x18, 0xec, 0x2c, 0xa4, 0xdb, 0xba, 0xd9, 0x57, - 0x6d, 0xaa, 0xac, 0x20, 0xf3, 0x16, 0x31, 0x24, 0x8b, 0x77, 0x09, 0x4a, 0x66, 0x0d, 0x49, 0x81, - 0xf3, 0x91, 0x71, 0x8e, 0x88, 0x68, 0x83, 0x16, 0x66, 0x66, 0x2d, 0xc8, 0xac, 0xe1, 0x29, 0x62, - 0x83, 0x65, 0x0d, 0xd2, 0xad, 0x45, 0xe7, 0x4a, 0xf5, 0x67, 0x65, 0xde, 0x92, 0x3e, 0x4f, 0xc0, - 0xd9, 0xf0, 0x68, 0x87, 0x36, 0x21, 0xdf, 0x57, 0x47, 0x8a, 0x3d, 0xe2, 0x6e, 0x27, 0xd0, 0x85, - 0x87, 0xbe, 0x3a, 0xaa, 0x8f, 0x98, 0xcf, 0x89, 0x90, 0xb0, 0x47, 0x56, 0x29, 0xbe, 0x99, 0xb8, - 0x92, 0x97, 0xc9, 0x27, 0x7a, 0x08, 0x2b, 0x3d, 0xbd, 0xa9, 0xf6, 0x94, 0x9e, 0x6a, 0xd9, 0x0a, - 0x4f, 0x83, 0xd8, 0x26, 0x7a, 0x6e, 0xc2, 0xd8, 0x2c, 0x6e, 0xe1, 0x16, 0x5b, 0x4f, 0x72, 0xe0, - 0x70, 0xff, 0x5f, 0xa6, 0x3a, 0x1e, 0xa8, 0xce, 0x52, 0xa3, 0x3b, 0x90, 0xeb, 0x6b, 0x56, 0x03, - 0x77, 0xd5, 0x13, 0x4d, 0x37, 0xf9, 0x6e, 0x9a, 0x74, 0x9a, 0xb7, 0x3d, 0x1e, 0xae, 0xc9, 0x2f, - 0xe6, 0x5b, 0x92, 0x54, 0xc0, 0x87, 0x9d, 0xd3, 0x24, 0xbd, 0xf0, 0x69, 0xf2, 0x2a, 0xac, 0x0d, - 0xf0, 0xc8, 0x56, 0xbc, 0xfd, 0xca, 0xfc, 0x64, 0x89, 0x9a, 0x1e, 0x91, 0xdf, 0xdc, 0x1d, 0x6e, - 0x11, 0x97, 0x41, 0x2f, 0xd1, 0x7c, 0xc1, 0xd0, 0x2d, 0x6c, 0x2a, 0x6a, 0xab, 0x65, 0x62, 0xcb, - 0xa2, 0x29, 0x66, 0x9e, 0x26, 0x01, 0x94, 0xbe, 0xc3, 0xc8, 0xd2, 0xcf, 0xfc, 0x4b, 0x13, 0xcc, - 0x0f, 0xb8, 0xe1, 0x05, 0xcf, 0xf0, 0xc7, 0xb0, 0xc6, 0xe5, 0x5b, 0x01, 0xdb, 0xb3, 0x3c, 0xfd, - 0xc2, 0xe4, 0xfe, 0x1a, 0xb7, 0x39, 0x72, 0xc4, 0xa3, 0xcd, 0x9e, 0x78, 0x36, 0xb3, 0x23, 0x48, - 0x52, 0xa3, 0x24, 0xd9, 0x11, 0x43, 0xbe, 0xff, 0xd5, 0x96, 0xe2, 0x93, 0x04, 0xac, 0x4c, 0x24, - 0x5b, 0xee, 0xc4, 0x84, 0xd0, 0x89, 0xc5, 0x43, 0x27, 0x96, 0x58, 0x78, 0x62, 0x7c, 0xad, 0x93, - 0xb3, 0xd7, 0x3a, 0xf5, 0x3d, 0xae, 0x75, 0xfa, 0xd9, 0xd6, 0xfa, 0x9f, 0xba, 0x0a, 0xbf, 0x14, - 0xa0, 0x1c, 0x9d, 0xa1, 0x86, 0x2e, 0xc7, 0x35, 0x58, 0x71, 0x87, 0xe2, 0xaa, 0x67, 0x07, 0xa3, - 0xe8, 0xfe, 0xc0, 0xf5, 0x47, 0xc6, 0xb8, 0xe7, 0xa1, 0x38, 0x96, 0x3f, 0x33, 0x57, 0x2e, 0x9c, - 0xf8, 0xfb, 0x97, 0x7e, 0x92, 0x70, 0x03, 0x4f, 0x20, 0xc9, 0x0d, 0xd9, 0xad, 0xef, 0xc0, 0x6a, - 0x0b, 0x37, 0xb5, 0xd6, 0xb3, 0x6e, 0xd6, 0x15, 0x2e, 0xfd, 0x9f, 0xbd, 0x3a, 0xe9, 0x25, 0x6d, - 0xb8, 0x30, 0xe5, 0x46, 0x80, 0xee, 0x41, 0xb1, 0xa3, 0x5b, 0x96, 0x66, 0xe0, 0x16, 0x4f, 0xcc, - 0x85, 0xc9, 0xdc, 0x8c, 0x25, 0xee, 0x5b, 0xf7, 0x38, 0x23, 0x4d, 0xbb, 0xe5, 0x42, 0xc7, 0xdf, - 0x94, 0xce, 0xc3, 0xb9, 0x88, 0x7b, 0x81, 0x74, 0xcb, 0xf3, 0xd3, 0xc9, 0xf4, 0x1d, 0x5d, 0x80, - 0x2c, 0xbf, 0x18, 0xb8, 0x19, 0x51, 0x86, 0x11, 0xea, 0x23, 0xe9, 0x77, 0x79, 0xc8, 0xc8, 0xd8, - 0x32, 0x48, 0x36, 0x89, 0x76, 0x21, 0x8b, 0x47, 0x4d, 0x6c, 0xd8, 0x4e, 0x02, 0x1e, 0x7e, 0x09, - 0x64, 0xdc, 0x55, 0x87, 0xb3, 0x16, 0x93, 0x3d, 0x31, 0x74, 0x83, 0xa3, 0x3c, 0xd1, 0x80, 0x0d, - 0x17, 0xf7, 0xc3, 0x3c, 0xaf, 0x39, 0x30, 0x4f, 0x22, 0x12, 0xc1, 0x60, 0x52, 0x63, 0x38, 0xcf, - 0x0d, 0x8e, 0xf3, 0x24, 0x67, 0x74, 0x16, 0x00, 0x7a, 0x2a, 0x01, 0xa0, 0x27, 0x3d, 0x63, 0x9a, - 0x11, 0x48, 0xcf, 0x6b, 0x0e, 0xd2, 0xb3, 0x34, 0x63, 0xc4, 0x63, 0x50, 0xcf, 0x5b, 0x3e, 0xa8, - 0x27, 0x4b, 0x45, 0x37, 0x23, 0x45, 0x43, 0xb0, 0x9e, 0x5b, 0x2e, 0xd6, 0x93, 0x8f, 0xc4, 0x89, - 0xb8, 0xf0, 0x38, 0xd8, 0x73, 0x38, 0x01, 0xf6, 0x30, 0x70, 0xe6, 0x85, 0x48, 0x15, 0x33, 0xd0, - 0x9e, 0xc3, 0x09, 0xb4, 0xa7, 0x38, 0x43, 0xe1, 0x0c, 0xb8, 0xe7, 0x07, 0xe1, 0x70, 0x4f, 0x34, - 0x20, 0xc3, 0x87, 0x39, 0x1f, 0xde, 0xa3, 0x44, 0xe0, 0x3d, 0x62, 0xe4, 0x3d, 0x99, 0xa9, 0x9f, - 0x1b, 0xf0, 0x79, 0x18, 0x02, 0xf8, 0xac, 0x44, 0xde, 0xf0, 0x99, 0xf2, 0x39, 0x10, 0x9f, 0x87, - 0x21, 0x88, 0x0f, 0x9a, 0xa9, 0x76, 0x26, 0xe4, 0x73, 0x37, 0x08, 0xf9, 0xac, 0x46, 0xe4, 0xcc, - 0xde, 0x6e, 0x8f, 0xc0, 0x7c, 0x1a, 0x51, 0x98, 0xcf, 0x5a, 0x24, 0x7c, 0xc2, 0x34, 0x2e, 0x00, - 0xfa, 0x1c, 0x4e, 0x80, 0x3e, 0x67, 0x66, 0x78, 0xda, 0x0c, 0xd4, 0xa7, 0x1d, 0x8d, 0xfa, 0x30, - 0x4c, 0xe6, 0x95, 0xe8, 0x7d, 0xb5, 0x08, 0xec, 0xf3, 0x38, 0x14, 0xf6, 0x39, 0x17, 0x89, 0x5f, - 0xf2, 0xc1, 0xcf, 0x83, 0xfb, 0x34, 0xa2, 0x70, 0x9f, 0xd2, 0x2c, 0xbb, 0x3f, 0x13, 0xf0, 0x93, - 0x12, 0xd3, 0xfb, 0xc9, 0x4c, 0x46, 0xcc, 0x32, 0xc8, 0x67, 0x3f, 0x99, 0xc9, 0x89, 0x79, 0xe9, - 0x25, 0x92, 0xa6, 0x8e, 0x85, 0x03, 0x72, 0x21, 0xc4, 0xa6, 0xa9, 0x9b, 0x1c, 0xc2, 0x61, 0x0d, - 0xe9, 0x0a, 0xe4, 0xfd, 0x47, 0xff, 0x14, 0x90, 0x88, 0x5e, 0xbc, 0x7d, 0xc7, 0xbd, 0xf4, 0x5b, - 0xc1, 0x93, 0xa5, 0x30, 0x91, 0x1f, 0x44, 0xc8, 0x72, 0x10, 0xc1, 0x07, 0x1d, 0xc5, 0x83, 0xd0, - 0xd1, 0x06, 0xe4, 0xc8, 0x85, 0x7a, 0x0c, 0x15, 0x52, 0x0d, 0x17, 0x15, 0xba, 0x0a, 0x2b, 0x34, - 0x2b, 0x62, 0x00, 0x13, 0xcf, 0x3d, 0x92, 0x34, 0xf7, 0x58, 0x26, 0x3f, 0x30, 0x27, 0x62, 0x49, - 0xc8, 0x2b, 0xb0, 0xea, 0xe3, 0x75, 0x2f, 0xea, 0x0c, 0x22, 0x11, 0x5d, 0xee, 0x1d, 0x7e, 0x63, - 0xff, 0x83, 0xe0, 0x59, 0xc8, 0x83, 0x93, 0xc2, 0x90, 0x1f, 0xe1, 0x7b, 0x42, 0x7e, 0xe2, 0xcf, - 0x8c, 0xfc, 0xf8, 0x81, 0x87, 0x44, 0x10, 0x78, 0xf8, 0xbb, 0xe0, 0xad, 0x89, 0x8b, 0xe3, 0x34, - 0xf5, 0x16, 0xe6, 0x50, 0x00, 0xfd, 0x26, 0x79, 0x67, 0x4f, 0xef, 0xf0, 0x0b, 0x3f, 0xf9, 0x24, - 0x5c, 0x6e, 0x7c, 0xce, 0xf2, 0xf0, 0xeb, 0xa2, 0x08, 0x2c, 0xbb, 0xe3, 0x28, 0x82, 0x08, 0x89, - 0x27, 0x98, 0xd5, 0x4d, 0xf2, 0x32, 0xf9, 0x24, 0x7c, 0xd4, 0xf9, 0x78, 0x96, 0xc6, 0x1a, 0xe8, - 0x0d, 0xc8, 0xd2, 0xa2, 0x98, 0xa2, 0x1b, 0x16, 0xaf, 0x95, 0x04, 0xf2, 0x57, 0x56, 0x19, 0xdb, - 0x3a, 0x22, 0x3c, 0x87, 0x86, 0x25, 0x67, 0x0c, 0xfe, 0xe5, 0x4b, 0x2b, 0xb3, 0x81, 0xb4, 0xf2, - 0x22, 0x64, 0xc9, 0xe8, 0x2d, 0x43, 0x6d, 0xe2, 0x12, 0xd0, 0x81, 0x7a, 0x04, 0xe9, 0x37, 0x71, - 0x58, 0x1e, 0x8b, 0xc7, 0xa1, 0x73, 0x77, 0x5c, 0x32, 0xee, 0xc3, 0xb5, 0xe6, 0xb3, 0xc7, 0x3a, - 0x40, 0x47, 0xb5, 0x94, 0x8f, 0xd4, 0x81, 0x8d, 0x5b, 0xdc, 0x28, 0x3e, 0x0a, 0x2a, 0x43, 0x86, - 0xb4, 0x86, 0x16, 0x6e, 0x71, 0x88, 0xcd, 0x6d, 0xa3, 0x1a, 0xa4, 0xf1, 0x09, 0x1e, 0xd8, 0x56, - 0x69, 0x89, 0x2e, 0xfb, 0xd9, 0x49, 0xcc, 0x83, 0xfc, 0xbc, 0x5b, 0x22, 0x8b, 0xfd, 0xed, 0xd7, - 0x1b, 0x22, 0xe3, 0x7e, 0x59, 0xef, 0x6b, 0x36, 0xee, 0x1b, 0xf6, 0xa9, 0xcc, 0xe5, 0x83, 0x56, - 0xc8, 0x8c, 0x59, 0x81, 0x82, 0xbd, 0x79, 0x07, 0xc3, 0x21, 0x36, 0xd5, 0x74, 0x53, 0xb3, 0x4f, - 0xe5, 0x42, 0x1f, 0xf7, 0x0d, 0x5d, 0xef, 0x29, 0x6c, 0x8f, 0xef, 0x40, 0x31, 0x98, 0x7e, 0xa0, - 0xe7, 0xa0, 0x60, 0x62, 0x5b, 0xd5, 0x06, 0x4a, 0xe0, 0xa6, 0x93, 0x67, 0x44, 0xb6, 0xa7, 0xf6, - 0x93, 0x19, 0x41, 0x8c, 0xef, 0x27, 0x33, 0x71, 0x31, 0x21, 0x1d, 0xc1, 0x99, 0xd0, 0xf4, 0x03, - 0xbd, 0x0e, 0x59, 0x2f, 0x73, 0x61, 0x29, 0xf4, 0x14, 0x38, 0xcd, 0xe3, 0x95, 0x7e, 0x2f, 0x78, - 0x2a, 0x83, 0x00, 0x5d, 0x15, 0xd2, 0xec, 0xdc, 0xa7, 0x2b, 0x59, 0x9c, 0x72, 0xe8, 0x07, 0xe4, - 0xb6, 0xd8, 0xf1, 0x2e, 0x73, 0x61, 0xe9, 0x3d, 0x48, 0x33, 0x0a, 0xca, 0xc1, 0xd2, 0xc3, 0x83, - 0xfb, 0x07, 0x87, 0xef, 0x1e, 0x88, 0x31, 0x04, 0x90, 0xde, 0xa9, 0x54, 0xaa, 0x47, 0x75, 0x51, - 0x40, 0x59, 0x48, 0xed, 0xec, 0x1e, 0xca, 0x75, 0x31, 0x4e, 0xc8, 0x72, 0x75, 0xbf, 0x5a, 0xa9, - 0x8b, 0x09, 0xb4, 0x02, 0x05, 0xf6, 0xad, 0xdc, 0x3d, 0x94, 0xdf, 0xde, 0xa9, 0x8b, 0x49, 0x1f, - 0xe9, 0xb8, 0x7a, 0x70, 0xa7, 0x2a, 0x8b, 0x29, 0xe9, 0xbf, 0xe0, 0x7c, 0x64, 0xaa, 0xe3, 0xa1, - 0x6f, 0x82, 0x0f, 0x7d, 0x93, 0x3e, 0x8f, 0x93, 0x1b, 0x41, 0x54, 0xfe, 0x82, 0xf6, 0xc7, 0x26, - 0x7e, 0x7d, 0x81, 0xe4, 0x67, 0x6c, 0xf6, 0xe4, 0xb2, 0x6a, 0x62, 0x16, 0xe4, 0x68, 0xdf, 0xec, - 0x04, 0x2a, 0xc8, 0x05, 0x4e, 0xa5, 0x42, 0x16, 0x63, 0xfb, 0x00, 0x37, 0x6d, 0x85, 0x39, 0x91, - 0x45, 0x6f, 0x8c, 0x59, 0xc2, 0x46, 0xa8, 0xc7, 0x8c, 0x28, 0xbd, 0xbf, 0x90, 0x2d, 0xb3, 0x90, - 0x92, 0xab, 0x75, 0xf9, 0xb1, 0x98, 0x40, 0x08, 0x8a, 0xf4, 0x53, 0x39, 0x3e, 0xd8, 0x39, 0x3a, - 0xae, 0x1d, 0x12, 0x5b, 0xae, 0xc2, 0xb2, 0x63, 0x4b, 0x87, 0x98, 0x92, 0xae, 0x91, 0x6b, 0x54, - 0x68, 0xf2, 0x35, 0x79, 0x6f, 0x96, 0x7e, 0x25, 0xf8, 0xb9, 0x83, 0x09, 0xd4, 0x21, 0xa4, 0x2d, - 0x5b, 0xb5, 0x87, 0x16, 0x37, 0xe2, 0xeb, 0xf3, 0x66, 0x63, 0x5b, 0xce, 0xc7, 0x31, 0x15, 0x97, - 0xb9, 0x1a, 0xe9, 0x26, 0x14, 0x83, 0xbf, 0x44, 0xdb, 0xc0, 0x73, 0xa2, 0xb8, 0x74, 0x1b, 0xd0, - 0x64, 0x92, 0x16, 0x82, 0x21, 0x08, 0x61, 0x18, 0xc2, 0xaf, 0x05, 0x72, 0x7b, 0x8d, 0x4c, 0xc8, - 0xd0, 0x3b, 0x63, 0x93, 0xbc, 0xb5, 0x48, 0x3a, 0xb7, 0xc5, 0x68, 0x63, 0xd3, 0xbc, 0x01, 0x79, - 0x3f, 0x7d, 0xbe, 0x49, 0x7e, 0x1b, 0xf7, 0x36, 0x71, 0x10, 0xec, 0xf0, 0x8e, 0x40, 0xe1, 0x3b, - 0x1e, 0x81, 0x6f, 0x02, 0xd8, 0x23, 0x9e, 0x09, 0x3a, 0x71, 0xf4, 0x52, 0x08, 0x88, 0x8c, 0x9b, - 0xf5, 0x11, 0xdf, 0x04, 0x59, 0x9b, 0x7f, 0x59, 0xe8, 0xd8, 0x8f, 0xfc, 0x0c, 0x69, 0x8c, 0xb5, - 0x38, 0x2a, 0x32, 0x6f, 0x30, 0xf6, 0x10, 0x22, 0x46, 0xb6, 0xd0, 0x63, 0x38, 0x37, 0x96, 0x28, - 0xb8, 0xaa, 0x93, 0xf3, 0xe6, 0x0b, 0x67, 0x82, 0xf9, 0x82, 0xa3, 0xda, 0x1f, 0xed, 0x53, 0xc1, - 0x68, 0xff, 0x16, 0x5c, 0x9c, 0x96, 0xed, 0xa2, 0x4b, 0x00, 0x78, 0x40, 0x82, 0x43, 0xcb, 0x43, - 0x14, 0xb2, 0x9c, 0x52, 0x1f, 0x49, 0xf7, 0xa0, 0x14, 0x95, 0xc9, 0xa2, 0x6b, 0x90, 0xa4, 0xd7, - 0x0d, 0x96, 0xed, 0x9c, 0x0b, 0xc1, 0x40, 0x08, 0x9f, 0x4c, 0x99, 0xa4, 0x9f, 0xfb, 0x9d, 0x33, - 0x04, 0xd8, 0xb8, 0x3f, 0xe6, 0x9c, 0x37, 0x16, 0xc9, 0x79, 0xb7, 0xc6, 0xdc, 0xf2, 0x32, 0xa4, - 0xb9, 0x43, 0x02, 0xa4, 0xd5, 0x86, 0x85, 0x07, 0xb6, 0x18, 0x23, 0xce, 0x69, 0x98, 0x98, 0x36, - 0x04, 0xe9, 0x31, 0x80, 0x87, 0x8c, 0x91, 0x93, 0xd7, 0xd4, 0x87, 0x83, 0x16, 0xed, 0x3c, 0x25, - 0xb3, 0x06, 0xba, 0x09, 0x29, 0x96, 0x86, 0xc7, 0x23, 0x42, 0x14, 0xe9, 0xdc, 0x87, 0xac, 0x31, - 0x6e, 0x49, 0x03, 0x34, 0x59, 0x9d, 0x88, 0xe8, 0xe2, 0xad, 0x60, 0x17, 0x97, 0x23, 0xeb, 0x1c, - 0xe1, 0x5d, 0x7d, 0x0c, 0x29, 0xba, 0x23, 0x48, 0x32, 0x42, 0x4b, 0x62, 0x3c, 0x8b, 0x26, 0xdf, - 0xe8, 0x87, 0x00, 0xaa, 0x6d, 0x9b, 0x5a, 0x63, 0xe8, 0x75, 0xb0, 0x11, 0xbe, 0xa3, 0x76, 0x1c, - 0xbe, 0xdd, 0x8b, 0x7c, 0x6b, 0xad, 0x79, 0xa2, 0xbe, 0xed, 0xe5, 0x53, 0x28, 0x1d, 0x40, 0x31, - 0x28, 0xeb, 0xe4, 0x7d, 0x6c, 0x0c, 0xc1, 0xbc, 0x8f, 0xa5, 0xf1, 0x3c, 0xef, 0x73, 0xb3, 0xc6, - 0x04, 0xab, 0xfb, 0xd1, 0x86, 0xf4, 0xa3, 0x38, 0xe4, 0xfd, 0x1b, 0xf2, 0xdf, 0x2f, 0x35, 0x93, - 0x7e, 0x2a, 0x40, 0xc6, 0x9d, 0x7e, 0xb0, 0x08, 0x18, 0xa8, 0x9a, 0x32, 0xeb, 0xc5, 0xfd, 0x95, - 0x3b, 0x56, 0x23, 0x4d, 0xb8, 0x35, 0xd2, 0xdb, 0x6e, 0x5a, 0x10, 0x85, 0xa7, 0xf9, 0x6d, 0xcd, - 0xbd, 0xca, 0xc9, 0x82, 0x6e, 0x43, 0xd6, 0x3d, 0xd5, 0xc8, 0x65, 0xcc, 0x41, 0x4d, 0x05, 0x7e, - 0xb6, 0x70, 0xcc, 0x7b, 0x0d, 0x52, 0x86, 0xfe, 0x11, 0x2f, 0x0b, 0x26, 0x64, 0xd6, 0x90, 0x5a, - 0xb0, 0x3c, 0x76, 0x24, 0xa2, 0xdb, 0xb0, 0x64, 0x0c, 0x1b, 0x8a, 0xe3, 0x1c, 0x63, 0xd8, 0xb2, - 0x93, 0xe6, 0x0f, 0x1b, 0x3d, 0xad, 0x79, 0x1f, 0x9f, 0x3a, 0x83, 0x31, 0x86, 0x8d, 0xfb, 0xcc, - 0x87, 0x58, 0x2f, 0x71, 0x7f, 0x2f, 0xbf, 0x10, 0x20, 0xe3, 0xec, 0x09, 0xf4, 0x3f, 0x90, 0x75, - 0x8f, 0x5b, 0xb7, 0xae, 0x1f, 0x79, 0x4e, 0x73, 0xfd, 0x9e, 0x08, 0xda, 0x71, 0x1e, 0x24, 0x68, - 0x2d, 0xa5, 0xdd, 0x53, 0x99, 0x2f, 0x15, 0x83, 0x36, 0x63, 0x07, 0x32, 0x8d, 0x53, 0x7b, 0x77, - 0xee, 0xf6, 0xd4, 0x8e, 0x9c, 0xa3, 0x32, 0x7b, 0x2d, 0xd2, 0xe0, 0x19, 0xef, 0xdf, 0x04, 0x10, - 0xc7, 0x77, 0xec, 0x77, 0x1e, 0xdd, 0x64, 0xf8, 0x4f, 0x84, 0x84, 0x7f, 0xb4, 0x0d, 0xab, 0x2e, - 0x87, 0x62, 0x69, 0x9d, 0x81, 0x6a, 0x0f, 0x4d, 0xcc, 0xd1, 0x78, 0xe4, 0xfe, 0x74, 0xec, 0xfc, - 0x32, 0x39, 0xeb, 0xd4, 0x33, 0xce, 0xfa, 0x93, 0x38, 0xe4, 0x7c, 0xb5, 0x01, 0xf4, 0xdf, 0xbe, - 0xc3, 0xa8, 0x18, 0x12, 0x31, 0x7d, 0xbc, 0x5e, 0x8d, 0x3e, 0x68, 0xa6, 0xf8, 0xe2, 0x66, 0x8a, - 0xaa, 0xc0, 0x38, 0xa5, 0x86, 0xe4, 0xc2, 0xa5, 0x86, 0x97, 0x01, 0xd9, 0xba, 0xad, 0xf6, 0x94, - 0x13, 0xdd, 0xd6, 0x06, 0x1d, 0x85, 0xb9, 0x21, 0x3b, 0x3a, 0x44, 0xfa, 0xcb, 0x23, 0xfa, 0xc3, - 0x11, 0xf5, 0xc8, 0x1f, 0x0b, 0x90, 0x71, 0xaf, 0x23, 0x8b, 0x56, 0xf0, 0xcf, 0x42, 0x9a, 0x67, - 0xdc, 0xac, 0x84, 0xcf, 0x5b, 0xa1, 0x35, 0x95, 0x32, 0x64, 0xfa, 0xd8, 0x56, 0xe9, 0x39, 0xc8, - 0xa2, 0xbd, 0xdb, 0xbe, 0x7a, 0x0b, 0x72, 0xbe, 0xd7, 0x0f, 0xe4, 0x68, 0x3c, 0xa8, 0xbe, 0x2b, - 0xc6, 0xca, 0x4b, 0x9f, 0x7e, 0xb1, 0x99, 0x38, 0xc0, 0x1f, 0x91, 0xdd, 0x2c, 0x57, 0x2b, 0xb5, - 0x6a, 0xe5, 0xbe, 0x28, 0x94, 0x73, 0x9f, 0x7e, 0xb1, 0xb9, 0x24, 0x63, 0x0a, 0x48, 0x5f, 0xbd, - 0x0f, 0xcb, 0x63, 0x0b, 0x13, 0x4c, 0xe7, 0x10, 0x14, 0xef, 0x3c, 0x3c, 0x7a, 0xb0, 0x57, 0xd9, - 0xa9, 0x57, 0x95, 0x47, 0x87, 0xf5, 0xaa, 0x28, 0xa0, 0x73, 0xb0, 0xfa, 0x60, 0xef, 0x5e, 0xad, - 0xae, 0x54, 0x1e, 0xec, 0x55, 0x0f, 0xea, 0xca, 0x4e, 0xbd, 0xbe, 0x53, 0xb9, 0x2f, 0xc6, 0xaf, - 0xff, 0xb5, 0x00, 0xc9, 0x9d, 0xdd, 0xca, 0x1e, 0xaa, 0x40, 0x92, 0x42, 0x44, 0x53, 0x9f, 0x88, - 0x96, 0xa7, 0x97, 0x16, 0xd0, 0x5d, 0x48, 0x51, 0xf4, 0x08, 0x4d, 0x7f, 0x33, 0x5a, 0x9e, 0x51, - 0x6b, 0x20, 0x83, 0xa1, 0x3b, 0x72, 0xea, 0x23, 0xd2, 0xf2, 0xf4, 0xd2, 0x03, 0x7a, 0x00, 0x4b, - 0x0e, 0x78, 0x30, 0xeb, 0x65, 0x67, 0x79, 0x66, 0x3d, 0x80, 0x4c, 0x8d, 0x81, 0x30, 0xd3, 0xdf, - 0x97, 0x96, 0x67, 0x14, 0x25, 0xd0, 0x1e, 0xa4, 0xf9, 0x35, 0x7d, 0xc6, 0x93, 0xd1, 0xf2, 0xac, - 0x32, 0x03, 0x92, 0x21, 0xeb, 0xc1, 0x5b, 0xb3, 0x5f, 0xcd, 0x96, 0xe7, 0xa8, 0xb7, 0xa0, 0xf7, - 0xa0, 0x10, 0x84, 0x00, 0xe6, 0x7b, 0x96, 0x5a, 0x9e, 0xb3, 0xa0, 0x41, 0xf4, 0x07, 0xf1, 0x80, - 0xf9, 0x9e, 0xa9, 0x96, 0xe7, 0xac, 0x6f, 0xa0, 0x0f, 0x60, 0x65, 0xf2, 0xbe, 0x3e, 0xff, 0xab, - 0xd5, 0xf2, 0x02, 0x15, 0x0f, 0xd4, 0x07, 0x14, 0x72, 0xcf, 0x5f, 0xe0, 0x11, 0x6b, 0x79, 0x91, - 0x02, 0x08, 0x6a, 0xc1, 0xf2, 0xf8, 0xe5, 0x79, 0xde, 0x47, 0xad, 0xe5, 0xb9, 0x8b, 0x21, 0xac, - 0x97, 0xe0, 0xa5, 0x7b, 0xde, 0x47, 0xae, 0xe5, 0xb9, 0x6b, 0x23, 0xe8, 0x21, 0x80, 0xef, 0xde, - 0x3c, 0xc7, 0xa3, 0xd7, 0xf2, 0x3c, 0x55, 0x12, 0x64, 0xc0, 0x6a, 0xd8, 0x85, 0x7a, 0x91, 0x37, - 0xb0, 0xe5, 0x85, 0x8a, 0x27, 0xc4, 0x9f, 0x83, 0x57, 0xe3, 0xf9, 0xde, 0xc4, 0x96, 0xe7, 0xac, - 0xa2, 0x20, 0x0b, 0xd6, 0x42, 0xaf, 0x83, 0x0b, 0xbd, 0x90, 0x2d, 0x2f, 0x56, 0x59, 0x41, 0x1d, - 0x10, 0x27, 0x2e, 0x91, 0x73, 0x3f, 0x98, 0x2d, 0xcf, 0x5f, 0x63, 0xa1, 0xeb, 0x15, 0x72, 0xc7, - 0x5c, 0xe4, 0xfd, 0x6c, 0x79, 0xa1, 0xa2, 0xcb, 0xee, 0xce, 0x97, 0xdf, 0xac, 0x0b, 0x5f, 0x7d, - 0xb3, 0x2e, 0xfc, 0xe5, 0x9b, 0x75, 0xe1, 0xb3, 0xa7, 0xeb, 0xb1, 0xaf, 0x9e, 0xae, 0xc7, 0xfe, - 0xf4, 0x74, 0x3d, 0xf6, 0x7f, 0x2f, 0x76, 0x34, 0xbb, 0x3b, 0x6c, 0x6c, 0x35, 0xf5, 0xfe, 0x76, - 0x53, 0xef, 0x63, 0xbb, 0xd1, 0xb6, 0xbd, 0x0f, 0xef, 0x9f, 0x24, 0x8d, 0x34, 0xcd, 0x48, 0x6e, - 0xfc, 0x23, 0x00, 0x00, 0xff, 0xff, 0x2d, 0x0f, 0x04, 0x5b, 0x69, 0x32, 0x00, 0x00, + // 3494 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcb, 0x8f, 0x1b, 0xc7, + 0xd1, 0xe7, 0xf0, 0xb5, 0x64, 0xf1, 0xb1, 0xb3, 0xbd, 0x2b, 0x89, 0xa2, 0xa4, 0xdd, 0xd5, 0x18, + 0xb6, 0x65, 0xc9, 0xde, 0xf5, 0x27, 0x7d, 0xb2, 0x2d, 0xc8, 0xfe, 0x80, 0x5d, 0x8a, 0x12, 0x77, + 0x25, 0xef, 0xae, 0x67, 0x29, 0xf9, 0xd3, 0xf7, 0xf0, 0x78, 0x48, 0x36, 0xc9, 0xb1, 0x48, 0xce, + 0x78, 0x66, 0xb8, 0xe6, 0xfa, 0x14, 0xd8, 0x09, 0x10, 0x18, 0x08, 0x60, 0x20, 0x17, 0x1f, 0xe2, + 0x43, 0x0e, 0xb9, 0xe4, 0x2f, 0x08, 0x10, 0x20, 0xa7, 0x1c, 0x7c, 0xc8, 0xc1, 0xc7, 0x9c, 0x9c, + 0xc0, 0xba, 0x19, 0xc8, 0x29, 0x87, 0x5c, 0x83, 0x7e, 0xcc, 0x8b, 0x9c, 0xe1, 0x43, 0x76, 0x0e, + 0x41, 0x72, 0x9b, 0x2e, 0x56, 0x55, 0x77, 0x57, 0x57, 0x77, 0x55, 0xff, 0xaa, 0x09, 0x17, 0x6c, + 0x3c, 0x68, 0x61, 0xb3, 0xaf, 0x0d, 0xec, 0x6d, 0xb5, 0xd1, 0xd4, 0xb6, 0xed, 0x53, 0x03, 0x5b, + 0x5b, 0x86, 0xa9, 0xdb, 0x3a, 0x5a, 0xf6, 0x7e, 0xdc, 0x22, 0x3f, 0x96, 0x2f, 0xf9, 0xb8, 0x9b, + 0xe6, 0xa9, 0x61, 0xeb, 0xdb, 0x86, 0xa9, 0xeb, 0x6d, 0xc6, 0x5f, 0xbe, 0x38, 0xf9, 0xf3, 0x13, + 0x7c, 0xca, 0xb5, 0x05, 0x84, 0x69, 0x2f, 0xdb, 0x86, 0x6a, 0xaa, 0x7d, 0xe7, 0xe7, 0xcd, 0x89, + 0x9f, 0x4f, 0xd4, 0x9e, 0xd6, 0x52, 0x6d, 0xdd, 0xe4, 0x1c, 0x1b, 0x1d, 0x5d, 0xef, 0xf4, 0xf0, + 0x36, 0x6d, 0x35, 0x86, 0xed, 0x6d, 0x5b, 0xeb, 0x63, 0xcb, 0x56, 0xfb, 0x06, 0x67, 0x58, 0xeb, + 0xe8, 0x1d, 0x9d, 0x7e, 0x6e, 0x93, 0xaf, 0x90, 0x7e, 0x75, 0x53, 0x6d, 0xf6, 0xb0, 0x7f, 0x92, + 0xd2, 0xd3, 0x1c, 0x2c, 0xc9, 0xf8, 0xc3, 0x21, 0xb6, 0x6c, 0x74, 0x1d, 0x92, 0xb8, 0xd9, 0xd5, + 0x4b, 0xc2, 0xa6, 0x70, 0x25, 0x77, 0xfd, 0xe2, 0xd6, 0xd8, 0xfc, 0xb7, 0x38, 0x5f, 0xb5, 0xd9, + 0xd5, 0x6b, 0x31, 0x99, 0xf2, 0xa2, 0x9b, 0x90, 0x6a, 0xf7, 0x86, 0x56, 0xb7, 0x14, 0xa7, 0x42, + 0x97, 0xa2, 0x84, 0xee, 0x12, 0xa6, 0x5a, 0x4c, 0x66, 0xdc, 0xa4, 0x2b, 0x6d, 0xd0, 0xd6, 0x4b, + 0x89, 0xe9, 0x5d, 0xed, 0x0d, 0xda, 0xb4, 0x2b, 0xc2, 0x8b, 0x76, 0x01, 0xb4, 0x81, 0x66, 0x2b, + 0xcd, 0xae, 0xaa, 0x0d, 0x4a, 0x29, 0x2a, 0x79, 0x39, 0x5a, 0x52, 0xb3, 0x2b, 0x84, 0xb1, 0x16, + 0x93, 0xb3, 0x9a, 0xd3, 0x20, 0xc3, 0xfd, 0x70, 0x88, 0xcd, 0xd3, 0x52, 0x7a, 0xfa, 0x70, 0xdf, + 0x21, 0x4c, 0x64, 0xb8, 0x94, 0x1b, 0xbd, 0x09, 0x99, 0x66, 0x17, 0x37, 0x9f, 0x28, 0xf6, 0xa8, + 0x94, 0xa1, 0x92, 0x1b, 0x51, 0x92, 0x15, 0xc2, 0x57, 0x1f, 0xd5, 0x62, 0xf2, 0x52, 0x93, 0x7d, + 0xa2, 0x37, 0x20, 0xdd, 0xd4, 0xfb, 0x7d, 0xcd, 0x2e, 0xe5, 0xa8, 0xec, 0x7a, 0xa4, 0x2c, 0xe5, + 0xaa, 0xc5, 0x64, 0xce, 0x8f, 0x0e, 0xa0, 0xd8, 0xd3, 0x2c, 0x5b, 0xb1, 0x06, 0xaa, 0x61, 0x75, + 0x75, 0xdb, 0x2a, 0xe5, 0xa9, 0x86, 0xe7, 0xa3, 0x34, 0x3c, 0xd0, 0x2c, 0xfb, 0xd8, 0x61, 0xae, + 0xc5, 0xe4, 0x42, 0xcf, 0x4f, 0x20, 0xfa, 0xf4, 0x76, 0x1b, 0x9b, 0xae, 0xc2, 0x52, 0x61, 0xba, + 0xbe, 0x43, 0xc2, 0xed, 0xc8, 0x13, 0x7d, 0xba, 0x9f, 0x80, 0xfe, 0x17, 0x56, 0x7b, 0xba, 0xda, + 0x72, 0xd5, 0x29, 0xcd, 0xee, 0x70, 0xf0, 0xa4, 0x54, 0xa4, 0x4a, 0x5f, 0x8a, 0x1c, 0xa4, 0xae, + 0xb6, 0x1c, 0x15, 0x15, 0x22, 0x50, 0x8b, 0xc9, 0x2b, 0xbd, 0x71, 0x22, 0x7a, 0x0f, 0xd6, 0x54, + 0xc3, 0xe8, 0x9d, 0x8e, 0x6b, 0x5f, 0xa6, 0xda, 0xaf, 0x46, 0x69, 0xdf, 0x21, 0x32, 0xe3, 0xea, + 0x91, 0x3a, 0x41, 0x45, 0x75, 0x10, 0x0d, 0x13, 0x1b, 0xaa, 0x89, 0x15, 0xc3, 0xd4, 0x0d, 0xdd, + 0x52, 0x7b, 0x25, 0x91, 0xea, 0x7e, 0x31, 0x4a, 0xf7, 0x11, 0xe3, 0x3f, 0xe2, 0xec, 0xb5, 0x98, + 0xbc, 0x6c, 0x04, 0x49, 0x4c, 0xab, 0xde, 0xc4, 0x96, 0xe5, 0x69, 0x5d, 0x99, 0xa5, 0x95, 0xf2, + 0x07, 0xb5, 0x06, 0x48, 0xa8, 0x0a, 0x39, 0x3c, 0x22, 0xe2, 0xca, 0x89, 0x6e, 0xe3, 0x12, 0xa2, + 0x0a, 0xa5, 0xc8, 0x1d, 0x4a, 0x59, 0x1f, 0xe9, 0x36, 0xae, 0xc5, 0x64, 0xc0, 0x6e, 0x0b, 0xa9, + 0x70, 0xe6, 0x04, 0x9b, 0x5a, 0xfb, 0x94, 0xaa, 0x51, 0xe8, 0x2f, 0x96, 0xa6, 0x0f, 0x4a, 0xab, + 0x54, 0xe1, 0xb5, 0x28, 0x85, 0x8f, 0xa8, 0x10, 0x51, 0x51, 0x75, 0x44, 0x6a, 0x31, 0x79, 0xf5, + 0x64, 0x92, 0x4c, 0x5c, 0xac, 0xad, 0x0d, 0xd4, 0x9e, 0xf6, 0x31, 0x56, 0x1a, 0x3d, 0xbd, 0xf9, + 0xa4, 0xb4, 0x36, 0xdd, 0xc5, 0xee, 0x72, 0xee, 0x5d, 0xc2, 0x4c, 0x5c, 0xac, 0xed, 0x27, 0x20, + 0x0c, 0xe7, 0x9a, 0x26, 0x56, 0x6d, 0xac, 0xb0, 0xd3, 0x4b, 0x31, 0xb1, 0x35, 0xec, 0xd9, 0x64, + 0x27, 0x9e, 0xa1, 0x8a, 0x5f, 0x8e, 0xdc, 0x4d, 0x54, 0xec, 0x90, 0x4a, 0xc9, 0x54, 0x88, 0x6e, + 0xcb, 0xb5, 0x66, 0x08, 0x1d, 0xfd, 0x37, 0xa0, 0x36, 0xb6, 0x9b, 0x5d, 0xa7, 0x17, 0x62, 0x1f, + 0xab, 0x74, 0x96, 0xf6, 0x70, 0x25, 0x72, 0xe8, 0x44, 0x82, 0x29, 0x22, 0x46, 0x20, 0x1b, 0x4e, + 0x6c, 0x8f, 0xd1, 0xa8, 0xcd, 0xd9, 0x51, 0x8e, 0x83, 0xca, 0xcf, 0xcd, 0xb0, 0x39, 0x17, 0x0a, + 0xea, 0x5f, 0x3d, 0x99, 0x24, 0xef, 0x2e, 0x41, 0xea, 0x44, 0xed, 0x0d, 0xf1, 0x7e, 0x32, 0x93, + 0x14, 0x53, 0xfb, 0xc9, 0xcc, 0x92, 0x98, 0xd9, 0x4f, 0x66, 0xb2, 0x22, 0xec, 0x27, 0x33, 0x20, + 0xe6, 0xa4, 0x17, 0x21, 0xe7, 0x3b, 0xbc, 0x51, 0x09, 0x96, 0xfa, 0xd8, 0xb2, 0xd4, 0x0e, 0xa6, + 0x67, 0x7d, 0x56, 0x76, 0x9a, 0x52, 0x11, 0xf2, 0xfe, 0x03, 0x5b, 0xfa, 0x5c, 0x70, 0x25, 0xc9, + 0x59, 0x4c, 0x24, 0x4f, 0xb0, 0x49, 0x5d, 0x86, 0x4b, 0xf2, 0x26, 0x7a, 0x0e, 0x0a, 0x74, 0xb9, + 0x15, 0xe7, 0x77, 0x12, 0x10, 0x92, 0x72, 0x9e, 0x12, 0x1f, 0x71, 0xa6, 0x0d, 0xc8, 0x19, 0xd7, + 0x0d, 0x97, 0x25, 0x41, 0x59, 0xc0, 0xb8, 0x6e, 0x38, 0x0c, 0x97, 0x21, 0x4f, 0x6c, 0xe0, 0x72, + 0x24, 0x69, 0x27, 0x39, 0x42, 0xe3, 0x2c, 0xd2, 0x1f, 0xe2, 0x20, 0x8e, 0x1f, 0xf2, 0xe8, 0x0d, + 0x48, 0x92, 0x70, 0xc8, 0x43, 0x57, 0x79, 0x8b, 0xc5, 0xca, 0x2d, 0x27, 0x56, 0x6e, 0xd5, 0x9d, + 0x58, 0xb9, 0x9b, 0xf9, 0xea, 0x9b, 0x8d, 0xd8, 0xe7, 0x7f, 0xda, 0x10, 0x64, 0x2a, 0x81, 0xce, + 0x93, 0xa3, 0x5d, 0xd5, 0x06, 0x8a, 0xd6, 0xa2, 0x43, 0xce, 0x92, 0x73, 0x5b, 0xd5, 0x06, 0x7b, + 0x2d, 0xf4, 0x00, 0xc4, 0xa6, 0x3e, 0xb0, 0xf0, 0xc0, 0x1a, 0x5a, 0x0a, 0x8b, 0xd6, 0x3c, 0x60, + 0x05, 0xc2, 0x0e, 0x0b, 0xa7, 0x15, 0x87, 0xf3, 0x88, 0x32, 0xca, 0xcb, 0xcd, 0x20, 0x01, 0xdd, + 0x05, 0x70, 0x43, 0xba, 0x55, 0x4a, 0x6e, 0x26, 0xae, 0xe4, 0xae, 0x6f, 0x4e, 0x2c, 0xfe, 0x23, + 0x87, 0xe5, 0xa1, 0x41, 0x56, 0x79, 0x37, 0x49, 0x86, 0x2b, 0xfb, 0x24, 0xd1, 0x0b, 0xb0, 0xac, + 0x1a, 0x86, 0x62, 0xd9, 0xc4, 0xa1, 0x1a, 0xa7, 0xc4, 0x93, 0x48, 0x2c, 0xcc, 0xcb, 0x05, 0xd5, + 0x30, 0x8e, 0x09, 0x75, 0x97, 0x10, 0xd1, 0xf3, 0x50, 0x24, 0x71, 0x4f, 0x53, 0x7b, 0x4a, 0x17, + 0x6b, 0x9d, 0xae, 0x4d, 0x63, 0x5e, 0x42, 0x2e, 0x70, 0x6a, 0x8d, 0x12, 0xa5, 0x96, 0xbb, 0xe2, + 0x34, 0xe6, 0x21, 0x04, 0xc9, 0x96, 0x6a, 0xab, 0xd4, 0x92, 0x79, 0x99, 0x7e, 0x13, 0x9a, 0xa1, + 0xda, 0x5d, 0x6e, 0x1f, 0xfa, 0x8d, 0xce, 0x42, 0x9a, 0xab, 0x4d, 0x50, 0xb5, 0xbc, 0x85, 0xd6, + 0x20, 0x65, 0x98, 0xfa, 0x09, 0xa6, 0x4b, 0x97, 0x91, 0x59, 0x43, 0x92, 0xa1, 0x18, 0x8c, 0x8f, + 0xa8, 0x08, 0x71, 0x7b, 0xc4, 0x7b, 0x89, 0xdb, 0x23, 0xf4, 0x2a, 0x24, 0x89, 0x21, 0x69, 0x1f, + 0xc5, 0x90, 0x8c, 0x80, 0xcb, 0xd5, 0x4f, 0x0d, 0x2c, 0x53, 0x4e, 0x69, 0x19, 0x0a, 0x81, 0xb8, + 0x29, 0x9d, 0x85, 0xb5, 0xb0, 0x30, 0x28, 0x75, 0x5d, 0x7a, 0x20, 0x9c, 0xa1, 0x9b, 0x90, 0x71, + 0xe3, 0x20, 0x73, 0x9c, 0xf3, 0x13, 0xdd, 0x3a, 0xcc, 0xb2, 0xcb, 0x4a, 0x3c, 0x86, 0x2c, 0x40, + 0x57, 0xe5, 0x59, 0x4f, 0x5e, 0x5e, 0x52, 0x0d, 0xa3, 0xa6, 0x5a, 0x5d, 0xe9, 0x7d, 0x28, 0x45, + 0xc5, 0x38, 0x9f, 0xc1, 0x04, 0xea, 0xf6, 0x8e, 0xc1, 0xce, 0x42, 0xba, 0xad, 0x9b, 0x7d, 0xd5, + 0xa6, 0xca, 0x0a, 0x32, 0x6f, 0x11, 0x43, 0xb2, 0x78, 0x97, 0xa0, 0x64, 0xd6, 0x90, 0x14, 0x38, + 0x1f, 0x19, 0xe7, 0x88, 0x88, 0x36, 0x68, 0x61, 0x66, 0xd6, 0x82, 0xcc, 0x1a, 0x9e, 0x22, 0x36, + 0x58, 0xd6, 0x20, 0xdd, 0x5a, 0x74, 0xae, 0x54, 0x7f, 0x56, 0xe6, 0x2d, 0xe9, 0x8b, 0x04, 0x9c, + 0x0d, 0x8f, 0x76, 0x68, 0x13, 0xf2, 0x7d, 0x75, 0xa4, 0xd8, 0x23, 0xee, 0x76, 0x02, 0x5d, 0x78, + 0xe8, 0xab, 0xa3, 0xfa, 0x88, 0xf9, 0x9c, 0x08, 0x09, 0x7b, 0x64, 0x95, 0xe2, 0x9b, 0x89, 0x2b, + 0x79, 0x99, 0x7c, 0xa2, 0x87, 0xb0, 0xd2, 0xd3, 0x9b, 0x6a, 0x4f, 0xe9, 0xa9, 0x96, 0xad, 0xf0, + 0x34, 0x88, 0x6d, 0xa2, 0xe7, 0x26, 0x8c, 0xcd, 0xe2, 0x16, 0x6e, 0xb1, 0xf5, 0x24, 0x07, 0x0e, + 0xf7, 0xff, 0x65, 0xaa, 0xe3, 0x81, 0xea, 0x2c, 0x35, 0xba, 0x03, 0xb9, 0xbe, 0x66, 0x35, 0x70, + 0x57, 0x3d, 0xd1, 0x74, 0x93, 0xef, 0xa6, 0x49, 0xa7, 0x79, 0xdb, 0xe3, 0xe1, 0x9a, 0xfc, 0x62, + 0xbe, 0x25, 0x49, 0x05, 0x7c, 0xd8, 0x39, 0x4d, 0xd2, 0x0b, 0x9f, 0x26, 0xaf, 0xc2, 0xda, 0x00, + 0x8f, 0x6c, 0xc5, 0xdb, 0xaf, 0xcc, 0x4f, 0x96, 0xa8, 0xe9, 0x11, 0xf9, 0xcd, 0xdd, 0xe1, 0x16, + 0x71, 0x19, 0xf4, 0x12, 0xcd, 0x17, 0x0c, 0xdd, 0xc2, 0xa6, 0xa2, 0xb6, 0x5a, 0x26, 0xb6, 0x2c, + 0x9a, 0x62, 0xe6, 0x69, 0x12, 0x40, 0xe9, 0x3b, 0x8c, 0x2c, 0xfd, 0xd4, 0xbf, 0x34, 0xc1, 0xfc, + 0x80, 0x1b, 0x5e, 0xf0, 0x0c, 0x7f, 0x0c, 0x6b, 0x5c, 0xbe, 0x15, 0xb0, 0x3d, 0xcb, 0xd3, 0x2f, + 0x4c, 0xee, 0xaf, 0x71, 0x9b, 0x23, 0x47, 0x3c, 0xda, 0xec, 0x89, 0x67, 0x33, 0x3b, 0x82, 0x24, + 0x35, 0x4a, 0x92, 0x1d, 0x31, 0xe4, 0xfb, 0x9f, 0x6d, 0x29, 0x3e, 0x4d, 0xc0, 0xca, 0x44, 0xb2, + 0xe5, 0x4e, 0x4c, 0x08, 0x9d, 0x58, 0x3c, 0x74, 0x62, 0x89, 0x85, 0x27, 0xc6, 0xd7, 0x3a, 0x39, + 0x7b, 0xad, 0x53, 0x3f, 0xe0, 0x5a, 0xa7, 0x9f, 0x6d, 0xad, 0xff, 0xa1, 0xab, 0xf0, 0x0b, 0x01, + 0xca, 0xd1, 0x19, 0x6a, 0xe8, 0x72, 0x5c, 0x83, 0x15, 0x77, 0x28, 0xae, 0x7a, 0x76, 0x30, 0x8a, + 0xee, 0x0f, 0x5c, 0x7f, 0x64, 0x8c, 0x7b, 0x1e, 0x8a, 0x63, 0xf9, 0x33, 0x73, 0xe5, 0xc2, 0x89, + 0xbf, 0x7f, 0xe9, 0xc7, 0x09, 0x37, 0xf0, 0x04, 0x92, 0xdc, 0x90, 0xdd, 0xfa, 0x0e, 0xac, 0xb6, + 0x70, 0x53, 0x6b, 0x3d, 0xeb, 0x66, 0x5d, 0xe1, 0xd2, 0xff, 0xde, 0xab, 0x93, 0x5e, 0xf2, 0x89, + 0x00, 0x17, 0xa6, 0x5c, 0x09, 0x50, 0x19, 0x32, 0x8e, 0x08, 0x77, 0x15, 0xb7, 0x8d, 0xee, 0x41, + 0xb1, 0xa3, 0x5b, 0x96, 0x66, 0xe0, 0x16, 0xcf, 0xda, 0xe3, 0x93, 0x89, 0x1b, 0xcb, 0xea, 0xb7, + 0xee, 0x71, 0x46, 0x9a, 0x93, 0xcb, 0x85, 0x8e, 0xbf, 0x29, 0x9d, 0x87, 0x73, 0x11, 0x97, 0x06, + 0xe9, 0x96, 0xe7, 0xc4, 0x93, 0xb9, 0x3d, 0xba, 0x00, 0x59, 0x7e, 0x6b, 0x70, 0xd3, 0xa5, 0x0c, + 0x23, 0xd4, 0x47, 0xd2, 0x6f, 0xf3, 0x90, 0x91, 0xb1, 0x65, 0x90, 0x54, 0x13, 0xed, 0x42, 0x16, + 0x8f, 0x9a, 0xd8, 0xb0, 0x9d, 0xec, 0x3c, 0xfc, 0x86, 0xc8, 0xb8, 0xab, 0x0e, 0x67, 0x2d, 0x26, + 0x7b, 0x62, 0xe8, 0x06, 0x87, 0x80, 0xa2, 0xd1, 0x1c, 0x2e, 0xee, 0xc7, 0x80, 0x5e, 0x73, 0x30, + 0xa0, 0x44, 0x24, 0xbc, 0xc1, 0xa4, 0xc6, 0x40, 0xa0, 0x1b, 0x1c, 0x04, 0x4a, 0xce, 0xe8, 0x2c, + 0x80, 0x02, 0x55, 0x02, 0x28, 0x50, 0x7a, 0xc6, 0x34, 0x23, 0x60, 0xa0, 0xd7, 0x1c, 0x18, 0x68, + 0x69, 0xc6, 0x88, 0xc7, 0x70, 0xa0, 0xb7, 0x7c, 0x38, 0x50, 0x96, 0x8a, 0x6e, 0x46, 0x8a, 0x86, + 0x00, 0x41, 0xb7, 0x5c, 0x20, 0x28, 0x1f, 0x09, 0x22, 0x71, 0xe1, 0x71, 0x24, 0xe8, 0x70, 0x02, + 0x09, 0x62, 0xc8, 0xcd, 0x0b, 0x91, 0x2a, 0x66, 0x40, 0x41, 0x87, 0x13, 0x50, 0x50, 0x71, 0x86, + 0xc2, 0x19, 0x58, 0xd0, 0xff, 0x85, 0x63, 0x41, 0xd1, 0x68, 0x0d, 0x1f, 0xe6, 0x7c, 0x60, 0x90, + 0x12, 0x01, 0x06, 0x89, 0x91, 0x97, 0x68, 0xa6, 0x7e, 0x6e, 0x34, 0xe8, 0x61, 0x08, 0x1a, 0xb4, + 0x12, 0x79, 0xfd, 0x67, 0xca, 0xe7, 0x80, 0x83, 0x1e, 0x86, 0xc0, 0x41, 0x68, 0xa6, 0xda, 0x99, + 0x78, 0xd0, 0xdd, 0x20, 0x1e, 0xb4, 0x1a, 0x91, 0x50, 0x7b, 0xbb, 0x3d, 0x02, 0x10, 0x6a, 0x44, + 0x01, 0x42, 0x6b, 0x91, 0xd8, 0x0a, 0xd3, 0xb8, 0x00, 0x22, 0x74, 0x38, 0x81, 0x08, 0x9d, 0x99, + 0xe1, 0x69, 0x33, 0x20, 0xa1, 0x76, 0x34, 0x24, 0xc4, 0x00, 0x9b, 0x57, 0xa2, 0xf7, 0xd5, 0x22, + 0x98, 0xd0, 0xe3, 0x50, 0x4c, 0xe8, 0x5c, 0x24, 0xb8, 0xc9, 0x07, 0x3f, 0x0f, 0x28, 0xd4, 0x88, + 0x02, 0x85, 0x4a, 0xb3, 0xec, 0xfe, 0x4c, 0xa8, 0x50, 0x4a, 0x4c, 0xef, 0x27, 0x33, 0x19, 0x31, + 0xcb, 0xf0, 0xa0, 0xfd, 0x64, 0x26, 0x27, 0xe6, 0xa5, 0x97, 0x48, 0x0e, 0x3b, 0x16, 0x0e, 0xc8, + 0x6d, 0x11, 0x9b, 0xa6, 0x6e, 0x72, 0x7c, 0x87, 0x35, 0xa4, 0x2b, 0x90, 0xf7, 0x1f, 0xfd, 0x53, + 0x10, 0x24, 0x7a, 0x2b, 0xf7, 0x1d, 0xf7, 0xd2, 0x6f, 0x04, 0x4f, 0x96, 0x62, 0x48, 0x7e, 0x84, + 0x21, 0xcb, 0x11, 0x06, 0x1f, 0xae, 0x14, 0x0f, 0xe2, 0x4a, 0x1b, 0x90, 0x23, 0xb7, 0xed, 0x31, + 0xc8, 0x48, 0x35, 0x5c, 0xc8, 0xe8, 0x2a, 0xac, 0xd0, 0x94, 0x89, 0xa1, 0x4f, 0x3c, 0x31, 0x49, + 0xd2, 0xc4, 0x64, 0x99, 0xfc, 0xc0, 0x9c, 0x88, 0x65, 0x28, 0xaf, 0xc0, 0xaa, 0x8f, 0xd7, 0xbd, + 0xc5, 0x33, 0xfc, 0x44, 0x74, 0xb9, 0x77, 0xf8, 0x75, 0xfe, 0xf7, 0x82, 0x67, 0x21, 0x0f, 0x6b, + 0x0a, 0x83, 0x85, 0x84, 0x1f, 0x08, 0x16, 0x8a, 0x3f, 0x33, 0x2c, 0xe4, 0x47, 0x25, 0x12, 0x41, + 0x54, 0xe2, 0x6f, 0x82, 0xb7, 0x26, 0x2e, 0xc8, 0xd3, 0xd4, 0x5b, 0x98, 0xe3, 0x04, 0xf4, 0x9b, + 0x24, 0xa5, 0x3d, 0xbd, 0xc3, 0xd1, 0x00, 0xf2, 0x49, 0xb8, 0xdc, 0xf8, 0x9c, 0xe5, 0xe1, 0xd7, + 0x85, 0x18, 0x58, 0xea, 0xc7, 0x21, 0x06, 0x11, 0x12, 0x4f, 0x30, 0x2b, 0xaa, 0xe4, 0x65, 0xf2, + 0x49, 0xf8, 0xa8, 0xf3, 0xf1, 0x14, 0x8e, 0x35, 0xd0, 0x1b, 0x90, 0xa5, 0x15, 0x33, 0x45, 0x37, + 0x2c, 0x5e, 0x48, 0x09, 0x24, 0xb7, 0xac, 0x6c, 0xb6, 0x75, 0x44, 0x78, 0x0e, 0x0d, 0x8b, 0x26, + 0x62, 0xf4, 0xcb, 0x97, 0x73, 0x66, 0x03, 0x39, 0xe7, 0x45, 0xc8, 0x92, 0xd1, 0x5b, 0x86, 0xda, + 0xc4, 0x25, 0xa0, 0x03, 0xf5, 0x08, 0xd2, 0xaf, 0xe3, 0xb0, 0x3c, 0x16, 0x8f, 0x43, 0xe7, 0xee, + 0xb8, 0x64, 0xdc, 0x07, 0x7a, 0xcd, 0x67, 0x8f, 0x75, 0x80, 0x8e, 0x6a, 0x29, 0x1f, 0xa9, 0x03, + 0x1b, 0xb7, 0xb8, 0x51, 0x7c, 0x14, 0x92, 0x5c, 0x92, 0xd6, 0xd0, 0xc2, 0x2d, 0x8e, 0xbf, 0xb9, + 0x6d, 0x54, 0x83, 0x34, 0x3e, 0xc1, 0x03, 0xdb, 0x2a, 0x2d, 0xd1, 0x65, 0x3f, 0x3b, 0x09, 0x88, + 0x90, 0x9f, 0x77, 0x4b, 0x64, 0xb1, 0xbf, 0xfb, 0x66, 0x43, 0x64, 0xdc, 0x2f, 0xeb, 0x7d, 0xcd, + 0xc6, 0x7d, 0xc3, 0x3e, 0x95, 0xb9, 0x7c, 0xd0, 0x0a, 0x99, 0x31, 0x2b, 0x50, 0x24, 0x38, 0xef, + 0x00, 0x3c, 0xc4, 0xa6, 0x9a, 0x6e, 0x6a, 0xf6, 0xa9, 0x5c, 0xe8, 0xe3, 0xbe, 0xa1, 0xeb, 0x3d, + 0x85, 0xed, 0xf1, 0x1d, 0x28, 0x06, 0xd3, 0x0f, 0xf4, 0x1c, 0x14, 0x4c, 0x6c, 0xab, 0xda, 0x40, + 0x09, 0x5c, 0x83, 0xf2, 0x8c, 0xc8, 0xf6, 0xd4, 0x7e, 0x32, 0x23, 0x88, 0xf1, 0xfd, 0x64, 0x26, + 0x2e, 0x26, 0xa4, 0x23, 0x38, 0x13, 0x9a, 0x7e, 0xa0, 0xd7, 0x21, 0xeb, 0x65, 0x2e, 0x02, 0x9d, + 0xed, 0x14, 0xac, 0xcd, 0xe3, 0x95, 0x7e, 0x27, 0x78, 0x2a, 0x83, 0xe8, 0x5d, 0x15, 0xd2, 0xec, + 0xdc, 0xa7, 0x2b, 0x59, 0x9c, 0x72, 0xe8, 0x07, 0xe4, 0xb6, 0xd8, 0xf1, 0x2e, 0x73, 0x61, 0xe9, + 0x3d, 0x48, 0x33, 0x0a, 0xca, 0xc1, 0xd2, 0xc3, 0x83, 0xfb, 0x07, 0x87, 0xef, 0x1e, 0x88, 0x31, + 0x04, 0x90, 0xde, 0xa9, 0x54, 0xaa, 0x47, 0x75, 0x51, 0x40, 0x59, 0x48, 0xed, 0xec, 0x1e, 0xca, + 0x75, 0x31, 0x4e, 0xc8, 0x72, 0x75, 0xbf, 0x5a, 0xa9, 0x8b, 0x09, 0xb4, 0x02, 0x05, 0xf6, 0xad, + 0xdc, 0x3d, 0x94, 0xdf, 0xde, 0xa9, 0x8b, 0x49, 0x1f, 0xe9, 0xb8, 0x7a, 0x70, 0xa7, 0x2a, 0x8b, + 0x29, 0xe9, 0x3f, 0xe0, 0x7c, 0x64, 0xaa, 0xe3, 0x41, 0x73, 0x82, 0x0f, 0x9a, 0x93, 0xbe, 0x88, + 0x93, 0x1b, 0x41, 0x54, 0xfe, 0x82, 0xf6, 0xc7, 0x26, 0x7e, 0x7d, 0x81, 0xe4, 0x67, 0x6c, 0xf6, + 0xe4, 0x26, 0x6b, 0x62, 0x16, 0xe4, 0x68, 0xdf, 0xec, 0x04, 0x2a, 0xc8, 0x05, 0x4e, 0xa5, 0x42, + 0x16, 0x63, 0xfb, 0x00, 0x37, 0x6d, 0x85, 0x39, 0x91, 0x45, 0xaf, 0x93, 0x59, 0xc2, 0x46, 0xa8, + 0xc7, 0x8c, 0x28, 0xbd, 0xbf, 0x90, 0x2d, 0xb3, 0x90, 0x92, 0xab, 0x75, 0xf9, 0xb1, 0x98, 0x40, + 0x08, 0x8a, 0xf4, 0x53, 0x39, 0x3e, 0xd8, 0x39, 0x3a, 0xae, 0x1d, 0x12, 0x5b, 0xae, 0xc2, 0xb2, + 0x63, 0x4b, 0x87, 0x98, 0x92, 0xae, 0x91, 0x6b, 0x54, 0x68, 0xf2, 0x35, 0x79, 0xa9, 0x96, 0x7e, + 0x29, 0xf8, 0xb9, 0x83, 0x09, 0xd4, 0x21, 0xa4, 0x2d, 0x5b, 0xb5, 0x87, 0x16, 0x37, 0xe2, 0xeb, + 0xf3, 0x66, 0x63, 0x5b, 0xce, 0xc7, 0x31, 0x15, 0x97, 0xb9, 0x1a, 0xe9, 0x26, 0x14, 0x83, 0xbf, + 0x44, 0xdb, 0xc0, 0x73, 0xa2, 0xb8, 0x74, 0x1b, 0xd0, 0x64, 0x92, 0x16, 0x02, 0x30, 0x08, 0x61, + 0x00, 0xc3, 0xaf, 0xe8, 0xcd, 0x36, 0x32, 0x21, 0x43, 0xef, 0x8c, 0x4d, 0xf2, 0xd6, 0x22, 0xe9, + 0xdc, 0x16, 0xa3, 0x8d, 0x4d, 0xf3, 0x06, 0xe4, 0xfd, 0xf4, 0xf9, 0x26, 0xf9, 0x5d, 0xdc, 0xdb, + 0xc4, 0x41, 0x24, 0xc4, 0x3b, 0x02, 0x85, 0xef, 0x79, 0x04, 0xbe, 0x09, 0x60, 0x8f, 0x78, 0x26, + 0xe8, 0xc4, 0xd1, 0x4b, 0x21, 0x08, 0x33, 0x6e, 0xd6, 0x47, 0x7c, 0x13, 0x64, 0x6d, 0xfe, 0x65, + 0xa1, 0x63, 0x3f, 0x2c, 0x34, 0xa4, 0x31, 0xd6, 0xe2, 0x90, 0xc9, 0xbc, 0xc1, 0xd8, 0x83, 0x8f, + 0x18, 0xd9, 0x42, 0x8f, 0xe1, 0xdc, 0x58, 0xa2, 0xe0, 0xaa, 0x4e, 0xce, 0x9b, 0x2f, 0x9c, 0x09, + 0xe6, 0x0b, 0x8e, 0x6a, 0x7f, 0xb4, 0x4f, 0x05, 0xa3, 0xfd, 0x5b, 0x70, 0x71, 0x5a, 0xb6, 0x8b, + 0x2e, 0x01, 0xe0, 0x01, 0x09, 0x0e, 0x2d, 0x0f, 0x51, 0xc8, 0x72, 0x4a, 0x7d, 0x24, 0xdd, 0x83, + 0x52, 0x54, 0x26, 0x8b, 0xae, 0x41, 0x92, 0x5e, 0x37, 0x58, 0xb6, 0x73, 0x2e, 0x04, 0x03, 0x21, + 0x7c, 0x32, 0x65, 0x92, 0x7e, 0xe6, 0x77, 0xce, 0x10, 0x60, 0xe3, 0xfe, 0x98, 0x73, 0xde, 0x58, + 0x24, 0xe7, 0xdd, 0x1a, 0x73, 0xcb, 0xcb, 0x90, 0xe6, 0x0e, 0x09, 0x90, 0x56, 0x1b, 0x16, 0x1e, + 0xd8, 0x62, 0x8c, 0x38, 0xa7, 0x61, 0x62, 0xda, 0x10, 0xa4, 0xc7, 0x00, 0x1e, 0x6c, 0x46, 0x4e, + 0x5e, 0x53, 0x1f, 0x0e, 0x5a, 0xb4, 0xf3, 0x94, 0xcc, 0x1a, 0xe8, 0x26, 0xa4, 0xfc, 0x28, 0xcf, + 0x64, 0x88, 0x22, 0x9d, 0xfb, 0x60, 0x37, 0xc6, 0x2d, 0x69, 0x80, 0x26, 0x4b, 0x17, 0x11, 0x5d, + 0xbc, 0x15, 0xec, 0xe2, 0x72, 0x64, 0x11, 0x24, 0xbc, 0xab, 0x8f, 0x21, 0x45, 0x77, 0x04, 0x49, + 0x46, 0x68, 0xbd, 0x8c, 0x67, 0xd1, 0xe4, 0x1b, 0xfd, 0x3f, 0x80, 0x6a, 0xdb, 0xa6, 0xd6, 0x18, + 0x7a, 0x1d, 0x6c, 0x84, 0xef, 0xa8, 0x1d, 0x87, 0x6f, 0xf7, 0x22, 0xdf, 0x5a, 0x6b, 0x9e, 0xa8, + 0x6f, 0x7b, 0xf9, 0x14, 0x4a, 0x07, 0x50, 0x0c, 0xca, 0x3a, 0x79, 0x1f, 0x1b, 0x43, 0x30, 0xef, + 0x63, 0x69, 0x3c, 0xcf, 0xfb, 0xdc, 0xac, 0x31, 0xc1, 0x8a, 0x82, 0xb4, 0x21, 0xfd, 0x28, 0x0e, + 0x79, 0xff, 0x86, 0xfc, 0xd7, 0x4b, 0xcd, 0xa4, 0x9f, 0x08, 0x90, 0x71, 0xa7, 0x1f, 0xac, 0x10, + 0x06, 0x4a, 0xaa, 0xcc, 0x7a, 0x71, 0x7f, 0x59, 0x8f, 0x15, 0x50, 0x13, 0x6e, 0x01, 0xf5, 0xb6, + 0x9b, 0x16, 0x44, 0xe1, 0x69, 0x7e, 0x5b, 0x73, 0xaf, 0x72, 0xb2, 0xa0, 0xdb, 0x90, 0x75, 0x4f, + 0x35, 0x72, 0x19, 0x73, 0x20, 0x55, 0x81, 0x9f, 0x2d, 0x1c, 0x10, 0x5f, 0x83, 0x94, 0xa1, 0x7f, + 0xc4, 0x6b, 0x86, 0x09, 0x99, 0x35, 0xa4, 0x16, 0x2c, 0x8f, 0x1d, 0x89, 0xe8, 0x36, 0x2c, 0x19, + 0xc3, 0x86, 0xe2, 0x38, 0xc7, 0x18, 0xf0, 0xec, 0xa4, 0xf9, 0xc3, 0x46, 0x4f, 0x6b, 0xde, 0xc7, + 0xa7, 0xce, 0x60, 0x8c, 0x61, 0xe3, 0x3e, 0xf3, 0x21, 0xd6, 0x4b, 0xdc, 0xdf, 0xcb, 0xcf, 0x05, + 0xc8, 0x38, 0x7b, 0x02, 0xfd, 0x17, 0x64, 0xdd, 0xe3, 0xd6, 0x2d, 0xfa, 0x47, 0x9e, 0xd3, 0x5c, + 0xbf, 0x27, 0x82, 0x76, 0x9c, 0xd7, 0x0a, 0x5a, 0x4b, 0x69, 0xf7, 0x54, 0xe6, 0x4b, 0xc5, 0xa0, + 0xcd, 0xd8, 0x81, 0x4c, 0xe3, 0xd4, 0xde, 0x9d, 0xbb, 0x3d, 0xb5, 0x23, 0xe7, 0xa8, 0xcc, 0x5e, + 0x8b, 0x34, 0x78, 0xc6, 0xfb, 0x57, 0x01, 0xc4, 0xf1, 0x1d, 0xfb, 0xbd, 0x47, 0x37, 0x19, 0xfe, + 0x13, 0x21, 0xe1, 0x1f, 0x6d, 0xc3, 0xaa, 0xcb, 0xa1, 0x58, 0x5a, 0x67, 0xa0, 0xda, 0x43, 0x13, + 0x73, 0xa8, 0x1e, 0xb9, 0x3f, 0x1d, 0x3b, 0xbf, 0x4c, 0xce, 0x3a, 0xf5, 0x8c, 0xb3, 0xfe, 0x34, + 0x0e, 0x39, 0x5f, 0xe1, 0x00, 0xfd, 0xa7, 0xef, 0x30, 0x2a, 0x86, 0x44, 0x4c, 0x1f, 0xaf, 0x57, + 0xc0, 0x0f, 0x9a, 0x29, 0xbe, 0xb8, 0x99, 0xa2, 0xca, 0x33, 0x4e, 0x1d, 0x22, 0xb9, 0x70, 0x1d, + 0xe2, 0x65, 0x40, 0xb6, 0x6e, 0xab, 0x3d, 0xe5, 0x44, 0xb7, 0xb5, 0x41, 0x47, 0x61, 0x6e, 0xc8, + 0x8e, 0x0e, 0x91, 0xfe, 0xf2, 0x88, 0xfe, 0x70, 0x44, 0x3d, 0xf2, 0x13, 0x01, 0x32, 0xee, 0x75, + 0x64, 0xd1, 0xf2, 0xfe, 0x59, 0x48, 0xf3, 0x8c, 0x9b, 0xd5, 0xf7, 0x79, 0x2b, 0xb4, 0xe0, 0x52, + 0x86, 0x4c, 0x1f, 0xdb, 0x2a, 0x3d, 0x07, 0x59, 0xb4, 0x77, 0xdb, 0x57, 0x6f, 0x41, 0xce, 0xf7, + 0x34, 0x82, 0x1c, 0x8d, 0x07, 0xd5, 0x77, 0xc5, 0x58, 0x79, 0xe9, 0xb3, 0x2f, 0x37, 0x13, 0x07, + 0xf8, 0x23, 0xb2, 0x9b, 0xe5, 0x6a, 0xa5, 0x56, 0xad, 0xdc, 0x17, 0x85, 0x72, 0xee, 0xb3, 0x2f, + 0x37, 0x97, 0x64, 0x4c, 0x01, 0xe9, 0xab, 0xf7, 0x61, 0x79, 0x6c, 0x61, 0x82, 0xe9, 0x1c, 0x82, + 0xe2, 0x9d, 0x87, 0x47, 0x0f, 0xf6, 0x2a, 0x3b, 0xf5, 0xaa, 0xf2, 0xe8, 0xb0, 0x5e, 0x15, 0x05, + 0x74, 0x0e, 0x56, 0x1f, 0xec, 0xdd, 0xab, 0xd5, 0x95, 0xca, 0x83, 0xbd, 0xea, 0x41, 0x5d, 0xd9, + 0xa9, 0xd7, 0x77, 0x2a, 0xf7, 0xc5, 0xf8, 0xf5, 0xbf, 0x14, 0x20, 0xb9, 0xb3, 0x5b, 0xd9, 0x43, + 0x15, 0x48, 0x52, 0x88, 0x68, 0xea, 0xfb, 0xd1, 0xf2, 0xf4, 0xd2, 0x02, 0xba, 0x0b, 0x29, 0x8a, + 0x1e, 0xa1, 0xe9, 0x0f, 0x4a, 0xcb, 0x33, 0x6a, 0x0d, 0x64, 0x30, 0x74, 0x47, 0x4e, 0x7d, 0x61, + 0x5a, 0x9e, 0x5e, 0x7a, 0x40, 0x0f, 0x60, 0xc9, 0x01, 0x0f, 0x66, 0x3d, 0xfb, 0x2c, 0xcf, 0xac, + 0x07, 0x90, 0xa9, 0x31, 0x10, 0x66, 0xfa, 0xe3, 0xd3, 0xf2, 0x8c, 0xa2, 0x04, 0xda, 0x83, 0x34, + 0xbf, 0xa6, 0xcf, 0x78, 0x4f, 0x5a, 0x9e, 0x55, 0x66, 0x40, 0x32, 0x64, 0x3d, 0x78, 0x6b, 0xf6, + 0x93, 0xda, 0xf2, 0x1c, 0xf5, 0x16, 0xf4, 0x1e, 0x14, 0x82, 0x10, 0xc0, 0x7c, 0x6f, 0x56, 0xcb, + 0x73, 0x16, 0x34, 0x88, 0xfe, 0x20, 0x1e, 0x30, 0xdf, 0x1b, 0xd6, 0xf2, 0x9c, 0xf5, 0x0d, 0xf4, + 0x01, 0xac, 0x4c, 0xde, 0xd7, 0xe7, 0x7f, 0xd2, 0x5a, 0x5e, 0xa0, 0xe2, 0x81, 0xfa, 0x80, 0x42, + 0xee, 0xf9, 0x0b, 0xbc, 0x70, 0x2d, 0x2f, 0x52, 0x00, 0x41, 0x2d, 0x58, 0x1e, 0xbf, 0x3c, 0xcf, + 0xfb, 0xe2, 0xb5, 0x3c, 0x77, 0x31, 0x84, 0xf5, 0x12, 0xbc, 0x74, 0xcf, 0xfb, 0x02, 0xb6, 0x3c, + 0x77, 0x6d, 0x04, 0x3d, 0x04, 0xf0, 0xdd, 0x9b, 0xe7, 0x78, 0x11, 0x5b, 0x9e, 0xa7, 0x4a, 0x82, + 0x0c, 0x58, 0x0d, 0xbb, 0x50, 0x2f, 0xf2, 0x40, 0xb6, 0xbc, 0x50, 0xf1, 0x84, 0xf8, 0x73, 0xf0, + 0x6a, 0x3c, 0xdf, 0x83, 0xd9, 0xf2, 0x9c, 0x55, 0x14, 0x64, 0xc1, 0x5a, 0xe8, 0x75, 0x70, 0xa1, + 0xe7, 0xb3, 0xe5, 0xc5, 0x2a, 0x2b, 0xa8, 0x03, 0xe2, 0xc4, 0x25, 0x72, 0xee, 0xd7, 0xb4, 0xe5, + 0xf9, 0x6b, 0x2c, 0x74, 0xbd, 0x42, 0xee, 0x98, 0x8b, 0x3c, 0xae, 0x2d, 0x2f, 0x54, 0x74, 0xd9, + 0xdd, 0xf9, 0xea, 0xdb, 0x75, 0xe1, 0xeb, 0x6f, 0xd7, 0x85, 0x3f, 0x7f, 0xbb, 0x2e, 0x7c, 0xfe, + 0x74, 0x3d, 0xf6, 0xf5, 0xd3, 0xf5, 0xd8, 0x1f, 0x9f, 0xae, 0xc7, 0xfe, 0xe7, 0xc5, 0x8e, 0x66, + 0x77, 0x87, 0x8d, 0xad, 0xa6, 0xde, 0xdf, 0x6e, 0xea, 0x7d, 0x6c, 0x37, 0xda, 0xb6, 0xf7, 0xe1, + 0xfd, 0xcd, 0xa4, 0x91, 0xa6, 0x19, 0xc9, 0x8d, 0xbf, 0x07, 0x00, 0x00, 0xff, 0xff, 0x50, 0x14, + 0x49, 0x01, 0x86, 0x32, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -6296,9 +6305,16 @@ func (m *RequestCreateOracleResultTx) MarshalToSizedBuffer(dAtA []byte) (int, er i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 } } + if len(m.Proposer) > 0 { + i -= len(m.Proposer) + copy(dAtA[i:], m.Proposer) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Proposer))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } @@ -8861,6 +8877,10 @@ func (m *RequestCreateOracleResultTx) Size() (n int) { } var l int _ = l + l = len(m.Proposer) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } if len(m.GossipedVotes) > 0 { for _, e := range m.GossipedVotes { l = e.Size() @@ -13124,6 +13144,40 @@ func (m *RequestCreateOracleResultTx) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Proposer", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Proposer = append(m.Proposer[:0], dAtA[iNdEx:postIndex]...) + if m.Proposer == nil { + m.Proposer = []byte{} + } + iNdEx = postIndex + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field GossipedVotes", wireType) } diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto index 618124bdacf..0ce0bd14ef4 100644 --- a/proto/tendermint/abci/types.proto +++ b/proto/tendermint/abci/types.proto @@ -201,7 +201,8 @@ message RequestFinalizeBlock { } message RequestCreateOracleResultTx { - repeated tendermint.oracle.GossipedVotes gossiped_votes = 1; + bytes proposer = 1; + repeated tendermint.oracle.GossipedVotes gossiped_votes = 2; } message RequestFetchOracleVotes {} diff --git a/state/execution.go b/state/execution.go index 77f3cdc21ef..0f542b6501b 100644 --- a/state/execution.go +++ b/state/execution.go @@ -142,6 +142,7 @@ func (blockExec *BlockExecutor) CreateProposalBlock( } resp, err := blockExec.proxyApp.CreateOracleResultTx(ctx, &abci.RequestCreateOracleResultTx{ + Proposer: proposerAddr, GossipedVotes: votes, }) if err != nil { From 7e1eb94b79f3d2d39bc6bdcc7d5bcca5d62d58ba Mon Sep 17 00:00:00 2001 From: yan-soon Date: Sat, 11 May 2024 17:20:44 +0800 Subject: [PATCH 127/150] add hard cap for maxVoteAge in the event the blocks dont move --- oracle/service/runner/runner.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 877e679bc7e..b2462df2fcd 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -126,12 +126,17 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { oracleInfo.BlockTimestamps = oracleInfo.BlockTimestamps[1:] } + latestAllowableTimestamp := time.Now().Unix() - 30 + if oracleInfo.BlockTimestamps[0] > latestAllowableTimestamp { + latestAllowableTimestamp = oracleInfo.BlockTimestamps[0] + } + oracleInfo.UnsignedVoteBuffer.UpdateMtx.Lock() - // prune votes that are older than the maxGossipVoteAge (in terms of block height) + // prune votes that are older than the min(maxGossipVoteAge (in terms of block height), 30s) newVotes := []*oracleproto.Vote{} unsignedVoteBuffer := oracleInfo.UnsignedVoteBuffer.Buffer for _, vote := range unsignedVoteBuffer { - if vote.Timestamp >= oracleInfo.BlockTimestamps[0] { + if vote.Timestamp >= latestAllowableTimestamp { newVotes = append(newVotes, vote) } } @@ -143,7 +148,7 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { // prune gossip votes that have not been updated in the last x amt of blocks, where x is the maxGossipVoteAge for valAddr, gossipVote := range gossipBuffer { - if gossipVote.SignedTimestamp < oracleInfo.BlockTimestamps[0] { + if gossipVote.SignedTimestamp < latestAllowableTimestamp { delete(gossipBuffer, valAddr) } } From 0ea52329ab70a8bd6f554770e405b58b0ef2dfb4 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 13 May 2024 00:48:07 +0800 Subject: [PATCH 128/150] remove val index from gossipedVotes --- oracle/reactor.go | 10 +- oracle/service/runner/runner.go | 7 -- proto/tendermint/oracle/types.pb.go | 138 +++++++--------------------- proto/tendermint/oracle/types.proto | 12 +-- types/oracle.go | 1 - 5 files changed, 44 insertions(+), 124 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index ebbbb4be43a..5e9f1b36895 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -1,6 +1,7 @@ package oracle import ( + "encoding/hex" "fmt" "math" "time" @@ -17,6 +18,7 @@ import ( "github.com/cometbft/cometbft/p2p" oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" "github.com/cometbft/cometbft/types" + "github.com/sirupsen/logrus" ) const ( @@ -124,9 +126,9 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { switch msg := e.Message.(type) { case *oracleproto.GossipedVotes: // verify sig of incoming gossip vote, throw if verification fails - _, val := oracleR.ConsensusState.Validators.GetByIndex(msg.ValidatorIndex) + _, val := oracleR.ConsensusState.Validators.GetByAddress(msg.Validator) if val == nil { - oracleR.Logger.Error("validator with index: %v not found in validator set, skipping gossip", msg.ValidatorIndex) + logrus.Warnf("validator: %v not found in validator set, skipping gossip", hex.EncodeToString(msg.Validator)) oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("validator not found in validator set: %T", e.Message)) return } @@ -138,7 +140,7 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { } if success := pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature); !success { - oracleR.Logger.Error("failed signature verification for validator with index: %v", msg.ValidatorIndex) + logrus.Errorf("failed signature verification for validator: %v", val.Address) oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("oracle failed signature verification: %T", e.Message)) return } @@ -164,7 +166,7 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() } default: - oracleR.Logger.Error("unknown message type", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) + logrus.Warnf("unknown message type", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("oracle cannot handle message of type: %T", e.Message)) return } diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index b2462df2fcd..4b2528caaff 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -52,12 +52,6 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State } // batch sign the new votes, along with existing votes in gossipVoteBuffer, if any - validatorIndex, _ := consensusState.Validators.GetByAddress(oracleInfo.PubKey.Address()) - if validatorIndex == -1 { - log.Errorf("processSignVoteQueue: unable to find validator index") - return - } - // append new batch into unsignedVotesBuffer, need to mutex lock as it will clash with concurrent pruning oracleInfo.UnsignedVoteBuffer.UpdateMtx.Lock() oracleInfo.UnsignedVoteBuffer.Buffer = append(oracleInfo.UnsignedVoteBuffer.Buffer, votes...) @@ -73,7 +67,6 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State // batch sign the entire unsignedVoteBuffer and add to gossipBuffer newGossipVote := &oracleproto.GossipedVotes{ Validator: oracleInfo.PubKey.Address(), - ValidatorIndex: validatorIndex, SignedTimestamp: time.Now().Unix(), Votes: unsignedVotes, } diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index 43b0a7b7c49..9932768d2ab 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -92,10 +92,9 @@ func (m *Vote) GetData() string { type GossipedVotes struct { Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` - ValidatorIndex int32 `protobuf:"varint,2,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` - Votes []*Vote `protobuf:"bytes,3,rep,name=votes,proto3" json:"votes,omitempty"` - SignedTimestamp int64 `protobuf:"varint,4,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` - Signature []byte `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` + Votes []*Vote `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes,omitempty"` + SignedTimestamp int64 `protobuf:"varint,3,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` + Signature []byte `protobuf:"bytes,4,opt,name=signature,proto3" json:"signature,omitempty"` } func (m *GossipedVotes) Reset() { *m = GossipedVotes{} } @@ -138,13 +137,6 @@ func (m *GossipedVotes) GetValidator() []byte { return nil } -func (m *GossipedVotes) GetValidatorIndex() int32 { - if m != nil { - return m.ValidatorIndex - } - return 0 -} - func (m *GossipedVotes) GetVotes() []*Vote { if m != nil { return m.Votes @@ -168,9 +160,8 @@ func (m *GossipedVotes) GetSignature() []byte { type CanonicalGossipedVotes struct { Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` - ValidatorIndex int32 `protobuf:"varint,2,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` - Votes []*Vote `protobuf:"bytes,3,rep,name=votes,proto3" json:"votes,omitempty"` - SignedTimestamp int64 `protobuf:"varint,4,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` + Votes []*Vote `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes,omitempty"` + SignedTimestamp int64 `protobuf:"varint,3,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` } func (m *CanonicalGossipedVotes) Reset() { *m = CanonicalGossipedVotes{} } @@ -213,13 +204,6 @@ func (m *CanonicalGossipedVotes) GetValidator() []byte { return nil } -func (m *CanonicalGossipedVotes) GetValidatorIndex() int32 { - if m != nil { - return m.ValidatorIndex - } - return 0 -} - func (m *CanonicalGossipedVotes) GetVotes() []*Vote { if m != nil { return m.Votes @@ -243,28 +227,26 @@ func init() { func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 324 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x92, 0xbf, 0x4e, 0xf3, 0x30, - 0x14, 0xc5, 0xeb, 0x2f, 0xe9, 0x27, 0x62, 0xfe, 0x14, 0x3c, 0x40, 0x24, 0x8a, 0x55, 0x75, 0xa1, - 0x0c, 0x24, 0x12, 0xf0, 0x04, 0x30, 0xa0, 0x2e, 0x0c, 0x11, 0x62, 0x60, 0xa9, 0xdc, 0xd8, 0x14, - 0x4b, 0x8d, 0x1d, 0xc5, 0xb7, 0x15, 0xbc, 0x05, 0xaf, 0xc3, 0x1b, 0x30, 0xa1, 0x8e, 0x8c, 0xa8, - 0x7d, 0x11, 0x64, 0x5b, 0x4a, 0x90, 0xf2, 0x04, 0x6c, 0xd7, 0xbf, 0x73, 0xaf, 0xcf, 0x3d, 0xd2, - 0xc5, 0x27, 0x20, 0x14, 0x17, 0x55, 0x21, 0x15, 0xa4, 0xba, 0x62, 0xf9, 0x5c, 0xa4, 0xf0, 0x5a, - 0x0a, 0x93, 0x94, 0x95, 0x06, 0x4d, 0x0e, 0x1a, 0x39, 0xf1, 0xf2, 0xd0, 0xe0, 0xf0, 0x41, 0x83, - 0x20, 0x7d, 0x1c, 0x2d, 0xd9, 0x5c, 0x72, 0x06, 0xba, 0x8a, 0xd1, 0x00, 0x8d, 0xa2, 0xac, 0x01, - 0xe4, 0x18, 0x47, 0xbe, 0x7f, 0x22, 0x79, 0xfc, 0xcf, 0xa9, 0x5b, 0x1e, 0x8c, 0xb9, 0x1d, 0x05, - 0x59, 0x08, 0x03, 0xac, 0x28, 0xe3, 0x60, 0x80, 0x46, 0x41, 0xd6, 0x00, 0x42, 0x70, 0xc8, 0x19, - 0xb0, 0x38, 0x74, 0x53, 0xae, 0x1e, 0x7e, 0x22, 0xbc, 0x7b, 0xab, 0x8d, 0x91, 0xa5, 0xe0, 0xd6, - 0xdd, 0xb4, 0xed, 0x77, 0x7e, 0xdb, 0x9f, 0xe2, 0x5e, 0xfd, 0x98, 0x48, 0xc5, 0xc5, 0x8b, 0x5b, - 0xa2, 0x9b, 0xed, 0xd5, 0x78, 0x6c, 0x29, 0x39, 0xc7, 0xdd, 0xa5, 0xfd, 0x2f, 0x0e, 0x06, 0xc1, - 0x68, 0xfb, 0xe2, 0x28, 0x69, 0x05, 0x4e, 0xac, 0x5f, 0xe6, 0xbb, 0xc8, 0x19, 0xde, 0x37, 0x72, - 0xa6, 0x04, 0x9f, 0x34, 0x01, 0x42, 0x17, 0xa0, 0xe7, 0xf9, 0x7d, 0x1d, 0xa3, 0x8f, 0x23, 0x8b, - 0x18, 0x2c, 0x2a, 0x11, 0x77, 0xfd, 0x82, 0x35, 0x18, 0xbe, 0x23, 0x7c, 0x78, 0xc3, 0x94, 0x56, - 0x32, 0x67, 0xf3, 0xbf, 0x95, 0xec, 0xfa, 0xee, 0x63, 0x4d, 0xd1, 0x6a, 0x4d, 0xd1, 0xf7, 0x9a, - 0xa2, 0xb7, 0x0d, 0xed, 0xac, 0x36, 0xb4, 0xf3, 0xb5, 0xa1, 0x9d, 0xc7, 0xab, 0x99, 0x84, 0xe7, - 0xc5, 0x34, 0xc9, 0x75, 0x91, 0xe6, 0xba, 0x10, 0x30, 0x7d, 0x82, 0xa6, 0x70, 0x27, 0x95, 0xb6, - 0x0e, 0x6e, 0xfa, 0xdf, 0x09, 0x97, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xf1, 0xb8, 0xf7, 0x83, - 0x8c, 0x02, 0x00, 0x00, + // 300 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x92, 0x41, 0x4a, 0xc4, 0x30, + 0x14, 0x86, 0x9b, 0x69, 0x15, 0x1b, 0x47, 0xd4, 0x2c, 0xb4, 0xe0, 0x18, 0x4a, 0x57, 0x75, 0x61, + 0x0b, 0xea, 0x09, 0x74, 0x21, 0x6e, 0x5c, 0x14, 0x71, 0xe1, 0x66, 0x48, 0x9b, 0x38, 0x06, 0xda, + 0xa6, 0x34, 0x6f, 0x06, 0xbc, 0xc5, 0x5c, 0xc2, 0xbb, 0xb8, 0x9c, 0xa5, 0x4b, 0x69, 0x2f, 0x22, + 0x4d, 0xc1, 0x8a, 0xbd, 0xc0, 0xec, 0x1e, 0xdf, 0xff, 0xbf, 0xfc, 0x7f, 0xe0, 0xe1, 0x73, 0x10, + 0x25, 0x17, 0x75, 0x21, 0x4b, 0x88, 0x55, 0xcd, 0xb2, 0x5c, 0xc4, 0xf0, 0x5e, 0x09, 0x1d, 0x55, + 0xb5, 0x02, 0x45, 0x8e, 0x07, 0x39, 0xea, 0xe5, 0x40, 0x63, 0xe7, 0x59, 0x81, 0x20, 0x33, 0xec, + 0xae, 0x58, 0x2e, 0x39, 0x03, 0x55, 0x7b, 0xc8, 0x47, 0xa1, 0x9b, 0x0c, 0x80, 0x9c, 0x61, 0xb7, + 0xf7, 0xcf, 0x25, 0xf7, 0x26, 0x46, 0xdd, 0xeb, 0xc1, 0x03, 0xef, 0x56, 0x41, 0x16, 0x42, 0x03, + 0x2b, 0x2a, 0xcf, 0xf6, 0x51, 0x68, 0x27, 0x03, 0x20, 0x04, 0x3b, 0x9c, 0x01, 0xf3, 0x1c, 0xb3, + 0x65, 0xe6, 0xe0, 0x03, 0xe1, 0x83, 0x7b, 0xa5, 0xb5, 0xac, 0x04, 0xef, 0xd2, 0xf5, 0x38, 0x7e, + 0xfa, 0x37, 0xfe, 0x12, 0xef, 0xac, 0x3a, 0x9b, 0x37, 0xf1, 0xed, 0x70, 0xff, 0xea, 0x34, 0x1a, + 0xfd, 0x23, 0xea, 0x9e, 0x49, 0x7a, 0x17, 0xb9, 0xc0, 0x47, 0x5a, 0x2e, 0x4a, 0xc1, 0xe7, 0xff, + 0x7b, 0x1d, 0xf6, 0xfc, 0xe9, 0xb7, 0xdd, 0x0c, 0xbb, 0x1d, 0x62, 0xb0, 0xac, 0x85, 0xa9, 0x38, + 0x4d, 0x06, 0x10, 0xac, 0x11, 0x3e, 0xb9, 0x63, 0xa5, 0x2a, 0x65, 0xc6, 0xf2, 0xad, 0x28, 0x7c, + 0xfb, 0xf8, 0xd9, 0x50, 0xb4, 0x69, 0x28, 0xfa, 0x6e, 0x28, 0x5a, 0xb7, 0xd4, 0xda, 0xb4, 0xd4, + 0xfa, 0x6a, 0xa9, 0xf5, 0x72, 0xb3, 0x90, 0xf0, 0xb6, 0x4c, 0xa3, 0x4c, 0x15, 0x71, 0xa6, 0x0a, + 0x01, 0xe9, 0x2b, 0x0c, 0x83, 0x39, 0x80, 0x78, 0x74, 0x1e, 0xe9, 0xae, 0x11, 0xae, 0x7f, 0x02, + 0x00, 0x00, 0xff, 0xff, 0xc4, 0x33, 0x57, 0xc2, 0x3a, 0x02, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -341,12 +323,12 @@ func (m *GossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.Signature) i = encodeVarintTypes(dAtA, i, uint64(len(m.Signature))) i-- - dAtA[i] = 0x2a + dAtA[i] = 0x22 } if m.SignedTimestamp != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.SignedTimestamp)) i-- - dAtA[i] = 0x20 + dAtA[i] = 0x18 } if len(m.Votes) > 0 { for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { @@ -359,14 +341,9 @@ func (m *GossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a + dAtA[i] = 0x12 } } - if m.ValidatorIndex != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.ValidatorIndex)) - i-- - dAtA[i] = 0x10 - } if len(m.Validator) > 0 { i -= len(m.Validator) copy(dAtA[i:], m.Validator) @@ -400,7 +377,7 @@ func (m *CanonicalGossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) if m.SignedTimestamp != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.SignedTimestamp)) i-- - dAtA[i] = 0x20 + dAtA[i] = 0x18 } if len(m.Votes) > 0 { for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { @@ -413,14 +390,9 @@ func (m *CanonicalGossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a + dAtA[i] = 0x12 } } - if m.ValidatorIndex != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.ValidatorIndex)) - i-- - dAtA[i] = 0x10 - } if len(m.Validator) > 0 { i -= len(m.Validator) copy(dAtA[i:], m.Validator) @@ -476,9 +448,6 @@ func (m *GossipedVotes) Size() (n int) { if l > 0 { n += 1 + l + sovTypes(uint64(l)) } - if m.ValidatorIndex != 0 { - n += 1 + sovTypes(uint64(m.ValidatorIndex)) - } if len(m.Votes) > 0 { for _, e := range m.Votes { l = e.Size() @@ -505,9 +474,6 @@ func (m *CanonicalGossipedVotes) Size() (n int) { if l > 0 { n += 1 + l + sovTypes(uint64(l)) } - if m.ValidatorIndex != 0 { - n += 1 + sovTypes(uint64(m.ValidatorIndex)) - } if len(m.Votes) > 0 { for _, e := range m.Votes { l = e.Size() @@ -755,25 +721,6 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorIndex", wireType) - } - m.ValidatorIndex = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.ValidatorIndex |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) } @@ -807,7 +754,7 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 4: + case 3: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field SignedTimestamp", wireType) } @@ -826,7 +773,7 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { break } } - case 5: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) } @@ -945,25 +892,6 @@ func (m *CanonicalGossipedVotes) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorIndex", wireType) - } - m.ValidatorIndex = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.ValidatorIndex |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) } @@ -997,7 +925,7 @@ func (m *CanonicalGossipedVotes) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 4: + case 3: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field SignedTimestamp", wireType) } diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index fc60f0e68b4..ac73cf30bed 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -12,15 +12,13 @@ message Vote { message GossipedVotes { bytes validator = 1; - int32 validator_index = 2; - repeated Vote votes = 3; - int64 signed_timestamp = 4; - bytes signature = 5; + repeated Vote votes = 2; + int64 signed_timestamp = 3; + bytes signature = 4; } message CanonicalGossipedVotes { bytes validator = 1; - int32 validator_index = 2; - repeated Vote votes = 3; - int64 signed_timestamp = 4; + repeated Vote votes = 2; + int64 signed_timestamp = 3; } diff --git a/types/oracle.go b/types/oracle.go index bbf3de08b45..c917140e9af 100644 --- a/types/oracle.go +++ b/types/oracle.go @@ -18,7 +18,6 @@ func OracleVoteSignBytes(vote *oracleproto.GossipedVotes) []byte { func CanonicalizeOracleVote(vote *oracleproto.GossipedVotes) oracleproto.CanonicalGossipedVotes { return oracleproto.CanonicalGossipedVotes{ Validator: vote.Validator, - ValidatorIndex: vote.ValidatorIndex, Votes: vote.Votes, SignedTimestamp: vote.SignedTimestamp, } From 49d88a5e6b8f567e3c82b83a6ecf24dfda1238c1 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Thu, 16 May 2024 14:43:22 +0800 Subject: [PATCH 129/150] update context for validateOracleVotes --- state/execution.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/state/execution.go b/state/execution.go index 0f542b6501b..99e4e1877fc 100644 --- a/state/execution.go +++ b/state/execution.go @@ -204,7 +204,7 @@ func (blockExec *BlockExecutor) ProcessProposal( ) (bool, error) { txs := block.Data.Txs.ToSliceOfBytes() if len(txs) > 0 { - res, err := blockExec.proxyApp.ValidateOracleVotes(context.Background(), &abci.RequestValidateOracleVotes{OracleTx: txs[0]}) + res, err := blockExec.proxyApp.ValidateOracleVotes(context.TODO(), &abci.RequestValidateOracleVotes{OracleTx: txs[0]}) if err != nil && res.Status == abci.ResponseValidateOracleVotes_absent { // oracleTx is not present, continue normal processProposal flow From 9c49a87d96f552924c176eff8121fc13e7af3c81 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 21 May 2024 16:38:43 +0800 Subject: [PATCH 130/150] fix logging and add exit logic for p2p on oracle reactor --- docker-compose.yml | 30 ------------------------------ oracle/reactor.go | 13 ++++++++----- oracle/service/runner/runner.go | 4 ++++ 3 files changed, 12 insertions(+), 35 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 20837a8f8a3..f6c37165abc 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,28 +1,14 @@ version: '3' services: - redis: - image: redis:6.2 - ports: - - "6379:6379" - volumes: - - redis_data:/data - networks: - localnet: - ipv4_address: 192.167.10.6 - node0: container_name: node0 image: "cometbft/localnode" - depends_on: - - redis ports: - "26656-26657:26656-26657" environment: - ID=0 - LOG=${LOG:-cometbft.log} - - REDIS_HOST=redis - - REDIS_PORT=6379 volumes: - ./build:/cometbft:Z networks: @@ -32,15 +18,11 @@ services: node1: container_name: node1 image: "cometbft/localnode" - depends_on: - - redis ports: - "26659-26660:26656-26657" environment: - ID=1 - LOG=${LOG:-cometbft.log} - - REDIS_HOST=redis - - REDIS_PORT=6379 volumes: - ./build:/cometbft:Z networks: @@ -50,13 +32,9 @@ services: node2: container_name: node2 image: "cometbft/localnode" - depends_on: - - redis environment: - ID=2 - LOG=${LOG:-cometbft.log} - - REDIS_HOST=redis - - REDIS_PORT=6379 ports: - "26661-26662:26656-26657" volumes: @@ -68,13 +46,9 @@ services: node3: container_name: node3 image: "cometbft/localnode" - depends_on: - - redis environment: - ID=3 - LOG=${LOG:-cometbft.log} - - REDIS_HOST=redis - - REDIS_PORT=6379 ports: - "26663-26664:26656-26657" volumes: @@ -90,7 +64,3 @@ networks: driver: default config: - subnet: 192.167.0.0/16 - -# Define volumes -volumes: - redis_data: diff --git a/oracle/reactor.go b/oracle/reactor.go index 5e9f1b36895..1cd8ca75a88 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -166,7 +166,7 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() } default: - logrus.Warnf("unknown message type", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) + logrus.Warn("unknown message type", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("oracle cannot handle message of type: %T", e.Message)) return } @@ -213,10 +213,6 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RLock() for _, gossipVote := range oracleR.OracleInfo.GossipVoteBuffer.Buffer { - if gossipVote == nil { - continue - } - // stop sending gossip votes that have passed the maxGossipVoteAge if len(oracleR.OracleInfo.BlockTimestamps) >= oracleR.OracleInfo.Config.MaxGossipVoteAge && gossipVote.SignedTimestamp < oracleR.OracleInfo.BlockTimestamps[0] { @@ -234,5 +230,12 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() time.Sleep(interval) + + select { + case <-peer.Quit(): + return + case <-oracleR.Quit(): + return + } } } diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 4b2528caaff..582caddb204 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -174,6 +174,10 @@ func Run(oracleInfo *types.OracleInfo, consensusState *cs.State) { continue } + if res.Vote == nil { + continue + } + oracleInfo.SignVotesChan <- res.Vote } } From fb1d6a8ae6350c64a1d69a9a58e7c4eeff629c6c Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 21 May 2024 17:14:12 +0800 Subject: [PATCH 131/150] comment out exit logic for peer --- oracle/reactor.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 1cd8ca75a88..54a1530262e 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -231,11 +231,11 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { time.Sleep(interval) - select { - case <-peer.Quit(): - return - case <-oracleR.Quit(): - return - } + // select { + // case <-peer.Quit(): + // return + // case <-oracleR.Quit(): + // return + // } } } From 11ee8cf6018599a9f03ae57dee99a2e6a43f167b Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 21 May 2024 19:40:44 +0800 Subject: [PATCH 132/150] test ctx, remove later --- state/execution.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/state/execution.go b/state/execution.go index 99e4e1877fc..0f542b6501b 100644 --- a/state/execution.go +++ b/state/execution.go @@ -204,7 +204,7 @@ func (blockExec *BlockExecutor) ProcessProposal( ) (bool, error) { txs := block.Data.Txs.ToSliceOfBytes() if len(txs) > 0 { - res, err := blockExec.proxyApp.ValidateOracleVotes(context.TODO(), &abci.RequestValidateOracleVotes{OracleTx: txs[0]}) + res, err := blockExec.proxyApp.ValidateOracleVotes(context.Background(), &abci.RequestValidateOracleVotes{OracleTx: txs[0]}) if err != nil && res.Status == abci.ResponseValidateOracleVotes_absent { // oracleTx is not present, continue normal processProposal flow From 3af0b69e48b548fae7ab3c98b04700c0462547d5 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Thu, 23 May 2024 12:26:49 +0800 Subject: [PATCH 133/150] Revert "test ctx, remove later" This reverts commit 11ee8cf6018599a9f03ae57dee99a2e6a43f167b. --- state/execution.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/state/execution.go b/state/execution.go index 0f542b6501b..99e4e1877fc 100644 --- a/state/execution.go +++ b/state/execution.go @@ -204,7 +204,7 @@ func (blockExec *BlockExecutor) ProcessProposal( ) (bool, error) { txs := block.Data.Txs.ToSliceOfBytes() if len(txs) > 0 { - res, err := blockExec.proxyApp.ValidateOracleVotes(context.Background(), &abci.RequestValidateOracleVotes{OracleTx: txs[0]}) + res, err := blockExec.proxyApp.ValidateOracleVotes(context.TODO(), &abci.RequestValidateOracleVotes{OracleTx: txs[0]}) if err != nil && res.Status == abci.ResponseValidateOracleVotes_absent { // oracleTx is not present, continue normal processProposal flow From 3d26f4f35ecf0414d230f364423eba51b7191494 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 27 May 2024 00:45:20 +0800 Subject: [PATCH 134/150] update stop peer logic for oracle vote gossip --- oracle/reactor.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 54a1530262e..8db993b4564 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -128,8 +128,7 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { // verify sig of incoming gossip vote, throw if verification fails _, val := oracleR.ConsensusState.Validators.GetByAddress(msg.Validator) if val == nil { - logrus.Warnf("validator: %v not found in validator set, skipping gossip", hex.EncodeToString(msg.Validator)) - oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("validator not found in validator set: %T", e.Message)) + logrus.Debugf("validator: %v not found in validator set, skipping gossip", hex.EncodeToString(msg.Validator)) return } pubKey := val.PubKey @@ -140,8 +139,7 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { } if success := pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature); !success { - logrus.Errorf("failed signature verification for validator: %v", val.Address) - oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("oracle failed signature verification: %T", e.Message)) + logrus.Errorf("failed signature verification for validator: %v, skipping gossip", val.Address) return } From 3051fd6cbbc29c9c7d780f4506f803a4e7cc6ff2 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 28 May 2024 12:35:55 +0800 Subject: [PATCH 135/150] fix comments and remove unused proto imports --- abci/types/types.pb.go | 436 +++++++++++++++--------------- config/config.go | 2 +- oracle/reactor.go | 7 - oracle/service/runner/runner.go | 13 +- proto/buf.lock | 14 +- proto/buf.yaml | 6 +- proto/tendermint/abci/types.proto | 4 +- 7 files changed, 226 insertions(+), 256 deletions(-) diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go index e3bb241b58e..25cc23dcafe 100644 --- a/abci/types/types.pb.go +++ b/abci/types/types.pb.go @@ -225,18 +225,18 @@ func (ResponseVerifyVoteExtension_VerifyStatus) EnumDescriptor() ([]byte, []int) type ResponseValidateOracleVotes_Status int32 const ( - ResponseValidateOracleVotes_absent ResponseValidateOracleVotes_Status = 0 - ResponseValidateOracleVotes_present ResponseValidateOracleVotes_Status = 1 + ResponseValidateOracleVotes_ABSENT ResponseValidateOracleVotes_Status = 0 + ResponseValidateOracleVotes_PRESENT ResponseValidateOracleVotes_Status = 1 ) var ResponseValidateOracleVotes_Status_name = map[int32]string{ - 0: "absent", - 1: "present", + 0: "ABSENT", + 1: "PRESENT", } var ResponseValidateOracleVotes_Status_value = map[string]int32{ - "absent": 0, - "present": 1, + "ABSENT": 0, + "PRESENT": 1, } func (x ResponseValidateOracleVotes_Status) String() string { @@ -3183,7 +3183,7 @@ func (m *ResponseValidateOracleVotes) GetStatus() ResponseValidateOracleVotes_St if m != nil { return m.Status } - return ResponseValidateOracleVotes_absent + return ResponseValidateOracleVotes_ABSENT } type CommitInfo struct { @@ -4039,226 +4039,226 @@ func init() { func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) } var fileDescriptor_252557cfdd89a31a = []byte{ - // 3494 bytes of a gzipped FileDescriptorProto + // 3495 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcb, 0x8f, 0x1b, 0xc7, 0xd1, 0xe7, 0xf0, 0xb5, 0x64, 0xf1, 0xb1, 0xb3, 0xbd, 0x2b, 0x89, 0xa2, 0xa4, 0xdd, 0xd5, 0x18, - 0xb6, 0x65, 0xc9, 0xde, 0xf5, 0x27, 0x7d, 0xb2, 0x2d, 0xc8, 0xfe, 0x80, 0x5d, 0x8a, 0x12, 0x77, - 0x25, 0xef, 0xae, 0x67, 0x29, 0xf9, 0xd3, 0xf7, 0xf0, 0x78, 0x48, 0x36, 0xc9, 0xb1, 0x48, 0xce, + 0xb6, 0x65, 0xc9, 0xde, 0xf5, 0x27, 0x7d, 0xb2, 0x2d, 0xc8, 0xfe, 0x00, 0x2e, 0x45, 0x89, 0xbb, + 0x92, 0x77, 0xd7, 0xb3, 0x94, 0xfc, 0xe9, 0x7b, 0x78, 0x3c, 0x4b, 0x36, 0xc9, 0xb1, 0x48, 0xce, 0x78, 0x66, 0xb8, 0xe6, 0xfa, 0x14, 0xd8, 0x09, 0x10, 0x18, 0x08, 0x60, 0x20, 0x17, 0x1f, 0xe2, 0x43, 0x0e, 0xb9, 0xe4, 0x2f, 0x08, 0x10, 0x20, 0xa7, 0x1c, 0x7c, 0xc8, 0xc1, 0xc7, 0x9c, 0x9c, 0xc0, 0xba, 0x19, 0xc8, 0x29, 0x87, 0x5c, 0x83, 0x7e, 0xcc, 0x8b, 0x9c, 0xe1, 0x43, 0x76, 0x0e, 0x41, 0x72, 0x9b, 0x2e, 0x56, 0x55, 0x77, 0x57, 0x57, 0x77, 0x55, 0xff, 0xaa, 0x09, 0x17, 0x6c, - 0x3c, 0x68, 0x61, 0xb3, 0xaf, 0x0d, 0xec, 0x6d, 0xb5, 0xd1, 0xd4, 0xb6, 0xed, 0x53, 0x03, 0x5b, - 0x5b, 0x86, 0xa9, 0xdb, 0x3a, 0x5a, 0xf6, 0x7e, 0xdc, 0x22, 0x3f, 0x96, 0x2f, 0xf9, 0xb8, 0x9b, - 0xe6, 0xa9, 0x61, 0xeb, 0xdb, 0x86, 0xa9, 0xeb, 0x6d, 0xc6, 0x5f, 0xbe, 0x38, 0xf9, 0xf3, 0x13, - 0x7c, 0xca, 0xb5, 0x05, 0x84, 0x69, 0x2f, 0xdb, 0x86, 0x6a, 0xaa, 0x7d, 0xe7, 0xe7, 0xcd, 0x89, - 0x9f, 0x4f, 0xd4, 0x9e, 0xd6, 0x52, 0x6d, 0xdd, 0xe4, 0x1c, 0x1b, 0x1d, 0x5d, 0xef, 0xf4, 0xf0, - 0x36, 0x6d, 0x35, 0x86, 0xed, 0x6d, 0x5b, 0xeb, 0x63, 0xcb, 0x56, 0xfb, 0x06, 0x67, 0x58, 0xeb, - 0xe8, 0x1d, 0x9d, 0x7e, 0x6e, 0x93, 0xaf, 0x90, 0x7e, 0x75, 0x53, 0x6d, 0xf6, 0xb0, 0x7f, 0x92, - 0xd2, 0xd3, 0x1c, 0x2c, 0xc9, 0xf8, 0xc3, 0x21, 0xb6, 0x6c, 0x74, 0x1d, 0x92, 0xb8, 0xd9, 0xd5, - 0x4b, 0xc2, 0xa6, 0x70, 0x25, 0x77, 0xfd, 0xe2, 0xd6, 0xd8, 0xfc, 0xb7, 0x38, 0x5f, 0xb5, 0xd9, - 0xd5, 0x6b, 0x31, 0x99, 0xf2, 0xa2, 0x9b, 0x90, 0x6a, 0xf7, 0x86, 0x56, 0xb7, 0x14, 0xa7, 0x42, - 0x97, 0xa2, 0x84, 0xee, 0x12, 0xa6, 0x5a, 0x4c, 0x66, 0xdc, 0xa4, 0x2b, 0x6d, 0xd0, 0xd6, 0x4b, - 0x89, 0xe9, 0x5d, 0xed, 0x0d, 0xda, 0xb4, 0x2b, 0xc2, 0x8b, 0x76, 0x01, 0xb4, 0x81, 0x66, 0x2b, - 0xcd, 0xae, 0xaa, 0x0d, 0x4a, 0x29, 0x2a, 0x79, 0x39, 0x5a, 0x52, 0xb3, 0x2b, 0x84, 0xb1, 0x16, - 0x93, 0xb3, 0x9a, 0xd3, 0x20, 0xc3, 0xfd, 0x70, 0x88, 0xcd, 0xd3, 0x52, 0x7a, 0xfa, 0x70, 0xdf, - 0x21, 0x4c, 0x64, 0xb8, 0x94, 0x1b, 0xbd, 0x09, 0x99, 0x66, 0x17, 0x37, 0x9f, 0x28, 0xf6, 0xa8, - 0x94, 0xa1, 0x92, 0x1b, 0x51, 0x92, 0x15, 0xc2, 0x57, 0x1f, 0xd5, 0x62, 0xf2, 0x52, 0x93, 0x7d, - 0xa2, 0x37, 0x20, 0xdd, 0xd4, 0xfb, 0x7d, 0xcd, 0x2e, 0xe5, 0xa8, 0xec, 0x7a, 0xa4, 0x2c, 0xe5, - 0xaa, 0xc5, 0x64, 0xce, 0x8f, 0x0e, 0xa0, 0xd8, 0xd3, 0x2c, 0x5b, 0xb1, 0x06, 0xaa, 0x61, 0x75, - 0x75, 0xdb, 0x2a, 0xe5, 0xa9, 0x86, 0xe7, 0xa3, 0x34, 0x3c, 0xd0, 0x2c, 0xfb, 0xd8, 0x61, 0xae, - 0xc5, 0xe4, 0x42, 0xcf, 0x4f, 0x20, 0xfa, 0xf4, 0x76, 0x1b, 0x9b, 0xae, 0xc2, 0x52, 0x61, 0xba, - 0xbe, 0x43, 0xc2, 0xed, 0xc8, 0x13, 0x7d, 0xba, 0x9f, 0x80, 0xfe, 0x17, 0x56, 0x7b, 0xba, 0xda, - 0x72, 0xd5, 0x29, 0xcd, 0xee, 0x70, 0xf0, 0xa4, 0x54, 0xa4, 0x4a, 0x5f, 0x8a, 0x1c, 0xa4, 0xae, - 0xb6, 0x1c, 0x15, 0x15, 0x22, 0x50, 0x8b, 0xc9, 0x2b, 0xbd, 0x71, 0x22, 0x7a, 0x0f, 0xd6, 0x54, - 0xc3, 0xe8, 0x9d, 0x8e, 0x6b, 0x5f, 0xa6, 0xda, 0xaf, 0x46, 0x69, 0xdf, 0x21, 0x32, 0xe3, 0xea, - 0x91, 0x3a, 0x41, 0x45, 0x75, 0x10, 0x0d, 0x13, 0x1b, 0xaa, 0x89, 0x15, 0xc3, 0xd4, 0x0d, 0xdd, - 0x52, 0x7b, 0x25, 0x91, 0xea, 0x7e, 0x31, 0x4a, 0xf7, 0x11, 0xe3, 0x3f, 0xe2, 0xec, 0xb5, 0x98, - 0xbc, 0x6c, 0x04, 0x49, 0x4c, 0xab, 0xde, 0xc4, 0x96, 0xe5, 0x69, 0x5d, 0x99, 0xa5, 0x95, 0xf2, - 0x07, 0xb5, 0x06, 0x48, 0xa8, 0x0a, 0x39, 0x3c, 0x22, 0xe2, 0xca, 0x89, 0x6e, 0xe3, 0x12, 0xa2, - 0x0a, 0xa5, 0xc8, 0x1d, 0x4a, 0x59, 0x1f, 0xe9, 0x36, 0xae, 0xc5, 0x64, 0xc0, 0x6e, 0x0b, 0xa9, - 0x70, 0xe6, 0x04, 0x9b, 0x5a, 0xfb, 0x94, 0xaa, 0x51, 0xe8, 0x2f, 0x96, 0xa6, 0x0f, 0x4a, 0xab, - 0x54, 0xe1, 0xb5, 0x28, 0x85, 0x8f, 0xa8, 0x10, 0x51, 0x51, 0x75, 0x44, 0x6a, 0x31, 0x79, 0xf5, - 0x64, 0x92, 0x4c, 0x5c, 0xac, 0xad, 0x0d, 0xd4, 0x9e, 0xf6, 0x31, 0x56, 0x1a, 0x3d, 0xbd, 0xf9, - 0xa4, 0xb4, 0x36, 0xdd, 0xc5, 0xee, 0x72, 0xee, 0x5d, 0xc2, 0x4c, 0x5c, 0xac, 0xed, 0x27, 0x20, - 0x0c, 0xe7, 0x9a, 0x26, 0x56, 0x6d, 0xac, 0xb0, 0xd3, 0x4b, 0x31, 0xb1, 0x35, 0xec, 0xd9, 0x64, - 0x27, 0x9e, 0xa1, 0x8a, 0x5f, 0x8e, 0xdc, 0x4d, 0x54, 0xec, 0x90, 0x4a, 0xc9, 0x54, 0x88, 0x6e, - 0xcb, 0xb5, 0x66, 0x08, 0x1d, 0xfd, 0x37, 0xa0, 0x36, 0xb6, 0x9b, 0x5d, 0xa7, 0x17, 0x62, 0x1f, - 0xab, 0x74, 0x96, 0xf6, 0x70, 0x25, 0x72, 0xe8, 0x44, 0x82, 0x29, 0x22, 0x46, 0x20, 0x1b, 0x4e, - 0x6c, 0x8f, 0xd1, 0xa8, 0xcd, 0xd9, 0x51, 0x8e, 0x83, 0xca, 0xcf, 0xcd, 0xb0, 0x39, 0x17, 0x0a, - 0xea, 0x5f, 0x3d, 0x99, 0x24, 0xef, 0x2e, 0x41, 0xea, 0x44, 0xed, 0x0d, 0xf1, 0x7e, 0x32, 0x93, - 0x14, 0x53, 0xfb, 0xc9, 0xcc, 0x92, 0x98, 0xd9, 0x4f, 0x66, 0xb2, 0x22, 0xec, 0x27, 0x33, 0x20, - 0xe6, 0xa4, 0x17, 0x21, 0xe7, 0x3b, 0xbc, 0x51, 0x09, 0x96, 0xfa, 0xd8, 0xb2, 0xd4, 0x0e, 0xa6, - 0x67, 0x7d, 0x56, 0x76, 0x9a, 0x52, 0x11, 0xf2, 0xfe, 0x03, 0x5b, 0xfa, 0x5c, 0x70, 0x25, 0xc9, - 0x59, 0x4c, 0x24, 0x4f, 0xb0, 0x49, 0x5d, 0x86, 0x4b, 0xf2, 0x26, 0x7a, 0x0e, 0x0a, 0x74, 0xb9, - 0x15, 0xe7, 0x77, 0x12, 0x10, 0x92, 0x72, 0x9e, 0x12, 0x1f, 0x71, 0xa6, 0x0d, 0xc8, 0x19, 0xd7, - 0x0d, 0x97, 0x25, 0x41, 0x59, 0xc0, 0xb8, 0x6e, 0x38, 0x0c, 0x97, 0x21, 0x4f, 0x6c, 0xe0, 0x72, - 0x24, 0x69, 0x27, 0x39, 0x42, 0xe3, 0x2c, 0xd2, 0x1f, 0xe2, 0x20, 0x8e, 0x1f, 0xf2, 0xe8, 0x0d, - 0x48, 0x92, 0x70, 0xc8, 0x43, 0x57, 0x79, 0x8b, 0xc5, 0xca, 0x2d, 0x27, 0x56, 0x6e, 0xd5, 0x9d, - 0x58, 0xb9, 0x9b, 0xf9, 0xea, 0x9b, 0x8d, 0xd8, 0xe7, 0x7f, 0xda, 0x10, 0x64, 0x2a, 0x81, 0xce, - 0x93, 0xa3, 0x5d, 0xd5, 0x06, 0x8a, 0xd6, 0xa2, 0x43, 0xce, 0x92, 0x73, 0x5b, 0xd5, 0x06, 0x7b, - 0x2d, 0xf4, 0x00, 0xc4, 0xa6, 0x3e, 0xb0, 0xf0, 0xc0, 0x1a, 0x5a, 0x0a, 0x8b, 0xd6, 0x3c, 0x60, - 0x05, 0xc2, 0x0e, 0x0b, 0xa7, 0x15, 0x87, 0xf3, 0x88, 0x32, 0xca, 0xcb, 0xcd, 0x20, 0x01, 0xdd, - 0x05, 0x70, 0x43, 0xba, 0x55, 0x4a, 0x6e, 0x26, 0xae, 0xe4, 0xae, 0x6f, 0x4e, 0x2c, 0xfe, 0x23, - 0x87, 0xe5, 0xa1, 0x41, 0x56, 0x79, 0x37, 0x49, 0x86, 0x2b, 0xfb, 0x24, 0xd1, 0x0b, 0xb0, 0xac, - 0x1a, 0x86, 0x62, 0xd9, 0xc4, 0xa1, 0x1a, 0xa7, 0xc4, 0x93, 0x48, 0x2c, 0xcc, 0xcb, 0x05, 0xd5, - 0x30, 0x8e, 0x09, 0x75, 0x97, 0x10, 0xd1, 0xf3, 0x50, 0x24, 0x71, 0x4f, 0x53, 0x7b, 0x4a, 0x17, - 0x6b, 0x9d, 0xae, 0x4d, 0x63, 0x5e, 0x42, 0x2e, 0x70, 0x6a, 0x8d, 0x12, 0xa5, 0x96, 0xbb, 0xe2, - 0x34, 0xe6, 0x21, 0x04, 0xc9, 0x96, 0x6a, 0xab, 0xd4, 0x92, 0x79, 0x99, 0x7e, 0x13, 0x9a, 0xa1, - 0xda, 0x5d, 0x6e, 0x1f, 0xfa, 0x8d, 0xce, 0x42, 0x9a, 0xab, 0x4d, 0x50, 0xb5, 0xbc, 0x85, 0xd6, - 0x20, 0x65, 0x98, 0xfa, 0x09, 0xa6, 0x4b, 0x97, 0x91, 0x59, 0x43, 0x92, 0xa1, 0x18, 0x8c, 0x8f, - 0xa8, 0x08, 0x71, 0x7b, 0xc4, 0x7b, 0x89, 0xdb, 0x23, 0xf4, 0x2a, 0x24, 0x89, 0x21, 0x69, 0x1f, - 0xc5, 0x90, 0x8c, 0x80, 0xcb, 0xd5, 0x4f, 0x0d, 0x2c, 0x53, 0x4e, 0x69, 0x19, 0x0a, 0x81, 0xb8, - 0x29, 0x9d, 0x85, 0xb5, 0xb0, 0x30, 0x28, 0x75, 0x5d, 0x7a, 0x20, 0x9c, 0xa1, 0x9b, 0x90, 0x71, - 0xe3, 0x20, 0x73, 0x9c, 0xf3, 0x13, 0xdd, 0x3a, 0xcc, 0xb2, 0xcb, 0x4a, 0x3c, 0x86, 0x2c, 0x40, - 0x57, 0xe5, 0x59, 0x4f, 0x5e, 0x5e, 0x52, 0x0d, 0xa3, 0xa6, 0x5a, 0x5d, 0xe9, 0x7d, 0x28, 0x45, - 0xc5, 0x38, 0x9f, 0xc1, 0x04, 0xea, 0xf6, 0x8e, 0xc1, 0xce, 0x42, 0xba, 0xad, 0x9b, 0x7d, 0xd5, - 0xa6, 0xca, 0x0a, 0x32, 0x6f, 0x11, 0x43, 0xb2, 0x78, 0x97, 0xa0, 0x64, 0xd6, 0x90, 0x14, 0x38, - 0x1f, 0x19, 0xe7, 0x88, 0x88, 0x36, 0x68, 0x61, 0x66, 0xd6, 0x82, 0xcc, 0x1a, 0x9e, 0x22, 0x36, - 0x58, 0xd6, 0x20, 0xdd, 0x5a, 0x74, 0xae, 0x54, 0x7f, 0x56, 0xe6, 0x2d, 0xe9, 0x8b, 0x04, 0x9c, - 0x0d, 0x8f, 0x76, 0x68, 0x13, 0xf2, 0x7d, 0x75, 0xa4, 0xd8, 0x23, 0xee, 0x76, 0x02, 0x5d, 0x78, - 0xe8, 0xab, 0xa3, 0xfa, 0x88, 0xf9, 0x9c, 0x08, 0x09, 0x7b, 0x64, 0x95, 0xe2, 0x9b, 0x89, 0x2b, - 0x79, 0x99, 0x7c, 0xa2, 0x87, 0xb0, 0xd2, 0xd3, 0x9b, 0x6a, 0x4f, 0xe9, 0xa9, 0x96, 0xad, 0xf0, - 0x34, 0x88, 0x6d, 0xa2, 0xe7, 0x26, 0x8c, 0xcd, 0xe2, 0x16, 0x6e, 0xb1, 0xf5, 0x24, 0x07, 0x0e, - 0xf7, 0xff, 0x65, 0xaa, 0xe3, 0x81, 0xea, 0x2c, 0x35, 0xba, 0x03, 0xb9, 0xbe, 0x66, 0x35, 0x70, - 0x57, 0x3d, 0xd1, 0x74, 0x93, 0xef, 0xa6, 0x49, 0xa7, 0x79, 0xdb, 0xe3, 0xe1, 0x9a, 0xfc, 0x62, - 0xbe, 0x25, 0x49, 0x05, 0x7c, 0xd8, 0x39, 0x4d, 0xd2, 0x0b, 0x9f, 0x26, 0xaf, 0xc2, 0xda, 0x00, - 0x8f, 0x6c, 0xc5, 0xdb, 0xaf, 0xcc, 0x4f, 0x96, 0xa8, 0xe9, 0x11, 0xf9, 0xcd, 0xdd, 0xe1, 0x16, - 0x71, 0x19, 0xf4, 0x12, 0xcd, 0x17, 0x0c, 0xdd, 0xc2, 0xa6, 0xa2, 0xb6, 0x5a, 0x26, 0xb6, 0x2c, - 0x9a, 0x62, 0xe6, 0x69, 0x12, 0x40, 0xe9, 0x3b, 0x8c, 0x2c, 0xfd, 0xd4, 0xbf, 0x34, 0xc1, 0xfc, - 0x80, 0x1b, 0x5e, 0xf0, 0x0c, 0x7f, 0x0c, 0x6b, 0x5c, 0xbe, 0x15, 0xb0, 0x3d, 0xcb, 0xd3, 0x2f, - 0x4c, 0xee, 0xaf, 0x71, 0x9b, 0x23, 0x47, 0x3c, 0xda, 0xec, 0x89, 0x67, 0x33, 0x3b, 0x82, 0x24, - 0x35, 0x4a, 0x92, 0x1d, 0x31, 0xe4, 0xfb, 0x9f, 0x6d, 0x29, 0x3e, 0x4d, 0xc0, 0xca, 0x44, 0xb2, - 0xe5, 0x4e, 0x4c, 0x08, 0x9d, 0x58, 0x3c, 0x74, 0x62, 0x89, 0x85, 0x27, 0xc6, 0xd7, 0x3a, 0x39, - 0x7b, 0xad, 0x53, 0x3f, 0xe0, 0x5a, 0xa7, 0x9f, 0x6d, 0xad, 0xff, 0xa1, 0xab, 0xf0, 0x0b, 0x01, - 0xca, 0xd1, 0x19, 0x6a, 0xe8, 0x72, 0x5c, 0x83, 0x15, 0x77, 0x28, 0xae, 0x7a, 0x76, 0x30, 0x8a, - 0xee, 0x0f, 0x5c, 0x7f, 0x64, 0x8c, 0x7b, 0x1e, 0x8a, 0x63, 0xf9, 0x33, 0x73, 0xe5, 0xc2, 0x89, - 0xbf, 0x7f, 0xe9, 0xc7, 0x09, 0x37, 0xf0, 0x04, 0x92, 0xdc, 0x90, 0xdd, 0xfa, 0x0e, 0xac, 0xb6, - 0x70, 0x53, 0x6b, 0x3d, 0xeb, 0x66, 0x5d, 0xe1, 0xd2, 0xff, 0xde, 0xab, 0x93, 0x5e, 0xf2, 0x89, - 0x00, 0x17, 0xa6, 0x5c, 0x09, 0x50, 0x19, 0x32, 0x8e, 0x08, 0x77, 0x15, 0xb7, 0x8d, 0xee, 0x41, - 0xb1, 0xa3, 0x5b, 0x96, 0x66, 0xe0, 0x16, 0xcf, 0xda, 0xe3, 0x93, 0x89, 0x1b, 0xcb, 0xea, 0xb7, - 0xee, 0x71, 0x46, 0x9a, 0x93, 0xcb, 0x85, 0x8e, 0xbf, 0x29, 0x9d, 0x87, 0x73, 0x11, 0x97, 0x06, - 0xe9, 0x96, 0xe7, 0xc4, 0x93, 0xb9, 0x3d, 0xba, 0x00, 0x59, 0x7e, 0x6b, 0x70, 0xd3, 0xa5, 0x0c, - 0x23, 0xd4, 0x47, 0xd2, 0x6f, 0xf3, 0x90, 0x91, 0xb1, 0x65, 0x90, 0x54, 0x13, 0xed, 0x42, 0x16, - 0x8f, 0x9a, 0xd8, 0xb0, 0x9d, 0xec, 0x3c, 0xfc, 0x86, 0xc8, 0xb8, 0xab, 0x0e, 0x67, 0x2d, 0x26, - 0x7b, 0x62, 0xe8, 0x06, 0x87, 0x80, 0xa2, 0xd1, 0x1c, 0x2e, 0xee, 0xc7, 0x80, 0x5e, 0x73, 0x30, - 0xa0, 0x44, 0x24, 0xbc, 0xc1, 0xa4, 0xc6, 0x40, 0xa0, 0x1b, 0x1c, 0x04, 0x4a, 0xce, 0xe8, 0x2c, - 0x80, 0x02, 0x55, 0x02, 0x28, 0x50, 0x7a, 0xc6, 0x34, 0x23, 0x60, 0xa0, 0xd7, 0x1c, 0x18, 0x68, - 0x69, 0xc6, 0x88, 0xc7, 0x70, 0xa0, 0xb7, 0x7c, 0x38, 0x50, 0x96, 0x8a, 0x6e, 0x46, 0x8a, 0x86, - 0x00, 0x41, 0xb7, 0x5c, 0x20, 0x28, 0x1f, 0x09, 0x22, 0x71, 0xe1, 0x71, 0x24, 0xe8, 0x70, 0x02, - 0x09, 0x62, 0xc8, 0xcd, 0x0b, 0x91, 0x2a, 0x66, 0x40, 0x41, 0x87, 0x13, 0x50, 0x50, 0x71, 0x86, - 0xc2, 0x19, 0x58, 0xd0, 0xff, 0x85, 0x63, 0x41, 0xd1, 0x68, 0x0d, 0x1f, 0xe6, 0x7c, 0x60, 0x90, - 0x12, 0x01, 0x06, 0x89, 0x91, 0x97, 0x68, 0xa6, 0x7e, 0x6e, 0x34, 0xe8, 0x61, 0x08, 0x1a, 0xb4, - 0x12, 0x79, 0xfd, 0x67, 0xca, 0xe7, 0x80, 0x83, 0x1e, 0x86, 0xc0, 0x41, 0x68, 0xa6, 0xda, 0x99, - 0x78, 0xd0, 0xdd, 0x20, 0x1e, 0xb4, 0x1a, 0x91, 0x50, 0x7b, 0xbb, 0x3d, 0x02, 0x10, 0x6a, 0x44, - 0x01, 0x42, 0x6b, 0x91, 0xd8, 0x0a, 0xd3, 0xb8, 0x00, 0x22, 0x74, 0x38, 0x81, 0x08, 0x9d, 0x99, - 0xe1, 0x69, 0x33, 0x20, 0xa1, 0x76, 0x34, 0x24, 0xc4, 0x00, 0x9b, 0x57, 0xa2, 0xf7, 0xd5, 0x22, - 0x98, 0xd0, 0xe3, 0x50, 0x4c, 0xe8, 0x5c, 0x24, 0xb8, 0xc9, 0x07, 0x3f, 0x0f, 0x28, 0xd4, 0x88, - 0x02, 0x85, 0x4a, 0xb3, 0xec, 0xfe, 0x4c, 0xa8, 0x50, 0x4a, 0x4c, 0xef, 0x27, 0x33, 0x19, 0x31, - 0xcb, 0xf0, 0xa0, 0xfd, 0x64, 0x26, 0x27, 0xe6, 0xa5, 0x97, 0x48, 0x0e, 0x3b, 0x16, 0x0e, 0xc8, - 0x6d, 0x11, 0x9b, 0xa6, 0x6e, 0x72, 0x7c, 0x87, 0x35, 0xa4, 0x2b, 0x90, 0xf7, 0x1f, 0xfd, 0x53, - 0x10, 0x24, 0x7a, 0x2b, 0xf7, 0x1d, 0xf7, 0xd2, 0x6f, 0x04, 0x4f, 0x96, 0x62, 0x48, 0x7e, 0x84, - 0x21, 0xcb, 0x11, 0x06, 0x1f, 0xae, 0x14, 0x0f, 0xe2, 0x4a, 0x1b, 0x90, 0x23, 0xb7, 0xed, 0x31, - 0xc8, 0x48, 0x35, 0x5c, 0xc8, 0xe8, 0x2a, 0xac, 0xd0, 0x94, 0x89, 0xa1, 0x4f, 0x3c, 0x31, 0x49, - 0xd2, 0xc4, 0x64, 0x99, 0xfc, 0xc0, 0x9c, 0x88, 0x65, 0x28, 0xaf, 0xc0, 0xaa, 0x8f, 0xd7, 0xbd, - 0xc5, 0x33, 0xfc, 0x44, 0x74, 0xb9, 0x77, 0xf8, 0x75, 0xfe, 0xf7, 0x82, 0x67, 0x21, 0x0f, 0x6b, - 0x0a, 0x83, 0x85, 0x84, 0x1f, 0x08, 0x16, 0x8a, 0x3f, 0x33, 0x2c, 0xe4, 0x47, 0x25, 0x12, 0x41, - 0x54, 0xe2, 0x6f, 0x82, 0xb7, 0x26, 0x2e, 0xc8, 0xd3, 0xd4, 0x5b, 0x98, 0xe3, 0x04, 0xf4, 0x9b, - 0x24, 0xa5, 0x3d, 0xbd, 0xc3, 0xd1, 0x00, 0xf2, 0x49, 0xb8, 0xdc, 0xf8, 0x9c, 0xe5, 0xe1, 0xd7, - 0x85, 0x18, 0x58, 0xea, 0xc7, 0x21, 0x06, 0x11, 0x12, 0x4f, 0x30, 0x2b, 0xaa, 0xe4, 0x65, 0xf2, - 0x49, 0xf8, 0xa8, 0xf3, 0xf1, 0x14, 0x8e, 0x35, 0xd0, 0x1b, 0x90, 0xa5, 0x15, 0x33, 0x45, 0x37, - 0x2c, 0x5e, 0x48, 0x09, 0x24, 0xb7, 0xac, 0x6c, 0xb6, 0x75, 0x44, 0x78, 0x0e, 0x0d, 0x8b, 0x26, - 0x62, 0xf4, 0xcb, 0x97, 0x73, 0x66, 0x03, 0x39, 0xe7, 0x45, 0xc8, 0x92, 0xd1, 0x5b, 0x86, 0xda, - 0xc4, 0x25, 0xa0, 0x03, 0xf5, 0x08, 0xd2, 0xaf, 0xe3, 0xb0, 0x3c, 0x16, 0x8f, 0x43, 0xe7, 0xee, - 0xb8, 0x64, 0xdc, 0x07, 0x7a, 0xcd, 0x67, 0x8f, 0x75, 0x80, 0x8e, 0x6a, 0x29, 0x1f, 0xa9, 0x03, - 0x1b, 0xb7, 0xb8, 0x51, 0x7c, 0x14, 0x92, 0x5c, 0x92, 0xd6, 0xd0, 0xc2, 0x2d, 0x8e, 0xbf, 0xb9, - 0x6d, 0x54, 0x83, 0x34, 0x3e, 0xc1, 0x03, 0xdb, 0x2a, 0x2d, 0xd1, 0x65, 0x3f, 0x3b, 0x09, 0x88, - 0x90, 0x9f, 0x77, 0x4b, 0x64, 0xb1, 0xbf, 0xfb, 0x66, 0x43, 0x64, 0xdc, 0x2f, 0xeb, 0x7d, 0xcd, - 0xc6, 0x7d, 0xc3, 0x3e, 0x95, 0xb9, 0x7c, 0xd0, 0x0a, 0x99, 0x31, 0x2b, 0x50, 0x24, 0x38, 0xef, - 0x00, 0x3c, 0xc4, 0xa6, 0x9a, 0x6e, 0x6a, 0xf6, 0xa9, 0x5c, 0xe8, 0xe3, 0xbe, 0xa1, 0xeb, 0x3d, - 0x85, 0xed, 0xf1, 0x1d, 0x28, 0x06, 0xd3, 0x0f, 0xf4, 0x1c, 0x14, 0x4c, 0x6c, 0xab, 0xda, 0x40, - 0x09, 0x5c, 0x83, 0xf2, 0x8c, 0xc8, 0xf6, 0xd4, 0x7e, 0x32, 0x23, 0x88, 0xf1, 0xfd, 0x64, 0x26, - 0x2e, 0x26, 0xa4, 0x23, 0x38, 0x13, 0x9a, 0x7e, 0xa0, 0xd7, 0x21, 0xeb, 0x65, 0x2e, 0x02, 0x9d, - 0xed, 0x14, 0xac, 0xcd, 0xe3, 0x95, 0x7e, 0x27, 0x78, 0x2a, 0x83, 0xe8, 0x5d, 0x15, 0xd2, 0xec, - 0xdc, 0xa7, 0x2b, 0x59, 0x9c, 0x72, 0xe8, 0x07, 0xe4, 0xb6, 0xd8, 0xf1, 0x2e, 0x73, 0x61, 0xe9, - 0x3d, 0x48, 0x33, 0x0a, 0xca, 0xc1, 0xd2, 0xc3, 0x83, 0xfb, 0x07, 0x87, 0xef, 0x1e, 0x88, 0x31, - 0x04, 0x90, 0xde, 0xa9, 0x54, 0xaa, 0x47, 0x75, 0x51, 0x40, 0x59, 0x48, 0xed, 0xec, 0x1e, 0xca, - 0x75, 0x31, 0x4e, 0xc8, 0x72, 0x75, 0xbf, 0x5a, 0xa9, 0x8b, 0x09, 0xb4, 0x02, 0x05, 0xf6, 0xad, - 0xdc, 0x3d, 0x94, 0xdf, 0xde, 0xa9, 0x8b, 0x49, 0x1f, 0xe9, 0xb8, 0x7a, 0x70, 0xa7, 0x2a, 0x8b, + 0x3c, 0x68, 0x61, 0xb3, 0xaf, 0x0d, 0xec, 0x6d, 0xf5, 0xb8, 0xa9, 0x6d, 0xdb, 0xa7, 0x06, 0xb6, + 0xb6, 0x0c, 0x53, 0xb7, 0x75, 0xb4, 0xec, 0xfd, 0xb8, 0x45, 0x7e, 0x2c, 0x5f, 0xf2, 0x71, 0x37, + 0xcd, 0x53, 0xc3, 0xd6, 0xb7, 0x0d, 0x53, 0xd7, 0xdb, 0x8c, 0xbf, 0x7c, 0x71, 0xf2, 0xe7, 0x27, + 0xf8, 0x94, 0x6b, 0x0b, 0x08, 0xd3, 0x5e, 0xb6, 0x0d, 0xd5, 0x54, 0xfb, 0xce, 0xcf, 0x9b, 0x13, + 0x3f, 0x9f, 0xa8, 0x3d, 0xad, 0xa5, 0xda, 0xba, 0xc9, 0x39, 0x36, 0x3a, 0xba, 0xde, 0xe9, 0xe1, + 0x6d, 0xda, 0x3a, 0x1e, 0xb6, 0xb7, 0x6d, 0xad, 0x8f, 0x2d, 0x5b, 0xed, 0x1b, 0x9c, 0x61, 0xad, + 0xa3, 0x77, 0x74, 0xfa, 0xb9, 0x4d, 0xbe, 0x42, 0xfa, 0xd5, 0x4d, 0xb5, 0xd9, 0xc3, 0xfe, 0x49, + 0x4a, 0x4f, 0x73, 0xb0, 0x24, 0xe3, 0x0f, 0x87, 0xd8, 0xb2, 0xd1, 0x75, 0x48, 0xe2, 0x66, 0x57, + 0x2f, 0x09, 0x9b, 0xc2, 0x95, 0xdc, 0xf5, 0x8b, 0x5b, 0x63, 0xf3, 0xdf, 0xe2, 0x7c, 0xb5, 0x66, + 0x57, 0xaf, 0xc7, 0x64, 0xca, 0x8b, 0x6e, 0x42, 0xaa, 0xdd, 0x1b, 0x5a, 0xdd, 0x52, 0x9c, 0x0a, + 0x5d, 0x8a, 0x12, 0xba, 0x4b, 0x98, 0xea, 0x31, 0x99, 0x71, 0x93, 0xae, 0xb4, 0x41, 0x5b, 0x2f, + 0x25, 0xa6, 0x77, 0xb5, 0x3b, 0x68, 0xd3, 0xae, 0x08, 0x2f, 0xda, 0x01, 0xd0, 0x06, 0x9a, 0xad, + 0x34, 0xbb, 0xaa, 0x36, 0x28, 0xa5, 0xa8, 0xe4, 0xe5, 0x68, 0x49, 0xcd, 0xae, 0x12, 0xc6, 0x7a, + 0x4c, 0xce, 0x6a, 0x4e, 0x83, 0x0c, 0xf7, 0xc3, 0x21, 0x36, 0x4f, 0x4b, 0xe9, 0xe9, 0xc3, 0x7d, + 0x87, 0x30, 0x91, 0xe1, 0x52, 0x6e, 0xf4, 0x26, 0x64, 0x9a, 0x5d, 0xdc, 0x7c, 0xa2, 0xd8, 0xa3, + 0x52, 0x86, 0x4a, 0x6e, 0x44, 0x49, 0x56, 0x09, 0x5f, 0x63, 0x54, 0x8f, 0xc9, 0x4b, 0x4d, 0xf6, + 0x89, 0xde, 0x80, 0x74, 0x53, 0xef, 0xf7, 0x35, 0xbb, 0x94, 0xa3, 0xb2, 0xeb, 0x91, 0xb2, 0x94, + 0xab, 0x1e, 0x93, 0x39, 0x3f, 0xda, 0x87, 0x62, 0x4f, 0xb3, 0x6c, 0xc5, 0x1a, 0xa8, 0x86, 0xd5, + 0xd5, 0x6d, 0xab, 0x94, 0xa7, 0x1a, 0x9e, 0x8f, 0xd2, 0xf0, 0x40, 0xb3, 0xec, 0x23, 0x87, 0xb9, + 0x1e, 0x93, 0x0b, 0x3d, 0x3f, 0x81, 0xe8, 0xd3, 0xdb, 0x6d, 0x6c, 0xba, 0x0a, 0x4b, 0x85, 0xe9, + 0xfa, 0x0e, 0x08, 0xb7, 0x23, 0x4f, 0xf4, 0xe9, 0x7e, 0x02, 0xfa, 0x5f, 0x58, 0xed, 0xe9, 0x6a, + 0xcb, 0x55, 0xa7, 0x34, 0xbb, 0xc3, 0xc1, 0x93, 0x52, 0x91, 0x2a, 0x7d, 0x29, 0x72, 0x90, 0xba, + 0xda, 0x72, 0x54, 0x54, 0x89, 0x40, 0x3d, 0x26, 0xaf, 0xf4, 0xc6, 0x89, 0xe8, 0x3d, 0x58, 0x53, + 0x0d, 0xa3, 0x77, 0x3a, 0xae, 0x7d, 0x99, 0x6a, 0xbf, 0x1a, 0xa5, 0xbd, 0x42, 0x64, 0xc6, 0xd5, + 0x23, 0x75, 0x82, 0x8a, 0x1a, 0x20, 0x1a, 0x26, 0x36, 0x54, 0x13, 0x2b, 0x86, 0xa9, 0x1b, 0xba, + 0xa5, 0xf6, 0x4a, 0x22, 0xd5, 0xfd, 0x62, 0x94, 0xee, 0x43, 0xc6, 0x7f, 0xc8, 0xd9, 0xeb, 0x31, + 0x79, 0xd9, 0x08, 0x92, 0x98, 0x56, 0xbd, 0x89, 0x2d, 0xcb, 0xd3, 0xba, 0x32, 0x4b, 0x2b, 0xe5, + 0x0f, 0x6a, 0x0d, 0x90, 0x50, 0x0d, 0x72, 0x78, 0x44, 0xc4, 0x95, 0x13, 0xdd, 0xc6, 0x25, 0x44, + 0x15, 0x4a, 0x91, 0x3b, 0x94, 0xb2, 0x3e, 0xd2, 0x6d, 0x5c, 0x8f, 0xc9, 0x80, 0xdd, 0x16, 0x52, + 0xe1, 0xcc, 0x09, 0x36, 0xb5, 0xf6, 0x29, 0x55, 0xa3, 0xd0, 0x5f, 0x2c, 0x4d, 0x1f, 0x94, 0x56, + 0xa9, 0xc2, 0x6b, 0x51, 0x0a, 0x1f, 0x51, 0x21, 0xa2, 0xa2, 0xe6, 0x88, 0xd4, 0x63, 0xf2, 0xea, + 0xc9, 0x24, 0x99, 0xb8, 0x58, 0x5b, 0x1b, 0xa8, 0x3d, 0xed, 0x63, 0xac, 0x1c, 0xf7, 0xf4, 0xe6, + 0x93, 0xd2, 0xda, 0x74, 0x17, 0xbb, 0xcb, 0xb9, 0x77, 0x08, 0x33, 0x71, 0xb1, 0xb6, 0x9f, 0x80, + 0x30, 0x9c, 0x6b, 0x9a, 0x58, 0xb5, 0xb1, 0xc2, 0x4e, 0x2f, 0xc5, 0xc4, 0xd6, 0xb0, 0x67, 0x93, + 0x9d, 0x78, 0x86, 0x2a, 0x7e, 0x39, 0x72, 0x37, 0x51, 0xb1, 0x03, 0x2a, 0x25, 0x53, 0x21, 0xba, + 0x2d, 0xd7, 0x9a, 0x21, 0x74, 0xf4, 0xdf, 0x80, 0xda, 0xd8, 0x6e, 0x76, 0x9d, 0x5e, 0x88, 0x7d, + 0xac, 0xd2, 0x59, 0xda, 0xc3, 0x95, 0xc8, 0xa1, 0x13, 0x09, 0xa6, 0x88, 0x18, 0x81, 0x6c, 0x38, + 0xb1, 0x3d, 0x46, 0xa3, 0x36, 0x67, 0x47, 0x39, 0x0e, 0x2a, 0x3f, 0x37, 0xc3, 0xe6, 0x5c, 0x28, + 0xa8, 0x7f, 0xf5, 0x64, 0x92, 0xbc, 0xb3, 0x04, 0xa9, 0x13, 0xb5, 0x37, 0xc4, 0x7b, 0xc9, 0x4c, + 0x52, 0x4c, 0xed, 0x25, 0x33, 0x4b, 0x62, 0x66, 0x2f, 0x99, 0xc9, 0x8a, 0xb0, 0x97, 0xcc, 0x80, + 0x98, 0x93, 0x5e, 0x84, 0x9c, 0xef, 0xf0, 0x46, 0x25, 0x58, 0xea, 0x63, 0xcb, 0x52, 0x3b, 0x98, + 0x9e, 0xf5, 0x59, 0xd9, 0x69, 0x4a, 0x45, 0xc8, 0xfb, 0x0f, 0x6c, 0xe9, 0x73, 0xc1, 0x95, 0x24, + 0x67, 0x31, 0x91, 0x3c, 0xc1, 0x26, 0x75, 0x19, 0x2e, 0xc9, 0x9b, 0xe8, 0x39, 0x28, 0xd0, 0xe5, + 0x56, 0x9c, 0xdf, 0x49, 0x40, 0x48, 0xca, 0x79, 0x4a, 0x7c, 0xc4, 0x99, 0x36, 0x20, 0x67, 0x5c, + 0x37, 0x5c, 0x96, 0x04, 0x65, 0x01, 0xe3, 0xba, 0xe1, 0x30, 0x5c, 0x86, 0x3c, 0xb1, 0x81, 0xcb, + 0x91, 0xa4, 0x9d, 0xe4, 0x08, 0x8d, 0xb3, 0x48, 0x7f, 0x88, 0x83, 0x38, 0x7e, 0xc8, 0xa3, 0x37, + 0x20, 0x49, 0xc2, 0x21, 0x0f, 0x5d, 0xe5, 0x2d, 0x16, 0x2b, 0xb7, 0x9c, 0x58, 0xb9, 0xd5, 0x70, + 0x62, 0xe5, 0x4e, 0xe6, 0xab, 0x6f, 0x36, 0x62, 0x9f, 0xff, 0x69, 0x43, 0x90, 0xa9, 0x04, 0x3a, + 0x4f, 0x8e, 0x76, 0x55, 0x1b, 0x28, 0x5a, 0x8b, 0x0e, 0x39, 0x4b, 0xce, 0x6d, 0x55, 0x1b, 0xec, + 0xb6, 0xd0, 0x03, 0x10, 0x9b, 0xfa, 0xc0, 0xc2, 0x03, 0x6b, 0x68, 0x29, 0x2c, 0x5a, 0xf3, 0x80, + 0x15, 0x08, 0x3b, 0x2c, 0x9c, 0x56, 0x1d, 0xce, 0x43, 0xca, 0x28, 0x2f, 0x37, 0x83, 0x04, 0x74, + 0x17, 0xc0, 0x0d, 0xe9, 0x56, 0x29, 0xb9, 0x99, 0xb8, 0x92, 0xbb, 0xbe, 0x39, 0xb1, 0xf8, 0x8f, + 0x1c, 0x96, 0x87, 0x06, 0x59, 0xe5, 0x9d, 0x24, 0x19, 0xae, 0xec, 0x93, 0x44, 0x2f, 0xc0, 0xb2, + 0x6a, 0x18, 0x8a, 0x65, 0x13, 0x87, 0x3a, 0x3e, 0x25, 0x9e, 0x44, 0x62, 0x61, 0x5e, 0x2e, 0xa8, + 0x86, 0x71, 0x44, 0xa8, 0x3b, 0x84, 0x88, 0x9e, 0x87, 0x22, 0x89, 0x7b, 0x9a, 0xda, 0x53, 0xba, + 0x58, 0xeb, 0x74, 0x6d, 0x1a, 0xf3, 0x12, 0x72, 0x81, 0x53, 0xeb, 0x94, 0x28, 0xb5, 0xdc, 0x15, + 0xa7, 0x31, 0x0f, 0x21, 0x48, 0xb6, 0x54, 0x5b, 0xa5, 0x96, 0xcc, 0xcb, 0xf4, 0x9b, 0xd0, 0x0c, + 0xd5, 0xee, 0x72, 0xfb, 0xd0, 0x6f, 0x74, 0x16, 0xd2, 0x5c, 0x6d, 0x82, 0xaa, 0xe5, 0x2d, 0xb4, + 0x06, 0x29, 0xc3, 0xd4, 0x4f, 0x30, 0x5d, 0xba, 0x8c, 0xcc, 0x1a, 0x92, 0x0c, 0xc5, 0x60, 0x7c, + 0x44, 0x45, 0x88, 0xdb, 0x23, 0xde, 0x4b, 0xdc, 0x1e, 0xa1, 0x57, 0x21, 0x49, 0x0c, 0x49, 0xfb, + 0x28, 0x86, 0x64, 0x04, 0x5c, 0xae, 0x71, 0x6a, 0x60, 0x99, 0x72, 0x4a, 0xcb, 0x50, 0x08, 0xc4, + 0x4d, 0xe9, 0x2c, 0xac, 0x85, 0x85, 0x41, 0xa9, 0xeb, 0xd2, 0x03, 0xe1, 0x0c, 0xdd, 0x84, 0x8c, + 0x1b, 0x07, 0x99, 0xe3, 0x9c, 0x9f, 0xe8, 0xd6, 0x61, 0x96, 0x5d, 0x56, 0xe2, 0x31, 0x64, 0x01, + 0xba, 0x2a, 0xcf, 0x7a, 0xf2, 0xf2, 0x92, 0x6a, 0x18, 0x75, 0xd5, 0xea, 0x4a, 0xef, 0x43, 0x29, + 0x2a, 0xc6, 0xf9, 0x0c, 0x26, 0x50, 0xb7, 0x77, 0x0c, 0x76, 0x16, 0xd2, 0x6d, 0xdd, 0xec, 0xab, + 0x36, 0x55, 0x56, 0x90, 0x79, 0x8b, 0x18, 0x92, 0xc5, 0xbb, 0x04, 0x25, 0xb3, 0x86, 0xa4, 0xc0, + 0xf9, 0xc8, 0x38, 0x47, 0x44, 0xb4, 0x41, 0x0b, 0x33, 0xb3, 0x16, 0x64, 0xd6, 0xf0, 0x14, 0xb1, + 0xc1, 0xb2, 0x06, 0xe9, 0xd6, 0xa2, 0x73, 0xa5, 0xfa, 0xb3, 0x32, 0x6f, 0x49, 0x5f, 0x24, 0xe0, + 0x6c, 0x78, 0xb4, 0x43, 0x9b, 0x90, 0xef, 0xab, 0x23, 0xc5, 0x1e, 0x71, 0xb7, 0x13, 0xe8, 0xc2, + 0x43, 0x5f, 0x1d, 0x35, 0x46, 0xcc, 0xe7, 0x44, 0x48, 0xd8, 0x23, 0xab, 0x14, 0xdf, 0x4c, 0x5c, + 0xc9, 0xcb, 0xe4, 0x13, 0x3d, 0x84, 0x95, 0x9e, 0xde, 0x54, 0x7b, 0x4a, 0x4f, 0xb5, 0x6c, 0x85, + 0xa7, 0x41, 0x6c, 0x13, 0x3d, 0x37, 0x61, 0x6c, 0x16, 0xb7, 0x70, 0x8b, 0xad, 0x27, 0x39, 0x70, + 0xb8, 0xff, 0x2f, 0x53, 0x1d, 0x0f, 0x54, 0x67, 0xa9, 0xd1, 0x1d, 0xc8, 0xf5, 0x35, 0xeb, 0x18, + 0x77, 0xd5, 0x13, 0x4d, 0x37, 0xf9, 0x6e, 0x9a, 0x74, 0x9a, 0xb7, 0x3d, 0x1e, 0xae, 0xc9, 0x2f, + 0xe6, 0x5b, 0x92, 0x54, 0xc0, 0x87, 0x9d, 0xd3, 0x24, 0xbd, 0xf0, 0x69, 0xf2, 0x2a, 0xac, 0x0d, + 0xf0, 0xc8, 0x56, 0xbc, 0xfd, 0xca, 0xfc, 0x64, 0x89, 0x9a, 0x1e, 0x91, 0xdf, 0xdc, 0x1d, 0x6e, + 0x11, 0x97, 0x41, 0x2f, 0xd1, 0x7c, 0xc1, 0xd0, 0x2d, 0x6c, 0x2a, 0x6a, 0xab, 0x65, 0x62, 0xcb, + 0xa2, 0x29, 0x66, 0x9e, 0x26, 0x01, 0x94, 0x5e, 0x61, 0x64, 0xe9, 0xa7, 0xfe, 0xa5, 0x09, 0xe6, + 0x07, 0xdc, 0xf0, 0x82, 0x67, 0xf8, 0x23, 0x58, 0xe3, 0xf2, 0xad, 0x80, 0xed, 0x59, 0x9e, 0x7e, + 0x61, 0x72, 0x7f, 0x8d, 0xdb, 0x1c, 0x39, 0xe2, 0xd1, 0x66, 0x4f, 0x3c, 0x9b, 0xd9, 0x11, 0x24, + 0xa9, 0x51, 0x92, 0xec, 0x88, 0x21, 0xdf, 0xff, 0x6c, 0x4b, 0xf1, 0x69, 0x02, 0x56, 0x26, 0x92, + 0x2d, 0x77, 0x62, 0x42, 0xe8, 0xc4, 0xe2, 0xa1, 0x13, 0x4b, 0x2c, 0x3c, 0x31, 0xbe, 0xd6, 0xc9, + 0xd9, 0x6b, 0x9d, 0xfa, 0x01, 0xd7, 0x3a, 0xfd, 0x6c, 0x6b, 0xfd, 0x0f, 0x5d, 0x85, 0x5f, 0x08, + 0x50, 0x8e, 0xce, 0x50, 0x43, 0x97, 0xe3, 0x1a, 0xac, 0xb8, 0x43, 0x71, 0xd5, 0xb3, 0x83, 0x51, + 0x74, 0x7f, 0xe0, 0xfa, 0x23, 0x63, 0xdc, 0xf3, 0x50, 0x1c, 0xcb, 0x9f, 0x99, 0x2b, 0x17, 0x4e, + 0xfc, 0xfd, 0x4b, 0x3f, 0x4e, 0xb8, 0x81, 0x27, 0x90, 0xe4, 0x86, 0xec, 0xd6, 0x77, 0x60, 0xb5, + 0x85, 0x9b, 0x5a, 0xeb, 0x59, 0x37, 0xeb, 0x0a, 0x97, 0xfe, 0xf7, 0x5e, 0x9d, 0xf4, 0x92, 0x4f, + 0x04, 0xb8, 0x30, 0xe5, 0x4a, 0x80, 0xca, 0x90, 0x71, 0x44, 0xb8, 0xab, 0xb8, 0x6d, 0x74, 0x0f, + 0x8a, 0x1d, 0xdd, 0xb2, 0x34, 0x03, 0xb7, 0x78, 0xd6, 0x1e, 0x9f, 0x4c, 0xdc, 0x58, 0x56, 0xbf, + 0x75, 0x8f, 0x33, 0xd2, 0x9c, 0x5c, 0x2e, 0x74, 0xfc, 0x4d, 0xe9, 0x3c, 0x9c, 0x8b, 0xb8, 0x34, + 0x48, 0xb7, 0x3c, 0x27, 0x9e, 0xcc, 0xed, 0xd1, 0x05, 0xc8, 0xf2, 0x5b, 0x83, 0x9b, 0x2e, 0x65, + 0x18, 0xa1, 0x31, 0x92, 0x7e, 0x9b, 0x87, 0x8c, 0x8c, 0x2d, 0x83, 0xa4, 0x9a, 0x68, 0x07, 0xb2, + 0x78, 0xd4, 0xc4, 0x86, 0xed, 0x64, 0xe7, 0xe1, 0x37, 0x44, 0xc6, 0x5d, 0x73, 0x38, 0xeb, 0x31, + 0xd9, 0x13, 0x43, 0x37, 0x38, 0x04, 0x14, 0x8d, 0xe6, 0x70, 0x71, 0x3f, 0x06, 0xf4, 0x9a, 0x83, + 0x01, 0x25, 0x22, 0xe1, 0x0d, 0x26, 0x35, 0x06, 0x02, 0xdd, 0xe0, 0x20, 0x50, 0x72, 0x46, 0x67, + 0x01, 0x14, 0xa8, 0x1a, 0x40, 0x81, 0xd2, 0x33, 0xa6, 0x19, 0x01, 0x03, 0xbd, 0xe6, 0xc0, 0x40, + 0x4b, 0x33, 0x46, 0x3c, 0x86, 0x03, 0xbd, 0xe5, 0xc3, 0x81, 0xb2, 0x54, 0x74, 0x33, 0x52, 0x34, + 0x04, 0x08, 0xba, 0xe5, 0x02, 0x41, 0xf9, 0x48, 0x10, 0x89, 0x0b, 0x8f, 0x23, 0x41, 0x07, 0x13, + 0x48, 0x10, 0x43, 0x6e, 0x5e, 0x88, 0x54, 0x31, 0x03, 0x0a, 0x3a, 0x98, 0x80, 0x82, 0x8a, 0x33, + 0x14, 0xce, 0xc0, 0x82, 0xfe, 0x2f, 0x1c, 0x0b, 0x8a, 0x46, 0x6b, 0xf8, 0x30, 0xe7, 0x03, 0x83, + 0x94, 0x08, 0x30, 0x48, 0x8c, 0xbc, 0x44, 0x33, 0xf5, 0x73, 0xa3, 0x41, 0x0f, 0x43, 0xd0, 0xa0, + 0x95, 0xc8, 0xeb, 0x3f, 0x53, 0x3e, 0x07, 0x1c, 0xf4, 0x30, 0x04, 0x0e, 0x42, 0x33, 0xd5, 0xce, + 0xc4, 0x83, 0xee, 0x06, 0xf1, 0xa0, 0xd5, 0x88, 0x84, 0xda, 0xdb, 0xed, 0x11, 0x80, 0xd0, 0x71, + 0x14, 0x20, 0xb4, 0x16, 0x89, 0xad, 0x30, 0x8d, 0x0b, 0x20, 0x42, 0x07, 0x13, 0x88, 0xd0, 0x99, + 0x19, 0x9e, 0x36, 0x03, 0x12, 0x6a, 0x47, 0x43, 0x42, 0x0c, 0xb0, 0x79, 0x25, 0x7a, 0x5f, 0x2d, + 0x82, 0x09, 0x3d, 0x0e, 0xc5, 0x84, 0xce, 0x45, 0x82, 0x9b, 0x7c, 0xf0, 0xf3, 0x80, 0x42, 0xc7, + 0x51, 0xa0, 0x50, 0x69, 0x96, 0xdd, 0x9f, 0x09, 0x15, 0x4a, 0x89, 0xe9, 0xbd, 0x64, 0x26, 0x23, + 0x66, 0x19, 0x1e, 0xb4, 0x97, 0xcc, 0xe4, 0xc4, 0xbc, 0xf4, 0x12, 0xc9, 0x61, 0xc7, 0xc2, 0x01, + 0xb9, 0x2d, 0x62, 0xd3, 0xd4, 0x4d, 0x8e, 0xef, 0xb0, 0x86, 0x74, 0x05, 0xf2, 0xfe, 0xa3, 0x7f, + 0x0a, 0x82, 0x44, 0x6f, 0xe5, 0xbe, 0xe3, 0x5e, 0xfa, 0x8d, 0xe0, 0xc9, 0x52, 0x0c, 0xc9, 0x8f, + 0x30, 0x64, 0x39, 0xc2, 0xe0, 0xc3, 0x95, 0xe2, 0x41, 0x5c, 0x69, 0x03, 0x72, 0xe4, 0xb6, 0x3d, + 0x06, 0x19, 0xa9, 0x86, 0x0b, 0x19, 0x5d, 0x85, 0x15, 0x9a, 0x32, 0x31, 0xf4, 0x89, 0x27, 0x26, + 0x49, 0x9a, 0x98, 0x2c, 0x93, 0x1f, 0x98, 0x13, 0xb1, 0x0c, 0xe5, 0x15, 0x58, 0xf5, 0xf1, 0xba, + 0xb7, 0x78, 0x86, 0x9f, 0x88, 0x2e, 0x77, 0x85, 0x5f, 0xe7, 0x7f, 0x2f, 0x78, 0x16, 0xf2, 0xb0, + 0xa6, 0x30, 0x58, 0x48, 0xf8, 0x81, 0x60, 0xa1, 0xf8, 0x33, 0xc3, 0x42, 0x7e, 0x54, 0x22, 0x11, + 0x44, 0x25, 0xfe, 0x26, 0x78, 0x6b, 0xe2, 0x82, 0x3c, 0x4d, 0xbd, 0x85, 0x39, 0x4e, 0x40, 0xbf, + 0x49, 0x52, 0xda, 0xd3, 0x3b, 0x1c, 0x0d, 0x20, 0x9f, 0x84, 0xcb, 0x8d, 0xcf, 0x59, 0x1e, 0x7e, + 0x5d, 0x88, 0x81, 0xa5, 0x7e, 0x1c, 0x62, 0x10, 0x21, 0xf1, 0x04, 0xb3, 0xa2, 0x4a, 0x5e, 0x26, + 0x9f, 0x84, 0x8f, 0x3a, 0x1f, 0x4f, 0xe1, 0x58, 0x03, 0xbd, 0x01, 0x59, 0x5a, 0x31, 0x53, 0x74, + 0xc3, 0xe2, 0x85, 0x94, 0x40, 0x72, 0xcb, 0xca, 0x66, 0x5b, 0x87, 0x84, 0xe7, 0xc0, 0xb0, 0x68, + 0x22, 0x46, 0xbf, 0x7c, 0x39, 0x67, 0x36, 0x90, 0x73, 0x5e, 0x84, 0x2c, 0x19, 0xbd, 0x65, 0xa8, + 0x4d, 0x5c, 0x02, 0x3a, 0x50, 0x8f, 0x20, 0xfd, 0x3a, 0x0e, 0xcb, 0x63, 0xf1, 0x38, 0x74, 0xee, + 0x8e, 0x4b, 0xc6, 0x7d, 0xa0, 0xd7, 0x7c, 0xf6, 0x58, 0x07, 0xe8, 0xa8, 0x96, 0xf2, 0x91, 0x3a, + 0xb0, 0x71, 0x8b, 0x1b, 0xc5, 0x47, 0x21, 0xc9, 0x25, 0x69, 0x0d, 0x2d, 0xdc, 0xe2, 0xf8, 0x9b, + 0xdb, 0x46, 0x75, 0x48, 0xe3, 0x13, 0x3c, 0xb0, 0xad, 0xd2, 0x12, 0x5d, 0xf6, 0xb3, 0x93, 0x80, + 0x08, 0xf9, 0x79, 0xa7, 0x44, 0x16, 0xfb, 0xbb, 0x6f, 0x36, 0x44, 0xc6, 0xfd, 0xb2, 0xde, 0xd7, + 0x6c, 0xdc, 0x37, 0xec, 0x53, 0x99, 0xcb, 0x07, 0xad, 0x90, 0x19, 0xb3, 0x02, 0x45, 0x82, 0xf3, + 0x0e, 0xc0, 0x43, 0x6c, 0xaa, 0xe9, 0xa6, 0x66, 0x9f, 0xca, 0x85, 0x3e, 0xee, 0x1b, 0xba, 0xde, + 0x53, 0xd8, 0x1e, 0xaf, 0x40, 0x31, 0x98, 0x7e, 0xa0, 0xe7, 0xa0, 0x60, 0x62, 0x5b, 0xd5, 0x06, + 0x4a, 0xe0, 0x1a, 0x94, 0x67, 0x44, 0xb6, 0xa7, 0xf6, 0x92, 0x19, 0x41, 0x8c, 0xef, 0x25, 0x33, + 0x71, 0x31, 0x21, 0x1d, 0xc2, 0x99, 0xd0, 0xf4, 0x03, 0xbd, 0x0e, 0x59, 0x2f, 0x73, 0x11, 0xe8, + 0x6c, 0xa7, 0x60, 0x6d, 0x1e, 0xaf, 0xf4, 0x3b, 0xc1, 0x53, 0x19, 0x44, 0xef, 0x6a, 0x90, 0x66, + 0xe7, 0x3e, 0x5d, 0xc9, 0xe2, 0x94, 0x43, 0x3f, 0x20, 0xb7, 0xc5, 0x8e, 0x77, 0x99, 0x0b, 0x4b, + 0xef, 0x41, 0x9a, 0x51, 0x50, 0x0e, 0x96, 0x1e, 0xee, 0xdf, 0xdf, 0x3f, 0x78, 0x77, 0x5f, 0x8c, + 0x21, 0x80, 0x74, 0xa5, 0x5a, 0xad, 0x1d, 0x36, 0x44, 0x01, 0x65, 0x21, 0x55, 0xd9, 0x39, 0x90, + 0x1b, 0x62, 0x9c, 0x90, 0xe5, 0xda, 0x5e, 0xad, 0xda, 0x10, 0x13, 0x68, 0x05, 0x0a, 0xec, 0x5b, + 0xb9, 0x7b, 0x20, 0xbf, 0x5d, 0x69, 0x88, 0x49, 0x1f, 0xe9, 0xa8, 0xb6, 0x7f, 0xa7, 0x26, 0x8b, 0x29, 0xe9, 0x3f, 0xe0, 0x7c, 0x64, 0xaa, 0xe3, 0x41, 0x73, 0x82, 0x0f, 0x9a, 0x93, 0xbe, 0x88, - 0x93, 0x1b, 0x41, 0x54, 0xfe, 0x82, 0xf6, 0xc7, 0x26, 0x7e, 0x7d, 0x81, 0xe4, 0x67, 0x6c, 0xf6, + 0x93, 0x1b, 0x41, 0x54, 0xfe, 0x82, 0xf6, 0xc6, 0x26, 0x7e, 0x7d, 0x81, 0xe4, 0x67, 0x6c, 0xf6, 0xe4, 0x26, 0x6b, 0x62, 0x16, 0xe4, 0x68, 0xdf, 0xec, 0x04, 0x2a, 0xc8, 0x05, 0x4e, 0xa5, 0x42, 0x16, 0x63, 0xfb, 0x00, 0x37, 0x6d, 0x85, 0x39, 0x91, 0x45, 0xaf, 0x93, 0x59, 0xc2, 0x46, 0xa8, - 0xc7, 0x8c, 0x28, 0xbd, 0xbf, 0x90, 0x2d, 0xb3, 0x90, 0x92, 0xab, 0x75, 0xf9, 0xb1, 0x98, 0x40, - 0x08, 0x8a, 0xf4, 0x53, 0x39, 0x3e, 0xd8, 0x39, 0x3a, 0xae, 0x1d, 0x12, 0x5b, 0xae, 0xc2, 0xb2, - 0x63, 0x4b, 0x87, 0x98, 0x92, 0xae, 0x91, 0x6b, 0x54, 0x68, 0xf2, 0x35, 0x79, 0xa9, 0x96, 0x7e, - 0x29, 0xf8, 0xb9, 0x83, 0x09, 0xd4, 0x21, 0xa4, 0x2d, 0x5b, 0xb5, 0x87, 0x16, 0x37, 0xe2, 0xeb, - 0xf3, 0x66, 0x63, 0x5b, 0xce, 0xc7, 0x31, 0x15, 0x97, 0xb9, 0x1a, 0xe9, 0x26, 0x14, 0x83, 0xbf, - 0x44, 0xdb, 0xc0, 0x73, 0xa2, 0xb8, 0x74, 0x1b, 0xd0, 0x64, 0x92, 0x16, 0x02, 0x30, 0x08, 0x61, - 0x00, 0xc3, 0xaf, 0xe8, 0xcd, 0x36, 0x32, 0x21, 0x43, 0xef, 0x8c, 0x4d, 0xf2, 0xd6, 0x22, 0xe9, - 0xdc, 0x16, 0xa3, 0x8d, 0x4d, 0xf3, 0x06, 0xe4, 0xfd, 0xf4, 0xf9, 0x26, 0xf9, 0x5d, 0xdc, 0xdb, - 0xc4, 0x41, 0x24, 0xc4, 0x3b, 0x02, 0x85, 0xef, 0x79, 0x04, 0xbe, 0x09, 0x60, 0x8f, 0x78, 0x26, - 0xe8, 0xc4, 0xd1, 0x4b, 0x21, 0x08, 0x33, 0x6e, 0xd6, 0x47, 0x7c, 0x13, 0x64, 0x6d, 0xfe, 0x65, - 0xa1, 0x63, 0x3f, 0x2c, 0x34, 0xa4, 0x31, 0xd6, 0xe2, 0x90, 0xc9, 0xbc, 0xc1, 0xd8, 0x83, 0x8f, - 0x18, 0xd9, 0x42, 0x8f, 0xe1, 0xdc, 0x58, 0xa2, 0xe0, 0xaa, 0x4e, 0xce, 0x9b, 0x2f, 0x9c, 0x09, - 0xe6, 0x0b, 0x8e, 0x6a, 0x7f, 0xb4, 0x4f, 0x05, 0xa3, 0xfd, 0x5b, 0x70, 0x71, 0x5a, 0xb6, 0x8b, - 0x2e, 0x01, 0xe0, 0x01, 0x09, 0x0e, 0x2d, 0x0f, 0x51, 0xc8, 0x72, 0x4a, 0x7d, 0x24, 0xdd, 0x83, - 0x52, 0x54, 0x26, 0x8b, 0xae, 0x41, 0x92, 0x5e, 0x37, 0x58, 0xb6, 0x73, 0x2e, 0x04, 0x03, 0x21, - 0x7c, 0x32, 0x65, 0x92, 0x7e, 0xe6, 0x77, 0xce, 0x10, 0x60, 0xe3, 0xfe, 0x98, 0x73, 0xde, 0x58, - 0x24, 0xe7, 0xdd, 0x1a, 0x73, 0xcb, 0xcb, 0x90, 0xe6, 0x0e, 0x09, 0x90, 0x56, 0x1b, 0x16, 0x1e, - 0xd8, 0x62, 0x8c, 0x38, 0xa7, 0x61, 0x62, 0xda, 0x10, 0xa4, 0xc7, 0x00, 0x1e, 0x6c, 0x46, 0x4e, - 0x5e, 0x53, 0x1f, 0x0e, 0x5a, 0xb4, 0xf3, 0x94, 0xcc, 0x1a, 0xe8, 0x26, 0xa4, 0xfc, 0x28, 0xcf, - 0x64, 0x88, 0x22, 0x9d, 0xfb, 0x60, 0x37, 0xc6, 0x2d, 0x69, 0x80, 0x26, 0x4b, 0x17, 0x11, 0x5d, - 0xbc, 0x15, 0xec, 0xe2, 0x72, 0x64, 0x11, 0x24, 0xbc, 0xab, 0x8f, 0x21, 0x45, 0x77, 0x04, 0x49, - 0x46, 0x68, 0xbd, 0x8c, 0x67, 0xd1, 0xe4, 0x1b, 0xfd, 0x3f, 0x80, 0x6a, 0xdb, 0xa6, 0xd6, 0x18, - 0x7a, 0x1d, 0x6c, 0x84, 0xef, 0xa8, 0x1d, 0x87, 0x6f, 0xf7, 0x22, 0xdf, 0x5a, 0x6b, 0x9e, 0xa8, - 0x6f, 0x7b, 0xf9, 0x14, 0x4a, 0x07, 0x50, 0x0c, 0xca, 0x3a, 0x79, 0x1f, 0x1b, 0x43, 0x30, 0xef, - 0x63, 0x69, 0x3c, 0xcf, 0xfb, 0xdc, 0xac, 0x31, 0xc1, 0x8a, 0x82, 0xb4, 0x21, 0xfd, 0x28, 0x0e, - 0x79, 0xff, 0x86, 0xfc, 0xd7, 0x4b, 0xcd, 0xa4, 0x9f, 0x08, 0x90, 0x71, 0xa7, 0x1f, 0xac, 0x10, - 0x06, 0x4a, 0xaa, 0xcc, 0x7a, 0x71, 0x7f, 0x59, 0x8f, 0x15, 0x50, 0x13, 0x6e, 0x01, 0xf5, 0xb6, - 0x9b, 0x16, 0x44, 0xe1, 0x69, 0x7e, 0x5b, 0x73, 0xaf, 0x72, 0xb2, 0xa0, 0xdb, 0x90, 0x75, 0x4f, - 0x35, 0x72, 0x19, 0x73, 0x20, 0x55, 0x81, 0x9f, 0x2d, 0x1c, 0x10, 0x5f, 0x83, 0x94, 0xa1, 0x7f, - 0xc4, 0x6b, 0x86, 0x09, 0x99, 0x35, 0xa4, 0x16, 0x2c, 0x8f, 0x1d, 0x89, 0xe8, 0x36, 0x2c, 0x19, - 0xc3, 0x86, 0xe2, 0x38, 0xc7, 0x18, 0xf0, 0xec, 0xa4, 0xf9, 0xc3, 0x46, 0x4f, 0x6b, 0xde, 0xc7, - 0xa7, 0xce, 0x60, 0x8c, 0x61, 0xe3, 0x3e, 0xf3, 0x21, 0xd6, 0x4b, 0xdc, 0xdf, 0xcb, 0xcf, 0x05, - 0xc8, 0x38, 0x7b, 0x02, 0xfd, 0x17, 0x64, 0xdd, 0xe3, 0xd6, 0x2d, 0xfa, 0x47, 0x9e, 0xd3, 0x5c, - 0xbf, 0x27, 0x82, 0x76, 0x9c, 0xd7, 0x0a, 0x5a, 0x4b, 0x69, 0xf7, 0x54, 0xe6, 0x4b, 0xc5, 0xa0, - 0xcd, 0xd8, 0x81, 0x4c, 0xe3, 0xd4, 0xde, 0x9d, 0xbb, 0x3d, 0xb5, 0x23, 0xe7, 0xa8, 0xcc, 0x5e, - 0x8b, 0x34, 0x78, 0xc6, 0xfb, 0x57, 0x01, 0xc4, 0xf1, 0x1d, 0xfb, 0xbd, 0x47, 0x37, 0x19, 0xfe, - 0x13, 0x21, 0xe1, 0x1f, 0x6d, 0xc3, 0xaa, 0xcb, 0xa1, 0x58, 0x5a, 0x67, 0xa0, 0xda, 0x43, 0x13, - 0x73, 0xa8, 0x1e, 0xb9, 0x3f, 0x1d, 0x3b, 0xbf, 0x4c, 0xce, 0x3a, 0xf5, 0x8c, 0xb3, 0xfe, 0x34, - 0x0e, 0x39, 0x5f, 0xe1, 0x00, 0xfd, 0xa7, 0xef, 0x30, 0x2a, 0x86, 0x44, 0x4c, 0x1f, 0xaf, 0x57, - 0xc0, 0x0f, 0x9a, 0x29, 0xbe, 0xb8, 0x99, 0xa2, 0xca, 0x33, 0x4e, 0x1d, 0x22, 0xb9, 0x70, 0x1d, - 0xe2, 0x65, 0x40, 0xb6, 0x6e, 0xab, 0x3d, 0xe5, 0x44, 0xb7, 0xb5, 0x41, 0x47, 0x61, 0x6e, 0xc8, - 0x8e, 0x0e, 0x91, 0xfe, 0xf2, 0x88, 0xfe, 0x70, 0x44, 0x3d, 0xf2, 0x13, 0x01, 0x32, 0xee, 0x75, - 0x64, 0xd1, 0xf2, 0xfe, 0x59, 0x48, 0xf3, 0x8c, 0x9b, 0xd5, 0xf7, 0x79, 0x2b, 0xb4, 0xe0, 0x52, - 0x86, 0x4c, 0x1f, 0xdb, 0x2a, 0x3d, 0x07, 0x59, 0xb4, 0x77, 0xdb, 0x57, 0x6f, 0x41, 0xce, 0xf7, - 0x34, 0x82, 0x1c, 0x8d, 0x07, 0xd5, 0x77, 0xc5, 0x58, 0x79, 0xe9, 0xb3, 0x2f, 0x37, 0x13, 0x07, - 0xf8, 0x23, 0xb2, 0x9b, 0xe5, 0x6a, 0xa5, 0x56, 0xad, 0xdc, 0x17, 0x85, 0x72, 0xee, 0xb3, 0x2f, - 0x37, 0x97, 0x64, 0x4c, 0x01, 0xe9, 0xab, 0xf7, 0x61, 0x79, 0x6c, 0x61, 0x82, 0xe9, 0x1c, 0x82, - 0xe2, 0x9d, 0x87, 0x47, 0x0f, 0xf6, 0x2a, 0x3b, 0xf5, 0xaa, 0xf2, 0xe8, 0xb0, 0x5e, 0x15, 0x05, - 0x74, 0x0e, 0x56, 0x1f, 0xec, 0xdd, 0xab, 0xd5, 0x95, 0xca, 0x83, 0xbd, 0xea, 0x41, 0x5d, 0xd9, - 0xa9, 0xd7, 0x77, 0x2a, 0xf7, 0xc5, 0xf8, 0xf5, 0xbf, 0x14, 0x20, 0xb9, 0xb3, 0x5b, 0xd9, 0x43, - 0x15, 0x48, 0x52, 0x88, 0x68, 0xea, 0xfb, 0xd1, 0xf2, 0xf4, 0xd2, 0x02, 0xba, 0x0b, 0x29, 0x8a, - 0x1e, 0xa1, 0xe9, 0x0f, 0x4a, 0xcb, 0x33, 0x6a, 0x0d, 0x64, 0x30, 0x74, 0x47, 0x4e, 0x7d, 0x61, - 0x5a, 0x9e, 0x5e, 0x7a, 0x40, 0x0f, 0x60, 0xc9, 0x01, 0x0f, 0x66, 0x3d, 0xfb, 0x2c, 0xcf, 0xac, - 0x07, 0x90, 0xa9, 0x31, 0x10, 0x66, 0xfa, 0xe3, 0xd3, 0xf2, 0x8c, 0xa2, 0x04, 0xda, 0x83, 0x34, - 0xbf, 0xa6, 0xcf, 0x78, 0x4f, 0x5a, 0x9e, 0x55, 0x66, 0x40, 0x32, 0x64, 0x3d, 0x78, 0x6b, 0xf6, - 0x93, 0xda, 0xf2, 0x1c, 0xf5, 0x16, 0xf4, 0x1e, 0x14, 0x82, 0x10, 0xc0, 0x7c, 0x6f, 0x56, 0xcb, - 0x73, 0x16, 0x34, 0x88, 0xfe, 0x20, 0x1e, 0x30, 0xdf, 0x1b, 0xd6, 0xf2, 0x9c, 0xf5, 0x0d, 0xf4, - 0x01, 0xac, 0x4c, 0xde, 0xd7, 0xe7, 0x7f, 0xd2, 0x5a, 0x5e, 0xa0, 0xe2, 0x81, 0xfa, 0x80, 0x42, - 0xee, 0xf9, 0x0b, 0xbc, 0x70, 0x2d, 0x2f, 0x52, 0x00, 0x41, 0x2d, 0x58, 0x1e, 0xbf, 0x3c, 0xcf, - 0xfb, 0xe2, 0xb5, 0x3c, 0x77, 0x31, 0x84, 0xf5, 0x12, 0xbc, 0x74, 0xcf, 0xfb, 0x02, 0xb6, 0x3c, - 0x77, 0x6d, 0x04, 0x3d, 0x04, 0xf0, 0xdd, 0x9b, 0xe7, 0x78, 0x11, 0x5b, 0x9e, 0xa7, 0x4a, 0x82, - 0x0c, 0x58, 0x0d, 0xbb, 0x50, 0x2f, 0xf2, 0x40, 0xb6, 0xbc, 0x50, 0xf1, 0x84, 0xf8, 0x73, 0xf0, - 0x6a, 0x3c, 0xdf, 0x83, 0xd9, 0xf2, 0x9c, 0x55, 0x14, 0x64, 0xc1, 0x5a, 0xe8, 0x75, 0x70, 0xa1, - 0xe7, 0xb3, 0xe5, 0xc5, 0x2a, 0x2b, 0xa8, 0x03, 0xe2, 0xc4, 0x25, 0x72, 0xee, 0xd7, 0xb4, 0xe5, - 0xf9, 0x6b, 0x2c, 0x74, 0xbd, 0x42, 0xee, 0x98, 0x8b, 0x3c, 0xae, 0x2d, 0x2f, 0x54, 0x74, 0xd9, - 0xdd, 0xf9, 0xea, 0xdb, 0x75, 0xe1, 0xeb, 0x6f, 0xd7, 0x85, 0x3f, 0x7f, 0xbb, 0x2e, 0x7c, 0xfe, - 0x74, 0x3d, 0xf6, 0xf5, 0xd3, 0xf5, 0xd8, 0x1f, 0x9f, 0xae, 0xc7, 0xfe, 0xe7, 0xc5, 0x8e, 0x66, - 0x77, 0x87, 0x8d, 0xad, 0xa6, 0xde, 0xdf, 0x6e, 0xea, 0x7d, 0x6c, 0x37, 0xda, 0xb6, 0xf7, 0xe1, - 0xfd, 0xcd, 0xa4, 0x91, 0xa6, 0x19, 0xc9, 0x8d, 0xbf, 0x07, 0x00, 0x00, 0xff, 0xff, 0x50, 0x14, - 0x49, 0x01, 0x86, 0x32, 0x00, 0x00, + 0x47, 0x8c, 0x28, 0xbd, 0xbf, 0x90, 0x2d, 0xb3, 0x90, 0x92, 0x6b, 0x0d, 0xf9, 0xb1, 0x98, 0x40, + 0x08, 0x8a, 0xf4, 0x53, 0x39, 0xda, 0xaf, 0x1c, 0x1e, 0xd5, 0x0f, 0x88, 0x2d, 0x57, 0x61, 0xd9, + 0xb1, 0xa5, 0x43, 0x4c, 0x49, 0xd7, 0xc8, 0x35, 0x2a, 0x34, 0xf9, 0x9a, 0xbc, 0x54, 0x4b, 0xbf, + 0x14, 0xfc, 0xdc, 0xc1, 0x04, 0xea, 0x00, 0xd2, 0x96, 0xad, 0xda, 0x43, 0x8b, 0x1b, 0xf1, 0xf5, + 0x79, 0xb3, 0xb1, 0x2d, 0xe7, 0xe3, 0x88, 0x8a, 0xcb, 0x5c, 0x8d, 0x74, 0x13, 0x8a, 0xc1, 0x5f, + 0xa2, 0x6d, 0xe0, 0x39, 0x51, 0x5c, 0xba, 0x0d, 0x68, 0x32, 0x49, 0x0b, 0x01, 0x18, 0x84, 0x30, + 0x80, 0xe1, 0x57, 0xf4, 0x66, 0x1b, 0x99, 0x90, 0xa1, 0x77, 0xc6, 0x26, 0x79, 0x6b, 0x91, 0x74, + 0x6e, 0x8b, 0xd1, 0xc6, 0xa6, 0x79, 0x03, 0xf2, 0x7e, 0xfa, 0x7c, 0x93, 0xfc, 0x2e, 0xee, 0x6d, + 0xe2, 0x20, 0x12, 0xe2, 0x1d, 0x81, 0xc2, 0xf7, 0x3c, 0x02, 0xdf, 0x04, 0xb0, 0x47, 0x3c, 0x13, + 0x74, 0xe2, 0xe8, 0xa5, 0x10, 0x84, 0x19, 0x37, 0x1b, 0x23, 0xbe, 0x09, 0xb2, 0x36, 0xff, 0xb2, + 0xd0, 0x91, 0x1f, 0x16, 0x1a, 0xd2, 0x18, 0x6b, 0x71, 0xc8, 0x64, 0xde, 0x60, 0xec, 0xc1, 0x47, + 0x8c, 0x6c, 0xa1, 0xc7, 0x70, 0x6e, 0x2c, 0x51, 0x70, 0x55, 0x27, 0xe7, 0xcd, 0x17, 0xce, 0x04, + 0xf3, 0x05, 0x47, 0xb5, 0x3f, 0xda, 0xa7, 0x82, 0xd1, 0xfe, 0x2d, 0xb8, 0x38, 0x2d, 0xdb, 0x45, + 0x97, 0x00, 0xf0, 0x80, 0x04, 0x87, 0x96, 0x87, 0x28, 0x64, 0x39, 0xa5, 0x31, 0x92, 0xee, 0x41, + 0x29, 0x2a, 0x93, 0x45, 0xd7, 0x20, 0x49, 0xaf, 0x1b, 0x2c, 0xdb, 0x39, 0x17, 0x82, 0x81, 0x10, + 0x3e, 0x99, 0x32, 0x49, 0x3f, 0xf3, 0x3b, 0x67, 0x08, 0xb0, 0x71, 0x7f, 0xcc, 0x39, 0x6f, 0x2c, + 0x92, 0xf3, 0x6e, 0x8d, 0xb9, 0xe5, 0x65, 0x48, 0x73, 0x87, 0x24, 0x3e, 0xb8, 0x73, 0x54, 0xdb, + 0x6f, 0x88, 0x31, 0xe2, 0x9c, 0x87, 0x72, 0x8d, 0x36, 0x04, 0xe9, 0x31, 0x80, 0x07, 0x9b, 0x91, + 0x93, 0xd7, 0xd4, 0x87, 0x83, 0x16, 0xed, 0x3c, 0x25, 0xb3, 0x06, 0xba, 0x09, 0x29, 0x3f, 0xca, + 0x33, 0x19, 0xa2, 0x48, 0xe7, 0x3e, 0xd8, 0x8d, 0x71, 0x4b, 0x1a, 0xa0, 0xc9, 0xd2, 0x45, 0x44, + 0x17, 0x6f, 0x05, 0xbb, 0xb8, 0x1c, 0x59, 0x04, 0x09, 0xef, 0xea, 0x63, 0x48, 0xd1, 0x1d, 0x41, + 0x92, 0x11, 0x5a, 0x2f, 0xe3, 0x59, 0x34, 0xf9, 0x46, 0xff, 0x0f, 0xa0, 0xda, 0xb6, 0xa9, 0x1d, + 0x0f, 0xbd, 0x0e, 0x36, 0xc2, 0x77, 0x54, 0xc5, 0xe1, 0xdb, 0xb9, 0xc8, 0xb7, 0xd6, 0x9a, 0x27, + 0xea, 0xdb, 0x5e, 0x3e, 0x85, 0xd2, 0x3e, 0x14, 0x83, 0xb2, 0x4e, 0xde, 0xc7, 0xc6, 0x10, 0xcc, + 0xfb, 0x58, 0x1a, 0xcf, 0xf3, 0x3e, 0x37, 0x6b, 0x4c, 0xb0, 0xa2, 0x20, 0x6d, 0x48, 0x3f, 0x8a, + 0x43, 0xde, 0xbf, 0x21, 0xff, 0xf5, 0x52, 0x33, 0xe9, 0x27, 0x02, 0x64, 0xdc, 0xe9, 0x07, 0x2b, + 0x84, 0x81, 0x92, 0x2a, 0xb3, 0x5e, 0xdc, 0x5f, 0xd6, 0x63, 0x05, 0xd4, 0x84, 0x5b, 0x40, 0xbd, + 0xed, 0xa6, 0x05, 0x51, 0x78, 0x9a, 0xdf, 0xd6, 0xdc, 0xab, 0x9c, 0x2c, 0xe8, 0x36, 0x64, 0xdd, + 0x53, 0x8d, 0x5c, 0xc6, 0x1c, 0x48, 0x55, 0xe0, 0x67, 0x0b, 0x07, 0xc4, 0xd7, 0x20, 0x65, 0xe8, + 0x1f, 0xf1, 0x9a, 0x61, 0x42, 0x66, 0x0d, 0xa9, 0x05, 0xcb, 0x63, 0x47, 0x22, 0xba, 0x0d, 0x4b, + 0xc6, 0xf0, 0x58, 0x71, 0x9c, 0x63, 0x0c, 0x78, 0x76, 0xd2, 0xfc, 0xe1, 0x71, 0x4f, 0x6b, 0xde, + 0xc7, 0xa7, 0xce, 0x60, 0x8c, 0xe1, 0xf1, 0x7d, 0xe6, 0x43, 0xac, 0x97, 0xb8, 0xbf, 0x97, 0x9f, + 0x0b, 0x90, 0x71, 0xf6, 0x04, 0xfa, 0x2f, 0xc8, 0xba, 0xc7, 0xad, 0x5b, 0xf4, 0x8f, 0x3c, 0xa7, + 0xb9, 0x7e, 0x4f, 0x04, 0x55, 0x9c, 0xd7, 0x0a, 0x5a, 0x4b, 0x69, 0xf7, 0x54, 0xe6, 0x4b, 0xc5, + 0xa0, 0xcd, 0xd8, 0x81, 0x4c, 0xe3, 0xd4, 0xee, 0x9d, 0xbb, 0x3d, 0xb5, 0x23, 0xe7, 0xa8, 0xcc, + 0x6e, 0x8b, 0x34, 0x78, 0xc6, 0xfb, 0x57, 0x01, 0xc4, 0xf1, 0x1d, 0xfb, 0xbd, 0x47, 0x37, 0x19, + 0xfe, 0x13, 0x21, 0xe1, 0x1f, 0x6d, 0xc3, 0xaa, 0xcb, 0xa1, 0x58, 0x5a, 0x67, 0xa0, 0xda, 0x43, + 0x13, 0x73, 0xa8, 0x1e, 0xb9, 0x3f, 0x1d, 0x39, 0xbf, 0x4c, 0xce, 0x3a, 0xf5, 0x8c, 0xb3, 0xfe, + 0x34, 0x0e, 0x39, 0x5f, 0xe1, 0x00, 0xfd, 0xa7, 0xef, 0x30, 0x2a, 0x86, 0x44, 0x4c, 0x1f, 0xaf, + 0x57, 0xc0, 0x0f, 0x9a, 0x29, 0xbe, 0xb8, 0x99, 0xa2, 0xca, 0x33, 0x4e, 0x1d, 0x22, 0xb9, 0x70, + 0x1d, 0xe2, 0x65, 0x40, 0xb6, 0x6e, 0xab, 0x3d, 0xe5, 0x44, 0xb7, 0xb5, 0x41, 0x47, 0x61, 0x6e, + 0xc8, 0x8e, 0x0e, 0x91, 0xfe, 0xf2, 0x88, 0xfe, 0x70, 0x48, 0x3d, 0xf2, 0x13, 0x01, 0x32, 0xee, + 0x75, 0x64, 0xd1, 0xf2, 0xfe, 0x59, 0x48, 0xf3, 0x8c, 0x9b, 0xd5, 0xf7, 0x79, 0x2b, 0xb4, 0xe0, + 0x52, 0x86, 0x4c, 0x1f, 0xdb, 0x2a, 0x3d, 0x07, 0x59, 0xb4, 0x77, 0xdb, 0x57, 0x6f, 0x41, 0xce, + 0xf7, 0x34, 0x82, 0x1c, 0x8d, 0xfb, 0xb5, 0x77, 0xc5, 0x58, 0x79, 0xe9, 0xb3, 0x2f, 0x37, 0x13, + 0xfb, 0xf8, 0x23, 0xb2, 0x9b, 0xe5, 0x5a, 0xb5, 0x5e, 0xab, 0xde, 0x17, 0x85, 0x72, 0xee, 0xb3, + 0x2f, 0x37, 0x97, 0x64, 0x4c, 0x01, 0xe9, 0xab, 0xf7, 0x61, 0x79, 0x6c, 0x61, 0x82, 0xe9, 0x1c, + 0x82, 0xe2, 0x9d, 0x87, 0x87, 0x0f, 0x76, 0xab, 0x95, 0x46, 0x4d, 0x79, 0x74, 0xd0, 0xa8, 0x89, + 0x02, 0x3a, 0x07, 0xab, 0x0f, 0x76, 0xef, 0xd5, 0x1b, 0x4a, 0xf5, 0xc1, 0x6e, 0x6d, 0xbf, 0xa1, + 0x54, 0x1a, 0x8d, 0x4a, 0xf5, 0xbe, 0x18, 0xbf, 0xfe, 0x97, 0x02, 0x24, 0x2b, 0x3b, 0xd5, 0x5d, + 0x54, 0x85, 0x24, 0x85, 0x88, 0xa6, 0xbe, 0x1f, 0x2d, 0x4f, 0x2f, 0x2d, 0xa0, 0xbb, 0x90, 0xa2, + 0xe8, 0x11, 0x9a, 0xfe, 0xa0, 0xb4, 0x3c, 0xa3, 0xd6, 0x40, 0x06, 0x43, 0x77, 0xe4, 0xd4, 0x17, + 0xa6, 0xe5, 0xe9, 0xa5, 0x07, 0xf4, 0x00, 0x96, 0x1c, 0xf0, 0x60, 0xd6, 0xb3, 0xcf, 0xf2, 0xcc, + 0x7a, 0x00, 0x99, 0x1a, 0x03, 0x61, 0xa6, 0x3f, 0x3e, 0x2d, 0xcf, 0x28, 0x4a, 0xa0, 0x5d, 0x48, + 0xf3, 0x6b, 0xfa, 0x8c, 0xf7, 0xa4, 0xe5, 0x59, 0x65, 0x06, 0x24, 0x43, 0xd6, 0x83, 0xb7, 0x66, + 0x3f, 0xa9, 0x2d, 0xcf, 0x51, 0x6f, 0x41, 0xef, 0x41, 0x21, 0x08, 0x01, 0xcc, 0xf7, 0x66, 0xb5, + 0x3c, 0x67, 0x41, 0x83, 0xe8, 0x0f, 0xe2, 0x01, 0xf3, 0xbd, 0x61, 0x2d, 0xcf, 0x59, 0xdf, 0x40, + 0x1f, 0xc0, 0xca, 0xe4, 0x7d, 0x7d, 0xfe, 0x27, 0xad, 0xe5, 0x05, 0x2a, 0x1e, 0xa8, 0x0f, 0x28, + 0xe4, 0x9e, 0xbf, 0xc0, 0x0b, 0xd7, 0xf2, 0x22, 0x05, 0x10, 0xd4, 0x82, 0xe5, 0xf1, 0xcb, 0xf3, + 0xbc, 0x2f, 0x5e, 0xcb, 0x73, 0x17, 0x43, 0x58, 0x2f, 0xc1, 0x4b, 0xf7, 0xbc, 0x2f, 0x60, 0xcb, + 0x73, 0xd7, 0x46, 0xd0, 0x43, 0x00, 0xdf, 0xbd, 0x79, 0x8e, 0x17, 0xb1, 0xe5, 0x79, 0xaa, 0x24, + 0xc8, 0x80, 0xd5, 0xb0, 0x0b, 0xf5, 0x22, 0x0f, 0x64, 0xcb, 0x0b, 0x15, 0x4f, 0x88, 0x3f, 0x07, + 0xaf, 0xc6, 0xf3, 0x3d, 0x98, 0x2d, 0xcf, 0x59, 0x45, 0x41, 0x16, 0xac, 0x85, 0x5e, 0x07, 0x17, + 0x7a, 0x3e, 0x5b, 0x5e, 0xac, 0xb2, 0x82, 0x3a, 0x20, 0x4e, 0x5c, 0x22, 0xe7, 0x7e, 0x4d, 0x5b, + 0x9e, 0xbf, 0xc6, 0x42, 0xd7, 0x2b, 0xe4, 0x8e, 0xb9, 0xc8, 0xe3, 0xda, 0xf2, 0x42, 0x45, 0x97, + 0x9d, 0xca, 0x57, 0xdf, 0xae, 0x0b, 0x5f, 0x7f, 0xbb, 0x2e, 0xfc, 0xf9, 0xdb, 0x75, 0xe1, 0xf3, + 0xa7, 0xeb, 0xb1, 0xaf, 0x9f, 0xae, 0xc7, 0xfe, 0xf8, 0x74, 0x3d, 0xf6, 0x3f, 0x2f, 0x76, 0x34, + 0xbb, 0x3b, 0x3c, 0xde, 0x6a, 0xea, 0xfd, 0xed, 0xa6, 0xde, 0xc7, 0xf6, 0x71, 0xdb, 0xf6, 0x3e, + 0xbc, 0xbf, 0x99, 0x1c, 0xa7, 0x69, 0x46, 0x72, 0xe3, 0xef, 0x01, 0x00, 0x00, 0xff, 0xff, 0x89, + 0xf5, 0xc0, 0xc9, 0x86, 0x32, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/config/config.go b/config/config.go index 4dc47ddebe4..e1c37ac1fec 100644 --- a/config/config.go +++ b/config/config.go @@ -856,7 +856,7 @@ type OracleConfig struct { // DefaultOracleConfig returns a default configuration for the CometBFT oracle service func DefaultOracleConfig() *OracleConfig { return &OracleConfig{ - MaxGossipVoteAge: 3, // keep all gossipVotes from 3 blocks behind + MaxGossipVoteAge: 2, // keep all gossipVotes from 3 blocks behind SignInterval: 100 * time.Millisecond, // 0.1s GossipInterval: 100 * time.Millisecond, // 0.1s PruneInterval: 500 * time.Millisecond, // 0.5s diff --git a/oracle/reactor.go b/oracle/reactor.go index 8db993b4564..81cad735894 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -228,12 +228,5 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() time.Sleep(interval) - - // select { - // case <-peer.Quit(): - // return - // case <-oracleR.Quit(): - // return - // } } } diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 582caddb204..2f3d2ba3bae 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -92,9 +92,7 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { } pruneInterval := oracleInfo.Config.PruneInterval if pruneInterval == 0 { - if pruneInterval == 0 { - pruneInterval = 500 * time.Millisecond - } + pruneInterval = 500 * time.Millisecond } ticker := time.Tick(pruneInterval) @@ -151,15 +149,6 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { }(oracleInfo) } -func contains(s []int64, e int64) bool { - for _, a := range s { - if a == e { - return true - } - } - return false -} - // Run run oracles func Run(oracleInfo *types.OracleInfo, consensusState *cs.State) { log.Info("[oracle] Service started.") diff --git a/proto/buf.lock b/proto/buf.lock index 95f54f6f526..4dcc512cc89 100644 --- a/proto/buf.lock +++ b/proto/buf.lock @@ -1,18 +1,8 @@ # Generated by buf. DO NOT EDIT. version: v1 deps: - - remote: buf.build - owner: cosmos - repository: cosmos-proto - commit: 1935555c206d4afb9e94615dfd0fad31 - digest: shake256:c74d91a3ac7ae07d579e90eee33abf9b29664047ac8816500cf22c081fec0d72d62c89ce0bebafc1f6fec7aa5315be72606717740ca95007248425102c365377 - remote: buf.build owner: cosmos repository: gogo-proto - commit: 88ef6483f90f478fb938c37dde52ece3 - digest: shake256:89c45df2aa11e0cff97b0d695436713db3d993d76792e9f8dc1ae90e6ab9a9bec55503d48ceedd6b86069ab07d3041b32001b2bfe0227fa725dd515ff381e5ba - - remote: buf.build - owner: googleapis - repository: googleapis - commit: 4ed3bc159a8b4ac68fe253218760d035 - digest: shake256:7149cf5e9955c692d381e557830555d4e93f205a0f1b8e2dfdae46d029369aa3fc1980e35df0d310f7cc3b622f93e19ad276769a283a967dd3065ddfd3a40e13 + commit: 5e5b9fdd01804356895f8f79a6f1ddc1 + digest: shake256:0b85da49e2e5f9ebc4806eae058e2f56096ff3b1c59d1fb7c190413dd15f45dd456f0b69ced9059341c80795d2b6c943de15b120a9e0308b499e43e4b5fc2952 \ No newline at end of file diff --git a/proto/buf.yaml b/proto/buf.yaml index 4e1d99fa43a..6a1383686ee 100644 --- a/proto/buf.yaml +++ b/proto/buf.yaml @@ -1,9 +1,7 @@ version: v1 -name: buf.build/Switcheo/cometbft +name: buf.build/tendermint/tendermint deps: - - buf.build/cosmos/cosmos-proto - buf.build/cosmos/gogo-proto - - buf.build/googleapis/googleapis breaking: use: - FILE @@ -11,4 +9,4 @@ lint: use: - BASIC - FILE_LOWER_SNAKE_CASE - - UNARY_RPC + - UNARY_RPC \ No newline at end of file diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto index 0ce0bd14ef4..de84f213506 100644 --- a/proto/tendermint/abci/types.proto +++ b/proto/tendermint/abci/types.proto @@ -398,8 +398,8 @@ message ResponseValidateOracleVotes { Status status = 1; enum Status { - absent = 0; - present = 1; + ABSENT = 0; + PRESENT = 1; } } From 1b1ea817bcf4aaf60f2efcf2e442a637ca0fd94a Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 28 May 2024 12:37:01 +0800 Subject: [PATCH 136/150] fix compile errors --- state/execution.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/state/execution.go b/state/execution.go index 99e4e1877fc..4f6b02bb0eb 100644 --- a/state/execution.go +++ b/state/execution.go @@ -206,10 +206,10 @@ func (blockExec *BlockExecutor) ProcessProposal( if len(txs) > 0 { res, err := blockExec.proxyApp.ValidateOracleVotes(context.TODO(), &abci.RequestValidateOracleVotes{OracleTx: txs[0]}) - if err != nil && res.Status == abci.ResponseValidateOracleVotes_absent { + if err != nil && res.Status == abci.ResponseValidateOracleVotes_ABSENT { // oracleTx is not present, continue normal processProposal flow blockExec.logger.Error("error validating oracle votes:", "err", err) - } else if err != nil && res.Status == abci.ResponseValidateOracleVotes_present { + } else if err != nil && res.Status == abci.ResponseValidateOracleVotes_PRESENT { // oracleTx is present but it is invalid, remove from txs blockExec.logger.Error("error validating oracle votes:", "err", err) return false, fmt.Errorf("processProposal: invalid oracle votes submitted: %v", err) From 8f73c09abc3291419dbe49bb0e5c322b49a9d900 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 28 May 2024 17:52:09 +0800 Subject: [PATCH 137/150] add maxOracleGossipAge as config --- config/config.go | 24 +++++++++++++++--------- config/toml.go | 7 +++++-- oracle/reactor.go | 9 +++++++-- oracle/service/runner/runner.go | 26 ++++++++++++++++++-------- 4 files changed, 45 insertions(+), 21 deletions(-) diff --git a/config/config.go b/config/config.go index e1c37ac1fec..a4a2bfb834b 100644 --- a/config/config.go +++ b/config/config.go @@ -841,8 +841,10 @@ func (cfg *MempoolConfig) ValidateBasic() error { // OracleConfig defines the configuration for the CometBFT oracle service type OracleConfig struct { - // MaxGossipVoteAge determines how long we should keep the gossip votes in terms of block height - MaxGossipVoteAge int `mapstructure:"max_gossip_vote_age"` + // MaxOracleGossipBlocksDelayed determines how long we should keep the gossip votes in terms of block height + MaxOracleGossipBlocksDelayed int `mapstructure:"max_oracle_gossip_blocks_delayed"` + // MaxOracleGossipAge determines how long we should keep the gossip votes in terms of seconds + MaxOracleGossipAge int `mapstructure:"max_oracle_gossip_age"` // Interval determines how long we should wait before batch signing votes SignInterval time.Duration `mapstructure:"sign_interval"` // Interval determines how long we should wait between gossiping of votes @@ -856,11 +858,12 @@ type OracleConfig struct { // DefaultOracleConfig returns a default configuration for the CometBFT oracle service func DefaultOracleConfig() *OracleConfig { return &OracleConfig{ - MaxGossipVoteAge: 2, // keep all gossipVotes from 3 blocks behind - SignInterval: 100 * time.Millisecond, // 0.1s - GossipInterval: 100 * time.Millisecond, // 0.1s - PruneInterval: 500 * time.Millisecond, // 0.5s - MaxGossipMsgSize: 65536, + MaxOracleGossipBlocksDelayed: 2, // keep all gossipVotes from at most 2 blocks behind + MaxOracleGossipAge: 30, // keep all gossipVotes from at most 30s ago + SignInterval: 100 * time.Millisecond, // 0.1s + GossipInterval: 100 * time.Millisecond, // 0.1s + PruneInterval: 500 * time.Millisecond, // 0.5s + MaxGossipMsgSize: 65536, } } @@ -873,8 +876,11 @@ func TestOracleConfig() *OracleConfig { // ValidateBasic performs basic validation and returns an error if any check fails. func (cfg *OracleConfig) ValidateBasic() error { - if cfg.MaxGossipVoteAge < 0 { - return errors.New("max_gossip_vote_age can't be negative") + if cfg.MaxOracleGossipBlocksDelayed < 0 { + return errors.New("max_oracle_gossip_blocks_delayed can't be negative") + } + if cfg.MaxOracleGossipAge < 0 { + return errors.New("max_oracle_gossip_age can't be negative") } if cfg.SignInterval < 0 { return errors.New("sign_interval can't be negative") diff --git a/config/toml.go b/config/toml.go index a2379ecc27c..6db4154261a 100644 --- a/config/toml.go +++ b/config/toml.go @@ -409,8 +409,11 @@ experimental_max_gossip_connections_to_non_persistent_peers = {{ .Mempool.Experi ####################################################### [oracle] -# MaxGossipVoteAge determines how long we should keep the gossip votes in terms of block height -max_gossip_vote_age = "{{ .Oracle.MaxGossipVoteAge }}" +# MaxOracleGossipBlocksDelayed determines how long we should keep the gossip votes in terms of block height +max_oracle_gossip_blocks_delayed = "{{ .Oracle.MaxOracleGossipBlocksDelayed }}" + +# MaxOracleGossipAge determines how long we should keep the gossip votes in terms of seconds +max_oracle_gossip_age = "{{ .Oracle.MaxOracleGossipAge }}" # Interval determines how long we should wait before batch signing votes sign_interval = "{{ .Oracle.SignInterval }}" diff --git a/oracle/reactor.go b/oracle/reactor.go index 81cad735894..50a21e2c550 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -209,11 +209,16 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { continue } + // only gossip votes that are younger than the latestAllowableTimestamp, which is the max(earliest block timestamp collected, current time - maxOracleGossipAge) + latestAllowableTimestamp := time.Now().Unix() - int64(oracleR.OracleInfo.Config.MaxOracleGossipAge) + if len(oracleR.OracleInfo.BlockTimestamps) > 0 && oracleR.OracleInfo.BlockTimestamps[0] > latestAllowableTimestamp { + latestAllowableTimestamp = oracleR.OracleInfo.BlockTimestamps[0] + } + oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RLock() for _, gossipVote := range oracleR.OracleInfo.GossipVoteBuffer.Buffer { // stop sending gossip votes that have passed the maxGossipVoteAge - if len(oracleR.OracleInfo.BlockTimestamps) >= oracleR.OracleInfo.Config.MaxGossipVoteAge && - gossipVote.SignedTimestamp < oracleR.OracleInfo.BlockTimestamps[0] { + if gossipVote.SignedTimestamp < latestAllowableTimestamp { continue } diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 2f3d2ba3bae..3c47649f46c 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -86,10 +86,18 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { go func(oracleInfo *types.OracleInfo) { - maxGossipVoteAge := oracleInfo.Config.MaxGossipVoteAge - if maxGossipVoteAge == 0 { - maxGossipVoteAge = 3 + // only keep votes that are less than 2 blocks old + maxOracleGossipBlocksDelayed := oracleInfo.Config.MaxOracleGossipBlocksDelayed + if maxOracleGossipBlocksDelayed == 0 { + maxOracleGossipBlocksDelayed = 2 } + + // only keep votes that are less than 30s old + maxOracleGossipAge := oracleInfo.Config.MaxOracleGossipAge + if maxOracleGossipAge == 0 { + maxOracleGossipAge = 30 + } + pruneInterval := oracleInfo.Config.PruneInterval if pruneInterval == 0 { pruneInterval = 500 * time.Millisecond @@ -109,21 +117,23 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { oracleInfo.BlockTimestamps = append(oracleInfo.BlockTimestamps, lastBlockTime) } - if len(oracleInfo.BlockTimestamps) < maxGossipVoteAge { + // if chain is stale and not enough blockTimestamps have been accumulated, add extra check to see if earliest block timestamp is older than the latest allowable timestamp + latestAllowableTimestamp := time.Now().Unix() - int64(maxOracleGossipAge) + if len(oracleInfo.BlockTimestamps) < maxOracleGossipBlocksDelayed && oracleInfo.BlockTimestamps[0] > latestAllowableTimestamp { continue } - if len(oracleInfo.BlockTimestamps) > maxGossipVoteAge { + // only keep last x number of block timestamps, where x = maxOracleGossipBlocksDelayed + if len(oracleInfo.BlockTimestamps) > maxOracleGossipBlocksDelayed { oracleInfo.BlockTimestamps = oracleInfo.BlockTimestamps[1:] } - latestAllowableTimestamp := time.Now().Unix() - 30 + // prune votes that are older than the latestAllowableTimestamp, which is the max(earliest block timestamp collected, current time - maxOracleGossipAge) if oracleInfo.BlockTimestamps[0] > latestAllowableTimestamp { latestAllowableTimestamp = oracleInfo.BlockTimestamps[0] } oracleInfo.UnsignedVoteBuffer.UpdateMtx.Lock() - // prune votes that are older than the min(maxGossipVoteAge (in terms of block height), 30s) newVotes := []*oracleproto.Vote{} unsignedVoteBuffer := oracleInfo.UnsignedVoteBuffer.Buffer for _, vote := range unsignedVoteBuffer { @@ -137,7 +147,7 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() gossipBuffer := oracleInfo.GossipVoteBuffer.Buffer - // prune gossip votes that have not been updated in the last x amt of blocks, where x is the maxGossipVoteAge + // prune gossipedVotes that are older than the latestAllowableTimestamp, which is the max(earliest block timestamp collected, current time - maxOracleGossipAge) for valAddr, gossipVote := range gossipBuffer { if gossipVote.SignedTimestamp < latestAllowableTimestamp { delete(gossipBuffer, valAddr) From 58ab1bea51053e17157aad1ebcac8bf4c9741d49 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 31 May 2024 16:00:25 +0800 Subject: [PATCH 138/150] shift order of insertion of oracle result tx --- state/execution.go | 77 +++++++++++++++++++--------------------------- 1 file changed, 31 insertions(+), 46 deletions(-) diff --git a/state/execution.go b/state/execution.go index 4f6b02bb0eb..b460d804b2e 100644 --- a/state/execution.go +++ b/state/execution.go @@ -129,42 +129,10 @@ func (blockExec *BlockExecutor) CreateProposalBlock( maxReapBytes = -1 } - // check if oracle's gossipVoteMap has any results - blockExec.oracleInfo.GossipVoteBuffer.UpdateMtx.RLock() - oracleVotesBuffer := blockExec.oracleInfo.GossipVoteBuffer.Buffer - blockExec.oracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() - - var createOracleResultTxBz []byte - if len(oracleVotesBuffer) > 0 { - votes := []*oracleproto.GossipedVotes{} - for _, vote := range oracleVotesBuffer { - votes = append(votes, vote) - } - - resp, err := blockExec.proxyApp.CreateOracleResultTx(ctx, &abci.RequestCreateOracleResultTx{ - Proposer: proposerAddr, - GossipedVotes: votes, - }) - if err != nil { - blockExec.logger.Error("error in proxyAppConn.CreateOracleResultTx", "err", err) - } else { - createOracleResultTxBz = resp.EncodedTx - } - } - txs := blockExec.mempool.ReapMaxBytesMaxGas(maxReapBytes, maxGas) commit := lastExtCommit.ToCommit() - - if len(createOracleResultTxBz) > 0 { - maxReapBytes -= int64(len(createOracleResultTxBz)) - txs = blockExec.mempool.ReapMaxBytesMaxGas(maxReapBytes, maxGas) - CreateOracleResultTx := types.Tx(createOracleResultTxBz) - txs = append([]types.Tx{CreateOracleResultTx}, txs...) - } - block := state.MakeBlock(height, txs, commit, evidence, proposerAddr) txSlice := block.Txs.ToSliceOfBytes() - rpp, err := blockExec.proxyApp.PrepareProposal( ctx, &abci.RequestPrepareProposal{ @@ -195,6 +163,37 @@ func (blockExec *BlockExecutor) CreateProposalBlock( return nil, err } + // inject oracleTx containing gossipedVotes from vals, this is ran after PrepareProposal, so that CreateOracleResultTx + // hook will use the updated context from prepareProposalState + + // check if oracle's gossipVoteMap has any results + blockExec.oracleInfo.GossipVoteBuffer.UpdateMtx.RLock() + oracleVotesBuffer := blockExec.oracleInfo.GossipVoteBuffer.Buffer + blockExec.oracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() + + var createOracleResultTxBz []byte + if len(oracleVotesBuffer) > 0 { + votes := []*oracleproto.GossipedVotes{} + for _, vote := range oracleVotesBuffer { + votes = append(votes, vote) + } + + resp, err := blockExec.proxyApp.CreateOracleResultTx(ctx, &abci.RequestCreateOracleResultTx{ + Proposer: proposerAddr, + GossipedVotes: votes, + }) + if err != nil { + blockExec.logger.Error("error in proxyAppConn.CreateOracleResultTx", "err", err) + } else { + createOracleResultTxBz = resp.EncodedTx + } + } + + if len(createOracleResultTxBz) > 0 { + CreateOracleResultTx := types.Tx(createOracleResultTxBz) + txl = append([]types.Tx{CreateOracleResultTx}, txl...) + } + return state.MakeBlock(height, txl, commit, evidence, proposerAddr), nil } @@ -202,20 +201,6 @@ func (blockExec *BlockExecutor) ProcessProposal( block *types.Block, state State, ) (bool, error) { - txs := block.Data.Txs.ToSliceOfBytes() - if len(txs) > 0 { - res, err := blockExec.proxyApp.ValidateOracleVotes(context.TODO(), &abci.RequestValidateOracleVotes{OracleTx: txs[0]}) - - if err != nil && res.Status == abci.ResponseValidateOracleVotes_ABSENT { - // oracleTx is not present, continue normal processProposal flow - blockExec.logger.Error("error validating oracle votes:", "err", err) - } else if err != nil && res.Status == abci.ResponseValidateOracleVotes_PRESENT { - // oracleTx is present but it is invalid, remove from txs - blockExec.logger.Error("error validating oracle votes:", "err", err) - return false, fmt.Errorf("processProposal: invalid oracle votes submitted: %v", err) - } - } - resp, err := blockExec.proxyApp.ProcessProposal(context.TODO(), &abci.RequestProcessProposal{ Hash: block.Header.Hash(), Height: block.Header.Height, From 407f495351df0e3d7411bb7f26a7b87e8574e1e3 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 3 Jun 2024 17:28:30 +0800 Subject: [PATCH 139/150] add logs for mutex locking and unlocking --- oracle/reactor.go | 12 ++++++------ oracle/service/runner/runner.go | 9 ++++++++- state/execution.go | 15 +++++++++------ 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 50a21e2c550..63586e67328 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -143,26 +143,24 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { return } - oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RLock() + logrus.Infof("Locking gossip vote buffer for receiving gossip...") + oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Lock() currentGossipVote, ok := oracleR.OracleInfo.GossipVoteBuffer.Buffer[pubKey.Address().String()] - oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() if !ok { // first gossipVote entry from this validator - oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Lock() oracleR.OracleInfo.GossipVoteBuffer.Buffer[pubKey.Address().String()] = msg - oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() } else { // existing gossipVote entry from this validator - oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Lock() previousTimestamp := currentGossipVote.SignedTimestamp newTimestamp := msg.SignedTimestamp // only replace if the gossipVote received has a later timestamp than our current one if newTimestamp > previousTimestamp { oracleR.OracleInfo.GossipVoteBuffer.Buffer[pubKey.Address().String()] = msg } - oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() } + oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() + logrus.Infof("Unlocking gossip vote buffer for receiving gossip...") default: logrus.Warn("unknown message type", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("oracle cannot handle message of type: %T", e.Message)) @@ -215,6 +213,7 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { latestAllowableTimestamp = oracleR.OracleInfo.BlockTimestamps[0] } + logrus.Infof("Locking gossip buffer mutex for sending gossip...") oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RLock() for _, gossipVote := range oracleR.OracleInfo.GossipVoteBuffer.Buffer { // stop sending gossip votes that have passed the maxGossipVoteAge @@ -231,6 +230,7 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { } } oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() + logrus.Infof("Unlocking gossip buffer mutex for sending gossip...") time.Sleep(interval) } diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 3c47649f46c..421b06b21e3 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -53,6 +53,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State // batch sign the new votes, along with existing votes in gossipVoteBuffer, if any // append new batch into unsignedVotesBuffer, need to mutex lock as it will clash with concurrent pruning + log.Infof("Locking unsigned vote buffer for signing...") oracleInfo.UnsignedVoteBuffer.UpdateMtx.Lock() oracleInfo.UnsignedVoteBuffer.Buffer = append(oracleInfo.UnsignedVoteBuffer.Buffer, votes...) @@ -60,6 +61,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State unsignedVotes = append(unsignedVotes, oracleInfo.UnsignedVoteBuffer.Buffer...) oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() + log.Infof("Unlocking unsigned vote buffer for signing...") // sort the votes so that we can rebuild it in a deterministic order, when uncompressing SortOracleVotes(unsignedVotes) @@ -78,10 +80,12 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State } // need to mutex lock as it will clash with concurrent gossip + log.Infof("Locking gossip vote buffer for updating my own gossip...") oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() address := oracleInfo.PubKey.Address().String() oracleInfo.GossipVoteBuffer.Buffer[address] = newGossipVote oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() + log.Infof("Unlocking gossip vote buffer for updating my own gossip...") } func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { @@ -133,6 +137,7 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { latestAllowableTimestamp = oracleInfo.BlockTimestamps[0] } + log.Infof("Locking unsigned vote buffer for pruning...") oracleInfo.UnsignedVoteBuffer.UpdateMtx.Lock() newVotes := []*oracleproto.Vote{} unsignedVoteBuffer := oracleInfo.UnsignedVoteBuffer.Buffer @@ -143,7 +148,9 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { } oracleInfo.UnsignedVoteBuffer.Buffer = newVotes oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() + log.Infof("Unlocking unsigned vote buffer for pruning...") + log.Infof("Locking gossip vote buffer for pruning...") oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() gossipBuffer := oracleInfo.GossipVoteBuffer.Buffer @@ -155,13 +162,13 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { } oracleInfo.GossipVoteBuffer.Buffer = gossipBuffer oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() + log.Infof("Unlocking gossip vote buffer for pruning...") } }(oracleInfo) } // Run run oracles func Run(oracleInfo *types.OracleInfo, consensusState *cs.State) { - log.Info("[oracle] Service started.") RunProcessSignVoteQueue(oracleInfo, consensusState) PruneVoteBuffers(oracleInfo, consensusState) // start to take votes from app diff --git a/state/execution.go b/state/execution.go index b460d804b2e..742bf286195 100644 --- a/state/execution.go +++ b/state/execution.go @@ -14,6 +14,7 @@ import ( cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/cometbft/cometbft/proxy" "github.com/cometbft/cometbft/types" + "github.com/sirupsen/logrus" oracletypes "github.com/cometbft/cometbft/oracle/service/types" oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" @@ -133,6 +134,7 @@ func (blockExec *BlockExecutor) CreateProposalBlock( commit := lastExtCommit.ToCommit() block := state.MakeBlock(height, txs, commit, evidence, proposerAddr) txSlice := block.Txs.ToSliceOfBytes() + logrus.Infof("Proposer :%v, preparing block proposal for height: %v", block.ProposerAddress.String(), block.Height) rpp, err := blockExec.proxyApp.PrepareProposal( ctx, &abci.RequestPrepareProposal{ @@ -167,17 +169,18 @@ func (blockExec *BlockExecutor) CreateProposalBlock( // hook will use the updated context from prepareProposalState // check if oracle's gossipVoteMap has any results + logrus.Infof("Locking gossip buffer mutex for injecting oracle tx...") blockExec.oracleInfo.GossipVoteBuffer.UpdateMtx.RLock() oracleVotesBuffer := blockExec.oracleInfo.GossipVoteBuffer.Buffer + votes := []*oracleproto.GossipedVotes{} + for _, vote := range oracleVotesBuffer { + votes = append(votes, vote) + } blockExec.oracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() + logrus.Infof("Unlocking gossip buffer mutex for injecting oracle tx...") var createOracleResultTxBz []byte - if len(oracleVotesBuffer) > 0 { - votes := []*oracleproto.GossipedVotes{} - for _, vote := range oracleVotesBuffer { - votes = append(votes, vote) - } - + if len(votes) > 0 { resp, err := blockExec.proxyApp.CreateOracleResultTx(ctx, &abci.RequestCreateOracleResultTx{ Proposer: proposerAddr, GossipedVotes: votes, From f10d3073144007cd9d653138f6202369b055203f Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 3 Jun 2024 17:42:41 +0800 Subject: [PATCH 140/150] remove logs for unsigned vote buffer --- oracle/service/runner/runner.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 421b06b21e3..28dfde11e9a 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -53,7 +53,6 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State // batch sign the new votes, along with existing votes in gossipVoteBuffer, if any // append new batch into unsignedVotesBuffer, need to mutex lock as it will clash with concurrent pruning - log.Infof("Locking unsigned vote buffer for signing...") oracleInfo.UnsignedVoteBuffer.UpdateMtx.Lock() oracleInfo.UnsignedVoteBuffer.Buffer = append(oracleInfo.UnsignedVoteBuffer.Buffer, votes...) @@ -61,7 +60,6 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State unsignedVotes = append(unsignedVotes, oracleInfo.UnsignedVoteBuffer.Buffer...) oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() - log.Infof("Unlocking unsigned vote buffer for signing...") // sort the votes so that we can rebuild it in a deterministic order, when uncompressing SortOracleVotes(unsignedVotes) @@ -137,7 +135,6 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { latestAllowableTimestamp = oracleInfo.BlockTimestamps[0] } - log.Infof("Locking unsigned vote buffer for pruning...") oracleInfo.UnsignedVoteBuffer.UpdateMtx.Lock() newVotes := []*oracleproto.Vote{} unsignedVoteBuffer := oracleInfo.UnsignedVoteBuffer.Buffer @@ -148,7 +145,6 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { } oracleInfo.UnsignedVoteBuffer.Buffer = newVotes oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() - log.Infof("Unlocking unsigned vote buffer for pruning...") log.Infof("Locking gossip vote buffer for pruning...") oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() From a2c896755936ed7949793a6dccb71b2c4b2eecd6 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 3 Jun 2024 18:17:24 +0800 Subject: [PATCH 141/150] add clearer logs for tracking mutex lock times --- oracle/reactor.go | 10 ++++++---- oracle/service/runner/runner.go | 10 ++++++---- state/execution.go | 5 +++-- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 63586e67328..08a70d9152c 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -143,7 +143,7 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { return } - logrus.Infof("Locking gossip vote buffer for receiving gossip...") + preLockTime := time.Now().UnixMicro() oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Lock() currentGossipVote, ok := oracleR.OracleInfo.GossipVoteBuffer.Buffer[pubKey.Address().String()] @@ -160,7 +160,8 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { } } oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() - logrus.Infof("Unlocking gossip vote buffer for receiving gossip...") + postLockTime := time.Now().UnixMicro() + logrus.Infof("Receiving gossip lock took %v microseconds", postLockTime-preLockTime) default: logrus.Warn("unknown message type", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("oracle cannot handle message of type: %T", e.Message)) @@ -213,7 +214,7 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { latestAllowableTimestamp = oracleR.OracleInfo.BlockTimestamps[0] } - logrus.Infof("Locking gossip buffer mutex for sending gossip...") + preLockTime := time.Now().UnixMicro() oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RLock() for _, gossipVote := range oracleR.OracleInfo.GossipVoteBuffer.Buffer { // stop sending gossip votes that have passed the maxGossipVoteAge @@ -230,7 +231,8 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { } } oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() - logrus.Infof("Unlocking gossip buffer mutex for sending gossip...") + postLockTime := time.Now().UnixMicro() + logrus.Infof("Sending gossip lock took %v microseconds", postLockTime-preLockTime) time.Sleep(interval) } diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 28dfde11e9a..2208b67ca46 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -78,12 +78,13 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State } // need to mutex lock as it will clash with concurrent gossip - log.Infof("Locking gossip vote buffer for updating my own gossip...") + preLockTime := time.Now().UnixMicro() oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() address := oracleInfo.PubKey.Address().String() oracleInfo.GossipVoteBuffer.Buffer[address] = newGossipVote oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() - log.Infof("Unlocking gossip vote buffer for updating my own gossip...") + postLockTime := time.Now().UnixMicro() + log.Infof("Updating gossip lock took %v microseconds", postLockTime-preLockTime) } func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { @@ -146,7 +147,7 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { oracleInfo.UnsignedVoteBuffer.Buffer = newVotes oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() - log.Infof("Locking gossip vote buffer for pruning...") + preLockTime := time.Now().UnixMicro() oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() gossipBuffer := oracleInfo.GossipVoteBuffer.Buffer @@ -158,7 +159,8 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { } oracleInfo.GossipVoteBuffer.Buffer = gossipBuffer oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() - log.Infof("Unlocking gossip vote buffer for pruning...") + postLockTime := time.Now().UnixMicro() + log.Infof("Pruning gossip lock took %v microseconds", postLockTime-preLockTime) } }(oracleInfo) } diff --git a/state/execution.go b/state/execution.go index 742bf286195..9d3b87d4eee 100644 --- a/state/execution.go +++ b/state/execution.go @@ -169,7 +169,7 @@ func (blockExec *BlockExecutor) CreateProposalBlock( // hook will use the updated context from prepareProposalState // check if oracle's gossipVoteMap has any results - logrus.Infof("Locking gossip buffer mutex for injecting oracle tx...") + preLockTime := time.Now().UnixMicro() blockExec.oracleInfo.GossipVoteBuffer.UpdateMtx.RLock() oracleVotesBuffer := blockExec.oracleInfo.GossipVoteBuffer.Buffer votes := []*oracleproto.GossipedVotes{} @@ -177,7 +177,8 @@ func (blockExec *BlockExecutor) CreateProposalBlock( votes = append(votes, vote) } blockExec.oracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() - logrus.Infof("Unlocking gossip buffer mutex for injecting oracle tx...") + postLockTime := time.Now().UnixMicro() + logrus.Infof("Injecting oracle tx gossip lock took %v microseconds", postLockTime-preLockTime) var createOracleResultTxBz []byte if len(votes) > 0 { From a1e4b704d3f0c8781f3ca88b7bd2374169333273 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 3 Jun 2024 18:41:04 +0800 Subject: [PATCH 142/150] improve logs for benchmarking lock times --- oracle/reactor.go | 10 ++++++++-- oracle/service/runner/runner.go | 10 ++++++++-- state/execution.go | 5 ++++- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 08a70d9152c..61b0023bd1c 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -161,7 +161,10 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { } oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() postLockTime := time.Now().UnixMicro() - logrus.Infof("Receiving gossip lock took %v microseconds", postLockTime-preLockTime) + diff := postLockTime - preLockTime + if diff > 1000 { + logrus.Infof("Receiving gossip lock took %v microseconds", diff) + } default: logrus.Warn("unknown message type", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) oracleR.Switch.StopPeerForError(e.Src, fmt.Errorf("oracle cannot handle message of type: %T", e.Message)) @@ -232,7 +235,10 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { } oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() postLockTime := time.Now().UnixMicro() - logrus.Infof("Sending gossip lock took %v microseconds", postLockTime-preLockTime) + diff := postLockTime - preLockTime + if diff > 1000 { + logrus.Infof("Sending gossip lock took %v microseconds", diff) + } time.Sleep(interval) } diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 2208b67ca46..bde4f1e4c79 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -84,7 +84,10 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State oracleInfo.GossipVoteBuffer.Buffer[address] = newGossipVote oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() postLockTime := time.Now().UnixMicro() - log.Infof("Updating gossip lock took %v microseconds", postLockTime-preLockTime) + diff := postLockTime - preLockTime + if diff > 1000 { + log.Infof("Updating gossip lock took %v microseconds", diff) + } } func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { @@ -160,7 +163,10 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { oracleInfo.GossipVoteBuffer.Buffer = gossipBuffer oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() postLockTime := time.Now().UnixMicro() - log.Infof("Pruning gossip lock took %v microseconds", postLockTime-preLockTime) + diff := postLockTime - preLockTime + if diff > 1000 { + log.Infof("Pruning gossip lock took %v microseconds", diff) + } } }(oracleInfo) } diff --git a/state/execution.go b/state/execution.go index 9d3b87d4eee..0ce4c020f35 100644 --- a/state/execution.go +++ b/state/execution.go @@ -178,7 +178,10 @@ func (blockExec *BlockExecutor) CreateProposalBlock( } blockExec.oracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() postLockTime := time.Now().UnixMicro() - logrus.Infof("Injecting oracle tx gossip lock took %v microseconds", postLockTime-preLockTime) + diff := postLockTime - preLockTime + if diff > 1000 { + logrus.Infof("Injecting oracle tx gossip lock took %v microseconds", diff) + } var createOracleResultTxBz []byte if len(votes) > 0 { From 4c71a0aa37e5e4f1eec353b9d25e171cf8c2a6c2 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 3 Jun 2024 18:53:58 +0800 Subject: [PATCH 143/150] optimise locking for sending gossip routine --- oracle/reactor.go | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 61b0023bd1c..e2d3dc23ad5 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -219,19 +219,14 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { preLockTime := time.Now().UnixMicro() oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RLock() + votes := []*oracleproto.GossipedVotes{} for _, gossipVote := range oracleR.OracleInfo.GossipVoteBuffer.Buffer { // stop sending gossip votes that have passed the maxGossipVoteAge if gossipVote.SignedTimestamp < latestAllowableTimestamp { continue } - success := peer.Send(p2p.Envelope{ - ChannelID: OracleChannel, - Message: gossipVote, - }) - if !success { - break - } + votes = append(votes, gossipVote) } oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() postLockTime := time.Now().UnixMicro() @@ -240,6 +235,15 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { logrus.Infof("Sending gossip lock took %v microseconds", diff) } + for _, vote := range votes { + success := peer.Send(p2p.Envelope{ + ChannelID: OracleChannel, + Message: vote, + }) + if !success { + break + } + } time.Sleep(interval) } } From f178e00595bb48951c057e4067f963cfffb00e7d Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 3 Jun 2024 19:05:46 +0800 Subject: [PATCH 144/150] improve lock logs --- oracle/reactor.go | 16 ++++++++-------- oracle/service/runner/runner.go | 16 ++++++++-------- state/execution.go | 8 ++++---- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index e2d3dc23ad5..c47d10333c9 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -143,7 +143,7 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { return } - preLockTime := time.Now().UnixMicro() + preLockTime := time.Now().UnixMilli() oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Lock() currentGossipVote, ok := oracleR.OracleInfo.GossipVoteBuffer.Buffer[pubKey.Address().String()] @@ -160,10 +160,10 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { } } oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() - postLockTime := time.Now().UnixMicro() + postLockTime := time.Now().UnixMilli() diff := postLockTime - preLockTime - if diff > 1000 { - logrus.Infof("Receiving gossip lock took %v microseconds", diff) + if diff > 10 { + logrus.Warnf("WARNING!!! Receiving gossip lock took %v milliseconds", diff) } default: logrus.Warn("unknown message type", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) @@ -217,7 +217,7 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { latestAllowableTimestamp = oracleR.OracleInfo.BlockTimestamps[0] } - preLockTime := time.Now().UnixMicro() + preLockTime := time.Now().UnixMilli() oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RLock() votes := []*oracleproto.GossipedVotes{} for _, gossipVote := range oracleR.OracleInfo.GossipVoteBuffer.Buffer { @@ -229,10 +229,10 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { votes = append(votes, gossipVote) } oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() - postLockTime := time.Now().UnixMicro() + postLockTime := time.Now().UnixMilli() diff := postLockTime - preLockTime - if diff > 1000 { - logrus.Infof("Sending gossip lock took %v microseconds", diff) + if diff > 10 { + logrus.Warnf("WARNING!!! Sending gossip lock took %v milliseconds", diff) } for _, vote := range votes { diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index bde4f1e4c79..1d10d05a8fb 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -78,15 +78,15 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State } // need to mutex lock as it will clash with concurrent gossip - preLockTime := time.Now().UnixMicro() + preLockTime := time.Now().UnixMilli() oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() address := oracleInfo.PubKey.Address().String() oracleInfo.GossipVoteBuffer.Buffer[address] = newGossipVote oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() - postLockTime := time.Now().UnixMicro() + postLockTime := time.Now().UnixMilli() diff := postLockTime - preLockTime - if diff > 1000 { - log.Infof("Updating gossip lock took %v microseconds", diff) + if diff > 10 { + log.Warnf("WARNING!!! Updating gossip lock took %v milliseconds", diff) } } @@ -150,7 +150,7 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { oracleInfo.UnsignedVoteBuffer.Buffer = newVotes oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() - preLockTime := time.Now().UnixMicro() + preLockTime := time.Now().UnixMilli() oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() gossipBuffer := oracleInfo.GossipVoteBuffer.Buffer @@ -162,10 +162,10 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { } oracleInfo.GossipVoteBuffer.Buffer = gossipBuffer oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() - postLockTime := time.Now().UnixMicro() + postLockTime := time.Now().UnixMilli() diff := postLockTime - preLockTime - if diff > 1000 { - log.Infof("Pruning gossip lock took %v microseconds", diff) + if diff > 10 { + log.Warnf("WARNING!!! Pruning gossip lock took %v milliseconds", diff) } } }(oracleInfo) diff --git a/state/execution.go b/state/execution.go index 0ce4c020f35..8aa29a63c1c 100644 --- a/state/execution.go +++ b/state/execution.go @@ -169,7 +169,7 @@ func (blockExec *BlockExecutor) CreateProposalBlock( // hook will use the updated context from prepareProposalState // check if oracle's gossipVoteMap has any results - preLockTime := time.Now().UnixMicro() + preLockTime := time.Now().UnixMilli() blockExec.oracleInfo.GossipVoteBuffer.UpdateMtx.RLock() oracleVotesBuffer := blockExec.oracleInfo.GossipVoteBuffer.Buffer votes := []*oracleproto.GossipedVotes{} @@ -177,10 +177,10 @@ func (blockExec *BlockExecutor) CreateProposalBlock( votes = append(votes, vote) } blockExec.oracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() - postLockTime := time.Now().UnixMicro() + postLockTime := time.Now().UnixMilli() diff := postLockTime - preLockTime - if diff > 1000 { - logrus.Infof("Injecting oracle tx gossip lock took %v microseconds", diff) + if diff > 10 { + logrus.Warnf("WARNING!!! Injecting oracle tx gossip lock took %v milliseconds", diff) } var createOracleResultTxBz []byte From 9a55922640c2404dabd7aa804447149c54d286de Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 4 Jun 2024 13:07:57 +0800 Subject: [PATCH 145/150] increase threshold for lock timings --- oracle/reactor.go | 4 ++-- oracle/service/runner/runner.go | 4 ++-- state/execution.go | 3 +-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index c47d10333c9..b7edf18833c 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -162,7 +162,7 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() postLockTime := time.Now().UnixMilli() diff := postLockTime - preLockTime - if diff > 10 { + if diff > 100 { logrus.Warnf("WARNING!!! Receiving gossip lock took %v milliseconds", diff) } default: @@ -231,7 +231,7 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() postLockTime := time.Now().UnixMilli() diff := postLockTime - preLockTime - if diff > 10 { + if diff > 100 { logrus.Warnf("WARNING!!! Sending gossip lock took %v milliseconds", diff) } diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 1d10d05a8fb..b237f11c1b1 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -85,7 +85,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() postLockTime := time.Now().UnixMilli() diff := postLockTime - preLockTime - if diff > 10 { + if diff > 100 { log.Warnf("WARNING!!! Updating gossip lock took %v milliseconds", diff) } } @@ -164,7 +164,7 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() postLockTime := time.Now().UnixMilli() diff := postLockTime - preLockTime - if diff > 10 { + if diff > 100 { log.Warnf("WARNING!!! Pruning gossip lock took %v milliseconds", diff) } } diff --git a/state/execution.go b/state/execution.go index 8aa29a63c1c..846a9d3a6d6 100644 --- a/state/execution.go +++ b/state/execution.go @@ -134,7 +134,6 @@ func (blockExec *BlockExecutor) CreateProposalBlock( commit := lastExtCommit.ToCommit() block := state.MakeBlock(height, txs, commit, evidence, proposerAddr) txSlice := block.Txs.ToSliceOfBytes() - logrus.Infof("Proposer :%v, preparing block proposal for height: %v", block.ProposerAddress.String(), block.Height) rpp, err := blockExec.proxyApp.PrepareProposal( ctx, &abci.RequestPrepareProposal{ @@ -179,7 +178,7 @@ func (blockExec *BlockExecutor) CreateProposalBlock( blockExec.oracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() postLockTime := time.Now().UnixMilli() diff := postLockTime - preLockTime - if diff > 10 { + if diff > 100 { logrus.Warnf("WARNING!!! Injecting oracle tx gossip lock took %v milliseconds", diff) } From baced902e260112770c3ac52fd710c340594545a Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 4 Jun 2024 17:46:22 +0800 Subject: [PATCH 146/150] update configs for oracle reactor --- config/config.go | 26 +++++++++++++------------- oracle/reactor.go | 9 +++------ oracle/service/runner/runner.go | 20 ++++---------------- 3 files changed, 20 insertions(+), 35 deletions(-) diff --git a/config/config.go b/config/config.go index a4a2bfb834b..9b651bdc6cd 100644 --- a/config/config.go +++ b/config/config.go @@ -859,7 +859,7 @@ type OracleConfig struct { func DefaultOracleConfig() *OracleConfig { return &OracleConfig{ MaxOracleGossipBlocksDelayed: 2, // keep all gossipVotes from at most 2 blocks behind - MaxOracleGossipAge: 30, // keep all gossipVotes from at most 30s ago + MaxOracleGossipAge: 15, // keep all gossipVotes from at most 15s ago SignInterval: 100 * time.Millisecond, // 0.1s GossipInterval: 100 * time.Millisecond, // 0.1s PruneInterval: 500 * time.Millisecond, // 0.5s @@ -876,23 +876,23 @@ func TestOracleConfig() *OracleConfig { // ValidateBasic performs basic validation and returns an error if any check fails. func (cfg *OracleConfig) ValidateBasic() error { - if cfg.MaxOracleGossipBlocksDelayed < 0 { - return errors.New("max_oracle_gossip_blocks_delayed can't be negative") + if cfg.MaxOracleGossipBlocksDelayed <= 0 { + return errors.New("max_oracle_gossip_blocks_delayed must be positive") } - if cfg.MaxOracleGossipAge < 0 { - return errors.New("max_oracle_gossip_age can't be negative") + if cfg.MaxOracleGossipAge <= 0 { + return errors.New("max_oracle_gossip_age must be positive") } - if cfg.SignInterval < 0 { - return errors.New("sign_interval can't be negative") + if cfg.SignInterval <= 0 { + return errors.New("sign_interval must be positive") } - if cfg.GossipInterval < 0 { - return errors.New("gossip_interval can't be negative") + if cfg.GossipInterval <= 0 { + return errors.New("gossip_interval must be positive") } - if cfg.PruneInterval < 0 { - return errors.New("prune_interval can't be negative") + if cfg.PruneInterval <= 0 { + return errors.New("prune_interval must be positive") } - if cfg.MaxGossipMsgSize < 0 { - return errors.New("max_gossip_msg_size can't be negative") + if cfg.MaxGossipMsgSize <= 0 { + return errors.New("max_gossip_msg_size must be positive") } return nil } diff --git a/oracle/reactor.go b/oracle/reactor.go index b7edf18833c..3ce50ebd9ef 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -92,10 +92,9 @@ func (oracleR *Reactor) OnStart() error { // GetChannels implements Reactor by returning the list of channels for this // reactor. func (oracleR *Reactor) GetChannels() []*p2p.ChannelDescriptor { + // only gossip votes with a max size of x, where x = Config.MaxGossipMsgSize messageCap := oracleR.OracleInfo.Config.MaxGossipMsgSize - if messageCap == 0 { - messageCap = 65536 - } + return []*p2p.ChannelDescriptor{ { ID: OracleChannel, @@ -181,10 +180,8 @@ type PeerState interface { // // Send new oracle votes to peer. func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { + // gossip votes every x milliseconds, where x = Config.GossipInterval interval := oracleR.OracleInfo.Config.GossipInterval - if interval == 0 { - interval = 100 * time.Millisecond - } for { // In case of both next.NextWaitChan() and peer.Quit() are variable at the same time diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index b237f11c1b1..40f252c060d 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -16,10 +16,8 @@ import ( ) func RunProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State) { + // sign votes every x milliseconds, where x = Config.SignInterval interval := oracleInfo.Config.SignInterval - if interval == 0 { - interval = 100 * time.Millisecond - } go func(oracleInfo *types.OracleInfo) { for { @@ -92,22 +90,12 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { go func(oracleInfo *types.OracleInfo) { - // only keep votes that are less than 2 blocks old + // only keep votes that are less than x blocks old, where x = Config.MaxOracleGossipBlocksDelayed maxOracleGossipBlocksDelayed := oracleInfo.Config.MaxOracleGossipBlocksDelayed - if maxOracleGossipBlocksDelayed == 0 { - maxOracleGossipBlocksDelayed = 2 - } - - // only keep votes that are less than 30s old + // only keep votes that are less than x seconds old, where x = Config.MaxOracleGossipAge maxOracleGossipAge := oracleInfo.Config.MaxOracleGossipAge - if maxOracleGossipAge == 0 { - maxOracleGossipAge = 30 - } - + // run pruner every x milliseconds, where x = Config.PruneInterval pruneInterval := oracleInfo.Config.PruneInterval - if pruneInterval == 0 { - pruneInterval = 500 * time.Millisecond - } ticker := time.Tick(pruneInterval) for range ticker { From ea429b71ea99e1a9ae5ebcd0f5330b0a127201dd Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 4 Jun 2024 18:25:25 +0800 Subject: [PATCH 147/150] remove unnecessary check for pruning of oracle votes --- oracle/service/runner/runner.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 40f252c060d..07e716e9b10 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -111,17 +111,12 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { oracleInfo.BlockTimestamps = append(oracleInfo.BlockTimestamps, lastBlockTime) } - // if chain is stale and not enough blockTimestamps have been accumulated, add extra check to see if earliest block timestamp is older than the latest allowable timestamp - latestAllowableTimestamp := time.Now().Unix() - int64(maxOracleGossipAge) - if len(oracleInfo.BlockTimestamps) < maxOracleGossipBlocksDelayed && oracleInfo.BlockTimestamps[0] > latestAllowableTimestamp { - continue - } - // only keep last x number of block timestamps, where x = maxOracleGossipBlocksDelayed if len(oracleInfo.BlockTimestamps) > maxOracleGossipBlocksDelayed { oracleInfo.BlockTimestamps = oracleInfo.BlockTimestamps[1:] } + latestAllowableTimestamp := time.Now().Unix() - int64(maxOracleGossipAge) // prune votes that are older than the latestAllowableTimestamp, which is the max(earliest block timestamp collected, current time - maxOracleGossipAge) if oracleInfo.BlockTimestamps[0] > latestAllowableTimestamp { latestAllowableTimestamp = oracleInfo.BlockTimestamps[0] From 3babce32ddcfbbf971a0da6717e8f2d1aec5529a Mon Sep 17 00:00:00 2001 From: yan-soon Date: Wed, 5 Jun 2024 00:59:15 +0800 Subject: [PATCH 148/150] check for block timestamp buffer size before pruning --- oracle/reactor.go | 2 +- oracle/service/runner/runner.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 3ce50ebd9ef..fa4ac14dee9 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -210,7 +210,7 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { // only gossip votes that are younger than the latestAllowableTimestamp, which is the max(earliest block timestamp collected, current time - maxOracleGossipAge) latestAllowableTimestamp := time.Now().Unix() - int64(oracleR.OracleInfo.Config.MaxOracleGossipAge) - if len(oracleR.OracleInfo.BlockTimestamps) > 0 && oracleR.OracleInfo.BlockTimestamps[0] > latestAllowableTimestamp { + if len(oracleR.OracleInfo.BlockTimestamps) == oracleR.OracleInfo.Config.MaxOracleGossipBlocksDelayed && oracleR.OracleInfo.BlockTimestamps[0] > latestAllowableTimestamp { latestAllowableTimestamp = oracleR.OracleInfo.BlockTimestamps[0] } diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 07e716e9b10..595b903abb2 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -118,7 +118,7 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { latestAllowableTimestamp := time.Now().Unix() - int64(maxOracleGossipAge) // prune votes that are older than the latestAllowableTimestamp, which is the max(earliest block timestamp collected, current time - maxOracleGossipAge) - if oracleInfo.BlockTimestamps[0] > latestAllowableTimestamp { + if len(oracleInfo.BlockTimestamps) == maxOracleGossipBlocksDelayed && oracleInfo.BlockTimestamps[0] > latestAllowableTimestamp { latestAllowableTimestamp = oracleInfo.BlockTimestamps[0] } From c3438e4637f31fa0b0c8b2b321a7293fd3fb2cca Mon Sep 17 00:00:00 2001 From: yan-soon Date: Wed, 5 Jun 2024 15:22:10 +0800 Subject: [PATCH 149/150] rename oracle config to oraclesvc to prevent clashing with carbon oracle flag --- config/config.go | 2 +- config/toml.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/config.go b/config/config.go index 9b651bdc6cd..44536521d0f 100644 --- a/config/config.go +++ b/config/config.go @@ -75,7 +75,7 @@ type Config struct { RPC *RPCConfig `mapstructure:"rpc"` P2P *P2PConfig `mapstructure:"p2p"` Mempool *MempoolConfig `mapstructure:"mempool"` - Oracle *OracleConfig `mapstructure:"oracle"` + Oracle *OracleConfig `mapstructure:"oraclesvc"` StateSync *StateSyncConfig `mapstructure:"statesync"` BlockSync *BlockSyncConfig `mapstructure:"blocksync"` Consensus *ConsensusConfig `mapstructure:"consensus"` diff --git a/config/toml.go b/config/toml.go index 6db4154261a..306996d5cff 100644 --- a/config/toml.go +++ b/config/toml.go @@ -407,7 +407,7 @@ experimental_max_gossip_connections_to_non_persistent_peers = {{ .Mempool.Experi ####################################################### ### Oracle Configuration Option ### ####################################################### -[oracle] +[oraclesvc] # MaxOracleGossipBlocksDelayed determines how long we should keep the gossip votes in terms of block height max_oracle_gossip_blocks_delayed = "{{ .Oracle.MaxOracleGossipBlocksDelayed }}" From d947aabd1250ef5a11aae9f3319a23e8d23b149d Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 10 Jun 2024 23:58:32 +0800 Subject: [PATCH 150/150] add less aggresive configs and prune dup votes --- config/config.go | 4 ++-- oracle/service/runner/runner.go | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/config/config.go b/config/config.go index 44536521d0f..08fcaa2e72e 100644 --- a/config/config.go +++ b/config/config.go @@ -858,8 +858,8 @@ type OracleConfig struct { // DefaultOracleConfig returns a default configuration for the CometBFT oracle service func DefaultOracleConfig() *OracleConfig { return &OracleConfig{ - MaxOracleGossipBlocksDelayed: 2, // keep all gossipVotes from at most 2 blocks behind - MaxOracleGossipAge: 15, // keep all gossipVotes from at most 15s ago + MaxOracleGossipBlocksDelayed: 3, // keep all gossipVotes from at most 3 blocks behind + MaxOracleGossipAge: 20, // keep all gossipVotes from at most 20s ago SignInterval: 100 * time.Millisecond, // 0.1s GossipInterval: 100 * time.Millisecond, // 0.1s PruneInterval: 500 * time.Millisecond, // 0.5s diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 595b903abb2..fdf551b2698 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -2,6 +2,7 @@ package runner import ( "context" + "fmt" "sort" "time" @@ -125,7 +126,17 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { oracleInfo.UnsignedVoteBuffer.UpdateMtx.Lock() newVotes := []*oracleproto.Vote{} unsignedVoteBuffer := oracleInfo.UnsignedVoteBuffer.Buffer + visitedVoteMap := make(map[string]struct{}) for _, vote := range unsignedVoteBuffer { + // check for dup votes + key := fmt.Sprintf("%v:%v", vote.Timestamp, vote.OracleId) + _, exists := visitedVoteMap[key] + if exists { + continue + } + + visitedVoteMap[key] = struct{}{} + if vote.Timestamp >= latestAllowableTimestamp { newVotes = append(newVotes, vote) }