Skip to content

Commit 28ff807

Browse files
committed
Add user and provider random number
1 parent 2127a0f commit 28ff807

File tree

3 files changed

+41
-8
lines changed

3 files changed

+41
-8
lines changed

apps/fortuna/migrations/20250502164500_init.up.sql

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
1+
-- we use VARCHAR(40) for addresses and VARCHAR(64) for tx_hashes and 32 byte numbers
12
CREATE TABLE request(
2-
chain_id VARCHAR(255) NOT NULL,
3-
provider VARCHAR(255) NOT NULL,
3+
chain_id VARCHAR(20) NOT NULL,
4+
provider VARCHAR(40) NOT NULL,
45
sequence INTEGER NOT NULL,
56
created_at DATETIME NOT NULL,
67
last_updated_at DATETIME NOT NULL,
7-
state VARCHAR(255) NOT NULL,
8+
state VARCHAR(10) NOT NULL,
89
request_block_number INT NOT NULL,
9-
request_tx_hash VARCHAR(255) NOT NULL,
10-
sender VARCHAR(255) NOT NULL,
10+
request_tx_hash VARCHAR(64) NOT NULL,
11+
user_random_number VARCHAR(64) NOT NULL,
12+
sender VARCHAR(40) NOT NULL,
1113
reveal_block_number INT,
12-
reveal_tx_hash VARCHAR(255),
14+
reveal_tx_hash VARCHAR(64),
15+
provider_random_number VARCHAR(64),
1316
info TEXT,
1417
PRIMARY KEY (chain_id, sequence, provider, request_tx_hash)
1518
);

apps/fortuna/src/history.rs

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@ use {
44
chrono::{DateTime, NaiveDateTime},
55
ethers::{core::utils::hex::ToHex, prelude::TxHash, types::Address},
66
serde::Serialize,
7+
serde_with::serde_as,
78
sqlx::{migrate, Pool, Sqlite, SqlitePool},
89
std::sync::Arc,
910
tokio::{spawn, sync::mpsc},
1011
utoipa::ToSchema,
1112
};
1213

14+
#[serde_as]
1315
#[derive(Clone, Debug, Serialize, ToSchema, PartialEq)]
1416
#[serde(tag = "state", rename_all = "kebab-case")]
1517
pub enum RequestEntryState {
@@ -19,12 +21,17 @@ pub enum RequestEntryState {
1921
/// The transaction hash of the reveal transaction.
2022
#[schema(example = "0xfe5f880ac10c0aae43f910b5a17f98a93cdd2eb2dce3a5ae34e5827a3a071a32", value_type = String)]
2123
reveal_tx_hash: TxHash,
24+
/// The provider contribution to the random number.
25+
#[schema(example = "a905ab56567d31a7fda38ed819d97bc257f3ebe385fc5c72ce226d3bb855f0fe")]
26+
#[serde_as(as = "serde_with::hex::Hex")]
27+
provider_random_number: [u8; 32],
2228
},
2329
Failed {
2430
reason: String,
2531
},
2632
}
2733

34+
#[serde_as]
2835
#[derive(Clone, Debug, Serialize, ToSchema, PartialEq)]
2936
pub struct RequestStatus {
3037
/// The chain ID of the request.
@@ -41,6 +48,10 @@ pub struct RequestStatus {
4148
/// The transaction hash of the request transaction.
4249
#[schema(example = "0x5a3a984f41bb5443f5efa6070ed59ccb25edd8dbe6ce7f9294cf5caa64ed00ae", value_type = String)]
4350
pub request_tx_hash: TxHash,
51+
/// The user contribution to the random number.
52+
#[schema(example = "a905ab56567d31a7fda38ed819d97bc257f3ebe385fc5c72ce226d3bb855f0fe")]
53+
#[serde_as(as = "serde_with::hex::Hex")]
54+
pub user_random_number: [u8; 32],
4455
/// This is the address that initiated the request.
4556
#[schema(example = "0x78357316239040e19fc823372cc179ca75e64b81", value_type = String)]
4657
pub sender: Address,
@@ -57,9 +68,11 @@ struct RequestRow {
5768
state: String,
5869
request_block_number: i64,
5970
request_tx_hash: String,
71+
user_random_number: String,
6072
sender: String,
6173
reveal_block_number: Option<i64>,
6274
reveal_tx_hash: Option<String>,
75+
provider_random_number: Option<String>,
6376
info: Option<String>,
6477
}
6578

@@ -73,6 +86,7 @@ impl TryFrom<RequestRow> for RequestStatus {
7386
let created_at = row.created_at.and_utc();
7487
let last_updated_at = row.last_updated_at.and_utc();
7588
let request_block_number = row.request_block_number as u64;
89+
let user_random_number = hex::FromHex::from_hex(row.user_random_number)?;
7690
let request_tx_hash = row.request_tx_hash.parse()?;
7791
let sender = row.sender.parse()?;
7892

@@ -88,9 +102,15 @@ impl TryFrom<RequestRow> for RequestStatus {
88102
"Reveal transaction hash is missing for completed request"
89103
))?
90104
.parse()?;
105+
let provider_random_number = row.provider_random_number.ok_or(anyhow::anyhow!(
106+
"Provider random number is missing for completed request"
107+
))?;
108+
let provider_random_number: [u8; 32] =
109+
hex::FromHex::from_hex(provider_random_number)?;
91110
RequestEntryState::Completed {
92111
reveal_block_number,
93112
reveal_tx_hash,
113+
provider_random_number,
94114
}
95115
}
96116
"Failed" => RequestEntryState::Failed {
@@ -107,6 +127,7 @@ impl TryFrom<RequestRow> for RequestStatus {
107127
state,
108128
request_block_number,
109129
request_tx_hash,
130+
user_random_number,
110131
sender,
111132
})
112133
}
@@ -170,7 +191,8 @@ impl History {
170191
RequestEntryState::Pending => {
171192
let block_number = new_status.request_block_number as i64;
172193
let sender: String = new_status.sender.encode_hex();
173-
sqlx::query!("INSERT INTO request(chain_id, provider, sequence, created_at, last_updated_at, state, request_block_number, request_tx_hash, sender) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
194+
let user_random_number: String = new_status.user_random_number.encode_hex();
195+
sqlx::query!("INSERT INTO request(chain_id, provider, sequence, created_at, last_updated_at, state, request_block_number, request_tx_hash, user_random_number, sender) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
174196
chain_id,
175197
provider,
176198
sequence,
@@ -179,21 +201,25 @@ impl History {
179201
"Pending",
180202
block_number,
181203
request_tx_hash,
204+
user_random_number,
182205
sender)
183206
.execute(pool)
184207
.await
185208
}
186209
RequestEntryState::Completed {
187210
reveal_block_number,
188211
reveal_tx_hash,
212+
provider_random_number,
189213
} => {
190214
let reveal_block_number = reveal_block_number as i64;
191215
let reveal_tx_hash: String = reveal_tx_hash.encode_hex();
192-
sqlx::query!("UPDATE request SET state = ?, last_updated_at = ?, reveal_block_number = ?, reveal_tx_hash = ? WHERE chain_id = ? AND sequence = ? AND provider = ? AND request_tx_hash = ?",
216+
let provider_random_number: String = provider_random_number.encode_hex();
217+
sqlx::query!("UPDATE request SET state = ?, last_updated_at = ?, reveal_block_number = ?, reveal_tx_hash = ?, provider_random_number = ? WHERE chain_id = ? AND sequence = ? AND provider = ? AND request_tx_hash = ?",
193218
"Completed",
194219
new_status.last_updated_at,
195220
reveal_block_number,
196221
reveal_tx_hash,
222+
provider_random_number,
197223
chain_id,
198224
sequence,
199225
provider,
@@ -362,6 +388,7 @@ mod test {
362388
last_updated_at: chrono::Utc::now(),
363389
request_block_number: 1,
364390
request_tx_hash: TxHash::random(),
391+
user_random_number: [20; 32],
365392
sender: Address::random(),
366393
state: RequestEntryState::Pending,
367394
}
@@ -376,6 +403,7 @@ mod test {
376403
status.state = RequestEntryState::Completed {
377404
reveal_block_number: 1,
378405
reveal_tx_hash,
406+
provider_random_number: [40; 32],
379407
};
380408
History::update_request_status(&history.pool, status.clone()).await;
381409

apps/fortuna/src/keeper/process_event.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ pub async fn process_event_with_backoff(
4949
request_block_number: event.log_meta.block_number.as_u64(),
5050
request_tx_hash: event.log_meta.transaction_hash,
5151
sender: event.requestor,
52+
user_random_number: event.user_random_number,
5253
state: RequestEntryState::Pending,
5354
};
5455
history.add(&status);
@@ -89,6 +90,7 @@ pub async fn process_event_with_backoff(
8990
status.state = RequestEntryState::Completed {
9091
reveal_block_number: result.receipt.block_number.unwrap_or_default().as_u64(),
9192
reveal_tx_hash: result.receipt.transaction_hash,
93+
provider_random_number: provider_revelation,
9294
};
9395
history.add(&status);
9496
tracing::info!(

0 commit comments

Comments
 (0)