From 0126d014351bc4f58e2d7e6564a054fb80f87153 Mon Sep 17 00:00:00 2001 From: bas-vk Date: Fri, 20 Jan 2017 23:32:16 +0100 Subject: [PATCH] types: bugfix invalid V derivation on tx json unmarshal (#3594) --- core/types/transaction.go | 3 ++- core/types/transaction_signing.go | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/core/types/transaction.go b/core/types/transaction.go index e610671d3..0b6d24268 100644 --- a/core/types/transaction.go +++ b/core/types/transaction.go @@ -198,7 +198,8 @@ func (tx *Transaction) UnmarshalJSON(input []byte) error { var V byte if isProtectedV((*big.Int)(dec.V)) { - V = byte((new(big.Int).Sub((*big.Int)(dec.V), deriveChainId((*big.Int)(dec.V))).Uint64()) - 35) + chainId := deriveChainId((*big.Int)(dec.V)).Uint64() + V = byte(dec.V.ToInt().Uint64() - 35 - 2*chainId) } else { V = byte(((*big.Int)(dec.V)).Uint64() - 27) } diff --git a/core/types/transaction_signing.go b/core/types/transaction_signing.go index 4ebc789a5..7d7b63e9f 100644 --- a/core/types/transaction_signing.go +++ b/core/types/transaction_signing.go @@ -160,7 +160,7 @@ func (s EIP155Signer) PublicKey(tx *Transaction) ([]byte, error) { // needs to be in the [R || S || V] format where V is 0 or 1. func (s EIP155Signer) WithSignature(tx *Transaction, sig []byte) (*Transaction, error) { if len(sig) != 65 { - panic(fmt.Sprintf("wrong size for snature: got %d, want 65", len(sig))) + panic(fmt.Sprintf("wrong size for signature: got %d, want 65", len(sig))) } cpy := &Transaction{data: tx.data}