core, eth/downloader: validate blobtx.To at serialization time (#27393)

This commit is contained in:
Péter Szilágyi 2023-05-31 13:08:15 +03:00 committed by GitHub
parent 495692c9db
commit 008086f935
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 8 additions and 13 deletions

View File

@ -89,9 +89,6 @@ func (v *BlockValidator) ValidateBody(block *types.Block) error {
// Validate the data blobs individually too // Validate the data blobs individually too
if tx.Type() == types.BlobTxType { if tx.Type() == types.BlobTxType {
if tx.To() == nil {
return errors.New("contract creation attempt by blob transaction") // TODO(karalabe): Why not make the field non-nil-able
}
if len(tx.BlobHashes()) == 0 { if len(tx.BlobHashes()) == 0 {
return errors.New("no-blob blob transaction present in block body") return errors.New("no-blob blob transaction present in block body")
} }

View File

@ -130,7 +130,7 @@ var (
}), }),
// EIP-4844 transactions. // EIP-4844 transactions.
NewTx(&BlobTx{ NewTx(&BlobTx{
To: &to6, To: to6,
Nonce: 6, Nonce: 6,
Value: uint256.NewInt(6), Value: uint256.NewInt(6),
Gas: 6, Gas: 6,
@ -139,7 +139,7 @@ var (
BlobFeeCap: uint256.NewInt(100066), BlobFeeCap: uint256.NewInt(100066),
}), }),
NewTx(&BlobTx{ NewTx(&BlobTx{
To: &to7, To: to7,
Nonce: 7, Nonce: 7,
Value: uint256.NewInt(7), Value: uint256.NewInt(7),
Gas: 7, Gas: 7,

View File

@ -290,9 +290,10 @@ func (tx *Transaction) UnmarshalJSON(input []byte) error {
return errors.New("missing required field 'nonce' in transaction") return errors.New("missing required field 'nonce' in transaction")
} }
itx.Nonce = uint64(*dec.Nonce) itx.Nonce = uint64(*dec.Nonce)
if dec.To != nil { if dec.To == nil {
itx.To = dec.To return errors.New("missing required field 'to' in transaction")
} }
itx.To = *dec.To
if dec.Gas == nil { if dec.Gas == nil {
return errors.New("missing required field 'gas' for txdata") return errors.New("missing required field 'gas' for txdata")
} }

View File

@ -31,7 +31,7 @@ type BlobTx struct {
GasTipCap *uint256.Int // a.k.a. maxPriorityFeePerGas GasTipCap *uint256.Int // a.k.a. maxPriorityFeePerGas
GasFeeCap *uint256.Int // a.k.a. maxFeePerGas GasFeeCap *uint256.Int // a.k.a. maxFeePerGas
Gas uint64 Gas uint64
To *common.Address `rlp:"nil"` // nil means contract creation To common.Address
Value *uint256.Int Value *uint256.Int
Data []byte Data []byte
AccessList AccessList AccessList AccessList
@ -48,7 +48,7 @@ type BlobTx struct {
func (tx *BlobTx) copy() TxData { func (tx *BlobTx) copy() TxData {
cpy := &BlobTx{ cpy := &BlobTx{
Nonce: tx.Nonce, Nonce: tx.Nonce,
To: copyAddressPtr(tx.To), To: tx.To,
Data: common.CopyBytes(tx.Data), Data: common.CopyBytes(tx.Data),
Gas: tx.Gas, Gas: tx.Gas,
// These are copied below. // These are copied below.
@ -104,7 +104,7 @@ func (tx *BlobTx) gasTipCap() *big.Int { return tx.GasTipCap.ToBig() }
func (tx *BlobTx) gasPrice() *big.Int { return tx.GasFeeCap.ToBig() } func (tx *BlobTx) gasPrice() *big.Int { return tx.GasFeeCap.ToBig() }
func (tx *BlobTx) value() *big.Int { return tx.Value.ToBig() } func (tx *BlobTx) value() *big.Int { return tx.Value.ToBig() }
func (tx *BlobTx) nonce() uint64 { return tx.Nonce } func (tx *BlobTx) nonce() uint64 { return tx.Nonce }
func (tx *BlobTx) to() *common.Address { return tx.To } func (tx *BlobTx) to() *common.Address { tmp := tx.To; return &tmp }
func (tx *BlobTx) blobGas() uint64 { return params.BlobTxDataGasPerBlob * uint64(len(tx.BlobHashes)) } func (tx *BlobTx) blobGas() uint64 { return params.BlobTxDataGasPerBlob * uint64(len(tx.BlobHashes)) }
func (tx *BlobTx) blobGasFeeCap() *big.Int { return tx.BlobFeeCap.ToBig() } func (tx *BlobTx) blobGasFeeCap() *big.Int { return tx.BlobFeeCap.ToBig() }
func (tx *BlobTx) blobHashes() []common.Hash { return tx.BlobHashes } func (tx *BlobTx) blobHashes() []common.Hash { return tx.BlobHashes }

View File

@ -806,9 +806,6 @@ func (q *queue) DeliverBodies(id string, txLists [][]*types.Transaction, txListH
// Validate the data blobs individually too // Validate the data blobs individually too
if tx.Type() == types.BlobTxType { if tx.Type() == types.BlobTxType {
if tx.To() == nil {
return errInvalidBody // TODO(karalabe): Why not make the field non-nil-able
}
if len(tx.BlobHashes()) == 0 { if len(tx.BlobHashes()) == 0 {
return errInvalidBody return errInvalidBody
} }