diff --git a/api/api.go b/api/api.go index e14eed76c..ee6c82661 100644 --- a/api/api.go +++ b/api/api.go @@ -58,7 +58,7 @@ type FullNode interface { MpoolPending(context.Context, *types.TipSet) ([]*types.SignedMessage, error) MpoolPush(context.Context, *types.SignedMessage) error - MpoolPushMessage(context.Context, *types.Message) error // get nonce, sign, push + MpoolPushMessage(context.Context, *types.Message) (*types.SignedMessage, error) // get nonce, sign, push MpoolGetNonce(context.Context, address.Address) (uint64, error) // FullNodeStruct diff --git a/api/struct.go b/api/struct.go index 809925ae3..82f033ce6 100644 --- a/api/struct.go +++ b/api/struct.go @@ -50,7 +50,7 @@ type FullNodeStruct struct { MpoolPending func(context.Context, *types.TipSet) ([]*types.SignedMessage, error) `perm:"read"` MpoolPush func(context.Context, *types.SignedMessage) error `perm:"write"` - MpoolPushMessage func(context.Context, *types.Message) error `perm:"sign"` + MpoolPushMessage func(context.Context, *types.Message) (*types.SignedMessage, error) `perm:"sign"` MinerRegister func(context.Context, address.Address) error `perm:"admin"` MinerUnregister func(context.Context, address.Address) error `perm:"admin"` @@ -194,7 +194,7 @@ func (c *FullNodeStruct) MpoolPush(ctx context.Context, smsg *types.SignedMessag return c.Internal.MpoolPush(ctx, smsg) } -func (c *FullNodeStruct) MpoolPushMessage(ctx context.Context, msg *types.Message) error { +func (c *FullNodeStruct) MpoolPushMessage(ctx context.Context, msg *types.Message) (*types.SignedMessage, error) { return c.Internal.MpoolPushMessage(ctx, msg) } diff --git a/chain/messagepool.go b/chain/messagepool.go index 930d57b59..bbffd45a5 100644 --- a/chain/messagepool.go +++ b/chain/messagepool.go @@ -117,30 +117,30 @@ func (mp *MessagePool) getNonceLocked(addr address.Address) (uint64, error) { return act.Nonce, nil } -func (mp *MessagePool) PushWithNonce(addr address.Address, cb func(uint64) (*types.SignedMessage, error)) error { +func (mp *MessagePool) PushWithNonce(addr address.Address, cb func(uint64) (*types.SignedMessage, error)) (*types.SignedMessage, error) { mp.lk.Lock() defer mp.lk.Unlock() nonce, err := mp.getNonceLocked(addr) if err != nil { - return err + return nil, err } msg, err := cb(nonce) if err != nil { - return err + return nil, err } msgb, err := msg.Serialize() if err != nil { - return err + return nil, err } if err := mp.addLocked(msg); err != nil { - return err + return nil, err } - return mp.ps.Publish("/fil/messages", msgb) + return msg, mp.ps.Publish("/fil/messages", msgb) } func (mp *MessagePool) Remove(from address.Address, nonce uint64) { diff --git a/cli/client.go b/cli/client.go index e108cde6f..625e32d3b 100644 --- a/cli/client.go +++ b/cli/client.go @@ -2,7 +2,6 @@ package cli import ( "fmt" - "github.com/filecoin-project/go-lotus/api" "strconv" "github.com/ipfs/go-cid" diff --git a/cli/send.go b/cli/send.go index 21a4d84e0..5ed9b10e8 100644 --- a/cli/send.go +++ b/cli/send.go @@ -2,9 +2,8 @@ package cli import ( "fmt" - "github.com/filecoin-project/go-lotus/chain/address" - types "github.com/filecoin-project/go-lotus/chain/types" + "github.com/filecoin-project/go-lotus/chain/types" "gopkg.in/urfave/cli.v2" ) @@ -56,39 +55,19 @@ var sendCmd = &cli.Command{ fromAddr = addr } - nonce, err := api.MpoolGetNonce(ctx, fromAddr) - if err != nil { - return err - } - msg := &types.Message{ From: fromAddr, To: toAddr, Value: val, - Nonce: nonce, GasLimit: types.NewInt(1000), GasPrice: types.NewInt(0), } - sermsg, err := msg.Serialize() + _, err = api.MpoolPushMessage(ctx, msg) if err != nil { return err } - sig, err := api.WalletSign(ctx, fromAddr, sermsg) - if err != nil { - return err - } - - smsg := &types.SignedMessage{ - Message: *msg, - Signature: *sig, - } - - if err := api.MpoolPush(ctx, smsg); err != nil { - return err - } - return nil }, } diff --git a/cmd/lotus-storage-miner/init.go b/cmd/lotus-storage-miner/init.go index bf81306e2..ef9bdbfdf 100644 --- a/cmd/lotus-storage-miner/init.go +++ b/cmd/lotus-storage-miner/init.go @@ -166,31 +166,21 @@ func configureStorageMiner(ctx context.Context, api api.FullNode, addr address.A return err } - nonce, err := api.MpoolGetNonce(ctx, waddr) - if err != nil { - return err - } - msg := &types.Message{ To: addr, From: waddr, Method: actors.MAMethods.UpdatePeerID, Params: enc, - Nonce: nonce, Value: types.NewInt(0), GasPrice: types.NewInt(0), GasLimit: types.NewInt(1000000), } - smsg, err := api.WalletSignMessage(ctx, waddr, msg) + smsg, err := api.MpoolPushMessage(ctx, msg) if err != nil { return err } - if err := api.MpoolPush(ctx, smsg); err != nil { - return err - } - log.Info("Waiting for message: ", smsg.Cid()) ret, err := api.ChainWaitMsg(ctx, smsg.Cid()) if err != nil { @@ -212,11 +202,6 @@ func createStorageMiner(ctx context.Context, api api.FullNode, peerid peer.ID) ( return address.Undef, err } - nonce, err := api.MpoolGetNonce(ctx, defOwner) - if err != nil { - return address.Undef, err - } - k, err := api.WalletNew(ctx, types.KTBLS) if err != nil { return address.Undef, err @@ -234,10 +219,9 @@ func createStorageMiner(ctx context.Context, api api.FullNode, peerid peer.ID) ( return address.Undef, err } - createStorageMinerMsg := types.Message{ + createStorageMinerMsg := &types.Message{ To: actors.StorageMarketAddress, From: defOwner, - Nonce: nonce, Value: collateral, Method: actors.SMAMethods.CreateStorageMiner, @@ -247,30 +231,12 @@ func createStorageMiner(ctx context.Context, api api.FullNode, peerid peer.ID) ( GasPrice: types.NewInt(0), } - unsigned, err := createStorageMinerMsg.Serialize() - if err != nil { - return address.Undef, err - } - - log.Info("Signing StorageMarket.CreateStorageMiner") - - sig, err := api.WalletSign(ctx, defOwner, unsigned) - if err != nil { - return address.Undef, err - } - - signed := &types.SignedMessage{ - Message: createStorageMinerMsg, - Signature: *sig, - } - - log.Infof("Pushing %s to Mpool", signed.Cid()) - - err = api.MpoolPush(ctx, signed) + signed, err := api.MpoolPushMessage(ctx, createStorageMinerMsg) if err != nil { return address.Undef, err } + log.Infof("Pushed StorageMarket.CreateStorageMiner, %s to Mpool", signed.Cid()) log.Infof("Waiting for confirmation") mw, err := api.ChainWaitMsg(ctx, signed.Cid()) diff --git a/node/impl/full/mpool.go b/node/impl/full/mpool.go index bbe7436da..ee9613b88 100644 --- a/node/impl/full/mpool.go +++ b/node/impl/full/mpool.go @@ -28,9 +28,9 @@ func (a *MpoolAPI) MpoolPush(ctx context.Context, smsg *types.SignedMessage) err return a.Mpool.Push(smsg) } -func (a *MpoolAPI) MpoolPushMessage(ctx context.Context, msg *types.Message) error { +func (a *MpoolAPI) MpoolPushMessage(ctx context.Context, msg *types.Message) (*types.SignedMessage, error) { if msg.Nonce != 0 { - return xerrors.Errorf("MpoolPushMessage expects message nonce to be 0, was %d", msg.Nonce) + return nil, xerrors.Errorf("MpoolPushMessage expects message nonce to be 0, was %d", msg.Nonce) } return a.Mpool.PushWithNonce(msg.From, func(nonce uint64) (*types.SignedMessage, error) { diff --git a/paych/simple.go b/paych/simple.go index 51487dd16..018604b6c 100644 --- a/paych/simple.go +++ b/paych/simple.go @@ -17,36 +17,29 @@ func (pm *Manager) createPaych(ctx context.Context, from, to address.Address, am return address.Undef, cid.Undef, aerr } - nonce, err := pm.mpool.MpoolGetNonce(ctx, from) - if err != nil { - return address.Undef, cid.Undef, err - } - - enc, err := actors.SerializeParams(&actors.ExecParams{ + enc, aerr := actors.SerializeParams(&actors.ExecParams{ Params: params, Code: actors.PaymentChannelActorCodeCid, }) + if aerr != nil { + return address.Undef, cid.Undef, aerr + } msg := &types.Message{ To: actors.InitActorAddress, From: from, Value: amt, - Nonce: nonce, Method: actors.IAMethods.Exec, Params: enc, GasLimit: types.NewInt(1000000), GasPrice: types.NewInt(0), } - smsg, err := pm.wallet.WalletSignMessage(ctx, from, msg) + smsg, err := pm.mpool.MpoolPushMessage(ctx, msg) if err != nil { return address.Undef, cid.Undef, err } - if err := pm.mpool.MpoolPush(ctx, smsg); err != nil { - return address.Undef, cid.Undef, err - } - mcid := smsg.Cid() // TODO: wait outside the store lock! @@ -78,30 +71,20 @@ func (pm *Manager) createPaych(ctx context.Context, from, to address.Address, am } func (pm *Manager) addFunds(ctx context.Context, ch address.Address, from address.Address, amt types.BigInt) error { - nonce, err := pm.mpool.MpoolGetNonce(ctx, from) - if err != nil { - return err - } - msg := &types.Message{ To: ch, From: from, Value: amt, - Nonce: nonce, Method: 0, GasLimit: types.NewInt(1000000), GasPrice: types.NewInt(0), } - smsg, err := pm.wallet.WalletSignMessage(ctx, from, msg) + smsg, err := pm.mpool.MpoolPushMessage(ctx, msg) if err != nil { return err } - if err := pm.mpool.MpoolPush(ctx, smsg); err != nil { - return err - } - mwait, err := pm.chain.ChainWaitMsg(ctx, smsg.Cid()) // TODO: wait outside the store lock! if err != nil { return err