From 4025f3d45d1c632f1b2c8c2c5a4e1298248ff88c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Kajetan=20Sta=C5=84czak?= Date: Tue, 9 Jul 2019 01:21:34 +0100 Subject: [PATCH 1/6] Update diff.rb add a list of signers and their last signed blocks to the block data (like Clique snapshot) --- diff.rb | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/diff.rb b/diff.rb index 128c259..9fdcf59 100644 --- a/diff.rb +++ b/diff.rb @@ -42,11 +42,14 @@ def log(string) end # seal an out-of-turn block -def seal_block_out_of_turn(num, diff, par) +def seal_block_out_of_turn(id, signers, num, diff, par) _num = num + 1 _diff = diff + @DIFF_NOTURN _hash = block_hash + _signers = signers + _signers[id] = _num block = { + "signers" => _signers, "number" => _num, "difficulty" => _diff, "hash" => _hash, @@ -55,11 +58,14 @@ def seal_block_out_of_turn(num, diff, par) end # seal an in-turn block -def seal_block_in_turn(num, diff, par) +def seal_block_in_turn(id, signers, num, diff, par) _num = num + 1 _diff = diff + @DIFF_INTURN _hash = block_hash + _signers = signers + _signers[id] = _num block = { + "signers" => _signers, "number" => _num, "difficulty" => _diff, "hash" => _hash, @@ -70,6 +76,7 @@ def seal_block_in_turn(num, diff, par) # use this genesis to run the chains def seal_genesis genesis = { + "signers" => {}, "number" => 0, "difficulty" => 1337, "hash" => "d1f7f7cb18b4", @@ -108,6 +115,8 @@ def mine_chain(gen, peers) # if node is in turn, seal in-turn block if _current === @PEER_INTURN _best = seal_block_in_turn( + peer[0]['id'], + peer[0]['best']["signers"], peer[0]['best']["number"], peer[0]['best']["difficulty"], peer[0]['best']["hash"] @@ -119,6 +128,8 @@ def mine_chain(gen, peers) # if node is not in turn, seal out-of-turn block else _best = seal_block_out_of_turn( + peer[0]['id'], + peer[0]['best']["signers"], peer[0]['best']["number"], peer[0]['best']["difficulty"], peer[0]['best']["hash"] From 65070569feecf429b6cbe88e1e1821e81fedea11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Kajetan=20Sta=C5=84czak?= Date: Tue, 9 Jul 2019 01:45:10 +0100 Subject: [PATCH 2/6] Update diff.rb Can seal (commented out) and cloning signers --- diff.rb | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/diff.rb b/diff.rb index 9fdcf59..2033862 100644 --- a/diff.rb +++ b/diff.rb @@ -42,12 +42,17 @@ def log(string) end # seal an out-of-turn block -def seal_block_out_of_turn(id, signers, num, diff, par) - _num = num + 1 - _diff = diff + @DIFF_NOTURN +def seal_block_out_of_turn(id, par) + if !can_seal?(id, par) + return par + end + + _num = par["number"] + 1 + _diff = par["difficulty"] + @DIFF_NOTURN _hash = block_hash - _signers = signers + _signers = par["signers"].clone _signers[id] = _num + block = { "signers" => _signers, "number" => _num, @@ -58,21 +63,30 @@ def seal_block_out_of_turn(id, signers, num, diff, par) end # seal an in-turn block -def seal_block_in_turn(id, signers, num, diff, par) - _num = num + 1 - _diff = diff + @DIFF_INTURN +def seal_block_in_turn(id, par) + if !can_seal?(id, par) + return par + end + + _num = par["number"] + 1 + _diff = par["difficulty"] + @DIFF_INTURN _hash = block_hash - _signers = signers + _signers = par["signers"].clone _signers[id] = _num block = { "signers" => _signers, "number" => _num, "difficulty" => _diff, "hash" => _hash, - "parent" => par + "parent" => par, } end +def can_seal?(id, par) +# !par["signers"].key?(id) | ((par["number"] - par["signers"][id]) >= (@PEER_COUNT / 2 + 1)) + true +end + # use this genesis to run the chains def seal_genesis genesis = { @@ -116,10 +130,7 @@ def mine_chain(gen, peers) if _current === @PEER_INTURN _best = seal_block_in_turn( peer[0]['id'], - peer[0]['best']["signers"], - peer[0]['best']["number"], - peer[0]['best']["difficulty"], - peer[0]['best']["hash"] + peer[0]['best'] ) _diff = _best['difficulty'] _num = _best['number'] @@ -129,10 +140,7 @@ def mine_chain(gen, peers) else _best = seal_block_out_of_turn( peer[0]['id'], - peer[0]['best']["signers"], - peer[0]['best']["number"], - peer[0]['best']["difficulty"], - peer[0]['best']["hash"] + peer[0]['best'] ) log "[SEAL] Peer #{peer[0]['id']} (head #{peer[0]['best']['hash']}) sealed NOTURN block #{_best['number']}, diff #{_best['difficulty']}, hash #{_best['hash']}, parent #{_best['parent']}".colorize(:light_blue) end From 458cab580c79c5424722bee7bbfc316f36fb5350 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Kajetan=20Sta=C5=84czak?= Date: Tue, 9 Jul 2019 01:51:26 +0100 Subject: [PATCH 3/6] Update diff.rb is the network really stuck --- diff.rb | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/diff.rb b/diff.rb index 2033862..a97cbc1 100644 --- a/diff.rb +++ b/diff.rb @@ -179,26 +179,11 @@ def mine_chain(gen, peers) end end - # check: is the network stuck? - _stuck = false + _stuck = true peers.each do |p| - peers.each do |q| - - # condition 1: same difficulty - if p[0]['best']['difficulty'] === q[0]['best']['difficulty'] - - # condition 2: different hash - if p[0]['best']['hash'].to_i(16) != q[0]['best']['hash'].to_i(16) - - # condition 3: same diff as best in-turn block - if p[0]['best']['difficulty'] === _diff - - # network is unable to reorg if all conditions are met - _stuck = true - end - end - end + if can_seal?(p[0]['id'], p[0]['best']) + _stuck = false end end From 28bcf56f6e9a95e2d1e1547719eac300b27a5caf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Kajetan=20Sta=C5=84czak?= Date: Tue, 9 Jul 2019 01:55:20 +0100 Subject: [PATCH 4/6] Update diff.rb can_seal? (not commented out) --- diff.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/diff.rb b/diff.rb index a97cbc1..f749bcb 100644 --- a/diff.rb +++ b/diff.rb @@ -83,10 +83,14 @@ def seal_block_in_turn(id, par) end def can_seal?(id, par) -# !par["signers"].key?(id) | ((par["number"] - par["signers"][id]) >= (@PEER_COUNT / 2 + 1)) - true + if !par["signers"].key?(id) + return true + end + + (par["number"] - par["signers"][id]) >= (@PEER_COUNT / 2 + 1) end + # use this genesis to run the chains def seal_genesis genesis = { From 53fc0bc8ad5fd921b9dd67995378e7648584a2cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Kajetan=20Sta=C5=84czak?= Date: Tue, 9 Jul 2019 01:59:06 +0100 Subject: [PATCH 5/6] Update diff.rb par["hash"] --- diff.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/diff.rb b/diff.rb index f749bcb..814556e 100644 --- a/diff.rb +++ b/diff.rb @@ -58,7 +58,7 @@ def seal_block_out_of_turn(id, par) "number" => _num, "difficulty" => _diff, "hash" => _hash, - "parent" => par + "parent" => par["hash"] } end @@ -78,7 +78,7 @@ def seal_block_in_turn(id, par) "number" => _num, "difficulty" => _diff, "hash" => _hash, - "parent" => par, + "parent" => par["hash"], } end From f6e91923d23ce97fb91bf731661b1159b7960fd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Kajetan=20Sta=C5=84czak?= Date: Tue, 9 Jul 2019 02:18:35 +0100 Subject: [PATCH 6/6] Update diff.rb suggested CLique improvement --- diff.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/diff.rb b/diff.rb index 814556e..d09bb78 100644 --- a/diff.rb +++ b/diff.rb @@ -48,9 +48,9 @@ def seal_block_out_of_turn(id, par) end _num = par["number"] + 1 - _diff = par["difficulty"] + @DIFF_NOTURN - _hash = block_hash _signers = par["signers"].clone + _diff = par["difficulty"] + (_signers.key?(id) ? (_num - _signers[id]) : 1) + _hash = block_hash _signers[id] = _num block = { @@ -69,9 +69,9 @@ def seal_block_in_turn(id, par) end _num = par["number"] + 1 - _diff = par["difficulty"] + @DIFF_INTURN - _hash = block_hash _signers = par["signers"].clone + _diff = par["difficulty"] + @PEER_COUNT + 1 + _hash = block_hash _signers[id] = _num block = { "signers" => _signers,