Skip to content

Commit 3d38e5a

Browse files
Merge remote-tracking branch 'origin/master' into fork-net-shards
2 parents 64e58e5 + 6cd375e commit 3d38e5a

File tree

157 files changed

+1567
-3513
lines changed

Some content is hidden

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

157 files changed

+1567
-3513
lines changed

chain/chain/src/chain.rs

+40-35
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,15 @@ use near_async::messaging::{noop, IntoMultiSender};
5252
use near_async::time::{Clock, Duration, Instant};
5353
use near_chain_configs::{MutableConfigValue, MutableValidatorSigner};
5454
use near_chain_primitives::error::{BlockKnownError, Error, LogTransientStorageError};
55+
use near_epoch_manager::shard_assignment::shard_id_to_uid;
5556
use near_epoch_manager::shard_tracker::ShardTracker;
5657
use near_epoch_manager::EpochManagerAdapter;
5758
use near_primitives::bandwidth_scheduler::BandwidthRequests;
5859
use near_primitives::block::{genesis_chunks, Block, BlockValidityError, Chunks, MaybeNew, Tip};
5960
use near_primitives::block_header::BlockHeader;
6061
use near_primitives::challenge::{
6162
BlockDoubleSign, Challenge, ChallengeBody, ChallengesResult, ChunkProofs, ChunkState,
62-
MaybeEncodedShardChunk, PartialState, SlashedValidator,
63+
MaybeEncodedShardChunk, SlashedValidator,
6364
};
6465
use near_primitives::checked_feature;
6566
use near_primitives::congestion_info::CongestionInfo;
@@ -74,6 +75,7 @@ use near_primitives::sharding::{
7475
ChunkHash, ChunkHashHeight, EncodedShardChunk, ReceiptList, ReceiptProof, ShardChunk,
7576
ShardChunkHeader, ShardProof, StateSyncInfo,
7677
};
78+
use near_primitives::state::PartialState;
7779
use near_primitives::state_part::PartId;
7880
use near_primitives::state_sync::{
7981
get_num_state_parts, ReceiptProofResponse, RootProof, ShardStateSyncResponseHeader,
@@ -365,12 +367,8 @@ impl Chain {
365367
) -> Result<Chain, Error> {
366368
let store = runtime_adapter.store();
367369
let transaction_validity_period = chain_genesis.transaction_validity_period;
368-
let chain_store = ChainStore::new(
369-
store.clone(),
370-
chain_genesis.height,
371-
save_trie_changes,
372-
transaction_validity_period,
373-
);
370+
let chain_store =
371+
ChainStore::new(store.clone(), save_trie_changes, transaction_validity_period);
374372
let state_roots = get_genesis_state_roots(runtime_adapter.store())?
375373
.expect("genesis should be initialized.");
376374
let (genesis, _genesis_chunks) = Self::make_genesis_block(
@@ -439,7 +437,6 @@ impl Chain {
439437
// Check if we have a head in the store, otherwise pick genesis block.
440438
let mut chain_store = ChainStore::new(
441439
runtime_adapter.store().clone(),
442-
chain_genesis.height,
443440
chain_config.save_trie_changes,
444441
transaction_validity_period,
445442
);
@@ -710,7 +707,7 @@ impl Chain {
710707

711708
store_update.save_chunk_extra(
712709
genesis.hash(),
713-
&epoch_manager.shard_id_to_uid(chunk_header.shard_id(), &EpochId::default())?,
710+
&shard_id_to_uid(epoch_manager, chunk_header.shard_id(), &EpochId::default())?,
714711
Self::create_genesis_chunk_extra(
715712
state_root,
716713
chain_genesis.gas_limit,
@@ -901,14 +898,8 @@ impl Chain {
901898
fn partial_verify_orphan_header_signature(&self, header: &BlockHeader) -> Result<bool, Error> {
902899
let block_producer =
903900
self.epoch_manager.get_block_producer(header.epoch_id(), header.height())?;
904-
// DEVNOTE: we pass head which is not necessarily on block's chain, but it's only used for
905-
// slashing info which we will ignore
906-
let head = self.head()?;
907-
let (block_producer, _slashed) = self.epoch_manager.get_validator_by_account_id(
908-
header.epoch_id(),
909-
&head.last_block_hash,
910-
&block_producer,
911-
)?;
901+
let block_producer =
902+
self.epoch_manager.get_validator_by_account_id(header.epoch_id(), &block_producer)?;
912903
Ok(header.signature().verify(header.hash().as_ref(), block_producer.public_key()))
913904
}
914905

@@ -1206,7 +1197,6 @@ impl Chain {
12061197
&self,
12071198
challenges: &[Challenge],
12081199
epoch_id: &EpochId,
1209-
prev_block_hash: &CryptoHash,
12101200
) -> Result<(ChallengesResult, Vec<CryptoHash>), Error> {
12111201
let _span = tracing::debug_span!(
12121202
target: "chain",
@@ -1220,7 +1210,6 @@ impl Chain {
12201210
self.epoch_manager.as_ref(),
12211211
self.runtime_adapter.as_ref(),
12221212
epoch_id,
1223-
prev_block_hash,
12241213
challenge,
12251214
) {
12261215
Ok((hash, account_ids)) => {
@@ -1557,7 +1546,7 @@ impl Chain {
15571546
/// soon as possible and allow next block producer to skip invalid blocks.
15581547
pub fn process_challenge(&mut self, challenge: &Challenge) {
15591548
let head = unwrap_or_return!(self.head());
1560-
match self.verify_challenges(&[challenge.clone()], &head.epoch_id, &head.last_block_hash) {
1549+
match self.verify_challenges(&[challenge.clone()], &head.epoch_id) {
15611550
Ok((_, challenged_blocks)) => {
15621551
let mut chain_update = self.chain_update();
15631552
for block_hash in challenged_blocks {
@@ -2010,7 +1999,7 @@ impl Chain {
20101999
true,
20112000
);
20122001
let care_about_shard_this_or_next_epoch = care_about_shard || will_care_about_shard;
2013-
let shard_uid = self.epoch_manager.shard_id_to_uid(shard_id, &epoch_id).unwrap();
2002+
let shard_uid = shard_id_to_uid(self.epoch_manager.as_ref(), shard_id, epoch_id)?;
20142003
if care_about_shard_this_or_next_epoch {
20152004
shards_cares_this_or_next_epoch.push(shard_uid);
20162005
}
@@ -2177,7 +2166,7 @@ impl Chain {
21772166
shard_id: ShardId,
21782167
) -> Result<(), Error> {
21792168
let epoch_id = block.header().epoch_id();
2180-
let shard_uid = self.epoch_manager.shard_id_to_uid(shard_id, epoch_id)?;
2169+
let shard_uid = shard_id_to_uid(self.epoch_manager.as_ref(), shard_id, epoch_id)?;
21812170

21822171
// Update flat storage.
21832172
let flat_storage_manager = self.runtime_adapter.get_flat_storage_manager();
@@ -2334,7 +2323,7 @@ impl Chain {
23342323
}
23352324

23362325
let (challenges_result, challenged_blocks) =
2337-
self.verify_challenges(block.challenges(), header.epoch_id(), header.prev_hash())?;
2326+
self.verify_challenges(block.challenges(), header.epoch_id())?;
23382327

23392328
let prev_block = self.get_block(&prev_hash)?;
23402329

@@ -3297,7 +3286,7 @@ impl Chain {
32973286
shard_id,
32983287
true,
32993288
) {
3300-
let shard_uid = self.epoch_manager.shard_id_to_uid(shard_id, &epoch_id)?;
3289+
let shard_uid = shard_id_to_uid(self.epoch_manager.as_ref(), shard_id, epoch_id)?;
33013290
self.resharding_manager.start_resharding(
33023291
self.chain_store.store_update(),
33033292
&block,
@@ -3742,7 +3731,7 @@ impl Chain {
37423731
cares_about_shard_next_epoch,
37433732
cared_about_shard_prev_epoch,
37443733
);
3745-
let shard_uid = self.epoch_manager.shard_id_to_uid(shard_id, epoch_id)?;
3734+
let shard_uid = shard_id_to_uid(self.epoch_manager.as_ref(), shard_id, epoch_id)?;
37463735
Ok(ShardContext { shard_uid, should_apply_chunk })
37473736
}
37483737

@@ -4483,9 +4472,16 @@ impl Chain {
44834472
) -> HashMap<ShardId, Vec<Receipt>> {
44844473
let mut result = HashMap::new();
44854474
for receipt in receipts {
4486-
let shard_id = shard_layout.account_id_to_shard_id(receipt.receiver_id());
4487-
let entry = result.entry(shard_id).or_insert_with(Vec::new);
4488-
entry.push(receipt)
4475+
if receipt.send_to_all_shards() {
4476+
for shard_id in shard_layout.shard_ids() {
4477+
let entry = result.entry(shard_id).or_insert_with(Vec::new);
4478+
entry.push(receipt.clone());
4479+
}
4480+
} else {
4481+
let shard_id = shard_layout.account_id_to_shard_id(receipt.receiver_id());
4482+
let entry = result.entry(shard_id).or_insert_with(Vec::new);
4483+
entry.push(receipt);
4484+
}
44894485
}
44904486
result
44914487
}
@@ -4506,13 +4502,22 @@ impl Chain {
45064502
}
45074503
let mut cache = HashMap::new();
45084504
for receipt in receipts {
4509-
let &mut shard_id = cache
4510-
.entry(receipt.receiver_id())
4511-
.or_insert_with(|| shard_layout.account_id_to_shard_id(receipt.receiver_id()));
4512-
// This unwrap should be safe as we pre-populated the map with all
4513-
// valid shard ids.
4514-
let shard_index = shard_layout.get_shard_index(shard_id).unwrap();
4515-
result_map.get_mut(&shard_index).unwrap().1.push(receipt);
4505+
if receipt.send_to_all_shards() {
4506+
for shard_id in shard_layout.shard_ids() {
4507+
// This unwrap should be safe as we pre-populated the map with all
4508+
// valid shard ids.
4509+
let shard_index = shard_layout.get_shard_index(shard_id).unwrap();
4510+
result_map.get_mut(&shard_index).unwrap().1.push(receipt);
4511+
}
4512+
} else {
4513+
let &mut shard_id = cache
4514+
.entry(receipt.receiver_id())
4515+
.or_insert_with(|| shard_layout.account_id_to_shard_id(receipt.receiver_id()));
4516+
// This unwrap should be safe as we pre-populated the map with all
4517+
// valid shard ids.
4518+
let shard_index = shard_layout.get_shard_index(shard_id).unwrap();
4519+
result_map.get_mut(&shard_index).unwrap().1.push(receipt);
4520+
}
45164521
}
45174522

45184523
let mut result_vec = vec![];

chain/chain/src/chain_update.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use crate::update_shard::{NewChunkResult, OldChunkResult, ShardUpdateResult};
1111
use crate::{metrics, DoomslugThresholdMode};
1212
use crate::{Chain, Doomslug};
1313
use near_chain_primitives::error::Error;
14+
use near_epoch_manager::shard_assignment::shard_id_to_uid;
1415
use near_epoch_manager::EpochManagerAdapter;
1516
use near_primitives::apply::ApplyChunkReason;
1617
use near_primitives::block::{Block, Tip};
@@ -562,7 +563,8 @@ impl<'a> ChainUpdate<'a> {
562563

563564
self.chain_store_update.save_chunk(chunk);
564565

565-
let shard_uid = self.epoch_manager.shard_id_to_uid(shard_id, block_header.epoch_id())?;
566+
let shard_uid =
567+
shard_id_to_uid(self.epoch_manager.as_ref(), shard_id, block_header.epoch_id())?;
566568
let flat_storage_manager = self.runtime_adapter.get_flat_storage_manager();
567569
let store_update = flat_storage_manager.save_flat_state_changes(
568570
*block_header.hash(),
@@ -639,7 +641,8 @@ impl<'a> ChainUpdate<'a> {
639641
let prev_hash = block_header.prev_hash();
640642
let prev_block_header = self.chain_store_update.get_block_header(prev_hash)?;
641643

642-
let shard_uid = self.epoch_manager.shard_id_to_uid(shard_id, block_header.epoch_id())?;
644+
let shard_uid =
645+
shard_id_to_uid(self.epoch_manager.as_ref(), shard_id, block_header.epoch_id())?;
643646
let chunk_extra = self.chain_store_update.get_chunk_extra(prev_hash, &shard_uid)?;
644647

645648
let apply_result = self.runtime_adapter.apply_chunk(

chain/chain/src/flat_storage_init.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use near_chain_primitives::Error;
2+
use near_epoch_manager::shard_assignment::shard_id_to_uid;
23
use near_epoch_manager::EpochManagerAdapter;
34
use near_primitives::block::Tip;
45
use near_store::flat::{FlatStorageManager, FlatStorageStatus};
@@ -44,7 +45,7 @@ fn init_flat_storage_for_current_epoch(
4445

4546
let shard_ids = epoch_manager.shard_ids(epoch_id)?;
4647
for shard_id in shard_ids {
47-
let shard_uid = epoch_manager.shard_id_to_uid(shard_id, &chain_head.epoch_id)?;
48+
let shard_uid = shard_id_to_uid(epoch_manager, shard_id, &chain_head.epoch_id)?;
4849
let status = flat_storage_manager.get_flat_storage_status(shard_uid);
4950
match status {
5051
FlatStorageStatus::Ready(_) => {
@@ -76,7 +77,7 @@ fn init_flat_storage_for_next_epoch(
7677

7778
let shard_ids = epoch_manager.shard_ids(next_epoch_id)?;
7879
for shard_id in shard_ids {
79-
let shard_uid = epoch_manager.shard_id_to_uid(shard_id, next_epoch_id)?;
80+
let shard_uid = shard_id_to_uid(epoch_manager, shard_id, next_epoch_id)?;
8081
let status = flat_storage_manager.get_flat_storage_status(shard_uid);
8182
match status {
8283
FlatStorageStatus::Ready(_) => {

chain/chain/src/flat_storage_resharder.rs

-1
Original file line numberDiff line numberDiff line change
@@ -1512,7 +1512,6 @@ mod tests {
15121512
let chain_genesis = ChainGenesis::new(&genesis.config);
15131513
let sender = Arc::new(T::new(ChainStore::new(
15141514
store,
1515-
chain_genesis.height,
15161515
false,
15171516
chain_genesis.transaction_validity_period,
15181517
)));

chain/chain/src/garbage_collection.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use std::{fmt, io};
44

55
use near_chain_configs::GCConfig;
66
use near_chain_primitives::Error;
7+
use near_epoch_manager::shard_assignment::shard_id_to_uid;
78
use near_epoch_manager::shard_tracker::ShardTracker;
89
use near_epoch_manager::EpochManagerAdapter;
910
use near_primitives::block::Block;
@@ -739,7 +740,7 @@ impl<'a> ChainStoreUpdate<'a> {
739740

740741
// 1. Delete shard_id-indexed data (TrieChanges, Receipts, ChunkExtra, State Headers and Parts, FlatStorage data)
741742
for shard_id in shard_layout.shard_ids() {
742-
let shard_uid = epoch_manager.shard_id_to_uid(shard_id, epoch_id).unwrap();
743+
let shard_uid = shard_id_to_uid(epoch_manager, shard_id, epoch_id).unwrap();
743744
let block_shard_id = get_block_shard_uid(&block_hash, &shard_uid);
744745

745746
// delete TrieChanges

chain/chain/src/resharding/manager.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ use near_chain_configs::{MutableConfigValue, ReshardingConfig, ReshardingHandle}
1212
use near_chain_primitives::Error;
1313
use near_epoch_manager::EpochManagerAdapter;
1414
use near_primitives::block::Block;
15-
use near_primitives::challenge::PartialState;
1615
use near_primitives::congestion_info::CongestionInfo;
1716
use near_primitives::hash::CryptoHash;
1817
use near_primitives::shard_layout::{get_block_shard_uid, ShardLayout};
18+
use near_primitives::state::PartialState;
1919
use near_primitives::types::chunk_extra::ChunkExtra;
2020
use near_store::adapter::trie_store::get_shard_uid_mapping;
2121
use near_store::adapter::{StoreAdapter, StoreUpdateAdapter};

chain/chain/src/resharding/resharding_actor.rs

+1-8
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,7 @@ impl Handler<MemtrieReloadRequest> for ReshardingActor {
4646

4747
impl ReshardingActor {
4848
pub fn new(store: Store, genesis: &ChainGenesis) -> Self {
49-
Self {
50-
chain_store: ChainStore::new(
51-
store,
52-
genesis.height,
53-
false,
54-
genesis.transaction_validity_period,
55-
),
56-
}
49+
Self { chain_store: ChainStore::new(store, false, genesis.transaction_validity_period) }
5750
}
5851

5952
fn handle_flat_storage_split_shard(

chain/chain/src/runtime/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use errors::FromStateViewerErrors;
99
use near_async::time::{Duration, Instant};
1010
use near_chain_configs::{GenesisConfig, ProtocolConfig, MIN_GC_NUM_EPOCHS_TO_KEEP};
1111
use near_crypto::PublicKey;
12+
use near_epoch_manager::shard_assignment::account_id_to_shard_id;
1213
use near_epoch_manager::{EpochManagerAdapter, EpochManagerHandle};
1314
use near_parameters::{ActionCosts, ExtCosts, RuntimeConfig, RuntimeConfigStore};
1415
use near_pool::types::TransactionGroupIterator;
@@ -1378,8 +1379,7 @@ fn congestion_control_accepts_transaction(
13781379
return Ok(true);
13791380
}
13801381
let receiver_id = tx.transaction.receiver_id();
1381-
let receiving_shard = epoch_manager.account_id_to_shard_id(receiver_id, &epoch_id)?;
1382-
1382+
let receiving_shard = account_id_to_shard_id(epoch_manager, receiver_id, &epoch_id)?;
13831383
let congestion_info = prev_block.congestion_info.get(&receiving_shard);
13841384
let Some(congestion_info) = congestion_info else {
13851385
return Ok(true);

0 commit comments

Comments
 (0)