From df243d69ada774685c07979b35437ac29357fdbb Mon Sep 17 00:00:00 2001 From: olegfomenko2002 Date: Tue, 7 Nov 2023 21:13:54 +0200 Subject: [PATCH 1/2] adding separate gist and state transfers --- go.mod | 20 ++-- go.sum | 56 ++++----- internal/cli/main.go | 4 +- internal/rarimo/stateupdate.go | 109 ++++++++++++------ internal/services/evm/stateChangeListener.go | 53 ++++++--- internal/services/grpc/grpc_impl.go | 5 +- internal/services/voting/main.go | 55 +++++++++ internal/services/voting/types.go | 12 ++ internal/services/voting/vote_gist.go | 88 ++++++++++++++ .../voting/{statev2.go => vote_state.go} | 58 +++------- 10 files changed, 325 insertions(+), 135 deletions(-) create mode 100644 internal/services/voting/main.go create mode 100644 internal/services/voting/types.go create mode 100644 internal/services/voting/vote_gist.go rename internal/services/voting/{statev2.go => vote_state.go} (50%) diff --git a/go.mod b/go.mod index 14cc4eb..394a306 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/ethereum/go-ethereum v1.10.26 github.com/go-redis/redis/v8 v8.11.5 github.com/gogo/protobuf v1.3.3 - github.com/rarimo/rarimo-core v0.0.0-20231004143803-6b209428ecbf + github.com/rarimo/rarimo-core v1.0.8-0.20231107191012-470dd204b863 github.com/rarimo/saver-grpc-lib v1.0.0 github.com/spf13/cast v1.5.1 github.com/tendermint/tendermint v0.34.27 @@ -15,7 +15,7 @@ require ( gitlab.com/distributed_lab/kit v1.11.1 gitlab.com/distributed_lab/logan v3.8.1+incompatible gitlab.com/distributed_lab/running v0.0.0-20200706131153-4af0e83eb96c - google.golang.org/grpc v1.58.0 + google.golang.org/grpc v1.59.0 ) require ( @@ -149,15 +149,15 @@ require ( go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.8.0 // indirect go.uber.org/zap v1.23.0 // indirect - golang.org/x/crypto v0.13.0 // indirect + golang.org/x/crypto v0.14.0 // indirect golang.org/x/exp v0.0.0-20230206171751-46f607a40771 // indirect - golang.org/x/net v0.15.0 // indirect - golang.org/x/sys v0.12.0 // indirect - golang.org/x/term v0.12.0 // indirect - golang.org/x/text v0.13.0 // indirect - google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect + golang.org/x/net v0.17.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/term v0.13.0 // indirect + golang.org/x/text v0.14.0 // indirect + google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect diff --git a/go.sum b/go.sum index e6fb232..64a8fb6 100644 --- a/go.sum +++ b/go.sum @@ -36,7 +36,7 @@ cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRY cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go v0.110.6 h1:8uYAkj3YHTP/1iwReuHPxLSbdcyc+dSBbzFMrVwDR6Q= +cloud.google.com/go v0.110.9 h1:e7ITSqGFFk4rbz/JFIqZh3G4VEHguhAL4BQcFlWtU68= cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= @@ -146,7 +146,7 @@ cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= -cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= +cloud.google.com/go/compute v1.23.2 h1:nWEMDhgbBkBJjfpVySqU4jgWdc22PLR0o4vEexZHers= cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= @@ -268,7 +268,7 @@ cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQE cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= -cloud.google.com/go/iam v1.1.1 h1:lW7fzj15aVIXYHREOqjRBV9PsH0Z6u8Y46a1YGvQP4Y= +cloud.google.com/go/iam v1.1.4 h1:K6n/GZHFTtEoKT5aUG3l9diPi0VduZNQ1PfdnpkkIFk= cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= @@ -857,8 +857,8 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -893,8 +893,8 @@ github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99 github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.4 h1:uGy6JWR/uMIILU8wbf+OkstIrNiMjGpEIyhx8f6W7s4= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= @@ -905,7 +905,7 @@ github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gax-go/v2 v2.11.0 h1:9V9PWXEsWnPpQhu/PeQIkS4eGzMlTLGgt80cUUI8Ki4= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -1200,8 +1200,10 @@ github.com/rarimo/broadcaster-svc v1.0.2 h1:ExQcjjWCRP5+POLDlZHrTD1ffUsBH+Dgv5FA github.com/rarimo/broadcaster-svc v1.0.2/go.mod h1:lYIHy+X4IqQt4eBdtMN/V352H3EV0/gO8G+32SFwUWI= github.com/rarimo/cosmos-sdk v0.46.7 h1:jU2PiWzc+19SF02cXM0O0puKPeH1C6Q6t2lzJ9s1ejc= github.com/rarimo/cosmos-sdk v0.46.7/go.mod h1:fqKqz39U5IlEFb4nbQ72951myztsDzFKKDtffYJ63nk= -github.com/rarimo/rarimo-core v0.0.0-20231004143803-6b209428ecbf h1:NvYhOErW0d7ohn2YzGxQYKssrgVrKOvjrKL1OBQgCB4= -github.com/rarimo/rarimo-core v0.0.0-20231004143803-6b209428ecbf/go.mod h1:Onkd0EJP94hw4dT/2KH7QXRwDG4eIGeaMffSjA1i6/s= +github.com/rarimo/rarimo-core v1.0.8-0.20231107183134-c8a62c0c9ebd h1:rKITVn35c65eLn7lgg/eBu7WULWJNRPLcrdEhCq3nSw= +github.com/rarimo/rarimo-core v1.0.8-0.20231107183134-c8a62c0c9ebd/go.mod h1:auP3KgxaSwkOUrLWBifjnMbbSQTSBA9Y/gVgq1WU/B4= +github.com/rarimo/rarimo-core v1.0.8-0.20231107191012-470dd204b863 h1:sGOC4duN7B4iOuIBKD/8vQXNkFcQGili9VO09bxmNSQ= +github.com/rarimo/rarimo-core v1.0.8-0.20231107191012-470dd204b863/go.mod h1:auP3KgxaSwkOUrLWBifjnMbbSQTSBA9Y/gVgq1WU/B4= github.com/rarimo/saver-grpc-lib v1.0.0 h1:MGUVjYg7unmodYczVsLqlqZNkT4CIgKqdo6aQtL1qdE= github.com/rarimo/saver-grpc-lib v1.0.0/go.mod h1:DpugWK5B7Hi0bdC3MPe/9FD2zCxaRwsyykdwxtF1Zgg= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= @@ -1419,8 +1421,8 @@ golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5 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-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1545,8 +1547,8 @@ golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= 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= @@ -1574,7 +1576,7 @@ golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= -golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= +golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1591,7 +1593,7 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1689,8 +1691,8 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.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 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1698,8 +1700,8 @@ golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= 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= @@ -1714,8 +1716,8 @@ golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1866,7 +1868,7 @@ google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/ google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= -google.golang.org/api v0.126.0 h1:q4GJq+cAdMAC7XP7njvQ4tvohGLiSlytuL4BQxbIZ+o= +google.golang.org/api v0.128.0 h1:RjPESny5CnQRn9V6siglged+DZCgfu9l6mO9dkX9VOg= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= @@ -2003,12 +2005,12 @@ google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 h1:I6WNifs6pF9tNdSob2W24JtyxIYjzFB9qDlpUC76q+U= +google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 h1:AB/lmRny7e2pLhFEYIbl5qkDAUt2h0ZRO4wGPhZf+ik= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= diff --git a/internal/cli/main.go b/internal/cli/main.go index 082e91e..f624df2 100644 --- a/internal/cli/main.go +++ b/internal/cli/main.go @@ -69,7 +69,7 @@ func Run(args []string) bool { runStateUpdatesAll := func() { cfg.Log().Info("starting all state updates related services") - run(voting.RunStateUpdateVoter, "voter") + run(voting.RunVoter, "voter") run(grpc.RunAPI, "grpc-api") run(evm.RunStateChangeListener, "state-change-listener") } @@ -84,7 +84,7 @@ func Run(args []string) bool { case stateUpdateAll.FullCommand(): runStateUpdatesAll() case stateUpdateVoter.FullCommand(): - run(voting.RunStateUpdateVoter, "voter") + run(voting.RunVoter, "voter") case stateUpdateSaver.FullCommand(): run(evm.RunStateChangeListener, "state-change-listener") default: diff --git a/internal/rarimo/stateupdate.go b/internal/rarimo/stateupdate.go index c85b9ea..a25ce15 100644 --- a/internal/rarimo/stateupdate.go +++ b/internal/rarimo/stateupdate.go @@ -35,7 +35,7 @@ func NewStateUpdateMessageMaker(txCreatorAddr string, contract string, homeChain return &StateUpdateMessageMaker{txCreatorAddr: txCreatorAddr, contract: contract, homeChain: homeChain, stateDataProvider: stateDataProvider} } -func (m *StateUpdateMessageMaker) StateUpdateMsgByBlock(ctx context.Context, issuer, block *big.Int) (*oracletypes.MsgCreateIdentityDefaultTransferOp, error) { +func (m *StateUpdateMessageMaker) StateUpdateMsgByBlock(ctx context.Context, issuer, block *big.Int) (*oracletypes.MsgCreateIdentityStateTransferOp, error) { latestState, replacedState, err := m.getStatesOnBlock(ctx, issuer, block) if err != nil { return nil, err @@ -45,30 +45,23 @@ func (m *StateUpdateMessageMaker) StateUpdateMsgByBlock(ctx context.Context, iss return nil, nil } - length, err := m.stateDataProvider.GetGISTRootHistoryLength(&bind.CallOpts{ - Context: ctx, - }) - if err != nil { - return nil, errors.Wrap(err, "failed to get overall gists count") - } - - // FIXME: Possible bug: GIST could be changed during our logic processing - // Can be done using the same logic as with states - gists, err := m.stateDataProvider.GetGISTRootHistory(&bind.CallOpts{ - Context: ctx, - }, new(big.Int).Sub(length, big.NewInt(2)), big.NewInt(2)) + return m.StateUpdateMsgByStates(ctx, *latestState, *replacedState) +} +func (m *StateUpdateMessageMaker) GISTUpdateMsgByBlock(ctx context.Context, block *big.Int) (*oracletypes.MsgCreateIdentityGISTTransferOp, error) { + latestGIST, replacedGIST, err := m.getGISTsOnBlock(ctx, block) if err != nil { - return nil, errors.Wrap(err, "failed to get last two gist") + return nil, err } - replacedGIST := gists[0] - latestGIST := gists[1] + if latestGIST == nil || replacedGIST == nil { + return nil, nil + } - return m.StateUpdateMsgByStates(ctx, *latestState, *replacedState, latestGIST, replacedGIST) + return m.GISTUpdateMsgByGISTs(ctx, *latestGIST, *replacedGIST) } -func (m *StateUpdateMessageMaker) StateUpdateMsgByHashes(ctx context.Context, issuer, latestStateHash, replacedStateHash, latestGISTHash, replacedGISTHash string) (*oracletypes.MsgCreateIdentityDefaultTransferOp, error) { +func (m *StateUpdateMessageMaker) StateUpdateMsgByHashes(ctx context.Context, issuer, latestStateHash, replacedStateHash string) (*oracletypes.MsgCreateIdentityStateTransferOp, error) { latestState, err := m.stateDataProvider.GetStateInfoByIdAndState(&bind.CallOpts{ Context: ctx, }, new(big.Int).SetBytes(hexutil.MustDecode(issuer)), new(big.Int).SetBytes(hexutil.MustDecode(latestStateHash))) @@ -83,49 +76,58 @@ func (m *StateUpdateMessageMaker) StateUpdateMsgByHashes(ctx context.Context, is return nil, errors.Wrap(err, "failed to get replaced state") } + return m.StateUpdateMsgByStates(ctx, latestState, replacedState) +} + +func (m *StateUpdateMessageMaker) GISTUpdateMsgByHashes(ctx context.Context, latestGISTHash, replacedGISTHash string) (*oracletypes.MsgCreateIdentityGISTTransferOp, error) { latestGIST, err := m.stateDataProvider.GetGISTRootInfo(&bind.CallOpts{ Context: ctx, }, new(big.Int).SetBytes(hexutil.MustDecode(latestGISTHash))) if err != nil { - return nil, errors.Wrap(err, "failed to get latest gist") + return nil, errors.Wrap(err, "failed to get latest state") } replacedGIST, err := m.stateDataProvider.GetGISTRootInfo(&bind.CallOpts{ Context: ctx, }, new(big.Int).SetBytes(hexutil.MustDecode(replacedGISTHash))) if err != nil { - return nil, errors.Wrap(err, "failed to get replaced gist") + return nil, errors.Wrap(err, "failed to get replaced state") } - return m.StateUpdateMsgByStates(ctx, latestState, replacedState, latestGIST, replacedGIST) + return m.GISTUpdateMsgByGISTs(ctx, latestGIST, replacedGIST) } -func (m *StateUpdateMessageMaker) StateUpdateMsgByStates(_ context.Context, latestState, replacedState statebind.IStateStateInfo, latestGIST, replacedGIST statebind.IStateGistRootInfo) (*oracletypes.MsgCreateIdentityDefaultTransferOp, error) { +func (m *StateUpdateMessageMaker) StateUpdateMsgByStates(_ context.Context, latestState, replacedState statebind.IStateStateInfo) (*oracletypes.MsgCreateIdentityStateTransferOp, error) { if latestState.State.Cmp(replacedState.ReplacedByState) != 0 { return nil, errors.New("replaced state does not correspond latest state") } - if latestGIST.Root.Cmp(replacedGIST.ReplacedByRoot) != 0 { - return nil, errors.New("replaced gist does not correspond latest gist") - } - - return &oracletypes.MsgCreateIdentityDefaultTransferOp{ + return &oracletypes.MsgCreateIdentityStateTransferOp{ Creator: m.txCreatorAddr, Contract: m.contract, Chain: m.homeChain, Id: hexutil.Encode(latestState.Id.Bytes()), // should be issuer id only - GISTHash: hexutil.Encode(latestGIST.Root.Bytes()), StateHash: hexutil.Encode(latestState.State.Bytes()), StateCreatedAtTimestamp: latestState.CreatedAtTimestamp.String(), StateCreatedAtBlock: latestState.CreatedAtBlock.String(), - StateReplacedBy: hexutil.Encode(latestState.ReplacedByState.Bytes()), - GISTReplacedBy: hexutil.Encode(latestGIST.ReplacedByRoot.Bytes()), - GISTCreatedAtTimestamp: latestGIST.CreatedAtTimestamp.String(), - GISTCreatedAtBlock: latestGIST.CreatedAtBlock.String(), ReplacedStateHash: hexutil.Encode(replacedState.State.Bytes()), - ReplacedGISTtHash: hexutil.Encode(replacedGIST.Root.Bytes()), }, nil +} +func (m *StateUpdateMessageMaker) GISTUpdateMsgByGISTs(_ context.Context, latestGIST, replacedGIST statebind.IStateGistRootInfo) (*oracletypes.MsgCreateIdentityGISTTransferOp, error) { + if latestGIST.Root.Cmp(replacedGIST.ReplacedByRoot) != 0 { + return nil, errors.New("replaced gist does not correspond latest state") + } + + return &oracletypes.MsgCreateIdentityGISTTransferOp{ + Creator: m.txCreatorAddr, + Contract: m.contract, + Chain: m.homeChain, + GISTHash: hexutil.Encode(latestGIST.Root.Bytes()), + GISTCreatedAtTimestamp: latestGIST.CreatedAtTimestamp.String(), + GISTCreatedAtBlock: latestGIST.CreatedAtBlock.String(), + ReplacedGISTtHash: hexutil.Encode(replacedGIST.Root.Bytes()), + }, nil } func (m *StateUpdateMessageMaker) getStatesOnBlock(ctx context.Context, issuer, block *big.Int) (*statebind.IStateStateInfo, *statebind.IStateStateInfo, error) { @@ -162,7 +164,46 @@ func (m *StateUpdateMessageMaker) getStatesOnBlock(ctx context.Context, issuer, length.Sub(length, big.NewInt(1)) if length.Cmp(big.NewInt(1)) == 0 { - return nil, nil, errors.Wrap(err, "requested state on block does noe exist") + return nil, nil, errors.Wrap(err, "requested state on block does not exist") + } + } +} + +func (m *StateUpdateMessageMaker) getGISTsOnBlock(ctx context.Context, block *big.Int) (*statebind.IStateGistRootInfo, *statebind.IStateGistRootInfo, error) { + length, err := m.stateDataProvider.GetGISTRootHistoryLength(&bind.CallOpts{ + Context: ctx, + }) + if err != nil { + return nil, nil, errors.Wrap(err, "failed to get overall gists count") + } + + if length.Cmp(big.NewInt(1)) == 0 { + // Only one state transition exist. Ignore that state transition. + // FIXME + return nil, nil, nil + } + + for { + gists, err := m.stateDataProvider.GetGISTRootHistory(&bind.CallOpts{ + Context: ctx, + }, new(big.Int).Sub(length, big.NewInt(2)), big.NewInt(2)) + + if err != nil { + return nil, nil, errors.Wrap(err, "failed to get last two gists") + } + + replacedGIST := gists[0] + latestGIST := gists[1] + + if latestGIST.CreatedAtBlock.Cmp(block) == 0 { + return &latestGIST, &replacedGIST, nil + } + + // FIXME maybe increase step to reduce RPC calls amount + length.Sub(length, big.NewInt(1)) + + if length.Cmp(big.NewInt(1)) == 0 { + return nil, nil, errors.Wrap(err, "requested gist on block does not exist") } } } diff --git a/internal/services/evm/stateChangeListener.go b/internal/services/evm/stateChangeListener.go index 8471e16..1a16056 100644 --- a/internal/services/evm/stateChangeListener.go +++ b/internal/services/evm/stateChangeListener.go @@ -34,6 +34,17 @@ func RunStateChangeListener(ctx context.Context, cfg config.Config) { panic(errors.Wrap(err, "failed to init state change handler")) } + filtrationDisabled := cfg.States().DisableFiltration + allowList := Map(cfg.States().IssuerID) + + filter := func(id string) bool { + if filtrationDisabled { + return true + } + _, ok := allowList[id] + return ok + } + listener := stateChangeListener{ log: log, broadcaster: cfg.Broadcaster(), @@ -45,10 +56,9 @@ func RunStateChangeListener(ctx context.Context, cfg config.Config) { cfg.Ethereum().NetworkName, stateData, ), - watchedIssuerID: Map(cfg.States().IssuerID), - disableFiltration: cfg.States().DisableFiltration, - fromBlock: cfg.Ethereum().StartFromBlock, - blockWindow: cfg.Ethereum().BlockWindow, + filter: filter, + fromBlock: cfg.Ethereum().StartFromBlock, + blockWindow: cfg.Ethereum().BlockWindow, } running.WithBackOff(ctx, log, runnerName, @@ -57,7 +67,8 @@ func RunStateChangeListener(ctx context.Context, cfg config.Config) { } type stateUpdateMsger interface { - StateUpdateMsgByBlock(ctx context.Context, issuer, block *big.Int) (*oracletypes.MsgCreateIdentityDefaultTransferOp, error) + StateUpdateMsgByBlock(ctx context.Context, issuer, block *big.Int) (*oracletypes.MsgCreateIdentityStateTransferOp, error) + GISTUpdateMsgByBlock(ctx context.Context, block *big.Int) (*oracletypes.MsgCreateIdentityGISTTransferOp, error) } type blockHandler interface { @@ -71,10 +82,9 @@ type stateChangeListener struct { msger stateUpdateMsger blockHandler blockHandler - watchedIssuerID map[string]struct{} - disableFiltration bool - fromBlock uint64 - blockWindow uint64 + filter func(string) bool + fromBlock uint64 + blockWindow uint64 } func (l *stateChangeListener) subscription(ctx context.Context) error { @@ -132,14 +142,27 @@ func (l *stateChangeListener) subscription(ctx context.Context) error { "log_index": e.Raw.Index, }).Debugf("got event: id: %s block: %s timestamp: %s state: %s", e.Id.String(), e.BlockN.String(), e.Timestamp.String(), e.State.String()) - if !l.disableFiltration { - if _, ok := l.watchedIssuerID[e.Id.String()]; !ok { - l.log.Debugf("Skipping event: id %s is not allowed", e.Id.String()) - continue - } + msg1, err := l.msger.GISTUpdateMsgByBlock(ctx, e.BlockN) + if err != nil { + l.log.WithError(err).WithField("tx_hash", e.Raw.TxHash.String()).Error("failed to craft GIST updated msg") + continue + } + + if msg1 == nil { + l.log.WithField("tx_hash", e.Raw.TxHash.String()).Info("ignoring that GIST transition") + continue + } + + if err := l.broadcaster.BroadcastTx(ctx, msg1); err != nil { + l.log.WithError(err).WithField("tx_hash", e.Raw.TxHash.String()).Error(err, "failed to broadcast GIST updated msg") + continue + } + + if !l.filter(e.Id.String()) { + l.log.WithField("tx_hash", e.Raw.TxHash.String()).Info("Issuer ID is not supported for state update messages") + return nil } - // Getting last state message msg, err := l.msger.StateUpdateMsgByBlock(ctx, e.Id, e.BlockN) if err != nil { l.log.WithError(err).WithField("tx_hash", e.Raw.TxHash.String()).Error("failed to craft state updated msg") diff --git a/internal/services/grpc/grpc_impl.go b/internal/services/grpc/grpc_impl.go index e73be74..ad4adb9 100644 --- a/internal/services/grpc/grpc_impl.go +++ b/internal/services/grpc/grpc_impl.go @@ -34,10 +34,11 @@ func RunAPI(ctx context.Context, cfg config.Config) { listener: cfg.Listener(), voter: voter.NewVoter( cfg.Ethereum().NetworkName, - cfg.Log().WithField("who", "evm-saver-voter"), + cfg.Log().WithField("who", "grpc-voter"), cfg.Broadcaster(), map[rarimotypes.OpType]voter.Verifier{ - rarimotypes.OpType_IDENTITY_DEFAULT_TRANSFER: voting.NewStateUpdateVerifier(cfg), + rarimotypes.OpType_IDENTITY_STATE_TRANSFER: voting.NewStateUpdateVerifier(cfg), + rarimotypes.OpType_IDENTITY_GIST_TRANSFER: voting.NewGISTUpdateVerifier(cfg), }, ), }) diff --git a/internal/services/voting/main.go b/internal/services/voting/main.go new file mode 100644 index 0000000..fabc35c --- /dev/null +++ b/internal/services/voting/main.go @@ -0,0 +1,55 @@ +package voting + +import ( + "context" + "sync" + "time" + + "github.com/rarimo/evm-identity-saver-svc/internal/config" + rarimocore "github.com/rarimo/rarimo-core/x/rarimocore/types" + "github.com/rarimo/saver-grpc-lib/voter" + "gitlab.com/distributed_lab/running" +) + +const ( + OpQueryGISTUpdate = "tm.event='Tx' AND new_operation.operation_type='IDENTITY_GIST_TRANSFER'" + OpQueryStateUpdate = "tm.event='Tx' AND new_operation.operation_type='IDENTITY_STATE_TRANSFER'" +) + +func RunVoter(ctx context.Context, cfg config.Config) { + gistV := NewGISTUpdateVerifier(cfg) + stateV := NewStateUpdateVerifier(cfg) + + v := voter.NewVoter(cfg.Ethereum().NetworkName, cfg.Log(), cfg.Broadcaster(), map[rarimocore.OpType]voter.Verifier{ + rarimocore.OpType_IDENTITY_STATE_TRANSFER: stateV, + rarimocore.OpType_IDENTITY_GIST_TRANSFER: gistV, + }) + + // catchup tends to panic on startup and doesn't handle it by itself, so we wrap it into retry loop + running.UntilSuccess(ctx, cfg.Log(), "voter-catchup", func(ctx context.Context) (bool, error) { + voter. + NewCatchupper(cfg.Cosmos(), v, cfg.Log()). + Run(ctx) + + return true, nil + }, 1*time.Second, 5*time.Second) + + wg := sync.WaitGroup{} + wg.Add(2) + + go func() { + defer wg.Done() + voter. + NewSubscriber(v, cfg.Tendermint(), cfg.Cosmos(), OpQueryStateUpdate, cfg.Log(), cfg.Subscriber()). + Run(ctx) + }() + + go func() { + defer wg.Done() + voter. + NewSubscriber(v, cfg.Tendermint(), cfg.Cosmos(), OpQueryGISTUpdate, cfg.Log(), cfg.Subscriber()). + Run(ctx) + }() + + wg.Wait() +} diff --git a/internal/services/voting/types.go b/internal/services/voting/types.go new file mode 100644 index 0000000..abe7034 --- /dev/null +++ b/internal/services/voting/types.go @@ -0,0 +1,12 @@ +package voting + +import ( + "context" + + oracletypes "github.com/rarimo/rarimo-core/x/oraclemanager/types" +) + +type stateUpdateMsger interface { + StateUpdateMsgByHashes(ctx context.Context, issuer, latestStateHash, replacedStateHash string) (*oracletypes.MsgCreateIdentityStateTransferOp, error) + GISTUpdateMsgByHashes(ctx context.Context, latestGISTHash, replacedGISTHash string) (*oracletypes.MsgCreateIdentityGISTTransferOp, error) +} diff --git a/internal/services/voting/vote_gist.go b/internal/services/voting/vote_gist.go new file mode 100644 index 0000000..08fed81 --- /dev/null +++ b/internal/services/voting/vote_gist.go @@ -0,0 +1,88 @@ +package voting + +import ( + "context" + + "github.com/gogo/protobuf/proto" + "github.com/rarimo/evm-identity-saver-svc/internal/config" + "github.com/rarimo/evm-identity-saver-svc/internal/rarimo" + statebind "github.com/rarimo/evm-identity-saver-svc/pkg/state" + oracletypes "github.com/rarimo/rarimo-core/x/oraclemanager/types" + rarimocore "github.com/rarimo/rarimo-core/x/rarimocore/types" + "github.com/rarimo/saver-grpc-lib/voter" + "github.com/rarimo/saver-grpc-lib/voter/verifiers" + "gitlab.com/distributed_lab/logan/v3" + "gitlab.com/distributed_lab/logan/v3/errors" +) + +type GistUpdateVerifier struct { + log *logan.Entry + oracleQueryClient oracletypes.QueryClient + msger stateUpdateMsger +} + +var _ voter.Verifier = &GistUpdateVerifier{} + +func NewGISTUpdateVerifier(cfg config.Config) *GistUpdateVerifier { + stateV2, err := statebind.NewStateV2Handler(cfg.Ethereum().ContractAddr, cfg.Ethereum().RPCClient) + if err != nil { + panic(errors.Wrap(err, "failed to init StateV2 filterer")) + } + + return &GistUpdateVerifier{ + log: cfg.Log(), + oracleQueryClient: oracletypes.NewQueryClient(cfg.Cosmos()), + msger: rarimo.NewStateUpdateMessageMaker( + cfg.Broadcaster().Sender(), + cfg.Ethereum().ContractAddr.String(), + cfg.Ethereum().NetworkName, + stateV2, + ), + } +} + +func (s *GistUpdateVerifier) Verify(ctx context.Context, operation rarimocore.Operation) (rarimocore.VoteType, error) { + if operation.OperationType != rarimocore.OpType_IDENTITY_GIST_TRANSFER { + s.log.Debugf("Voted NO: invalid operation type") + return rarimocore.VoteType_NO, verifiers.ErrInvalidOperationType + } + + var op rarimocore.IdentityGISTTransfer + if err := proto.Unmarshal(operation.Details.Value, &op); err != nil { + s.log.Debugf("Voted NO: failed to unmarshal") + return rarimocore.VoteType_NO, err + } + + if err := s.verifyIdentityGISTTransfer(ctx, op); err != nil { + s.log.WithError(err).Debugf("Voted NO: received an error from verifier") + switch errors.Cause(err) { + case verifiers.ErrUnsupportedNetwork: + return rarimocore.VoteType_NO, verifiers.ErrUnsupportedNetwork + case verifiers.ErrWrongOperationContent: + return rarimocore.VoteType_NO, nil + default: + return rarimocore.VoteType_NO, err + } + } + + return rarimocore.VoteType_YES, nil + +} + +func (s *GistUpdateVerifier) verifyIdentityGISTTransfer(ctx context.Context, op rarimocore.IdentityGISTTransfer) error { + msg, err := s.msger.GISTUpdateMsgByHashes(ctx, op.GISTHash, op.ReplacedGISTHash) + if err != nil { + return errors.Wrap(err, "failed to get msg") + } + + resp, err := s.oracleQueryClient.IdentityGISTTransfer(ctx, &oracletypes.QueryGetIdentityGISTTransferRequest{Msg: *msg}) + if err != nil { + return errors.Wrap(err, "failed to fetch operation details from core") + } + + if !proto.Equal(&resp.Transfer, &op) { + return verifiers.ErrWrongOperationContent + } + + return nil +} diff --git a/internal/services/voting/statev2.go b/internal/services/voting/vote_state.go similarity index 50% rename from internal/services/voting/statev2.go rename to internal/services/voting/vote_state.go index eea0ea9..4411478 100644 --- a/internal/services/voting/statev2.go +++ b/internal/services/voting/vote_state.go @@ -2,7 +2,6 @@ package voting import ( "context" - "time" "github.com/gogo/protobuf/proto" "github.com/rarimo/evm-identity-saver-svc/internal/config" @@ -14,33 +13,24 @@ import ( "github.com/rarimo/saver-grpc-lib/voter/verifiers" "gitlab.com/distributed_lab/logan/v3" "gitlab.com/distributed_lab/logan/v3/errors" - "gitlab.com/distributed_lab/running" ) -const ( - OpQueryStateUpdate = "tm.event='Tx' AND new_operation.operation_type='IDENTITY_DEFAULT_TRANSFER'" -) - -type stateUpdateMsger interface { - StateUpdateMsgByHashes(ctx context.Context, issuer, latestStateHash, replacedStateHash, latestGISTHash, replacedGISTHash string) (*oracletypes.MsgCreateIdentityDefaultTransferOp, error) -} - -type stateUpdateVerifier struct { +type StateUpdateVerifier struct { log *logan.Entry - homeChain string oracleQueryClient oracletypes.QueryClient msger stateUpdateMsger } -func NewStateUpdateVerifier(cfg config.Config) *stateUpdateVerifier { +var _ voter.Verifier = &StateUpdateVerifier{} + +func NewStateUpdateVerifier(cfg config.Config) *StateUpdateVerifier { stateV2, err := statebind.NewStateV2Handler(cfg.Ethereum().ContractAddr, cfg.Ethereum().RPCClient) if err != nil { panic(errors.Wrap(err, "failed to init StateV2 filterer")) } - return &stateUpdateVerifier{ + return &StateUpdateVerifier{ log: cfg.Log(), - homeChain: cfg.Ethereum().NetworkName, oracleQueryClient: oracletypes.NewQueryClient(cfg.Cosmos()), msger: rarimo.NewStateUpdateMessageMaker( cfg.Broadcaster().Sender(), @@ -51,41 +41,19 @@ func NewStateUpdateVerifier(cfg config.Config) *stateUpdateVerifier { } } -func RunStateUpdateVoter(ctx context.Context, cfg config.Config) { - verifier := NewStateUpdateVerifier(cfg) - - v := voter.NewVoter(cfg.Ethereum().NetworkName, cfg.Log(), cfg.Broadcaster(), map[rarimocore.OpType]voter.Verifier{ - rarimocore.OpType_IDENTITY_DEFAULT_TRANSFER: verifier, - }) - - // catchup tends to panic on startup and doesn't handle it by itself, so we wrap it into retry loop - running.UntilSuccess(ctx, cfg.Log(), "state-update-voter-catchup", func(ctx context.Context) (bool, error) { - voter. - NewCatchupper(cfg.Cosmos(), v, cfg.Log()). - Run(ctx) - - return true, nil - }, 1*time.Second, 5*time.Second) - - // run blocking verification subscription - voter. - NewSubscriber(v, cfg.Tendermint(), cfg.Cosmos(), OpQueryStateUpdate, cfg.Log(), cfg.Subscriber()). - Run(ctx) -} - -func (s *stateUpdateVerifier) Verify(ctx context.Context, operation rarimocore.Operation) (rarimocore.VoteType, error) { - if operation.OperationType != rarimocore.OpType_IDENTITY_DEFAULT_TRANSFER { +func (s *StateUpdateVerifier) Verify(ctx context.Context, operation rarimocore.Operation) (rarimocore.VoteType, error) { + if operation.OperationType != rarimocore.OpType_IDENTITY_STATE_TRANSFER { s.log.Debugf("Voted NO: invalid operation type") return rarimocore.VoteType_NO, verifiers.ErrInvalidOperationType } - var stateUpdated rarimocore.IdentityDefaultTransfer - if err := proto.Unmarshal(operation.Details.Value, &stateUpdated); err != nil { + var op rarimocore.IdentityStateTransfer + if err := proto.Unmarshal(operation.Details.Value, &op); err != nil { s.log.Debugf("Voted NO: failed to unmarshal") return rarimocore.VoteType_NO, err } - if err := s.verifyIdentityDefaultTransfer(ctx, stateUpdated); err != nil { + if err := s.verifyIdentityStateTransfer(ctx, op); err != nil { s.log.WithError(err).Debugf("Voted NO: received an error from verifier") switch errors.Cause(err) { case verifiers.ErrUnsupportedNetwork: @@ -101,13 +69,13 @@ func (s *stateUpdateVerifier) Verify(ctx context.Context, operation rarimocore.O } -func (s *stateUpdateVerifier) verifyIdentityDefaultTransfer(ctx context.Context, transfer rarimocore.IdentityDefaultTransfer) error { - msg, err := s.msger.StateUpdateMsgByHashes(ctx, transfer.Id, transfer.StateHash, transfer.ReplacedStateHash, transfer.GISTHash, transfer.ReplacedGISTHash) +func (s *StateUpdateVerifier) verifyIdentityStateTransfer(ctx context.Context, transfer rarimocore.IdentityStateTransfer) error { + msg, err := s.msger.StateUpdateMsgByHashes(ctx, transfer.Id, transfer.StateHash, transfer.ReplacedStateHash) if err != nil { return errors.Wrap(err, "failed to get msg") } - resp, err := s.oracleQueryClient.IdentityDefaultTransfer(ctx, &oracletypes.QueryGetIdentityDefaultTransferRequest{Msg: *msg}) + resp, err := s.oracleQueryClient.IdentityStateTransfer(ctx, &oracletypes.QueryGetIdentityStateTransferRequest{Msg: *msg}) if err != nil { return errors.Wrap(err, "failed to fetch operation details from core") } From aac4a5951927d4519897f167eaef76703202ddd9 Mon Sep 17 00:00:00 2001 From: olegfomenko2002 Date: Wed, 22 Nov 2023 18:32:41 +0200 Subject: [PATCH 2/2] bump core v --- go.sum | 2 -- 1 file changed, 2 deletions(-) diff --git a/go.sum b/go.sum index 64a8fb6..652099d 100644 --- a/go.sum +++ b/go.sum @@ -1200,8 +1200,6 @@ github.com/rarimo/broadcaster-svc v1.0.2 h1:ExQcjjWCRP5+POLDlZHrTD1ffUsBH+Dgv5FA github.com/rarimo/broadcaster-svc v1.0.2/go.mod h1:lYIHy+X4IqQt4eBdtMN/V352H3EV0/gO8G+32SFwUWI= github.com/rarimo/cosmos-sdk v0.46.7 h1:jU2PiWzc+19SF02cXM0O0puKPeH1C6Q6t2lzJ9s1ejc= github.com/rarimo/cosmos-sdk v0.46.7/go.mod h1:fqKqz39U5IlEFb4nbQ72951myztsDzFKKDtffYJ63nk= -github.com/rarimo/rarimo-core v1.0.8-0.20231107183134-c8a62c0c9ebd h1:rKITVn35c65eLn7lgg/eBu7WULWJNRPLcrdEhCq3nSw= -github.com/rarimo/rarimo-core v1.0.8-0.20231107183134-c8a62c0c9ebd/go.mod h1:auP3KgxaSwkOUrLWBifjnMbbSQTSBA9Y/gVgq1WU/B4= github.com/rarimo/rarimo-core v1.0.8-0.20231107191012-470dd204b863 h1:sGOC4duN7B4iOuIBKD/8vQXNkFcQGili9VO09bxmNSQ= github.com/rarimo/rarimo-core v1.0.8-0.20231107191012-470dd204b863/go.mod h1:auP3KgxaSwkOUrLWBifjnMbbSQTSBA9Y/gVgq1WU/B4= github.com/rarimo/saver-grpc-lib v1.0.0 h1:MGUVjYg7unmodYczVsLqlqZNkT4CIgKqdo6aQtL1qdE=