OpenPay (1 crate, 1801 LOC, 57 tests)
op-bin BIN/IIN database + range matching + card-network
classification. 8-digit normalized prefix Bin +
BinRange. Sorted-vec interval tree with O(log N) point
lookup + overlap rejection. CardNetwork classify()
with structural rules (Visa 4, MC 51-55/2221-2720,
Amex 34/37, Discover, JCB, Diners, UnionPay, RuPay,
Mir, Troy, Maestro, Elo). Static prefix tables +
build_default_tree(). ISO/IEC 7812-1 Annex B Luhn
(validate / is_valid / check_digit). Card-type +
issuer-country + Durbin regulated-debit. PCI-safe:
8-digit cap, no full-PAN APIs.
Smart Byte (1 crate, ~1500 LOC, 20 tests)
smart-byte-tendermint BFT consensus. Step enum + Round + propose/prevote/
precommit/commit FSM with voting-power tallies.
ValidatorSet with 2/3+1 quorum, 1/3+1 trust
threshold, round-robin proposer. Block / Header /
Commit / CommitSig with Blake3 hashing. Light client
(sequential + skipping). ABCI Application trait +
EchoApp. DuplicateVoteEvidence + LightClientAttackEvidence.
IBC ClientState + ConsensusState + light-client
update.
EOC (1 crate, 2084 LOC, 23 tests)
eoc-safety AI safety primitives. RegexSet over 16 prompt-injection
signatures. 13-family jailbreak detector (DAN/DUDE/
Grandma/STAN/AIM/dev-mode/etc.). Presidio-style PII
redactor with Luhn-validated CC. Toxicity / bias /
NSFW classifier traits + heuristic baselines (5-axis
bias, 4-category NSFW with hard-reject for minors).
Constitutional AI critique→revise loop. Composable
InputGuard / OutputGuard pipelines. JSON-Schema-subset
output validator. Token-bucket rate limiter +
abuse-window detection. Red-team replay harness.
Co-Authored-By: Claude Opus 4.7 <[email protected]>
55 lines
1.8 KiB
Rust
55 lines
1.8 KiB
Rust
//! Block proposals.
|
|
//!
|
|
//! Each round, the validator selected by [`ValidatorSet::proposer`]
|
|
//! broadcasts a `Proposal` carrying the candidate block. Other
|
|
//! validators validate the proposal against the round, height, and
|
|
//! proposer before issuing prevotes.
|
|
//!
|
|
//! [`ValidatorSet::proposer`]: crate::validator::ValidatorSet::proposer
|
|
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
use crate::block::Hash;
|
|
use crate::validator::ValidatorId;
|
|
use crate::vote::Signature;
|
|
|
|
/// A signed block proposal.
|
|
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
|
pub struct Proposal {
|
|
/// Height being proposed.
|
|
pub height: u64,
|
|
/// Round at which this proposal was made.
|
|
pub round: u32,
|
|
/// Block hash of the candidate block.
|
|
pub block_hash: Hash,
|
|
/// "Proof of lock round" — `Some(r)` if the proposer is reproposing
|
|
/// a block it locked in an earlier round, else `None`.
|
|
pub pol_round: Option<u32>,
|
|
/// Validator id of the proposer (must match the round's elected proposer).
|
|
pub proposer: ValidatorId,
|
|
/// Signature over the canonical proposal bytes.
|
|
pub signature: Signature,
|
|
}
|
|
|
|
impl Proposal {
|
|
/// Canonical sign-bytes for the proposal.
|
|
pub fn sign_bytes(&self, chain_id: &str) -> [u8; 32] {
|
|
let mut hasher = blake3::Hasher::new();
|
|
hasher.update(chain_id.as_bytes());
|
|
hasher.update(b"proposal");
|
|
hasher.update(&self.height.to_be_bytes());
|
|
hasher.update(&self.round.to_be_bytes());
|
|
hasher.update(&self.block_hash);
|
|
match self.pol_round {
|
|
Some(r) => {
|
|
hasher.update(&[1]);
|
|
hasher.update(&r.to_be_bytes());
|
|
}
|
|
None => {
|
|
hasher.update(&[0]);
|
|
}
|
|
}
|
|
hasher.update(self.proposer.as_bytes());
|
|
*hasher.finalize().as_bytes()
|
|
}
|
|
}
|