Implement new behaviour for execution setup
parent
9ae050abf8
commit
3fa4ffa82c
@ -0,0 +1,91 @@
|
||||
use crate::{
|
||||
network::request_response::BUF_SIZE,
|
||||
protocol::{
|
||||
alice::{State0, State3},
|
||||
bob,
|
||||
},
|
||||
};
|
||||
use anyhow::{Context, Error, Result};
|
||||
use libp2p::PeerId;
|
||||
use libp2p_async_await::BehaviourOutEvent;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum OutEvent {
|
||||
Done(Result<State3>),
|
||||
}
|
||||
|
||||
impl From<BehaviourOutEvent<State3, (), anyhow::Error>> for OutEvent {
|
||||
fn from(event: BehaviourOutEvent<State3, (), Error>) -> Self {
|
||||
match event {
|
||||
BehaviourOutEvent::Inbound(_, Ok(State3)) => OutEvent::Done(Ok(State3)),
|
||||
BehaviourOutEvent::Inbound(_, Err(e)) => OutEvent::Done(Err(e)),
|
||||
BehaviourOutEvent::Outbound(..) => unreachable!("Alice only supports inbound"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(libp2p::NetworkBehaviour)]
|
||||
#[behaviour(out_event = "OutEvent", event_process = false)]
|
||||
pub struct Behaviour {
|
||||
inner: libp2p_async_await::Behaviour<State3, (), anyhow::Error>,
|
||||
}
|
||||
|
||||
impl Default for Behaviour {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
inner: libp2p_async_await::Behaviour::new(b"/execution_setup/1.0.0"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Behaviour {
|
||||
pub fn run(&mut self, bob: PeerId, state0: State0) {
|
||||
self.inner
|
||||
.do_protocol_listener(bob, move |mut substream| async move {
|
||||
let alice_message0 = state0.next_message();
|
||||
|
||||
let state1 = {
|
||||
let bob_message0 = serde_cbor::from_slice::<bob::Message0>(
|
||||
&substream.read_message(BUF_SIZE).await?,
|
||||
)
|
||||
.context("failed to deserialize message0")?;
|
||||
state0.receive(bob_message0)?
|
||||
};
|
||||
|
||||
substream
|
||||
.write_message(
|
||||
&serde_cbor::to_vec(&alice_message0)
|
||||
.context("failed to serialize Message0")?,
|
||||
)
|
||||
.await?;
|
||||
|
||||
let state2 = {
|
||||
let bob_message1 = serde_cbor::from_slice::<bob::Message1>(
|
||||
&substream.read_message(BUF_SIZE).await?,
|
||||
)
|
||||
.context("failed to deserialize message1")?;
|
||||
state1.receive(bob_message1)
|
||||
};
|
||||
|
||||
{
|
||||
let alice_message2 = state2.next_message();
|
||||
substream
|
||||
.write_message(
|
||||
&serde_cbor::to_vec(&alice_message2)
|
||||
.context("failed to serialize Message2")?,
|
||||
)
|
||||
.await?;
|
||||
}
|
||||
|
||||
let state3 = {
|
||||
let bob_message2 = serde_cbor::from_slice::<bob::Message2>(
|
||||
&substream.read_message(BUF_SIZE).await?,
|
||||
)
|
||||
.context("failed to deserialize message2")?;
|
||||
state2.receive(bob_message2)?
|
||||
};
|
||||
|
||||
Ok(state3)
|
||||
})
|
||||
}
|
||||
}
|
@ -0,0 +1,97 @@
|
||||
use crate::{
|
||||
network::request_response::BUF_SIZE,
|
||||
protocol::{
|
||||
alice,
|
||||
bob::{State0, State2},
|
||||
},
|
||||
};
|
||||
use anyhow::{Context, Error, Result};
|
||||
use libp2p::PeerId;
|
||||
use libp2p_async_await::BehaviourOutEvent;
|
||||
use std::sync::Arc;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum OutEvent {
|
||||
Done(Result<State2>),
|
||||
}
|
||||
|
||||
impl From<BehaviourOutEvent<(), State2, anyhow::Error>> for OutEvent {
|
||||
fn from(event: BehaviourOutEvent<(), State2, Error>) -> Self {
|
||||
match event {
|
||||
BehaviourOutEvent::Outbound(_, Ok(State2)) => OutEvent::Done(Ok(State2)),
|
||||
BehaviourOutEvent::Outbound(_, Err(e)) => OutEvent::Done(Err(e)),
|
||||
BehaviourOutEvent::Inbound(..) => unreachable!("Bob only supports outbound"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(libp2p::NetworkBehaviour)]
|
||||
#[behaviour(out_event = "OutEvent", event_process = false)]
|
||||
pub struct Behaviour {
|
||||
inner: libp2p_async_await::Behaviour<(), State2, anyhow::Error>,
|
||||
}
|
||||
|
||||
impl Default for Behaviour {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
inner: libp2p_async_await::Behaviour::new(b"/execution_setup/1.0.0"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Behaviour {
|
||||
pub fn run(
|
||||
&mut self,
|
||||
alice: PeerId,
|
||||
state0: State0,
|
||||
bitcoin_wallet: Arc<crate::bitcoin::Wallet>,
|
||||
) {
|
||||
self.inner
|
||||
.do_protocol_dialer(alice, move |mut substream| async move {
|
||||
let bob_message0 = state0.next_message();
|
||||
|
||||
substream
|
||||
.write_message(
|
||||
&serde_cbor::to_vec(&bob_message0)
|
||||
.context("failed to serialize message0")?,
|
||||
)
|
||||
.await?;
|
||||
|
||||
let alice_message0 = serde_cbor::from_slice::<alice::Message0>(
|
||||
&substream.read_message(BUF_SIZE).await?,
|
||||
)
|
||||
.context("failed to deserialize message0")?;
|
||||
|
||||
let state1 = state0
|
||||
.receive(bitcoin_wallet.as_ref(), alice_message0)
|
||||
.await?;
|
||||
{
|
||||
let bob_message1 = state1.next_message();
|
||||
substream
|
||||
.write_message(
|
||||
&serde_cbor::to_vec(&bob_message1)
|
||||
.context("failed to serialize Message1")?,
|
||||
)
|
||||
.await?;
|
||||
}
|
||||
|
||||
let alice_message1 = serde_cbor::from_slice::<alice::Message1>(
|
||||
&substream.read_message(BUF_SIZE).await?,
|
||||
)
|
||||
.context("failed to deserialize message1")?;
|
||||
let state2 = state1.receive(alice_message1)?;
|
||||
|
||||
{
|
||||
let bob_message2 = state2.next_message();
|
||||
substream
|
||||
.write_message(
|
||||
&serde_cbor::to_vec(&bob_message2)
|
||||
.context("failed to serialize Message2")?,
|
||||
)
|
||||
.await?;
|
||||
}
|
||||
|
||||
Ok(state2)
|
||||
})
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue