diff --git a/app/app.go b/app/app.go index 04aae52..2315181 100644 --- a/app/app.go +++ b/app/app.go @@ -996,4 +996,7 @@ func (app *App) setupUpgradeHandlers() { fromVM[machinemoduletypes.ModuleName] = machinemodule.AppModule{}.ConsensusVersion() return app.mm.RunMigrations(ctx, app.configurator, fromVM) }) + app.UpgradeKeeper.SetUpgradeHandler("v0.10.0", func(ctx sdk.Context, _ upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { + return app.mm.RunMigrations(ctx, app.configurator, fromVM) + }) } diff --git a/clients/claim_client.go b/clients/claim_client.go index d65236d..8ad9dcc 100644 --- a/clients/claim_client.go +++ b/clients/claim_client.go @@ -16,13 +16,18 @@ import ( var ClaimServiceClient IRCClient -func init() { +func lazyLoad() IRCClient { + if ClaimServiceClient != nil { + return ClaimServiceClient + } cfg := config.GetConfig() ClaimServiceClient = NewRCClient(cfg.ClaimHost, &http.Client{}) + return ClaimServiceClient } func PostClaim(ctx context.Context, beneficiary string, amount uint64, id uint64) (txID string, err error) { - res, err := ClaimServiceClient.PostClaim(ctx, PostClaimRequest{Beneficiary: beneficiary, Amount: amount, ClaimID: int(id)}) + client := lazyLoad() + res, err := client.PostClaim(ctx, PostClaimRequest{Beneficiary: beneficiary, Amount: amount, ClaimID: int(id)}) if err != nil { return } diff --git a/config/config.go b/config/config.go index 6828782..9ba7e60 100644 --- a/config/config.go +++ b/config/config.go @@ -66,7 +66,7 @@ func DefaultConfig() *Config { MqttPort: 1886, MqttUser: "user", MqttPassword: "password", - ClaimHost: "testnet-p2r.rddl.io", + ClaimHost: "https://testnet-p2r.rddl.io", MqttTLS: true, } } diff --git a/docs/static/openapi.yml b/docs/static/openapi.yml index e0d11ec..88419cc 100644 --- a/docs/static/openapi.yml +++ b/docs/static/openapi.yml @@ -46437,7 +46437,7 @@ paths: } tags: - Query - /planetmint/asset/address/{address}/{lookupPeriodInMin}: + /planetmint/asset/address/{address}/{numElements}: get: summary: Queries a list of GetCIDsByAddress items. operationId: PlanetmintgoAssetGetCIDsByAddress @@ -46502,7 +46502,7 @@ paths: in: path required: true type: string - - name: lookupPeriodInMin + - name: numElements in: path required: true type: string diff --git a/go.mod b/go.mod index 66a08c4..ab1e1b9 100644 --- a/go.mod +++ b/go.mod @@ -8,8 +8,8 @@ require ( cosmossdk.io/errors v1.0.1 cosmossdk.io/math v1.2.0 cosmossdk.io/simapp v0.0.0-20230323161446-0af178d721ff - github.com/btcsuite/btcd v0.23.2 - github.com/btcsuite/btcd/btcutil v1.1.2 + github.com/btcsuite/btcd v0.24.0 + github.com/btcsuite/btcd/btcutil v1.1.5 github.com/cometbft/cometbft v0.37.4 github.com/cometbft/cometbft-db v0.8.0 github.com/cosmos/cosmos-proto v1.0.0-beta.2 @@ -19,12 +19,13 @@ require ( github.com/cosmos/ibc-go/v7 v7.4.0 github.com/eclipse/paho.mqtt.golang v1.4.3 github.com/golang/mock v1.6.0 - github.com/golang/protobuf v1.5.3 + github.com/golang/protobuf v1.5.4 github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2 github.com/planetmint/planetmint-go/lib v0.5.0 github.com/rddl-network/elements-rpc v1.0.0 + github.com/rddl-network/go-utils v0.1.1 github.com/spf13/cast v1.6.0 github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 @@ -56,7 +57,7 @@ require ( github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect + github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 // indirect github.com/cenkalti/backoff/v4 v4.1.3 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect @@ -112,7 +113,7 @@ require ( github.com/gtank/merlin v0.1.1 // indirect github.com/gtank/ristretto255 v0.1.2 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-getter v1.7.1 // indirect + github.com/hashicorp/go-getter v1.7.5 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-safetemp v1.0.0 // indirect github.com/hashicorp/go-version v1.6.0 // indirect @@ -169,20 +170,20 @@ require ( go.opentelemetry.io/otel v1.19.0 // indirect go.opentelemetry.io/otel/metric v1.19.0 // indirect go.opentelemetry.io/otel/trace v1.19.0 // indirect - golang.org/x/crypto v0.17.0 // indirect + golang.org/x/crypto v0.21.0 // indirect golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb // indirect - golang.org/x/net v0.19.0 // indirect + golang.org/x/net v0.23.0 // indirect golang.org/x/oauth2 v0.15.0 // indirect golang.org/x/sync v0.5.0 // indirect - golang.org/x/sys v0.16.0 // indirect - golang.org/x/term v0.15.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/term v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect google.golang.org/api v0.152.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 // indirect - google.golang.org/protobuf v1.32.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect nhooyr.io/websocket v1.8.6 // indirect diff --git a/go.sum b/go.sum index 2a77f12..cb5fe99 100644 --- a/go.sum +++ b/go.sum @@ -257,20 +257,21 @@ github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2 github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= -github.com/btcsuite/btcd v0.23.0/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= -github.com/btcsuite/btcd v0.23.2 h1:/YOgUp25sdCnP5ho6Hl3s0E438zlX+Kak7E6TgBgoT0= -github.com/btcsuite/btcd v0.23.2/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= +github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A= +github.com/btcsuite/btcd v0.24.0 h1:gL3uHE/IaFj6fcZSu03SvqPMSx7s/dPzfpG/atRwWdo= +github.com/btcsuite/btcd v0.24.0/go.mod h1:K4IDc1593s8jKXIF7yS7yCTSxrknB9z0STzc2j6XgE4= github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= -github.com/btcsuite/btcd/btcutil v1.1.2 h1:XLMbX8JQEiwMcYft2EGi8zPUkoa0abKIU6/BJSRsjzQ= -github.com/btcsuite/btcd/btcutil v1.1.2/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= +github.com/btcsuite/btcd/btcutil v1.1.5 h1:+wER79R5670vs/ZusMTF1yTcRYE5GUsFbdjdisflzM8= +github.com/btcsuite/btcd/btcutil v1.1.5/go.mod h1:PSZZ4UitpLBWzxGd5VGOrLnmOjtPP/a6HaFo12zMs00= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ= +github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= @@ -528,8 +529,8 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -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/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= @@ -641,8 +642,8 @@ github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtng github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.7.1 h1:SWiSWN/42qdpR0MdhaOc/bLR48PLuP1ZQtYLRlM69uY= -github.com/hashicorp/go-getter v1.7.1/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= +github.com/hashicorp/go-getter v1.7.5 h1:dT58k9hQ/vbxNMwoI5+xFYAJuv6152UNvdHokfI5wE4= +github.com/hashicorp/go-getter v1.7.5/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -894,6 +895,8 @@ github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5X github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rddl-network/elements-rpc v1.0.0 h1:geFcsaD1t2ONxRC13semPpiOwsJl0ZCfkFT9UIKPZFk= github.com/rddl-network/elements-rpc v1.0.0/go.mod h1:E35cJMXZqe1iEo/AvjwSWn25mHZ4+y4gV8qj0lWle5c= +github.com/rddl-network/go-utils v0.1.1 h1:41ZrDMM2ree7/OfhKYK4j/SQnyVvms4YirTKneibeyk= +github.com/rddl-network/go-utils v0.1.1/go.mod h1:xKO/ZSAEHwcYe8bNUZjcQCIX+6OMXzEXu1WQ1HqXqZA= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -1043,8 +1046,8 @@ golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -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/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= 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= @@ -1145,8 +1148,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= 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= @@ -1285,13 +1288,13 @@ golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.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/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.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.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -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/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= 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= @@ -1614,8 +1617,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= 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= diff --git a/lib/go.mod b/lib/go.mod index 33e3b0c..2fffae5 100644 --- a/lib/go.mod +++ b/lib/go.mod @@ -32,10 +32,10 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect - github.com/btcsuite/btcd v0.23.2 // indirect + github.com/btcsuite/btcd v0.24.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/btcsuite/btcd/btcutil v1.1.2 // indirect - github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect + github.com/btcsuite/btcd/btcutil v1.1.5 // indirect + github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 // indirect github.com/cenkalti/backoff/v4 v4.1.3 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect @@ -80,7 +80,7 @@ require ( github.com/golang/glog v1.1.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/mock v1.6.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/btree v1.1.2 // indirect github.com/google/go-cmp v0.5.9 // indirect @@ -98,7 +98,7 @@ require ( github.com/gtank/merlin v0.1.1 // indirect github.com/gtank/ristretto255 v0.1.2 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-getter v1.7.1 // indirect + github.com/hashicorp/go-getter v1.7.5 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-safetemp v1.0.0 // indirect github.com/hashicorp/go-version v1.6.0 // indirect @@ -157,13 +157,13 @@ require ( github.com/zondax/ledger-go v0.14.1 // indirect go.etcd.io/bbolt v1.3.7 // indirect go.opencensus.io v0.24.0 // indirect - golang.org/x/crypto v0.17.0 // indirect + golang.org/x/crypto v0.21.0 // indirect golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb // indirect - golang.org/x/net v0.17.0 // indirect + golang.org/x/net v0.23.0 // indirect golang.org/x/oauth2 v0.8.0 // indirect golang.org/x/sync v0.2.0 // indirect - golang.org/x/sys v0.15.0 // indirect - golang.org/x/term v0.15.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/term v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/api v0.126.0 // indirect @@ -172,7 +172,7 @@ require ( google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect google.golang.org/grpc v1.56.3 // indirect - google.golang.org/protobuf v1.31.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/lib/go.sum b/lib/go.sum index 88c5f04..21609cc 100644 --- a/lib/go.sum +++ b/lib/go.sum @@ -258,20 +258,21 @@ github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2 github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= -github.com/btcsuite/btcd v0.23.0/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= -github.com/btcsuite/btcd v0.23.2 h1:/YOgUp25sdCnP5ho6Hl3s0E438zlX+Kak7E6TgBgoT0= -github.com/btcsuite/btcd v0.23.2/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= +github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A= +github.com/btcsuite/btcd v0.24.0 h1:gL3uHE/IaFj6fcZSu03SvqPMSx7s/dPzfpG/atRwWdo= +github.com/btcsuite/btcd v0.24.0/go.mod h1:K4IDc1593s8jKXIF7yS7yCTSxrknB9z0STzc2j6XgE4= github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= -github.com/btcsuite/btcd/btcutil v1.1.2 h1:XLMbX8JQEiwMcYft2EGi8zPUkoa0abKIU6/BJSRsjzQ= -github.com/btcsuite/btcd/btcutil v1.1.2/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= +github.com/btcsuite/btcd/btcutil v1.1.5 h1:+wER79R5670vs/ZusMTF1yTcRYE5GUsFbdjdisflzM8= +github.com/btcsuite/btcd/btcutil v1.1.5/go.mod h1:PSZZ4UitpLBWzxGd5VGOrLnmOjtPP/a6HaFo12zMs00= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ= +github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= @@ -527,8 +528,8 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -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/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= @@ -639,8 +640,8 @@ github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtng github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.7.1 h1:SWiSWN/42qdpR0MdhaOc/bLR48PLuP1ZQtYLRlM69uY= -github.com/hashicorp/go-getter v1.7.1/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= +github.com/hashicorp/go-getter v1.7.5 h1:dT58k9hQ/vbxNMwoI5+xFYAJuv6152UNvdHokfI5wE4= +github.com/hashicorp/go-getter v1.7.5/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -1049,8 +1050,8 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -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/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= 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= @@ -1154,8 +1155,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= 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= @@ -1298,13 +1299,13 @@ golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.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.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -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/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= 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= @@ -1628,8 +1629,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/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= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= 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= diff --git a/monitor/backend.go b/monitor/backend.go index 218c7c2..ff76767 100644 --- a/monitor/backend.go +++ b/monitor/backend.go @@ -3,6 +3,7 @@ package monitor import ( "encoding/json" "log" + "strconv" "time" "github.com/syndtr/goleveldb/leveldb/iterator" @@ -21,32 +22,31 @@ func (mms *MqttMonitor) AddParticipant(address string, lastSeenTS int64) (err er lastSeenBytes, err := json.Marshal(lastSeen) if err != nil { - mms.Log("[Monitor] Error serializing ConversionRequest: " + err.Error()) + log.Println("[app] [Monitor] Error serializing ConversionRequest: " + err.Error()) return } - increaseCounter := false + // returns an error if the entry does not exist (we have to increase the counter in this case) _, err = mms.db.Get([]byte(address), nil) if err != nil { - increaseCounter = true + mms.setNumDBElements(mms.getNumDBElements() + 1) } mms.dbMutex.Lock() - if increaseCounter { - mms.numberOfElements++ - } err = mms.db.Put([]byte(address), lastSeenBytes, nil) mms.dbMutex.Unlock() if err != nil { - log.Println("[Monitor] storing addresses in DB: " + err.Error()) - return + log.Println("[app] [Monitor] error storing addresses in DB: " + err.Error()) + } else { + log.Println("[app] [Monitor] stored address in DB: " + address) } + return } func (mms *MqttMonitor) deleteEntry(key []byte) (err error) { + mms.setNumDBElements(mms.getNumDBElements() - 1) mms.dbMutex.Lock() err = mms.db.Delete(key, nil) - mms.numberOfElements-- mms.dbMutex.Unlock() return } @@ -61,8 +61,11 @@ func (mms *MqttMonitor) getAmountOfElements() (amount int64, err error) { // Check for any errors encountered during iteration if err := iter.Error(); err != nil { - log.Println("[Monitor] " + err.Error()) + log.Println("[app] [Monitor] " + err.Error()) + } else { + log.Println("[app] [Monitor] elements: " + strconv.FormatInt(amount, 10)) } + return } func (mms *MqttMonitor) getDataFromIter(iter iterator.Iterator) (lastSeen LastSeenEvent, err error) { @@ -70,13 +73,14 @@ func (mms *MqttMonitor) getDataFromIter(iter iterator.Iterator) (lastSeen LastSe value := iter.Value() err = json.Unmarshal(value, &lastSeen) if err != nil { - mms.Log("[Monitor] Failed to unmarshal entry: " + string(key) + " - " + err.Error()) + log.Println("[app] [Monitor] Failed to unmarshal entry: " + string(key) + " - " + err.Error()) } return } func (mms *MqttMonitor) CleanupDB() { // Create an iterator for the database + log.Println("[app] [Monitor] Starting clean-up process") iter := mms.db.NewIterator(nil, nil) defer iter.Release() // Make sure to release the iterator at the end @@ -85,7 +89,7 @@ func (mms *MqttMonitor) CleanupDB() { // Use iter.Key() and iter.Value() to access the key and value lastSeen, err := mms.getDataFromIter(iter) if err != nil { - mms.Log("[Monitor] Failed to unmarshal entry: " + string(iter.Key()) + " - " + err.Error()) + log.Println("[app] [Monitor] Failed to unmarshal entry: " + string(iter.Key()) + " - " + err.Error()) continue } timeThreshold := time.Now().Add(-1 * mms.CleanupPeriodicityInMinutes * time.Minute).Unix() @@ -93,13 +97,15 @@ func (mms *MqttMonitor) CleanupDB() { // If the entry is older than 12 hours, delete it err := mms.deleteEntry(iter.Key()) if err != nil { - mms.Log("[Monitor] Failed to delete entry: " + err.Error()) + log.Println("[app] [Monitor] Failed to delete entry: " + err.Error()) + } else { + log.Println("[app] [Monitor] Delete entry: " + string(iter.Key())) } } } // Check for any errors encountered during iteration if err := iter.Error(); err != nil { - mms.Log(err.Error()) + log.Println("[app] [Monitor] error during cleanup : " + err.Error()) } } diff --git a/monitor/interface.go b/monitor/interface.go index 7789fab..f967e6b 100644 --- a/monitor/interface.go +++ b/monitor/interface.go @@ -3,7 +3,6 @@ package monitor import ( "sync" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/planetmint/planetmint-go/config" "github.com/syndtr/goleveldb/leveldb" ) @@ -11,11 +10,10 @@ import ( type MQTTMonitorClientI interface { AddParticipant(address string, lastSeenTS int64) (err error) SelectPoPParticipantsOutOfActiveActors() (challenger string, challengee string, err error) - SetContext(ctx sdk.Context) Start() (err error) } -var monitorMutex sync.Mutex +var monitorMutex sync.RWMutex var mqttMonitorInstance MQTTMonitorClientI func SetMqttMonitorInstance(monitorInstance MQTTMonitorClientI) { @@ -25,9 +23,9 @@ func SetMqttMonitorInstance(monitorInstance MQTTMonitorClientI) { } func LazyMqttMonitorLoader(homeDir string) { - monitorMutex.Lock() + monitorMutex.RLock() tmpInstance := mqttMonitorInstance - monitorMutex.Unlock() + monitorMutex.RUnlock() if tmpInstance != nil { return } @@ -38,25 +36,18 @@ func LazyMqttMonitorLoader(homeDir string) { if err != nil { panic(err) } - monitorMutex.Lock() - mqttMonitorInstance = NewMqttMonitorService(aciveActorsDB, *config.GetConfig()) - monitorMutex.Unlock() + + SetMqttMonitorInstance(NewMqttMonitorService(aciveActorsDB, *config.GetConfig())) err = mqttMonitorInstance.Start() if err != nil { panic(err) } } -func SetContext(ctx sdk.Context) { - monitorMutex.Lock() - mqttMonitorInstance.SetContext(ctx) - monitorMutex.Unlock() -} - func SelectPoPParticipantsOutOfActiveActors() (challenger string, challengee string, err error) { - monitorMutex.Lock() + monitorMutex.RLock() challenger, challengee, err = mqttMonitorInstance.SelectPoPParticipantsOutOfActiveActors() - monitorMutex.Unlock() + monitorMutex.RUnlock() return } @@ -66,8 +57,8 @@ func Start() (err error) { } func AddParticipant(address string, lastSeenTS int64) (err error) { - monitorMutex.Lock() + monitorMutex.RLock() err = mqttMonitorInstance.AddParticipant(address, lastSeenTS) - monitorMutex.Unlock() + monitorMutex.RUnlock() return } diff --git a/monitor/mocks/mqtt_monitor.go b/monitor/mocks/mqtt_monitor.go index a08e814..4553f00 100644 --- a/monitor/mocks/mqtt_monitor.go +++ b/monitor/mocks/mqtt_monitor.go @@ -1,8 +1,6 @@ package mocks -import ( - types "github.com/cosmos/cosmos-sdk/types" -) +import "log" // MockMQTTMonitorClientI is a mock of MQTTMonitorClientI interface. type MockMQTTMonitorClientI struct { @@ -11,6 +9,7 @@ type MockMQTTMonitorClientI struct { // AddParticipant mocks base method. func (m *MockMQTTMonitorClientI) AddParticipant(address string, _ int64) error { + log.Println("[app] [Monitor] [Mock] added participant: " + address) m.myStringList = append(m.myStringList, address) return nil @@ -24,13 +23,10 @@ func (m *MockMQTTMonitorClientI) SelectPoPParticipantsOutOfActiveActors() (strin challenger = m.myStringList[amount-2] challengee = m.myStringList[amount-1] } + log.Println("[app] [Monitor] [Mock] participants: " + challenger + ", " + challengee) return challenger, challengee, nil } -// SetContext mocks base method. -func (m *MockMQTTMonitorClientI) SetContext(_ types.Context) { -} - // Start mocks base method. func (m *MockMQTTMonitorClientI) Start() error { return nil diff --git a/monitor/mqtt_monitor.go b/monitor/mqtt_monitor.go index 6029788..c56aff9 100644 --- a/monitor/mqtt_monitor.go +++ b/monitor/mqtt_monitor.go @@ -1,9 +1,14 @@ package monitor import ( + "context" "crypto/tls" + "encoding/json" + "io" + "log" "math/rand" "net" + "net/http" "strconv" "strings" "sync" @@ -21,14 +26,19 @@ var MonitorMQTTClient util.MQTTClientI type MqttMonitor struct { db *leveldb.DB dbMutex sync.Mutex // Mutex to synchronize write operations - ticker *time.Ticker CleanupPeriodicityInMinutes time.Duration config config.Config + numberOfElementsMutex sync.RWMutex numberOfElements int64 sdkContext *sdk.Context contextMutex sync.Mutex isTerminated bool - terminationMutex sync.Mutex + terminationMutex sync.RWMutex + maxRetries time.Duration + lostConnection bool + lostConnectionMutex sync.Mutex + clientMutex sync.Mutex + localMqttClient util.MQTTClientI } func (mms *MqttMonitor) Terminate() { @@ -38,15 +48,32 @@ func (mms *MqttMonitor) Terminate() { } func (mms *MqttMonitor) IsTerminated() (isTerminated bool) { - mms.terminationMutex.Lock() + mms.terminationMutex.RLock() isTerminated = mms.isTerminated - mms.terminationMutex.Unlock() + mms.terminationMutex.RUnlock() return } -func LazyLoadMonitorMQTTClient() { +func (mms *MqttMonitor) getNumDBElements() int64 { + mms.numberOfElementsMutex.RLock() + defer mms.numberOfElementsMutex.RUnlock() + return mms.numberOfElements +} + +func (mms *MqttMonitor) setNumDBElements(numElements int64) { + mms.numberOfElementsMutex.Lock() + defer mms.numberOfElementsMutex.Unlock() + mms.numberOfElements = numElements +} + +func getClientID() string { + conf := config.GetConfig() + return "monitor-" + conf.ValidatorAddress +} + +func (mms *MqttMonitor) lazyLoadMonitorMQTTClient() util.MQTTClientI { if MonitorMQTTClient != nil { - return + return MonitorMQTTClient } conf := config.GetConfig() @@ -56,16 +83,19 @@ func LazyLoadMonitorMQTTClient() { uri = "ssl://" + hostPort } - opts := mqtt.NewClientOptions().AddBroker(uri) - opts.SetClientID(conf.ValidatorAddress + "-monitor") + opts := mqtt.NewClientOptions().AddBroker(uri).SetKeepAlive(time.Second * 60).SetCleanSession(true) + opts.SetClientID(getClientID()) opts.SetUsername(conf.MqttUser) opts.SetPassword(conf.MqttPassword) + opts.SetConnectionLostHandler(mms.onConnectionLost) if conf.MqttTLS { tlsConfig := &tls.Config{} opts.SetTLSConfig(tlsConfig) } - MonitorMQTTClient = mqtt.NewClient(opts) + log.Println("[app] [Monitor] create new client") + client := mqtt.NewClient(opts) + return client } func NewMqttMonitorService(db *leveldb.DB, config config.Config) *MqttMonitor { @@ -73,13 +103,20 @@ func NewMqttMonitorService(db *leveldb.DB, config config.Config) *MqttMonitor { return service } -func (mms *MqttMonitor) registerPeriodicTasks() { - mms.ticker = time.NewTicker(mms.CleanupPeriodicityInMinutes * time.Minute) - go func() { - for range mms.ticker.C { // Loop over the ticker channel +func (mms *MqttMonitor) runPeriodicTasks() { + tickerRestablishConnection := time.NewTicker(2 * time.Minute) + tickerCleanup := time.NewTicker(5 * time.Minute) + defer tickerRestablishConnection.Stop() + defer tickerCleanup.Stop() + + for !mms.IsTerminated() { + select { + case <-tickerRestablishConnection.C: + go mms.MonitorActiveParticipants() + case <-tickerCleanup.C: go mms.CleanupDB() } - }() + } } func (mms *MqttMonitor) Start() (err error) { @@ -87,36 +124,39 @@ func (mms *MqttMonitor) Start() (err error) { if err != nil { return } - mms.numberOfElements = amount - mms.registerPeriodicTasks() + mms.setNumDBElements(amount) + go mms.runPeriodicTasks() go mms.MonitorActiveParticipants() + go mms.CleanupDB() return } func (mms *MqttMonitor) getRandomNumbers() (challenger int, challengee int) { for challenger == challengee { // Generate random numbers - challenger = rand.Intn(int(mms.numberOfElements)) - challengee = rand.Intn(int(mms.numberOfElements)) + numElements := int(mms.getNumDBElements()) + challenger = rand.Intn(numElements) + challengee = rand.Intn(numElements) } return } func (mms *MqttMonitor) SelectPoPParticipantsOutOfActiveActors() (challenger string, challengee string, err error) { - if mms.numberOfElements < 2 { + numElements := int(mms.getNumDBElements()) + if numElements < 2 { return } randomChallenger, randomChallengee := mms.getRandomNumbers() - mms.Log("[Monitor] number of elements: " + strconv.Itoa(int(mms.numberOfElements))) - mms.Log("[Monitor] selected IDs: " + strconv.Itoa(randomChallenger) + " " + strconv.Itoa(randomChallengee)) + log.Println("[app] [Monitor] number of elements: " + strconv.Itoa(numElements)) + log.Println("[app] [Monitor] selected IDs: " + strconv.Itoa(randomChallenger) + " " + strconv.Itoa(randomChallengee)) iter := mms.db.NewIterator(nil, nil) defer iter.Release() count := 0 found := 0 var lastSeen LastSeenEvent for iter.Next() { - mms.Log("[Monitor] count: " + strconv.Itoa(count)) if count == randomChallenger { lastSeen, err = mms.getDataFromIter(iter) if err != nil { + log.Println("[app] [Monitor] could not get Data from ID" + strconv.Itoa(randomChallenger)) return } challenger = lastSeen.Address @@ -124,6 +164,7 @@ func (mms *MqttMonitor) SelectPoPParticipantsOutOfActiveActors() (challenger str } else if count == randomChallengee { lastSeen, err = mms.getDataFromIter(iter) if err != nil { + log.Println("[app] [Monitor] could not get Data from ID" + strconv.Itoa(randomChallengee)) return } challengee = lastSeen.Address @@ -135,6 +176,7 @@ func (mms *MqttMonitor) SelectPoPParticipantsOutOfActiveActors() (challenger str break } } + log.Println("[app] [Monitor] challenger, challengee: " + challenger + " " + challengee) return } @@ -157,59 +199,183 @@ func (mms *MqttMonitor) MqttMsgHandler(_ mqtt.Client, msg mqtt.Message) { if err != nil || !valid { return } - payload, err := util.ToJSON(msg.Payload()) - if err != nil { + + active, err := IsLegitMachineAddress(address) + if err != nil || !active { return } - timeString, ok := payload["Time"].(string) - if !ok { - return - } - unixTime, err := util.String2UnixTime(timeString) - if err != nil { - return - } + unixTime := time.Now().Unix() err = mms.AddParticipant(address, unixTime) + if err != nil { - mms.Log("[Monitor] error adding active actor to DB: " + address + " " + err.Error()) + log.Println("[app] [Monitor] error adding active actor to DB: " + address + " " + err.Error()) } else { - mms.Log("[Monitor] added active actor to DB: " + address) + log.Println("[app] [Monitor] added active actor to DB: " + address) + } +} + +func IsLegitMachineAddress(address string) (active bool, err error) { + url := "http://localhost:1317/planetmint/machine/address/" + address + + // Create a new HTTP client + client := &http.Client{} + + // Create a new request + ctx := context.Background() + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + if err != nil { + log.Println("[app] [Monitor] cannot send machine query request " + err.Error()) + return + } + + // Set the header + req.Header.Set("Accept", "application/json") + + // Send the request + resp, err := client.Do(req) + if err != nil { + log.Println("[app] [Monitor] cannot connect to server: " + err.Error()) + return + } + + // Close the response body + defer resp.Body.Close() + + // Read the response body + body, err := io.ReadAll(resp.Body) + if err != nil { + log.Println("[app] [Monitor] cannot read response: " + err.Error()) + return + } + + // Check the status code + if resp.StatusCode != http.StatusOK { + log.Printf("[app] [Monitor] Error: unexpected status code: " + string(body)) + return + } + + // Unmarshal the response body into a map + var data map[string]interface{} + err = json.Unmarshal(body, &data) + if err != nil { + log.Println("[app] [Monitor] cannot unmarshal response " + err.Error()) + return + } + + // Check if the "info" key exists + machineValue, ok := data["machine"] + if !ok { + log.Println("[app] [Monitor] response does not contain the required machine") + return + } + machineMap, ok := machineValue.(map[string]interface{}) + if !ok { + log.Println("[app] [Monitor] cannot convert machine map") + return + } + addressMap, ok := machineMap["address"] + if !ok { + log.Println("[app] [Monitor] response does not contain the required name") + return + } + value, ok := addressMap.(string) + if !ok || value != address { + log.Println("[app] [Monitor] return machine is not the required one") + return + } + + err = nil + active = true + return +} + +func (mms *MqttMonitor) onConnectionLost(_ mqtt.Client, err error) { + log.Println("[app] [Monitor] Connection lost: " + err.Error()) + // Handle connection loss here (e.g., reconnect attempts, logging) + if !mms.IsTerminated() { + mms.lostConnectionMutex.Lock() + mms.lostConnection = true + mms.lostConnectionMutex.Unlock() } } func (mms *MqttMonitor) MonitorActiveParticipants() { - LazyLoadMonitorMQTTClient() - for !mms.IsTerminated() { - if !MonitorMQTTClient.IsConnected() { - if token := MonitorMQTTClient.Connect(); token.Wait() && token.Error() != nil { - mms.Log("[Monitor] error connecting to mqtt: " + token.Error().Error()) - panic(token.Error()) - } - - var messageHandler mqtt.MessageHandler = mms.MqttMsgHandler - - // Subscribe to a topic - subscriptionTopic := "tele/#" - if token := MonitorMQTTClient.Subscribe(subscriptionTopic, 0, messageHandler); token.Wait() && token.Error() != nil { - mms.Log("[Monitor] error registering the mqtt subscription: " + token.Error().Error()) - panic(token.Error()) - } - } - time.Sleep(5 * time.Second) + mms.clientMutex.Lock() + if mms.localMqttClient != nil { + log.Println("[app] [Monitor] client is still working") + mms.clientMutex.Unlock() + return } + mms.localMqttClient = mms.lazyLoadMonitorMQTTClient() + mqttClient := mms.localMqttClient + mms.clientMutex.Unlock() + + // Maximum reconnection attempts (adjust as needed) + mms.SetMaxRetries() + for !mms.IsTerminated() && mms.maxRetries > 0 { + if token := mqttClient.Connect(); token.Wait() && token.Error() != nil { + log.Println("[app] [Monitor] error connecting to mqtt: " + token.Error().Error()) + mms.maxRetries-- + time.Sleep(time.Second * 5) + continue + } + mms.lostConnectionMutex.Lock() + mms.lostConnection = false + mms.lostConnectionMutex.Unlock() + + log.Println("[app] [Monitor] established connection") + + var messageHandler mqtt.MessageHandler = mms.MqttMsgHandler + + // Subscribe to a topic + subscriptionTopic := "tele/#" + if token := mqttClient.Subscribe(subscriptionTopic, 0, messageHandler); token.Wait() && token.Error() != nil { + log.Println("[app] [Monitor] error registering the mqtt subscription: " + token.Error().Error()) + continue + } + log.Println("[app] [Monitor] subscribed to tele/# channels") + + for !mms.IsTerminated() { + mms.lostConnectionMutex.Lock() + lostConnectionEvent := mms.lostConnection + mms.lostConnectionMutex.Unlock() + if !mqttClient.IsConnected() || !mqttClient.IsConnectionOpen() || lostConnectionEvent { + log.Println("[app] [Monitor] retry establishing a connection") + break // Exit inner loop on disconnect + } + + SendUpdateMessage(mqttClient) + mms.SetMaxRetries() + time.Sleep(60 * time.Second) // Adjust sleep time based on your needs + } + } + + if mms.maxRetries == 0 { + log.Println("[app] [Monitor] Reached maximum reconnection attempts. Exiting. New client will be activated soon.") + } + + mms.clientMutex.Lock() + mms.localMqttClient = nil + mms.clientMutex.Unlock() +} + +func SendUpdateMessage(mqttClient util.MQTTClientI) { + // Publish message + now := time.Now().Format("2006-01-02 15:04:05") // Adjust format as needed + token := mqttClient.Publish("tele/"+getClientID(), 1, false, now) + token.Wait() +} + +func (mms *MqttMonitor) SetMaxRetries() { + mms.maxRetries = 5 } func (mms *MqttMonitor) Log(msg string) { mms.contextMutex.Lock() - if mms.sdkContext != nil { - util.GetAppLogger().Info(*mms.sdkContext, msg) + localContext := mms.sdkContext + mms.contextMutex.Unlock() + if localContext != nil { + util.GetAppLogger().Info(*localContext, msg) } - mms.contextMutex.Unlock() -} - -func (mms *MqttMonitor) SetContext(ctx sdk.Context) { - mms.contextMutex.Lock() - mms.sdkContext = &ctx - mms.contextMutex.Unlock() } diff --git a/monitor/mqtt_monitor_test.go b/monitor/mqtt_monitor_test.go index c36c1ed..3ca1a0b 100644 --- a/monitor/mqtt_monitor_test.go +++ b/monitor/mqtt_monitor_test.go @@ -23,7 +23,6 @@ const ( ) func TestGMonitorActiveParticipants(t *testing.T) { - monitor.LazyLoadMonitorMQTTClient() cfg := config.GetConfig() db, err := leveldb.Open(storage.NewMemStorage(), nil) assert.NoError(t, err) @@ -49,8 +48,6 @@ func TestGMonitorActiveParticipants(t *testing.T) { } func TestCleanupRemoval(t *testing.T) { - monitor.LazyLoadMonitorMQTTClient() - cfg := config.GetConfig() db, err := leveldb.Open(storage.NewMemStorage(), nil) assert.NoError(t, err) @@ -77,8 +74,6 @@ func TestCleanupRemoval(t *testing.T) { } func TestCleanupPrecisionTest(t *testing.T) { - monitor.LazyLoadMonitorMQTTClient() - cfg := config.GetConfig() db, err := leveldb.Open(storage.NewMemStorage(), nil) assert.NoError(t, err) @@ -104,3 +99,10 @@ func TestCleanupPrecisionTest(t *testing.T) { assert.Contains(t, challengee, "plmnt") mqttMonitor.Terminate() } + +func TestIsLegitMachineAddress(t *testing.T) { + t.SkipNow() + active, err := monitor.IsLegitMachineAddress("plmnt1z6xmwqfnn9mvean9gsd57segawgjykpxw8hq5t") + assert.NoError(t, err) + assert.Equal(t, active, true) +} diff --git a/proto/planetmintgo/asset/asset.proto b/proto/planetmintgo/asset/asset.proto deleted file mode 100644 index 8ef5375..0000000 --- a/proto/planetmintgo/asset/asset.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; -package planetmintgo.asset; - -option go_package = "github.com/planetmint/planetmint-go/x/asset/types"; - -message Asset { - string cid = 1; -} diff --git a/proto/planetmintgo/asset/query.proto b/proto/planetmintgo/asset/query.proto index cfa3ab4..655c6e2 100644 --- a/proto/planetmintgo/asset/query.proto +++ b/proto/planetmintgo/asset/query.proto @@ -20,7 +20,7 @@ service Query { // Queries a list of GetCIDsByAddress items. rpc GetCIDsByAddress (QueryGetCIDsByAddressRequest) returns (QueryGetCIDsByAddressResponse) { - option (google.api.http).get = "/planetmint/asset/address/{address}/{lookupPeriodInMin}"; + option (google.api.http).get = "/planetmint/asset/address/{address}/{numElements}"; } @@ -42,7 +42,7 @@ message QueryParamsResponse { message QueryGetCIDsByAddressRequest { string address = 1; - uint64 lookupPeriodInMin = 2; + uint64 numElements = 2; cosmos.base.query.v1beta1.PageRequest pagination = 3; } diff --git a/tests/e2e/dao/gas/gas_consumption_suite.go b/tests/e2e/dao/gas/gas_consumption_suite.go index 5ee6de7..059cb09 100644 --- a/tests/e2e/dao/gas/gas_consumption_suite.go +++ b/tests/e2e/dao/gas/gas_consumption_suite.go @@ -109,6 +109,7 @@ func (s *ConsumptionE2ETestSuite) TestValidatorConsumption() { out, err := lib.BroadcastTxWithFileLock(val.Address, msgs...) s.Require().NoError(err) + s.Require().NoError(s.network.WaitForNextBlock()) s.Require().NoError(s.network.WaitForNextBlock()) _, err = clitestutil.GetRawLogFromTxOut(val, out) diff --git a/tests/e2e/dao/pop/selection_suite.go b/tests/e2e/dao/pop/selection_suite.go index 60c061e..0b001fb 100644 --- a/tests/e2e/dao/pop/selection_suite.go +++ b/tests/e2e/dao/pop/selection_suite.go @@ -164,9 +164,9 @@ func (s *SelectionE2ETestSuite) TestPopSelectionNoActors() { } func (s *SelectionE2ETestSuite) TestPopSelectionOneActors() { - err := e2etestutil.AttestMachine(s.network, machines[0].name, machines[0].mnemonic, 0, s.feeDenom) + err := monitor.AddParticipant(machines[0].address, time.Now().Unix()) s.Require().NoError(err) - err = monitor.AddParticipant(machines[0].address, time.Now().Unix()) + err = e2etestutil.AttestMachine(s.network, machines[0].name, machines[0].mnemonic, 0, s.feeDenom) s.Require().NoError(err) out := s.perpareLocalTest() @@ -176,9 +176,9 @@ func (s *SelectionE2ETestSuite) TestPopSelectionOneActors() { } func (s *SelectionE2ETestSuite) TestPopSelectionTwoActors() { - err := e2etestutil.AttestMachine(s.network, machines[1].name, machines[1].mnemonic, 1, s.feeDenom) + err := monitor.AddParticipant(machines[1].address, time.Now().Unix()) s.Require().NoError(err) - err = monitor.AddParticipant(machines[1].address, time.Now().Unix()) + err = e2etestutil.AttestMachine(s.network, machines[1].name, machines[1].mnemonic, 1, s.feeDenom) s.Require().NoError(err) out := s.perpareLocalTest() @@ -289,6 +289,8 @@ func (s *SelectionE2ETestSuite) TestTokenRedeemClaim() { s.Require().NoError(err) s.Require().NoError(s.network.WaitForNextBlock()) + s.Require().NoError(s.network.WaitForNextBlock()) // added another waiting block to pass CI test cases (they are a bit slower) + _, err = clitestutil.GetRawLogFromTxOut(val, out) s.Require().ErrorContains(err, "failed to execute message; message index: 0: expected: plmnt19cl05ztgt8ey6v86hjjjn3thfmpu6q2xtveehc; got: plmnt1kp93kns6hs2066d8qw0uz84fw3vlthewt2ck6p: invalid claim address") diff --git a/tests/e2e/machine/suite.go b/tests/e2e/machine/suite.go index 029f8ba..2a1008b 100644 --- a/tests/e2e/machine/suite.go +++ b/tests/e2e/machine/suite.go @@ -68,6 +68,7 @@ func (s *E2ETestSuite) TestAttestMachine() { out, err := e2etestutil.BuildSignBroadcastTx(s.T(), val.Address, msg1) s.Require().NoError(err) + s.Require().NoError(s.network.WaitForNextBlock()) s.Require().NoError(s.network.WaitForNextBlock()) rawLog, err := clitestutil.GetRawLogFromTxOut(val, out) s.Require().NoError(err) diff --git a/testutil/e2e/e2e.go b/testutil/e2e/e2e.go index 92cb05a..91facf6 100644 --- a/testutil/e2e/e2e.go +++ b/testutil/e2e/e2e.go @@ -44,6 +44,10 @@ func FundAccount(network *network.Network, account *keyring.Record, tokenDenom s return err } + err = network.WaitForNextBlock() + if err != nil { + return err + } err = network.WaitForNextBlock() if err != nil { return err @@ -99,6 +103,10 @@ func AttestMachine(network *network.Network, name string, mnemonic string, num i return err } + err = network.WaitForNextBlock() + if err != nil { + return err + } err = network.WaitForNextBlock() if err != nil { return err diff --git a/util/kv_serialize.go b/util/kv_serialize.go index 764ee4e..9aad528 100644 --- a/util/kv_serialize.go +++ b/util/kv_serialize.go @@ -19,6 +19,19 @@ func DeserializeInt64(value []byte) int64 { return int64(integer - 1) } +func SerializeUint64(value uint64) []byte { + buf := make([]byte, 8) + // Adding 1 because 0 will be interpreted as nil, which is an invalid key + binary.BigEndian.PutUint64(buf, value+1) + return buf +} + +func DeserializeUint64(value []byte) uint64 { + integer := binary.BigEndian.Uint64(value) + // Subtract 1 because addition in serialization + return integer - 1 +} + func SerializeString(value string) []byte { byteArray := []byte(value) return byteArray diff --git a/util/logger.go b/util/logger.go index abf6b2c..1ad7fdf 100644 --- a/util/logger.go +++ b/util/logger.go @@ -16,7 +16,7 @@ var ( globalApplicationLoggerTag string appLogger *AppLogger initAppLogger sync.Once - syncTestingLog sync.Mutex + syncTestingLog sync.RWMutex ) func init() { @@ -48,13 +48,13 @@ func format(msg string, keyvals ...interface{}) string { } func (logger *AppLogger) testingLog(msg string, keyvals ...interface{}) { + syncTestingLog.RLock() + defer syncTestingLog.RUnlock() if logger.testingLogger == nil { return } msg = format(msg, keyvals...) - syncTestingLog.Lock() logger.testingLogger.Logf(msg) - syncTestingLog.Unlock() } func (logger *AppLogger) Info(ctx sdk.Context, msg string, keyvals ...interface{}) { diff --git a/util/mocks/mqtt.go b/util/mocks/mqtt.go index 0d6bdfd..be8e368 100644 --- a/util/mocks/mqtt.go +++ b/util/mocks/mqtt.go @@ -9,14 +9,15 @@ import ( // MockMQTTClient is the mock mqtt client type MockMQTTClient struct { - ConnectFunc func() mqtt.Token - DisconnectFunc func(quiesce uint) - PublishFunc func(topic string, qos byte, retained bool, payload interface{}) mqtt.Token - SubscribeFunc func(topic string, qos byte, callback mqtt.MessageHandler) mqtt.Token - UnsubscribeFunc func(topics ...string) mqtt.Token - IsConnectedFunc func() bool - connected bool - connectedMutex sync.Mutex + ConnectFunc func() mqtt.Token + DisconnectFunc func(quiesce uint) + PublishFunc func(topic string, qos byte, retained bool, payload interface{}) mqtt.Token + SubscribeFunc func(topic string, qos byte, callback mqtt.MessageHandler) mqtt.Token + UnsubscribeFunc func(topics ...string) mqtt.Token + IsConnectedFunc func() bool + IsConnectionOpenFunc func() bool + connected bool + connectedMutex sync.Mutex } // GetConnectFunc fetches the mock client's `Connect` func @@ -129,3 +130,10 @@ func (m *MockMQTTClient) IsConnected() bool { m.connectedMutex.Unlock() return connected } + +func (m *MockMQTTClient) IsConnectionOpen() bool { + m.connectedMutex.Lock() + connected := m.connected + m.connectedMutex.Unlock() + return connected +} diff --git a/util/mqtt.go b/util/mqtt.go index a288235..49f7305 100644 --- a/util/mqtt.go +++ b/util/mqtt.go @@ -23,6 +23,7 @@ type MQTTClientI interface { Subscribe(topic string, qos byte, callback mqtt.MessageHandler) mqtt.Token Unsubscribe(topics ...string) mqtt.Token IsConnected() bool + IsConnectionOpen() bool } var ( diff --git a/util/time.go b/util/time.go deleted file mode 100644 index e718b38..0000000 --- a/util/time.go +++ /dev/null @@ -1,23 +0,0 @@ -package util - -import ( - "time" -) - -func String2UnixTime(timeInput string) (int64, error) { - // Layout specifying the format of the input string - // Note: Go uses a specific reference time (Mon Jan 2 15:04:05 MST 2006) to define format layouts - layout := "2006-01-02T15:04:05" - - // Parse the string into a time.Time struct in local time zone - parsedTime, err := time.Parse(layout, timeInput) - if err != nil { - return 0, err - } - - // Convert to UTC if not already - utcTime := parsedTime.UTC() - unixTime := utcTime.Unix() - - return unixTime, nil -} diff --git a/util/time_test.go b/util/time_test.go deleted file mode 100644 index d56c517..0000000 --- a/util/time_test.go +++ /dev/null @@ -1,15 +0,0 @@ -package util - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestString2UnixTime(t *testing.T) { - t.Parallel() - input := "2024-03-26T11:10:41" - unixTime, err := String2UnixTime(input) - assert.NoError(t, err) - assert.Equal(t, int64(1711451441), unixTime) -} diff --git a/util/validate_signature.go b/util/validate_signature.go deleted file mode 100644 index e72d807..0000000 --- a/util/validate_signature.go +++ /dev/null @@ -1,53 +0,0 @@ -package util - -import ( - "encoding/hex" - "errors" - - "github.com/btcsuite/btcd/btcutil/hdkeychain" - "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" -) - -func ValidateSignature(message string, signature string, publicKey string) (bool, error) { - // Convert the message, signature, and public key from hex to bytes - messageBytes, err := hex.DecodeString(message) - if err != nil { - return false, errors.New("invalid message hex string") - } - return ValidateSignatureByteMsg(messageBytes, signature, publicKey) -} - -func ValidateSignatureByteMsg(message []byte, signature string, publicKey string) (bool, error) { - // Convert signature, and public key from hex to bytes - signatureBytes, err := hex.DecodeString(signature) - if err != nil { - return false, errors.New("invalid signature hex string") - } - publicKeyBytes, err := hex.DecodeString(publicKey) - if err != nil { - return false, errors.New("invalid public key hex string") - } - - // Create a secp256k1 public key object - pubKey := &secp256k1.PubKey{Key: publicKeyBytes} - - // Verify the signature - isValid := pubKey.VerifySignature(message, signatureBytes) - if !isValid { - return false, errors.New("invalid signature") - } - return isValid, nil -} - -func GetHexPubKey(extPubKey string) (string, error) { - xpubKey, err := hdkeychain.NewKeyFromString(extPubKey) - if err != nil { - return "", err - } - pubKey, err := xpubKey.ECPubKey() - if err != nil { - return "", err - } - byteKey := pubKey.SerializeCompressed() - return hex.EncodeToString(byteKey), nil -} diff --git a/x/asset/client/cli/query_address.go b/x/asset/client/cli/query_address.go index e9c886f..cdefe0a 100644 --- a/x/asset/client/cli/query_address.go +++ b/x/asset/client/cli/query_address.go @@ -14,12 +14,12 @@ var _ = strconv.Itoa(0) func CmdGetByAddress() *cobra.Command { cmd := &cobra.Command{ - Use: "address [address] [lookup-period-in-min]", + Use: "address [address] [num-elements]", Short: "Query for assets by address", Args: cobra.ExactArgs(2), RunE: func(cmd *cobra.Command, args []string) (err error) { reqAddress := args[0] - reqLookupPeriodInMin, err := cast.ToUint64E(args[1]) + reqNumElements, err := cast.ToUint64E(args[1]) if err != nil { return err } @@ -33,8 +33,8 @@ func CmdGetByAddress() *cobra.Command { params := &types.QueryGetCIDsByAddressRequest{ - Address: reqAddress, - LookupPeriodInMin: reqLookupPeriodInMin, + Address: reqAddress, + NumElements: reqNumElements, } pageReq, err := client.ReadPageRequest(cmd.Flags()) diff --git a/x/asset/keeper/asset.go b/x/asset/keeper/asset.go index 6e680c9..6ab90ad 100644 --- a/x/asset/keeper/asset.go +++ b/x/asset/keeper/asset.go @@ -8,9 +8,36 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ) +func (k Keeper) setAddresAssetCount(ctx sdk.Context, address string, count uint64) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.AssetKey)) + store.Set(types.AddressCountKey(address), util.SerializeUint64(count)) +} + +func (k Keeper) GetAddressAssetCount(ctx sdk.Context, address string) (count uint64, found bool) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.AssetKey)) + countBytes := store.Get(types.AddressCountKey(address)) + if countBytes == nil { + return 0, false + } + return util.DeserializeUint64(countBytes), true +} + +func (k Keeper) incrementAddressAssetCount(ctx sdk.Context, address string) uint64 { + count, _ := k.GetAddressAssetCount(ctx, address) + k.setAddresAssetCount(ctx, address, count+1) + return count + 1 +} + +func (k Keeper) StoreAddressAsset(ctx sdk.Context, msg types.MsgNotarizeAsset) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.AddressPrefix(msg.GetCreator())) + count := k.incrementAddressAssetCount(ctx, msg.GetCreator()) + store.Set(util.SerializeUint64(count), []byte(msg.GetCid())) +} + func (k Keeper) StoreAsset(ctx sdk.Context, msg types.MsgNotarizeAsset) { store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.AssetKey)) store.Set(util.SerializeString(msg.GetCid()), []byte(msg.GetCreator())) + k.StoreAddressAsset(ctx, msg) } func (k Keeper) GetAsset(ctx sdk.Context, cid string) (msg types.MsgNotarizeAsset, found bool) { @@ -24,18 +51,23 @@ func (k Keeper) GetAsset(ctx sdk.Context, cid string) (msg types.MsgNotarizeAsse return msg, true } -func (k Keeper) GetCidsByAddress(ctx sdk.Context, address string) (cids []string, found bool) { - store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.AssetKey)) +func (k Keeper) GetAssetByAddressAndID(ctx sdk.Context, address string, id uint64) (cid string, found bool) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.AddressPrefix(address)) + cidBytes := store.Get(util.SerializeUint64(id)) + if cidBytes == nil { + return cid, false + } + return string(cidBytes), true +} - reverseIterator := store.ReverseIterator(nil, nil) - defer reverseIterator.Close() - for ; reverseIterator.Valid(); reverseIterator.Next() { - addressBytes := reverseIterator.Value() - cidBytes := reverseIterator.Key() +func (k Keeper) GetAssetsByAddress(ctx sdk.Context, address string, start []byte, end []byte) (cids []string, found bool) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.AddressPrefix(address)) - if string(addressBytes) == address { - cids = append(cids, string(cidBytes)) - } + iterator := store.ReverseIterator(start, end) + defer iterator.Close() + for ; iterator.Valid(); iterator.Next() { + cidBytes := iterator.Value() + cids = append(cids, string(cidBytes)) } return cids, len(cids) > 0 } diff --git a/x/asset/keeper/asset_test.go b/x/asset/keeper/asset_test.go index 9864a79..68d2a58 100644 --- a/x/asset/keeper/asset_test.go +++ b/x/asset/keeper/asset_test.go @@ -6,6 +6,7 @@ import ( "testing" keepertest "github.com/planetmint/planetmint-go/testutil/keeper" + "github.com/planetmint/planetmint-go/util" "github.com/planetmint/planetmint-go/x/asset/keeper" "github.com/planetmint/planetmint-go/x/asset/types" @@ -39,14 +40,43 @@ func TestGetAssetbyCid(t *testing.T) { } } -func TestGetAssetByPubKeys(t *testing.T) { +func TestAssetCount(t *testing.T) { t.Parallel() keeper, ctx := keepertest.AssetKeeper(t) - _ = createNAsset(keeper, ctx, 10) - assets, found := keeper.GetCidsByAddress(ctx, "plmnt_address") + numItems := 10 + items := createNAsset(keeper, ctx, numItems) + count, found := keeper.GetAddressAssetCount(ctx, items[0].Creator) assert.True(t, found) - assert.Equal(t, len(assets), 5) - assets, found = keeper.GetCidsByAddress(ctx, "plmnt_address1") + assert.Equal(t, uint64(5), count) + count, found = keeper.GetAddressAssetCount(ctx, items[1].Creator) assert.True(t, found) - assert.Equal(t, len(assets), 5) + assert.Equal(t, uint64(5), count) +} + +func TestGetAssetByAddressAndID(t *testing.T) { + t.Parallel() + keeper, ctx := keepertest.AssetKeeper(t) + items := createNAsset(keeper, ctx, 1) + cid, found := keeper.GetAssetByAddressAndID(ctx, items[0].Creator, 1) + assert.True(t, found) + assert.Equal(t, items[0].Cid, cid) +} + +func TestGetAssetsByAddress(t *testing.T) { + t.Parallel() + keeper, ctx := keepertest.AssetKeeper(t) + items := createNAsset(keeper, ctx, 10) + cids, found := keeper.GetAssetsByAddress(ctx, items[0].Creator, nil, nil) + assert.True(t, found) + assert.Equal(t, items[8].Cid, cids[0]) + assert.Equal(t, items[4].Cid, cids[2]) + cids, found = keeper.GetAssetsByAddress(ctx, items[1].Creator, nil, nil) + assert.True(t, found) + assert.Equal(t, items[9].Cid, cids[0]) + assert.Equal(t, items[5].Cid, cids[2]) + + cids, found = keeper.GetAssetsByAddress(ctx, items[0].Creator, util.SerializeUint64(3), nil) + assert.True(t, found) + assert.Equal(t, 3, len(cids)) + assert.Equal(t, items[8].Cid, cids[0]) } diff --git a/x/asset/keeper/migrations.go b/x/asset/keeper/migrations.go new file mode 100644 index 0000000..9b0d35b --- /dev/null +++ b/x/asset/keeper/migrations.go @@ -0,0 +1,18 @@ +package keeper + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + v2 "github.com/planetmint/planetmint-go/x/asset/migrations/v2" +) + +type Migrator struct { + keeper Keeper +} + +func NewMigrator(keeper Keeper) Migrator { + return Migrator{keeper: keeper} +} + +func (m Migrator) Migrate1to2(ctx sdk.Context) error { + return v2.MigrateStore(ctx, m.keeper.storeKey, m.keeper.cdc) +} diff --git a/x/asset/keeper/query_address.go b/x/asset/keeper/query_address.go index ccf5777..6bb7c05 100644 --- a/x/asset/keeper/query_address.go +++ b/x/asset/keeper/query_address.go @@ -5,6 +5,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/planetmint/planetmint-go/errormsg" + "github.com/planetmint/planetmint-go/util" "github.com/planetmint/planetmint-go/x/asset/types" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -17,7 +18,7 @@ func (k Keeper) GetCIDsByAddress(goCtx context.Context, req *types.QueryGetCIDsB ctx := sdk.UnwrapSDKContext(goCtx) - cids, found := k.GetCidsByAddress(ctx, req.GetAddress()) + cids, found := k.GetAssetsByAddress(ctx, req.GetAddress(), nil, util.SerializeUint64(req.GetNumElements())) if !found { return nil, status.Error(codes.NotFound, "no CIDs found") } diff --git a/x/asset/keeper/query_address_test.go b/x/asset/keeper/query_address_test.go index 8529dc1..dea2dbd 100644 --- a/x/asset/keeper/query_address_test.go +++ b/x/asset/keeper/query_address_test.go @@ -4,6 +4,7 @@ import ( "testing" keepertest "github.com/planetmint/planetmint-go/testutil/keeper" + "github.com/planetmint/planetmint-go/util" "github.com/planetmint/planetmint-go/x/asset/types" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -16,7 +17,7 @@ func TestGetNotarizedAssetByAddress(t *testing.T) { keeper, ctx := keepertest.AssetKeeper(t) wctx := sdk.WrapSDKContext(ctx) _ = createNAsset(keeper, ctx, 10) - assets, _ := keeper.GetCidsByAddress(ctx, "plmnt_address") + assets, _ := keeper.GetAssetsByAddress(ctx, "plmnt_address", nil, util.SerializeUint64(3)) for _, tc := range []struct { desc string request *types.QueryGetCIDsByAddressRequest @@ -25,7 +26,7 @@ func TestGetNotarizedAssetByAddress(t *testing.T) { }{ { desc: "cid found", - request: &types.QueryGetCIDsByAddressRequest{Address: "plmnt_address"}, + request: &types.QueryGetCIDsByAddressRequest{Address: "plmnt_address", NumElements: 3}, response: &types.QueryGetCIDsByAddressResponse{Cids: assets}, }, { diff --git a/x/asset/migrations/v2/store.go b/x/asset/migrations/v2/store.go new file mode 100644 index 0000000..87452b9 --- /dev/null +++ b/x/asset/migrations/v2/store.go @@ -0,0 +1,39 @@ +package v2 + +import ( + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/store/prefix" + storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/planetmint/planetmint-go/util" + "github.com/planetmint/planetmint-go/x/asset/types" +) + +func MigrateStore(ctx sdk.Context, storeKey storetypes.StoreKey, _ codec.BinaryCodec) error { + store := prefix.NewStore(ctx.KVStore(storeKey), types.KeyPrefix(types.AssetKey)) + + mapping := make(map[string][][]byte) + + // read all cids + iterator := store.Iterator(nil, nil) + defer iterator.Close() + for ; iterator.Valid(); iterator.Next() { + addressBytes := iterator.Value() + cidBytes := iterator.Key() + + // map all cids by address + mapping[string(addressBytes)] = append(mapping[string(addressBytes)], cidBytes) + } + + // store all cids with new key + for address, cids := range mapping { + assetByAddressStore := prefix.NewStore(ctx.KVStore(storeKey), types.AddressPrefix(address)) + for i, cid := range cids { + assetByAddressStore.Set(util.SerializeUint64(uint64(i)), cid) + } + addressAssetCountStore := prefix.NewStore(ctx.KVStore(storeKey), types.KeyPrefix(types.AssetKey)) + addressAssetCountStore.Set(types.AddressCountKey(address), util.SerializeUint64(uint64(len(cids)))) + } + + return nil +} diff --git a/x/asset/module.go b/x/asset/module.go index b79e807..99a108b 100644 --- a/x/asset/module.go +++ b/x/asset/module.go @@ -116,6 +116,11 @@ func NewAppModule( func (am AppModule) RegisterServices(cfg module.Configurator) { types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) types.RegisterQueryServer(cfg.QueryServer(), am.keeper) + + m := keeper.NewMigrator(am.keeper) + if err := cfg.RegisterMigration(types.ModuleName, 1, m.Migrate1to2); err != nil { + panic(fmt.Errorf("failed to register migration of %s to v2: %w", types.ModuleName, err)) + } } // RegisterInvariants registers the invariants of the module. If an invariant deviates from its predicted value, the InvariantRegistry triggers appropriate logic (most often the chain will be halted) @@ -141,7 +146,7 @@ func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.Raw } // ConsensusVersion is a sequence number for state-breaking change of the module. It should be incremented on each consensus-breaking change introduced by the module. To avoid wrong/empty versions, the initial version should be set to 1 -func (AppModule) ConsensusVersion() uint64 { return 1 } +func (AppModule) ConsensusVersion() uint64 { return 2 } // BeginBlock contains the logic that is automatically triggered at the beginning of each block func (am AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) { diff --git a/x/asset/types/asset.pb.go b/x/asset/types/asset.pb.go deleted file mode 100644 index 8ec2af3..0000000 --- a/x/asset/types/asset.pb.go +++ /dev/null @@ -1,313 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: planetmintgo/asset/asset.proto - -package types - -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 Asset struct { - Cid string `protobuf:"bytes,1,opt,name=cid,proto3" json:"cid,omitempty"` -} - -func (m *Asset) Reset() { *m = Asset{} } -func (m *Asset) String() string { return proto.CompactTextString(m) } -func (*Asset) ProtoMessage() {} -func (*Asset) Descriptor() ([]byte, []int) { - return fileDescriptor_03dd37a25f684e6e, []int{0} -} -func (m *Asset) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Asset) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Asset.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 *Asset) XXX_Merge(src proto.Message) { - xxx_messageInfo_Asset.Merge(m, src) -} -func (m *Asset) XXX_Size() int { - return m.Size() -} -func (m *Asset) XXX_DiscardUnknown() { - xxx_messageInfo_Asset.DiscardUnknown(m) -} - -var xxx_messageInfo_Asset proto.InternalMessageInfo - -func (m *Asset) GetCid() string { - if m != nil { - return m.Cid - } - return "" -} - -func init() { - proto.RegisterType((*Asset)(nil), "planetmintgo.asset.Asset") -} - -func init() { proto.RegisterFile("planetmintgo/asset/asset.proto", fileDescriptor_03dd37a25f684e6e) } - -var fileDescriptor_03dd37a25f684e6e = []byte{ - // 143 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x2b, 0xc8, 0x49, 0xcc, - 0x4b, 0x2d, 0xc9, 0xcd, 0xcc, 0x2b, 0x49, 0xcf, 0xd7, 0x4f, 0x2c, 0x2e, 0x4e, 0x2d, 0x81, 0x90, - 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0x42, 0xc8, 0xf2, 0x7a, 0x60, 0x19, 0x25, 0x49, 0x2e, - 0x56, 0x47, 0x10, 0x43, 0x48, 0x80, 0x8b, 0x39, 0x39, 0x33, 0x45, 0x82, 0x51, 0x81, 0x51, 0x83, - 0x33, 0x08, 0xc4, 0x74, 0xf2, 0x3e, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, - 0xe4, 0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, 0xf0, 0x58, 0x8e, 0xe1, 0xc6, 0x63, 0x39, 0x86, 0x28, - 0xc3, 0xf4, 0xcc, 0x92, 0x8c, 0xd2, 0x24, 0xbd, 0xe4, 0xfc, 0x5c, 0x7d, 0x84, 0x99, 0x48, 0x4c, - 0xdd, 0xf4, 0x7c, 0xfd, 0x0a, 0xa8, 0x0b, 0x4a, 0x2a, 0x0b, 0x52, 0x8b, 0x93, 0xd8, 0xc0, 0x4e, - 0x30, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xbc, 0x38, 0x8c, 0xdf, 0xa4, 0x00, 0x00, 0x00, -} - -func (m *Asset) 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 *Asset) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Asset) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Cid) > 0 { - i -= len(m.Cid) - copy(dAtA[i:], m.Cid) - i = encodeVarintAsset(dAtA, i, uint64(len(m.Cid))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintAsset(dAtA []byte, offset int, v uint64) int { - offset -= sovAsset(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Asset) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Cid) - if l > 0 { - n += 1 + l + sovAsset(uint64(l)) - } - return n -} - -func sovAsset(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozAsset(x uint64) (n int) { - return sovAsset(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Asset) 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 ErrIntOverflowAsset - } - 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: Asset: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Asset: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Cid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAsset - } - 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 ErrInvalidLengthAsset - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthAsset - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Cid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipAsset(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAsset - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipAsset(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, ErrIntOverflowAsset - } - 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, ErrIntOverflowAsset - } - 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, ErrIntOverflowAsset - } - 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, ErrInvalidLengthAsset - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupAsset - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthAsset - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthAsset = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowAsset = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupAsset = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/asset/types/keys.go b/x/asset/types/keys.go index 814a661..cb6cd08 100644 --- a/x/asset/types/keys.go +++ b/x/asset/types/keys.go @@ -14,8 +14,23 @@ const ( MemStoreKey = "mem_asset" AssetKey = "Asset/value/" + CountKey = "count/" ) +func AddressCountKey(address string) (prefix []byte) { + addressPrefix := AddressPrefix(address) + prefix = append(prefix, addressPrefix...) + prefix = append(prefix, []byte(CountKey)...) + return +} + +func AddressPrefix(address string) (prefix []byte) { + addressBytes := []byte(address) + prefix = append(prefix, addressBytes...) + prefix = append(prefix, []byte("/")...) + return +} + func KeyPrefix(p string) []byte { return []byte(p) } diff --git a/x/asset/types/query.pb.go b/x/asset/types/query.pb.go index 94edffb..c81be35 100644 --- a/x/asset/types/query.pb.go +++ b/x/asset/types/query.pb.go @@ -114,9 +114,9 @@ func (m *QueryParamsResponse) GetParams() Params { } type QueryGetCIDsByAddressRequest struct { - Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` - LookupPeriodInMin uint64 `protobuf:"varint,2,opt,name=lookupPeriodInMin,proto3" json:"lookupPeriodInMin,omitempty"` - Pagination *query.PageRequest `protobuf:"bytes,3,opt,name=pagination,proto3" json:"pagination,omitempty"` + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + NumElements uint64 `protobuf:"varint,2,opt,name=numElements,proto3" json:"numElements,omitempty"` + Pagination *query.PageRequest `protobuf:"bytes,3,opt,name=pagination,proto3" json:"pagination,omitempty"` } func (m *QueryGetCIDsByAddressRequest) Reset() { *m = QueryGetCIDsByAddressRequest{} } @@ -159,9 +159,9 @@ func (m *QueryGetCIDsByAddressRequest) GetAddress() string { return "" } -func (m *QueryGetCIDsByAddressRequest) GetLookupPeriodInMin() uint64 { +func (m *QueryGetCIDsByAddressRequest) GetNumElements() uint64 { if m != nil { - return m.LookupPeriodInMin + return m.NumElements } return 0 } @@ -333,42 +333,41 @@ func init() { func init() { proto.RegisterFile("planetmintgo/asset/query.proto", fileDescriptor_5832a953a81817c0) } var fileDescriptor_5832a953a81817c0 = []byte{ - // 547 bytes of a gzipped FileDescriptorProto + // 541 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0xcf, 0x6e, 0xd3, 0x30, - 0x18, 0x6f, 0xda, 0x52, 0x34, 0x73, 0xd9, 0xcc, 0x0e, 0x51, 0xd8, 0xb2, 0x2a, 0x48, 0x5b, 0x85, - 0x20, 0x26, 0xe5, 0x00, 0x9c, 0xd0, 0x0a, 0x62, 0x9a, 0xf8, 0x57, 0x72, 0xe4, 0xe6, 0x26, 0x56, - 0xb0, 0x68, 0xed, 0x2c, 0x76, 0x11, 0xa5, 0xf4, 0xc2, 0x13, 0x20, 0xf1, 0x00, 0xbc, 0x01, 0x67, - 0x1e, 0x61, 0xc7, 0x49, 0x5c, 0x38, 0x21, 0x68, 0x79, 0x10, 0x14, 0xdb, 0x55, 0x1b, 0xd2, 0x32, - 0xed, 0xf6, 0xd5, 0xdf, 0xf7, 0xfb, 0xd3, 0xdf, 0xf7, 0x29, 0xc0, 0x4d, 0xfb, 0x98, 0x11, 0x39, - 0xa0, 0x4c, 0x26, 0x1c, 0x61, 0x21, 0x88, 0x44, 0x27, 0x43, 0x92, 0x8d, 0xfc, 0x34, 0xe3, 0x92, - 0x43, 0xb8, 0xdc, 0xf7, 0x55, 0xdf, 0xd9, 0x4e, 0x78, 0xc2, 0x55, 0x1b, 0xe5, 0x95, 0x9e, 0x74, - 0x76, 0x12, 0xce, 0x93, 0x3e, 0x41, 0x38, 0xa5, 0x08, 0x33, 0xc6, 0x25, 0x96, 0x94, 0x33, 0x61, - 0xba, 0x37, 0x22, 0x2e, 0x06, 0x5c, 0xa0, 0x1e, 0x16, 0x44, 0x0b, 0xa0, 0xb7, 0x41, 0x8f, 0x48, - 0x1c, 0xa0, 0x14, 0x27, 0x94, 0xa9, 0x61, 0x33, 0xbb, 0xb7, 0xc2, 0x53, 0x8a, 0x33, 0x3c, 0x30, - 0x64, 0xde, 0x36, 0x80, 0x2f, 0x73, 0x8a, 0xae, 0x7a, 0x0c, 0xc9, 0xc9, 0x90, 0x08, 0xe9, 0xbd, - 0x00, 0x57, 0x0b, 0xaf, 0x22, 0xe5, 0x4c, 0x10, 0x78, 0x0f, 0x34, 0x34, 0xd8, 0xb6, 0x9a, 0x56, - 0xeb, 0x4a, 0xdb, 0xf1, 0xcb, 0x7f, 0xc9, 0xd7, 0x98, 0x4e, 0xfd, 0xf4, 0xe7, 0x5e, 0x25, 0x34, - 0xf3, 0xde, 0x57, 0x0b, 0xec, 0x28, 0xc6, 0x23, 0x22, 0x1f, 0x1e, 0x3f, 0x12, 0x9d, 0xd1, 0x61, - 0x1c, 0x67, 0x44, 0xcc, 0x15, 0xa1, 0x0d, 0x2e, 0x63, 0xfd, 0xa2, 0xb8, 0x37, 0xc2, 0xf9, 0x4f, - 0x78, 0x13, 0x6c, 0xf5, 0x39, 0x7f, 0x33, 0x4c, 0xbb, 0x24, 0xa3, 0x3c, 0x3e, 0x66, 0xcf, 0x28, - 0xb3, 0xab, 0x4d, 0xab, 0x55, 0x0f, 0xcb, 0x0d, 0xf8, 0x18, 0x80, 0x45, 0x08, 0x76, 0x4d, 0xd9, - 0xdc, 0xf7, 0x75, 0x62, 0x7e, 0x9e, 0x98, 0xaf, 0x57, 0x62, 0x12, 0xf3, 0xbb, 0x38, 0x21, 0xc6, - 0x43, 0xb8, 0x84, 0xf4, 0x3e, 0x80, 0xdd, 0x35, 0x7e, 0x4d, 0x16, 0x10, 0xd4, 0x23, 0x1a, 0xe7, - 0x6e, 0x6b, 0xad, 0x8d, 0x50, 0xd5, 0xf0, 0xa8, 0x20, 0x5e, 0x55, 0xe2, 0x07, 0xe7, 0x8a, 0x6b, - 0xc2, 0x82, 0x7a, 0xb0, 0x50, 0x7f, 0xce, 0x25, 0xce, 0xe8, 0x7b, 0x12, 0x1f, 0xe6, 0xe9, 0xce, - 0xe3, 0xda, 0x04, 0xb5, 0x88, 0xc6, 0x26, 0xaa, 0xbc, 0xf4, 0x9e, 0x02, 0x77, 0x1d, 0xc4, 0x38, - 0x2e, 0x61, 0x96, 0x43, 0xaf, 0x16, 0x42, 0x6f, 0xff, 0xae, 0x81, 0x4b, 0x8a, 0x0e, 0x8e, 0x41, - 0x43, 0x6f, 0x14, 0xee, 0xaf, 0xda, 0x76, 0xf9, 0x78, 0x9c, 0x83, 0x73, 0xe7, 0xb4, 0x21, 0xaf, - 0xf9, 0xf1, 0xfb, 0x9f, 0xcf, 0x55, 0x07, 0xda, 0x68, 0x01, 0x28, 0xdc, 0x28, 0xfc, 0x66, 0x81, - 0xcd, 0x7f, 0x37, 0x00, 0x6f, 0xaf, 0xe5, 0x5f, 0x73, 0x5c, 0x4e, 0x70, 0x01, 0x84, 0xf1, 0xf6, - 0x40, 0x79, 0xbb, 0x0f, 0xef, 0x96, 0xbd, 0x99, 0x8c, 0xd0, 0xd8, 0x14, 0x13, 0x34, 0x2e, 0xdd, - 0xe1, 0x04, 0x7e, 0xb1, 0xc0, 0x56, 0x69, 0x17, 0xf0, 0xbf, 0x4e, 0x56, 0xae, 0xda, 0x69, 0x5f, - 0x04, 0x62, 0xdc, 0x5f, 0x57, 0xee, 0x77, 0xe1, 0xb5, 0xb2, 0xfb, 0x88, 0xc6, 0x68, 0x1c, 0xd1, - 0x78, 0xd2, 0x79, 0x72, 0x3a, 0x75, 0xad, 0xb3, 0xa9, 0x6b, 0xfd, 0x9a, 0xba, 0xd6, 0xa7, 0x99, - 0x5b, 0x39, 0x9b, 0xb9, 0x95, 0x1f, 0x33, 0xb7, 0xf2, 0x2a, 0x48, 0xa8, 0x7c, 0x3d, 0xec, 0xf9, - 0x11, 0x1f, 0x2c, 0x13, 0x2c, 0xca, 0x5b, 0x09, 0x47, 0xef, 0x0c, 0xa1, 0x1c, 0xa5, 0x44, 0xf4, - 0x1a, 0xea, 0x73, 0x72, 0xe7, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x76, 0xa1, 0xdb, 0x5c, 0x05, - 0x05, 0x00, 0x00, + 0x18, 0x6f, 0xda, 0x51, 0x34, 0xef, 0x32, 0xcc, 0x0e, 0x51, 0xd8, 0xb2, 0x2a, 0x48, 0x5b, 0x85, + 0x44, 0x4c, 0xba, 0x0b, 0x1c, 0x57, 0xfe, 0x4c, 0x08, 0x04, 0x23, 0x47, 0x6e, 0x6e, 0x62, 0x05, + 0x4b, 0x8d, 0x9d, 0xc5, 0x2e, 0xa2, 0x94, 0x5e, 0x78, 0x02, 0x24, 0x1e, 0x00, 0x89, 0x47, 0xe0, + 0x29, 0x76, 0x9c, 0xc4, 0x05, 0x09, 0x09, 0xa1, 0x96, 0x07, 0x41, 0xb1, 0x5d, 0x35, 0x21, 0x2d, + 0xd3, 0x6e, 0x5f, 0xec, 0xef, 0xf7, 0xc7, 0xbf, 0xef, 0x53, 0x80, 0x9b, 0x0d, 0x31, 0x23, 0x32, + 0xa5, 0x4c, 0x26, 0x1c, 0x61, 0x21, 0x88, 0x44, 0x67, 0x23, 0x92, 0x8f, 0xfd, 0x2c, 0xe7, 0x92, + 0x43, 0x58, 0xbe, 0xf7, 0xd5, 0xbd, 0xb3, 0x93, 0xf0, 0x84, 0xab, 0x6b, 0x54, 0x54, 0xba, 0xd3, + 0xd9, 0x4d, 0x38, 0x4f, 0x86, 0x04, 0xe1, 0x8c, 0x22, 0xcc, 0x18, 0x97, 0x58, 0x52, 0xce, 0x84, + 0xb9, 0xbd, 0x13, 0x71, 0x91, 0x72, 0x81, 0x06, 0x58, 0x10, 0x2d, 0x80, 0xde, 0x06, 0x03, 0x22, + 0x71, 0x80, 0x32, 0x9c, 0x50, 0xa6, 0x9a, 0x4d, 0xef, 0xfe, 0x0a, 0x4f, 0x19, 0xce, 0x71, 0x6a, + 0xc8, 0xbc, 0x1d, 0x00, 0x5f, 0x15, 0x14, 0xa7, 0xea, 0x30, 0x24, 0x67, 0x23, 0x22, 0xa4, 0xf7, + 0x12, 0xdc, 0xac, 0x9c, 0x8a, 0x8c, 0x33, 0x41, 0xe0, 0x7d, 0xd0, 0xd6, 0x60, 0xdb, 0xea, 0x58, + 0xdd, 0xad, 0x9e, 0xe3, 0xd7, 0x9f, 0xe4, 0x6b, 0x4c, 0x7f, 0xe3, 0xfc, 0xd7, 0x7e, 0x23, 0x34, + 0xfd, 0xde, 0x57, 0x0b, 0xec, 0x2a, 0xc6, 0x13, 0x22, 0x1f, 0x3e, 0x7d, 0x24, 0xfa, 0xe3, 0xe3, + 0x38, 0xce, 0x89, 0x58, 0x28, 0x42, 0x1b, 0x5c, 0xc7, 0xfa, 0x44, 0x71, 0x6f, 0x86, 0x8b, 0x4f, + 0xd8, 0x01, 0x5b, 0x6c, 0x94, 0x3e, 0x1e, 0x92, 0x94, 0x30, 0x29, 0xec, 0x66, 0xc7, 0xea, 0x6e, + 0x84, 0xe5, 0x23, 0xf8, 0x04, 0x80, 0xe5, 0xc3, 0xed, 0x96, 0xb2, 0x76, 0xe0, 0xeb, 0x94, 0xfc, + 0x22, 0x25, 0x5f, 0x8f, 0xc1, 0xa4, 0xe4, 0x9f, 0xe2, 0x84, 0x18, 0xdd, 0xb0, 0x84, 0xf4, 0x3e, + 0x80, 0xbd, 0x35, 0x1e, 0xcd, 0xfb, 0x21, 0xd8, 0x88, 0x68, 0x5c, 0x38, 0x6c, 0x75, 0x37, 0x43, + 0x55, 0xc3, 0x93, 0x8a, 0x78, 0x53, 0x89, 0x1f, 0x5e, 0x2a, 0xae, 0x09, 0x2b, 0xea, 0xc1, 0x52, + 0xfd, 0x05, 0x97, 0x38, 0xa7, 0xef, 0x49, 0x7c, 0x5c, 0x24, 0xba, 0x88, 0x68, 0x1b, 0xb4, 0x22, + 0x1a, 0x9b, 0x78, 0x8a, 0xd2, 0x7b, 0x0e, 0xdc, 0x75, 0x10, 0xe3, 0xb8, 0x86, 0x29, 0x07, 0xdd, + 0xac, 0x04, 0xdd, 0xfb, 0xd9, 0x02, 0xd7, 0x14, 0x1d, 0x9c, 0x80, 0xb6, 0x9e, 0x22, 0x3c, 0x58, + 0x35, 0xe1, 0xfa, 0xc2, 0x38, 0x87, 0x97, 0xf6, 0x69, 0x43, 0x5e, 0xe7, 0xe3, 0xf7, 0x3f, 0x9f, + 0x9b, 0x0e, 0xb4, 0xd1, 0x12, 0x50, 0xd9, 0x4b, 0xf8, 0xcd, 0x02, 0xdb, 0xff, 0x4e, 0x00, 0xde, + 0x5b, 0xcb, 0xbf, 0x66, 0xa1, 0x9c, 0xe0, 0x0a, 0x08, 0xe3, 0xed, 0x81, 0xf2, 0x76, 0x04, 0x83, + 0xba, 0x37, 0x93, 0x11, 0x9a, 0x98, 0x62, 0x8a, 0x26, 0xa5, 0x0d, 0x9c, 0xc2, 0x2f, 0x16, 0xb8, + 0x51, 0x9b, 0x02, 0xfc, 0xaf, 0x87, 0x95, 0x43, 0x76, 0x7a, 0x57, 0x81, 0x18, 0xdf, 0xb7, 0x95, + 0xef, 0x3d, 0x78, 0xab, 0xee, 0x3b, 0xa2, 0x31, 0x9a, 0x44, 0x34, 0x9e, 0xf6, 0x9f, 0x9d, 0xcf, + 0x5c, 0xeb, 0x62, 0xe6, 0x5a, 0xbf, 0x67, 0xae, 0xf5, 0x69, 0xee, 0x36, 0x2e, 0xe6, 0x6e, 0xe3, + 0xc7, 0xdc, 0x6d, 0xbc, 0x0e, 0x12, 0x2a, 0xdf, 0x8c, 0x06, 0x7e, 0xc4, 0xd3, 0x32, 0xc1, 0xb2, + 0xbc, 0x9b, 0x70, 0xf4, 0xce, 0x10, 0xca, 0x71, 0x46, 0xc4, 0xa0, 0xad, 0x7e, 0x1e, 0x47, 0x7f, + 0x03, 0x00, 0x00, 0xff, 0xff, 0xb3, 0x7e, 0xf6, 0x2a, 0xf3, 0x04, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -617,8 +616,8 @@ func (m *QueryGetCIDsByAddressRequest) MarshalToSizedBuffer(dAtA []byte) (int, e i-- dAtA[i] = 0x1a } - if m.LookupPeriodInMin != 0 { - i = encodeVarintQuery(dAtA, i, uint64(m.LookupPeriodInMin)) + if m.NumElements != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.NumElements)) i-- dAtA[i] = 0x10 } @@ -784,8 +783,8 @@ func (m *QueryGetCIDsByAddressRequest) Size() (n int) { if l > 0 { n += 1 + l + sovQuery(uint64(l)) } - if m.LookupPeriodInMin != 0 { - n += 1 + sovQuery(uint64(m.LookupPeriodInMin)) + if m.NumElements != 0 { + n += 1 + sovQuery(uint64(m.NumElements)) } if m.Pagination != nil { l = m.Pagination.Size() @@ -1045,9 +1044,9 @@ func (m *QueryGetCIDsByAddressRequest) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field LookupPeriodInMin", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field NumElements", wireType) } - m.LookupPeriodInMin = 0 + m.NumElements = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowQuery @@ -1057,7 +1056,7 @@ func (m *QueryGetCIDsByAddressRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.LookupPeriodInMin |= uint64(b&0x7F) << shift + m.NumElements |= uint64(b&0x7F) << shift if b < 0x80 { break } diff --git a/x/asset/types/query.pb.gw.go b/x/asset/types/query.pb.gw.go index 3dc0c73..d8d9132 100644 --- a/x/asset/types/query.pb.gw.go +++ b/x/asset/types/query.pb.gw.go @@ -52,7 +52,7 @@ func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshal } var ( - filter_Query_GetCIDsByAddress_0 = &utilities.DoubleArray{Encoding: map[string]int{"address": 0, "lookupPeriodInMin": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} + filter_Query_GetCIDsByAddress_0 = &utilities.DoubleArray{Encoding: map[string]int{"address": 0, "numElements": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} ) func request_Query_GetCIDsByAddress_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -77,15 +77,15 @@ func request_Query_GetCIDsByAddress_0(ctx context.Context, marshaler runtime.Mar return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) } - val, ok = pathParams["lookupPeriodInMin"] + val, ok = pathParams["numElements"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "lookupPeriodInMin") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "numElements") } - protoReq.LookupPeriodInMin, err = runtime.Uint64(val) + protoReq.NumElements, err = runtime.Uint64(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "lookupPeriodInMin", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "numElements", err) } if err := req.ParseForm(); err != nil { @@ -122,15 +122,15 @@ func local_request_Query_GetCIDsByAddress_0(ctx context.Context, marshaler runti return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) } - val, ok = pathParams["lookupPeriodInMin"] + val, ok = pathParams["numElements"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "lookupPeriodInMin") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "numElements") } - protoReq.LookupPeriodInMin, err = runtime.Uint64(val) + protoReq.NumElements, err = runtime.Uint64(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "lookupPeriodInMin", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "numElements", err) } if err := req.ParseForm(); err != nil { @@ -381,7 +381,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie var ( pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"planetmint", "asset", "params"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Query_GetCIDsByAddress_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 2, 1, 0, 4, 1, 5, 3}, []string{"planetmint", "asset", "address", "lookupPeriodInMin"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_GetCIDsByAddress_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 2, 1, 0, 4, 1, 5, 3}, []string{"planetmint", "asset", "address", "numElements"}, "", runtime.AssumeColonVerbOpt(true))) pattern_Query_GetNotarizedAsset_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 2}, []string{"planetmint", "asset", "cid"}, "", runtime.AssumeColonVerbOpt(true))) ) diff --git a/x/dao/abci.go b/x/dao/abci.go index 49680f0..0f562de 100644 --- a/x/dao/abci.go +++ b/x/dao/abci.go @@ -24,7 +24,6 @@ func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, k keeper.Keeper) hexProposerAddress := hex.EncodeToString(proposerAddress) if isPopHeight(ctx, k, currentBlockHeight) { // select PoP participants - monitor.SetContext(ctx) challenger, challengee, err := monitor.SelectPoPParticipantsOutOfActiveActors() if err != nil { util.GetAppLogger().Error(ctx, "error during PoP Participant selection ", err) diff --git a/x/machine/keeper/msg_server_attest_machine.go b/x/machine/keeper/msg_server_attest_machine.go index 21e952e..f0e3277 100644 --- a/x/machine/keeper/msg_server_attest_machine.go +++ b/x/machine/keeper/msg_server_attest_machine.go @@ -2,6 +2,7 @@ package keeper import ( "context" + "errors" "fmt" config "github.com/planetmint/planetmint-go/config" @@ -13,6 +14,7 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/rddl-network/go-utils/signature" ) func (k msgServer) AttestMachine(goCtx context.Context, msg *types.MsgAttestMachine) (*types.MsgAttestMachineResponse, error) { @@ -22,9 +24,17 @@ func (k msgServer) AttestMachine(goCtx context.Context, msg *types.MsgAttestMach // and removed from here due to inconsistency or checking the same thing over and over again. ta, _, _ := k.GetTrustAnchor(ctx, msg.Machine.MachineId) - isValidMachineID, err := util.ValidateSignature(msg.Machine.MachineId, msg.Machine.MachineIdSignature, msg.Machine.MachineId) - if !isValidMachineID { - return nil, err + isValidSecp256r1, errR1 := signature.ValidateSECP256R1Signature(msg.Machine.MachineId, msg.Machine.MachineIdSignature, msg.Machine.MachineId) + if errR1 != nil || !isValidSecp256r1 { + isValidSecp256k1, errK1 := signature.ValidateSignature(msg.Machine.MachineId, msg.Machine.MachineIdSignature, msg.Machine.MachineId) + if errK1 != nil || !isValidSecp256k1 { + errStr := "" + if errR1 != nil { + errStr = errR1.Error() + } + aggreatedErrorMessage := "Invalid machine signature: " + errStr + ", " + errK1.Error() + return nil, errors.New(aggreatedErrorMessage) + } } isValidIssuerPlanetmint := validateExtendedPublicKey(msg.Machine.IssuerPlanetmint, config.PlmntNetParams) @@ -59,7 +69,7 @@ func (k msgServer) AttestMachine(goCtx context.Context, msg *types.MsgAttestMach k.StoreMachine(ctx, *msg.Machine) k.StoreMachineIndex(ctx, *msg.Machine) - err = k.StoreTrustAnchor(ctx, ta, true) + err := k.StoreTrustAnchor(ctx, ta, true) if err != nil { return nil, err } diff --git a/x/machine/keeper/msg_server_register_trust_anchor.go b/x/machine/keeper/msg_server_register_trust_anchor.go index b71d6c2..2c12092 100644 --- a/x/machine/keeper/msg_server_register_trust_anchor.go +++ b/x/machine/keeper/msg_server_register_trust_anchor.go @@ -35,6 +35,12 @@ func validatePublicKey(pubkey string) bool { return false } + // uncompressed key + if len(pubkeyBytes) == 64 { + return true + } + + // compressed key // Check if byte slice has correct length if len(pubkeyBytes) != 33 { return false diff --git a/x/machine/keeper/msg_server_test.go b/x/machine/keeper/msg_server_test.go index 73dd467..09a28c1 100644 --- a/x/machine/keeper/msg_server_test.go +++ b/x/machine/keeper/msg_server_test.go @@ -71,6 +71,18 @@ func TestMsgServerRegisterTrustAnchor(t *testing.T) { } } +func TestMsgServerRegisterTrustAnchorUncompressedKey(t *testing.T) { + t.Parallel() + pk := "6003d0ab9af4ec112629195a7266a244aecf1ac7691da0084be3e7ceea2ee71571b0963fffd9c80a640317509a681ac66c2ed70ecc9f317a0d2b1a9bff94ff74" + ta := moduleobject.TrustAnchor(pk) + msg := types.NewMsgRegisterTrustAnchor(pk, &ta) + msgServer, ctx := setupMsgServer(t) + res, err := msgServer.RegisterTrustAnchor(ctx, msg) + if assert.NoError(t, err) { + assert.Equal(t, &types.MsgRegisterTrustAnchorResponse{}, res) + } +} + func TestMsgServerRegisterTrustAnchorTwice(t *testing.T) { t.Parallel() _, pk := sample.KeyPair()