Skip to content

Commit 9ecc7f7

Browse files
author
3alpha
authored
Align with spec for RPC v0.10.0 (#890)
* Align with spec for emitted events * Migrate starknet-rs crates * Fix spec * Bump blockifier * starknet-rust 0.18 bump
1 parent 3fa2411 commit 9ecc7f7

20 files changed

Lines changed: 739 additions & 467 deletions

File tree

Cargo.lock

Lines changed: 432 additions & 413 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -78,14 +78,16 @@ bigdecimal = { version = "0.4.9" }
7878
enum-helper-macros = "0.0.1"
7979

8080
# Starknet dependencies
81-
starknet-types-core = "=0.2.3"
82-
starknet_api = { version = "0.16.0-rc.1", features = ["testing"] }
83-
blockifier = { version = "0.16.0-rc.1" }
84-
starknet-rs-signers = { version = "0.14.0", package = "starknet-signers" }
85-
starknet-rs-core = { version = "0.16.0", package = "starknet-core" }
86-
starknet-rs-providers = { version = "0.16.0", package = "starknet-providers" }
87-
starknet-rs-accounts = { version = "0.16.0", package = "starknet-accounts" }
88-
starknet-rs-contract = { version = "0.16.0", package = "starknet-contract" }
81+
starknet-types-core = "=0.2.4"
82+
starknet_api = { version = "0.16.0-rc.2", features = ["testing"] }
83+
blockifier = { version = "0.16.0-rc.2" }
84+
85+
starknet-rs-signers = { version = "0.15.0", package = "starknet-rust-signers" }
86+
starknet-rs-core = { version = "0.17.0", package = "starknet-rust-core" }
87+
starknet-rs-providers = { version = "0.17.0", package = "starknet-rust-providers" }
88+
starknet-rs-accounts = { version = "0.17.0", package = "starknet-rust-accounts" }
89+
starknet-rs-contract = { version = "0.17.0", package = "starknet-rust-contract" }
90+
8991
cairo-vm = "=2.5.0"
9092

9193
# Cairo-lang dependencies

crates/starknet-devnet-core/src/blocks/mod.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use std::collections::HashMap;
22

33
use indexmap::IndexMap;
44
use starknet_api::block::{BlockHeader, BlockHeaderWithoutHash, BlockNumber, BlockTimestamp};
5+
use starknet_api::block_hash::block_hash_calculator::BlockHeaderCommitments;
56
use starknet_api::data_availability::L1DataAvailabilityMode;
67
use starknet_api::felt;
78
use starknet_rs_core::types::Felt;
@@ -329,6 +330,13 @@ impl From<&StarknetBlock> for starknet_types::rpc::block::BlockHeader {
329330
.0
330331
.into(),
331332
},
333+
n_transactions: value.header.n_transactions as u64,
334+
n_events: value.header.n_events as u64,
335+
state_diff_length: value.header.state_diff_length.unwrap_or(0) as u64,
336+
state_diff_commitment: value.header.state_diff_commitment.unwrap_or_default(),
337+
transaction_commitment: value.header.transaction_commitment.unwrap_or_default(),
338+
event_commitment: value.header.event_commitment.unwrap_or_default(),
339+
receipt_commitment: value.header.receipt_commitment.unwrap_or_default(),
332340
}
333341
}
334342
}
@@ -403,6 +411,24 @@ impl StarknetBlock {
403411
pub(crate) fn set_timestamp(&mut self, timestamp: BlockTimestamp) {
404412
self.header.block_header_without_hash.timestamp = timestamp;
405413
}
414+
415+
pub(crate) fn set_counts(
416+
&mut self,
417+
n_transactions: usize,
418+
n_events: usize,
419+
state_diff_length: usize,
420+
) {
421+
self.header.n_transactions = n_transactions;
422+
self.header.n_events = n_events;
423+
self.header.state_diff_length = Some(state_diff_length);
424+
}
425+
426+
pub(crate) fn set_commitments(&mut self, commitments: BlockHeaderCommitments) {
427+
self.header.transaction_commitment = Some(commitments.transaction_commitment);
428+
self.header.event_commitment = Some(commitments.event_commitment);
429+
self.header.receipt_commitment = Some(commitments.receipt_commitment);
430+
self.header.state_diff_commitment = Some(commitments.state_diff_commitment);
431+
}
406432
}
407433

408434
impl HashProducer for StarknetBlock {

crates/starknet-devnet-core/src/starknet/events.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@ pub(crate) fn get_events(
8080

8181
let emitted_event = EmittedEvent {
8282
transaction_hash: *transaction_hash,
83-
transaction_index: Some(transaction_index as u64),
84-
event_index: Some(event_index as u64),
83+
transaction_index: transaction_index as u64,
84+
event_index: event_index as u64,
8585
block_hash,
8686
block_number,
8787
keys: transaction_event.keys,

crates/starknet-devnet-core/src/starknet/mod.rs

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@ use starknet_api::block::{
1616
BlockInfo, BlockNumber, BlockTimestamp, FeeType, GasPrice, GasPricePerToken, GasPriceVector,
1717
GasPrices,
1818
};
19+
use starknet_api::block_hash::block_hash_calculator::calculate_block_commitments;
1920
use starknet_api::core::SequencerContractAddress;
2021
use starknet_api::data_availability::DataAvailabilityMode;
22+
use starknet_api::state::ThinStateDiff as ThinStateDiffImported;
2123
use starknet_api::transaction::fields::{GasVectorComputationMode, Tip};
2224
use starknet_api::transaction::{TransactionHasher, TransactionVersion};
2325
use starknet_rs_core::types::{Felt, Hash256, MsgFromL1};
@@ -372,6 +374,9 @@ impl Starknet {
372374
// Update gas prices in the block header
373375
let header = &mut new_block.header.block_header_without_hash;
374376

377+
let starknet_version = header.starknet_version;
378+
let l1_da_mode = header.l1_da_mode;
379+
375380
// Set L1 gas prices
376381
header.l1_gas_price = GasPricePerToken {
377382
price_in_fri: GasPrice(self.next_block_gas.gas_price_fri.get()),
@@ -417,6 +422,33 @@ impl Starknet {
417422
}
418423
});
419424

425+
let transaction_data: Vec<
426+
starknet_api::block_hash::block_hash_calculator::TransactionHashingData,
427+
> = new_block
428+
.get_transactions()
429+
.iter()
430+
// filter map is used here, although in normal conditions unwrap should be safe. Every transaction hash that has been added to preconfirmed block should be present in transactions collection
431+
// changes should be done later so this is not even possible
432+
.filter_map(|tx_hash| self.transactions.get_by_hash(*tx_hash))
433+
.map(|tx| tx.into())
434+
.collect();
435+
436+
let thin_state_diff: ThinStateDiffImported = self.pre_confirmed_state_diff.clone().into();
437+
438+
let commitments = calculate_block_commitments(
439+
&transaction_data,
440+
&thin_state_diff,
441+
l1_da_mode,
442+
&starknet_version,
443+
);
444+
445+
new_block.set_counts(
446+
transaction_data.len(),
447+
transaction_data.iter().map(|tx| tx.transaction_output.events.len()).sum(),
448+
thin_state_diff.len(),
449+
);
450+
new_block.set_commitments(commitments);
451+
420452
// insert pre_confirmed block in the blocks collection and connect it to the state diff
421453
self.blocks.insert(new_block, self.pre_confirmed_state_diff.clone());
422454
self.pre_confirmed_state_diff = StateDiff::default();
@@ -1992,29 +2024,6 @@ mod tests {
19922024
assert_eq!(block_number2.0, added_block2.header.block_header_without_hash.block_number.0);
19932025
}
19942026

1995-
#[test]
1996-
fn gets_block_txs_count() {
1997-
let config = StarknetConfig::default();
1998-
let mut starknet = Starknet::new(&config).unwrap();
1999-
2000-
starknet.generate_new_block_and_state().unwrap();
2001-
2002-
let num_no_transactions = starknet.get_block_txs_count(&CustomBlockId::Number(1));
2003-
2004-
assert_eq!(num_no_transactions.unwrap(), 0);
2005-
2006-
let tx = dummy_declare_tx_v3_with_hash();
2007-
2008-
// add transaction hash to pre_confirmed block
2009-
starknet.blocks.pre_confirmed_block.add_transaction(*tx.get_transaction_hash());
2010-
2011-
starknet.generate_new_block_and_state().unwrap();
2012-
2013-
let num_one_transaction = starknet.get_block_txs_count(&CustomBlockId::Number(2));
2014-
2015-
assert_eq!(num_one_transaction.unwrap(), 1);
2016-
}
2017-
20182027
#[test]
20192028
fn returns_chain_id() {
20202029
let config = StarknetConfig::default();

crates/starknet-devnet-core/src/state/state_diff.rs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,63 @@ impl From<StateDiff> for ThinStateDiff {
176176
}
177177
}
178178
}
179+
180+
impl From<StateDiff> for starknet_api::state::ThinStateDiff {
181+
fn from(value: StateDiff) -> Self {
182+
let deployed_contracts: Vec<(ContractAddress, Felt)> =
183+
value.address_to_class_hash.into_iter().collect();
184+
let nonces: Vec<(ContractAddress, Felt)> = value.address_to_nonce.into_iter().collect();
185+
186+
starknet_api::state::ThinStateDiff {
187+
deployed_contracts: deployed_contracts
188+
.into_iter()
189+
.map(|(address, class_hash)| {
190+
(
191+
starknet_api::core::ContractAddress::from(address),
192+
starknet_api::core::ClassHash(class_hash),
193+
)
194+
})
195+
.collect(),
196+
storage_diffs: value
197+
.storage_updates
198+
.into_iter()
199+
.map(|(contract_address, updates)| {
200+
(
201+
starknet_api::core::ContractAddress::from(contract_address),
202+
updates
203+
.into_iter()
204+
.map(|(key, value)| (starknet_api::state::StorageKey::from(key), value))
205+
.collect(),
206+
)
207+
})
208+
.collect(),
209+
class_hash_to_compiled_class_hash: value
210+
.class_hash_to_compiled_class_hash
211+
.into_iter()
212+
.map(|(class_hash, compiled_class_hash)| {
213+
(
214+
starknet_api::core::ClassHash(class_hash),
215+
starknet_api::core::CompiledClassHash(compiled_class_hash),
216+
)
217+
})
218+
.collect(),
219+
deprecated_declared_classes: value
220+
.cairo_0_declared_contracts
221+
.iter()
222+
.map(|f| starknet_api::core::ClassHash(*f))
223+
.collect(),
224+
nonces: nonces
225+
.into_iter()
226+
.map(|(address, nonce)| {
227+
(
228+
starknet_api::core::ContractAddress::from(address),
229+
starknet_api::core::Nonce(nonce),
230+
)
231+
})
232+
.collect(),
233+
}
234+
}
235+
}
179236
#[cfg(test)]
180237
mod tests {
181238
use std::collections::HashMap;

crates/starknet-devnet-core/src/transactions.rs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,13 +240,81 @@ impl StarknetTransaction {
240240
}
241241
}
242242

243+
impl From<&StarknetTransaction>
244+
for starknet_api::block_hash::block_hash_calculator::TransactionHashingData
245+
{
246+
fn from(tx: &StarknetTransaction) -> Self {
247+
Self {
248+
transaction_signature: starknet_api::transaction::fields::TransactionSignature(
249+
tx.inner.get_signature().into(),
250+
),
251+
transaction_hash: starknet_api::transaction::TransactionHash(
252+
*tx.inner.get_transaction_hash(),
253+
),
254+
transaction_output:
255+
starknet_api::block_hash::block_hash_calculator::TransactionOutputForHash {
256+
actual_fee: tx.execution_info.receipt.fee,
257+
events: tx
258+
.get_events()
259+
.iter()
260+
.map(|f| starknet_api::transaction::Event {
261+
from_address: f.from_address.into(),
262+
content: starknet_api::transaction::EventContent {
263+
keys: f
264+
.keys
265+
.iter()
266+
.map(|k| starknet_api::transaction::EventKey(*k))
267+
.collect(),
268+
data: starknet_api::transaction::EventData(f.data.to_vec()),
269+
},
270+
})
271+
.collect(),
272+
execution_status: match &tx.execution_result {
273+
starknet_rs_core::types::ExecutionResult::Succeeded => {
274+
starknet_api::transaction::TransactionExecutionStatus::Succeeded
275+
}
276+
starknet_rs_core::types::ExecutionResult::Reverted { reason } => {
277+
starknet_api::transaction::TransactionExecutionStatus::Reverted(
278+
starknet_api::transaction::RevertedTransactionExecutionStatus {
279+
revert_reason: reason.to_string(),
280+
},
281+
)
282+
}
283+
},
284+
gas_consumed: tx.execution_info.receipt.gas,
285+
messages_sent: tx
286+
.get_l2_to_l1_messages()
287+
.into_iter()
288+
.map(|msg| {
289+
let to_address_felt: starknet_rs_core::types::Felt =
290+
msg.to_address.into();
291+
starknet_api::transaction::MessageToL1 {
292+
to_address: starknet_api::core::EthAddress::try_from(
293+
to_address_felt,
294+
)
295+
.unwrap_or_default(), /* Default should never happen, felt is
296+
* used just as a helper for type
297+
* conversions */
298+
payload: starknet_api::transaction::L2ToL1Payload(
299+
msg.payload.to_vec(),
300+
),
301+
from_address: msg.from_address.into(),
302+
}
303+
})
304+
.collect(),
305+
},
306+
}
307+
}
308+
}
309+
243310
#[cfg(test)]
244311
mod tests {
245312
use blockifier::blockifier_versioned_constants::VersionedConstants;
246313
use blockifier::state::cached_state::CachedState;
247314
use blockifier::transaction::objects::TransactionExecutionInfo;
248315
use starknet_api::block::BlockNumber;
249316
use starknet_api::transaction::fields::GasVectorComputationMode;
317+
use starknet_api::versioned_constants_logic::VersionedConstantsTrait;
250318
use starknet_rs_core::types::TransactionExecutionStatus;
251319
use starknet_types::rpc::transactions::{
252320
TransactionFinalityStatus, TransactionTrace, TransactionWithHash,

crates/starknet-devnet-core/src/utils.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use blockifier::blockifier_versioned_constants::VersionedConstants;
22
use blockifier::bouncer::{BouncerConfig, BouncerWeights, BuiltinWeights};
33
use blockifier::transaction::objects::TransactionExecutionInfo;
44
use starknet_api::block::StarknetVersion;
5+
use starknet_api::versioned_constants_logic::VersionedConstantsTrait;
56
use starknet_rs_core::types::Felt;
67
use starknet_types::patricia_key::{PatriciaKey, StorageKey};
78

crates/starknet-devnet-server/src/api/endpoints_ws.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@ use starknet_types::felt::TransactionHash;
1010
use starknet_types::rpc::block::{BlockHeader, BlockId, BlockStatus, BlockTag};
1111
use starknet_types::rpc::transactions::TransactionFinalityStatus;
1212
use starknet_types::starknet_api::block::{BlockNumber, BlockTimestamp};
13+
use starknet_types::starknet_api::core::{
14+
EventCommitment, ReceiptCommitment, StateDiffCommitment, TransactionCommitment,
15+
};
1316
use starknet_types::starknet_api::data_availability::L1DataAvailabilityMode;
17+
use starknet_types::starknet_api::hash::PoseidonHash;
1418

1519
use super::JsonRpcHandler;
1620
use super::error::ApiError;
@@ -87,6 +91,17 @@ impl JsonRpcHandler {
8791
}
8892
ImportedL1DataAvailabilityMode::Blob => L1DataAvailabilityMode::Blob,
8993
},
94+
n_transactions: origin_block.transaction_count,
95+
n_events: origin_block.event_count,
96+
state_diff_length: origin_block.state_diff_length,
97+
state_diff_commitment: StateDiffCommitment(PoseidonHash(
98+
origin_block.state_diff_commitment,
99+
)),
100+
transaction_commitment: TransactionCommitment(
101+
origin_block.transaction_commitment,
102+
),
103+
event_commitment: EventCommitment(origin_block.event_commitment),
104+
receipt_commitment: ReceiptCommitment(origin_block.receipt_commitment),
90105
};
91106
Ok(origin_header)
92107
}

crates/starknet-devnet-server/src/server.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,10 @@ pub async fn serve_http_json_rpc(
4343
};
4444

4545
routes = routes
46-
.layer(TimeoutLayer::new(Duration::from_secs(server_config.timeout.into())))
46+
.layer(TimeoutLayer::with_status_code(
47+
StatusCode::REQUEST_TIMEOUT,
48+
Duration::from_secs(server_config.timeout.into()),
49+
))
4750
.layer(DefaultBodyLimit::disable())
4851
.layer(
4952
// More details: https://docs.rs/tower-http/latest/tower_http/cors/index.html

0 commit comments

Comments
 (0)