Skip to content

Commit bd91074

Browse files
jordanschalmAlexander Hentschel
and
Alexander Hentschel
authored
Rename Stake to Weight (#2090)
* rename: stake->weight (comments/variables 1) * auto-rename Identity.Stake struct field * rename missed variable * rename WithStake * rename unittest.WithStake * rename mockStakedAtBlockID * rename ensureStakedNodeWithRole * update flow.Identity * rename filter.HasStake * rename bootstrap models * rename IsNodeStaked helpers * rename stake references in hotstuff * collection engines * en engines * vn engine * validation rename * update bootstrap cli * update outstanding comments * outstanding string variables * rename in integration tests * don't use Identity when staking in fvn bootstrap * remove unecessary stealthIdentity * backward-compatible decoding Identity, NodeConfig, NodeInfoPub * misc cleanups * typo * Apply suggestions from code review Co-authored-by: Alexander Hentschel <[email protected]> * additional instances of stake term Co-authored-by: Alexander Hentschel <[email protected]>
1 parent e7fec51 commit bd91074

File tree

101 files changed

+1123
-903
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

101 files changed

+1123
-903
lines changed

Diff for: cmd/bootstrap/README.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ The bootstrapping will generate the following information:
2929
- node role
3030
- public staking key
3131
- public networking key
32-
- stake
32+
- weight
3333

3434
#### Root Block for main consensus
3535
* Root Block
@@ -92,8 +92,8 @@ Each input is a config file specified as a command line parameter:
9292
* parameter with state commitment for the initial execution state (`root-commit`)
9393
* `json` containing configuration for all Dapper-Controlled nodes (see `./example_files/node-config.json`)
9494
* folder containing the `<NodeID>.node-info.pub.json` files for _all_ partner nodes (see `.example_files/partner-node-infos`)
95-
* `json` containing the stake value for all partner nodes (see `./example_files/partner-stakes.json`).
96-
Format: ```<NodeID>: <stake value>```
95+
* `json` containing the weight value for all partner nodes (see `./example_files/partner-weights.json`).
96+
Format: ```<NodeID>: <weight value>```
9797

9898
#### Example
9999
```bash
@@ -105,7 +105,7 @@ go run -tags relic ./cmd/bootstrap finalize \
105105
--root-commit 4b8d01975cf0cd23e046b1fae36518e542f92a6e35bedd627c43da30f4ae761a \
106106
--config ./cmd/bootstrap/example_files/node-config.json \
107107
--partner-dir ./cmd/bootstrap/example_files/partner-node-infos \
108-
--partner-stakes ./cmd/bootstrap/example_files/partner-stakes.json \
108+
--partner-weights ./cmd/bootstrap/example_files/partner-weights.json \
109109
--epoch-counter 1 \
110110
-o ./bootstrap/root-infos
111111
```

Diff for: cmd/bootstrap/cmd/constraints.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,16 @@ import (
99
// ensureUniformNodeWeightsPerRole verifies that the following condition is satisfied for each role R:
1010
// * all node with role R must have the same weight
1111
func ensureUniformNodeWeightsPerRole(allNodes flow.IdentityList) {
12-
// ensure all nodes of the same role have equal stake/weight
12+
// ensure all nodes of the same role have equal weight
1313
for _, role := range flow.Roles() {
1414
withRole := allNodes.Filter(filter.HasRole(role))
15-
expectedStake := withRole[0].Stake
15+
expectedWeight := withRole[0].Weight
1616
for _, node := range withRole {
17-
if node.Stake != expectedStake {
17+
if node.Weight != expectedWeight {
1818
log.Fatal().Msgf(
19-
"will not bootstrap configuration with non-equal stakes\n"+
20-
"found nodes with role %s and stake1=%d, stake2=%d",
21-
role, expectedStake, node.Stake)
19+
"will not bootstrap configuration with non-equal weights\n"+
20+
"found nodes with role %s and weight1=%d, weight2=%d",
21+
role, expectedWeight, node.Weight)
2222
}
2323
}
2424
}

Diff for: cmd/bootstrap/cmd/final_list.go

+93-74
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ var (
1212
flagStakingNodesPath string
1313
)
1414

15-
// finallistCmd represents the final list command
15+
// finalListCmd represents the final list command
1616
var finalListCmd = &cobra.Command{
1717
Use: "finallist",
1818
Short: "generates a final list of nodes to be used for next network",
@@ -45,92 +45,105 @@ func addFinalListFlags() {
4545
func finalList(cmd *cobra.Command, args []string) {
4646
// read public partner node infos
4747
log.Info().Msgf("reading partner public node information: %s", flagPartnerNodeInfoDir)
48-
partnerNodes := assemblePartnerNodesWithoutStake()
48+
partnerNodes := assemblePartnerNodesWithoutWeight()
4949

5050
// read internal private node infos
5151
log.Info().Msgf("reading internal/flow private node information: %s", flagInternalNodePrivInfoDir)
52-
flowNodes := assembleInternalNodesWithoutStake()
52+
internalNodes := assembleInternalNodesWithoutWeight()
5353

5454
log.Info().Msg("checking constraints on consensus/cluster nodes")
55-
checkConstraints(partnerNodes, flowNodes)
55+
checkConstraints(partnerNodes, internalNodes)
5656

57+
// nodes which are registered on-chain
5758
log.Info().Msgf("reading staking contract node information: %s", flagStakingNodesPath)
58-
stakingNodes := readStakingContractDetails()
59+
registeredNodes := readStakingContractDetails()
5960

60-
// merge internal and partner node infos
61-
mixedNodeInfos := mergeNodeInfos(flowNodes, partnerNodes)
61+
// merge internal and partner node infos (from local files)
62+
localNodes := mergeNodeInfos(internalNodes, partnerNodes)
6263

6364
// reconcile nodes from staking contract nodes
64-
validateNodes(mixedNodeInfos, stakingNodes)
65+
validateNodes(localNodes, registeredNodes)
6566

6667
// write node-config.json with the new list of nodes to be used for the `finalize` command
67-
writeJSON(model.PathFinallist, model.ToPublicNodeInfoList(mixedNodeInfos))
68+
writeJSON(model.PathFinallist, model.ToPublicNodeInfoList(localNodes))
6869
}
6970

70-
func validateNodes(nodes []model.NodeInfo, stakingNodes []model.NodeInfo) {
71+
func validateNodes(localNodes []model.NodeInfo, registeredNodes []model.NodeInfo) {
7172
// check node count
72-
if len(nodes) != len(stakingNodes) {
73-
log.Error().Int("nodes", len(nodes)).Int("staked nodes", len(stakingNodes)).
74-
Msg("staked node count does not match flow and parnter node count")
73+
if len(localNodes) != len(registeredNodes) {
74+
log.Error().
75+
Int("local", len(localNodes)).
76+
Int("onchain", len(registeredNodes)).
77+
Msg("onchain node count does not match local internal+partner node count")
7578
}
7679

77-
// check staked and collected nodes and make sure node ID are not missing
78-
validateNodeIDs(nodes, stakingNodes)
80+
// check registered and local nodes to make sure node ID are not missing
81+
validateNodeIDs(localNodes, registeredNodes)
7982

80-
// print mis matching nodes
81-
checkMisMatchingNodes(nodes, stakingNodes)
83+
// print mismatching nodes
84+
checkMismatchingNodes(localNodes, registeredNodes)
8285

8386
// create map
84-
nodesByID := make(map[flow.Identifier]model.NodeInfo)
85-
for _, node := range nodes {
86-
nodesByID[node.NodeID] = node
87+
localNodeMap := make(map[flow.Identifier]model.NodeInfo)
88+
for _, node := range localNodes {
89+
localNodeMap[node.NodeID] = node
8790
}
8891

8992
// check node type mismatch
90-
for _, stakedNode := range stakingNodes {
93+
for _, registeredNode := range registeredNodes {
9194

9295
// win have matching node as we have a check before
93-
matchingNode := nodesByID[stakedNode.NodeID]
96+
matchingNode := localNodeMap[registeredNode.NodeID]
9497

9598
// check node type and error if mismatch
96-
if matchingNode.Role != stakedNode.Role {
97-
log.Error().Str("staked node", stakedNode.NodeID.String()).
98-
Str("staked node-type", stakedNode.Role.String()).
99-
Str("node", matchingNode.NodeID.String()).
100-
Str("node-type", matchingNode.Role.String()).
101-
Msg("node type does not match")
99+
if matchingNode.Role != registeredNode.Role {
100+
log.Error().
101+
Str("registered node id", registeredNode.NodeID.String()).
102+
Str("registered node role", registeredNode.Role.String()).
103+
Str("local node", matchingNode.NodeID.String()).
104+
Str("local node role", matchingNode.Role.String()).
105+
Msg("node role does not match")
102106
}
103107

104-
// No need to error adderss, and public keys as they may be different
105-
// we only keep node-id constant through out sporks
108+
if matchingNode.Address != registeredNode.Address {
109+
log.Error().
110+
Str("registered node id", registeredNode.NodeID.String()).
111+
Str("registered node address", registeredNode.Address).
112+
Str("local node", matchingNode.NodeID.String()).
113+
Str("local node address", matchingNode.Address).
114+
Msg("node address does not match")
115+
}
106116

107117
// check address match
108-
if matchingNode.Address != stakedNode.Address {
109-
log.Warn().Str("staked node", stakedNode.NodeID.String()).
110-
Str("node", matchingNode.NodeID.String()).
118+
if matchingNode.Address != registeredNode.Address {
119+
log.Warn().
120+
Str("registered node", registeredNode.NodeID.String()).
121+
Str("node id", matchingNode.NodeID.String()).
111122
Msg("address do not match")
112123
}
113124

114-
// flow nodes contain private key info
125+
// flow localNodes contain private key info
115126
if matchingNode.NetworkPubKey().String() != "" {
116127
// check networking pubkey match
117128
matchNodeKey := matchingNode.NetworkPubKey().String()
118-
stakedNodeKey := stakedNode.NetworkPubKey().String()
129+
registeredNodeKey := registeredNode.NetworkPubKey().String()
119130

120-
if matchNodeKey != stakedNodeKey {
121-
log.Warn().Str("staked network key", stakedNodeKey).
131+
if matchNodeKey != registeredNodeKey {
132+
log.Error().
133+
Str("registered network key", registeredNodeKey).
122134
Str("network key", matchNodeKey).
123135
Msg("networking keys do not match")
124136
}
125137
}
126138

127-
// flow nodes contain priv atekey info
139+
// flow localNodes contain privatekey info
128140
if matchingNode.StakingPubKey().String() != "" {
129141
matchNodeKey := matchingNode.StakingPubKey().String()
130-
stakedNodeKey := stakedNode.StakingPubKey().String()
142+
registeredNodeKey := registeredNode.StakingPubKey().String()
131143

132-
if matchNodeKey != stakedNodeKey {
133-
log.Warn().Str("staked staking key", stakedNodeKey).
144+
if matchNodeKey != registeredNodeKey {
145+
log.Error().
146+
Str("registered staking key", registeredNodeKey).
134147
Str("staking key", matchNodeKey).
135148
Msg("staking keys do not match")
136149
}
@@ -140,31 +153,31 @@ func validateNodes(nodes []model.NodeInfo, stakingNodes []model.NodeInfo) {
140153

141154
// validateNodeIDs will go through both sets of nodes and ensure that no node-id
142155
// are missing. It will log all missing node ID's and throw an error.
143-
func validateNodeIDs(collectedNodes []model.NodeInfo, stakedNodes []model.NodeInfo) {
156+
func validateNodeIDs(localNodes []model.NodeInfo, registeredNodes []model.NodeInfo) {
144157

145-
// go through staking nodes
158+
// go through registered nodes
146159
invalidStakingNodes := make([]model.NodeInfo, 0)
147-
for _, node := range stakedNodes {
160+
for _, node := range registeredNodes {
148161
if node.NodeID.String() == "" {
149162

150163
// we warn here but exit later
151164
invalidStakingNodes = append(invalidStakingNodes, node)
152165
log.Warn().
153166
Str("node-address", node.Address).
154-
Msg("missing node-id from staked nodes")
167+
Msg("missing node-id from registered nodes")
155168
}
156169
}
157170

158-
// go through staking nodes
171+
// go through local nodes
159172
invalidNodes := make([]model.NodeInfo, 0)
160-
for _, node := range collectedNodes {
173+
for _, node := range localNodes {
161174
if node.NodeID.String() == "" {
162175

163176
// we warn here but exit later
164177
invalidNodes = append(invalidNodes, node)
165178
log.Warn().
166179
Str("node-address", node.Address).
167-
Msg("missing node-id from collected nodes")
180+
Msg("missing node-id from local nodes")
168181
}
169182
}
170183

@@ -173,43 +186,49 @@ func validateNodeIDs(collectedNodes []model.NodeInfo, stakedNodes []model.NodeIn
173186
}
174187
}
175188

176-
func checkMisMatchingNodes(collectedNodes []model.NodeInfo, stakedNodes []model.NodeInfo) {
189+
func checkMismatchingNodes(localNodes []model.NodeInfo, registeredNodes []model.NodeInfo) {
177190

178-
collectedNodesByID := make(map[flow.Identifier]model.NodeInfo)
179-
for _, node := range collectedNodes {
180-
collectedNodesByID[node.NodeID] = node
191+
localNodesByID := make(map[flow.Identifier]model.NodeInfo)
192+
for _, node := range localNodes {
193+
localNodesByID[node.NodeID] = node
181194
}
182195

183-
stakedNodesByID := make(map[flow.Identifier]model.NodeInfo)
184-
for _, node := range stakedNodes {
185-
stakedNodesByID[node.NodeID] = node
196+
registeredNodesByID := make(map[flow.Identifier]model.NodeInfo)
197+
for _, node := range registeredNodes {
198+
registeredNodesByID[node.NodeID] = node
186199
}
187200

188-
// try match collected nodes to staked nodes
189-
invalidCollectedNodes := make([]model.NodeInfo, 0)
190-
for _, node := range collectedNodes {
191-
if _, ok := stakedNodesByID[node.NodeID]; !ok {
192-
log.Warn().Str("collected-node-id", node.NodeID.String()).Str("role", node.Role.String()).Str("address", node.Address).
193-
Msg("matching staked node not found for collected node")
194-
invalidCollectedNodes = append(invalidCollectedNodes, node)
201+
// try match local nodes to registered nodes
202+
invalidLocalNodes := make([]model.NodeInfo, 0)
203+
for _, node := range localNodes {
204+
if _, ok := registeredNodesByID[node.NodeID]; !ok {
205+
log.Warn().
206+
Str("local-node-id", node.NodeID.String()).
207+
Str("role", node.Role.String()).
208+
Str("address", node.Address).
209+
Msg("matching registered node not found for local node")
210+
invalidLocalNodes = append(invalidLocalNodes, node)
195211
}
196212
}
197213

198-
invalidStakedNodes := make([]model.NodeInfo, 0)
199-
for _, node := range stakedNodes {
200-
if _, ok := collectedNodesByID[node.NodeID]; !ok {
201-
log.Warn().Str("staked-node-id", node.NodeID.String()).Str("role", node.Role.String()).Str("address", node.Address).
202-
Msg("matching collected node not found for staked node")
203-
invalidStakedNodes = append(invalidStakedNodes, node)
214+
invalidRegisteredNodes := make([]model.NodeInfo, 0)
215+
for _, node := range registeredNodes {
216+
if _, ok := localNodesByID[node.NodeID]; !ok {
217+
log.Warn().
218+
Str("registered-node-id", node.NodeID.String()).
219+
Str("role", node.Role.String()).
220+
Str("address", node.Address).
221+
Msg("matching local node not found for local node")
222+
invalidRegisteredNodes = append(invalidRegisteredNodes, node)
204223
}
205224
}
206225

207-
if len(invalidCollectedNodes) != 0 || len(invalidStakedNodes) != 0 {
226+
if len(invalidLocalNodes) != 0 || len(invalidRegisteredNodes) != 0 {
208227
log.Fatal().Msg("found missing mismatching nodes")
209228
}
210229
}
211230

212-
func assembleInternalNodesWithoutStake() []model.NodeInfo {
231+
func assembleInternalNodesWithoutWeight() []model.NodeInfo {
213232
privInternals := readInternalNodes()
214233
log.Info().Msgf("read %v internal private node-info files", len(privInternals))
215234

@@ -224,7 +243,7 @@ func assembleInternalNodesWithoutStake() []model.NodeInfo {
224243
nodeID,
225244
internal.Role,
226245
internal.Address,
227-
1000,
246+
flow.DefaultInitialWeight,
228247
internal.NetworkPrivKey,
229248
internal.StakingPrivKey,
230249
)
@@ -235,7 +254,7 @@ func assembleInternalNodesWithoutStake() []model.NodeInfo {
235254
return nodes
236255
}
237256

238-
func assemblePartnerNodesWithoutStake() []model.NodeInfo {
257+
func assemblePartnerNodesWithoutWeight() []model.NodeInfo {
239258
partners := readPartnerNodes()
240259
log.Info().Msgf("read %v partner node configuration files", len(partners))
241260
return createPublicNodeInfo(partners)
@@ -257,12 +276,12 @@ func createPublicNodeInfo(nodes []model.NodeInfoPub) []model.NodeInfo {
257276
networkPubKey := validateNetworkPubKey(n.NetworkPubKey)
258277
stakingPubKey := validateStakingPubKey(n.StakingPubKey)
259278

260-
// stake set to 1000 to give equal weight to each node
279+
// all nodes should have equal weight
261280
node := model.NewPublicNodeInfo(
262281
nodeID,
263282
n.Role,
264283
n.Address,
265-
1000,
284+
flow.DefaultInitialWeight,
266285
networkPubKey,
267286
stakingPubKey,
268287
)

0 commit comments

Comments
 (0)