Skip to content

Commit 5d06f5a

Browse files
author
Seulgi Kim
committed
Make CreateWorld fail if the sender is not one of the shard owners
1 parent ab52c46 commit 5d06f5a

File tree

1 file changed

+21
-12
lines changed

1 file changed

+21
-12
lines changed

state/src/impls/shard_level.rs

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ impl<B: Backend + ShardBackend> ShardLevelState<B> {
116116
nonce,
117117
owners,
118118
..
119-
} => Ok(self.create_world(shard_id, nonce, owners)?),
119+
} => Ok(self.create_world(shard_id, nonce, owners, sender, shard_owners)?),
120120
Transaction::SetWorldOwners {
121121
shard_id,
122122
world_id,
@@ -144,7 +144,18 @@ impl<B: Backend + ShardBackend> ShardLevelState<B> {
144144
}
145145
}
146146

147-
fn create_world(&mut self, shard_id: ShardId, nonce: &u64, owners: &Vec<Address>) -> StateResult<()> {
147+
fn create_world(
148+
&mut self,
149+
shard_id: ShardId,
150+
nonce: &u64,
151+
owners: &Vec<Address>,
152+
sender: &Address,
153+
shard_owners: &[Address],
154+
) -> StateResult<()> {
155+
if !shard_owners.contains(sender) {
156+
return Err(TransactionError::InsufficientPermission.into())
157+
}
158+
148159
let metadata_address = ShardMetadataAddress::new(shard_id);
149160
let mut metadata = self.require_metadata(&metadata_address, || unreachable!("Shard must have metadata"))?;
150161

@@ -572,9 +583,8 @@ mod tests {
572583
};
573584

574585
let sender = address();
575-
let shard_owner = address();
576-
let result = state.apply(shard_id, &transaction, &sender, &[shard_owner]);
577-
assert_eq!(Ok(TransactionInvoice::Success), result);
586+
let shard_owner = sender;
587+
assert_eq!(Ok(TransactionInvoice::Success), state.apply(shard_id, &transaction, &sender, &[shard_owner]));
578588

579589
let metadata = state.metadata();
580590
assert_eq!(Ok(Some(ShardMetadata::new_with_nonce(1, 1))), metadata);
@@ -601,9 +611,8 @@ mod tests {
601611
};
602612

603613
let sender = address();
604-
let shard_owner = address();
605-
let result = state.apply(shard_id, &transaction, &sender, &[shard_owner]);
606-
assert_eq!(Ok(TransactionInvoice::Success), result);
614+
let shard_owner = sender;
615+
assert_eq!(Ok(TransactionInvoice::Success), state.apply(shard_id, &transaction, &sender, &[shard_owner]));
607616

608617
let metadata = state.metadata();
609618
assert_eq!(Ok(Some(ShardMetadata::new_with_nonce(1, 1))), metadata);
@@ -630,7 +639,7 @@ mod tests {
630639
};
631640

632641
let sender = address();
633-
let shard_owner = address();
642+
let shard_owner = sender;
634643
assert_eq!(
635644
Ok(TransactionInvoice::Fail(TransactionError::InvalidShardNonce(Mismatch {
636645
expected: 0,
@@ -953,7 +962,7 @@ mod tests {
953962
let mut state = get_temp_shard_state(shard_id);
954963

955964
let owners = vec![Address::random(), Address::random()];
956-
assert_eq!(Ok(()), state.create_world(shard_id, &0, &owners));
965+
assert_eq!(Ok(()), state.create_world(shard_id, &0, &owners, &owners[0], &owners));
957966
assert_eq!(Ok(()), state.commit());
958967

959968
let metadata = state.metadata();
@@ -996,7 +1005,7 @@ mod tests {
9961005

9971006
let sender = Address::random();
9981007
let old_owners = vec![sender, Address::random()];
999-
assert_eq!(Ok(()), state.create_world(shard_id, &0, &old_owners));
1008+
assert_eq!(Ok(()), state.create_world(shard_id, &0, &old_owners, &sender, &old_owners));
10001009
assert_eq!(Ok(()), state.commit());
10011010

10021011
let metadata = state.metadata();
@@ -1032,7 +1041,7 @@ mod tests {
10321041
let mut state = get_temp_shard_state(shard_id);
10331042

10341043
let owners = vec![Address::random(), Address::random()];
1035-
assert_eq!(Ok(()), state.create_world(shard_id, &0, &owners));
1044+
assert_eq!(Ok(()), state.create_world(shard_id, &0, &owners, &owners[0], &owners));
10361045
assert_eq!(Ok(()), state.commit());
10371046

10381047
let metadata = state.metadata();

0 commit comments

Comments
 (0)