Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make snowman use snowflake directly instead of snowball #3403

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

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
snow/consensus/snowball/binary_snowball_test.go Outdated Show resolved Hide resolved
snow/consensus/snowball/flat_test.go Outdated Show resolved Hide resolved
chains/manager.go Show resolved Hide resolved
snow/consensus/snowman/topological.go Show resolved Hide resolved
snow/consensus/snowman/mixed_test.go Show resolved Hide resolved
snow/consensus/snowball/tree_test.go Outdated Show resolved Hide resolved
snow/consensus/snowball/tree_test.go Outdated Show resolved Hide resolved
snow/consensus/snowball/tree_test.go Outdated Show resolved Hide resolved
@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 <[email protected]>
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

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.

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