@@ -11,17 +11,22 @@ pub struct ScrollBuilderConfig {
1111 pub gas_limit : u64 ,
1212 /// Time limit for payload building.
1313 pub time_limit : Duration ,
14+ /// Maximum total data availability size for a block.
15+ pub max_da_block_size : Option < u64 > ,
1416}
1517
18+ /// Minimal data bytes size per transaction.
19+ pub const MIN_TRANSACTION_DATA_SIZE : u64 = 115u64 ;
20+
1621impl ScrollBuilderConfig {
1722 /// Returns a new instance of [`ScrollBuilderConfig`].
18- pub const fn new ( gas_limit : u64 , time_limit : Duration ) -> Self {
19- Self { gas_limit, time_limit }
23+ pub const fn new ( gas_limit : u64 , time_limit : Duration , max_da_block_size : Option < u64 > ) -> Self {
24+ Self { gas_limit, time_limit, max_da_block_size }
2025 }
2126
2227 /// Returns the [`PayloadBuildingBreaker`] for the config.
2328 pub ( super ) fn breaker ( & self ) -> PayloadBuildingBreaker {
24- PayloadBuildingBreaker :: new ( self . time_limit , self . gas_limit )
29+ PayloadBuildingBreaker :: new ( self . time_limit , self . gas_limit , self . max_da_block_size )
2530 }
2631}
2732
@@ -31,18 +36,39 @@ pub struct PayloadBuildingBreaker {
3136 start : Instant ,
3237 time_limit : Duration ,
3338 gas_limit : u64 ,
39+ max_da_block_size : Option < u64 > ,
3440}
3541
3642impl PayloadBuildingBreaker {
3743 /// Returns a new instance of the [`PayloadBuildingBreaker`].
38- fn new ( time_limit : Duration , gas_limit : u64 ) -> Self {
39- Self { start : Instant :: now ( ) , time_limit, gas_limit }
44+ fn new ( time_limit : Duration , gas_limit : u64 , max_da_block_size : Option < u64 > ) -> Self {
45+ Self { start : Instant :: now ( ) , time_limit, gas_limit, max_da_block_size }
4046 }
4147
4248 /// Returns whether the payload building should stop.
43- pub ( super ) fn should_break ( & self , cumulative_gas_used : u64 ) -> bool {
44- self . start . elapsed ( ) >= self . time_limit ||
45- cumulative_gas_used > self . gas_limit . saturating_sub ( MIN_TRANSACTION_GAS )
49+ pub ( super ) fn should_break (
50+ & self ,
51+ cumulative_gas_used : u64 ,
52+ cumulative_da_size_used : u64 ,
53+ ) -> bool {
54+ // Check time limit
55+ if self . start . elapsed ( ) >= self . time_limit {
56+ return true ;
57+ }
58+
59+ // Check gas limit
60+ if cumulative_gas_used > self . gas_limit . saturating_sub ( MIN_TRANSACTION_GAS ) {
61+ return true ;
62+ }
63+
64+ // Check data availability size limit if configured
65+ if let Some ( max_size) = self . max_da_block_size {
66+ if cumulative_da_size_used > max_size. saturating_sub ( MIN_TRANSACTION_DATA_SIZE ) {
67+ return true ;
68+ }
69+ }
70+
71+ false
4672 }
4773}
4874
@@ -52,17 +78,48 @@ mod tests {
5278
5379 #[ test]
5480 fn test_should_break_on_time_limit ( ) {
55- let breaker =
56- PayloadBuildingBreaker :: new ( Duration :: from_millis ( 200 ) , 2 * MIN_TRANSACTION_GAS ) ;
57- assert ! ( !breaker. should_break( MIN_TRANSACTION_GAS ) ) ;
81+ let breaker = PayloadBuildingBreaker :: new (
82+ Duration :: from_millis ( 200 ) ,
83+ 2 * MIN_TRANSACTION_GAS ,
84+ Some ( 2 * MIN_TRANSACTION_DATA_SIZE ) ,
85+ ) ;
86+ assert ! ( !breaker. should_break( MIN_TRANSACTION_GAS , MIN_TRANSACTION_DATA_SIZE ) ) ;
5887 std:: thread:: sleep ( Duration :: from_millis ( 201 ) ) ;
59- assert ! ( breaker. should_break( MIN_TRANSACTION_GAS ) ) ;
88+ assert ! ( breaker. should_break( MIN_TRANSACTION_GAS , MIN_TRANSACTION_DATA_SIZE ) ) ;
6089 }
6190
6291 #[ test]
6392 fn test_should_break_on_gas_limit ( ) {
64- let breaker = PayloadBuildingBreaker :: new ( Duration :: from_secs ( 1 ) , 2 * MIN_TRANSACTION_GAS ) ;
65- assert ! ( !breaker. should_break( MIN_TRANSACTION_GAS ) ) ;
66- assert ! ( breaker. should_break( MIN_TRANSACTION_GAS + 1 ) ) ;
93+ let breaker = PayloadBuildingBreaker :: new (
94+ Duration :: from_secs ( 1 ) ,
95+ 2 * MIN_TRANSACTION_GAS ,
96+ Some ( 2 * MIN_TRANSACTION_DATA_SIZE ) ,
97+ ) ;
98+ assert ! ( !breaker. should_break( MIN_TRANSACTION_GAS , MIN_TRANSACTION_DATA_SIZE ) ) ;
99+ assert ! ( breaker. should_break( MIN_TRANSACTION_GAS + 1 , MIN_TRANSACTION_DATA_SIZE ) ) ;
100+ }
101+
102+ #[ test]
103+ fn test_should_break_on_data_size_limit ( ) {
104+ let breaker = PayloadBuildingBreaker :: new (
105+ Duration :: from_secs ( 1 ) ,
106+ 2 * MIN_TRANSACTION_GAS ,
107+ Some ( 2 * MIN_TRANSACTION_DATA_SIZE ) ,
108+ ) ;
109+ assert ! ( !breaker. should_break( MIN_TRANSACTION_GAS , MIN_TRANSACTION_DATA_SIZE ) ) ;
110+ assert ! ( breaker. should_break( MIN_TRANSACTION_GAS , MIN_TRANSACTION_DATA_SIZE + 1 ) ) ;
111+ }
112+
113+ #[ test]
114+ fn test_should_break_with_no_da_limit ( ) {
115+ let breaker = PayloadBuildingBreaker :: new (
116+ Duration :: from_secs ( 1 ) ,
117+ 2 * MIN_TRANSACTION_GAS ,
118+ None , // No DA limit
119+ ) ;
120+ // Should not break on large DA size when no limit is set
121+ assert ! ( !breaker. should_break( MIN_TRANSACTION_GAS , u64 :: MAX ) ) ;
122+ // But should still break on gas limit
123+ assert ! ( breaker. should_break( MIN_TRANSACTION_GAS + 1 , u64 :: MAX ) ) ;
67124 }
68125}
0 commit comments