Skip to content

Commit 9cb0ee9

Browse files
[P2P] refactor: peerstore provider (part 1) (#804)
## Description 1. Simplify `PeerstoreProvider` interface 2. Extend it to support retrieval of the unstaked actor peerstore 3. Implement the extended interface in `persistencePeerstoreProvider` ### Before ```mermaid classDiagram class InterruptableModule { <<interface>> Start() error Stop() error } class IntegratableModule { <<interface>> +SetBus(bus Bus) +GetBus() Bus } class InitializableModule { <<interface>> +GetModuleName() string +Create(bus Bus, opts ...Option) (Module, error) } class Module { <<interface>> } Module --|> InitializableModule Module --|> IntegratableModule Module --|> InterruptableModule class PeerstoreProvider { <<interface>> +GetStakedPeerstoreAtHeight(height int) (Peerstore, error) +GetP2PConfig() *P2PConfig } class persistencePeerstoreProvider class rpcPeerstoreProvider persistencePeerstoreProvider --|> PeerstoreProvider rpcPeerstoreProvider --|> PeerstoreProvider PeerstoreProvider --|> Module ``` ### After ```mermaid classDiagram class IntegratableModule { <<interface>> +GetBus() Bus +SetBus(bus Bus) } class PeerstoreProvider { <<interface>> +GetStakedPeerstoreAtHeight(height int) (Peerstore, error) +GetUnstakedPeerstore() (Peerstore, error) } class persistencePeerstoreProvider class rpcPeerstoreProvider class p2pModule class unstakedPeerstoreProvider { <<interface>> +GetUnstakedPeerstore() (Peerstore, error) } persistencePeerstoreProvider --|> PeerstoreProvider persistencePeerstoreProvider --> p2pModule : from Bus rpcPeerstoreProvider --> p2pModule : from Bus p2pModule --|> unstakedPeerstoreProvider rpcPeerstoreProvider --|> PeerstoreProvider rpcPeerstoreProvider --|> Module PeerstoreProvider --|> IntegratableModule class Module { <<interface>> } Module --|> InitializableModule Module --|> IntegratableModule Module --|> InterruptableModule ``` ## Issue Realted: - #810 Dependants: - #505 - #806 ## Type of change Please mark the relevant option(s): - [ ] New feature, functionality or library - [ ] Bug fix - [ ] Code health or cleanup - [ ] Major breaking change - [ ] Documentation - [ ] Other <!-- add details here if it a different type of change --> ## List of changes - Replaced embedded `modules.Module` with simpler `modules.IntegratableModule` in `PeerstoreProvider` interface - Removed unused `PeerstoreProvider#GetP2PConfig()` method - Added `PeerstoreProvider#GetUnstakedPeerstore()` method - Added `p2pPeerstoreProvider` implementation of `PeerstoreProvider` interface - Added `Factory` generic type ## Testing - [ ] `make develop_test`; if any code changes were made - [x] `make test_e2e` on [k8s LocalNet](https://github.com/pokt-network/pocket/blob/main/build/localnet/README.md); if any code changes were made - [ ] `e2e-devnet-test` passes tests on [DevNet](https://pocketnetwork.notion.site/How-to-DevNet-ff1598f27efe44c09f34e2aa0051f0dd); if any code was changed - [x] [Docker Compose LocalNet](https://github.com/pokt-network/pocket/blob/main/docs/development/README.md); if any major functionality was changed or introduced - [x] [k8s LocalNet](https://github.com/pokt-network/pocket/blob/main/build/localnet/README.md); if any infrastructure or configuration changes were made <!-- REMOVE this comment block after following the instructions If you added additional tests or infrastructure, describe it here. Bonus points for images and videos or gifs. --> ## Required Checklist - [x] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas - [x] I have added, or updated, [`godoc` format comments](https://go.dev/blog/godoc) on touched members (see: [tip.golang.org/doc/comment](https://tip.golang.org/doc/comment)) - [ ] I have tested my changes using the available tooling - [ ] I have updated the corresponding CHANGELOG ### If Applicable Checklist - [ ] I have updated the corresponding README(s); local and/or global - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] I have added, or updated, [mermaid.js](https://mermaid-js.github.io) diagrams in the corresponding README(s) - [ ] I have added, or updated, documentation and [mermaid.js](https://mermaid-js.github.io) diagrams in `shared/docs/*` if I updated `shared/*`README(s)
1 parent f72e1f0 commit 9cb0ee9

File tree

16 files changed

+172
-60
lines changed

16 files changed

+172
-60
lines changed

app/client/cli/debug.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ func persistentPreRun(cmd *cobra.Command, _ []string) {
126126
func setupPeerstoreProvider(rm runtime.Manager, rpcURL string) {
127127
bus := rm.GetBus()
128128
modulesRegistry := bus.GetModulesRegistry()
129-
pstoreProvider := rpcABP.NewRPCPeerstoreProvider(
129+
pstoreProvider := rpcABP.Create(
130130
rpcABP.WithP2PConfig(rm.GetConfig().P2P),
131131
rpcABP.WithCustomRPCURL(rpcURL),
132132
)

app/client/doc/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [0.0.0.33] - 2023-06-13
11+
12+
- Renamed `NewRPCPeerstoreProvider()` and `NewPersistencePeerstoreProvider()` to `Create()` (per package)
13+
1014
## [0.0.0.32] - 2023-05-25
1115

1216
- Add the `nonInteractive` flag in a couple spots where it was missing

consensus/doc/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [0.0.0.54] - 2023-06-13
11+
12+
- Fix tests
13+
1014
## [0.0.0.53] - 2023-06-08
1115

1216
- Add consensus README

consensus/e2e_tests/utils_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@ import (
1111

1212
"github.com/benbjohnson/clock"
1313
"github.com/golang/mock/gomock"
14+
1415
"github.com/pokt-network/pocket/consensus"
1516
typesCons "github.com/pokt-network/pocket/consensus/types"
17+
"github.com/pokt-network/pocket/internal/testutil"
1618
persistenceMocks "github.com/pokt-network/pocket/persistence/types/mocks"
1719
"github.com/pokt-network/pocket/runtime"
1820
"github.com/pokt-network/pocket/runtime/configs"
@@ -432,6 +434,20 @@ func basePersistenceMock(t *testing.T, _ modules.EventsChannel, bus modules.Bus)
432434
Return(bus.GetRuntimeMgr().GetGenesis().Validators, nil).
433435
AnyTimes()
434436

437+
persistenceReadContextMock.
438+
EXPECT().
439+
GetAllStakedActors(gomock.Any()).
440+
DoAndReturn(func(height int64) ([]*coreTypes.Actor, error) {
441+
genesisState := bus.GetRuntimeMgr().GetGenesis()
442+
return testutil.Concatenate[*coreTypes.Actor](
443+
genesisState.Validators,
444+
genesisState.Servicers,
445+
genesisState.Fishermen,
446+
genesisState.Applications,
447+
), nil
448+
}).
449+
AnyTimes()
450+
435451
persistenceReadContextMock.
436452
EXPECT().
437453
GetBlockHash(gomock.Any()).

internal/testutil/slice.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package testutil
2+
3+
// Concatenate appends the contents of multiple slices of any type (T) into a
4+
// single slice of type T.
5+
func Concatenate[T any](tt ...[]T) (result []T) {
6+
for _, t := range tt {
7+
result = append(result, t...)
8+
}
9+
return result
10+
}

p2p/CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [0.0.0.54] - 2023-06-13
11+
12+
- Replaced embedded `modules.Module` with simpler `modules.IntegratableModule` in `PeerstoreProvider` interface
13+
- Removed unused `PeerstoreProvider#GetP2PConfig()` method
14+
- Added `PeerstoreProvider#GetUnstakedPeerstore()` method
15+
- Added temporary `unstakedPeerstoreProvider` interface
16+
- Renamed `NewRPCPeerstoreProvider()` and `NewPersistencePeerstoreProvider()` to `Create()` (per package)
17+
1018
## [0.0.0.53] - 2023-06-01
1119

1220
- Moved nonce field from RainTreeMessage to PocketEnvelope protobuf types

p2p/bootstrap.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ func (m *p2pModule) bootstrap() error {
5858
continue
5959
}
6060

61-
pstoreProvider := rpcABP.NewRPCPeerstoreProvider(
61+
pstoreProvider := rpcABP.Create(
6262
rpcABP.WithP2PConfig(
6363
m.GetBus().GetRuntimeMgr().GetConfig().P2P,
6464
),

p2p/module.go

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,19 @@ package p2p
33
import (
44
"errors"
55
"fmt"
6+
67
"github.com/libp2p/go-libp2p"
78
libp2pHost "github.com/libp2p/go-libp2p/core/host"
89
"github.com/multiformats/go-multiaddr"
10+
"google.golang.org/protobuf/proto"
11+
"google.golang.org/protobuf/types/known/anypb"
12+
913
"github.com/pokt-network/pocket/logger"
1014
"github.com/pokt-network/pocket/p2p/config"
1115
"github.com/pokt-network/pocket/p2p/providers"
1216
"github.com/pokt-network/pocket/p2p/providers/current_height_provider"
1317
"github.com/pokt-network/pocket/p2p/providers/peerstore_provider"
14-
persABP "github.com/pokt-network/pocket/p2p/providers/peerstore_provider/persistence"
18+
persPSP "github.com/pokt-network/pocket/p2p/providers/peerstore_provider/persistence"
1519
"github.com/pokt-network/pocket/p2p/raintree"
1620
typesP2P "github.com/pokt-network/pocket/p2p/types"
1721
"github.com/pokt-network/pocket/p2p/utils"
@@ -24,8 +28,6 @@ import (
2428
"github.com/pokt-network/pocket/shared/modules"
2529
"github.com/pokt-network/pocket/shared/modules/base_modules"
2630
"github.com/pokt-network/pocket/telemetry"
27-
"google.golang.org/protobuf/proto"
28-
"google.golang.org/protobuf/types/known/anypb"
2931
)
3032

3133
var _ modules.P2PModule = &p2pModule{}
@@ -231,14 +233,21 @@ func (m *p2pModule) setupDependencies() error {
231233
// bus, if one is registered, otherwise returns a new `persistencePeerstoreProvider`.
232234
func (m *p2pModule) setupPeerstoreProvider() error {
233235
m.logger.Debug().Msg("setupPeerstoreProvider")
236+
237+
// TECHDEBT(#810): simplify once submodules are more convenient to retrieve.
234238
pstoreProviderModule, err := m.GetBus().GetModulesRegistry().GetModule(peerstore_provider.ModuleName)
235239
if err != nil {
236240
m.logger.Debug().Msg("creating new persistence peerstore...")
237-
pstoreProviderModule = persABP.NewPersistencePeerstoreProvider(m.GetBus())
238-
} else if pstoreProviderModule != nil {
239-
m.logger.Debug().Msg("loaded persistence peerstore...")
241+
pstoreProvider, err := persPSP.Create(m.GetBus())
242+
if err != nil {
243+
return err
244+
}
245+
246+
m.pstoreProvider = pstoreProvider
247+
return nil
240248
}
241249

250+
m.logger.Debug().Msg("loaded persistence peerstore...")
242251
pstoreProvider, ok := pstoreProviderModule.(providers.PeerstoreProvider)
243252
if !ok {
244253
return fmt.Errorf("unknown peerstore provider type: %T", pstoreProviderModule)

p2p/providers/peerstore_provider/peerstore_provider.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ package peerstore_provider
55
import (
66
"github.com/pokt-network/pocket/logger"
77
typesP2P "github.com/pokt-network/pocket/p2p/types"
8-
"github.com/pokt-network/pocket/runtime/configs"
98
coreTypes "github.com/pokt-network/pocket/shared/core/types"
109
cryptoPocket "github.com/pokt-network/pocket/shared/crypto"
1110
"github.com/pokt-network/pocket/shared/modules"
@@ -16,10 +15,15 @@ const ModuleName = "peerstore_provider"
1615

1716
// PeerstoreProvider is an interface that provides Peerstore accessors
1817
type PeerstoreProvider interface {
19-
modules.Module
18+
modules.IntegratableModule
2019

20+
// GetStakedPeerstoreAtHeight returns a peerstore containing all staked peers
21+
// at a given height. These peers communicate via the p2p module's staked actor
22+
// router.
2123
GetStakedPeerstoreAtHeight(height uint64) (typesP2P.Peerstore, error)
22-
GetP2PConfig() *configs.P2PConfig
24+
// GetUnstakedPeerstore returns a peerstore containing all peers which
25+
// communicate via the p2p module's unstaked actor router.
26+
GetUnstakedPeerstore() (typesP2P.Peerstore, error)
2327
}
2428

2529
func ActorsToPeerstore(abp PeerstoreProvider, actors []*coreTypes.Actor) (pstore typesP2P.Peerstore, errs error) {

p2p/providers/peerstore_provider/persistence/provider.go

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,28 @@ package persistence
33
import (
44
"github.com/pokt-network/pocket/p2p/providers/peerstore_provider"
55
typesP2P "github.com/pokt-network/pocket/p2p/types"
6-
"github.com/pokt-network/pocket/runtime/configs"
76
"github.com/pokt-network/pocket/shared/modules"
87
"github.com/pokt-network/pocket/shared/modules/base_modules"
98
)
109

11-
var _ peerstore_provider.PeerstoreProvider = &persistencePeerstoreProvider{}
10+
var (
11+
_ peerstore_provider.PeerstoreProvider = &persistencePeerstoreProvider{}
12+
_ persistencePStoreProviderFactory = &persistencePeerstoreProvider{}
13+
)
14+
15+
type persistencePStoreProviderOption func(*persistencePeerstoreProvider)
16+
type persistencePStoreProviderFactory = modules.FactoryWithOptions[peerstore_provider.PeerstoreProvider, persistencePStoreProviderOption]
1217

18+
// TECHDEBT(#810): refactor to implement `Submodule` interface.
1319
type persistencePeerstoreProvider struct {
1420
base_modules.IntegratableModule
15-
base_modules.InterruptableModule
1621
}
1722

18-
func NewPersistencePeerstoreProvider(bus modules.Bus, options ...func(*persistencePeerstoreProvider)) *persistencePeerstoreProvider {
23+
func Create(bus modules.Bus, options ...persistencePStoreProviderOption) (peerstore_provider.PeerstoreProvider, error) {
24+
return new(persistencePeerstoreProvider).Create(bus, options...)
25+
}
26+
27+
func (*persistencePeerstoreProvider) Create(bus modules.Bus, options ...persistencePStoreProviderOption) (peerstore_provider.PeerstoreProvider, error) {
1928
pabp := &persistencePeerstoreProvider{
2029
IntegratableModule: *base_modules.NewIntegratableModule(bus),
2130
}
@@ -24,35 +33,30 @@ func NewPersistencePeerstoreProvider(bus modules.Bus, options ...func(*persisten
2433
o(pabp)
2534
}
2635

27-
return pabp
28-
}
29-
30-
func Create(bus modules.Bus, options ...modules.ModuleOption) (modules.Module, error) {
31-
return new(persistencePeerstoreProvider).Create(bus, options...)
32-
}
33-
34-
func (*persistencePeerstoreProvider) Create(bus modules.Bus, options ...modules.ModuleOption) (modules.Module, error) {
35-
return NewPersistencePeerstoreProvider(bus), nil
36+
return pabp, nil
3637
}
3738

3839
func (*persistencePeerstoreProvider) GetModuleName() string {
3940
return peerstore_provider.ModuleName
4041
}
4142

42-
func (pabp *persistencePeerstoreProvider) GetStakedPeerstoreAtHeight(height uint64) (typesP2P.Peerstore, error) {
43-
readCtx, err := pabp.GetBus().GetPersistenceModule().NewReadContext(int64(height))
43+
// GetStakedPeerstoreAtHeight implements the respective `PeerstoreProvider` interface method.
44+
func (persistencePSP *persistencePeerstoreProvider) GetStakedPeerstoreAtHeight(height uint64) (typesP2P.Peerstore, error) {
45+
readCtx, err := persistencePSP.GetBus().GetPersistenceModule().NewReadContext(int64(height))
4446
if err != nil {
4547
return nil, err
4648
}
4749
defer readCtx.Release()
4850

51+
// TECHDEBT(#818): consider all staked actors, not just validators.
4952
validators, err := readCtx.GetAllValidators(int64(height))
5053
if err != nil {
5154
return nil, err
5255
}
53-
return peerstore_provider.ActorsToPeerstore(pabp, validators)
56+
return peerstore_provider.ActorsToPeerstore(persistencePSP, validators)
5457
}
5558

56-
func (pabp *persistencePeerstoreProvider) GetP2PConfig() *configs.P2PConfig {
57-
return pabp.GetBus().GetRuntimeMgr().GetConfig().P2P
59+
// GetStakedPeerstoreAtHeight implements the respective `PeerstoreProvider` interface method.
60+
func (persistencePSP *persistencePeerstoreProvider) GetUnstakedPeerstore() (typesP2P.Peerstore, error) {
61+
return peerstore_provider.GetUnstakedPeerstore(persistencePSP.GetBus())
5862
}

0 commit comments

Comments
 (0)