diff --git a/src/xrpld/app/consensus/ConsensusExtensionsDesign.md b/src/xrpld/app/consensus/ConsensusExtensionsDesign.md index d32ee5f15..505a91e5a 100644 --- a/src/xrpld/app/consensus/ConsensusExtensionsDesign.md +++ b/src/xrpld/app/consensus/ConsensusExtensionsDesign.md @@ -486,12 +486,15 @@ would make a retained latch's accepted witness unreplayable. The destination account's SignerList remains the actual remote authority. Its keys, weights, optional operator signer, and rotation policy are client/operator -configuration that source consensus cannot verify. The committee cap matches -`STTx::maxMultiSigners()`; reserving a separate operator entry reduces the -maximum validator roster usable by that destination account. A lower remote -threshold weakens the claimed custody policy, while a higher threshold may -strand an otherwise sufficient source witness. Target ledger validation and the -returning XPOP are separate from this authorization decision. +configuration that source consensus cannot verify. Export's 32-member source +cap matches the expanded `STTx::maxMultiSigners()` capacity used by network-0 +signing rules. A destination without `featureExpandedSignerList` supports only +eight entries and must configure a smaller committee; reserving a separate +operator entry likewise reduces the maximum validator roster usable by that +destination account. A lower remote threshold weakens the claimed custody +policy, while a higher threshold may strand an otherwise sufficient source +witness. Target ledger validation and the returning XPOP are separate from +this authorization decision. The extended proposal machinery is enabled when either feature needs signed sidecar fields. Do not make Export depend on RNG availability just because RNG diff --git a/src/xrpld/app/hook/detail/applyHook.cpp b/src/xrpld/app/hook/detail/applyHook.cpp index b9884b5db..5f589ffef 100644 --- a/src/xrpld/app/hook/detail/applyHook.cpp +++ b/src/xrpld/app/hook/detail/applyHook.cpp @@ -4103,7 +4103,7 @@ readEntropySnapshot(ApplyView& view) sle->getFieldU16(sfEntropyDenominator)}; } -// byteCount must be a multiple of 32. +// Callers normalize byteCount to a multiple of 32. // minTier is the CALLER'S stated class requirement (a required hook API // argument — there is deliberately no network-wide default). Count and // denominator policy is available separately through entropy_status(). @@ -4117,7 +4117,7 @@ fairRng( if (byteCount > 512) byteCount = 512; - // force the byte count to be a multiple of 32 + // Preserve the caller's 32-byte block invariant defensively. byteCount &= ~0b11111; if (byteCount == 0) diff --git a/src/xrpld/app/tx/detail/Import.cpp b/src/xrpld/app/tx/detail/Import.cpp index d179c236f..1ecfdd214 100644 --- a/src/xrpld/app/tx/detail/Import.cpp +++ b/src/xrpld/app/tx/detail/Import.cpp @@ -943,8 +943,8 @@ Import::preflight(PreflightContext const& ctx) }; if (hasInsufficientQuorum(quorum, validationCount)) { - JLOG(ctx.j.warn()) << "Import: xpop did not contain an 80% quorum for " - "the txn it purports to prove. " + JLOG(ctx.j.warn()) << "Import: xpop did not contain the required " + "quorum for the txn it purports to prove. " << tx.getTransactionID(); return temMALFORMED; } diff --git a/src/xrpld/consensus/ConsensusParms.h b/src/xrpld/consensus/ConsensusParms.h index 21f63f212..55eb78cb5 100644 --- a/src/xrpld/consensus/ConsensusParms.h +++ b/src/xrpld/consensus/ConsensusParms.h @@ -104,13 +104,13 @@ struct ConsensusParms * round (e.g. restarting after a crash) enters as proposing=false * and cannot generate commitments until consensus promotes it to * proposing — which takes at least one full round of observing. - * Waiting the full 10s just delays the inevitable ZERO-entropy + * Waiting the full 10s just delays the inevitable non-zero Tier-1 * fallback and slows recovery for the restarting node (it can't * catch up until the survivors close a ledger). * * 3s is long enough for commits to propagate on any reasonable * network, but short enough that a missing-node scenario recovers - * quickly via the ZERO-entropy fallback path. + * quickly via the Tier-1 fallback path. */ std::chrono::milliseconds rngPIPELINE_TIMEOUT = std::chrono::seconds{3};