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
55b7c145
Commit
55b7c145
authored
Jun 08, 2015
by
Jeffrey Wilcke
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1199 from obscuren/settable_genesis_nonce
core: settable genesis nonce
parents
75522f95
6244b10a
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
84 additions
and
28 deletions
+84
-28
js_test.go
cmd/geth/js_test.go
+3
-0
main.go
cmd/geth/main.go
+1
-0
flags.go
cmd/utils/flags.go
+12
-1
block_processor_test.go
core/block_processor_test.go
+6
-1
chain_makers.go
core/chain_makers.go
+1
-1
chain_manager.go
core/chain_manager.go
+15
-9
chain_manager_test.go
core/chain_manager_test.go
+38
-13
genesis.go
core/genesis.go
+2
-2
backend.go
eth/backend.go
+6
-1
No files found.
cmd/geth/js_test.go
View file @
55b7c145
...
...
@@ -211,6 +211,9 @@ func TestRPC(t *testing.T) {
}
func
TestCheckTestAccountBalance
(
t
*
testing
.
T
)
{
t
.
Skip
()
// i don't think it tests the correct behaviour here. it's actually testing
// internals which shouldn't be tested. This now fails because of a change in the core
// and i have no means to fix this, sorry - @obscuren
tmp
,
repl
,
ethereum
:=
testJEthRE
(
t
)
if
err
:=
ethereum
.
Start
();
err
!=
nil
{
t
.
Errorf
(
"error starting ethereum: %v"
,
err
)
...
...
cmd/geth/main.go
View file @
55b7c145
...
...
@@ -218,6 +218,7 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Conso
utils
.
IdentityFlag
,
utils
.
UnlockedAccountFlag
,
utils
.
PasswordFileFlag
,
utils
.
GenesisNonceFlag
,
utils
.
BootnodesFlag
,
utils
.
DataDirFlag
,
utils
.
BlockchainVersionFlag
,
...
...
cmd/utils/flags.go
View file @
55b7c145
...
...
@@ -93,6 +93,11 @@ var (
Usage
:
"Blockchain version (integer)"
,
Value
:
core
.
BlockChainVersion
,
}
GenesisNonceFlag
=
cli
.
IntFlag
{
Name
:
"genesisnonce"
,
Usage
:
"Sets the genesis nonce"
,
Value
:
42
,
}
IdentityFlag
=
cli
.
StringFlag
{
Name
:
"identity"
,
Usage
:
"Custom node name"
,
...
...
@@ -294,6 +299,7 @@ func MakeEthConfig(clientID, version string, ctx *cli.Context) *eth.Config {
Name
:
common
.
MakeName
(
clientID
,
version
),
DataDir
:
ctx
.
GlobalString
(
DataDirFlag
.
Name
),
ProtocolVersion
:
ctx
.
GlobalInt
(
ProtocolVersionFlag
.
Name
),
GenesisNonce
:
ctx
.
GlobalInt
(
GenesisNonceFlag
.
Name
),
BlockChainVersion
:
ctx
.
GlobalInt
(
BlockchainVersionFlag
.
Name
),
SkipBcVersionCheck
:
false
,
NetworkId
:
ctx
.
GlobalInt
(
NetworkIdFlag
.
Name
),
...
...
@@ -344,7 +350,12 @@ func MakeChain(ctx *cli.Context) (chain *core.ChainManager, blockDB, stateDB, ex
eventMux
:=
new
(
event
.
TypeMux
)
pow
:=
ethash
.
New
()
chain
=
core
.
NewChainManager
(
blockDB
,
stateDB
,
pow
,
eventMux
)
genesis
:=
core
.
GenesisBlock
(
uint64
(
ctx
.
GlobalInt
(
GenesisNonceFlag
.
Name
)),
blockDB
)
chain
,
err
=
core
.
NewChainManager
(
genesis
,
blockDB
,
stateDB
,
pow
,
eventMux
)
if
err
!=
nil
{
Fatalf
(
"Could not start chainmanager: %v"
,
err
)
}
proc
:=
core
.
NewBlockProcessor
(
stateDB
,
extraDB
,
pow
,
chain
,
eventMux
)
chain
.
SetProcessor
(
proc
)
return
chain
,
blockDB
,
stateDB
,
extraDB
...
...
core/block_processor_test.go
View file @
55b7c145
package
core
import
(
"fmt"
"math/big"
"testing"
...
...
@@ -16,7 +17,11 @@ func proc() (*BlockProcessor, *ChainManager) {
db
,
_
:=
ethdb
.
NewMemDatabase
()
var
mux
event
.
TypeMux
chainMan
:=
NewChainManager
(
db
,
db
,
thePow
(),
&
mux
)
genesis
:=
GenesisBlock
(
0
,
db
)
chainMan
,
err
:=
NewChainManager
(
genesis
,
db
,
db
,
thePow
(),
&
mux
)
if
err
!=
nil
{
fmt
.
Println
(
err
)
}
return
NewBlockProcessor
(
db
,
db
,
ezp
.
New
(),
chainMan
,
&
mux
),
chainMan
}
...
...
core/chain_makers.go
View file @
55b7c145
...
...
@@ -108,7 +108,7 @@ func makeChain(bman *BlockProcessor, parent *types.Block, max int, db common.Dat
// Create a new chain manager starting from given block
// Effectively a fork factory
func
newChainManager
(
block
*
types
.
Block
,
eventMux
*
event
.
TypeMux
,
db
common
.
Database
)
*
ChainManager
{
genesis
:=
GenesisBlock
(
db
)
genesis
:=
GenesisBlock
(
0
,
db
)
bc
:=
&
ChainManager
{
blockDb
:
db
,
stateDb
:
db
,
genesisBlock
:
genesis
,
eventMux
:
eventMux
,
pow
:
FakePow
{}}
bc
.
txState
=
state
.
ManageState
(
state
.
New
(
genesis
.
Root
(),
db
))
bc
.
futureBlocks
=
NewBlockCache
(
1000
)
...
...
core/chain_manager.go
View file @
55b7c145
...
...
@@ -109,16 +109,22 @@ type ChainManager struct {
pow
pow
.
PoW
}
func
NewChainManager
(
blockDb
,
stateDb
common
.
Database
,
pow
pow
.
PoW
,
mux
*
event
.
TypeMux
)
*
ChainManager
{
func
NewChainManager
(
genesis
*
types
.
Block
,
blockDb
,
stateDb
common
.
Database
,
pow
pow
.
PoW
,
mux
*
event
.
TypeMux
)
(
*
ChainManager
,
error
)
{
bc
:=
&
ChainManager
{
blockDb
:
blockDb
,
stateDb
:
stateDb
,
genesisBlock
:
GenesisBlock
(
stateDb
),
eventMux
:
mux
,
quit
:
make
(
chan
struct
{}),
cache
:
NewBlockCache
(
blockCacheLimit
),
pow
:
pow
,
blockDb
:
blockDb
,
stateDb
:
stateDb
,
eventMux
:
mux
,
quit
:
make
(
chan
struct
{}),
cache
:
NewBlockCache
(
blockCacheLimit
),
pow
:
pow
,
}
// Check the genesis block given to the chain manager. If the genesis block mismatches block number 0
// throw an error. If no block or the same block's found continue.
if
g
:=
bc
.
GetBlockByNumber
(
0
);
g
!=
nil
&&
g
.
Hash
()
!=
genesis
.
Hash
()
{
return
nil
,
fmt
.
Errorf
(
"Genesis mismatch. Maybe different nonce (%d vs %d)? %x / %x"
,
g
.
Nonce
(),
genesis
.
Nonce
(),
g
.
Hash
()
.
Bytes
()[
:
4
],
genesis
.
Hash
()
.
Bytes
()[
:
4
])
}
bc
.
genesisBlock
=
genesis
bc
.
setLastState
()
// Check the current state of the block hashes and make sure that we do not have any of the bad blocks in our chain
...
...
@@ -144,7 +150,7 @@ func NewChainManager(blockDb, stateDb common.Database, pow pow.PoW, mux *event.T
go
bc
.
update
()
return
bc
return
bc
,
nil
}
func
(
bc
*
ChainManager
)
SetHead
(
head
*
types
.
Block
)
{
...
...
core/chain_manager_test.go
View file @
55b7c145
...
...
@@ -29,6 +29,21 @@ func thePow() pow.PoW {
return
pow
}
func
theChainManager
(
db
common
.
Database
,
t
*
testing
.
T
)
*
ChainManager
{
var
eventMux
event
.
TypeMux
genesis
:=
GenesisBlock
(
0
,
db
)
chainMan
,
err
:=
NewChainManager
(
genesis
,
db
,
db
,
thePow
(),
&
eventMux
)
if
err
!=
nil
{
t
.
Error
(
"failed creating chainmanager:"
,
err
)
t
.
FailNow
()
return
nil
}
blockMan
:=
NewBlockProcessor
(
db
,
db
,
nil
,
chainMan
,
&
eventMux
)
chainMan
.
SetProcessor
(
blockMan
)
return
chainMan
}
// Test fork of length N starting from block i
func
testFork
(
t
*
testing
.
T
,
bman
*
BlockProcessor
,
i
,
N
int
,
f
func
(
td1
,
td2
*
big
.
Int
))
{
// switch databases to process the new chain
...
...
@@ -266,10 +281,7 @@ func TestChainInsertions(t *testing.T) {
t
.
FailNow
()
}
var
eventMux
event
.
TypeMux
chainMan
:=
NewChainManager
(
db
,
db
,
thePow
(),
&
eventMux
)
blockMan
:=
NewBlockProcessor
(
db
,
db
,
nil
,
chainMan
,
&
eventMux
)
chainMan
.
SetProcessor
(
blockMan
)
chainMan
:=
theChainManager
(
db
,
t
)
const
max
=
2
done
:=
make
(
chan
bool
,
max
)
...
...
@@ -311,10 +323,9 @@ func TestChainMultipleInsertions(t *testing.T) {
t
.
FailNow
()
}
}
var
eventMux
event
.
TypeMux
chainMan
:=
NewChainManager
(
db
,
db
,
thePow
(),
&
eventMux
)
blockMan
:=
NewBlockProcessor
(
db
,
db
,
nil
,
chainMan
,
&
eventMux
)
chainMan
.
SetProcessor
(
blockMan
)
chainMan
:=
theChainManager
(
db
,
t
)
done
:=
make
(
chan
bool
,
max
)
for
i
,
chain
:=
range
chains
{
// XXX the go routine would otherwise reference the same (chain[3]) variable and fail
...
...
@@ -339,8 +350,7 @@ func TestGetAncestors(t *testing.T) {
t
.
Skip
()
// travil fails.
db
,
_
:=
ethdb
.
NewMemDatabase
()
var
eventMux
event
.
TypeMux
chainMan
:=
NewChainManager
(
db
,
db
,
thePow
(),
&
eventMux
)
chainMan
:=
theChainManager
(
db
,
t
)
chain
,
err
:=
loadChain
(
"valid1"
,
t
)
if
err
!=
nil
{
fmt
.
Println
(
err
)
...
...
@@ -391,7 +401,7 @@ func chm(genesis *types.Block, db common.Database) *ChainManager {
func
TestReorgLongest
(
t
*
testing
.
T
)
{
t
.
Skip
(
"skipped while cache is removed"
)
db
,
_
:=
ethdb
.
NewMemDatabase
()
genesis
:=
GenesisBlock
(
db
)
genesis
:=
GenesisBlock
(
0
,
db
)
bc
:=
chm
(
genesis
,
db
)
chain1
:=
makeChainWithDiff
(
genesis
,
[]
int
{
1
,
2
,
4
},
10
)
...
...
@@ -411,7 +421,7 @@ func TestReorgLongest(t *testing.T) {
func
TestReorgShortest
(
t
*
testing
.
T
)
{
t
.
Skip
(
"skipped while cache is removed"
)
db
,
_
:=
ethdb
.
NewMemDatabase
()
genesis
:=
GenesisBlock
(
db
)
genesis
:=
GenesisBlock
(
0
,
db
)
bc
:=
chm
(
genesis
,
db
)
chain1
:=
makeChainWithDiff
(
genesis
,
[]
int
{
1
,
2
,
3
,
4
},
10
)
...
...
@@ -431,7 +441,7 @@ func TestReorgShortest(t *testing.T) {
func
TestInsertNonceError
(
t
*
testing
.
T
)
{
for
i
:=
1
;
i
<
25
&&
!
t
.
Failed
();
i
++
{
db
,
_
:=
ethdb
.
NewMemDatabase
()
genesis
:=
GenesisBlock
(
db
)
genesis
:=
GenesisBlock
(
0
,
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
)
...
...
@@ -465,6 +475,21 @@ func TestInsertNonceError(t *testing.T) {
}
}
func
TestGenesisMismatch
(
t
*
testing
.
T
)
{
db
,
_
:=
ethdb
.
NewMemDatabase
()
var
mux
event
.
TypeMux
genesis
:=
GenesisBlock
(
0
,
db
)
_
,
err
:=
NewChainManager
(
genesis
,
db
,
db
,
thePow
(),
&
mux
)
if
err
!=
nil
{
t
.
Error
(
err
)
}
genesis
=
GenesisBlock
(
1
,
db
)
_
,
err
=
NewChainManager
(
genesis
,
db
,
db
,
thePow
(),
&
mux
)
if
err
==
nil
{
t
.
Error
(
"expected genesis mismatch error"
)
}
}
// failpow returns false from Verify for a certain block number.
type
failpow
struct
{
num
uint64
}
...
...
core/genesis.go
View file @
55b7c145
...
...
@@ -19,8 +19,8 @@ var ZeroHash256 = make([]byte, 32)
var
ZeroHash160
=
make
([]
byte
,
20
)
var
ZeroHash512
=
make
([]
byte
,
64
)
func
GenesisBlock
(
db
common
.
Database
)
*
types
.
Block
{
genesis
:=
types
.
NewBlock
(
common
.
Hash
{},
common
.
Address
{},
common
.
Hash
{},
params
.
GenesisDifficulty
,
42
,
nil
)
func
GenesisBlock
(
nonce
uint64
,
db
common
.
Database
)
*
types
.
Block
{
genesis
:=
types
.
NewBlock
(
common
.
Hash
{},
common
.
Address
{},
common
.
Hash
{},
params
.
GenesisDifficulty
,
nonce
,
nil
)
genesis
.
Header
()
.
Number
=
common
.
Big0
genesis
.
Header
()
.
GasLimit
=
params
.
GenesisGasLimit
genesis
.
Header
()
.
GasUsed
=
common
.
Big0
...
...
eth/backend.go
View file @
55b7c145
...
...
@@ -58,6 +58,7 @@ type Config struct {
Name
string
ProtocolVersion
int
NetworkId
int
GenesisNonce
int
BlockChainVersion
int
SkipBcVersionCheck
bool
// e.g. blockchain export
...
...
@@ -284,7 +285,11 @@ func New(config *Config) (*Ethereum, error) {
}
eth
.
pow
=
ethash
.
New
()
eth
.
chainManager
=
core
.
NewChainManager
(
blockDb
,
stateDb
,
eth
.
pow
,
eth
.
EventMux
())
genesis
:=
core
.
GenesisBlock
(
uint64
(
config
.
GenesisNonce
),
blockDb
)
eth
.
chainManager
,
err
=
core
.
NewChainManager
(
genesis
,
blockDb
,
stateDb
,
eth
.
pow
,
eth
.
EventMux
())
if
err
!=
nil
{
return
nil
,
err
}
eth
.
downloader
=
downloader
.
New
(
eth
.
EventMux
(),
eth
.
chainManager
.
HasBlock
,
eth
.
chainManager
.
GetBlock
)
eth
.
txPool
=
core
.
NewTxPool
(
eth
.
EventMux
(),
eth
.
chainManager
.
State
,
eth
.
chainManager
.
GasLimit
)
eth
.
blockProcessor
=
core
.
NewBlockProcessor
(
stateDb
,
extraDb
,
eth
.
pow
,
eth
.
chainManager
,
eth
.
EventMux
())
...
...
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