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) | ||||
| } | ||||
| 
 | ||||
| // 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) { | ||||
| 	stateNonce, err := mp.getStateNonce(addr, curTs) // sanity check
 | ||||
| 	if err != nil { | ||||
|  | ||||
| @ -9,6 +9,7 @@ import ( | ||||
| 	"golang.org/x/xerrors" | ||||
| 
 | ||||
| 	"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/store" | ||||
| 	"github.com/filecoin-project/lotus/chain/types" | ||||
| @ -35,12 +36,18 @@ type Provider interface { | ||||
| type mpoolProvider struct { | ||||
| 	sm *stmgr.StateManager | ||||
| 	ps *pubsub.PubSub | ||||
| 
 | ||||
| 	lite messagesigner.MpoolNonceAPI | ||||
| } | ||||
| 
 | ||||
| func NewProvider(sm *stmgr.StateManager, ps *pubsub.PubSub) Provider { | ||||
| 	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 { | ||||
| 	mpp.sm.ChainStore().SubscribeHeadChanges( | ||||
| 		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) { | ||||
| 	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) | ||||
| 	if err != nil { | ||||
| 		return nil, xerrors.Errorf("computing tipset state for GetActor: %w", err) | ||||
|  | ||||
| @ -24,6 +24,7 @@ var log = logging.Logger("messagesigner") | ||||
| 
 | ||||
| type MpoolNonceAPI interface { | ||||
| 	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
 | ||||
|  | ||||
| @ -41,6 +41,9 @@ func (mp *mockMpool) GetNonce(_ context.Context, addr address.Address, _ types.T | ||||
| 
 | ||||
| 	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) { | ||||
| 	ctx := context.Background() | ||||
|  | ||||
| @ -333,6 +333,7 @@ var ChainNode = Options( | ||||
| 
 | ||||
| 	// Lite node API
 | ||||
| 	ApplyIf(isLiteNode, | ||||
| 		Override(new(messagepool.Provider), messagepool.NewProviderLite), | ||||
| 		Override(new(messagesigner.MpoolNonceAPI), From(new(modules.MpoolNonceAPI))), | ||||
| 		Override(new(full.ChainModuleAPI), From(new(api.Gateway))), | ||||
| 		Override(new(full.GasModuleAPI), From(new(api.Gateway))), | ||||
| @ -343,6 +344,7 @@ var ChainNode = Options( | ||||
| 
 | ||||
| 	// Full node API / service startup
 | ||||
| 	ApplyIf(isFullNode, | ||||
| 		Override(new(messagepool.Provider), messagepool.NewProvider), | ||||
| 		Override(new(messagesigner.MpoolNonceAPI), From(new(*messagepool.MessagePool))), | ||||
| 		Override(new(full.ChainModuleAPI), From(new(full.ChainModule))), | ||||
| 		Override(new(full.GasModuleAPI), From(new(full.GasModule))), | ||||
|  | ||||
| @ -9,7 +9,6 @@ import ( | ||||
| 	"github.com/ipfs/go-blockservice" | ||||
| 	"github.com/libp2p/go-libp2p-core/host" | ||||
| 	"github.com/libp2p/go-libp2p-core/routing" | ||||
| 	pubsub "github.com/libp2p/go-libp2p-pubsub" | ||||
| 	"go.uber.org/fx" | ||||
| 	"golang.org/x/xerrors" | ||||
| 
 | ||||
| @ -59,8 +58,7 @@ func ChainBlockService(bs dtypes.ExposedBlockstore, rem dtypes.ChainBitswap) dty | ||||
| 	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) { | ||||
| 	mpp := messagepool.NewProvider(sm, ps) | ||||
| func MessagePool(lc fx.Lifecycle, mpp messagepool.Provider, ds dtypes.MetadataDS, nn dtypes.NetworkName, j journal.Journal) (*messagepool.MessagePool, error) { | ||||
| 	mp, err := messagepool.New(mpp, ds, nn, j) | ||||
| 	if err != nil { | ||||
| 		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 | ||||
| } | ||||
| 
 | ||||
| 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) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user