wallet: Add metadata to WalletAPI.WalletSign
This commit is contained in:
parent
114776f2c5
commit
f3dc730b05
@ -9,12 +9,36 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type MsgType string
|
||||||
|
const (
|
||||||
|
MTUnknown = "unknown"
|
||||||
|
|
||||||
|
// Signing message CID. MsgMeta.Extra contains raw cbor message bytes
|
||||||
|
MTChainMsg = "message"
|
||||||
|
|
||||||
|
// Signing a blockheader. signing raw cbor block bytes (MsgMeta.Extra is empty)
|
||||||
|
MTBlock = "block"
|
||||||
|
|
||||||
|
// Signing a deal proposal. signing raw cbor proposal bytes (MsgMeta.Extra is empty)
|
||||||
|
MTDealProposal = "dealproposal"
|
||||||
|
|
||||||
|
// TODO: Deals, Vouchers, VRF
|
||||||
|
)
|
||||||
|
|
||||||
|
type MsgMeta struct {
|
||||||
|
Type MsgType
|
||||||
|
|
||||||
|
// Additional data related to what is signed. Should be verifiable with the
|
||||||
|
// signed bytes (e.g. CID(Extra).Bytes() == toSign)
|
||||||
|
Extra []byte
|
||||||
|
}
|
||||||
|
|
||||||
type WalletAPI interface {
|
type WalletAPI interface {
|
||||||
WalletNew(context.Context, crypto.SigType) (address.Address, error)
|
WalletNew(context.Context, crypto.SigType) (address.Address, error)
|
||||||
WalletHas(context.Context, address.Address) (bool, error)
|
WalletHas(context.Context, address.Address) (bool, error)
|
||||||
WalletList(context.Context) ([]address.Address, error)
|
WalletList(context.Context) ([]address.Address, error)
|
||||||
|
|
||||||
WalletSign(context.Context, address.Address, []byte) (*crypto.Signature, error)
|
WalletSign(ctx context.Context, signer address.Address, toSign []byte, meta MsgMeta) (*crypto.Signature, error)
|
||||||
|
|
||||||
WalletExport(context.Context, address.Address) (*types.KeyInfo, error)
|
WalletExport(context.Context, address.Address) (*types.KeyInfo, error)
|
||||||
WalletImport(context.Context, *types.KeyInfo) (address.Address, error)
|
WalletImport(context.Context, *types.KeyInfo) (address.Address, error)
|
||||||
|
@ -366,7 +366,7 @@ type WalletStruct struct {
|
|||||||
WalletNew func(context.Context, crypto.SigType) (address.Address, error) `perm:"write"`
|
WalletNew func(context.Context, crypto.SigType) (address.Address, error) `perm:"write"`
|
||||||
WalletHas func(context.Context, address.Address) (bool, error) `perm:"write"`
|
WalletHas func(context.Context, address.Address) (bool, error) `perm:"write"`
|
||||||
WalletList func(context.Context) ([]address.Address, error) `perm:"write"`
|
WalletList func(context.Context) ([]address.Address, error) `perm:"write"`
|
||||||
WalletSign func(context.Context, address.Address, []byte) (*crypto.Signature, error) `perm:"sign"`
|
WalletSign func(context.Context, address.Address, []byte, api.MsgMeta) (*crypto.Signature, error) `perm:"sign"`
|
||||||
WalletSignMessage func(context.Context, address.Address, *types.Message) (*types.SignedMessage, error) `perm:"sign"`
|
WalletSignMessage func(context.Context, address.Address, *types.Message) (*types.SignedMessage, error) `perm:"sign"`
|
||||||
WalletExport func(context.Context, address.Address) (*types.KeyInfo, error) `perm:"admin"`
|
WalletExport func(context.Context, address.Address) (*types.KeyInfo, error) `perm:"admin"`
|
||||||
WalletImport func(context.Context, *types.KeyInfo) (address.Address, error) `perm:"admin"`
|
WalletImport func(context.Context, *types.KeyInfo) (address.Address, error) `perm:"admin"`
|
||||||
@ -1397,8 +1397,8 @@ func (c *WalletStruct) WalletList(ctx context.Context) ([]address.Address, error
|
|||||||
return c.Internal.WalletList(ctx)
|
return c.Internal.WalletList(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *WalletStruct) WalletSign(ctx context.Context, k address.Address, msg []byte) (*crypto.Signature, error) {
|
func (c *WalletStruct) WalletSign(ctx context.Context, k address.Address, msg []byte, meta api.MsgMeta) (*crypto.Signature, error) {
|
||||||
return c.Internal.WalletSign(ctx, k, msg)
|
return c.Internal.WalletSign(ctx, k, msg, meta)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *WalletStruct) WalletSignMessage(ctx context.Context, k address.Address, msg *types.Message) (*types.SignedMessage, error) {
|
func (c *WalletStruct) WalletSignMessage(ctx context.Context, k address.Address, msg *types.Message) (*types.SignedMessage, error) {
|
||||||
|
@ -374,7 +374,13 @@ func (cg *ChainGen) nextBlockProof(ctx context.Context, pts *types.TipSet, m add
|
|||||||
return nil, nil, nil, xerrors.Errorf("get miner worker: %w", err)
|
return nil, nil, nil, xerrors.Errorf("get miner worker: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
vrfout, err := ComputeVRF(ctx, cg.w.WalletSign, worker, ticketRand)
|
sf := func(ctx context.Context, a address.Address, i []byte) (*crypto.Signature, error) {
|
||||||
|
return cg.w.WalletSign(ctx, a, i, api.MsgMeta{
|
||||||
|
Type: api.MTUnknown,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
vrfout, err := ComputeVRF(ctx, sf, worker, ticketRand)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, xerrors.Errorf("compute VRF: %w", err)
|
return nil, nil, nil, xerrors.Errorf("compute VRF: %w", err)
|
||||||
}
|
}
|
||||||
@ -528,7 +534,9 @@ func getRandomMessages(cg *ChainGen) ([]*types.SignedMessage, error) {
|
|||||||
GasPremium: types.NewInt(0),
|
GasPremium: types.NewInt(0),
|
||||||
}
|
}
|
||||||
|
|
||||||
sig, err := cg.w.WalletSign(context.TODO(), cg.banker, msg.Cid().Bytes())
|
sig, err := cg.w.WalletSign(context.TODO(), cg.banker, msg.Cid().Bytes(), api.MsgMeta{
|
||||||
|
Type: api.MTUnknown, // testing
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -588,7 +596,9 @@ func (mca mca) MinerGetBaseInfo(ctx context.Context, maddr address.Address, epoc
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (mca mca) WalletSign(ctx context.Context, a address.Address, v []byte) (*crypto.Signature, error) {
|
func (mca mca) WalletSign(ctx context.Context, a address.Address, v []byte) (*crypto.Signature, error) {
|
||||||
return mca.w.WalletSign(ctx, a, v)
|
return mca.w.WalletSign(ctx, a, v, api.MsgMeta{
|
||||||
|
Type: api.MTUnknown,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
type WinningPoStProver interface {
|
type WinningPoStProver interface {
|
||||||
|
@ -15,11 +15,10 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/chain/stmgr"
|
"github.com/filecoin-project/lotus/chain/stmgr"
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
"github.com/filecoin-project/lotus/chain/vm"
|
"github.com/filecoin-project/lotus/chain/vm"
|
||||||
"github.com/filecoin-project/lotus/chain/wallet"
|
|
||||||
"github.com/filecoin-project/lotus/lib/sigs/bls"
|
"github.com/filecoin-project/lotus/lib/sigs/bls"
|
||||||
)
|
)
|
||||||
|
|
||||||
func MinerCreateBlock(ctx context.Context, sm *stmgr.StateManager, w *wallet.LocalWallet, bt *api.BlockTemplate) (*types.FullBlock, error) {
|
func MinerCreateBlock(ctx context.Context, sm *stmgr.StateManager, w api.WalletAPI, bt *api.BlockTemplate) (*types.FullBlock, error) {
|
||||||
|
|
||||||
pts, err := sm.ChainStore().LoadTipSet(bt.Parents)
|
pts, err := sm.ChainStore().LoadTipSet(bt.Parents)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -131,7 +130,9 @@ func MinerCreateBlock(ctx context.Context, sm *stmgr.StateManager, w *wallet.Loc
|
|||||||
return nil, xerrors.Errorf("failed to get signing bytes for block: %w", err)
|
return nil, xerrors.Errorf("failed to get signing bytes for block: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
sig, err := w.WalletSign(ctx, waddr, nosigbytes)
|
sig, err := w.WalletSign(ctx, waddr, nosigbytes, api.MsgMeta{
|
||||||
|
Type: api.MTBlock,
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, xerrors.Errorf("failed to sign new block: %w", err)
|
return nil, xerrors.Errorf("failed to sign new block: %w", err)
|
||||||
}
|
}
|
||||||
|
@ -61,7 +61,16 @@ func (ms *MessageSigner) SignMessage(ctx context.Context, msg *types.Message, cb
|
|||||||
|
|
||||||
// Sign the message with the nonce
|
// Sign the message with the nonce
|
||||||
msg.Nonce = nonce
|
msg.Nonce = nonce
|
||||||
sig, err := ms.wallet.WalletSign(ctx, msg.From, msg.Cid().Bytes())
|
|
||||||
|
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{
|
||||||
|
Type: api.MTChainMsg,
|
||||||
|
Extra: mb.RawData(),
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, xerrors.Errorf("failed to sign message: %w", err)
|
return nil, xerrors.Errorf("failed to sign message: %w", err)
|
||||||
}
|
}
|
||||||
|
@ -62,7 +62,7 @@ func KeyWallet(keys ...*Key) *LocalWallet {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *LocalWallet) WalletSign(ctx context.Context, addr address.Address, msg []byte) (*crypto.Signature, error) {
|
func (w *LocalWallet) WalletSign(ctx context.Context, addr address.Address, msg []byte, meta api.MsgMeta) (*crypto.Signature, error) {
|
||||||
ki, err := w.findKey(addr)
|
ki, err := w.findKey(addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -37,10 +37,10 @@ func (c *LoggedWallet) WalletList(ctx context.Context) ([]address.Address, error
|
|||||||
return c.under.WalletList(ctx)
|
return c.under.WalletList(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *LoggedWallet) WalletSign(ctx context.Context, k address.Address, msg []byte) (*crypto.Signature, error) {
|
func (c *LoggedWallet) WalletSign(ctx context.Context, k address.Address, msg []byte, meta api.MsgMeta) (*crypto.Signature, error) {
|
||||||
log.Infow("WalletSign", "address", k)
|
log.Infow("WalletSign", "address", k)
|
||||||
|
|
||||||
return c.under.WalletSign(ctx, k, msg)
|
return c.under.WalletSign(ctx, k, msg, meta)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *LoggedWallet) WalletExport(ctx context.Context, a address.Address) (*types.KeyInfo, error) {
|
func (c *LoggedWallet) WalletExport(ctx context.Context, a address.Address) (*types.KeyInfo, error) {
|
||||||
|
@ -5,6 +5,7 @@ package storageadapter
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
|
"github.com/filecoin-project/lotus/api"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-state-types/big"
|
"github.com/filecoin-project/go-state-types/big"
|
||||||
miner0 "github.com/filecoin-project/specs-actors/actors/builtin"
|
miner0 "github.com/filecoin-project/specs-actors/actors/builtin"
|
||||||
@ -422,7 +423,9 @@ func (c *ClientNodeAdapter) SignProposal(ctx context.Context, signer address.Add
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
sig, err := c.Wallet.WalletSign(ctx, signer, buf)
|
sig, err := c.Wallet.WalletSign(ctx, signer, buf, api.MsgMeta{
|
||||||
|
Type: api.MTDealProposal,
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -434,7 +437,7 @@ func (c *ClientNodeAdapter) SignProposal(ctx context.Context, signer address.Add
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *ClientNodeAdapter) GetDefaultWalletAddress(ctx context.Context) (address.Address, error) {
|
func (c *ClientNodeAdapter) GetDefaultWalletAddress(ctx context.Context) (address.Address, error) {
|
||||||
addr, err := c.Wallet.GetDefault()
|
addr, err := c.DefWallet.GetDefault()
|
||||||
return addr, err
|
return addr, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -475,7 +478,9 @@ func (c *ClientNodeAdapter) SignBytes(ctx context.Context, signer address.Addres
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
localSignature, err := c.Wallet.WalletSign(ctx, signer, b)
|
localSignature, err := c.Wallet.WalletSign(ctx, signer, b, api.MsgMeta{
|
||||||
|
Type: api.MTUnknown, // TODO: pass type here
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -5,14 +5,6 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/chain/actors/builtin"
|
|
||||||
"github.com/filecoin-project/lotus/chain/actors/policy"
|
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/chain/actors/builtin/verifreg"
|
|
||||||
|
|
||||||
"github.com/filecoin-project/go-state-types/dline"
|
|
||||||
"github.com/filecoin-project/go-state-types/network"
|
|
||||||
|
|
||||||
cid "github.com/ipfs/go-cid"
|
cid "github.com/ipfs/go-cid"
|
||||||
cbor "github.com/ipfs/go-ipld-cbor"
|
cbor "github.com/ipfs/go-ipld-cbor"
|
||||||
"go.uber.org/fx"
|
"go.uber.org/fx"
|
||||||
@ -22,14 +14,19 @@ import (
|
|||||||
"github.com/filecoin-project/go-bitfield"
|
"github.com/filecoin-project/go-bitfield"
|
||||||
"github.com/filecoin-project/go-state-types/abi"
|
"github.com/filecoin-project/go-state-types/abi"
|
||||||
"github.com/filecoin-project/go-state-types/big"
|
"github.com/filecoin-project/go-state-types/big"
|
||||||
|
"github.com/filecoin-project/go-state-types/dline"
|
||||||
|
"github.com/filecoin-project/go-state-types/network"
|
||||||
"github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper"
|
"github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/api"
|
"github.com/filecoin-project/lotus/api"
|
||||||
|
"github.com/filecoin-project/lotus/chain/actors/builtin"
|
||||||
"github.com/filecoin-project/lotus/chain/actors/builtin/market"
|
"github.com/filecoin-project/lotus/chain/actors/builtin/market"
|
||||||
"github.com/filecoin-project/lotus/chain/actors/builtin/miner"
|
"github.com/filecoin-project/lotus/chain/actors/builtin/miner"
|
||||||
"github.com/filecoin-project/lotus/chain/actors/builtin/multisig"
|
"github.com/filecoin-project/lotus/chain/actors/builtin/multisig"
|
||||||
"github.com/filecoin-project/lotus/chain/actors/builtin/power"
|
"github.com/filecoin-project/lotus/chain/actors/builtin/power"
|
||||||
"github.com/filecoin-project/lotus/chain/actors/builtin/reward"
|
"github.com/filecoin-project/lotus/chain/actors/builtin/reward"
|
||||||
|
"github.com/filecoin-project/lotus/chain/actors/builtin/verifreg"
|
||||||
|
"github.com/filecoin-project/lotus/chain/actors/policy"
|
||||||
"github.com/filecoin-project/lotus/chain/beacon"
|
"github.com/filecoin-project/lotus/chain/beacon"
|
||||||
"github.com/filecoin-project/lotus/chain/gen"
|
"github.com/filecoin-project/lotus/chain/gen"
|
||||||
"github.com/filecoin-project/lotus/chain/state"
|
"github.com/filecoin-project/lotus/chain/state"
|
||||||
@ -47,7 +44,8 @@ type StateAPI struct {
|
|||||||
|
|
||||||
// TODO: the wallet here is only needed because we have the MinerCreateBlock
|
// TODO: the wallet here is only needed because we have the MinerCreateBlock
|
||||||
// API attached to the state API. It probably should live somewhere better
|
// API attached to the state API. It probably should live somewhere better
|
||||||
Wallet *wallet.LocalWallet
|
Wallet api.WalletAPI
|
||||||
|
DefWallet wallet.Default
|
||||||
|
|
||||||
ProofVerifier ffiwrapper.Verifier
|
ProofVerifier ffiwrapper.Verifier
|
||||||
StateManager *stmgr.StateManager
|
StateManager *stmgr.StateManager
|
||||||
|
@ -49,9 +49,15 @@ func (a *WalletAPI) WalletSignMessage(ctx context.Context, k address.Address, ms
|
|||||||
return nil, xerrors.Errorf("failed to resolve ID address: %w", keyAddr)
|
return nil, xerrors.Errorf("failed to resolve ID address: %w", keyAddr)
|
||||||
}
|
}
|
||||||
|
|
||||||
mcid := msg.Cid()
|
mb, err := msg.ToStorageBlock()
|
||||||
|
if err != nil {
|
||||||
|
return nil, xerrors.Errorf("serializing message: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
sig, err := a.WalletAPI.WalletSign(ctx, k, mcid.Bytes())
|
sig, err := a.WalletAPI.WalletSign(ctx, k, mb.Cid().Bytes(), api.MsgMeta{
|
||||||
|
Type: api.MTChainMsg,
|
||||||
|
Extra: mb.RawData(),
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, xerrors.Errorf("failed to sign message: %w", err)
|
return nil, xerrors.Errorf("failed to sign message: %w", err)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user