Skip to content

Commit 705782a

Browse files
committed
Remove logger from state struct, make state getters receivers on manager
1 parent f05ac47 commit 705782a

2 files changed

Lines changed: 54 additions & 65 deletions

File tree

shared/services/state/manager.go

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ type NetworkStateManager struct {
2222
beaconConfig *beacon.Eth2Config
2323

2424
// Multicaller and batch balance contract addresses
25-
contracts config.StateManagerContracts
25+
multicaller common.Address
26+
balanceBatcher common.Address
2627
}
2728

2829
// Create a new manager for the network state
@@ -35,10 +36,11 @@ func NewNetworkStateManager(
3536

3637
// Create the manager
3738
return &NetworkStateManager{
38-
rp: rp,
39-
bc: bc,
40-
log: log,
41-
contracts: contracts,
39+
rp: rp,
40+
bc: bc,
41+
log: log,
42+
multicaller: contracts.Multicaller,
43+
balanceBatcher: contracts.BalanceBatcher,
4244
}
4345
}
4446

@@ -144,11 +146,7 @@ func (m *NetworkStateManager) getLatestProposedBeaconBlock(targetSlot uint64) (b
144146

145147
// Get the state of the network at the provided Beacon slot
146148
func (m *NetworkStateManager) getState(slotNumber uint64) (*NetworkState, error) {
147-
beaconConfig, err := m.getBeaconConfig()
148-
if err != nil {
149-
return nil, fmt.Errorf("error getting Beacon config: %w", err)
150-
}
151-
state, err := createNetworkState(m.contracts, m.rp, m.bc, m.log, slotNumber, beaconConfig)
149+
state, err := m.createNetworkState(slotNumber)
152150
if err != nil {
153151
return nil, err
154152
}
@@ -157,11 +155,7 @@ func (m *NetworkStateManager) getState(slotNumber uint64) (*NetworkState, error)
157155

158156
// Get the state of the network for a specific node only at the provided Beacon slot
159157
func (m *NetworkStateManager) getStateForNode(nodeAddress common.Address, slotNumber uint64, calculateTotalEffectiveStake bool) (*NetworkState, *big.Int, error) {
160-
beaconConfig, err := m.getBeaconConfig()
161-
if err != nil {
162-
return nil, nil, fmt.Errorf("error getting Beacon config: %w", err)
163-
}
164-
state, totalEffectiveStake, err := createNetworkStateForNode(m.contracts, m.rp, m.bc, m.log, slotNumber, beaconConfig, nodeAddress, calculateTotalEffectiveStake)
158+
state, totalEffectiveStake, err := m.createNetworkStateForNode(slotNumber, nodeAddress, calculateTotalEffectiveStake)
165159
if err != nil {
166160
return nil, nil, err
167161
}
@@ -171,6 +165,6 @@ func (m *NetworkStateManager) getStateForNode(nodeAddress common.Address, slotNu
171165
// Logs a line if the logger is specified
172166
func (m *NetworkStateManager) logLine(format string, v ...interface{}) {
173167
if m.log != nil {
174-
m.log.Printlnf(format, v)
168+
m.log.Printlnf(format, v...)
175169
}
176170
}

shared/services/state/network-state.go

Lines changed: 44 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,10 @@ import (
99
"github.com/ethereum/go-ethereum/accounts/abi/bind"
1010
"github.com/ethereum/go-ethereum/common"
1111
"github.com/rocket-pool/smartnode/bindings/dao/protocol"
12-
"github.com/rocket-pool/smartnode/bindings/rocketpool"
1312
"github.com/rocket-pool/smartnode/bindings/types"
1413
"github.com/rocket-pool/smartnode/bindings/utils/eth"
1514
rpstate "github.com/rocket-pool/smartnode/bindings/utils/state"
1615
"github.com/rocket-pool/smartnode/shared/services/beacon"
17-
"github.com/rocket-pool/smartnode/shared/services/config"
18-
"github.com/rocket-pool/smartnode/shared/utils/log"
1916
"golang.org/x/sync/errgroup"
2017
)
2118

@@ -96,9 +93,6 @@ type NetworkState struct {
9693

9794
// Protocol DAO proposals
9895
ProtocolDaoProposalDetails []protocol.ProtocolDaoProposalDetails `json:"protocol_dao_proposal_details,omitempty"`
99-
100-
// Internal fields
101-
log *log.ColorLogger
10296
}
10397

10498
func (ns NetworkState) MarshalJSON() ([]byte, error) {
@@ -159,10 +153,10 @@ func (ns *NetworkState) UnmarshalJSON(data []byte) error {
159153
}
160154

161155
// Creates a snapshot of the entire Rocket Pool network state, on both the Execution and Consensus layers
162-
func createNetworkState(batchContracts config.StateManagerContracts, rp *rocketpool.RocketPool, bc beacon.Client, log *log.ColorLogger, slotNumber uint64, beaconConfig *beacon.Eth2Config) (*NetworkState, error) {
156+
func (m *NetworkStateManager) createNetworkState(slotNumber uint64) (*NetworkState, error) {
163157

164158
// Get the execution block for the given slot
165-
beaconBlock, exists, err := bc.GetBeaconBlock(fmt.Sprintf("%d", slotNumber))
159+
beaconBlock, exists, err := m.bc.GetBeaconBlock(fmt.Sprintf("%d", slotNumber))
166160
if err != nil {
167161
return nil, fmt.Errorf("error getting Beacon block for slot %d: %w", slotNumber, err)
168162
}
@@ -176,6 +170,11 @@ func createNetworkState(batchContracts config.StateManagerContracts, rp *rocketp
176170
BlockNumber: big.NewInt(0).SetUint64(elBlockNumber),
177171
}
178172

173+
beaconConfig, err := m.getBeaconConfig()
174+
if err != nil {
175+
return nil, fmt.Errorf("error getting Beacon config: %w", err)
176+
}
177+
179178
// Create the state wrapper
180179
state := &NetworkState{
181180
NodeDetailsByAddress: map[common.Address]*rpstate.NativeNodeDetails{},
@@ -184,36 +183,35 @@ func createNetworkState(batchContracts config.StateManagerContracts, rp *rocketp
184183
BeaconSlotNumber: slotNumber,
185184
ElBlockNumber: elBlockNumber,
186185
BeaconConfig: *beaconConfig,
187-
log: log,
188186
}
189187

190-
state.logLine("Getting network state for EL block %d, Beacon slot %d", elBlockNumber, slotNumber)
188+
m.logLine("Getting network state for EL block %d, Beacon slot %d", elBlockNumber, slotNumber)
191189
start := time.Now()
192190

193191
// Network contracts and details
194-
contracts, err := rpstate.NewNetworkContracts(rp, batchContracts.Multicaller, batchContracts.BalanceBatcher, opts)
192+
contracts, err := rpstate.NewNetworkContracts(m.rp, m.multicaller, m.balanceBatcher, opts)
195193
if err != nil {
196194
return nil, fmt.Errorf("error getting network contracts: %w", err)
197195
}
198-
state.NetworkDetails, err = rpstate.NewNetworkDetails(rp, contracts)
196+
state.NetworkDetails, err = rpstate.NewNetworkDetails(m.rp, contracts)
199197
if err != nil {
200198
return nil, fmt.Errorf("error getting network details: %w", err)
201199
}
202-
state.logLine("1/6 - Retrieved network details (%s so far)", time.Since(start))
200+
m.logLine("1/6 - Retrieved network details (%s so far)", time.Since(start))
203201

204202
// Node details
205-
state.NodeDetails, err = rpstate.GetAllNativeNodeDetails(rp, contracts)
203+
state.NodeDetails, err = rpstate.GetAllNativeNodeDetails(m.rp, contracts)
206204
if err != nil {
207205
return nil, fmt.Errorf("error getting all node details: %w", err)
208206
}
209-
state.logLine("2/6 - Retrieved node details (%s so far)", time.Since(start))
207+
m.logLine("2/6 - Retrieved node details (%s so far)", time.Since(start))
210208

211209
// Minipool details
212-
state.MinipoolDetails, err = rpstate.GetAllNativeMinipoolDetails(rp, contracts)
210+
state.MinipoolDetails, err = rpstate.GetAllNativeMinipoolDetails(m.rp, contracts)
213211
if err != nil {
214212
return nil, fmt.Errorf("error getting all minipool details: %w", err)
215213
}
216-
state.logLine("3/6 - Retrieved minipool details (%s so far)", time.Since(start))
214+
m.logLine("3/6 - Retrieved minipool details (%s so far)", time.Since(start))
217215

218216
// Create the node lookup
219217
for i, details := range state.NodeDetails {
@@ -244,21 +242,21 @@ func createNetworkState(batchContracts config.StateManagerContracts, rp *rocketp
244242
}
245243

246244
// Oracle DAO member details
247-
state.OracleDaoMemberDetails, err = rpstate.GetAllOracleDaoMemberDetails(rp, contracts)
245+
state.OracleDaoMemberDetails, err = rpstate.GetAllOracleDaoMemberDetails(m.rp, contracts)
248246
if err != nil {
249247
return nil, fmt.Errorf("error getting Oracle DAO details: %w", err)
250248
}
251-
state.logLine("4/6 - Retrieved Oracle DAO details (%s so far)", time.Since(start))
249+
m.logLine("4/6 - Retrieved Oracle DAO details (%s so far)", time.Since(start))
252250

253251
// Get the validator stats from Beacon
254-
statusMap, err := bc.GetValidatorStatuses(pubkeys, &beacon.ValidatorStatusOptions{
252+
statusMap, err := m.bc.GetValidatorStatuses(pubkeys, &beacon.ValidatorStatusOptions{
255253
Slot: &slotNumber,
256254
})
257255
if err != nil {
258256
return nil, err
259257
}
260258
state.ValidatorDetails = statusMap
261-
state.logLine("5/6 - Retrieved validator details (total time: %s)", time.Since(start))
259+
m.logLine("5/6 - Retrieved validator details (total time: %s)", time.Since(start))
262260

263261
// Get the complete node and user shares
264262
mpds := make([]*rpstate.NativeMinipoolDetails, len(state.MinipoolDetails))
@@ -272,26 +270,26 @@ func createNetworkState(batchContracts config.StateManagerContracts, rp *rocketp
272270
beaconBalances[i] = eth.GweiToWei(float64(validator.Balance))
273271
}
274272
}
275-
err = rpstate.CalculateCompleteMinipoolShares(rp, contracts, mpds, beaconBalances)
273+
err = rpstate.CalculateCompleteMinipoolShares(m.rp, contracts, mpds, beaconBalances)
276274
if err != nil {
277275
return nil, err
278276
}
279277
state.ValidatorDetails = statusMap
280-
state.logLine("6/6 - Calculated complete node and user balance shares (total time: %s)", time.Since(start))
278+
m.logLine("6/6 - Calculated complete node and user balance shares (total time: %s)", time.Since(start))
281279

282280
return state, nil
283281
}
284282

285283
// Creates a snapshot of the Rocket Pool network, but only for a single node
286284
// Also gets the total effective RPL stake of the network for convenience since this is required by several node routines
287-
func createNetworkStateForNode(batchContracts config.StateManagerContracts, rp *rocketpool.RocketPool, bc beacon.Client, log *log.ColorLogger, slotNumber uint64, beaconConfig *beacon.Eth2Config, nodeAddress common.Address, calculateTotalEffectiveStake bool) (*NetworkState, *big.Int, error) {
285+
func (m *NetworkStateManager) createNetworkStateForNode(slotNumber uint64, nodeAddress common.Address, calculateTotalEffectiveStake bool) (*NetworkState, *big.Int, error) {
288286
steps := 5
289287
if calculateTotalEffectiveStake {
290288
steps++
291289
}
292290

293291
// Get the execution block for the given slot
294-
beaconBlock, exists, err := bc.GetBeaconBlock(fmt.Sprintf("%d", slotNumber))
292+
beaconBlock, exists, err := m.bc.GetBeaconBlock(fmt.Sprintf("%d", slotNumber))
295293
if err != nil {
296294
return nil, nil, fmt.Errorf("error getting Beacon block for slot %d: %w", slotNumber, err)
297295
}
@@ -305,6 +303,11 @@ func createNetworkStateForNode(batchContracts config.StateManagerContracts, rp *
305303
BlockNumber: big.NewInt(0).SetUint64(elBlockNumber),
306304
}
307305

306+
beaconConfig, err := m.getBeaconConfig()
307+
if err != nil {
308+
return nil, nil, fmt.Errorf("error getting Beacon config: %w", err)
309+
}
310+
308311
// Create the state wrapper
309312
state := &NetworkState{
310313
NodeDetailsByAddress: map[common.Address]*rpstate.NativeNodeDetails{},
@@ -313,37 +316,36 @@ func createNetworkStateForNode(batchContracts config.StateManagerContracts, rp *
313316
BeaconSlotNumber: slotNumber,
314317
ElBlockNumber: elBlockNumber,
315318
BeaconConfig: *beaconConfig,
316-
log: log,
317319
}
318320

319-
state.logLine("Getting network state for EL block %d, Beacon slot %d", elBlockNumber, slotNumber)
321+
m.logLine("Getting network state for EL block %d, Beacon slot %d", elBlockNumber, slotNumber)
320322
start := time.Now()
321323

322324
// Network contracts and details
323-
contracts, err := rpstate.NewNetworkContracts(rp, batchContracts.Multicaller, batchContracts.BalanceBatcher, opts)
325+
contracts, err := rpstate.NewNetworkContracts(m.rp, m.multicaller, m.balanceBatcher, opts)
324326
if err != nil {
325327
return nil, nil, fmt.Errorf("error getting network contracts: %w", err)
326328
}
327-
state.NetworkDetails, err = rpstate.NewNetworkDetails(rp, contracts)
329+
state.NetworkDetails, err = rpstate.NewNetworkDetails(m.rp, contracts)
328330
if err != nil {
329331
return nil, nil, fmt.Errorf("error getting network details: %w", err)
330332
}
331-
state.logLine("1/%d - Retrieved network details (%s so far)", steps, time.Since(start))
333+
m.logLine("1/%d - Retrieved network details (%s so far)", steps, time.Since(start))
332334

333335
// Node details
334-
nodeDetails, err := rpstate.GetNativeNodeDetails(rp, contracts, nodeAddress)
336+
nodeDetails, err := rpstate.GetNativeNodeDetails(m.rp, contracts, nodeAddress)
335337
if err != nil {
336338
return nil, nil, fmt.Errorf("error getting node details: %w", err)
337339
}
338340
state.NodeDetails = []rpstate.NativeNodeDetails{nodeDetails}
339-
state.logLine("2/%d - Retrieved node details (%s so far)", steps, time.Since(start))
341+
m.logLine("2/%d - Retrieved node details (%s so far)", steps, time.Since(start))
340342

341343
// Minipool details
342-
state.MinipoolDetails, err = rpstate.GetNodeNativeMinipoolDetails(rp, contracts, nodeAddress)
344+
state.MinipoolDetails, err = rpstate.GetNodeNativeMinipoolDetails(m.rp, contracts, nodeAddress)
343345
if err != nil {
344346
return nil, nil, fmt.Errorf("error getting all minipool details: %w", err)
345347
}
346-
state.logLine("3/%d - Retrieved minipool details (%s so far)", steps, time.Since(start))
348+
m.logLine("3/%d - Retrieved minipool details (%s so far)", steps, time.Since(start))
347349

348350
// Create the node lookup
349351
for i, details := range state.NodeDetails {
@@ -377,23 +379,23 @@ func createNetworkStateForNode(batchContracts config.StateManagerContracts, rp *
377379
currentStep := 4
378380
var totalEffectiveStake *big.Int
379381
if calculateTotalEffectiveStake {
380-
totalEffectiveStake, err = rpstate.GetTotalEffectiveRplStake(rp, contracts)
382+
totalEffectiveStake, err = rpstate.GetTotalEffectiveRplStake(m.rp, contracts)
381383
if err != nil {
382384
return nil, nil, fmt.Errorf("error calculating total effective RPL stake for the network: %w", err)
383385
}
384-
state.logLine("%d/%d - Calculated total effective stake (total time: %s)", currentStep, steps, time.Since(start))
386+
m.logLine("%d/%d - Calculated total effective stake (total time: %s)", currentStep, steps, time.Since(start))
385387
currentStep++
386388
}
387389

388390
// Get the validator stats from Beacon
389-
statusMap, err := bc.GetValidatorStatuses(pubkeys, &beacon.ValidatorStatusOptions{
391+
statusMap, err := m.bc.GetValidatorStatuses(pubkeys, &beacon.ValidatorStatusOptions{
390392
Slot: &slotNumber,
391393
})
392394
if err != nil {
393395
return nil, nil, err
394396
}
395397
state.ValidatorDetails = statusMap
396-
state.logLine("%d/%d - Retrieved validator details (total time: %s)", currentStep, steps, time.Since(start))
398+
m.logLine("%d/%d - Retrieved validator details (total time: %s)", currentStep, steps, time.Since(start))
397399
currentStep++
398400

399401
// Get the complete node and user shares
@@ -408,20 +410,20 @@ func createNetworkStateForNode(batchContracts config.StateManagerContracts, rp *
408410
beaconBalances[i] = eth.GweiToWei(float64(validator.Balance))
409411
}
410412
}
411-
err = rpstate.CalculateCompleteMinipoolShares(rp, contracts, mpds, beaconBalances)
413+
err = rpstate.CalculateCompleteMinipoolShares(m.rp, contracts, mpds, beaconBalances)
412414
if err != nil {
413415
return nil, nil, err
414416
}
415417
state.ValidatorDetails = statusMap
416-
state.logLine("%d/%d - Calculated complete node and user balance shares (total time: %s)", currentStep, steps, time.Since(start))
418+
m.logLine("%d/%d - Calculated complete node and user balance shares (total time: %s)", currentStep, steps, time.Since(start))
417419
currentStep++
418420

419421
// Get the protocol DAO proposals
420-
state.ProtocolDaoProposalDetails, err = rpstate.GetAllProtocolDaoProposalDetails(rp, contracts)
422+
state.ProtocolDaoProposalDetails, err = rpstate.GetAllProtocolDaoProposalDetails(m.rp, contracts)
421423
if err != nil {
422424
return nil, nil, fmt.Errorf("error getting Protocol DAO proposal details: %w", err)
423425
}
424-
state.logLine("%d/%d - Retrieved Protocol DAO proposals (total time: %s)", currentStep, steps, time.Since(start))
426+
m.logLine("%d/%d - Retrieved Protocol DAO proposals (total time: %s)", currentStep, steps, time.Since(start))
425427
currentStep++
426428

427429
return state, totalEffectiveStake, nil
@@ -681,10 +683,3 @@ func (s *NetworkState) CalculateTrueEffectiveStakes(scaleByParticipation bool, a
681683
return effectiveStakes, totalEffectiveStake, nil
682684

683685
}
684-
685-
// Logs a line if the logger is specified
686-
func (s *NetworkState) logLine(format string, v ...interface{}) {
687-
if s.log != nil {
688-
s.log.Printlnf(format, v...)
689-
}
690-
}

0 commit comments

Comments
 (0)