Browse Source

Merge pull request #192 from comit-network/fix-olivia-integration

upload-correct-windows-binary
Thomas Eizinger 3 years ago
committed by GitHub
parent
commit
9d9c72bd89
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 254
      daemon/src/oracle.rs

254
daemon/src/oracle.rs

@ -192,11 +192,11 @@ fn event_url(datetime: OffsetDateTime) -> String {
.format(&OLIVIA_EVENT_TIME_FORMAT)
.expect("valid formatter for datetime");
format!("{}x/BitMEX/BXBT/{}.price", OLIVIA_URL, datetime)
format!("{}x/BitMEX/BXBT/{}.price[n:20]", OLIVIA_URL, datetime)
}
#[derive(Debug, Clone, serde::Deserialize, PartialEq)]
#[serde(from = "olivia_api::Announcement")]
#[serde(try_from = "olivia_api::Response")]
pub struct Announcement {
/// Identifier for an oracle event.
///
@ -211,7 +211,8 @@ pub struct Announcements(pub [Announcement; 24]);
// TODO: Implement real deserialization once price attestation is
// implemented in `olivia`
#[derive(Debug, Clone, serde::Deserialize)]
#[derive(Debug, Clone, serde::Deserialize, PartialEq)]
#[serde(try_from = "olivia_api::Response")]
pub struct Attestation {
pub id: String,
pub price: u64,
@ -227,28 +228,80 @@ impl xtra::Message for Attestation {
}
mod olivia_api {
use cfd_protocol::secp256k1_zkp::schnorrsig;
use anyhow::Context;
use cfd_protocol::secp256k1_zkp::{schnorrsig, SecretKey};
use std::convert::TryFrom;
use time::OffsetDateTime;
impl From<Announcement> for super::Announcement {
fn from(announcement: Announcement) -> Self {
Self {
id: announcement.id,
expected_outcome_time: announcement.expected_outcome_time,
nonce_pks: announcement.schemes.olivia_v1.nonces,
}
#[derive(Debug, Clone, serde::Deserialize)]
pub struct Response {
announcement: Announcement,
attestation: Option<Attestation>,
}
impl TryFrom<Response> for super::Announcement {
type Error = serde_json::Error;
fn try_from(response: Response) -> Result<Self, Self::Error> {
// TODO: Verify signature here
let data =
serde_json::from_str::<AnnouncementData>(&response.announcement.oracle_event.data)?;
Ok(Self {
id: data.id,
expected_outcome_time: data.expected_outcome_time,
nonce_pks: data.schemes.olivia_v1.nonces,
})
}
}
impl TryFrom<Response> for super::Attestation {
type Error = anyhow::Error;
fn try_from(response: Response) -> Result<Self, Self::Error> {
// TODO: Verify signature here
let data =
serde_json::from_str::<AnnouncementData>(&response.announcement.oracle_event.data)?;
let attestation = response.attestation.context("Missing attestation")?;
Ok(Self {
id: data.id,
price: attestation.outcome.parse()?,
scalars: attestation.schemes.olivia_v1.scalars,
})
}
}
#[derive(Debug, Clone, serde::Deserialize)]
pub(crate) struct Announcement {
pub struct Announcement {
oracle_event: OracleEvent,
signature: String,
}
#[derive(Debug, Clone, serde::Deserialize)]
struct OracleEvent {
data: String,
}
#[derive(Debug, Clone, serde::Deserialize)]
#[serde(rename_all = "kebab-case")]
struct AnnouncementData {
id: String,
#[serde(rename = "expected-outcome-time")]
#[serde(with = "timestamp")]
expected_outcome_time: OffsetDateTime,
schemes: Schemes,
}
#[derive(Debug, Clone, serde::Deserialize)]
pub struct Attestation {
outcome: String,
schemes: Schemes,
#[serde(with = "timestamp")]
time: OffsetDateTime,
}
#[derive(Debug, Clone, serde::Deserialize)]
struct Schemes {
#[serde(rename = "olivia-v1")]
@ -257,6 +310,9 @@ mod olivia_api {
#[derive(Debug, Clone, serde::Deserialize)]
struct OliviaV1 {
#[serde(default)]
scalars: Vec<SecretKey>,
#[serde(default)]
nonces: Vec<schnorrsig::PublicKey>,
}
@ -280,44 +336,156 @@ mod olivia_api {
#[cfg(test)]
mod tests {
use std::str::FromStr;
use std::vec;
use crate::oracle;
use cfd_protocol::secp256k1_zkp::schnorrsig;
use time::macros::datetime;
#[test]
fn deserialize_announcement() {
let json = r#"
{
"id": "/BitMEX/BXBT/2021-09-28T03:20:00/price/",
"expected-outcome-time": "2021-09-28T03:20:00",
"descriptor": {
"type": "enum",
"outcomes": [
"0",
"1"
]
},
"schemes": {
"olivia-v1": {
"nonces": [
"41a26c4853f2edc5604069541fdd1df103b52c31e959451d115f8220aeb8b414"
]
},
"ecdsa-v1": {}
}
}
"#;
let json = r#"{"announcement":{"oracle_event":{"encoding":"json","data":"{\"id\":\"/x/BitMEX/BXBT/2021-10-04T22:00:00.price[n:20]\",\"expected-outcome-time\":\"2021-10-04T22:00:00\",\"descriptor\":{\"type\":\"digit-decomposition\",\"is_signed\":false,\"n_digits\":20,\"unit\":null},\"schemes\":{\"olivia-v1\":{\"nonces\":[\"8d72028eeaf4b85aec0f750f05a4a320cac193f5d8494bfe05cd4b29f3df4239\",\"77240f79a0042adae35ad24284b18b906f17a979fcec3c90d11ed682c6b9261e\",\"e42332407b58f7c6e860b886acfe8d19636fb21a1e20722522206b30a2424d89\",\"ce1158e02dc265751887edae9bdcf8d06ad40489c7643324ccb6a46e4e740f5a\",\"52a5751a43046217bcf009df917c24e400c6da645474a654a5f89499df7154d4\",\"e7b97360a952c2b239d1bfeaade73da4a38e83d20f5deb5b054bcbbc78c91e40\",\"612ce13fd61be10e8de77976c6d479865bc3d2ebdc212946f1e5d93e3f504d2e\",\"e40decd0ea27003b873dde9b6be02f1b344e7e74bc5299144fa0f37b1cf12e90\",\"281a829e05d5f8b96eaf620c7b26115bfb29013d503b6bb40068cdb413a87197\",\"3c87eed0a3852953b0f3ac8a47ff194de66c7229c42e6578e0f6464ba240f033\",\"29028525277cb39adab9ac145d6ce61f2e10306e7b6ce95970a22ea3b201a5d9\",\"20971b4d2069d8b9b5c5678290ab7624821cf32ffe32a20d58428ca90da02523\",\"667a9af33ed45bfb5c4fc7adacea15bbe26df90e0df7dd5b8235e14dfd0da38f\",\"224df2d2706b5c629173b84927e2b206dad7a72e132eb86912d9464dad4b41d1\",\"85296962b9d1f7699c248467ce94ce4aa6e00d26fe01af3a507bcd3a303855d4\",\"96813c9f4d136f0f64be79e73d657fecc43d8b6c463163913b4fa31f96b1ae6b\",\"9d5971aa596923560b12f367fb2f4e192d8906bf6ed3a58b093f50d3cad27493\",\"b7f2c135db80cee02b4436557c78dc1dd2343c1a3688ba736c6c40e9531547b6\",\"bd6236fc18f1dc96f9755cc5c435adaf3952ff810d3ad5b96a03464a61eecfde\",\"20b2922ce326e5e2f4ed683723a879e467edd1068bf5a3c4f331525216227abe\"]},\"ecdsa-v1\":{}}}"},"signature":"743ed9900aba5a1ba3ba9d862628cdc5cca27974c40c4ab64618709021b3fbb13216a3efc733be260025da487ae9b63a8290d555bdc8da6324deff149fc7b110"},"attestation":{"outcome":"48935","schemes":{"olivia-v1":{"scalars":["1327b3bd0f1faf45d6fed6c96d0c158da22a2033a6fed98bed036df0a4eef484","72659c6beebd45e299bc4260a1c1ffd708ed33771459563502f25fc4f537cef6","051eec45417e2493f36b13f4fdf83fb981be42901bf876e4ac594ff2daa4c30e","847d8c7204335b1dbc2078cfb56118b1977162e7b997f2029f490929bbd603c7","5b695846292b6d69d9beedcc7dd2b7e49fd49ec4fcf262d9357f52b049fa8998","368a1f2206fcedcde37381b272fa5a400f55ef720ee2b8fff558e3b0dce729ee","9e1c015c0e827037f18681937764f4973ef22d6fbbd82f6bde3bf5198f6b8999","fe9620c9ad9862b5615f8cf3e20e8d9f422e7410914ce8af2b8bad8937b75738","44297ae831898f8f5c7e57720f233a717e9034a5b41d6c89cce6d9058c4ee086","587fc9b71f1920df825138f00bc625e6610e61b1fec0a64e2800fc05b3a2e96d","010377f6b885ae48d62e7863c8038240aafe0a7fb97d58ac6173186c95335955","5243782226739f59b0ac01a56a63537289ffe81b87b33eca42f89f7848623520","06184cb8e46b5d520cd9b5829feeb73b688d61e5f37b91ff88d3f9b8664a5cdd","fe48f4b568bb501732c4e8f1919940c9bca0ad909f4624658b14664af823ccfe","0841f121e7a54f88a844227cd0ae62171b49d004120c16d1a1d619f0b76f7068","c4ac3c8751a63f7c40062b9b84f2bb953b0e6bd8f2cf3b2bcaf711321e92df8f","86a2b1a31bf80f17c00ab28420c636c1ed604d0b1f0a33adda99a0cf1e510269","fb892eba992b723a06bccad6a2a1bb875d548a275a987266fceed097b9fd88db","41991fb15fdb013ccab3e6674b91546a0e1e56a1e212c8795c76d0b43f4c884d","ab6a4368d2e5e7cea23fd648662769facc1c37f1d1613225e9010af07cd74711"]},"ecdsa-v1":{"signature":"1d9a5e2336883cc6b440ff40e16ee44f8af2ba9313e46f1e4cd417f7dba7686279b0216e4b0b5fcf0c650dbad98fdefcf5ef16b49d63651a87f80caddd472384"}},"time":"2021-10-04T22:00:15"}}"#;
let deserialized = serde_json::from_str::<oracle::Announcement>(json).unwrap();
let expected = oracle::Announcement {
id: "/BitMEX/BXBT/2021-09-28T03:20:00/price/".to_string(),
expected_outcome_time: datetime!(2021-09-28 03:20:00).assume_utc(),
nonce_pks: vec![schnorrsig::PublicKey::from_str(
"41a26c4853f2edc5604069541fdd1df103b52c31e959451d115f8220aeb8b414",
)
.unwrap()],
id: "/x/BitMEX/BXBT/2021-10-04T22:00:00.price[n:20]".to_string(),
expected_outcome_time: datetime!(2021-10-04 22:00:00).assume_utc(),
nonce_pks: vec![
"8d72028eeaf4b85aec0f750f05a4a320cac193f5d8494bfe05cd4b29f3df4239"
.parse()
.unwrap(),
"77240f79a0042adae35ad24284b18b906f17a979fcec3c90d11ed682c6b9261e"
.parse()
.unwrap(),
"e42332407b58f7c6e860b886acfe8d19636fb21a1e20722522206b30a2424d89"
.parse()
.unwrap(),
"ce1158e02dc265751887edae9bdcf8d06ad40489c7643324ccb6a46e4e740f5a"
.parse()
.unwrap(),
"52a5751a43046217bcf009df917c24e400c6da645474a654a5f89499df7154d4"
.parse()
.unwrap(),
"e7b97360a952c2b239d1bfeaade73da4a38e83d20f5deb5b054bcbbc78c91e40"
.parse()
.unwrap(),
"612ce13fd61be10e8de77976c6d479865bc3d2ebdc212946f1e5d93e3f504d2e"
.parse()
.unwrap(),
"e40decd0ea27003b873dde9b6be02f1b344e7e74bc5299144fa0f37b1cf12e90"
.parse()
.unwrap(),
"281a829e05d5f8b96eaf620c7b26115bfb29013d503b6bb40068cdb413a87197"
.parse()
.unwrap(),
"3c87eed0a3852953b0f3ac8a47ff194de66c7229c42e6578e0f6464ba240f033"
.parse()
.unwrap(),
"29028525277cb39adab9ac145d6ce61f2e10306e7b6ce95970a22ea3b201a5d9"
.parse()
.unwrap(),
"20971b4d2069d8b9b5c5678290ab7624821cf32ffe32a20d58428ca90da02523"
.parse()
.unwrap(),
"667a9af33ed45bfb5c4fc7adacea15bbe26df90e0df7dd5b8235e14dfd0da38f"
.parse()
.unwrap(),
"224df2d2706b5c629173b84927e2b206dad7a72e132eb86912d9464dad4b41d1"
.parse()
.unwrap(),
"85296962b9d1f7699c248467ce94ce4aa6e00d26fe01af3a507bcd3a303855d4"
.parse()
.unwrap(),
"96813c9f4d136f0f64be79e73d657fecc43d8b6c463163913b4fa31f96b1ae6b"
.parse()
.unwrap(),
"9d5971aa596923560b12f367fb2f4e192d8906bf6ed3a58b093f50d3cad27493"
.parse()
.unwrap(),
"b7f2c135db80cee02b4436557c78dc1dd2343c1a3688ba736c6c40e9531547b6"
.parse()
.unwrap(),
"bd6236fc18f1dc96f9755cc5c435adaf3952ff810d3ad5b96a03464a61eecfde"
.parse()
.unwrap(),
"20b2922ce326e5e2f4ed683723a879e467edd1068bf5a3c4f331525216227abe"
.parse()
.unwrap(),
],
};
assert_eq!(deserialized, expected)
}
#[test]
fn deserialize_attestation() {
let json = r#"{"announcement":{"oracle_event":{"encoding":"json","data":"{\"id\":\"/x/BitMEX/BXBT/2021-10-04T22:00:00.price[n:20]\",\"expected-outcome-time\":\"2021-10-04T22:00:00\",\"descriptor\":{\"type\":\"digit-decomposition\",\"is_signed\":false,\"n_digits\":20,\"unit\":null},\"schemes\":{\"olivia-v1\":{\"nonces\":[\"8d72028eeaf4b85aec0f750f05a4a320cac193f5d8494bfe05cd4b29f3df4239\",\"77240f79a0042adae35ad24284b18b906f17a979fcec3c90d11ed682c6b9261e\",\"e42332407b58f7c6e860b886acfe8d19636fb21a1e20722522206b30a2424d89\",\"ce1158e02dc265751887edae9bdcf8d06ad40489c7643324ccb6a46e4e740f5a\",\"52a5751a43046217bcf009df917c24e400c6da645474a654a5f89499df7154d4\",\"e7b97360a952c2b239d1bfeaade73da4a38e83d20f5deb5b054bcbbc78c91e40\",\"612ce13fd61be10e8de77976c6d479865bc3d2ebdc212946f1e5d93e3f504d2e\",\"e40decd0ea27003b873dde9b6be02f1b344e7e74bc5299144fa0f37b1cf12e90\",\"281a829e05d5f8b96eaf620c7b26115bfb29013d503b6bb40068cdb413a87197\",\"3c87eed0a3852953b0f3ac8a47ff194de66c7229c42e6578e0f6464ba240f033\",\"29028525277cb39adab9ac145d6ce61f2e10306e7b6ce95970a22ea3b201a5d9\",\"20971b4d2069d8b9b5c5678290ab7624821cf32ffe32a20d58428ca90da02523\",\"667a9af33ed45bfb5c4fc7adacea15bbe26df90e0df7dd5b8235e14dfd0da38f\",\"224df2d2706b5c629173b84927e2b206dad7a72e132eb86912d9464dad4b41d1\",\"85296962b9d1f7699c248467ce94ce4aa6e00d26fe01af3a507bcd3a303855d4\",\"96813c9f4d136f0f64be79e73d657fecc43d8b6c463163913b4fa31f96b1ae6b\",\"9d5971aa596923560b12f367fb2f4e192d8906bf6ed3a58b093f50d3cad27493\",\"b7f2c135db80cee02b4436557c78dc1dd2343c1a3688ba736c6c40e9531547b6\",\"bd6236fc18f1dc96f9755cc5c435adaf3952ff810d3ad5b96a03464a61eecfde\",\"20b2922ce326e5e2f4ed683723a879e467edd1068bf5a3c4f331525216227abe\"]},\"ecdsa-v1\":{}}}"},"signature":"743ed9900aba5a1ba3ba9d862628cdc5cca27974c40c4ab64618709021b3fbb13216a3efc733be260025da487ae9b63a8290d555bdc8da6324deff149fc7b110"},"attestation":{"outcome":"48935","schemes":{"olivia-v1":{"scalars":["1327b3bd0f1faf45d6fed6c96d0c158da22a2033a6fed98bed036df0a4eef484","72659c6beebd45e299bc4260a1c1ffd708ed33771459563502f25fc4f537cef6","051eec45417e2493f36b13f4fdf83fb981be42901bf876e4ac594ff2daa4c30e","847d8c7204335b1dbc2078cfb56118b1977162e7b997f2029f490929bbd603c7","5b695846292b6d69d9beedcc7dd2b7e49fd49ec4fcf262d9357f52b049fa8998","368a1f2206fcedcde37381b272fa5a400f55ef720ee2b8fff558e3b0dce729ee","9e1c015c0e827037f18681937764f4973ef22d6fbbd82f6bde3bf5198f6b8999","fe9620c9ad9862b5615f8cf3e20e8d9f422e7410914ce8af2b8bad8937b75738","44297ae831898f8f5c7e57720f233a717e9034a5b41d6c89cce6d9058c4ee086","587fc9b71f1920df825138f00bc625e6610e61b1fec0a64e2800fc05b3a2e96d","010377f6b885ae48d62e7863c8038240aafe0a7fb97d58ac6173186c95335955","5243782226739f59b0ac01a56a63537289ffe81b87b33eca42f89f7848623520","06184cb8e46b5d520cd9b5829feeb73b688d61e5f37b91ff88d3f9b8664a5cdd","fe48f4b568bb501732c4e8f1919940c9bca0ad909f4624658b14664af823ccfe","0841f121e7a54f88a844227cd0ae62171b49d004120c16d1a1d619f0b76f7068","c4ac3c8751a63f7c40062b9b84f2bb953b0e6bd8f2cf3b2bcaf711321e92df8f","86a2b1a31bf80f17c00ab28420c636c1ed604d0b1f0a33adda99a0cf1e510269","fb892eba992b723a06bccad6a2a1bb875d548a275a987266fceed097b9fd88db","41991fb15fdb013ccab3e6674b91546a0e1e56a1e212c8795c76d0b43f4c884d","ab6a4368d2e5e7cea23fd648662769facc1c37f1d1613225e9010af07cd74711"]},"ecdsa-v1":{"signature":"1d9a5e2336883cc6b440ff40e16ee44f8af2ba9313e46f1e4cd417f7dba7686279b0216e4b0b5fcf0c650dbad98fdefcf5ef16b49d63651a87f80caddd472384"}},"time":"2021-10-04T22:00:15"}}"#;
let deserialized = serde_json::from_str::<oracle::Attestation>(json).unwrap();
let expected = oracle::Attestation {
id: "/x/BitMEX/BXBT/2021-10-04T22:00:00.price[n:20]".to_string(),
price: 48935,
scalars: vec![
"1327b3bd0f1faf45d6fed6c96d0c158da22a2033a6fed98bed036df0a4eef484"
.parse()
.unwrap(),
"72659c6beebd45e299bc4260a1c1ffd708ed33771459563502f25fc4f537cef6"
.parse()
.unwrap(),
"051eec45417e2493f36b13f4fdf83fb981be42901bf876e4ac594ff2daa4c30e"
.parse()
.unwrap(),
"847d8c7204335b1dbc2078cfb56118b1977162e7b997f2029f490929bbd603c7"
.parse()
.unwrap(),
"5b695846292b6d69d9beedcc7dd2b7e49fd49ec4fcf262d9357f52b049fa8998"
.parse()
.unwrap(),
"368a1f2206fcedcde37381b272fa5a400f55ef720ee2b8fff558e3b0dce729ee"
.parse()
.unwrap(),
"9e1c015c0e827037f18681937764f4973ef22d6fbbd82f6bde3bf5198f6b8999"
.parse()
.unwrap(),
"fe9620c9ad9862b5615f8cf3e20e8d9f422e7410914ce8af2b8bad8937b75738"
.parse()
.unwrap(),
"44297ae831898f8f5c7e57720f233a717e9034a5b41d6c89cce6d9058c4ee086"
.parse()
.unwrap(),
"587fc9b71f1920df825138f00bc625e6610e61b1fec0a64e2800fc05b3a2e96d"
.parse()
.unwrap(),
"010377f6b885ae48d62e7863c8038240aafe0a7fb97d58ac6173186c95335955"
.parse()
.unwrap(),
"5243782226739f59b0ac01a56a63537289ffe81b87b33eca42f89f7848623520"
.parse()
.unwrap(),
"06184cb8e46b5d520cd9b5829feeb73b688d61e5f37b91ff88d3f9b8664a5cdd"
.parse()
.unwrap(),
"fe48f4b568bb501732c4e8f1919940c9bca0ad909f4624658b14664af823ccfe"
.parse()
.unwrap(),
"0841f121e7a54f88a844227cd0ae62171b49d004120c16d1a1d619f0b76f7068"
.parse()
.unwrap(),
"c4ac3c8751a63f7c40062b9b84f2bb953b0e6bd8f2cf3b2bcaf711321e92df8f"
.parse()
.unwrap(),
"86a2b1a31bf80f17c00ab28420c636c1ed604d0b1f0a33adda99a0cf1e510269"
.parse()
.unwrap(),
"fb892eba992b723a06bccad6a2a1bb875d548a275a987266fceed097b9fd88db"
.parse()
.unwrap(),
"41991fb15fdb013ccab3e6674b91546a0e1e56a1e212c8795c76d0b43f4c884d"
.parse()
.unwrap(),
"ab6a4368d2e5e7cea23fd648662769facc1c37f1d1613225e9010af07cd74711"
.parse()
.unwrap(),
],
};
assert_eq!(deserialized, expected)
@ -336,7 +504,7 @@ mod tests {
assert_eq!(
url,
"https://h00.ooo/x/BitMEX/BXBT/2021-09-23T10:00:00.price"
"https://h00.ooo/x/BitMEX/BXBT/2021-09-23T10:00:00.price[n:20]"
);
}

Loading…
Cancel
Save