Skip to content

fix: bcast messages - #91

Merged
AkKoks merged 8 commits into
mainfrom
fix-bcast-tx
Aug 11, 2026
Merged

fix: bcast messages#91
AkKoks merged 8 commits into
mainfrom
fix-bcast-tx

Conversation

@AkKoks

@AkKoks AkKoks commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Broadcast messages to peers were built by hand and always refused by the receiving
mempool: no sender (code=18), then no ExtensionOptionsEthereumTx / fee / gas
limit (code=29). Now built through MsgEthereumTx.BuildTx. Duplicates are not
failures, and one bad tx no longer aborts its batch. p2p only, no consensus change.

Also: v1.6.1 changelog, gen_localnode.sh stray exit, stale v1.6.1 handler comment.

AkKoks added 8 commits August 10, 2026 17:42
The vesting schedule shift and account migration were dropped before
v1.6.1 shipped, so the handler is a no-op that only runs module
migrations. The comment still advertised the removed behaviour.
Mark the changelog ready for release and name the target tag. Add a
Rollout section: SPB has been running v1.6.1-beta.1 (evm fork tac.10)
since 2026-07-30, while the stable v1.6.1 build carries tac.13, so the
two are not byte-identical. Lists the three query-path-only changes that
make up the difference.
The EVM mempool broadcasts a transaction to peers when it promotes it out of
the queue, and built the message with FromEthereumTx, which fills in only the
raw transaction. MsgEthereumTx.ValidateBasic rejects a message without a
sender, so every such broadcast came back as

  rejected by mempool: code=18, log=sender address is missing: invalid request

Recover the sender from the signature instead, the way SendRawTransaction
already does on the direct path.

Locally this went unnoticed: block proposal reads this node's own mempool, so
the transactions landed anyway — 77 of 77 on a localnet, checked by receipt.
What did not happen is the transactions reaching other validators, which is
what this broadcast is for.

The two tests here built unsigned transactions, so they could not have caught
it. They now sign, and the first one asserts the broadcast message carries the
sender and passes ValidateBasic.
Adds the tacchain-side fix to the bug list and to the beta/stable delta, and
corrects the summary: the release is no longer entirely fork changes.

Also narrows the delta note — the other three items are query-path only, this
one is about how a node gossips a transaction, so "query-path only" no longer
covers all of them.
With the sender in place the broadcast got one step further and was refused
again:

  rejected by mempool: code=29, log=MsgEthereumTx needs to be contained within
  a tx with 'ExtensionOptionsEthereumTx' option: invalid type

The ante handler routes a transaction to the EVM path by that extension option
alone, and the fee and gas limit have to be carried over from the ethereum
transaction. Filling a builder by hand here left all three out. BuildTx sets
them, which is what SendRawTransaction already uses on the direct path.

The test now also asserts the extension option, the gas limit and a non-zero
fee on the decoded broadcast tx — without them it fails on the option.
With the message finally well-formed the broadcast reached Comet and came back
with code=19, "tx already in mempool". That is expected: the submitting path has
already handed the transaction over, so this node's own cache sees the peer
broadcast as a duplicate. It is no longer reported as an error.

Also stop abandoning a batch on the first bad transaction — failures are
collected and returned together, so one of them no longer costs the rest their
broadcast.

Covers the three answers a node can give with a table test, and records the
whole sequence in the changelog: the section only mentioned the sender.
Cut the changelog down to the facts: symptom, cause, fix, and a one-line
note on what each change touches. Drops the walkthrough prose, the
repeated summaries and the blow-by-blow of how the broadcast fix landed.

The peer-broadcast work is now one entry covering all three commits
(6759d93, 548387b, b87bd40) instead of a chronicle, the beta/stable delta
is a table, and the gen_localnode.sh fix is recorded.

Error codes, measured numbers, upstream PR references and fork commit
tables are kept.
@AkKoks
AkKoks merged commit 4cff568 into main Aug 11, 2026
12 checks passed
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.

1 participant