@@ -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