From 06d0cb61b07fabf9dcde6f96077cda7f9b5de4c7 Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Fri, 21 Feb 2025 09:22:47 -0500 Subject: [PATCH] update changed interfaces --- go.mod | 18 +-- go.sum | 42 +++---- peers/app_request_network.go | 15 ++- peers/app_request_network_test.go | 5 +- .../validators/canonical_validator_client.go | 10 +- .../mocks/mock_canonical_validator_client.go | 9 +- relayer/network_utils.go | 6 +- scripts/versions.sh | 2 +- signature-aggregator/aggregator/aggregator.go | 20 ++-- .../aggregator/aggregator_test.go | 108 +++++------------- 10 files changed, 90 insertions(+), 145 deletions(-) diff --git a/go.mod b/go.mod index 38252c80..f13d537e 100644 --- a/go.mod +++ b/go.mod @@ -5,8 +5,8 @@ go 1.23.6 require ( github.com/alexliesenfeld/health v0.8.0 github.com/ava-labs/avalanchego v1.12.3-0.20250219205418-195557d25676 - github.com/ava-labs/icm-contracts v1.0.9-0.20250204232902-ae24f1f2636f - github.com/ava-labs/subnet-evm v0.7.1 + github.com/ava-labs/icm-contracts v1.0.9-0.20250220210828-238d99559d3c + github.com/ava-labs/subnet-evm v0.7.2-0.20250218163755-6d2521c6bddd github.com/aws/aws-sdk-go-v2 v1.36.1 github.com/aws/aws-sdk-go-v2/config v1.29.6 github.com/aws/aws-sdk-go-v2/service/kms v1.37.18 @@ -58,7 +58,7 @@ require ( github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 // indirect github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect @@ -155,15 +155,15 @@ require ( go.opentelemetry.io/otel/trace v1.32.0 // indirect go.opentelemetry.io/proto/otlp v1.0.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.32.0 // indirect + golang.org/x/crypto v0.33.0 // indirect golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect - golang.org/x/net v0.34.0 // indirect + golang.org/x/net v0.35.0 // indirect golang.org/x/oauth2 v0.24.0 // indirect - golang.org/x/sys v0.29.0 // indirect - golang.org/x/term v0.28.0 // indirect - golang.org/x/text v0.21.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/term v0.29.0 // indirect + golang.org/x/text v0.22.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.29.0 // indirect + golang.org/x/tools v0.30.0 // indirect gonum.org/v1/gonum v0.11.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20241202173237-19429a94021a // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a // indirect diff --git a/go.sum b/go.sum index 7c843923..5e4578fc 100644 --- a/go.sum +++ b/go.sum @@ -64,10 +64,12 @@ github.com/ava-labs/avalanchego v1.12.3-0.20250219205418-195557d25676 h1:uU6L5wA github.com/ava-labs/avalanchego v1.12.3-0.20250219205418-195557d25676/go.mod h1:DfZ1/FHFxr1XnpDMfbMmex8bKxAtIISCGASdMUNFXtY= github.com/ava-labs/coreth v0.14.1-rc.1.0.20250219185827-6a9db205a450 h1:xSoL6plkPrb2w21v4JRnQg3BIJSg2svBHXyil09RMAg= github.com/ava-labs/coreth v0.14.1-rc.1.0.20250219185827-6a9db205a450/go.mod h1:AEQcF8MWrKH0sS114wEZlkSfeGF5F66xTbQYqqimNLI= -github.com/ava-labs/icm-contracts v1.0.9-0.20250204232902-ae24f1f2636f h1:24+o/LWyC4e+zI9ySdm6wu87fwRG7x/OMFfacupjWiQ= -github.com/ava-labs/icm-contracts v1.0.9-0.20250204232902-ae24f1f2636f/go.mod h1:ofBEhsFwoTlPWl433zr7j1PzvmQdvgdS3ixg+QYKxac= -github.com/ava-labs/subnet-evm v0.7.1 h1:wXau+6Aj24hqqlN3wY14OKB4GJobWFhM3MzqFhg3WeU= -github.com/ava-labs/subnet-evm v0.7.1/go.mod h1:jpAX6cNfMuUyoeP2/l9Z0ojDy2K/XbZq5y+E0jPXy38= +github.com/ava-labs/icm-contracts v1.0.9-0.20250218225830-7a095cd5efc2 h1:AfJrcw8dq8ylQBMG3017YUEFLNk3L7Fw9lF5duZM4+A= +github.com/ava-labs/icm-contracts v1.0.9-0.20250218225830-7a095cd5efc2/go.mod h1:+o13aTiVNTGwxMNSGYWzFaBDkcC/fXLHUT+TyAL7Rsw= +github.com/ava-labs/icm-contracts v1.0.9-0.20250220210828-238d99559d3c h1:PPS0SIqgGO4V+kjr5jQnSSLp7PVb4SDe4oAVGJlqYR8= +github.com/ava-labs/icm-contracts v1.0.9-0.20250220210828-238d99559d3c/go.mod h1:DsNy0DZ5DVDB3r0Q8wGBaRmFOjwTosZh+oeyZ5HDGqc= +github.com/ava-labs/subnet-evm v0.7.2-0.20250218163755-6d2521c6bddd h1:cEiaJyRkF+E+aFu5EmwiE8A0jlfMymqrpt0sDlLgXuA= +github.com/ava-labs/subnet-evm v0.7.2-0.20250218163755-6d2521c6bddd/go.mod h1:4ZWBSj9JALAtaUOPrI1P78C6vBMUpK0iiD6zaA9K2VA= github.com/aws/aws-sdk-go-v2 v1.36.1 h1:iTDl5U6oAhkNPba0e1t1hrwAo02ZMqbrGq4k5JBWM5E= github.com/aws/aws-sdk-go-v2 v1.36.1/go.mod h1:5PMILGVKiW32oDzjj6RU52yrNrDPUHcbZQYr1sM7qmM= github.com/aws/aws-sdk-go-v2/config v1.29.6 h1:fqgqEKK5HaZVWLQoLiC9Q+xDlSp+1LYidp6ybGE2OGg= @@ -170,8 +172,8 @@ github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= -github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= @@ -698,8 +700,8 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/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.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= -golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= +golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= 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= @@ -738,8 +740,8 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= -golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM= +golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -785,8 +787,8 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= -golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= +golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= +golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= 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= @@ -878,12 +880,12 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= -golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.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.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= -golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= +golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= 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= @@ -894,8 +896,8 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= 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= @@ -957,8 +959,8 @@ golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= -golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= +golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY= +golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/peers/app_request_network.go b/peers/app_request_network.go index 9d9a573c..de118b66 100644 --- a/peers/app_request_network.go +++ b/peers/app_request_network.go @@ -29,6 +29,7 @@ import ( "github.com/ava-labs/avalanchego/utils/set" "github.com/ava-labs/avalanchego/vms/platformvm" "github.com/ava-labs/avalanchego/vms/platformvm/warp" + avalancheWarp "github.com/ava-labs/avalanchego/vms/platformvm/warp" "github.com/ava-labs/icm-services/peers/utils" "github.com/ava-labs/icm-services/peers/validators" subnetWarp "github.com/ava-labs/subnet-evm/precompile/contracts/warp" @@ -328,14 +329,13 @@ func (n *appRequestNetwork) Shutdown() { // so we need to track the node ID to validator index mapping type ConnectedCanonicalValidators struct { ConnectedWeight uint64 - TotalValidatorWeight uint64 - ValidatorSet []*warp.Validator + ValidatorSet avalancheWarp.CanonicalValidatorSet NodeValidatorIndexMap map[ids.NodeID]int } // Returns the Warp Validator and its index in the canonical Validator ordering for a given nodeID func (c *ConnectedCanonicalValidators) GetValidator(nodeID ids.NodeID) (*warp.Validator, int) { - return c.ValidatorSet[c.NodeValidatorIndexMap[nodeID]], c.NodeValidatorIndexMap[nodeID] + return c.ValidatorSet.Validators[c.NodeValidatorIndexMap[nodeID]], c.NodeValidatorIndexMap[nodeID] } // GetConnectedCanonicalValidators returns the validator information in canonical ordering for the given subnet @@ -343,7 +343,7 @@ func (c *ConnectedCanonicalValidators) GetValidator(nodeID ids.NodeID) (*warp.Va func (n *appRequestNetwork) GetConnectedCanonicalValidators(subnetID ids.ID) (*ConnectedCanonicalValidators, error) { // Get the subnet's current canonical validator set startPChainAPICall := time.Now() - validatorSet, totalValidatorWeight, err := n.validatorClient.GetCurrentCanonicalValidatorSet(subnetID) + validatorSet, err := n.validatorClient.GetCurrentCanonicalValidatorSet(subnetID) n.setPChainAPICallLatencyMS(float64(time.Since(startPChainAPICall).Milliseconds())) if err != nil { return nil, err @@ -354,7 +354,7 @@ func (n *appRequestNetwork) GetConnectedCanonicalValidators(subnetID ids.ID) (*C // This maps node IDs to the index in the canonical validator set nodeValidatorIndexMap := make(map[ids.NodeID]int) nodeIDs := set.NewSet[ids.NodeID](len(nodeValidatorIndexMap)) - for i, vdr := range validatorSet { + for i, vdr := range validatorSet.Validators { for _, node := range vdr.NodeIDs { nodeValidatorIndexMap[node] = i nodeIDs.Add(node) @@ -370,11 +370,10 @@ func (n *appRequestNetwork) GetConnectedCanonicalValidators(subnetID ids.ID) (*C } // Calculate the total weight of connected validators. - connectedWeight := calculateConnectedWeight(validatorSet, nodeValidatorIndexMap, connectedPeers) + connectedWeight := calculateConnectedWeight(validatorSet.Validators, nodeValidatorIndexMap, connectedPeers) return &ConnectedCanonicalValidators{ ConnectedWeight: connectedWeight, - TotalValidatorWeight: totalValidatorWeight, ValidatorSet: validatorSet, NodeValidatorIndexMap: nodeValidatorIndexMap, }, nil @@ -419,7 +418,7 @@ func GetNetworkHealthFunc(network AppRequestNetwork, subnetIDs []ids.ID) func(co } if !sharedUtils.CheckStakeWeightExceedsThreshold( big.NewInt(0).SetUint64(connectedValidators.ConnectedWeight), - connectedValidators.TotalValidatorWeight, + connectedValidators.ValidatorSet.TotalWeight, subnetWarp.WarpDefaultQuorumNumerator, ) { return errNotEnoughConnectedStake diff --git a/peers/app_request_network_test.go b/peers/app_request_network_test.go index bbfd1084..efd04b0c 100644 --- a/peers/app_request_network_test.go +++ b/peers/app_request_network_test.go @@ -9,6 +9,7 @@ import ( "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/network/peer" "github.com/ava-labs/avalanchego/utils/crypto/bls" + "github.com/ava-labs/avalanchego/utils/crypto/bls/signer/localsigner" "github.com/ava-labs/avalanchego/utils/set" "github.com/ava-labs/avalanchego/vms/platformvm/warp" "github.com/ava-labs/icm-services/peers/avago_mocks" @@ -151,14 +152,14 @@ func TestConnectToCanonicalValidators(t *testing.T) { ret, err := arNetwork.GetConnectedCanonicalValidators(subnetID) require.Equal(t, testCase.expectedConnectedWeight, ret.ConnectedWeight) - require.Equal(t, testCase.expectedTotalWeight, ret.TotalValidatorWeight) + require.Equal(t, testCase.expectedTotalWeight, ret.ValidatorSet.TotalWeight) require.NoError(t, err) }) } } func makeValidator(t *testing.T, weight uint64, numNodeIDs int) warp.Validator { - localSigner, err := bls.NewSigner() + localSigner, err := localsigner.New() require.NoError(t, err) pk := localSigner.PublicKey() diff --git a/peers/validators/canonical_validator_client.go b/peers/validators/canonical_validator_client.go index 317f21b9..18e2bdf2 100644 --- a/peers/validators/canonical_validator_client.go +++ b/peers/validators/canonical_validator_client.go @@ -28,7 +28,7 @@ var _ CanonicalValidatorState = &CanonicalValidatorClient{} type CanonicalValidatorState interface { validators.State - GetCurrentCanonicalValidatorSet(subnetID ids.ID) ([]*avalancheWarp.Validator, uint64, error) + GetCurrentCanonicalValidatorSet(subnetID ids.ID) (avalancheWarp.CanonicalValidatorSet, error) GetProposedValidators(ctx context.Context, subnetID ids.ID) (map[ids.NodeID]*validators.GetValidatorOutput, error) } @@ -51,9 +51,9 @@ func NewCanonicalValidatorClient(logger logging.Logger, apiConfig *config.APICon func (v *CanonicalValidatorClient) GetCurrentCanonicalValidatorSet( subnetID ids.ID, -) ([]*avalancheWarp.Validator, uint64, error) { +) (avalancheWarp.CanonicalValidatorSet, error) { // Get the current canonical validator set of the source subnet. - canonicalSubnetValidators, totalValidatorWeight, err := avalancheWarp.GetCanonicalValidatorSet( + canonicalSubnetValidators, err := avalancheWarp.GetCanonicalValidatorSetFromSubnetID( context.Background(), v, pchainapi.ProposedHeight, @@ -65,10 +65,10 @@ func (v *CanonicalValidatorClient) GetCurrentCanonicalValidatorSet( zap.String("subnetID", subnetID.String()), zap.Error(err), ) - return nil, 0, err + return avalancheWarp.CanonicalValidatorSet{}, err } - return canonicalSubnetValidators, totalValidatorWeight, nil + return canonicalSubnetValidators, nil } func (v *CanonicalValidatorClient) GetMinimumHeight(ctx context.Context) (uint64, error) { diff --git a/peers/validators/mocks/mock_canonical_validator_client.go b/peers/validators/mocks/mock_canonical_validator_client.go index 59aac370..a606975a 100644 --- a/peers/validators/mocks/mock_canonical_validator_client.go +++ b/peers/validators/mocks/mock_canonical_validator_client.go @@ -44,13 +44,12 @@ func (m *MockCanonicalValidatorState) EXPECT() *MockCanonicalValidatorStateMockR } // GetCurrentCanonicalValidatorSet mocks base method. -func (m *MockCanonicalValidatorState) GetCurrentCanonicalValidatorSet(subnetID ids.ID) ([]*warp.Validator, uint64, error) { +func (m *MockCanonicalValidatorState) GetCurrentCanonicalValidatorSet(subnetID ids.ID) (warp.CanonicalValidatorSet, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetCurrentCanonicalValidatorSet", subnetID) - ret0, _ := ret[0].([]*warp.Validator) - ret1, _ := ret[1].(uint64) - ret2, _ := ret[2].(error) - return ret0, ret1, ret2 + ret0, _ := ret[0].(warp.CanonicalValidatorSet) + ret1, _ := ret[1].(error) + return ret0, ret1 } // GetCurrentCanonicalValidatorSet indicates an expected call of GetCurrentCanonicalValidatorSet. diff --git a/relayer/network_utils.go b/relayer/network_utils.go index 443444c8..df45f6da 100644 --- a/relayer/network_utils.go +++ b/relayer/network_utils.go @@ -75,7 +75,7 @@ func connectToNonPrimaryNetworkPeers( "Failed to connect to a threshold of stake", zap.String("destinationBlockchainID", blockchainID.String()), zap.Uint64("connectedWeight", connectedValidators.ConnectedWeight), - zap.Uint64("totalValidatorWeight", connectedValidators.TotalValidatorWeight), + zap.Uint64("totalValidatorWeight", connectedValidators.ValidatorSet.TotalWeight), zap.Any("WarpConfig", warpConfig), ) return err @@ -111,7 +111,7 @@ func connectToPrimaryNetworkPeers( "Failed to connect to a threshold of stake", zap.String("destinationBlockchainID", blockchainID.String()), zap.Uint64("connectedWeight", connectedValidators.ConnectedWeight), - zap.Uint64("totalValidatorWeight", connectedValidators.TotalValidatorWeight), + zap.Uint64("totalValidatorWeight", connectedValidators.ValidatorSet.TotalWeight), zap.Any("WarpConfig", warpConfig), ) return err @@ -138,7 +138,7 @@ func checkForSufficientConnectedStake( } return utils.CheckStakeWeightExceedsThreshold( big.NewInt(0).SetUint64(connectedValidators.ConnectedWeight), - connectedValidators.TotalValidatorWeight, + connectedValidators.ValidatorSet.TotalWeight, warpConfig.QuorumNumerator, ), &warpConfig, nil } diff --git a/scripts/versions.sh b/scripts/versions.sh index 6dcf4e46..c2c8ecc2 100755 --- a/scripts/versions.sh +++ b/scripts/versions.sh @@ -35,7 +35,7 @@ GINKGO_VERSION=${GINKGO_VERSION:-$(extract_commit "$(getDepVersion github.com/on SUBNET_EVM_VERSION=${SUBNET_EVM_VERSION:-$(extract_commit "$(getDepVersion github.com/ava-labs/subnet-evm)")} # Set golangci-lint version -GOLANGCI_LINT_VERSION=${GOLANGCI_LINT_VERSION:-'v1.60'} +GOLANGCI_LINT_VERSION=${GOLANGCI_LINT_VERSION:-'v1.64.5'} # Set buf version BUF_VERSION=${BUF_VERSION:-'v1.44.0'} diff --git a/signature-aggregator/aggregator/aggregator.go b/signature-aggregator/aggregator/aggregator.go index e3943c41..3a52a460 100644 --- a/signature-aggregator/aggregator/aggregator.go +++ b/signature-aggregator/aggregator/aggregator.go @@ -116,17 +116,17 @@ func (s *SignatureAggregator) connectToQuorumValidators( signingSubnet.String(), ).Set( float64(connectedValidators.ConnectedWeight) / - float64(connectedValidators.TotalValidatorWeight) * 100, + float64(connectedValidators.ValidatorSet.TotalWeight) * 100, ) if !utils.CheckStakeWeightExceedsThreshold( big.NewInt(0).SetUint64(connectedValidators.ConnectedWeight), - connectedValidators.TotalValidatorWeight, + connectedValidators.ValidatorSet.TotalWeight, quorumPercentage, ) { s.logger.Warn( "Failed to connect to a threshold of stake", zap.Uint64("connectedWeight", connectedValidators.ConnectedWeight), - zap.Uint64("totalValidatorWeight", connectedValidators.TotalValidatorWeight), + zap.Uint64("totalValidatorWeight", connectedValidators.ValidatorSet.TotalWeight), zap.Uint64("quorumPercentage", quorumPercentage), ) s.metrics.FailuresToConnectToSufficientStake.Inc() @@ -182,7 +182,7 @@ func (s *SignatureAggregator) CreateSignedMessage( accumulatedSignatureWeight := big.NewInt(0) signatureMap := make(map[int][bls.SignatureLen]byte) if cachedSignatures, ok := s.cache.Get(unsignedMessage.ID()); ok { - for i, validator := range connectedValidators.ValidatorSet { + for i, validator := range connectedValidators.ValidatorSet.Validators { cachedSignature, found := cachedSignatures[cache.PublicKeyBytes(validator.PublicKeyBytes)] if found { signatureMap[i] = cachedSignature @@ -207,7 +207,7 @@ func (s *SignatureAggregator) CreateSignedMessage( } if len(signatureMap) > 0 { s.metrics.SignatureCacheMisses.Add(float64( - len(connectedValidators.ValidatorSet) - len(signatureMap), + len(connectedValidators.ValidatorSet.Validators) - len(signatureMap), )) } @@ -243,18 +243,18 @@ func (s *SignatureAggregator) CreateSignedMessage( var signedMsg *avalancheWarp.Message // Query the validators with retries. On each retry, query one node per unique BLS pubkey operation := func() error { - responsesExpected := len(connectedValidators.ValidatorSet) - len(signatureMap) + responsesExpected := len(connectedValidators.ValidatorSet.Validators) - len(signatureMap) s.logger.Debug( "Aggregator collecting signatures from peers.", zap.String("sourceBlockchainID", unsignedMessage.SourceChainID.String()), zap.String("signingSubnetID", signingSubnet.String()), - zap.Int("validatorSetSize", len(connectedValidators.ValidatorSet)), + zap.Int("validatorSetSize", len(connectedValidators.ValidatorSet.Validators)), zap.Int("signatureMapSize", len(signatureMap)), zap.Int("responsesExpected", responsesExpected), ) - vdrSet := set.NewSet[ids.NodeID](len(connectedValidators.ValidatorSet)) - for i, vdr := range connectedValidators.ValidatorSet { + vdrSet := set.NewSet[ids.NodeID](len(connectedValidators.ValidatorSet.Validators)) + for i, vdr := range connectedValidators.ValidatorSet.Validators { // If we already have the signature for this validator, do not query any of the composite nodes again if _, ok := signatureMap[i]; ok { continue @@ -483,7 +483,7 @@ func (s *SignatureAggregator) aggregateIfSufficientWeight( // As soon as the signatures exceed the stake weight threshold we try to aggregate and send the transaction. if !utils.CheckStakeWeightExceedsThreshold( accumulatedSignatureWeight, - connectedValidators.TotalValidatorWeight, + connectedValidators.ValidatorSet.TotalWeight, quorumPercentage, ) { // Not enough signatures, continue processing messages diff --git a/signature-aggregator/aggregator/aggregator_test.go b/signature-aggregator/aggregator/aggregator_test.go index cb0d7d3c..1c3e7ad8 100644 --- a/signature-aggregator/aggregator/aggregator_test.go +++ b/signature-aggregator/aggregator/aggregator_test.go @@ -2,7 +2,6 @@ package aggregator import ( "bytes" - "context" "os" "testing" @@ -11,11 +10,11 @@ import ( "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/message" "github.com/ava-labs/avalanchego/proto/pb/sdk" - "github.com/ava-labs/avalanchego/snow/validators" "github.com/ava-labs/avalanchego/subnets" "github.com/ava-labs/avalanchego/utils" "github.com/ava-labs/avalanchego/utils/constants" "github.com/ava-labs/avalanchego/utils/crypto/bls" + "github.com/ava-labs/avalanchego/utils/crypto/bls/signer/localsigner" "github.com/ava-labs/avalanchego/utils/logging" "github.com/ava-labs/avalanchego/utils/set" "github.com/ava-labs/avalanchego/vms/platformvm/warp" @@ -76,7 +75,7 @@ func instantiateAggregator(t *testing.T) ( // Generate the validator values. type validatorInfo struct { nodeID ids.NodeID - blsSigner *bls.LocalSigner + blsSigner *localsigner.LocalSigner blsPublicKey *bls.PublicKey blsPublicKeyBytes []byte } @@ -85,10 +84,10 @@ func (v validatorInfo) Compare(o validatorInfo) int { return bytes.Compare(v.blsPublicKeyBytes, o.blsPublicKeyBytes) } -func makeConnectedValidators(validatorCount int) (*peers.ConnectedCanonicalValidators, []*bls.LocalSigner) { +func makeConnectedValidators(validatorCount int) (*peers.ConnectedCanonicalValidators, []*localsigner.LocalSigner) { validatorValues := make([]validatorInfo, validatorCount) for i := 0; i < validatorCount; i++ { - localSigner, err := bls.NewSigner() + localSigner, err := localsigner.New() if err != nil { panic(err) } @@ -107,7 +106,7 @@ func makeConnectedValidators(validatorCount int) (*peers.ConnectedCanonicalValid // Placeholder for results validatorSet := make([]*warp.Validator, validatorCount) - validatorSigners := make([]*bls.LocalSigner, validatorCount) + validatorSigners := make([]*localsigner.LocalSigner, validatorCount) nodeValidatorIndexMap := make(map[ids.NodeID]int) for i, validator := range validatorValues { validatorSigners[i] = validator.blsSigner @@ -121,9 +120,11 @@ func makeConnectedValidators(validatorCount int) (*peers.ConnectedCanonicalValid } return &peers.ConnectedCanonicalValidators{ - ConnectedWeight: uint64(validatorCount), - TotalValidatorWeight: uint64(validatorCount), - ValidatorSet: validatorSet, + ConnectedWeight: uint64(validatorCount), + ValidatorSet: warp.CanonicalValidatorSet{ + Validators: validatorSet, + TotalWeight: uint64(validatorCount), + }, NodeValidatorIndexMap: nodeValidatorIndexMap, }, validatorSigners } @@ -136,9 +137,11 @@ func TestCreateSignedMessageFailsWithNoValidators(t *testing.T) { mockNetwork.EXPECT().TrackSubnet(ids.Empty) mockNetwork.EXPECT().GetConnectedCanonicalValidators(ids.Empty).Return( &peers.ConnectedCanonicalValidators{ - ConnectedWeight: 0, - TotalValidatorWeight: 0, - ValidatorSet: []*warp.Validator{}, + ConnectedWeight: 0, + ValidatorSet: warp.CanonicalValidatorSet{ + Validators: []*warp.Validator{}, + TotalWeight: 0, + }, }, nil, ) @@ -154,9 +157,11 @@ func TestCreateSignedMessageFailsWithoutSufficientConnectedStake(t *testing.T) { mockNetwork.EXPECT().TrackSubnet(ids.Empty) mockNetwork.EXPECT().GetConnectedCanonicalValidators(ids.Empty).Return( &peers.ConnectedCanonicalValidators{ - ConnectedWeight: 0, - TotalValidatorWeight: 1, - ValidatorSet: []*warp.Validator{}, + ConnectedWeight: 0, + ValidatorSet: warp.CanonicalValidatorSet{ + Validators: []*warp.Validator{}, + TotalWeight: 1, + }, }, nil, ).AnyTimes() @@ -174,7 +179,7 @@ func makeAppRequests( connectedValidators *peers.ConnectedCanonicalValidators, ) []ids.RequestID { var appRequests []ids.RequestID - for _, validator := range connectedValidators.ValidatorSet { + for _, validator := range connectedValidators.ValidatorSet.Validators { for _, nodeID := range validator.NodeIDs { appRequests = append( appRequests, @@ -292,10 +297,13 @@ func TestCreateSignedMessageSucceeds(t *testing.T) { for _, appRequest := range appRequests { nodeIDs.Add(appRequest.NodeID) validatorSigner := validatorSigners[connectedValidators.NodeValidatorIndexMap[appRequest.NodeID]] + + signature, err := validatorSigner.Sign(msg.Bytes()) + require.NoError(t, err) responseBytes, err := proto.Marshal( &sdk.SignatureResponse{ Signature: bls.SignatureToBytes( - validatorSigner.Sign(msg.Bytes()), + signature, ), }, ) @@ -329,19 +337,10 @@ func TestCreateSignedMessageSucceeds(t *testing.T) { ) require.NoError(t, err) - // verify the aggregated signature: - pChainState := newPChainStateStub( - chainID, - subnetID, - 1, - connectedValidators, - ) verifyErr := signedMessage.Signature.Verify( - context.Background(), msg, networkID, - pChainState, - pChainState.currentHeight, + connectedValidators.ValidatorSet, quorumPercentage, 100, ) @@ -395,58 +394,3 @@ func TestUnmarshalResponse(t *testing.T) { }) } } - -type pChainStateStub struct { - subnetIDByChainID map[ids.ID]ids.ID - connectedCanonicalValidators *peers.ConnectedCanonicalValidators - currentHeight uint64 -} - -func newPChainStateStub( - chainID, subnetID ids.ID, - currentHeight uint64, - connectedValidators *peers.ConnectedCanonicalValidators, -) *pChainStateStub { - subnetIDByChainID := make(map[ids.ID]ids.ID) - subnetIDByChainID[chainID] = subnetID - return &pChainStateStub{ - subnetIDByChainID: subnetIDByChainID, - connectedCanonicalValidators: connectedValidators, - currentHeight: currentHeight, - } -} - -func (p pChainStateStub) GetSubnetID(ctx context.Context, chainID ids.ID) (ids.ID, error) { - return p.subnetIDByChainID[chainID], nil -} - -func (p pChainStateStub) GetMinimumHeight(context.Context) (uint64, error) { return 0, nil } - -func (p pChainStateStub) GetCurrentHeight(context.Context) (uint64, error) { - return p.currentHeight, nil -} - -func (p pChainStateStub) GetValidatorSet( - ctx context.Context, - height uint64, - subnetID ids.ID, -) (map[ids.NodeID]*validators.GetValidatorOutput, error) { - output := make(map[ids.NodeID]*validators.GetValidatorOutput) - for _, validator := range p.connectedCanonicalValidators.ValidatorSet { - for _, nodeID := range validator.NodeIDs { - output[nodeID] = &validators.GetValidatorOutput{ - NodeID: nodeID, - PublicKey: validator.PublicKey, - Weight: validator.Weight, - } - } - } - return output, nil -} - -func (p pChainStateStub) GetCurrentValidatorSet( - _ context.Context, - _ ids.ID, -) (map[ids.ID]*validators.GetCurrentValidatorOutput, uint64, error) { - return nil, 0, nil -}