Skip to content

Commit 8804585

Browse files
authored
Merge pull request #152 from AurevoirXavier/update-eth-relay
update: handle eth-relay error
2 parents 4521f6e + ce35fa0 commit 8804585

2 files changed

Lines changed: 20 additions & 29 deletions

File tree

core/merkle-patricia-trie/src/trie.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,9 +160,9 @@ impl Trie for MerklePatriciaTrie {
160160
memdb.insert(hash, node_encoded);
161161
}
162162
}
163-
let trie = MerklePatriciaTrie::from(memdb, &root_hash).or(Err(TrieError::InvalidProof))?;
163+
let trie = MerklePatriciaTrie::from(memdb, &root_hash)?;
164164

165-
trie.get(key).or(Err(TrieError::InvalidProof))
165+
trie.get(key)
166166
}
167167
}
168168

srml/eth-relay/src/lib.rs

Lines changed: 18 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
// use blake2::Blake2b;
77
use codec::{Decode, Encode};
8-
use rstd::vec::Vec;
8+
use rstd::{result, vec::Vec};
99
use 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

Comments
 (0)