@@ -24,6 +24,7 @@ use blockstack_lib::util_lib::db::{
24
24
Error as DBError ,
25
25
} ;
26
26
use clarity:: types:: chainstate:: { BurnchainHeaderHash , StacksAddress } ;
27
+ use clarity:: util:: secp256k1:: Secp256k1PublicKey ;
27
28
use libsigner:: BlockProposal ;
28
29
use rusqlite:: {
29
30
params, Connection , Error as SqliteError , OpenFlags , OptionalExtension , Transaction ,
@@ -157,28 +158,31 @@ pub struct BlockInfo {
157
158
pub signed_group : Option < u64 > ,
158
159
/// The block state relative to the signer's view of the stacks blockchain
159
160
pub state : BlockState ,
161
+ /// The miner pubkey that proposed this block
162
+ pub miner_pubkey : Secp256k1PublicKey ,
160
163
/// Extra data specific to v0, v1, etc.
161
164
pub ext : ExtraBlockInfo ,
162
165
}
163
166
164
- impl From < BlockProposal > for BlockInfo {
165
- fn from ( value : BlockProposal ) -> Self {
167
+ impl BlockInfo {
168
+ /// Create a new block info from the provided proposal and corresponding miner pubkey
169
+ pub fn new ( block_proposal : BlockProposal , miner_pubkey : Secp256k1PublicKey ) -> Self {
166
170
Self {
167
- block : value . block ,
168
- burn_block_height : value . burn_height ,
169
- reward_cycle : value . reward_cycle ,
171
+ block : block_proposal . block ,
172
+ burn_block_height : block_proposal . burn_height ,
173
+ reward_cycle : block_proposal . reward_cycle ,
170
174
vote : None ,
171
175
valid : None ,
172
176
signed_over : false ,
173
177
proposed_time : get_epoch_time_secs ( ) ,
174
178
signed_self : None ,
175
179
signed_group : None ,
176
180
ext : ExtraBlockInfo :: default ( ) ,
181
+ miner_pubkey,
177
182
state : BlockState :: Unprocessed ,
178
183
}
179
184
}
180
- }
181
- impl BlockInfo {
185
+
182
186
/// Mark this block as locally accepted, valid, signed over, and records either the self or group signed timestamp in the block info if it wasn't
183
187
/// already set.
184
188
pub fn mark_locally_accepted ( & mut self , group_signed : bool ) -> Result < ( ) , String > {
@@ -853,7 +857,7 @@ mod tests {
853
857
use std:: path:: PathBuf ;
854
858
855
859
use blockstack_lib:: chainstate:: nakamoto:: { NakamotoBlock , NakamotoBlockHeader } ;
856
- use clarity:: util:: secp256k1:: MessageSignature ;
860
+ use clarity:: util:: secp256k1:: { MessageSignature , Secp256k1PrivateKey } ;
857
861
use libsigner:: BlockProposal ;
858
862
859
863
use super :: * ;
@@ -879,7 +883,13 @@ mod tests {
879
883
reward_cycle : 42 ,
880
884
} ;
881
885
overrides ( & mut block_proposal) ;
882
- ( BlockInfo :: from ( block_proposal. clone ( ) ) , block_proposal)
886
+ (
887
+ BlockInfo :: new (
888
+ block_proposal. clone ( ) ,
889
+ Secp256k1PublicKey :: from_private ( & Secp256k1PrivateKey :: new ( ) ) ,
890
+ ) ,
891
+ block_proposal,
892
+ )
883
893
}
884
894
885
895
fn create_block ( ) -> ( BlockInfo , BlockProposal ) {
@@ -896,6 +906,7 @@ mod tests {
896
906
fn test_basic_signer_db_with_path ( db_path : impl AsRef < Path > ) {
897
907
let mut db = SignerDb :: new ( db_path) . expect ( "Failed to create signer db" ) ;
898
908
let ( block_info, block_proposal) = create_block ( ) ;
909
+ let miner_pubkey = block_info. miner_pubkey ;
899
910
let reward_cycle = block_info. reward_cycle ;
900
911
db. insert_block ( & block_info)
901
912
. expect ( "Unable to insert block into db" ) ;
@@ -907,7 +918,10 @@ mod tests {
907
918
. unwrap ( )
908
919
. expect ( "Unable to get block from db" ) ;
909
920
910
- assert_eq ! ( BlockInfo :: from( block_proposal. clone( ) ) , block_info) ;
921
+ assert_eq ! (
922
+ BlockInfo :: new( block_proposal. clone( ) , miner_pubkey) ,
923
+ block_info
924
+ ) ;
911
925
912
926
// Test looking up a block from a different reward cycle
913
927
let block_info = db
@@ -927,7 +941,10 @@ mod tests {
927
941
. unwrap ( )
928
942
. expect ( "Unable to get block state from db" ) ;
929
943
930
- assert_eq ! ( block_state, BlockInfo :: from( block_proposal. clone( ) ) . state) ;
944
+ assert_eq ! (
945
+ block_state,
946
+ BlockInfo :: new( block_proposal. clone( ) , miner_pubkey) . state
947
+ ) ;
931
948
}
932
949
933
950
#[ test]
@@ -947,6 +964,7 @@ mod tests {
947
964
let db_path = tmp_db_path ( ) ;
948
965
let mut db = SignerDb :: new ( db_path) . expect ( "Failed to create signer db" ) ;
949
966
let ( block_info, block_proposal) = create_block ( ) ;
967
+ let miner_pubkey = block_info. miner_pubkey ;
950
968
let reward_cycle = block_info. reward_cycle ;
951
969
db. insert_block ( & block_info)
952
970
. expect ( "Unable to insert block into db" ) ;
@@ -959,7 +977,10 @@ mod tests {
959
977
. unwrap ( )
960
978
. expect ( "Unable to get block from db" ) ;
961
979
962
- assert_eq ! ( BlockInfo :: from( block_proposal. clone( ) ) , block_info) ;
980
+ assert_eq ! (
981
+ BlockInfo :: new( block_proposal. clone( ) , miner_pubkey) ,
982
+ block_info
983
+ ) ;
963
984
964
985
let old_block_info = block_info;
965
986
let old_block_proposal = block_proposal;
0 commit comments