Chain importer

This commit is contained in:
obscuren 2014-12-23 14:33:15 +01:00
parent 4cd79d8ddd
commit 9e5257b83b
6 changed files with 66 additions and 37 deletions

View File

@ -58,6 +58,7 @@ var (
DumpHash string DumpHash string
DumpNumber int DumpNumber int
VmType int VmType int
ImportChain string
) )
// flags specific to cli client // flags specific to cli client
@ -104,6 +105,7 @@ func Init() {
flag.BoolVar(&DiffTool, "difftool", false, "creates output for diff'ing. Sets LogLevel=0") flag.BoolVar(&DiffTool, "difftool", false, "creates output for diff'ing. Sets LogLevel=0")
flag.StringVar(&DiffType, "diff", "all", "sets the level of diff output [vm, all]. Has no effect if difftool=false") flag.StringVar(&DiffType, "diff", "all", "sets the level of diff output [vm, all]. Has no effect if difftool=false")
flag.BoolVar(&ShowGenesis, "genesis", false, "Dump the genesis block") flag.BoolVar(&ShowGenesis, "genesis", false, "Dump the genesis block")
flag.StringVar(&ImportChain, "chain", "", "Imports fiven chain")
flag.BoolVar(&Dump, "dump", false, "output the ethereum state in JSON format. Sub args [number, hash]") flag.BoolVar(&Dump, "dump", false, "output the ethereum state in JSON format. Sub args [number, hash]")
flag.StringVar(&DumpHash, "hash", "", "specify arg in hex") flag.StringVar(&DumpHash, "hash", "", "specify arg in hex")

View File

@ -18,6 +18,7 @@
package main package main
import ( import (
"bytes"
"fmt" "fmt"
"os" "os"
"runtime" "runtime"
@ -26,6 +27,7 @@ import (
"github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/ethutil" "github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger"
"github.com/ethereum/go-ethereum/rlp"
) )
const ( const (
@ -38,6 +40,10 @@ var clilogger = logger.NewLogger("CLI")
func main() { func main() {
runtime.GOMAXPROCS(runtime.NumCPU()) runtime.GOMAXPROCS(runtime.NumCPU())
defer func() {
logger.Flush()
}()
utils.HandleInterrupt() utils.HandleInterrupt()
// precedence: code-internal flag default < config file < environment variables < command line // precedence: code-internal flag default < config file < environment variables < command line
@ -112,6 +118,27 @@ func main() {
utils.StartMining(ethereum) utils.StartMining(ethereum)
} }
if len(ImportChain) > 0 {
clilogger.Infof("importing chain '%s'\n", ImportChain)
c, err := ethutil.ReadAllFile(ImportChain)
if err != nil {
clilogger.Infoln(err)
return
}
var chain types.Blocks
if err := rlp.Decode(bytes.NewReader([]byte(c)), &chain); err != nil {
clilogger.Infoln(err)
return
}
ethereum.ChainManager().Reset()
if err := ethereum.ChainManager().InsertChain(chain); err != nil {
clilogger.Infoln(err)
return
}
clilogger.Infof("imported %d blocks\n", len(chain))
}
// better reworked as cases // better reworked as cases
if StartJsConsole { if StartJsConsole {
InitJsConsole(ethereum) InitJsConsole(ethereum)
@ -131,5 +158,4 @@ func main() {
// this blocks the thread // this blocks the thread
ethereum.WaitForShutdown() ethereum.WaitForShutdown()
logger.Flush()
} }

View File

@ -304,7 +304,7 @@ func (sm *BlockManager) AccumelateRewards(statedb *state.StateDB, block, parent
knownUncles := set.New() knownUncles := set.New()
for _, uncle := range parent.Uncles() { for _, uncle := range parent.Uncles() {
knownUncles.Add(uncle.Hash()) knownUncles.Add(string(uncle.Hash()))
} }
nonces := ethutil.NewSet(block.Header().Nonce) nonces := ethutil.NewSet(block.Header().Nonce)
@ -323,7 +323,7 @@ func (sm *BlockManager) AccumelateRewards(statedb *state.StateDB, block, parent
return UncleError("Uncle too old") return UncleError("Uncle too old")
} }
if knownUncles.Has(uncle.Hash()) { if knownUncles.Has(string(uncle.Hash())) {
return UncleError("Uncle in chain") return UncleError("Uncle in chain")
} }

View File

@ -204,9 +204,6 @@ func (bc *ChainManager) Reset() {
bc.currentBlock = bc.genesisBlock bc.currentBlock = bc.genesisBlock
bc.setTotalDifficulty(ethutil.Big("0")) bc.setTotalDifficulty(ethutil.Big("0"))
// Set the last know difficulty (might be 0x0 as initial value, Genesis)
bc.td = ethutil.BigD(ethutil.Config.Db.LastKnownTD())
} }
func (self *ChainManager) Export() []byte { func (self *ChainManager) Export() []byte {
@ -219,9 +216,7 @@ func (self *ChainManager) Export() []byte {
for block := self.currentBlock; block != nil; block = self.GetBlock(block.Header().ParentHash) { for block := self.currentBlock; block != nil; block = self.GetBlock(block.Header().ParentHash) {
blocks[block.NumberU64()] = block blocks[block.NumberU64()] = block
} }
//fmt.Println(blocks)
return nil
return ethutil.Encode(blocks) return ethutil.Encode(blocks)
} }

View File

@ -209,28 +209,34 @@ func (self *Block) HashNoNonce() []byte {
func (self *Block) String() string { func (self *Block) String() string {
return fmt.Sprintf(`BLOCK(%x): Size: %v { return fmt.Sprintf(`BLOCK(%x): Size: %v {
Header:
[
%v %v
]
Transactions:
%v %v
Uncles:
%v %v
} }
`, self.header.Hash(), self.Size(), self.header, self.uncles, self.transactions) `, self.header.Hash(), self.Size(), self.header, self.transactions, self.uncles)
} }
func (self *Header) String() string { func (self *Header) String() string {
return fmt.Sprintf(`ParentHash: %x return fmt.Sprintf(`
UncleHash: %x ParentHash: %x
Coinbase: %x UncleHash: %x
Root: %x Coinbase: %x
TxSha %x Root: %x
ReceiptSha: %x TxSha %x
Bloom: %x ReceiptSha: %x
Difficulty: %v Bloom: %x
Number: %v Difficulty: %v
GasLimit: %v Number: %v
GasUsed: %v GasLimit: %v
Time: %v GasUsed: %v
Extra: %v Time: %v
Nonce: %x Extra: %v
Nonce: %x
`, self.ParentHash, self.UncleHash, self.Coinbase, self.Root, self.TxHash, self.ReceiptHash, self.Bloom, self.Difficulty, self.Number, self.GasLimit, self.GasUsed, self.Time, self.Extra, self.Nonce) `, self.ParentHash, self.UncleHash, self.Coinbase, self.Root, self.TxHash, self.ReceiptHash, self.Bloom, self.Difficulty, self.Number, self.GasLimit, self.GasUsed, self.Time, self.Extra, self.Nonce)
} }

View File

@ -17,10 +17,10 @@ func IsContractAddr(addr []byte) bool {
type Transaction struct { type Transaction struct {
AccountNonce uint64 AccountNonce uint64
Price *big.Int
GasLimit *big.Int
Recipient []byte Recipient []byte
Amount *big.Int Amount *big.Int
GasAmount *big.Int
Price *big.Int
Payload []byte Payload []byte
V uint64 V uint64
R, S []byte R, S []byte
@ -31,7 +31,7 @@ func NewContractCreationTx(Amount, gasAmount, price *big.Int, data []byte) *Tran
} }
func NewTransactionMessage(to []byte, Amount, gasAmount, price *big.Int, data []byte) *Transaction { func NewTransactionMessage(to []byte, Amount, gasAmount, price *big.Int, data []byte) *Transaction {
return &Transaction{Recipient: to, Amount: Amount, Price: price, GasAmount: gasAmount, Payload: data} return &Transaction{Recipient: to, Amount: Amount, Price: price, GasLimit: gasAmount, Payload: data}
} }
func NewTransactionFromBytes(data []byte) *Transaction { func NewTransactionFromBytes(data []byte) *Transaction {
@ -49,7 +49,7 @@ func NewTransactionFromAmount(val *ethutil.Value) *Transaction {
} }
func (tx *Transaction) Hash() []byte { func (tx *Transaction) Hash() []byte {
data := []interface{}{tx.AccountNonce, tx.Price, tx.GasAmount, tx.Recipient, tx.Amount, tx.Payload} data := []interface{}{tx.AccountNonce, tx.Price, tx.GasLimit, tx.Recipient, tx.Amount, tx.Payload}
return crypto.Sha3(ethutil.Encode(data)) return crypto.Sha3(ethutil.Encode(data))
} }
@ -59,7 +59,7 @@ func (self *Transaction) Data() []byte {
} }
func (self *Transaction) Gas() *big.Int { func (self *Transaction) Gas() *big.Int {
return self.GasAmount return self.GasLimit
} }
func (self *Transaction) GasPrice() *big.Int { func (self *Transaction) GasPrice() *big.Int {
@ -140,7 +140,7 @@ func (tx *Transaction) Sign(privk []byte) error {
} }
func (tx *Transaction) RlpData() interface{} { func (tx *Transaction) RlpData() interface{} {
data := []interface{}{tx.AccountNonce, tx.Price, tx.GasAmount, tx.Recipient, tx.Amount, tx.Payload} data := []interface{}{tx.AccountNonce, tx.Price, tx.GasLimit, tx.Recipient, tx.Amount, tx.Payload}
return append(data, tx.V, new(big.Int).SetBytes(tx.R).Bytes(), new(big.Int).SetBytes(tx.S).Bytes()) return append(data, tx.V, new(big.Int).SetBytes(tx.R).Bytes(), new(big.Int).SetBytes(tx.S).Bytes())
} }
@ -156,7 +156,7 @@ func (tx *Transaction) RlpDecode(data []byte) {
func (tx *Transaction) RlpValueDecode(decoder *ethutil.Value) { func (tx *Transaction) RlpValueDecode(decoder *ethutil.Value) {
tx.AccountNonce = decoder.Get(0).Uint() tx.AccountNonce = decoder.Get(0).Uint()
tx.Price = decoder.Get(1).BigInt() tx.Price = decoder.Get(1).BigInt()
tx.GasAmount = decoder.Get(2).BigInt() tx.GasLimit = decoder.Get(2).BigInt()
tx.Recipient = decoder.Get(3).Bytes() tx.Recipient = decoder.Get(3).Bytes()
tx.Amount = decoder.Get(4).BigInt() tx.Amount = decoder.Get(4).BigInt()
tx.Payload = decoder.Get(5).Bytes() tx.Payload = decoder.Get(5).Bytes()
@ -171,23 +171,23 @@ func (tx *Transaction) String() string {
Contract: %v Contract: %v
From: %x From: %x
To: %x To: %x
AccountNonce: %v Nonce: %v
GasAmountPrice: %v GasPrice: %v
GasAmount: %v GasLimit %v
Amount: %v Value: %v
Data: 0x%x Data: 0x%x
V: 0x%x V: 0x%x
R: 0x%x R: 0x%x
S: 0x%x S: 0x%x
Hex: %x Hex: %x
`, `,
tx.Hash(), tx.Hash(),
len(tx.Recipient) == 0, len(tx.Recipient) == 0,
tx.From(), tx.From(),
tx.Recipient, tx.To(),
tx.AccountNonce, tx.AccountNonce,
tx.Price, tx.Price,
tx.GasAmount, tx.GasLimit,
tx.Amount, tx.Amount,
tx.Payload, tx.Payload,
tx.V, tx.V,