Skip to content

Commit c433514

Browse files
authored
Merge branch 'dev' into issue-296-logic-and-control-flow
2 parents 47702b3 + 5d1a34f commit c433514

File tree

14 files changed

+107
-37
lines changed

14 files changed

+107
-37
lines changed

Cargo.lock

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

adapter/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,12 +225,12 @@ mod test {
225225
.expect("The timestamp should be able to be converted to u64");
226226
BigEndian::write_uint(&mut timestamp_buf[26..], n, 6);
227227

228-
let merkle_tree = MerkleTree::new(&[timestamp_buf]);
228+
let merkle_tree = MerkleTree::new(&[timestamp_buf]).expect("Should instantiate");
229229

230230
let channel_id = "061d5e2a67d0a9a10f1c732bca12a676d83f79663a396f7d87b3e30b9b411088";
231231

232232
let state_root = get_signable_state_root(
233-
&hex::decode(&channel_id).expect("fialed"),
233+
&hex::decode(&channel_id).expect("failed"),
234234
&merkle_tree.root(),
235235
)
236236
.expect("Should get state_root");

primitives/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ slog = { version = "^2.5.2" , features = ["max_level_trace"] }
2020
slog-term = "^2.4.2"
2121
slog-async = "^2.3.0"
2222
# Domain
23+
thiserror = "^1.0"
2324
chrono = { version = "0.4", features = ["serde"] }
2425
time = "0.1.42"
2526
hex = "0.3.2"

primitives/src/balances_map.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ impl BalancesMap {
4444
self.0.insert(key, value)
4545
}
4646

47+
pub fn len(&self) -> usize {
48+
self.0.len()
49+
}
50+
4751
pub fn is_empty(&self) -> bool {
4852
self.0.is_empty()
4953
}

primitives/src/merkle_tree.rs

Lines changed: 42 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
1-
use merkletree::hash::Algorithm;
2-
use merkletree::merkle;
3-
use merkletree::merkle::VecStore;
4-
use merkletree::proof::Proof;
1+
use merkletree::{hash::Algorithm, merkle, merkle::VecStore, proof::Proof};
2+
use std::fmt;
53
use std::hash::Hasher;
64
use std::iter::FromIterator;
5+
use thiserror::Error;
76
use tiny_keccak::Keccak;
87

98
#[derive(Clone)]
109
struct KeccakAlgorithm(Keccak);
1110

11+
impl fmt::Debug for KeccakAlgorithm {
12+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
13+
write!(f, "Keccak256 Algorithm")
14+
}
15+
}
16+
1217
impl KeccakAlgorithm {
1318
pub fn new() -> KeccakAlgorithm {
1419
KeccakAlgorithm(Keccak::new_keccak256())
@@ -72,39 +77,49 @@ impl Algorithm<MerkleItem> for KeccakAlgorithm {
7277
type ExternalMerkleTree =
7378
merkletree::merkle::MerkleTree<MerkleItem, KeccakAlgorithm, VecStore<MerkleItem>>;
7479

75-
#[derive(Clone)]
80+
#[derive(Debug, Clone)]
7681
enum Tree {
7782
SingleItem(MerkleItem),
7883
MerkleTree(ExternalMerkleTree),
7984
}
8085

86+
#[derive(Debug, Error, Eq, PartialEq)]
87+
pub enum Error {
88+
#[error("No leaves were provided")]
89+
ZeroLeaves,
90+
}
91+
92+
#[derive(Debug)]
8193
pub struct MerkleTree {
8294
tree: Tree,
8395
root: MerkleItem,
8496
}
8597

8698
impl MerkleTree {
87-
pub fn new(data: &[MerkleItem]) -> MerkleTree {
99+
pub fn new(data: &[MerkleItem]) -> Result<MerkleTree, Error> {
88100
let mut leaves: Vec<MerkleItem> = data.to_owned();
89-
90-
let tree: Tree = if leaves.len() == 1 {
91-
Tree::SingleItem(leaves[0].to_owned())
92-
} else {
93-
// sort the merkle tree leaves
94-
leaves.sort();
95-
// remove duplicates
96-
leaves.dedup_by(|a, b| a == b);
97-
98-
let merkletree = merkle::MerkleTree::from_iter(leaves);
99-
Tree::MerkleTree(merkletree)
101+
// sort the MerkleTree leaves
102+
leaves.sort();
103+
// remove duplicates **before** we check the leaves length
104+
leaves.dedup_by(|a, b| a == b);
105+
106+
let tree = match leaves.len() {
107+
0 => return Err(Error::ZeroLeaves),
108+
// should never `panic!`, we have a single leaf after all
109+
1 => Tree::SingleItem(leaves.remove(0)),
110+
_ => {
111+
let merkletree = merkle::MerkleTree::from_iter(leaves);
112+
113+
Tree::MerkleTree(merkletree)
114+
}
100115
};
101116

102117
let root: MerkleItem = match &tree {
103118
Tree::SingleItem(root) => root.to_owned(),
104119
Tree::MerkleTree(merkletree) => merkletree.root(),
105120
};
106121

107-
MerkleTree { tree, root }
122+
Ok(MerkleTree { tree, root })
108123
}
109124

110125
pub fn root(&self) -> MerkleItem {
@@ -134,6 +149,12 @@ mod test {
134149
use super::*;
135150
use hex::FromHex;
136151

152+
#[test]
153+
fn it_returns_error_on_zero_leaves() {
154+
let error = MerkleTree::new(&[]).expect_err("ZeroLeaves error expected");
155+
assert_eq!(Error::ZeroLeaves, error);
156+
}
157+
137158
#[test]
138159
fn it_generates_correct_merkle_tree_that_correlates_with_js_impl() {
139160
let h1 = <[u8; 32]>::from_hex(
@@ -145,7 +166,7 @@ mod test {
145166
)
146167
.unwrap();
147168

148-
let top = MerkleTree::new(&[h1, h2]);
169+
let top = MerkleTree::new(&[h1, h2]).expect("Should create MerkleTree");
149170

150171
let root = hex::encode(&top.root());
151172

@@ -172,7 +193,7 @@ mod test {
172193
.unwrap();
173194

174195
// duplicate leaves
175-
let top = MerkleTree::new(&[h1, h2, h2]);
196+
let top = MerkleTree::new(&[h1, h2, h2]).expect("Should create MerkleTree");
176197

177198
let root = hex::encode(&top.root());
178199

@@ -204,7 +225,7 @@ mod test {
204225
.unwrap();
205226

206227
// odd leaves
207-
let top = MerkleTree::new(&[h1, h2, h3]);
228+
let top = MerkleTree::new(&[h1, h2, h3]).expect("Should create MerkleTree");
208229

209230
let root = hex::encode(&top.root());
210231

sentry/src/db.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ pub async fn postgres_connection() -> Result<DbPool, bb8_postgres::tokio_postgre
4848
.user(POSTGRES_USER.as_str())
4949
.password(POSTGRES_PASSWORD.as_str())
5050
.host(POSTGRES_HOST.as_str())
51-
.port(POSTGRES_PORT.clone());
51+
.port(*POSTGRES_PORT);
5252
if let Some(db) = POSTGRES_DB.clone() {
5353
config.dbname(&db);
5454
}
@@ -64,7 +64,7 @@ pub async fn setup_migrations(environment: &str) {
6464
.database_user(POSTGRES_USER.as_str())
6565
.database_password(POSTGRES_PASSWORD.as_str())
6666
.database_host(POSTGRES_HOST.as_str())
67-
.database_port(POSTGRES_PORT.clone())
67+
.database_port(*POSTGRES_PORT)
6868
.database_name(&POSTGRES_DB.as_ref().unwrap_or(&POSTGRES_USER))
6969
.build()
7070
.expect("Should build migration settings");

sentry/src/event_aggregator.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ async fn store(db: &DbPool, channel_id: &ChannelId, logger: &Logger, recorder: R
5959
aggregate: new_aggr(&channel_id),
6060
};
6161
channel_recorder.insert(channel_id.to_owned(), record);
62-
};
62+
}
6363
}
6464
}
6565

sentry/src/event_reducer.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ use crate::Session;
33
use primitives::sentry::{AggregateEvents, Event, EventAggregate};
44
use primitives::{BigNum, Channel, ValidatorId};
55

6-
// @TODO: Remove attribute once we use this function!
7-
#[allow(dead_code)]
86
pub(crate) fn reduce(
97
channel: &Channel,
108
initial_aggr: &mut EventAggregate,

validator_worker/src/core/fees.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ pub fn get_balances_after_fees_tree(
3939
let adjusted_balance = value * &ratio;
4040

4141
total += &adjusted_balance;
42-
balances_after_fees.insert(key.clone(), adjusted_balance);
42+
balances_after_fees.insert(*key, adjusted_balance);
4343
}
4444

4545
let rounding_error = if deposit_amount == total_distributed {

validator_worker/src/follower.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,11 @@ pub async fn tick<A: Adapter + 'static>(
7878
};
7979

8080
let producer_tick = producer::tick(&iface).await?;
81+
let empty_balances = BalancesMap::default();
8182
let balances = match &producer_tick {
8283
producer::TickStatus::Sent { new_accounting, .. } => &new_accounting.balances,
8384
producer::TickStatus::NoNewEventAggr(balances) => balances,
85+
producer::TickStatus::EmptyBalances => &empty_balances,
8486
};
8587
let approve_state_result = if let (Some(new_state), false) = (new_msg, latest_is_responded_to) {
8688
on_new_state(&iface, &balances, &new_state).await?
@@ -89,7 +91,7 @@ pub async fn tick<A: Adapter + 'static>(
8991
};
9092

9193
Ok(TickStatus {
92-
heartbeat: heartbeat(&iface, balances).await?,
94+
heartbeat: heartbeat(&iface, &balances).await?,
9395
approve_state: approve_state_result,
9496
producer_tick,
9597
})

0 commit comments

Comments
 (0)