Skip to content

Commit 4c3d3c5

Browse files
committed
Merge dev
2 parents 79471c2 + 59d3b69 commit 4c3d3c5

File tree

22 files changed

+198
-177
lines changed

22 files changed

+198
-177
lines changed

core/bin/data_restore/src/data_restore_driver.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ pub struct DataRestoreDriver<T: Transport, I> {
5151
pub web3: Web3<T>,
5252
/// Provides Ethereum Governance contract interface
5353
pub governance_contract: (ethabi::Contract, Contract<T>),
54-
/// Address of the Upgrade GateKeeper contract. Provides logs about
55-
/// zkSync contract upgrades.
56-
pub upgrade_gatekeeper_addr: H160,
54+
/// Ethereum blocks that include correct UpgradeComplete events.
55+
/// Should be provided via config.
56+
pub contract_upgrade_eth_blocks: Vec<u64>,
5757
/// The initial version of the deployed zkSync contract.
5858
pub init_contract_version: u32,
5959
/// Provides Ethereum Rollup contract interface
@@ -87,8 +87,8 @@ where
8787
///
8888
/// * `web3_transport` - Web3 provider transport
8989
/// * `governance_contract_eth_addr` - Governance contract address
90-
/// * `upgrade_gatekeeper_addr` - Upgrade GateKeeper contract address
91-
/// * `init_contract_version` - The initial version of the deployed zkSync contract.
90+
/// * `upgrade_eth_blocks` - Ethereum blocks that include correct UpgradeComplete events
91+
/// * `init_contract_version` - The initial version of the deployed zkSync contract
9292
/// * `eth_blocks_step` - The step distance of viewing events in the ethereum blocks
9393
/// * `end_eth_blocks_offset` - The distance to the last ethereum block
9494
/// * `finite_mode` - Finite mode flag.
@@ -99,7 +99,7 @@ where
9999
pub fn new(
100100
web3: Web3<T>,
101101
governance_contract_eth_addr: H160,
102-
upgrade_gatekeeper_addr: H160,
102+
contract_upgrade_eth_blocks: Vec<u64>,
103103
init_contract_version: u32,
104104
eth_blocks_step: u64,
105105
end_eth_blocks_offset: u64,
@@ -121,7 +121,7 @@ where
121121
Self {
122122
web3,
123123
governance_contract,
124-
upgrade_gatekeeper_addr,
124+
contract_upgrade_eth_blocks,
125125
init_contract_version,
126126
zksync_contract,
127127
events_state,
@@ -311,7 +311,7 @@ where
311311
&self.web3,
312312
&self.zksync_contract,
313313
&self.governance_contract,
314-
self.upgrade_gatekeeper_addr,
314+
&self.contract_upgrade_eth_blocks,
315315
self.eth_blocks_step,
316316
self.end_eth_blocks_offset,
317317
self.init_contract_version,

core/bin/data_restore/src/events_state.rs

+10-20
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22
use anyhow::format_err;
33
use std::convert::TryFrom;
44
use web3::contract::Contract;
5-
use web3::types::{
6-
BlockNumber as Web3BlockNumber, FilterBuilder, Log, Transaction, H160, H256, U256, U64,
7-
};
5+
use web3::types::{BlockNumber as Web3BlockNumber, FilterBuilder, Log, Transaction, H256, U256};
86
use web3::{Transport, Web3};
97
// Workspace deps
108
use zksync_contracts::upgrade_gatekeeper;
@@ -84,7 +82,7 @@ impl EventsState {
8482
/// * `web3` - Web3 provider url
8583
/// * `zksync_contract` - Rollup contract
8684
/// * `governance_contract` - Governance contract
87-
/// * `upgrade_gatekeeper_addr` - UpgradeGateKeeper contract address
85+
/// * `contract_upgrade_eth_blocks` - Ethereum blocks that include correct UpgradeComplete events
8886
/// * `eth_blocks_step` - Blocks step for watching
8987
/// * `end_eth_blocks_offset` - Delta between last eth block and last watched block
9088
/// * `init_contract_version` - The initial version of the deployed zkSync contract
@@ -95,7 +93,7 @@ impl EventsState {
9593
web3: &Web3<T>,
9694
zksync_contract: &ZkSyncDeployedContract<T>,
9795
governance_contract: &(ethabi::Contract, Contract<T>),
98-
upgrade_gatekeeper_addr: H160,
96+
contract_upgrade_eth_blocks: &[u64],
9997
eth_blocks_step: u64,
10098
end_eth_blocks_offset: u64,
10199
init_contract_version: u32,
@@ -112,26 +110,18 @@ impl EventsState {
112110
end_eth_blocks_offset,
113111
)
114112
.await?;
115-
// Save Ethereum block numbers that correspond to `UpgradeComplete`
116-
// events emitted by the Upgrade GateKeeper.
117-
let contract_upgrade_eth_blocks: Vec<U64> =
118-
Self::get_gatekeeper_logs(web3, upgrade_gatekeeper_addr)
119-
.await?
120-
.into_iter()
121-
.map(|log| {
122-
log.block_number
123-
.expect("no Ethereum block number for upgrade log")
124-
})
125-
.collect();
113+
// Parse the initial contract version.
126114
let init_contract_version = ZkSyncContractVersion::try_from(init_contract_version)
127115
.expect("invalid initial contract version provided");
128-
116+
// Pass Ethereum block numbers that correspond to `UpgradeComplete`
117+
// events emitted by the Upgrade GateKeeper. Should be provided by the
118+
// config.
129119
self.last_watched_eth_block_number = to_block_number;
130120
for (zksync_contract, block_events) in events {
131121
self.update_blocks_state(
132122
zksync_contract,
133123
&block_events,
134-
&contract_upgrade_eth_blocks,
124+
contract_upgrade_eth_blocks,
135125
init_contract_version,
136126
);
137127
}
@@ -352,7 +342,7 @@ impl EventsState {
352342
&mut self,
353343
contract: &ZkSyncDeployedContract<T>,
354344
logs: &[Log],
355-
contract_upgrade_eth_blocks: &[U64],
345+
contract_upgrade_eth_blocks: &[u64],
356346
init_contract_version: ZkSyncContractVersion,
357347
) -> bool {
358348
if logs.is_empty() {
@@ -409,7 +399,7 @@ impl EventsState {
409399
.expect("no Ethereum block number for block log");
410400
let num = contract_upgrade_eth_blocks
411401
.iter()
412-
.filter(|block| eth_block >= **block)
402+
.filter(|block| eth_block.as_u64() >= **block)
413403
.count();
414404
let contract_version = init_contract_version.upgrade(num as u32);
415405

core/bin/data_restore/src/main.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,10 @@ struct Opt {
5050
pub struct ContractsConfig {
5151
eth_network: Network,
5252
governance_addr: Address,
53-
upgrade_gatekeeper_addr: Address,
5453
genesis_tx_hash: H256,
5554
contract_addr: Address,
5655
init_contract_version: u32,
56+
upgrade_eth_blocks: Vec<u64>,
5757
}
5858

5959
impl ContractsConfig {
@@ -70,10 +70,10 @@ impl ContractsConfig {
7070
Self {
7171
eth_network: chain_opts.eth.network,
7272
governance_addr: contracts_opts.governance_addr,
73-
upgrade_gatekeeper_addr: contracts_opts.upgrade_gatekeeper_addr,
7473
genesis_tx_hash: contracts_opts.genesis_tx_hash,
7574
contract_addr: contracts_opts.contract_addr,
7675
init_contract_version: contracts_opts.init_contract_version,
76+
upgrade_eth_blocks: contracts_opts.upgrade_eth_blocks,
7777
}
7878
}
7979
}
@@ -111,7 +111,7 @@ async fn main() {
111111
let mut driver = DataRestoreDriver::new(
112112
web3,
113113
config.governance_addr,
114-
config.upgrade_gatekeeper_addr,
114+
config.upgrade_eth_blocks,
115115
config.init_contract_version,
116116
ETH_BLOCKS_STEP,
117117
END_ETH_BLOCKS_OFFSET,

core/bin/data_restore/src/tests/mod.rs

+8-25
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use web3::{
1515
};
1616

1717
use db_test_macro::test as db_test;
18-
use zksync_contracts::{governance_contract, upgrade_gatekeeper, zksync_contract};
18+
use zksync_contracts::{governance_contract, zksync_contract};
1919
use zksync_crypto::Fr;
2020
use zksync_storage::{
2121
chain::account::AccountSchema, data_restore::DataRestoreSchema, StorageProcessor,
@@ -282,7 +282,8 @@ impl Transport for Web3Transport {
282282
#[db_test]
283283
async fn test_run_state_update(mut storage: StorageProcessor<'_>) {
284284
let contract_addr = H160::from([1u8; 20]);
285-
let upgrade_gatekeeper_addr = H160::from([2u8; 20]);
285+
// No contract upgrades.
286+
let contract_upgrade_eth_blocks = Vec::new();
286287
// Use old contract version.
287288
let init_contract_version: u32 = 3;
288289

@@ -395,7 +396,7 @@ async fn test_run_state_update(mut storage: StorageProcessor<'_>) {
395396
let mut driver = DataRestoreDriver::new(
396397
Web3::new(transport.clone()),
397398
contract_addr,
398-
upgrade_gatekeeper_addr,
399+
contract_upgrade_eth_blocks.clone(),
399400
init_contract_version,
400401
ETH_BLOCKS_STEP,
401402
END_ETH_BLOCKS_OFFSET,
@@ -430,7 +431,7 @@ async fn test_run_state_update(mut storage: StorageProcessor<'_>) {
430431
let mut driver = DataRestoreDriver::new(
431432
Web3::new(transport.clone()),
432433
contract_addr,
433-
upgrade_gatekeeper_addr,
434+
contract_upgrade_eth_blocks,
434435
init_contract_version,
435436
ETH_BLOCKS_STEP,
436437
END_ETH_BLOCKS_OFFSET,
@@ -448,16 +449,15 @@ async fn test_run_state_update(mut storage: StorageProcessor<'_>) {
448449
#[tokio::test]
449450
async fn test_with_inmemory_storage() {
450451
let contract_addr = H160::from([1u8; 20]);
451-
let upgrade_gatekeeper_addr = H160::from([2u8; 20]);
452452
// Start with V3, upgrade it after a couple of blocks to V4.
453453
let init_contract_version: u32 = 3;
454+
let contract_upgrade_eth_blocks = vec![3];
454455

455456
let mut transport = Web3Transport::new();
456457

457458
let mut interactor = InMemoryStorageInteractor::new();
458459
let contract = zksync_contract();
459460
let gov_contract = governance_contract();
460-
let upgrade_gatekeeper = upgrade_gatekeeper();
461461

462462
let block_verified_topic = contract
463463
.event("BlockVerification")
@@ -502,23 +502,6 @@ async fn test_with_inmemory_storage() {
502502
),
503503
],
504504
);
505-
// Save the event about finished upgrade in Eth block number 3.
506-
// Additional topics and data don't matter.
507-
let upgrade_complete_topic = upgrade_gatekeeper
508-
.event("UpgradeComplete")
509-
.expect("Upgrade gatekeeper abi error")
510-
.signature();
511-
transport.insert_logs(
512-
format!("{:?}", upgrade_complete_topic),
513-
vec![create_log(
514-
upgrade_gatekeeper_addr,
515-
upgrade_complete_topic,
516-
Vec::new(),
517-
Bytes(Vec::new()),
518-
3,
519-
H256::zero(),
520-
)],
521-
);
522505

523506
let block_committed_topic = contract
524507
.event("BlockCommit")
@@ -636,7 +619,7 @@ async fn test_with_inmemory_storage() {
636619
let mut driver = DataRestoreDriver::new(
637620
web3.clone(),
638621
contract_addr,
639-
upgrade_gatekeeper_addr,
622+
contract_upgrade_eth_blocks.clone(),
640623
init_contract_version,
641624
ETH_BLOCKS_STEP,
642625
END_ETH_BLOCKS_OFFSET,
@@ -664,7 +647,7 @@ async fn test_with_inmemory_storage() {
664647
let mut driver = DataRestoreDriver::new(
665648
web3.clone(),
666649
contract_addr,
667-
upgrade_gatekeeper_addr,
650+
contract_upgrade_eth_blocks,
668651
init_contract_version,
669652
ETH_BLOCKS_STEP,
670653
END_ETH_BLOCKS_OFFSET,

core/bin/zksync_api/src/fee_ticker/mod.rs

+9-2
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@ pub struct TickerConfig {
192192
gas_cost_tx: GasOperationsCost,
193193
tokens_risk_factors: HashMap<TokenId, Ratio<BigUint>>,
194194
not_subsidized_tokens: HashSet<Address>,
195+
scale_fee_coefficient: Ratio<BigUint>,
195196
}
196197

197198
#[derive(Debug, PartialEq, Eq)]
@@ -356,6 +357,10 @@ pub fn run_ticker_task(
356357
gas_cost_tx: GasOperationsCost::from_constants(config.ticker.fast_processing_coeff),
357358
tokens_risk_factors: HashMap::new(),
358359
not_subsidized_tokens: HashSet::from_iter(config.ticker.not_subsidized_tokens.clone()),
360+
scale_fee_coefficient: Ratio::new(
361+
BigUint::from(config.ticker.scale_fee_percent),
362+
BigUint::from(100u32),
363+
),
359364
};
360365

361366
let cache = (db_pool.clone(), TokenDBCache::new());
@@ -538,6 +543,7 @@ impl<API: FeeTickerAPI, INFO: FeeTickerInfo, WATCHER: TokenWatcher> FeeTicker<AP
538543
let zkp_fee = (zkp_cost_chunk * op_chunks) * &token_usd_risk;
539544
let normal_gas_fee =
540545
(&wei_price_usd * normal_gas_tx_amount.clone() * scale_gas_price.clone())
546+
* self.config.scale_fee_coefficient.clone()
541547
* &token_usd_risk;
542548
let subsidy_gas_fee =
543549
(wei_price_usd * subsidy_gas_tx_amount.clone() * scale_gas_price.clone())
@@ -594,8 +600,9 @@ impl<API: FeeTickerAPI, INFO: FeeTickerInfo, WATCHER: TokenWatcher> FeeTicker<AP
594600
}
595601

596602
let total_zkp_fee = (zkp_cost_chunk * total_op_chunks) * token_usd_risk.clone();
597-
let total_normal_gas_fee =
598-
(&wei_price_usd * total_normal_gas_tx_amount * &scale_gas_price) * &token_usd_risk;
603+
let total_normal_gas_fee = (&wei_price_usd * total_normal_gas_tx_amount * &scale_gas_price)
604+
* &token_usd_risk
605+
* self.config.scale_fee_coefficient.clone();
599606
let total_subsidy_gas_fee =
600607
(wei_price_usd * total_subsidy_gas_tx_amount * scale_gas_price) * &token_usd_risk;
601608
let normal_fee = BatchFee::new(total_zkp_fee.clone(), total_normal_gas_fee);

core/bin/zksync_api/src/fee_ticker/tests.rs

+1
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ fn get_test_ticker_config() -> TickerConfig {
123123
]
124124
.into_iter()
125125
.collect(),
126+
scale_fee_coefficient: Ratio::new(BigUint::from(150u32), BigUint::from(100u32)),
126127
}
127128
}
128129

core/bin/zksync_core/src/private_api.rs

+1
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ pub fn start_private_core_api(
209209
.wrap(actix_web::middleware::Logger::default())
210210
.wrap(vlog::actix_middleware())
211211
.app_data(web::Data::new(app_state))
212+
.app_data(web::JsonConfig::default().limit(2usize.pow(32)))
212213
.service(new_tx)
213214
.service(new_txs_batch)
214215
.service(unconfirmed_op)

core/lib/config/src/configs/contracts.rs

+3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ pub struct ContractsConfig {
1919
pub forced_exit_addr: Address,
2020
pub genesis_tx_hash: H256,
2121
pub init_contract_version: u32,
22+
pub upgrade_eth_blocks: Vec<u64>,
2223
}
2324

2425
impl ContractsConfig {
@@ -47,6 +48,7 @@ mod tests {
4748
"b99ebfea46cbe05a21cd80fe5597d97b204befc52a16303f579c607dc1ac2e2e",
4849
),
4950
init_contract_version: 4,
51+
upgrade_eth_blocks: vec![1, 4294967296, 1152921504606846976],
5052
}
5153
}
5254

@@ -64,6 +66,7 @@ CONTRACTS_DEPLOY_FACTORY_ADDR="0xFC073319977e314F251EAE6ae6bE76B0B3BAeeCF"
6466
CONTRACTS_FORCED_EXIT_ADDR="0x9c7AeE886D6FcFc14e37784f143a6dAccEf50Db7"
6567
CONTRACTS_GENESIS_TX_HASH="0xb99ebfea46cbe05a21cd80fe5597d97b204befc52a16303f579c607dc1ac2e2e"
6668
CONTRACTS_INIT_CONTRACT_VERSION=4
69+
CONTRACTS_UPGRADE_ETH_BLOCKS="1,4294967296,1152921504606846976"
6770
"#;
6871
set_env(config);
6972

core/lib/config/src/configs/ticker.rs

+4
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ pub struct TickerConfig {
2424
pub coinmarketcap_base_url: String,
2525
/// URL of CoinGecko API. Can be set to the mock server for local development.
2626
pub coingecko_base_url: String,
27+
/// Coefficient for scaling all fees in percent.
28+
pub scale_fee_percent: u32,
2729
/// Coefficient for the fee price for fast withdrawal requests.
2830
pub fast_processing_coeff: f64,
2931
/// Url to uniswap api
@@ -90,6 +92,7 @@ mod tests {
9092
token_price_source: TokenPriceSource::CoinGecko,
9193
coinmarketcap_base_url: "http://127.0.0.1:9876".into(),
9294
coingecko_base_url: "http://127.0.0.1:9876".into(),
95+
scale_fee_percent: 100,
9396
fast_processing_coeff: 10.0f64,
9497
uniswap_url: "http://127.0.0.1:9975/graphql".to_string(),
9598
liquidity_volume: 100.0,
@@ -122,6 +125,7 @@ FEE_TICKER_LIQUIDITY_VOLUME=100
122125
FEE_TICKER_NUMBER_OF_TICKER_ACTORS="4"
123126
FEE_TICKER_SUBSIDIZED_TOKENS="0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e"
124127
FEE_TICKER_SUBSIDIZED_TOKENS_LIMITS=156
128+
FEE_TICKER_SCALE_FEE_PERCENT=100
125129
"#;
126130
set_env(config);
127131

core/lib/state/src/state.rs

+7-3
Original file line numberDiff line numberDiff line change
@@ -342,12 +342,15 @@ impl ZkSyncState {
342342

343343
#[doc(hidden)] // Public for benches.
344344
pub fn insert_account(&mut self, id: AccountId, account: Account) {
345-
assert!(id <= self.next_free_id);
345+
// Even though account ids are expected to be sequential,
346+
// we have to allow gaps between them since such data
347+
// is already published on chain. Otherwise, restore would not
348+
// be possible.
346349

347350
self.account_id_by_address.insert(account.address, id);
348351
self.balance_tree.insert(*id, account);
349-
if id == self.next_free_id {
350-
*self.next_free_id += 1;
352+
if id >= self.next_free_id {
353+
self.next_free_id = id + 1;
351354
}
352355
}
353356

@@ -999,6 +1002,7 @@ mod tests {
9991002
/// Checks if insert_account panics if account has id greater that next_free_id.
10001003
#[should_panic(expected = "assertion failed: id <= self.next_free_id")]
10011004
#[test]
1005+
#[ignore = "non-sequential ids are allowed to make data_restore possible"]
10021006
fn insert_account_with_bigger_id() {
10031007
let mut rng = XorShiftRng::from_seed([1, 2, 3, 4]);
10041008
let mut random_addresses = Vec::new();

0 commit comments

Comments
 (0)