Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
Geth-Modification
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张蕾
Geth-Modification
Commits
3d782bc7
Commit
3d782bc7
authored
Sep 29, 2018
by
ledgerwatch
Committed by
Felix Lange
Sep 29, 2018
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
eth: broadcast blocks to at least 4 peers (#17725)
parent
01d9f298
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
109 additions
and
8 deletions
+109
-8
handler.go
eth/handler.go
+11
-1
handler_test.go
eth/handler_test.go
+98
-7
No files found.
eth/handler.go
View file @
3d782bc7
...
...
@@ -49,6 +49,9 @@ const (
// txChanSize is the size of channel listening to NewTxsEvent.
// The number is referenced from the size of tx pool.
txChanSize
=
4096
// minimim number of peers to broadcast new blocks to
minBroadcastPeers
=
4
)
var
(
...
...
@@ -705,7 +708,14 @@ func (pm *ProtocolManager) BroadcastBlock(block *types.Block, propagate bool) {
return
}
// Send the block to a subset of our peers
transfer
:=
peers
[
:
int
(
math
.
Sqrt
(
float64
(
len
(
peers
))))]
transferLen
:=
int
(
math
.
Sqrt
(
float64
(
len
(
peers
))))
if
transferLen
<
minBroadcastPeers
{
transferLen
=
minBroadcastPeers
}
if
transferLen
>
len
(
peers
)
{
transferLen
=
len
(
peers
)
}
transfer
:=
peers
[
:
transferLen
]
for
_
,
peer
:=
range
transfer
{
peer
.
AsyncSendNewBlock
(
block
,
td
)
}
...
...
eth/handler_test.go
View file @
3d782bc7
...
...
@@ -17,6 +17,7 @@
package
eth
import
(
"fmt"
"math"
"math/big"
"math/rand"
...
...
@@ -466,14 +467,17 @@ func testDAOChallenge(t *testing.T, localForked, remoteForked bool, timeout bool
}
// Create a DAO aware protocol manager
var
(
evmux
=
new
(
event
.
TypeMux
)
pow
=
ethash
.
NewFaker
()
db
=
ethdb
.
NewMemDatabase
()
config
=
&
params
.
ChainConfig
{
DAOForkBlock
:
big
.
NewInt
(
1
),
DAOForkSupport
:
localForked
}
gspec
=
&
core
.
Genesis
{
Config
:
config
}
genesis
=
gspec
.
MustCommit
(
db
)
blockchain
,
_
=
core
.
NewBlockChain
(
db
,
nil
,
config
,
pow
,
vm
.
Config
{},
nil
)
evmux
=
new
(
event
.
TypeMux
)
pow
=
ethash
.
NewFaker
()
db
=
ethdb
.
NewMemDatabase
()
config
=
&
params
.
ChainConfig
{
DAOForkBlock
:
big
.
NewInt
(
1
),
DAOForkSupport
:
localForked
}
gspec
=
&
core
.
Genesis
{
Config
:
config
}
genesis
=
gspec
.
MustCommit
(
db
)
)
blockchain
,
err
:=
core
.
NewBlockChain
(
db
,
nil
,
config
,
pow
,
vm
.
Config
{},
nil
)
if
err
!=
nil
{
t
.
Fatalf
(
"failed to create new blockchain: %v"
,
err
)
}
pm
,
err
:=
NewProtocolManager
(
config
,
downloader
.
FullSync
,
DefaultConfig
.
NetworkId
,
evmux
,
new
(
testTxPool
),
pow
,
blockchain
,
db
)
if
err
!=
nil
{
t
.
Fatalf
(
"failed to start test protocol manager: %v"
,
err
)
...
...
@@ -520,3 +524,90 @@ func testDAOChallenge(t *testing.T, localForked, remoteForked bool, timeout bool
}
}
}
func
TestBroadcastBlock
(
t
*
testing
.
T
)
{
var
tests
=
[]
struct
{
totalPeers
int
broadcastExpected
int
}{
{
1
,
1
},
{
2
,
2
},
{
3
,
3
},
{
4
,
4
},
{
5
,
4
},
{
9
,
4
},
{
12
,
4
},
{
16
,
4
},
{
26
,
5
},
{
100
,
10
},
}
for
_
,
test
:=
range
tests
{
testBroadcastBlock
(
t
,
test
.
totalPeers
,
test
.
broadcastExpected
)
}
}
func
testBroadcastBlock
(
t
*
testing
.
T
,
totalPeers
,
broadcastExpected
int
)
{
var
(
evmux
=
new
(
event
.
TypeMux
)
pow
=
ethash
.
NewFaker
()
db
=
ethdb
.
NewMemDatabase
()
config
=
&
params
.
ChainConfig
{}
gspec
=
&
core
.
Genesis
{
Config
:
config
}
genesis
=
gspec
.
MustCommit
(
db
)
)
blockchain
,
err
:=
core
.
NewBlockChain
(
db
,
nil
,
config
,
pow
,
vm
.
Config
{},
nil
)
if
err
!=
nil
{
t
.
Fatalf
(
"failed to create new blockchain: %v"
,
err
)
}
pm
,
err
:=
NewProtocolManager
(
config
,
downloader
.
FullSync
,
DefaultConfig
.
NetworkId
,
evmux
,
new
(
testTxPool
),
pow
,
blockchain
,
db
)
if
err
!=
nil
{
t
.
Fatalf
(
"failed to start test protocol manager: %v"
,
err
)
}
pm
.
Start
(
1000
)
defer
pm
.
Stop
()
var
peers
[]
*
testPeer
for
i
:=
0
;
i
<
totalPeers
;
i
++
{
peer
,
_
:=
newTestPeer
(
fmt
.
Sprintf
(
"peer %d"
,
i
),
eth63
,
pm
,
true
)
defer
peer
.
close
()
peers
=
append
(
peers
,
peer
)
}
chain
,
_
:=
core
.
GenerateChain
(
gspec
.
Config
,
genesis
,
ethash
.
NewFaker
(),
db
,
1
,
func
(
i
int
,
gen
*
core
.
BlockGen
)
{})
pm
.
BroadcastBlock
(
chain
[
0
],
true
/*propagate*/
)
errCh
:=
make
(
chan
error
,
totalPeers
)
doneCh
:=
make
(
chan
struct
{},
totalPeers
)
for
_
,
peer
:=
range
peers
{
go
func
(
p
*
testPeer
)
{
if
err
:=
p2p
.
ExpectMsg
(
p
.
app
,
NewBlockMsg
,
&
newBlockData
{
Block
:
chain
[
0
],
TD
:
big
.
NewInt
(
131136
)});
err
!=
nil
{
errCh
<-
err
}
else
{
doneCh
<-
struct
{}{}
}
}(
peer
)
}
timeoutCh
:=
time
.
NewTimer
(
time
.
Millisecond
*
100
)
.
C
var
receivedCount
int
outer
:
for
{
select
{
case
err
=
<-
errCh
:
break
outer
case
<-
doneCh
:
receivedCount
++
if
receivedCount
==
totalPeers
{
break
outer
}
case
<-
timeoutCh
:
break
outer
}
}
for
_
,
peer
:=
range
peers
{
peer
.
app
.
Close
()
}
if
err
!=
nil
{
t
.
Errorf
(
"error matching block by peer: %v"
,
err
)
}
if
receivedCount
!=
broadcastExpected
{
t
.
Errorf
(
"block broadcast to %d peers, expected %d"
,
receivedCount
,
broadcastExpected
)
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment