Skip to content

Commit 3ff32a6

Browse files
committed
storage accounting
1 parent 3fbde8d commit 3ff32a6

File tree

2 files changed

+22
-0
lines changed

2 files changed

+22
-0
lines changed

ex/native/rdb/src/consensus/bic/wasm.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,11 @@ fn import_log_implementation(mut env: FunctionEnvMut<HostEnv>, ptr: i32, len: i3
6464
panic_any("exec_ptr_term_too_long")
6565
}
6666

67+
if applyenv.caller_env.entry_height >= protocol::FORKHEIGHT {
68+
crate::consensus::consensus_kv::storage_budget_decr(applyenv, protocol::COST_PER_BYTE_HISTORICAL * len as i128);
69+
} else {
6770
crate::consensus::consensus_kv::exec_budget_decr(applyenv, protocol::COST_PER_BYTE_HISTORICAL * len as i128);
71+
}
6872
set_remaining_points(&mut store, &instance, applyenv.exec_left.max(0) as u64);
6973

7074
let view = data.memory.clone().view(&store);

ex/native/rdb/src/consensus/consensus_kv.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,16 +66,25 @@ pub fn kv_put(env: &mut ApplyEnv, key: &[u8], value: &[u8]) {
6666
let old_value = env.txn.get_cf(&env.cf, key).unwrap();
6767
match old_value {
6868
None => {
69+
if env.caller_env.entry_height >= protocol::FORKHEIGHT {
70+
storage_budget_decr(env, protocol::COST_PER_NEW_LEAF_MERKLE);
71+
storage_budget_decr(env, protocol::COST_PER_BYTE_STATE * (key.len() + value.len()) as i128);
72+
} else {
6973
exec_budget_decr(env, protocol::COST_PER_NEW_LEAF_MERKLE);
7074
exec_budget_decr(env, protocol::COST_PER_BYTE_STATE * (key.len() + value.len()) as i128);
75+
}
7176
env.muts_rev.push(Mutation::Delete { op: b"delete".to_vec(), table: env.cf_name.to_vec(), key: key.to_vec() });
7277

7378
env.muts.push(Mutation::Put { op: b"put".to_vec(), table: env.cf_name.to_vec(), key: key.to_vec(), value: value.to_vec() });
7479
env.txn.put_cf(&env.cf, key, value).unwrap_or_else(|_| panic_any("exec_kv_put_failed"))
7580
},
7681
Some(old) => {
7782
//TODO: consider gas refund on delete? gas-token attack?
83+
if env.caller_env.entry_height >= protocol::FORKHEIGHT {
84+
storage_budget_decr(env, protocol::COST_PER_BYTE_STATE * value.len().saturating_sub(old.len()) as i128);
85+
} else {
7886
exec_budget_decr(env, protocol::COST_PER_BYTE_STATE * value.len().saturating_sub(old.len()) as i128);
87+
}
7988
env.muts_rev.push(Mutation::Put { op: b"put".to_vec(), table: env.cf_name.to_vec(), key: key.to_vec(), value: old.to_vec() });
8089

8190
env.muts.push(Mutation::Put { op: b"put".to_vec(), table: env.cf_name.to_vec(), key: key.to_vec(), value: value.to_vec() });
@@ -95,8 +104,13 @@ pub fn kv_increment(env: &mut ApplyEnv, key: &[u8], value: i128) -> i128 {
95104
match env.txn.get_cf(&env.cf, key).unwrap() {
96105
None => {
97106
exec_kv_size(key, Some(&value_str));
107+
if env.caller_env.entry_height >= protocol::FORKHEIGHT {
108+
storage_budget_decr(env, protocol::COST_PER_NEW_LEAF_MERKLE);
109+
storage_budget_decr(env, protocol::COST_PER_BYTE_STATE * (key.len() + value_str.len()) as i128);
110+
} else {
98111
exec_budget_decr(env, protocol::COST_PER_NEW_LEAF_MERKLE);
99112
exec_budget_decr(env, protocol::COST_PER_BYTE_STATE * (key.len() + value_str.len()) as i128);
113+
}
100114
env.muts.push(Mutation::Put { op: b"put".to_vec(), table: env.cf_name.to_vec(), key: key.to_vec(), value: value.to_string().into_bytes() });
101115
env.muts_rev.push(Mutation::Delete { op: b"delete".to_vec(), table: env.cf_name.to_vec(), key: key.to_vec() });
102116
env.txn.put_cf(&env.cf, key, value_str).unwrap_or_else(|_| panic_any("exec_kv_increment_failed"));
@@ -107,7 +121,11 @@ pub fn kv_increment(env: &mut ApplyEnv, key: &[u8], value: i128) -> i128 {
107121
let new_value = old_int.checked_add(value).unwrap_or_else(|| panic_any("exec_kv_increment_integer_overflow"));
108122
let new_value_str = new_value.to_string().into_bytes();
109123
exec_kv_size(key, Some(&new_value_str));
124+
if env.caller_env.entry_height >= protocol::FORKHEIGHT {
125+
storage_budget_decr(env, protocol::COST_PER_BYTE_STATE * new_value_str.len().saturating_sub(old.len()) as i128);
126+
} else {
110127
exec_budget_decr(env, protocol::COST_PER_BYTE_STATE * new_value_str.len().saturating_sub(old.len()) as i128);
128+
}
111129
env.muts.push(Mutation::Put { op: b"put".to_vec(), table: env.cf_name.to_vec(), key: key.to_vec(), value: new_value.to_string().into_bytes() });
112130
env.muts_rev.push(Mutation::Put { op: b"put".to_vec(), table: env.cf_name.to_vec(), key: key.to_vec(), value: old });
113131
env.txn.put_cf(&env.cf, key, new_value.to_string().into_bytes()).unwrap_or_else(|_| panic_any("kv_put_failed"));

0 commit comments

Comments
 (0)