Skip to content

Commit 504294e

Browse files
committed
add the transaction struct
1 parent 251ec8f commit 504294e

File tree

4 files changed

+118
-2
lines changed

4 files changed

+118
-2
lines changed

native/aarm/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ edition = "2021"
1010
risc0-zkvm = { version = "1.1.2" }
1111
serde = { version = "1.0.197", default-features = false }
1212
compliance_circuit = { path = "../examples/compliance_circuit/methods", package = 'methods'}
13+
aarm_core = { path = "../aarm_core" }
1314

1415
[dev-dependencies]
1516
bincode = "1.3"
16-
serde_bytes = "0.11"
17-
aarm_core = { path = "../aarm_core" }
17+
serde_bytes = "0.11"

native/aarm/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
pub mod action;
2+
pub mod transaction;

native/aarm/src/transaction.rs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
use crate::action::Action;
2+
use aarm_core::delta_proof::{DeltaInstance, DeltaProof, DeltaWitness};
3+
use serde::{Deserialize, Serialize};
4+
5+
#[derive(Clone, Debug, Deserialize, Serialize)]
6+
pub struct Transaction {
7+
pub action: Vec<Action>,
8+
pub delta_proof: Delta,
9+
}
10+
11+
#[derive(Clone, Debug, Deserialize, Serialize)]
12+
pub enum Delta {
13+
Witness(DeltaWitness),
14+
Proof(DeltaProof),
15+
}
16+
17+
impl Transaction {
18+
pub fn new(action: Vec<Action>, delta: Delta) -> Self {
19+
Transaction {
20+
action,
21+
delta_proof: delta,
22+
}
23+
}
24+
25+
pub fn generate_delta_proof(&mut self) {
26+
match self.delta_proof {
27+
Delta::Witness(ref witness) => {
28+
let msg = self.get_delta_msg();
29+
let proof = DeltaProof::prove(&msg, witness);
30+
self.delta_proof = Delta::Proof(proof);
31+
}
32+
Delta::Proof(_) => {}
33+
}
34+
}
35+
36+
pub fn verify(&self) -> bool {
37+
match &self.delta_proof {
38+
Delta::Proof(ref proof) => {
39+
let msg = self.get_delta_msg();
40+
let instance = self.get_delta_instance();
41+
if DeltaProof::verify(&msg, proof, instance).is_err() {
42+
return false;
43+
}
44+
for action in &self.action {
45+
if !action.verify() {
46+
return false;
47+
}
48+
}
49+
true
50+
}
51+
Delta::Witness(_) => false,
52+
}
53+
}
54+
55+
pub fn get_delta_instance(&self) -> DeltaInstance {
56+
unimplemented!()
57+
}
58+
59+
pub fn get_delta_msg(&self) -> Vec<u8> {
60+
unimplemented!()
61+
}
62+
}

native/aarm_core/src/delta_proof.rs

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
use k256::ecdsa::{Error, RecoveryId, Signature, SigningKey, VerifyingKey};
22
use k256::{elliptic_curve::ScalarPrimitive, ProjectivePoint, PublicKey, Scalar, SecretKey};
3+
use serde::{Deserialize, Serialize};
34
use sha3::{Digest, Keccak256};
45

6+
#[derive(Clone, Debug)]
57
pub struct DeltaProof {
68
pub signature: Signature,
79
pub recid: RecoveryId,
810
}
911

12+
#[derive(Clone, Debug)]
1013
pub struct DeltaWitness {
1114
pub signing_key: SigningKey,
1215
}
@@ -79,6 +82,13 @@ impl DeltaWitness {
7982
pub fn to_bytes(&self) -> [u8; 32] {
8083
self.signing_key.to_bytes().into()
8184
}
85+
86+
pub fn compose(&mut self, other: &DeltaWitness) {
87+
let sum = self.signing_key.as_nonzero_scalar().as_ref()
88+
+ other.signing_key.as_nonzero_scalar().as_ref();
89+
let sk: SecretKey = SecretKey::new(sum.into());
90+
self.signing_key = SigningKey::from(sk);
91+
}
8292
}
8393

8494
impl DeltaInstance {
@@ -92,6 +102,49 @@ impl DeltaInstance {
92102
}
93103
}
94104

105+
impl Serialize for DeltaProof {
106+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
107+
where
108+
S: serde::Serializer,
109+
{
110+
serializer.serialize_bytes(&self.to_bytes())
111+
}
112+
}
113+
114+
impl<'de> Deserialize<'de> for DeltaProof {
115+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
116+
where
117+
D: serde::Deserializer<'de>,
118+
{
119+
let bytes: Vec<u8> = serde_bytes::deserialize(deserializer)?;
120+
if bytes.len() != 65 {
121+
return Err(serde::de::Error::custom(
122+
"Invalid byte length for DeltaProof",
123+
));
124+
}
125+
Ok(DeltaProof::from_bytes(&bytes))
126+
}
127+
}
128+
129+
impl Serialize for DeltaWitness {
130+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
131+
where
132+
S: serde::Serializer,
133+
{
134+
serializer.serialize_bytes(&self.to_bytes())
135+
}
136+
}
137+
138+
impl<'de> Deserialize<'de> for DeltaWitness {
139+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
140+
where
141+
D: serde::Deserializer<'de>,
142+
{
143+
let bytes = <[u8; 32]>::deserialize(deserializer)?;
144+
Ok(DeltaWitness::from_bytes(&bytes))
145+
}
146+
}
147+
95148
#[test]
96149
fn test_delta_proof() {
97150
use k256::elliptic_curve::rand_core::OsRng;

0 commit comments

Comments
 (0)