@@ -23,7 +23,7 @@ use stacks_common::consts::{
23
23
} ;
24
24
use stacks_common:: types:: chainstate:: {
25
25
BlockHeaderHash , BurnchainHeaderHash , ConsensusHash , SortitionId , StacksAddress , StacksBlockId ,
26
- VRFSeed ,
26
+ TrieHash , VRFSeed ,
27
27
} ;
28
28
use stacks_common:: types:: { Address , StacksEpoch as GenericStacksEpoch , StacksEpochId } ;
29
29
use stacks_common:: util:: hash:: { to_hex, Hash160 , Sha256Sum , Sha512Trunc256Sum } ;
@@ -76,6 +76,68 @@ pub enum StoreType {
76
76
PoxUnlockHeight = 0x15 ,
77
77
}
78
78
79
+ impl TryFrom < & str > for StoreType {
80
+ type Error = String ;
81
+
82
+ fn try_from ( value : & str ) -> core:: result:: Result < Self , Self :: Error > {
83
+ use self :: StoreType :: * ;
84
+
85
+ let hex_value = u8:: from_str_radix ( value, 10 ) . map_err ( |e| e. to_string ( ) ) ?;
86
+ match hex_value {
87
+ 0x00 => Ok ( DataMap ) ,
88
+ 0x01 => Ok ( Variable ) ,
89
+ 0x02 => Ok ( FungibleToken ) ,
90
+ 0x03 => Ok ( CirculatingSupply ) ,
91
+ 0x04 => Ok ( NonFungibleToken ) ,
92
+ 0x05 => Ok ( DataMapMeta ) ,
93
+ 0x06 => Ok ( VariableMeta ) ,
94
+ 0x07 => Ok ( FungibleTokenMeta ) ,
95
+ 0x08 => Ok ( NonFungibleTokenMeta ) ,
96
+ 0x09 => Ok ( Contract ) ,
97
+ 0x10 => Ok ( SimmedBlock ) ,
98
+ 0x11 => Ok ( SimmedBlockHeight ) ,
99
+ 0x12 => Ok ( Nonce ) ,
100
+ 0x13 => Ok ( STXBalance ) ,
101
+ 0x14 => Ok ( PoxSTXLockup ) ,
102
+ 0x15 => Ok ( PoxUnlockHeight ) ,
103
+ _ => Err ( "Invalid StoreType" . into ( ) ) ,
104
+ }
105
+ }
106
+ }
107
+
108
+ pub enum ContractDataVarName {
109
+ Contract ,
110
+ ContractSize ,
111
+ ContractSrc ,
112
+ ContractDataSize ,
113
+ }
114
+
115
+ impl ContractDataVarName {
116
+ pub fn as_str ( & self ) -> & str {
117
+ match self {
118
+ Self :: Contract => "contract" ,
119
+ Self :: ContractSize => "contract-size" ,
120
+ Self :: ContractSrc => "contract-src" ,
121
+ Self :: ContractDataSize => "contract-data-size" ,
122
+ }
123
+ }
124
+ }
125
+
126
+ impl TryFrom < & str > for ContractDataVarName {
127
+ type Error = String ;
128
+
129
+ fn try_from ( value : & str ) -> core:: result:: Result < Self , Self :: Error > {
130
+ use self :: ContractDataVarName :: * ;
131
+ match value {
132
+ "contract" => Ok ( Contract ) ,
133
+ "contract-size" => Ok ( ContractSize ) ,
134
+ "contract-src" => Ok ( ContractSrc ) ,
135
+ "contract-data-size" => Ok ( ContractDataSize ) ,
136
+ _ => Err ( "Invalid ContractDataVarName" . into ( ) ) ,
137
+ }
138
+ }
139
+ }
140
+
79
141
pub struct ClarityDatabase < ' a > {
80
142
pub store : RollbackWrapper < ' a > ,
81
143
headers_db : & ' a dyn HeadersDB ,
@@ -465,6 +527,13 @@ impl<'a> ClarityDatabase<'a> {
465
527
self . store . get_data :: < T > ( key)
466
528
}
467
529
530
+ pub fn get_data_by_hash < T > ( & mut self , hash : & TrieHash ) -> Result < Option < T > >
531
+ where
532
+ T : ClarityDeserializable < T > ,
533
+ {
534
+ self . store . get_data_by_hash :: < T > ( hash)
535
+ }
536
+
468
537
pub fn put_value ( & mut self , key : & str , value : Value , epoch : & StacksEpochId ) -> Result < ( ) > {
469
538
self . put_value_with_size ( key, value, epoch) ?;
470
539
Ok ( ( ) )
@@ -522,6 +591,16 @@ impl<'a> ClarityDatabase<'a> {
522
591
self . store . get_data_with_proof ( key)
523
592
}
524
593
594
+ pub fn get_data_with_proof_by_hash < T > (
595
+ & mut self ,
596
+ hash : & TrieHash ,
597
+ ) -> Result < Option < ( T , Vec < u8 > ) > >
598
+ where
599
+ T : ClarityDeserializable < T > ,
600
+ {
601
+ self . store . get_data_with_proof_by_hash ( hash)
602
+ }
603
+
525
604
pub fn make_key_for_trip (
526
605
contract_identifier : & QualifiedContractIdentifier ,
527
606
data : StoreType ,
@@ -559,12 +638,18 @@ impl<'a> ClarityDatabase<'a> {
559
638
self . store
560
639
. prepare_for_contract_metadata ( contract_identifier, hash) ?;
561
640
// insert contract-size
562
- let key = ClarityDatabase :: make_metadata_key ( StoreType :: Contract , "contract-size" ) ;
641
+ let key = ClarityDatabase :: make_metadata_key (
642
+ StoreType :: Contract ,
643
+ ContractDataVarName :: ContractSize . as_str ( ) ,
644
+ ) ;
563
645
self . insert_metadata ( contract_identifier, & key, & ( contract_content. len ( ) as u64 ) ) ?;
564
646
565
647
// insert contract-src
566
648
if STORE_CONTRACT_SRC_INTERFACE {
567
- let key = ClarityDatabase :: make_metadata_key ( StoreType :: Contract , "contract-src" ) ;
649
+ let key = ClarityDatabase :: make_metadata_key (
650
+ StoreType :: Contract ,
651
+ ContractDataVarName :: ContractSrc . as_str ( ) ,
652
+ ) ;
568
653
self . insert_metadata ( contract_identifier, & key, & contract_content. to_string ( ) ) ?;
569
654
}
570
655
Ok ( ( ) )
@@ -574,7 +659,10 @@ impl<'a> ClarityDatabase<'a> {
574
659
& mut self ,
575
660
contract_identifier : & QualifiedContractIdentifier ,
576
661
) -> Option < String > {
577
- let key = ClarityDatabase :: make_metadata_key ( StoreType :: Contract , "contract-src" ) ;
662
+ let key = ClarityDatabase :: make_metadata_key (
663
+ StoreType :: Contract ,
664
+ ContractDataVarName :: ContractSrc . as_str ( ) ,
665
+ ) ;
578
666
self . fetch_metadata ( contract_identifier, & key)
579
667
. ok ( )
580
668
. flatten ( )
@@ -683,15 +771,21 @@ impl<'a> ClarityDatabase<'a> {
683
771
& mut self ,
684
772
contract_identifier : & QualifiedContractIdentifier ,
685
773
) -> Result < u64 > {
686
- let key = ClarityDatabase :: make_metadata_key ( StoreType :: Contract , "contract-size" ) ;
774
+ let key = ClarityDatabase :: make_metadata_key (
775
+ StoreType :: Contract ,
776
+ ContractDataVarName :: ContractSize . as_str ( ) ,
777
+ ) ;
687
778
let contract_size: u64 =
688
779
self . fetch_metadata ( contract_identifier, & key) ?
689
780
. ok_or_else ( || {
690
781
InterpreterError :: Expect (
691
782
"Failed to read non-consensus contract metadata, even though contract exists in MARF."
692
783
. into ( ) )
693
784
} ) ?;
694
- let key = ClarityDatabase :: make_metadata_key ( StoreType :: Contract , "contract-data-size" ) ;
785
+ let key = ClarityDatabase :: make_metadata_key (
786
+ StoreType :: Contract ,
787
+ ContractDataVarName :: ContractDataSize . as_str ( ) ,
788
+ ) ;
695
789
let data_size: u64 = self
696
790
. fetch_metadata ( contract_identifier, & key) ?
697
791
. ok_or_else ( || {
@@ -710,7 +804,10 @@ impl<'a> ClarityDatabase<'a> {
710
804
contract_identifier : & QualifiedContractIdentifier ,
711
805
data_size : u64 ,
712
806
) -> Result < ( ) > {
713
- let key = ClarityDatabase :: make_metadata_key ( StoreType :: Contract , "contract-size" ) ;
807
+ let key = ClarityDatabase :: make_metadata_key (
808
+ StoreType :: Contract ,
809
+ ContractDataVarName :: ContractSize . as_str ( ) ,
810
+ ) ;
714
811
let contract_size: u64 =
715
812
self . fetch_metadata ( contract_identifier, & key) ?
716
813
. ok_or_else ( || {
@@ -720,7 +817,10 @@ impl<'a> ClarityDatabase<'a> {
720
817
} ) ?;
721
818
contract_size. cost_overflow_add ( data_size) ?;
722
819
723
- let key = ClarityDatabase :: make_metadata_key ( StoreType :: Contract , "contract-data-size" ) ;
820
+ let key = ClarityDatabase :: make_metadata_key (
821
+ StoreType :: Contract ,
822
+ ContractDataVarName :: ContractDataSize . as_str ( ) ,
823
+ ) ;
724
824
self . insert_metadata ( contract_identifier, & key, & data_size) ?;
725
825
Ok ( ( ) )
726
826
}
@@ -730,21 +830,30 @@ impl<'a> ClarityDatabase<'a> {
730
830
contract_identifier : & QualifiedContractIdentifier ,
731
831
contract : Contract ,
732
832
) -> Result < ( ) > {
733
- let key = ClarityDatabase :: make_metadata_key ( StoreType :: Contract , "contract" ) ;
833
+ let key = ClarityDatabase :: make_metadata_key (
834
+ StoreType :: Contract ,
835
+ ContractDataVarName :: Contract . as_str ( ) ,
836
+ ) ;
734
837
self . insert_metadata ( contract_identifier, & key, & contract) ?;
735
838
Ok ( ( ) )
736
839
}
737
840
738
841
pub fn has_contract ( & mut self , contract_identifier : & QualifiedContractIdentifier ) -> bool {
739
- let key = ClarityDatabase :: make_metadata_key ( StoreType :: Contract , "contract" ) ;
842
+ let key = ClarityDatabase :: make_metadata_key (
843
+ StoreType :: Contract ,
844
+ ContractDataVarName :: Contract . as_str ( ) ,
845
+ ) ;
740
846
self . store . has_metadata_entry ( contract_identifier, & key)
741
847
}
742
848
743
849
pub fn get_contract (
744
850
& mut self ,
745
851
contract_identifier : & QualifiedContractIdentifier ,
746
852
) -> Result < Contract > {
747
- let key = ClarityDatabase :: make_metadata_key ( StoreType :: Contract , "contract" ) ;
853
+ let key = ClarityDatabase :: make_metadata_key (
854
+ StoreType :: Contract ,
855
+ ContractDataVarName :: Contract . as_str ( ) ,
856
+ ) ;
748
857
let mut data: Contract = self . fetch_metadata ( contract_identifier, & key) ?
749
858
. ok_or_else ( || InterpreterError :: Expect (
750
859
"Failed to read non-consensus contract metadata, even though contract exists in MARF."
0 commit comments