@@ -28,6 +28,10 @@ pub enum EraMarkersPayloadError {
28
28
#[ error( "could not deserialize signature: {0}" ) ]
29
29
DeserializeSignature ( GeneralError ) ,
30
30
31
+ /// Error raised when the signature is missing
32
+ #[ error( "could not verify signature: signature is missing" ) ]
33
+ MissingSignature ,
34
+
31
35
/// Error raised when the signature is invalid
32
36
#[ error( "could not verify signature: {0}" ) ]
33
37
VerifySignature ( GeneralError ) ,
@@ -37,45 +41,57 @@ pub enum EraMarkersPayloadError {
37
41
CreateSignature ( GeneralError ) ,
38
42
}
39
43
44
+ /// Era markers payload
40
45
#[ derive( Debug , Clone , PartialEq , Eq , Serialize , Deserialize ) ]
41
- struct EraMarkersPayload {
46
+ pub struct EraMarkersPayload {
42
47
markers : Vec < EraMarker > ,
43
- signature : HexEncodeEraMarkerSignature ,
48
+ signature : Option < HexEncodeEraMarkerSignature > ,
44
49
}
45
50
46
51
impl EraMarkersPayload {
47
- fn message_to_sign ( & self ) -> Result < Vec < u8 > , EraMarkersPayloadError > {
52
+ fn message_to_bytes ( & self ) -> Result < Vec < u8 > , EraMarkersPayloadError > {
48
53
serde_json:: to_vec ( & self . markers )
49
54
. map_err ( |e| EraMarkersPayloadError :: SerializeMessage ( e. into ( ) ) )
50
55
}
51
56
52
- fn verify_signature (
57
+ fn deserialize_signature ( & self ) -> Result < EraMarkersVerifierSignature , EraMarkersPayloadError > {
58
+ EraMarkersVerifierSignature :: from_bytes (
59
+ & Vec :: from_hex (
60
+ self . signature
61
+ . as_ref ( )
62
+ . ok_or ( EraMarkersPayloadError :: MissingSignature ) ?,
63
+ )
64
+ . map_err ( |e| EraMarkersPayloadError :: DeserializeSignature ( e. into ( ) ) ) ?,
65
+ )
66
+ . map_err ( |e| EraMarkersPayloadError :: DeserializeSignature ( e. into ( ) ) )
67
+ }
68
+
69
+ /// Verify the signature an era markers payload
70
+ pub fn verify_signature (
53
71
& self ,
54
72
verification_key : EraMarkersVerifierVerificationKey ,
55
73
) -> Result < ( ) , EraMarkersPayloadError > {
56
- let signature = EraMarkersVerifierSignature :: from_bytes (
57
- & Vec :: from_hex ( & self . signature )
58
- . map_err ( |e| EraMarkersPayloadError :: DeserializeSignature ( e. into ( ) ) ) ?,
59
- )
60
- . map_err ( |e| EraMarkersPayloadError :: DeserializeSignature ( e. into ( ) ) ) ?;
61
74
let markers_verifier = EraMarkersVerifier :: from_verification_key ( verification_key) ;
75
+
62
76
markers_verifier
63
- . verify ( & self . message_to_sign ( ) ?, & signature )
77
+ . verify ( & self . message_to_bytes ( ) ?, & self . deserialize_signature ( ) ? )
64
78
. map_err ( |e| EraMarkersPayloadError :: VerifySignature ( e. into ( ) ) )
65
79
}
66
80
67
- #[ cfg( any( test, feature = "test_only" ) ) ]
68
- fn sign ( self , signer : & EraMarkersSigner ) -> Result < Self , EraMarkersPayloadError > {
81
+ /// Sign an era markers payload
82
+ #[ allow( dead_code) ]
83
+ pub fn sign ( self , signer : & EraMarkersSigner ) -> Result < Self , EraMarkersPayloadError > {
69
84
let signature = signer
70
85
. sign (
71
86
& self
72
- . message_to_sign ( )
87
+ . message_to_bytes ( )
73
88
. map_err ( |e| EraMarkersPayloadError :: CreateSignature ( e. into ( ) ) ) ?,
74
89
)
75
90
. encode_hex :: < String > ( ) ;
91
+
76
92
Ok ( Self {
77
93
markers : self . markers ,
78
- signature,
94
+ signature : Some ( signature ) ,
79
95
} )
80
96
}
81
97
}
@@ -111,7 +127,7 @@ impl EraReaderAdapter for CardanoChainAdapter {
111
127
. await ?;
112
128
let markers_list = tx_datums
113
129
. into_iter ( )
114
- . filter_map ( |datum| datum. get_field_raw_value ( "bytes" , 0 ) . ok ( ) )
130
+ . filter_map ( |datum| datum. get_nth_field_by_type ( "bytes" , 0 ) . ok ( ) )
115
131
. filter_map ( |field_value| field_value. as_str ( ) . map ( |s| s. to_string ( ) ) )
116
132
. filter_map ( |field_value_str| key_decode_hex ( & field_value_str) . ok ( ) )
117
133
. filter_map ( |era_markers_payload : EraMarkersPayload | {
@@ -121,6 +137,7 @@ impl EraReaderAdapter for CardanoChainAdapter {
121
137
. map ( |_| era_markers_payload. markers )
122
138
} )
123
139
. collect :: < Vec < Vec < EraMarker > > > ( ) ;
140
+
124
141
Ok ( markers_list. first ( ) . unwrap_or ( & Vec :: new ( ) ) . to_owned ( ) )
125
142
}
126
143
}
@@ -154,14 +171,14 @@ mod test {
154
171
EraMarker :: new( "thales" , Some ( Epoch ( 1 ) ) ) ,
155
172
EraMarker :: new( "pythagoras" , None ) ,
156
173
] ,
157
- signature : "" . to_string ( ) ,
174
+ signature : None ,
158
175
} ;
159
176
let era_marker_payload_2 = EraMarkersPayload {
160
177
markers : vec ! [
161
178
EraMarker :: new( "thales" , Some ( Epoch ( 1 ) ) ) ,
162
179
EraMarker :: new( "pythagoras" , Some ( Epoch ( 2 ) ) ) ,
163
180
] ,
164
- signature : "" . to_string ( ) ,
181
+ signature : None ,
165
182
} ;
166
183
let mut fake_datums = dummy_tx_datums_from_markers_payload ( vec ! [
167
184
era_marker_payload_1,
0 commit comments