Skip to content

Commit a221792

Browse files
committed
Remove totalEffectiveStake calculation from state manager
1 parent 705782a commit a221792

6 files changed

Lines changed: 30 additions & 87 deletions

File tree

rocketpool/node/collectors/node-collector.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,6 @@ func (collector *NodeCollector) Collect(channel chan<- prometheus.Metric) {
266266
rewardsInterval := state.NetworkDetails.IntervalDuration
267267
inflationInterval := state.NetworkDetails.RPLInflationIntervalRate
268268
totalRplSupply := state.NetworkDetails.RPLTotalSupply
269-
totalEffectiveStake := collector.stateLocker.GetTotalEffectiveRPLStake()
270269
nodeOperatorRewardsPercent := eth.WeiToEth(state.NetworkDetails.NodeOperatorRewardsPercent)
271270
previousIntervalTotalNodeWeight := big.NewInt(0)
272271
ethBalance := eth.WeiToEth(nd.BalanceETH)
@@ -280,9 +279,6 @@ func (collector *NodeCollector) Collect(channel chan<- prometheus.Metric) {
280279
var beaconHead beacon.BeaconHead
281280
unclaimedEthRewards := float64(0)
282281
unclaimedRplRewards := float64(0)
283-
if totalEffectiveStake == nil {
284-
return
285-
}
286282

287283
// Get the cumulative claimed and unclaimed RPL rewards
288284
wg.Go(func() error {
@@ -531,7 +527,7 @@ func (collector *NodeCollector) Collect(channel chan<- prometheus.Metric) {
531527
* period we don't attempt an estimate and simply use 0.
532528
*/
533529
estimatedRewards := float64(0)
534-
if totalEffectiveStake.Cmp(big.NewInt(0)) == 1 && nodeWeight.Cmp(big.NewInt(0)) == 1 && state.NetworkDetails.RewardIndex > 0 {
530+
if nodeWeight.Cmp(big.NewInt(0)) == 1 && state.NetworkDetails.RewardIndex > 0 {
535531

536532
nodeWeightSum := big.NewInt(0).Add(nodeWeight, previousIntervalTotalNodeWeight)
537533

rocketpool/node/collectors/rpl-collector.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ type RplCollector struct {
1818
totalValueStaked *prometheus.Desc
1919

2020
// The total effective amount of RPL staked on the network
21+
// Obsolete, but still populated so the dashboard can show it.
2122
totalEffectiveStaked *prometheus.Desc
2223

2324
// The date and time of the next RPL rewards checkpoint
@@ -81,20 +82,18 @@ func (collector *RplCollector) Collect(channel chan<- prometheus.Metric) {
8182

8283
rplPriceFloat := eth.WeiToEth(state.NetworkDetails.RplPrice)
8384
totalValueStakedFloat := eth.WeiToEth(state.NetworkDetails.TotalRPLStake)
84-
totalEffectiveStake := collector.stateLocker.GetTotalEffectiveRPLStake()
8585
lastCheckpoint := state.NetworkDetails.IntervalStart
8686
rewardsInterval := state.NetworkDetails.IntervalDuration
8787
nextRewardsTime := float64(lastCheckpoint.Add(rewardsInterval).Unix()) * 1000
88-
if totalEffectiveStake == nil {
89-
return
90-
}
9188

9289
channel <- prometheus.MustNewConstMetric(
9390
collector.rplPrice, prometheus.GaugeValue, rplPriceFloat)
9491
channel <- prometheus.MustNewConstMetric(
9592
collector.totalValueStaked, prometheus.GaugeValue, totalValueStakedFloat)
93+
// All staked RPL is effective RPL, but this metric is on the dashboard so we
94+
// should keep populating it for now.
9695
channel <- prometheus.MustNewConstMetric(
97-
collector.totalEffectiveStaked, prometheus.GaugeValue, eth.WeiToEth(totalEffectiveStake))
96+
collector.totalEffectiveStaked, prometheus.GaugeValue, totalValueStakedFloat)
9897
channel <- prometheus.MustNewConstMetric(
9998
collector.checkpointTime, prometheus.GaugeValue, nextRewardsTime)
10099
}
Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
package collectors
22

33
import (
4-
"math/big"
54
"sync"
65

76
"github.com/rocket-pool/smartnode/shared/services/state"
87
)
98

109
type StateLocker struct {
11-
state *state.NetworkState
12-
totalEffectiveStake *big.Int
10+
state *state.NetworkState
1311

1412
// Internal fields
1513
lock *sync.Mutex
@@ -21,23 +19,14 @@ func NewStateLocker() *StateLocker {
2119
}
2220
}
2321

24-
func (l *StateLocker) UpdateState(state *state.NetworkState, totalEffectiveStake *big.Int) {
22+
func (l *StateLocker) UpdateState(state *state.NetworkState) {
2523
l.lock.Lock()
2624
defer l.lock.Unlock()
2725
l.state = state
28-
if totalEffectiveStake != nil {
29-
l.totalEffectiveStake = totalEffectiveStake
30-
}
3126
}
3227

3328
func (l *StateLocker) GetState() *state.NetworkState {
3429
l.lock.Lock()
3530
defer l.lock.Unlock()
3631
return l.state
3732
}
38-
39-
func (l *StateLocker) GetTotalEffectiveRPLStake() *big.Int {
40-
l.lock.Lock()
41-
defer l.lock.Unlock()
42-
return l.totalEffectiveStake
43-
}

rocketpool/node/node.go

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import (
2727
// Config
2828
var tasksInterval, _ = time.ParseDuration("5m")
2929
var taskCooldown, _ = time.ParseDuration("10s")
30-
var totalEffectiveStakeCooldown, _ = time.ParseDuration("1h")
3130

3231
const (
3332
MaxConcurrentEth1Requests = 200
@@ -172,9 +171,6 @@ func run(c *cli.Context) error {
172171
wg := new(sync.WaitGroup)
173172
wg.Add(2)
174173

175-
// Timestamp for caching total effective RPL stake
176-
lastTotalEffectiveStakeTime := time.Unix(0, 0)
177-
178174
// Run task loop
179175
go func() {
180176
// we assume clients are synced on startup so that we don't send unnecessary alerts
@@ -213,18 +209,13 @@ func run(c *cli.Context) error {
213209
}
214210

215211
// Update the network state
216-
updateTotalEffectiveStake := false
217-
if time.Since(lastTotalEffectiveStakeTime) > totalEffectiveStakeCooldown {
218-
updateTotalEffectiveStake = true
219-
lastTotalEffectiveStakeTime = time.Now() // Even if the call below errors out, this will prevent contant errors related to this flag
220-
}
221-
state, totalEffectiveStake, err := updateNetworkState(m, &updateLog, nodeAccount.Address, updateTotalEffectiveStake)
212+
state, err := updateNetworkState(m, &updateLog, nodeAccount.Address)
222213
if err != nil {
223214
errorLog.Println(err)
224215
time.Sleep(taskCooldown)
225216
continue
226217
}
227-
stateLocker.UpdateState(state, totalEffectiveStake)
218+
stateLocker.UpdateState(state)
228219

229220
// Manage the fee recipient for the node
230221
if err := manageFeeRecipient.run(state); err != nil {
@@ -382,13 +373,13 @@ func removeLegacyFeeRecipientFiles(c *cli.Context) error {
382373
}
383374

384375
// Update the latest network state at each cycle
385-
func updateNetworkState(m *state.NetworkStateManager, log *log.ColorLogger, nodeAddress common.Address, calculateTotalEffectiveStake bool) (*state.NetworkState, *big.Int, error) {
376+
func updateNetworkState(m *state.NetworkStateManager, log *log.ColorLogger, nodeAddress common.Address) (*state.NetworkState, error) {
386377
// Get the state of the network
387-
state, totalEffectiveStake, err := m.GetHeadStateForNode(nodeAddress, calculateTotalEffectiveStake)
378+
state, err := m.GetHeadStateForNode(nodeAddress)
388379
if err != nil {
389-
return nil, nil, fmt.Errorf("error updating network state: %w", err)
380+
return nil, fmt.Errorf("error updating network state: %w", err)
390381
}
391-
return state, totalEffectiveStake, nil
382+
return state, nil
392383
}
393384

394385
// Checks if the user-inputted priorityFee is greater than the oracle based maxFee

shared/services/state/manager.go

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package state
33
import (
44
"context"
55
"fmt"
6-
"math/big"
76
"time"
87

98
"github.com/ethereum/go-ethereum/common"
@@ -65,21 +64,21 @@ func (m *NetworkStateManager) GetHeadState() (*NetworkState, error) {
6564
if err != nil {
6665
return nil, fmt.Errorf("error getting latest Beacon slot: %w", err)
6766
}
68-
return m.getState(targetSlot)
67+
return m.createNetworkState(targetSlot)
6968
}
7069

7170
// Get the state of the network for a single node using the latest Execution layer block, along with the total effective RPL stake for the network
72-
func (m *NetworkStateManager) GetHeadStateForNode(nodeAddress common.Address, calculateTotalEffectiveStake bool) (*NetworkState, *big.Int, error) {
71+
func (m *NetworkStateManager) GetHeadStateForNode(nodeAddress common.Address) (*NetworkState, error) {
7372
targetSlot, err := m.getHeadSlot()
7473
if err != nil {
75-
return nil, nil, fmt.Errorf("error getting latest Beacon slot: %w", err)
74+
return nil, fmt.Errorf("error getting latest Beacon slot: %w", err)
7675
}
77-
return m.getStateForNode(nodeAddress, targetSlot, calculateTotalEffectiveStake)
76+
return m.createNetworkStateForNode(targetSlot, nodeAddress)
7877
}
7978

8079
// Get the state of the network at the provided Beacon slot
8180
func (m *NetworkStateManager) GetStateForSlot(slotNumber uint64) (*NetworkState, error) {
82-
return m.getState(slotNumber)
81+
return m.createNetworkState(slotNumber)
8382
}
8483

8584
// Gets the latest valid block
@@ -144,24 +143,6 @@ func (m *NetworkStateManager) getLatestProposedBeaconBlock(targetSlot uint64) (b
144143
}
145144
}
146145

147-
// Get the state of the network at the provided Beacon slot
148-
func (m *NetworkStateManager) getState(slotNumber uint64) (*NetworkState, error) {
149-
state, err := m.createNetworkState(slotNumber)
150-
if err != nil {
151-
return nil, err
152-
}
153-
return state, nil
154-
}
155-
156-
// Get the state of the network for a specific node only at the provided Beacon slot
157-
func (m *NetworkStateManager) getStateForNode(nodeAddress common.Address, slotNumber uint64, calculateTotalEffectiveStake bool) (*NetworkState, *big.Int, error) {
158-
state, totalEffectiveStake, err := m.createNetworkStateForNode(slotNumber, nodeAddress, calculateTotalEffectiveStake)
159-
if err != nil {
160-
return nil, nil, err
161-
}
162-
return state, totalEffectiveStake, nil
163-
}
164-
165146
// Logs a line if the logger is specified
166147
func (m *NetworkStateManager) logLine(format string, v ...interface{}) {
167148
if m.log != nil {

shared/services/state/network-state.go

Lines changed: 12 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -281,20 +281,16 @@ func (m *NetworkStateManager) createNetworkState(slotNumber uint64) (*NetworkSta
281281
}
282282

283283
// Creates a snapshot of the Rocket Pool network, but only for a single node
284-
// Also gets the total effective RPL stake of the network for convenience since this is required by several node routines
285-
func (m *NetworkStateManager) createNetworkStateForNode(slotNumber uint64, nodeAddress common.Address, calculateTotalEffectiveStake bool) (*NetworkState, *big.Int, error) {
284+
func (m *NetworkStateManager) createNetworkStateForNode(slotNumber uint64, nodeAddress common.Address) (*NetworkState, error) {
286285
steps := 5
287-
if calculateTotalEffectiveStake {
288-
steps++
289-
}
290286

291287
// Get the execution block for the given slot
292288
beaconBlock, exists, err := m.bc.GetBeaconBlock(fmt.Sprintf("%d", slotNumber))
293289
if err != nil {
294-
return nil, nil, fmt.Errorf("error getting Beacon block for slot %d: %w", slotNumber, err)
290+
return nil, fmt.Errorf("error getting Beacon block for slot %d: %w", slotNumber, err)
295291
}
296292
if !exists {
297-
return nil, nil, fmt.Errorf("slot %d did not have a Beacon block", slotNumber)
293+
return nil, fmt.Errorf("slot %d did not have a Beacon block", slotNumber)
298294
}
299295

300296
// Get the corresponding block on the EL
@@ -305,7 +301,7 @@ func (m *NetworkStateManager) createNetworkStateForNode(slotNumber uint64, nodeA
305301

306302
beaconConfig, err := m.getBeaconConfig()
307303
if err != nil {
308-
return nil, nil, fmt.Errorf("error getting Beacon config: %w", err)
304+
return nil, fmt.Errorf("error getting Beacon config: %w", err)
309305
}
310306

311307
// Create the state wrapper
@@ -324,26 +320,26 @@ func (m *NetworkStateManager) createNetworkStateForNode(slotNumber uint64, nodeA
324320
// Network contracts and details
325321
contracts, err := rpstate.NewNetworkContracts(m.rp, m.multicaller, m.balanceBatcher, opts)
326322
if err != nil {
327-
return nil, nil, fmt.Errorf("error getting network contracts: %w", err)
323+
return nil, fmt.Errorf("error getting network contracts: %w", err)
328324
}
329325
state.NetworkDetails, err = rpstate.NewNetworkDetails(m.rp, contracts)
330326
if err != nil {
331-
return nil, nil, fmt.Errorf("error getting network details: %w", err)
327+
return nil, fmt.Errorf("error getting network details: %w", err)
332328
}
333329
m.logLine("1/%d - Retrieved network details (%s so far)", steps, time.Since(start))
334330

335331
// Node details
336332
nodeDetails, err := rpstate.GetNativeNodeDetails(m.rp, contracts, nodeAddress)
337333
if err != nil {
338-
return nil, nil, fmt.Errorf("error getting node details: %w", err)
334+
return nil, fmt.Errorf("error getting node details: %w", err)
339335
}
340336
state.NodeDetails = []rpstate.NativeNodeDetails{nodeDetails}
341337
m.logLine("2/%d - Retrieved node details (%s so far)", steps, time.Since(start))
342338

343339
// Minipool details
344340
state.MinipoolDetails, err = rpstate.GetNodeNativeMinipoolDetails(m.rp, contracts, nodeAddress)
345341
if err != nil {
346-
return nil, nil, fmt.Errorf("error getting all minipool details: %w", err)
342+
return nil, fmt.Errorf("error getting all minipool details: %w", err)
347343
}
348344
m.logLine("3/%d - Retrieved minipool details (%s so far)", steps, time.Since(start))
349345

@@ -377,22 +373,13 @@ func (m *NetworkStateManager) createNetworkStateForNode(slotNumber uint64, nodeA
377373

378374
// Get the total network effective RPL stake
379375
currentStep := 4
380-
var totalEffectiveStake *big.Int
381-
if calculateTotalEffectiveStake {
382-
totalEffectiveStake, err = rpstate.GetTotalEffectiveRplStake(m.rp, contracts)
383-
if err != nil {
384-
return nil, nil, fmt.Errorf("error calculating total effective RPL stake for the network: %w", err)
385-
}
386-
m.logLine("%d/%d - Calculated total effective stake (total time: %s)", currentStep, steps, time.Since(start))
387-
currentStep++
388-
}
389376

390377
// Get the validator stats from Beacon
391378
statusMap, err := m.bc.GetValidatorStatuses(pubkeys, &beacon.ValidatorStatusOptions{
392379
Slot: &slotNumber,
393380
})
394381
if err != nil {
395-
return nil, nil, err
382+
return nil, err
396383
}
397384
state.ValidatorDetails = statusMap
398385
m.logLine("%d/%d - Retrieved validator details (total time: %s)", currentStep, steps, time.Since(start))
@@ -412,7 +399,7 @@ func (m *NetworkStateManager) createNetworkStateForNode(slotNumber uint64, nodeA
412399
}
413400
err = rpstate.CalculateCompleteMinipoolShares(m.rp, contracts, mpds, beaconBalances)
414401
if err != nil {
415-
return nil, nil, err
402+
return nil, err
416403
}
417404
state.ValidatorDetails = statusMap
418405
m.logLine("%d/%d - Calculated complete node and user balance shares (total time: %s)", currentStep, steps, time.Since(start))
@@ -421,12 +408,12 @@ func (m *NetworkStateManager) createNetworkStateForNode(slotNumber uint64, nodeA
421408
// Get the protocol DAO proposals
422409
state.ProtocolDaoProposalDetails, err = rpstate.GetAllProtocolDaoProposalDetails(m.rp, contracts)
423410
if err != nil {
424-
return nil, nil, fmt.Errorf("error getting Protocol DAO proposal details: %w", err)
411+
return nil, fmt.Errorf("error getting Protocol DAO proposal details: %w", err)
425412
}
426413
m.logLine("%d/%d - Retrieved Protocol DAO proposals (total time: %s)", currentStep, steps, time.Since(start))
427414
currentStep++
428415

429-
return state, totalEffectiveStake, nil
416+
return state, nil
430417
}
431418

432419
func (s *NetworkState) GetStakedRplValueInEthAndPercentOfBorrowedEth(eligibleBorrowedEth *big.Int, nodeStake *big.Int) (*big.Int, *big.Int) {

0 commit comments

Comments
 (0)