1
1
use crate :: {
2
2
chain_observer:: { ChainAddress , ChainObserver , TxDatumFieldTypeName } ,
3
3
crypto_helper:: {
4
- key_decode_hex, EraMarkersSigner , EraMarkersVerifier , EraMarkersVerifierSignature ,
5
- EraMarkersVerifierVerificationKey ,
4
+ key_decode_hex, key_encode_hex , EraMarkersSigner , EraMarkersVerifier ,
5
+ EraMarkersVerifierSignature , EraMarkersVerifierVerificationKey ,
6
6
} ,
7
7
era:: { EraMarker , EraReaderAdapter } ,
8
8
StdError , StdResult ,
9
9
} ;
10
+ use anyhow:: anyhow;
10
11
use async_trait:: async_trait;
11
12
use serde:: { Deserialize , Serialize } ;
12
13
use std:: sync:: Arc ;
@@ -52,6 +53,20 @@ impl EraMarkersPayload {
52
53
. map_err ( |e| EraMarkersPayloadError :: SerializeMessage ( e. into ( ) ) )
53
54
}
54
55
56
+ /// Encode this payload to a json hex string
57
+ pub fn to_json_hex ( & self ) -> StdResult < String > {
58
+ key_encode_hex ( self )
59
+ . map_err ( |e| anyhow ! ( e) . context ( "era markers payload could not be json hex encoded" ) )
60
+ }
61
+
62
+ /// Decode a [EraMarkersPayload] from a json hex string
63
+ pub fn from_json_hex ( payload : & str ) -> StdResult < Self > {
64
+ let payload = key_decode_hex ( payload) . map_err ( |e| {
65
+ anyhow ! ( e) . context ( "era markers payload could not be decoded from json hex" )
66
+ } ) ?;
67
+ Ok ( payload)
68
+ }
69
+
55
70
/// Verify the signature an era markers payload
56
71
pub fn verify_signature (
57
72
& self ,
@@ -60,7 +75,8 @@ impl EraMarkersPayload {
60
75
let signature = self
61
76
. signature
62
77
. ok_or ( EraMarkersPayloadError :: MissingSignature ) ?;
63
- let markers_verifier = EraMarkersVerifier :: from_verification_key ( verification_key) ;
78
+ let markers_verifier: EraMarkersVerifier =
79
+ EraMarkersVerifier :: from_verification_key ( verification_key) ;
64
80
65
81
markers_verifier
66
82
. verify ( & self . message_to_bytes ( ) ?, & signature)
@@ -121,8 +137,8 @@ impl EraReaderAdapter for CardanoChainAdapter {
121
137
. collect :: < Vec < String > > ( )
122
138
. join ( "" )
123
139
} )
124
- . filter_map ( |field_value_str| key_decode_hex ( & field_value_str) . ok ( ) )
125
- . filter_map ( |era_markers_payload : EraMarkersPayload | {
140
+ . filter_map ( |field_value_str| EraMarkersPayload :: from_json_hex ( & field_value_str) . ok ( ) )
141
+ . filter_map ( |era_markers_payload| {
126
142
era_markers_payload
127
143
. verify_signature ( self . verification_key )
128
144
. ok ( )
@@ -137,7 +153,7 @@ impl EraReaderAdapter for CardanoChainAdapter {
137
153
#[ cfg( test) ]
138
154
mod test {
139
155
use crate :: chain_observer:: { FakeObserver , TxDatum , TxDatumBuilder , TxDatumFieldValue } ;
140
- use crate :: crypto_helper:: { key_encode_hex , EraMarkersSigner } ;
156
+ use crate :: crypto_helper:: EraMarkersSigner ;
141
157
use crate :: entities:: Epoch ;
142
158
143
159
use super :: * ;
@@ -154,7 +170,7 @@ mod test {
154
170
. into_iter ( )
155
171
. map ( |payload| {
156
172
TxDatumBuilder :: new ( )
157
- . add_field ( TxDatumFieldValue :: Bytes ( key_encode_hex ( payload) . unwrap ( ) ) )
173
+ . add_field ( TxDatumFieldValue :: Bytes ( payload. to_json_hex ( ) . unwrap ( ) ) )
158
174
. build ( )
159
175
. unwrap ( )
160
176
} )
@@ -163,7 +179,7 @@ mod test {
163
179
164
180
#[ test]
165
181
fn golden_markers_payload_with_signature ( ) {
166
- let _ : EraMarkersPayload = key_decode_hex ( GOLDEN_ERA_MARKERS_PAYLOAD_WITH_SIGNATURE )
182
+ EraMarkersPayload :: from_json_hex ( GOLDEN_ERA_MARKERS_PAYLOAD_WITH_SIGNATURE )
167
183
. expect ( "Decoding golden markers payload should not fail" ) ;
168
184
}
169
185
0 commit comments