Skip to content

Commit 8363c1d

Browse files
authored
feat: make to address optional for transaction data (#2852)
## What ❔ This PR is the first part of [this one](#2631). We decided to separate it into smaller PRs to make it easier to read and review. This PR contains only the changes to the `TransactionData` structs for the different VM versions, modifying them for an optional field. The other parts are currently available in our repo fork, as they are based on this branch. The other PRs are: - [feat: evm simulator as base system contract](lambdaclass#256): integrates the EVM interpreter contract as a base system contract and includes all necessary updates for zksync-era to run with it. - [feat: make evm simulator optional for the server](lambdaclass#257): makes the evm simulator optional to run using a config file. ## Why ❔ <!-- Why are these changes done? What goal do they contribute to? What are the principles behind them? --> <!-- Example: PR templates ensure PR reviewers, observers, and future iterators are in context about the evolution of repos. --> ## Checklist <!-- Check your PR fulfills the following items. --> <!-- For draft PRs check the boxes as you complete them. --> - [ ] PR title corresponds to the body of PR (we generate changelog entries from PRs). - [ ] Tests for the changes have been added / updated. - [ ] Documentation comments have been added / updated. - [ ] Code has been formatted via `zk fmt` and `zk lint`.
1 parent 86299e7 commit 8363c1d

File tree

80 files changed

+204
-189
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+204
-189
lines changed

core/bin/system-constants-generator/src/utils.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ pub(super) fn get_l2_tx(
8989
pubdata_price: u32,
9090
) -> L2Tx {
9191
L2Tx::new_signed(
92-
contract_address,
92+
Some(contract_address),
9393
vec![],
9494
Nonce(0),
9595
Fee {
@@ -134,7 +134,7 @@ pub(super) fn get_l1_tx(
134134
) -> L1Tx {
135135
L1Tx {
136136
execute: Execute {
137-
contract_address,
137+
contract_address: Some(contract_address),
138138
calldata: custom_calldata.unwrap_or_default(),
139139
value: U256::from(0),
140140
factory_deps,

core/lib/dal/src/consensus/mod.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -401,9 +401,10 @@ impl ProtoRepr for proto::Transaction {
401401
}
402402
},
403403
execute: Execute {
404-
contract_address: required(&execute.contract_address)
405-
.and_then(|x| parse_h160(x))
406-
.context("execute.contract_address")?,
404+
contract_address: execute
405+
.contract_address
406+
.as_ref()
407+
.and_then(|x| parse_h160(x).ok()),
407408
calldata: required(&execute.calldata).context("calldata")?.clone(),
408409
value: required(&execute.value)
409410
.and_then(|x| parse_h256(x))
@@ -487,7 +488,7 @@ impl ProtoRepr for proto::Transaction {
487488
}
488489
};
489490
let execute = proto::Execute {
490-
contract_address: Some(this.execute.contract_address.as_bytes().into()),
491+
contract_address: this.execute.contract_address.map(|x| x.as_bytes().into()),
491492
calldata: Some(this.execute.calldata.clone()),
492493
value: Some(u256_to_h256(this.execute.value).as_bytes().into()),
493494
factory_deps: this.execute.factory_deps.clone(),

core/lib/dal/src/consensus/proto/mod.proto

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ message ProtocolUpgradeTxCommonData {
102102
}
103103

104104
message Execute {
105-
optional bytes contract_address = 1; // required; H160
105+
optional bytes contract_address = 1; // optional; H160
106106
optional bytes calldata = 2; // required
107107
optional bytes value = 3; // required; U256
108108
repeated bytes factory_deps = 4;

core/lib/dal/src/consensus/tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use crate::tests::mock_protocol_upgrade_transaction;
1717

1818
fn execute(rng: &mut impl Rng) -> Execute {
1919
Execute {
20-
contract_address: rng.gen(),
20+
contract_address: Some(rng.gen()),
2121
value: rng.gen::<u128>().into(),
2222
calldata: (0..10 * 32).map(|_| rng.gen()).collect(),
2323
// TODO: find a way to generate valid random bytecode.

core/lib/dal/src/models/tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use crate::{models::storage_transaction::StorageTransaction, BigDecimal};
1313

1414
fn default_execute() -> Execute {
1515
Execute {
16-
contract_address: H160::random(),
16+
contract_address: Some(H160::random()),
1717
value: U256::from(10i32),
1818
calldata: hex::decode(
1919
"a9059cbb00000000000000000000000058d595f318167d5af45d9e44ade4348dd4e\

core/lib/dal/src/tests/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ pub(crate) fn mock_l2_transaction() -> L2Tx {
7474
gas_per_pubdata_limit: U256::from(DEFAULT_GAS_PER_PUBDATA),
7575
};
7676
let mut l2_tx = L2Tx::new_signed(
77-
Address::random(),
77+
Some(Address::random()),
7878
vec![],
7979
zksync_types::Nonce(0),
8080
fee,
@@ -110,7 +110,7 @@ pub(crate) fn mock_l1_execute() -> L1Tx {
110110
};
111111

112112
let execute = Execute {
113-
contract_address: H160::random(),
113+
contract_address: Some(H160::random()),
114114
value: Default::default(),
115115
calldata: vec![],
116116
factory_deps: vec![],
@@ -138,7 +138,7 @@ pub(crate) fn mock_protocol_upgrade_transaction() -> ProtocolUpgradeTx {
138138
};
139139

140140
let execute = Execute {
141-
contract_address: H160::random(),
141+
contract_address: Some(H160::random()),
142142
value: Default::default(),
143143
calldata: vec![],
144144
factory_deps: vec![],

core/lib/dal/src/transactions_dal.rs

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ impl TransactionsDal<'_, '_> {
5858
tx: &L1Tx,
5959
l1_block_number: L1BlockNumber,
6060
) -> DalResult<()> {
61-
let contract_address = tx.execute.contract_address.as_bytes();
61+
let contract_address = tx.execute.contract_address;
62+
let contract_address_as_bytes = contract_address.map(|addr| addr.as_bytes().to_vec());
6263
let tx_hash = tx.hash();
6364
let tx_hash_bytes = tx_hash.as_bytes();
6465
let json_data = serde_json::to_value(&tx.execute)
@@ -143,7 +144,7 @@ impl TransactionsDal<'_, '_> {
143144
serial_id,
144145
full_fee,
145146
layer_2_tip_fee,
146-
contract_address,
147+
contract_address_as_bytes,
147148
l1_block_number.0 as i32,
148149
value,
149150
empty_address.as_bytes(),
@@ -161,7 +162,8 @@ impl TransactionsDal<'_, '_> {
161162
}
162163

163164
pub async fn insert_system_transaction(&mut self, tx: &ProtocolUpgradeTx) -> DalResult<()> {
164-
let contract_address = tx.execute.contract_address.as_bytes().to_vec();
165+
let contract_address = tx.execute.contract_address;
166+
let contract_address_as_bytes = contract_address.map(|addr| addr.as_bytes().to_vec());
165167
let tx_hash = tx.common_data.hash().0.to_vec();
166168
let json_data = serde_json::to_value(&tx.execute)
167169
.unwrap_or_else(|_| panic!("cannot serialize tx {:?} to json", tx.common_data.hash()));
@@ -238,7 +240,7 @@ impl TransactionsDal<'_, '_> {
238240
gas_per_pubdata_limit,
239241
json_data,
240242
upgrade_id,
241-
contract_address,
243+
contract_address_as_bytes,
242244
l1_block_number,
243245
value,
244246
&Address::default().0.to_vec(),
@@ -284,7 +286,8 @@ impl TransactionsDal<'_, '_> {
284286
}
285287

286288
let initiator_address = tx.initiator_account();
287-
let contract_address = tx.execute.contract_address.as_bytes();
289+
let contract_address = tx.execute.contract_address;
290+
let contract_address_as_bytes = contract_address.map(|addr| addr.as_bytes().to_vec());
288291
let json_data = serde_json::to_value(&tx.execute)
289292
.unwrap_or_else(|_| panic!("cannot serialize tx {:?} to json", tx.hash()));
290293
let gas_limit = u256_to_big_decimal(tx.common_data.fee.gas_limit);
@@ -413,7 +416,7 @@ impl TransactionsDal<'_, '_> {
413416
input_data,
414417
&json_data,
415418
tx_format,
416-
contract_address,
419+
contract_address_as_bytes,
417420
value,
418421
&paymaster,
419422
&paymaster_input,
@@ -697,8 +700,10 @@ impl TransactionsDal<'_, '_> {
697700
.arg_error(&format!("transactions[{index_in_block}].refunded_gas"), err)
698701
})?;
699702

703+
let contract_address = transaction.execute.contract_address;
704+
let contract_address_as_bytes = contract_address.map(|addr| addr.as_bytes().to_vec());
700705
l2_values.push(u256_to_big_decimal(transaction.execute.value));
701-
l2_contract_addresses.push(transaction.execute.contract_address.as_bytes());
706+
l2_contract_addresses.push(contract_address_as_bytes);
702707
l2_paymaster_input.push(&common_data.paymaster_params.paymaster_input[..]);
703708
l2_paymaster.push(common_data.paymaster_params.paymaster.as_bytes());
704709
l2_hashes.push(tx_res.hash.as_bytes());
@@ -818,7 +823,7 @@ impl TransactionsDal<'_, '_> {
818823
&l2_inputs as &[&[u8]],
819824
&l2_datas,
820825
&l2_tx_formats,
821-
&l2_contract_addresses as &[&[u8]],
826+
&l2_contract_addresses as &[Option<Vec<u8>>],
822827
&l2_values,
823828
&l2_paymaster as &[&[u8]],
824829
&l2_paymaster_input as &[&[u8]],
@@ -901,8 +906,10 @@ impl TransactionsDal<'_, '_> {
901906
.arg_error(&format!("transactions[{index_in_block}].refunded_gas"), err)
902907
})?;
903908

909+
let contract_address = transaction.execute.contract_address;
910+
let contract_address_as_bytes = contract_address.map(|addr| addr.as_bytes().to_vec());
904911
l2_values.push(u256_to_big_decimal(transaction.execute.value));
905-
l2_contract_addresses.push(transaction.execute.contract_address.as_bytes());
912+
l2_contract_addresses.push(contract_address_as_bytes);
906913
l2_paymaster_input.push(&common_data.paymaster_params.paymaster_input[..]);
907914
l2_paymaster.push(common_data.paymaster_params.paymaster.as_bytes());
908915
l2_hashes.push(tx_res.hash.as_bytes());
@@ -1013,7 +1020,7 @@ impl TransactionsDal<'_, '_> {
10131020
&l2_datas,
10141021
&l2_refunded_gas,
10151022
&l2_values,
1016-
&l2_contract_addresses as &[&[u8]],
1023+
&l2_contract_addresses as &[Option<Vec<u8>>],
10171024
&l2_paymaster as &[&[u8]],
10181025
&l2_paymaster_input as &[&[u8]],
10191026
l2_block_number.0 as i32,
@@ -1083,6 +1090,8 @@ impl TransactionsDal<'_, '_> {
10831090
.arg_error(&format!("transactions[{index_in_block}].refunded_gas"), err)
10841091
})?;
10851092

1093+
let contract_address = transaction.execute.contract_address;
1094+
let contract_address_as_bytes = contract_address.map(|addr| addr.as_bytes().to_vec());
10861095
let tx = &tx_res.transaction;
10871096
l1_hashes.push(tx_res.hash.as_bytes());
10881097
l1_initiator_address.push(common_data.sender.as_bytes());
@@ -1096,7 +1105,7 @@ impl TransactionsDal<'_, '_> {
10961105
l1_priority_op_id.push(common_data.serial_id.0 as i64);
10971106
l1_full_fee.push(u256_to_big_decimal(common_data.full_fee));
10981107
l1_layer_2_tip_fee.push(u256_to_big_decimal(common_data.layer_2_tip_fee));
1099-
l1_contract_address.push(tx.execute.contract_address.as_bytes());
1108+
l1_contract_address.push(contract_address_as_bytes);
11001109
l1_l1_block_number.push(common_data.eth_block as i32);
11011110
l1_value.push(u256_to_big_decimal(tx.execute.value));
11021111
l1_tx_format.push(common_data.tx_format() as i32);
@@ -1203,7 +1212,7 @@ impl TransactionsDal<'_, '_> {
12031212
&l1_priority_op_id,
12041213
&l1_full_fee,
12051214
&l1_layer_2_tip_fee,
1206-
&l1_contract_address as &[&[u8]],
1215+
&l1_contract_address as &[Option<Vec<u8>>],
12071216
&l1_l1_block_number,
12081217
&l1_value,
12091218
&l1_tx_format,
@@ -1373,6 +1382,8 @@ impl TransactionsDal<'_, '_> {
13731382
.arg_error(&format!("transactions[{index_in_block}].refunded_gas"), err)
13741383
})?;
13751384

1385+
let contract_address = transaction.execute.contract_address;
1386+
let contract_address_as_bytes = contract_address.map(|addr| addr.as_bytes().to_vec());
13761387
let tx = &tx_res.transaction;
13771388
upgrade_hashes.push(tx_res.hash.as_bytes());
13781389
upgrade_initiator_address.push(common_data.sender.as_bytes());
@@ -1385,7 +1396,7 @@ impl TransactionsDal<'_, '_> {
13851396
.unwrap_or_else(|_| panic!("cannot serialize tx {:?} to json", tx.hash())),
13861397
);
13871398
upgrade_upgrade_id.push(common_data.upgrade_id as i32);
1388-
upgrade_contract_address.push(tx.execute.contract_address.as_bytes());
1399+
upgrade_contract_address.push(contract_address_as_bytes);
13891400
upgrade_l1_block_number.push(common_data.eth_block as i32);
13901401
upgrade_value.push(u256_to_big_decimal(tx.execute.value));
13911402
upgrade_tx_format.push(common_data.tx_format() as i32);
@@ -1484,7 +1495,7 @@ impl TransactionsDal<'_, '_> {
14841495
&upgrade_gas_per_pubdata_limit,
14851496
&upgrade_data,
14861497
&upgrade_upgrade_id,
1487-
&upgrade_contract_address as &[&[u8]],
1498+
&upgrade_contract_address as &[Option<Vec<u8>>],
14881499
&upgrade_l1_block_number,
14891500
&upgrade_value,
14901501
&upgrade_tx_format,

core/lib/mempool/src/tests.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ fn gen_l2_tx(address: Address, nonce: Nonce) -> Transaction {
371371

372372
fn gen_l2_tx_with_timestamp(address: Address, nonce: Nonce, received_at_ms: u64) -> Transaction {
373373
let mut txn = L2Tx::new(
374-
Address::default(),
374+
Some(Address::default()),
375375
Vec::new(),
376376
nonce,
377377
Fee::default(),
@@ -386,7 +386,7 @@ fn gen_l2_tx_with_timestamp(address: Address, nonce: Nonce, received_at_ms: u64)
386386

387387
fn gen_l1_tx(priority_id: PriorityOpId) -> Transaction {
388388
let execute = Execute {
389-
contract_address: Address::repeat_byte(0x11),
389+
contract_address: Some(Address::repeat_byte(0x11)),
390390
calldata: vec![1, 2, 3],
391391
factory_deps: vec![],
392392
value: U256::zero(),

core/lib/multivm/src/versions/vm_1_3_2/test_utils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ pub fn get_create_execute(code: &[u8], calldata: &[u8]) -> Execute {
153153
.expect("failed to encode parameters");
154154

155155
Execute {
156-
contract_address: CONTRACT_DEPLOYER_ADDRESS,
156+
contract_address: Some(CONTRACT_DEPLOYER_ADDRESS),
157157
calldata,
158158
factory_deps: vec![code.to_vec()],
159159
value: U256::zero(),

core/lib/multivm/src/versions/vm_1_3_2/transaction_data.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use crate::vm_1_3_2::vm_with_bootloader::{
2222
pub struct TransactionData {
2323
pub tx_type: u8,
2424
pub from: Address,
25-
pub to: Address,
25+
pub to: Option<Address>,
2626
pub gas_limit: U256,
2727
pub pubdata_price_limit: U256,
2828
pub max_fee_per_gas: U256,
@@ -170,7 +170,7 @@ impl TransactionData {
170170
encode(&[Token::Tuple(vec![
171171
Token::Uint(U256::from_big_endian(&self.tx_type.to_be_bytes())),
172172
Token::Address(self.from),
173-
Token::Address(self.to),
173+
Token::Address(self.to.unwrap_or_default()),
174174
Token::Uint(self.gas_limit),
175175
Token::Uint(self.pubdata_price_limit),
176176
Token::Uint(self.max_fee_per_gas),
@@ -593,7 +593,7 @@ mod tests {
593593
let transaction = TransactionData {
594594
tx_type: 113,
595595
from: Address::random(),
596-
to: Address::random(),
596+
to: Some(Address::random()),
597597
gas_limit: U256::from(1u32),
598598
pubdata_price_limit: U256::from(1u32),
599599
max_fee_per_gas: U256::from(1u32),

0 commit comments

Comments
 (0)