Skip to content

Commit d19f9ff

Browse files
authored
Change runtime resolve address to return an ActorID (#549)
Co-authored-by: lyswifter <[email protected]>
1 parent 5633356 commit d19f9ff

File tree

14 files changed

+158
-116
lines changed

14 files changed

+158
-116
lines changed

actors/init/src/lib.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,10 @@ impl Actor {
6161

6262
log::trace!("called exec; params.code_cid: {:?}", &params.code_cid);
6363

64-
let caller_code = rt.get_actor_code_cid(&rt.message().caller()).ok_or_else(|| {
65-
actor_error!(illegal_state, "no code for caller as {}", rt.message().caller())
66-
})?;
64+
let caller_code =
65+
rt.get_actor_code_cid(&rt.message().caller().id().unwrap()).ok_or_else(|| {
66+
actor_error!(illegal_state, "no code for caller as {}", rt.message().caller())
67+
})?;
6768

6869
log::trace!("caller code CID: {:?}", &caller_code);
6970

actors/market/src/lib.rs

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,14 @@ fil_actors_runtime::wasm_trampoline!(Actor);
5454

5555
fn request_miner_control_addrs<BS, RT>(
5656
rt: &mut RT,
57-
miner_addr: Address,
57+
miner_id: ActorID,
5858
) -> Result<(Address, Address, Vec<Address>), ActorError>
5959
where
6060
BS: Blockstore,
6161
RT: Runtime<BS>,
6262
{
6363
let ret = rt.send(
64-
miner_addr,
64+
Address::new_id(miner_id),
6565
ext::miner::CONTROL_ADDRESSES_METHOD,
6666
RawBytes::default(),
6767
TokenAmount::zero(),
@@ -230,13 +230,13 @@ impl Actor {
230230

231231
// All deals should have the same provider so get worker once
232232
let provider_raw = params.deals[0].proposal.provider;
233-
let provider = rt.resolve_address(&provider_raw).ok_or_else(|| {
233+
let provider_id = rt.resolve_address(&provider_raw).ok_or_else(|| {
234234
actor_error!(not_found, "failed to resolve provider address {}", provider_raw)
235235
})?;
236236

237237
let code_id = rt
238-
.get_actor_code_cid(&provider)
239-
.ok_or_else(|| actor_error!(illegal_argument, "no code ID for address {}", provider))?;
238+
.get_actor_code_cid(&provider_id)
239+
.ok_or_else(|| actor_error!(not_found, "no code ID for address {}", provider_id))?;
240240

241241
if rt.resolve_builtin_actor_type(&code_id) != Some(Type::Miner) {
242242
return Err(actor_error!(
@@ -245,7 +245,7 @@ impl Actor {
245245
));
246246
}
247247

248-
let (_, worker, controllers) = request_miner_control_addrs(rt, provider)?;
248+
let (_, worker, controllers) = request_miner_control_addrs(rt, provider_id)?;
249249
let caller = rt.message().caller();
250250
let mut caller_ok = caller == worker;
251251
for controller in controllers.iter() {
@@ -259,7 +259,7 @@ impl Actor {
259259
forbidden,
260260
"caller {} is not worker or control address of provider {}",
261261
caller,
262-
provider
262+
provider_id
263263
));
264264
}
265265

@@ -291,14 +291,16 @@ impl Actor {
291291
continue;
292292
}
293293

294-
if deal.proposal.provider != provider && deal.proposal.provider != provider_raw {
294+
if deal.proposal.provider != Address::new_id(provider_id)
295+
&& deal.proposal.provider != provider_raw
296+
{
295297
info!(
296298
"invalid deal {}: cannot publish deals from multiple providers in one batch",
297299
di
298300
);
299301
continue;
300302
}
301-
let client = match rt.resolve_address(&deal.proposal.client) {
303+
let client_id = match rt.resolve_address(&deal.proposal.client) {
302304
Some(client) => client,
303305
_ => {
304306
info!(
@@ -310,17 +312,17 @@ impl Actor {
310312
};
311313

312314
// drop deals with insufficient lock up to cover costs
313-
let client_id = client.id().expect("resolved address should be an ID address");
314315
let mut client_lockup =
315316
total_client_lockup.get(&client_id).cloned().unwrap_or_default();
316317
client_lockup += deal.proposal.client_balance_requirement();
317318

318-
let client_balance_ok = msm.balance_covered(client, &client_lockup).map_err(|e| {
319-
e.downcast_default(
320-
ExitCode::USR_ILLEGAL_STATE,
321-
"failed to check client balance coverage",
322-
)
323-
})?;
319+
let client_balance_ok =
320+
msm.balance_covered(Address::new_id(client_id), &client_lockup).map_err(|e| {
321+
e.downcast_default(
322+
ExitCode::USR_ILLEGAL_STATE,
323+
"failed to check client balance coverage",
324+
)
325+
})?;
324326

325327
if !client_balance_ok {
326328
info!("invalid deal: {}: insufficient client funds to cover proposal cost", di);
@@ -329,8 +331,9 @@ impl Actor {
329331

330332
let mut provider_lockup = total_provider_lockup.clone();
331333
provider_lockup += &deal.proposal.provider_collateral;
332-
let provider_balance_ok =
333-
msm.balance_covered(provider, &provider_lockup).map_err(|e| {
334+
let provider_balance_ok = msm
335+
.balance_covered(Address::new_id(provider_id), &provider_lockup)
336+
.map_err(|e| {
334337
e.downcast_default(
335338
ExitCode::USR_ILLEGAL_STATE,
336339
"failed to check provider balance coverage",
@@ -346,9 +349,11 @@ impl Actor {
346349
// Normalise provider and client addresses in the proposal stored on chain.
347350
// Must happen after signature verification and before taking cid.
348351

349-
deal.proposal.provider = provider;
350-
deal.proposal.client = client;
351-
let pcid = cid(rt, &deal.proposal)?;
352+
deal.proposal.provider = Address::new_id(provider_id);
353+
deal.proposal.client = Address::new_id(client_id);
354+
let pcid = deal.proposal.cid().map_err(
355+
|e| actor_error!(illegal_argument; "failed to take cid of proposal {}: {}", di, e),
356+
)?;
352357

353358
// check proposalCids for duplication within message batch
354359
// check state PendingProposals for duplication across messages
@@ -372,7 +377,7 @@ impl Actor {
372377
*VERIFIED_REGISTRY_ACTOR_ADDR,
373378
crate::ext::verifreg::USE_BYTES_METHOD as u64,
374379
RawBytes::serialize(UseBytesParams {
375-
address: client,
380+
address: Address::new_id(client_id),
376381
deal_size: BigInt::from(deal.proposal.piece_size.0),
377382
})?,
378383
TokenAmount::zero(),
@@ -1320,13 +1325,15 @@ where
13201325
.get_actor_code_cid(&nominal)
13211326
.ok_or_else(|| actor_error!(illegal_argument, "no code for address {}", nominal))?;
13221327

1328+
let nominal_addr = Address::new_id(nominal);
1329+
13231330
if rt.resolve_builtin_actor_type(&code_id) == Some(Type::Miner) {
13241331
// Storage miner actor entry; implied funds recipient is the associated owner address.
13251332
let (owner_addr, worker_addr, _) = request_miner_control_addrs(rt, nominal)?;
1326-
return Ok((nominal, owner_addr, vec![owner_addr, worker_addr]));
1333+
return Ok((nominal_addr, owner_addr, vec![owner_addr, worker_addr]));
13271334
}
13281335

1329-
Ok((nominal, nominal, vec![nominal]))
1336+
Ok((nominal_addr, nominal_addr, vec![nominal_addr]))
13301337
}
13311338

13321339
/// Requests the current epoch target block reward from the reward actor.

actors/miner/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4025,7 +4025,7 @@ where
40254025
));
40264026
}
40274027

4028-
Ok(resolved)
4028+
Ok(Address::new_id(resolved))
40294029
}
40304030

40314031
/// Resolves an address to an ID address and verifies that it is address of an account actor with an associated BLS key.
@@ -4052,7 +4052,7 @@ where
40524052

40534053
if raw.protocol() != Protocol::BLS {
40544054
let ret = rt.send(
4055-
resolved,
4055+
Address::new_id(resolved),
40564056
ext::account::PUBKEY_ADDRESS_METHOD,
40574057
RawBytes::default(),
40584058
TokenAmount::zero(),
@@ -4067,7 +4067,7 @@ where
40674067
));
40684068
}
40694069
}
4070-
Ok(resolved)
4070+
Ok(Address::new_id(resolved))
40714071
}
40724072

40734073
fn burn_funds<BS, RT>(rt: &mut RT, amount: TokenAmount) -> Result<(), ActorError>

actors/multisig/src/lib.rs

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::collections::BTreeSet;
66
use fil_actors_runtime::cbor::serialize_vec;
77
use fil_actors_runtime::runtime::{ActorCode, Primitives, Runtime};
88
use fil_actors_runtime::{
9-
actor_error, cbor, make_empty_map, make_map_with_root, resolve_to_id_addr, ActorDowncast,
9+
actor_error, cbor, make_empty_map, make_map_with_root, resolve_to_actor_id, ActorDowncast,
1010
ActorError, Map, CALLER_TYPES_SIGNABLE, INIT_ACTOR_ADDR,
1111
};
1212
use fvm_ipld_blockstore::Blockstore;
@@ -73,18 +73,18 @@ impl Actor {
7373
let mut resolved_signers = Vec::with_capacity(params.signers.len());
7474
let mut dedup_signers = BTreeSet::new();
7575
for signer in &params.signers {
76-
let resolved = resolve_to_id_addr(rt, signer).map_err(|e| {
76+
let resolved = resolve_to_actor_id(rt, signer).map_err(|e| {
7777
e.downcast_default(
7878
ExitCode::USR_ILLEGAL_STATE,
79-
format!("failed to resolve addr {} to ID addr", signer),
79+
format!("failed to resolve addr {} to ID", signer),
8080
)
8181
})?;
82-
if !dedup_signers.insert(resolved.id().expect("address should be resolved")) {
82+
if !dedup_signers.insert(resolved) {
8383
return Err(
8484
actor_error!(illegal_argument; "duplicate signer not allowed: {}", signer),
8585
);
8686
}
87-
resolved_signers.push(resolved);
87+
resolved_signers.push(Address::new_id(resolved));
8888
}
8989

9090
if params.num_approvals_threshold > params.signers.len() as u64 {
@@ -299,10 +299,10 @@ impl Actor {
299299
{
300300
let receiver = rt.message().receiver();
301301
rt.validate_immediate_caller_is(std::iter::once(&receiver))?;
302-
let resolved_new_signer = resolve_to_id_addr(rt, &params.signer).map_err(|e| {
302+
let resolved_new_signer = resolve_to_actor_id(rt, &params.signer).map_err(|e| {
303303
e.downcast_default(
304304
ExitCode::USR_ILLEGAL_STATE,
305-
format!("failed to resolve address {}", params.signer),
305+
format!("failed to resolve address {} to ID", params.signer),
306306
)
307307
})?;
308308

@@ -314,12 +314,12 @@ impl Actor {
314314
SIGNERS_MAX
315315
));
316316
}
317-
if st.is_signer(&resolved_new_signer) {
317+
if st.is_signer(&Address::new_id(resolved_new_signer)) {
318318
return Err(actor_error!(forbidden, "{} is already a signer", resolved_new_signer));
319319
}
320320

321321
// Add signer and increase threshold if set
322-
st.signers.push(resolved_new_signer);
322+
st.signers.push(Address::new_id(resolved_new_signer));
323323
if params.increase {
324324
st.num_approvals_threshold += 1;
325325
}
@@ -336,15 +336,15 @@ impl Actor {
336336
{
337337
let receiver = rt.message().receiver();
338338
rt.validate_immediate_caller_is(std::iter::once(&receiver))?;
339-
let resolved_old_signer = resolve_to_id_addr(rt, &params.signer).map_err(|e| {
339+
let resolved_old_signer = resolve_to_actor_id(rt, &params.signer).map_err(|e| {
340340
e.downcast_default(
341341
ExitCode::USR_ILLEGAL_STATE,
342-
format!("failed to resolve address {}", params.signer),
342+
format!("failed to resolve address {} to ID", params.signer),
343343
)
344344
})?;
345345

346346
rt.transaction(|st: &mut State, rt| {
347-
if !st.is_signer(&resolved_old_signer) {
347+
if !st.is_signer(&Address::new_id(resolved_old_signer)) {
348348
return Err(actor_error!(forbidden, "{} is not a signer", resolved_old_signer));
349349
}
350350

@@ -374,13 +374,13 @@ impl Actor {
374374
}
375375

376376
// Remove approvals from removed signer
377-
st.purge_approvals(rt.store(), &resolved_old_signer).map_err(|e| {
377+
st.purge_approvals(rt.store(), &Address::new_id(resolved_old_signer)).map_err(|e| {
378378
e.downcast_default(
379379
ExitCode::USR_ILLEGAL_STATE,
380380
"failed to purge approvals of removed signer",
381381
)
382382
})?;
383-
st.signers.retain(|s| s != &resolved_old_signer);
383+
st.signers.retain(|s| s != &Address::new_id(resolved_old_signer));
384384

385385
Ok(())
386386
})?;
@@ -396,35 +396,35 @@ impl Actor {
396396
{
397397
let receiver = rt.message().receiver();
398398
rt.validate_immediate_caller_is(std::iter::once(&receiver))?;
399-
let from_resolved = resolve_to_id_addr(rt, &params.from).map_err(|e| {
399+
let from_resolved = resolve_to_actor_id(rt, &params.from).map_err(|e| {
400400
e.downcast_default(
401401
ExitCode::USR_ILLEGAL_STATE,
402-
format!("failed to resolve address {}", params.from),
402+
format!("failed to resolve address {} to ID", params.from),
403403
)
404404
})?;
405-
let to_resolved = resolve_to_id_addr(rt, &params.to).map_err(|e| {
405+
let to_resolved = resolve_to_actor_id(rt, &params.to).map_err(|e| {
406406
e.downcast_default(
407407
ExitCode::USR_ILLEGAL_STATE,
408-
format!("failed to resolve address {}", params.to),
408+
format!("failed to resolve address {} to ID", params.to),
409409
)
410410
})?;
411411

412412
rt.transaction(|st: &mut State, rt| {
413-
if !st.is_signer(&from_resolved) {
413+
if !st.is_signer(&Address::new_id(from_resolved)) {
414414
return Err(actor_error!(forbidden; "{} is not a signer", from_resolved));
415415
}
416416

417-
if st.is_signer(&to_resolved) {
417+
if st.is_signer(&Address::new_id(to_resolved)) {
418418
return Err(actor_error!(illegal_argument; "{} is already a signer", to_resolved));
419419
}
420420

421421
// Remove signer from state (retain preserves order of elements)
422-
st.signers.retain(|s| s != &from_resolved);
422+
st.signers.retain(|s| s != &Address::new_id(from_resolved));
423423

424424
// Add new signer
425-
st.signers.push(to_resolved);
425+
st.signers.push(Address::new_id(to_resolved));
426426

427-
st.purge_approvals(rt.store(), &from_resolved).map_err(|e| {
427+
st.purge_approvals(rt.store(), &Address::new_id(from_resolved)).map_err(|e| {
428428
e.downcast_default(
429429
ExitCode::USR_ILLEGAL_STATE,
430430
"failed to purge approvals of removed signer",

actors/paych/src/lib.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33

44
use fil_actors_runtime::runtime::builtins::Type;
55
use fil_actors_runtime::runtime::{ActorCode, Runtime};
6-
use fil_actors_runtime::{actor_error, cbor, resolve_to_id_addr, ActorDowncast, ActorError, Array};
6+
use fil_actors_runtime::{
7+
actor_error, cbor, resolve_to_actor_id, ActorDowncast, ActorError, Array,
8+
};
79
use fvm_ipld_blockstore::Blockstore;
810
use fvm_ipld_encoding::RawBytes;
911
use fvm_shared::address::Address;
@@ -73,10 +75,10 @@ impl Actor {
7375
BS: Blockstore,
7476
RT: Runtime<BS>,
7577
{
76-
let resolved = resolve_to_id_addr(rt, raw).map_err(|e| {
78+
let resolved = resolve_to_actor_id(rt, raw).map_err(|e| {
7779
e.downcast_default(
7880
ExitCode::USR_ILLEGAL_STATE,
79-
format!("failed to resolve address {}", raw),
81+
format!("failed to resolve address {} to ID", raw),
8082
)
8183
})?;
8284

@@ -94,7 +96,7 @@ impl Actor {
9496
typ
9597
))
9698
} else {
97-
Ok(resolved)
99+
Ok(Address::new_id(resolved))
98100
}
99101
}
100102

@@ -140,17 +142,17 @@ impl Actor {
140142
})?;
141143

142144
let pch_addr = rt.message().receiver();
143-
let svpch_id_addr = rt.resolve_address(&sv.channel_addr).ok_or_else(|| {
145+
let svpch_id = rt.resolve_address(&sv.channel_addr).ok_or_else(|| {
144146
actor_error!(
145147
illegal_argument,
146148
"voucher payment channel address {} does not resolve to an ID address",
147149
sv.channel_addr
148150
)
149151
})?;
150-
if pch_addr != svpch_id_addr {
152+
if pch_addr != Address::new_id(svpch_id) {
151153
return Err(actor_error!(illegal_argument;
152154
"voucher payment channel address {} does not match receiver {}",
153-
svpch_id_addr, pch_addr));
155+
svpch_id, pch_addr));
154156
}
155157

156158
if rt.curr_epoch() < sv.time_lock_min {

0 commit comments

Comments
 (0)