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
ceaf1c08
Commit
ceaf1c08
authored
Jun 18, 2015
by
Felix Lange
Committed by
Jeffrey Wilcke
Jun 29, 2015
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
core: add GenerateChain, GenesisBlockForTesting
parent
1d42888d
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
230 additions
and
80 deletions
+230
-80
block_processor_test.go
core/block_processor_test.go
+4
-3
chain_makers.go
core/chain_makers.go
+127
-74
chain_makers_test.go
core/chain_makers_test.go
+78
-0
chain_manager_test.go
core/chain_manager_test.go
+3
-3
genesis.go
core/genesis.go
+18
-0
No files found.
core/block_processor_test.go
View file @
ceaf1c08
...
@@ -27,16 +27,17 @@ func proc() (*BlockProcessor, *ChainManager) {
...
@@ -27,16 +27,17 @@ func proc() (*BlockProcessor, *ChainManager) {
func
TestNumber
(
t
*
testing
.
T
)
{
func
TestNumber
(
t
*
testing
.
T
)
{
pow
:=
ezp
.
New
()
pow
:=
ezp
.
New
()
_
,
chain
:=
proc
()
bp
,
chain
:=
proc
(
)
statedb
:=
state
.
New
(
chain
.
Genesis
()
.
Root
(),
chain
.
stateDb
)
header
:=
makeHeader
(
chain
.
Genesis
(),
0
,
bp
.
db
,
0
)
header
:=
makeHeader
(
chain
.
Genesis
(),
statedb
)
header
.
Number
=
big
.
NewInt
(
3
)
header
.
Number
=
big
.
NewInt
(
3
)
err
:=
ValidateHeader
(
pow
,
header
,
chain
.
Genesis
()
.
Header
(),
false
)
err
:=
ValidateHeader
(
pow
,
header
,
chain
.
Genesis
()
.
Header
(),
false
)
if
err
!=
BlockNumberErr
{
if
err
!=
BlockNumberErr
{
t
.
Errorf
(
"expected block number error, got %q"
,
err
)
t
.
Errorf
(
"expected block number error, got %q"
,
err
)
}
}
header
=
makeHeader
(
chain
.
Genesis
(),
0
,
bp
.
db
,
0
)
header
=
makeHeader
(
chain
.
Genesis
(),
statedb
)
err
=
ValidateHeader
(
pow
,
header
,
chain
.
Genesis
()
.
Header
(),
false
)
err
=
ValidateHeader
(
pow
,
header
,
chain
.
Genesis
()
.
Header
(),
false
)
if
err
==
BlockNumberErr
{
if
err
==
BlockNumberErr
{
t
.
Errorf
(
"didn't expect block number error"
)
t
.
Errorf
(
"didn't expect block number error"
)
...
...
core/chain_makers.go
View file @
ceaf1c08
package
core
package
core
import
(
import
(
"fmt"
"math/big"
"math/big"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
...
@@ -11,7 +10,8 @@ import (
...
@@ -11,7 +10,8 @@ import (
"github.com/ethereum/go-ethereum/pow"
"github.com/ethereum/go-ethereum/pow"
)
)
// So we can generate blocks easily
// FakePow is a non-validating proof of work implementation.
// It returns true from Verify for any block.
type
FakePow
struct
{}
type
FakePow
struct
{}
func
(
f
FakePow
)
Search
(
block
pow
.
Block
,
stop
<-
chan
struct
{})
(
uint64
,
[]
byte
)
{
func
(
f
FakePow
)
Search
(
block
pow
.
Block
,
stop
<-
chan
struct
{})
(
uint64
,
[]
byte
)
{
...
@@ -23,69 +23,125 @@ func (f FakePow) Turbo(bool) {}
...
@@ -23,69 +23,125 @@ func (f FakePow) Turbo(bool) {}
// So we can deterministically seed different blockchains
// So we can deterministically seed different blockchains
var
(
var
(
C
anonicalSeed
=
1
c
anonicalSeed
=
1
F
orkSeed
=
2
f
orkSeed
=
2
)
)
// Utility functions for making chains on the fly
// BlockGen creates blocks for testing.
// Exposed for sake of testing from other packages (eg. go-ethash)
// See GenerateChain for a detailed explanation.
func
MakeBlock
(
bman
*
BlockProcessor
,
parent
*
types
.
Block
,
i
int
,
db
common
.
Database
,
seed
int
)
*
types
.
Block
{
type
BlockGen
struct
{
return
types
.
NewBlock
(
makeHeader
(
parent
,
i
,
db
,
seed
),
nil
,
nil
,
nil
)
i
int
parent
*
types
.
Block
chain
[]
*
types
.
Block
header
*
types
.
Header
statedb
*
state
.
StateDB
coinbase
*
state
.
StateObject
txs
[]
*
types
.
Transaction
receipts
[]
*
types
.
Receipt
uncles
[]
*
types
.
Header
}
}
func
MakeChain
(
bman
*
BlockProcessor
,
parent
*
types
.
Block
,
max
int
,
db
common
.
Database
,
seed
int
)
types
.
Blocks
{
// SetCoinbase sets the coinbase of the generated block.
return
makeChain
(
bman
,
parent
,
max
,
db
,
seed
)
// It can be called at most once.
func
(
b
*
BlockGen
)
SetCoinbase
(
addr
common
.
Address
)
{
if
b
.
coinbase
!=
nil
{
if
len
(
b
.
txs
)
>
0
{
panic
(
"coinbase must be set before adding transactions"
)
}
panic
(
"coinbase can only be set once"
)
}
b
.
header
.
Coinbase
=
addr
b
.
coinbase
=
b
.
statedb
.
GetOrNewStateObject
(
addr
)
b
.
coinbase
.
SetGasLimit
(
b
.
header
.
GasLimit
)
}
}
func
NewChainMan
(
block
*
types
.
Block
,
eventMux
*
event
.
TypeMux
,
db
common
.
Database
)
*
ChainManager
{
// SetExtra sets the extra data field of the generated block.
return
newChainManager
(
block
,
eventMux
,
db
)
func
(
b
*
BlockGen
)
SetExtra
(
data
[]
byte
)
{
b
.
header
.
Extra
=
data
}
}
func
NewBlockProc
(
db
common
.
Database
,
cman
*
ChainManager
,
eventMux
*
event
.
TypeMux
)
*
BlockProcessor
{
// AddTx adds a transaction to the generated block. If no coinbase has
return
newBlockProcessor
(
db
,
cman
,
eventMux
)
// been set, the block's coinbase is set to the zero address.
//
// AddTx panics if the transaction cannot be executed. In addition to
// the protocol-imposed limitations (gas limit, etc.), there are some
// further limitations on the content of transactions that can be
// added. Notably, contract code relying on the BLOCKHASH instruction
// will panic during execution.
func
(
b
*
BlockGen
)
AddTx
(
tx
*
types
.
Transaction
)
{
if
b
.
coinbase
==
nil
{
b
.
SetCoinbase
(
common
.
Address
{})
}
_
,
gas
,
err
:=
ApplyMessage
(
NewEnv
(
b
.
statedb
,
nil
,
tx
,
b
.
header
),
tx
,
b
.
coinbase
)
if
err
!=
nil
{
panic
(
err
)
}
b
.
statedb
.
Update
()
b
.
header
.
GasUsed
.
Add
(
b
.
header
.
GasUsed
,
gas
)
receipt
:=
types
.
NewReceipt
(
b
.
statedb
.
Root
()
.
Bytes
(),
b
.
header
.
GasUsed
)
logs
:=
b
.
statedb
.
GetLogs
(
tx
.
Hash
())
receipt
.
SetLogs
(
logs
)
receipt
.
Bloom
=
types
.
CreateBloom
(
types
.
Receipts
{
receipt
})
b
.
txs
=
append
(
b
.
txs
,
tx
)
b
.
receipts
=
append
(
b
.
receipts
,
receipt
)
}
}
func
NewCanonical
(
n
int
,
db
common
.
Database
)
(
*
BlockProcessor
,
error
)
{
// TxNonce returns the next valid transaction nonce for the
return
newCanonical
(
n
,
db
)
// account at addr. It panics if the account does not exist.
func
(
b
*
BlockGen
)
TxNonce
(
addr
common
.
Address
)
uint64
{
if
!
b
.
statedb
.
HasAccount
(
addr
)
{
panic
(
"account does not exist"
)
}
return
b
.
statedb
.
GetNonce
(
addr
)
}
}
// makeHeader creates the header for a new empty block, simulating
// AddUncle adds an uncle header to the generated block.
// what miner would do. We seed chains by the first byte of the coinbase.
func
(
b
*
BlockGen
)
AddUncle
(
h
*
types
.
Header
)
{
func
makeHeader
(
parent
*
types
.
Block
,
i
int
,
db
common
.
Database
,
seed
int
)
*
types
.
Header
{
b
.
uncles
=
append
(
b
.
uncles
,
h
)
var
addr
common
.
Address
}
addr
[
0
],
addr
[
19
]
=
byte
(
seed
),
byte
(
i
)
// 'random' coinbase
time
:=
parent
.
Time
()
+
10
// block time is fixed at 10 seconds
// ensure that the block's coinbase has the block reward in the state.
state
:=
state
.
New
(
parent
.
Root
(),
db
)
cbase
:=
state
.
GetOrNewStateObject
(
addr
)
cbase
.
SetGasLimit
(
CalcGasLimit
(
parent
))
cbase
.
AddBalance
(
BlockReward
)
state
.
Update
()
return
&
types
.
Header
{
// PrevBlock returns a previously generated block by number. It panics if
Root
:
state
.
Root
(),
// num is greater or equal to the number of the block being generated.
ParentHash
:
parent
.
Hash
(),
// For index -1, PrevBlock returns the parent block given to GenerateChain.
Coinbase
:
addr
,
func
(
b
*
BlockGen
)
PrevBlock
(
index
int
)
*
types
.
Block
{
Difficulty
:
CalcDifficulty
(
time
,
parent
.
Time
(),
parent
.
Difficulty
()),
if
index
>=
b
.
i
{
Number
:
new
(
big
.
Int
)
.
Add
(
parent
.
Number
(),
common
.
Big1
),
panic
(
"block index out of range"
)
Time
:
uint64
(
time
),
GasLimit
:
CalcGasLimit
(
parent
),
}
}
if
index
==
-
1
{
return
b
.
parent
}
return
b
.
chain
[
index
]
}
}
// makeChain creates a valid chain of empty blocks.
// GenerateChain creates a chain of n blocks. The first block's
func
makeChain
(
bman
*
BlockProcessor
,
parent
*
types
.
Block
,
max
int
,
db
common
.
Database
,
seed
int
)
types
.
Blocks
{
// parent will be the provided parent. db is used to store
bman
.
bc
.
currentBlock
=
parent
// intermediate states and should contain the parent's state trie.
blocks
:=
make
(
types
.
Blocks
,
max
)
//
for
i
:=
0
;
i
<
max
;
i
++
{
// The generator function is called with a new block generator for
block
:=
types
.
NewBlock
(
makeHeader
(
parent
,
i
,
db
,
seed
),
nil
,
nil
,
nil
)
// every block. Any transactions and uncles added to the generator
// Use ProcessWithParent to verify that we have produced a valid block.
// become part of the block. If gen is nil, the blocks will be empty
_
,
err
:=
bman
.
processWithParent
(
block
,
parent
)
// and their coinbase will be the zero address.
if
err
!=
nil
{
//
fmt
.
Println
(
"process with parent failed"
,
err
)
// Blocks created by GenerateChain do not contain valid proof of work
panic
(
err
)
// values. Inserting them into ChainManager requires use of FakePow or
// a similar non-validating proof of work implementation.
func
GenerateChain
(
parent
*
types
.
Block
,
db
common
.
Database
,
n
int
,
gen
func
(
int
,
*
BlockGen
))
[]
*
types
.
Block
{
statedb
:=
state
.
New
(
parent
.
Root
(),
db
)
blocks
:=
make
(
types
.
Blocks
,
n
)
genblock
:=
func
(
i
int
,
h
*
types
.
Header
)
*
types
.
Block
{
b
:=
&
BlockGen
{
parent
:
parent
,
i
:
i
,
chain
:
blocks
,
header
:
h
,
statedb
:
statedb
}
if
gen
!=
nil
{
gen
(
i
,
b
)
}
}
AccumulateRewards
(
statedb
,
h
,
b
.
uncles
)
statedb
.
Update
()
h
.
Root
=
statedb
.
Root
()
return
types
.
NewBlock
(
h
,
b
.
txs
,
b
.
uncles
,
b
.
receipts
)
}
for
i
:=
0
;
i
<
n
;
i
++
{
header
:=
makeHeader
(
parent
,
statedb
)
block
:=
genblock
(
i
,
header
)
block
.
Td
=
CalcTD
(
block
,
parent
)
block
.
Td
=
CalcTD
(
block
,
parent
)
blocks
[
i
]
=
block
blocks
[
i
]
=
block
parent
=
block
parent
=
block
...
@@ -93,41 +149,38 @@ func makeChain(bman *BlockProcessor, parent *types.Block, max int, db common.Dat
...
@@ -93,41 +149,38 @@ func makeChain(bman *BlockProcessor, parent *types.Block, max int, db common.Dat
return
blocks
return
blocks
}
}
// Create a new chain manager starting from given block
func
makeHeader
(
parent
*
types
.
Block
,
state
*
state
.
StateDB
)
*
types
.
Header
{
// Effectively a fork factory
time
:=
parent
.
Time
()
+
10
// block time is fixed at 10 seconds
func
newChainManager
(
block
*
types
.
Block
,
eventMux
*
event
.
TypeMux
,
db
common
.
Database
)
*
ChainManager
{
return
&
types
.
Header
{
genesis
:=
GenesisBlock
(
0
,
db
)
Root
:
state
.
Root
(),
bc
:=
&
ChainManager
{
blockDb
:
db
,
stateDb
:
db
,
genesisBlock
:
genesis
,
eventMux
:
eventMux
,
pow
:
FakePow
{}}
ParentHash
:
parent
.
Hash
(),
bc
.
txState
=
state
.
ManageState
(
state
.
New
(
genesis
.
Root
(),
db
))
Coinbase
:
parent
.
Coinbase
(),
bc
.
futureBlocks
=
NewBlockCache
(
1000
)
Difficulty
:
CalcDifficulty
(
time
,
parent
.
Time
(),
parent
.
Difficulty
()),
if
block
==
nil
{
GasLimit
:
CalcGasLimit
(
parent
),
bc
.
Reset
()
GasUsed
:
new
(
big
.
Int
),
}
else
{
Number
:
new
(
big
.
Int
)
.
Add
(
parent
.
Number
(),
common
.
Big1
),
bc
.
currentBlock
=
block
Time
:
uint64
(
time
),
bc
.
td
=
block
.
Td
}
}
return
bc
}
// block processor with fake pow
func
newBlockProcessor
(
db
common
.
Database
,
cman
*
ChainManager
,
eventMux
*
event
.
TypeMux
)
*
BlockProcessor
{
chainMan
:=
newChainManager
(
nil
,
eventMux
,
db
)
bman
:=
NewBlockProcessor
(
db
,
db
,
FakePow
{},
chainMan
,
eventMux
)
return
bman
}
}
//
Make a new, deterministic canonical chain by running InsertChain
//
newCanonical creates a new deterministic canonical chain by running
//
on
result of makeChain.
//
InsertChain on the
result of makeChain.
func
newCanonical
(
n
int
,
db
common
.
Database
)
(
*
BlockProcessor
,
error
)
{
func
newCanonical
(
n
int
,
db
common
.
Database
)
(
*
BlockProcessor
,
error
)
{
ev
entM
ux
:=
&
event
.
TypeMux
{}
ev
m
ux
:=
&
event
.
TypeMux
{}
chainman
,
_
:=
NewChainManager
(
GenesisBlock
(
0
,
db
),
db
,
db
,
FakePow
{},
evmux
)
bman
:=
newBlockProcessor
(
db
,
newChainManager
(
nil
,
eventMux
,
db
),
eventM
ux
)
bman
:=
NewBlockProcessor
(
db
,
db
,
FakePow
{},
chainman
,
evm
ux
)
bman
.
bc
.
SetProcessor
(
bman
)
bman
.
bc
.
SetProcessor
(
bman
)
parent
:=
bman
.
bc
.
CurrentBlock
()
parent
:=
bman
.
bc
.
CurrentBlock
()
if
n
==
0
{
if
n
==
0
{
return
bman
,
nil
return
bman
,
nil
}
}
lchain
:=
makeChain
(
bman
,
parent
,
n
,
db
,
C
anonicalSeed
)
lchain
:=
makeChain
(
parent
,
n
,
db
,
c
anonicalSeed
)
_
,
err
:=
bman
.
bc
.
InsertChain
(
lchain
)
_
,
err
:=
bman
.
bc
.
InsertChain
(
lchain
)
return
bman
,
err
return
bman
,
err
}
}
func
makeChain
(
parent
*
types
.
Block
,
n
int
,
db
common
.
Database
,
seed
int
)
[]
*
types
.
Block
{
return
GenerateChain
(
parent
,
db
,
n
,
func
(
i
int
,
b
*
BlockGen
)
{
b
.
SetCoinbase
(
common
.
Address
{
0
:
byte
(
seed
),
19
:
byte
(
i
)})
})
}
core/chain_makers_test.go
0 → 100644
View file @
ceaf1c08
package
core
import
(
"fmt"
"math/big"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethdb"
"github.com/ethereum/go-ethereum/event"
"github.com/ethereum/go-ethereum/params"
)
func
ExampleGenerateChain
()
{
var
(
key1
,
_
=
crypto
.
HexToECDSA
(
"b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291"
)
key2
,
_
=
crypto
.
HexToECDSA
(
"8a1f9a8f95be41cd7ccb6168179afb4504aefe388d1e14474d32c45c72ce7b7a"
)
key3
,
_
=
crypto
.
HexToECDSA
(
"49a7b37aa6f6645917e7b807e9d1c00d4fa71f18343b0d4122a4d2df64dd6fee"
)
addr1
=
crypto
.
PubkeyToAddress
(
key1
.
PublicKey
)
addr2
=
crypto
.
PubkeyToAddress
(
key2
.
PublicKey
)
addr3
=
crypto
.
PubkeyToAddress
(
key3
.
PublicKey
)
db
,
_
=
ethdb
.
NewMemDatabase
()
)
// Ensure that key1 has some funds in the genesis block.
genesis
:=
GenesisBlockForTesting
(
db
,
addr1
,
big
.
NewInt
(
1000000
))
// This call generates a chain of 5 blocks. The function runs for
// each block and adds different features to gen based on the
// block index.
chain
:=
GenerateChain
(
genesis
,
db
,
5
,
func
(
i
int
,
gen
*
BlockGen
)
{
switch
i
{
case
0
:
// In block 1, addr1 sends addr2 some ether.
tx
,
_
:=
types
.
NewTransaction
(
gen
.
TxNonce
(
addr1
),
addr2
,
big
.
NewInt
(
10000
),
params
.
TxGas
,
nil
,
nil
)
.
SignECDSA
(
key1
)
gen
.
AddTx
(
tx
)
case
1
:
// In block 2, addr1 sends some more ether to addr2.
// addr2 passes it on to addr3.
tx1
,
_
:=
types
.
NewTransaction
(
gen
.
TxNonce
(
addr1
),
addr2
,
big
.
NewInt
(
1000
),
params
.
TxGas
,
nil
,
nil
)
.
SignECDSA
(
key1
)
tx2
,
_
:=
types
.
NewTransaction
(
gen
.
TxNonce
(
addr2
),
addr3
,
big
.
NewInt
(
1000
),
params
.
TxGas
,
nil
,
nil
)
.
SignECDSA
(
key2
)
gen
.
AddTx
(
tx1
)
gen
.
AddTx
(
tx2
)
case
2
:
// Block 3 is empty but was mined by addr3.
gen
.
SetCoinbase
(
addr3
)
gen
.
SetExtra
([]
byte
(
"yeehaw"
))
case
3
:
// Block 4 includes blocks 2 and 3 as uncle headers (with modified extra data).
b2
:=
gen
.
PrevBlock
(
1
)
.
Header
()
b2
.
Extra
=
[]
byte
(
"foo"
)
gen
.
AddUncle
(
b2
)
b3
:=
gen
.
PrevBlock
(
2
)
.
Header
()
b3
.
Extra
=
[]
byte
(
"foo"
)
gen
.
AddUncle
(
b3
)
}
})
// Import the chain. This runs all block validation rules.
evmux
:=
&
event
.
TypeMux
{}
chainman
,
_
:=
NewChainManager
(
genesis
,
db
,
db
,
FakePow
{},
evmux
)
chainman
.
SetProcessor
(
NewBlockProcessor
(
db
,
db
,
FakePow
{},
chainman
,
evmux
))
if
i
,
err
:=
chainman
.
InsertChain
(
chain
);
err
!=
nil
{
fmt
.
Printf
(
"insert error (block %d): %v
\n
"
,
i
,
err
)
return
}
state
:=
chainman
.
State
()
fmt
.
Printf
(
"last block: #%d
\n
"
,
chainman
.
CurrentBlock
()
.
Number
())
fmt
.
Println
(
"balance of addr1:"
,
state
.
GetBalance
(
addr1
))
fmt
.
Println
(
"balance of addr2:"
,
state
.
GetBalance
(
addr2
))
fmt
.
Println
(
"balance of addr3:"
,
state
.
GetBalance
(
addr3
))
// Output:
// last block: #5
// balance of addr1: 989000
// balance of addr2: 10000
// balance of addr3: 5906250000000001000
}
core/chain_manager_test.go
View file @
ceaf1c08
...
@@ -67,7 +67,7 @@ func testFork(t *testing.T, bman *BlockProcessor, i, N int, f func(td1, td2 *big
...
@@ -67,7 +67,7 @@ func testFork(t *testing.T, bman *BlockProcessor, i, N int, f func(td1, td2 *big
// extend the fork
// extend the fork
parent
:=
bman2
.
bc
.
CurrentBlock
()
parent
:=
bman2
.
bc
.
CurrentBlock
()
chainB
:=
makeChain
(
bman2
,
parent
,
N
,
db
,
F
orkSeed
)
chainB
:=
makeChain
(
parent
,
N
,
db
,
f
orkSeed
)
_
,
err
=
bman2
.
bc
.
InsertChain
(
chainB
)
_
,
err
=
bman2
.
bc
.
InsertChain
(
chainB
)
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatal
(
"Insert chain error for fork:"
,
err
)
t
.
Fatal
(
"Insert chain error for fork:"
,
err
)
...
@@ -256,7 +256,7 @@ func TestBrokenChain(t *testing.T) {
...
@@ -256,7 +256,7 @@ func TestBrokenChain(t *testing.T) {
}
}
bman2
.
bc
.
SetProcessor
(
bman2
)
bman2
.
bc
.
SetProcessor
(
bman2
)
parent
:=
bman2
.
bc
.
CurrentBlock
()
parent
:=
bman2
.
bc
.
CurrentBlock
()
chainB
:=
makeChain
(
bman2
,
parent
,
5
,
db2
,
F
orkSeed
)
chainB
:=
makeChain
(
parent
,
5
,
db2
,
f
orkSeed
)
chainB
=
chainB
[
1
:
]
chainB
=
chainB
[
1
:
]
_
,
err
=
testChain
(
chainB
,
bman
)
_
,
err
=
testChain
(
chainB
,
bman
)
if
err
==
nil
{
if
err
==
nil
{
...
@@ -444,7 +444,7 @@ func TestInsertNonceError(t *testing.T) {
...
@@ -444,7 +444,7 @@ func TestInsertNonceError(t *testing.T) {
genesis
:=
GenesisBlock
(
0
,
db
)
genesis
:=
GenesisBlock
(
0
,
db
)
bc
:=
chm
(
genesis
,
db
)
bc
:=
chm
(
genesis
,
db
)
bc
.
processor
=
NewBlockProcessor
(
db
,
db
,
bc
.
pow
,
bc
,
bc
.
eventMux
)
bc
.
processor
=
NewBlockProcessor
(
db
,
db
,
bc
.
pow
,
bc
,
bc
.
eventMux
)
blocks
:=
makeChain
(
bc
.
processor
.
(
*
BlockProcessor
),
bc
.
currentBlock
,
i
,
db
,
0
)
blocks
:=
makeChain
(
bc
.
currentBlock
,
i
,
db
,
0
)
fail
:=
rand
.
Int
()
%
len
(
blocks
)
fail
:=
rand
.
Int
()
%
len
(
blocks
)
failblock
:=
blocks
[
fail
]
failblock
:=
blocks
[
fail
]
...
...
core/genesis.go
View file @
ceaf1c08
...
@@ -3,6 +3,7 @@ package core
...
@@ -3,6 +3,7 @@ package core
import
(
import
(
"encoding/json"
"encoding/json"
"fmt"
"fmt"
"math/big"
"os"
"os"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
...
@@ -56,3 +57,20 @@ var GenesisAccounts = []byte(`{
...
@@ -56,3 +57,20 @@ var GenesisAccounts = []byte(`{
"e6716f9544a56c530d868e4bfbacb172315bdead": {"balance": "1606938044258990275541962092341162602522202993782792835301376"},
"e6716f9544a56c530d868e4bfbacb172315bdead": {"balance": "1606938044258990275541962092341162602522202993782792835301376"},
"1a26338f0d905e295fccb71fa9ea849ffa12aaf4": {"balance": "1606938044258990275541962092341162602522202993782792835301376"}
"1a26338f0d905e295fccb71fa9ea849ffa12aaf4": {"balance": "1606938044258990275541962092341162602522202993782792835301376"}
}`
)
}`
)
// GenesisBlockForTesting creates a block in which addr has the given wei balance.
// The state trie of the block is written to db.
func
GenesisBlockForTesting
(
db
common
.
Database
,
addr
common
.
Address
,
balance
*
big
.
Int
)
*
types
.
Block
{
statedb
:=
state
.
New
(
common
.
Hash
{},
db
)
obj
:=
statedb
.
GetOrNewStateObject
(
addr
)
obj
.
SetBalance
(
balance
)
statedb
.
Update
()
statedb
.
Sync
()
block
:=
types
.
NewBlock
(
&
types
.
Header
{
Difficulty
:
params
.
GenesisDifficulty
,
GasLimit
:
params
.
GenesisGasLimit
,
Root
:
statedb
.
Root
(),
},
nil
,
nil
,
nil
)
block
.
Td
=
params
.
GenesisDifficulty
return
block
}
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