diff --git a/c-pallets/sminer/src/constants.rs b/c-pallets/sminer/src/constants.rs index b72c92da..83038996 100644 --- a/c-pallets/sminer/src/constants.rs +++ b/c-pallets/sminer/src/constants.rs @@ -1,5 +1,7 @@ use super::*; +pub(super) const STATE_NOT_READY: &str = "not ready"; + pub(super) const STATE_POSITIVE: &str = "positive"; pub(super) const STATE_FROZEN: &str = "frozen"; diff --git a/c-pallets/sminer/src/functions.rs b/c-pallets/sminer/src/functions.rs index 18a032e6..ca6aeb25 100644 --- a/c-pallets/sminer/src/functions.rs +++ b/c-pallets/sminer/src/functions.rs @@ -128,7 +128,8 @@ impl Pallet { pub(super) fn withdraw(acc: &AccountOf) -> DispatchResult { let miner_info = >::try_get(acc).map_err(|_| Error::::NotMiner)?; T::Currency::unreserve(acc, miner_info.collaterals); - let encoding = miner_info.space_proof_info.pois_key.encode(); + let space_proof_info = miner_info.space_proof_info.ok_or(Error::::NotpositiveState)?; + let encoding = space_proof_info.pois_key.encode(); let hashing = sp_io::hashing::sha2_256(&encoding); MinerPublicKey::::remove(hashing); >::remove(acc); diff --git a/c-pallets/sminer/src/helper.rs b/c-pallets/sminer/src/helper.rs index 79faf2d3..cac9397e 100644 --- a/c-pallets/sminer/src/helper.rs +++ b/c-pallets/sminer/src/helper.rs @@ -13,20 +13,24 @@ impl Pallet { // check state ensure!(miner_info.state.to_vec() == STATE_POSITIVE.as_bytes().to_vec(), Error::::NotpositiveState); - ensure!(miner_info.space_proof_info.rear < rear, Error::::CountError); + let mut space_proof_info = miner_info.space_proof_info.clone().ok_or(Error::::NotpositiveState)?; - let count = rear.checked_sub(miner_info.space_proof_info.rear).ok_or(Error::::Overflow)?; + ensure!(space_proof_info.rear < rear, Error::::CountError); + + let count = rear.checked_sub(space_proof_info.rear).ok_or(Error::::Overflow)?; let idle_space = IDLE_SEG_SIZE.checked_mul(count as u128).ok_or(Error::::Overflow)?; - miner_info.space_proof_info.rear = rear; + space_proof_info.rear = rear; - miner_info.space_proof_info.accumulator = accumulator; + space_proof_info.accumulator = accumulator; miner_info.idle_space = miner_info.idle_space.checked_add(idle_space).ok_or(Error::::Overflow)?; miner_info.tee_signature = tee_sig; + miner_info.space_proof_info = Some(space_proof_info); + Ok(idle_space) }) } @@ -40,16 +44,20 @@ impl Pallet { MinerItems::::try_mutate(acc, |miner_info_opt| -> Result { let miner_info = miner_info_opt.as_mut().ok_or(Error::::NotMiner)?; - ensure!(miner_info.space_proof_info.front < front, Error::::CountError); + let mut space_proof_info = miner_info.space_proof_info.clone().ok_or(Error::::NotpositiveState)?; - let count = front - miner_info.space_proof_info.front; + ensure!(space_proof_info.front < front, Error::::CountError); - miner_info.space_proof_info.front = front; + let count = front - space_proof_info.front; - miner_info.space_proof_info.accumulator = accumulator; + space_proof_info.front = front; + + space_proof_info.accumulator = accumulator; miner_info.tee_signature = tee_sig; + miner_info.space_proof_info = Some(space_proof_info); + Ok(count) }) } @@ -249,7 +257,8 @@ impl Pallet { T::StorageHandle::sub_total_idle_space(miner.idle_space)?; Self::create_restoral_target(acc, miner.service_space)?; miner.state = Self::str_to_bound(STATE_OFFLINE)?; - let encoding = miner.space_proof_info.pois_key.encode(); + let space_proof_info = miner.space_proof_info.clone().ok_or(Error::::NotpositiveState)?; + let encoding = space_proof_info.pois_key.encode(); let hashing = sp_io::hashing::sha2_256(&encoding); MinerPublicKey::::remove(hashing); Ok(()) diff --git a/c-pallets/sminer/src/lib.rs b/c-pallets/sminer/src/lib.rs index 2467fc2f..2af4468c 100644 --- a/c-pallets/sminer/src/lib.rs +++ b/c-pallets/sminer/src/lib.rs @@ -313,29 +313,12 @@ pub mod pallet { beneficiary: AccountOf, peer_id: PeerId, staking_val: BalanceOf, - pois_key: PoISKey, - tee_sig: TeeRsaSignature, ) -> DispatchResult { let sender = ensure_signed(origin)?; ensure!(!(>::contains_key(&sender)), Error::::AlreadyRegistered); ensure!(staking_val >= BASE_LIMIT.try_into().map_err(|_| Error::::Overflow)?, Error::::CollateralNotUp); T::Currency::reserve(&sender, staking_val)?; - let space_proof_info = SpaceProofInfo::> { - miner: sender.clone(), - front: u64::MIN, - rear: u64::MIN, - pois_key: pois_key.clone(), - accumulator: pois_key.g, - }; - - let encoding = space_proof_info.encode(); - let original_text = sp_io::hashing::sha2_256(&encoding); - let tee_puk = T::TeeWorkerHandler::get_tee_publickey()?; - ensure!(verify_rsa(&tee_puk, &original_text, &tee_sig), Error::::VerifyTeeSigFailed); - - MinerPublicKey::::insert(&original_text, sender.clone()); - >::insert( &sender, MinerInfo:: { @@ -343,23 +326,16 @@ pub mod pallet { peer_id: peer_id, collaterals: staking_val, debt: BalanceOf::::zero(), - state: Self::str_to_bound(STATE_POSITIVE)?, + state: Self::str_to_bound(STATE_NOT_READY)?, idle_space: u128::MIN, service_space: u128::MIN, lock_space: u128::MIN, - space_proof_info, + space_proof_info: Option::None, service_bloom_filter: Default::default(), - tee_signature: tee_sig, + tee_signature: [0u8; 256], }, ); - AllMiner::::try_mutate(|all_miner| -> DispatchResult { - all_miner - .try_push(sender.clone()) - .map_err(|_e| Error::::StorageLimitReached)?; - Ok(()) - })?; - RewardMap::::insert( &sender, Reward::{ @@ -378,6 +354,53 @@ pub mod pallet { Ok(()) } + #[pallet::call_index(16)] + #[transactional] + #[pallet::weight(Weight::zero())] + pub fn register_pois_key( + origin: OriginFor, + pois_key: PoISKey>, + tee_sig: TeeRsaSignature + ) -> DispatchResult { + let sender = ensure_signed(origin)?; + // Because the next operation consumes system resources, make a judgment in advance. + ensure!(>::contains_key(&sender), Error::::NotMiner); + + let space_proof_info = SpaceProofInfo::> { + miner: sender.clone(), + front: u64::MIN, + rear: u64::MIN, + pois_key: pois_key.clone(), + accumulator: pois_key.g, + }; + + let encoding = space_proof_info.encode(); + let original_text = sp_io::hashing::sha2_256(&encoding); + let tee_puk = T::TeeWorkerHandler::get_tee_publickey()?; + ensure!(verify_rsa(&tee_puk, &original_text, &tee_sig), Error::::VerifyTeeSigFailed); + + MinerPublicKey::::insert(&original_text, sender.clone()); + + >::try_mutate(&sender, |info_opt| -> DispatchResult { + let miner_info = info_opt.as_mut().ok_or(Error::::NotMiner)?; + ensure!(STATE_NOT_READY.as_bytes().to_vec() == miner_info.state.to_vec(), Error::::StateError); + + miner_info.space_proof_info = Some(space_proof_info); + miner_info.state = Self::str_to_bound(STATE_POSITIVE)?; + miner_info.tee_signature = tee_sig; + + Ok(()) + })?; + + AllMiner::::try_mutate(|all_miner| -> DispatchResult { + all_miner + .try_push(sender.clone()) + .map_err(|_e| Error::::StorageLimitReached)?; + Ok(()) + })?; + + Ok(()) + } /// Increase Collateral and Update Miner's State /// @@ -1026,7 +1049,8 @@ impl MinerControl<::AccountId, BlockNumber } //There is a judgment on whether the primary key exists above let miner_info = >::try_get(miner).map_err(|_| Error::::NotMiner)?; - Ok((miner_info.idle_space, miner_info.service_space, miner_info.service_bloom_filter, miner_info.space_proof_info, miner_info.tee_signature)) + let space_proof_info = miner_info.space_proof_info.ok_or(Error::::Unexpected)?; + Ok((miner_info.idle_space, miner_info.service_space, miner_info.service_bloom_filter, space_proof_info, miner_info.tee_signature)) } fn update_restoral_target(miner: &AccountOf, service_space: u128) -> DispatchResult { diff --git a/c-pallets/sminer/src/types.rs b/c-pallets/sminer/src/types.rs index e3b35ccd..37b5c073 100644 --- a/c-pallets/sminer/src/types.rs +++ b/c-pallets/sminer/src/types.rs @@ -16,7 +16,7 @@ pub struct MinerInfo { pub(super) idle_space: u128, pub(super) service_space: u128, pub(super) lock_space: u128, - pub(super) space_proof_info: SpaceProofInfo>, + pub(super) space_proof_info: Option>>, pub(super) service_bloom_filter: BloomFilter, pub(super) tee_signature: TeeRsaSignature, } diff --git a/primitives/common/src/lib.rs b/primitives/common/src/lib.rs index f1220ea8..889016aa 100644 --- a/primitives/common/src/lib.rs +++ b/primitives/common/src/lib.rs @@ -18,7 +18,8 @@ pub struct Hash(pub [u8; 64]); pub struct TryFromSliceError(()); #[derive(PartialEq, Eq, Encode, Decode, Clone, RuntimeDebug, MaxEncodedLen, TypeInfo)] -pub struct PoISKey { +pub struct PoISKey { + pub acc: AccountId, pub g: [u8; 256], pub n: [u8; 256], } @@ -28,7 +29,7 @@ pub struct SpaceProofInfo { pub miner: AccountId, pub front: u64, pub rear: u64, - pub pois_key: PoISKey, + pub pois_key: PoISKey, pub accumulator: Accumulator, }