@@ -8,8 +8,15 @@ use tree_hash_derive::TreeHash;
88#[ derive( Debug , Clone , PartialEq , Serialize , Deserialize , Encode , Decode , TreeHash ) ]
99#[ ssz( enum_behaviour = "union" ) ]
1010#[ tree_hash( enum_behaviour = "union" ) ]
11+ #[ serde( tag = "selector" , content = "value" ) ]
12+ #[ serde( bound = "T: EthSpec" ) ]
1113pub enum Transaction < T : EthSpec > {
12- OpaqueTransaction ( VariableList < u8 , T :: MaxBytesPerOpaqueTransaction > ) ,
14+ // FIXME(merge): renaming this enum variant to 0 is a bit of a hack...
15+ #[ serde( rename = "0" ) ]
16+ OpaqueTransaction (
17+ #[ serde( with = "ssz_types::serde_utils::hex_var_list" ) ]
18+ VariableList < u8 , T :: MaxBytesPerOpaqueTransaction > ,
19+ ) ,
1320}
1421
1522impl < T : EthSpec , I : SliceIndex < [ u8 ] > > Index < I > for Transaction < T > {
@@ -33,12 +40,13 @@ impl<T: EthSpec> From<VariableList<u8, T::MaxBytesPerOpaqueTransaction>> for Tra
3340#[ derive(
3441 Default , Debug , Clone , PartialEq , Serialize , Deserialize , Encode , Decode , TreeHash , TestRandom ,
3542) ]
43+ #[ serde( bound = "T: EthSpec" ) ]
3644pub struct ExecutionPayload < T : EthSpec > {
3745 pub parent_hash : Hash256 ,
3846 pub coinbase : Address ,
3947 pub state_root : Hash256 ,
4048 pub receipt_root : Hash256 ,
41- #[ serde( with = "serde_logs_bloom " ) ]
49+ #[ serde( with = "ssz_types::serde_utils::hex_fixed_vec " ) ]
4250 pub logs_bloom : FixedVector < u8 , T :: BytesPerLogsBloom > ,
4351 pub random : Hash256 ,
4452 #[ serde( with = "eth2_serde_utils::quoted_u64" ) ]
@@ -51,7 +59,6 @@ pub struct ExecutionPayload<T: EthSpec> {
5159 pub timestamp : u64 ,
5260 pub base_fee_per_gas : Hash256 ,
5361 pub block_hash : Hash256 ,
54- #[ serde( with = "serde_transactions" ) ]
5562 #[ test_random( default ) ]
5663 pub transactions : VariableList < Transaction < T > , T :: MaxTransactionsPerPayload > ,
5764}
@@ -76,99 +83,3 @@ impl<T: EthSpec> ExecutionPayload<T> {
7683 }
7784 }
7885}
79-
80- /// Serializes the `logs_bloom` field.
81- pub mod serde_logs_bloom {
82- use super :: * ;
83- use eth2_serde_utils:: hex:: PrefixedHexVisitor ;
84- use serde:: { Deserializer , Serializer } ;
85-
86- pub fn serialize < S , U > ( bytes : & FixedVector < u8 , U > , serializer : S ) -> Result < S :: Ok , S :: Error >
87- where
88- S : Serializer ,
89- U : Unsigned ,
90- {
91- let mut hex_string: String = "0x" . to_string ( ) ;
92- hex_string. push_str ( & hex:: encode ( & bytes[ ..] ) ) ;
93-
94- serializer. serialize_str ( & hex_string)
95- }
96-
97- pub fn deserialize < ' de , D , U > ( deserializer : D ) -> Result < FixedVector < u8 , U > , D :: Error >
98- where
99- D : Deserializer < ' de > ,
100- U : Unsigned ,
101- {
102- let vec = deserializer. deserialize_string ( PrefixedHexVisitor ) ?;
103-
104- FixedVector :: new ( vec)
105- . map_err ( |e| serde:: de:: Error :: custom ( format ! ( "invalid logs bloom: {:?}" , e) ) )
106- }
107- }
108-
109- /// Serializes the `transactions` field.
110- pub mod serde_transactions {
111- use super :: * ;
112- use eth2_serde_utils:: hex;
113- use serde:: ser:: SerializeSeq ;
114- use serde:: { de, Deserializer , Serializer } ;
115- use std:: marker:: PhantomData ;
116-
117- pub struct ListOfBytesListVisitor < T : EthSpec > {
118- _t : PhantomData < T > ,
119- }
120- impl < ' a , T > serde:: de:: Visitor < ' a > for ListOfBytesListVisitor < T >
121- where
122- T : EthSpec ,
123- {
124- type Value = VariableList < Transaction < T > , T :: MaxTransactionsPerPayload > ;
125-
126- fn expecting ( & self , formatter : & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
127- write ! ( formatter, "a list of 0x-prefixed byte lists" )
128- }
129-
130- fn visit_seq < A > ( self , mut seq : A ) -> Result < Self :: Value , A :: Error >
131- where
132- A : serde:: de:: SeqAccess < ' a > ,
133- {
134- let mut outer = VariableList :: default ( ) ;
135-
136- while let Some ( val) = seq. next_element :: < String > ( ) ? {
137- let inner_vec = hex:: decode ( & val) . map_err ( de:: Error :: custom) ?;
138- let inner = VariableList :: new ( inner_vec) . map_err ( |e| {
139- serde:: de:: Error :: custom ( format ! ( "invalid transaction: {:?}" , e) )
140- } ) ?;
141- outer. push ( inner. into ( ) ) . map_err ( |e| {
142- serde:: de:: Error :: custom ( format ! ( "too many transactions: {:?}" , e) )
143- } ) ?;
144- }
145-
146- Ok ( outer)
147- }
148- }
149-
150- pub fn serialize < S , T > (
151- value : & VariableList < Transaction < T > , T :: MaxTransactionsPerPayload > ,
152- serializer : S ,
153- ) -> Result < S :: Ok , S :: Error >
154- where
155- S : Serializer ,
156- T : EthSpec ,
157- {
158- let mut seq = serializer. serialize_seq ( Some ( value. len ( ) ) ) ?;
159- for val in value {
160- seq. serialize_element ( & hex:: encode ( & val[ ..] ) ) ?;
161- }
162- seq. end ( )
163- }
164-
165- pub fn deserialize < ' de , D , T > (
166- deserializer : D ,
167- ) -> Result < VariableList < Transaction < T > , T :: MaxTransactionsPerPayload > , D :: Error >
168- where
169- D : Deserializer < ' de > ,
170- T : EthSpec ,
171- {
172- deserializer. deserialize_any ( ListOfBytesListVisitor { _t : PhantomData } )
173- }
174- }
0 commit comments