-
Notifications
You must be signed in to change notification settings - Fork 673
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
base: master
Are you sure you want to change the base?
Conversation
484d447
to
e3597d8
Compare
sb := newBinarySnowball(alphaPreference, terminationConditions, red) | ||
require.Equal(red, sb.Preference()) | ||
require.False(sb.Finalized()) | ||
sf := newBinarySnowflake(alphaPreference, terminationConditions, red) |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ok will revert
There was a problem hiding this comment.
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?
There was a problem hiding this comment.
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?
snow/consensus/snowman/mixed_test.go
Outdated
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)) |
There was a problem hiding this comment.
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
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)) |
snow/consensus/snowball/tree_test.go
Outdated
// * | ||
// 1/ \ | ||
// R * | ||
// / \ | ||
// G B |
There was a problem hiding this comment.
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.
1c161b2
to
be4ccba
Compare
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]>
be4ccba
to
90fd999
Compare
There was a problem hiding this 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
This PR has become stale because it has been open for 30 days with no activity. Adding the |
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.