@@ -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