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
76e4e233
Commit
76e4e233
authored
Mar 05, 2015
by
obscuren
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'poc-9' of github.com-obscure:ethereum/go-ethereum into poc-9
parents
d44fe4ec
3b307653
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
377 additions
and
1 deletion
+377
-1
flags.go
cmd/blocktest/flags.go
+41
-0
main.go
cmd/blocktest/main.go
+320
-0
chain_manager.go
core/chain_manager.go
+15
-0
error.go
core/error.go
+1
-1
No files found.
cmd/blocktest/flags.go
0 → 100644
View file @
76e4e233
/*
This file is part of go-ethereum
go-ethereum is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
go-ethereum is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @authors
* Gustav Simonsson <gustav.simonsson@gmail.com>
*/
package
main
import
(
"flag"
"fmt"
"os"
)
var
(
TestFile
string
)
func
Init
()
{
flag
.
Usage
=
func
()
{
fmt
.
Fprintf
(
os
.
Stderr
,
"%s <testfile>
\n
"
,
os
.
Args
[
0
])
flag
.
PrintDefaults
()
}
flag
.
Parse
()
TestFile
=
flag
.
Arg
(
0
)
}
cmd/blocktest/main.go
0 → 100644
View file @
76e4e233
/*
This file is part of go-ethereum
go-ethereum is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
go-ethereum is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @authors
* Gustav Simonsson <gustav.simonsson@gmail.com>
* @date 2015
*
*/
package
main
import
(
"bytes"
"crypto/ecdsa"
"encoding/hex"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"math/big"
"path"
"runtime"
"strconv"
"strings"
"time"
"github.com/ethereum/go-ethereum/cmd/utils"
types
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/eth"
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/logger"
"github.com/ethereum/go-ethereum/p2p"
"github.com/ethereum/go-ethereum/p2p/nat"
"github.com/ethereum/go-ethereum/rlp"
)
const
(
ClientIdentifier
=
"Ethereum(G)"
Version
=
"0.8.6"
)
type
Account
struct
{
Balance
string
Code
string
Nonce
string
Storage
map
[
string
]
string
}
type
BlockHeader
struct
{
Bloom
string
Coinbase
string
Difficulty
string
ExtraData
string
GasLimit
string
GasUsed
string
MixHash
string
Nonce
string
Number
string
ParentHash
string
ReceiptTrie
string
SeedHash
string
StateRoot
string
Timestamp
string
TransactionsTrie
string
UncleHash
string
}
type
Tx
struct
{
Data
string
GasLimit
string
GasPrice
string
Nonce
string
R
string
S
string
To
string
V
string
Value
string
}
type
Block
struct
{
BlockHeader
BlockHeader
Rlp
string
Transactions
[]
Tx
UncleHeaders
[]
string
}
type
Test
struct
{
Blocks
[]
Block
GenesisBlockHeader
BlockHeader
Pre
map
[
string
]
Account
}
var
(
Identifier
string
KeyRing
string
DiffTool
bool
DiffType
string
KeyStore
string
StartRpc
bool
StartWebSockets
bool
RpcListenAddress
string
RpcPort
int
WsPort
int
OutboundPort
string
ShowGenesis
bool
AddPeer
string
MaxPeer
int
GenAddr
bool
BootNodes
string
NodeKey
*
ecdsa
.
PrivateKey
NAT
nat
.
Interface
SecretFile
string
ExportDir
string
NonInteractive
bool
Datadir
string
LogFile
string
ConfigFile
string
DebugFile
string
LogLevel
int
LogFormat
string
Dump
bool
DumpHash
string
DumpNumber
int
VmType
int
ImportChain
string
SHH
bool
Dial
bool
PrintVersion
bool
MinerThreads
int
)
// flags specific to cli client
var
(
StartMining
bool
StartJsConsole
bool
InputFile
string
)
func
main
()
{
init_vars
()
Init
()
if
len
(
TestFile
)
<
1
{
log
.
Fatal
(
"Please specify test file"
)
}
blocks
,
err
:=
loadBlocksFromTestFile
(
TestFile
)
if
err
!=
nil
{
panic
(
err
)
}
runtime
.
GOMAXPROCS
(
runtime
.
NumCPU
())
defer
func
()
{
logger
.
Flush
()
}()
utils
.
HandleInterrupt
()
utils
.
InitConfig
(
VmType
,
ConfigFile
,
Datadir
,
"ethblocktest"
)
ethereum
,
err
:=
eth
.
New
(
&
eth
.
Config
{
Name
:
p2p
.
MakeName
(
ClientIdentifier
,
Version
),
KeyStore
:
KeyStore
,
DataDir
:
Datadir
,
LogFile
:
LogFile
,
LogLevel
:
LogLevel
,
LogFormat
:
LogFormat
,
MaxPeers
:
MaxPeer
,
Port
:
OutboundPort
,
NAT
:
NAT
,
KeyRing
:
KeyRing
,
Shh
:
true
,
Dial
:
Dial
,
BootNodes
:
BootNodes
,
NodeKey
:
NodeKey
,
MinerThreads
:
MinerThreads
,
})
utils
.
StartRpc
(
ethereum
,
RpcListenAddress
,
RpcPort
)
utils
.
StartEthereum
(
ethereum
)
ethereum
.
ChainManager
()
.
ResetWithGenesisBlock
(
blocks
[
0
])
// fmt.Println("HURR: ", hex.EncodeToString(ethutil.Encode(blocks[0].RlpData())))
go
ethereum
.
ChainManager
()
.
InsertChain
(
types
.
Blocks
{
blocks
[
1
]})
fmt
.
Println
(
"OK! "
)
ethereum
.
WaitForShutdown
()
}
func
loadBlocksFromTestFile
(
filePath
string
)
(
blocks
types
.
Blocks
,
err
error
)
{
fileContent
,
err
:=
ioutil
.
ReadFile
(
filePath
)
if
err
!=
nil
{
return
}
bt
:=
*
new
(
map
[
string
]
Test
)
err
=
json
.
Unmarshal
(
fileContent
,
&
bt
)
if
err
!=
nil
{
return
}
// TODO: support multiple blocks; loop over all blocks
gbh
:=
new
(
types
.
Header
)
// Let's use slighlty different namings for the same things, because that's awesome.
gbh
.
ParentHash
,
err
=
hex_decode
(
bt
[
"SimpleTx"
]
.
GenesisBlockHeader
.
ParentHash
)
gbh
.
UncleHash
,
err
=
hex_decode
(
bt
[
"SimpleTx"
]
.
GenesisBlockHeader
.
UncleHash
)
gbh
.
Coinbase
,
err
=
hex_decode
(
bt
[
"SimpleTx"
]
.
GenesisBlockHeader
.
Coinbase
)
gbh
.
Root
,
err
=
hex_decode
(
bt
[
"SimpleTx"
]
.
GenesisBlockHeader
.
StateRoot
)
gbh
.
TxHash
,
err
=
hex_decode
(
bt
[
"SimpleTx"
]
.
GenesisBlockHeader
.
TransactionsTrie
)
gbh
.
ReceiptHash
,
err
=
hex_decode
(
bt
[
"SimpleTx"
]
.
GenesisBlockHeader
.
ReceiptTrie
)
gbh
.
Bloom
,
err
=
hex_decode
(
bt
[
"SimpleTx"
]
.
GenesisBlockHeader
.
Bloom
)
gbh
.
MixDigest
,
err
=
hex_decode
(
bt
[
"SimpleTx"
]
.
GenesisBlockHeader
.
MixHash
)
gbh
.
SeedHash
,
err
=
hex_decode
(
bt
[
"SimpleTx"
]
.
GenesisBlockHeader
.
SeedHash
)
d
,
_
:=
new
(
big
.
Int
)
.
SetString
(
bt
[
"SimpleTx"
]
.
GenesisBlockHeader
.
Difficulty
,
10
)
gbh
.
Difficulty
=
d
n
,
_
:=
new
(
big
.
Int
)
.
SetString
(
bt
[
"SimpleTx"
]
.
GenesisBlockHeader
.
Number
,
10
)
gbh
.
Number
=
n
gl
,
_
:=
new
(
big
.
Int
)
.
SetString
(
bt
[
"SimpleTx"
]
.
GenesisBlockHeader
.
GasLimit
,
10
)
gbh
.
GasLimit
=
gl
gu
,
_
:=
new
(
big
.
Int
)
.
SetString
(
bt
[
"SimpleTx"
]
.
GenesisBlockHeader
.
GasUsed
,
10
)
gbh
.
GasUsed
=
gu
ts
,
_
:=
new
(
big
.
Int
)
.
SetString
(
bt
[
"SimpleTx"
]
.
GenesisBlockHeader
.
Timestamp
,
0
)
gbh
.
Time
=
ts
.
Uint64
()
extra
,
err
:=
hex_decode
(
bt
[
"SimpleTx"
]
.
GenesisBlockHeader
.
ExtraData
)
gbh
.
Extra
=
string
(
extra
)
// TODO: change ExtraData to byte array
nonce
,
_
:=
hex_decode
(
bt
[
"SimpleTx"
]
.
GenesisBlockHeader
.
Nonce
)
gbh
.
Nonce
=
nonce
if
err
!=
nil
{
return
}
gb
:=
types
.
NewBlockWithHeader
(
gbh
)
gb
.
Reward
=
new
(
big
.
Int
)
testBlock
:=
new
(
types
.
Block
)
rlpBytes
,
err
:=
hex_decode
(
bt
[
"SimpleTx"
]
.
Blocks
[
0
]
.
Rlp
)
err
=
rlp
.
Decode
(
bytes
.
NewReader
(
rlpBytes
),
&
testBlock
)
if
err
!=
nil
{
return
}
blocks
=
types
.
Blocks
{
gb
,
testBlock
,
}
return
}
func
init_vars
()
{
VmType
=
0
Identifier
=
""
KeyRing
=
""
KeyStore
=
"db"
RpcListenAddress
=
"127.0.0.1"
RpcPort
=
8545
WsPort
=
40404
StartRpc
=
true
StartWebSockets
=
false
NonInteractive
=
false
GenAddr
=
false
SecretFile
=
""
ExportDir
=
""
LogFile
=
""
timeStr
:=
strconv
.
FormatInt
(
time
.
Now
()
.
UnixNano
(),
10
)
Datadir
=
path
.
Join
(
ethutil
.
DefaultDataDir
(),
timeStr
)
ConfigFile
=
path
.
Join
(
ethutil
.
DefaultDataDir
(),
timeStr
,
"conf.ini"
)
DebugFile
=
""
LogLevel
=
5
LogFormat
=
"std"
DiffTool
=
false
DiffType
=
"all"
ShowGenesis
=
false
ImportChain
=
""
Dump
=
false
DumpHash
=
""
DumpNumber
=
-
1
StartMining
=
false
StartJsConsole
=
false
PrintVersion
=
false
MinerThreads
=
runtime
.
NumCPU
()
Dial
=
false
OutboundPort
=
"30303"
BootNodes
=
""
MaxPeer
=
1
}
func
hex_decode
(
s
string
)
(
res
[]
byte
,
err
error
)
{
return
hex
.
DecodeString
(
strings
.
TrimPrefix
(
s
,
"0x"
))
}
core/chain_manager.go
View file @
76e4e233
...
...
@@ -234,6 +234,21 @@ func (bc *ChainManager) Reset() {
bc
.
setTotalDifficulty
(
ethutil
.
Big
(
"0"
))
}
func
(
bc
*
ChainManager
)
ResetWithGenesisBlock
(
gb
*
types
.
Block
)
{
bc
.
mu
.
Lock
()
defer
bc
.
mu
.
Unlock
()
for
block
:=
bc
.
currentBlock
;
block
!=
nil
;
block
=
bc
.
GetBlock
(
block
.
Header
()
.
ParentHash
)
{
bc
.
db
.
Delete
(
block
.
Hash
())
}
// Prepare the genesis block
bc
.
genesisBlock
=
gb
bc
.
write
(
bc
.
genesisBlock
)
bc
.
insert
(
bc
.
genesisBlock
)
bc
.
currentBlock
=
bc
.
genesisBlock
}
func
(
self
*
ChainManager
)
Export
()
[]
byte
{
self
.
mu
.
RLock
()
defer
self
.
mu
.
RUnlock
()
...
...
core/error.go
View file @
76e4e233
...
...
@@ -22,7 +22,7 @@ func (err *ParentErr) Error() string {
}
func
ParentError
(
hash
[]
byte
)
error
{
return
&
ParentErr
{
Message
:
fmt
.
Sprintf
(
"Block's parent unkown %x"
,
hash
)}
return
&
ParentErr
{
Message
:
fmt
.
Sprintf
(
"Block's parent unk
n
own %x"
,
hash
)}
}
func
IsParentErr
(
err
error
)
bool
{
...
...
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