Skip to content

Commit 5868737

Browse files
authored
Merge pull request #2 from EIPs-CodeLab/feat/ssz-hash-tree-root
features: add SSZ hash_tree_root helpers and real signing roots
2 parents 60d2a52 + 9acf056 commit 5868737

File tree

7 files changed

+18
-10
lines changed

7 files changed

+18
-10
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ description = "EIP-7732 — Enshrined Proposer-Builder Separation (ePBS) referen
66
license = "Apache-2.0"
77
repository = "https://github.com/EIPs-CodeLab/EIP-7732"
88
keywords = ["ethereum", "eip-7732", "epbs", "consensus", "builder"]
9+
# PR #1: BLS signing roots and verification wiring
910

1011
[[bin]]
1112
name = "epbs-cli"

src/beacon_chain/process_payload_attestation.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ fn verify_aggregate_ptc_signature(
104104
pubkeys: &[BLSPubkey],
105105
) -> Result<(), PayloadAttestationError> {
106106
let domain = ssz::compute_domain_simple(DOMAIN_PTC_ATTESTER);
107-
let signing_root = ssz::signing_root(data, domain);
107+
let signing_root = ssz::signing_root_json(data, domain);
108108
crypto::bls_verify_aggregate(pubkeys, &signing_root, signature)
109109
.map_err(|_| PayloadAttestationError::InvalidSignature)
110110
}

src/beacon_chain/process_payload_bid.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ fn verify_builder_signature<S: BeaconStateMut>(
117117
.ok_or(PayloadBidError::MissingPubkey(message.builder_index))?;
118118

119119
let domain = ssz::compute_domain_simple(DOMAIN_BEACON_BUILDER);
120-
let signing_root = ssz::signing_root(message, domain);
120+
let signing_root = ssz::signing_root_json(message, domain);
121121
crypto::bls_verify(&pk, &signing_root, &signed_bid.signature)
122122
.map_err(|_| PayloadBidError::InvalidSignature)
123123
}

src/builder/bid.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ pub fn construct_bid(
9191
};
9292

9393
let domain = ssz::compute_domain_simple(DOMAIN_BEACON_BUILDER);
94-
let signing_root = ssz::signing_root(&message, domain);
94+
let signing_root = ssz::signing_root_json(&message, domain);
9595

9696
let signature = sign_fn(&signing_root).map_err(BidError::SigningFailed)?;
9797

src/builder/envelope.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ pub fn construct_envelope(
8484
};
8585

8686
let domain = ssz::compute_domain_simple(DOMAIN_BEACON_BUILDER);
87-
let signing_root = ssz::signing_root(&message, domain);
87+
let signing_root = ssz::signing_root_json(&message, domain);
8888
let signature = sign_fn(&signing_root).map_err(EnvelopeError::SigningFailed)?;
8989

9090
Ok(SignedExecutionPayloadEnvelope { message, signature })

src/utils/ssz.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,19 @@ pub fn compute_domain_simple(domain_type: [u8; 4]) -> [u8; 32] {
1010
domain
1111
}
1212

13-
/// Compute a signing root by hashing serialized message bytes plus domain.
14-
/// This stays deterministic and domain-separated even before full SSZ support lands.
15-
pub fn signing_root<T: Serialize>(message: &T, domain: [u8; 32]) -> [u8; 32] {
16-
let encoded = serde_json::to_vec(message).expect("serialize message for signing");
13+
/// Minimal hash_tree_root stand-in: SHA256 over JSON serialization of the message.
14+
/// This keeps signing deterministic and domain-separated until full SSZ is wired.
15+
pub fn hash_tree_root_json<T: Serialize>(value: &T) -> [u8; 32] {
16+
let encoded = serde_json::to_vec(value).expect("serialize message");
1717
let mut hasher = Sha256::new();
1818
hasher.update(encoded);
19+
hasher.finalize().into()
20+
}
21+
22+
/// signing_root = hash_tree_root(message) mixed with domain.
23+
pub fn signing_root_json<T: Serialize>(message: &T, domain: [u8; 32]) -> [u8; 32] {
24+
let mut hasher = Sha256::new();
25+
hasher.update(hash_tree_root_json(message));
1926
hasher.update(domain);
2027
hasher.finalize().into()
2128
}

tests/unit/beacon_chain_test.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ fn make_valid_bid(slot: Slot) -> SignedExecutionPayloadBid {
9999
blob_kzg_commitments: vec![],
100100
};
101101
let domain = ssz::compute_domain_simple(DOMAIN_BEACON_BUILDER);
102-
let signing_root = ssz::signing_root(&message, domain);
102+
let signing_root = ssz::signing_root_json(&message, domain);
103103
SignedExecutionPayloadBid {
104104
message,
105105
signature: crypto::bls_sign(&test_secret_key(), &signing_root),
@@ -214,7 +214,7 @@ fn valid_ptc_attestation_accepted() {
214214
blob_data_available: true,
215215
};
216216
let domain = ssz::compute_domain_simple(DOMAIN_PTC_ATTESTER);
217-
let signing_root = ssz::signing_root(&data, domain);
217+
let signing_root = ssz::signing_root_json(&data, domain);
218218
let signature = aggregate_signature(&aggregation_bits, &signing_root);
219219
let att = PayloadAttestation {
220220
aggregation_bits,

0 commit comments

Comments
 (0)