Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
whqwjb
go-ethereum
提交
0015ce1e
G
go-ethereum
项目概览
whqwjb
/
go-ethereum
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
go-ethereum
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
0015ce1e
编写于
10月 07, 2014
作者:
O
obscuren
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
kick of bad peers
上级
677836cb
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
54 addition
and
77 deletion
+54
-77
block_pool.go
block_pool.go
+36
-52
ethchain/filter.go
ethchain/filter.go
+1
-1
ethpipe/js_types.go
ethpipe/js_types.go
+2
-2
ethutil/list.go
ethutil/list.go
+9
-2
peer.go
peer.go
+6
-20
未找到文件。
block_pool.go
浏览文件 @
0015ce1e
...
...
@@ -3,6 +3,7 @@ package eth
import
(
"bytes"
"container/list"
"fmt"
"math"
"math/big"
"sync"
...
...
@@ -29,8 +30,8 @@ type BlockPool struct {
eth
*
Ethereum
hash
Pool
[][]
byte
pool
map
[
string
]
*
block
hash
es
[][]
byte
pool
map
[
string
]
*
block
td
*
big
.
Int
quit
chan
bool
...
...
@@ -53,12 +54,12 @@ func NewBlockPool(eth *Ethereum) *BlockPool {
}
func
(
self
*
BlockPool
)
Len
()
int
{
return
len
(
self
.
hash
Pool
)
return
len
(
self
.
hash
es
)
}
func
(
self
*
BlockPool
)
Reset
()
{
self
.
pool
=
make
(
map
[
string
]
*
block
)
self
.
hash
Pool
=
nil
self
.
hash
es
=
nil
}
func
(
self
*
BlockPool
)
HasLatestHash
()
bool
{
...
...
@@ -88,6 +89,10 @@ func (self *BlockPool) FetchHashes(peer *Peer) bool {
if
(
self
.
peer
==
nil
&&
peer
.
td
.
Cmp
(
highestTd
)
>=
0
)
||
(
self
.
peer
!=
nil
&&
peer
.
td
.
Cmp
(
self
.
peer
.
td
)
>=
0
)
||
self
.
peer
==
peer
{
if
self
.
peer
!=
peer
{
poollogger
.
Debugf
(
"Found better suitable peer (%v vs %v)
\n
"
,
self
.
td
,
peer
.
td
)
if
self
.
peer
!=
nil
{
self
.
peer
.
doneFetchingHashes
=
true
}
}
self
.
peer
=
peer
...
...
@@ -114,7 +119,7 @@ func (self *BlockPool) AddHash(hash []byte, peer *Peer) {
if
self
.
pool
[
string
(
hash
)]
==
nil
{
self
.
pool
[
string
(
hash
)]
=
&
block
{
peer
,
nil
,
nil
,
time
.
Now
(),
0
}
self
.
hash
Pool
=
append
([][]
byte
{
hash
},
self
.
hashPool
...
)
self
.
hash
es
=
append
([][]
byte
{
hash
},
self
.
hashes
...
)
}
}
...
...
@@ -127,9 +132,12 @@ func (self *BlockPool) Add(b *ethchain.Block, peer *Peer) {
if
self
.
pool
[
hash
]
==
nil
&&
!
self
.
eth
.
BlockChain
()
.
HasBlock
(
b
.
Hash
())
{
poollogger
.
Infof
(
"Got unrequested block (%x...)
\n
"
,
hash
[
0
:
4
])
self
.
hash
Pool
=
append
(
self
.
hashPool
,
b
.
Hash
())
self
.
hash
es
=
append
(
self
.
hashes
,
b
.
Hash
())
self
.
pool
[
hash
]
=
&
block
{
peer
,
peer
,
b
,
time
.
Now
(),
0
}
fmt
.
Println
(
"1."
,
!
self
.
eth
.
BlockChain
()
.
HasBlock
(
b
.
PrevHash
),
ethutil
.
Bytes2Hex
(
b
.
Hash
()[
0
:
4
]),
ethutil
.
Bytes2Hex
(
b
.
PrevHash
[
0
:
4
]))
fmt
.
Println
(
"2."
,
self
.
pool
[
string
(
b
.
PrevHash
)]
==
nil
)
fmt
.
Println
(
"3."
,
!
self
.
fetchingHashes
)
if
!
self
.
eth
.
BlockChain
()
.
HasBlock
(
b
.
PrevHash
)
&&
self
.
pool
[
string
(
b
.
PrevHash
)]
==
nil
&&
!
self
.
fetchingHashes
{
poollogger
.
Infof
(
"Unknown chain, requesting (%x...)
\n
"
,
b
.
PrevHash
[
0
:
4
])
peer
.
QueueMessage
(
ethwire
.
NewMessage
(
ethwire
.
MsgGetBlockHashesTy
,
[]
interface
{}{
b
.
Hash
(),
uint32
(
256
)}))
...
...
@@ -145,28 +153,10 @@ func (self *BlockPool) Remove(hash []byte) {
self
.
mut
.
Lock
()
defer
self
.
mut
.
Unlock
()
self
.
hash
Pool
=
ethutil
.
DeleteFromByteSlice
(
self
.
hashPool
,
hash
)
self
.
hash
es
=
ethutil
.
DeleteFromByteSlice
(
self
.
hashes
,
hash
)
delete
(
self
.
pool
,
string
(
hash
))
}
func
(
self
*
BlockPool
)
ProcessCanonical
(
f
func
(
block
*
ethchain
.
Block
))
(
procAmount
int
)
{
blocks
:=
self
.
Blocks
()
ethchain
.
BlockBy
(
ethchain
.
Number
)
.
Sort
(
blocks
)
for
_
,
block
:=
range
blocks
{
if
self
.
eth
.
BlockChain
()
.
HasBlock
(
block
.
PrevHash
)
{
procAmount
++
f
(
block
)
self
.
Remove
(
block
.
Hash
())
}
}
return
}
func
(
self
*
BlockPool
)
DistributeHashes
()
{
self
.
mut
.
Lock
()
defer
self
.
mut
.
Unlock
()
...
...
@@ -178,8 +168,8 @@ func (self *BlockPool) DistributeHashes() {
)
num
:=
int
(
math
.
Min
(
float64
(
amount
),
float64
(
len
(
self
.
pool
))))
for
i
,
j
:=
0
,
0
;
i
<
len
(
self
.
hash
Pool
)
&&
j
<
num
;
i
++
{
hash
:=
self
.
hash
Pool
[
i
]
for
i
,
j
:=
0
,
0
;
i
<
len
(
self
.
hash
es
)
&&
j
<
num
;
i
++
{
hash
:=
self
.
hash
es
[
i
]
item
:=
self
.
pool
[
string
(
hash
)]
if
item
!=
nil
&&
item
.
block
==
nil
{
...
...
@@ -193,7 +183,7 @@ func (self *BlockPool) DistributeHashes() {
peer
=
item
.
from
}
else
{
// Remove it
self
.
hash
Pool
=
ethutil
.
DeleteFromByteSlice
(
self
.
hashPool
,
hash
)
self
.
hash
es
=
ethutil
.
DeleteFromByteSlice
(
self
.
hashes
,
hash
)
delete
(
self
.
pool
,
string
(
hash
))
}
}
else
if
lastFetchFailed
||
item
.
peer
==
nil
{
...
...
@@ -250,17 +240,31 @@ out:
}
})
self
.
DistributeHashes
()
if
len
(
self
.
hashes
)
>
0
{
self
.
DistributeHashes
()
}
if
self
.
ChainLength
<
len
(
self
.
hash
Pool
)
{
self
.
ChainLength
=
len
(
self
.
hash
Pool
)
if
self
.
ChainLength
<
len
(
self
.
hash
es
)
{
self
.
ChainLength
=
len
(
self
.
hash
es
)
}
/*
if !self.fetchingHashes {
blocks := self.Blocks()
ethchain.BlockBy(ethchain.Number).Sort(blocks)
if len(blocks) > 0 {
if !self.eth.BlockChain().HasBlock(b.PrevHash) && self.pool[string(b.PrevHash)] == nil && !self.fetchingHashes {
}
}
}
*/
}
}
}
func
(
self
*
BlockPool
)
chainThread
()
{
procTimer
:=
time
.
NewTicker
(
10
00
*
time
.
Millisecond
)
procTimer
:=
time
.
NewTicker
(
5
00
*
time
.
Millisecond
)
out
:
for
{
select
{
...
...
@@ -294,14 +298,8 @@ out:
}
}
if
len
(
blocks
)
>
0
{
self
.
eth
.
Eventer
()
.
Post
(
"blocks"
,
blocks
)
}
var
err
error
for
i
,
block
:=
range
blocks
{
//self.eth.Eventer().Post("block", block)
err
=
self
.
eth
.
StateManager
()
.
Process
(
block
,
false
)
if
err
!=
nil
{
poollogger
.
Infoln
(
err
)
...
...
@@ -318,10 +316,6 @@ out:
if
err
!=
nil
{
self
.
Reset
()
// Remove this bad chain
for
_
,
block
:=
range
blocks
{
self
.
Remove
(
block
.
Hash
())
}
poollogger
.
Debugf
(
"Punishing peer for supplying bad chain (%v)
\n
"
,
self
.
peer
.
conn
.
RemoteAddr
())
// This peer gave us bad hashes and made us fetch a bad chain, therefor he shall be punished.
...
...
@@ -330,16 +324,6 @@ out:
self
.
td
=
ethutil
.
Big0
self
.
peer
=
nil
}
/*
// Handle in batches of 4k
//max := int(math.Min(4000, float64(len(blocks))))
for _, block := range blocks {
self.eth.Eventer().Post("block", block)
self.Remove(block.Hash())
}
*/
}
}
}
ethchain/filter.go
浏览文件 @
0015ce1e
...
...
@@ -216,7 +216,7 @@ func (self *Filter) bloomFilter(block *Block) bool {
fk
:=
append
([]
byte
(
"bloom"
),
block
.
Hash
()
...
)
bin
,
err
:=
self
.
eth
.
Db
()
.
Get
(
fk
)
if
err
!=
nil
{
panic
(
err
)
fmt
.
Println
(
err
)
}
bloom
:=
NewBloomFilter
(
bin
)
...
...
ethpipe/js_types.go
浏览文件 @
0015ce1e
...
...
@@ -33,9 +33,9 @@ func NewJSBlock(block *ethchain.Block) *JSBlock {
return
&
JSBlock
{}
}
var
ptxs
[]
JSTransaction
var
ptxs
[]
*
JSTransaction
for
_
,
tx
:=
range
block
.
Transactions
()
{
ptxs
=
append
(
ptxs
,
*
NewJSTx
(
tx
,
block
.
State
()))
ptxs
=
append
(
ptxs
,
NewJSTx
(
tx
,
block
.
State
()))
}
list
:=
ethutil
.
NewList
(
ptxs
)
...
...
ethutil/list.go
浏览文件 @
0015ce1e
...
...
@@ -3,12 +3,14 @@ package ethutil
import
(
"encoding/json"
"reflect"
"sync"
)
// The list type is an anonymous slice handler which can be used
// for containing any slice type to use in an environment which
// does not support slice types (e.g., JavaScript, QML)
type
List
struct
{
mut
sync
.
Mutex
val
interface
{}
list
reflect
.
Value
Length
int
...
...
@@ -21,7 +23,7 @@ func NewList(t interface{}) *List {
panic
(
"list container initialized with a non-slice type"
)
}
return
&
List
{
t
,
list
,
list
.
Len
()}
return
&
List
{
sync
.
Mutex
{},
t
,
list
,
list
.
Len
()}
}
func
EmptyList
()
*
List
{
...
...
@@ -30,8 +32,10 @@ func EmptyList() *List {
// Get N element from the embedded slice. Returns nil if OOB.
func
(
self
*
List
)
Get
(
i
int
)
interface
{}
{
if
self
.
list
.
Len
()
>
i
{
self
.
mut
.
Lock
()
defer
self
.
mut
.
Unlock
()
i
:=
self
.
list
.
Index
(
i
)
.
Interface
()
return
i
...
...
@@ -51,6 +55,9 @@ func (self *List) GetAsJson(i int) interface{} {
// Appends value at the end of the slice. Panics when incompatible value
// is given.
func
(
self
*
List
)
Append
(
v
interface
{})
{
self
.
mut
.
Lock
()
defer
self
.
mut
.
Unlock
()
self
.
list
=
reflect
.
Append
(
self
.
list
,
reflect
.
ValueOf
(
v
))
self
.
Length
=
self
.
list
.
Len
()
}
...
...
peer.go
浏览文件 @
0015ce1e
...
...
@@ -516,10 +516,11 @@ func (p *Peer) HandleInbound() {
blockPool
.
AddHash
(
hash
,
p
)
}
if
!
foundCommonHash
&&
msg
.
Data
.
Len
()
!=
0
{
if
!
p
.
FetchHashes
()
{
p
.
doneFetchingHashes
=
true
}
if
!
foundCommonHash
{
//if !p.FetchHashes() {
// p.doneFetchingHashes = true
//}
p
.
FetchHashes
()
}
else
{
peerlogger
.
Infof
(
"Found common hash (%x...)
\n
"
,
p
.
lastReceivedHash
[
0
:
4
])
p
.
doneFetchingHashes
=
true
...
...
@@ -533,8 +534,6 @@ func (p *Peer) HandleInbound() {
it
:=
msg
.
Data
.
NewIterator
()
for
it
.
Next
()
{
block
:=
ethchain
.
NewBlockFromRlpValue
(
it
.
Value
())
//fmt.Printf("%v %x - %x\n", block.Number, block.Hash()[0:4], block.PrevHash[0:4])
blockPool
.
Add
(
block
,
p
)
p
.
lastBlockReceived
=
time
.
Now
()
...
...
@@ -557,21 +556,8 @@ func (self *Peer) FetchBlocks(hashes [][]byte) {
func
(
self
*
Peer
)
FetchHashes
()
bool
{
blockPool
:=
self
.
ethereum
.
blockPool
return
blockPool
.
FetchHashes
(
self
)
/*
if self.td.Cmp(self.ethereum.HighestTDPeer()) >= 0 {
blockPool.td = self.td
if !blockPool.HasLatestHash() {
self.doneFetchingHashes = false
const amount = 256
peerlogger.Debugf("Fetching hashes (%d)\n", amount)
self.QueueMessage(ethwire.NewMessage(ethwire.MsgGetBlockHashesTy, []interface{}{self.lastReceivedHash, uint32(amount)}))
}
}
*/
return
blockPool
.
FetchHashes
(
self
)
}
func
(
self
*
Peer
)
FetchingHashes
()
bool
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录