Skip to content

Commit

Permalink
proto: use decaf377 signature proto types instead of bytes
Browse files Browse the repository at this point in the history
  • Loading branch information
hdevalence committed Dec 29, 2023
1 parent 5c8c0d7 commit fa4fdbf
Show file tree
Hide file tree
Showing 26 changed files with 2,252 additions and 2,235 deletions.
15 changes: 6 additions & 9 deletions crates/core/component/governance/src/delegator_vote/action.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ impl From<DelegatorVoteBody> for pb::DelegatorVoteBody {
value: Some(value.value.into()),
unbonded_amount: Some(value.unbonded_amount.into()),
nullifier: Some(value.nullifier.into()),
rk: value.rk.to_bytes().into(),
rk: Some(value.rk.into()),
}
}
}
Expand Down Expand Up @@ -75,14 +75,11 @@ impl TryFrom<pb::DelegatorVoteBody> for DelegatorVoteBody {
.ok_or_else(|| anyhow::anyhow!("missing nullifier in `DelegatorVote`"))?
.try_into()
.context("invalid nullifier in `DelegatorVote`")?,
rk: {
let rk_bytes: [u8; 32] = (msg.rk[..])
.try_into()
.context("expected 32-byte rk in `DelegatorVote`")?;
rk_bytes
.try_into()
.context("invalid rk in `DelegatorVote`")?
},
rk: msg
.rk
.ok_or_else(|| anyhow::anyhow!("missing rk in `DelegatorVote`"))?
.try_into()
.context("invalid rk in `DelegatorVote`")?,
})
}
}
Expand Down
10 changes: 5 additions & 5 deletions crates/core/component/shielded-pool/src/spend/action.rs
Original file line number Diff line number Diff line change
Expand Up @@ -72,11 +72,10 @@ impl DomainType for Body {

impl From<Body> for pb::SpendBody {
fn from(msg: Body) -> Self {
let rk_bytes: [u8; 32] = msg.rk.into();
pb::SpendBody {
balance_commitment: Some(msg.balance_commitment.into()),
nullifier: Some(msg.nullifier.into()),
rk: rk_bytes.to_vec(),
rk: Some(msg.rk.into()),
}
}
}
Expand All @@ -97,10 +96,11 @@ impl TryFrom<pb::SpendBody> for Body {
.try_into()
.context("malformed nullifier")?;

let rk_bytes: [u8; 32] = (proto.rk[..])
let rk = proto
.rk
.ok_or_else(|| anyhow::anyhow!("missing rk"))?
.try_into()
.map_err(|_| anyhow::anyhow!("expected 32-byte rk"))?;
let rk = rk_bytes.try_into().context("malformed rk")?;
.context("malformed rk")?;

Ok(Body {
balance_commitment,
Expand Down
9 changes: 5 additions & 4 deletions crates/core/transaction/src/transaction.rs
Original file line number Diff line number Diff line change
Expand Up @@ -616,11 +616,10 @@ impl DomainType for Transaction {

impl From<Transaction> for pbt::Transaction {
fn from(msg: Transaction) -> Self {
let sig_bytes: [u8; 64] = msg.binding_sig.into();
pbt::Transaction {
body: Some(msg.transaction_body.into()),
anchor: Some(msg.anchor.into()),
binding_sig: sig_bytes.to_vec(),
binding_sig: Some(msg.binding_sig.into()),
}
}
}
Expand All @@ -641,7 +640,9 @@ impl TryFrom<pbt::Transaction> for Transaction {
.try_into()
.context("transaction body malformed")?;

let sig_bytes: [u8; 64] = proto.binding_sig[..]
let binding_sig = proto
.binding_sig
.ok_or_else(|| anyhow::anyhow!("transaction missing binding signature"))?
.try_into()
.context("transaction binding signature malformed")?;

Expand All @@ -653,7 +654,7 @@ impl TryFrom<pbt::Transaction> for Transaction {

Ok(Transaction {
transaction_body,
binding_sig: sig_bytes.into(),
binding_sig,
anchor,
})
}
Expand Down
8 changes: 4 additions & 4 deletions crates/core/transaction/src/view.rs
Original file line number Diff line number Diff line change
Expand Up @@ -104,12 +104,12 @@ impl TryFrom<pbt::TransactionView> for TransactionView {
type Error = anyhow::Error;

fn try_from(v: pbt::TransactionView) -> Result<Self, Self::Error> {
let sig_bytes: [u8; 64] = v.binding_sig[..]
let binding_sig = v
.binding_sig
.ok_or_else(|| anyhow::anyhow!("transaction view missing binding signature"))?
.try_into()
.context("transaction binding signature malformed")?;

let binding_sig = sig_bytes.into();

let anchor = v
.anchor
.ok_or_else(|| anyhow::anyhow!("transaction view missing anchor"))?
Expand Down Expand Up @@ -202,7 +202,7 @@ impl From<TransactionView> for pbt::TransactionView {
Self {
body_view: Some(v.body_view.into()),
anchor: Some(v.anchor.into()),
binding_sig: v.binding_sig.to_bytes().to_vec(),
binding_sig: Some(v.binding_sig.into()),
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -194,8 +194,10 @@ pub struct DelegatorVoteBody {
#[prost(message, optional, tag = "6")]
pub nullifier: ::core::option::Option<super::super::sct::v1alpha1::Nullifier>,
/// The randomized validating key for the spend authorization signature.
#[prost(bytes = "vec", tag = "7")]
pub rk: ::prost::alloc::vec::Vec<u8>,
#[prost(message, optional, tag = "7")]
pub rk: ::core::option::Option<
super::super::super::super::crypto::decaf377_rdsa::v1alpha1::SpendVerificationKey,
>,
}
impl ::prost::Name for DelegatorVoteBody {
const NAME: &'static str = "DelegatorVoteBody";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -970,7 +970,7 @@ impl serde::Serialize for DelegatorVoteBody {
if self.nullifier.is_some() {
len += 1;
}
if !self.rk.is_empty() {
if self.rk.is_some() {
len += 1;
}
let mut struct_ser = serializer.serialize_struct("penumbra.core.component.governance.v1alpha1.DelegatorVoteBody", len)?;
Expand All @@ -994,9 +994,8 @@ impl serde::Serialize for DelegatorVoteBody {
if let Some(v) = self.nullifier.as_ref() {
struct_ser.serialize_field("nullifier", v)?;
}
if !self.rk.is_empty() {
#[allow(clippy::needless_borrow)]
struct_ser.serialize_field("rk", pbjson::private::base64::encode(&self.rk).as_str())?;
if let Some(v) = self.rk.as_ref() {
struct_ser.serialize_field("rk", v)?;
}
struct_ser.end()
}
Expand Down Expand Up @@ -1128,9 +1127,7 @@ impl<'de> serde::Deserialize<'de> for DelegatorVoteBody {
if rk__.is_some() {
return Err(serde::de::Error::duplicate_field("rk"));
}
rk__ =
Some(map_.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0)
;
rk__ = map_.next_value()?;
}
}
}
Expand All @@ -1141,7 +1138,7 @@ impl<'de> serde::Deserialize<'de> for DelegatorVoteBody {
value: value__,
unbonded_amount: unbonded_amount__,
nullifier: nullifier__,
rk: rk__.unwrap_or_default(),
rk: rk__,
})
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -204,8 +204,10 @@ pub struct SpendBody {
#[prost(message, optional, tag = "6")]
pub nullifier: ::core::option::Option<super::super::sct::v1alpha1::Nullifier>,
/// The randomized validating key for the spend authorization signature.
#[prost(bytes = "vec", tag = "4")]
pub rk: ::prost::alloc::vec::Vec<u8>,
#[prost(message, optional, tag = "4")]
pub rk: ::core::option::Option<
super::super::super::super::crypto::decaf377_rdsa::v1alpha1::SpendVerificationKey,
>,
}
impl ::prost::Name for SpendBody {
const NAME: &'static str = "SpendBody";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1998,7 +1998,7 @@ impl serde::Serialize for SpendBody {
if self.nullifier.is_some() {
len += 1;
}
if !self.rk.is_empty() {
if self.rk.is_some() {
len += 1;
}
let mut struct_ser = serializer.serialize_struct("penumbra.core.component.shielded_pool.v1alpha1.SpendBody", len)?;
Expand All @@ -2008,9 +2008,8 @@ impl serde::Serialize for SpendBody {
if let Some(v) = self.nullifier.as_ref() {
struct_ser.serialize_field("nullifier", v)?;
}
if !self.rk.is_empty() {
#[allow(clippy::needless_borrow)]
struct_ser.serialize_field("rk", pbjson::private::base64::encode(&self.rk).as_str())?;
if let Some(v) = self.rk.as_ref() {
struct_ser.serialize_field("rk", v)?;
}
struct_ser.end()
}
Expand Down Expand Up @@ -2097,16 +2096,14 @@ impl<'de> serde::Deserialize<'de> for SpendBody {
if rk__.is_some() {
return Err(serde::de::Error::duplicate_field("rk"));
}
rk__ =
Some(map_.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0)
;
rk__ = map_.next_value()?;
}
}
}
Ok(SpendBody {
balance_commitment: balance_commitment__,
nullifier: nullifier__,
rk: rk__.unwrap_or_default(),
rk: rk__,
})
}
}
Expand Down
13 changes: 0 additions & 13 deletions crates/proto/src/gen/penumbra.core.keys.v1alpha1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -110,19 +110,6 @@ impl ::prost::Name for SpendKey {
}
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct SpendVerificationKey {
#[prost(bytes = "vec", tag = "1")]
pub inner: ::prost::alloc::vec::Vec<u8>,
}
impl ::prost::Name for SpendVerificationKey {
const NAME: &'static str = "SpendVerificationKey";
const PACKAGE: &'static str = "penumbra.core.keys.v1alpha1";
fn full_name() -> ::prost::alloc::string::String {
::prost::alloc::format!("penumbra.core.keys.v1alpha1.{}", Self::NAME)
}
}
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct FullViewingKey {
#[prost(bytes = "vec", tag = "1")]
pub inner: ::prost::alloc::vec::Vec<u8>,
Expand Down
94 changes: 0 additions & 94 deletions crates/proto/src/gen/penumbra.core.keys.v1alpha1.serde.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1207,100 +1207,6 @@ impl<'de> serde::Deserialize<'de> for SpendKey {
deserializer.deserialize_struct("penumbra.core.keys.v1alpha1.SpendKey", FIELDS, GeneratedVisitor)
}
}
impl serde::Serialize for SpendVerificationKey {
#[allow(deprecated)]
fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
use serde::ser::SerializeStruct;
let mut len = 0;
if !self.inner.is_empty() {
len += 1;
}
let mut struct_ser = serializer.serialize_struct("penumbra.core.keys.v1alpha1.SpendVerificationKey", len)?;
if !self.inner.is_empty() {
#[allow(clippy::needless_borrow)]
struct_ser.serialize_field("inner", pbjson::private::base64::encode(&self.inner).as_str())?;
}
struct_ser.end()
}
}
impl<'de> serde::Deserialize<'de> for SpendVerificationKey {
#[allow(deprecated)]
fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
const FIELDS: &[&str] = &[
"inner",
];

#[allow(clippy::enum_variant_names)]
enum GeneratedField {
Inner,
}
impl<'de> serde::Deserialize<'de> for GeneratedField {
fn deserialize<D>(deserializer: D) -> std::result::Result<GeneratedField, D::Error>
where
D: serde::Deserializer<'de>,
{
struct GeneratedVisitor;

impl<'de> serde::de::Visitor<'de> for GeneratedVisitor {
type Value = GeneratedField;

fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(formatter, "expected one of: {:?}", &FIELDS)
}

#[allow(unused_variables)]
fn visit_str<E>(self, value: &str) -> std::result::Result<GeneratedField, E>
where
E: serde::de::Error,
{
match value {
"inner" => Ok(GeneratedField::Inner),
_ => Err(serde::de::Error::unknown_field(value, FIELDS)),
}
}
}
deserializer.deserialize_identifier(GeneratedVisitor)
}
}
struct GeneratedVisitor;
impl<'de> serde::de::Visitor<'de> for GeneratedVisitor {
type Value = SpendVerificationKey;

fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
formatter.write_str("struct penumbra.core.keys.v1alpha1.SpendVerificationKey")
}

fn visit_map<V>(self, mut map_: V) -> std::result::Result<SpendVerificationKey, V::Error>
where
V: serde::de::MapAccess<'de>,
{
let mut inner__ = None;
while let Some(k) = map_.next_key()? {
match k {
GeneratedField::Inner => {
if inner__.is_some() {
return Err(serde::de::Error::duplicate_field("inner"));
}
inner__ =
Some(map_.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0)
;
}
}
}
Ok(SpendVerificationKey {
inner: inner__.unwrap_or_default(),
})
}
}
deserializer.deserialize_struct("penumbra.core.keys.v1alpha1.SpendVerificationKey", FIELDS, GeneratedVisitor)
}
}
impl serde::Serialize for WalletId {
#[allow(deprecated)]
fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
Expand Down
12 changes: 8 additions & 4 deletions crates/proto/src/gen/penumbra.core.transaction.v1alpha1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@ pub struct Transaction {
#[prost(message, optional, tag = "1")]
pub body: ::core::option::Option<TransactionBody>,
/// The binding signature is stored separately from the transaction body that it signs.
#[prost(bytes = "vec", tag = "2")]
pub binding_sig: ::prost::alloc::vec::Vec<u8>,
#[prost(message, optional, tag = "2")]
pub binding_sig: ::core::option::Option<
super::super::super::crypto::decaf377_rdsa::v1alpha1::BindingSignature,
>,
/// The root of some previous state of the state commitment tree, used as an anchor for all
/// ZK state transition proofs.
#[prost(message, optional, tag = "3")]
Expand Down Expand Up @@ -285,8 +287,10 @@ pub struct TransactionView {
#[prost(message, optional, tag = "1")]
pub body_view: ::core::option::Option<TransactionBodyView>,
/// The binding signature is stored separately from the transaction body that it signs.
#[prost(bytes = "vec", tag = "2")]
pub binding_sig: ::prost::alloc::vec::Vec<u8>,
#[prost(message, optional, tag = "2")]
pub binding_sig: ::core::option::Option<
super::super::super::crypto::decaf377_rdsa::v1alpha1::BindingSignature,
>,
/// The root of some previous state of the state commitment tree, used as an anchor for all
/// ZK state transition proofs.
#[prost(message, optional, tag = "3")]
Expand Down
Loading

0 comments on commit fa4fdbf

Please sign in to comment.