diff --git a/src/message_pool/msgpool/mod.rs b/src/message_pool/msgpool/mod.rs index 98720eefd97..94c112a92f0 100644 --- a/src/message_pool/msgpool/mod.rs +++ b/src/message_pool/msgpool/mod.rs @@ -65,7 +65,11 @@ where // Only republish messages from local addresses, ie. transactions which were // sent to this node directly. for actor in local_addrs.read().iter() { - let resolved = resolve_to_key(api, key_cache, actor, &ts)?; + let Ok(resolved) = resolve_to_key(api, key_cache, actor, &ts).inspect_err(|e| { + tracing::debug!(%actor, "republish: failed to resolve address: {e:#}"); + }) else { + continue; + }; if let Some(mset) = pending.read().get(&resolved) { if mset.msgs.is_empty() { continue; @@ -339,8 +343,9 @@ impl MpoolCtx<'_, T> { .get_mut(from) .and_then(|temp| temp.remove(&sequence)) .is_none() + && let Ok(resolved) = resolve_to_key(self.api, self.key_cache, from, self.ts) + .inspect_err(|e| tracing::debug!(%from, "remove: failed to resolve address: {e:#}")) { - let resolved = resolve_to_key(self.api, self.key_cache, from, self.ts)?; remove(&resolved, self.pending, sequence, true)?; } Ok(()) diff --git a/src/message_pool/msgpool/msg_pool.rs b/src/message_pool/msgpool/msg_pool.rs index f5bbad85ab3..bdc55a99200 100644 --- a/src/message_pool/msgpool/msg_pool.rs +++ b/src/message_pool/msgpool/msg_pool.rs @@ -608,7 +608,10 @@ where /// messages found, return None result type. pub fn pending_for(&self, a: &Address) -> Option> { let cur_ts = self.current_tipset(); - let resolved = self.resolve_to_key(a, &cur_ts).ok()?; + let resolved = self + .resolve_to_key(a, &cur_ts) + .inspect_err(|e| tracing::debug!(%a, "pending_for: failed to resolve address: {e:#}")) + .ok()?; let pending = self.pending.read(); let mset = pending.get(&resolved)?; if mset.msgs.is_empty() { diff --git a/src/message_pool/msgpool/provider.rs b/src/message_pool/msgpool/provider.rs index 5a9598cc13e..23d9dc6eda6 100644 --- a/src/message_pool/msgpool/provider.rs +++ b/src/message_pool/msgpool/provider.rs @@ -101,11 +101,7 @@ impl Provider for ChainStore { .map_err(|err| err.into()) } - // NOTE: Lotus resolves to deterministic address at finality to guarantee - // the ID→key mapping is reorg-stable. We currently resolve against the - // tipset's parent state, which is safe but does not provide the same - // reorg-safety guarantee. - // See https://github.com/filecoin-project/lotus/blob/006da4c7e1c1c29ac02b32112c0d205e4085ba35/chain/stmgr/stmgr.go#L347 + // TODO(forest): https://github.com/ChainSafe/forest/issues/6891 fn resolve_to_key(&self, addr: &Address, ts: &Tipset) -> Result { let state = StateTree::new_from_root(self.blockstore().clone(), ts.parent_state()) .map_err(|e| Error::Other(e.to_string()))?;