Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 15 additions & 2 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,19 @@
"env": {},
"showLog": true,
"trace": "verbose"
},
},
{
"name": "Cascade E2E (test-cascade)",
"type": "go",
"request": "launch",
"mode": "test",
"program": "${workspaceFolder}/tests/system",
"cwd": "${workspaceFolder}/tests/system",
"args": ["-test.run", "TestCascadeE2E", "-test.v"],
"buildFlags": "-tags=system_test",
"env": {},
"showLog": true,
"trace": "verbose"
}
]
}
}
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -192,4 +192,4 @@ release:
git tag $(NEXT_TAG)
git push upstream $(NEXT_TAG)

@echo "Release complete: $(NEXT_TAG) pushed to upstream"
@echo "Release complete: $(NEXT_TAG) pushed to upstream"
24 changes: 13 additions & 11 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,11 @@ require (
cosmossdk.io/math v1.5.3
github.com/AlecAivazis/survey/v2 v2.3.7
github.com/DataDog/zstd v1.5.7
github.com/LumeraProtocol/lumera v1.8.6-rc2
github.com/LumeraProtocol/lumera v1.9.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
github.com/cometbft/cometbft v0.38.18
github.com/cosmos/btcutil v1.0.5
github.com/cosmos/cosmos-sdk v0.53.0
github.com/cosmos/go-bip39 v1.0.0
Expand All @@ -35,11 +36,11 @@ require (
go.uber.org/mock v0.6.0
go.uber.org/ratelimit v0.3.1
go.uber.org/zap v1.27.0
golang.org/x/crypto v0.42.0
golang.org/x/crypto v0.43.0
golang.org/x/sync v0.17.0
golang.org/x/sys v0.36.0
google.golang.org/genproto/googleapis/api v0.0.0-20250929231259-57b25ae835d4
google.golang.org/grpc v1.76.0
golang.org/x/sys v0.37.0
google.golang.org/genproto/googleapis/api v0.0.0-20251022142026-3a174f9686a8
google.golang.org/grpc v1.77.0
google.golang.org/protobuf v1.36.10
gopkg.in/yaml.v3 v3.0.1
lukechampine.com/blake3 v1.4.1
Expand All @@ -60,6 +61,7 @@ require (
github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect
github.com/99designs/keyring v1.2.2 // indirect
github.com/DataDog/datadog-go v4.8.3+incompatible // indirect
github.com/Masterminds/semver/v3 v3.3.1 // indirect
github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/benbjohnson/clock v1.3.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect
Expand All @@ -75,7 +77,6 @@ require (
github.com/cockroachdb/pebble v1.1.5 // indirect
github.com/cockroachdb/redact v1.1.6 // indirect
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
github.com/cometbft/cometbft v0.38.18 // indirect
github.com/cometbft/cometbft-db v0.14.1 // indirect
github.com/cosmos/cosmos-db v1.1.2 // indirect
github.com/cosmos/cosmos-proto v1.0.0-beta.5 // indirect
Expand Down Expand Up @@ -154,7 +155,7 @@ require (
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
github.com/prometheus/client_golang v1.22.0 // indirect
github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
github.com/prometheus/common v0.63.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
Expand Down Expand Up @@ -187,11 +188,12 @@ require (
golang.org/x/arch v0.15.0 // indirect
golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b // indirect
golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d // indirect
golang.org/x/net v0.44.0 // indirect
golang.org/x/term v0.35.0 // indirect
golang.org/x/text v0.29.0 // indirect
golang.org/x/net v0.46.1-0.20251013234738-63d1a5100f82 // indirect
golang.org/x/term v0.36.0 // indirect
golang.org/x/text v0.30.0 // indirect
google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250929231259-57b25ae835d4 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20251022142026-3a174f9686a8 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gotest.tools/v3 v3.5.2 // indirect
lukechampine.com/uint128 v1.3.0 // indirect
nhooyr.io/websocket v1.8.17 // indirect
Expand Down
1,238 changes: 0 additions & 1,238 deletions go.sum

This file was deleted.

16 changes: 11 additions & 5 deletions p2p/kademlia/conn_pool.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (

"github.com/LumeraProtocol/supernode/v2/pkg/errors"
ltc "github.com/LumeraProtocol/supernode/v2/pkg/net/credentials"
althandshake "github.com/LumeraProtocol/supernode/v2/pkg/net/credentials/alts/handshake"
"google.golang.org/grpc/credentials"
)

Expand Down Expand Up @@ -100,8 +101,8 @@ func NewSecureClientConn(ctx context.Context, tc credentials.TransportCredential
}, nil
}

// NewSecureServerConn do server handshake and create a secure connection
func NewSecureServerConn(_ context.Context, tc credentials.TransportCredentials, rawConn net.Conn) (net.Conn, error) {
// NewSecureServerConn does server handshake and returns a secure connection along with the authenticated remote identity (when available).
func NewSecureServerConn(_ context.Context, tc credentials.TransportCredentials, rawConn net.Conn) (net.Conn, string, error) {
if tcp, ok := rawConn.(*net.TCPConn); ok {
_ = tcp.SetKeepAlive(true)
_ = tcp.SetKeepAlivePeriod(2 * time.Minute) // tune: 2–5 min
Expand All @@ -111,15 +112,20 @@ func NewSecureServerConn(_ context.Context, tc credentials.TransportCredentials,
_ = tcp.SetNoDelay(true)
}

conn, _, err := tc.ServerHandshake(rawConn)
conn, authInfo, err := tc.ServerHandshake(rawConn)
if err != nil {
return nil, errors.Errorf("server secure establish failed: %w", err)
return nil, "", errors.Errorf("server secure establish failed: %w", err)
}

remoteIdentity := ""
if ai, ok := authInfo.(*althandshake.AuthInfo); ok && ai != nil {
remoteIdentity = ai.RemoteIdentity
}

return &connWrapper{
secureConn: conn,
rawConn: rawConn,
}, nil
}, remoteIdentity, nil
}

// Read implements net.Conn's Read interface
Expand Down
12 changes: 12 additions & 0 deletions p2p/kademlia/dht.go
Original file line number Diff line number Diff line change
Expand Up @@ -2143,6 +2143,18 @@ func (s *DHT) IterateBatchStore(ctx context.Context, values [][]byte, typ int, i
successful := 0

logtrace.Debug(ctx, "Iterate batch store: dispatching to nodes", logtrace.Fields{"task_id": id, "nodes": len(knownNodes)})

// If there are no candidate nodes, there's nothing to fan out to. The caller
// already persisted the batch locally (see StoreBatch), so treat this as a
// no-op success rather than an error.
if len(knownNodes) == 0 {
logtrace.Info(ctx, "dht: batch store skipped (no candidate nodes)", logtrace.Fields{
logtrace.FieldModule: "dht",
"task_id": id,
"keys": len(values),
})
return nil
}
storeResponses := s.batchStoreNetwork(ctx, values, knownNodes, storageMap, typ)
for response := range storeResponses {
requests++
Expand Down
9 changes: 8 additions & 1 deletion p2p/kademlia/network.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
"github.com/btcsuite/btcutil/base58"
json "github.com/json-iterator/go"

"github.com/LumeraProtocol/supernode/v2/pkg/reachability"
"github.com/LumeraProtocol/supernode/v2/pkg/utils"

"github.com/google/uuid"
Expand Down Expand Up @@ -360,7 +361,8 @@ func (s *Network) handleConn(ctx context.Context, rawConn net.Conn) {
})
// secure handshake
if s.serverTC != nil {
conn, err = NewSecureServerConn(ctx, s.serverTC, rawConn)
var remoteIdentity string
conn, remoteIdentity, err = NewSecureServerConn(ctx, s.serverTC, rawConn)
if err != nil {
_ = rawConn.Close()
logtrace.Warn(ctx, "Server secure handshake failed", logtrace.Fields{
Expand All @@ -369,6 +371,11 @@ func (s *Network) handleConn(ctx context.Context, rawConn net.Conn) {
})
return
}

// Record inbound evidence for P2P reachability only after the secure handshake succeeds.
if store := reachability.DefaultStore(); store != nil {
store.RecordInbound(reachability.ServiceP2P, remoteIdentity, rawConn.RemoteAddr(), time.Now())
}
} else {
conn = rawConn
}
Expand Down
57 changes: 39 additions & 18 deletions pkg/lumera/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,21 @@ import (
"github.com/LumeraProtocol/supernode/v2/pkg/lumera/modules/bank"
"github.com/LumeraProtocol/supernode/v2/pkg/lumera/modules/node"
"github.com/LumeraProtocol/supernode/v2/pkg/lumera/modules/supernode"
"github.com/LumeraProtocol/supernode/v2/pkg/lumera/modules/supernode_msg"
"github.com/LumeraProtocol/supernode/v2/pkg/lumera/modules/tx"
)

type lumeraClient struct {
cfg *Config
authMod auth.Module
actionMod action.Module
actionMsgMod action_msg.Module
bankMod bank.Module
supernodeMod supernode.Module
txMod tx.Module
nodeMod node.Module
conn Connection
cfg *Config
authMod auth.Module
actionMod action.Module
actionMsgMod action_msg.Module
bankMod bank.Module
supernodeMod supernode.Module
supernodeMsgMod supernode_msg.Module
txMod tx.Module
nodeMod node.Module
conn Connection
}

func newClient(ctx context.Context, cfg *Config) (Client, error) {
Expand Down Expand Up @@ -93,16 +95,31 @@ func newClient(ctx context.Context, cfg *Config) (Client, error) {
return nil, err
}

supernodeMsgModule, err := supernode_msg.NewModule(
conn.GetConn(),
authModule,
txModule,
supernodeModule,
cfg.keyring,
cfg.KeyName,
cfg.ChainID,
)
if err != nil {
conn.Close()
return nil, err
}

return &lumeraClient{
cfg: cfg,
authMod: authModule,
actionMod: actionModule,
actionMsgMod: actionMsgModule,
bankMod: bankModule,
supernodeMod: supernodeModule,
txMod: txModule,
nodeMod: nodeModule,
conn: conn,
cfg: cfg,
authMod: authModule,
actionMod: actionModule,
actionMsgMod: actionMsgModule,
bankMod: bankModule,
supernodeMod: supernodeModule,
supernodeMsgMod: supernodeMsgModule,
txMod: txModule,
nodeMod: nodeModule,
conn: conn,
}, nil
}

Expand All @@ -126,6 +143,10 @@ func (c *lumeraClient) SuperNode() supernode.Module {
return c.supernodeMod
}

func (c *lumeraClient) SuperNodeMsg() supernode_msg.Module {
return c.supernodeMsgMod
}

func (c *lumeraClient) Tx() tx.Module {
return c.txMod
}
Expand Down
3 changes: 2 additions & 1 deletion pkg/lumera/codec/encoding.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"sync"

actiontypes "github.com/LumeraProtocol/lumera/x/action/v1/types"
sntypes "github.com/LumeraProtocol/lumera/x/supernode/v1/types"
"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/codec"
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
Expand Down Expand Up @@ -49,7 +50,7 @@ func RegisterInterfaces(registry codectypes.InterfaceRegistry) {
cryptocodec.RegisterInterfaces(registry)
authtypes.RegisterInterfaces(registry)
actiontypes.RegisterInterfaces(registry)
// Add more interface registrations here as you add more modules
sntypes.RegisterInterfaces(registry)
}

// GetEncodingConfig returns the standard encoding config for Lumera client
Expand Down
2 changes: 2 additions & 0 deletions pkg/lumera/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"github.com/LumeraProtocol/supernode/v2/pkg/lumera/modules/bank"
"github.com/LumeraProtocol/supernode/v2/pkg/lumera/modules/node"
"github.com/LumeraProtocol/supernode/v2/pkg/lumera/modules/supernode"
"github.com/LumeraProtocol/supernode/v2/pkg/lumera/modules/supernode_msg"
"github.com/LumeraProtocol/supernode/v2/pkg/lumera/modules/tx"
)

Expand All @@ -19,6 +20,7 @@ type Client interface {
Action() action.Module
ActionMsg() action_msg.Module
SuperNode() supernode.Module
SuperNodeMsg() supernode_msg.Module
Bank() bank.Module
Tx() tx.Module
Node() node.Module
Expand Down
Loading
Loading