refactor(network): don't treat rejected txs as submit protocol errors (#306)

This commit is contained in:
teebaumcrypto 2024-06-29 20:00:08 +02:00 committed by GitHub
parent 520079d1f0
commit 1adc9a31d6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 100 additions and 17 deletions

View file

@ -46,7 +46,7 @@ where
/// # Errors
/// Returns an error if the agency is not ours or if the outbound state is
/// invalid.
pub async fn submit_tx(&mut self, tx: Tx) -> Result<(), Error<Reject>> {
pub async fn submit_tx(&mut self, tx: Tx) -> Result<Response<Reject>, Error> {
self.send_submit_tx(tx).await?;
self.recv_submit_tx_response().await
}
@ -56,7 +56,7 @@ where
/// # Errors
/// Returns an error if the agency is not ours or if the outbound state is
/// invalid.
pub async fn terminate_gracefully(&mut self) -> Result<(), Error<Reject>> {
pub async fn terminate_gracefully(&mut self) -> Result<(), Error> {
let msg = Message::Done;
self.send_message(&msg).await?;
self.state = State::Done;
@ -77,7 +77,7 @@ where
}
}
fn assert_agency_is_ours(&self) -> Result<(), Error<Reject>> {
fn assert_agency_is_ours(&self) -> Result<(), Error> {
if !self.has_agency() {
Err(Error::AgencyIsTheirs)
} else {
@ -85,7 +85,7 @@ where
}
}
fn assert_agency_is_theirs(&self) -> Result<(), Error<Reject>> {
fn assert_agency_is_theirs(&self) -> Result<(), Error> {
if self.has_agency() {
Err(Error::AgencyIsOurs)
} else {
@ -93,14 +93,14 @@ where
}
}
fn assert_outbound_state(&self, msg: &Message<Tx, Reject>) -> Result<(), Error<Reject>> {
fn assert_outbound_state(&self, msg: &Message<Tx, Reject>) -> Result<(), Error> {
match (&self.state, msg) {
(State::Idle, Message::SubmitTx(_) | Message::Done) => Ok(()),
_ => Err(Error::InvalidOutbound),
}
}
fn assert_inbound_state(&self, msg: &Message<Tx, Reject>) -> Result<(), Error<Reject>> {
fn assert_inbound_state(&self, msg: &Message<Tx, Reject>) -> Result<(), Error> {
match (&self.state, msg) {
(State::Busy, Message::AcceptTx | Message::RejectTx(_)) => Ok(()),
_ => Err(Error::InvalidInbound),
@ -116,7 +116,7 @@ where
/// # Errors
/// Returns an error if the agency is not ours or if the outbound state is
/// invalid.
async fn send_message(&mut self, msg: &Message<Tx, Reject>) -> Result<(), Error<Reject>> {
async fn send_message(&mut self, msg: &Message<Tx, Reject>) -> Result<(), Error> {
self.assert_agency_is_ours()?;
self.assert_outbound_state(msg)?;
@ -133,7 +133,7 @@ where
/// # Errors
/// Returns an error if the agency is not theirs or if the inbound state is
/// invalid.
async fn recv_message(&mut self) -> Result<Message<Tx, Reject>, Error<Reject>> {
async fn recv_message(&mut self) -> Result<Message<Tx, Reject>, Error> {
self.assert_agency_is_theirs()?;
let msg = self
@ -155,7 +155,7 @@ where
/// # Errors
/// Returns an error if the agency is not ours or if the outbound state is
/// invalid.
async fn send_submit_tx(&mut self, tx: Tx) -> Result<(), Error<Reject>> {
async fn send_submit_tx(&mut self, tx: Tx) -> Result<(), Error> {
let msg = Message::SubmitTx(tx);
self.send_message(&msg).await?;
self.state = State::Busy;
@ -169,17 +169,17 @@ where
///
/// # Errors
/// Returns an error if the inbound message is invalid.
async fn recv_submit_tx_response(&mut self) -> Result<(), Error<Reject>> {
async fn recv_submit_tx_response(&mut self) -> Result<Response<Reject>, Error> {
debug!("waiting for SubmitTx response");
match self.recv_message().await? {
Message::AcceptTx => {
self.state = State::Idle;
Ok(())
Ok(Response::Accepted)
}
Message::RejectTx(rejection) => {
self.state = State::Idle;
Err(Error::TxRejected(rejection))
Ok(Response::Rejected(rejection))
}
_ => Err(Error::InvalidInbound),
}
@ -187,7 +187,7 @@ where
}
#[derive(Error, Debug)]
pub enum Error<Reject> {
pub enum Error {
#[error("attempted to receive message while agency is ours")]
AgencyIsOurs,
@ -202,7 +202,10 @@ pub enum Error<Reject> {
#[error("error while sending or receiving data through the channel")]
ChannelError(multiplexer::Error),
#[error("tx was rejected by the server")]
TxRejected(Reject),
}
#[derive(Debug)]
pub enum Response<Reject> {
Accepted,
Rejected(Reject),
}

View file

@ -38,7 +38,14 @@ where
impl<'b, Tx: Decode<'b, ()>, Reject: Decode<'b, ()>> Decode<'b, ()> for Message<Tx, Reject> {
fn decode(d: &mut Decoder<'b>, _ctx: &mut ()) -> Result<Self, decode::Error> {
d.array()?;
if let Err(_) = d.array() {
// if the first element isn't an array, it's a plutus error
// the node sends string data
let rejection = d.decode()?;
// skip this data via setting the decoder position, because it doesn't recognize it with rejection decode
let _ = d.set_position(d.input().len());
return Ok(Message::RejectTx(rejection));
}
let label = d.u16()?;
match label {
0 => {
@ -48,6 +55,8 @@ impl<'b, Tx: Decode<'b, ()>, Reject: Decode<'b, ()>> Decode<'b, ()> for Message<
1 => Ok(Message::AcceptTx),
2 => {
let rejection = d.decode()?;
// skip this data via setting the decoder position, because it doesn't recognize it with rejection decode
let _ = d.set_position(d.input().len());
Ok(Message::RejectTx(rejection))
}
3 => Ok(Message::Done),
@ -134,6 +143,14 @@ mod tests {
}
}
#[test]
fn decode_reject_string_message() {
let mut bytes = hex::decode(RAW_REJECT_REPONSE_ERROR_STRING).unwrap();
let msg_res = try_decode_message::<Message<EraTx, RejectReason>>(&mut bytes);
println!("result {:?}", msg_res);
assert!(msg_res.is_ok())
}
const RAW_REJECT_RESPONSE: &str =
"82028182059f820082018200820a81581c3b890fb5449baedf5342a48ee9c9ec6acbc995641be92ad21f08c686\
8200820183038158202628ce6ff8cc7ff0922072d930e4a693c17f991748dedece0be64819a2f9ef7782582031d\
@ -149,4 +166,67 @@ mod tests {
cb33fb9906b097980a83f2b8ef40b51c4ef52eccd402825820efc267ad2c15c34a117535eecc877241ed836eb3e\
643ec90de21ca1b12fd79c20282008202820181148200820283023a000f0f6d1a004944ce820082028201830d3a\
000f0f6d1a00106253820082028201830182811a02409e10811a024138c01a0255e528ff";
const RAW_REJECT_REPONSE_ERROR_STRING: &str =
"6867475972786f4141794e6847514d734151455a412b675a416a734141526b4436426c65635151424751506f47\
4341614141484b64686b6f3677515a576467595a426c5a3242686b47566e594747515a576467595a426c5a32426\
86b47566e59474751595a42686b47566e594747515a5446455949426f4141717a364743415a7456454547674144\
5978555a4166384141526f4141567731474341614141655864526b3239415143476741432f35516141416271654\
26a63414145424751506f47572f324241496141414f3943426f414130374647443442476741514c67385a4d536f\
42476741444c6f415a4161554247674143326e675a412b675a7a775942476741424f6a515949426d6f385267674\
751506f47434161414145367241455a34554d454751506f43686f414177495a474a77424767414441686b596e41\
456141414d6766426b423251456141414d7741426b422f77455a7a504d5949426e395142676747662f564743415\
a5742345949426c4173786767476741424b74385949426f4141762b5547674147366e67593341414241526f4141\
512b534753326e4141455a3672735949426f4141762b5547674147366e67593341414241526f4141762b5547674\
147366e67593341414241526f4145624973476741462f64344141686f414446424f4758635342426f4148577232\
47674142516c73454767414544475941424141614141465071786767476741444932455a4179774241526d67336\
86767476741445058595949426c353942676747582b344743415a7156305949426c3939786767475a5771474341\
6141694f737a416f61413354326b786c4b48776f61416c466568426d417377714347674149466c41614364577a5\
1466b452f466b452b514541414449794d6a49794d6a49794d6a49794d6a49794d6a49794d6a49794d69496c4d7a\
41554d6a49794d6a49794d6a49794d6a49794d6a49794d6a49794d6a49794d6a49794d6a49794d6c4d7a41774d3\
3447041424142435a47526b706d59475a6d3464544d774d7a4e773575744d4451774e5144306741425341414649\
414a494141564d774a444e77356d425341555947674469514151715a6753475a455a75764e30356763414247366\
3774f414154413041454d44514167564d774a444e77356d59475245536d5a675941416941454a6d41475a754141\
435341434d44674146494141424e494151564d774a444e784a75744d4451774e5146674168557a416b4142457a4\
d7949694d33456d62677a4e77526d34497a4174414f4144414341424d33414762676a4d433041344152494e4150\
4d3342414241416d626741426b67416a413041654d4451423033576d426f417362725441304162457a496a4d6a4\
131496c4d7a41794142464b41715a6d42775a75764d446b4145414d556f69594152676441416d366b4145414933\
5747426f5a4742735947786762474273594777414a6761674b473634774e4147464d794d774d77415253695a475\
26b706d424d5a75504e31786762474275414562726a41324d44634145544e783575754d44594149335847427341\
435947344535676241416d426d41344a6d5a6d52455247526b5a754a4d33416d6267544170414e4e316f414a6d3\
44d7a6345414b4149414759464943616d5a676347526b706d42575a75504e317867646d4234414562726a41374d\
44774145544e783575754d447341493358474232414359486746686764674443627141425241424e31435141426\
75a674f6d3630774d77465141546461594759444a75744d444d4268544d774d5449794d6c4d774a544e78357575\
4d4455774e67416a646359477067624141695a75504e317867616742473634774e5141544132416d4d445541457\
74d6747784d33426d6267674154646159475143356d344533576d426b4175627254417941594541457a63435a67\
54414647426941305a6754414347426941304c47426d4145594651414a75714d4334774c77475464575a4742635\
94635675941416d4261594677414a675841416d59453575744d43734163416f33566d5267566d425959466f414a\
67564742574143594659414a6d4249627254416f414641484d7949794d6a4a544d774b7a49794d6c4d7a41754d3\
3447041424142435a47526b706d59474a6d34644941414149556f435a75764e30344168756e41424d4451414977\
4b7741546455414f4a6b5a47536d5a67596d626830674167416853674a6d3638335467434736634145774e41416\
a417241424e3151413567596742474251414362716741524143466a49794d6a4979557a4d43387a634f6b414141\
454a6b5a47526b706d59475a6d346449414141495449794d6a4a544d774e7a4e77365141514151734a6d3656494\
1414145774f67416a417841424e3151414a676141416978676241424742614143627167415441774142457a644b\
6b414542555947514152675567416d366f4145774c4441744d43344145774b7a417441464e315a6b5a47536d5a6\
75747626830674167416859564d7a41734d33486d3634774c51415142684d4330774c6a41764148466a41764143\
4d43594145335641416d526756474259414359464a675667426d3634774a77437a416e414b4d77496a646159457\
741494168675441416d424b414359456f434275734d434941493357474243414559454a675167416d4243594434\
4252675067416d4138414359446f414a674f41416d41324143594451414a674d67416d417741435944414168674\
c6741696b7773536d5a67466741696b41414a6d59434a6d3638774454415341424e3149417875744d425577456a\
6457594370674a414170414145526d59434941514149415970514d33537041414759414a757041434d774154645\
341454151726f45695141694d6a4d774241417a6463594277414a75754d413477447741544150414249694d7a4d\
4151414a4941416a4d7a414641435341416461627177415141794d4149335567416b52455a674645536d5a67446\
74169414b4b6d5a67476d62727a414a4d4134414541595441454d424577446741524d414977447741514156567a\
3658726756584f6b536d5a67436d626941416b67414259544d414d41494145774153496c4d7a41464d334467424\
a41414359417741496d59415a6d3445414a49414977427741534d6a4143497a414341434142497741694d774167\
416741566330726f56644552674247366f4146566338474432486d6632486d665145442f32486d6657427950377\
9303042345a5a53547a68596162482b3653316176373668545570616c644439705748524546425245482f32486d\
66574279694c7235587846304c3437704c363870616e5568337443312f32484c7a313042425436456b544546425\
245466651555242583035475650385a412b5562414256704b5a4c365955776241574e466546324b414142594848\
6b6743687a624c72495933354279415a653538786c3365776836586b464d693035332b4b2f59655a3959484b303\
465644c505031447a4441647969454d6e77445879736a4d4769693351475346574e62722f476773764b4d416141\
58764a4d502f59655a3842414145412f3968356e3968356e352f59655a2f59655a2f59655a39594942364f54504\
845657a426d5249524448705765462b4d69394961367935426b564665434675786155714d522f77442f32486d66\
32486d66324871665742776d474f6c4d32775a354c7757756d78374869774978394c66304956736254505575593\
04c652f39683667502b68514b4641476774734d63445965352f59655a2f59";
}