feat: add rxrpl support to confluence harness#26
Conversation
Adds rxrpl as a third XRPL node implementation alongside rippled and goXRPL. rxrpl uses a different TOML schema where trusted validator pubkeys live inline in [validators].trusted (no separate validators file) and the signing seed is provided via [validator_identity].master_secret. - src/rxrpl/rxrpl.star: service launcher mirroring goxrpl.star. - src/topology.star: rxrpl_count parameter, _render_rxrpl_config that emits the correct TOML schema with inline trusted set + identity. - main.star: rxrpl_count / rxrpl_image args, launch + include in test_suite all_nodes list. - src/dashboard/dashboard.star: generalize the second arg to alt_nodes with a `type` field on each descriptor so rxrpl shows up under its own label instead of being mislabeled as goxrpl. Default rxrpl_count is 0, so existing rippled/goXRPL runs are unaffected.
rxrpl's [validator_identity] requires both master_secret and ephemeral_seed when the master_secret form is used. Reuse the same seed for both in the test harness — production setups would rotate the ephemeral independently. Also override the image ENTRYPOINT to invoke the rxrpl binary directly with our generated TOML, bypassing the env-var bootstrap shipped with the hive-style rxrpl image.
- goxrpl.launch/rxrpl.launch: early-return on count=0 to avoid the 'configs argument should be a non empty dictionary' kurtosis error when the topology requests zero nodes of a given implementation. - rxrpl.star: mark ws port with wait=None since rxrpl's TOML schema only opens an RPC listener; kurtosis was timing out probing 6006. Validated by running the consensus suite with 1 rippled + 1 rxrpl: rxrpl syncs ledger XRPL-Commons#2-XRPL-Commons#4 against rippled and reaches identical ledger hash 96EF2CA73A2A895808CD78BD21FDC61127E741BAC098EF78AE03EF45CA49B628.
|
cc @LeJamon — ajoute le support de rxrpl à confluence. Validation kurtosis : rippled + rxrpl atteignent le même hash de ledger validé ( |
Use jq's alternative operator (`// default`) on extractors that read fields not yet emitted by all implementations: - `server_info.result.info.peers` -> 0 when missing - `ledger.result.ledger.account_hash` -> "" when missing - `ledger.result.ledger.transaction_hash` -> "" when missing Unblocks the consensus suite for rxrpl, whose RPC layer has not yet implemented these fields. The hash agreement test now passes against a 1 rippled + 1 rxrpl topology with matching ledger_hash at seq 5 (`9866B9EC…C1DFF924`).
|
Update: ran the consensus suite end-to-end with Both nodes reach seq >= 10 and agree on ledger #5 hash |
|
Also tested with a larger mixed topology ( |
|
Investigated whether rxrpl could be made an active proposer in mixed-validator topologies (i.e. emit ProposeSet, not just adopt-validate). Empirical finding: cherry-picking the 6 reverted fixes ( Root cause traced in rxrpl logs:
So the architectural gap is bigger than the 6 fixes: rxrpl's local close path doesn't actually converge tx_sets with rippled (no ProposeSet processing, no amendment vote alignment). Making rxrpl an active proposer requires processing inbound ProposeSet, building a tx_set that converges with rippled, and identical amendment voting — multi-week work, not a single PR. For this PR's scope, passive-validator mode is the right shipping state: rxrpl follows rippled's chain via catchup, signs a Validation for each adopted ledger, and rippled counts those validations toward quorum. The kurtosis consensus suite passes empirically with this mode. Active proposer is tracked as future work upstream on rxrpl, not on confluence. |
|
Verified empirically: rxrpl IS validating in the mixed-validator topology. My earlier comment was wrong on that point. Proof, on a fresh 1-rippled + 1-rxrpl run with rippled raised to debug:
Math: with quorum=2 and rippled-0 the only proposer, So the actual gap on rxrpl in mixed-validator setups is purely active proposing (no ProposeSet emitted), not validation. The PR description is accurate on this point — rxrpl operates as a passive validator: follows rippled's chain via catchup, signs Validations on adopted ledgers, contributes to rippled's quorum, but does not emit ProposeSet during consensus rounds. Tracking active proposing as separate upstream work on rxrpl (tx_set convergence + amendment vote alignment + processing inbound ProposeSet). |
|
Opened RomThpt/rxrpl#76 to track active-proposer work on the rxrpl side. Includes the root cause analysis (close gate + tx_set/account_hash divergence), why the 6 previously-attempted fixes regressed (sawtooth ledger gaps from Shipping this confluence PR as-is, with passive-validator mode validated empirically. Active proposing remains future work upstream on rxrpl. |
Summary
Adds first-class support for rxrpl (Rust XRPL implementation) to the confluence interop testing harness, alongside the existing rippled and goXRPL integrations.
src/rxrpl/rxrpl.starservice moduletopology.star: emits rxrpl TOML configs ([server],[peer],[validators],[validator_identity]withmaster_secret+ephemeral_seed)main.star:rxrpl_count/rxrpl_imageargs (default0/rxrpl:latest); rxrpl nodes are launched and folded intoall_nodesfor the test suitedashboard.star: generalized the second-arg name toalt_nodesand labels entries vianode[\"type\"]so the dashboard shows both goXRPL and rxrplgoxrpl.star&rxrpl.star: early-return oncount == 0to avoid the configs must be a non-empty dict kurtosis error when a topology requests zero nodes of a given implrxrpl.star:entrypoint = [\"rxrpl\"]overrides the image's wrapper script so we drive the binary directly;wsport haswait = Nonebecause rxrpl's TOML schema only opens an RPC listenerValidation
Ran the consensus suite locally on
kurtosis 1.18.2with{rippled_count: 1, goxrpl_count: 0, rxrpl_count: 1, test_suite: \"consensus\"}:proposing, peers=196EF2CA7…CA49B628full, complete_ledgers1-496EF2CA7…CA49B628Both implementations form a private network, complete the P2P handshake, exchange `GetLedger` / `LedgerData` messages, and agree on identical validated-ledger hashes for ledgers #2–#4. This is the first end-to-end demonstration of rxrpl ↔ rippled consensus interop on the confluence harness.
Known limitation
After consensus is reached, kurtosis aborts when probing rxrpl's `server_info` because rxrpl does not yet return a top-level `peers` count (extracted by `src/helpers/rpc.star` at line 37). The full consensus assertions (e.g. "all nodes agree on hash after K rounds") therefore don't run to completion in this PR. Fixing it is independent of this integration and can be addressed either by:
Happy to follow up with a small companion PR for (2) if preferred — kept it out of scope here to keep the diff focused on adding the impl.
Test plan