Skip to content

Commit 6b89f64

Browse files
bounded vec
1 parent 2aad6fe commit 6b89f64

File tree

5 files changed

+53
-17
lines changed

5 files changed

+53
-17
lines changed

pallets/subtensor/src/lib.rs

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ pub mod pallet {
6767
traits::{
6868
tokens::fungible, OriginTrait, QueryPreimage, StorePreimage, UnfilteredDispatchable,
6969
},
70+
BoundedVec,
7071
};
7172
use frame_system::pallet_prelude::*;
7273
use sp_core::H256;
@@ -133,11 +134,31 @@ pub mod pallet {
133134
/// Struct for NeuronCertificate.
134135
pub type NeuronCertificateOf = NeuronCertificate;
135136
/// Data structure for NeuronCertificate information.
136-
#[freeze_struct("e6193a76002d491")]
137+
#[freeze_struct("1c232be200d9ec6c")]
137138
#[derive(Decode, Encode, Default, TypeInfo, PartialEq, Eq, Clone, Debug)]
138139
pub struct NeuronCertificate {
139-
/// The neuron certificate.
140-
pub certificate: Vec<u8>,
140+
/// The neuron TLS public key
141+
pub public_key: BoundedVec<u8, ConstU32<64>>,
142+
/// The algorithm used to generate the public key
143+
pub algorithm: u8,
144+
}
145+
146+
impl TryFrom<Vec<u8>> for NeuronCertificate {
147+
type Error = ();
148+
149+
fn try_from(value: Vec<u8>) -> Result<Self, Self::Error> {
150+
if value.len() > 65 {
151+
return Err(());
152+
}
153+
// take the first byte as the algorithm
154+
let algorithm = value.first().ok_or(())?;
155+
// and the rest as the public_key
156+
let certificate = value.get(1..).ok_or(())?.to_vec();
157+
Ok(Self {
158+
public_key: BoundedVec::try_from(certificate).map_err(|_| ())?,
159+
algorithm: *algorithm,
160+
})
161+
}
141162
}
142163

143164
/// Struct for Prometheus.

pallets/subtensor/src/subnets/serving.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,11 +92,9 @@ impl<T: Config> Pallet<T> {
9292

9393
// Check certificate
9494
if let Some(certificate) = certificate {
95-
NeuronCertificates::<T>::insert(
96-
netuid,
97-
hotkey_id.clone(),
98-
NeuronCertificate { certificate },
99-
)
95+
if let Ok(certificate) = NeuronCertificateOf::try_from(certificate) {
96+
NeuronCertificates::<T>::insert(netuid, hotkey_id.clone(), certificate)
97+
}
10098
}
10199

102100
// We insert the axon meta.

pallets/subtensor/tests/serving.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ fn test_serving_tls_ok() {
131131

132132
let stored_certificate = NeuronCertificates::<Test>::get(netuid, hotkey_account_id)
133133
.expect("Certificate should exist");
134-
assert_eq!(stored_certificate.certificate, certificate);
134+
assert_eq!(stored_certificate.public_key.clone().into_inner(), certificate.get(1..).expect("Certificate should exist"));
135135
let new_certificate = "UPDATED_CERT".as_bytes().to_vec();
136136
assert_ok!(SubtensorModule::serve_axon_tls(
137137
<<Test as Config>::RuntimeOrigin>::signed(hotkey_account_id),
@@ -147,7 +147,7 @@ fn test_serving_tls_ok() {
147147
));
148148
let stored_certificate = NeuronCertificates::<Test>::get(netuid, hotkey_account_id)
149149
.expect("Certificate should exist");
150-
assert_eq!(stored_certificate.certificate, new_certificate)
150+
assert_eq!(stored_certificate.public_key.clone().into_inner(), new_certificate.get(1..).expect("Certificate should exist"));
151151
});
152152
}
153153

pallets/subtensor/tests/swap_hotkey.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -319,9 +319,7 @@ fn test_swap_certificates() {
319319
let new_hotkey = U256::from(2);
320320
let coldkey = U256::from(3);
321321
let netuid = 0u16;
322-
let certificate = NeuronCertificate {
323-
certificate: vec![1, 2, 3],
324-
};
322+
let certificate = NeuronCertificate::try_from(vec![1, 2, 3]).unwrap();
325323
let mut weight = Weight::zero();
326324

327325
add_network(netuid, 0, 1);

pallets/subtensor/tests/uids.rs

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#![allow(clippy::unwrap_used)]
22

33
use crate::mock::*;
4-
use frame_support::assert_ok;
4+
use frame_support::{assert_err, assert_ok};
55
use frame_system::Config;
66
use pallet_subtensor::*;
77
use sp_core::U256;
@@ -33,9 +33,7 @@ fn test_replace_neuron() {
3333

3434
let new_hotkey_account_id = U256::from(2);
3535
let _new_colkey_account_id = U256::from(12345);
36-
let certificate = NeuronCertificate {
37-
certificate: vec![1, 2, 3],
38-
};
36+
let certificate = NeuronCertificate::try_from(vec![1, 2, 3]).unwrap();
3937

4038
//add network
4139
add_network(netuid, tempo, 0);
@@ -382,3 +380,24 @@ fn test_replace_neuron_multiple_subnets_unstake_all() {
382380
);
383381
});
384382
}
383+
384+
#[test]
385+
fn test_neuron_certificate() {
386+
new_test_ext(1).execute_with(|| {
387+
// 512 bits key
388+
let mut data = [0; 65].to_vec();
389+
assert_ok!(NeuronCertificate::try_from(data));
390+
391+
// 256 bits key
392+
data = [1; 33].to_vec();
393+
assert_ok!(NeuronCertificate::try_from(data));
394+
395+
// too much data
396+
data = [8; 88].to_vec();
397+
assert_err!(NeuronCertificate::try_from(data), ());
398+
399+
// no data
400+
data = vec![];
401+
assert_err!(NeuronCertificate::try_from(data), ());
402+
});
403+
}

0 commit comments

Comments
 (0)