Skip to content

Commit 29a5c33

Browse files
committed
feat: refactor queries and add new functions in postalonso transaction output
- update `postalonsotransactionoutput` to include `genesis` in `queries_v16` - add `do_get_chain_point_state_query` and `do_get_current_era_state_query` functions - include `do_get_genesis_config_state_query` method to fetch the genesis config - refactor `chain_point` and `genesis_config` retrieval in `get_kes_period` - modify `setup_server` function to accept the number of `intersections` - update test functions to pass `intersections` parameter in `setup_server` - adjust `get_current_kes_period` test to include 3 intersections - add tests for `get_chain_point` and `get_genesis_config` functions with mock server
1 parent 07be147 commit 29a5c33

File tree

1 file changed

+95
-27
lines changed

1 file changed

+95
-27
lines changed

mithril-common/src/chain_observer/pallas_observer.rs

Lines changed: 95 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use pallas_network::{
88
miniprotocols::{
99
localstate::{
1010
queries_v16::{
11-
self, Addr, Addrs, PostAlonsoTransactionOutput, StakeSnapshot, Stakes,
11+
self, Addr, Addrs, Genesis, PostAlonsoTransactionOutput, StakeSnapshot, Stakes,
1212
TransactionOutput, UTxOByAddress,
1313
},
1414
Client,
@@ -271,6 +271,41 @@ impl PallasChainObserver {
271271
.with_context(|| "PallasChainObserver failed to convert kes period")?)
272272
}
273273

274+
/// Fetches the current chain point using the provided `statequery` client.
275+
async fn do_get_chain_point_state_query(&self, statequery: &mut Client) -> StdResult<Point> {
276+
let chain_point = queries_v16::get_chain_point(statequery)
277+
.await
278+
.map_err(|err| anyhow!(err))
279+
.with_context(|| "PallasChainObserver failed to get chain point")?;
280+
281+
println!("Chain point: {:?}", chain_point);
282+
283+
Ok(chain_point)
284+
}
285+
286+
async fn do_get_current_era_state_query(&self, statequery: &mut Client) -> StdResult<u16> {
287+
let era = queries_v16::get_current_era(statequery)
288+
.await
289+
.map_err(|err| anyhow!(err))
290+
.with_context(|| "PallasChainObserver failed to get current era")?;
291+
292+
Ok(era)
293+
}
294+
295+
/// Fetches the current genesis config using the provided `statequery` client.
296+
async fn do_get_genesis_config_state_query(
297+
&self,
298+
statequery: &mut Client,
299+
) -> StdResult<Vec<Genesis>> {
300+
let era = self.do_get_current_era_state_query(statequery).await?;
301+
let genesis_config = queries_v16::get_genesis_config(statequery, era)
302+
.await
303+
.map_err(|err| anyhow!(err))
304+
.with_context(|| "PallasChainObserver failed to get genesis config")?;
305+
306+
Ok(genesis_config)
307+
}
308+
274309
/// Fetches chain point and genesis config through the local statequery.
275310
/// The KES period is calculated afterwards.
276311
async fn get_kes_period(
@@ -285,20 +320,9 @@ impl PallasChainObserver {
285320
.map_err(|err| anyhow!(err))
286321
.with_context(|| "PallasChainObserver failed to acquire statequery")?;
287322

288-
let chain_point = queries_v16::get_chain_point(statequery)
289-
.await
290-
.map_err(|err| anyhow!(err))
291-
.with_context(|| "PallasChainObserver failed to get chain point")?;
292-
293-
let era = queries_v16::get_current_era(statequery)
294-
.await
295-
.map_err(|err| anyhow!(err))
296-
.with_context(|| "PallasChainObserver failed to get current era")?;
323+
let chain_point = self.do_get_chain_point_state_query(statequery).await?;
297324

298-
let genesis_config = queries_v16::get_genesis_config(statequery, era)
299-
.await
300-
.map_err(|err| anyhow!(err))
301-
.with_context(|| "PallasChainObserver failed to get genesis config")?;
325+
let genesis_config = self.do_get_genesis_config_state_query(statequery).await?;
302326

303327
let config = genesis_config
304328
.first()
@@ -580,7 +604,7 @@ mod tests {
580604
}
581605

582606
/// Sets up a mock server.
583-
async fn setup_server(socket_path: PathBuf) -> tokio::task::JoinHandle<()> {
607+
async fn setup_server(socket_path: PathBuf, intersections: u32) -> tokio::task::JoinHandle<()> {
584608
tokio::spawn({
585609
async move {
586610
if socket_path.exists() {
@@ -595,22 +619,18 @@ mod tests {
595619
server.statequery().recv_while_idle().await.unwrap();
596620
server.statequery().send_acquired().await.unwrap();
597621

598-
let result = mock_server(&mut server).await;
599-
server.statequery().send_result(result).await.unwrap();
600-
601-
let result = mock_server(&mut server).await;
602-
server.statequery().send_result(result).await.unwrap();
603-
604-
let result = mock_server(&mut server).await;
605-
server.statequery().send_result(result).await.unwrap();
622+
for _ in 0..intersections {
623+
let result = mock_server(&mut server).await;
624+
server.statequery().send_result(result).await.unwrap();
625+
}
606626
}
607627
})
608628
}
609629

610630
#[tokio::test]
611631
async fn get_current_epoch() {
612632
let socket_path = create_temp_dir("get_current_epoch").join("node.socket");
613-
let server = setup_server(socket_path.clone()).await;
633+
let server = setup_server(socket_path.clone(), 2).await;
614634
let client = tokio::spawn(async move {
615635
let observer =
616636
PallasChainObserver::new(socket_path.as_path(), CardanoNetwork::TestNet(10));
@@ -625,7 +645,7 @@ mod tests {
625645
#[tokio::test]
626646
async fn get_current_datums() {
627647
let socket_path = create_temp_dir("get_current_datums").join("node.socket");
628-
let server = setup_server(socket_path.clone()).await;
648+
let server = setup_server(socket_path.clone(), 2).await;
629649
let client = tokio::spawn(async move {
630650
let observer =
631651
PallasChainObserver::new(socket_path.as_path(), CardanoNetwork::TestNet(10));
@@ -642,7 +662,7 @@ mod tests {
642662
#[tokio::test]
643663
async fn get_current_stake_distribution() {
644664
let socket_path = create_temp_dir("get_current_stake_distribution").join("node.socket");
645-
let server = setup_server(socket_path.clone()).await;
665+
let server = setup_server(socket_path.clone(), 2).await;
646666
let client = tokio::spawn(async move {
647667
let observer =
648668
super::PallasChainObserver::new(socket_path.as_path(), CardanoNetwork::TestNet(10));
@@ -672,7 +692,7 @@ mod tests {
672692
#[tokio::test]
673693
async fn get_current_kes_period() {
674694
let socket_path = create_temp_dir("get_current_kes_period").join("node.socket");
675-
let server = setup_server(socket_path.clone()).await;
695+
let server = setup_server(socket_path.clone(), 3).await;
676696
let client = tokio::spawn(async move {
677697
let observer =
678698
PallasChainObserver::new(socket_path.as_path(), CardanoNetwork::TestNet(10));
@@ -718,4 +738,52 @@ mod tests {
718738

719739
assert_eq!(413, current_kes_period);
720740
}
741+
742+
#[tokio::test]
743+
async fn get_chain_point() {
744+
let socket_path = create_temp_dir("get_chain_point").join("node.socket");
745+
let server = setup_server(socket_path.clone(), 1).await;
746+
let client = tokio::spawn(async move {
747+
let observer =
748+
PallasChainObserver::new(socket_path.as_path(), CardanoNetwork::TestNet(10));
749+
let mut client = observer.get_client().await.unwrap();
750+
let statequery = client.statequery();
751+
statequery.acquire(None).await.unwrap();
752+
let chain_point = observer
753+
.do_get_chain_point_state_query(statequery)
754+
.await
755+
.unwrap();
756+
observer.post_process_statequery(&mut client).await.unwrap();
757+
client.abort().await;
758+
chain_point
759+
});
760+
761+
let (_, client_res) = tokio::join!(server, client);
762+
let chain_point = client_res.expect("Client failed");
763+
assert_eq!(chain_point, Point::Specific(52851885, vec![1, 2, 3]));
764+
}
765+
766+
#[tokio::test]
767+
async fn get_genesis_config() {
768+
let socket_path = create_temp_dir("get_genesis_config").join("node.socket");
769+
let server = setup_server(socket_path.clone(), 2).await;
770+
let client = tokio::spawn(async move {
771+
let observer =
772+
PallasChainObserver::new(socket_path.as_path(), CardanoNetwork::TestNet(10));
773+
let mut client = observer.get_client().await.unwrap();
774+
let statequery = client.statequery();
775+
statequery.acquire(None).await.unwrap();
776+
let genesis_config = observer
777+
.do_get_genesis_config_state_query(statequery)
778+
.await
779+
.unwrap();
780+
observer.post_process_statequery(&mut client).await.unwrap();
781+
client.abort().await;
782+
genesis_config
783+
});
784+
785+
let (_, client_res) = tokio::join!(server, client);
786+
let genesis_config = client_res.expect("Client failed");
787+
assert_eq!(genesis_config, get_fake_genesis_config());
788+
}
721789
}

0 commit comments

Comments
 (0)