Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
whqwjb
go-ethereum
提交
c6faa18e
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,发现更多精彩内容 >>
提交
c6faa18e
编写于
6月 08, 2015
作者:
J
Jeffrey Wilcke
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #1198 from fjl/core-fix-nonce-check
core: fix nonce verification one more time
上级
e822f440
6c27e2aa
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
74 addition
and
3 deletion
+74
-3
core/blocks.go
core/blocks.go
+1
-0
core/chain_manager.go
core/chain_manager.go
+3
-3
core/chain_manager_test.go
core/chain_manager_test.go
+53
-0
core/error.go
core/error.go
+17
-0
未找到文件。
core/blocks.go
浏览文件 @
c6faa18e
...
...
@@ -7,4 +7,5 @@ var BadHashes = map[common.Hash]bool{
common
.
HexToHash
(
"f269c503aed286caaa0d114d6a5320e70abbc2febe37953207e76a2873f2ba79"
)
:
true
,
common
.
HexToHash
(
"38f5bbbffd74804820ffa4bab0cd540e9de229725afb98c1a7e57936f4a714bc"
)
:
true
,
common
.
HexToHash
(
"7064455b364775a16afbdecd75370e912c6e2879f202eda85b9beae547fff3ac"
)
:
true
,
common
.
HexToHash
(
"5b7c80070a6eff35f3eb3181edb023465c776d40af2885571e1bc4689f3a44d8"
)
:
true
,
}
core/chain_manager.go
浏览文件 @
c6faa18e
...
...
@@ -551,12 +551,12 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) {
bstart
:=
time
.
Now
()
// Wait for block i's nonce to be verified before processing
// its state transition.
for
nonceChecked
[
i
]
{
for
!
nonceChecked
[
i
]
{
r
:=
<-
nonceDone
nonceChecked
[
r
.
i
]
=
true
if
!
r
.
valid
{
block
:=
chain
[
i
]
return
i
,
ValidationError
(
"Block (#%v / %x) nonce is invalid (= %x)"
,
block
.
Number
(),
block
.
Hash
(),
block
.
Nonce
)
block
:=
chain
[
r
.
i
]
return
r
.
i
,
&
BlockNonceErr
{
Hash
:
block
.
Hash
(),
Number
:
block
.
Number
(),
Nonce
:
block
.
Nonce
()}
}
}
...
...
core/chain_manager_test.go
浏览文件 @
c6faa18e
...
...
@@ -3,6 +3,7 @@ package core
import
(
"fmt"
"math/big"
"math/rand"
"os"
"path/filepath"
"runtime"
...
...
@@ -426,3 +427,55 @@ func TestReorgShortest(t *testing.T) {
}
}
}
func
TestInsertNonceError
(
t
*
testing
.
T
)
{
for
i
:=
1
;
i
<
25
&&
!
t
.
Failed
();
i
++
{
db
,
_
:=
ethdb
.
NewMemDatabase
()
genesis
:=
GenesisBlock
(
db
)
bc
:=
chm
(
genesis
,
db
)
bc
.
processor
=
NewBlockProcessor
(
db
,
db
,
bc
.
pow
,
bc
,
bc
.
eventMux
)
blocks
:=
makeChain
(
bc
.
processor
.
(
*
BlockProcessor
),
bc
.
currentBlock
,
i
,
db
,
0
)
fail
:=
rand
.
Int
()
%
len
(
blocks
)
failblock
:=
blocks
[
fail
]
bc
.
pow
=
failpow
{
failblock
.
NumberU64
()}
n
,
err
:=
bc
.
InsertChain
(
blocks
)
// Check that the returned error indicates the nonce failure.
if
n
!=
fail
{
t
.
Errorf
(
"(i=%d) wrong failed block index: got %d, want %d"
,
i
,
n
,
fail
)
}
if
!
IsBlockNonceErr
(
err
)
{
t
.
Fatalf
(
"(i=%d) got %q, want a nonce error"
,
i
,
err
)
}
nerr
:=
err
.
(
*
BlockNonceErr
)
if
nerr
.
Number
.
Cmp
(
failblock
.
Number
())
!=
0
{
t
.
Errorf
(
"(i=%d) wrong block number in error, got %v, want %v"
,
i
,
nerr
.
Number
,
failblock
.
Number
())
}
if
nerr
.
Hash
!=
failblock
.
Hash
()
{
t
.
Errorf
(
"(i=%d) wrong block hash in error, got %v, want %v"
,
i
,
nerr
.
Hash
,
failblock
.
Hash
())
}
// Check that all no blocks after the failing block have been inserted.
for
_
,
block
:=
range
blocks
[
fail
:
]
{
if
bc
.
HasBlock
(
block
.
Hash
())
{
t
.
Errorf
(
"(i=%d) invalid block %d present in chain"
,
i
,
block
.
NumberU64
())
}
}
}
}
// failpow returns false from Verify for a certain block number.
type
failpow
struct
{
num
uint64
}
func
(
pow
failpow
)
Search
(
pow
.
Block
,
<-
chan
struct
{})
(
nonce
uint64
,
mixHash
[]
byte
)
{
return
0
,
nil
}
func
(
pow
failpow
)
Verify
(
b
pow
.
Block
)
bool
{
return
b
.
NumberU64
()
!=
pow
.
num
}
func
(
pow
failpow
)
GetHashrate
()
int64
{
return
0
}
func
(
pow
failpow
)
Turbo
(
bool
)
{
}
core/error.go
浏览文件 @
c6faa18e
...
...
@@ -90,6 +90,23 @@ func IsNonceErr(err error) bool {
return
ok
}
// BlockNonceErr indicates that a block's nonce is invalid.
type
BlockNonceErr
struct
{
Number
*
big
.
Int
Hash
common
.
Hash
Nonce
uint64
}
func
(
err
*
BlockNonceErr
)
Error
()
string
{
return
fmt
.
Sprintf
(
"block %d (%v) nonce is invalid (got %d)"
,
err
.
Number
,
err
.
Hash
,
err
.
Nonce
)
}
// IsBlockNonceErr returns true for invalid block nonce errors.
func
IsBlockNonceErr
(
err
error
)
bool
{
_
,
ok
:=
err
.
(
*
BlockNonceErr
)
return
ok
}
type
InvalidTxErr
struct
{
Message
string
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录