diff --git a/.github/actions/setup-env/action.yml b/.github/actions/setup-env/action.yml index e8acc25c..06e15537 100644 --- a/.github/actions/setup-env/action.yml +++ b/.github/actions/setup-env/action.yml @@ -1,17 +1,35 @@ name: Setup Environment -description: Sets up Go and installs system dependencies +description: Sets up Go (dynamically from go.mod) and installs system dependencies +inputs: {} +outputs: + go-version: + description: "Go version parsed from go.mod" + value: ${{ steps.get-go-version.outputs.version }} runs: using: "composite" steps: - - name: Set up Go + - name: Get Go version from go.mod + id: get-go-version + shell: bash + run: | + GO_VERSION=$(grep -E '^go [0-9]+\.[0-9]+(\.[0-9]+)?$' go.mod | cut -d ' ' -f 2) + echo "Found Go version: $GO_VERSION" + echo "version=$GO_VERSION" >> $GITHUB_OUTPUT + + - name: Setup Go uses: actions/setup-go@v4 with: - go-version: '1.24' + go-version: ${{ steps.get-go-version.outputs.version }} + cache: true - name: Install libwebp-dev + shell: bash run: | sudo apt-get update sudo apt-get install -y libwebp-dev + + - name: Set Go Private Modules shell: bash - \ No newline at end of file + run: | + go env -w GOPRIVATE=github.com/LumeraProtocol/lumera diff --git a/.github/workflows/build&relase.yml b/.github/workflows/build&release.yml similarity index 77% rename from .github/workflows/build&relase.yml rename to .github/workflows/build&release.yml index 5f154439..049ffe5d 100644 --- a/.github/workflows/build&relase.yml +++ b/.github/workflows/build&release.yml @@ -30,18 +30,8 @@ jobs: - name: Configure Git Safe Directory run: git config --global --add safe.directory $GITHUB_WORKSPACE - - name: Get Go version from go.mod - id: go-version - run: | - GO_VERSION=$(grep -E '^go [0-9]+\.[0-9]+(\.[0-9]+)?$' go.mod | cut -d ' ' -f 2) - echo "Found go directive version: $GO_VERSION" - echo "version=$GO_VERSION" >> $GITHUB_OUTPUT - - - name: Setup Go - uses: actions/setup-go@v4 - with: - go-version: ${{ steps.go-version.outputs.version }} - cache: true + - name: Setup Go and dependencies + uses: ./.github/actions/setup-env - name: Prepare Build Variables id: vars @@ -58,13 +48,6 @@ jobs: echo "- build_id: $build_id" echo "- binary_name: supernode-linux-amd64" - - name: Install dependencies - run: | - sudo apt-get update - sudo apt-get install -y libwebp-dev - # Fix for Lumera module checksum issue - go env -w GOPRIVATE=github.com/LumeraProtocol/lumera - - name: Build binary run: | mkdir -p release @@ -128,18 +111,8 @@ jobs: - name: Configure Git Safe Directory run: git config --global --add safe.directory $GITHUB_WORKSPACE - - name: Get Go version from go.mod - id: go-version - run: | - GO_VERSION=$(grep -E '^go [0-9]+\.[0-9]+(\.[0-9]+)?$' go.mod | cut -d ' ' -f 2) - echo "Found go directive version: $GO_VERSION" - echo "version=$GO_VERSION" >> $GITHUB_OUTPUT - - - name: Setup Go - uses: actions/setup-go@v4 - with: - go-version: ${{ steps.go-version.outputs.version }} - cache: true + - name: Setup Go and dependencies + uses: ./.github/actions/setup-env - name: Prepare Release Variables id: vars @@ -147,13 +120,6 @@ jobs: repo_name=${GITHUB_REPOSITORY##*/} echo "binary_name=supernode-linux-amd64" >> $GITHUB_OUTPUT - - name: Install dependencies - run: | - sudo apt-get update - sudo apt-get install -y libwebp-dev - # Fix for Lumera module checksum issue - go env -w GOPRIVATE=github.com/LumeraProtocol/lumera - - name: Build Release Version run: | mkdir -p release diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index ec5fc461..522ce2b9 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -14,8 +14,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v3 - + uses: actions/checkout@v4 - name: Setup Go and system deps uses: ./.github/actions/setup-env @@ -33,7 +32,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Go and system deps uses: ./.github/actions/setup-env @@ -52,7 +51,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Go and system deps uses: ./.github/actions/setup-env @@ -67,7 +66,7 @@ jobs: run: | cd tests/scripts chmod +x ./install-lumera.sh - sudo ./install-lumera.sh + sudo ./install-lumera.sh latest-tag - name: Setup Supernode environments run: | diff --git a/go.mod b/go.mod index 2f680eef..a34b74ee 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ replace github.com/LumeraProtocol/supernode/supernode => ./supernode require ( cosmossdk.io/math v1.5.3 - github.com/LumeraProtocol/lumera v1.0.1 + github.com/LumeraProtocol/lumera v1.1.0 github.com/LumeraProtocol/rq-go v0.2.1 github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce github.com/cenkalti/backoff/v4 v4.3.0 diff --git a/go.sum b/go.sum index f5046837..2ec021fc 100644 --- a/go.sum +++ b/go.sum @@ -61,8 +61,8 @@ github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3 github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/LumeraProtocol/lumera v1.0.1 h1:gnSbyQfVeYS2pCvR2AxrD8UWR++IEVYz4ywk3GiI25k= -github.com/LumeraProtocol/lumera v1.0.1/go.mod h1:c1M+sjewuCvxw+pznwlspUzenDJI8Y+suKB3RFKS2Wo= +github.com/LumeraProtocol/lumera v1.1.0 h1:pxosS4m9W/nWIjvCHU2itX2SvG7Q05K2/EdJ666yqyY= +github.com/LumeraProtocol/lumera v1.1.0/go.mod h1:c1M+sjewuCvxw+pznwlspUzenDJI8Y+suKB3RFKS2Wo= github.com/LumeraProtocol/rq-go v0.2.1 h1:8B3UzRChLsGMmvZ+UVbJsJj6JZzL9P9iYxbdUwGsQI4= github.com/LumeraProtocol/rq-go v0.2.1/go.mod h1:APnKCZRh1Es2Vtrd2w4kCLgAyaL5Bqrkz/BURoRJ+O8= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= diff --git a/p2p/kademlia/dht.go b/p2p/kademlia/dht.go index 229ac5d7..f6121bb8 100644 --- a/p2p/kademlia/dht.go +++ b/p2p/kademlia/dht.go @@ -121,6 +121,7 @@ func NewDHT(ctx context.Context, store Store, metaStore MetaStore, options *Opti Keyring: options.Keyring, LocalIdentity: string(options.ID), PeerType: securekeyx.Supernode, + Validator: lumera.NewSecureKeyExchangeValidator(options.LumeraClient), }, }) if err != nil { diff --git a/pkg/lumera/lumera_mock.go b/pkg/lumera/lumera_mock.go index 6e8dfef3..3bdeba5e 100644 --- a/pkg/lumera/lumera_mock.go +++ b/pkg/lumera/lumera_mock.go @@ -8,6 +8,7 @@ import ( reflect "reflect" action "github.com/LumeraProtocol/supernode/pkg/lumera/modules/action" + action_msg "github.com/LumeraProtocol/supernode/pkg/lumera/modules/action_msg" auth "github.com/LumeraProtocol/supernode/pkg/lumera/modules/auth" node "github.com/LumeraProtocol/supernode/pkg/lumera/modules/node" supernode "github.com/LumeraProtocol/supernode/pkg/lumera/modules/supernode" @@ -52,6 +53,20 @@ func (mr *MockClientMockRecorder) Action() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Action", reflect.TypeOf((*MockClient)(nil).Action)) } +// ActionMsg mocks base method. +func (m *MockClient) ActionMsg() action_msg.Module { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ActionMsg") + ret0, _ := ret[0].(action_msg.Module) + return ret0 +} + +// ActionMsg indicates an expected call of ActionMsg. +func (mr *MockClientMockRecorder) ActionMsg() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ActionMsg", reflect.TypeOf((*MockClient)(nil).ActionMsg)) +} + // Auth mocks base method. func (m *MockClient) Auth() auth.Module { m.ctrl.T.Helper() diff --git a/pkg/lumera/modules/action/action_mock.go b/pkg/lumera/modules/action/action_mock.go index 09ad9ac7..12ccdf7a 100644 --- a/pkg/lumera/modules/action/action_mock.go +++ b/pkg/lumera/modules/action/action_mock.go @@ -64,3 +64,18 @@ func (mr *MockModuleMockRecorder) GetActionFee(ctx, dataSize interface{}) *gomoc mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetActionFee", reflect.TypeOf((*MockModule)(nil).GetActionFee), ctx, dataSize) } + +// GetParams mocks base method. +func (m *MockModule) GetParams(ctx context.Context) (*types.QueryParamsResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetParams", ctx) + ret0, _ := ret[0].(*types.QueryParamsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetParams indicates an expected call of GetParams. +func (mr *MockModuleMockRecorder) GetParams(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetParams", reflect.TypeOf((*MockModule)(nil).GetParams), ctx) +} diff --git a/pkg/lumera/modules/action_msg/action_msg_mock.go b/pkg/lumera/modules/action_msg/action_msg_mock.go new file mode 100644 index 00000000..481aedb6 --- /dev/null +++ b/pkg/lumera/modules/action_msg/action_msg_mock.go @@ -0,0 +1,50 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: interface.go + +// Package action_msg is a generated GoMock package. +package action_msg + +import ( + context "context" + reflect "reflect" + + gomock "github.com/golang/mock/gomock" +) + +// MockModule is a mock of Module interface. +type MockModule struct { + ctrl *gomock.Controller + recorder *MockModuleMockRecorder +} + +// MockModuleMockRecorder is the mock recorder for MockModule. +type MockModuleMockRecorder struct { + mock *MockModule +} + +// NewMockModule creates a new mock instance. +func NewMockModule(ctrl *gomock.Controller) *MockModule { + mock := &MockModule{ctrl: ctrl} + mock.recorder = &MockModuleMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockModule) EXPECT() *MockModuleMockRecorder { + return m.recorder +} + +// FinalizeCascadeAction mocks base method. +func (m *MockModule) FinalizeCascadeAction(ctx context.Context, actionId string, rqIdsIds []string) (*FinalizeActionResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FinalizeCascadeAction", ctx, actionId, rqIdsIds) + ret0, _ := ret[0].(*FinalizeActionResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FinalizeCascadeAction indicates an expected call of FinalizeCascadeAction. +func (mr *MockModuleMockRecorder) FinalizeCascadeAction(ctx, actionId, rqIdsIds interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FinalizeCascadeAction", reflect.TypeOf((*MockModule)(nil).FinalizeCascadeAction), ctx, actionId, rqIdsIds) +} diff --git a/pkg/lumera/modules/node/node_mock.go b/pkg/lumera/modules/node/node_mock.go index 953e65e2..e95d7b38 100644 --- a/pkg/lumera/modules/node/node_mock.go +++ b/pkg/lumera/modules/node/node_mock.go @@ -139,17 +139,3 @@ func (mr *MockModuleMockRecorder) Sign(snAccAddress, data interface{}) *gomock.C mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Sign", reflect.TypeOf((*MockModule)(nil).Sign), snAccAddress, data) } - -// Verify mocks base method. -func (m *MockModule) Verify(accAddress string, data, signature []byte) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Verify", accAddress, data, signature) - ret0, _ := ret[0].(error) - return ret0 -} - -// Verify indicates an expected call of Verify. -func (mr *MockModuleMockRecorder) Verify(accAddress, data, signature interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Verify", reflect.TypeOf((*MockModule)(nil).Verify), accAddress, data, signature) -} diff --git a/pkg/lumera/modules/supernode/supernode_mock.go b/pkg/lumera/modules/supernode/supernode_mock.go index 8cc67cae..819eaa25 100644 --- a/pkg/lumera/modules/supernode/supernode_mock.go +++ b/pkg/lumera/modules/supernode/supernode_mock.go @@ -35,6 +35,21 @@ func (m *MockModule) EXPECT() *MockModuleMockRecorder { return m.recorder } +// GetParams mocks base method. +func (m *MockModule) GetParams(ctx context.Context) (*types.QueryParamsResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetParams", ctx) + ret0, _ := ret[0].(*types.QueryParamsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetParams indicates an expected call of GetParams. +func (mr *MockModuleMockRecorder) GetParams(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetParams", reflect.TypeOf((*MockModule)(nil).GetParams), ctx) +} + // GetSuperNode mocks base method. func (m *MockModule) GetSuperNode(ctx context.Context, address string) (*types.QueryGetSuperNodeResponse, error) { m.ctrl.T.Helper() diff --git a/pkg/lumera/validator.go b/pkg/lumera/validator.go new file mode 100644 index 00000000..cfc38caa --- /dev/null +++ b/pkg/lumera/validator.go @@ -0,0 +1,38 @@ +package lumera + +import ( + "context" + "fmt" + + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + sntypes "github.com/LumeraProtocol/lumera/x/supernode/v1/types" +) + +type SecureKeyExchangeValidator struct { + lumeraClient Client +} + +func NewSecureKeyExchangeValidator(lumeraClient Client) *SecureKeyExchangeValidator { + return &SecureKeyExchangeValidator{ + lumeraClient: lumeraClient, + } +} + +func (v *SecureKeyExchangeValidator) AccountInfoByAddress(ctx context.Context, addr string) (*authtypes.QueryAccountInfoResponse, error) { + accountInfo, err := v.lumeraClient.Auth().AccountInfoByAddress(ctx, addr) + if err != nil { + return nil, fmt.Errorf("failed to get account info: %w", err) + } + return accountInfo, nil +} + +func (v *SecureKeyExchangeValidator) GetSupernodeBySupernodeAddress(ctx context.Context, address string) (*sntypes.SuperNode, error) { + supernodeInfo, err := v.lumeraClient.SuperNode().GetSupernodeBySupernodeAddress(ctx, address) + if err != nil { + return nil, fmt.Errorf("failed to get supernode info: %w", err) + } + if supernodeInfo == nil { + return nil, fmt.Errorf("supernode info is nil") + } + return supernodeInfo, nil +} diff --git a/pkg/net/credentials/alts/handshake/handshake_test.go b/pkg/net/credentials/alts/handshake/handshake_test.go index 13b40175..8cd8844e 100644 --- a/pkg/net/credentials/alts/handshake/handshake_test.go +++ b/pkg/net/credentials/alts/handshake/handshake_test.go @@ -20,6 +20,8 @@ import ( . "github.com/LumeraProtocol/supernode/pkg/net/credentials/alts/common" "github.com/LumeraProtocol/supernode/pkg/net/credentials/alts/conn" "github.com/LumeraProtocol/supernode/pkg/net/credentials/alts/testutil" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + sntypes "github.com/LumeraProtocol/lumera/x/supernode/v1/types" . "github.com/LumeraProtocol/supernode/pkg/testutil" ) @@ -302,6 +304,9 @@ func TestHandshakerConcurrentHandshakes(t *testing.T) { // Set whether NewConn should wait based on test case shouldWaitInNewConn = tc.newConnWait + ctrl := gomock.NewController(t) + defer ctrl.Finish() + // Create handshake pairs for i := range tc.numHandshakes { accountClient := fmt.Sprintf("client-%d", i) @@ -312,8 +317,37 @@ func TestHandshakerConcurrentHandshakes(t *testing.T) { testAccounts = SetupTestAccounts(t, serverKr, []string{accountServer}) serverAddr := testAccounts[0].Address - clientKE := SetupTestKeyExchange(t, clientKr, clientAddr, securekeyx.Simplenode) - serverKE := SetupTestKeyExchange(t, serverKr, serverAddr, securekeyx.Supernode) + // create mocked validators + clientMockValidator := lumeraidmocks.NewMockKeyExchangerValidator(ctrl) + clientMockValidator.EXPECT(). + AccountInfoByAddress(gomock.Any(), clientAddr). + Return(&authtypes.QueryAccountInfoResponse{ + Info: &authtypes.BaseAccount{Address: clientAddr}, + }, nil). + Times(1) + clientMockValidator.EXPECT(). + GetSupernodeBySupernodeAddress(gomock.Any(), serverAddr). + Return(&sntypes.SuperNode{ + SupernodeAccount: serverAddr, + }, nil). + Times(1) + + serverMockValidator := lumeraidmocks.NewMockKeyExchangerValidator(ctrl) + serverMockValidator.EXPECT(). + GetSupernodeBySupernodeAddress(gomock.Any(), serverAddr). + Return(&sntypes.SuperNode{ + SupernodeAccount: serverAddr, + }, nil). + Times(1) + serverMockValidator.EXPECT(). + AccountInfoByAddress(gomock.Any(), clientAddr). + Return(&authtypes.QueryAccountInfoResponse{ + Info: &authtypes.BaseAccount{Address: clientAddr}, + }, nil). + Times(1) + + clientKE := SetupTestKeyExchange(t, clientKr, clientAddr, securekeyx.Simplenode, clientMockValidator) + serverKE := SetupTestKeyExchange(t, serverKr, serverAddr, securekeyx.Supernode, serverMockValidator) // Setup test pipes clientConn, serverConn := net.Pipe() @@ -442,6 +476,9 @@ func TestHandshakerConcurrentHandshakes(t *testing.T) { } func TestHandshakerContext(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + clientKr := CreateTestKeyring() serverKr := CreateTestKeyring() @@ -451,7 +488,14 @@ func TestHandshakerContext(t *testing.T) { testAccounts = SetupTestAccounts(t, serverKr, []string{"server"}) serverAddr := testAccounts[0].Address - clientKE := SetupTestKeyExchange(t, clientKr, clientAddr, securekeyx.Simplenode) + mockValidator := lumeraidmocks.NewMockKeyExchangerValidator(ctrl) + mockValidator.EXPECT(). + AccountInfoByAddress(gomock.Any(), clientAddr). + Return(&authtypes.QueryAccountInfoResponse{ + Info: &authtypes.BaseAccount{Address: clientAddr}, + }, nil). + Times(1) + clientKE := SetupTestKeyExchange(t, clientKr, clientAddr, securekeyx.Simplenode, mockValidator) t.Run("Context timeout", func(t *testing.T) { client, server := net.Pipe() @@ -504,6 +548,9 @@ func TestHandshakerContext(t *testing.T) { } func TestUnresponsivePeer(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + clientKr := CreateTestKeyring() serverKr := CreateTestKeyring() @@ -513,7 +560,14 @@ func TestUnresponsivePeer(t *testing.T) { testAccounts = SetupTestAccounts(t, serverKr, []string{"server"}) serverAddr := testAccounts[0].Address - clientKE := SetupTestKeyExchange(t, clientKr, clientAddr, securekeyx.Simplenode) + mockValidator := lumeraidmocks.NewMockKeyExchangerValidator(ctrl) + mockValidator.EXPECT(). + AccountInfoByAddress(gomock.Any(), clientAddr). + Return(&authtypes.QueryAccountInfoResponse{ + Info: &authtypes.BaseAccount{Address: clientAddr}, + }, nil). + Times(1) + clientKE := SetupTestKeyExchange(t, clientKr, clientAddr, securekeyx.Simplenode, mockValidator) handshakeTimeout := 100 * time.Millisecond conn := testutil.NewUnresponsiveTestConn(time.Hour) // Create unresponsive conn @@ -641,6 +695,9 @@ func TestClient_ComputeSharedSecretFailure(t *testing.T) { } func TestClientHandshakeSemaphore(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + clientKr := CreateTestKeyring() serverKr := CreateTestKeyring() @@ -650,7 +707,15 @@ func TestClientHandshakeSemaphore(t *testing.T) { testAccounts = SetupTestAccounts(t, serverKr, []string{"server"}) serverAddr := testAccounts[0].Address - clientKE := SetupTestKeyExchange(t, clientKr, clientAddr, securekeyx.Simplenode) + mockValidator := lumeraidmocks.NewMockKeyExchangerValidator(ctrl) + mockValidator.EXPECT(). + AccountInfoByAddress(gomock.Any(), clientAddr). + Return(&authtypes.QueryAccountInfoResponse{ + Info: &authtypes.BaseAccount{Address: clientAddr}, + }, nil). + Times(1) + + clientKE := SetupTestKeyExchange(t, clientKr, clientAddr, securekeyx.Simplenode, mockValidator) client, server := net.Pipe() defer client.Close() defer server.Close() @@ -676,12 +741,22 @@ func TestClientHandshakeSemaphore(t *testing.T) { } func TestServerHandshakeSemaphore(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + kr := CreateTestKeyring() testAccounts := SetupTestAccounts(t, kr, []string{"server"}) serverAddr := testAccounts[0].Address - serverKE := SetupTestKeyExchange(t, kr, serverAddr, securekeyx.Simplenode) + mockValidator := lumeraidmocks.NewMockKeyExchangerValidator(ctrl) + mockValidator.EXPECT(). + AccountInfoByAddress(gomock.Any(), serverAddr). + Return(&authtypes.QueryAccountInfoResponse{ + Info: &authtypes.BaseAccount{Address: serverAddr}, + }, nil). + Times(1) + serverKE := SetupTestKeyExchange(t, kr, serverAddr, securekeyx.Simplenode, mockValidator) client, server := net.Pipe() defer client.Close() defer server.Close() diff --git a/pkg/net/credentials/lumeratc.go b/pkg/net/credentials/lumeratc.go index effd9333..47ee57f7 100644 --- a/pkg/net/credentials/lumeratc.go +++ b/pkg/net/credentials/lumeratc.go @@ -29,6 +29,7 @@ type CommonOptions struct { LocalIdentity string // Local Cosmos address PeerType securekeyx.PeerType // Local peer type Curve ecdh.Curve + Validator securekeyx.KeyExchangerValidator } // ClientOptions contains client-specific configuration @@ -106,6 +107,7 @@ func NewTransportCredentials(side Side, opts interface{}) (credentials.Transport optsCommon.LocalIdentity, optsCommon.PeerType, optsCommon.Curve, + optsCommon.Validator, ) if err != nil { return nil, fmt.Errorf("failed to create secure key exchange: %w", err) diff --git a/pkg/testutil/accounts.go b/pkg/testutil/accounts.go index 4d397e09..53991270 100644 --- a/pkg/testutil/accounts.go +++ b/pkg/testutil/accounts.go @@ -29,8 +29,9 @@ type TestAccount struct { } // setupTestKeyExchange creates a key exchange instance for testing -func SetupTestKeyExchange(t *testing.T, kb keyring.Keyring, addr string, peerType securekeyx.PeerType) *securekeyx.SecureKeyExchange { - ke, err := securekeyx.NewSecureKeyExchange(kb, addr, peerType, ecdh.P256()) +func SetupTestKeyExchange(t *testing.T, kb keyring.Keyring, addr string, + peerType securekeyx.PeerType, validator securekeyx.KeyExchangerValidator) *securekeyx.SecureKeyExchange { + ke, err := securekeyx.NewSecureKeyExchange(kb, addr, peerType, ecdh.P256(), validator) require.NoError(t, err) return ke } diff --git a/pkg/testutil/lumera.go b/pkg/testutil/lumera.go index a0f8ce61..223be49e 100644 --- a/pkg/testutil/lumera.go +++ b/pkg/testutil/lumera.go @@ -92,7 +92,9 @@ type MockAuthModule struct{} // AccountInfoByAddress mocks the behavior of retrieving account info by address func (m *MockAuthModule) AccountInfoByAddress(ctx context.Context, addr string) (*authtypes.QueryAccountInfoResponse, error) { // Mock response: Return an empty response for testing, modify as needed - return &authtypes.QueryAccountInfoResponse{}, nil + return &authtypes.QueryAccountInfoResponse{ + Info: &authtypes.BaseAccount{Address: addr}, + }, nil } // Verify mocks the behavior of verifying data with a given account address @@ -142,7 +144,9 @@ func (m *MockSupernodeModule) GetSuperNode(ctx context.Context, address string) } func (m *MockSupernodeModule) GetSupernodeBySupernodeAddress(ctx context.Context, address string) (*supernodeTypes.SuperNode, error) { - return &supernodeTypes.SuperNode{}, nil + return &supernodeTypes.SuperNode{ + SupernodeAccount: address, + }, nil } func (m *MockSupernodeModule) GetParams(ctx context.Context) (*supernodeTypes.QueryParamsResponse, error) { diff --git a/sdk/adapters/lumera/adapter.go b/sdk/adapters/lumera/adapter.go index 9a27c240..126adbe2 100644 --- a/sdk/adapters/lumera/adapter.go +++ b/sdk/adapters/lumera/adapter.go @@ -9,6 +9,7 @@ import ( actiontypes "github.com/LumeraProtocol/lumera/x/action/v1/types" sntypes "github.com/LumeraProtocol/lumera/x/supernode/v1/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" lumeraclient "github.com/LumeraProtocol/supernode/pkg/lumera" "github.com/cosmos/cosmos-sdk/crypto/keyring" "github.com/golang/protobuf/proto" @@ -16,8 +17,10 @@ import ( //go:generate mockery --name=Client --output=testutil/mocks --outpkg=mocks --filename=lumera_mock.go type Client interface { + AccountInfoByAddress(ctx context.Context, addr string) (*authtypes.QueryAccountInfoResponse, error) GetAction(ctx context.Context, actionID string) (Action, error) GetSupernodes(ctx context.Context, height int64) ([]Supernode, error) + GetSupernodeBySupernodeAddress(ctx context.Context, address string) (*sntypes.SuperNode, error) DecodeCascadeMetadata(ctx context.Context, action Action) (actiontypes.CascadeMetadata, error) VerifySignature(ctx context.Context, accountAddr string, data []byte, signature []byte) error } @@ -62,6 +65,37 @@ func NewAdapter(ctx context.Context, config ConfigParams, logger log.Logger) (Cl }, nil } +func (a *Adapter) GetSupernodeBySupernodeAddress(ctx context.Context, address string) (*sntypes.SuperNode, error) { + a.logger.Debug(ctx, "Getting supernode by address", "address", address) + resp, err := a.client.SuperNode().GetSupernodeBySupernodeAddress(ctx, address) + if err != nil { + a.logger.Error(ctx, "Failed to get supernode", "address", address, "error", err) + return nil, fmt.Errorf("failed to get supernode: %w", err) + } + if resp == nil { + a.logger.Error(ctx, "Received nil response for supernode", "address", address) + return nil, fmt.Errorf("received nil response for supernode %s", address) + } + a.logger.Debug(ctx, "Successfully retrieved supernode", "address", address) + return resp, nil +} + +func (a *Adapter) AccountInfoByAddress(ctx context.Context, addr string) (*authtypes.QueryAccountInfoResponse, error) { + a.logger.Debug(ctx, "Getting account info by address", "address", addr) + resp, err := a.client.Auth().AccountInfoByAddress(ctx, addr) + if err != nil { + a.logger.Error(ctx, "Failed to get account info", "address", addr, "error", err) + return nil, fmt.Errorf("failed to get account info: %w", err) + } + if resp == nil { + a.logger.Error(ctx, "Received nil response for account info", "address", addr) + return nil, fmt.Errorf("received nil response for account info %s", addr) + } + a.logger.Debug(ctx, "Successfully retrieved account info", "address", addr) + + return resp, nil +} + func (a *Adapter) GetAction(ctx context.Context, actionID string) (Action, error) { a.logger.Debug(ctx, "Getting action from blockchain", "actionID", actionID) diff --git a/sdk/net/factory.go b/sdk/net/factory.go index 3687be8e..7f659b55 100644 --- a/sdk/net/factory.go +++ b/sdk/net/factory.go @@ -22,10 +22,11 @@ type ClientFactory struct { keyring keyring.Keyring clientOptions *client.ClientOptions config FactoryConfig + lumeraClient lumera.Client } // NewClientFactory creates a new client factory with the provided dependencies -func NewClientFactory(ctx context.Context, logger log.Logger, keyring keyring.Keyring, config FactoryConfig) *ClientFactory { +func NewClientFactory(ctx context.Context, logger log.Logger, keyring keyring.Keyring, lumeraClient lumera.Client, config FactoryConfig) *ClientFactory { if logger == nil { logger = log.NewNoopLogger() } @@ -38,6 +39,7 @@ func NewClientFactory(ctx context.Context, logger log.Logger, keyring keyring.Ke keyring: keyring, clientOptions: client.DefaultClientOptions(), config: config, + lumeraClient: lumeraClient, } } @@ -52,7 +54,8 @@ func (f *ClientFactory) CreateClient(ctx context.Context, supernode lumera.Super "endpoint", supernode.GrpcEndpoint) // Create client with dependencies - client, err := NewSupernodeClient(ctx, f.logger, f.keyring, f.config.LocalCosmosAddress, supernode, f.clientOptions) + client, err := NewSupernodeClient(ctx, f.logger, f.keyring, f.config.LocalCosmosAddress, supernode, f.lumeraClient, + f.clientOptions) if err != nil { return nil, fmt.Errorf("failed to create supernode client for %s: %w", supernode.CosmosAddress, err) } diff --git a/sdk/net/impl.go b/sdk/net/impl.go index 92bde1e8..475a6f7e 100644 --- a/sdk/net/impl.go +++ b/sdk/net/impl.go @@ -31,7 +31,8 @@ var _ SupernodeClient = (*supernodeClient)(nil) // NewSupernodeClient creates a new supernode client func NewSupernodeClient(ctx context.Context, logger log.Logger, keyring keyring.Keyring, - localCosmosAddress string, targetSupernode lumera.Supernode, clientOptions *client.ClientOptions, + localCosmosAddress string, targetSupernode lumera.Supernode, lumeraClient lumera.Client, + clientOptions *client.ClientOptions, ) (SupernodeClient, error) { // Register ALTS protocols, just like in the test conn.RegisterALTSRecordProtocols() @@ -53,6 +54,7 @@ func NewSupernodeClient(ctx context.Context, logger log.Logger, keyring keyring. Keyring: keyring, LocalIdentity: localCosmosAddress, PeerType: securekeyx.Supernode, + Validator: lumeraClient, }, }) if err != nil { diff --git a/sdk/task/cascade.go b/sdk/task/cascade.go index 2daae71c..8d29c575 100644 --- a/sdk/task/cascade.go +++ b/sdk/task/cascade.go @@ -109,7 +109,7 @@ func (t *CascadeTask) isServing(parent context.Context, sn lumera.Supernode) boo ctx, cancel := context.WithTimeout(parent, connectionTimeout) defer cancel() - client, err := net.NewClientFactory(ctx, t.logger, t.keyring, net.FactoryConfig{ + client, err := net.NewClientFactory(ctx, t.logger, t.keyring, t.client, net.FactoryConfig{ LocalCosmosAddress: t.config.Account.LocalCosmosAddress, }).CreateClient(ctx, sn) if err != nil { @@ -126,7 +126,7 @@ func (t *CascadeTask) registerWithSupernodes(ctx context.Context, supernodes lum factoryCfg := net.FactoryConfig{ LocalCosmosAddress: t.config.Account.LocalCosmosAddress, } - clientFactory := net.NewClientFactory(ctx, t.logger, t.keyring, factoryCfg) + clientFactory := net.NewClientFactory(ctx, t.logger, t.keyring, t.client, factoryCfg) req := &supernodeservice.CascadeSupernodeRegisterRequest{ FilePath: t.filePath, diff --git a/supernode/cmd/start.go b/supernode/cmd/start.go index bd5c685e..b7e7bbd6 100644 --- a/supernode/cmd/start.go +++ b/supernode/cmd/start.go @@ -115,6 +115,7 @@ The supernode will connect to the Lumera network and begin participating in the grpcServer, err := server.New(serverConfig, "service", kr, + lumeraClient, cascadeActionServer, ) if err != nil { diff --git a/supernode/node/supernode/server/server.go b/supernode/node/supernode/server/server.go index dd4803aa..45e3dbed 100644 --- a/supernode/node/supernode/server/server.go +++ b/supernode/node/supernode/server/server.go @@ -17,6 +17,7 @@ import ( "github.com/LumeraProtocol/supernode/pkg/errgroup" "github.com/LumeraProtocol/supernode/pkg/errors" "github.com/LumeraProtocol/supernode/pkg/log" + "github.com/LumeraProtocol/supernode/pkg/lumera" ltc "github.com/LumeraProtocol/supernode/pkg/net/credentials" "github.com/LumeraProtocol/supernode/pkg/net/credentials/alts/conn" @@ -34,6 +35,7 @@ type Server struct { name string kr keyring.Keyring grpcServer *grpc.Server + lumeraClient lumera.Client healthServer *health.Server } @@ -99,6 +101,7 @@ func (server *Server) setupGRPCServer() error { Keyring: server.kr, LocalIdentity: server.config.Identity, PeerType: securekeyx.Supernode, + Validator: lumera.NewSecureKeyExchangeValidator(server.lumeraClient), }, }) if err != nil { @@ -154,7 +157,7 @@ func (server *Server) Close() { } // New returns a new Server instance. -func New(config *Config, name string, kr keyring.Keyring, services ...service) (*Server, error) { +func New(config *Config, name string, kr keyring.Keyring, lumeraClient lumera.Client, services ...service) (*Server, error) { if config == nil { return nil, fmt.Errorf("config is nil") } @@ -164,5 +167,6 @@ func New(config *Config, name string, kr keyring.Keyring, services ...service) ( services: services, name: name, kr: kr, + lumeraClient: lumeraClient, }, nil } diff --git a/supernode/node/supernode/server/server_test.go b/supernode/node/supernode/server/server_test.go index de39e3c3..da2b2b43 100644 --- a/supernode/node/supernode/server/server_test.go +++ b/supernode/node/supernode/server/server_test.go @@ -6,6 +6,7 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/health/grpc_health_v1" "testing" + "github.com/LumeraProtocol/supernode/pkg/lumera" ) // --- Mock service implementing server.service --- @@ -22,29 +23,38 @@ func (m *mockService) Desc() *grpc.ServiceDesc { func TestNewServer_WithValidConfig(t *testing.T) { ctl := gomock.NewController(t) + defer ctl.Finish() + mockKeyring := NewMockKeyring(ctl) + mockLumeraClient := lumera.NewMockClient(ctl) cfg := NewConfig() - s, err := New(cfg, "supernode-test", mockKeyring, &mockService{}) + s, err := New(cfg, "supernode-test", mockKeyring, mockLumeraClient, &mockService{}) assert.NoError(t, err) assert.NotNil(t, s) } func TestNewServer_WithNilConfig(t *testing.T) { ctl := gomock.NewController(t) + defer ctl.Finish() + mockKeyring := NewMockKeyring(ctl) + mockLumeraClient := lumera.NewMockClient(ctl) - s, err := New(nil, "supernode-test", mockKeyring) + s, err := New(nil, "supernode-test", mockKeyring, mockLumeraClient) assert.Nil(t, s) assert.EqualError(t, err, "config is nil") } func TestSetServiceStatusAndClose(t *testing.T) { ctl := gomock.NewController(t) + defer ctl.Finish() + mockKeyring := NewMockKeyring(ctl) + mockLumeraClient := lumera.NewMockClient(ctl) cfg := NewConfig() - s, _ := New(cfg, "test", mockKeyring, &mockService{}) + s, _ := New(cfg, "test", mockKeyring, mockLumeraClient, &mockService{}) _ = s.setupGRPCServer() s.SetServiceStatus("test.Service", grpc_health_v1.HealthCheckResponse_SERVING) diff --git a/tests/integration/securegrpc/secure_connection_test.go b/tests/integration/securegrpc/secure_connection_test.go index 11308810..61049909 100644 --- a/tests/integration/securegrpc/secure_connection_test.go +++ b/tests/integration/securegrpc/secure_connection_test.go @@ -13,6 +13,7 @@ import ( "time" "github.com/stretchr/testify/require" + "github.com/golang/mock/gomock" "google.golang.org/grpc/grpclog" "google.golang.org/grpc/health" "google.golang.org/grpc/health/grpc_health_v1" @@ -24,7 +25,10 @@ import ( "github.com/LumeraProtocol/supernode/pkg/net/grpc/client" "github.com/LumeraProtocol/supernode/pkg/net/grpc/server" snkeyring "github.com/LumeraProtocol/supernode/pkg/keyring" + lumeraidmocks "github.com/LumeraProtocol/lumera/x/lumeraid/mocks" "github.com/LumeraProtocol/supernode/pkg/testutil" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + sntypes "github.com/LumeraProtocol/lumera/x/supernode/v1/types" ) func waitForServerReady(address string, timeout time.Duration) error { @@ -58,6 +62,9 @@ func (s *TestServiceImpl) TestMethod(ctx context.Context, req *pb.TestRequest) ( } func TestSecureGRPCConnection(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + snkeyring.InitSDKConfig() conn.RegisterALTSRecordProtocols() @@ -77,12 +84,42 @@ func TestSecureGRPCConnection(t *testing.T) { testAccounts = testutil.SetupTestAccounts(t, serverKr, []string{"test-server"}) serverAddress := testAccounts[0].Address + // create mocked validators + clientMockValidator := lumeraidmocks.NewMockKeyExchangerValidator(ctrl) + clientMockValidator.EXPECT(). + AccountInfoByAddress(gomock.Any(), clientAddress). + Return(&authtypes.QueryAccountInfoResponse{ + Info: &authtypes.BaseAccount{Address: clientAddress}, + }, nil). + Times(1) + clientMockValidator.EXPECT(). + GetSupernodeBySupernodeAddress(gomock.Any(), serverAddress). + Return(&sntypes.SuperNode{ + SupernodeAccount: serverAddress, + }, nil). + Times(1) + + serverMockValidator := lumeraidmocks.NewMockKeyExchangerValidator(ctrl) + serverMockValidator.EXPECT(). + GetSupernodeBySupernodeAddress(gomock.Any(), serverAddress). + Return(&sntypes.SuperNode{ + SupernodeAccount: serverAddress, + }, nil). + Times(1) + serverMockValidator.EXPECT(). + AccountInfoByAddress(gomock.Any(), clientAddress). + Return(&authtypes.QueryAccountInfoResponse{ + Info: &authtypes.BaseAccount{Address: clientAddress}, + }, nil). + Times(1) + // Create server credentials serverCreds, err := ltc.NewServerCreds(<c.ServerOptions{ CommonOptions: ltc.CommonOptions{ Keyring: serverKr, LocalIdentity: serverAddress, PeerType: securekeyx.Supernode, + Validator: serverMockValidator, }, }) require.NoError(t, err, "failed to create server credentials") @@ -93,6 +130,7 @@ func TestSecureGRPCConnection(t *testing.T) { Keyring: clientKr, LocalIdentity: clientAddress, PeerType: securekeyx.Simplenode, + Validator: clientMockValidator, }, }) require.NoError(t, err, "failed to create client credentials") diff --git a/tests/scripts/install-lumera.sh b/tests/scripts/install-lumera.sh index 2699c5b8..4c657e82 100755 --- a/tests/scripts/install-lumera.sh +++ b/tests/scripts/install-lumera.sh @@ -1,24 +1,56 @@ #!/bin/bash set -e # Exit immediately if a command exits with a non-zero status -# GitHub API URL for the latest release -GITHUB_API_URL="https://api.github.com/repos/LumeraProtocol/lumera/releases/latest" +# Sample usage: +# ./install-lumera.sh # uses latest release +# ./install-lumera.sh latest-tag # uses latest tag from /tags +# ./install-lumera.sh v1.1.0 # installs this specific version -echo "Fetching latest release information..." -RELEASE_INFO=$(curl -s -S -L "$GITHUB_API_URL") +# Support mode argument: 'latest-release' (default) or 'latest-tag' +MODE="${1:-latest-release}" + +REPO="LumeraProtocol/lumera" +GITHUB_API="https://api.github.com/repos/$REPO" + +echo "Installation mode: $MODE" + +if [ "$MODE" == "latest-tag" ]; then + echo "Fetching latest tag from GitHub..." + if command -v jq >/dev/null 2>&1; then + TAG_NAME=$(curl -s "$GITHUB_API/tags" | jq -r '.[0].name') + else + TAG_NAME=$(curl -s "$GITHUB_API/tags" | grep '"name"' | head -n 1 | sed -E 's/.*"([^"]+)".*/\1/') + fi + DOWNLOAD_URL="https://github.com/${REPO}/releases/download/${TAG_NAME}/lumera_${TAG_NAME}_linux_amd64.tar.gz" + +elif [[ "$MODE" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + TAG_NAME="$MODE" + DOWNLOAD_URL="https://github.com/${REPO}/releases/download/${TAG_NAME}/lumera_${TAG_NAME}_linux_amd64.tar.gz" + +elif [ "$MODE" == "latest-release" ]; then + echo "Fetching latest release information..." + RELEASE_INFO=$(curl -s -S -L "$GITHUB_API/releases/latest") + + # Extract tag name and download URL + if command -v jq >/dev/null 2>&1; then + TAG_NAME=$(echo "$RELEASE_INFO" | jq -r '.tag_name') + DOWNLOAD_URL=$(echo "$RELEASE_INFO" | jq -r '.assets[] | select(.name | test("linux_amd64.tar.gz$")) | .browser_download_url') + else + TAG_NAME=$(echo "$RELEASE_INFO" | grep -o '"tag_name"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/.*"tag_name"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/') + DOWNLOAD_URL=$(echo "$RELEASE_INFO" | grep -o '"browser_download_url"[[:space:]]*:[[:space:]]*"[^"]*linux_amd64\.tar\.gz[^"]*"' | sed 's/.*"browser_download_url"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/') + fi -# Extract tag name and download URL -if command -v jq >/dev/null 2>&1; then - TAG_NAME=$(echo "$RELEASE_INFO" | jq -r '.tag_name') - DOWNLOAD_URL=$(echo "$RELEASE_INFO" | jq -r '.assets[] | select(.name | test("linux_amd64.tar.gz$")) | .browser_download_url') else - TAG_NAME=$(echo "$RELEASE_INFO" | grep -o '"tag_name"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/.*"tag_name"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/') - DOWNLOAD_URL=$(echo "$RELEASE_INFO" | grep -o '"browser_download_url"[[:space:]]*:[[:space:]]*"[^"]*linux_amd64\.tar\.gz[^"]*"' | sed 's/.*"browser_download_url"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/') + echo "❌ Error: Invalid mode '$MODE'" + echo "Usage: $0 [latest-release|latest-tag|vX.Y.Z]" + exit 1 fi -echo "Latest release: $TAG_NAME" -if [ -z "$DOWNLOAD_URL" ]; then - echo "Error: Could not find Lumera download URL" +echo "Selected tag: $TAG_NAME" +echo "Download URL: $DOWNLOAD_URL" + +if [ -z "$TAG_NAME" ] || [ -z "$DOWNLOAD_URL" ]; then + echo "Error: Could not determine tag or download URL" exit 1 fi diff --git a/tests/system/e2e_cascade_test.go b/tests/system/e2e_cascade_test.go index be389337..f8b166e9 100644 --- a/tests/system/e2e_cascade_test.go +++ b/tests/system/e2e_cascade_test.go @@ -85,7 +85,7 @@ func TestCascadeE2E(t *testing.T) { t.Log("Registering multiple supernodes to process requests") // Helper function to register a supernode - registerSupernode := func(nodeKey string, port string, addr string) { + registerSupernode := func(nodeKey string, port string, addr string, p2pPort string) { // Get account and validator addresses for registration accountAddr := cli.GetKeyAddr(nodeKey) valAddrOutput := cli.Keys("keys", "show", nodeKey, "--bech", "val", "-a") @@ -100,6 +100,7 @@ func TestCascadeE2E(t *testing.T) { "localhost:" + port, // IP address with unique port "1.0.0", // version addr, // supernode account + p2pPort, // p2p port "--from", nodeKey, } @@ -111,9 +112,9 @@ func TestCascadeE2E(t *testing.T) { } // Register three supernodes with different ports - registerSupernode("node0", "4444", "lumera1em87kgrvgttrkvuamtetyaagjrhnu3vjy44at4") - registerSupernode("node1", "4446", "lumera1cf0ms9ttgdvz6zwlqfty4tjcawhuaq69p40w0c") - registerSupernode("node2", "4448", "lumera1cjyc4ruq739e2lakuhargejjkr0q5vg6x3d7kp") + registerSupernode("node0", "4444", "lumera1em87kgrvgttrkvuamtetyaagjrhnu3vjy44at4", "4445") + registerSupernode("node1", "4446", "lumera1cf0ms9ttgdvz6zwlqfty4tjcawhuaq69p40w0c", "4447") + registerSupernode("node2", "4448", "lumera1cjyc4ruq739e2lakuhargejjkr0q5vg6x3d7kp", "4449") t.Log("Successfully registered three supernodes") // Fund Lume diff --git a/tests/system/go.mod b/tests/system/go.mod index e703007e..1d71a2a7 100644 --- a/tests/system/go.mod +++ b/tests/system/go.mod @@ -27,7 +27,7 @@ require ( require ( cosmossdk.io/math v1.5.3 - github.com/LumeraProtocol/lumera v1.0.1 + github.com/LumeraProtocol/lumera v1.1.0 github.com/LumeraProtocol/supernode v0.0.0-00010101000000-000000000000 github.com/cometbft/cometbft v0.38.17 github.com/tidwall/gjson v1.14.2 diff --git a/tests/system/go.sum b/tests/system/go.sum index 4b11edb7..ccdefd44 100644 --- a/tests/system/go.sum +++ b/tests/system/go.sum @@ -73,8 +73,8 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48 github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 h1:8nn+rsCvTq9axyEh382S0PFLBeaFwNsT43IrPWzctRU= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1/go.mod h1:viRWSEhtMZqz1rhwmOVKkWl6SwmVowfL9O2YR5gI2PE= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/LumeraProtocol/lumera v1.0.1 h1:gnSbyQfVeYS2pCvR2AxrD8UWR++IEVYz4ywk3GiI25k= -github.com/LumeraProtocol/lumera v1.0.1/go.mod h1:c1M+sjewuCvxw+pznwlspUzenDJI8Y+suKB3RFKS2Wo= +github.com/LumeraProtocol/lumera v1.1.0 h1:pxosS4m9W/nWIjvCHU2itX2SvG7Q05K2/EdJ666yqyY= +github.com/LumeraProtocol/lumera v1.1.0/go.mod h1:c1M+sjewuCvxw+pznwlspUzenDJI8Y+suKB3RFKS2Wo= github.com/LumeraProtocol/rq-go v0.2.1 h1:8B3UzRChLsGMmvZ+UVbJsJj6JZzL9P9iYxbdUwGsQI4= github.com/LumeraProtocol/rq-go v0.2.1/go.mod h1:APnKCZRh1Es2Vtrd2w4kCLgAyaL5Bqrkz/BURoRJ+O8= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=