Skip to content

Commit 0d10ecd

Browse files
test(drive): add comprehensive tests for verify module (#3233)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 1189314 commit 0d10ecd

112 files changed

Lines changed: 7259 additions & 1 deletion

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎packages/rs-drive/src/verify/address_funds/verify_address_funds_branch_query/mod.rs‎

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,32 @@ impl Drive {
5959
}
6060
}
6161
}
62+
63+
#[cfg(test)]
64+
mod tests {
65+
use super::*;
66+
use platform_version::version::PlatformVersion;
67+
68+
#[test]
69+
fn test_verify_address_funds_branch_query_unknown_version_mismatch() {
70+
let mut platform_version = PlatformVersion::latest().clone();
71+
platform_version
72+
.drive
73+
.methods
74+
.verify
75+
.address_funds
76+
.verify_address_funds_branch_query = 255;
77+
78+
let result =
79+
Drive::verify_address_funds_branch_query(&[], vec![], 0, [0u8; 32], &platform_version);
80+
81+
assert!(
82+
matches!(
83+
result,
84+
Err(Error::Drive(DriveError::UnknownVersionMismatch { .. }))
85+
),
86+
"expected UnknownVersionMismatch, got {:?}",
87+
result,
88+
);
89+
}
90+
}

‎packages/rs-drive/src/verify/address_funds/verify_address_funds_trunk_query/mod.rs‎

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,31 @@ impl Drive {
4848
}
4949
}
5050
}
51+
52+
#[cfg(test)]
53+
mod tests {
54+
use super::*;
55+
use platform_version::version::PlatformVersion;
56+
57+
#[test]
58+
fn test_verify_address_funds_trunk_query_unknown_version_mismatch() {
59+
let mut platform_version = PlatformVersion::latest().clone();
60+
platform_version
61+
.drive
62+
.methods
63+
.verify
64+
.address_funds
65+
.verify_address_funds_trunk_query = 255;
66+
67+
let result = Drive::verify_address_funds_trunk_query(&[], &platform_version);
68+
69+
assert!(
70+
matches!(
71+
result,
72+
Err(Error::Drive(DriveError::UnknownVersionMismatch { .. }))
73+
),
74+
"expected UnknownVersionMismatch, got {:?}",
75+
result,
76+
);
77+
}
78+
}

‎packages/rs-drive/src/verify/address_funds/verify_address_info/mod.rs‎

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,34 @@ impl Drive {
6060
}
6161
}
6262
}
63+
64+
#[cfg(test)]
65+
mod tests {
66+
use super::*;
67+
use dpp::address_funds::PlatformAddress;
68+
use dpp::version::PlatformVersion;
69+
70+
#[test]
71+
fn test_verify_address_info_unknown_version_mismatch() {
72+
let mut platform_version = PlatformVersion::latest().clone();
73+
platform_version
74+
.drive
75+
.methods
76+
.verify
77+
.address_funds
78+
.verify_address_info = 255;
79+
80+
let address = PlatformAddress::P2pkh([0u8; 20]);
81+
82+
let result = Drive::verify_address_info(&[], &address, false, &platform_version);
83+
84+
assert!(
85+
matches!(
86+
result,
87+
Err(Error::Drive(DriveError::UnknownVersionMismatch { .. }))
88+
),
89+
"expected UnknownVersionMismatch, got {:?}",
90+
result,
91+
);
92+
}
93+
}

‎packages/rs-drive/src/verify/address_funds/verify_address_info/v0/mod.rs‎

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,83 @@ impl Drive {
6666
Ok((root_hash, balance_info))
6767
}
6868
}
69+
70+
#[cfg(test)]
71+
mod tests {
72+
use super::*;
73+
use crate::util::batch::drive_op_batch::{AddressFundsOperationType, DriveOperation};
74+
use crate::util::test_helpers::setup::setup_drive_with_initial_state_structure;
75+
use dpp::block::block_info::BlockInfo;
76+
use dpp::fee::Credits;
77+
use dpp::prelude::AddressNonce;
78+
79+
const ADDRESS_1: PlatformAddress = PlatformAddress::P2pkh([10; 20]);
80+
const ADDRESS_1_NONCE: AddressNonce = 5;
81+
const ADDRESS_1_BALANCE: Credits = 1_000_000;
82+
const UNKNOWN_ADDRESS: PlatformAddress = PlatformAddress::P2pkh([200; 20]);
83+
84+
fn setup_address(drive: &Drive, platform_version: &PlatformVersion) {
85+
let operations = vec![DriveOperation::AddressFundsOperation(
86+
AddressFundsOperationType::SetBalanceToAddress {
87+
address: ADDRESS_1,
88+
nonce: ADDRESS_1_NONCE,
89+
balance: ADDRESS_1_BALANCE,
90+
},
91+
)];
92+
93+
drive
94+
.apply_drive_operations(
95+
operations,
96+
true,
97+
&BlockInfo::default(),
98+
None,
99+
platform_version,
100+
None,
101+
)
102+
.expect("expected to apply operations");
103+
}
104+
105+
#[test]
106+
fn should_prove_and_verify_single_address_info() {
107+
let drive = setup_drive_with_initial_state_structure(None);
108+
let platform_version = PlatformVersion::latest();
109+
110+
setup_address(&drive, platform_version);
111+
112+
// Prove single address
113+
let proof = drive
114+
.prove_balance_and_nonce(&ADDRESS_1, None, platform_version)
115+
.expect("should prove address");
116+
117+
// Verify the proof
118+
let (root_hash, result) =
119+
Drive::verify_address_info(proof.as_slice(), &ADDRESS_1, false, platform_version)
120+
.expect("should verify proof");
121+
122+
assert!(!root_hash.is_empty(), "root hash should not be empty");
123+
let (nonce, balance) = result.expect("should have value");
124+
assert_eq!(nonce, ADDRESS_1_NONCE);
125+
assert_eq!(balance, ADDRESS_1_BALANCE);
126+
}
127+
128+
#[test]
129+
fn should_prove_and_verify_absent_address_info() {
130+
let drive = setup_drive_with_initial_state_structure(None);
131+
let platform_version = PlatformVersion::latest();
132+
133+
setup_address(&drive, platform_version);
134+
135+
// Prove unknown address
136+
let proof = drive
137+
.prove_balance_and_nonce(&UNKNOWN_ADDRESS, None, platform_version)
138+
.expect("should prove unknown address");
139+
140+
// Verify the proof
141+
let (root_hash, result) =
142+
Drive::verify_address_info(proof.as_slice(), &UNKNOWN_ADDRESS, false, platform_version)
143+
.expect("should verify proof");
144+
145+
assert!(!root_hash.is_empty(), "root hash should not be empty");
146+
assert!(result.is_none(), "unknown address should be absent");
147+
}
148+
}

‎packages/rs-drive/src/verify/address_funds/verify_addresses_infos/mod.rs‎

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,37 @@ impl Drive {
6767
}
6868
}
6969
}
70+
71+
#[cfg(test)]
72+
mod tests {
73+
use super::*;
74+
use dpp::address_funds::PlatformAddress;
75+
use dpp::version::PlatformVersion;
76+
77+
#[test]
78+
fn test_verify_addresses_infos_unknown_version_mismatch() {
79+
let mut platform_version = PlatformVersion::latest().clone();
80+
platform_version
81+
.drive
82+
.methods
83+
.verify
84+
.address_funds
85+
.verify_addresses_infos = 255;
86+
87+
let addresses: Vec<PlatformAddress> = vec![];
88+
89+
let result = Drive::verify_addresses_infos::<
90+
std::slice::Iter<PlatformAddress>,
91+
Vec<(PlatformAddress, Option<(AddressNonce, Credits)>)>,
92+
>(&[], addresses.iter(), false, &platform_version);
93+
94+
assert!(
95+
matches!(
96+
result,
97+
Err(Error::Drive(DriveError::UnknownVersionMismatch { .. }))
98+
),
99+
"expected UnknownVersionMismatch, got {:?}",
100+
result,
101+
);
102+
}
103+
}

‎packages/rs-drive/src/verify/address_funds/verify_compacted_address_balance_changes/mod.rs‎

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,32 @@ impl Drive {
6161
}
6262
}
6363
}
64+
65+
#[cfg(test)]
66+
mod tests {
67+
use super::*;
68+
use dpp::version::PlatformVersion;
69+
70+
#[test]
71+
fn test_verify_compacted_address_balance_changes_unknown_version_mismatch() {
72+
let mut platform_version = PlatformVersion::latest().clone();
73+
platform_version
74+
.drive
75+
.methods
76+
.verify
77+
.address_funds
78+
.verify_compacted_address_balance_changes = 255;
79+
80+
let result =
81+
Drive::verify_compacted_address_balance_changes(&[], 0, None, &platform_version);
82+
83+
assert!(
84+
matches!(
85+
result,
86+
Err(Error::Drive(DriveError::UnknownVersionMismatch { .. }))
87+
),
88+
"expected UnknownVersionMismatch, got {:?}",
89+
result,
90+
);
91+
}
92+
}

‎packages/rs-drive/src/verify/address_funds/verify_compacted_address_balance_changes/v0/mod.rs‎

Lines changed: 96 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,102 @@ impl Drive {
201201
#[cfg(test)]
202202
mod tests {
203203
use super::*;
204+
use crate::util::test_helpers::setup::setup_drive_with_initial_state_structure;
205+
use dpp::address_funds::PlatformAddress;
206+
use dpp::balances::credits::CreditOperation;
204207
use platform_version::version::PlatformVersion;
208+
use std::collections::BTreeMap;
209+
210+
#[test]
211+
fn should_prove_and_verify_compacted_address_balance_changes_roundtrip() {
212+
let drive = setup_drive_with_initial_state_structure(None);
213+
let platform_version = PlatformVersion::latest();
214+
215+
let address_1 = PlatformAddress::P2pkh([10; 20]);
216+
let address_2 = PlatformAddress::P2sh([11; 20]);
217+
218+
// Store enough blocks of changes to trigger compaction
219+
// The compaction threshold is controlled by platform_version
220+
// We insert many blocks to ensure compaction happens
221+
let max_blocks = platform_version
222+
.drive
223+
.methods
224+
.saved_block_transactions
225+
.max_blocks_before_compaction as u64;
226+
227+
for block_height in 1u64..=(max_blocks + 1) {
228+
let mut changes = BTreeMap::new();
229+
changes.insert(
230+
address_1,
231+
CreditOperation::AddToCredits(block_height * 1000),
232+
);
233+
if block_height % 2 == 0 {
234+
changes.insert(address_2, CreditOperation::AddToCredits(block_height * 500));
235+
}
236+
drive
237+
.store_address_balances_for_block(
238+
&changes,
239+
block_height,
240+
block_height * 1000,
241+
None,
242+
platform_version,
243+
)
244+
.expect("should store balances");
245+
}
246+
247+
// Prove compacted changes from block 1
248+
let proof = drive
249+
.prove_compacted_address_balance_changes(1, None, None, platform_version)
250+
.expect("should prove compacted address balance changes");
251+
252+
// Verify the proof
253+
let (root_hash, compacted_changes) = Drive::verify_compacted_address_balance_changes(
254+
proof.as_slice(),
255+
1,
256+
None,
257+
platform_version,
258+
)
259+
.expect("should verify proof");
260+
261+
assert!(!root_hash.is_empty(), "root hash should not be empty");
262+
// We should have at least one compacted entry
263+
assert!(
264+
!compacted_changes.is_empty(),
265+
"should have at least one compacted entry"
266+
);
267+
268+
// All entries should have valid block ranges
269+
for (start, end, changes) in &compacted_changes {
270+
assert!(*start <= *end, "start should be <= end");
271+
assert!(!changes.is_empty(), "each entry should have changes");
272+
}
273+
}
274+
275+
#[test]
276+
fn should_prove_and_verify_empty_compacted_address_balance_changes() {
277+
let drive = setup_drive_with_initial_state_structure(None);
278+
let platform_version = PlatformVersion::latest();
279+
280+
// Prove compacted changes from block 100 with no data stored
281+
let proof = drive
282+
.prove_compacted_address_balance_changes(100, None, None, platform_version)
283+
.expect("should prove empty compacted changes");
284+
285+
// Verify the proof
286+
let (root_hash, compacted_changes) = Drive::verify_compacted_address_balance_changes(
287+
proof.as_slice(),
288+
100,
289+
None,
290+
platform_version,
291+
)
292+
.expect("should verify proof");
293+
294+
assert!(!root_hash.is_empty(), "root hash should not be empty");
295+
assert!(
296+
compacted_changes.is_empty(),
297+
"should have no compacted entries when no data stored"
298+
);
299+
}
205300

206301
#[test]
207302
fn test_verify_compacted_address_balance_changes_proof() {
@@ -247,7 +342,7 @@ mod tests {
247342
let start_block_height = 329u64;
248343
let platform_version = PlatformVersion::latest();
249344

250-
let result = Drive::verify_compacted_address_balance_changes_v0(
345+
let result = Drive::verify_compacted_address_balance_changes(
251346
&proof,
252347
start_block_height,
253348
None,

‎packages/rs-drive/src/verify/address_funds/verify_recent_address_balance_changes/mod.rs‎

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,32 @@ impl Drive {
5959
}
6060
}
6161
}
62+
63+
#[cfg(test)]
64+
mod tests {
65+
use super::*;
66+
use dpp::version::PlatformVersion;
67+
68+
#[test]
69+
fn test_verify_recent_address_balance_changes_unknown_version_mismatch() {
70+
let mut platform_version = PlatformVersion::latest().clone();
71+
platform_version
72+
.drive
73+
.methods
74+
.verify
75+
.address_funds
76+
.verify_recent_address_balance_changes = 255;
77+
78+
let result =
79+
Drive::verify_recent_address_balance_changes(&[], 0, None, false, &platform_version);
80+
81+
assert!(
82+
matches!(
83+
result,
84+
Err(Error::Drive(DriveError::UnknownVersionMismatch { .. }))
85+
),
86+
"expected UnknownVersionMismatch, got {:?}",
87+
result,
88+
);
89+
}
90+
}

0 commit comments

Comments
 (0)