Skip to content

Commit 7f9864d

Browse files
authored
feat: blind all blocks before QBFT (#694)
Addresses Issue #630 - Blind blocks before QBFT to reduce bandwidth - Save original full block and compare after consensus - Return full block with signature if our proposal won, otherwise return blinded block Co-Authored-By: petarjuki7 <petar.jukic7@gmail.com> Co-Authored-By: petarjuki7 <36903459+petarjuki7@users.noreply.github.com>
1 parent e2ac5c4 commit 7f9864d

File tree

1 file changed

+50
-22
lines changed
  • anchor/validator_store/src

1 file changed

+50
-22
lines changed

anchor/validator_store/src/lib.rs

Lines changed: 50 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ impl<T: SlotClock, E: EthSpec> AnchorValidatorStore<T, E> {
297297
&self,
298298
validator: &ValidatorMetadata,
299299
cluster: &Cluster,
300-
signable_block: impl SignableBlock<E>,
300+
signable_block: &impl SignableBlock<E>,
301301
) -> Result<UnsignedBlock<E>, Error> {
302302
let block = signable_block.as_block();
303303
let slot = block.slot();
@@ -937,35 +937,63 @@ impl<T: SlotClock, E: EthSpec> ValidatorStore for AnchorValidatorStore<T, E> {
937937
}
938938
let (validator, cluster) = self.get_validator_and_cluster(validator_pubkey)?;
939939

940-
let block = match block {
941-
UnsignedBlock::Full(FullBlockContents::BlockContents(contents)) => {
942-
self.decide_abstract_block(&validator, &cluster, contents)
943-
.await
944-
}
940+
let (blinded_block, proofs_and_blobs, block_full) = match block {
941+
UnsignedBlock::Full(FullBlockContents::BlockContents(contents)) => (
942+
contents.block.to_ref().into(),
943+
Some((contents.kzg_proofs, contents.blobs)),
944+
Some(contents.block),
945+
),
945946
UnsignedBlock::Full(FullBlockContents::Block(block)) => {
946-
self.decide_abstract_block(&validator, &cluster, block)
947-
.await
947+
(block.to_ref().into(), None, Some(block))
948948
}
949+
UnsignedBlock::Blinded(block) => (block, None, None),
950+
};
951+
952+
let decided_block = self
953+
.decide_abstract_block(&validator, &cluster, &blinded_block)
954+
.await?;
955+
956+
// Sign the decided block
957+
let signed_block = match decided_block {
949958
UnsignedBlock::Blinded(block) => {
950-
self.decide_abstract_block(&validator, &cluster, block)
959+
self.sign_abstract_block(&validator, &cluster, block, current_slot)
951960
.await
952961
}
962+
UnsignedBlock::Full(block) => {
963+
self.sign_abstract_block(
964+
&validator,
965+
&cluster,
966+
BeaconBlock::from(block),
967+
current_slot,
968+
)
969+
.await
970+
}
953971
}?;
954972

955-
// yay - we agree! let's sign the block we agreed on
956-
match block {
957-
UnsignedBlock::Full(FullBlockContents::BlockContents(contents)) => {
958-
self.sign_abstract_block(&validator, &cluster, contents, current_slot)
959-
.await
960-
}
961-
UnsignedBlock::Full(FullBlockContents::Block(block)) => {
962-
self.sign_abstract_block(&validator, &cluster, block, current_slot)
963-
.await
964-
}
965-
UnsignedBlock::Blinded(block) => {
966-
self.sign_abstract_block(&validator, &cluster, block, current_slot)
967-
.await
973+
match signed_block {
974+
SignedBlock::Blinded(signed_blinded_block) => {
975+
// Check if the decided block matches our original proposal
976+
if signed_blinded_block.signed_block_header().message
977+
== blinded_block.block_header()
978+
{
979+
if let Some(full_block) = block_full {
980+
let signed_full_block = SignedBeaconBlock::from_block(
981+
full_block,
982+
signed_blinded_block.signature().clone(),
983+
);
984+
Ok(SignedBlock::Full(PublishBlockRequest::new(
985+
Arc::new(signed_full_block),
986+
proofs_and_blobs,
987+
)))
988+
} else {
989+
Ok(SignedBlock::Blinded(signed_blinded_block))
990+
}
991+
} else {
992+
// Someone else's proposal won, return blinded
993+
Ok(SignedBlock::Blinded(signed_blinded_block))
994+
}
968995
}
996+
SignedBlock::Full(signed_block) => Ok(SignedBlock::Full(signed_block)),
969997
}
970998
};
971999

0 commit comments

Comments
 (0)