diff --git a/core/types/block_test.go b/core/types/block_test.go index 7a5f5687df..a628316cbf 100644 --- a/core/types/block_test.go +++ b/core/types/block_test.go @@ -76,7 +76,7 @@ func TestBlockEncoding(t *testing.T) { func TestTxDependencyBlockEncoding(t *testing.T) { t.Parallel() - blockEnc := common.FromHex("f90268f90201a083cafc574e1f51ba9dc0568fc617a08ea2429fb384059c972f13b19fa1c8dd55a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0ef1552a40b7165c3cd773806b9e0c165b75356e0314bf0706f279c729f51e017a05fe50b260da6308036625b850b5d6ced6d0a9f814c0688bc91ffb7b7a3a54b67a0bc37d79753ad738a6dac4921e57392f145d8887476de3f783dfa7edae9283e52b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd8825208845506eb0780a0bd4472abb6659ebe3ee06ee4d7b72a00a9f4d001caca51342001075469aff49888a13a5a8c8f2bb1c480c6c20201c20180f861f85f800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba09bea4c4daac7c7c52e093e6a4c35dbbcf8856f1af7b059ba20253e70848d094fa08a8fae537ce25ed8cb5af9adac3f141af69bd515bd2ba031522df09b97dd72b1c0") + blockEnc := common.FromHex("f90336f90229a083cafc574e1f51ba9dc0568fc617a08ea2429fb384059c972f13b19fa1c8dd55a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0ef1552a40b7165c3cd773806b9e0c165b75356e0314bf0706f279c729f51e017a05fe50b260da6308036625b850b5d6ced6d0a9f814c0688bc91ffb7b7a3a54b67a0bc37d79753ad738a6dac4921e57392f145d8887476de3f783dfa7edae9283e52b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd8825208845506eb0780a0bd4472abb6659ebe3ee06ee4d7b72a00a9f4d001caca51342001075469aff49888a13a5a8c8f2bb1c4843b9aca00a0bd4472abb6659ebe3ee06ee4d7b72a00a9f4d001caca51342001075469aff4988204d2c6c20201c20180f90106f85f800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba09bea4c4daac7c7c52e093e6a4c35dbbcf8856f1af7b059ba20253e70848d094fa08a8fae537ce25ed8cb5af9adac3f141af69bd515bd2ba031522df09b97dd72b1b8a302f8a0018080843b9aca008301e24194095e7baea6a6c7c4c2dfeb977efac326af552d878080f838f7940000000000000000000000000000000000000001e1a0000000000000000000000000000000000000000000000000000000000000000080a0fe38ca4e44a30002ac54af7cf922a6ac2ba11b7d22f548e8ecb3f51f41cb31b0a06de6a5cbae13c0c856e33acf021b51819636cfc009d39eafb9f606d546e305a8c0") var block Block @@ -96,17 +96,45 @@ func TestTxDependencyBlockEncoding(t *testing.T) { check("Coinbase", block.Coinbase(), common.HexToAddress("8888f1f195afa192cfee860698584c030f4c9db1")) check("MixDigest", block.MixDigest(), common.HexToHash("bd4472abb6659ebe3ee06ee4d7b72a00a9f4d001caca51342001075469aff498")) check("Root", block.Root(), common.HexToHash("ef1552a40b7165c3cd773806b9e0c165b75356e0314bf0706f279c729f51e017")) - check("Hash", block.Hash(), common.HexToHash("0xc6d8dc8995c0a4374bb9f87bd0dd8c0761e6e026a71edbfed5e961c9e55dbd6a")) + check("Hash", block.Hash(), common.HexToHash("0xfa62de2682f02d4a8516dd6408284e1da7348cd24c53abbcdc7f567b6e06e5ad")) check("Nonce", block.Nonce(), uint64(0xa13a5a8c8f2bb1c4)) check("Time", block.Time(), uint64(1426516743)) - check("Size", block.Size(), common.StorageSize(len(blockEnc))) + check("Size", block.Size(), uint64(len(blockEnc))) check("TxDependency", block.TxDependency(), [][]uint64{{2, 1}, {1, 0}}) tx1 := NewTransaction(0, common.HexToAddress("095e7baea6a6c7c4c2dfeb977efac326af552d87"), big.NewInt(10), 50000, big.NewInt(10), nil) tx1, _ = tx1.WithSignature(HomesteadSigner{}, common.Hex2Bytes("9bea4c4daac7c7c52e093e6a4c35dbbcf8856f1af7b059ba20253e70848d094f8a8fae537ce25ed8cb5af9adac3f141af69bd515bd2ba031522df09b97dd72b100")) - check("len(Transactions)", len(block.Transactions()), 1) + addr := common.HexToAddress("0x0000000000000000000000000000000000000001") + accesses := AccessList{AccessTuple{ + Address: addr, + StorageKeys: []common.Hash{ + {0}, + }, + }} + to := common.HexToAddress("095e7baea6a6c7c4c2dfeb977efac326af552d87") + txdata := &DynamicFeeTx{ + ChainID: big.NewInt(1), + Nonce: 0, + To: &to, + Gas: 123457, + GasFeeCap: new(big.Int).Set(block.BaseFee()), + GasTipCap: big.NewInt(0), + AccessList: accesses, + Data: []byte{}, + } + tx2 := NewTx(txdata) + + tx2, err := tx2.WithSignature(LatestSignerForChainID(big.NewInt(1)), common.Hex2Bytes("fe38ca4e44a30002ac54af7cf922a6ac2ba11b7d22f548e8ecb3f51f41cb31b06de6a5cbae13c0c856e33acf021b51819636cfc009d39eafb9f606d546e305a800")) + if err != nil { + t.Fatal("invalid signature error: ", err) + } + + check("len(Transactions)", len(block.Transactions()), 2) check("Transactions[0].Hash", block.Transactions()[0].Hash(), tx1.Hash()) + check("Transactions[1].Hash", block.Transactions()[1].Hash(), tx2.Hash()) + check("Transactions[1].Type", block.Transactions()[1].Type(), tx2.Type()) + ourBlockEnc, err := rlp.EncodeToBytes(&block) if err != nil { diff --git a/core/types/gen_header_json.go b/core/types/gen_header_json.go index 9b2d4dd969..05c1b86b03 100644 --- a/core/types/gen_header_json.go +++ b/core/types/gen_header_json.go @@ -33,10 +33,10 @@ func (h Header) MarshalJSON() ([]byte, error) { Nonce BlockNonce `json:"nonce"` BaseFee *hexutil.Big `json:"baseFeePerGas" rlp:"optional"` WithdrawalsHash *common.Hash `json:"withdrawalsRoot" rlp:"optional"` + ExcessDataGas *big.Int `json:"excessDataGas" rlp:"optional"` TxDependency [][]uint64 `json:"txDependency" rlp:"optional"` Hash common.Hash `json:"hash"` } - var enc Header enc.ParentHash = h.ParentHash enc.UncleHash = h.UncleHash @@ -55,9 +55,9 @@ func (h Header) MarshalJSON() ([]byte, error) { enc.Nonce = h.Nonce enc.BaseFee = (*hexutil.Big)(h.BaseFee) enc.WithdrawalsHash = h.WithdrawalsHash + enc.ExcessDataGas = h.ExcessDataGas enc.TxDependency = h.TxDependency enc.Hash = h.Hash() - return json.Marshal(&enc) } @@ -81,107 +81,81 @@ func (h *Header) UnmarshalJSON(input []byte) error { Nonce *BlockNonce `json:"nonce"` BaseFee *hexutil.Big `json:"baseFeePerGas" rlp:"optional"` WithdrawalsHash *common.Hash `json:"withdrawalsRoot" rlp:"optional"` + ExcessDataGas *big.Int `json:"excessDataGas" rlp:"optional"` TxDependency [][]uint64 `json:"txDependency" rlp:"optional"` } - var dec Header if err := json.Unmarshal(input, &dec); err != nil { return err } - if dec.ParentHash == nil { return errors.New("missing required field 'parentHash' for Header") } - h.ParentHash = *dec.ParentHash - if dec.UncleHash == nil { return errors.New("missing required field 'sha3Uncles' for Header") } - h.UncleHash = *dec.UncleHash if dec.Coinbase != nil { h.Coinbase = *dec.Coinbase } - if dec.Root == nil { return errors.New("missing required field 'stateRoot' for Header") } - h.Root = *dec.Root - if dec.TxHash == nil { return errors.New("missing required field 'transactionsRoot' for Header") } - h.TxHash = *dec.TxHash - if dec.ReceiptHash == nil { return errors.New("missing required field 'receiptsRoot' for Header") } - h.ReceiptHash = *dec.ReceiptHash - if dec.Bloom == nil { return errors.New("missing required field 'logsBloom' for Header") } - h.Bloom = *dec.Bloom - if dec.Difficulty == nil { return errors.New("missing required field 'difficulty' for Header") } - h.Difficulty = (*big.Int)(dec.Difficulty) - if dec.Number == nil { return errors.New("missing required field 'number' for Header") } - h.Number = (*big.Int)(dec.Number) - if dec.GasLimit == nil { return errors.New("missing required field 'gasLimit' for Header") } - h.GasLimit = uint64(*dec.GasLimit) - if dec.GasUsed == nil { return errors.New("missing required field 'gasUsed' for Header") } - h.GasUsed = uint64(*dec.GasUsed) - if dec.Time == nil { return errors.New("missing required field 'timestamp' for Header") } - h.Time = uint64(*dec.Time) - if dec.Extra == nil { return errors.New("missing required field 'extraData' for Header") } - h.Extra = *dec.Extra if dec.MixDigest != nil { h.MixDigest = *dec.MixDigest } - if dec.Nonce != nil { h.Nonce = *dec.Nonce } - if dec.BaseFee != nil { h.BaseFee = (*big.Int)(dec.BaseFee) } - if dec.WithdrawalsHash != nil { h.WithdrawalsHash = dec.WithdrawalsHash } - + if dec.ExcessDataGas != nil { + h.ExcessDataGas = dec.ExcessDataGas + } if dec.TxDependency != nil { h.TxDependency = dec.TxDependency } - return nil } diff --git a/core/types/gen_header_rlp.go b/core/types/gen_header_rlp.go index 4f5c6b86dc..bb7e46559c 100644 --- a/core/types/gen_header_rlp.go +++ b/core/types/gen_header_rlp.go @@ -18,27 +18,22 @@ func (obj *Header) EncodeRLP(_w io.Writer) error { w.WriteBytes(obj.TxHash[:]) w.WriteBytes(obj.ReceiptHash[:]) w.WriteBytes(obj.Bloom[:]) - if obj.Difficulty == nil { w.Write(rlp.EmptyString) } else { if obj.Difficulty.Sign() == -1 { return rlp.ErrNegativeBigInt } - w.WriteBigInt(obj.Difficulty) } - if obj.Number == nil { w.Write(rlp.EmptyString) } else { if obj.Number.Sign() == -1 { return rlp.ErrNegativeBigInt } - w.WriteBigInt(obj.Number) } - w.WriteUint64(obj.GasLimit) w.WriteUint64(obj.GasUsed) w.WriteUint64(obj.Time) @@ -47,45 +42,46 @@ func (obj *Header) EncodeRLP(_w io.Writer) error { w.WriteBytes(obj.Nonce[:]) _tmp1 := obj.BaseFee != nil _tmp2 := obj.WithdrawalsHash != nil - _tmp3 := len(obj.TxDependency) > 0 - - if _tmp1 || _tmp2 || _tmp3 { + _tmp3 := obj.ExcessDataGas != nil + _tmp4 := len(obj.TxDependency) > 0 + if _tmp1 || _tmp2 || _tmp3 || _tmp4 { if obj.BaseFee == nil { w.Write(rlp.EmptyString) } else { if obj.BaseFee.Sign() == -1 { return rlp.ErrNegativeBigInt } - w.WriteBigInt(obj.BaseFee) } } - - if _tmp2 { + if _tmp2 || _tmp3 || _tmp4 { if obj.WithdrawalsHash == nil { w.Write([]byte{0x80}) } else { w.WriteBytes(obj.WithdrawalsHash[:]) } } - - if _tmp3 { - _tmp3 := w.List() - - for _, _tmp4 := range obj.TxDependency { - _tmp5 := w.List() - - for _, _tmp6 := range _tmp4 { - w.WriteUint64(_tmp6) + if _tmp3 || _tmp4 { + if obj.ExcessDataGas == nil { + w.Write(rlp.EmptyString) + } else { + if obj.ExcessDataGas.Sign() == -1 { + return rlp.ErrNegativeBigInt } - - w.ListEnd(_tmp5) + w.WriteBigInt(obj.ExcessDataGas) } - - w.ListEnd(_tmp3) } - + if _tmp4 { + _tmp5 := w.List() + for _, _tmp6 := range obj.TxDependency { + _tmp7 := w.List() + for _, _tmp8 := range _tmp6 { + w.WriteUint64(_tmp8) + } + w.ListEnd(_tmp7) + } + w.ListEnd(_tmp5) + } w.ListEnd(_tmp0) - return w.Flush() }