forked from cerc-io/plugeth
accounts/external: convert signature v value to 0/1 (#20997)
This fixes an issue with clef, which already transforms the signature to use the legacy 27/28 encoding. Fixes #20994
This commit is contained in:
parent
c43be6cf87
commit
510b6f90db
@ -129,6 +129,8 @@ type Wallet interface {
|
|||||||
// about which fields or actions are needed. The user may retry by providing
|
// about which fields or actions are needed. The user may retry by providing
|
||||||
// the needed details via SignHashWithPassphrase, or by other means (e.g. unlock
|
// the needed details via SignHashWithPassphrase, or by other means (e.g. unlock
|
||||||
// the account in a keystore).
|
// the account in a keystore).
|
||||||
|
//
|
||||||
|
// This method should return the signature in 'canonical' format, with v 0 or 1
|
||||||
SignText(account Account, text []byte) ([]byte, error)
|
SignText(account Account, text []byte) ([]byte, error)
|
||||||
|
|
||||||
// SignTextWithPassphrase is identical to Signtext, but also takes a password
|
// SignTextWithPassphrase is identical to Signtext, but also takes a password
|
||||||
|
11
accounts/external/backend.go
vendored
11
accounts/external/backend.go
vendored
@ -175,15 +175,20 @@ func (api *ExternalSigner) SignData(account accounts.Account, mimeType string, d
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (api *ExternalSigner) SignText(account accounts.Account, text []byte) ([]byte, error) {
|
func (api *ExternalSigner) SignText(account accounts.Account, text []byte) ([]byte, error) {
|
||||||
var res hexutil.Bytes
|
var signature hexutil.Bytes
|
||||||
var signAddress = common.NewMixedcaseAddress(account.Address)
|
var signAddress = common.NewMixedcaseAddress(account.Address)
|
||||||
if err := api.client.Call(&res, "account_signData",
|
if err := api.client.Call(&signature, "account_signData",
|
||||||
accounts.MimetypeTextPlain,
|
accounts.MimetypeTextPlain,
|
||||||
&signAddress, // Need to use the pointer here, because of how MarshalJSON is defined
|
&signAddress, // Need to use the pointer here, because of how MarshalJSON is defined
|
||||||
hexutil.Encode(text)); err != nil {
|
hexutil.Encode(text)); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return res, nil
|
if signature[64] == 27 || signature[64] == 28 {
|
||||||
|
// If clef is used as a backend, it may already have transformed
|
||||||
|
// the signature to ethereum-type signature.
|
||||||
|
signature[64] -= 27 // Transform V from Ethereum-legacy to 0/1
|
||||||
|
}
|
||||||
|
return signature, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (api *ExternalSigner) SignTx(account accounts.Account, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) {
|
func (api *ExternalSigner) SignTx(account accounts.Account, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) {
|
||||||
|
Loading…
Reference in New Issue
Block a user