mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-23 05:06:43 +00:00
Merge 8589532ecc into b719801db0
This commit is contained in:
commit
0b13a1e41e
3 changed files with 18 additions and 37 deletions
|
|
@ -113,7 +113,6 @@ func runOneBlockTest(ctx *cli.Context, test *tests.BlockTest) (*eth.Ethereum, er
|
||||||
return ethereum, fmt.Errorf("Block Test load error: %v", err)
|
return ethereum, fmt.Errorf("Block Test load error: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Println("chain loaded")
|
|
||||||
if err := test.ValidatePostState(statedb); err != nil {
|
if err := test.ValidatePostState(statedb); err != nil {
|
||||||
return ethereum, fmt.Errorf("post state validation failed: %v", err)
|
return ethereum, fmt.Errorf("post state validation failed: %v", err)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -52,10 +52,7 @@ func CalculateTD(block, parent *types.Block) *big.Int {
|
||||||
if parent == nil {
|
if parent == nil {
|
||||||
return block.Difficulty()
|
return block.Difficulty()
|
||||||
}
|
}
|
||||||
|
return new(big.Int).Add(parent.Td, block.Difficulty())
|
||||||
td := new(big.Int).Add(parent.Td, block.Header().Difficulty)
|
|
||||||
|
|
||||||
return td
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func CalcGasLimit(parent *types.Block) *big.Int {
|
func CalcGasLimit(parent *types.Block) *big.Int {
|
||||||
|
|
@ -77,10 +74,10 @@ type ChainManager struct {
|
||||||
processor types.BlockProcessor
|
processor types.BlockProcessor
|
||||||
eventMux *event.TypeMux
|
eventMux *event.TypeMux
|
||||||
genesisBlock *types.Block
|
genesisBlock *types.Block
|
||||||
// Last known total difficulty
|
mu sync.RWMutex
|
||||||
mu sync.RWMutex
|
tsmu sync.RWMutex
|
||||||
tsmu sync.RWMutex
|
|
||||||
|
|
||||||
|
// Last known total difficulty
|
||||||
td *big.Int
|
td *big.Int
|
||||||
currentBlock *types.Block
|
currentBlock *types.Block
|
||||||
lastBlockHash common.Hash
|
lastBlockHash common.Hash
|
||||||
|
|
@ -299,7 +296,7 @@ func (bc *ChainManager) Reset() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prepare the genesis block
|
// Prepare the genesis block
|
||||||
bc.write(bc.genesisBlock)
|
bc.writeBlock(bc.genesisBlock)
|
||||||
bc.insert(bc.genesisBlock)
|
bc.insert(bc.genesisBlock)
|
||||||
bc.currentBlock = bc.genesisBlock
|
bc.currentBlock = bc.genesisBlock
|
||||||
bc.makeCache()
|
bc.makeCache()
|
||||||
|
|
@ -321,7 +318,7 @@ func (bc *ChainManager) ResetWithGenesisBlock(gb *types.Block) {
|
||||||
|
|
||||||
// Prepare the genesis block
|
// Prepare the genesis block
|
||||||
bc.genesisBlock = gb
|
bc.genesisBlock = gb
|
||||||
bc.write(bc.genesisBlock)
|
bc.writeBlock(bc.genesisBlock)
|
||||||
bc.insert(bc.genesisBlock)
|
bc.insert(bc.genesisBlock)
|
||||||
bc.currentBlock = bc.genesisBlock
|
bc.currentBlock = bc.genesisBlock
|
||||||
bc.makeCache()
|
bc.makeCache()
|
||||||
|
|
@ -350,16 +347,19 @@ func (self *ChainManager) Export(w io.Writer) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bc *ChainManager) insert(block *types.Block) {
|
func (bc *ChainManager) writeBlockHash(block *types.Block) {
|
||||||
key := append(blockNumPre, block.Number().Bytes()...)
|
key := append(blockNumPre, block.Number().Bytes()...)
|
||||||
bc.blockDb.Put(key, block.Hash().Bytes())
|
bc.blockDb.Put(key, block.Hash().Bytes())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bc *ChainManager) insert(block *types.Block) {
|
||||||
|
bc.writeBlockHash(block)
|
||||||
bc.blockDb.Put([]byte("LastBlock"), block.Hash().Bytes())
|
bc.blockDb.Put([]byte("LastBlock"), block.Hash().Bytes())
|
||||||
bc.currentBlock = block
|
bc.currentBlock = block
|
||||||
bc.lastBlockHash = block.Hash()
|
bc.lastBlockHash = block.Hash()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bc *ChainManager) write(block *types.Block) {
|
func (bc *ChainManager) writeBlock(block *types.Block) {
|
||||||
enc, _ := rlp.EncodeToBytes((*types.StorageBlock)(block))
|
enc, _ := rlp.EncodeToBytes((*types.StorageBlock)(block))
|
||||||
key := append(blockHashPre, block.Hash().Bytes()...)
|
key := append(blockHashPre, block.Hash().Bytes()...)
|
||||||
bc.blockDb.Put(key, enc)
|
bc.blockDb.Put(key, enc)
|
||||||
|
|
@ -461,26 +461,6 @@ func (bc *ChainManager) setTotalDifficulty(td *big.Int) {
|
||||||
bc.td = td
|
bc.td = td
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *ChainManager) CalcTotalDiff(block *types.Block) (*big.Int, error) {
|
|
||||||
parent := self.GetBlock(block.Header().ParentHash)
|
|
||||||
if parent == nil {
|
|
||||||
return nil, fmt.Errorf("Unable to calculate total diff without known parent %x", block.Header().ParentHash)
|
|
||||||
}
|
|
||||||
|
|
||||||
parentTd := parent.Td
|
|
||||||
|
|
||||||
uncleDiff := new(big.Int)
|
|
||||||
for _, uncle := range block.Uncles() {
|
|
||||||
uncleDiff = uncleDiff.Add(uncleDiff, uncle.Difficulty)
|
|
||||||
}
|
|
||||||
|
|
||||||
td := new(big.Int)
|
|
||||||
td = td.Add(parentTd, uncleDiff)
|
|
||||||
td = td.Add(td, block.Header().Difficulty)
|
|
||||||
|
|
||||||
return td, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (bc *ChainManager) Stop() {
|
func (bc *ChainManager) Stop() {
|
||||||
close(bc.quit)
|
close(bc.quit)
|
||||||
|
|
||||||
|
|
@ -537,7 +517,7 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
block.Td = new(big.Int)
|
block.Td = new(big.Int)
|
||||||
// Do not penelise on future block. We'll need a block queue eventually that will queue
|
// Do not penalize on future block. We'll need a block queue eventually that will queue
|
||||||
// future block for future use
|
// future block for future use
|
||||||
if err == BlockFutureErr {
|
if err == BlockFutureErr {
|
||||||
block.SetQueued(true)
|
block.SetQueued(true)
|
||||||
|
|
@ -567,12 +547,14 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) {
|
||||||
cblock := self.currentBlock
|
cblock := self.currentBlock
|
||||||
// Write block to database. Eventually we'll have to improve on this and throw away blocks that are
|
// Write block to database. Eventually we'll have to improve on this and throw away blocks that are
|
||||||
// not in the canonical chain.
|
// not in the canonical chain.
|
||||||
self.write(block)
|
self.writeBlockHash(block)
|
||||||
|
self.writeBlock(block)
|
||||||
// Compare the TD of the last known block in the canonical chain to make sure it's greater.
|
// Compare the TD of the last known block in the canonical chain to make sure it's greater.
|
||||||
// At this point it's possible that a different chain (fork) becomes the new canonical chain.
|
// At this point it's possible that a different chain (fork) becomes the new canonical chain.
|
||||||
if block.Td.Cmp(self.td) > 0 {
|
if block.Td.Cmp(self.td) > 0 {
|
||||||
// Check for chain forks. If H(block.num - 1) != block.parent, we're on a fork and need to do some merging
|
// Check for chain forks. If H(block.num - 1) != block.parent, we're on a fork and need to do some merging
|
||||||
if previous := self.getBlockByNumber(block.NumberU64() - 1); previous.Hash() != block.ParentHash() {
|
previous := self.getBlockByNumber(block.NumberU64() - 1)
|
||||||
|
if previous.Hash() != block.ParentHash() {
|
||||||
chash := cblock.Hash()
|
chash := cblock.Hash()
|
||||||
hash := block.Hash()
|
hash := block.Hash()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,7 @@ func testChain(chainB types.Blocks, bman *BlockProcessor) (*big.Int, error) {
|
||||||
|
|
||||||
bman.bc.mu.Lock()
|
bman.bc.mu.Lock()
|
||||||
{
|
{
|
||||||
bman.bc.write(block)
|
bman.bc.writeBlock(block)
|
||||||
}
|
}
|
||||||
bman.bc.mu.Unlock()
|
bman.bc.mu.Unlock()
|
||||||
}
|
}
|
||||||
|
|
@ -342,7 +342,7 @@ func TestGetAncestors(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, block := range chain {
|
for _, block := range chain {
|
||||||
chainMan.write(block)
|
chainMan.writeBlock(block)
|
||||||
}
|
}
|
||||||
|
|
||||||
ancestors := chainMan.GetAncestors(chain[len(chain)-1], 4)
|
ancestors := chainMan.GetAncestors(chain[len(chain)-1], 4)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue