@@ -57,12 +57,38 @@ use crate::seismic_evm_config;
5757/// Storage implementation for Seismic.
5858pub type SeismicStorage = EthStorage < SeismicTransactionSigned > ;
5959
60- #[ derive( Debug , Default , Clone ) ]
61- #[ non_exhaustive]
60+ #[ derive( Debug , Clone ) ]
6261/// Type configuration for a regular Seismic node.
63- pub struct SeismicNode ;
62+ ///
63+ /// Purpose keys can be injected via [`SeismicNode::new`] so they flow through
64+ /// the node builder lifecycle instead of being read from a global side-channel.
65+ /// When constructed via [`Default`] (e.g. in tests), the executor builder will
66+ /// fall back to the global [`crate::purpose_keys::get_purpose_keys`].
67+ pub struct SeismicNode {
68+ /// Structurally-injected purpose keys. `None` means "use global fallback".
69+ purpose_keys : Option < & ' static seismic_enclave:: GetPurposeKeysResponse > ,
70+ }
71+
72+ impl Default for SeismicNode {
73+ fn default ( ) -> Self {
74+ Self { purpose_keys : None }
75+ }
76+ }
6477
6578impl SeismicNode {
79+ /// Create a new [`SeismicNode`] with structurally-injected purpose keys.
80+ ///
81+ /// The keys are leaked onto the heap so they live for `'static`, which is
82+ /// required by the EVM configuration layer.
83+ pub fn new ( purpose_keys : seismic_enclave:: GetPurposeKeysResponse ) -> Self {
84+ Self { purpose_keys : Some ( crate :: purpose_keys:: leak_purpose_keys ( purpose_keys) ) }
85+ }
86+
87+ /// Returns the injected purpose keys, if any.
88+ pub fn purpose_keys ( & self ) -> Option < & ' static seismic_enclave:: GetPurposeKeysResponse > {
89+ self . purpose_keys
90+ }
91+
6692 /// Returns the components for the given [`EnclaveArgs`].
6793 pub fn components < Node > (
6894 & self ,
@@ -83,13 +109,14 @@ impl SeismicNode {
83109 > ,
84110 > ,
85111 {
112+ let executor = SeismicExecutorBuilder { purpose_keys : self . purpose_keys } ;
86113 ComponentsBuilder :: default ( )
87114 . node_types :: < Node > ( )
88115 . pool ( SeismicPoolBuilder :: default ( ) )
89- . executor ( SeismicExecutorBuilder :: default ( ) )
116+ . executor ( executor . clone ( ) )
90117 . payload ( BasicPayloadServiceBuilder :: < SeismicPayloadBuilder > :: default ( ) )
91118 . network ( SeismicNetworkBuilder :: default ( ) )
92- . executor ( SeismicExecutorBuilder :: default ( ) )
119+ . executor ( executor )
93120 . consensus ( SeismicConsensusBuilder :: default ( ) )
94121 }
95122
@@ -404,9 +431,14 @@ where
404431}
405432
406433/// A regular seismic evm and executor builder.
407- #[ derive( Debug , Default , Clone , Copy ) ]
408- #[ non_exhaustive]
409- pub struct SeismicExecutorBuilder ;
434+ ///
435+ /// When `purpose_keys` is `Some`, uses the injected keys directly.
436+ /// When `None`, falls back to the global [`crate::purpose_keys::get_purpose_keys`].
437+ #[ derive( Debug , Default , Clone ) ]
438+ pub struct SeismicExecutorBuilder {
439+ /// Structurally-injected purpose keys, or `None` for global fallback.
440+ purpose_keys : Option < & ' static seismic_enclave:: GetPurposeKeysResponse > ,
441+ }
410442
411443impl < Node > ExecutorBuilder < Node > for SeismicExecutorBuilder
412444where
@@ -415,7 +447,8 @@ where
415447 type EVM = SeismicEvmConfig ;
416448
417449 async fn build_evm ( self , ctx : & BuilderContext < Node > ) -> eyre:: Result < Self :: EVM > {
418- let purpose_keys = crate :: purpose_keys:: get_purpose_keys ( ) ;
450+ let purpose_keys =
451+ self . purpose_keys . unwrap_or_else ( || crate :: purpose_keys:: get_purpose_keys ( ) ) ;
419452 let evm_config = seismic_evm_config ( ctx. chain_spec ( ) , purpose_keys) ;
420453
421454 Ok ( evm_config)
0 commit comments