Fix mpool.GetActor for lite node
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
This commit is contained in:
parent
61dbd443b8
commit
d777680449
@ -805,6 +805,13 @@ func (mp *MessagePool) GetNonce(_ context.Context, addr address.Address, _ types
|
|||||||
return mp.getNonceLocked(addr, mp.curTs)
|
return mp.getNonceLocked(addr, mp.curTs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetActor should not be used. It is only here to satisfy interface mess caused by lite node handling
|
||||||
|
func (mp *MessagePool) GetActor(_ context.Context, addr address.Address, _ types.TipSetKey) (*types.Actor, error) {
|
||||||
|
mp.curTsLk.Lock()
|
||||||
|
defer mp.curTsLk.Unlock()
|
||||||
|
return mp.api.GetActorAfter(addr, mp.curTs)
|
||||||
|
}
|
||||||
|
|
||||||
func (mp *MessagePool) getNonceLocked(addr address.Address, curTs *types.TipSet) (uint64, error) {
|
func (mp *MessagePool) getNonceLocked(addr address.Address, curTs *types.TipSet) (uint64, error) {
|
||||||
stateNonce, err := mp.getStateNonce(addr, curTs) // sanity check
|
stateNonce, err := mp.getStateNonce(addr, curTs) // sanity check
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -9,6 +9,7 @@ import (
|
|||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-address"
|
"github.com/filecoin-project/go-address"
|
||||||
|
"github.com/filecoin-project/lotus/chain/messagesigner"
|
||||||
"github.com/filecoin-project/lotus/chain/stmgr"
|
"github.com/filecoin-project/lotus/chain/stmgr"
|
||||||
"github.com/filecoin-project/lotus/chain/store"
|
"github.com/filecoin-project/lotus/chain/store"
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
@ -35,12 +36,18 @@ type Provider interface {
|
|||||||
type mpoolProvider struct {
|
type mpoolProvider struct {
|
||||||
sm *stmgr.StateManager
|
sm *stmgr.StateManager
|
||||||
ps *pubsub.PubSub
|
ps *pubsub.PubSub
|
||||||
|
|
||||||
|
lite messagesigner.MpoolNonceAPI
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewProvider(sm *stmgr.StateManager, ps *pubsub.PubSub) Provider {
|
func NewProvider(sm *stmgr.StateManager, ps *pubsub.PubSub) Provider {
|
||||||
return &mpoolProvider{sm: sm, ps: ps}
|
return &mpoolProvider{sm: sm, ps: ps}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func NewProviderLite(sm *stmgr.StateManager, ps *pubsub.PubSub, noncer messagesigner.MpoolNonceAPI) Provider {
|
||||||
|
return &mpoolProvider{sm: sm, ps: ps, lite: noncer}
|
||||||
|
}
|
||||||
|
|
||||||
func (mpp *mpoolProvider) SubscribeHeadChanges(cb func(rev, app []*types.TipSet) error) *types.TipSet {
|
func (mpp *mpoolProvider) SubscribeHeadChanges(cb func(rev, app []*types.TipSet) error) *types.TipSet {
|
||||||
mpp.sm.ChainStore().SubscribeHeadChanges(
|
mpp.sm.ChainStore().SubscribeHeadChanges(
|
||||||
store.WrapHeadChangeCoalescer(
|
store.WrapHeadChangeCoalescer(
|
||||||
@ -61,6 +68,19 @@ func (mpp *mpoolProvider) PubSubPublish(k string, v []byte) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (mpp *mpoolProvider) GetActorAfter(addr address.Address, ts *types.TipSet) (*types.Actor, error) {
|
func (mpp *mpoolProvider) GetActorAfter(addr address.Address, ts *types.TipSet) (*types.Actor, error) {
|
||||||
|
if mpp.lite != nil {
|
||||||
|
n, err := mpp.lite.GetNonce(context.TODO(), addr, ts.Key())
|
||||||
|
if err != nil {
|
||||||
|
return nil, xerrors.Errorf("getting nonce over lite: %w", err)
|
||||||
|
}
|
||||||
|
a, err := mpp.lite.GetActor(context.TODO(), addr, ts.Key())
|
||||||
|
if err != nil {
|
||||||
|
return nil, xerrors.Errorf("getting actor over lite: %w", err)
|
||||||
|
}
|
||||||
|
a.Nonce = n
|
||||||
|
return a, nil
|
||||||
|
}
|
||||||
|
|
||||||
stcid, _, err := mpp.sm.TipSetState(context.TODO(), ts)
|
stcid, _, err := mpp.sm.TipSetState(context.TODO(), ts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, xerrors.Errorf("computing tipset state for GetActor: %w", err)
|
return nil, xerrors.Errorf("computing tipset state for GetActor: %w", err)
|
||||||
|
@ -24,6 +24,7 @@ var log = logging.Logger("messagesigner")
|
|||||||
|
|
||||||
type MpoolNonceAPI interface {
|
type MpoolNonceAPI interface {
|
||||||
GetNonce(context.Context, address.Address, types.TipSetKey) (uint64, error)
|
GetNonce(context.Context, address.Address, types.TipSetKey) (uint64, error)
|
||||||
|
GetActor(context.Context, address.Address, types.TipSetKey) (*types.Actor, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MessageSigner keeps track of nonces per address, and increments the nonce
|
// MessageSigner keeps track of nonces per address, and increments the nonce
|
||||||
|
@ -41,6 +41,9 @@ func (mp *mockMpool) GetNonce(_ context.Context, addr address.Address, _ types.T
|
|||||||
|
|
||||||
return mp.nonces[addr], nil
|
return mp.nonces[addr], nil
|
||||||
}
|
}
|
||||||
|
func (mp *mockMpool) GetActor(_ context.Context, addr address.Address, _ types.TipSetKey) (*types.Actor, error) {
|
||||||
|
panic("don't use it")
|
||||||
|
}
|
||||||
|
|
||||||
func TestMessageSignerSignMessage(t *testing.T) {
|
func TestMessageSignerSignMessage(t *testing.T) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
@ -333,6 +333,7 @@ var ChainNode = Options(
|
|||||||
|
|
||||||
// Lite node API
|
// Lite node API
|
||||||
ApplyIf(isLiteNode,
|
ApplyIf(isLiteNode,
|
||||||
|
Override(new(messagepool.Provider), messagepool.NewProviderLite),
|
||||||
Override(new(messagesigner.MpoolNonceAPI), From(new(modules.MpoolNonceAPI))),
|
Override(new(messagesigner.MpoolNonceAPI), From(new(modules.MpoolNonceAPI))),
|
||||||
Override(new(full.ChainModuleAPI), From(new(api.Gateway))),
|
Override(new(full.ChainModuleAPI), From(new(api.Gateway))),
|
||||||
Override(new(full.GasModuleAPI), From(new(api.Gateway))),
|
Override(new(full.GasModuleAPI), From(new(api.Gateway))),
|
||||||
@ -343,6 +344,7 @@ var ChainNode = Options(
|
|||||||
|
|
||||||
// Full node API / service startup
|
// Full node API / service startup
|
||||||
ApplyIf(isFullNode,
|
ApplyIf(isFullNode,
|
||||||
|
Override(new(messagepool.Provider), messagepool.NewProvider),
|
||||||
Override(new(messagesigner.MpoolNonceAPI), From(new(*messagepool.MessagePool))),
|
Override(new(messagesigner.MpoolNonceAPI), From(new(*messagepool.MessagePool))),
|
||||||
Override(new(full.ChainModuleAPI), From(new(full.ChainModule))),
|
Override(new(full.ChainModuleAPI), From(new(full.ChainModule))),
|
||||||
Override(new(full.GasModuleAPI), From(new(full.GasModule))),
|
Override(new(full.GasModuleAPI), From(new(full.GasModule))),
|
||||||
|
@ -9,7 +9,6 @@ import (
|
|||||||
"github.com/ipfs/go-blockservice"
|
"github.com/ipfs/go-blockservice"
|
||||||
"github.com/libp2p/go-libp2p-core/host"
|
"github.com/libp2p/go-libp2p-core/host"
|
||||||
"github.com/libp2p/go-libp2p-core/routing"
|
"github.com/libp2p/go-libp2p-core/routing"
|
||||||
pubsub "github.com/libp2p/go-libp2p-pubsub"
|
|
||||||
"go.uber.org/fx"
|
"go.uber.org/fx"
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
@ -59,8 +58,7 @@ func ChainBlockService(bs dtypes.ExposedBlockstore, rem dtypes.ChainBitswap) dty
|
|||||||
return blockservice.New(bs, rem)
|
return blockservice.New(bs, rem)
|
||||||
}
|
}
|
||||||
|
|
||||||
func MessagePool(lc fx.Lifecycle, sm *stmgr.StateManager, ps *pubsub.PubSub, ds dtypes.MetadataDS, nn dtypes.NetworkName, j journal.Journal) (*messagepool.MessagePool, error) {
|
func MessagePool(lc fx.Lifecycle, mpp messagepool.Provider, ds dtypes.MetadataDS, nn dtypes.NetworkName, j journal.Journal) (*messagepool.MessagePool, error) {
|
||||||
mpp := messagepool.NewProvider(sm, ps)
|
|
||||||
mp, err := messagepool.New(mpp, ds, nn, j)
|
mp, err := messagepool.New(mpp, ds, nn, j)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, xerrors.Errorf("constructing mpool: %w", err)
|
return nil, xerrors.Errorf("constructing mpool: %w", err)
|
||||||
|
@ -96,4 +96,13 @@ func (a *MpoolNonceAPI) GetNonce(ctx context.Context, addr address.Address, tsk
|
|||||||
return highestNonce, nil
|
return highestNonce, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *MpoolNonceAPI) GetActor(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*types.Actor, error) {
|
||||||
|
act, err := a.StateModule.StateGetActor(ctx, addr, tsk)
|
||||||
|
if err != nil {
|
||||||
|
return nil, xerrors.Errorf("calling StateGetActor: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return act, nil
|
||||||
|
}
|
||||||
|
|
||||||
var _ messagesigner.MpoolNonceAPI = (*MpoolNonceAPI)(nil)
|
var _ messagesigner.MpoolNonceAPI = (*MpoolNonceAPI)(nil)
|
||||||
|
Loading…
Reference in New Issue
Block a user