Skip to content

Commit

Permalink
Fix the light client protocol protobuf schema (paritytech#12732)
Browse files Browse the repository at this point in the history
* Fix the light client protocol protobuf schema

* Add another test

* Remove unused protobuf struct

* Ok you have to use the nightly rustfmt apparently
  • Loading branch information
tomaka authored and ark0f committed Feb 27, 2023
1 parent 81d2fe5 commit 503ff5b
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 37 deletions.
33 changes: 15 additions & 18 deletions client/network/light/src/light_client_requests/handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -173,10 +173,7 @@ where
let block = Decode::decode(&mut request.block.as_ref())?;

let response = match self.client.execution_proof(block, &request.method, &request.data) {
Ok((_, proof)) => {
let r = schema::v1::light::RemoteCallResponse { proof: proof.encode() };
Some(schema::v1::light::response::Response::RemoteCallResponse(r))
},
Ok((_, proof)) => schema::v1::light::RemoteCallResponse { proof: Some(proof.encode()) },
Err(e) => {
trace!(
"remote call request from {} ({} at {:?}) failed with: {}",
Expand All @@ -185,11 +182,13 @@ where
request.block,
e,
);
None
schema::v1::light::RemoteCallResponse { proof: None }
},
};

Ok(schema::v1::light::Response { response })
Ok(schema::v1::light::Response {
response: Some(schema::v1::light::response::Response::RemoteCallResponse(response)),
})
}

fn on_remote_read_request(
Expand All @@ -213,10 +212,7 @@ where

let response =
match self.client.read_proof(block, &mut request.keys.iter().map(AsRef::as_ref)) {
Ok(proof) => {
let r = schema::v1::light::RemoteReadResponse { proof: proof.encode() };
Some(schema::v1::light::response::Response::RemoteReadResponse(r))
},
Ok(proof) => schema::v1::light::RemoteReadResponse { proof: Some(proof.encode()) },
Err(error) => {
trace!(
"remote read request from {} ({} at {:?}) failed with: {}",
Expand All @@ -225,11 +221,13 @@ where
request.block,
error,
);
None
schema::v1::light::RemoteReadResponse { proof: None }
},
};

Ok(schema::v1::light::Response { response })
Ok(schema::v1::light::Response {
response: Some(schema::v1::light::response::Response::RemoteReadResponse(response)),
})
}

fn on_remote_read_child_request(
Expand Down Expand Up @@ -264,10 +262,7 @@ where
&mut request.keys.iter().map(AsRef::as_ref),
)
}) {
Ok(proof) => {
let r = schema::v1::light::RemoteReadResponse { proof: proof.encode() };
Some(schema::v1::light::response::Response::RemoteReadResponse(r))
},
Ok(proof) => schema::v1::light::RemoteReadResponse { proof: Some(proof.encode()) },
Err(error) => {
trace!(
"remote read child request from {} ({} {} at {:?}) failed with: {}",
Expand All @@ -277,11 +272,13 @@ where
request.block,
error,
);
None
schema::v1::light::RemoteReadResponse { proof: None }
},
};

Ok(schema::v1::light::Response { response })
Ok(schema::v1::light::Response {
response: Some(schema::v1::light::response::Response::RemoteReadResponse(response)),
})
}
}

Expand Down
44 changes: 44 additions & 0 deletions client/network/light/src/schema.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,47 @@ pub(crate) mod v1 {
include!(concat!(env!("OUT_DIR"), "/api.v1.light.rs"));
}
}

#[cfg(test)]
mod tests {
use prost::Message as _;

#[test]
fn empty_proof_encodes_correctly() {
let encoded = super::v1::light::Response {
response: Some(super::v1::light::response::Response::RemoteReadResponse(
super::v1::light::RemoteReadResponse { proof: Some(Vec::new()) },
)),
}
.encode_to_vec();

// Make sure that the response contains one field of number 2 and wire type 2 (message),
// then another field of number 2 and wire type 2 (bytes), then a length of 0.
assert_eq!(encoded, vec![(2 << 3) | 2, 2, (2 << 3) | 2, 0]);
}

#[test]
fn no_proof_encodes_correctly() {
let encoded = super::v1::light::Response {
response: Some(super::v1::light::response::Response::RemoteReadResponse(
super::v1::light::RemoteReadResponse { proof: None },
)),
}
.encode_to_vec();

// Make sure that the response contains one field of number 2 and wire type 2 (message).
assert_eq!(encoded, vec![(2 << 3) | 2, 0]);
}

#[test]
fn proof_encodes_correctly() {
let encoded = super::v1::light::Response {
response: Some(super::v1::light::response::Response::RemoteReadResponse(
super::v1::light::RemoteReadResponse { proof: Some(vec![1, 2, 3, 4]) },
)),
}
.encode_to_vec();

assert_eq!(encoded, vec![(2 << 3) | 2, 6, (2 << 3) | 2, 4, 1, 2, 3, 4]);
}
}
32 changes: 13 additions & 19 deletions client/network/light/src/schema/light.v1.proto
Original file line number Diff line number Diff line change
@@ -1,17 +1,9 @@
// Schema definition for light client messages.

syntax = "proto3";
syntax = "proto2";

package api.v1.light;

// A pair of arbitrary bytes.
message Pair {
// The first element of the pair.
bytes fst = 1;
// The second element of the pair.
bytes snd = 2;
}

// Enumerate all possible light client request messages.
message Request {
oneof request {
Expand All @@ -34,40 +26,42 @@ message Response {
// Remote call request.
message RemoteCallRequest {
// Block at which to perform call.
bytes block = 2;
required bytes block = 2;
// Method name.
string method = 3;
required string method = 3;
// Call data.
bytes data = 4;
required bytes data = 4;
}

// Remote call response.
message RemoteCallResponse {
// Execution proof.
bytes proof = 2;
// Execution proof. If missing, indicates that the remote couldn't answer, for example because
// the block is pruned.
optional bytes proof = 2;
}

// Remote storage read request.
message RemoteReadRequest {
// Block at which to perform call.
bytes block = 2;
required bytes block = 2;
// Storage keys.
repeated bytes keys = 3;
}

// Remote read response.
message RemoteReadResponse {
// Read proof.
bytes proof = 2;
// Read proof. If missing, indicates that the remote couldn't answer, for example because
// the block is pruned.
optional bytes proof = 2;
}

// Remote storage read child request.
message RemoteReadChildRequest {
// Block at which to perform call.
bytes block = 2;
required bytes block = 2;
// Child Storage key, this is relative
// to the child type storage location.
bytes storage_key = 3;
required bytes storage_key = 3;
// Storage keys.
repeated bytes keys = 6;
}

0 comments on commit 503ff5b

Please sign in to comment.