mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-21 20:26:41 +00:00
test against proper ProcessWithParent
This commit is contained in:
parent
918f152e1f
commit
d7985fa3b0
1 changed files with 68 additions and 14 deletions
|
|
@ -5,13 +5,18 @@ import (
|
|||
"math/big"
|
||||
"testing"
|
||||
"time"
|
||||
"container/list"
|
||||
|
||||
"github.com/ethereum/go-ethereum/chain/types"
|
||||
"github.com/ethereum/go-ethereum/ethdb"
|
||||
"github.com/ethereum/go-ethereum/ethutil"
|
||||
"github.com/ethereum/go-ethereum/state"
|
||||
"github.com/ethereum/go-ethereum/wire"
|
||||
"github.com/ethereum/go-ethereum/event"
|
||||
"github.com/ethereum/go-ethereum/crypto"
|
||||
)
|
||||
|
||||
// In these tests, TD = block.Number
|
||||
var TD *big.Int
|
||||
|
||||
func init() {
|
||||
|
|
@ -27,6 +32,29 @@ func (self fakeproc) ProcessWithParent(a, b *types.Block) (*big.Int, state.Messa
|
|||
return TD, nil, nil
|
||||
}
|
||||
|
||||
// So we can generate blocks easily
|
||||
type fakePow struct {}
|
||||
func (f fakePow) Search(block *types.Block, stop <-chan struct{}) []byte{return nil}
|
||||
func (f fakePow) Verify(hash []byte, diff *big.Int, nonce []byte) bool {return true}
|
||||
func (f fakePow) GetHashrate() int64 {return 0}
|
||||
func (f fakePow) Turbo(bool){}
|
||||
|
||||
// We need this guy because ProcessWithParent clears txs from the pool
|
||||
type fakeEth struct{}
|
||||
func (e *fakeEth) BlockManager() *BlockManager{ return nil }
|
||||
func (e *fakeEth) ChainManager() *ChainManager{ return nil }
|
||||
func (e *fakeEth) TxPool() *TxPool{ return &TxPool{} }
|
||||
func (e *fakeEth) Broadcast(msgType wire.MsgType, data []interface{}){}
|
||||
func (e *fakeEth) PeerCount() int {return 0}
|
||||
func (e *fakeEth) IsMining() bool { return false }
|
||||
func (e *fakeEth) IsListening() bool { return false }
|
||||
func (e *fakeEth) Peers() *list.List { return nil }
|
||||
func (e *fakeEth) KeyManager() *crypto.KeyManager { return nil }
|
||||
func (e *fakeEth) ClientIdentity() wire.ClientIdentity { return nil }
|
||||
func (e *fakeEth) Db() ethutil.Database { return nil }
|
||||
func (e *fakeEth) EventMux() *event.TypeMux { return nil }
|
||||
|
||||
|
||||
func makechain(cman *ChainManager, max int) *BlockChain {
|
||||
blocks := make(types.Blocks, max)
|
||||
for i := 0; i < max; i++ {
|
||||
|
|
@ -40,29 +68,55 @@ func makechain(cman *ChainManager, max int) *BlockChain {
|
|||
return NewChain(blocks)
|
||||
}
|
||||
|
||||
func makechain2(bman *BlockManager, max int) *BlockChain {
|
||||
parent := bman.bc.CurrentBlock
|
||||
blocks := make(types.Blocks, max)
|
||||
for i := 0; i < max; i++ {
|
||||
addr := ethutil.LeftPadBytes([]byte{byte(i)}, 20)
|
||||
block := bman.bc.NewBlock(addr)
|
||||
cbase := block.State().GetOrNewStateObject(addr)
|
||||
cbase.SetGasPool(block.CalcGasLimit(parent))
|
||||
receipts, txs, _, _, _ := bman.ProcessTransactions(cbase, block.State(), block, block, types.Transactions{})
|
||||
block.SetTransactions(txs)
|
||||
block.SetReceipts(receipts)
|
||||
|
||||
bman.AccumelateRewards(block.State(), block, parent)
|
||||
|
||||
block.State().Update()
|
||||
lchain := NewChain(types.Blocks{block})
|
||||
_, err := bman.bc.TestChain(lchain)
|
||||
if err != nil{
|
||||
fmt.Println("failed to run test chain!:", err)
|
||||
}
|
||||
bman.bc.InsertChain(lchain, func(block *types.Block, _ state.Messages){})
|
||||
|
||||
blocks[i] = block
|
||||
parent = block
|
||||
}
|
||||
return NewChain(blocks)
|
||||
}
|
||||
|
||||
func TestShorterFork(t *testing.T) {
|
||||
cman := NewChainManager()
|
||||
cman.SetProcessor(fakeproc{})
|
||||
bman := &BlockManager{bc: cman, Pow: fakePow{}, eth:&fakeEth{}}
|
||||
bman.bc.SetProcessor(bman)
|
||||
|
||||
TD = big.NewInt(1)
|
||||
chainA := makechain(cman, 5)
|
||||
makechain2(bman, 5)
|
||||
|
||||
TD = big.NewInt(1)
|
||||
chainB := makechain(cman, 3)
|
||||
cman2 := NewChainManager()
|
||||
cman2.Reset() // so we don't end up with last block of cman1
|
||||
bman2 := &BlockManager{bc: cman2, Pow: fakePow{}, eth:&fakeEth{}}
|
||||
bman2.bc.SetProcessor(bman2)
|
||||
|
||||
td, err := cman.TestChain(chainA)
|
||||
if err != nil {
|
||||
t.Error("unable to create new TD from chainA:", err)
|
||||
}
|
||||
cman.TD = td
|
||||
chainB := makechain2(bman2, 3)
|
||||
|
||||
td2, err := cman.TestChain(chainB)
|
||||
if err != nil {
|
||||
td2, err := bman.bc.TestChain(chainB)
|
||||
if err != nil && !IsTDError(err){
|
||||
t.Error("expected chainB not to give errors:", err)
|
||||
}
|
||||
|
||||
if td2.Cmp(td) >= 0 {
|
||||
t.Error("expected chainB to have lower difficulty. Got", td2, "expected less than", td)
|
||||
if td2.Cmp(bman.bc.TD) >= 0 {
|
||||
t.Error("expected chainB to have lower difficulty. Got", td2, "expected less than", bman.bc.TD)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue