Skip to content

Commit 224455c

Browse files
committed
feat: improve uniformity & bump version
1 parent 43e37e0 commit 224455c

7 files changed

Lines changed: 60 additions & 27 deletions

File tree

Cargo.lock

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

Cargo.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ resolver = "2"
33
members = ["api", "program", "src", "vrf", "vrf-oracle", "vrf-cli", "sdk"]
44

55
[workspace.package]
6-
version = "0.1.0"
6+
version = "0.1.1"
77
edition = "2021"
88
license = "Business Source License 1.1"
99
authors = ["MagicBlock Labs <dev@magicblock.xyz>"]
@@ -14,9 +14,9 @@ readme = "./README.md"
1414
keywords = ["solana", "vrf", "ephemeral-rollups", "magicblock"]
1515

1616
[workspace.dependencies]
17-
ephemeral-vrf = { path = "./vrf", version = "0.1.0" }
18-
ephemeral-vrf-api = { path = "./api", version = "0.1.0" }
19-
ephemeral-vrf-sdk-vrf-macro = { path = "sdk/vrf-macro", version = "0.1.0" }
17+
ephemeral-vrf = { path = "./vrf", version = "0.1.1" }
18+
ephemeral-vrf-api = { path = "./api", version = "0.1.1" }
19+
ephemeral-vrf-sdk-vrf-macro = { path = "sdk/vrf-macro", version = "0.1.1" }
2020
ephemeral-rollups-sdk = "0.2.4"
2121
borsh = ">=0.10.1"
2222
bytemuck = "1.14"

program/tests/integration/use-randomness/Cargo.lock

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

program/tests/integration/use-randomness/programs/use-randomness/src/lib.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use anchor_lang::solana_program::hash::hash;
66
use anchor_lang::solana_program::sysvar::slot_hashes;
77
use ephemeral_vrf_sdk::anchor::{vrf, VrfProgram};
88
use ephemeral_vrf_sdk::instructions::create_request_randomness_ix;
9-
use ephemeral_vrf_sdk::rnd::random_u32;
9+
use ephemeral_vrf_sdk::rnd::{random_u32, random_u8_with_range, random_bool};
1010
use ephemeral_vrf_sdk::consts::IDENTITY;
1111
use ephemeral_vrf_sdk::instructions::RequestRandomnessParams;
1212
use anchor_lang::solana_program::program::invoke_signed;
@@ -75,7 +75,9 @@ pub mod use_randomness {
7575
ctx.accounts.vrf_program_identity.is_signer
7676
);
7777
// We can safely consume the randomness
78-
msg!("Consuming random number: {:?}", random_u32(&randomness));
78+
msg!("Consuming random u32: {:?}", random_u32(&randomness));
79+
msg!("Consuming random u8 (range 1-6): {:?}", random_u8_with_range(&randomness, 1, 6));
80+
msg!("Consuming random bool: {:?}", random_bool(&randomness));
7981
Ok(())
8082
}
8183
}

sdk/src/rnd.rs

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,38 @@
88
///
99
/// A random u8 value derived from the input bytes
1010
pub fn random_u8(bytes: &[u8; 32]) -> u8 {
11-
bytes[0]
11+
bytes[30]
12+
}
13+
14+
/// Generates a random u8 value within a specified range from a 32-byte random seed
15+
///
16+
/// # Arguments
17+
///
18+
/// * `bytes` - A 32-byte array containing random data from the VRF
19+
/// * `min_value` - The minimum value (inclusive) of the desired range
20+
/// * `max_value` - The maximum value (inclusive) of the desired range
21+
///
22+
/// # Returns
23+
///
24+
/// A random u8 value uniformly distributed in the range [min_value, max_value]
25+
///
26+
/// # Algorithm
27+
///
28+
/// To avoid modulo bias, the function scans through the input bytes looking for
29+
/// a value that falls within an evenly divisible range. If no such value is found,
30+
/// it falls back to a slightly biased approach using the last byte.
31+
pub fn random_u8_with_range(bytes: &[u8; 32], min_value: u8, max_value: u8) -> u8 {
32+
let range = (max_value - min_value + 1) as u16;
33+
let threshold = (256 / range * range) as u8;
34+
35+
// Try to find a byte that, when mapped, gives an unbiased result
36+
for &b in bytes.iter().rev() {
37+
if b < threshold {
38+
return min_value + (b % range as u8);
39+
}
40+
}
41+
// Fallback (slight bias, but rare fallback case)
42+
min_value + (bytes[31] % range as u8)
1243
}
1344

1445
/// Generates a random u32 value from a 32-byte random seed
@@ -21,7 +52,7 @@ pub fn random_u8(bytes: &[u8; 32]) -> u8 {
2152
///
2253
/// A random u32 value derived from the input bytes
2354
pub fn random_u32(bytes: &[u8; 32]) -> u32 {
24-
u32::from_le_bytes([bytes[0], bytes[3], bytes[7], bytes[12]])
55+
u32::from_le_bytes([bytes[28], bytes[29], bytes[30], bytes[31]])
2556
}
2657

2758
/// Generates a random i32 value from a 32-byte random seed
@@ -75,5 +106,5 @@ pub fn random_i64(bytes: &[u8; 32]) -> i64 {
75106
///
76107
/// A random boolean value (true or false) derived from the input bytes
77108
pub fn random_bool(bytes: &[u8; 32]) -> bool {
78-
(bytes[0] & 1) == 1
109+
(bytes[31] % 2) == 0
79110
}

src/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22
name = "ephemeral-vrf-oracle"
3-
version = "0.1.0"
4-
edition = "2021"
3+
version = {workspace = true}
4+
edition = {workspace = true}
55

66
[[bin]]
77
name = "ephemeral_vrf"

vrf-oracle/Cargo.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11

22
[package]
33
name = "vrf-oracle"
4-
version = "0.1.0"
5-
edition = "2021"
6-
description = "Oracle client for EphemeralVrf"
7-
authors = ["Magicblock Labs"]
4+
version = { workspace = true }
5+
edition = { workspace = true }
6+
description = "Ephemeral VRF Oracle"
7+
authors = { workspace = true }
88

99
[dependencies]
1010
clap.workspace = true

0 commit comments

Comments
 (0)