Skip to content

Commit 425a64b

Browse files
committed
Support save/load of parameters.
1 parent 7c1b4b2 commit 425a64b

5 files changed

Lines changed: 152 additions & 8 deletions

File tree

dart-bp/src/poseidon_impls/poseidon_2/params.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
use crate::poseidon_impls::utils::{mat_inverse, mat_vec_mul};
22
use crate::{Error, error::Result};
33
use ark_ff::PrimeField;
4+
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
45
use ark_std::{vec, vec::Vec};
56

6-
#[derive(Clone, Debug)]
7+
#[derive(Clone, Debug, CanonicalSerialize, CanonicalDeserialize)]
78
pub struct Poseidon2Params<F: PrimeField> {
89
pub state_size: usize,
910
/// sbox degree

src/bp/mod.rs

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ use ark_ff::{
55
PrimeField,
66
field_hashers::{DefaultFieldHasher, HashToField},
77
};
8-
use ark_serialize::CanonicalSerialize;
8+
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
9+
use ark_std::vec::Vec;
910

1011
use blake2::Blake2b512;
1112
use bounded_collections::Get;
@@ -166,6 +167,9 @@ lazy_static::lazy_static! {
166167
pub static ref POSEIDON_PARAMS: PoseidonParameters = PoseidonParameters::new().expect("Failed to create Poseidon parameters");
167168
}
168169

170+
#[cfg(feature = "std")]
171+
pub fn set_dart_gens(_gens: DartBPGenerators) {}
172+
169173
#[cfg(feature = "std")]
170174
pub fn dart_gens() -> &'static DartBPGenerators {
171175
&DART_GENS
@@ -174,17 +178,28 @@ pub fn dart_gens() -> &'static DartBPGenerators {
174178
#[cfg(not(feature = "std"))]
175179
static mut DART_GENS: Option<DartBPGenerators> = None;
176180

181+
#[cfg(not(feature = "std"))]
182+
#[allow(static_mut_refs)]
183+
pub fn set_dart_gens(gens: DartBPGenerators) {
184+
unsafe {
185+
DART_GENS = Some(gens);
186+
}
187+
}
188+
177189
#[cfg(not(feature = "std"))]
178190
#[allow(static_mut_refs)]
179191
pub fn dart_gens() -> &'static DartBPGenerators {
180192
unsafe {
181193
if DART_GENS.is_none() {
182-
DART_GENS = Some(DartBPGenerators::new(DART_GEN_DOMAIN));
194+
set_dart_gens(DartBPGenerators::new(DART_GEN_DOMAIN));
183195
}
184196
DART_GENS.as_ref().unwrap()
185197
}
186198
}
187199

200+
#[cfg(feature = "std")]
201+
pub fn set_poseidon_params(_params: PoseidonParameters) {}
202+
188203
#[cfg(feature = "std")]
189204
pub fn poseidon_params() -> &'static PoseidonParameters {
190205
&POSEIDON_PARAMS
@@ -193,18 +208,28 @@ pub fn poseidon_params() -> &'static PoseidonParameters {
193208
#[cfg(not(feature = "std"))]
194209
static mut POSEIDON_PARAMS: Option<PoseidonParameters> = None;
195210

211+
#[cfg(not(feature = "std"))]
212+
#[allow(static_mut_refs)]
213+
pub fn set_poseidon_params(params: PoseidonParameters) {
214+
unsafe {
215+
POSEIDON_PARAMS = Some(params);
216+
}
217+
}
218+
196219
#[cfg(not(feature = "std"))]
197220
#[allow(static_mut_refs)]
198221
pub fn poseidon_params() -> &'static PoseidonParameters {
199222
unsafe {
200223
if POSEIDON_PARAMS.is_none() {
201-
POSEIDON_PARAMS =
202-
Some(PoseidonParameters::new().expect("Failed to create Poseidon parameters"));
224+
set_poseidon_params(
225+
PoseidonParameters::new().expect("Failed to create Poseidon parameters"),
226+
);
203227
}
204228
POSEIDON_PARAMS.as_ref().unwrap()
205229
}
206230
}
207231

232+
#[derive(Clone, Debug, CanonicalSerialize, CanonicalDeserialize)]
208233
pub struct PoseidonParameters {
209234
pub params: Poseidon2Params<PallasScalar>,
210235
}

src/curve_tree/mod.rs

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,24 @@ static mut ASSET_COMMITMENT_PARAMETERS: Option<AssetCommitmentParameters<AssetTr
7070
#[cfg(not(feature = "std"))]
7171
static mut ACCOUNT_CURVE_TREE_PARAMETERS: Option<CurveTreeParameters<AccountTreeConfig>> = None;
7272

73+
#[cfg(feature = "std")]
74+
pub fn set_pallas_layer_parameters(
75+
_parameters: SingleLayerProofParametersNew<PallasParameters, VestaParams>,
76+
) {
77+
}
78+
7379
#[cfg(feature = "std")]
7480
pub fn get_pallas_layer_parameters()
7581
-> &'static SingleLayerProofParametersNew<PallasParameters, VestaParams> {
7682
&CURVE_TREE_PARAMETERS_PALLAS
7783
}
7884

85+
#[cfg(feature = "std")]
86+
pub fn set_vesta_layer_parameters(
87+
_parameters: SingleLayerProofParametersNew<VestaParameters, PallasParams>,
88+
) {
89+
}
90+
7991
#[cfg(feature = "std")]
8092
pub fn get_vesta_layer_parameters()
8193
-> &'static SingleLayerProofParametersNew<VestaParameters, PallasParams> {
@@ -92,11 +104,24 @@ pub fn get_asset_commitment_parameters() -> &'static AssetCommitmentParameters<A
92104
&ASSET_COMMITMENT_PARAMETERS
93105
}
94106

107+
#[cfg(feature = "std")]
108+
pub fn set_asset_commitment_parameters(_parameters: AssetCommitmentParameters<AssetTreeConfig>) {}
109+
95110
#[cfg(feature = "std")]
96111
pub fn get_account_curve_tree_parameters() -> &'static CurveTreeParameters<AccountTreeConfig> {
97112
&ACCOUNT_CURVE_TREE_PARAMETERS
98113
}
99114

115+
#[allow(static_mut_refs)]
116+
#[cfg(not(feature = "std"))]
117+
pub fn set_pallas_layer_parameters(
118+
parameters: SingleLayerProofParametersNew<PallasParameters, VestaParams>,
119+
) {
120+
unsafe {
121+
CURVE_TREE_PARAMETERS_PALLAS = Some(parameters);
122+
}
123+
}
124+
100125
#[allow(static_mut_refs)]
101126
#[cfg(not(feature = "std"))]
102127
pub fn get_pallas_layer_parameters()
@@ -110,12 +135,22 @@ pub fn get_pallas_layer_parameters()
110135
)
111136
.expect("Failed to create SingleLayerParameters for Pallas"),
112137
);
113-
CURVE_TREE_PARAMETERS_PALLAS = Some(parameters);
138+
set_pallas_layer_parameters(parameters);
114139
}
115140
CURVE_TREE_PARAMETERS_PALLAS.as_ref().unwrap()
116141
}
117142
}
118143

144+
#[allow(static_mut_refs)]
145+
#[cfg(not(feature = "std"))]
146+
pub fn set_vesta_layer_parameters(
147+
parameters: SingleLayerProofParametersNew<VestaParameters, PallasParams>,
148+
) {
149+
unsafe {
150+
CURVE_TREE_PARAMETERS_VESTA = Some(parameters);
151+
}
152+
}
153+
119154
#[allow(static_mut_refs)]
120155
#[cfg(not(feature = "std"))]
121156
pub fn get_vesta_layer_parameters()
@@ -129,7 +164,7 @@ pub fn get_vesta_layer_parameters()
129164
)
130165
.expect("Failed to create SingleLayerParameters for Vesta"),
131166
);
132-
CURVE_TREE_PARAMETERS_VESTA = Some(parameters);
167+
set_vesta_layer_parameters(parameters);
133168
}
134169
CURVE_TREE_PARAMETERS_VESTA.as_ref().unwrap()
135170
}
@@ -147,6 +182,14 @@ pub fn get_asset_curve_tree_parameters() -> &'static CurveTreeParameters<AssetTr
147182
}
148183
}
149184

185+
#[allow(static_mut_refs)]
186+
#[cfg(not(feature = "std"))]
187+
pub fn set_asset_commitment_parameters(parameters: AssetCommitmentParameters<AssetTreeConfig>) {
188+
unsafe {
189+
ASSET_COMMITMENT_PARAMETERS = Some(parameters);
190+
}
191+
}
192+
150193
#[allow(static_mut_refs)]
151194
#[cfg(not(feature = "std"))]
152195
pub fn get_asset_commitment_parameters() -> &'static AssetCommitmentParameters<AssetTreeConfig> {
@@ -158,7 +201,7 @@ pub fn get_asset_commitment_parameters() -> &'static AssetCommitmentParameters<A
158201
MAX_ASSET_KEYS,
159202
&tree_parameters.even_parameters.bp_gens(),
160203
);
161-
ASSET_COMMITMENT_PARAMETERS = Some(parameters);
204+
set_asset_commitment_parameters(parameters);
162205
}
163206
ASSET_COMMITMENT_PARAMETERS.as_ref().unwrap()
164207
}

src/error.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,10 @@ pub enum Error {
104104
#[error("Hex decode error")]
105105
HexDecodeError,
106106

107+
/// Scale decode error.
108+
#[error("Scale decode error")]
109+
DecodeError,
110+
107111
/// Too many keys in registration proof.
108112
#[error("Too many keys in registration proof")]
109113
TooManyKeysInRegProof,

src/lib.rs

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,74 @@ pub fn blake2_256<T: codec::Encode>(data: &T) -> [u8; 32] {
3434
type Blake2b256 = blake2::Blake2b<U32>;
3535
Blake2b256::digest(&data.encode()).into()
3636
}
37+
38+
pub mod init {
39+
use crate::{
40+
Error,
41+
curve_tree::{
42+
get_asset_commitment_parameters, get_pallas_layer_parameters,
43+
get_vesta_layer_parameters, set_asset_commitment_parameters,
44+
set_pallas_layer_parameters, set_vesta_layer_parameters,
45+
},
46+
dart_gens, poseidon_params, set_dart_gens, set_poseidon_params,
47+
};
48+
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
49+
use ark_std::vec::Vec;
50+
use codec::{Decode, Encode};
51+
52+
pub fn init_params() -> Result<usize, Error> {
53+
let mut total_size = 0;
54+
// Generate the curve tree parameters.
55+
let pallas_params = get_pallas_layer_parameters();
56+
total_size += pallas_params.compressed_size();
57+
let vesta_params = get_vesta_layer_parameters();
58+
total_size += vesta_params.compressed_size();
59+
let asset_commitment_params = get_asset_commitment_parameters();
60+
total_size += asset_commitment_params.compressed_size();
61+
62+
// Save the Dart BP parameters.
63+
let bp_params = dart_gens();
64+
total_size += bp_params.encoded_size();
65+
66+
// Save the Poseidon2 parameters.
67+
let poseidon_2_params = poseidon_params();
68+
total_size += poseidon_2_params.compressed_size();
69+
70+
Ok(total_size)
71+
}
72+
73+
pub fn save_params(mut buffer: &mut Vec<u8>) -> Result<usize, Error> {
74+
// Save the curve tree parameters.
75+
let pallas_params = get_pallas_layer_parameters();
76+
pallas_params.serialize_compressed(&mut buffer)?;
77+
let vesta_params = get_vesta_layer_parameters();
78+
vesta_params.serialize_compressed(&mut buffer)?;
79+
let asset_commitment_params = get_asset_commitment_parameters();
80+
asset_commitment_params.serialize_compressed(&mut buffer)?;
81+
82+
// Save the Dart BP parameters.
83+
let bp_params = dart_gens();
84+
bp_params.encode_to(buffer);
85+
86+
// Save the Poseidon2 parameters.
87+
let poseidon_2_params = poseidon_params();
88+
poseidon_2_params.serialize_compressed(&mut buffer)?;
89+
90+
Ok(buffer.len())
91+
}
92+
93+
pub fn load_params(mut buffer: &[u8]) -> Result<(), Error> {
94+
// Load the curve tree parameters.
95+
set_pallas_layer_parameters(CanonicalDeserialize::deserialize_compressed(&mut buffer)?);
96+
set_vesta_layer_parameters(CanonicalDeserialize::deserialize_compressed(&mut buffer)?);
97+
set_asset_commitment_parameters(CanonicalDeserialize::deserialize_compressed(&mut buffer)?);
98+
99+
// Load the Dart BP parameters.
100+
set_dart_gens(Decode::decode(&mut buffer).map_err(|_| Error::DecodeError)?);
101+
102+
// Load the Poseidon2 parameters.
103+
set_poseidon_params(CanonicalDeserialize::deserialize_compressed(&mut buffer)?);
104+
105+
Ok(())
106+
}
107+
}

0 commit comments

Comments
 (0)