Browse Source

Merge pull request #184 from comit-network/fix-olivia-actor

Some fixes around the oracle actor
upload-correct-windows-binary
Thomas Eizinger 3 years ago
committed by GitHub
parent
commit
79c7570498
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 19
      Cargo.lock
  2. 2
      daemon/Cargo.toml
  3. 59
      daemon/src/oracle.rs

19
Cargo.lock

@ -1003,6 +1003,21 @@ dependencies = [
"want", "want",
] ]
[[package]]
name = "hyper-rustls"
version = "0.22.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f9f7a97316d44c0af9b0301e65010573a853a9fc97046d7331d7f6bc0fd5a64"
dependencies = [
"futures-util",
"hyper",
"log",
"rustls 0.19.1",
"tokio",
"tokio-rustls",
"webpki",
]
[[package]] [[package]]
name = "ident_case" name = "ident_case"
version = "1.0.1" version = "1.0.1"
@ -1775,6 +1790,7 @@ dependencies = [
"http", "http",
"http-body", "http-body",
"hyper", "hyper",
"hyper-rustls",
"ipnet", "ipnet",
"js-sys", "js-sys",
"lazy_static", "lazy_static",
@ -1782,14 +1798,17 @@ dependencies = [
"mime", "mime",
"percent-encoding", "percent-encoding",
"pin-project-lite", "pin-project-lite",
"rustls 0.19.1",
"serde", "serde",
"serde_json", "serde_json",
"serde_urlencoded", "serde_urlencoded",
"tokio", "tokio",
"tokio-rustls",
"url", "url",
"wasm-bindgen", "wasm-bindgen",
"wasm-bindgen-futures", "wasm-bindgen-futures",
"web-sys", "web-sys",
"webpki-roots 0.21.1",
"winreg", "winreg",
] ]

2
daemon/Cargo.toml

@ -15,7 +15,7 @@ futures = { version = "0.3", default-features = false }
hex = "0.4" hex = "0.4"
hkdf = "0.11" hkdf = "0.11"
rand = "0.6" rand = "0.6"
reqwest = { version = "0.11", default-features = false, features = ["json"] } reqwest = { version = "0.11", default-features = false, features = ["json", "rustls-tls-webpki-roots"] }
rocket = { version = "0.5.0-rc.1", features = ["json"] } rocket = { version = "0.5.0-rc.1", features = ["json"] }
rocket-basicauth = { version = "2", default-features = false } rocket-basicauth = { version = "2", default-features = false }
rocket_db_pools = { git = "https://github.com/SergioBenitez/Rocket", features = ["sqlx_sqlite"] } rocket_db_pools = { git = "https://github.com/SergioBenitez/Rocket", features = ["sqlx_sqlite"] }

59
daemon/src/oracle.rs

@ -1,17 +1,20 @@
use crate::actors::log_error; use crate::actors::log_error;
use anyhow::Result; use anyhow::{Context, Result};
use async_trait::async_trait; use async_trait::async_trait;
use cfd_protocol::secp256k1_zkp::{schnorrsig, SecretKey}; use cfd_protocol::secp256k1_zkp::{schnorrsig, SecretKey};
use futures::stream::FuturesOrdered; use futures::stream::FuturesOrdered;
use futures::TryStreamExt; use futures::TryStreamExt;
use rocket::time::{format_description, Duration, OffsetDateTime, Time}; use rocket::time::format_description::FormatItem;
use rocket::time::macros::format_description;
use rocket::time::{Duration, OffsetDateTime, Time};
use std::collections::HashSet; use std::collections::HashSet;
use std::convert::TryFrom; use std::convert::TryFrom;
/// Where `olivia` is located. /// Where `olivia` is located.
const OLIVIA_URL: &str = "https://h00.ooo/"; const OLIVIA_URL: &str = "https://h00.ooo/";
const OLIVIA_EVENT_TIME_FORMAT: &str = "[year]-[month]-[day]T[hour]:[minute]:[second]"; const OLIVIA_EVENT_TIME_FORMAT: &[FormatItem] =
format_description!("[year]-[month]-[day]T[hour]:[minute]:[second]");
pub struct Actor<CFD, M> pub struct Actor<CFD, M>
where where
@ -42,8 +45,12 @@ where
} }
async fn update_state(&mut self) -> Result<()> { async fn update_state(&mut self) -> Result<()> {
self.update_latest_announcements().await?; self.update_latest_announcements()
self.update_pending_attestations().await?; .await
.context("failed to update announcements")?;
self.update_pending_attestations()
.await
.context("failed to update pending attestations")?;
Ok(()) Ok(())
} }
@ -51,11 +58,19 @@ where
async fn update_latest_announcements(&mut self) -> Result<()> { async fn update_latest_announcements(&mut self) -> Result<()> {
let new_announcements = next_urls() let new_announcements = next_urls()
.into_iter() .into_iter()
.map(|event_url| async { .map(|event_url| async move {
let announcement = reqwest::get(event_url) let response = reqwest::get(event_url.clone())
.await? .await
.with_context(|| format!("Failed to GET {}", event_url))?;
if !response.status().is_success() {
anyhow::bail!("GET {} responded with {}", event_url, response.status());
}
let announcement = response
.json::<Announcement>() .json::<Announcement>()
.await?; .await
.context("Failed to deserialize as Announcement")?;
Result::<_, anyhow::Error>::Ok(announcement) Result::<_, anyhow::Error>::Ok(announcement)
}) })
.collect::<FuturesOrdered<_>>() .collect::<FuturesOrdered<_>>()
@ -173,12 +188,11 @@ fn next_24_hours(datetime: OffsetDateTime) -> Vec<OffsetDateTime> {
/// Construct the URL of `olivia`'s `BitMEX/BXBT` event to be attested /// Construct the URL of `olivia`'s `BitMEX/BXBT` event to be attested
/// for at the time indicated by the argument `datetime`. /// for at the time indicated by the argument `datetime`.
fn event_url(datetime: OffsetDateTime) -> String { fn event_url(datetime: OffsetDateTime) -> String {
let formatter = format_description::parse(OLIVIA_EVENT_TIME_FORMAT).expect("valid formatter"); let datetime = datetime
datetime .format(&OLIVIA_EVENT_TIME_FORMAT)
.format(&formatter)
.expect("valid formatter for datetime"); .expect("valid formatter for datetime");
format!("{}/BitMEX/BXBT/{}/price", OLIVIA_URL, datetime) format!("{}x/BitMEX/BXBT/{}.price", OLIVIA_URL, datetime)
} }
#[derive(Debug, Clone, serde::Deserialize, PartialEq)] #[derive(Debug, Clone, serde::Deserialize, PartialEq)]
@ -250,16 +264,15 @@ mod olivia_api {
use crate::oracle::OLIVIA_EVENT_TIME_FORMAT; use crate::oracle::OLIVIA_EVENT_TIME_FORMAT;
use serde::de::Error as _; use serde::de::Error as _;
use serde::{Deserialize, Deserializer}; use serde::{Deserialize, Deserializer};
use time::{format_description, OffsetDateTime, PrimitiveDateTime}; use time::{OffsetDateTime, PrimitiveDateTime};
pub fn deserialize<'a, D>(deserializer: D) -> Result<OffsetDateTime, D::Error> pub fn deserialize<'a, D>(deserializer: D) -> Result<OffsetDateTime, D::Error>
where where
D: Deserializer<'a>, D: Deserializer<'a>,
{ {
let string = String::deserialize(deserializer)?; let string = String::deserialize(deserializer)?;
let format = format_description::parse(OLIVIA_EVENT_TIME_FORMAT).expect("valid format"); let date_time = PrimitiveDateTime::parse(&string, &OLIVIA_EVENT_TIME_FORMAT)
.map_err(D::Error::custom)?;
let date_time = PrimitiveDateTime::parse(&string, &format).map_err(D::Error::custom)?;
Ok(date_time.assume_utc()) Ok(date_time.assume_utc())
} }
@ -315,18 +328,16 @@ mod olivia_api {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
use time::format_description;
use time::macros::datetime; use time::macros::datetime;
#[test] #[test]
fn next_event_url_is_correct() { fn next_event_url_is_correct() {
let datetime = datetime!(2021-09-23 10:43:00); let url = event_url(datetime!(2021-09-23 10:00:00).assume_utc());
let format = format_description::parse(OLIVIA_EVENT_TIME_FORMAT).unwrap();
let date_time_formatted = datetime.format(&format).unwrap();
let expected = "2021-09-23T10:43:00";
assert_eq!(date_time_formatted, expected); assert_eq!(
url,
"https://h00.ooo/x/BitMEX/BXBT/2021-09-23T10:00:00.price"
);
} }
#[test] #[test]

Loading…
Cancel
Save