fix: msg signing with delegated keys and send cli changes (#10056)
* fix msg signing with delegated keys and send cli changes * make gen and docsgen * address comments
This commit is contained in:
parent
2335bed58a
commit
522e96f016
@ -13,10 +13,13 @@ import (
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/filecoin-project/go-address"
|
||||
"github.com/filecoin-project/go-state-types/crypto"
|
||||
|
||||
"github.com/filecoin-project/lotus/api"
|
||||
"github.com/filecoin-project/lotus/chain/messagepool"
|
||||
"github.com/filecoin-project/lotus/chain/types"
|
||||
"github.com/filecoin-project/lotus/chain/types/ethtypes"
|
||||
"github.com/filecoin-project/lotus/chain/wallet/key"
|
||||
"github.com/filecoin-project/lotus/node/modules/dtypes"
|
||||
)
|
||||
|
||||
@ -66,15 +69,24 @@ func (ms *MessageSigner) SignMessage(ctx context.Context, msg *types.Message, sp
|
||||
// Sign the message with the nonce
|
||||
msg.Nonce = nonce
|
||||
|
||||
keyInfo, err := ms.wallet.WalletExport(ctx, msg.From)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
sb, err := SigningBytes(msg, key.ActSigType(keyInfo.Type))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
mb, err := msg.ToStorageBlock()
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("serializing message: %w", err)
|
||||
}
|
||||
|
||||
sig, err := ms.wallet.WalletSign(ctx, msg.From, mb.Cid().Bytes(), api.MsgMeta{
|
||||
sig, err := ms.wallet.WalletSign(ctx, msg.From, sb, api.MsgMeta{
|
||||
Type: api.MTChainMsg,
|
||||
Extra: mb.RawData(),
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to sign message: %w, addr=%s", err, msg.From)
|
||||
}
|
||||
@ -187,3 +199,19 @@ func (ms *MessageSigner) SaveNonce(ctx context.Context, addr address.Address, no
|
||||
func (ms *MessageSigner) dstoreKey(addr address.Address) datastore.Key {
|
||||
return datastore.KeyWithNamespaces([]string{dsKeyActorNonce, addr.String()})
|
||||
}
|
||||
|
||||
func SigningBytes(msg *types.Message, sigType crypto.SigType) ([]byte, error) {
|
||||
if sigType == crypto.SigTypeDelegated {
|
||||
txArgs, err := ethtypes.EthTxArgsFromMessage(msg)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to reconstruct eth transaction: %w", err)
|
||||
}
|
||||
rlpEncodedMsg, err := txArgs.ToRlpUnsignedMsg()
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to repack eth rlp message: %w", err)
|
||||
}
|
||||
return rlpEncodedMsg, nil
|
||||
}
|
||||
|
||||
return msg.Cid().Bytes(), nil
|
||||
}
|
||||
|
17
cli/send.go
17
cli/send.go
@ -13,6 +13,7 @@ import (
|
||||
|
||||
"github.com/filecoin-project/lotus/chain/actors/builtin"
|
||||
"github.com/filecoin-project/lotus/chain/types"
|
||||
"github.com/filecoin-project/lotus/chain/types/ethtypes"
|
||||
)
|
||||
|
||||
var sendCmd = &cli.Command{
|
||||
@ -24,6 +25,10 @@ var sendCmd = &cli.Command{
|
||||
Name: "from",
|
||||
Usage: "optionally specify the account to send funds from",
|
||||
},
|
||||
&cli.StringFlag{
|
||||
Name: "from-eth-addr",
|
||||
Usage: "optionally specify the eth addr to send funds from",
|
||||
},
|
||||
&cli.StringFlag{
|
||||
Name: "gas-premium",
|
||||
Usage: "specify gas price to use in AttoFIL",
|
||||
@ -98,6 +103,18 @@ var sendCmd = &cli.Command{
|
||||
}
|
||||
|
||||
params.From = addr
|
||||
} else if from := cctx.String("from-eth-addr"); from != "" {
|
||||
eaddr, err := ethtypes.ParseEthAddress(from)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
faddr, err := eaddr.ToFilecoinAddress()
|
||||
if err != nil {
|
||||
fmt.Println("error on conversion to faddr")
|
||||
return err
|
||||
}
|
||||
fmt.Println("f4 addr: ", faddr)
|
||||
params.From = faddr
|
||||
}
|
||||
|
||||
if cctx.IsSet("gas-premium") {
|
||||
|
@ -183,6 +183,7 @@ CATEGORY:
|
||||
OPTIONS:
|
||||
--force Deprecated: use global 'force-send' (default: false)
|
||||
--from value optionally specify the account to send funds from
|
||||
--from-eth-addr value optionally specify the eth addr to send funds from
|
||||
--gas-feecap value specify gas fee cap to use in AttoFIL (default: "0")
|
||||
--gas-limit value specify gas limit (default: 0)
|
||||
--gas-premium value specify gas price to use in AttoFIL (default: "0")
|
||||
|
@ -68,7 +68,7 @@ func (delegatedSigner) Verify(sig []byte, a address.Address, msg []byte) error {
|
||||
}
|
||||
|
||||
if maybeaddr != a {
|
||||
return fmt.Errorf("signature did not match")
|
||||
return fmt.Errorf("signature did not match maybeaddr: %s, signer: %s", maybeaddr, a)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
@ -11,9 +11,11 @@ import (
|
||||
"github.com/filecoin-project/go-state-types/crypto"
|
||||
|
||||
"github.com/filecoin-project/lotus/api"
|
||||
"github.com/filecoin-project/lotus/chain/messagesigner"
|
||||
"github.com/filecoin-project/lotus/chain/stmgr"
|
||||
"github.com/filecoin-project/lotus/chain/types"
|
||||
"github.com/filecoin-project/lotus/chain/wallet"
|
||||
"github.com/filecoin-project/lotus/chain/wallet/key"
|
||||
"github.com/filecoin-project/lotus/lib/sigs"
|
||||
)
|
||||
|
||||
@ -51,12 +53,20 @@ func (a *WalletAPI) WalletSignMessage(ctx context.Context, k address.Address, ms
|
||||
return nil, xerrors.Errorf("failed to resolve ID address: %w", keyAddr)
|
||||
}
|
||||
|
||||
keyInfo, err := a.Wallet.WalletExport(ctx, k)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
sb, err := messagesigner.SigningBytes(msg, key.ActSigType(keyInfo.Type))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
mb, err := msg.ToStorageBlock()
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("serializing message: %w", err)
|
||||
}
|
||||
|
||||
sig, err := a.Wallet.WalletSign(ctx, keyAddr, mb.Cid().Bytes(), api.MsgMeta{
|
||||
sig, err := a.Wallet.WalletSign(ctx, keyAddr, sb, api.MsgMeta{
|
||||
Type: api.MTChainMsg,
|
||||
Extra: mb.RawData(),
|
||||
})
|
||||
|
Loading…
Reference in New Issue
Block a user