Skip to content

Conversation

@yacovm
Copy link
Contributor

@yacovm yacovm commented Sep 19, 2024

Why this should be merged

Snowball was introduced in order to improve the stability of snowflake, by taking into account the history when returning the preference.

However, if deployed with a configuration where the preference is small enough, and a network partition causes a 50-50 split of the stake, it can actually backfire, as described in 6e1a905.

Additionally, latest research [1] points out that snowflake suffices for snowman.

[1] https://arxiv.org/abs/2404.14250

How this works

This commit removes snowball from snowman by substituting the snowball factory snowman uses, with a snowflake factory.

How this was tested

Added a test that simulates a mixed network which runs snowman with and without snowball, and ensures that a mixed network still converges.

Also ran a modified node on Fuji and monitored its consensus related metrics, and it seemed functioning well.

@yacovm yacovm force-pushed the removeSnowball branch 2 times, most recently from 484d447 to e3597d8 Compare September 19, 2024 19:08
@yacovm yacovm self-assigned this Sep 19, 2024
@yacovm yacovm added the consensus This involves consensus label Sep 30, 2024
sb := newBinarySnowball(alphaPreference, terminationConditions, red)
require.Equal(red, sb.Preference())
require.False(sb.Finalized())
sf := newBinarySnowflake(alphaPreference, terminationConditions, red)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this test modified? It seems to be a duplicate of TestBinarySnowflake now.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure why this file is being modified. We aren't changing the code that it was previously testing... If we feel like the binarySnowflake struct needs additional coverage shouldn't we be adding new tests to the binary_snowflake_test.go file rather than here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok will revert

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because we aren't deleting the code that this was testing, nnary_snowball.go, why are we deleting the tests?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because we aren't deleting the code that this was testing, unary_snowball.go, why are we deleting the tests?

Comment on lines 36 to 45
var sm Consensus
if i%2 == 0 {
factory := TopologicalFactory{factory: snowball.SnowflakeFactory}
sm = factory.New()
} else {
factory := TopologicalFactory{factory: snowball.SnowballFactory}
sm = factory.New()
}

require.NoError(n.AddNode(t, sm))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: Seems like we can cleanup the if block a bit

Suggested change
var sm Consensus
if i%2 == 0 {
factory := TopologicalFactory{factory: snowball.SnowflakeFactory}
sm = factory.New()
} else {
factory := TopologicalFactory{factory: snowball.SnowballFactory}
sm = factory.New()
}
require.NoError(n.AddNode(t, sm))
var sbFactory snowball.Factory
if i%2 == 0 {
sbFactory = snowball.SnowflakeFactory
} else {
sbFactory = snowball.SnowballFactory
}
factory := TopologicalFactory{factory: sbFactory}
sm := factory.New()
require.NoError(n.AddNode(t, sm))

Comment on lines 488 to 492
// *
// 1/ \
// R *
// / \
// G B
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What do the numbers on the edges mean? It seems like they are referencing Snowball counters but we are using snowflake here and not snowball.

@yacovm yacovm force-pushed the removeSnowball branch 3 times, most recently from 1c161b2 to be4ccba Compare October 21, 2024 15:13
Snowball was introduced in order to improve the stability of snowflake,
by taking into account the history when returning the preference.

However, if deployed with a configuration where the preference is small enough, and a network partition
causes a 50-50 split of the stake, it can actually backfire, as described in 6e1a905.

Additionally, latest research [1] points out that snowflake suffices for snowman.

This commit removes snowball from snowman and adds a test that simulates a mixed network
which runs snowman with and without snowball, and ensures that a mixed network still converges.

[1] https://arxiv.org/abs/2404.14250

Signed-off-by: Yacov Manevich <yacov.manevich@avalabs.org>
Copy link
Contributor

@StephenButtolph StephenButtolph left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code changes LGTM. Going to hold off on approving/merging until we've canaried this out on Fuji + Mainnet

@github-actions
Copy link

This PR has become stale because it has been open for 30 days with no activity. Adding the lifecycle/frozen label will cause this PR to ignore lifecycle events.

@github-actions
Copy link

This PR has become stale because it has been open for 30 days with no activity. Adding the lifecycle/frozen label will cause this PR to ignore lifecycle events.

@StephenButtolph StephenButtolph merged commit db3b57a into ava-labs:master Jan 27, 2025
22 checks passed
tsachiherman pushed a commit that referenced this pull request Jan 29, 2025
Signed-off-by: Yacov Manevich <yacov.manevich@avalabs.org>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

consensus This involves consensus

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants