Skip to content

Commit f570ddc

Browse files
authored
gossip: fix vote encoder (#7174)
1 parent b8c2a76 commit f570ddc

File tree

6 files changed

+108
-41
lines changed

6 files changed

+108
-41
lines changed

src/flamenco/gossip/Local.mk

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ $(call run-unit-test,test_ping_tracker)
1717
$(call make-unit-test,test_gossip,test_gossip,fd_flamenco fd_ballet fd_util)
1818
$(call run-unit-test,test_gossip)
1919

20+
$(call make-unit-test,test_gossip_ser,test_gossip_ser,fd_flamenco fd_ballet fd_util)
21+
$(call run-unit-test,test_gossip_ser)
22+
2023
ifdef FD_HAS_HOSTED
2124
$(call make-fuzz-test,fuzz_gossip_msg_parse,fuzz_gossip_msg_parse,fd_flamenco fd_ballet fd_util)
2225
endif

src/flamenco/gossip/fd_gossip.c

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -720,42 +720,33 @@ fd_gossip_push_vote( fd_gossip_t * gossip,
720720
long now ) {
721721
/* TODO: we can avoid addt'l memcpy if we pass a propely laid out
722722
crds buffer instead */
723-
uchar crds_val[ FD_GOSSIP_CRDS_MAX_SZ ];
724-
ulong crds_val_sz;
723+
uchar crds_val[ FD_GOSSIP_CRDS_MAX_SZ ];
724+
fd_gossip_view_crds_value_t view[1];
725+
725726
fd_gossip_crds_vote_encode( crds_val,
726727
FD_GOSSIP_CRDS_MAX_SZ,
727728
txn,
728729
txn_sz,
729730
gossip->identity_pubkey,
730731
now,
731-
&crds_val_sz );
732-
fd_gossip_view_crds_value_t value[1];
732+
0UL, /* vote_index TODO */
733+
view );
733734

734735
gossip->sign_fn( gossip->sign_ctx,
735736
crds_val+64UL,
736-
crds_val_sz-64UL,
737+
view->length-64UL,
737738
FD_KEYGUARD_SIGN_TYPE_ED25519,
738739
crds_val );
739740

740-
value->tag = FD_GOSSIP_VALUE_VOTE;
741-
value->value_off = 0UL;
742-
value->length = (ushort)crds_val_sz;
743-
value->pubkey_off = 64UL+1UL; /* Signature + vote index */
744-
value->wallclock_nanos = now;
745-
fd_gossip_view_vote_t * vote = value->vote;
746-
vote->index = 0UL; /* TODO */
747-
vote->txn_sz = (ushort)txn_sz;
748-
vote->txn_off = 64UL+1UL+32UL; /* Signature + vote index + pubkey */
749-
750-
int res = fd_crds_checks_fast( gossip->crds, value, crds_val, 0 );
741+
int res = fd_crds_checks_fast( gossip->crds, view, crds_val, 0 );
751742
if( FD_UNLIKELY( res ) ) return -1;
752743

753-
fd_crds_entry_t const * entry = fd_crds_insert( gossip->crds, value, crds_val, gossip->identity_stake, 1, /* is_me */ now, stem );
744+
fd_crds_entry_t const * entry = fd_crds_insert( gossip->crds, view, crds_val, gossip->identity_stake, 1, /* is_me */ now, stem );
754745
if( FD_UNLIKELY( !entry ) ) return -1;
755746

756747
active_push_set_insert( gossip,
757748
crds_val,
758-
crds_val_sz,
749+
view->length,
759750
gossip->identity_pubkey,
760751
gossip->identity_stake,
761752
stem,

src/flamenco/gossip/fd_gossip_msg_ser.c

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -279,24 +279,26 @@ fd_gossip_contact_info_encode( fd_contact_info_t const * contact_info,
279279
}
280280

281281
int
282-
fd_gossip_crds_vote_encode( uchar * out_buf,
283-
ulong out_buf_sz,
284-
uchar const * txn,
285-
ulong txn_sz,
286-
uchar const * identity_pubkey,
287-
long now,
288-
ulong * opt_encoded_sz ) {
282+
fd_gossip_crds_vote_encode( uchar * out_buf,
283+
ulong out_buf_sz,
284+
uchar const * txn,
285+
ulong txn_sz,
286+
uchar const * identity_pubkey,
287+
long now,
288+
uchar vote_index,
289+
fd_gossip_view_crds_value_t * out_view ) {
290+
fd_gossip_view_vote_t * vote = out_view->vote;
291+
289292
SER_INIT( out_buf, out_buf_sz, 0U );
290-
INC( 64U ); /* Reserve space for signature */
293+
out_view->signature_off = CUR_OFFSET ; /* Reserve space for signature */ ; INC( 64U );
294+
out_view->tag = FD_GOSSIP_VALUE_VOTE; FD_STORE( uint, CURSOR, FD_GOSSIP_VALUE_VOTE ); INC( 4U );
291295

292-
FD_STORE( uint, CURSOR, FD_GOSSIP_VALUE_VOTE ) ; INC( 4U );
293-
FD_STORE( uchar, CURSOR, 0U ) ; INC( 1U ); /* TODO: vote tower index, unused for now */
294-
fd_memcpy( CURSOR, identity_pubkey, 32UL ) ; INC( 32U );
295-
fd_memcpy( CURSOR, txn, txn_sz ) ; INC( (ushort)txn_sz );
296-
FD_STORE( ulong, CURSOR, (ulong)FD_NANOSEC_TO_MILLI( now ) ); INC( 8U );
296+
vote->index = vote_index; FD_STORE ( uchar, CURSOR, vote_index ) ; INC( 1U );
297+
out_view->pubkey_off = CUR_OFFSET; fd_memcpy( CURSOR, identity_pubkey, 32UL ) ; INC( 32U );
298+
vote->txn_off = CUR_OFFSET; fd_memcpy( CURSOR, txn, txn_sz ) ; INC( (ushort)txn_sz );
299+
out_view->wallclock_nanos = now ; FD_STORE ( ulong, CURSOR, (ulong)FD_NANOSEC_TO_MILLI( now ) ); INC( 8U );
297300

298-
if( opt_encoded_sz ) {
299-
*opt_encoded_sz = BYTES_CONSUMED; /* Return the size of the encoded vote */
300-
}
301+
vote->txn_sz = (ushort)txn_sz;
302+
out_view->length = (ushort)BYTES_CONSUMED;
301303
return 0;
302304
}

src/flamenco/gossip/fd_gossip_private.h

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -375,11 +375,12 @@ fd_gossip_contact_info_encode( fd_contact_info_t const * contact_info,
375375
ulong * opt_encoded_sz );
376376

377377
int
378-
fd_gossip_crds_vote_encode( uchar * out_buf,
379-
ulong out_buf_sz,
380-
uchar const * txn,
381-
ulong txn_sz,
382-
uchar const * identity_pubkey,
383-
long now,
384-
ulong * opt_encoded_sz );
378+
fd_gossip_crds_vote_encode( uchar * out_buf,
379+
ulong out_buf_sz,
380+
uchar const * txn,
381+
ulong txn_sz,
382+
uchar const * identity_pubkey,
383+
long now,
384+
uchar vote_index,
385+
fd_gossip_view_crds_value_t * out_view );
385386
#endif /* HEADER_fd_src_flamenco_gossip_fd_gossip_private_h */
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#include "../../util/fd_util.h"
2+
#include "fd_gossip_private.h"
3+
#include "fd_gossip_txbuild.h"
4+
5+
FD_IMPORT_BINARY( fd_gossip_test_vote_txn, "src/flamenco/gossip/test_vote_txn.bin" );
6+
7+
void
8+
gen_pubkey( fd_rng_t * rng, uchar * pubkey ) {
9+
for( ulong i=0UL; i<32UL; i++ ) pubkey[i] = fd_rng_uchar( rng );
10+
}
11+
12+
void
13+
test_gossip_vote_enc( void ) {
14+
fd_rng_t _rng[1]; fd_rng_t * rng = fd_rng_join( fd_rng_new( _rng, 0U, 0UL ) );
15+
uchar pubkey[32UL];
16+
gen_pubkey( rng, pubkey );
17+
18+
fd_gossip_txbuild_t txbuild[1];
19+
fd_gossip_txbuild_init( txbuild, pubkey, FD_GOSSIP_MESSAGE_PUSH );
20+
21+
uchar crds_val[ FD_GOSSIP_CRDS_MAX_SZ ];
22+
fd_gossip_view_crds_value_t ser_view[1];
23+
24+
long now = 1234L*1000L*1000L;
25+
26+
fd_gossip_crds_vote_encode( crds_val,
27+
FD_GOSSIP_CRDS_MAX_SZ,
28+
fd_gossip_test_vote_txn,
29+
fd_gossip_test_vote_txn_sz,
30+
pubkey,
31+
now,
32+
0UL, /* vote_index */
33+
ser_view );
34+
FD_TEST( ser_view->tag==FD_GOSSIP_VALUE_VOTE );
35+
FD_TEST( fd_memeq( crds_val+ser_view->pubkey_off, pubkey, 32UL ) );
36+
FD_TEST( ser_view->vote->index==0UL );
37+
FD_TEST( ser_view->vote->txn_sz==fd_gossip_test_vote_txn_sz );
38+
FD_TEST( fd_memeq( crds_val+ser_view->vote->txn_off, fd_gossip_test_vote_txn, fd_gossip_test_vote_txn_sz ) );
39+
FD_TEST( ser_view->wallclock_nanos==now );
40+
41+
ulong crds_val_sz = ser_view->length;
42+
43+
FD_TEST( !!fd_gossip_txbuild_can_fit( txbuild, crds_val_sz ) );
44+
fd_gossip_txbuild_append( txbuild, crds_val_sz, crds_val );
45+
46+
47+
/* Simple parse test */
48+
fd_gossip_view_t parse_view[1];
49+
ulong sz = fd_gossip_msg_parse( parse_view, txbuild->bytes, txbuild->bytes_len );
50+
FD_TEST( sz==txbuild->bytes_len );
51+
52+
fd_gossip_view_crds_value_t * parsed_vote = &parse_view->push->crds_values[0];
53+
FD_TEST( parsed_vote->tag==FD_GOSSIP_VALUE_VOTE );
54+
FD_TEST( fd_memeq( txbuild->bytes+parsed_vote->pubkey_off, pubkey, 32UL ) );
55+
FD_TEST( parsed_vote->vote->index==0UL );
56+
FD_TEST( parsed_vote->length==crds_val_sz );
57+
FD_TEST( parsed_vote->vote->txn_sz==fd_gossip_test_vote_txn_sz );
58+
FD_TEST( fd_memeq( txbuild->bytes+parsed_vote->vote->txn_off, fd_gossip_test_vote_txn, parsed_vote->vote->txn_sz ) );
59+
FD_TEST( parsed_vote->wallclock_nanos==now );
60+
}
61+
62+
int
63+
main( int argc,
64+
char ** argv ) {
65+
fd_boot( &argc, &argv );
66+
test_gossip_vote_enc();
67+
FD_LOG_NOTICE(( "gossip vote encode test passed" ));
68+
FD_LOG_NOTICE(( "All tests passed!" ));
69+
return 0;
70+
}
263 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)