Skip to content

Commit d34ff39

Browse files
authored
change unit of storage limit to Byte (#1146)
* change unit of storage limit to Byte * rename storage_occupied to storage_collateralized
1 parent b753232 commit d34ff39

File tree

17 files changed

+77
-62
lines changed

17 files changed

+77
-62
lines changed

client/src/rpc/impls/cfx.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ use cfx_types::{Public, H160, H256, U256};
2424
use cfxcore::{
2525
block_data_manager::BlockExecutionResultWithEpoch,
2626
block_parameters::MAX_BLOCK_SIZE_IN_BYTES, executive::Executed,
27-
state_exposer::STATE_EXPOSER, test_context::*, ConsensusGraph,
28-
ConsensusGraphTrait, PeerInfo, SharedConsensusGraph,
29-
SharedSynchronizationService, SharedTransactionPool,
27+
parameters::staking::COLLATERAL_PER_BYTE, state_exposer::STATE_EXPOSER,
28+
test_context::*, ConsensusGraph, ConsensusGraphTrait, PeerInfo,
29+
SharedConsensusGraph, SharedSynchronizationService, SharedTransactionPool,
3030
};
3131
use jsonrpc_core::{
3232
futures::future::{Future, IntoFuture},
@@ -714,15 +714,16 @@ impl RpcImpl {
714714
) -> RpcResult<EstimateGasAndCollateralResponse> {
715715
let caller = request.from.unwrap_or_default();
716716
let success_executed = self.exec_transaction(request, epoch)?;
717-
let mut storage_occupied = U256::zero();
718-
for storage_change in &success_executed.storage_occupied {
717+
let mut storage_collateralized = U256::zero();
718+
for storage_change in &success_executed.storage_collateralized {
719719
if storage_change.address == caller {
720-
storage_occupied = storage_change.amount;
720+
storage_collateralized =
721+
storage_change.amount / *COLLATERAL_PER_BYTE;
721722
}
722723
}
723724
let response = EstimateGasAndCollateralResponse {
724725
gas_used: success_executed.gas_used.into(),
725-
storage_occupied: storage_occupied.into(),
726+
storage_collateralized: storage_collateralized.into(),
726727
};
727728
Ok(response)
728729
}

client/src/rpc/types/call_request.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,10 @@ pub struct CallRequest {
3434
#[derive(Debug, Default, PartialEq, Deserialize, Serialize)]
3535
#[serde(rename_all = "camelCase")]
3636
pub struct EstimateGasAndCollateralResponse {
37+
/// The amount of gas used in the execution.
3738
pub gas_used: U256,
38-
pub storage_occupied: U256,
39+
/// The number of bytes collateralized in the execution.
40+
pub storage_collateralized: U256,
3941
}
4042

4143
pub fn sign_call(

core/src/alliance_tree_graph/consensus/consensus_inner/consensus_executor.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -788,7 +788,7 @@ impl ConsensusExecutionHandler {
788788
tx_outcome_status,
789789
cumulative_gas_used,
790790
transaction_logs,
791-
Vec::new(), /* storage_occupied */
791+
Vec::new(), /* storage_collateralized */
792792
Vec::new(), /* storage_released */
793793
);
794794
receipts.push(receipt);

core/src/consensus/consensus_inner/consensus_executor.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,7 +1042,7 @@ impl ConsensusExecutionHandler {
10421042
let mut transaction_logs = Vec::new();
10431043
let mut nonce_increased = false;
10441044
let mut storage_released = Vec::new();
1045-
let mut storage_occupied = Vec::new();
1045+
let mut storage_collateralized = Vec::new();
10461046
let pivot_height = pivot_block.block_header.height();
10471047

10481048
// If the transaction's chain_id is not match the best chain id
@@ -1121,8 +1121,8 @@ impl ConsensusExecutionHandler {
11211121
Ok(ref executed) => {
11221122
env.gas_used = executed.cumulative_gas_used;
11231123
transaction_logs = executed.logs.clone();
1124-
storage_occupied =
1125-
executed.storage_occupied.clone();
1124+
storage_collateralized =
1125+
executed.storage_collateralized.clone();
11261126
storage_released =
11271127
executed.storage_released.clone();
11281128
if executed.exception.is_some() {
@@ -1155,7 +1155,7 @@ impl ConsensusExecutionHandler {
11551155
tx_outcome_status,
11561156
env.gas_used,
11571157
transaction_logs,
1158-
storage_occupied,
1158+
storage_collateralized,
11591159
storage_released,
11601160
);
11611161
receipts.push(receipt);

core/src/executive/context.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use super::{executive::*, suicide as suicide_impl, InternalContractMap};
77
use crate::{
88
bytes::Bytes,
99
machine::Machine,
10-
parameters::{consensus_internal::CONFLUX_TOKEN, staking::*},
10+
parameters::staking::*,
1111
state::{State, Substate},
1212
vm::{
1313
self, ActionParams, ActionValue, CallType, Context as ContextTrait,
@@ -331,9 +331,8 @@ impl<'a> ContextTrait for Context<'a> {
331331
false => Ok(*gas),
332332
};
333333
}
334-
let collateral_for_code = U256::from(data.len())
335-
* U256::from(CONFLUX_TOKEN)
336-
/ U256::from(NUM_BYTES_PER_CONFLUX_TOKEN);
334+
let collateral_for_code =
335+
U256::from(data.len()) * *COLLATERAL_PER_BYTE;
337336
let balance =
338337
self.state.balance(&self.origin.original_sender)?;
339338
let collateral_for_storage = self

core/src/executive/executed.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ pub struct Executed {
3131
pub logs: Vec<LogEntry>,
3232

3333
/// Any accounts that occupy some storage.
34-
pub storage_occupied: Vec<StorageChange>,
34+
pub storage_collateralized: Vec<StorageChange>,
3535

3636
/// Any accounts that release some storage.
3737
pub storage_released: Vec<StorageChange>,

core/src/executive/executive.rs

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::{
1111
evm::{FinalizationResult, Finalize},
1212
hash::keccak,
1313
machine::Machine,
14-
parameters::staking::COLLATERAL_PER_STORAGE_KEY,
14+
parameters::staking::*,
1515
state::{CleanupMode, CollateralCheckResult, State, Substate},
1616
vm::{
1717
self, ActionParams, ActionValue, CallType, CleanDustMode,
@@ -1381,12 +1381,18 @@ impl<'a> Executive<'a> {
13811381
} else {
13821382
U256::zero()
13831383
};
1384-
if tx.storage_limit >= sponsored_balance {
1385-
if tx.storage_limit - sponsored_balance
1384+
let storage_limit_in_drip =
1385+
if tx.storage_limit >= U256::MAX / *COLLATERAL_PER_BYTE {
1386+
U256::MAX
1387+
} else {
1388+
tx.storage_limit * *COLLATERAL_PER_BYTE
1389+
};
1390+
if storage_limit_in_drip >= sponsored_balance {
1391+
if storage_limit_in_drip - sponsored_balance
13861392
<= U256::MAX - collateral_for_storage
13871393
{
13881394
// The incremental storage cost will be payed by the sender.
1389-
tx.storage_limit - sponsored_balance
1395+
storage_limit_in_drip - sponsored_balance
13901396
+ collateral_for_storage
13911397
} else {
13921398
U256::MAX
@@ -1545,24 +1551,27 @@ impl<'a> Executive<'a> {
15451551
cumulative_gas_used: self.env.gas_used + tx.gas,
15461552
logs: vec![],
15471553
contracts_created: vec![],
1548-
storage_occupied: Vec::new(),
1554+
storage_collateralized: Vec::new(),
15491555
storage_released: Vec::new(),
15501556
output,
15511557
}),
15521558
Ok(r) => {
1553-
let mut storage_occupied = Vec::new();
1559+
let mut storage_collateralized = Vec::new();
15541560
let mut storage_released = Vec::new();
15551561
if r.apply_state {
1556-
let affected_address1: HashSet<_> =
1557-
substate.storage_occupied.keys().cloned().collect();
1562+
let affected_address1: HashSet<_> = substate
1563+
.storage_collateralized
1564+
.keys()
1565+
.cloned()
1566+
.collect();
15581567
let affected_address2: HashSet<_> =
15591568
substate.storage_released.keys().cloned().collect();
15601569
let mut affected_address: Vec<_> =
15611570
affected_address1.union(&affected_address2).collect();
15621571
affected_address.sort();
15631572
for address in affected_address {
15641573
let inc = substate
1565-
.storage_occupied
1574+
.storage_collateralized
15661575
.get(address)
15671576
.cloned()
15681577
.unwrap_or(0);
@@ -1572,7 +1581,7 @@ impl<'a> Executive<'a> {
15721581
.cloned()
15731582
.unwrap_or(0);
15741583
if inc > sub {
1575-
storage_occupied.push(StorageChange {
1584+
storage_collateralized.push(StorageChange {
15761585
address: *address,
15771586
amount: U256::from(inc - sub)
15781587
* *COLLATERAL_PER_STORAGE_KEY,
@@ -1599,7 +1608,7 @@ impl<'a> Executive<'a> {
15991608
cumulative_gas_used,
16001609
logs: substate.logs,
16011610
contracts_created: substate.contracts_created,
1602-
storage_occupied,
1611+
storage_collateralized,
16031612
storage_released,
16041613
output,
16051614
})

core/src/executive/executive_tests.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1331,8 +1331,8 @@ fn test_storage_commission_privilege() {
13311331
);
13321332
ex.create(params.clone(), &mut substate).unwrap()
13331333
};
1334-
assert_eq!(substate.storage_occupied.len(), 1);
1335-
assert_eq!(substate.storage_occupied[&sender], 1);
1334+
assert_eq!(substate.storage_collateralized.len(), 1);
1335+
assert_eq!(substate.storage_collateralized[&sender], 1);
13361336

13371337
state
13381338
.set_sponsor_for_collateral(
@@ -1402,8 +1402,8 @@ fn test_storage_commission_privilege() {
14021402
CollateralCheckResult::Valid
14031403
);
14041404
state.discard_checkpoint();
1405-
assert_eq!(substate.storage_occupied.len(), 1);
1406-
assert_eq!(substate.storage_occupied[&sender], 3);
1405+
assert_eq!(substate.storage_collateralized.len(), 1);
1406+
assert_eq!(substate.storage_collateralized[&sender], 3);
14071407
assert_eq!(
14081408
*state.total_storage_tokens(),
14091409
*COLLATERAL_PER_STORAGE_KEY * U256::from(3)
@@ -1447,8 +1447,8 @@ fn test_storage_commission_privilege() {
14471447
);
14481448
ex.call(params.clone(), &mut substate).unwrap()
14491449
};
1450-
assert_eq!(substate.storage_occupied.len(), 1);
1451-
assert_eq!(substate.storage_occupied[&caller3], 1);
1450+
assert_eq!(substate.storage_collateralized.len(), 1);
1451+
assert_eq!(substate.storage_collateralized[&caller3], 1);
14521452
assert_eq!(substate.storage_released.len(), 1);
14531453
assert_eq!(substate.storage_released[&sender], 1);
14541454
assert_eq!(gas_left, U256::from(94983));
@@ -1489,8 +1489,8 @@ fn test_storage_commission_privilege() {
14891489
);
14901490
ex.call(params.clone(), &mut substate).unwrap()
14911491
};
1492-
assert_eq!(substate.storage_occupied.len(), 1);
1493-
assert_eq!(substate.storage_occupied[&address], 1);
1492+
assert_eq!(substate.storage_collateralized.len(), 1);
1493+
assert_eq!(substate.storage_collateralized[&address], 1);
14941494
assert_eq!(substate.storage_released.len(), 1);
14951495
assert_eq!(substate.storage_released[&caller3], 1);
14961496
assert_eq!(gas_left, U256::from(94983));
@@ -1557,8 +1557,8 @@ fn test_storage_commission_privilege() {
15571557
);
15581558
ex.call(params.clone(), &mut substate).unwrap()
15591559
};
1560-
assert_eq!(substate.storage_occupied.len(), 1);
1561-
assert_eq!(substate.storage_occupied[&caller2], 1);
1560+
assert_eq!(substate.storage_collateralized.len(), 1);
1561+
assert_eq!(substate.storage_collateralized[&caller2], 1);
15621562
assert_eq!(substate.storage_released.len(), 1);
15631563
assert_eq!(substate.storage_released[&address], 1);
15641564
assert_eq!(gas_left, U256::from(94983));
@@ -1618,8 +1618,8 @@ fn test_storage_commission_privilege() {
16181618
);
16191619
ex.call(params.clone(), &mut substate).unwrap()
16201620
};
1621-
assert_eq!(substate.storage_occupied.len(), 1);
1622-
assert_eq!(substate.storage_occupied[&caller1], 1);
1621+
assert_eq!(substate.storage_collateralized.len(), 1);
1622+
assert_eq!(substate.storage_collateralized[&caller1], 1);
16231623
assert_eq!(substate.storage_released.len(), 2);
16241624
assert_eq!(substate.storage_released[&sender], 1);
16251625
assert_eq!(substate.storage_released[&caller2], 1);

core/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ pub mod error;
5353
mod evm;
5454
pub mod executive;
5555
pub mod genesis;
56-
mod parameters;
56+
pub mod parameters;
5757
#[macro_use]
5858
pub mod message;
5959
pub mod alliance_tree_graph;

core/src/parameters.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,9 +188,11 @@ pub mod staking {
188188
pub const BLOCKS_PER_YEAR: u64 = BLOCKS_PER_DAY * 365;
189189

190190
lazy_static! {
191+
/// This is the renting fee for one byte in storage. 1 CFX for 1024 Bytes.
192+
pub static ref COLLATERAL_PER_BYTE: U256 = U256::from(CONFLUX_TOKEN / NUM_BYTES_PER_CONFLUX_TOKEN);
191193
/// This is the renting fee for one key/value pair in storage.
192194
/// 1 CFX for 1 KB, the storage for one key/value pair is 64 B = 1/16 CFX.
193-
pub static ref COLLATERAL_PER_STORAGE_KEY: U256 = U256::from(CONFLUX_TOKEN / (NUM_BYTES_PER_CONFLUX_TOKEN / 64));
195+
pub static ref COLLATERAL_PER_STORAGE_KEY: U256 = *COLLATERAL_PER_BYTE * U256::from(64);
194196
/// This is the scale factor for accumulated interest rate: `BLOCKS_PER_YEAR * 2 ^ 80`.
195197
/// The actual accumulate interest rate stored will be `accumulate_interest_rate / INTEREST_RATE_SCALE`.
196198
pub static ref ACCUMULATED_INTEREST_RATE_SCALE: U256 = U256::from(BLOCKS_PER_YEAR) << 80;

core/src/state/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,8 @@ impl State {
235235
*substate.storage_released.entry(addr).or_insert(0) += sub;
236236
}
237237
for (addr, inc) in collateral_for_storage_inc {
238-
*substate.storage_occupied.entry(addr).or_insert(0) += inc;
238+
*substate.storage_collateralized.entry(addr).or_insert(0) +=
239+
inc;
239240
}
240241
Ok(CollateralCheckResult::Valid)
241242
}

core/src/state/substate.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ pub struct Substate {
1919
pub touched: HashSet<Address>,
2020

2121
/// Any accounts that occupy some storage.
22-
pub storage_occupied: HashMap<Address, u64>,
22+
pub storage_collateralized: HashMap<Address, u64>,
2323

2424
/// Any accounts that release some storage.
2525
pub storage_released: HashMap<Address, u64>,
@@ -46,8 +46,8 @@ impl Substate {
4646
self.logs.extend(s.logs);
4747
self.sstore_clears_refund += s.sstore_clears_refund;
4848
self.contracts_created.extend(s.contracts_created);
49-
for (address, amount) in s.storage_occupied {
50-
*self.storage_occupied.entry(address).or_insert(0) += amount;
49+
for (address, amount) in s.storage_collateralized {
50+
*self.storage_collateralized.entry(address).or_insert(0) += amount;
5151
}
5252
for (address, amount) in s.storage_released {
5353
*self.storage_released.entry(address).or_insert(0) += amount;

primitives/src/block_header.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,7 @@ mod tests {
528528
logs: vec![],
529529
outcome_status: 0,
530530
log_bloom: Bloom::zero(),
531-
storage_occupied: vec![],
531+
storage_collateralized: vec![],
532532
storage_released: vec![],
533533
};
534534

@@ -566,7 +566,7 @@ mod tests {
566566
00000000000000000000000000000000",
567567
)
568568
.unwrap(),
569-
storage_occupied: vec![],
569+
storage_collateralized: vec![],
570570
storage_released: vec![],
571571
},
572572
Receipt {
@@ -592,7 +592,7 @@ mod tests {
592592
00000000000000000000000000000000",
593593
)
594594
.unwrap(),
595-
storage_occupied: vec![],
595+
storage_collateralized: vec![],
596596
storage_released: vec![],
597597
},
598598
];
@@ -620,7 +620,7 @@ mod tests {
620620
00000000000000000000000000000000",
621621
)
622622
.unwrap(),
623-
storage_occupied: vec![],
623+
storage_collateralized: vec![],
624624
storage_released: vec![],
625625
}];
626626

primitives/src/receipt.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,14 @@ pub struct Receipt {
2828
pub logs: Vec<LogEntry>,
2929
/// Transaction outcome.
3030
pub outcome_status: u8,
31-
pub storage_occupied: Vec<StorageChange>,
31+
pub storage_collateralized: Vec<StorageChange>,
3232
pub storage_released: Vec<StorageChange>,
3333
}
3434

3535
impl Receipt {
3636
pub fn new(
3737
outcome: u8, gas_used: U256, logs: Vec<LogEntry>,
38-
storage_occupied: Vec<StorageChange>,
38+
storage_collateralized: Vec<StorageChange>,
3939
storage_released: Vec<StorageChange>,
4040
) -> Self
4141
{
@@ -47,7 +47,7 @@ impl Receipt {
4747
}),
4848
logs,
4949
outcome_status: outcome,
50-
storage_occupied,
50+
storage_collateralized,
5151
storage_released,
5252
}
5353
}

0 commit comments

Comments
 (0)