@@ -49,8 +49,9 @@ pub enum ConsensusVersion {
4949 V12 = 12 ,
5050 /// V13: Introduces external structs.
5151 V13 = 13 ,
52- /// V14: Increase the program size limit to 512 kB and transaction size limit to 540 kB.
53- /// Introduces `aleo::GENERATOR` and `aleo::GENERATOR_POWERS` opcodes.
52+ /// V14: Increase the program size limit to 512 kB, the transaction size limit to 540 kB,
53+ /// the array size limit to 2048, and the `Future` argument bit size to 32 bits.
54+ /// Introduces `aleo::GENERATOR`, `aleo::GENERATOR_POWERS`, and `snark.verify` opcodes.
5455 V14 = 14 ,
5556}
5657
@@ -318,6 +319,11 @@ mod tests {
318319 assert ! ( * version > previous_version) ;
319320 previous_version = * version;
320321 }
322+ let mut previous_version = N :: MAX_ARRAY_ELEMENTS . first ( ) . unwrap ( ) . 0 ;
323+ for ( version, _) in N :: MAX_ARRAY_ELEMENTS . iter ( ) . skip ( 1 ) {
324+ assert ! ( * version > previous_version) ;
325+ previous_version = * version;
326+ }
321327 let mut previous_version = N :: MAX_PROGRAM_SIZE . first ( ) . unwrap ( ) . 0 ;
322328 for ( version, _) in N :: MAX_PROGRAM_SIZE . iter ( ) . skip ( 1 ) {
323329 assert ! ( * version > previous_version) ;
@@ -362,6 +368,12 @@ mod tests {
362368 // Double-check that consensus_config_value returns the correct value.
363369 assert_eq ! ( consensus_config_value!( N , TRANSACTION_SPEND_LIMIT , height) . unwrap( ) , * value) ;
364370 }
371+ for ( version, value) in N :: MAX_ARRAY_ELEMENTS . iter ( ) {
372+ // Ensure that the height at which an update occurs are present in CONSENSUS_VERSION_HEIGHTS.
373+ let height = N :: CONSENSUS_VERSION_HEIGHTS ( ) . iter ( ) . find ( |( c_version, _) | * c_version == * version) . unwrap ( ) . 1 ;
374+ // Double-check that consensus_config_value returns the correct value.
375+ assert_eq ! ( consensus_config_value!( N , MAX_ARRAY_ELEMENTS , height) . unwrap( ) , * value) ;
376+ }
365377 for ( version, value) in N :: MAX_PROGRAM_SIZE . iter ( ) {
366378 // Ensure that the height at which an update occurs are present in CONSENSUS_VERSION_HEIGHTS.
367379 let height = N :: CONSENSUS_VERSION_HEIGHTS ( ) . iter ( ) . find ( |( c_version, _) | * c_version == * version) . unwrap ( ) . 1 ;
@@ -387,6 +399,7 @@ mod tests {
387399 for ( _, height) in N :: CONSENSUS_VERSION_HEIGHTS ( ) . iter ( ) {
388400 assert ! ( consensus_config_value!( N , MAX_CERTIFICATES , * height) . is_some( ) ) ;
389401 assert ! ( consensus_config_value!( N , TRANSACTION_SPEND_LIMIT , * height) . is_some( ) ) ;
402+ assert ! ( consensus_config_value!( N , MAX_ARRAY_ELEMENTS , * height) . is_some( ) ) ;
390403 assert ! ( consensus_config_value!( N , MAX_PROGRAM_SIZE , * height) . is_some( ) ) ;
391404 assert ! ( consensus_config_value!( N , MAX_TRANSACTION_SIZE , * height) . is_some( ) ) ;
392405 assert ! ( consensus_config_value!( N , MAX_WRITES , * height) . is_some( ) ) ;
@@ -403,6 +416,16 @@ mod tests {
403416 }
404417 }
405418
419+ /// Ensure that `MAX_ARRAY_ELEMENTS` increases and is correctly defined.
420+ /// See the constant declaration for an explanation why.
421+ fn max_array_elements_increasing < N : Network > ( ) {
422+ let mut previous_value = N :: MAX_ARRAY_ELEMENTS . first ( ) . unwrap ( ) . 1 ;
423+ for ( _, value) in N :: MAX_ARRAY_ELEMENTS . iter ( ) . skip ( 1 ) {
424+ assert ! ( * value >= previous_value) ;
425+ previous_value = * value;
426+ }
427+ }
428+
406429 /// Ensure that `MAX_TRANSACTION_SIZE` is at least 28KB greater than `MAX_PROGRAM_SIZE` for all consensus versions.
407430 /// This overhead accounts for proofs, signatures, and other transaction metadata.
408431 fn transaction_size_exceeds_program_size < N : Network > ( ) {
@@ -425,6 +448,7 @@ mod tests {
425448 let _ = [ N1 :: CONSENSUS_VERSION_HEIGHTS , N2 :: CONSENSUS_VERSION_HEIGHTS , N3 :: CONSENSUS_VERSION_HEIGHTS ] ;
426449 let _ = [ N1 :: MAX_CERTIFICATES , N2 :: MAX_CERTIFICATES , N3 :: MAX_CERTIFICATES ] ;
427450 let _ = [ N1 :: TRANSACTION_SPEND_LIMIT , N2 :: TRANSACTION_SPEND_LIMIT , N3 :: TRANSACTION_SPEND_LIMIT ] ;
451+ let _ = [ N1 :: MAX_ARRAY_ELEMENTS , N2 :: MAX_ARRAY_ELEMENTS , N3 :: MAX_ARRAY_ELEMENTS ] ;
428452 let _ = [ N1 :: MAX_PROGRAM_SIZE , N2 :: MAX_PROGRAM_SIZE , N3 :: MAX_PROGRAM_SIZE ] ;
429453 let _ = [ N1 :: MAX_TRANSACTION_SIZE , N2 :: MAX_TRANSACTION_SIZE , N3 :: MAX_TRANSACTION_SIZE ] ;
430454 let _ = [ N1 :: MAX_WRITES , N2 :: MAX_WRITES , N3 :: MAX_WRITES ] ;
@@ -470,6 +494,10 @@ mod tests {
470494 max_certificates_increasing :: < TestnetV0 > ( ) ;
471495 max_certificates_increasing :: < CanaryV0 > ( ) ;
472496
497+ max_array_elements_increasing :: < MainnetV0 > ( ) ;
498+ max_array_elements_increasing :: < TestnetV0 > ( ) ;
499+ max_array_elements_increasing :: < CanaryV0 > ( ) ;
500+
473501 transaction_size_exceeds_program_size :: < MainnetV0 > ( ) ;
474502 transaction_size_exceeds_program_size :: < TestnetV0 > ( ) ;
475503 transaction_size_exceeds_program_size :: < CanaryV0 > ( ) ;
0 commit comments