Skip to content

Commit 94ecfe2

Browse files
fix: notaries cannot remove datacap from verifreg (#784)
* remove_verified_client_data_cap cannot remove datacap from verifreg actor * Verifreg test: fail to remove datacap of the verifreg itself * Verifreg: fix error message Co-authored-by: Aayush <arajasek94@gmail.com>
1 parent 09ba8a5 commit 94ecfe2

File tree

2 files changed

+68
-4
lines changed

2 files changed

+68
-4
lines changed

actors/verifreg/src/lib.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use fil_actors_runtime::runtime::{ActorCode, Policy, Runtime};
2424
use fil_actors_runtime::{
2525
actor_error, cbor, make_map_with_root_and_bitwidth, resolve_to_actor_id, ActorDowncast,
2626
ActorError, BatchReturn, Map, DATACAP_TOKEN_ACTOR_ADDR, STORAGE_MARKET_ACTOR_ADDR,
27-
SYSTEM_ACTOR_ADDR,
27+
SYSTEM_ACTOR_ADDR, VERIFIED_REGISTRY_ACTOR_ADDR,
2828
};
2929
use fil_actors_runtime::{ActorContext, AsActorError, BatchReturnGen};
3030

@@ -243,6 +243,13 @@ impl Actor {
243243
rt.transaction(|st: &mut State, rt| {
244244
rt.validate_immediate_caller_is(std::iter::once(&st.root_key))?;
245245

246+
if params.verified_client_to_remove == VERIFIED_REGISTRY_ACTOR_ADDR {
247+
return Err(actor_error!(
248+
illegal_argument,
249+
"cannot remove data cap from verified registry itself"
250+
));
251+
}
252+
246253
if !is_verifier(rt, st, verifier_1)? {
247254
return Err(actor_error!(not_found, "{} is not a verifier", verifier_1));
248255
}

test_vm/tests/verifreg_remove_datacap_test.rs

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ use fil_actor_datacap::{
1515
DestroyParams, Method as DataCapMethod, MintParams, State as DataCapState,
1616
};
1717
use fil_actor_verifreg::{
18-
AddVerifierClientParams, RemoveDataCapParams, RemoveDataCapRequest, RemoveDataCapReturn,
19-
SIGNATURE_DOMAIN_SEPARATION_REMOVE_DATA_CAP,
18+
AddVerifierClientParams, DataCap, RemoveDataCapParams, RemoveDataCapRequest,
19+
RemoveDataCapReturn, SIGNATURE_DOMAIN_SEPARATION_REMOVE_DATA_CAP,
2020
};
2121
use fil_actor_verifreg::{AddrPairKey, Method as VerifregMethod};
2222
use fil_actor_verifreg::{RemoveDataCapProposal, RemoveDataCapProposalID, State as VerifregState};
@@ -25,7 +25,7 @@ use fil_actors_runtime::{
2525
make_map_with_root_and_bitwidth, DATACAP_TOKEN_ACTOR_ADDR, STORAGE_MARKET_ACTOR_ADDR,
2626
VERIFIED_REGISTRY_ACTOR_ADDR,
2727
};
28-
use test_vm::util::{apply_ok, create_accounts, verifreg_add_verifier};
28+
use test_vm::util::{apply_code, apply_ok, create_accounts, verifreg_add_verifier};
2929
use test_vm::{ExpectInvocation, TEST_VERIFREG_ROOT_ADDR, VM};
3030

3131
#[test]
@@ -267,6 +267,63 @@ fn remove_datacap_simple_successful_path() {
267267
assert_eq!(2u64, verifier2_proposal_id.id);
268268
v.assert_state_invariants();
269269
}
270+
#[test]
271+
fn remove_datacap_fails_on_verifreg() {
272+
let store = MemoryBlockstore::new();
273+
let v = VM::new_with_singletons(&store);
274+
let addrs = create_accounts(&v, 2, TokenAmount::from_whole(10_000));
275+
let (verifier1, verifier2) = (addrs[0], addrs[1]);
276+
277+
let verifier1_id_addr = v.normalize_address(&verifier1).unwrap();
278+
let verifier2_id_addr = v.normalize_address(&verifier2).unwrap();
279+
let verifier_allowance = StoragePower::from(2 * 1048576u64);
280+
let allowance_to_remove: StoragePower = DataCap::from(100);
281+
282+
// register verifier1 and verifier2
283+
verifreg_add_verifier(&v, verifier1, verifier_allowance.clone());
284+
verifreg_add_verifier(&v, verifier2, verifier_allowance);
285+
286+
let remove_proposal = RemoveDataCapProposal {
287+
verified_client: VERIFIED_REGISTRY_ACTOR_ADDR,
288+
data_cap_amount: allowance_to_remove.clone(),
289+
removal_proposal_id: RemoveDataCapProposalID { id: 0 },
290+
};
291+
292+
let mut remove_proposal_ser = to_vec(&remove_proposal).unwrap();
293+
let mut remove_proposal_payload = SIGNATURE_DOMAIN_SEPARATION_REMOVE_DATA_CAP.to_vec();
294+
remove_proposal_payload.append(&mut remove_proposal_ser);
295+
296+
let remove_datacap_params = RemoveDataCapParams {
297+
verified_client_to_remove: VERIFIED_REGISTRY_ACTOR_ADDR,
298+
data_cap_amount_to_remove: allowance_to_remove,
299+
verifier_request_1: RemoveDataCapRequest {
300+
verifier: verifier1_id_addr,
301+
signature: Signature {
302+
sig_type: SignatureType::Secp256k1,
303+
bytes: remove_proposal_payload.clone(),
304+
},
305+
},
306+
verifier_request_2: RemoveDataCapRequest {
307+
verifier: verifier2_id_addr,
308+
signature: Signature {
309+
sig_type: SignatureType::Secp256k1,
310+
bytes: remove_proposal_payload,
311+
},
312+
},
313+
};
314+
315+
apply_code(
316+
&v,
317+
TEST_VERIFREG_ROOT_ADDR,
318+
VERIFIED_REGISTRY_ACTOR_ADDR,
319+
TokenAmount::zero(),
320+
VerifregMethod::RemoveVerifiedClientDataCap as u64,
321+
remove_datacap_params,
322+
ExitCode::USR_ILLEGAL_ARGUMENT,
323+
);
324+
325+
v.assert_state_invariants();
326+
}
270327

271328
fn expect_remove_datacap(params: &RemoveDataCapParams) -> ExpectInvocation {
272329
ExpectInvocation {

0 commit comments

Comments
 (0)