diff options
author | Jeffrey Wilcke <jeffrey@ethereum.org> | 2016-11-14 22:59:31 +0800 |
---|---|---|
committer | Jeffrey Wilcke <jeffrey@ethereum.org> | 2016-11-14 22:59:31 +0800 |
commit | 6c9c1e6712d684e782a8920dac0173b49257fa1f (patch) | |
tree | 2df35d4512681aa600e0270e176829bcca49482d /core/types/transaction_signing.go | |
parent | ca73dea3b9bcdf3b5424b5c48c70817439e2e304 (diff) | |
download | go-tangerine-6c9c1e6712d684e782a8920dac0173b49257fa1f.tar go-tangerine-6c9c1e6712d684e782a8920dac0173b49257fa1f.tar.gz go-tangerine-6c9c1e6712d684e782a8920dac0173b49257fa1f.tar.bz2 go-tangerine-6c9c1e6712d684e782a8920dac0173b49257fa1f.tar.lz go-tangerine-6c9c1e6712d684e782a8920dac0173b49257fa1f.tar.xz go-tangerine-6c9c1e6712d684e782a8920dac0173b49257fa1f.tar.zst go-tangerine-6c9c1e6712d684e782a8920dac0173b49257fa1f.zip |
core, core/types: refactored tx chain id checking
Refactored explicit chain id checking in to the Sender deriviation method
Diffstat (limited to 'core/types/transaction_signing.go')
-rw-r--r-- | core/types/transaction_signing.go | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/core/types/transaction_signing.go b/core/types/transaction_signing.go index 48209e2d8..7d571643f 100644 --- a/core/types/transaction_signing.go +++ b/core/types/transaction_signing.go @@ -21,13 +21,14 @@ import ( "errors" "fmt" "math/big" - "reflect" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/params" ) +var ErrInvalidChainId = errors.New("invalid chaid id for signer") + // sigCache is used to cache the derived sender and contains // the signer used to derive it. type sigCache struct { @@ -75,7 +76,7 @@ func Sender(signer Signer, tx *Transaction) (common.Address, error) { // If the signer used to derive from in a previous // call is not the same as used current, invalidate // the cache. - if reflect.TypeOf(sigCache.signer) == reflect.TypeOf(signer) { + if sigCache.signer.Equal(signer) { return sigCache.from, nil } } @@ -104,6 +105,8 @@ type Signer interface { SignECDSA(tx *Transaction, prv *ecdsa.PrivateKey) (*Transaction, error) // WithSignature returns a copy of the transaction with the given signature WithSignature(tx *Transaction, sig []byte) (*Transaction, error) + // Checks for equality on the signers + Equal(Signer) bool } // EIP155Transaction implements TransactionInterface using the @@ -121,6 +124,11 @@ func NewEIP155Signer(chainId *big.Int) EIP155Signer { } } +func (s EIP155Signer) Equal(s2 Signer) bool { + eip155, ok := s2.(EIP155Signer) + return ok && eip155.chainId.Cmp(s.chainId) == 0 +} + func (s EIP155Signer) SignECDSA(tx *Transaction, prv *ecdsa.PrivateKey) (*Transaction, error) { return SignECDSA(s, tx, prv) } @@ -131,6 +139,10 @@ func (s EIP155Signer) PublicKey(tx *Transaction) ([]byte, error) { return (HomesteadSigner{}).PublicKey(tx) } + if tx.ChainId().Cmp(s.chainId) != 0 { + return nil, ErrInvalidChainId + } + V := normaliseV(s, tx.data.V) if !crypto.ValidateSignatureValues(V, tx.data.R, tx.data.S, true) { return nil, ErrInvalidSig @@ -200,6 +212,11 @@ func (s EIP155Signer) SigECDSA(tx *Transaction, prv *ecdsa.PrivateKey) (*Transac // homestead rules. type HomesteadSigner struct{ FrontierSigner } +func (s HomesteadSigner) Equal(s2 Signer) bool { + _, ok := s2.(HomesteadSigner) + return ok +} + // WithSignature returns a new transaction with the given snature. // This snature needs to be formatted as described in the yellow paper (v+27). func (hs HomesteadSigner) WithSignature(tx *Transaction, sig []byte) (*Transaction, error) { @@ -251,6 +268,11 @@ func (hs HomesteadSigner) PublicKey(tx *Transaction) ([]byte, error) { type FrontierSigner struct{} +func (s FrontierSigner) Equal(s2 Signer) bool { + _, ok := s2.(FrontierSigner) + return ok +} + // WithSignature returns a new transaction with the given snature. // This snature needs to be formatted as described in the yellow paper (v+27). func (fs FrontierSigner) WithSignature(tx *Transaction, sig []byte) (*Transaction, error) { |