Skip to content

Commit

Permalink
feat: make granter configurable on the node startup
Browse files Browse the repository at this point in the history
  • Loading branch information
vgonkivs committed Apr 11, 2024
1 parent a7af3d1 commit 9d32c1f
Show file tree
Hide file tree
Showing 7 changed files with 74 additions and 28 deletions.
2 changes: 2 additions & 0 deletions nodebuilder/state/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,14 @@ var defaultKeyringBackend = keyring.BackendTest
type Config struct {
KeyringAccName string
KeyringBackend string
GranterEnabled bool
}

func DefaultConfig() Config {
return Config{
KeyringAccName: "",
KeyringBackend: defaultKeyringBackend,
GranterEnabled: false,
}
}

Expand Down
43 changes: 40 additions & 3 deletions nodebuilder/state/core.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package state

import (
"context"

"go.uber.org/fx"

apptypes "github.com/celestiaorg/celestia-app/x/blob/types"
libfraud "github.com/celestiaorg/go-fraud"
"github.com/celestiaorg/go-header/sync"
Expand All @@ -12,19 +16,52 @@ import (
"github.com/celestiaorg/celestia-node/state"
)

// coreAccessor constructs a new instance of state.Module over
// a celestia-core connection with enabled granter.
func coreAccessorWithGranter(
lc fx.Lifecycle,
corecfg core.Config,
signer *apptypes.KeyringSigner,
sync *sync.Syncer[*header.ExtendedHeader],
fraudServ libfraud.Service[*header.ExtendedHeader],
) (*state.CoreAccessor, Module, *modfraud.ServiceBreaker[*state.CoreAccessor, *header.ExtendedHeader]) {
return coreAccessor(lc, corecfg, signer, sync, fraudServ, true)
}

func coreAccessorWithoutGranter(
lc fx.Lifecycle,
corecfg core.Config,
signer *apptypes.KeyringSigner,
sync *sync.Syncer[*header.ExtendedHeader],
fraudServ libfraud.Service[*header.ExtendedHeader],
) (*state.CoreAccessor, Module, *modfraud.ServiceBreaker[*state.CoreAccessor, *header.ExtendedHeader]) {
return coreAccessor(lc, corecfg, signer, sync, fraudServ, false)
}

// coreAccessor constructs a new instance of state.Module over
// a celestia-core connection.
func coreAccessor(
lc fx.Lifecycle,
corecfg core.Config,
signer *apptypes.KeyringSigner,
sync *sync.Syncer[*header.ExtendedHeader],
fraudServ libfraud.Service[*header.ExtendedHeader],
granterEnabled bool,
) (*state.CoreAccessor, Module, *modfraud.ServiceBreaker[*state.CoreAccessor, *header.ExtendedHeader]) {
ca := state.NewCoreAccessor(signer, sync, corecfg.IP, corecfg.RPCPort, corecfg.GRPCPort)

return ca, ca, &modfraud.ServiceBreaker[*state.CoreAccessor, *header.ExtendedHeader]{
ca := state.NewCoreAccessor(signer, sync, corecfg.IP, corecfg.RPCPort, corecfg.GRPCPort, granterEnabled)
sBreaker := &modfraud.ServiceBreaker[*state.CoreAccessor, *header.ExtendedHeader]{
Service: ca,
FraudType: byzantine.BadEncoding,
FraudServ: fraudServ,
}

lc.Append(fx.Hook{
OnStart: func(ctx context.Context) error {
return sBreaker.Start(ctx)
},
OnStop: func(ctx context.Context) error {
return sBreaker.Stop(ctx)
},
})
return ca, ca, sBreaker
}
9 changes: 9 additions & 0 deletions nodebuilder/state/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import (
var (
keyringAccNameFlag = "keyring.accname"
keyringBackendFlag = "keyring.backend"

granterEnabledFlag = "granter.enabled"
)

// Flags gives a set of hardcoded State flags.
Expand All @@ -21,6 +23,7 @@ func Flags() *flag.FlagSet {
flags.String(keyringBackendFlag, defaultKeyringBackend, fmt.Sprintf("Directs node's keyring signer to use the given "+
"backend. Default is %s.", defaultKeyringBackend))

flags.Bool(granterEnabledFlag, false, fmt.Sprintf("Allows to run the node in a grantee mode. Default is %v.", false))
return flags
}

Expand All @@ -32,4 +35,10 @@ func ParseFlags(cmd *cobra.Command, cfg *Config) {
}

cfg.KeyringBackend = cmd.Flag(keyringBackendFlag).Value.String()

enabled, err := cmd.Flags().GetBool(granterEnabledFlag)
if err != nil {
panic(err)
}
cfg.GranterEnabled = enabled
}
17 changes: 2 additions & 15 deletions nodebuilder/state/module.go
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
package state

import (
"context"

logging "github.com/ipfs/go-log/v2"
"go.uber.org/fx"

"github.com/celestiaorg/celestia-node/header"
"github.com/celestiaorg/celestia-node/libs/fxutil"
"github.com/celestiaorg/celestia-node/nodebuilder/core"
modfraud "github.com/celestiaorg/celestia-node/nodebuilder/fraud"
"github.com/celestiaorg/celestia-node/nodebuilder/node"
"github.com/celestiaorg/celestia-node/state"
)
Expand All @@ -25,17 +21,8 @@ func ConstructModule(tp node.Type, cfg *Config, coreCfg *core.Config) fx.Option
baseComponents := fx.Options(
fx.Supply(*cfg),
fx.Error(cfgErr),
fxutil.ProvideIf(coreCfg.IsEndpointConfigured(), fx.Annotate(
coreAccessor,
fx.OnStart(func(ctx context.Context,
breaker *modfraud.ServiceBreaker[*state.CoreAccessor, *header.ExtendedHeader]) error {
return breaker.Start(ctx)
}),
fx.OnStop(func(ctx context.Context,
breaker *modfraud.ServiceBreaker[*state.CoreAccessor, *header.ExtendedHeader]) error {
return breaker.Stop(ctx)
}),
)),
fxutil.ProvideIf(cfg.GranterEnabled && coreCfg.IsEndpointConfigured(), coreAccessorWithGranter),
fxutil.ProvideIf(!cfg.GranterEnabled && coreCfg.IsEndpointConfigured(), coreAccessorWithoutGranter),
fxutil.ProvideIf(!coreCfg.IsEndpointConfigured(), func() (*state.CoreAccessor, Module) {
return nil, &stubbedStateModule{}
}),
Expand Down
27 changes: 19 additions & 8 deletions state/core_access.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,10 @@ type CoreAccessor struct {
// will find a proposer that does accept the transaction. Better would be
// to set a global min gas price that correct processes conform to.
minGasPrice float64

// granterEnabled indicates that node is run in a `grantee` mode. This means, that all
// SubmitPFB transactions will be paid by the granter.
granterEnabled bool
}

// NewCoreAccessor dials the given celestia-core endpoint and
Expand All @@ -88,18 +92,20 @@ func NewCoreAccessor(
coreIP,
rpcPort string,
grpcPort string,
granterEnabled bool,
) *CoreAccessor {
// create verifier
prt := merkle.DefaultProofRuntime()
prt.RegisterOpDecoder(storetypes.ProofOpIAVLCommitment, storetypes.CommitmentOpDecoder)
prt.RegisterOpDecoder(storetypes.ProofOpSimpleMerkleCommitment, storetypes.CommitmentOpDecoder)
return &CoreAccessor{
signer: signer,
getter: getter,
coreIP: coreIP,
rpcPort: rpcPort,
grpcPort: grpcPort,
prt: prt,
signer: signer,
getter: getter,
coreIP: coreIP,
rpcPort: rpcPort,
grpcPort: grpcPort,
prt: prt,
granterEnabled: granterEnabled,
}
}

Expand Down Expand Up @@ -224,7 +230,7 @@ func (ca *CoreAccessor) SubmitPayForBlob(

feeGrant, err := ca.getGranter(ctx)
if err != nil {
log.Warn(err)
return nil, err
}

if feeGrant != nil {
Expand Down Expand Up @@ -649,6 +655,11 @@ func withFee(fee Int) apptypes.TxBuilderOption {
}

func (ca *CoreAccessor) getGranter(ctx context.Context) (apptypes.TxBuilderOption, error) {
// check if the granter flag was enabled.
if !ca.granterEnabled {
return nil, nil
}

addr, err := ca.signer.GetSignerInfo().GetAddress()
if err != nil {
return nil, err
Expand All @@ -667,5 +678,5 @@ func (ca *CoreAccessor) getGranter(ctx context.Context) (apptypes.TxBuilderOptio
}
return apptypes.SetFeeGranter(appAddr), nil
}
return nil, nil
return nil, errors.New("granter was not found")
}
2 changes: 1 addition & 1 deletion state/core_access_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ func TestSubmitPayForBlob(t *testing.T) {
defer cancel()

signer := blobtypes.NewKeyringSigner(cctx.Keyring, accounts[0], cctx.ChainID)
ca := NewCoreAccessor(signer, nil, "127.0.0.1", extractPort(rpcAddr), extractPort(grpcAddr))
ca := NewCoreAccessor(signer, nil, "127.0.0.1", extractPort(rpcAddr), extractPort(grpcAddr), false)
// start the accessor
err := ca.Start(ctx)
require.NoError(t, err)
Expand Down
2 changes: 1 addition & 1 deletion state/integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ func (s *IntegrationTestSuite) SetupSuite() {
s.accounts = cfg.Accounts

signer := blobtypes.NewKeyringSigner(s.cctx.Keyring, s.accounts[0], s.cctx.ChainID)
accessor := NewCoreAccessor(signer, localHeader{s.cctx.Client}, "", "", "")
accessor := NewCoreAccessor(signer, localHeader{s.cctx.Client}, "", "", "", false)
setClients(accessor, s.cctx.GRPCClient, s.cctx.Client)
s.accessor = accessor

Expand Down

0 comments on commit 9d32c1f

Please sign in to comment.