@@ -20,6 +20,7 @@ use std::path::Path;
20
20
use clarity:: vm:: types:: QualifiedContractIdentifier ;
21
21
use clarity:: vm:: ContractName ;
22
22
use libstackerdb:: SlotMetadata ;
23
+ use rusqlite:: params;
23
24
use stacks_common:: address:: {
24
25
AddressHashMode , C32_ADDRESS_VERSION_MAINNET_MULTISIG , C32_ADDRESS_VERSION_MAINNET_SINGLESIG ,
25
26
} ;
@@ -649,6 +650,16 @@ fn test_reconfigure_stackerdb() {
649
650
initial_metadata. push ( ( slot_metadata, chunk_data) ) ;
650
651
}
651
652
653
+ tx. commit ( ) . unwrap ( ) ;
654
+
655
+ let db_slot_metadata = db. get_db_slot_metadata ( & sc) . unwrap ( ) ;
656
+ assert_eq ! ( db_slot_metadata. len( ) , pks. len( ) ) ;
657
+ for ( i, slot_md) in db_slot_metadata. iter ( ) . enumerate ( ) {
658
+ let slot_metadata = db. get_slot_metadata ( & sc, i as u32 ) . unwrap ( ) . unwrap ( ) ;
659
+ assert_eq ! ( slot_metadata, * slot_md) ;
660
+ }
661
+
662
+ let tx = db. tx_begin ( StackerDBConfig :: noop ( ) ) . unwrap ( ) ;
652
663
let new_pks: Vec < _ > = ( 0 ..10 ) . map ( |_| StacksPrivateKey :: new ( ) ) . collect ( ) ;
653
664
let reconfigured_pks = vec ! [
654
665
// first five slots are unchanged
@@ -722,6 +733,91 @@ fn test_reconfigure_stackerdb() {
722
733
assert_eq ! ( chunk. len( ) , 0 ) ;
723
734
}
724
735
}
736
+
737
+ let db_slot_metadata = db. get_db_slot_metadata ( & sc) . unwrap ( ) ;
738
+ assert_eq ! ( db_slot_metadata. len( ) , reconfigured_pks. len( ) ) ;
739
+ for ( i, slot_md) in db_slot_metadata. iter ( ) . enumerate ( ) {
740
+ let slot_metadata = db. get_slot_metadata ( & sc, i as u32 ) . unwrap ( ) . unwrap ( ) ;
741
+ assert_eq ! ( slot_metadata, * slot_md) ;
742
+ }
743
+
744
+ // reconfigure with fewer slots
745
+ let new_pks: Vec < _ > = ( 0 ..10 ) . map ( |_| StacksPrivateKey :: new ( ) ) . collect ( ) ;
746
+ let reconfigured_pks = vec ! [
747
+ // first five slots are unchanged
748
+ pks[ 0 ] , pks[ 1 ] , pks[ 2 ] , pks[ 3 ] , pks[ 4 ] ,
749
+ // next five slots are different, so their contents will be dropped and versions and write
750
+ // timestamps reset
751
+ new_pks[ 0 ] , new_pks[ 1 ] , new_pks[ 2 ] , new_pks[ 3 ] ,
752
+ new_pks[ 4 ] ,
753
+ // slots 10-15 will disappear
754
+ ] ;
755
+ let reconfigured_addrs: Vec < _ > = reconfigured_pks
756
+ . iter ( )
757
+ . map ( |pk| {
758
+ StacksAddress :: from_public_keys (
759
+ C32_ADDRESS_VERSION_MAINNET_SINGLESIG ,
760
+ & AddressHashMode :: SerializeP2PKH ,
761
+ 1 ,
762
+ & vec ! [ StacksPublicKey :: from_private( & pk) ] ,
763
+ )
764
+ . unwrap ( )
765
+ } )
766
+ . collect ( ) ;
767
+
768
+ let tx = db. tx_begin ( StackerDBConfig :: noop ( ) ) . unwrap ( ) ;
769
+
770
+ // reconfigure
771
+ tx. reconfigure_stackerdb (
772
+ & sc,
773
+ & reconfigured_addrs
774
+ . clone ( )
775
+ . into_iter ( )
776
+ . map ( |addr| ( addr, 1 ) )
777
+ . collect :: < Vec < _ > > ( ) ,
778
+ )
779
+ . unwrap ( ) ;
780
+
781
+ tx. commit ( ) . unwrap ( ) ;
782
+
783
+ for ( i, pk) in new_pks. iter ( ) . enumerate ( ) {
784
+ if i < 5 {
785
+ // first five are unchanged
786
+ let chunk_data = StackerDBChunkData {
787
+ slot_id : i as u32 ,
788
+ slot_version : 1 ,
789
+ sig : MessageSignature :: empty ( ) ,
790
+ data : vec ! [ i as u8 ; 128 ] ,
791
+ } ;
792
+
793
+ let slot_metadata = db. get_slot_metadata ( & sc, i as u32 ) . unwrap ( ) . unwrap ( ) ;
794
+ let chunk = db. get_latest_chunk ( & sc, i as u32 ) . unwrap ( ) . unwrap ( ) ;
795
+
796
+ assert_eq ! ( initial_metadata[ i] . 0 , slot_metadata) ;
797
+ assert_eq ! ( initial_metadata[ i] . 1 . data, chunk) ;
798
+ } else if i < 10 {
799
+ // next five are wiped
800
+ let slot_metadata = db. get_slot_metadata ( & sc, i as u32 ) . unwrap ( ) . unwrap ( ) ;
801
+ assert_eq ! ( slot_metadata. slot_id, i as u32 ) ;
802
+ assert_eq ! ( slot_metadata. slot_version, 0 ) ;
803
+ assert_eq ! ( slot_metadata. data_hash, Sha512Trunc256Sum ( [ 0x00 ; 32 ] ) ) ;
804
+ assert_eq ! ( slot_metadata. signature, MessageSignature :: empty( ) ) ;
805
+
806
+ let chunk = db. get_latest_chunk ( & sc, i as u32 ) . unwrap ( ) . unwrap ( ) ;
807
+ assert_eq ! ( chunk. len( ) , 0 ) ;
808
+ } else {
809
+ // final five are gone
810
+ let slot_metadata_opt = db. get_slot_metadata ( & sc, i as u32 ) . unwrap ( ) ;
811
+ assert ! ( slot_metadata_opt. is_none( ) ) ;
812
+ }
813
+ }
814
+
815
+ let db_slot_metadata = db. get_db_slot_metadata ( & sc) . unwrap ( ) ;
816
+ assert_eq ! ( db_slot_metadata. len( ) , reconfigured_pks. len( ) ) ;
817
+ for ( i, slot_md) in db_slot_metadata. iter ( ) . enumerate ( ) {
818
+ let slot_metadata = db. get_slot_metadata ( & sc, i as u32 ) . unwrap ( ) . unwrap ( ) ;
819
+ assert_eq ! ( slot_metadata, * slot_md) ;
820
+ }
725
821
}
726
822
727
823
// TODO: max chunk size
0 commit comments