Here's the top 15 forgers of the last 30 days, as the pie chart would be far too crowded to display more:
Edit: To clarify, the number is the percentage of blocks forged.
Thanks - but I need their *stake* as well to be included in the same diagram. Anyway - I've chatted with CfB and he is happy for me to "drop a bombshell". So get ready...
|
|
|
who can refute my idea?
Try writing your idea in math or in a simulator rather than just trying to ask people to "refute" it.
|
|
|
Slightly? In your simulation (A has 10 nxt, B has 90 nxt) A forges 25.5% of the blocks when it should forge only 5.5%. That's big difference! B should have much longer streaks I think.
Okay - a bit more than "slightly" in the 90/10 case. Let's not focus on the 90/10 case for now (the other cases work much better in the simulator) but sure I grant you that the actual streaks could well be much *larger* that what I've showed for the worst case (I just want people to realise that long winning streaks are very much *possible*). I am more interested in the 50/50 cases at this stage (if there is any "bug" in my code causing the skew as the percentages get higher then it won't matter if we just focus on those cases for now).
|
|
|
Now someone had suggested we don't let the winner be the same as the last winner. Let's modify our last example to do that:
blocks = 1440 a: 10 b: 10 c: 10 d: 10 e: 10 f: 50 fdfacfedafcfdafafebfedcfdfcecfbdefecfcfdfefafefefdfdbdfcfebfbfdafdfcafadabefcfa ecfbdfdfafcdfdfafcfedfcfafbfefefefbfedfdfcfadfcbfcfec fcbcafbcfdfcfebefefdfafcebafcdefebfebdefecfbdfbfcebafcafeacbdefefdbfefafafaefbe dfcfececfbfcfbcfefebcbcfbafbafcbfecefcfefefcdafdfabdf dfdfeafdfcfbfedfdfefacfdafcbfcfedefcafbfdcacefefecfbefbfbefbfeadbcedfedfdfdfbfe bfcecbecfbfafefefdfedfabafafefbcfefbfefadfcfcdafedfec fdfefbefcecedefcfefdfcdafdfcfcecefebdfcacfefefdfaefdafcfbfcfbfcbfebabfdfefdfecf dfbadfefbfbfcbefcfcfadafdfefdfcfaecfebfeafedbacfbdbfc bfcfacfefdafbebdfabafcfafdbfdfefafdcdbfbefbfcfefadfdacfbcdbdefefdcfcebafdfaefbf cdfafdefdfcebdaebaeabdfdefcfdfbfdbfefcebcfafcfdfefefb dfefcdfdebfdfcdfdafdfbdfeafdafbefbcbfbfdafbfcaefedfbfbfbfafdfcbfbfdbebfcaefdefe fcebefdfcbeafeafdfcefefbfefcdadcadfdfdfbcfdefefeacfdf cbfefefbafbfdfdfefcbfdfecfefafdfdfcdfbdfdafbdfcbfefcefdbfefcfcdafcdfcfbfdfefefd febfdefefdfcfefdecbcdacafdbafecfecfafdbfefefefefcfcfd efdfdafdafedfbfcaecfeafdfefbdcfafebcfdbdfbefbfdfabfafdfabfdfefcfdfcfbfaefebfdcd fbfefcfbfefdebafebfadafcfbfefcfcfcadbfdfcfefcfcfbfdaf abfcfafbfefdfdfafcfdfadfefdfecfbdfcfefdfefcbfdecbfcafeafcefedfbefcefcfbefefcdfe fcbfefbafcfafefefefcbcafefcbfbfefadfedfadfefdfdefafdf dfbafceabfefdfcfdfafcafabfbefeadbfcfafbafcfdfceaecfefdadfcfdcefcfefefbfefcfedfb fbcfcfbafbfdefbfcbecfdfefdefefcfbfefefdfefdabafbcfefc efcdfdcfacdeadefdbacfabfdbdfdefcfcdcafaedfefefdfdfbfdcefdfadfdfbeafbfcfcbfdfcfa fbfebfbfdcfdabeabdfbfcecacdacfceafcfcfcfd wins( a ) = 138 wins( b ) = 168 wins( c ) = 190 wins( d ) = 203 wins( e ) = 220 wins( f ) = 521 best_streak( a ) = 1 best_streak( b ) = 1 best_streak( c ) = 1 best_streak( d ) = 1 best_streak( e ) = 1 best_streak( f ) = 1 best_combined_streak = 12
Well our best combined streak is 12 - so I don't think that the limit a streak to 1 is going to help us either.
|
|
|
I am not certain where we are heading. We are talking about the selfish-mining attack?
Call it what you like - the problem is what are the implications if a forger "hides their blocks" in order to track and create a better fork and what should TF do in order to minimise the risk of damage.
|
|
|
So here I've gone back to the 1st simulation configuration but now added a new "combined best streak" which combines all the accounts apart from the last one:
blocks = 1440 a: 10 b: 10 c: 10 d: 10 e: 10 f: 50 ebfcefffcefffcafffcfedafffcfbaacaaaffffffeabafdfcdfffeffcfcfffaffdfbaffbeafeafe fbfdfbffbfdaffdcafceffcbafeffadafffafedffaccdecfabafe fefcbafafcfeffffdadcfbffbbafbfaeeffbffbefacffafeddfbafeafdfbfebfefcfffebfcadffc ffffafeafbebbefffabcfeffefbdfefcadaafedbfffafafcffeff dfecfafbdfbfcfbdfffffdfffadbfffbfbafffedadaebafffafbfffafccaefbcabfcaffaffffcff fdfffffaafcfbfcfdcafcfaefcedcfffbfffcfafdcddaacfacdde fafabffccfeffafdbfdfcbfaccffebcefefffeadacfbecedfdbbffeccbbfacbefffbffffffefcff fffdaffcebffbbfdcbefafffecfffaffaffffffbffedfdcffbfaf fffbfffffebdadeffffaffbbfcfdfcffaaffffcaffeffeefffaffcecfcffdfffffbfaffffdbdaff eccfffffbfefeadffffeedefcffcdbfbfffefffafadffddbdfcef cbbddccbffbffcceaadfbcffffdfebeaebfedeffcfbfaddcbaabccfffffaadfffffadeffffdcffffaccfffcbfdbffffcddaeeafdebfcfffcdcddffeafafbeffbfffa fffaffcbfcffefcaafeafffffcebafadbffefebfdfcffefffcfefcfdfafeffbbfaffbfdffafffda cffcfffcfcfbfcbfdeafffaddeffcdfbeffeceaebbfffafdfabff adffcfdfdaffadbfcffbdcffaffbfdcaaaffefddfffffdfdbefaefcffecfaeecdcddcfedbfcbfdf dfffeafcdffeebfafffbbfacbcfffbbfefffdbfeffafffbfbaffa ffbffbfbfffaaecdfbfcffffbfcfffbfcafeefdffdfbfafdffceffffdffafdffdfdbffbbfbfaafe edffdfffffaaecdfffffcdfbfbcdcafeeacfeffffefffffdddfdc cfebfffbfeecdcffcfaaabbbdfbfcbbedfdfbddfffffbfddaffefedfdeffffefbcfecfcefdbfafa efafddabffbeedadffffafffffffcbdbbcffeabadcbefdffbecaf ffdfdafcfdfbfcffdebdffabffbdaaefefffffdefacdefacfffcafecefabfdcfbffdffefeffffbb ecaaabbffffdbfeefefcbfffafffbfccfcacbffef wins( a ) = 165 wins( b ) = 156 wins( c ) = 150 wins( d ) = 147 wins( e ) = 146 wins( f ) = 676 best_streak( a ) = 3 best_streak( b ) = 3 best_streak( c ) = 2 best_streak( d ) = 3 best_streak( e ) = 2 best_streak( f ) = 7 best_combined_streak = 10
I've again "bolded" the longest streak which now happens to be our combined one (that hurt my eyes to find).
Running it a few times shows that sometimes the best combined streak is better and at other times worse so I'd say on average it's going to be the same (i.e. "splitting up accounts in to smaller accounts" won't help).
|
|
|
Fair was not a good expression, I admit. Let's just discuss this stuff with security of the network in mind.
Good - as security of the network and blockchain are the "most important things" (I think we can all agree that if either the network or blockchain are damaged badly it would not bode well for Nxt).
|
|
|
Idea: A forging account forges block(n=1). Now he will automatically won't be able forging block(n=2...60). This wouldn't help with the problem because he would then just split his amount to a much higher number of accounts so he can still work secretly on a new chain with his 'pool'. Right?
We need to also model the possibility of getting an effective "winning streak" by having multiple smaller accounts to know whether or not the situation changes (I am not sure yet so once again will need to "see it through simulation").
|
|
|
There must be something wrong in your simulation.
The figures skew as the larger stake holder gets bigger due to the way the math is done (you can see when I publish it) but in any case if anything it might be showing slightly "better" results that the reality (certainly not worse).
|
|
|
Ah, okay. I think that needs some more consideration. But your simple model might help understand.
I'm leaving out a slight detail about the "math" which is relevant to the numbers becoming more skewed as the largest stake holder has a higher % (will get to that later). What is the alternative approach to penalty you mentioned?
I am actually mulling over a few ideas at the moment and also which to discuss this with CfB and indirectly with BCNext so let's not rush into that for now.
|
|
|
Why would anyone who spends that much money to acquire 50% of Nxt, then do anything that will destroy his own wealth?
A good point - and understand that I am not "advocating to do anything" at this stage - just presenting some statistical analysis (something that this project needs to have done before making "claims" about percentages and "safety").
|
|
|
wins( a ) / wins( b ) = 0,344954566
Sure?
The simulator figures are correct and unedited - I will release the source code later so you can play with it yourself. The actual outcome of any 1 run is of course "random" (as it can be using "srand" and "rand").
|
|
|
80 and 90% of what?
Of *stake* (% of entire balance of NXT).
|
|
|
Could you increase the numbers of nodes? Say 1,000, 10,000 and 1,000,000.
Of course that can be done but is irrelevant (what matters is stake proportion here). I will be releasing the source code to my simulator so you will be able to play with it yourself if you are interested.
|
|
|
So you are saying is that the functionality of transferring stakes to pools should not be implemented?
I am presenting some statistical modelling in a way I hope the community might follow (rather than in math) so that we can work out the best solution for TF.
|
|
|
So let's run two more simulations over 100 years with the 1st giving the major stakeholder 80% and the second 90%:
blocks = 52560000 a: 10 b: 10 c: 80 wins( a ) = 9245377 wins( b ) = 9225484 wins( c ) = 34089139 best_streak( a ) = 10 best_streak( b ) = 9 best_streak( c ) = 38
blocks = 52560000 a: 10 b: 90 wins( a ) = 13480613 wins( b ) = 39079387 best_streak( a ) = 13 best_streak( b ) = 53
As we can see our 90% stake holder achieved a "lucky streak" of over 50 blocks - so clearly even 50 confirmations potentially isn't going to protect us from a 90% "attack".
|
|
|
Maybe, I missed that part: why are streaks dangerous?
Without penalty or some other approach the forger who gets a long streak can "undo that many confirmations" by building a "secret" chain.
|
|
|
But what if I increased the largest holding to say 60% (by removing "f" and giving his balance to "e")?
Again over 100 years:
blocks = 52560000 a: 10 b: 10 c: 10 d: 10 e: 60 wins( a ) = 5945713 wins( b ) = 5937915 wins( c ) = 5931002 wins( d ) = 5923375 wins( e ) = 28821995 best_streak( a ) = 7 best_streak( b ) = 7 best_streak( c ) = 7 best_streak( d ) = 8 best_streak( e ) = 27
So "e" has one of 50% of the times (as expected) and had a slightly better "lucky streak" (27 vs 26) - still seems to look good for 30 confirmations right?
Well now I run it again removing "e" and transferring the balance to "d" and we get the following:
blocks = 52560000 a: 10 b: 10 c: 10 d: 70 wins( a ) = 7159269 wins( b ) = 7143871 wins( c ) = 7136512 wins( d ) = 31120348 best_streak( a ) = 8 best_streak( b ) = 8 best_streak( c ) = 8 best_streak( d ) = 33
So 30 confirmations isn't looking so good when one player has 70% of the stake.
|
|
|
Just to get an even clearer picture lets try a 100 year simulation:
blocks = 52560000 a: 10 b: 10 c: 10 d: 10 e: 10 f: 50 wins( a ) = 5189498 wins( b ) = 5182029 wins( c ) = 5175688 wins( d ) = 5171205 wins( e ) = 5166631 wins( f ) = 26674949 best_streak( a ) = 7 best_streak( b ) = 7 best_streak( c ) = 7 best_streak( d ) = 8 best_streak( e ) = 8 best_streak( f ) = 26
Once again "f" has won roughly 50% of the blocks and his largest winning streak is longer but again not that much longer (when you consider how long he's been at it).
So although we need proper math to get the exact % it starting to look as though with "no penalty" this system would appear to be quite safe if you waited for 30 confirmations (or is it?)...
|
|
|
So let's now extend our sample from 1 year to 10 years and see what we get:
blocks = 5256000 a: 10 b: 10 c: 10 d: 10 e: 10 f: 50 wins( a ) = 519010 wins( b ) = 517408 wins( c ) = 518301 wins( d ) = 517377 wins( e ) = 517117 wins( f ) = 2666787 best_streak( a ) = 6 best_streak( b ) = 5 best_streak( c ) = 6 best_streak( d ) = 7 best_streak( e ) = 8 best_streak( f ) = 22
Again "f" has around 50% of the blocks and he has improved on his longest "winning streak" but only by 2 more.
So it's starting to look as though without any sort of change (be it penalty or other) we would really want to have a few more than 22 confirmations to be comfortably "safe" from such an attack.
|
|
|
|