Skip to content

Commit 6a3a032

Browse files
committed
dev: bitwise-trie of stored balances
1 parent 5fddb99 commit 6a3a032

File tree

6 files changed

+444
-12
lines changed

6 files changed

+444
-12
lines changed

Cargo.lock

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ cosmwasm-storage = { package = "secret-cosmwasm-storage", version = "1.1.11" }
3737
rand = { version = "0.8.5", default-features = false }
3838
secret-toolkit = { version = "0.10.0", default-features = false, features = ["permit", "storage", "viewing-key"] }
3939
secret-toolkit-crypto = { version = "0.10.0", default-features = false, features = ["hash"] }
40+
static_assertions = "1.1.0"
4041

4142
schemars = "0.8.12"
4243
serde = { version = "1.0.158", default-features = false, features = ["derive"] }

src/contract.rs

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use secret_toolkit_crypto::{sha_256, ContractPrng};
1010

1111
use crate::batch;
1212
use crate::dwb::{log_dwb, AccountTxsStore, DelayedWriteBuffer, ACCOUNT_TXS, ACCOUNT_TX_COUNT, DWB, TX_NODES};
13+
use crate::bucket;
1314
use crate::msg::{
1415
AllowanceGivenResult, AllowanceReceivedResult, ContractStatusLevel, ExecuteAnswer,
1516
ExecuteMsg, InstantiateMsg, QueryAnswer, QueryMsg, QueryWithPermit, ResponseStatus::Success,

src/dwb.rs

+12-12
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@ use serde_big_array::BigArray;
66
use cosmwasm_std::{to_binary, Api, Binary, CanonicalAddr, StdError, StdResult, Storage};
77
use secret_toolkit::storage::{AppendStore, Item};
88

9-
use crate::{msg::QueryAnswer, state::{safe_add, safe_add_u64, BalancesStore,}, transaction_history::{Tx, TRANSACTIONS}};
9+
use crate::{
10+
msg::QueryAnswer,
11+
state::{safe_add, safe_add_u64, BalancesStore,},
12+
transaction_history::{Tx, TRANSACTIONS},
13+
};
1014

1115
pub const KEY_DWB: &[u8] = b"dwb";
1216
pub const KEY_TX_NODES_COUNT: &[u8] = b"dwb-node-cnt";
@@ -261,6 +265,7 @@ impl DelayedWriteBuffer {
261265

262266
const U16_BYTES: usize = 2;
263267
const U64_BYTES: usize = 8;
268+
const U128_BYTES: usize = 16;
264269

265270
#[cfg(test)]
266271
const DWB_RECIPIENT_BYTES: usize = 54; // because mock_api creates rando canonical addr that is 54 bytes long
@@ -270,6 +275,10 @@ const DWB_AMOUNT_BYTES: usize = 8; // Max 16 (u128)
270275
const DWB_HEAD_NODE_BYTES: usize = 5; // Max 8 (u64)
271276
const DWB_LIST_LEN_BYTES: usize = 2; // u16
272277

278+
const_assert!(DWB_AMOUNT_BYTES <= U128_BYTES);
279+
const_assert!(DWB_HEAD_NODE_BYTES <= U64_BYTES);
280+
const_assert!(DWB_LIST_LEN_BYTES <= U16_BYTES);
281+
273282
const DWB_ENTRY_BYTES: usize = DWB_RECIPIENT_BYTES + DWB_AMOUNT_BYTES + DWB_HEAD_NODE_BYTES + DWB_LIST_LEN_BYTES;
274283

275284
pub const ZERO_ADDR: [u8; DWB_RECIPIENT_BYTES] = [0u8; DWB_RECIPIENT_BYTES];
@@ -308,11 +317,11 @@ impl DelayedWriteBufferEntry {
308317
})
309318
}
310319

311-
fn recipient_slice(&self) -> &[u8] {
320+
pub fn recipient_slice(&self) -> &[u8] {
312321
&self.0[..DWB_RECIPIENT_BYTES]
313322
}
314323

315-
fn recipient(&self) -> StdResult<CanonicalAddr> {
324+
pub fn recipient(&self) -> StdResult<CanonicalAddr> {
316325
let result = CanonicalAddr::try_from(self.recipient_slice())
317326
.or(Err(StdError::generic_err("Get dwb recipient error")))?;
318327
Ok(result)
@@ -340,9 +349,6 @@ impl DelayedWriteBufferEntry {
340349
fn set_amount(&mut self, val: u64) -> StdResult<()> {
341350
let start = DWB_RECIPIENT_BYTES;
342351
let end = start + DWB_AMOUNT_BYTES;
343-
if DWB_AMOUNT_BYTES != U64_BYTES {
344-
return Err(StdError::generic_err("Set dwb amount error"));
345-
}
346352
self.0[start..end].copy_from_slice(&val.to_be_bytes());
347353
Ok(())
348354
}
@@ -352,9 +358,6 @@ impl DelayedWriteBufferEntry {
352358
let end = start + DWB_HEAD_NODE_BYTES;
353359
let head_node_slice = &self.0[start..end];
354360
let mut result = [0u8; U64_BYTES];
355-
if DWB_HEAD_NODE_BYTES > U64_BYTES {
356-
return Err(StdError::generic_err("Get dwb head node error"));
357-
}
358361
result[U64_BYTES - DWB_HEAD_NODE_BYTES..].copy_from_slice(head_node_slice);
359362
Ok(u64::from_be_bytes(result))
360363
}
@@ -383,9 +386,6 @@ impl DelayedWriteBufferEntry {
383386
fn set_list_len(&mut self, val: u16) -> StdResult<()> {
384387
let start = DWB_RECIPIENT_BYTES + DWB_AMOUNT_BYTES + DWB_HEAD_NODE_BYTES;
385388
let end = start + DWB_LIST_LEN_BYTES;
386-
if DWB_LIST_LEN_BYTES != U16_BYTES {
387-
return Err(StdError::generic_err("Set dwb amount error"));
388-
}
389389
self.0[start..end].copy_from_slice(&val.to_be_bytes());
390390
Ok(())
391391
}

src/lib.rs

+4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1+
#[macro_use]
2+
extern crate static_assertions as sa;
3+
14
mod batch;
25
pub mod contract;
36
pub mod msg;
47
pub mod receiver;
58
pub mod state;
69
mod transaction_history;
710
mod dwb;
11+
mod stored_balances;
812
mod strings;

0 commit comments

Comments
 (0)