Skip to content
This repository has been archived by the owner on Aug 1, 2023. It is now read-only.

Commit

Permalink
Prevent the extra block fetch from worker + small fixes + bump m16 (#387
Browse files Browse the repository at this point in the history
)
  • Loading branch information
jflatow authored Jun 25, 2021
1 parent 38d325e commit bf58203
Show file tree
Hide file tree
Showing 8 changed files with 81 additions and 47 deletions.
9 changes: 5 additions & 4 deletions ethereum-client/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -242,12 +242,13 @@ pub fn get_block(
}
}

// note these error messages are imperfect as they don't show the broken data
// but also should never happen and not worth fixing for now
Ok(EthereumBlock {
hash: parse_word(block_obj.hash).ok_or_else(|| parse_error(&get_logs_response_str[..]))?,
hash: parse_word(block_obj.hash).ok_or_else(|| parse_error("bad hash"))?,
parent_hash: parse_word(block_obj.parentHash)
.ok_or_else(|| parse_error(&get_logs_response_str[..]))?,
number: parse_u64(block_obj.number)
.ok_or_else(|| parse_error(&get_logs_response_str[..]))?,
.ok_or_else(|| parse_error("bad parent hash"))?,
number: parse_u64(block_obj.number).ok_or_else(|| parse_error("bad block number"))?,
events,
})
}
Expand Down
1 change: 1 addition & 0 deletions pallets/cash/fuzz/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions pallets/cash/src/chains.rs
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,14 @@ impl ChainBlock {
.map(move |e| ChainBlockEvent::Eth(block.number, e.clone())),
}
}

pub fn concat(self, chain_blocks: ChainBlocks) -> Result<ChainBlocks, Reason> {
match (self, chain_blocks) {
(ChainBlock::Eth(block), ChainBlocks::Eth(blocks)) => {
Ok(ChainBlocks::Eth([vec![block], blocks].concat()))
}
}
}
}

/// Type for describing a set of blocks coming from an underlying chain.
Expand Down
52 changes: 38 additions & 14 deletions pallets/cash/src/internal/events.rs
Original file line number Diff line number Diff line change
Expand Up @@ -102,29 +102,41 @@ pub fn track_chain_events_on<T: Config>(chain_id: ChainId) -> Result<(), Reason>
let starport = get_starport::<T>(chain_id)?;
let me = get_current_validator::<T>()?;
let last_block = get_last_block::<T>(chain_id)?;
let true_block = fetch_chain_block(chain_id, last_block.number(), starport)?;
if last_block.hash() == true_block.hash() {
let next_block_number = last_block
.number()
.checked_add(1)
.ok_or(MathError::Overflow)?;
let next_block = fetch_chain_block(chain_id, next_block_number, starport)?;
if last_block.hash() == next_block.parent_hash() {
debug!(
"Worker sees the same fork: true={:?} last={:?}",
true_block, last_block
"Worker sees the same fork: next={:?} last={:?}",
next_block, last_block
);
let pending_blocks = PendingChainBlocks::get(chain_id);
let event_queue = get_event_queue::<T>(chain_id)?;
let slack = queue_slack(&event_queue) as u64;
let blocks = fetch_chain_blocks(
chain_id,
last_block.number() + 1,
last_block.number() + 1 + slack,
starport,
)?
.filter_already_supported(&me.substrate_id, pending_blocks);
let blocks = next_block
.concat(fetch_chain_blocks(
chain_id,
next_block_number
.checked_add(1)
.ok_or(MathError::Overflow)?,
next_block_number
.checked_add(1)
.ok_or(MathError::Overflow)?
.checked_add(slack)
.ok_or(MathError::Overflow)?,
starport,
)?)?
.filter_already_supported(&me.substrate_id, pending_blocks);
memorize_chain_blocks::<T>(&blocks)?;
submit_chain_blocks::<T>(&blocks)
} else {
debug!(
"Worker sees a different fork: true={:?} last={:?}",
true_block, last_block
"Worker sees a different fork: next={:?} last={:?}",
next_block, last_block
);
let true_block = fetch_chain_block(chain_id, last_block.number(), starport)?;
let pending_reorgs = PendingChainReorgs::get(chain_id);
let reorg = formulate_reorg::<T>(chain_id, &last_block, &true_block)?;
if !reorg.is_already_signed(&me.substrate_id, pending_reorgs) {
Expand Down Expand Up @@ -522,7 +534,19 @@ mod tests {
let last_block = old_chain.last().unwrap().clone();
let true_block = new_chain.last().unwrap().clone();

let mut fetched_blocks = new_chain[0..9].iter().rev().cloned().collect::<Vec<_>>();
let mut fetched_blocks = vec![EthereumBlock {
hash: [10u8; 32],
parent_hash: true_block.hash,
number: 10,
events: vec![],
}];
fetched_blocks.extend(new_chain[0..9].iter().rev().cloned().collect::<Vec<_>>());
fetched_blocks.push(EthereumBlock {
hash: [10u8; 32],
parent_hash: last_block.hash,
number: 10,
events: vec![],
});
fetched_blocks.extend(old_chain[1..10].iter().rev().cloned());
let calls = gen_mock_calls(&fetched_blocks, ETH_STARPORT_ADDR);
let (mut t, _, _) = new_test_ext_with_http_calls(calls);
Expand Down
4 changes: 2 additions & 2 deletions pallets/cash/src/tests/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,7 @@ pub fn gen_mock_calls(
let mut calls = vec![];
for block in blocks {
let block_str = encode_block_hex(block.number);
let block_hash_str = format!("0x{}", hex::encode(block.hash));

let get_block_params: Vec<serde_json::Value> = vec![block_str.clone().into(), false.into()];

Expand Down Expand Up @@ -245,8 +246,7 @@ pub fn gen_mock_calls(

let get_logs_params = vec![serde_json::json!({
"address": format!("0x{}", ::hex::encode(&starport_address[..])),
"fromBlock": &block_str,
"toBlock": &block_str,
"blockHash": block_hash_str,
})];

let get_logs_data = serde_json::json!({
Expand Down
30 changes: 15 additions & 15 deletions pallets/cash/src/tests/testdata.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,21 @@ pub mod json_responses {
"result": null
}"#;

pub const GET_BLOCK_BY_NUMBER_1: &[u8] = br#"{
pub const GET_BLOCK_BY_NUMBER_2: &[u8] = br#"{
"jsonrpc":"2.0",
"id":1,
"result":{
"difficulty":"0xb9e274f7969f5",
"extraData":"0x65746865726d696e652d657531",
"gasLimit":"0x7a121d",
"gasUsed":"0x781503",
"hash":"0x61314c1c6837e15e60c5b6732f092118dd25e3ec681f5e089b3a9ad2374e5a8a",
"hash":"0x50314c1c6837e15e60c5b6732f092118dd25e3ec681f5e089b3a9ad2374e5a8a",
"logsBloom":"0x044410ea904e1020440110008000902200168801c81010301489212010002008080b0010004001b006040222c42004b001200408400500901889c908212040401020008d300010100198d10800100080027900254120000000530141030808140c299400162c0000d200204080008838240009002c020010400010101000481660200420a884b8020282204a00141ce10805004810800190180114180001b0001b1000020ac8040007000320b0480004018240891882a20080010281002c00000010102e0184210003010100438004202003080401000806204010000a42200104110100201200008081005001104002410140114a002010808c00200894c0c0",
"miner":"0xea674fdde714fd979de3edf0f56aa9716b898ec8",
"mixHash":"0xd733e12126a2155f0278c3987777eaca558a274b42d0396306dffb8fa6d21e76",
"nonce":"0x56a66f3802150748",
"number":"0x1",
"parentHash":"0x062e77dced431eb671a56839f96da912f68d841024665748d38cd3d6795961ea",
"number":"0x2",
"parentHash":"0x61314c1c6837e15e60c5b6732f092118dd25e3ec681f5e089b3a9ad2374e5a8a",
"receiptsRoot":"0x19ad317358916207491d4b64340153b924f4dda88fa8ef5dcb49090f234c00e7",
"sha3Uncles":"0xd21bed33f01dac18a3ee5538d1607ff2709d742eb4e13877cf66dcbed6c980f2",
"size":"0x5f50",
Expand All @@ -30,20 +30,20 @@ pub mod json_responses {
"uncles":["0x5e7dde2e3811b5881a062c8b2ff7fd14687d79745e2384965d73a9df3fb0b4a8"]}
}"#;

pub const GET_BLOCK_BY_NUMBER_2: &[u8] = br#"{
pub const GET_BLOCK_BY_NUMBER_3: &[u8] = br#"{
"jsonrpc":"2.0",
"id":1,
"result":{
"difficulty":"0xb9e274f7969f5",
"extraData":"0x65746865726d696e652d657531",
"gasLimit":"0x7a121d",
"gasUsed":"0x781503",
"hash":"0x61314c1c6837e15e60c5b6732f092118dd25e3ec681f5e089b3a9ad2374e5a8a",
"hash":"0x72314c1c6837e15e60c5b6732f092118dd25e3ec681f5e089b3a9ad2374e5a8a",
"logsBloom":"0x044410ea904e1020440110008000902200168801c81010301489212010002008080b0010004001b006040222c42004b001200408400500901889c908212040401020008d300010100198d10800100080027900254120000000530141030808140c299400162c0000d200204080008838240009002c020010400010101000481660200420a884b8020282204a00141ce10805004810800190180114180001b0001b1000020ac8040007000320b0480004018240891882a20080010281002c00000010102e0184210003010100438004202003080401000806204010000a42200104110100201200008081005001104002410140114a002010808c00200894c0c0",
"miner":"0xea674fdde714fd979de3edf0f56aa9716b898ec8",
"mixHash":"0xd733e12126a2155f0278c3987777eaca558a274b42d0396306dffb8fa6d21e76",
"nonce":"0x56a66f3802150748",
"number":"0x1",
"number":"0x3",
"parentHash":"0x61314c1c6837e15e60c5b6732f092118dd25e3ec681f5e089b3a9ad2374e5a8a",
"receiptsRoot":"0x19ad317358916207491d4b64340153b924f4dda88fa8ef5dcb49090f234c00e7",
"sha3Uncles":"0xd21bed33f01dac18a3ee5538d1607ff2709d742eb4e13877cf66dcbed6c980f2",
Expand All @@ -55,20 +55,20 @@ pub mod json_responses {
"uncles":["0x5e7dde2e3811b5881a062c8b2ff7fd14687d79745e2384965d73a9df3fb0b4a8"]}
}"#;

pub const GET_LOGS_1: &[u8] = br#"{
pub const GET_LOGS_2: &[u8] = br#"{
"jsonrpc":"2.0",
"id":1,
"result": []
}"#;

pub const GET_LOGS_2: &[u8] = br#"{
pub const GET_LOGS_3: &[u8] = br#"{
"jsonrpc":"2.0",
"id":1,
"result": [
{
"address":"0xbbde1662bc3ed16aa8c618c9833c801f3543b587",
"blockHash":"0xc1c0eb37b56923ad9e20fdb31ca882988d5217f7ca24b6297ca6ed700811cf23",
"blockNumber":"0x3adf2f",
"blockHash":"0x72314c1c6837e15e60c5b6732f092118dd25e3ec681f5e089b3a9ad2374e5a8a",
"blockNumber":"0x3",
"data":"0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000034554480000000000000000000000000000000000000000000000000000000000",
"logIndex":"0x0",
"removed":false,
Expand All @@ -83,8 +83,8 @@ pub mod json_responses {
},
{
"address":"0xbbde1662bc3ed16aa8c618c9833c801f3543b587",
"blockHash":"0xa5c8024e699a5c30eb965e47b5157c06c76f3b726bff377a0a5333a561f25648",
"blockNumber":"0x3c02e1",
"blockHash":"0x72314c1c6837e15e60c5b6732f092118dd25e3ec681f5e089b3a9ad2374e5a8a",
"blockNumber":"0x3",
"data":"0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000034554480000000000000000000000000000000000000000000000000000000000",
"logIndex":"0x1",
"removed":false,
Expand All @@ -99,8 +99,8 @@ pub mod json_responses {
},
{
"address":"0xbbde1662bc3ed16aa8c618c9833c801f3543b587",
"blockHash":"0xa4a96e957718e3a30b77a667f93978d8f438bdcd56ff03545f08c833d9a26687",
"blockNumber":"0x3c030b",
"blockHash":"0x72314c1c6837e15e60c5b6732f092118dd25e3ec681f5e089b3a9ad2374e5a8a",
"blockNumber":"0x3",
"data":"0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000034554480000000000000000000000000000000000000000000000000000000000",
"logIndex":"0xe",
"removed":false,
Expand Down
22 changes: 11 additions & 11 deletions pallets/cash/src/tests/worker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,43 +10,43 @@ fn test_offchain_worker() {
method: "POST".into(),
uri: "https://ropsten-eth.compound.finance".to_string(),
headers: vec![("Content-Type".to_owned(), "application/json".to_owned())],
body: br#"{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x1",false],"id":1}"#.to_vec(),
response: Some(tests::testdata::json_responses::GET_BLOCK_BY_NUMBER_1.to_vec()),
body: br#"{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x2",false],"id":1}"#.to_vec(),
response: Some(tests::testdata::json_responses::GET_BLOCK_BY_NUMBER_2.to_vec()),
sent: true,
..Default::default()
},
testing::PendingRequest {
method: "POST".into(),
uri: "https://ropsten-eth.compound.finance".to_string(),
headers: vec![("Content-Type".to_owned(), "application/json".to_owned())],
body: br#"{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"address":"0x7777777777777777777777777777777777777777","blockHash":"0x61314c1c6837e15e60c5b6732f092118dd25e3ec681f5e089b3a9ad2374e5a8a"}],"id":1}"#.to_vec(),
response: Some(testdata::json_responses::GET_LOGS_1.to_vec()),
body: br#"{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"address":"0x7777777777777777777777777777777777777777","blockHash":"0x50314c1c6837e15e60c5b6732f092118dd25e3ec681f5e089b3a9ad2374e5a8a"}],"id":1}"#.to_vec(),
response: Some(testdata::json_responses::GET_LOGS_2.to_vec()),
sent: true,
..Default::default()
},
testing::PendingRequest {
method: "POST".into(),
uri: "https://ropsten-eth.compound.finance".to_string(),
headers: vec![("Content-Type".to_owned(), "application/json".to_owned())],
body: br#"{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x2",false],"id":1}"#.to_vec(),
response: Some(tests::testdata::json_responses::GET_BLOCK_BY_NUMBER_2.to_vec()),
body: br#"{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x3",false],"id":1}"#.to_vec(),
response: Some(tests::testdata::json_responses::GET_BLOCK_BY_NUMBER_3.to_vec()),
sent: true,
..Default::default()
},
testing::PendingRequest {
method: "POST".into(),
uri: "https://ropsten-eth.compound.finance".to_string(),
headers: vec![("Content-Type".to_owned(), "application/json".to_owned())],
body: br#"{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"address":"0x7777777777777777777777777777777777777777","blockHash":"0x61314c1c6837e15e60c5b6732f092118dd25e3ec681f5e089b3a9ad2374e5a8a"}],"id":1}"#.to_vec(),
response: Some(testdata::json_responses::GET_LOGS_2.to_vec()),
body: br#"{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"address":"0x7777777777777777777777777777777777777777","blockHash":"0x72314c1c6837e15e60c5b6732f092118dd25e3ec681f5e089b3a9ad2374e5a8a"}],"id":1}"#.to_vec(),
response: Some(testdata::json_responses::GET_LOGS_3.to_vec()),
sent: true,
..Default::default()
},
testing::PendingRequest {
method: "POST".into(),
uri: "https://ropsten-eth.compound.finance".to_string(),
headers: vec![("Content-Type".to_owned(), "application/json".to_owned())],
body: br#"{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x3",false],"id":1}"#.to_vec(),
body: br#"{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x4",false],"id":1}"#.to_vec(),
response: Some(tests::testdata::json_responses::NO_RESULT.to_vec()),
sent: true,
..Default::default()
Expand All @@ -71,10 +71,10 @@ fn test_offchain_worker() {

if let mock::Call::Cash(crate::Call::receive_chain_blocks(blocks, _signature)) = ex1.call {
assert_eq!(blocks.chain_id(), ChainId::Eth);
assert_eq!(blocks.len(), 1);
assert_eq!(blocks.len(), 2);
match blocks {
ChainBlocks::Eth(blocks) => {
let block = &blocks[0];
let block = &blocks[1];
assert_eq!(block.events.len(), 3);

let event = &block.events[1];
Expand Down
2 changes: 1 addition & 1 deletion runtime/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion {
spec_name: create_runtime_str!("gateway"),
impl_name: create_runtime_str!("gateway"),
authoring_version: 1,
spec_version: 15,
spec_version: 16,
impl_version: 1,
apis: RUNTIME_API_VERSIONS,
transaction_version: 1,
Expand Down

0 comments on commit bf58203

Please sign in to comment.