Skip to content

Commit 4470bd8

Browse files
committed
fix chainstateservice and tests
1. implement default get_block_number instead of panicing 2. update ChainStateService with new block number
1 parent 65c0e69 commit 4470bd8

File tree

19 files changed

+87
-26
lines changed

19 files changed

+87
-26
lines changed

abi/resolver/src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,10 @@ mod tests {
405405
fn is_genesis(&self) -> bool {
406406
todo!()
407407
}
408+
409+
fn get_block_number(&self) -> Option<u64> {
410+
None
411+
}
408412
}
409413

410414
#[test]

chain/src/chain.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -453,12 +453,13 @@ impl BlockChain {
453453
parents_hash: Option<Vec<HashValue>>,
454454
) -> Result<ExecutedBlock> {
455455
let header = block.header();
456-
// Todo: add debug_assert for height_of_statedb
457456
let height_of_state = statedb.get_block_number();
458457
debug_assert!(header.is_genesis() || parent_status.is_some());
459458
debug_assert!(!header.is_genesis() || parent_status.is_none());
460459
let block_id = header.id();
461460
let block_num = header.number();
461+
debug_assert!(header.is_genesis() && height_of_state.is_none());
462+
debug_assert!(!header.is_genesis() && height_of_state.is_some());
462463
let transactions = {
463464
// genesis block do not generate BlockMetadata transaction.
464465
let mut t = match &parent_status {
@@ -1066,7 +1067,7 @@ impl ChainReader for BlockChain {
10661067
let state_proof = if let Some(access_path) = access_path {
10671068
let statedb = self
10681069
.statedb
1069-
.fork_at(transaction_info.txn_info().state_root_hash());
1070+
.fork_at(transaction_info.txn_info().state_root_hash(), None);
10701071
Some(statedb.get_with_proof(&access_path)?)
10711072
} else {
10721073
None

contrib-contracts/src/starcoin_merkle_test.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use starcoin_types::identifier::Identifier;
77
use starcoin_types::language_storage::ModuleId;
88
use starcoin_vm_types::access_path::AccessPath;
99
use starcoin_vm_types::account_config::association_address;
10+
use starcoin_vm_types::state_view::StateView;
1011
use starcoin_vm_types::transaction::{Package, ScriptFunction, TransactionPayload};
1112
use starcoin_vm_types::value::MoveValue;
1213
use test_helper::executor::{
@@ -38,6 +39,7 @@ fn test_starcoin_merkle() -> Result<()> {
3839
}
3940

4041
let state_root = chain_state.state_root();
42+
let block_number = chain_state.get_block_number();
4143

4244
{
4345
let script_function = ScriptFunction::new(
@@ -62,7 +64,7 @@ fn test_starcoin_merkle() -> Result<()> {
6264

6365
{
6466
// change to previous state root.
65-
let old_chain_state = chain_state.fork_at(state_root);
67+
let old_chain_state = chain_state.fork_at(state_root, block_number);
6668
// let state_root = chain_state.state_root();
6769
let _expected_root = MoveValue::vector_u8(state_root.to_vec());
6870

executor/tests/executor_test.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ impl StateView for NullStateView {
5656
fn is_genesis(&self) -> bool {
5757
false
5858
}
59+
60+
fn get_block_number(&self) -> Option<u64> {
61+
None
62+
}
5963
}
6064

6165
#[stest::test]

network-rpc/api/src/remote_chain_state.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,4 +154,8 @@ impl StateView for RemoteChainStateReader {
154154
fn is_genesis(&self) -> bool {
155155
false
156156
}
157+
158+
fn get_block_number(&self) -> Option<u64> {
159+
None
160+
}
157161
}

rpc/client/src/remote_state_reader.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,4 +140,8 @@ impl<'a> StateView for RemoteStateReader<'a> {
140140
fn is_genesis(&self) -> bool {
141141
false
142142
}
143+
144+
fn get_block_number(&self) -> Option<u64> {
145+
None
146+
}
143147
}

rpc/server/src/module/contract_rpc.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,11 @@ where
128128
args,
129129
} = call;
130130
let f = async move {
131-
let state_root = service.state_root().await?;
131+
let state_root = service.clone().state_root().await?;
132+
let block_number = service.get_block_number().await?;
132133
let output = playground.call_contract(
133134
state_root,
135+
block_number,
134136
function_id.0.module,
135137
function_id.0.function,
136138
type_args.into_iter().map(|v| v.0).collect(),
@@ -231,7 +233,9 @@ where
231233
let service = self.chain_state.clone();
232234
let storage = self.storage.clone();
233235
let fut = async move {
234-
let state = ChainStateDB::new(storage, Some(service.state_root().await?));
236+
let state_root = service.clone().state_root().await?;
237+
let block_number = service.get_block_number().await?;
238+
let state = ChainStateDB::new_with_root(storage, Some(state_root), block_number);
235239
ABIResolver::new(&state)
236240
.resolve_function(&function_id.0.module, function_id.0.function.as_ident_str())
237241
}

state/service/src/service.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,12 @@ impl EventHandler<Self, NewHeadBlock> for ChainStateService {
140140
let NewHeadBlock(block, _dag_parents) = msg;
141141

142142
let state_root = block.header().state_root();
143-
debug!("ChainStateActor change StateRoot to : {:?}", state_root);
144-
self.service.change_root(state_root);
143+
let block_number = block.header().number();
144+
debug!(
145+
"ChainStateActor change StateRoot to : {:?} {block_number}",
146+
state_root
147+
);
148+
self.service.change_root(state_root, block_number);
145149
}
146150
}
147151

@@ -171,7 +175,7 @@ impl Inner {
171175
) -> Result<Option<AccountStateSet>> {
172176
match state_root {
173177
Some(root) => {
174-
let reader = self.state_db.fork_at(root);
178+
let reader = self.state_db.fork_at(root, None);
175179
reader.get_account_state_set(&address)
176180
}
177181
None => self.get_account_state_set(&address),
@@ -183,7 +187,7 @@ impl Inner {
183187
access_path: AccessPath,
184188
state_root: HashValue,
185189
) -> Result<StateWithProof> {
186-
let reader = self.state_db.fork_at(state_root);
190+
let reader = self.state_db.fork_at(state_root, None);
187191
reader.get_with_proof(&access_path)
188192
}
189193

@@ -193,7 +197,7 @@ impl Inner {
193197
key: Vec<u8>,
194198
state_root: HashValue,
195199
) -> Result<StateWithTableItemProof> {
196-
let reader = self.state_db.fork_at(state_root);
200+
let reader = self.state_db.fork_at(state_root, None);
197201
reader.get_with_table_item_proof(&handle, &key)
198202
}
199203

@@ -202,12 +206,12 @@ impl Inner {
202206
account: AccountAddress,
203207
state_root: HashValue,
204208
) -> Result<Option<AccountState>> {
205-
let reader = self.state_db.fork_at(state_root);
209+
let reader = self.state_db.fork_at(state_root, None);
206210
reader.get_account_state(&account)
207211
}
208212

209-
pub(crate) fn change_root(&mut self, state_root: HashValue) {
210-
self.state_db = self.state_db.fork_at(state_root);
213+
pub(crate) fn change_root(&mut self, state_root: HashValue, block_number: BlockNumber) {
214+
self.state_db = self.state_db.fork_at(state_root, Some(block_number));
211215
self.adjust_time();
212216
}
213217

state/statedb/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -291,8 +291,8 @@ impl ChainStateDB {
291291
}
292292

293293
/// Fork a new statedb at `root_hash`
294-
pub fn fork_at(&self, state_root: HashValue) -> Self {
295-
Self::new_with_root(self.store.clone(), Some(state_root), None)
294+
pub fn fork_at(&self, state_root: HashValue, block_number: Option<BlockNumber>) -> Self {
295+
Self::new_with_root(self.store.clone(), Some(state_root), block_number)
296296
}
297297

298298
fn new_state_tree<K: RawKey>(&self, root_hash: HashValue) -> StateTree<K> {

test-helper/src/starcoin_dao.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ fn get_with_proof_by_root(
6666
access_path: AccessPath,
6767
state_root: HashValue,
6868
) -> Result<StateWithProof> {
69-
let reader = state_db.fork_at(state_root);
69+
let reader = state_db.fork_at(state_root, None);
7070
reader.get_with_proof(&access_path)
7171
}
7272

vm/dev/src/playground.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,21 +43,25 @@ impl PlaygroudService {
4343
pub fn dry_run(
4444
&self,
4545
state_root: HashValue,
46+
block_number: Option<u64>,
4647
txn: DryRunTransaction,
4748
) -> Result<(VMStatus, TransactionOutput)> {
48-
let state_view = ChainStateDB::new(self.state.clone(), Some(state_root));
49+
let state_view =
50+
ChainStateDB::new_with_root(self.state.clone(), Some(state_root), block_number);
4951
dry_run(&state_view, txn, self.metrics.clone())
5052
}
5153

5254
pub fn call_contract(
5355
&self,
5456
state_root: HashValue,
57+
block_number: Option<u64>,
5558
module_id: ModuleId,
5659
func: Identifier,
5760
type_args: Vec<TypeTag>,
5861
args: Vec<TransactionArgument>,
5962
) -> Result<Vec<AnnotatedMoveValue>> {
60-
let state_view = ChainStateDB::new(self.state.clone(), Some(state_root));
63+
let state_view =
64+
ChainStateDB::new_with_root(self.state.clone(), Some(state_root), block_number);
6165
let rets = call_contract(
6266
&state_view,
6367
module_id,

vm/e2e-tests/src/data_store.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,10 @@ impl StateView for FakeDataStore {
105105
fn is_genesis(&self) -> bool {
106106
self.inner().is_empty()
107107
}
108+
109+
fn get_block_number(&self) -> Option<u64> {
110+
None
111+
}
108112
}
109113

110114
impl ChainStateWriter for FakeDataStore {

vm/resource-viewer/src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,4 +324,8 @@ impl StateView for NullStateView {
324324
fn is_genesis(&self) -> bool {
325325
false
326326
}
327+
328+
fn get_block_number(&self) -> Option<u64> {
329+
None
330+
}
327331
}

vm/starcoin-transactional-test-harness/src/fork_state.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ impl ChainStateAsyncService for MockChainStateAsyncService {
117117
) -> Result<Option<AccountStateSet>> {
118118
match state_root {
119119
Some(root) => {
120-
let reader = self.state_db().fork_at(root);
120+
let reader = self.state_db().fork_at(root, None);
121121
reader.get_account_state_set(&address)
122122
}
123123
None => self.state_db().get_account_state_set(&address),
@@ -132,7 +132,7 @@ impl ChainStateAsyncService for MockChainStateAsyncService {
132132
access_path: AccessPath,
133133
state_root: HashValue,
134134
) -> Result<StateWithProof> {
135-
let reader = self.state_db().fork_at(state_root);
135+
let reader = self.state_db().fork_at(state_root, None);
136136
reader.get_with_proof(&access_path)
137137
}
138138

@@ -141,7 +141,7 @@ impl ChainStateAsyncService for MockChainStateAsyncService {
141141
account_address: AccountAddress,
142142
state_root: HashValue,
143143
) -> Result<Option<AccountState>> {
144-
let reader = self.state_db().fork_at(state_root);
144+
let reader = self.state_db().fork_at(state_root, None);
145145
reader.get_account_state(&account_address)
146146
}
147147

@@ -160,7 +160,7 @@ impl ChainStateAsyncService for MockChainStateAsyncService {
160160
key: Vec<u8>,
161161
state_root: HashValue,
162162
) -> Result<StateWithTableItemProof> {
163-
let reader = self.state_db().fork_at(state_root);
163+
let reader = self.state_db().fork_at(state_root, None);
164164
reader.get_with_table_item_proof(&handle, &key)
165165
}
166166

vm/starcoin-transactional-test-harness/src/remote_state.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@ where
7878
fn is_genesis(&self) -> bool {
7979
false
8080
}
81+
82+
fn get_block_number(&self) -> Option<u64> {
83+
None
84+
}
8185
}
8286
impl<A, B> ChainStateWriter for SelectableStateView<A, B>
8387
where
@@ -184,6 +188,10 @@ where
184188
fn is_genesis(&self) -> bool {
185189
false
186190
}
191+
192+
fn get_block_number(&self) -> Option<u64> {
193+
None
194+
}
187195
}
188196

189197
//TODO migrate this to rpc client crate.
@@ -405,4 +413,8 @@ impl StateView for RemoteViewer {
405413
fn is_genesis(&self) -> bool {
406414
false
407415
}
416+
417+
fn get_block_number(&self) -> Option<u64> {
418+
None
419+
}
408420
}

vm/types/src/state_view.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,7 @@ pub trait StateView: Sync {
4343
/// Currently TransactionPayload::WriteSet is only valid for genesis state creation.
4444
fn is_genesis(&self) -> bool;
4545

46-
fn get_block_number(&self) -> Option<u64> {
47-
panic!("Never call me and implement this function yourself");
48-
}
46+
fn get_block_number(&self) -> Option<u64>;
4947
}
5048

5149
impl<R, S> StateView for R
@@ -60,6 +58,10 @@ where
6058
fn is_genesis(&self) -> bool {
6159
self.deref().is_genesis()
6260
}
61+
62+
fn get_block_number(&self) -> Option<u64> {
63+
self.deref().get_block_number()
64+
}
6365
}
6466

6567
impl<T: ?Sized> StateReaderExt for T where T: StateView {}

vm/vm-runtime/src/data_cache.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,10 @@ impl<'block, S: StateView> StateView for StateViewCache<'block, S> {
8989
fn is_genesis(&self) -> bool {
9090
self.data_view.is_genesis()
9191
}
92+
93+
fn get_block_number(&self) -> Option<u64> {
94+
self.data_view.get_block_number()
95+
}
9296
}
9397

9498
impl<'block, S: StateView> ModuleResolver for StateViewCache<'block, S> {

vm/vm-runtime/src/parallel_executor/storage_wrapper.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,8 @@ impl<'a, S: StateView> StateView for VersionedView<'a, S> {
4040
fn is_genesis(&self) -> bool {
4141
self.base_view.is_genesis()
4242
}
43+
44+
fn get_block_number(&self) -> Option<u64> {
45+
self.base_view.get_block_number()
46+
}
4347
}

vm/vm-runtime/src/starcoin_vm.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ impl StarcoinVM {
280280
if height_of_state >= FLEXI_DAG_FORK_HEIGHT
281281
&& stdlib_version >= StdlibVersion::Version(FLEXIDAG_UPGRADE_VERSION_MARK)
282282
{
283-
todo!()
283+
debug!("flexidag stdlib");
284284
}
285285

286286
(gas_schedule, "gas schedule from GasSchedule")

0 commit comments

Comments
 (0)