core/types: more extensible tx signing

Having just a single return point in methods that build signers makes it
easier for forks of go ethereum to add their own signers that delegate
to the underlying signer chain, since they can intercept the signer
chain at a single point.
This commit is contained in:
Piers Powlesland 2024-08-30 11:49:45 +01:00
parent e9467eec1c
commit 4f6ffd0a48

View file

@ -64,21 +64,20 @@ func MakeSigner(config *params.ChainConfig, blockNumber *big.Int, blockTime uint
// Use this in transaction-handling code where the current block number is unknown. If you // Use this in transaction-handling code where the current block number is unknown. If you
// have the current block number available, use MakeSigner instead. // have the current block number available, use MakeSigner instead.
func LatestSigner(config *params.ChainConfig) Signer { func LatestSigner(config *params.ChainConfig) Signer {
var signer Signer = HomesteadSigner{}
if config.ChainID != nil { if config.ChainID != nil {
if config.CancunTime != nil { switch {
return NewCancunSigner(config.ChainID) case config.CancunTime != nil:
} signer = NewCancunSigner(config.ChainID)
if config.LondonBlock != nil { case config.LondonBlock != nil:
return NewLondonSigner(config.ChainID) signer = NewLondonSigner(config.ChainID)
} case config.BerlinBlock != nil:
if config.BerlinBlock != nil { signer = NewEIP2930Signer(config.ChainID)
return NewEIP2930Signer(config.ChainID) case config.EIP155Block != nil:
} signer = NewEIP155Signer(config.ChainID)
if config.EIP155Block != nil {
return NewEIP155Signer(config.ChainID)
} }
} }
return HomesteadSigner{} return signer
} }
// LatestSignerForChainID returns the 'most permissive' Signer available. Specifically, // LatestSignerForChainID returns the 'most permissive' Signer available. Specifically,
@ -89,10 +88,11 @@ func LatestSigner(config *params.ChainConfig) Signer {
// configuration are unknown. If you have a ChainConfig, use LatestSigner instead. // configuration are unknown. If you have a ChainConfig, use LatestSigner instead.
// If you have a ChainConfig and know the current block number, use MakeSigner instead. // If you have a ChainConfig and know the current block number, use MakeSigner instead.
func LatestSignerForChainID(chainID *big.Int) Signer { func LatestSignerForChainID(chainID *big.Int) Signer {
if chainID == nil { var signer Signer = HomesteadSigner{}
return HomesteadSigner{} if chainID != nil {
signer = NewCancunSigner(chainID)
} }
return NewCancunSigner(chainID) return signer
} }
// SignTx signs the transaction using the given signer and private key. // SignTx signs the transaction using the given signer and private key.