Fix the light client protocol protobuf schema (#12732)

* Fix the light client protocol protobuf schema

* Add another test

* Remove unused protobuf struct

* Ok you have to use the nightly rustfmt apparently
This commit is contained in:
Pierre Krieger
2022-11-18 15:01:13 +01:00
committed by GitHub
parent 4214bc527c
commit b52e64d640
3 changed files with 72 additions and 37 deletions
@@ -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: {}",
@@ -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(
@@ -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: {}",
@@ -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(
@@ -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: {}",
@@ -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)),
})
}
}
@@ -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]);
}
}
@@ -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 {
@@ -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;
}