Skip to content

feat(node): sign an inconclusive when no V2 verdict can reach the threshold - #5145

Draft
haiyuechen-nearone wants to merge 9 commits into
5125-retry-v2-foreign-tx-attempts-within-a-13-second-deadlinefrom
5126-sign-an-inconclusive-for-v2-foreign-tx-requests
Draft

haiyuechen-nearone wants to merge 9 commits into
5125-retry-v2-foreign-tx-attempts-within-a-13-second-deadlinefrom
5126-sign-an-inconclusive-for-v2-foreign-tx-requests

Conversation

@haiyuechen-nearone

@haiyuechen-nearone haiyuechen-nearone commented Nov 11, 2026 •

Copy link
Copy Markdown
Contributor

Closes #5126

When the signed outcomes show that no verdict can reach t, even counting every supporter not heard from yet, an acting leader gets the network to sign Inconclusive, with those outcomes as evidence. Signers check the same counting rule before they join.

Reviewer notes:

  • counting_rule.rs decides the inconclusive and its cause. Leaving statements out only makes it harder to prove, so a leader cannot force it while t nodes agree on one verdict.

  • The asset is drawn among nodes that sent an outcome and did not sign two different ones, the leader included. Every round participant must have one statement in the evidence. Retries and the round cap are shared with verdict rounds.

  • A node that signed two outcomes counts as heard for no verdict. The leader keeps both statements in the evidence, so the evidence bound is twice the supporter count.

  • The metric mpc_num_verify_foreign_tx_inconclusives has labels cause and chain only, published for every configured chain. An e2e test covers a disagreement.

  • The transient quorum and separate inconclusive task of the old model are gone. sign_v2/leader.rs is 550 lines.

An acting leader whose attempts show a disagreement, or transient errors
from enough nodes, runs up to three inconclusive rounds. Each round sends
the signed node outcomes as evidence right after the Start, and signers
join only for an acting leader with valid evidence. A signed inconclusive
raises a metric labelled with its cause, its chain and the nodes involved.
…adline' into 5126-sign-an-inconclusive-for-v2-foreign-tx-requests

# Conflicts:
#	crates/e2e-tests/tests/read_rpc.rs
#	crates/node/src/mpc_client/verify_foreign_tx_v2.rs
#	crates/node/src/network.rs
#	crates/node/src/network/node_outcomes.rs
#	crates/node/src/providers/verify_foreign_tx.rs
#	crates/node/src/providers/verify_foreign_tx/attempt_evidence.rs
#	crates/node/src/providers/verify_foreign_tx/attempt_outcomes.rs
#	crates/node/src/providers/verify_foreign_tx/leader_attempts.rs
#	crates/node/src/providers/verify_foreign_tx/leader_attempts/tests.rs
#	crates/node/src/providers/verify_foreign_tx/node_outcome_statement.rs
#	crates/node/src/providers/verify_foreign_tx/open_requests.rs
#	crates/node/src/providers/verify_foreign_tx/sign_v2.rs
#	crates/node/src/providers/verify_foreign_tx/sign_v2/tests.rs
#	crates/node/src/providers/verify_foreign_tx/sign_v2/tests/follower.rs
#	crates/node/src/providers/verify_foreign_tx/sign_v2/tests/leader.rs
…eshold

An acting leader signs an inconclusive once the counting rule shows that no
verdict can reach t, even counting the supporters not heard from yet. The
round uses an asset among the supporters that signed exactly one outcome,
the leader included, and the retries of the verdict rounds. A signer joins
only when the evidence proves the rule and holds one outcome of every round
participant. Each signed inconclusive raises a metric labelled with its cause
and chain. Open requests are indexed by yield id.
…adline' into 5126-sign-an-inconclusive-for-v2-foreign-tx-requests

# Conflicts:
#	crates/node/src/providers/verify_foreign_tx/open_requests.rs
#	crates/node/src/providers/verify_foreign_tx/sign_v2/signer.rs
#	crates/node/src/providers/verify_foreign_tx/sign_v2/signer/tests.rs
…adline' into 5126-sign-an-inconclusive-for-v2-foreign-tx-requests
@haiyuechen-nearone haiyuechen-nearone changed the title feat(node): sign an inconclusive for V2 foreign tx requests feat(node): sign an inconclusive when no V2 verdict can reach the threshold Nov 12, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Sign an inconclusive for V2 requests no verdict can reach

1 participant