Skip to content

Commit

Permalink
verifreg: Avoid re-using state between transactions (#1220)
Browse files Browse the repository at this point in the history
  • Loading branch information
Stebalien committed Mar 2, 2023
1 parent 598a7a8 commit f9b633b
Showing 1 changed file with 29 additions and 33 deletions.
62 changes: 29 additions & 33 deletions actors/verifreg/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,6 @@ impl Actor {
}

let verifier = resolve_to_actor_id(rt, &params.address, true)?;

let verifier = Address::new_id(verifier);

let st: State = rt.state()?;
Expand Down Expand Up @@ -138,10 +137,8 @@ impl Actor {
let verifier = resolve_to_actor_id(rt, &params, false)?;
let verifier = Address::new_id(verifier);

let state: State = rt.state()?;
rt.validate_immediate_caller_is(std::iter::once(&state.root_key))?;

rt.transaction(|st: &mut State, rt| {
rt.validate_immediate_caller_is(std::iter::once(&st.root_key))?;
st.remove_verifier(rt.store(), &verifier).context("failed to remove verifier")
})
}
Expand All @@ -165,39 +162,38 @@ impl Actor {
let client = resolve_to_actor_id(rt, &params.address, true)?;
let client = Address::new_id(client);

let st: State = rt.state()?;
if client == st.root_key {
return Err(actor_error!(illegal_argument, "root cannot be added as client"));
}
rt.transaction(|st: &mut State, rt| {
if client == st.root_key {
return Err(actor_error!(illegal_argument, "root cannot be added as client"));
}

// Validate caller is one of the verifiers, i.e. has an allowance (even if zero).
let verifier = rt.message().caller();
let verifier_cap = st
.get_verifier_cap(rt.store(), &verifier)?
.ok_or_else(|| actor_error!(not_found, "caller {} is not a verifier", verifier))?;
// Validate caller is one of the verifiers, i.e. has an allowance (even if zero).
let verifier = rt.message().caller();
let verifier_cap = st
.get_verifier_cap(rt.store(), &verifier)?
.ok_or_else(|| actor_error!(not_found, "caller {} is not a verifier", verifier))?;

// Disallow existing verifiers as clients.
if st.get_verifier_cap(rt.store(), &client)?.is_some() {
return Err(actor_error!(
illegal_argument,
"verifier {} cannot be added as a verified client",
client
));
}
// Disallow existing verifiers as clients.
if st.get_verifier_cap(rt.store(), &client)?.is_some() {
return Err(actor_error!(
illegal_argument,
"verifier {} cannot be added as a verified client",
client
));
}

// Compute new verifier allowance.
if verifier_cap < params.allowance {
return Err(actor_error!(
illegal_argument,
"add more DataCap {} for client than allocated {}",
params.allowance,
verifier_cap
));
}
// Compute new verifier allowance.
if verifier_cap < params.allowance {
return Err(actor_error!(
illegal_argument,
"add more DataCap {} for client than allocated {}",
params.allowance,
verifier_cap
));
}

// Reduce verifier's cap.
let new_verifier_cap = verifier_cap - &params.allowance;
rt.transaction(|st: &mut State, rt| {
// Reduce verifier's cap.
let new_verifier_cap = verifier_cap - &params.allowance;
st.put_verifier(rt.store(), &verifier, &new_verifier_cap)
.context("failed to update verifier allowance")
})?;
Expand Down

0 comments on commit f9b633b

Please sign in to comment.