55
66// use blake2::Blake2b;
77use codec:: { Decode , Encode } ;
8- use rstd:: vec:: Vec ;
8+ use rstd:: { result , vec:: Vec } ;
99use sr_eth_primitives:: {
1010 header:: EthHeader , pow:: EthashPartial , pow:: EthashSeal , receipt:: Receipt , BlockNumber as EthBlockNumber , H256 , U256 ,
1111} ;
@@ -84,7 +84,7 @@ decl_storage! {
8484 config( genesis_difficulty) : u64 ;
8585 build( |config| {
8686 if let Some ( h) = & config. header {
87- let header: EthHeader = rlp:: decode( & h) . expect( "Deserialize Header - FAILED" ) ;
87+ let header: EthHeader = rlp:: decode( & h) . expect( "Deserialize Genesis Header - FAILED" ) ;
8888
8989 <Module <T >>:: init_genesis_header( & header, config. genesis_difficulty) ;
9090
@@ -126,11 +126,9 @@ decl_module! {
126126 pub fn check_receipt( origin, proof_record: ActionRecord ) {
127127 let _relayer = ensure_signed( origin) ?;
128128
129- let verified_receipt = Self :: verify_receipt( & proof_record) ;
129+ let verified_receipt = Self :: verify_receipt( & proof_record) ? ;
130130
131- ensure!( verified_receipt. is_some( ) , "Receipt Proof Verification - FAILED" ) ;
132-
133- <Module <T >>:: deposit_event( RawEvent :: RelayProof ( verified_receipt. unwrap( ) , proof_record) ) ;
131+ <Module <T >>:: deposit_event( RawEvent :: RelayProof ( verified_receipt, proof_record) ) ;
134132 }
135133
136134 // Assuming that there are at least one honest worker submiting headers
@@ -184,25 +182,16 @@ impl<T: Trait> Module<T> {
184182 BeginHeader :: put ( header. clone ( ) ) ;
185183 }
186184
187- fn verify_receipt ( proof_record : & ActionRecord ) -> Option < Receipt > {
188- let header_hash = proof_record. header_hash ;
189- if !HeaderOf :: exists ( header_hash) {
190- return None ; //Err("This block header does not exist.");
191- }
192-
193- let header = HeaderOf :: get ( header_hash) . unwrap ( ) ;
194-
195- let proof: Proof = rlp:: decode ( & proof_record. proof ) . unwrap ( ) ;
185+ fn verify_receipt ( proof_record : & ActionRecord ) -> result:: Result < Receipt , & ' static str > {
186+ let header = Self :: header_of ( & proof_record. header_hash ) . ok_or ( "Header - NOT EXISTED" ) ?;
187+ let proof: Proof = rlp:: decode ( & proof_record. proof ) . map_err ( |_| "Rlp Decode - FAILED" ) ?;
196188 let key = rlp:: encode ( & proof_record. index ) ;
189+ let value = MerklePatriciaTrie :: verify_proof ( header. receipts_root ( ) . 0 . to_vec ( ) , & key, proof)
190+ . map_err ( |_| "Verify Proof - FAILED" ) ?
191+ . ok_or ( "Trie Key - NOT EXISTED" ) ?;
192+ let receipt = rlp:: decode ( & value) . map_err ( |_| "Deserialize Receipt - FAILED" ) ?;
197193
198- let value = MerklePatriciaTrie :: verify_proof ( header. receipts_root ( ) . 0 . to_vec ( ) , & key, proof) . unwrap ( ) ;
199- if !value. is_some ( ) {
200- return None ;
201- }
202-
203- let proof_receipt: Receipt = rlp:: decode ( & value. unwrap ( ) ) . expect ( "Deserialize Receipt - FAILED" ) ;
204-
205- Some ( proof_receipt)
194+ Ok ( receipt)
206195 // confirm that the block hash is right
207196 // get the receipt MPT trie root from the block header
208197 // Using receipt MPT trie root to verify the proof and index etc.
@@ -218,11 +207,11 @@ impl<T: Trait> Module<T> {
218207 let number = header. number ( ) ;
219208
220209 ensure ! (
221- number >= Self :: begin_header( ) . expect ( "Begin Header - NOT EXISTED" ) . number( ) ,
210+ number >= Self :: begin_header( ) . ok_or ( "Begin Header - NOT EXISTED" ) ? . number( ) ,
222211 "Block Number - TOO SMALL"
223212 ) ;
224213
225- let prev_header = Self :: header_of ( parent_hash) . expect ( "Previous Header - NOT EXISTED" ) ;
214+ let prev_header = Self :: header_of ( parent_hash) . ok_or ( "Previous Header - NOT EXISTED" ) ? ;
226215 ensure ! ( ( prev_header. number( ) + 1 ) == number, "Block Number - NOT MATCHED" ) ;
227216
228217 // check difficulty
@@ -239,7 +228,9 @@ impl<T: Trait> Module<T> {
239228
240229 // verify mixhash
241230 match T :: EthNetwork :: get ( ) {
242- 1 => { } , // TODO: Ropsten have issues, do not verify mixhash.
231+ 1 => {
232+ // TODO: Ropsten have issues, do not verify mixhash
233+ }
243234 _ => {
244235 let seal = EthashSeal :: parse_seal ( header. seal ( ) ) ?;
245236
@@ -250,7 +241,7 @@ impl<T: Trait> Module<T> {
250241 if mix_hash != seal. mix_hash {
251242 return Err ( "Mixhash - NOT MATCHED" ) ;
252243 }
253- } ,
244+ }
254245 } ;
255246
256247 // ensure!(best_header.height == block_number, "Block height does not match.");
0 commit comments