diff --git a/README.md b/README.md
index 367387390..564e5c56d 100644
--- a/README.md
+++ b/README.md
@@ -36,50 +36,40 @@ Automated (dev) builds
* [Windows] Coming soon™
* [Linux] Coming soon™
-Packages
+Binaries
========
-Ethereum Go is split up in several sub packages Please refer to each
-individual package for more information.
- 1. [eth](https://github.com/ethereum/go-ethereum)
- 2. [ethchain](https://github.com/ethereum/go-ethereum/tree/master/ethchain)
- 3. [ethwire](https://github.com/ethereum/go-ethereum/tree/master/ethwire)
- 4. [ethdb](https://github.com/ethereum/go-ethereum/tree/master/ethdb)
- 5. [ethutil](https://github.com/ethereum/go-ethereum/tree/master/ethutil)
- 6. [ethpipe](https://github.com/ethereum/go-ethereum/tree/master/ethpipe)
- 7. [ethvm](https://github.com/ethereum/go-ethereum/tree/master/ethvm)
- 8. [ethtrie](https://github.com/ethereum/go-ethereum/tree/master/ethtrie)
- 9. [ethreact](https://github.com/ethereum/go-ethereum/tree/master/ethreact)
- 10. [ethlog](https://github.com/ethereum/go-ethereum/tree/master/ethlog)
-
-The [eth](https://github.com/ethereum/go-ethereum) is the top-level package
-of the Ethereum protocol. It functions as the Ethereum bootstrapping and
-peer communication layer. The [ethchain](https://github.com/ethereum/go-ethereum/tree/master/ethchain)
-contains the Ethereum blockchain, block manager, transaction and
-transaction handlers. The [ethwire](https://github.com/ethereum/go-ethereum/tree/master/ethwire) contains
-the Ethereum [wire protocol](http://wiki.ethereum.org/index.php/Wire_Protocol) which can be used
-to hook in to the Ethereum network. [ethutil](https://github.com/ethereum/go-ethereum/tree/master/ethutil) contains
-utility functions which are not Ethereum specific. The utility package
-contains the [patricia trie](http://wiki.ethereum.org/index.php/Patricia_Tree),
-[RLP Encoding](http://wiki.ethereum.org/index.php/RLP) and hex encoding
-helpers. The [ethdb](https://github.com/ethereum/go-ethereum/tree/master/ethdb) package
-contains the LevelDB interface and memory DB interface.
+Go Ethereum comes with several binaries found in
+[cmd](https://github.com/ethereum/go-ethereum/tree/master/cmd):
+
+* `mist` Official Ethereum Browser
+* `ethereum` Ethereum CLI
+* `ethtest` test tool which runs with the [tests](https://github.com/ethereum/testes) suit:
+ `ethtest "`cat myfile.json`"`.
+* `evm` is a generic Ethereum Virtual Machine: `evm -code 60ff60ff -gas
+ 10000 -price 0 -dump`. See `-h` for a detailed description.
General command line options
============================
```
-Shared between ethereum and Mist
+== Shared between ethereum and Mist ==
+
+= Settings
-id Set the custom identifier of the client (shows up on other clients)
-port Port on which the server will accept incomming connections
-upnp Enable UPnP
-maxpeer Desired amount of peers
-rpc Start JSON RPC
-
-dir Data directory used to store configs and databases
--import Import a private key
--genaddr Generates a new address and private key (destructive action)
--h This
+
+= Utility
+-h This
+-import Import a private key
+-genaddr Generates a new address and private key (destructive action)
+-dump Dump a specific state of a block to stdout given the -number or -hash
+-difftool Supress all output and prints VM output to stdout
+-diff vm=only vm output, all=all output including state storage
Ethereum only
ethereum [options] [filename]
@@ -87,23 +77,11 @@ ethereum [options] [filename]
filename Load the given file and interpret as JavaScript
-m Start mining blocks
-Mist only
+== Mist only ==
+
-asset_path absolute path to GUI assets directory
```
-Tools
-=====
-
-Go Ethereum comes with several binaries:
-
-* `mist` Official Ethereum Browser
-* `ethereum` Ethereum CLI
-* `ethtest` test tool which runs with the [tests](https://github.com/ethereum/testes) suit:
- `ethtest "`cat myfile.json`"`.
-* `evm` is a generic Ethereum Virtual Machine: `evm -code 60ff60ff -gas
- 10000 -price 0 -dump`. See `-h` for a detailed description.
-
-
Contribution
============
diff --git a/block_pool.go b/block_pool.go
index 090871fd3..38302a4c7 100644
--- a/block_pool.go
+++ b/block_pool.go
@@ -10,8 +10,10 @@ import (
"time"
"github.com/ethereum/go-ethereum/chain"
+ "github.com/ethereum/go-ethereum/chain/types"
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/state"
"github.com/ethereum/go-ethereum/wire"
)
@@ -20,7 +22,7 @@ var poollogger = logger.NewLogger("BPOOL")
type block struct {
from *Peer
peer *Peer
- block *chain.Block
+ block *types.Block
reqAt time.Time
requested int
}
@@ -73,7 +75,7 @@ func (self *BlockPool) HasCommonHash(hash []byte) bool {
return self.eth.ChainManager().GetBlock(hash) != nil
}
-func (self *BlockPool) Blocks() (blocks chain.Blocks) {
+func (self *BlockPool) Blocks() (blocks types.Blocks) {
for _, item := range self.pool {
if item.block != nil {
blocks = append(blocks, item.block)
@@ -123,15 +125,15 @@ func (self *BlockPool) AddHash(hash []byte, peer *Peer) {
}
}
-func (self *BlockPool) Add(b *chain.Block, peer *Peer) {
+func (self *BlockPool) Add(b *types.Block, peer *Peer) {
self.addBlock(b, peer, false)
}
-func (self *BlockPool) AddNew(b *chain.Block, peer *Peer) {
+func (self *BlockPool) AddNew(b *types.Block, peer *Peer) {
self.addBlock(b, peer, true)
}
-func (self *BlockPool) addBlock(b *chain.Block, peer *Peer, newBlock bool) {
+func (self *BlockPool) addBlock(b *types.Block, peer *Peer, newBlock bool) {
self.mut.Lock()
defer self.mut.Unlock()
@@ -283,7 +285,7 @@ out:
break out
case <-procTimer.C:
blocks := self.Blocks()
- chain.BlockBy(chain.Number).Sort(blocks)
+ types.BlockBy(types.Number).Sort(blocks)
// Find common block
for i, block := range blocks {
@@ -309,10 +311,6 @@ out:
}
}
- // TODO figure out whether we were catching up
- // If caught up and just a new block has been propagated:
- // sm.eth.EventMux().Post(NewBlockEvent{block})
- // otherwise process and don't emit anything
if len(blocks) > 0 {
chainManager := self.eth.ChainManager()
// Test and import
@@ -333,9 +331,14 @@ out:
self.td = ethutil.Big0
self.peer = nil
} else {
- chainManager.InsertChain(bchain)
- for _, block := range blocks {
- self.Remove(block.Hash())
+ if !chain.IsTDError(err) {
+ chainManager.InsertChain(bchain, func(block *types.Block, messages state.Messages) {
+ self.eth.EventMux().Post(chain.NewBlockEvent{block})
+ self.eth.EventMux().Post(messages)
+
+ self.Remove(block.Hash())
+ })
+
}
}
}
diff --git a/chain/block_manager.go b/chain/block_manager.go
index efe9e0862..e652ad10e 100644
--- a/chain/block_manager.go
+++ b/chain/block_manager.go
@@ -9,6 +9,7 @@ import (
"sync"
"time"
+ "github.com/ethereum/go-ethereum/chain/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/event"
@@ -69,7 +70,7 @@ type BlockManager struct {
// The last attempted block is mainly used for debugging purposes
// This does not have to be a valid block and will be set during
// 'Process' & canonical validation.
- lastAttemptedBlock *Block
+ lastAttemptedBlock *types.Block
events event.Subscription
}
@@ -117,11 +118,11 @@ func (sm *BlockManager) ChainManager() *ChainManager {
return sm.bc
}
-func (self *BlockManager) ProcessTransactions(coinbase *state.StateObject, state *state.State, block, parent *Block, txs Transactions) (Receipts, Transactions, Transactions, Transactions, error) {
+func (self *BlockManager) ProcessTransactions(coinbase *state.StateObject, state *state.State, block, parent *types.Block, txs types.Transactions) (types.Receipts, types.Transactions, types.Transactions, types.Transactions, error) {
var (
- receipts Receipts
- handled, unhandled Transactions
- erroneous Transactions
+ receipts types.Receipts
+ handled, unhandled types.Transactions
+ erroneous types.Transactions
totalUsedGas = big.NewInt(0)
err error
)
@@ -159,8 +160,9 @@ done:
txGas.Sub(txGas, st.gas)
cumulative := new(big.Int).Set(totalUsedGas.Add(totalUsedGas, txGas))
- receipt := &Receipt{ethutil.CopyBytes(state.Root()), cumulative, nil /*bloom*/, state.Logs()}
- receipt.Bloom = CreateBloom(Receipts{receipt})
+ receipt := types.NewReceipt(state.Root(), cumulative)
+ receipt.SetLogs(state.Logs())
+ receipt.Bloom = types.CreateBloom(types.Receipts{receipt})
// Notify all subscribers
go self.eth.EventMux().Post(TxPostEvent{tx})
@@ -178,7 +180,7 @@ done:
return receipts, handled, unhandled, erroneous, err
}
-func (sm *BlockManager) Process(block *Block) (td *big.Int, msgs state.Messages, err error) {
+func (sm *BlockManager) Process(block *types.Block) (td *big.Int, msgs state.Messages, err error) {
// Processing a blocks may never happen simultaneously
sm.mutex.Lock()
defer sm.mutex.Unlock()
@@ -195,7 +197,7 @@ func (sm *BlockManager) Process(block *Block) (td *big.Int, msgs state.Messages,
return sm.ProcessWithParent(block, parent)
}
-func (sm *BlockManager) ProcessWithParent(block, parent *Block) (td *big.Int, messages state.Messages, err error) {
+func (sm *BlockManager) ProcessWithParent(block, parent *types.Block) (td *big.Int, messages state.Messages, err error) {
sm.lastAttemptedBlock = block
state := parent.State().Copy()
@@ -215,13 +217,13 @@ func (sm *BlockManager) ProcessWithParent(block, parent *Block) (td *big.Int, me
return
}
- txSha := DeriveSha(block.transactions)
+ txSha := types.DeriveSha(block.Transactions())
if bytes.Compare(txSha, block.TxSha) != 0 {
err = fmt.Errorf("validating transaction root. received=%x got=%x", block.TxSha, txSha)
return
}
- receiptSha := DeriveSha(receipts)
+ receiptSha := types.DeriveSha(receipts)
if bytes.Compare(receiptSha, block.ReceiptSha) != 0 {
err = fmt.Errorf("validating receipt root. received=%x got=%x", block.ReceiptSha, receiptSha)
return
@@ -238,8 +240,8 @@ func (sm *BlockManager) ProcessWithParent(block, parent *Block) (td *big.Int, me
return
}
- block.receipts = receipts // although this isn't necessary it be in the future
- rbloom := CreateBloom(receipts)
+ //block.receipts = receipts // although this isn't necessary it be in the future
+ rbloom := types.CreateBloom(receipts)
if bytes.Compare(rbloom, block.LogsBloom) != 0 {
err = fmt.Errorf("unable to replicate block's bloom=%x", rbloom)
return
@@ -272,7 +274,7 @@ func (sm *BlockManager) ProcessWithParent(block, parent *Block) (td *big.Int, me
}
}
-func (sm *BlockManager) ApplyDiff(state *state.State, parent, block *Block) (receipts Receipts, err error) {
+func (sm *BlockManager) ApplyDiff(state *state.State, parent, block *types.Block) (receipts types.Receipts, err error) {
coinbase := state.GetOrNewStateObject(block.Coinbase)
coinbase.SetGasPool(block.CalcGasLimit(parent))
@@ -285,7 +287,7 @@ func (sm *BlockManager) ApplyDiff(state *state.State, parent, block *Block) (rec
return receipts, nil
}
-func (sm *BlockManager) CalculateTD(block *Block) (*big.Int, bool) {
+func (sm *BlockManager) CalculateTD(block *types.Block) (*big.Int, bool) {
uncleDiff := new(big.Int)
for _, uncle := range block.Uncles {
uncleDiff = uncleDiff.Add(uncleDiff, uncle.Difficulty)
@@ -311,7 +313,7 @@ func (sm *BlockManager) CalculateTD(block *Block) (*big.Int, bool) {
// Validates the current block. Returns an error if the block was invalid,
// an uncle or anything that isn't on the current block chain.
// Validation validates easy over difficult (dagger takes longer time = difficult)
-func (sm *BlockManager) ValidateBlock(block, parent *Block) error {
+func (sm *BlockManager) ValidateBlock(block, parent *types.Block) error {
expd := CalcDifficulty(block, parent)
if expd.Cmp(block.Difficulty) < 0 {
return fmt.Errorf("Difficulty check failed for block %v, %v", block.Difficulty, expd)
@@ -337,7 +339,7 @@ func (sm *BlockManager) ValidateBlock(block, parent *Block) error {
return nil
}
-func (sm *BlockManager) AccumelateRewards(state *state.State, block, parent *Block) error {
+func (sm *BlockManager) AccumelateRewards(state *state.State, block, parent *types.Block) error {
reward := new(big.Int).Set(BlockReward)
knownUncles := ethutil.Set(parent.Uncles)
@@ -380,7 +382,7 @@ func (sm *BlockManager) AccumelateRewards(state *state.State, block, parent *Blo
return nil
}
-func (sm *BlockManager) GetMessages(block *Block) (messages []*state.Message, err error) {
+func (sm *BlockManager) GetMessages(block *types.Block) (messages []*state.Message, err error) {
if !sm.bc.HasBlock(block.PrevHash) {
return nil, ParentError(block.PrevHash)
}
diff --git a/chain/chain_manager.go b/chain/chain_manager.go
index df390a4c0..11e16fa7d 100644
--- a/chain/chain_manager.go
+++ b/chain/chain_manager.go
@@ -6,6 +6,7 @@ import (
"fmt"
"math/big"
+ "github.com/ethereum/go-ethereum/chain/types"
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/logger"
"github.com/ethereum/go-ethereum/state"
@@ -13,36 +14,88 @@ import (
var chainlogger = logger.NewLogger("CHAIN")
+func AddTestNetFunds(block *types.Block) {
+ for _, addr := range []string{
+ "51ba59315b3a95761d0863b05ccc7a7f54703d99",
+ "e4157b34ea9615cfbde6b4fda419828124b70c78",
+ "b9c015918bdaba24b4ff057a92a3873d6eb201be",
+ "6c386a4b26f73c802f34673f7248bb118f97424a",
+ "cd2a3d9f938e13cd947ec05abc7fe734df8dd826",
+ "2ef47100e0787b915105fd5e3f4ff6752079d5cb",
+ "e6716f9544a56c530d868e4bfbacb172315bdead",
+ "1a26338f0d905e295fccb71fa9ea849ffa12aaf4",
+ } {
+ codedAddr := ethutil.Hex2Bytes(addr)
+ account := block.State().GetAccount(codedAddr)
+ account.SetBalance(ethutil.Big("1606938044258990275541962092341162602522202993782792835301376")) //ethutil.BigPow(2, 200)
+ block.State().UpdateStateObject(account)
+ }
+}
+
+func CalcDifficulty(block, parent *types.Block) *big.Int {
+ diff := new(big.Int)
+
+ adjust := new(big.Int).Rsh(parent.Difficulty, 10)
+ if block.Time >= parent.Time+5 {
+ diff.Sub(parent.Difficulty, adjust)
+ } else {
+ diff.Add(parent.Difficulty, adjust)
+ }
+
+ return diff
+}
+
type ChainManager struct {
- Ethereum EthManager
- // The famous, the fabulous Mister GENESIIIIIIS (block)
- genesisBlock *Block
+ //eth EthManager
+ processor types.BlockProcessor
+ genesisBlock *types.Block
// Last known total difficulty
TD *big.Int
LastBlockNumber uint64
- CurrentBlock *Block
+ CurrentBlock *types.Block
LastBlockHash []byte
workingChain *BlockChain
}
-func NewChainManager(ethereum EthManager) *ChainManager {
+func NewChainManager() *ChainManager {
bc := &ChainManager{}
- bc.genesisBlock = NewBlockFromBytes(ethutil.Encode(Genesis))
- bc.Ethereum = ethereum
+ bc.genesisBlock = types.NewBlockFromBytes(ethutil.Encode(Genesis))
+ //bc.eth = ethereum
bc.setLastBlock()
return bc
}
-func (bc *ChainManager) Genesis() *Block {
- return bc.genesisBlock
+func (self *ChainManager) SetProcessor(proc types.BlockProcessor) {
+ self.processor = proc
}
-func (bc *ChainManager) NewBlock(coinbase []byte) *Block {
+func (bc *ChainManager) setLastBlock() {
+ data, _ := ethutil.Config.Db.Get([]byte("LastBlock"))
+ if len(data) != 0 {
+ // Prep genesis
+ AddTestNetFunds(bc.genesisBlock)
+
+ block := types.NewBlockFromBytes(data)
+ bc.CurrentBlock = block
+ bc.LastBlockHash = block.Hash()
+ bc.LastBlockNumber = block.Number.Uint64()
+
+ // Set the last know difficulty (might be 0x0 as initial value, Genesis)
+ bc.TD = ethutil.BigD(ethutil.Config.Db.LastKnownTD())
+ } else {
+ bc.Reset()
+ }
+
+ chainlogger.Infof("Last block (#%d) %x\n", bc.LastBlockNumber, bc.CurrentBlock.Hash())
+}
+
+// Block creation & chain handling
+func (bc *ChainManager) NewBlock(coinbase []byte) *types.Block {
var root interface{}
hash := ZeroHash256
@@ -51,7 +104,7 @@ func (bc *ChainManager) NewBlock(coinbase []byte) *Block {
hash = bc.LastBlockHash
}
- block := CreateBlock(
+ block := types.CreateBlock(
root,
hash,
coinbase,
@@ -72,23 +125,10 @@ func (bc *ChainManager) NewBlock(coinbase []byte) *Block {
return block
}
-func CalcDifficulty(block, parent *Block) *big.Int {
- diff := new(big.Int)
-
- adjust := new(big.Int).Rsh(parent.Difficulty, 10)
- if block.Time >= parent.Time+5 {
- diff.Sub(parent.Difficulty, adjust)
- } else {
- diff.Add(parent.Difficulty, adjust)
- }
-
- return diff
-}
-
func (bc *ChainManager) Reset() {
AddTestNetFunds(bc.genesisBlock)
- bc.genesisBlock.state.Trie.Sync()
+ bc.genesisBlock.Trie().Sync()
// Prepare the genesis block
bc.add(bc.genesisBlock)
bc.CurrentBlock = bc.genesisBlock
@@ -99,38 +139,31 @@ func (bc *ChainManager) Reset() {
bc.TD = ethutil.BigD(ethutil.Config.Db.LastKnownTD())
}
-func (bc *ChainManager) HasBlock(hash []byte) bool {
- data, _ := ethutil.Config.Db.Get(hash)
- return len(data) != 0
-}
-
-// TODO: At one point we might want to save a block by prevHash in the db to optimise this...
-func (bc *ChainManager) HasBlockWithPrevHash(hash []byte) bool {
- block := bc.CurrentBlock
-
- for ; block != nil; block = bc.GetBlock(block.PrevHash) {
- if bytes.Compare(hash, block.PrevHash) == 0 {
- return true
- }
- }
- return false
-}
+// Add a block to the chain and record addition information
+func (bc *ChainManager) add(block *types.Block) {
+ bc.writeBlockInfo(block)
-func (bc *ChainManager) CalculateBlockTD(block *Block) *big.Int {
- blockDiff := new(big.Int)
+ bc.CurrentBlock = block
+ bc.LastBlockHash = block.Hash()
- for _, uncle := range block.Uncles {
- blockDiff = blockDiff.Add(blockDiff, uncle.Difficulty)
- }
- blockDiff = blockDiff.Add(blockDiff, block.Difficulty)
+ encodedBlock := block.RlpEncode()
+ ethutil.Config.Db.Put(block.Hash(), encodedBlock)
+ ethutil.Config.Db.Put([]byte("LastBlock"), encodedBlock)
- return blockDiff
+ //chainlogger.Infof("Imported block #%d (%x...)\n", block.Number, block.Hash()[0:4])
}
-func (bc *ChainManager) GenesisBlock() *Block {
+// Accessors
+func (bc *ChainManager) Genesis() *types.Block {
return bc.genesisBlock
}
+// Block fetching methods
+func (bc *ChainManager) HasBlock(hash []byte) bool {
+ data, _ := ethutil.Config.Db.Get(hash)
+ return len(data) != 0
+}
+
func (self *ChainManager) GetChainHashesFromHash(hash []byte, max uint64) (chain [][]byte) {
block := self.GetBlock(hash)
if block == nil {
@@ -152,91 +185,14 @@ func (self *ChainManager) GetChainHashesFromHash(hash []byte, max uint64) (chain
return
}
-func AddTestNetFunds(block *Block) {
- for _, addr := range []string{
- "51ba59315b3a95761d0863b05ccc7a7f54703d99",
- "e4157b34ea9615cfbde6b4fda419828124b70c78",
- "b9c015918bdaba24b4ff057a92a3873d6eb201be",
- "6c386a4b26f73c802f34673f7248bb118f97424a",
- "cd2a3d9f938e13cd947ec05abc7fe734df8dd826",
- "2ef47100e0787b915105fd5e3f4ff6752079d5cb",
- "e6716f9544a56c530d868e4bfbacb172315bdead",
- "1a26338f0d905e295fccb71fa9ea849ffa12aaf4",
- } {
- codedAddr := ethutil.Hex2Bytes(addr)
- account := block.state.GetAccount(codedAddr)
- account.SetBalance(ethutil.Big("1606938044258990275541962092341162602522202993782792835301376")) //ethutil.BigPow(2, 200)
- block.state.UpdateStateObject(account)
- }
-}
-
-func (bc *ChainManager) setLastBlock() {
- data, _ := ethutil.Config.Db.Get([]byte("LastBlock"))
- if len(data) != 0 {
- // Prep genesis
- AddTestNetFunds(bc.genesisBlock)
-
- block := NewBlockFromBytes(data)
- bc.CurrentBlock = block
- bc.LastBlockHash = block.Hash()
- bc.LastBlockNumber = block.Number.Uint64()
-
- // Set the last know difficulty (might be 0x0 as initial value, Genesis)
- bc.TD = ethutil.BigD(ethutil.Config.Db.LastKnownTD())
- } else {
- bc.Reset()
- }
-
- chainlogger.Infof("Last block (#%d) %x\n", bc.LastBlockNumber, bc.CurrentBlock.Hash())
-}
-
-func (bc *ChainManager) SetTotalDifficulty(td *big.Int) {
- ethutil.Config.Db.Put([]byte("LTD"), td.Bytes())
- bc.TD = td
-}
-
-// Add a block to the chain and record addition information
-func (bc *ChainManager) add(block *Block) {
- bc.writeBlockInfo(block)
-
- bc.CurrentBlock = block
- bc.LastBlockHash = block.Hash()
-
- encodedBlock := block.RlpEncode()
- ethutil.Config.Db.Put(block.Hash(), encodedBlock)
- ethutil.Config.Db.Put([]byte("LastBlock"), encodedBlock)
-
- //chainlogger.Infof("Imported block #%d (%x...)\n", block.Number, block.Hash()[0:4])
-}
-
-func (self *ChainManager) CalcTotalDiff(block *Block) (*big.Int, error) {
- parent := self.GetBlock(block.PrevHash)
- if parent == nil {
- return nil, fmt.Errorf("Unable to calculate total diff without known parent %x", block.PrevHash)
- }
-
- parentTd := parent.BlockInfo().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.Difficulty)
-
- return td, nil
-}
-
-func (self *ChainManager) GetBlock(hash []byte) *Block {
+func (self *ChainManager) GetBlock(hash []byte) *types.Block {
data, _ := ethutil.Config.Db.Get(hash)
if len(data) == 0 {
if self.workingChain != nil {
// Check the temp chain
for e := self.workingChain.Front(); e != nil; e = e.Next() {
- if bytes.Compare(e.Value.(*link).block.Hash(), hash) == 0 {
- return e.Value.(*link).block
+ if bytes.Compare(e.Value.(*link).Block.Hash(), hash) == 0 {
+ return e.Value.(*link).Block
}
}
}
@@ -244,10 +200,10 @@ func (self *ChainManager) GetBlock(hash []byte) *Block {
return nil
}
- return NewBlockFromBytes(data)
+ return types.NewBlockFromBytes(data)
}
-func (self *ChainManager) GetBlockByNumber(num uint64) *Block {
+func (self *ChainManager) GetBlockByNumber(num uint64) *types.Block {
block := self.CurrentBlock
for ; block != nil; block = self.GetBlock(block.PrevHash) {
if block.Number.Uint64() == num {
@@ -262,26 +218,33 @@ func (self *ChainManager) GetBlockByNumber(num uint64) *Block {
return block
}
-func (self *ChainManager) GetBlockBack(num uint64) *Block {
- block := self.CurrentBlock
+func (bc *ChainManager) SetTotalDifficulty(td *big.Int) {
+ ethutil.Config.Db.Put([]byte("LTD"), td.Bytes())
+ bc.TD = td
+}
- for ; num != 0 && block != nil; num-- {
- block = self.GetBlock(block.PrevHash)
+func (self *ChainManager) CalcTotalDiff(block *types.Block) (*big.Int, error) {
+ parent := self.GetBlock(block.PrevHash)
+ if parent == nil {
+ return nil, fmt.Errorf("Unable to calculate total diff without known parent %x", block.PrevHash)
}
- return block
-}
+ parentTd := parent.BlockInfo().TD
-func (bc *ChainManager) BlockInfoByHash(hash []byte) BlockInfo {
- bi := BlockInfo{}
- data, _ := ethutil.Config.Db.Get(append(hash, []byte("Info")...))
- bi.RlpDecode(data)
+ uncleDiff := new(big.Int)
+ for _, uncle := range block.Uncles {
+ uncleDiff = uncleDiff.Add(uncleDiff, uncle.Difficulty)
+ }
- return bi
+ td := new(big.Int)
+ td = td.Add(parentTd, uncleDiff)
+ td = td.Add(td, block.Difficulty)
+
+ return td, nil
}
-func (bc *ChainManager) BlockInfo(block *Block) BlockInfo {
- bi := BlockInfo{}
+func (bc *ChainManager) BlockInfo(block *types.Block) types.BlockInfo {
+ bi := types.BlockInfo{}
data, _ := ethutil.Config.Db.Get(append(block.Hash(), []byte("Info")...))
bi.RlpDecode(data)
@@ -289,9 +252,9 @@ func (bc *ChainManager) BlockInfo(block *Block) BlockInfo {
}
// Unexported method for writing extra non-essential block info to the db
-func (bc *ChainManager) writeBlockInfo(block *Block) {
+func (bc *ChainManager) writeBlockInfo(block *types.Block) {
bc.LastBlockNumber++
- bi := BlockInfo{Number: bc.LastBlockNumber, Hash: block.Hash(), Parent: block.PrevHash, TD: bc.TD}
+ bi := types.BlockInfo{Number: bc.LastBlockNumber, Hash: block.Hash(), Parent: block.PrevHash, TD: bc.TD}
// For now we use the block hash with the words "info" appended as key
ethutil.Config.Db.Put(append(block.Hash(), []byte("Info")...), bi.RlpEncode())
@@ -303,40 +266,24 @@ func (bc *ChainManager) Stop() {
}
}
-type link struct {
- block *Block
- messages state.Messages
- td *big.Int
-}
-
-type BlockChain struct {
- *list.List
-}
-
-func NewChain(blocks Blocks) *BlockChain {
- chain := &BlockChain{list.New()}
-
- for _, block := range blocks {
- chain.PushBack(&link{block, nil, nil})
- }
-
- return chain
+func (self *ChainManager) NewIterator(startHash []byte) *ChainIterator {
+ return &ChainIterator{self, self.GetBlock(startHash)}
}
// This function assumes you've done your checking. No checking is done at this stage anymore
-func (self *ChainManager) InsertChain(chain *BlockChain) {
+func (self *ChainManager) InsertChain(chain *BlockChain, call func(*types.Block, state.Messages)) {
for e := chain.Front(); e != nil; e = e.Next() {
link := e.Value.(*link)
- self.add(link.block)
- self.SetTotalDifficulty(link.td)
- self.Ethereum.EventMux().Post(NewBlockEvent{link.block})
- self.Ethereum.EventMux().Post(link.messages)
+ self.add(link.Block)
+ self.SetTotalDifficulty(link.Td)
+
+ call(link.Block, link.Messages)
}
b, e := chain.Front(), chain.Back()
if b != nil && e != nil {
- front, back := b.Value.(*link).block, e.Value.(*link).block
+ front, back := b.Value.(*link).Block, e.Value.(*link).Block
chainlogger.Infof("Imported %d blocks. #%v (%x) / %#v (%x)", chain.Len(), front.Number, front.Hash()[0:4], back.Number, back.Hash()[0:4])
}
}
@@ -348,20 +295,17 @@ func (self *ChainManager) TestChain(chain *BlockChain) (td *big.Int, err error)
for e := chain.Front(); e != nil; e = e.Next() {
var (
l = e.Value.(*link)
- block = l.block
+ block = l.Block
parent = self.GetBlock(block.PrevHash)
)
- //fmt.Println("parent", parent)
- //fmt.Println("current", block)
-
if parent == nil {
err = fmt.Errorf("incoming chain broken on hash %x\n", block.PrevHash[0:4])
return
}
var messages state.Messages
- td, messages, err = self.Ethereum.BlockManager().ProcessWithParent(block, parent)
+ td, messages, err = self.processor.ProcessWithParent(block, parent) //self.eth.BlockManager().ProcessWithParent(block, parent)
if err != nil {
chainlogger.Infoln(err)
chainlogger.Debugf("Block #%v failed (%x...)\n", block.Number, block.Hash()[0:4])
@@ -370,8 +314,8 @@ func (self *ChainManager) TestChain(chain *BlockChain) (td *big.Int, err error)
err = fmt.Errorf("incoming chain failed %v\n", err)
return
}
- l.td = td
- l.messages = messages
+ l.Td = td
+ l.Messages = messages
}
if td.Cmp(self.TD) <= 0 {
@@ -383,3 +327,42 @@ func (self *ChainManager) TestChain(chain *BlockChain) (td *big.Int, err error)
return
}
+
+type link struct {
+ Block *types.Block
+ Messages state.Messages
+ Td *big.Int
+}
+
+type BlockChain struct {
+ *list.List
+}
+
+func NewChain(blocks types.Blocks) *BlockChain {
+ chain := &BlockChain{list.New()}
+
+ for _, block := range blocks {
+ chain.PushBack(&link{block, nil, nil})
+ }
+
+ return chain
+}
+
+func (self *BlockChain) RlpEncode() []byte {
+ dat := make([]interface{}, 0)
+ for e := self.Front(); e != nil; e = e.Next() {
+ dat = append(dat, e.Value.(*link).Block.RlpData())
+ }
+
+ return ethutil.Encode(dat)
+}
+
+type ChainIterator struct {
+ cm *ChainManager
+ block *types.Block // current block in the iterator
+}
+
+func (self *ChainIterator) Prev() *types.Block {
+ self.block = self.cm.GetBlock(self.block.PrevHash)
+ return self.block
+}
diff --git a/chain/chain_manager_test.go b/chain/chain_manager_test.go
index fef1d2010..0314914a9 100644
--- a/chain/chain_manager_test.go
+++ b/chain/chain_manager_test.go
@@ -1 +1,116 @@
package chain
+
+import (
+ "fmt"
+ "math/big"
+ "testing"
+ "time"
+
+ "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"
+)
+
+var TD *big.Int
+
+func init() {
+ ethutil.ReadConfig(".ethtest", "/tmp/ethtest", "")
+ ethutil.Config.Db, _ = ethdb.NewMemDatabase()
+}
+
+type fakeproc struct {
+}
+
+func (self fakeproc) ProcessWithParent(a, b *types.Block) (*big.Int, state.Messages, error) {
+ TD = new(big.Int).Add(TD, big.NewInt(1))
+ return TD, nil, nil
+}
+
+func makechain(cman *ChainManager, max int) *BlockChain {
+ blocks := make(types.Blocks, max)
+ for i := 0; i < max; i++ {
+ addr := ethutil.LeftPadBytes([]byte{byte(i)}, 20)
+ block := cman.NewBlock(addr)
+ if i != 0 {
+ cman.CurrentBlock = blocks[i-1]
+ }
+ blocks[i] = block
+ }
+ return NewChain(blocks)
+}
+
+func TestLongerFork(t *testing.T) {
+ cman := NewChainManager()
+ cman.SetProcessor(fakeproc{})
+
+ TD = big.NewInt(1)
+ chainA := makechain(cman, 5)
+
+ TD = big.NewInt(1)
+ chainB := makechain(cman, 10)
+
+ td, err := cman.TestChain(chainA)
+ if err != nil {
+ t.Error("unable to create new TD from chainA:", err)
+ }
+ cman.TD = td
+
+ _, err = cman.TestChain(chainB)
+ if err != nil {
+ t.Error("expected chainB not to give errors:", err)
+ }
+}
+
+func TestEqualFork(t *testing.T) {
+ cman := NewChainManager()
+ cman.SetProcessor(fakeproc{})
+
+ TD = big.NewInt(1)
+ chainA := makechain(cman, 5)
+
+ TD = big.NewInt(2)
+ chainB := makechain(cman, 5)
+
+ td, err := cman.TestChain(chainA)
+ if err != nil {
+ t.Error("unable to create new TD from chainA:", err)
+ }
+ cman.TD = td
+
+ _, err = cman.TestChain(chainB)
+ if err != nil {
+ t.Error("expected chainB not to give errors:", err)
+ }
+}
+
+func TestBrokenChain(t *testing.T) {
+ cman := NewChainManager()
+ cman.SetProcessor(fakeproc{})
+
+ TD = big.NewInt(1)
+ chain := makechain(cman, 5)
+ chain.Remove(chain.Front())
+
+ _, err := cman.TestChain(chain)
+ if err == nil {
+ t.Error("expected broken chain to return error")
+ }
+}
+
+func BenchmarkChainTesting(b *testing.B) {
+ const chainlen = 1000
+
+ ethutil.ReadConfig(".ethtest", "/tmp/ethtest", "")
+ ethutil.Config.Db, _ = ethdb.NewMemDatabase()
+
+ cman := NewChainManager()
+ cman.SetProcessor(fakeproc{})
+
+ TD = big.NewInt(1)
+ chain := makechain(cman, chainlen)
+
+ stime := time.Now()
+ cman.TestChain(chain)
+ fmt.Println(chainlen, "took", time.Since(stime))
+}
diff --git a/chain/dagger.go b/chain/dagger.go
index 2cf70e091..f7e2229e9 100644
--- a/chain/dagger.go
+++ b/chain/dagger.go
@@ -6,6 +6,7 @@ import (
"math/rand"
"time"
+ "github.com/ethereum/go-ethereum/chain/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/logger"
@@ -15,7 +16,7 @@ import (
var powlogger = logger.NewLogger("POW")
type PoW interface {
- Search(block *Block, stop <-chan struct{}) []byte
+ Search(block *types.Block, stop <-chan struct{}) []byte
Verify(hash []byte, diff *big.Int, nonce []byte) bool
GetHashrate() int64
Turbo(bool)
@@ -35,7 +36,7 @@ func (pow *EasyPow) Turbo(on bool) {
pow.turbo = on
}
-func (pow *EasyPow) Search(block *Block, stop <-chan struct{}) []byte {
+func (pow *EasyPow) Search(block *types.Block, stop <-chan struct{}) []byte {
r := rand.New(rand.NewSource(time.Now().UnixNano()))
hash := block.HashNoNonce()
diff := block.Difficulty
diff --git a/chain/events.go b/chain/events.go
index 2703e955d..06ab6be79 100644
--- a/chain/events.go
+++ b/chain/events.go
@@ -1,10 +1,12 @@
package chain
+import "github.com/ethereum/go-ethereum/chain/types"
+
// TxPreEvent is posted when a transaction enters the transaction pool.
-type TxPreEvent struct{ Tx *Transaction }
+type TxPreEvent struct{ Tx *types.Transaction }
// TxPostEvent is posted when a transaction has been processed.
-type TxPostEvent struct{ Tx *Transaction }
+type TxPostEvent struct{ Tx *types.Transaction }
// NewBlockEvent is posted when a block has been imported.
-type NewBlockEvent struct{ Block *Block }
+type NewBlockEvent struct{ Block *types.Block }
diff --git a/chain/filter.go b/chain/filter.go
index 3c0b02d4f..fd8adaa8f 100644
--- a/chain/filter.go
+++ b/chain/filter.go
@@ -5,6 +5,7 @@ import (
"math"
"math/big"
+ "github.com/ethereum/go-ethereum/chain/types"
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/state"
)
@@ -24,7 +25,7 @@ type Filter struct {
Altered []AccountChange
- BlockCallback func(*Block)
+ BlockCallback func(*types.Block)
MessageCallback func(state.Messages)
}
@@ -171,11 +172,11 @@ func (self *Filter) FilterMessages(msgs []*state.Message) []*state.Message {
return messages
}
-func (self *Filter) bloomFilter(block *Block) bool {
+func (self *Filter) bloomFilter(block *types.Block) bool {
var fromIncluded, toIncluded bool
if len(self.from) > 0 {
for _, from := range self.from {
- if BloomLookup(block.LogsBloom, from) {
+ if types.BloomLookup(block.LogsBloom, from) {
fromIncluded = true
break
}
@@ -186,7 +187,7 @@ func (self *Filter) bloomFilter(block *Block) bool {
if len(self.to) > 0 {
for _, to := range self.to {
- if BloomLookup(block.LogsBloom, ethutil.U256(new(big.Int).Add(ethutil.Big1, ethutil.BigD(to))).Bytes()) {
+ if types.BloomLookup(block.LogsBloom, ethutil.U256(new(big.Int).Add(ethutil.Big1, ethutil.BigD(to))).Bytes()) {
toIncluded = true
break
}
diff --git a/chain/helper_test.go b/chain/helper_test.go
index 459e3e63a..8c7532111 100644
--- a/chain/helper_test.go
+++ b/chain/helper_test.go
@@ -4,6 +4,7 @@ import (
"container/list"
"fmt"
+ "github.com/ethereum/go-ethereum/chain/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethdb"
"github.com/ethereum/go-ethereum/ethutil"
@@ -19,7 +20,7 @@ type TestManager struct {
db ethutil.Database
txPool *TxPool
blockChain *ChainManager
- Blocks []*Block
+ Blocks []*types.Block
}
func (s *TestManager) IsListening() bool {
diff --git a/chain/state_transition.go b/chain/state_transition.go
index afe044299..789698675 100644
--- a/chain/state_transition.go
+++ b/chain/state_transition.go
@@ -4,6 +4,7 @@ import (
"fmt"
"math/big"
+ "github.com/ethereum/go-ethereum/chain/types"
"github.com/ethereum/go-ethereum/state"
"github.com/ethereum/go-ethereum/vm"
)
@@ -26,17 +27,17 @@ import (
*/
type StateTransition struct {
coinbase, receiver []byte
- tx *Transaction
+ tx *types.Transaction
gas, gasPrice *big.Int
value *big.Int
data []byte
state *state.State
- block *Block
+ block *types.Block
cb, rec, sen *state.StateObject
}
-func NewStateTransition(coinbase *state.StateObject, tx *Transaction, state *state.State, block *Block) *StateTransition {
+func NewStateTransition(coinbase *state.StateObject, tx *types.Transaction, state *state.State, block *types.Block) *StateTransition {
return &StateTransition{coinbase.Address(), tx.Recipient, tx, new(big.Int), new(big.Int).Set(tx.GasPrice), tx.Value, tx.Data, state, block, coinbase, nil, nil}
}
@@ -203,7 +204,7 @@ func (self *StateTransition) TransitionState() (err error) {
})
// Process the init code and create 'valid' contract
- if IsContractAddr(self.receiver) {
+ if types.IsContractAddr(self.receiver) {
// Evaluate the initialization script
// and use the return value as the
// script section for the state object.
@@ -280,7 +281,7 @@ func (self *StateTransition) Eval(msg *state.Message, script []byte, context *st
}
// Converts an transaction in to a state object
-func MakeContract(tx *Transaction, state *state.State) *state.StateObject {
+func MakeContract(tx *types.Transaction, state *state.State) *state.StateObject {
addr := tx.CreationAddress(state)
contract := state.GetOrNewStateObject(addr)
diff --git a/chain/transaction_pool.go b/chain/transaction_pool.go
index ff75089d6..119712ba8 100644
--- a/chain/transaction_pool.go
+++ b/chain/transaction_pool.go
@@ -7,6 +7,7 @@ import (
"math/big"
"sync"
+ "github.com/ethereum/go-ethereum/chain/types"
"github.com/ethereum/go-ethereum/logger"
"github.com/ethereum/go-ethereum/state"
"github.com/ethereum/go-ethereum/wire"
@@ -16,7 +17,7 @@ var txplogger = logger.NewLogger("TXP")
const txPoolQueueSize = 50
-type TxPoolHook chan *Transaction
+type TxPoolHook chan *types.Transaction
type TxMsgTy byte
const (
@@ -26,21 +27,21 @@ const (
var MinGasPrice = big.NewInt(10000000000000)
type TxMsg struct {
- Tx *Transaction
+ Tx *types.Transaction
Type TxMsgTy
}
-func EachTx(pool *list.List, it func(*Transaction, *list.Element) bool) {
+func EachTx(pool *list.List, it func(*types.Transaction, *list.Element) bool) {
for e := pool.Front(); e != nil; e = e.Next() {
- if it(e.Value.(*Transaction), e) {
+ if it(e.Value.(*types.Transaction), e) {
break
}
}
}
-func FindTx(pool *list.List, finder func(*Transaction, *list.Element) bool) *Transaction {
+func FindTx(pool *list.List, finder func(*types.Transaction, *list.Element) bool) *types.Transaction {
for e := pool.Front(); e != nil; e = e.Next() {
- if tx, ok := e.Value.(*Transaction); ok {
+ if tx, ok := e.Value.(*types.Transaction); ok {
if finder(tx, e) {
return tx
}
@@ -51,7 +52,7 @@ func FindTx(pool *list.List, finder func(*Transaction, *list.Element) bool) *Tra
}
type TxProcessor interface {
- ProcessTransaction(tx *Transaction)
+ ProcessTransaction(tx *types.Transaction)
}
// The tx pool a thread safe transaction pool handler. In order to
@@ -65,7 +66,7 @@ type TxPool struct {
mutex sync.Mutex
// Queueing channel for reading and writing incoming
// transactions to
- queueChan chan *Transaction
+ queueChan chan *types.Transaction
// Quiting channel
quit chan bool
// The actual pool
@@ -79,14 +80,14 @@ type TxPool struct {
func NewTxPool(ethereum EthManager) *TxPool {
return &TxPool{
pool: list.New(),
- queueChan: make(chan *Transaction, txPoolQueueSize),
+ queueChan: make(chan *types.Transaction, txPoolQueueSize),
quit: make(chan bool),
Ethereum: ethereum,
}
}
// Blocking function. Don't use directly. Use QueueTransaction instead
-func (pool *TxPool) addTransaction(tx *Transaction) {
+func (pool *TxPool) addTransaction(tx *types.Transaction) {
pool.mutex.Lock()
defer pool.mutex.Unlock()
@@ -96,7 +97,7 @@ func (pool *TxPool) addTransaction(tx *Transaction) {
pool.Ethereum.Broadcast(wire.MsgTxTy, []interface{}{tx.RlpData()})
}
-func (pool *TxPool) ValidateTransaction(tx *Transaction) error {
+func (pool *TxPool) ValidateTransaction(tx *types.Transaction) error {
// Get the last block so we can retrieve the sender and receiver from
// the merkle trie
block := pool.Ethereum.ChainManager().CurrentBlock
@@ -142,7 +143,7 @@ out:
select {
case tx := <-pool.queueChan:
hash := tx.Hash()
- foundTx := FindTx(pool.pool, func(tx *Transaction, e *list.Element) bool {
+ foundTx := FindTx(pool.pool, func(tx *types.Transaction, e *list.Element) bool {
return bytes.Compare(tx.Hash(), hash) == 0
})
@@ -172,18 +173,18 @@ out:
}
}
-func (pool *TxPool) QueueTransaction(tx *Transaction) {
+func (pool *TxPool) QueueTransaction(tx *types.Transaction) {
pool.queueChan <- tx
}
-func (pool *TxPool) CurrentTransactions() []*Transaction {
+func (pool *TxPool) CurrentTransactions() []*types.Transaction {
pool.mutex.Lock()
defer pool.mutex.Unlock()
- txList := make([]*Transaction, pool.pool.Len())
+ txList := make([]*types.Transaction, pool.pool.Len())
i := 0
for e := pool.pool.Front(); e != nil; e = e.Next() {
- tx := e.Value.(*Transaction)
+ tx := e.Value.(*types.Transaction)
txList[i] = tx
@@ -198,7 +199,7 @@ func (pool *TxPool) RemoveInvalid(state *state.State) {
defer pool.mutex.Unlock()
for e := pool.pool.Front(); e != nil; e = e.Next() {
- tx := e.Value.(*Transaction)
+ tx := e.Value.(*types.Transaction)
sender := state.GetAccount(tx.Sender())
err := pool.ValidateTransaction(tx)
if err != nil || sender.Nonce >= tx.Nonce {
@@ -207,12 +208,12 @@ func (pool *TxPool) RemoveInvalid(state *state.State) {
}
}
-func (self *TxPool) RemoveSet(txs Transactions) {
+func (self *TxPool) RemoveSet(txs types.Transactions) {
self.mutex.Lock()
defer self.mutex.Unlock()
for _, tx := range txs {
- EachTx(self.pool, func(t *Transaction, element *list.Element) bool {
+ EachTx(self.pool, func(t *types.Transaction, element *list.Element) bool {
if t == tx {
self.pool.Remove(element)
return true // To stop the loop
@@ -222,7 +223,7 @@ func (self *TxPool) RemoveSet(txs Transactions) {
}
}
-func (pool *TxPool) Flush() []*Transaction {
+func (pool *TxPool) Flush() []*types.Transaction {
txList := pool.CurrentTransactions()
// Recreate a new list all together
diff --git a/chain/transaction_test.go b/chain/transaction_test.go
deleted file mode 100644
index fef1d2010..000000000
--- a/chain/transaction_test.go
+++ /dev/null
@@ -1 +0,0 @@
-package chain
diff --git a/chain/block.go b/chain/types/block.go
similarity index 99%
rename from chain/block.go
rename to chain/types/block.go
index a4ab560dc..b311433e3 100644
--- a/chain/block.go
+++ b/chain/types/block.go
@@ -1,4 +1,4 @@
-package chain
+package types
import (
"bytes"
@@ -156,7 +156,7 @@ func (block *Block) State() *state.State {
return block.state
}
-func (block *Block) Transactions() []*Transaction {
+func (block *Block) Transactions() Transactions {
return block.transactions
}
diff --git a/chain/bloom9.go b/chain/types/bloom9.go
similarity index 98%
rename from chain/bloom9.go
rename to chain/types/bloom9.go
index c610bd101..626711cca 100644
--- a/chain/bloom9.go
+++ b/chain/types/bloom9.go
@@ -1,4 +1,4 @@
-package chain
+package types
import (
"math/big"
diff --git a/chain/bloom9_test.go b/chain/types/bloom9_test.go
similarity index 97%
rename from chain/bloom9_test.go
rename to chain/types/bloom9_test.go
index c99e27db4..74e00cac6 100644
--- a/chain/bloom9_test.go
+++ b/chain/types/bloom9_test.go
@@ -1,4 +1,4 @@
-package chain
+package types
/*
import (
diff --git a/chain/types/common.go b/chain/types/common.go
new file mode 100644
index 000000000..ae0e7c3fa
--- /dev/null
+++ b/chain/types/common.go
@@ -0,0 +1,10 @@
+package types
+
+import (
+ "math/big"
+ "github.com/ethereum/go-ethereum/state"
+)
+
+type BlockProcessor interface {
+ ProcessWithParent(*Block, *Block) (*big.Int, state.Messages, error)
+}
diff --git a/chain/derive_sha.go b/chain/types/derive_sha.go
similarity index 96%
rename from chain/derive_sha.go
rename to chain/types/derive_sha.go
index 4246aeb02..1897ff198 100644
--- a/chain/derive_sha.go
+++ b/chain/types/derive_sha.go
@@ -1,4 +1,4 @@
-package chain
+package types
import (
"github.com/ethereum/go-ethereum/ethutil"
diff --git a/chain/receipt.go b/chain/types/receipt.go
similarity index 84%
rename from chain/receipt.go
rename to chain/types/receipt.go
index fa53f1cdb..25fa8fb07 100644
--- a/chain/receipt.go
+++ b/chain/types/receipt.go
@@ -1,4 +1,4 @@
-package chain
+package types
import (
"bytes"
@@ -16,6 +16,10 @@ type Receipt struct {
logs state.Logs
}
+func NewReceipt(root []byte, cumalativeGasUsed *big.Int) *Receipt {
+ return &Receipt{PostState: ethutil.CopyBytes(root), CumulativeGasUsed: cumalativeGasUsed}
+}
+
func NewRecieptFromValue(val *ethutil.Value) *Receipt {
r := &Receipt{}
r.RlpValueDecode(val)
@@ -23,6 +27,10 @@ func NewRecieptFromValue(val *ethutil.Value) *Receipt {
return r
}
+func (self *Receipt) SetLogs(logs state.Logs) {
+ self.logs = logs
+}
+
func (self *Receipt) RlpValueDecode(decoder *ethutil.Value) {
self.PostState = decoder.Get(0).Bytes()
self.CumulativeGasUsed = decoder.Get(1).BigInt()
diff --git a/chain/transaction.go b/chain/types/transaction.go
similarity index 99%
rename from chain/transaction.go
rename to chain/types/transaction.go
index d81a0ea1b..626a7e5ce 100644
--- a/chain/transaction.go
+++ b/chain/types/transaction.go
@@ -1,4 +1,4 @@
-package chain
+package types
import (
"fmt"
diff --git a/chain/types/transaction_test.go b/chain/types/transaction_test.go
new file mode 100644
index 000000000..ab1254f4c
--- /dev/null
+++ b/chain/types/transaction_test.go
@@ -0,0 +1 @@
+package types
diff --git a/chain/vm_env.go b/chain/vm_env.go
index 4f3dc3ca4..c1911ff51 100644
--- a/chain/vm_env.go
+++ b/chain/vm_env.go
@@ -3,17 +3,18 @@ package chain
import (
"math/big"
+ "github.com/ethereum/go-ethereum/chain/types"
"github.com/ethereum/go-ethereum/state"
"github.com/ethereum/go-ethereum/vm"
)
type VMEnv struct {
state *state.State
- block *Block
- tx *Transaction
+ block *types.Block
+ tx *types.Transaction
}
-func NewEnv(state *state.State, tx *Transaction, block *Block) *VMEnv {
+func NewEnv(state *state.State, tx *types.Transaction, block *types.Block) *VMEnv {
return &VMEnv{
state: state,
block: block,
diff --git a/cmd/ethereum/main.go b/cmd/ethereum/main.go
index c894a8f85..aa933c4e7 100644
--- a/cmd/ethereum/main.go
+++ b/cmd/ethereum/main.go
@@ -21,8 +21,7 @@ import (
"fmt"
"os"
"runtime"
-
- "github.com/ethereum/go-ethereum/chain"
+ "github.com/ethereum/go-ethereum/chain/types"
"github.com/ethereum/go-ethereum/cmd/utils"
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/logger"
@@ -74,7 +73,7 @@ func main() {
ethereum := utils.NewEthereum(db, clientIdentity, keyManager, UseUPnP, OutboundPort, MaxPeer)
if Dump {
- var block *chain.Block
+ var block *types.Block
if len(DumpHash) == 0 && DumpNumber == -1 {
block = ethereum.ChainManager().CurrentBlock
diff --git a/cmd/ethtest/main.go b/cmd/ethtest/main.go
index 224924498..82e1c6d59 100644
--- a/cmd/ethtest/main.go
+++ b/cmd/ethtest/main.go
@@ -15,7 +15,7 @@
along with go-ethereum. If not, see .
*/
/**
- * @authors
+ * @authors:
* Jeffrey Wilcke
* @date 2014
*
diff --git a/cmd/mist/bindings.go b/cmd/mist/bindings.go
index 480c38b2e..eb78c3acc 100644
--- a/cmd/mist/bindings.go
+++ b/cmd/mist/bindings.go
@@ -21,8 +21,7 @@ import (
"encoding/json"
"os"
"strconv"
-
- "github.com/ethereum/go-ethereum/chain"
+ "github.com/ethereum/go-ethereum/chain/types"
"github.com/ethereum/go-ethereum/cmd/utils"
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/logger"
@@ -106,7 +105,7 @@ func (self *Gui) DumpState(hash, path string) {
if len(hash) == 0 {
stateDump = self.eth.BlockManager().CurrentState().Dump()
} else {
- var block *chain.Block
+ var block *types.Block
if hash[0] == '#' {
i, _ := strconv.Atoi(hash[1:])
block = self.eth.ChainManager().GetBlockByNumber(uint64(i))
diff --git a/cmd/mist/ext_app.go b/cmd/mist/ext_app.go
index d004f98c5..22fa4bfaf 100644
--- a/cmd/mist/ext_app.go
+++ b/cmd/mist/ext_app.go
@@ -21,6 +21,7 @@ import (
"encoding/json"
"github.com/ethereum/go-ethereum/chain"
+ "github.com/ethereum/go-ethereum/chain/types"
"github.com/ethereum/go-ethereum/event"
"github.com/ethereum/go-ethereum/javascript"
"github.com/ethereum/go-ethereum/state"
@@ -36,7 +37,7 @@ type AppContainer interface {
Window() *qml.Window
Engine() *qml.Engine
- NewBlock(*chain.Block)
+ NewBlock(*types.Block)
NewWatcher(chan bool)
Messages(state.Messages, string)
Post(string, int)
diff --git a/cmd/mist/gui.go b/cmd/mist/gui.go
index 785962ea0..61b66cce3 100644
--- a/cmd/mist/gui.go
+++ b/cmd/mist/gui.go
@@ -32,6 +32,7 @@ import (
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/chain"
+ "github.com/ethereum/go-ethereum/chain/types"
"github.com/ethereum/go-ethereum/ethdb"
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/logger"
@@ -63,6 +64,15 @@ func LoadExtension(path string) (uintptr, error) {
return ptr.Interface().(uintptr), nil
}
*/
+/*
+ vec, errr := LoadExtension("/Users/jeffrey/Desktop/build-libqmltest-Desktop_Qt_5_2_1_clang_64bit-Debug/liblibqmltest_debug.dylib")
+ fmt.Printf("Fetched vec with addr: %#x\n", vec)
+ if errr != nil {
+ fmt.Println(errr)
+ } else {
+ context.SetVar("vec", (unsafe.Pointer)(vec))
+ }
+*/
var guilogger = logger.NewLogger("GUI")
@@ -112,9 +122,10 @@ func NewWindow(ethereum *eth.Ethereum, config *ethutil.ConfigManager, clientIden
}
func (gui *Gui) Start(assetPath string) {
-
defer gui.txDb.Close()
+ guilogger.Infoln("Starting GUI")
+
// Register ethereum functions
qml.RegisterTypes("Ethereum", 1, 0, []qml.TypeSpec{{
Init: func(p *xeth.JSBlock, obj qml.Object) { p.Number = 0; p.Hash = "" },
@@ -132,16 +143,6 @@ func (gui *Gui) Start(assetPath string) {
context.SetVar("gui", gui)
context.SetVar("eth", gui.uiLib)
- /*
- vec, errr := LoadExtension("/Users/jeffrey/Desktop/build-libqmltest-Desktop_Qt_5_2_1_clang_64bit-Debug/liblibqmltest_debug.dylib")
- fmt.Printf("Fetched vec with addr: %#x\n", vec)
- if errr != nil {
- fmt.Println(errr)
- } else {
- context.SetVar("vec", (unsafe.Pointer)(vec))
- }
- */
-
// Load the main QML interface
data, _ := ethutil.Config.Db.Get([]byte("KeyRing"))
@@ -160,7 +161,6 @@ func (gui *Gui) Start(assetPath string) {
panic(err)
}
- guilogger.Infoln("Starting GUI")
gui.open = true
win.Show()
@@ -245,7 +245,7 @@ func (gui *Gui) CreateAndSetPrivKey() (string, string, string, string) {
return gui.eth.KeyManager().KeyPair().AsStrings()
}
-func (gui *Gui) setInitialChainManager() {
+func (gui *Gui) setInitialChain(ancientBlocks bool) {
sBlk := gui.eth.ChainManager().LastBlockHash
blk := gui.eth.ChainManager().GetBlock(sBlk)
for ; blk != nil; blk = gui.eth.ChainManager().GetBlock(sBlk) {
@@ -255,10 +255,6 @@ func (gui *Gui) setInitialChainManager() {
}
}
-type address struct {
- Name, Address string
-}
-
func (gui *Gui) loadAddressBook() {
view := gui.getObjectByName("infoView")
nameReg := gui.pipe.World().Config().Get("NameReg")
@@ -295,7 +291,7 @@ func (self *Gui) loadMergedMiningOptions() {
}
}
-func (gui *Gui) insertTransaction(window string, tx *chain.Transaction) {
+func (gui *Gui) insertTransaction(window string, tx *types.Transaction) {
pipe := xeth.New(gui.eth)
nameReg := pipe.World().Config().Get("NameReg")
addr := gui.address()
@@ -345,7 +341,7 @@ func (gui *Gui) insertTransaction(window string, tx *chain.Transaction) {
func (gui *Gui) readPreviousTransactions() {
it := gui.txDb.NewIterator()
for it.Next() {
- tx := chain.NewTransactionFromBytes(it.Value())
+ tx := types.NewTransactionFromBytes(it.Value())
gui.insertTransaction("post", tx)
@@ -353,7 +349,7 @@ func (gui *Gui) readPreviousTransactions() {
it.Release()
}
-func (gui *Gui) processBlock(block *chain.Block, initial bool) {
+func (gui *Gui) processBlock(block *types.Block, initial bool) {
name := strings.Trim(gui.pipe.World().Config().Get("NameReg").Storage(block.Coinbase).Str(), "\x00")
b := xeth.NewJSBlock(block)
b.Name = name
@@ -385,11 +381,11 @@ func (self *Gui) getObjectByName(objectName string) qml.Object {
func (gui *Gui) update() {
// We have to wait for qml to be done loading all the windows.
for !gui.qmlDone {
- time.Sleep(500 * time.Millisecond)
+ time.Sleep(300 * time.Millisecond)
}
go func() {
- go gui.setInitialChainManager()
+ go gui.setInitialChain(false)
gui.loadAddressBook()
gui.loadMergedMiningOptions()
gui.setPeerInfo()
@@ -493,14 +489,7 @@ func (gui *Gui) update() {
case <-generalUpdateTicker.C:
statusText := "#" + gui.eth.ChainManager().CurrentBlock.Number.String()
lastBlockLabel.Set("text", statusText)
-
miningLabel.Set("text", "Mining @ "+strconv.FormatInt(gui.uiLib.miner.GetPow().GetHashrate(), 10)+"Khash")
- /*
- if gui.miner != nil {
- pow := gui.miner.GetPow()
- miningLabel.Set("text", "Mining @ "+strconv.FormatInt(pow.GetHashrate(), 10)+"Khash")
- }
- */
blockLength := gui.eth.BlockPool().BlocksProcessed
chainLength := gui.eth.BlockPool().ChainLength
@@ -510,7 +499,6 @@ func (gui *Gui) update() {
dlWidget = gui.win.Root().ObjectByName("downloadIndicator")
dlLabel = gui.win.Root().ObjectByName("downloadLabel")
)
-
dlWidget.Set("value", pct)
dlLabel.Set("text", fmt.Sprintf("%d / %d", blockLength, chainLength))
@@ -549,7 +537,6 @@ NumGC: %d
func (gui *Gui) setPeerInfo() {
gui.win.Root().Call("setPeers", fmt.Sprintf("%d / %d", gui.eth.PeerCount(), gui.eth.MaxPeers))
-
gui.win.Root().Call("resetPeers")
for _, peer := range gui.pipe.Peers() {
gui.win.Root().Call("addPeer", peer)
diff --git a/cmd/mist/html_container.go b/cmd/mist/html_container.go
index 35e351b02..4c6609a95 100644
--- a/cmd/mist/html_container.go
+++ b/cmd/mist/html_container.go
@@ -26,8 +26,7 @@ import (
"os"
"path"
"path/filepath"
-
- "github.com/ethereum/go-ethereum/chain"
+ "github.com/ethereum/go-ethereum/chain/types"
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/javascript"
"github.com/ethereum/go-ethereum/state"
@@ -138,7 +137,7 @@ func (app *HtmlApplication) Window() *qml.Window {
return app.win
}
-func (app *HtmlApplication) NewBlock(block *chain.Block) {
+func (app *HtmlApplication) NewBlock(block *types.Block) {
b := &xeth.JSBlock{Number: int(block.BlockInfo().Number), Hash: ethutil.Bytes2Hex(block.Hash())}
app.webView.Call("onNewBlockCb", b)
}
diff --git a/cmd/mist/main.go b/cmd/mist/main.go
index c106a7582..bc05d4f3d 100644
--- a/cmd/mist/main.go
+++ b/cmd/mist/main.go
@@ -18,8 +18,10 @@
package main
import (
+ "fmt"
"os"
"runtime"
+ "time"
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/cmd/utils"
@@ -38,6 +40,7 @@ func run() error {
// precedence: code-internal flag default < config file < environment variables < command line
Init() // parsing command line
+ tstart := time.Now()
config := utils.InitConfig(VmType, ConfigFile, Datadir, "ETH")
utils.InitDataDir(Datadir)
@@ -51,14 +54,11 @@ func run() error {
os.Exit(1)
}
-
keyManager := utils.NewKeyManager(KeyStore, Datadir, db)
// create, import, export keys
utils.KeyTasks(keyManager, KeyRing, GenAddr, SecretFile, ExportDir, NonInteractive)
-
clientIdentity := utils.NewClientIdentity(ClientIdentifier, Version, Identifier)
-
ethereum = utils.NewEthereum(db, clientIdentity, keyManager, UseUPnP, OutboundPort, MaxPeer)
if ShowGenesis {
@@ -75,7 +75,10 @@ func run() error {
utils.RegisterInterrupt(func(os.Signal) {
gui.Stop()
})
- utils.StartEthereum(ethereum, UseSeed)
+ go utils.StartEthereum(ethereum, UseSeed)
+
+ fmt.Println("ETH stack took", time.Since(tstart))
+
// gui blocks the main thread
gui.Start(AssetPath)
diff --git a/cmd/mist/qml_container.go b/cmd/mist/qml_container.go
index 60013ec2b..b5986c16e 100644
--- a/cmd/mist/qml_container.go
+++ b/cmd/mist/qml_container.go
@@ -20,8 +20,7 @@ package main
import (
"fmt"
"runtime"
-
- "github.com/ethereum/go-ethereum/chain"
+ "github.com/ethereum/go-ethereum/chain/types"
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/state"
"github.com/ethereum/go-ethereum/xeth"
@@ -65,7 +64,7 @@ func (app *QmlApplication) NewWatcher(quitChan chan bool) {
}
// Events
-func (app *QmlApplication) NewBlock(block *chain.Block) {
+func (app *QmlApplication) NewBlock(block *types.Block) {
pblock := &xeth.JSBlock{Number: int(block.BlockInfo().Number), Hash: ethutil.Bytes2Hex(block.Hash())}
app.win.Call("onNewBlockCb", pblock)
}
diff --git a/cmd/mist/ui_lib.go b/cmd/mist/ui_lib.go
index 4e480144f..01352f192 100644
--- a/cmd/mist/ui_lib.go
+++ b/cmd/mist/ui_lib.go
@@ -26,6 +26,7 @@ import (
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/chain"
+ "github.com/ethereum/go-ethereum/chain/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/javascript"
@@ -126,7 +127,7 @@ func (self *UiLib) PastPeers() *ethutil.List {
}
func (self *UiLib) ImportTx(rlpTx string) {
- tx := chain.NewTransactionFromBytes(ethutil.Hex2Bytes(rlpTx))
+ tx := types.NewTransactionFromBytes(ethutil.Hex2Bytes(rlpTx))
self.eth.TxPool().QueueTransaction(tx)
}
@@ -228,7 +229,7 @@ func (self *UiLib) NewFilter(object map[string]interface{}) (id int) {
func (self *UiLib) NewFilterString(typ string) (id int) {
filter := chain.NewFilter(self.eth)
- filter.BlockCallback = func(block *chain.Block) {
+ filter.BlockCallback = func(block *types.Block) {
if self.win != nil && self.win.Root() != nil {
self.win.Root().Call("invokeFilterCallback", "{}", id)
} else {
diff --git a/cmd/utils/vm_env.go b/cmd/utils/vm_env.go
index e201627e2..b2788efa1 100644
--- a/cmd/utils/vm_env.go
+++ b/cmd/utils/vm_env.go
@@ -2,21 +2,20 @@ package utils
import (
"math/big"
-
- "github.com/ethereum/go-ethereum/chain"
+ "github.com/ethereum/go-ethereum/chain/types"
"github.com/ethereum/go-ethereum/state"
"github.com/ethereum/go-ethereum/vm"
)
type VMEnv struct {
state *state.State
- block *chain.Block
+ block *types.Block
transactor []byte
value *big.Int
}
-func NewEnv(state *state.State, block *chain.Block, transactor []byte, value *big.Int) *VMEnv {
+func NewEnv(state *state.State, block *types.Block, transactor []byte, value *big.Int) *VMEnv {
return &VMEnv{
state: state,
block: block,
diff --git a/ethdb/memory_database.go b/ethdb/memory_database.go
index 459373eea..48aa830e7 100644
--- a/ethdb/memory_database.go
+++ b/ethdb/memory_database.go
@@ -23,6 +23,10 @@ func (db *MemDatabase) Put(key []byte, value []byte) {
db.db[string(key)] = value
}
+func (db *MemDatabase) Set(key []byte, value []byte) {
+ db.Put(key, value)
+}
+
func (db *MemDatabase) Get(key []byte) ([]byte, error) {
return db.db[string(key)], nil
}
diff --git a/ethereum.go b/ethereum.go
index ce8a92b58..879a14bd5 100644
--- a/ethereum.go
+++ b/ethereum.go
@@ -129,8 +129,9 @@ func New(db ethutil.Database, clientIdentity wire.ClientIdentity, keyManager *cr
ethereum.blockPool = NewBlockPool(ethereum)
ethereum.txPool = chain.NewTxPool(ethereum)
- ethereum.blockChain = chain.NewChainManager(ethereum)
+ ethereum.blockChain = chain.NewChainManager()
ethereum.blockManager = chain.NewBlockManager(ethereum)
+ ethereum.blockChain.SetProcessor(ethereum.blockManager)
// Start the tx pool
ethereum.txPool.Start()
diff --git a/event/profile.tmp b/event/profile.tmp
deleted file mode 100644
index c6496902d..000000000
--- a/event/profile.tmp
+++ /dev/null
@@ -1,40 +0,0 @@
-mode: count
-github.com/ethereum/go-ethereum/event/event.go:41.66,45.17 4 1005
-github.com/ethereum/go-ethereum/event/event.go:63.2,63.12 1 1004
-github.com/ethereum/go-ethereum/event/event.go:45.17,47.3 1 1
-github.com/ethereum/go-ethereum/event/event.go:47.3,48.22 1 1004
-github.com/ethereum/go-ethereum/event/event.go:51.3,51.27 1 1004
-github.com/ethereum/go-ethereum/event/event.go:48.22,50.4 1 5
-github.com/ethereum/go-ethereum/event/event.go:51.27,54.32 3 1006
-github.com/ethereum/go-ethereum/event/event.go:57.4,60.25 4 1005
-github.com/ethereum/go-ethereum/event/event.go:54.32,56.5 1 1
-github.com/ethereum/go-ethereum/event/event.go:68.48,71.17 3 3513
-github.com/ethereum/go-ethereum/event/event.go:75.2,77.27 3 3511
-github.com/ethereum/go-ethereum/event/event.go:80.2,80.12 1 3509
-github.com/ethereum/go-ethereum/event/event.go:71.17,74.3 2 2
-github.com/ethereum/go-ethereum/event/event.go:77.27,79.3 1 2576
-github.com/ethereum/go-ethereum/event/event.go:86.28,88.32 2 5
-github.com/ethereum/go-ethereum/event/event.go:93.2,95.20 3 5
-github.com/ethereum/go-ethereum/event/event.go:88.32,89.28 1 3
-github.com/ethereum/go-ethereum/event/event.go:89.28,91.4 1 3
-github.com/ethereum/go-ethereum/event/event.go:98.36,100.34 2 1001
-github.com/ethereum/go-ethereum/event/event.go:109.2,109.22 1 1001
-github.com/ethereum/go-ethereum/event/event.go:100.34,101.37 1 1001
-github.com/ethereum/go-ethereum/event/event.go:101.37,102.22 1 1001
-github.com/ethereum/go-ethereum/event/event.go:102.22,104.5 1 2
-github.com/ethereum/go-ethereum/event/event.go:104.5,106.5 1 999
-github.com/ethereum/go-ethereum/event/event.go:112.46,113.26 1 2007
-github.com/ethereum/go-ethereum/event/event.go:118.2,118.11 1 1005
-github.com/ethereum/go-ethereum/event/event.go:113.26,114.16 1 181499
-github.com/ethereum/go-ethereum/event/event.go:114.16,116.4 1 1002
-github.com/ethereum/go-ethereum/event/event.go:121.52,126.2 4 999
-github.com/ethereum/go-ethereum/event/event.go:142.35,150.2 2 1005
-github.com/ethereum/go-ethereum/event/event.go:152.44,154.2 1 1003
-github.com/ethereum/go-ethereum/event/event.go:156.32,159.2 2 1001
-github.com/ethereum/go-ethereum/event/event.go:161.30,164.14 3 1004
-github.com/ethereum/go-ethereum/event/event.go:167.2,173.19 6 1003
-github.com/ethereum/go-ethereum/event/event.go:164.14,166.3 1 1
-github.com/ethereum/go-ethereum/event/event.go:176.42,178.9 2 2575
-github.com/ethereum/go-ethereum/event/event.go:182.2,182.20 1 2575
-github.com/ethereum/go-ethereum/event/event.go:179.2,179.21 0 1004
-github.com/ethereum/go-ethereum/event/event.go:180.2,180.19 0 1571
diff --git a/javascript/javascript_runtime.go b/javascript/javascript_runtime.go
index 86a376fbf..e8b785f50 100644
--- a/javascript/javascript_runtime.go
+++ b/javascript/javascript_runtime.go
@@ -9,6 +9,7 @@ import (
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/chain"
+ "github.com/ethereum/go-ethereum/chain/types"
"github.com/ethereum/go-ethereum/cmd/utils"
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/event"
@@ -130,7 +131,7 @@ func (self *JSRE) dump(call otto.FunctionCall) otto.Value {
var state *state.State
if len(call.ArgumentList) > 0 {
- var block *chain.Block
+ var block *types.Block
if call.Argument(0).IsNumber() {
num, _ := call.Argument(0).ToInteger()
block = self.ethereum.ChainManager().GetBlockByNumber(uint64(num))
diff --git a/miner/miner.go b/miner/miner.go
index a678a6895..795385424 100644
--- a/miner/miner.go
+++ b/miner/miner.go
@@ -29,8 +29,10 @@ import (
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/state"
"github.com/ethereum/go-ethereum/chain"
+ "github.com/ethereum/go-ethereum/chain/types"
"github.com/ethereum/go-ethereum/event"
"github.com/ethereum/go-ethereum/logger"
"github.com/ethereum/go-ethereum/wire"
@@ -44,7 +46,7 @@ type LocalTx struct {
Value string `json:"value"`
}
-func (self *LocalTx) Sign(key []byte) *chain.Transaction {
+func (self *LocalTx) Sign(key []byte) *types.Transaction {
return nil
}
@@ -54,7 +56,7 @@ type Miner struct {
eth *eth.Ethereum
events event.Subscription
- uncles chain.Blocks
+ uncles types.Blocks
localTxs map[int]*LocalTx
localTxId int
@@ -212,13 +214,15 @@ func (self *Miner) mine() {
nonce := self.pow.Search(block, self.powQuitCh)
if nonce != nil {
block.Nonce = nonce
- lchain := chain.NewChain(chain.Blocks{block})
+ lchain := chain.NewChain(types.Blocks{block})
_, err := chainMan.TestChain(lchain)
if err != nil {
minerlogger.Infoln(err)
} else {
- chainMan.InsertChain(lchain)
- //self.eth.EventMux().Post(chain.NewBlockEvent{block})
+ chainMan.InsertChain(lchain, func(block *types.Block, _ state.Messages) {
+ self.eth.EventMux().Post(chain.NewBlockEvent{block})
+ })
+
self.eth.Broadcast(wire.MsgBlockTy, []interface{}{block.Value().Val})
minerlogger.Infof("🔨 Mined block %x\n", block.Hash())
@@ -229,15 +233,15 @@ func (self *Miner) mine() {
}
}
-func (self *Miner) finiliseTxs() chain.Transactions {
+func (self *Miner) finiliseTxs() types.Transactions {
// Sort the transactions by nonce in case of odd network propagation
- var txs chain.Transactions
+ var txs types.Transactions
state := self.eth.BlockManager().TransState()
// XXX This has to change. Coinbase is, for new, same as key.
key := self.eth.KeyManager()
for _, ltx := range self.localTxs {
- tx := chain.NewTransactionMessage(ltx.To, ethutil.Big(ltx.Value), ethutil.Big(ltx.Gas), ethutil.Big(ltx.GasPrice), ltx.Data)
+ tx := types.NewTransactionMessage(ltx.To, ethutil.Big(ltx.Value), ethutil.Big(ltx.Gas), ethutil.Big(ltx.GasPrice), ltx.Data)
tx.Nonce = state.GetNonce(self.Coinbase)
state.SetNonce(self.Coinbase, tx.Nonce+1)
@@ -247,7 +251,7 @@ func (self *Miner) finiliseTxs() chain.Transactions {
}
txs = append(txs, self.eth.TxPool().CurrentTransactions()...)
- sort.Sort(chain.TxByNonce{txs})
+ sort.Sort(types.TxByNonce{txs})
return txs
}
diff --git a/peer.go b/peer.go
index b54978854..ff3593604 100644
--- a/peer.go
+++ b/peer.go
@@ -12,7 +12,7 @@ import (
"sync/atomic"
"time"
- "github.com/ethereum/go-ethereum/chain"
+ "github.com/ethereum/go-ethereum/chain/types"
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/logger"
"github.com/ethereum/go-ethereum/wire"
@@ -24,7 +24,7 @@ const (
// The size of the output buffer for writing messages
outputBufferSize = 50
// Current protocol version
- ProtocolVersion = 42
+ ProtocolVersion = 43
// Current P2P version
P2PVersion = 2
// Ethereum network version
@@ -155,7 +155,7 @@ type Peer struct {
pingTime time.Duration
pingStartTime time.Time
- lastRequestedBlock *chain.Block
+ lastRequestedBlock *types.Block
protocolCaps *ethutil.Value
}
@@ -429,7 +429,7 @@ func (p *Peer) HandleInbound() {
// in the TxPool where it will undergo validation and
// processing when a new block is found
for i := 0; i < msg.Data.Len(); i++ {
- tx := chain.NewTransactionFromValue(msg.Data.Get(i))
+ tx := types.NewTransactionFromValue(msg.Data.Get(i))
p.ethereum.TxPool().QueueTransaction(tx)
}
case wire.MsgGetPeersTy:
@@ -535,7 +535,7 @@ func (p *Peer) HandleInbound() {
it := msg.Data.NewIterator()
for it.Next() {
- block := chain.NewBlockFromRlpValue(it.Value())
+ block := types.NewBlockFromRlpValue(it.Value())
blockPool.Add(block, p)
p.lastBlockReceived = time.Now()
@@ -543,7 +543,7 @@ func (p *Peer) HandleInbound() {
case wire.MsgNewBlockTy:
var (
blockPool = p.ethereum.blockPool
- block = chain.NewBlockFromRlpValue(msg.Data.Get(0))
+ block = types.NewBlockFromRlpValue(msg.Data.Get(0))
td = msg.Data.Get(1).BigInt()
)
diff --git a/profile.cov b/profile.cov
index ef5eb1b88..e92cd379f 100644
--- a/profile.cov
+++ b/profile.cov
@@ -1,202 +1,228 @@
mode: count
-github.com/ethereum/go-ethereum/chain/asm.go:11.48,13.6 2 0
-github.com/ethereum/go-ethereum/chain/asm.go:49.2,49.12 1 0
-github.com/ethereum/go-ethereum/chain/asm.go:13.6,14.50 1 0
-github.com/ethereum/go-ethereum/chain/asm.go:19.3,25.13 4 0
-github.com/ethereum/go-ethereum/chain/asm.go:46.3,46.27 1 0
-github.com/ethereum/go-ethereum/chain/asm.go:14.50,16.4 1 0
-github.com/ethereum/go-ethereum/chain/asm.go:26.3,33.39 3 0
-github.com/ethereum/go-ethereum/chain/asm.go:37.4,38.22 2 0
-github.com/ethereum/go-ethereum/chain/asm.go:41.4,43.31 2 0
-github.com/ethereum/go-ethereum/chain/asm.go:33.39,35.5 1 0
-github.com/ethereum/go-ethereum/chain/asm.go:38.22,40.5 1 0
-github.com/ethereum/go-ethereum/chain/block.go:23.45,30.2 5 0
-github.com/ethereum/go-ethereum/chain/block.go:32.41,34.2 1 0
-github.com/ethereum/go-ethereum/chain/block.go:38.46,40.29 2 0
-github.com/ethereum/go-ethereum/chain/block.go:44.2,44.12 1 0
-github.com/ethereum/go-ethereum/chain/block.go:40.29,42.3 1 0
-github.com/ethereum/go-ethereum/chain/block.go:49.41,55.2 2 0
-github.com/ethereum/go-ethereum/chain/block.go:62.35,62.62 1 0
-github.com/ethereum/go-ethereum/chain/block.go:63.40,65.2 1 0
-github.com/ethereum/go-ethereum/chain/block.go:66.45,66.95 1 0
-github.com/ethereum/go-ethereum/chain/block.go:68.33,68.72 1 0
-github.com/ethereum/go-ethereum/chain/block.go:104.43,109.2 3 0
-github.com/ethereum/go-ethereum/chain/block.go:112.59,117.2 3 0
-github.com/ethereum/go-ethereum/chain/block.go:124.23,143.2 4 0
-github.com/ethereum/go-ethereum/chain/block.go:146.42,149.2 1 0
-github.com/ethereum/go-ethereum/chain/block.go:151.42,153.2 1 0
-github.com/ethereum/go-ethereum/chain/block.go:155.42,157.2 1 0
-github.com/ethereum/go-ethereum/chain/block.go:159.51,161.2 1 0
-github.com/ethereum/go-ethereum/chain/block.go:163.58,164.42 1 0
-github.com/ethereum/go-ethereum/chain/block.go:170.2,179.36 7 0
-github.com/ethereum/go-ethereum/chain/block.go:164.42,166.3 1 0
-github.com/ethereum/go-ethereum/chain/block.go:182.43,188.2 4 0
-github.com/ethereum/go-ethereum/chain/block.go:190.61,191.39 1 0
-github.com/ethereum/go-ethereum/chain/block.go:197.2,197.12 1 0
-github.com/ethereum/go-ethereum/chain/block.go:191.39,192.42 1 0
-github.com/ethereum/go-ethereum/chain/block.go:192.42,194.4 1 0
-github.com/ethereum/go-ethereum/chain/block.go:201.28,203.2 1 0
-github.com/ethereum/go-ethereum/chain/block.go:205.28,208.2 1 0
-github.com/ethereum/go-ethereum/chain/block.go:211.47,214.35 2 0
-github.com/ethereum/go-ethereum/chain/block.go:219.2,219.13 1 0
-github.com/ethereum/go-ethereum/chain/block.go:214.35,217.3 1 0
-github.com/ethereum/go-ethereum/chain/block.go:222.45,225.37 2 0
-github.com/ethereum/go-ethereum/chain/block.go:230.2,230.15 1 0
-github.com/ethereum/go-ethereum/chain/block.go:225.37,228.3 1 0
-github.com/ethereum/go-ethereum/chain/block.go:233.48,236.2 2 0
-github.com/ethereum/go-ethereum/chain/block.go:238.51,242.2 3 0
-github.com/ethereum/go-ethereum/chain/block.go:244.54,247.2 2 0
-github.com/ethereum/go-ethereum/chain/block.go:249.44,251.2 1 0
-github.com/ethereum/go-ethereum/chain/block.go:253.40,257.2 1 0
-github.com/ethereum/go-ethereum/chain/block.go:259.44,262.2 2 0
-github.com/ethereum/go-ethereum/chain/block.go:264.60,269.37 2 0
-github.com/ethereum/go-ethereum/chain/block.go:283.2,283.37 1 0
-github.com/ethereum/go-ethereum/chain/block.go:269.37,274.34 3 0
-github.com/ethereum/go-ethereum/chain/block.go:274.34,279.4 1 0
-github.com/ethereum/go-ethereum/chain/block.go:283.37,286.37 3 0
-github.com/ethereum/go-ethereum/chain/block.go:286.37,288.4 1 0
-github.com/ethereum/go-ethereum/chain/block.go:293.53,309.2 15 0
-github.com/ethereum/go-ethereum/chain/block.go:311.59,316.2 3 0
-github.com/ethereum/go-ethereum/chain/block.go:318.39,320.2 1 0
-github.com/ethereum/go-ethereum/chain/block.go:322.40,324.2 1 0
-github.com/ethereum/go-ethereum/chain/block.go:326.37,328.2 1 0
-github.com/ethereum/go-ethereum/chain/block.go:330.42,332.2 1 0
-github.com/ethereum/go-ethereum/chain/block.go:334.50,365.2 1 0
-github.com/ethereum/go-ethereum/chain/block.go:367.44,369.2 1 0
-github.com/ethereum/go-ethereum/chain/block.go:371.37,410.2 1 0
-github.com/ethereum/go-ethereum/chain/block.go:412.47,414.2 1 0
-github.com/ethereum/go-ethereum/chain/block.go:417.42,419.2 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:33.73,34.48 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:34.48,35.36 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:35.36,36.9 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:41.90,42.48 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:50.2,50.12 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:42.48,43.43 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:43.43,44.21 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:44.21,46.5 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:79.45,86.2 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:89.53,97.2 4 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:99.64,104.18 2 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:108.2,108.55 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:112.2,112.38 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:118.2,123.41 3 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:127.2,127.21 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:136.2,136.12 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:104.18,106.3 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:108.55,110.3 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:112.38,114.3 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:123.41,125.3 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:127.21,128.51 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:128.51,130.4 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:139.36,141.6 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:141.6,142.10 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:143.3,145.77 2 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:149.4,149.22 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:154.4,155.18 2 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:169.3,170.13 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:145.77,147.5 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:149.22,150.10 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:155.18,157.5 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:157.5,168.5 5 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:175.55,177.2 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:179.58,185.53 5 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:193.2,193.15 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:185.53,191.3 3 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:196.55,200.53 3 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:200.53,204.45 4 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:204.45,206.4 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:210.49,214.25 3 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:214.25,215.70 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:215.70,216.15 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:220.4,220.16 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:216.15,219.5 2 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:225.44,233.2 3 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:235.29,237.2 1 0
-github.com/ethereum/go-ethereum/chain/transaction_pool.go:239.28,245.2 3 0
-github.com/ethereum/go-ethereum/chain/vm_env.go:16.71,22.2 1 0
-github.com/ethereum/go-ethereum/chain/vm_env.go:24.43,24.70 1 0
-github.com/ethereum/go-ethereum/chain/vm_env.go:25.43,25.71 1 0
-github.com/ethereum/go-ethereum/chain/vm_env.go:26.43,26.73 1 0
-github.com/ethereum/go-ethereum/chain/vm_env.go:27.43,27.73 1 0
-github.com/ethereum/go-ethereum/chain/vm_env.go:28.43,28.69 1 0
-github.com/ethereum/go-ethereum/chain/vm_env.go:29.43,29.75 1 0
-github.com/ethereum/go-ethereum/chain/vm_env.go:30.43,30.71 1 0
-github.com/ethereum/go-ethereum/chain/vm_env.go:31.43,31.67 1 0
-github.com/ethereum/go-ethereum/chain/vm_env.go:32.43,32.64 1 0
-github.com/ethereum/go-ethereum/chain/vm_env.go:33.43,33.73 1 0
-github.com/ethereum/go-ethereum/chain/vm_env.go:34.43,36.2 1 0
-github.com/ethereum/go-ethereum/chain/vm_env.go:37.73,39.2 1 0
-github.com/ethereum/go-ethereum/chain/transaction.go:15.39,18.2 1 0
-github.com/ethereum/go-ethereum/chain/transaction.go:34.87,36.2 1 0
-github.com/ethereum/go-ethereum/chain/transaction.go:38.96,40.2 1 0
-github.com/ethereum/go-ethereum/chain/transaction.go:42.56,47.2 3 0
-github.com/ethereum/go-ethereum/chain/transaction.go:49.63,54.2 3 0
-github.com/ethereum/go-ethereum/chain/transaction.go:56.46,58.2 1 0
-github.com/ethereum/go-ethereum/chain/transaction.go:60.48,63.2 2 0
-github.com/ethereum/go-ethereum/chain/transaction.go:65.38,69.2 2 0
-github.com/ethereum/go-ethereum/chain/transaction.go:71.47,73.2 1 0
-github.com/ethereum/go-ethereum/chain/transaction.go:76.42,78.2 1 0
-github.com/ethereum/go-ethereum/chain/transaction.go:80.67,88.2 2 0
-github.com/ethereum/go-ethereum/chain/transaction.go:90.53,96.2 3 0
-github.com/ethereum/go-ethereum/chain/transaction.go:98.43,112.2 7 0
-github.com/ethereum/go-ethereum/chain/transaction.go:114.40,119.40 2 0
-github.com/ethereum/go-ethereum/chain/transaction.go:123.2,123.37 1 0
-github.com/ethereum/go-ethereum/chain/transaction.go:119.40,121.3 1 0
-github.com/ethereum/go-ethereum/chain/transaction.go:126.49,135.2 5 0
-github.com/ethereum/go-ethereum/chain/transaction.go:137.46,143.2 2 0
-github.com/ethereum/go-ethereum/chain/transaction.go:145.50,147.2 1 0
-github.com/ethereum/go-ethereum/chain/transaction.go:149.43,151.2 1 0
-github.com/ethereum/go-ethereum/chain/transaction.go:153.47,155.2 1 0
-github.com/ethereum/go-ethereum/chain/transaction.go:157.63,169.34 10 0
-github.com/ethereum/go-ethereum/chain/transaction.go:169.34,171.3 1 0
-github.com/ethereum/go-ethereum/chain/transaction.go:174.40,201.2 1 0
-github.com/ethereum/go-ethereum/chain/transaction.go:206.48,209.26 2 0
-github.com/ethereum/go-ethereum/chain/transaction.go:214.2,214.12 1 0
-github.com/ethereum/go-ethereum/chain/transaction.go:209.26,212.3 1 0
-github.com/ethereum/go-ethereum/chain/transaction.go:216.44,216.61 1 0
-github.com/ethereum/go-ethereum/chain/transaction.go:217.44,217.71 1 0
-github.com/ethereum/go-ethereum/chain/transaction.go:218.44,218.72 1 0
-github.com/ethereum/go-ethereum/chain/transaction.go:222.40,224.2 1 0
-github.com/ethereum/go-ethereum/chain/dagger.go:30.41,32.2 1 0
-github.com/ethereum/go-ethereum/chain/dagger.go:34.36,36.2 1 0
-github.com/ethereum/go-ethereum/chain/dagger.go:38.71,46.6 7 0
-github.com/ethereum/go-ethereum/chain/dagger.go:75.2,75.12 1 0
-github.com/ethereum/go-ethereum/chain/dagger.go:46.6,47.10 1 0
-github.com/ethereum/go-ethereum/chain/dagger.go:70.3,70.17 1 0
-github.com/ethereum/go-ethereum/chain/dagger.go:48.3,51.14 3 0
-github.com/ethereum/go-ethereum/chain/dagger.go:52.3,55.41 2 0
-github.com/ethereum/go-ethereum/chain/dagger.go:64.4,65.35 2 0
-github.com/ethereum/go-ethereum/chain/dagger.go:55.41,62.5 5 0
-github.com/ethereum/go-ethereum/chain/dagger.go:65.35,67.5 1 0
-github.com/ethereum/go-ethereum/chain/dagger.go:70.17,72.4 1 0
-github.com/ethereum/go-ethereum/chain/dagger.go:78.75,91.2 8 0
-github.com/ethereum/go-ethereum/chain/dagger.go:93.44,94.2 0 0
-github.com/ethereum/go-ethereum/chain/dagger.go:103.59,106.28 2 0
-github.com/ethereum/go-ethereum/chain/dagger.go:124.2,124.14 1 0
-github.com/ethereum/go-ethereum/chain/dagger.go:106.28,111.23 4 0
-github.com/ethereum/go-ethereum/chain/dagger.go:119.3,119.12 1 0
-github.com/ethereum/go-ethereum/chain/dagger.go:111.23,116.4 2 0
-github.com/ethereum/go-ethereum/chain/dagger.go:119.12,120.9 1 0
-github.com/ethereum/go-ethereum/chain/dagger.go:127.57,140.40 8 0
-github.com/ethereum/go-ethereum/chain/dagger.go:145.2,145.40 1 0
-github.com/ethereum/go-ethereum/chain/dagger.go:152.2,152.24 1 0
-github.com/ethereum/go-ethereum/chain/dagger.go:140.40,144.3 1 0
-github.com/ethereum/go-ethereum/chain/dagger.go:145.40,147.29 1 0
-github.com/ethereum/go-ethereum/chain/dagger.go:147.29,149.4 1 0
-github.com/ethereum/go-ethereum/chain/dagger.go:155.60,162.2 4 0
-github.com/ethereum/go-ethereum/chain/dagger.go:164.52,172.2 5 0
-github.com/ethereum/go-ethereum/chain/dagger.go:174.54,175.12 1 0
-github.com/ethereum/go-ethereum/chain/dagger.go:179.2,180.12 2 0
-github.com/ethereum/go-ethereum/chain/dagger.go:186.2,192.39 6 0
-github.com/ethereum/go-ethereum/chain/dagger.go:205.2,207.12 2 0
-github.com/ethereum/go-ethereum/chain/dagger.go:175.12,177.3 1 0
-github.com/ethereum/go-ethereum/chain/dagger.go:180.12,182.3 1 0
-github.com/ethereum/go-ethereum/chain/dagger.go:182.3,184.3 1 0
-github.com/ethereum/go-ethereum/chain/dagger.go:192.39,203.3 9 0
-github.com/ethereum/go-ethereum/chain/dagger.go:210.32,213.2 1 0
-github.com/ethereum/go-ethereum/chain/dagger.go:215.46,223.25 6 0
-github.com/ethereum/go-ethereum/chain/dagger.go:239.2,239.31 1 0
-github.com/ethereum/go-ethereum/chain/dagger.go:223.25,237.3 10 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:40.134,42.2 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:44.60,45.20 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:49.2,50.16 2 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:45.20,47.3 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:52.58,53.21 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:57.2,59.17 2 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:53.21,55.3 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:61.60,62.49 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:66.2,66.21 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:70.2,71.17 2 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:62.49,64.3 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:66.21,68.3 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:74.60,75.30 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:78.2,80.12 2 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:75.30,77.3 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:83.54,85.2 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:87.45,91.50 3 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:95.2,97.16 3 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:101.2,104.12 3 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:91.50,93.3 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:97.16,99.3 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:107.42,114.2 4 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:116.53,123.30 2 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:128.2,128.37 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:132.2,132.12 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:123.30,125.3 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:128.37,130.3 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:135.60,139.39 2 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:143.2,155.45 4 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:160.2,162.46 3 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:166.2,166.42 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:170.2,172.26 2 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:198.2,207.41 2 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:264.2,264.8 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:139.39,141.3 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:155.45,157.3 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:162.46,164.3 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:166.42,168.3 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:172.26,181.22 5 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:186.3,186.33 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:181.22,183.4 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:187.4,196.3 4 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:207.41,214.20 3 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:220.3,221.20 2 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:214.20,218.4 2 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:222.4,223.29 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:223.29,225.21 2 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:231.4,231.20 1 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:225.21,229.5 2 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:267.122,281.2 5 0
+github.com/ethereum/go-ethereum/chain/state_transition.go:284.81,291.2 4 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:34.79,35.48 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:35.48,36.42 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:36.42,37.9 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:42.102,43.48 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:51.2,51.12 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:43.48,44.49 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:44.49,45.21 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:45.21,47.5 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:80.45,87.2 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:90.59,98.2 4 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:100.70,105.18 2 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:109.2,109.55 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:113.2,113.38 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:119.2,124.41 3 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:128.2,128.21 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:137.2,137.12 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:105.18,107.3 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:109.55,111.3 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:113.38,115.3 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:124.41,126.3 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:128.21,129.51 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:129.51,131.4 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:140.36,142.6 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:142.6,143.10 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:144.3,146.83 2 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:150.4,150.22 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:155.4,156.18 2 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:170.3,171.13 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:146.83,148.5 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:150.22,151.10 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:156.18,158.5 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:158.6,169.5 5 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:176.61,178.2 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:180.64,186.53 5 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:194.2,194.15 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:186.53,192.3 3 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:197.55,201.53 3 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:201.53,205.45 4 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:205.45,207.4 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:211.55,215.25 3 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:215.25,216.76 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:216.76,217.15 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:221.4,221.16 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:217.15,220.5 2 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:226.50,234.2 3 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:236.29,238.2 1 0
+github.com/ethereum/go-ethereum/chain/transaction_pool.go:240.28,246.2 3 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:78.57,89.2 4 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:91.35,93.2 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:95.34,97.2 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:99.53,101.2 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:103.51,105.2 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:107.52,109.2 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:111.55,115.2 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:117.54,119.2 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:121.232,131.25 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:178.2,180.53 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:131.25,140.17 6 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:159.3,173.62 10 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:140.17,142.11 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:143.4,145.13 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:146.4,149.15 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:150.4,154.13 4 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:173.62,175.4 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:183.99,188.34 3 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:192.2,192.37 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:195.2,197.44 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:188.34,190.3 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:192.37,194.3 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:200.121,211.61 4 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:215.2,216.16 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:220.2,221.44 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:226.2,227.54 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:233.2,233.55 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:238.2,238.66 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:244.2,245.49 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:250.2,252.31 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:258.2,258.41 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:211.61,213.3 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:216.16,218.3 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:221.44,224.3 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:227.54,230.3 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:233.55,236.3 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:238.66,241.3 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:245.49,248.3 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:252.31,255.3 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:258.41,272.3 7 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:272.4,274.3 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:277.120,283.16 4 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:287.2,287.22 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:283.16,285.3 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:290.74,292.37 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:297.2,303.26 4 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:310.2,310.19 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:292.37,294.3 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:303.26,308.3 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:316.73,318.36 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:322.2,323.14 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:335.2,335.72 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:339.2,339.12 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:318.36,320.3 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:323.14,325.3 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:335.72,337.3 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:342.97,347.37 4 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:378.2,382.12 3 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:347.37,348.34 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:353.3,354.25 2 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:358.3,358.81 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:362.3,362.40 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:366.3,374.68 6 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:348.34,351.4 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:354.25,356.4 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:358.81,360.4 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:362.40,364.4 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:385.96,386.37 1 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:390.2,403.39 6 0
+github.com/ethereum/go-ethereum/chain/block_manager.go:386.37,388.3 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:34.40,36.2 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:38.62,40.2 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:45.54,47.2 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:49.50,51.2 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:53.44,55.2 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:57.42,59.2 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:61.42,63.2 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:65.40,67.2 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:69.37,71.2 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:73.39,75.2 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:78.45,80.25 2 0
+github.com/ethereum/go-ethereum/chain/filter.go:83.2,84.23 2 0
+github.com/ethereum/go-ethereum/chain/filter.go:88.2,93.41 2 0
+github.com/ethereum/go-ethereum/chain/filter.go:119.2,121.24 2 0
+github.com/ethereum/go-ethereum/chain/filter.go:80.25,82.3 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:84.23,86.3 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:93.41,95.10 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:104.3,104.30 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:116.3,116.59 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:96.3,97.15 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:98.3,99.9 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:104.30,107.18 2 0
+github.com/ethereum/go-ethereum/chain/filter.go:113.4,113.61 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:107.18,110.10 2 0
+github.com/ethereum/go-ethereum/chain/filter.go:124.58,125.33 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:131.2,131.8 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:125.33,126.34 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:126.34,128.4 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:134.76,138.31 2 0
+github.com/ethereum/go-ethereum/chain/filter.go:172.2,172.17 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:138.31,139.57 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:143.3,143.63 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:147.3,148.29 2 0
+github.com/ethereum/go-ethereum/chain/filter.go:152.3,152.46 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:165.3,165.13 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:169.3,169.39 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:139.57,140.12 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:143.63,144.12 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:148.29,150.4 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:152.46,153.95 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:157.4,157.110 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:161.4,162.9 2 0
+github.com/ethereum/go-ethereum/chain/filter.go:153.95,154.13 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:157.110,158.13 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:165.13,166.12 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:175.58,177.24 2 0
+github.com/ethereum/go-ethereum/chain/filter.go:188.2,188.22 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:199.2,199.35 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:177.24,178.34 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:178.34,179.48 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:179.48,181.10 2 0
+github.com/ethereum/go-ethereum/chain/filter.go:184.4,186.3 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:188.22,189.30 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:189.30,190.114 1 0
+github.com/ethereum/go-ethereum/chain/filter.go:190.114,192.10 2 0
+github.com/ethereum/go-ethereum/chain/filter.go:195.4,197.3 1 0
github.com/ethereum/go-ethereum/chain/error.go:14.38,16.2 1 0
github.com/ethereum/go-ethereum/chain/error.go:18.37,20.2 1 0
github.com/ethereum/go-ethereum/chain/error.go:22.34,26.2 2 0
@@ -217,290 +243,260 @@ github.com/ethereum/go-ethereum/chain/error.go:108.41,110.2 1 0
github.com/ethereum/go-ethereum/chain/error.go:112.36,116.2 2 0
github.com/ethereum/go-ethereum/chain/error.go:122.37,124.2 1 0
github.com/ethereum/go-ethereum/chain/error.go:125.30,128.2 2 0
-github.com/ethereum/go-ethereum/chain/filter.go:33.40,35.2 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:37.62,39.2 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:44.54,46.2 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:48.50,50.2 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:52.44,54.2 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:56.42,58.2 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:60.42,62.2 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:64.40,66.2 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:68.37,70.2 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:72.39,74.2 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:77.45,79.25 2 0
-github.com/ethereum/go-ethereum/chain/filter.go:82.2,83.23 2 0
-github.com/ethereum/go-ethereum/chain/filter.go:87.2,92.41 2 0
-github.com/ethereum/go-ethereum/chain/filter.go:118.2,120.24 2 0
-github.com/ethereum/go-ethereum/chain/filter.go:79.25,81.3 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:83.23,85.3 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:92.41,94.10 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:103.3,103.30 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:115.3,115.59 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:95.3,96.15 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:97.3,98.9 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:103.30,106.18 2 0
-github.com/ethereum/go-ethereum/chain/filter.go:112.4,112.61 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:106.18,109.10 2 0
-github.com/ethereum/go-ethereum/chain/filter.go:123.58,124.33 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:130.2,130.8 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:124.33,125.34 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:125.34,127.4 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:133.76,137.31 2 0
-github.com/ethereum/go-ethereum/chain/filter.go:171.2,171.17 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:137.31,138.57 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:142.3,142.63 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:146.3,147.29 2 0
-github.com/ethereum/go-ethereum/chain/filter.go:151.3,151.46 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:164.3,164.13 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:168.3,168.39 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:138.57,139.12 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:142.63,143.12 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:147.29,149.4 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:151.46,152.95 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:156.4,156.110 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:160.4,161.9 2 0
-github.com/ethereum/go-ethereum/chain/filter.go:152.95,153.13 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:156.110,157.13 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:164.13,165.12 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:174.52,176.24 2 0
-github.com/ethereum/go-ethereum/chain/filter.go:187.2,187.22 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:198.2,198.35 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:176.24,177.34 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:177.34,178.42 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:178.42,180.10 2 0
-github.com/ethereum/go-ethereum/chain/filter.go:183.3,185.3 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:187.22,188.30 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:188.30,189.108 1 0
-github.com/ethereum/go-ethereum/chain/filter.go:189.108,191.10 2 0
-github.com/ethereum/go-ethereum/chain/filter.go:194.3,196.3 1 0
-github.com/ethereum/go-ethereum/chain/receipt.go:19.55,24.2 3 0
-github.com/ethereum/go-ethereum/chain/receipt.go:26.61,32.16 5 0
-github.com/ethereum/go-ethereum/chain/receipt.go:32.16,34.3 1 0
-github.com/ethereum/go-ethereum/chain/receipt.go:37.44,39.2 1 0
-github.com/ethereum/go-ethereum/chain/receipt.go:41.41,43.2 1 0
-github.com/ethereum/go-ethereum/chain/receipt.go:45.47,46.57 1 0
-github.com/ethereum/go-ethereum/chain/receipt.go:50.2,50.13 1 0
-github.com/ethereum/go-ethereum/chain/receipt.go:46.57,48.3 1 0
-github.com/ethereum/go-ethereum/chain/receipt.go:53.38,55.2 1 0
-github.com/ethereum/go-ethereum/chain/receipt.go:59.43,59.63 1 0
-github.com/ethereum/go-ethereum/chain/receipt.go:60.43,60.74 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:77.57,88.2 4 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:90.35,92.2 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:94.34,96.2 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:98.53,100.2 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:102.51,104.2 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:106.52,108.2 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:110.55,114.2 2 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:116.54,118.2 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:120.196,130.25 2 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:176.2,178.53 2 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:130.25,139.17 6 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:158.3,171.62 9 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:139.17,141.11 2 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:142.4,144.13 2 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:145.4,148.15 2 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:149.4,153.13 4 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:171.62,173.4 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:181.93,186.34 3 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:190.2,190.37 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:193.2,195.44 2 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:186.34,188.3 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:190.37,192.3 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:198.115,209.61 4 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:213.2,214.16 2 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:218.2,219.44 2 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:224.2,225.54 2 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:231.2,231.55 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:236.2,236.66 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:241.2,243.49 3 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:248.2,250.31 2 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:256.2,256.41 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:209.61,211.3 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:214.16,216.3 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:219.44,222.3 2 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:225.54,228.3 2 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:231.55,234.3 2 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:236.66,239.3 2 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:243.49,246.3 2 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:250.31,253.3 2 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:256.41,270.3 7 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:270.3,272.3 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:275.108,281.16 4 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:285.2,285.22 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:281.16,283.3 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:288.68,290.37 2 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:295.2,301.26 4 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:308.2,308.19 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:290.37,292.3 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:301.26,306.3 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:314.67,316.36 2 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:320.2,321.14 2 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:333.2,333.72 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:337.2,337.12 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:316.36,318.3 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:321.14,323.3 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:333.72,335.3 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:340.91,345.37 4 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:376.2,380.12 3 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:345.37,346.34 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:351.3,352.25 2 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:356.3,356.81 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:360.3,360.40 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:364.3,372.68 6 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:346.34,349.4 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:352.25,354.4 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:356.81,358.4 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:360.40,362.4 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:383.90,384.37 1 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:388.2,401.39 6 0
-github.com/ethereum/go-ethereum/chain/block_manager.go:384.37,386.3 1 0
-github.com/ethereum/go-ethereum/chain/bloom9.go:11.44,13.35 2 0
-github.com/ethereum/go-ethereum/chain/bloom9.go:17.2,17.46 1 0
-github.com/ethereum/go-ethereum/chain/bloom9.go:13.35,15.3 1 0
-github.com/ethereum/go-ethereum/chain/bloom9.go:20.42,22.27 2 0
-github.com/ethereum/go-ethereum/chain/bloom9.go:37.2,37.12 1 0
-github.com/ethereum/go-ethereum/chain/bloom9.go:22.27,24.36 2 0
-github.com/ethereum/go-ethereum/chain/bloom9.go:28.3,28.26 1 0
-github.com/ethereum/go-ethereum/chain/bloom9.go:24.36,26.4 1 0
-github.com/ethereum/go-ethereum/chain/bloom9.go:28.26,30.4 1 0
-github.com/ethereum/go-ethereum/chain/bloom9.go:40.32,42.35 2 0
-github.com/ethereum/go-ethereum/chain/bloom9.go:48.2,48.10 1 0
-github.com/ethereum/go-ethereum/chain/bloom9.go:42.35,46.3 3 0
-github.com/ethereum/go-ethereum/chain/bloom9.go:51.42,56.2 3 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:31.57,39.2 5 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:41.42,43.2 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:45.58,49.28 3 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:54.2,65.19 4 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:72.2,72.14 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:49.28,52.3 2 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:65.19,70.3 3 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:75.52,79.33 3 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:85.2,85.13 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:79.33,81.3 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:81.3,83.3 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:88.33,100.2 6 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:102.52,105.2 2 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:108.64,111.58 2 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:116.2,116.14 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:111.58,112.47 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:112.47,114.4 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:119.65,122.37 2 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:125.2,127.18 2 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:122.37,124.3 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:130.47,132.2 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:134.92,136.18 2 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:141.2,141.35 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:152.2,152.8 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:136.18,138.3 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:141.35,145.42 2 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:149.3,149.40 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:145.42,146.9 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:155.36,165.4 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:165.4,170.3 4 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:173.40,175.20 2 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:190.2,190.88 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:175.20,186.3 6 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:186.3,188.3 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:193.57,196.2 2 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:199.43,210.2 6 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:212.73,214.19 2 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:218.2,221.37 3 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:225.2,229.16 4 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:214.19,216.3 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:221.37,223.3 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:232.56,234.20 2 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:247.2,247.32 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:234.20,235.31 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:244.3,244.13 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:235.31,237.63 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:237.63,238.63 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:238.63,240.6 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:250.63,252.60 2 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:258.2,258.60 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:262.2,262.14 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:252.60,253.35 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:253.35,254.9 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:258.60,260.3 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:265.59,268.40 2 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:272.2,272.14 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:268.40,270.3 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:275.64,281.2 4 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:283.59,289.2 4 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:292.54,298.2 3 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:300.32,301.28 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:301.28,303.3 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:316.42,319.31 2 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:323.2,323.14 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:319.31,321.3 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:327.58,328.49 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:337.2,338.26 2 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:328.49,335.3 5 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:338.26,341.3 2 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:344.81,346.15 2 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:348.2,348.49 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:377.2,377.26 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:382.2,384.8 2 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:346.15,346.42 1 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:348.49,358.20 2 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:363.3,365.17 3 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:373.3,374.24 2 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:358.20,361.4 2 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:365.17,372.4 5 0
-github.com/ethereum/go-ethereum/chain/chain_manager.go:377.26,380.3 2 0
-github.com/ethereum/go-ethereum/chain/derive_sha.go:13.43,15.34 2 0
-github.com/ethereum/go-ethereum/chain/derive_sha.go:19.2,19.23 1 0
-github.com/ethereum/go-ethereum/chain/derive_sha.go:15.34,17.3 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:39.122,41.2 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:43.60,44.20 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:48.2,49.16 2 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:44.20,46.3 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:51.58,52.21 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:56.2,58.17 2 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:52.21,54.3 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:60.60,61.49 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:65.2,65.21 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:69.2,70.17 2 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:61.49,63.3 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:65.21,67.3 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:73.60,74.30 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:77.2,79.12 2 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:74.30,76.3 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:82.54,84.2 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:86.45,90.50 3 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:94.2,96.16 3 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:100.2,103.12 3 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:90.50,92.3 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:96.16,98.3 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:106.42,113.2 4 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:115.53,122.30 2 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:127.2,127.37 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:131.2,131.12 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:122.30,124.3 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:127.37,129.3 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:134.60,138.39 2 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:142.2,154.45 4 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:159.2,161.46 3 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:165.2,165.42 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:169.2,171.26 2 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:197.2,206.35 2 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:263.2,263.8 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:138.39,140.3 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:154.45,156.3 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:161.46,163.3 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:165.42,167.3 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:171.26,180.22 5 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:185.3,185.33 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:180.22,182.4 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:186.3,195.3 4 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:206.35,213.20 3 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:219.3,220.20 2 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:213.20,217.4 2 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:221.3,222.29 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:222.29,224.21 2 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:230.4,230.20 1 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:224.21,228.5 2 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:266.122,280.2 5 0
-github.com/ethereum/go-ethereum/chain/state_transition.go:283.75,290.2 4 0
+github.com/ethereum/go-ethereum/chain/vm_env.go:17.83,23.2 1 0
+github.com/ethereum/go-ethereum/chain/vm_env.go:25.43,25.70 1 0
+github.com/ethereum/go-ethereum/chain/vm_env.go:26.43,26.71 1 0
+github.com/ethereum/go-ethereum/chain/vm_env.go:27.43,27.73 1 0
+github.com/ethereum/go-ethereum/chain/vm_env.go:28.43,28.73 1 0
+github.com/ethereum/go-ethereum/chain/vm_env.go:29.43,29.69 1 0
+github.com/ethereum/go-ethereum/chain/vm_env.go:30.43,30.75 1 0
+github.com/ethereum/go-ethereum/chain/vm_env.go:31.43,31.71 1 0
+github.com/ethereum/go-ethereum/chain/vm_env.go:32.43,32.67 1 0
+github.com/ethereum/go-ethereum/chain/vm_env.go:33.43,33.64 1 0
+github.com/ethereum/go-ethereum/chain/vm_env.go:34.43,34.73 1 0
+github.com/ethereum/go-ethereum/chain/vm_env.go:35.43,37.2 1 0
+github.com/ethereum/go-ethereum/chain/vm_env.go:38.73,40.2 1 0
+github.com/ethereum/go-ethereum/chain/asm.go:11.48,13.6 2 0
+github.com/ethereum/go-ethereum/chain/asm.go:49.2,49.12 1 0
+github.com/ethereum/go-ethereum/chain/asm.go:13.6,14.50 1 0
+github.com/ethereum/go-ethereum/chain/asm.go:19.3,25.13 4 0
+github.com/ethereum/go-ethereum/chain/asm.go:46.3,46.27 1 0
+github.com/ethereum/go-ethereum/chain/asm.go:14.50,16.4 1 0
+github.com/ethereum/go-ethereum/chain/asm.go:26.3,33.39 3 0
+github.com/ethereum/go-ethereum/chain/asm.go:37.4,38.22 2 0
+github.com/ethereum/go-ethereum/chain/asm.go:41.4,43.31 2 0
+github.com/ethereum/go-ethereum/chain/asm.go:33.39,35.5 1 0
+github.com/ethereum/go-ethereum/chain/asm.go:38.22,40.5 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:17.42,27.4 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:27.4,32.3 4 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:35.58,39.33 3 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:45.2,45.13 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:39.33,41.3 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:41.4,43.3 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:63.38,71.2 4 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:73.67,75.2 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:77.40,79.20 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:94.2,94.88 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:79.20,90.3 6 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:90.4,92.3 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:98.64,102.28 3 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:107.2,118.19 4 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:125.2,125.14 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:102.28,105.3 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:118.19,123.3 3 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:128.33,140.2 6 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:143.49,154.2 6 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:157.48,159.2 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:162.52,165.2 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:167.92,169.18 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:174.2,174.35 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:185.2,185.8 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:169.18,171.3 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:174.35,178.42 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:182.3,182.40 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:178.42,179.9 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:188.62,190.20 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:203.2,203.38 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:190.20,191.31 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:200.3,200.13 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:191.31,193.63 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:193.63,194.63 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:194.63,196.6 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:206.69,208.60 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:214.2,214.60 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:218.2,218.14 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:208.60,209.35 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:209.35,210.9 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:214.60,216.3 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:221.57,224.2 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:226.79,228.19 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:232.2,235.37 3 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:239.2,243.16 4 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:228.19,230.3 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:235.37,237.3 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:246.71,252.2 4 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:255.60,261.2 3 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:263.32,264.28 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:264.28,266.3 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:269.72,271.2 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:274.99,275.49 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:284.2,285.26 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:275.49,282.3 4 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:285.26,288.3 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:291.81,293.15 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:295.2,295.49 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:321.2,321.26 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:326.2,328.8 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:293.15,293.42 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:295.49,302.20 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:307.3,309.17 3 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:317.3,318.24 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:302.20,305.4 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:309.17,316.4 5 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:321.26,324.3 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:341.48,344.31 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:348.2,348.14 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:344.31,346.3 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:351.44,353.48 2 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:357.2,357.28 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:353.48,355.3 1 0
+github.com/ethereum/go-ethereum/chain/chain_manager.go:365.48,368.2 2 0
+github.com/ethereum/go-ethereum/chain/dagger.go:31.41,33.2 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:35.36,37.2 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:39.77,47.6 7 0
+github.com/ethereum/go-ethereum/chain/dagger.go:76.2,76.12 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:47.6,48.10 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:71.3,71.17 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:49.3,52.14 3 0
+github.com/ethereum/go-ethereum/chain/dagger.go:53.3,56.41 2 0
+github.com/ethereum/go-ethereum/chain/dagger.go:65.4,66.35 2 0
+github.com/ethereum/go-ethereum/chain/dagger.go:56.41,63.5 5 0
+github.com/ethereum/go-ethereum/chain/dagger.go:66.35,68.5 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:71.17,73.4 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:79.75,92.2 8 0
+github.com/ethereum/go-ethereum/chain/dagger.go:94.44,95.2 0 0
+github.com/ethereum/go-ethereum/chain/dagger.go:104.59,107.28 2 0
+github.com/ethereum/go-ethereum/chain/dagger.go:125.2,125.14 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:107.28,112.23 4 0
+github.com/ethereum/go-ethereum/chain/dagger.go:120.3,120.12 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:112.23,117.4 2 0
+github.com/ethereum/go-ethereum/chain/dagger.go:120.12,121.9 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:128.57,141.40 8 0
+github.com/ethereum/go-ethereum/chain/dagger.go:146.2,146.40 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:153.2,153.24 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:141.40,145.3 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:146.40,148.29 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:148.29,150.4 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:156.60,163.2 4 0
+github.com/ethereum/go-ethereum/chain/dagger.go:165.52,173.2 5 0
+github.com/ethereum/go-ethereum/chain/dagger.go:175.54,176.12 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:180.2,181.12 2 0
+github.com/ethereum/go-ethereum/chain/dagger.go:187.2,193.39 6 0
+github.com/ethereum/go-ethereum/chain/dagger.go:206.2,208.12 2 0
+github.com/ethereum/go-ethereum/chain/dagger.go:176.12,178.3 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:181.12,183.3 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:183.4,185.3 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:193.39,204.3 9 0
+github.com/ethereum/go-ethereum/chain/dagger.go:211.32,214.2 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:216.46,224.25 6 0
+github.com/ethereum/go-ethereum/chain/dagger.go:240.2,240.31 1 0
+github.com/ethereum/go-ethereum/chain/dagger.go:224.25,238.3 10 0
+github.com/ethereum/go-ethereum/chain/types/block.go:23.45,30.2 5 0
+github.com/ethereum/go-ethereum/chain/types/block.go:32.41,34.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:38.46,40.29 2 0
+github.com/ethereum/go-ethereum/chain/types/block.go:44.2,44.12 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:40.29,42.3 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:49.41,55.2 2 0
+github.com/ethereum/go-ethereum/chain/types/block.go:62.35,62.62 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:63.40,65.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:66.45,66.95 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:68.33,68.72 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:104.43,109.2 3 0
+github.com/ethereum/go-ethereum/chain/types/block.go:112.59,117.2 3 0
+github.com/ethereum/go-ethereum/chain/types/block.go:124.23,143.2 4 0
+github.com/ethereum/go-ethereum/chain/types/block.go:146.42,149.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:151.42,153.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:155.42,157.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:159.49,161.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:163.58,164.42 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:170.2,179.36 7 0
+github.com/ethereum/go-ethereum/chain/types/block.go:164.42,166.3 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:182.43,188.2 4 0
+github.com/ethereum/go-ethereum/chain/types/block.go:190.61,191.39 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:197.2,197.12 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:191.39,192.42 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:192.42,194.4 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:201.28,203.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:205.28,208.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:211.47,214.35 2 0
+github.com/ethereum/go-ethereum/chain/types/block.go:219.2,219.13 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:214.35,217.3 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:222.45,225.37 2 0
+github.com/ethereum/go-ethereum/chain/types/block.go:230.2,230.15 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:225.37,228.3 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:233.48,236.2 2 0
+github.com/ethereum/go-ethereum/chain/types/block.go:238.51,242.2 3 0
+github.com/ethereum/go-ethereum/chain/types/block.go:244.54,247.2 2 0
+github.com/ethereum/go-ethereum/chain/types/block.go:249.44,251.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:253.40,257.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:259.44,262.2 2 0
+github.com/ethereum/go-ethereum/chain/types/block.go:264.60,269.37 2 0
+github.com/ethereum/go-ethereum/chain/types/block.go:283.2,283.37 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:269.37,274.34 3 0
+github.com/ethereum/go-ethereum/chain/types/block.go:274.34,279.4 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:283.37,286.37 3 0
+github.com/ethereum/go-ethereum/chain/types/block.go:286.37,288.4 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:293.53,309.2 15 0
+github.com/ethereum/go-ethereum/chain/types/block.go:311.59,316.2 3 0
+github.com/ethereum/go-ethereum/chain/types/block.go:318.39,320.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:322.40,324.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:326.37,328.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:330.42,332.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:334.50,365.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:367.44,369.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:371.37,410.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:412.47,414.2 1 0
+github.com/ethereum/go-ethereum/chain/types/block.go:417.42,419.2 1 0
+github.com/ethereum/go-ethereum/chain/types/bloom9.go:11.44,13.35 2 0
+github.com/ethereum/go-ethereum/chain/types/bloom9.go:17.2,17.46 1 0
+github.com/ethereum/go-ethereum/chain/types/bloom9.go:13.35,15.3 1 0
+github.com/ethereum/go-ethereum/chain/types/bloom9.go:20.42,22.27 2 0
+github.com/ethereum/go-ethereum/chain/types/bloom9.go:37.2,37.12 1 0
+github.com/ethereum/go-ethereum/chain/types/bloom9.go:22.27,24.36 2 0
+github.com/ethereum/go-ethereum/chain/types/bloom9.go:28.3,28.26 1 0
+github.com/ethereum/go-ethereum/chain/types/bloom9.go:24.36,26.4 1 0
+github.com/ethereum/go-ethereum/chain/types/bloom9.go:28.26,30.4 1 0
+github.com/ethereum/go-ethereum/chain/types/bloom9.go:40.32,42.35 2 0
+github.com/ethereum/go-ethereum/chain/types/bloom9.go:48.2,48.10 1 0
+github.com/ethereum/go-ethereum/chain/types/bloom9.go:42.35,46.3 3 0
+github.com/ethereum/go-ethereum/chain/types/bloom9.go:51.42,56.2 3 0
+github.com/ethereum/go-ethereum/chain/types/derive_sha.go:13.43,15.34 2 0
+github.com/ethereum/go-ethereum/chain/types/derive_sha.go:19.2,19.23 1 0
+github.com/ethereum/go-ethereum/chain/types/derive_sha.go:15.34,17.3 1 0
+github.com/ethereum/go-ethereum/chain/types/receipt.go:19.67,21.2 1 0
+github.com/ethereum/go-ethereum/chain/types/receipt.go:23.55,28.2 3 0
+github.com/ethereum/go-ethereum/chain/types/receipt.go:30.47,32.2 1 0
+github.com/ethereum/go-ethereum/chain/types/receipt.go:34.61,40.16 5 0
+github.com/ethereum/go-ethereum/chain/types/receipt.go:40.16,42.3 1 0
+github.com/ethereum/go-ethereum/chain/types/receipt.go:45.44,47.2 1 0
+github.com/ethereum/go-ethereum/chain/types/receipt.go:49.41,51.2 1 0
+github.com/ethereum/go-ethereum/chain/types/receipt.go:53.47,54.57 1 0
+github.com/ethereum/go-ethereum/chain/types/receipt.go:58.2,58.13 1 0
+github.com/ethereum/go-ethereum/chain/types/receipt.go:54.57,56.3 1 0
+github.com/ethereum/go-ethereum/chain/types/receipt.go:61.38,63.2 1 0
+github.com/ethereum/go-ethereum/chain/types/receipt.go:67.43,67.63 1 0
+github.com/ethereum/go-ethereum/chain/types/receipt.go:68.43,68.74 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:15.39,18.2 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:34.87,36.2 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:38.96,40.2 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:42.56,47.2 3 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:49.63,54.2 3 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:56.46,58.2 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:60.48,63.2 2 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:65.38,69.2 2 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:71.47,73.2 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:76.42,78.2 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:80.67,88.2 2 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:90.53,96.2 3 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:98.43,112.2 7 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:114.40,119.40 2 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:123.2,123.37 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:119.40,121.3 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:126.49,135.2 5 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:137.46,143.2 2 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:145.50,147.2 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:149.43,151.2 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:153.47,155.2 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:157.63,169.34 10 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:169.34,171.3 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:174.40,201.2 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:206.48,209.26 2 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:214.2,214.12 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:209.26,212.3 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:216.44,216.61 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:217.44,217.71 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:218.44,218.72 1 0
+github.com/ethereum/go-ethereum/chain/types/transaction.go:222.40,224.2 1 0
github.com/ethereum/go-ethereum/compression/rle/read_write.go:20.45,23.32 2 4
github.com/ethereum/go-ethereum/compression/rle/read_write.go:45.2,45.25 1 4
github.com/ethereum/go-ethereum/compression/rle/read_write.go:23.32,24.22 1 4
@@ -511,8 +507,8 @@ github.com/ethereum/go-ethereum/compression/rle/read_write.go:27.5,28.22 1 1
github.com/ethereum/go-ethereum/compression/rle/read_write.go:29.5,30.26 1 1
github.com/ethereum/go-ethereum/compression/rle/read_write.go:31.5,32.26 1 1
github.com/ethereum/go-ethereum/compression/rle/read_write.go:33.5,34.46 1 1
-github.com/ethereum/go-ethereum/compression/rle/read_write.go:37.5,39.5 1 0
-github.com/ethereum/go-ethereum/compression/rle/read_write.go:40.4,42.4 1 0
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:37.6,39.5 1 0
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:40.5,42.4 1 0
github.com/ethereum/go-ethereum/compression/rle/read_write.go:48.52,49.9 1 0
github.com/ethereum/go-ethereum/compression/rle/read_write.go:50.2,51.38 1 0
github.com/ethereum/go-ethereum/compression/rle/read_write.go:52.2,54.32 2 0
@@ -524,7 +520,7 @@ github.com/ethereum/go-ethereum/compression/rle/read_write.go:54.32,55.19 1 0
github.com/ethereum/go-ethereum/compression/rle/read_write.go:58.4,58.7 1 0
github.com/ethereum/go-ethereum/compression/rle/read_write.go:55.19,56.10 1 0
github.com/ethereum/go-ethereum/compression/rle/read_write.go:62.64,64.4 1 0
-github.com/ethereum/go-ethereum/compression/rle/read_write.go:64.4,64.79 1 0
+github.com/ethereum/go-ethereum/compression/rle/read_write.go:64.5,64.79 1 0
github.com/ethereum/go-ethereum/compression/rle/read_write.go:64.79,66.4 1 0
github.com/ethereum/go-ethereum/compression/rle/read_write.go:73.34,77.19 3 0
github.com/ethereum/go-ethereum/compression/rle/read_write.go:83.2,83.20 1 0
@@ -632,7 +628,7 @@ github.com/ethereum/go-ethereum/crypto/keyring.go:84.2,84.39 1 0
github.com/ethereum/go-ethereum/crypto/keyring.go:70.45,73.23 3 0
github.com/ethereum/go-ethereum/crypto/keyring.go:79.3,79.23 1 0
github.com/ethereum/go-ethereum/crypto/keyring.go:73.23,75.4 1 0
-github.com/ethereum/go-ethereum/crypto/keyring.go:75.4,75.29 1 0
+github.com/ethereum/go-ethereum/crypto/keyring.go:75.5,75.29 1 0
github.com/ethereum/go-ethereum/crypto/keyring.go:75.29,77.4 1 0
github.com/ethereum/go-ethereum/crypto/keyring.go:79.23,81.4 1 0
github.com/ethereum/go-ethereum/crypto/keyring.go:87.61,89.27 2 0
@@ -663,6 +659,16 @@ github.com/ethereum/go-ethereum/crypto/mnemonic.go:53.3,53.12 1 8
github.com/ethereum/go-ethereum/crypto/mnemonic.go:56.3,57.32 2 8
github.com/ethereum/go-ethereum/crypto/mnemonic.go:50.12,52.4 1 4
github.com/ethereum/go-ethereum/crypto/mnemonic.go:53.12,55.4 1 2
+github.com/ethereum/go-ethereum/ethdb/memory_database.go:16.45,20.2 2 0
+github.com/ethereum/go-ethereum/ethdb/memory_database.go:22.54,24.2 1 0
+github.com/ethereum/go-ethereum/ethdb/memory_database.go:26.56,28.2 1 0
+github.com/ethereum/go-ethereum/ethdb/memory_database.go:38.49,42.2 2 0
+github.com/ethereum/go-ethereum/ethdb/memory_database.go:44.32,45.30 1 0
+github.com/ethereum/go-ethereum/ethdb/memory_database.go:45.30,49.3 3 0
+github.com/ethereum/go-ethereum/ethdb/memory_database.go:52.32,53.2 0 0
+github.com/ethereum/go-ethereum/ethdb/memory_database.go:55.45,58.35 2 0
+github.com/ethereum/go-ethereum/ethdb/memory_database.go:62.2,62.13 1 0
+github.com/ethereum/go-ethereum/ethdb/memory_database.go:58.35,60.3 1 0
github.com/ethereum/go-ethereum/ethdb/database.go:18.56,23.16 3 0
github.com/ethereum/go-ethereum/ethdb/database.go:27.2,29.22 2 0
github.com/ethereum/go-ethereum/ethdb/database.go:23.16,25.3 1 0
@@ -683,47 +689,105 @@ github.com/ethereum/go-ethereum/ethdb/database.go:70.58,72.2 1 0
github.com/ethereum/go-ethereum/ethdb/database.go:74.34,77.2 1 0
github.com/ethereum/go-ethereum/ethdb/database.go:79.34,81.18 2 0
github.com/ethereum/go-ethereum/ethdb/database.go:81.18,88.3 5 0
-github.com/ethereum/go-ethereum/ethdb/memory_database.go:16.45,20.2 2 0
-github.com/ethereum/go-ethereum/ethdb/memory_database.go:22.54,24.2 1 0
-github.com/ethereum/go-ethereum/ethdb/memory_database.go:26.56,28.2 1 0
-github.com/ethereum/go-ethereum/ethdb/memory_database.go:38.49,42.2 2 0
-github.com/ethereum/go-ethereum/ethdb/memory_database.go:44.32,45.30 1 0
-github.com/ethereum/go-ethereum/ethdb/memory_database.go:45.30,49.3 3 0
-github.com/ethereum/go-ethereum/ethdb/memory_database.go:52.32,53.2 0 0
-github.com/ethereum/go-ethereum/ethdb/memory_database.go:55.45,58.35 2 0
-github.com/ethereum/go-ethereum/ethdb/memory_database.go:62.2,62.13 1 0
-github.com/ethereum/go-ethereum/ethdb/memory_database.go:58.35,60.3 1 0
-github.com/ethereum/go-ethereum/ethutil/big.go:8.32,13.2 3 18
-github.com/ethereum/go-ethereum/ethutil/big.go:18.31,23.2 3 8
-github.com/ethereum/go-ethereum/ethutil/big.go:28.33,33.2 3 1
-github.com/ethereum/go-ethereum/ethutil/big.go:35.40,37.2 1 1
-github.com/ethereum/go-ethereum/ethutil/big.go:46.32,54.2 2 2
-github.com/ethereum/go-ethereum/ethutil/big.go:56.32,57.22 1 2
-github.com/ethereum/go-ethereum/ethutil/big.go:57.22,59.3 1 1
-github.com/ethereum/go-ethereum/ethutil/big.go:59.3,62.3 1 1
-github.com/ethereum/go-ethereum/ethutil/big.go:69.48,72.31 2 4
-github.com/ethereum/go-ethereum/ethutil/big.go:76.2,76.64 1 3
-github.com/ethereum/go-ethereum/ethutil/big.go:72.31,74.3 1 1
-github.com/ethereum/go-ethereum/ethutil/big.go:82.37,84.2 1 1
-github.com/ethereum/go-ethereum/ethutil/big.go:89.37,90.19 1 2
-github.com/ethereum/go-ethereum/ethutil/big.go:94.2,94.10 1 1
-github.com/ethereum/go-ethereum/ethutil/big.go:90.19,92.3 1 1
-github.com/ethereum/go-ethereum/ethutil/big.go:100.37,101.19 1 2
-github.com/ethereum/go-ethereum/ethutil/big.go:105.2,105.10 1 1
-github.com/ethereum/go-ethereum/ethutil/big.go:101.19,103.3 1 1
-github.com/ethereum/go-ethereum/ethutil/list.go:20.35,22.34 2 0
-github.com/ethereum/go-ethereum/ethutil/list.go:26.2,26.49 1 0
-github.com/ethereum/go-ethereum/ethutil/list.go:22.34,24.3 1 0
-github.com/ethereum/go-ethereum/ethutil/list.go:29.24,31.2 1 0
-github.com/ethereum/go-ethereum/ethutil/list.go:34.42,35.25 1 0
-github.com/ethereum/go-ethereum/ethutil/list.go:44.2,44.12 1 0
-github.com/ethereum/go-ethereum/ethutil/list.go:35.25,42.3 4 0
-github.com/ethereum/go-ethereum/ethutil/list.go:47.48,53.2 3 0
-github.com/ethereum/go-ethereum/ethutil/list.go:57.41,63.2 4 0
-github.com/ethereum/go-ethereum/ethutil/list.go:66.43,68.2 1 0
-github.com/ethereum/go-ethereum/ethutil/list.go:71.35,74.35 2 0
-github.com/ethereum/go-ethereum/ethutil/list.go:78.2,80.21 2 0
-github.com/ethereum/go-ethereum/ethutil/list.go:74.35,76.3 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:14.35,16.2 1 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:18.60,19.22 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:25.2,25.10 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:19.22,20.34 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:20.34,22.4 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:31.54,34.16 3 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:38.2,38.41 1 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:34.16,36.3 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:44.37,53.16 6 2
+github.com/ethereum/go-ethereum/ethutil/bytes.go:57.2,57.15 1 2
+github.com/ethereum/go-ethereum/ethutil/bytes.go:53.16,55.3 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:63.43,64.25 1 5
+github.com/ethereum/go-ethereum/ethutil/bytes.go:84.2,84.8 1 5
+github.com/ethereum/go-ethereum/ethutil/bytes.go:65.2,67.58 2 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:68.2,72.20 4 2
+github.com/ethereum/go-ethereum/ethutil/bytes.go:73.2,77.20 4 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:78.2,81.20 3 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:90.32,91.14 1 7
+github.com/ethereum/go-ethereum/ethutil/bytes.go:95.2,95.33 1 5
+github.com/ethereum/go-ethereum/ethutil/bytes.go:91.14,93.3 1 2
+github.com/ethereum/go-ethereum/ethutil/bytes.go:101.47,106.2 3 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:108.29,111.2 2 5
+github.com/ethereum/go-ethereum/ethutil/bytes.go:113.33,115.2 1 2
+github.com/ethereum/go-ethereum/ethutil/bytes.go:117.35,121.2 2 3
+github.com/ethereum/go-ethereum/ethutil/bytes.go:123.76,124.70 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:130.2,130.8 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:124.70,126.3 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:126.4,128.3 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:133.37,134.20 1 4
+github.com/ethereum/go-ethereum/ethutil/bytes.go:138.2,139.53 2 3
+github.com/ethereum/go-ethereum/ethutil/bytes.go:147.2,147.27 1 2
+github.com/ethereum/go-ethereum/ethutil/bytes.go:134.20,136.3 1 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:139.53,141.3 1 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:141.4,141.46 1 2
+github.com/ethereum/go-ethereum/ethutil/bytes.go:141.46,143.3 1 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:143.4,145.3 1 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:150.50,151.28 1 2
+github.com/ethereum/go-ethereum/ethutil/bytes.go:167.2,167.8 1 2
+github.com/ethereum/go-ethereum/ethutil/bytes.go:151.28,152.27 1 4
+github.com/ethereum/go-ethereum/ethutil/bytes.go:153.3,155.16 2 3
+github.com/ethereum/go-ethereum/ethutil/bytes.go:161.4,161.48 1 3
+github.com/ethereum/go-ethereum/ethutil/bytes.go:162.3,163.45 1 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:155.16,157.5 1 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:157.6,159.5 1 2
+github.com/ethereum/go-ethereum/ethutil/bytes.go:170.48,171.20 1 6
+github.com/ethereum/go-ethereum/ethutil/bytes.go:175.2,178.15 3 5
+github.com/ethereum/go-ethereum/ethutil/bytes.go:171.20,173.3 1 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:181.47,182.20 1 7
+github.com/ethereum/go-ethereum/ethutil/bytes.go:186.2,189.15 3 6
+github.com/ethereum/go-ethereum/ethutil/bytes.go:182.20,184.3 1 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:192.46,193.18 1 2
+github.com/ethereum/go-ethereum/ethutil/bytes.go:197.2,199.20 2 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:193.18,195.3 1 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:203.47,204.18 1 2
+github.com/ethereum/go-ethereum/ethutil/bytes.go:208.2,210.20 2 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:204.18,206.3 1 1
+github.com/ethereum/go-ethereum/ethutil/bytes.go:214.42,215.21 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:223.2,225.8 2 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:215.21,217.3 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:217.4,217.28 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:217.28,219.3 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:219.4,221.3 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:228.63,229.26 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:233.2,233.8 1 0
+github.com/ethereum/go-ethereum/ethutil/bytes.go:229.26,231.3 1 0
+github.com/ethereum/go-ethereum/ethutil/path.go:10.45,14.22 2 2
+github.com/ethereum/go-ethereum/ethutil/path.go:21.2,21.8 1 2
+github.com/ethereum/go-ethereum/ethutil/path.go:14.22,19.3 3 1
+github.com/ethereum/go-ethereum/ethutil/path.go:24.38,26.38 2 2
+github.com/ethereum/go-ethereum/ethutil/path.go:30.2,30.13 1 1
+github.com/ethereum/go-ethereum/ethutil/path.go:26.38,28.3 1 1
+github.com/ethereum/go-ethereum/ethutil/path.go:33.51,35.16 2 2
+github.com/ethereum/go-ethereum/ethutil/path.go:39.2,40.16 2 1
+github.com/ethereum/go-ethereum/ethutil/path.go:44.2,44.26 1 1
+github.com/ethereum/go-ethereum/ethutil/path.go:35.16,37.3 1 1
+github.com/ethereum/go-ethereum/ethutil/path.go:40.16,42.3 1 0
+github.com/ethereum/go-ethereum/ethutil/path.go:47.55,49.16 2 2
+github.com/ethereum/go-ethereum/ethutil/path.go:52.2,55.16 3 1
+github.com/ethereum/go-ethereum/ethutil/path.go:59.2,59.12 1 1
+github.com/ethereum/go-ethereum/ethutil/path.go:49.16,51.3 1 1
+github.com/ethereum/go-ethereum/ethutil/path.go:55.16,57.3 1 0
+github.com/ethereum/go-ethereum/ethutil/script_unix.go:15.66,16.21 1 0
+github.com/ethereum/go-ethereum/ethutil/script_unix.go:48.2,48.17 1 0
+github.com/ethereum/go-ethereum/ethutil/script_unix.go:16.21,19.41 2 0
+github.com/ethereum/go-ethereum/ethutil/script_unix.go:19.41,20.16 1 0
+github.com/ethereum/go-ethereum/ethutil/script_unix.go:21.4,23.19 2 0
+github.com/ethereum/go-ethereum/ethutil/script_unix.go:27.5,27.25 1 0
+github.com/ethereum/go-ethereum/ethutil/script_unix.go:23.19,25.6 1 0
+github.com/ethereum/go-ethereum/ethutil/script_unix.go:29.5,34.23 4 0
+github.com/ethereum/go-ethereum/ethutil/script_unix.go:44.4,44.24 1 0
+github.com/ethereum/go-ethereum/ethutil/script_unix.go:34.23,36.31 2 0
+github.com/ethereum/go-ethereum/ethutil/script_unix.go:41.5,41.39 1 0
+github.com/ethereum/go-ethereum/ethutil/script_unix.go:36.31,37.19 1 0
+github.com/ethereum/go-ethereum/ethutil/script_unix.go:37.19,39.7 1 0
+github.com/ethereum/go-ethereum/ethutil/size.go:7.41,8.20 1 3
+github.com/ethereum/go-ethereum/ethutil/size.go:8.20,10.3 1 1
+github.com/ethereum/go-ethereum/ethutil/size.go:10.4,10.24 1 2
+github.com/ethereum/go-ethereum/ethutil/size.go:10.24,12.3 1 1
+github.com/ethereum/go-ethereum/ethutil/size.go:12.4,14.3 1 1
github.com/ethereum/go-ethereum/ethutil/rlp.go:22.36,24.2 1 0
github.com/ethereum/go-ethereum/ethutil/rlp.go:30.34,34.2 2 0
github.com/ethereum/go-ethereum/ethutil/rlp.go:35.65,37.2 1 0
@@ -765,16 +829,16 @@ github.com/ethereum/go-ethereum/ethutil/rlp.go:153.3,155.41 1 8
github.com/ethereum/go-ethereum/ethutil/rlp.go:165.4,166.26 2 8
github.com/ethereum/go-ethereum/ethutil/rlp.go:169.4,170.25 2 8
github.com/ethereum/go-ethereum/ethutil/rlp.go:132.16,134.5 1 0
-github.com/ethereum/go-ethereum/ethutil/rlp.go:134.5,136.5 1 12
+github.com/ethereum/go-ethereum/ethutil/rlp.go:134.6,136.5 1 12
github.com/ethereum/go-ethereum/ethutil/rlp.go:140.35,142.5 1 11
-github.com/ethereum/go-ethereum/ethutil/rlp.go:142.5,142.26 1 9
+github.com/ethereum/go-ethereum/ethutil/rlp.go:142.6,142.26 1 9
github.com/ethereum/go-ethereum/ethutil/rlp.go:142.26,145.5 2 8
-github.com/ethereum/go-ethereum/ethutil/rlp.go:145.5,150.5 4 1
+github.com/ethereum/go-ethereum/ethutil/rlp.go:145.6,150.5 4 1
github.com/ethereum/go-ethereum/ethutil/rlp.go:155.41,156.20 1 8
github.com/ethereum/go-ethereum/ethutil/rlp.go:156.20,158.6 1 8
-github.com/ethereum/go-ethereum/ethutil/rlp.go:158.6,162.6 3 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:158.7,162.6 3 0
github.com/ethereum/go-ethereum/ethutil/rlp.go:166.26,168.5 1 19
-github.com/ethereum/go-ethereum/ethutil/rlp.go:172.3,175.3 1 0
+github.com/ethereum/go-ethereum/ethutil/rlp.go:172.4,175.3 1 0
github.com/ethereum/go-ethereum/ethutil/rlp.go:182.60,185.9 3 16
github.com/ethereum/go-ethereum/ethutil/rlp.go:241.2,241.17 1 0
github.com/ethereum/go-ethereum/ethutil/rlp.go:186.2,187.28 1 3
@@ -793,6 +857,50 @@ github.com/ethereum/go-ethereum/ethutil/set.go:15.24,17.3 1 0
github.com/ethereum/go-ethereum/ethutil/set.go:22.54,26.2 2 0
github.com/ethereum/go-ethereum/ethutil/set.go:28.50,32.2 2 0
github.com/ethereum/go-ethereum/ethutil/set.go:34.32,36.2 1 0
+github.com/ethereum/go-ethereum/ethutil/big.go:8.32,13.2 3 18
+github.com/ethereum/go-ethereum/ethutil/big.go:18.31,23.2 3 8
+github.com/ethereum/go-ethereum/ethutil/big.go:28.33,33.2 3 1
+github.com/ethereum/go-ethereum/ethutil/big.go:35.40,37.2 1 1
+github.com/ethereum/go-ethereum/ethutil/big.go:46.32,54.2 2 2
+github.com/ethereum/go-ethereum/ethutil/big.go:56.32,57.22 1 2
+github.com/ethereum/go-ethereum/ethutil/big.go:57.22,59.3 1 1
+github.com/ethereum/go-ethereum/ethutil/big.go:59.4,62.3 1 1
+github.com/ethereum/go-ethereum/ethutil/big.go:69.48,72.31 2 4
+github.com/ethereum/go-ethereum/ethutil/big.go:76.2,76.64 1 3
+github.com/ethereum/go-ethereum/ethutil/big.go:72.31,74.3 1 1
+github.com/ethereum/go-ethereum/ethutil/big.go:82.37,84.2 1 1
+github.com/ethereum/go-ethereum/ethutil/big.go:89.37,90.19 1 2
+github.com/ethereum/go-ethereum/ethutil/big.go:94.2,94.10 1 1
+github.com/ethereum/go-ethereum/ethutil/big.go:90.19,92.3 1 1
+github.com/ethereum/go-ethereum/ethutil/big.go:100.37,101.19 1 2
+github.com/ethereum/go-ethereum/ethutil/big.go:105.2,105.10 1 1
+github.com/ethereum/go-ethereum/ethutil/big.go:101.19,103.3 1 1
+github.com/ethereum/go-ethereum/ethutil/config.go:30.85,31.19 1 0
+github.com/ethereum/go-ethereum/ethutil/config.go:48.2,48.15 1 0
+github.com/ethereum/go-ethereum/ethutil/config.go:31.19,33.29 1 0
+github.com/ethereum/go-ethereum/ethutil/config.go:37.3,41.17 2 0
+github.com/ethereum/go-ethereum/ethutil/config.go:46.3,46.83 1 0
+github.com/ethereum/go-ethereum/ethutil/config.go:33.29,36.4 2 0
+github.com/ethereum/go-ethereum/ethutil/config.go:41.17,43.4 1 0
+github.com/ethereum/go-ethereum/ethutil/config.go:43.5,45.4 1 0
+github.com/ethereum/go-ethereum/ethutil/config.go:52.61,55.2 2 0
+github.com/ethereum/go-ethereum/ethutil/config.go:57.44,59.2 1 0
+github.com/ethereum/go-ethereum/ethutil/config.go:67.49,69.2 1 0
+github.com/ethereum/go-ethereum/ethutil/config.go:71.43,71.64 1 0
+github.com/ethereum/go-ethereum/ethutil/config.go:72.43,72.73 2 0
+github.com/ethereum/go-ethereum/ethutil/list.go:20.35,22.34 2 0
+github.com/ethereum/go-ethereum/ethutil/list.go:26.2,26.49 1 0
+github.com/ethereum/go-ethereum/ethutil/list.go:22.34,24.3 1 0
+github.com/ethereum/go-ethereum/ethutil/list.go:29.24,31.2 1 0
+github.com/ethereum/go-ethereum/ethutil/list.go:34.42,35.25 1 0
+github.com/ethereum/go-ethereum/ethutil/list.go:44.2,44.12 1 0
+github.com/ethereum/go-ethereum/ethutil/list.go:35.25,42.3 4 0
+github.com/ethereum/go-ethereum/ethutil/list.go:47.48,53.2 3 0
+github.com/ethereum/go-ethereum/ethutil/list.go:57.41,63.2 4 0
+github.com/ethereum/go-ethereum/ethutil/list.go:66.43,68.2 1 0
+github.com/ethereum/go-ethereum/ethutil/list.go:71.35,74.35 2 0
+github.com/ethereum/go-ethereum/ethutil/list.go:78.2,80.21 2 0
+github.com/ethereum/go-ethereum/ethutil/list.go:74.35,76.3 1 0
github.com/ethereum/go-ethereum/ethutil/package.go:33.44,35.16 2 0
github.com/ethereum/go-ethereum/ethutil/package.go:38.2,41.16 3 0
github.com/ethereum/go-ethereum/ethutil/package.go:45.2,45.21 1 0
@@ -801,7 +909,7 @@ github.com/ethereum/go-ethereum/ethutil/package.go:41.16,43.3 1 0
github.com/ethereum/go-ethereum/ethutil/package.go:51.48,55.49 3 0
github.com/ethereum/go-ethereum/ethutil/package.go:60.2,60.23 1 0
github.com/ethereum/go-ethereum/ethutil/package.go:55.49,56.3 0 0
-github.com/ethereum/go-ethereum/ethutil/package.go:56.3,56.23 1 0
+github.com/ethereum/go-ethereum/ethutil/package.go:56.4,56.23 1 0
github.com/ethereum/go-ethereum/ethutil/package.go:56.23,58.3 1 0
github.com/ethereum/go-ethereum/ethutil/package.go:66.66,69.26 2 0
github.com/ethereum/go-ethereum/ethutil/package.go:75.2,75.8 1 0
@@ -822,33 +930,6 @@ github.com/ethereum/go-ethereum/ethutil/package.go:102.16,104.3 1 0
github.com/ethereum/go-ethereum/ethutil/package.go:106.26,108.3 1 0
github.com/ethereum/go-ethereum/ethutil/package.go:111.20,113.3 1 0
github.com/ethereum/go-ethereum/ethutil/package.go:116.16,118.3 1 0
-github.com/ethereum/go-ethereum/ethutil/path.go:10.45,14.22 2 2
-github.com/ethereum/go-ethereum/ethutil/path.go:21.2,21.8 1 2
-github.com/ethereum/go-ethereum/ethutil/path.go:14.22,19.3 3 1
-github.com/ethereum/go-ethereum/ethutil/path.go:24.38,26.38 2 2
-github.com/ethereum/go-ethereum/ethutil/path.go:30.2,30.13 1 1
-github.com/ethereum/go-ethereum/ethutil/path.go:26.38,28.3 1 1
-github.com/ethereum/go-ethereum/ethutil/path.go:33.51,35.16 2 2
-github.com/ethereum/go-ethereum/ethutil/path.go:39.2,40.16 2 1
-github.com/ethereum/go-ethereum/ethutil/path.go:44.2,44.26 1 1
-github.com/ethereum/go-ethereum/ethutil/path.go:35.16,37.3 1 1
-github.com/ethereum/go-ethereum/ethutil/path.go:40.16,42.3 1 0
-github.com/ethereum/go-ethereum/ethutil/path.go:47.55,49.16 2 2
-github.com/ethereum/go-ethereum/ethutil/path.go:52.2,55.16 3 1
-github.com/ethereum/go-ethereum/ethutil/path.go:59.2,59.12 1 1
-github.com/ethereum/go-ethereum/ethutil/path.go:49.16,51.3 1 1
-github.com/ethereum/go-ethereum/ethutil/path.go:55.16,57.3 1 0
-github.com/ethereum/go-ethereum/ethutil/rand.go:9.48,12.17 3 2
-github.com/ethereum/go-ethereum/ethutil/rand.go:15.2,15.16 1 2
-github.com/ethereum/go-ethereum/ethutil/rand.go:18.2,18.40 1 2
-github.com/ethereum/go-ethereum/ethutil/rand.go:12.17,14.3 1 0
-github.com/ethereum/go-ethereum/ethutil/rand.go:15.16,17.3 1 0
-github.com/ethereum/go-ethereum/ethutil/rand.go:22.37,24.2 1 2
-github.com/ethereum/go-ethereum/ethutil/size.go:7.41,8.20 1 3
-github.com/ethereum/go-ethereum/ethutil/size.go:8.20,10.3 1 1
-github.com/ethereum/go-ethereum/ethutil/size.go:10.3,10.24 1 2
-github.com/ethereum/go-ethereum/ethutil/size.go:10.24,12.3 1 1
-github.com/ethereum/go-ethereum/ethutil/size.go:12.3,14.3 1 1
github.com/ethereum/go-ethereum/ethutil/common.go:9.23,11.2 1 2
github.com/ethereum/go-ethereum/ethutil/common.go:13.40,14.43 1 1
github.com/ethereum/go-ethereum/ethutil/common.go:17.2,17.13 1 1
@@ -865,97 +946,12 @@ github.com/ethereum/go-ethereum/ethutil/common.go:58.2,60.20 2 1
github.com/ethereum/go-ethereum/ethutil/common.go:61.2,63.20 2 2
github.com/ethereum/go-ethereum/ethutil/common.go:64.2,66.16 2 1
github.com/ethereum/go-ethereum/ethutil/common.go:70.27,72.3 1 2
-github.com/ethereum/go-ethereum/ethutil/config.go:30.85,31.19 1 0
-github.com/ethereum/go-ethereum/ethutil/config.go:48.2,48.15 1 0
-github.com/ethereum/go-ethereum/ethutil/config.go:31.19,33.29 1 0
-github.com/ethereum/go-ethereum/ethutil/config.go:37.3,41.17 2 0
-github.com/ethereum/go-ethereum/ethutil/config.go:46.3,46.83 1 0
-github.com/ethereum/go-ethereum/ethutil/config.go:33.29,36.4 2 0
-github.com/ethereum/go-ethereum/ethutil/config.go:41.17,43.4 1 0
-github.com/ethereum/go-ethereum/ethutil/config.go:43.4,45.4 1 0
-github.com/ethereum/go-ethereum/ethutil/config.go:52.61,55.2 2 0
-github.com/ethereum/go-ethereum/ethutil/config.go:57.44,59.2 1 0
-github.com/ethereum/go-ethereum/ethutil/config.go:67.49,69.2 1 0
-github.com/ethereum/go-ethereum/ethutil/config.go:71.43,71.64 1 0
-github.com/ethereum/go-ethereum/ethutil/config.go:72.43,72.73 2 0
-github.com/ethereum/go-ethereum/ethutil/script_unix.go:15.66,16.21 1 0
-github.com/ethereum/go-ethereum/ethutil/script_unix.go:48.2,48.17 1 0
-github.com/ethereum/go-ethereum/ethutil/script_unix.go:16.21,19.41 2 0
-github.com/ethereum/go-ethereum/ethutil/script_unix.go:19.41,20.16 1 0
-github.com/ethereum/go-ethereum/ethutil/script_unix.go:21.4,23.19 2 0
-github.com/ethereum/go-ethereum/ethutil/script_unix.go:27.5,27.25 1 0
-github.com/ethereum/go-ethereum/ethutil/script_unix.go:23.19,25.6 1 0
-github.com/ethereum/go-ethereum/ethutil/script_unix.go:29.4,34.23 4 0
-github.com/ethereum/go-ethereum/ethutil/script_unix.go:44.4,44.24 1 0
-github.com/ethereum/go-ethereum/ethutil/script_unix.go:34.23,36.31 2 0
-github.com/ethereum/go-ethereum/ethutil/script_unix.go:41.5,41.39 1 0
-github.com/ethereum/go-ethereum/ethutil/script_unix.go:36.31,37.19 1 0
-github.com/ethereum/go-ethereum/ethutil/script_unix.go:37.19,39.7 1 0
-github.com/ethereum/go-ethereum/ethutil/bytes.go:14.35,16.2 1 1
-github.com/ethereum/go-ethereum/ethutil/bytes.go:18.60,19.22 1 0
-github.com/ethereum/go-ethereum/ethutil/bytes.go:25.2,25.10 1 0
-github.com/ethereum/go-ethereum/ethutil/bytes.go:19.22,20.34 1 0
-github.com/ethereum/go-ethereum/ethutil/bytes.go:20.34,22.4 1 0
-github.com/ethereum/go-ethereum/ethutil/bytes.go:31.54,34.16 3 1
-github.com/ethereum/go-ethereum/ethutil/bytes.go:38.2,38.41 1 1
-github.com/ethereum/go-ethereum/ethutil/bytes.go:34.16,36.3 1 0
-github.com/ethereum/go-ethereum/ethutil/bytes.go:44.37,53.16 6 2
-github.com/ethereum/go-ethereum/ethutil/bytes.go:57.2,57.15 1 2
-github.com/ethereum/go-ethereum/ethutil/bytes.go:53.16,55.3 1 0
-github.com/ethereum/go-ethereum/ethutil/bytes.go:63.43,64.25 1 5
-github.com/ethereum/go-ethereum/ethutil/bytes.go:84.2,84.8 1 5
-github.com/ethereum/go-ethereum/ethutil/bytes.go:65.2,67.58 2 1
-github.com/ethereum/go-ethereum/ethutil/bytes.go:68.2,72.20 4 2
-github.com/ethereum/go-ethereum/ethutil/bytes.go:73.2,77.20 4 1
-github.com/ethereum/go-ethereum/ethutil/bytes.go:78.2,81.20 3 1
-github.com/ethereum/go-ethereum/ethutil/bytes.go:90.32,91.14 1 7
-github.com/ethereum/go-ethereum/ethutil/bytes.go:95.2,95.33 1 5
-github.com/ethereum/go-ethereum/ethutil/bytes.go:91.14,93.3 1 2
-github.com/ethereum/go-ethereum/ethutil/bytes.go:101.47,106.2 3 1
-github.com/ethereum/go-ethereum/ethutil/bytes.go:108.29,111.2 2 5
-github.com/ethereum/go-ethereum/ethutil/bytes.go:113.33,115.2 1 2
-github.com/ethereum/go-ethereum/ethutil/bytes.go:117.35,121.2 2 3
-github.com/ethereum/go-ethereum/ethutil/bytes.go:123.76,124.70 1 0
-github.com/ethereum/go-ethereum/ethutil/bytes.go:130.2,130.8 1 0
-github.com/ethereum/go-ethereum/ethutil/bytes.go:124.70,126.3 1 0
-github.com/ethereum/go-ethereum/ethutil/bytes.go:126.3,128.3 1 0
-github.com/ethereum/go-ethereum/ethutil/bytes.go:133.37,134.20 1 4
-github.com/ethereum/go-ethereum/ethutil/bytes.go:138.2,139.53 2 3
-github.com/ethereum/go-ethereum/ethutil/bytes.go:147.2,147.27 1 2
-github.com/ethereum/go-ethereum/ethutil/bytes.go:134.20,136.3 1 1
-github.com/ethereum/go-ethereum/ethutil/bytes.go:139.53,141.3 1 1
-github.com/ethereum/go-ethereum/ethutil/bytes.go:141.3,141.46 1 2
-github.com/ethereum/go-ethereum/ethutil/bytes.go:141.46,143.3 1 1
-github.com/ethereum/go-ethereum/ethutil/bytes.go:143.3,145.3 1 1
-github.com/ethereum/go-ethereum/ethutil/bytes.go:150.50,151.28 1 2
-github.com/ethereum/go-ethereum/ethutil/bytes.go:167.2,167.8 1 2
-github.com/ethereum/go-ethereum/ethutil/bytes.go:151.28,152.27 1 4
-github.com/ethereum/go-ethereum/ethutil/bytes.go:153.3,155.16 2 3
-github.com/ethereum/go-ethereum/ethutil/bytes.go:161.4,161.48 1 3
-github.com/ethereum/go-ethereum/ethutil/bytes.go:162.3,163.45 1 1
-github.com/ethereum/go-ethereum/ethutil/bytes.go:155.16,157.5 1 1
-github.com/ethereum/go-ethereum/ethutil/bytes.go:157.5,159.5 1 2
-github.com/ethereum/go-ethereum/ethutil/bytes.go:170.48,171.20 1 6
-github.com/ethereum/go-ethereum/ethutil/bytes.go:175.2,178.15 3 5
-github.com/ethereum/go-ethereum/ethutil/bytes.go:171.20,173.3 1 1
-github.com/ethereum/go-ethereum/ethutil/bytes.go:181.47,182.20 1 7
-github.com/ethereum/go-ethereum/ethutil/bytes.go:186.2,189.15 3 6
-github.com/ethereum/go-ethereum/ethutil/bytes.go:182.20,184.3 1 1
-github.com/ethereum/go-ethereum/ethutil/bytes.go:192.46,193.18 1 2
-github.com/ethereum/go-ethereum/ethutil/bytes.go:197.2,199.20 2 1
-github.com/ethereum/go-ethereum/ethutil/bytes.go:193.18,195.3 1 1
-github.com/ethereum/go-ethereum/ethutil/bytes.go:203.47,204.18 1 2
-github.com/ethereum/go-ethereum/ethutil/bytes.go:208.2,210.20 2 1
-github.com/ethereum/go-ethereum/ethutil/bytes.go:204.18,206.3 1 1
-github.com/ethereum/go-ethereum/ethutil/bytes.go:214.42,215.21 1 0
-github.com/ethereum/go-ethereum/ethutil/bytes.go:223.2,225.8 2 0
-github.com/ethereum/go-ethereum/ethutil/bytes.go:215.21,217.3 1 0
-github.com/ethereum/go-ethereum/ethutil/bytes.go:217.3,217.28 1 0
-github.com/ethereum/go-ethereum/ethutil/bytes.go:217.28,219.3 1 0
-github.com/ethereum/go-ethereum/ethutil/bytes.go:219.3,221.3 1 0
-github.com/ethereum/go-ethereum/ethutil/bytes.go:228.63,229.26 1 0
-github.com/ethereum/go-ethereum/ethutil/bytes.go:233.2,233.8 1 0
-github.com/ethereum/go-ethereum/ethutil/bytes.go:229.26,231.3 1 0
+github.com/ethereum/go-ethereum/ethutil/rand.go:9.48,12.17 3 2
+github.com/ethereum/go-ethereum/ethutil/rand.go:15.2,15.16 1 2
+github.com/ethereum/go-ethereum/ethutil/rand.go:18.2,18.40 1 2
+github.com/ethereum/go-ethereum/ethutil/rand.go:12.17,14.3 1 0
+github.com/ethereum/go-ethereum/ethutil/rand.go:15.16,17.3 1 0
+github.com/ethereum/go-ethereum/ethutil/rand.go:22.37,24.2 1 2
github.com/ethereum/go-ethereum/ethutil/value.go:19.35,21.2 1 0
github.com/ethereum/go-ethereum/ethutil/value.go:23.39,25.31 2 39
github.com/ethereum/go-ethereum/ethutil/value.go:29.2,29.23 1 39
@@ -970,44 +966,44 @@ github.com/ethereum/go-ethereum/ethutil/value.go:53.43,55.2 1 1
github.com/ethereum/go-ethereum/ethutil/value.go:57.33,58.36 1 11
github.com/ethereum/go-ethereum/ethutil/value.go:80.2,80.10 1 0
github.com/ethereum/go-ethereum/ethutil/value.go:58.36,60.3 1 1
-github.com/ethereum/go-ethereum/ethutil/value.go:60.3,60.44 1 10
+github.com/ethereum/go-ethereum/ethutil/value.go:60.4,60.44 1 10
github.com/ethereum/go-ethereum/ethutil/value.go:60.44,62.3 1 0
-github.com/ethereum/go-ethereum/ethutil/value.go:62.3,62.44 1 10
+github.com/ethereum/go-ethereum/ethutil/value.go:62.4,62.44 1 10
github.com/ethereum/go-ethereum/ethutil/value.go:62.44,64.3 1 0
-github.com/ethereum/go-ethereum/ethutil/value.go:64.3,64.44 1 10
+github.com/ethereum/go-ethereum/ethutil/value.go:64.4,64.44 1 10
github.com/ethereum/go-ethereum/ethutil/value.go:64.44,66.3 1 0
-github.com/ethereum/go-ethereum/ethutil/value.go:66.3,66.45 1 10
+github.com/ethereum/go-ethereum/ethutil/value.go:66.4,66.45 1 10
github.com/ethereum/go-ethereum/ethutil/value.go:66.45,68.3 1 0
-github.com/ethereum/go-ethereum/ethutil/value.go:68.3,68.45 1 10
+github.com/ethereum/go-ethereum/ethutil/value.go:68.4,68.45 1 10
github.com/ethereum/go-ethereum/ethutil/value.go:68.45,70.3 1 0
-github.com/ethereum/go-ethereum/ethutil/value.go:70.3,70.41 1 10
+github.com/ethereum/go-ethereum/ethutil/value.go:70.4,70.41 1 10
github.com/ethereum/go-ethereum/ethutil/value.go:70.41,72.3 1 10
-github.com/ethereum/go-ethereum/ethutil/value.go:72.3,72.42 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:72.4,72.42 1 0
github.com/ethereum/go-ethereum/ethutil/value.go:72.42,74.3 1 0
-github.com/ethereum/go-ethereum/ethutil/value.go:74.3,74.44 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:74.4,74.44 1 0
github.com/ethereum/go-ethereum/ethutil/value.go:74.44,76.3 1 0
-github.com/ethereum/go-ethereum/ethutil/value.go:76.3,76.46 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:76.4,76.46 1 0
github.com/ethereum/go-ethereum/ethutil/value.go:76.46,78.3 1 0
github.com/ethereum/go-ethereum/ethutil/value.go:83.31,84.35 1 3
github.com/ethereum/go-ethereum/ethutil/value.go:107.2,107.10 1 0
github.com/ethereum/go-ethereum/ethutil/value.go:84.35,86.3 1 0
-github.com/ethereum/go-ethereum/ethutil/value.go:86.3,86.43 1 3
+github.com/ethereum/go-ethereum/ethutil/value.go:86.4,86.43 1 3
github.com/ethereum/go-ethereum/ethutil/value.go:86.43,88.3 1 0
-github.com/ethereum/go-ethereum/ethutil/value.go:88.3,88.43 1 3
+github.com/ethereum/go-ethereum/ethutil/value.go:88.4,88.43 1 3
github.com/ethereum/go-ethereum/ethutil/value.go:88.43,90.3 1 0
-github.com/ethereum/go-ethereum/ethutil/value.go:90.3,90.43 1 3
+github.com/ethereum/go-ethereum/ethutil/value.go:90.4,90.43 1 3
github.com/ethereum/go-ethereum/ethutil/value.go:90.43,92.3 1 0
-github.com/ethereum/go-ethereum/ethutil/value.go:92.3,92.41 1 3
+github.com/ethereum/go-ethereum/ethutil/value.go:92.4,92.41 1 3
github.com/ethereum/go-ethereum/ethutil/value.go:92.41,94.3 1 2
-github.com/ethereum/go-ethereum/ethutil/value.go:94.3,94.45 1 1
+github.com/ethereum/go-ethereum/ethutil/value.go:94.4,94.45 1 1
github.com/ethereum/go-ethereum/ethutil/value.go:94.45,96.3 1 0
-github.com/ethereum/go-ethereum/ethutil/value.go:96.3,96.45 1 1
+github.com/ethereum/go-ethereum/ethutil/value.go:96.4,96.45 1 1
github.com/ethereum/go-ethereum/ethutil/value.go:96.45,98.3 1 0
-github.com/ethereum/go-ethereum/ethutil/value.go:98.3,98.44 1 1
+github.com/ethereum/go-ethereum/ethutil/value.go:98.4,98.44 1 1
github.com/ethereum/go-ethereum/ethutil/value.go:98.44,100.3 1 0
-github.com/ethereum/go-ethereum/ethutil/value.go:100.3,100.46 1 1
+github.com/ethereum/go-ethereum/ethutil/value.go:100.4,100.46 1 1
github.com/ethereum/go-ethereum/ethutil/value.go:100.46,102.3 1 0
-github.com/ethereum/go-ethereum/ethutil/value.go:102.3,102.44 1 1
+github.com/ethereum/go-ethereum/ethutil/value.go:102.4,102.44 1 1
github.com/ethereum/go-ethereum/ethutil/value.go:102.44,105.3 2 1
github.com/ethereum/go-ethereum/ethutil/value.go:110.31,111.35 1 0
github.com/ethereum/go-ethereum/ethutil/value.go:115.2,115.12 1 0
@@ -1015,28 +1011,28 @@ github.com/ethereum/go-ethereum/ethutil/value.go:111.35,113.3 1 0
github.com/ethereum/go-ethereum/ethutil/value.go:118.37,119.35 1 10
github.com/ethereum/go-ethereum/ethutil/value.go:131.2,131.22 1 0
github.com/ethereum/go-ethereum/ethutil/value.go:119.35,123.3 2 1
-github.com/ethereum/go-ethereum/ethutil/value.go:123.3,123.44 1 9
+github.com/ethereum/go-ethereum/ethutil/value.go:123.4,123.44 1 9
github.com/ethereum/go-ethereum/ethutil/value.go:123.44,125.3 1 3
-github.com/ethereum/go-ethereum/ethutil/value.go:125.3,125.42 1 6
+github.com/ethereum/go-ethereum/ethutil/value.go:125.4,125.42 1 6
github.com/ethereum/go-ethereum/ethutil/value.go:125.42,127.3 1 0
-github.com/ethereum/go-ethereum/ethutil/value.go:127.3,129.3 1 6
+github.com/ethereum/go-ethereum/ethutil/value.go:127.4,129.3 1 6
github.com/ethereum/go-ethereum/ethutil/value.go:134.32,135.35 1 2
github.com/ethereum/go-ethereum/ethutil/value.go:143.2,143.11 1 0
github.com/ethereum/go-ethereum/ethutil/value.go:135.35,137.3 1 1
-github.com/ethereum/go-ethereum/ethutil/value.go:137.3,137.42 1 1
+github.com/ethereum/go-ethereum/ethutil/value.go:137.4,137.42 1 1
github.com/ethereum/go-ethereum/ethutil/value.go:137.42,139.3 1 1
-github.com/ethereum/go-ethereum/ethutil/value.go:139.3,139.40 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:139.4,139.40 1 0
github.com/ethereum/go-ethereum/ethutil/value.go:139.40,141.3 1 0
github.com/ethereum/go-ethereum/ethutil/value.go:146.34,147.35 1 10
github.com/ethereum/go-ethereum/ethutil/value.go:159.2,159.17 1 0
github.com/ethereum/go-ethereum/ethutil/value.go:147.35,149.3 1 6
-github.com/ethereum/go-ethereum/ethutil/value.go:149.3,149.40 1 4
+github.com/ethereum/go-ethereum/ethutil/value.go:149.4,149.40 1 4
github.com/ethereum/go-ethereum/ethutil/value.go:149.40,151.3 1 0
-github.com/ethereum/go-ethereum/ethutil/value.go:151.3,151.42 1 4
+github.com/ethereum/go-ethereum/ethutil/value.go:151.4,151.42 1 4
github.com/ethereum/go-ethereum/ethutil/value.go:151.42,153.3 1 0
-github.com/ethereum/go-ethereum/ethutil/value.go:153.3,153.44 1 4
+github.com/ethereum/go-ethereum/ethutil/value.go:153.4,153.44 1 4
github.com/ethereum/go-ethereum/ethutil/value.go:153.44,155.3 1 2
-github.com/ethereum/go-ethereum/ethutil/value.go:155.3,157.3 1 2
+github.com/ethereum/go-ethereum/ethutil/value.go:155.4,157.3 1 2
github.com/ethereum/go-ethereum/ethutil/value.go:162.31,163.36 1 0
github.com/ethereum/go-ethereum/ethutil/value.go:167.2,167.12 1 0
github.com/ethereum/go-ethereum/ethutil/value.go:163.36,165.3 1 0
@@ -1075,7 +1071,7 @@ github.com/ethereum/go-ethereum/ethutil/value.go:301.2,301.13 1 0
github.com/ethereum/go-ethereum/ethutil/value.go:289.14,290.41 1 0
github.com/ethereum/go-ethereum/ethutil/value.go:290.41,291.30 1 0
github.com/ethereum/go-ethereum/ethutil/value.go:291.30,293.5 1 0
-github.com/ethereum/go-ethereum/ethutil/value.go:294.4,294.43 1 0
+github.com/ethereum/go-ethereum/ethutil/value.go:294.5,294.43 1 0
github.com/ethereum/go-ethereum/ethutil/value.go:294.43,295.30 1 0
github.com/ethereum/go-ethereum/ethutil/value.go:295.30,297.5 1 0
github.com/ethereum/go-ethereum/ethutil/value.go:304.26,306.2 1 3
@@ -1100,3 +1096,1943 @@ github.com/ethereum/go-ethereum/ethutil/value.go:389.2,392.13 3 3
github.com/ethereum/go-ethereum/ethutil/value.go:385.30,387.3 1 1
github.com/ethereum/go-ethereum/ethutil/value.go:395.41,397.2 1 3
github.com/ethereum/go-ethereum/ethutil/value.go:399.36,401.2 1 0
+github.com/ethereum/go-ethereum/event/event.go:41.66,45.17 4 1005
+github.com/ethereum/go-ethereum/event/event.go:63.2,63.12 1 1004
+github.com/ethereum/go-ethereum/event/event.go:45.17,47.3 1 1
+github.com/ethereum/go-ethereum/event/event.go:47.4,48.22 1 1004
+github.com/ethereum/go-ethereum/event/event.go:51.3,51.27 1 1004
+github.com/ethereum/go-ethereum/event/event.go:48.22,50.4 1 5
+github.com/ethereum/go-ethereum/event/event.go:51.27,54.32 3 1006
+github.com/ethereum/go-ethereum/event/event.go:57.4,60.25 4 1005
+github.com/ethereum/go-ethereum/event/event.go:54.32,56.5 1 1
+github.com/ethereum/go-ethereum/event/event.go:68.48,71.17 3 6657815
+github.com/ethereum/go-ethereum/event/event.go:75.2,77.27 3 6657811
+github.com/ethereum/go-ethereum/event/event.go:80.2,80.12 1 6657811
+github.com/ethereum/go-ethereum/event/event.go:71.17,74.3 2 4
+github.com/ethereum/go-ethereum/event/event.go:77.27,79.3 1 4004
+github.com/ethereum/go-ethereum/event/event.go:86.28,88.32 2 5
+github.com/ethereum/go-ethereum/event/event.go:93.2,95.20 3 5
+github.com/ethereum/go-ethereum/event/event.go:88.32,89.28 1 3
+github.com/ethereum/go-ethereum/event/event.go:89.28,91.4 1 3
+github.com/ethereum/go-ethereum/event/event.go:98.36,100.34 2 1001
+github.com/ethereum/go-ethereum/event/event.go:109.2,109.22 1 1001
+github.com/ethereum/go-ethereum/event/event.go:100.34,101.37 1 1001
+github.com/ethereum/go-ethereum/event/event.go:101.37,102.22 1 1001
+github.com/ethereum/go-ethereum/event/event.go:102.22,104.5 1 5
+github.com/ethereum/go-ethereum/event/event.go:104.6,106.5 1 996
+github.com/ethereum/go-ethereum/event/event.go:112.46,113.26 1 2007
+github.com/ethereum/go-ethereum/event/event.go:118.2,118.11 1 1005
+github.com/ethereum/go-ethereum/event/event.go:113.26,114.16 1 17982
+github.com/ethereum/go-ethereum/event/event.go:114.16,116.4 1 1002
+github.com/ethereum/go-ethereum/event/event.go:121.52,126.2 4 996
+github.com/ethereum/go-ethereum/event/event.go:142.35,150.2 2 1005
+github.com/ethereum/go-ethereum/event/event.go:152.44,154.2 1 1003
+github.com/ethereum/go-ethereum/event/event.go:156.32,159.2 2 1001
+github.com/ethereum/go-ethereum/event/event.go:161.30,164.14 3 1004
+github.com/ethereum/go-ethereum/event/event.go:167.2,173.19 6 1003
+github.com/ethereum/go-ethereum/event/event.go:164.14,166.3 1 1
+github.com/ethereum/go-ethereum/event/event.go:176.42,178.9 2 4004
+github.com/ethereum/go-ethereum/event/event.go:182.2,182.20 1 4004
+github.com/ethereum/go-ethereum/event/event.go:179.2,179.21 0 1004
+github.com/ethereum/go-ethereum/event/event.go:180.2,180.19 0 3000
+github.com/ethereum/go-ethereum/logger/loggers.go:56.13,58.2 1 1
+github.com/ethereum/go-ethereum/logger/loggers.go:64.21,70.36 2 1
+github.com/ethereum/go-ethereum/logger/loggers.go:77.2,77.6 1 1
+github.com/ethereum/go-ethereum/logger/loggers.go:70.36,75.3 4 22
+github.com/ethereum/go-ethereum/logger/loggers.go:77.6,78.10 1 52
+github.com/ethereum/go-ethereum/logger/loggers.go:79.3,80.31 1 20
+github.com/ethereum/go-ethereum/logger/loggers.go:84.3,86.19 2 16
+github.com/ethereum/go-ethereum/logger/loggers.go:88.3,90.31 1 7
+github.com/ethereum/go-ethereum/logger/loggers.go:93.4,96.17 4 7
+github.com/ethereum/go-ethereum/logger/loggers.go:98.3,100.31 1 8
+github.com/ethereum/go-ethereum/logger/loggers.go:103.4,105.32 3 8
+github.com/ethereum/go-ethereum/logger/loggers.go:108.4,108.17 1 8
+github.com/ethereum/go-ethereum/logger/loggers.go:80.31,82.5 1 19
+github.com/ethereum/go-ethereum/logger/loggers.go:90.31,92.5 1 6
+github.com/ethereum/go-ethereum/logger/loggers.go:100.31,102.5 1 6
+github.com/ethereum/go-ethereum/logger/loggers.go:105.32,107.5 1 6
+github.com/ethereum/go-ethereum/logger/loggers.go:113.68,114.22 1 22
+github.com/ethereum/go-ethereum/logger/loggers.go:119.2,119.11 1 12
+github.com/ethereum/go-ethereum/logger/loggers.go:114.22,115.37 1 19
+github.com/ethereum/go-ethereum/logger/loggers.go:115.37,117.4 1 14
+github.com/ethereum/go-ethereum/logger/loggers.go:124.14,128.2 3 7
+github.com/ethereum/go-ethereum/logger/loggers.go:132.14,136.2 3 8
+github.com/ethereum/go-ethereum/logger/loggers.go:139.34,141.2 1 16
+github.com/ethereum/go-ethereum/logger/loggers.go:150.36,152.2 1 7
+github.com/ethereum/go-ethereum/logger/loggers.go:154.64,156.2 1 10
+github.com/ethereum/go-ethereum/logger/loggers.go:158.78,160.2 1 10
+github.com/ethereum/go-ethereum/logger/loggers.go:163.49,165.2 1 2
+github.com/ethereum/go-ethereum/logger/loggers.go:168.48,170.2 1 4
+github.com/ethereum/go-ethereum/logger/loggers.go:173.48,175.2 1 3
+github.com/ethereum/go-ethereum/logger/loggers.go:178.49,180.2 1 1
+github.com/ethereum/go-ethereum/logger/loggers.go:183.55,185.2 1 0
+github.com/ethereum/go-ethereum/logger/loggers.go:188.63,190.2 1 7
+github.com/ethereum/go-ethereum/logger/loggers.go:193.62,195.2 1 1
+github.com/ethereum/go-ethereum/logger/loggers.go:198.62,200.2 1 1
+github.com/ethereum/go-ethereum/logger/loggers.go:203.63,205.2 1 1
+github.com/ethereum/go-ethereum/logger/loggers.go:208.69,210.2 1 0
+github.com/ethereum/go-ethereum/logger/loggers.go:213.49,217.2 3 0
+github.com/ethereum/go-ethereum/logger/loggers.go:220.63,224.2 3 0
+github.com/ethereum/go-ethereum/logger/loggers.go:228.77,231.2 2 11
+github.com/ethereum/go-ethereum/logger/loggers.go:238.61,240.2 1 2
+github.com/ethereum/go-ethereum/logger/loggers.go:242.48,244.2 1 0
+github.com/ethereum/go-ethereum/logger/loggers.go:246.47,248.2 1 2
+github.com/ethereum/go-ethereum/p2p/client_identity.go:23.133,34.2 2 6
+github.com/ethereum/go-ethereum/p2p/client_identity.go:36.39,37.2 0 0
+github.com/ethereum/go-ethereum/p2p/client_identity.go:39.48,41.33 2 11
+github.com/ethereum/go-ethereum/p2p/client_identity.go:45.2,50.20 1 11
+github.com/ethereum/go-ethereum/p2p/client_identity.go:41.33,43.3 1 11
+github.com/ethereum/go-ethereum/p2p/client_identity.go:53.48,55.2 1 23
+github.com/ethereum/go-ethereum/p2p/client_identity.go:57.77,59.2 1 1
+github.com/ethereum/go-ethereum/p2p/client_identity.go:61.61,63.2 1 2
+github.com/ethereum/go-ethereum/p2p/natpmp.go:21.42,23.2 1 0
+github.com/ethereum/go-ethereum/p2p/natpmp.go:25.70,27.16 2 0
+github.com/ethereum/go-ethereum/p2p/natpmp.go:30.2,32.8 3 0
+github.com/ethereum/go-ethereum/p2p/natpmp.go:27.16,29.3 1 0
+github.com/ethereum/go-ethereum/p2p/natpmp.go:36.71,37.18 1 0
+github.com/ethereum/go-ethereum/p2p/natpmp.go:42.2,43.16 2 0
+github.com/ethereum/go-ethereum/p2p/natpmp.go:46.2,47.8 2 0
+github.com/ethereum/go-ethereum/p2p/natpmp.go:37.18,40.3 2 0
+github.com/ethereum/go-ethereum/p2p/natpmp.go:43.16,45.3 1 0
+github.com/ethereum/go-ethereum/p2p/natpmp.go:50.103,55.2 2 0
+github.com/ethereum/go-ethereum/p2p/peer_error.go:60.79,62.9 2 17
+github.com/ethereum/go-ethereum/p2p/peer_error.go:65.2,67.34 3 17
+github.com/ethereum/go-ethereum/p2p/peer_error.go:62.9,64.3 1 0
+github.com/ethereum/go-ethereum/p2p/peer_error.go:70.39,72.2 1 15
+github.com/ethereum/go-ethereum/p2p/peer_error.go:74.44,76.2 1 19
+github.com/ethereum/go-ethereum/p2p/protocol.go:81.37,82.38 1 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:86.2,86.30 1 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:82.38,84.3 1 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:95.48,101.2 2 10
+github.com/ethereum/go-ethereum/p2p/protocol.go:103.35,104.22 1 10
+github.com/ethereum/go-ethereum/p2p/protocol.go:104.22,112.3 2 7
+github.com/ethereum/go-ethereum/p2p/protocol.go:115.34,116.2 0 10
+github.com/ethereum/go-ethereum/p2p/protocol.go:118.34,121.2 2 6
+github.com/ethereum/go-ethereum/p2p/protocol.go:123.37,125.2 1 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:127.41,129.2 1 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:131.44,133.2 1 16
+github.com/ethereum/go-ethereum/p2p/protocol.go:135.64,138.25 3 8
+github.com/ethereum/go-ethereum/p2p/protocol.go:138.25,140.3 1 8
+github.com/ethereum/go-ethereum/p2p/protocol.go:140.4,142.3 1 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:145.66,146.32 1 3
+github.com/ethereum/go-ethereum/p2p/protocol.go:176.2,176.17 1 1
+github.com/ethereum/go-ethereum/p2p/protocol.go:146.32,148.3 1 1
+github.com/ethereum/go-ethereum/p2p/protocol.go:148.4,149.42 1 2
+github.com/ethereum/go-ethereum/p2p/protocol.go:154.3,154.21 1 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:149.42,153.4 3 2
+github.com/ethereum/go-ethereum/p2p/protocol.go:155.3,160.5 2 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:161.3,163.19 2 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:164.3,164.16 0 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:165.3,167.65 1 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:170.3,171.25 1 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:172.3,173.73 1 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:167.65,169.5 1 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:179.62,183.2 2 21
+github.com/ethereum/go-ethereum/p2p/protocol.go:185.91,189.22 4 2
+github.com/ethereum/go-ethereum/p2p/protocol.go:189.22,191.3 1 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:194.49,196.16 2 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:196.16,201.3 4 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:204.53,207.29 3 1
+github.com/ethereum/go-ethereum/p2p/protocol.go:212.2,224.30 4 1
+github.com/ethereum/go-ethereum/p2p/protocol.go:230.2,230.22 1 1
+github.com/ethereum/go-ethereum/p2p/protocol.go:235.2,235.23 1 1
+github.com/ethereum/go-ethereum/p2p/protocol.go:241.2,241.82 1 1
+github.com/ethereum/go-ethereum/p2p/protocol.go:247.2,247.77 1 1
+github.com/ethereum/go-ethereum/p2p/protocol.go:253.2,253.23 1 1
+github.com/ethereum/go-ethereum/p2p/protocol.go:263.2,264.20 2 1
+github.com/ethereum/go-ethereum/p2p/protocol.go:268.2,277.8 5 1
+github.com/ethereum/go-ethereum/p2p/protocol.go:207.29,210.3 2 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:224.30,227.3 2 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:230.22,233.3 2 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:235.23,238.3 2 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:241.82,244.3 2 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:247.77,250.3 2 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:253.23,255.57 2 1
+github.com/ethereum/go-ethereum/p2p/protocol.go:255.57,258.4 2 0
+github.com/ethereum/go-ethereum/p2p/protocol.go:258.5,260.4 1 1
+github.com/ethereum/go-ethereum/p2p/protocol.go:264.20,267.3 2 3
+github.com/ethereum/go-ethereum/p2p/server.go:32.35,36.2 1 6
+github.com/ethereum/go-ethereum/p2p/server.go:38.60,43.9 5 0
+github.com/ethereum/go-ethereum/p2p/server.go:46.2,46.15 1 0
+github.com/ethereum/go-ethereum/p2p/server.go:43.9,45.3 1 0
+github.com/ethereum/go-ethereum/p2p/server.go:49.59,54.2 4 1
+github.com/ethereum/go-ethereum/p2p/server.go:56.52,61.2 4 0
+github.com/ethereum/go-ethereum/p2p/server.go:63.55,68.2 4 0
+github.com/ethereum/go-ethereum/p2p/server.go:98.129,101.33 2 5
+github.com/ethereum/go-ethereum/p2p/server.go:104.2,130.32 5 5
+github.com/ethereum/go-ethereum/p2p/server.go:133.2,133.13 1 5
+github.com/ethereum/go-ethereum/p2p/server.go:101.33,103.3 1 3
+github.com/ethereum/go-ethereum/p2p/server.go:130.32,132.3 1 10
+github.com/ethereum/go-ethereum/p2p/server.go:136.79,139.2 2 0
+github.com/ethereum/go-ethereum/p2p/server.go:141.74,144.2 2 0
+github.com/ethereum/go-ethereum/p2p/server.go:146.53,148.2 1 1
+github.com/ethereum/go-ethereum/p2p/server.go:150.58,155.16 4 1
+github.com/ethereum/go-ethereum/p2p/server.go:168.2,168.8 1 1
+github.com/ethereum/go-ethereum/p2p/server.go:155.16,157.37 2 1
+github.com/ethereum/go-ethereum/p2p/server.go:161.3,161.25 1 1
+github.com/ethereum/go-ethereum/p2p/server.go:157.37,160.4 2 2
+github.com/ethereum/go-ethereum/p2p/server.go:161.25,163.4 1 0
+github.com/ethereum/go-ethereum/p2p/server.go:163.5,166.4 2 1
+github.com/ethereum/go-ethereum/p2p/server.go:171.45,174.34 3 0
+github.com/ethereum/go-ethereum/p2p/server.go:179.2,179.8 1 0
+github.com/ethereum/go-ethereum/p2p/server.go:174.34,175.18 1 0
+github.com/ethereum/go-ethereum/p2p/server.go:175.18,177.4 1 0
+github.com/ethereum/go-ethereum/p2p/server.go:182.37,186.2 3 1
+github.com/ethereum/go-ethereum/p2p/server.go:190.48,193.9 1 0
+github.com/ethereum/go-ethereum/p2p/server.go:194.2,195.34 1 0
+github.com/ethereum/go-ethereum/p2p/server.go:196.2,196.10 0 0
+github.com/ethereum/go-ethereum/p2p/server.go:200.61,202.2 1 7
+github.com/ethereum/go-ethereum/p2p/server.go:204.43,206.2 1 7
+github.com/ethereum/go-ethereum/p2p/server.go:208.41,210.2 1 7
+github.com/ethereum/go-ethereum/p2p/server.go:212.58,215.34 3 1
+github.com/ethereum/go-ethereum/p2p/server.go:215.34,216.18 1 2
+github.com/ethereum/go-ethereum/p2p/server.go:216.18,218.4 1 2
+github.com/ethereum/go-ethereum/p2p/server.go:223.51,225.12 2 4
+github.com/ethereum/go-ethereum/p2p/server.go:237.2,237.10 1 4
+github.com/ethereum/go-ethereum/p2p/server.go:249.2,249.33 1 4
+github.com/ethereum/go-ethereum/p2p/server.go:225.12,227.17 2 3
+github.com/ethereum/go-ethereum/p2p/server.go:227.17,231.4 3 0
+github.com/ethereum/go-ethereum/p2p/server.go:231.5,235.4 3 3
+github.com/ethereum/go-ethereum/p2p/server.go:237.10,239.17 2 3
+github.com/ethereum/go-ethereum/p2p/server.go:239.17,243.4 3 0
+github.com/ethereum/go-ethereum/p2p/server.go:243.5,247.4 3 3
+github.com/ethereum/go-ethereum/p2p/server.go:252.28,255.18 2 4
+github.com/ethereum/go-ethereum/p2p/server.go:263.2,263.20 1 4
+github.com/ethereum/go-ethereum/p2p/server.go:271.2,277.34 6 4
+github.com/ethereum/go-ethereum/p2p/server.go:282.2,283.32 2 4
+github.com/ethereum/go-ethereum/p2p/server.go:291.2,295.6 3 4
+github.com/ethereum/go-ethereum/p2p/server.go:305.2,305.33 1 4
+github.com/ethereum/go-ethereum/p2p/server.go:255.18,261.3 5 3
+github.com/ethereum/go-ethereum/p2p/server.go:263.20,269.3 5 3
+github.com/ethereum/go-ethereum/p2p/server.go:277.34,278.18 1 8
+github.com/ethereum/go-ethereum/p2p/server.go:278.18,280.4 1 6
+github.com/ethereum/go-ethereum/p2p/server.go:283.32,288.3 1 6
+github.com/ethereum/go-ethereum/p2p/server.go:295.6,296.10 1 8
+github.com/ethereum/go-ethereum/p2p/server.go:297.3,300.26 3 8
+github.com/ethereum/go-ethereum/p2p/server.go:300.26,301.14 1 4
+github.com/ethereum/go-ethereum/p2p/server.go:309.63,310.6 1 3
+github.com/ethereum/go-ethereum/p2p/server.go:310.6,311.10 1 2591
+github.com/ethereum/go-ethereum/p2p/server.go:312.3,313.46 1 2588
+github.com/ethereum/go-ethereum/p2p/server.go:314.3,318.10 4 3
+github.com/ethereum/go-ethereum/p2p/server.go:325.56,330.6 4 3
+github.com/ethereum/go-ethereum/p2p/server.go:330.6,331.10 1 10
+github.com/ethereum/go-ethereum/p2p/server.go:332.3,338.15 3 4
+github.com/ethereum/go-ethereum/p2p/server.go:339.3,346.21 3 3
+github.com/ethereum/go-ethereum/p2p/server.go:347.3,348.31 1 0
+github.com/ethereum/go-ethereum/p2p/server.go:349.3,350.41 1 3
+github.com/ethereum/go-ethereum/p2p/server.go:353.4,355.10 3 3
+github.com/ethereum/go-ethereum/p2p/server.go:350.41,352.5 1 1
+github.com/ethereum/go-ethereum/p2p/server.go:361.61,366.11 4 6
+github.com/ethereum/go-ethereum/p2p/server.go:369.2,369.8 1 6
+github.com/ethereum/go-ethereum/p2p/server.go:366.11,368.3 1 0
+github.com/ethereum/go-ethereum/p2p/server.go:373.73,376.16 3 2588
+github.com/ethereum/go-ethereum/p2p/server.go:383.2,383.16 1 2588
+github.com/ethereum/go-ethereum/p2p/server.go:376.16,379.17 3 3
+github.com/ethereum/go-ethereum/p2p/server.go:379.17,381.4 1 0
+github.com/ethereum/go-ethereum/p2p/server.go:383.16,386.3 2 2585
+github.com/ethereum/go-ethereum/p2p/server.go:386.4,389.3 2 3
+github.com/ethereum/go-ethereum/p2p/server.go:393.84,396.16 3 3
+github.com/ethereum/go-ethereum/p2p/server.go:399.2,399.16 1 3
+github.com/ethereum/go-ethereum/p2p/server.go:396.16,398.3 1 3
+github.com/ethereum/go-ethereum/p2p/server.go:399.16,402.3 2 0
+github.com/ethereum/go-ethereum/p2p/server.go:402.4,404.3 1 3
+github.com/ethereum/go-ethereum/p2p/server.go:408.86,411.17 3 6
+github.com/ethereum/go-ethereum/p2p/server.go:411.17,415.3 3 0
+github.com/ethereum/go-ethereum/p2p/server.go:415.4,424.3 7 6
+github.com/ethereum/go-ethereum/p2p/server.go:428.59,435.17 6 6
+github.com/ethereum/go-ethereum/p2p/server.go:441.2,459.24 13 6
+github.com/ethereum/go-ethereum/p2p/server.go:435.17,439.3 3 0
+github.com/ethereum/go-ethereum/p2p/server.go:463.38,467.2 3 8
+github.com/ethereum/go-ethereum/p2p/server.go:469.74,471.35 1 1
+github.com/ethereum/go-ethereum/p2p/server.go:475.2,477.34 3 1
+github.com/ethereum/go-ethereum/p2p/server.go:482.2,483.12 2 1
+github.com/ethereum/go-ethereum/p2p/server.go:471.35,473.3 1 0
+github.com/ethereum/go-ethereum/p2p/server.go:477.34,478.82 1 2
+github.com/ethereum/go-ethereum/p2p/server.go:478.82,480.4 1 0
+github.com/ethereum/go-ethereum/p2p/connection.go:32.32,35.2 2 18
+github.com/ethereum/go-ethereum/p2p/connection.go:37.33,40.2 2 18
+github.com/ethereum/go-ethereum/p2p/connection.go:42.35,46.2 3 18
+github.com/ethereum/go-ethereum/p2p/connection.go:48.36,52.2 3 18
+github.com/ethereum/go-ethereum/p2p/connection.go:54.72,64.2 1 18
+github.com/ethereum/go-ethereum/p2p/connection.go:66.46,68.2 1 18
+github.com/ethereum/go-ethereum/p2p/connection.go:70.47,72.2 1 19
+github.com/ethereum/go-ethereum/p2p/connection.go:74.51,76.2 1 8
+github.com/ethereum/go-ethereum/p2p/connection.go:78.37,86.6 7 18
+github.com/ethereum/go-ethereum/p2p/connection.go:86.6,89.23 2 304
+github.com/ethereum/go-ethereum/p2p/connection.go:96.3,96.10 1 304
+github.com/ethereum/go-ethereum/p2p/connection.go:89.23,92.4 2 12
+github.com/ethereum/go-ethereum/p2p/connection.go:92.5,94.4 1 292
+github.com/ethereum/go-ethereum/p2p/connection.go:97.3,98.32 1 136
+github.com/ethereum/go-ethereum/p2p/connection.go:99.3,100.18 1 136
+github.com/ethereum/go-ethereum/p2p/connection.go:112.4,112.46 1 136
+github.com/ethereum/go-ethereum/p2p/connection.go:113.3,115.42 2 7
+github.com/ethereum/go-ethereum/p2p/connection.go:120.4,120.46 1 7
+github.com/ethereum/go-ethereum/p2p/connection.go:121.3,122.25 1 7
+github.com/ethereum/go-ethereum/p2p/connection.go:123.3,126.10 3 18
+github.com/ethereum/go-ethereum/p2p/connection.go:100.18,101.43 1 133
+github.com/ethereum/go-ethereum/p2p/connection.go:101.43,103.6 1 129
+github.com/ethereum/go-ethereum/p2p/connection.go:103.7,103.25 1 4
+github.com/ethereum/go-ethereum/p2p/connection.go:103.25,105.6 1 0
+github.com/ethereum/go-ethereum/p2p/connection.go:105.7,107.6 1 4
+github.com/ethereum/go-ethereum/p2p/connection.go:108.6,111.5 2 3
+github.com/ethereum/go-ethereum/p2p/connection.go:115.42,117.5 1 0
+github.com/ethereum/go-ethereum/p2p/connection.go:117.6,119.5 1 7
+github.com/ethereum/go-ethereum/p2p/connection.go:132.38,136.6 4 18
+github.com/ethereum/go-ethereum/p2p/connection.go:136.6,137.35 1 56
+github.com/ethereum/go-ethereum/p2p/connection.go:141.3,141.10 1 56
+github.com/ethereum/go-ethereum/p2p/connection.go:137.35,140.4 2 19
+github.com/ethereum/go-ethereum/p2p/connection.go:142.3,143.38 1 19
+github.com/ethereum/go-ethereum/p2p/connection.go:144.3,145.18 1 19
+github.com/ethereum/go-ethereum/p2p/connection.go:151.3,154.10 3 18
+github.com/ethereum/go-ethereum/p2p/connection.go:145.18,148.5 2 19
+github.com/ethereum/go-ethereum/p2p/connection.go:148.6,150.5 1 0
+github.com/ethereum/go-ethereum/p2p/connection.go:159.43,166.2 4 19
+github.com/ethereum/go-ethereum/p2p/connection.go:168.39,169.34 1 19
+github.com/ethereum/go-ethereum/p2p/connection.go:169.34,173.3 3 0
+github.com/ethereum/go-ethereum/p2p/connection.go:176.69,180.15 4 19
+github.com/ethereum/go-ethereum/p2p/connection.go:184.2,184.13 1 19
+github.com/ethereum/go-ethereum/p2p/connection.go:180.15,183.3 2 0
+github.com/ethereum/go-ethereum/p2p/connection.go:187.74,199.6 8 136
+github.com/ethereum/go-ethereum/p2p/connection.go:248.2,248.13 1 136
+github.com/ethereum/go-ethereum/p2p/connection.go:199.6,203.28 1 152
+github.com/ethereum/go-ethereum/p2p/connection.go:218.3,218.12 1 17
+github.com/ethereum/go-ethereum/p2p/connection.go:203.28,205.11 2 145
+github.com/ethereum/go-ethereum/p2p/connection.go:216.4,216.39 1 10
+github.com/ethereum/go-ethereum/p2p/connection.go:205.11,207.38 2 135
+github.com/ethereum/go-ethereum/p2p/connection.go:214.5,214.14 1 135
+github.com/ethereum/go-ethereum/p2p/connection.go:207.38,208.15 1 2
+github.com/ethereum/go-ethereum/p2p/connection.go:208.15,210.7 1 1
+github.com/ethereum/go-ethereum/p2p/connection.go:210.8,212.7 1 1
+github.com/ethereum/go-ethereum/p2p/connection.go:218.12,220.50 1 10
+github.com/ethereum/go-ethereum/p2p/connection.go:224.4,227.18 3 9
+github.com/ethereum/go-ethereum/p2p/connection.go:220.50,222.10 2 1
+github.com/ethereum/go-ethereum/p2p/connection.go:227.18,229.5 1 8
+github.com/ethereum/go-ethereum/p2p/connection.go:229.6,232.5 2 1
+github.com/ethereum/go-ethereum/p2p/connection.go:233.5,239.4 4 7
+github.com/ethereum/go-ethereum/p2p/connection.go:251.82,253.6 2 136
+github.com/ethereum/go-ethereum/p2p/connection.go:274.2,274.13 1 136
+github.com/ethereum/go-ethereum/p2p/connection.go:253.6,259.41 4 136
+github.com/ethereum/go-ethereum/p2p/connection.go:259.41,260.21 1 136
+github.com/ethereum/go-ethereum/p2p/connection.go:263.4,263.42 1 136
+github.com/ethereum/go-ethereum/p2p/connection.go:260.21,262.5 1 10
+github.com/ethereum/go-ethereum/p2p/connection.go:263.42,264.10 1 136
+github.com/ethereum/go-ethereum/p2p/connection.go:266.5,272.4 4 0
+github.com/ethereum/go-ethereum/p2p/message.go:16.33,18.2 1 54
+github.com/ethereum/go-ethereum/p2p/message.go:20.40,22.2 1 5
+github.com/ethereum/go-ethereum/p2p/message.go:24.72,43.2 1 37
+github.com/ethereum/go-ethereum/p2p/message.go:45.60,59.2 5 5
+github.com/ethereum/go-ethereum/p2p/message.go:61.41,63.2 1 5
+github.com/ethereum/go-ethereum/p2p/message.go:67.54,68.28 1 28
+github.com/ethereum/go-ethereum/p2p/message.go:74.2,74.8 1 28
+github.com/ethereum/go-ethereum/p2p/message.go:68.28,71.3 2 27
+github.com/ethereum/go-ethereum/p2p/message.go:71.4,73.3 1 1
+github.com/ethereum/go-ethereum/p2p/messenger.go:28.104,41.2 2 10
+github.com/ethereum/go-ethereum/p2p/messenger.go:43.32,49.2 5 10
+github.com/ethereum/go-ethereum/p2p/messenger.go:51.31,56.42 4 10
+github.com/ethereum/go-ethereum/p2p/messenger.go:59.2,62.19 4 10
+github.com/ethereum/go-ethereum/p2p/messenger.go:56.42,58.3 1 14
+github.com/ethereum/go-ethereum/p2p/messenger.go:65.36,67.6 2 10
+github.com/ethereum/go-ethereum/p2p/messenger.go:67.6,68.10 1 14
+github.com/ethereum/go-ethereum/p2p/messenger.go:69.3,71.10 1 4
+github.com/ethereum/go-ethereum/p2p/messenger.go:76.3,78.10 2 10
+github.com/ethereum/go-ethereum/p2p/messenger.go:71.10,73.5 1 4
+github.com/ethereum/go-ethereum/p2p/messenger.go:73.6,75.5 1 0
+github.com/ethereum/go-ethereum/p2p/messenger.go:88.47,97.16 3 4
+github.com/ethereum/go-ethereum/p2p/messenger.go:102.2,103.16 2 4
+github.com/ethereum/go-ethereum/p2p/messenger.go:108.2,114.6 5 4
+github.com/ethereum/go-ethereum/p2p/messenger.go:97.16,100.3 2 0
+github.com/ethereum/go-ethereum/p2p/messenger.go:103.16,106.3 2 0
+github.com/ethereum/go-ethereum/p2p/messenger.go:114.6,115.10 1 4
+github.com/ethereum/go-ethereum/p2p/messenger.go:116.3,118.10 1 4
+github.com/ethereum/go-ethereum/p2p/messenger.go:123.3,124.10 1 0
+github.com/ethereum/go-ethereum/p2p/messenger.go:118.10,120.5 1 0
+github.com/ethereum/go-ethereum/p2p/messenger.go:120.6,122.5 1 4
+github.com/ethereum/go-ethereum/p2p/messenger.go:134.82,138.42 4 4
+github.com/ethereum/go-ethereum/p2p/messenger.go:144.2,144.67 1 0
+github.com/ethereum/go-ethereum/p2p/messenger.go:138.42,139.20 1 5
+github.com/ethereum/go-ethereum/p2p/messenger.go:142.3,142.16 1 1
+github.com/ethereum/go-ethereum/p2p/messenger.go:139.20,141.4 1 4
+github.com/ethereum/go-ethereum/p2p/messenger.go:147.128,152.6 4 8
+github.com/ethereum/go-ethereum/p2p/messenger.go:152.6,153.10 1 19
+github.com/ethereum/go-ethereum/p2p/messenger.go:154.3,155.10 1 10
+github.com/ethereum/go-ethereum/p2p/messenger.go:162.3,163.14 1 9
+github.com/ethereum/go-ethereum/p2p/messenger.go:155.10,158.5 2 3
+github.com/ethereum/go-ethereum/p2p/messenger.go:158.6,161.5 1 7
+github.com/ethereum/go-ethereum/p2p/messenger.go:163.14,167.5 3 1
+github.com/ethereum/go-ethereum/p2p/messenger.go:167.6,172.5 4 8
+github.com/ethereum/go-ethereum/p2p/messenger.go:177.57,182.33 5 3
+github.com/ethereum/go-ethereum/p2p/messenger.go:182.33,184.9 2 5
+github.com/ethereum/go-ethereum/p2p/messenger.go:184.9,194.4 8 4
+github.com/ethereum/go-ethereum/p2p/messenger.go:194.5,197.4 1 1
+github.com/ethereum/go-ethereum/p2p/messenger.go:201.63,206.23 5 26
+github.com/ethereum/go-ethereum/p2p/messenger.go:214.2,216.28 2 24
+github.com/ethereum/go-ethereum/p2p/messenger.go:219.2,219.12 1 24
+github.com/ethereum/go-ethereum/p2p/messenger.go:206.23,209.10 3 5
+github.com/ethereum/go-ethereum/p2p/messenger.go:212.3,212.29 1 3
+github.com/ethereum/go-ethereum/p2p/messenger.go:209.10,211.4 1 2
+github.com/ethereum/go-ethereum/p2p/messenger.go:216.28,218.3 1 18
+github.com/ethereum/go-ethereum/p2p/natupnp.go:23.54,25.16 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:28.2,29.16 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:32.2,36.16 4 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:40.2,49.32 5 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:92.2,93.8 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:25.16,27.3 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:29.16,31.3 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:36.16,38.3 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:49.32,51.17 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:54.3,56.17 3 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:61.3,62.43 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:67.3,70.19 4 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:73.3,75.19 3 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:78.3,81.17 4 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:84.3,86.17 3 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:89.3,90.9 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:51.17,53.4 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:56.17,57.12 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:62.43,63.12 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:70.19,71.12 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:75.19,76.12 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:81.17,83.4 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:86.17,88.4 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:148.59,150.31 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:155.2,155.12 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:150.31,151.37 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:151.37,153.4 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:158.62,160.31 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:165.2,165.12 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:160.31,161.39 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:161.39,163.4 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:168.40,170.16 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:173.2,174.30 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:177.2,177.27 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:170.16,172.3 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:174.30,176.3 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:180.60,182.16 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:185.2,186.25 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:190.2,193.16 3 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:196.2,197.75 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:201.2,202.14 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:206.2,207.14 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:211.2,212.14 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:216.2,217.8 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:182.16,184.3 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:186.25,189.3 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:193.16,195.3 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:197.75,200.3 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:202.14,205.3 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:207.14,210.3 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:212.14,215.3 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:220.48,226.2 5 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:228.79,234.16 3 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:237.2,246.16 8 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:250.2,250.19 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:254.2,254.25 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:260.2,260.8 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:234.16,236.3 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:246.16,248.3 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:250.19,252.3 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:254.25,259.3 3 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:267.64,274.16 4 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:280.2,281.8 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:274.16,276.3 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:284.65,286.16 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:289.2,290.8 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:286.16,288.3 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:293.152,307.16 7 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:313.2,315.8 3 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:307.16,309.3 1 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:318.98,327.16 4 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:333.2,334.8 2 0
+github.com/ethereum/go-ethereum/p2p/natupnp.go:327.16,329.3 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:57.55,62.2 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:64.63,70.2 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:72.71,73.26 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:81.2,81.50 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:73.26,75.23 2 0
+github.com/ethereum/go-ethereum/p2p/network.go:79.3,79.21 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:75.23,78.4 2 0
+github.com/ethereum/go-ethereum/p2p/network.go:84.45,85.22 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:99.2,99.8 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:86.2,86.12 0 0
+github.com/ethereum/go-ethereum/p2p/network.go:87.2,89.18 2 0
+github.com/ethereum/go-ethereum/p2p/network.go:94.2,95.42 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:96.2,97.57 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:89.18,91.4 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:91.5,93.4 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:102.32,106.2 3 0
+github.com/ethereum/go-ethereum/p2p/network.go:108.63,110.16 2 0
+github.com/ethereum/go-ethereum/p2p/network.go:115.2,115.8 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:110.16,112.3 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:112.4,114.3 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:118.46,122.6 3 0
+github.com/ethereum/go-ethereum/p2p/network.go:141.2,142.28 2 0
+github.com/ethereum/go-ethereum/p2p/network.go:122.6,123.10 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:124.3,127.53 3 0
+github.com/ethereum/go-ethereum/p2p/network.go:130.3,131.30 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:135.3,137.13 2 0
+github.com/ethereum/go-ethereum/p2p/network.go:127.53,129.5 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:131.30,132.54 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:132.54,133.6 0 0
+github.com/ethereum/go-ethereum/p2p/network.go:142.28,143.73 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:143.73,145.4 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:145.5,147.4 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:151.74,153.16 2 0
+github.com/ethereum/go-ethereum/p2p/network.go:159.2,159.17 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:153.16,158.3 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:162.69,164.16 2 0
+github.com/ethereum/go-ethereum/p2p/network.go:169.2,169.17 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:164.16,168.3 3 0
+github.com/ethereum/go-ethereum/p2p/network.go:172.65,173.39 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:177.2,179.16 3 0
+github.com/ethereum/go-ethereum/p2p/network.go:183.2,183.19 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:188.2,188.18 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:195.2,195.8 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:173.39,175.3 1 0
+github.com/ethereum/go-ethereum/p2p/network.go:179.16,182.3 2 0
+github.com/ethereum/go-ethereum/p2p/network.go:183.19,187.3 3 0
+github.com/ethereum/go-ethereum/p2p/network.go:188.18,192.3 2 0
+github.com/ethereum/go-ethereum/p2p/network.go:192.4,194.3 1 0
+github.com/ethereum/go-ethereum/p2p/peer.go:24.42,26.2 1 9
+github.com/ethereum/go-ethereum/p2p/peer.go:28.51,30.2 1 0
+github.com/ethereum/go-ethereum/p2p/peer.go:32.36,34.2 1 9
+github.com/ethereum/go-ethereum/p2p/peer.go:36.83,52.2 8 7
+github.com/ethereum/go-ethereum/p2p/peer.go:54.35,56.18 2 20
+github.com/ethereum/go-ethereum/p2p/peer.go:61.2,61.89 1 18
+github.com/ethereum/go-ethereum/p2p/peer.go:56.18,58.3 1 9
+github.com/ethereum/go-ethereum/p2p/peer.go:58.4,60.3 1 9
+github.com/ethereum/go-ethereum/p2p/peer.go:64.58,66.2 1 24
+github.com/ethereum/go-ethereum/p2p/peer.go:68.27,71.2 2 7
+github.com/ethereum/go-ethereum/p2p/peer.go:73.26,79.2 2 7
+github.com/ethereum/go-ethereum/p2p/peer.go:81.39,83.2 1 2
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:25.153,33.2 1 8
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:35.39,37.2 1 8
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:39.38,43.2 3 8
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:45.40,46.6 1 8
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:46.6,47.10 1 19
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:48.3,49.10 1 11
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:55.3,57.10 2 8
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:49.10,52.5 2 11
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:52.6,54.5 1 0
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:62.60,64.24 2 11
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:83.2,83.40 1 11
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:86.2,86.31 1 11
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:65.2,66.35 1 0
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:67.2,68.31 1 0
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:69.2,70.27 1 0
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:71.2,72.29 1 0
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:73.2,74.27 1 0
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:75.2,76.28 1 11
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:77.2,78.32 1 0
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:79.2,80.47 1 0
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:83.40,85.3 1 0
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:86.31,91.3 1 11
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:94.69,95.24 1 0
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:96.2,97.11 1 0
+github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:98.2,99.11 1 0
+github.com/ethereum/go-ethereum/pow/ar/ops.go:11.13,21.2 9 1
+github.com/ethereum/go-ethereum/pow/ar/ops.go:23.34,25.2 1 899964
+github.com/ethereum/go-ethereum/pow/ar/ops.go:26.34,28.2 1 6
+github.com/ethereum/go-ethereum/pow/ar/ops.go:29.34,31.2 1 12
+github.com/ethereum/go-ethereum/pow/ar/ops.go:32.34,34.2 1 12
+github.com/ethereum/go-ethereum/pow/ar/ops.go:35.34,37.2 1 0
+github.com/ethereum/go-ethereum/pow/ar/ops.go:38.33,40.2 1 0
+github.com/ethereum/go-ethereum/pow/ar/ops.go:41.35,46.2 3 6
+github.com/ethereum/go-ethereum/pow/ar/ops.go:47.37,51.2 2 6
+github.com/ethereum/go-ethereum/pow/ar/ops.go:52.34,54.2 1 0
+github.com/ethereum/go-ethereum/pow/ar/pow.go:19.33,21.2 1 1
+github.com/ethereum/go-ethereum/pow/ar/pow.go:23.56,26.32 2 1
+github.com/ethereum/go-ethereum/pow/ar/pow.go:26.32,31.23 4 150000
+github.com/ethereum/go-ethereum/pow/ar/pow.go:37.3,38.49 2 150000
+github.com/ethereum/go-ethereum/pow/ar/pow.go:31.23,33.4 1 149979
+github.com/ethereum/go-ethereum/pow/ar/pow.go:33.5,35.4 1 21
+github.com/ethereum/go-ethereum/pow/ar/pow.go:42.69,44.32 2 6
+github.com/ethereum/go-ethereum/pow/ar/pow.go:48.2,48.30 1 6
+github.com/ethereum/go-ethereum/pow/ar/pow.go:55.2,56.34 2 6
+github.com/ethereum/go-ethereum/pow/ar/pow.go:74.2,74.18 1 6
+github.com/ethereum/go-ethereum/pow/ar/pow.go:44.32,46.3 1 60000
+github.com/ethereum/go-ethereum/pow/ar/pow.go:48.30,53.3 3 900000
+github.com/ethereum/go-ethereum/pow/ar/pow.go:56.34,58.10 2 9000
+github.com/ethereum/go-ethereum/pow/ar/pow.go:68.3,69.65 2 9000
+github.com/ethereum/go-ethereum/pow/ar/pow.go:58.10,59.29 1 9000
+github.com/ethereum/go-ethereum/pow/ar/pow.go:59.29,61.5 1 900000
+github.com/ethereum/go-ethereum/pow/ar/pow.go:62.5,63.29 1 0
+github.com/ethereum/go-ethereum/pow/ar/pow.go:63.29,65.5 1 0
+github.com/ethereum/go-ethereum/pow/ar/pow.go:69.65,71.4 1 0
+github.com/ethereum/go-ethereum/pow/ar/pow.go:77.53,94.2 12 0
+github.com/ethereum/go-ethereum/pow/ar/pow.go:96.45,104.6 6 1
+github.com/ethereum/go-ethereum/pow/ar/pow.go:104.6,105.54 1 6
+github.com/ethereum/go-ethereum/pow/ar/pow.go:110.3,116.51 5 6
+github.com/ethereum/go-ethereum/pow/ar/pow.go:105.54,108.4 2 1
+github.com/ethereum/go-ethereum/pow/ar/pow.go:116.51,118.4 1 1
+github.com/ethereum/go-ethereum/pow/ar/pow.go:118.5,120.4 1 5
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:18.37,20.2 1 0
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:22.35,23.31 1 510007
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:36.2,36.12 1 0
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:23.31,25.3 1 509988
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:25.4,25.43 1 19
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:25.43,27.3 1 13
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:27.4,27.40 1 6
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:27.40,29.23 2 6
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:33.3,33.54 1 6
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:29.23,31.4 1 60000
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:48.26,50.2 1 7
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:52.43,57.46 3 510021
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:61.2,61.10 1 510021
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:57.46,59.3 1 509988
+github.com/ethereum/go-ethereum/pow/ar/rnd.go:64.42,66.2 1 450021
+github.com/ethereum/go-ethereum/ptrie/hashnode.go:7.36,9.2 1 0
+github.com/ethereum/go-ethereum/ptrie/hashnode.go:11.45,13.2 1 0
+github.com/ethereum/go-ethereum/ptrie/hashnode.go:15.42,17.2 1 2
+github.com/ethereum/go-ethereum/ptrie/hashnode.go:20.36,20.50 1 0
+github.com/ethereum/go-ethereum/ptrie/hashnode.go:21.36,21.51 1 0
+github.com/ethereum/go-ethereum/ptrie/hashnode.go:22.36,22.51 1 0
+github.com/ethereum/go-ethereum/ptrie/node.go:17.51,17.78 1 0
+github.com/ethereum/go-ethereum/ptrie/node.go:18.51,18.78 1 0
+github.com/ethereum/go-ethereum/ptrie/node.go:19.51,19.78 1 2
+github.com/ethereum/go-ethereum/ptrie/node.go:20.51,20.91 1 81
+github.com/ethereum/go-ethereum/ptrie/node.go:21.51,21.90 1 18
+github.com/ethereum/go-ethereum/ptrie/node.go:24.50,26.34 2 12
+github.com/ethereum/go-ethereum/ptrie/node.go:34.2,34.42 1 12
+github.com/ethereum/go-ethereum/ptrie/node.go:26.34,27.18 1 204
+github.com/ethereum/go-ethereum/ptrie/node.go:27.18,29.4 1 95
+github.com/ethereum/go-ethereum/ptrie/node.go:29.5,31.4 1 109
+github.com/ethereum/go-ethereum/ptrie/node.go:38.51,40.2 1 49
+github.com/ethereum/go-ethereum/ptrie/shortnode.go:11.63,13.2 1 147
+github.com/ethereum/go-ethereum/ptrie/shortnode.go:14.37,18.2 2 85
+github.com/ethereum/go-ethereum/ptrie/shortnode.go:19.37,19.52 1 0
+github.com/ethereum/go-ethereum/ptrie/shortnode.go:20.37,20.52 1 0
+github.com/ethereum/go-ethereum/ptrie/shortnode.go:22.46,24.2 1 97
+github.com/ethereum/go-ethereum/ptrie/shortnode.go:25.43,27.2 1 76
+github.com/ethereum/go-ethereum/ptrie/shortnode.go:29.37,31.2 1 85
+github.com/ethereum/go-ethereum/ptrie/trie.go:19.42,21.2 1 7
+github.com/ethereum/go-ethereum/ptrie/trie.go:22.48,24.2 1 76
+github.com/ethereum/go-ethereum/ptrie/trie.go:33.23,35.2 1 6
+github.com/ethereum/go-ethereum/ptrie/trie.go:37.46,46.2 6 2
+github.com/ethereum/go-ethereum/ptrie/trie.go:49.33,49.55 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:50.33,52.22 2 7
+github.com/ethereum/go-ethereum/ptrie/trie.go:63.2,65.13 2 7
+github.com/ethereum/go-ethereum/ptrie/trie.go:52.22,54.33 2 7
+github.com/ethereum/go-ethereum/ptrie/trie.go:54.33,56.4 1 7
+github.com/ethereum/go-ethereum/ptrie/trie.go:56.5,58.4 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:59.4,61.3 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:68.56,68.106 1 74
+github.com/ethereum/go-ethereum/ptrie/trie.go:69.50,75.21 4 74
+github.com/ethereum/go-ethereum/ptrie/trie.go:81.2,81.18 1 74
+github.com/ethereum/go-ethereum/ptrie/trie.go:75.21,77.3 1 70
+github.com/ethereum/go-ethereum/ptrie/trie.go:77.4,79.3 1 4
+github.com/ethereum/go-ethereum/ptrie/trie.go:84.48,84.80 1 4
+github.com/ethereum/go-ethereum/ptrie/trie.go:85.42,92.14 5 4
+github.com/ethereum/go-ethereum/ptrie/trie.go:96.2,96.12 1 1
+github.com/ethereum/go-ethereum/ptrie/trie.go:92.14,94.3 1 3
+github.com/ethereum/go-ethereum/ptrie/trie.go:99.49,99.84 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:100.43,108.2 5 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:110.66,111.19 1 298
+github.com/ethereum/go-ethereum/ptrie/trie.go:115.2,115.17 1 285
+github.com/ethereum/go-ethereum/ptrie/trie.go:119.2,119.29 1 206
+github.com/ethereum/go-ethereum/ptrie/trie.go:111.19,113.3 1 13
+github.com/ethereum/go-ethereum/ptrie/trie.go:115.17,117.3 1 79
+github.com/ethereum/go-ethereum/ptrie/trie.go:120.2,123.26 3 76
+github.com/ethereum/go-ethereum/ptrie/trie.go:127.3,129.28 3 76
+github.com/ethereum/go-ethereum/ptrie/trie.go:139.3,139.23 1 76
+github.com/ethereum/go-ethereum/ptrie/trie.go:143.3,143.50 1 63
+github.com/ethereum/go-ethereum/ptrie/trie.go:145.2,149.13 3 130
+github.com/ethereum/go-ethereum/ptrie/trie.go:151.2,152.24 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:123.26,125.4 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:129.28,131.4 1 54
+github.com/ethereum/go-ethereum/ptrie/trie.go:131.5,138.4 6 22
+github.com/ethereum/go-ethereum/ptrie/trie.go:139.23,141.4 1 13
+github.com/ethereum/go-ethereum/ptrie/trie.go:156.51,157.19 1 15
+github.com/ethereum/go-ethereum/ptrie/trie.go:161.2,161.17 1 12
+github.com/ethereum/go-ethereum/ptrie/trie.go:165.2,165.29 1 12
+github.com/ethereum/go-ethereum/ptrie/trie.go:157.19,159.3 1 3
+github.com/ethereum/go-ethereum/ptrie/trie.go:161.17,163.3 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:166.2,170.57 3 5
+github.com/ethereum/go-ethereum/ptrie/trie.go:174.3,174.13 1 1
+github.com/ethereum/go-ethereum/ptrie/trie.go:175.2,176.45 1 7
+github.com/ethereum/go-ethereum/ptrie/trie.go:177.2,178.24 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:170.57,172.4 1 4
+github.com/ethereum/go-ethereum/ptrie/trie.go:182.54,183.19 1 10
+github.com/ethereum/go-ethereum/ptrie/trie.go:187.2,187.29 1 10
+github.com/ethereum/go-ethereum/ptrie/trie.go:183.19,185.3 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:188.2,191.26 3 4
+github.com/ethereum/go-ethereum/ptrie/trie.go:210.2,215.27 4 6
+github.com/ethereum/go-ethereum/ptrie/trie.go:225.3,226.16 2 6
+github.com/ethereum/go-ethereum/ptrie/trie.go:242.3,242.15 1 6
+github.com/ethereum/go-ethereum/ptrie/trie.go:244.2,245.24 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:191.26,193.4 1 4
+github.com/ethereum/go-ethereum/ptrie/trie.go:193.5,193.42 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:193.42,197.33 3 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:205.4,205.12 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:198.4,200.48 2 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:201.4,202.44 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:206.5,208.4 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:215.27,216.29 1 102
+github.com/ethereum/go-ethereum/ptrie/trie.go:216.29,217.18 1 10
+github.com/ethereum/go-ethereum/ptrie/trie.go:217.18,219.6 1 6
+github.com/ethereum/go-ethereum/ptrie/trie.go:219.7,221.6 1 4
+github.com/ethereum/go-ethereum/ptrie/trie.go:226.16,228.4 1 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:228.5,228.22 1 6
+github.com/ethereum/go-ethereum/ptrie/trie.go:228.22,230.33 2 2
+github.com/ethereum/go-ethereum/ptrie/trie.go:231.4,234.49 2 0
+github.com/ethereum/go-ethereum/ptrie/trie.go:235.4,236.68 1 2
+github.com/ethereum/go-ethereum/ptrie/trie.go:238.5,240.4 1 4
+github.com/ethereum/go-ethereum/ptrie/trie.go:250.53,252.11 2 95
+github.com/ethereum/go-ethereum/ptrie/trie.go:253.2,254.105 1 3
+github.com/ethereum/go-ethereum/ptrie/trie.go:255.2,257.26 2 5
+github.com/ethereum/go-ethereum/ptrie/trie.go:260.3,260.15 1 5
+github.com/ethereum/go-ethereum/ptrie/trie.go:261.2,262.34 1 25
+github.com/ethereum/go-ethereum/ptrie/trie.go:263.2,264.41 1 62
+github.com/ethereum/go-ethereum/ptrie/trie.go:257.26,259.4 1 85
+github.com/ethereum/go-ethereum/ptrie/trie.go:268.41,269.29 1 200
+github.com/ethereum/go-ethereum/ptrie/trie.go:270.2,272.28 2 5
+github.com/ethereum/go-ethereum/ptrie/trie.go:273.2,274.14 1 195
+github.com/ethereum/go-ethereum/ptrie/trie.go:278.48,280.21 2 103
+github.com/ethereum/go-ethereum/ptrie/trie.go:287.2,287.23 1 27
+github.com/ethereum/go-ethereum/ptrie/trie.go:280.21,285.3 3 76
+github.com/ethereum/go-ethereum/ptrie/valuenode.go:8.46,8.61 1 0
+github.com/ethereum/go-ethereum/ptrie/valuenode.go:9.46,9.66 1 3
+github.com/ethereum/go-ethereum/ptrie/valuenode.go:10.46,10.61 1 0
+github.com/ethereum/go-ethereum/ptrie/valuenode.go:11.46,11.61 1 0
+github.com/ethereum/go-ethereum/ptrie/valuenode.go:12.46,12.66 1 0
+github.com/ethereum/go-ethereum/ptrie/valuenode.go:13.46,13.66 1 135
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:8.37,10.2 1 27
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:12.36,12.51 1 0
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:13.36,16.2 2 0
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:18.35,18.50 1 136
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:21.42,22.34 1 0
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:28.2,28.8 1 0
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:22.34,23.18 1 0
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:23.18,25.4 1 0
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:31.42,33.2 1 27
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:35.45,37.34 2 33
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:45.2,45.10 1 33
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:37.34,38.18 1 561
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:38.18,40.4 1 136
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:40.5,42.4 1 425
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:48.47,50.2 1 265
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:52.40,53.31 1 249
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:58.2,58.12 1 134
+github.com/ethereum/go-ethereum/ptrie/fullnode.go:53.31,57.3 2 115
+github.com/ethereum/go-ethereum/rlp/decode.go:69.50,71.2 1 73
+github.com/ethereum/go-ethereum/rlp/decode.go:73.47,75.9 2 2
+github.com/ethereum/go-ethereum/rlp/decode.go:76.2,77.19 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:78.2,79.20 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:80.2,81.23 1 0
+github.com/ethereum/go-ethereum/rlp/decode.go:85.52,87.16 2 36
+github.com/ethereum/go-ethereum/rlp/decode.go:90.2,91.12 2 31
+github.com/ethereum/go-ethereum/rlp/decode.go:87.16,89.3 1 5
+github.com/ethereum/go-ethereum/rlp/decode.go:94.53,96.16 2 24
+github.com/ethereum/go-ethereum/rlp/decode.go:99.2,100.12 2 16
+github.com/ethereum/go-ethereum/rlp/decode.go:96.16,98.3 1 8
+github.com/ethereum/go-ethereum/rlp/decode.go:103.55,105.16 2 7
+github.com/ethereum/go-ethereum/rlp/decode.go:108.2,109.12 2 5
+github.com/ethereum/go-ethereum/rlp/decode.go:105.16,107.3 1 2
+github.com/ethereum/go-ethereum/rlp/decode.go:112.60,114.2 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:116.55,118.16 2 4
+github.com/ethereum/go-ethereum/rlp/decode.go:121.2,122.14 2 3
+github.com/ethereum/go-ethereum/rlp/decode.go:126.2,127.12 2 3
+github.com/ethereum/go-ethereum/rlp/decode.go:118.16,120.3 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:122.14,125.3 2 2
+github.com/ethereum/go-ethereum/rlp/decode.go:132.57,134.89 2 8
+github.com/ethereum/go-ethereum/rlp/decode.go:141.2,142.16 2 5
+github.com/ethereum/go-ethereum/rlp/decode.go:145.2,146.33 2 5
+github.com/ethereum/go-ethereum/rlp/decode.go:149.2,149.50 1 5
+github.com/ethereum/go-ethereum/rlp/decode.go:152.2,152.17 1 5
+github.com/ethereum/go-ethereum/rlp/decode.go:134.89,135.34 1 3
+github.com/ethereum/go-ethereum/rlp/decode.go:135.34,137.4 1 2
+github.com/ethereum/go-ethereum/rlp/decode.go:137.5,139.4 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:142.16,144.3 1 0
+github.com/ethereum/go-ethereum/rlp/decode.go:146.33,148.3 1 2
+github.com/ethereum/go-ethereum/rlp/decode.go:149.50,151.3 1 9
+github.com/ethereum/go-ethereum/rlp/decode.go:161.83,163.16 2 20
+github.com/ethereum/go-ethereum/rlp/decode.go:166.2,166.15 1 20
+github.com/ethereum/go-ethereum/rlp/decode.go:175.2,176.6 2 14
+github.com/ethereum/go-ethereum/rlp/decode.go:203.2,203.19 1 11
+github.com/ethereum/go-ethereum/rlp/decode.go:211.2,211.20 1 11
+github.com/ethereum/go-ethereum/rlp/decode.go:163.16,165.3 1 0
+github.com/ethereum/go-ethereum/rlp/decode.go:166.15,167.34 1 6
+github.com/ethereum/go-ethereum/rlp/decode.go:172.3,172.21 1 6
+github.com/ethereum/go-ethereum/rlp/decode.go:167.34,169.4 1 3
+github.com/ethereum/go-ethereum/rlp/decode.go:169.5,171.4 1 3
+github.com/ethereum/go-ethereum/rlp/decode.go:176.6,177.18 1 49
+github.com/ethereum/go-ethereum/rlp/decode.go:180.3,180.34 1 48
+github.com/ethereum/go-ethereum/rlp/decode.go:196.3,196.50 1 48
+github.com/ethereum/go-ethereum/rlp/decode.go:201.3,201.6 1 35
+github.com/ethereum/go-ethereum/rlp/decode.go:177.18,179.4 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:180.34,182.22 1 23
+github.com/ethereum/go-ethereum/rlp/decode.go:191.4,191.22 1 23
+github.com/ethereum/go-ethereum/rlp/decode.go:182.22,184.19 2 9
+github.com/ethereum/go-ethereum/rlp/decode.go:187.5,189.18 3 9
+github.com/ethereum/go-ethereum/rlp/decode.go:184.19,186.6 1 7
+github.com/ethereum/go-ethereum/rlp/decode.go:191.22,193.5 1 23
+github.com/ethereum/go-ethereum/rlp/decode.go:196.50,197.9 1 11
+github.com/ethereum/go-ethereum/rlp/decode.go:198.5,198.24 1 37
+github.com/ethereum/go-ethereum/rlp/decode.go:198.24,200.4 1 2
+github.com/ethereum/go-ethereum/rlp/decode.go:203.19,204.34 1 9
+github.com/ethereum/go-ethereum/rlp/decode.go:204.34,207.4 1 3
+github.com/ethereum/go-ethereum/rlp/decode.go:207.5,209.4 1 6
+github.com/ethereum/go-ethereum/rlp/decode.go:214.58,216.16 2 8
+github.com/ethereum/go-ethereum/rlp/decode.go:219.2,219.18 1 7
+github.com/ethereum/go-ethereum/rlp/decode.go:222.2,223.16 2 4
+github.com/ethereum/go-ethereum/rlp/decode.go:226.2,226.12 1 4
+github.com/ethereum/go-ethereum/rlp/decode.go:216.16,218.3 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:219.18,221.3 1 3
+github.com/ethereum/go-ethereum/rlp/decode.go:223.16,225.3 1 4
+github.com/ethereum/go-ethereum/rlp/decode.go:231.58,233.16 2 18
+github.com/ethereum/go-ethereum/rlp/decode.go:236.2,236.14 1 18
+github.com/ethereum/go-ethereum/rlp/decode.go:256.2,256.12 1 8
+github.com/ethereum/go-ethereum/rlp/decode.go:233.16,235.3 1 0
+github.com/ethereum/go-ethereum/rlp/decode.go:237.2,238.21 1 3
+github.com/ethereum/go-ethereum/rlp/decode.go:241.3,243.15 3 2
+github.com/ethereum/go-ethereum/rlp/decode.go:244.2,245.31 1 9
+github.com/ethereum/go-ethereum/rlp/decode.go:248.3,249.43 2 7
+github.com/ethereum/go-ethereum/rlp/decode.go:252.3,252.23 1 6
+github.com/ethereum/go-ethereum/rlp/decode.go:253.2,254.51 1 6
+github.com/ethereum/go-ethereum/rlp/decode.go:238.21,240.4 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:245.31,247.4 1 2
+github.com/ethereum/go-ethereum/rlp/decode.go:249.43,251.4 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:259.41,261.37 2 14
+github.com/ethereum/go-ethereum/rlp/decode.go:261.37,263.3 1 35
+github.com/ethereum/go-ethereum/rlp/decode.go:271.59,273.38 2 4
+github.com/ethereum/go-ethereum/rlp/decode.go:282.2,282.56 1 4
+github.com/ethereum/go-ethereum/rlp/decode.go:300.2,300.17 1 4
+github.com/ethereum/go-ethereum/rlp/decode.go:273.38,274.41 1 11
+github.com/ethereum/go-ethereum/rlp/decode.go:274.41,276.18 2 10
+github.com/ethereum/go-ethereum/rlp/decode.go:279.4,279.43 1 10
+github.com/ethereum/go-ethereum/rlp/decode.go:276.18,278.5 1 0
+github.com/ethereum/go-ethereum/rlp/decode.go:282.56,283.36 1 9
+github.com/ethereum/go-ethereum/rlp/decode.go:286.3,286.28 1 9
+github.com/ethereum/go-ethereum/rlp/decode.go:295.3,295.44 1 9
+github.com/ethereum/go-ethereum/rlp/decode.go:298.3,298.13 1 9
+github.com/ethereum/go-ethereum/rlp/decode.go:283.36,285.4 1 0
+github.com/ethereum/go-ethereum/rlp/decode.go:286.28,288.18 2 19
+github.com/ethereum/go-ethereum/rlp/decode.go:288.18,290.10 1 3
+github.com/ethereum/go-ethereum/rlp/decode.go:291.6,291.25 1 16
+github.com/ethereum/go-ethereum/rlp/decode.go:291.25,293.5 1 0
+github.com/ethereum/go-ethereum/rlp/decode.go:295.44,297.4 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:303.56,306.16 3 5
+github.com/ethereum/go-ethereum/rlp/decode.go:309.2,309.56 1 5
+github.com/ethereum/go-ethereum/rlp/decode.go:324.2,324.17 1 5
+github.com/ethereum/go-ethereum/rlp/decode.go:306.16,308.3 1 0
+github.com/ethereum/go-ethereum/rlp/decode.go:309.56,311.48 2 13
+github.com/ethereum/go-ethereum/rlp/decode.go:315.3,316.18 2 8
+github.com/ethereum/go-ethereum/rlp/decode.go:319.3,319.60 1 8
+github.com/ethereum/go-ethereum/rlp/decode.go:322.3,322.13 1 8
+github.com/ethereum/go-ethereum/rlp/decode.go:311.48,314.4 2 5
+github.com/ethereum/go-ethereum/rlp/decode.go:316.18,318.4 1 8
+github.com/ethereum/go-ethereum/rlp/decode.go:319.60,321.4 1 8
+github.com/ethereum/go-ethereum/rlp/decode.go:329.58,331.16 2 9
+github.com/ethereum/go-ethereum/rlp/decode.go:334.2,334.18 1 8
+github.com/ethereum/go-ethereum/rlp/decode.go:347.2,347.12 1 8
+github.com/ethereum/go-ethereum/rlp/decode.go:331.16,333.3 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:334.18,336.71 2 2
+github.com/ethereum/go-ethereum/rlp/decode.go:339.3,339.17 1 2
+github.com/ethereum/go-ethereum/rlp/decode.go:336.71,338.4 1 0
+github.com/ethereum/go-ethereum/rlp/decode.go:340.4,342.17 2 6
+github.com/ethereum/go-ethereum/rlp/decode.go:345.3,345.30 1 6
+github.com/ethereum/go-ethereum/rlp/decode.go:342.17,344.4 1 0
+github.com/ethereum/go-ethereum/rlp/decode.go:352.61,354.2 1 5
+github.com/ethereum/go-ethereum/rlp/decode.go:356.56,361.46 1 2
+github.com/ethereum/go-ethereum/rlp/decode.go:364.2,364.47 1 2
+github.com/ethereum/go-ethereum/rlp/decode.go:361.46,363.3 1 2
+github.com/ethereum/go-ethereum/rlp/decode.go:376.31,377.11 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:378.2,379.16 1 0
+github.com/ethereum/go-ethereum/rlp/decode.go:380.2,381.18 1 0
+github.com/ethereum/go-ethereum/rlp/decode.go:382.2,383.16 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:384.2,385.39 1 0
+github.com/ethereum/go-ethereum/rlp/decode.go:435.38,437.2 1 109
+github.com/ethereum/go-ethereum/rlp/decode.go:442.42,444.16 2 25
+github.com/ethereum/go-ethereum/rlp/decode.go:447.2,447.14 1 23
+github.com/ethereum/go-ethereum/rlp/decode.go:444.16,446.3 1 2
+github.com/ethereum/go-ethereum/rlp/decode.go:448.2,450.32 2 8
+github.com/ethereum/go-ethereum/rlp/decode.go:451.2,453.38 2 12
+github.com/ethereum/go-ethereum/rlp/decode.go:456.3,456.16 1 11
+github.com/ethereum/go-ethereum/rlp/decode.go:457.2,458.32 1 3
+github.com/ethereum/go-ethereum/rlp/decode.go:453.38,455.4 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:465.41,467.2 1 31
+github.com/ethereum/go-ethereum/rlp/decode.go:469.52,471.16 2 91
+github.com/ethereum/go-ethereum/rlp/decode.go:474.2,474.14 1 75
+github.com/ethereum/go-ethereum/rlp/decode.go:471.16,473.3 1 16
+github.com/ethereum/go-ethereum/rlp/decode.go:475.2,477.32 2 62
+github.com/ethereum/go-ethereum/rlp/decode.go:478.2,479.31 1 11
+github.com/ethereum/go-ethereum/rlp/decode.go:482.3,482.32 1 7
+github.com/ethereum/go-ethereum/rlp/decode.go:483.2,484.30 1 2
+github.com/ethereum/go-ethereum/rlp/decode.go:479.31,481.4 1 4
+github.com/ethereum/go-ethereum/rlp/decode.go:491.50,493.16 2 40
+github.com/ethereum/go-ethereum/rlp/decode.go:496.2,496.18 1 39
+github.com/ethereum/go-ethereum/rlp/decode.go:499.2,502.18 4 37
+github.com/ethereum/go-ethereum/rlp/decode.go:493.16,495.3 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:496.18,498.3 1 2
+github.com/ethereum/go-ethereum/rlp/decode.go:507.34,508.23 1 31
+github.com/ethereum/go-ethereum/rlp/decode.go:511.2,512.25 2 30
+github.com/ethereum/go-ethereum/rlp/decode.go:515.2,516.22 2 28
+github.com/ethereum/go-ethereum/rlp/decode.go:519.2,521.12 3 28
+github.com/ethereum/go-ethereum/rlp/decode.go:508.23,510.3 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:512.25,514.3 1 2
+github.com/ethereum/go-ethereum/rlp/decode.go:516.22,518.3 1 3
+github.com/ethereum/go-ethereum/rlp/decode.go:527.48,528.16 1 73
+github.com/ethereum/go-ethereum/rlp/decode.go:531.2,533.32 3 72
+github.com/ethereum/go-ethereum/rlp/decode.go:536.2,536.18 1 71
+github.com/ethereum/go-ethereum/rlp/decode.go:539.2,540.16 2 70
+github.com/ethereum/go-ethereum/rlp/decode.go:543.2,543.37 1 69
+github.com/ethereum/go-ethereum/rlp/decode.go:528.16,530.3 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:533.32,535.3 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:536.18,538.3 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:540.16,542.3 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:557.61,559.22 2 224
+github.com/ethereum/go-ethereum/rlp/decode.go:562.2,562.16 1 224
+github.com/ethereum/go-ethereum/rlp/decode.go:572.2,572.45 1 201
+github.com/ethereum/go-ethereum/rlp/decode.go:575.2,575.28 1 200
+github.com/ethereum/go-ethereum/rlp/decode.go:559.22,561.3 1 94
+github.com/ethereum/go-ethereum/rlp/decode.go:562.16,563.40 1 192
+github.com/ethereum/go-ethereum/rlp/decode.go:566.3,567.17 2 175
+github.com/ethereum/go-ethereum/rlp/decode.go:570.3,570.30 1 169
+github.com/ethereum/go-ethereum/rlp/decode.go:563.40,565.4 1 17
+github.com/ethereum/go-ethereum/rlp/decode.go:567.17,569.4 1 6
+github.com/ethereum/go-ethereum/rlp/decode.go:572.45,574.3 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:578.65,580.16 2 175
+github.com/ethereum/go-ethereum/rlp/decode.go:583.2,584.9 2 170
+github.com/ethereum/go-ethereum/rlp/decode.go:580.16,582.3 1 5
+github.com/ethereum/go-ethereum/rlp/decode.go:585.2,589.22 2 76
+github.com/ethereum/go-ethereum/rlp/decode.go:590.2,595.39 1 37
+github.com/ethereum/go-ethereum/rlp/decode.go:596.2,604.27 2 6
+github.com/ethereum/go-ethereum/rlp/decode.go:605.2,611.37 1 47
+github.com/ethereum/go-ethereum/rlp/decode.go:612.2,620.25 2 4
+github.com/ethereum/go-ethereum/rlp/decode.go:624.54,625.15 1 17
+github.com/ethereum/go-ethereum/rlp/decode.go:632.2,633.29 2 11
+github.com/ethereum/go-ethereum/rlp/decode.go:636.2,637.48 2 11
+github.com/ethereum/go-ethereum/rlp/decode.go:625.15,627.20 2 6
+github.com/ethereum/go-ethereum/rlp/decode.go:630.3,630.24 1 6
+github.com/ethereum/go-ethereum/rlp/decode.go:627.20,629.4 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:633.29,635.3 1 44
+github.com/ethereum/go-ethereum/rlp/decode.go:640.51,643.33 3 30
+github.com/ethereum/go-ethereum/rlp/decode.go:647.2,647.19 1 30
+github.com/ethereum/go-ethereum/rlp/decode.go:650.2,650.12 1 30
+github.com/ethereum/go-ethereum/rlp/decode.go:643.33,646.3 2 27
+github.com/ethereum/go-ethereum/rlp/decode.go:647.19,649.3 1 3
+github.com/ethereum/go-ethereum/rlp/decode.go:653.43,656.39 3 181
+github.com/ethereum/go-ethereum/rlp/decode.go:659.2,659.15 1 181
+github.com/ethereum/go-ethereum/rlp/decode.go:656.39,658.3 1 1
+github.com/ethereum/go-ethereum/rlp/decode.go:662.37,664.22 2 211
+github.com/ethereum/go-ethereum/rlp/decode.go:664.22,666.3 1 76
+github.com/ethereum/go-ethereum/rlp/typecache.go:21.58,25.17 4 70
+github.com/ethereum/go-ethereum/rlp/typecache.go:29.2,31.29 3 21
+github.com/ethereum/go-ethereum/rlp/typecache.go:25.17,27.3 1 49
+github.com/ethereum/go-ethereum/rlp/typecache.go:34.59,36.17 2 41
+github.com/ethereum/go-ethereum/rlp/typecache.go:43.2,45.16 3 27
+github.com/ethereum/go-ethereum/rlp/typecache.go:50.2,51.28 2 26
+github.com/ethereum/go-ethereum/rlp/typecache.go:36.17,39.3 1 14
+github.com/ethereum/go-ethereum/rlp/typecache.go:45.16,49.3 2 1
+github.com/ethereum/go-ethereum/rlp/typecache.go:59.64,62.9 3 27
+github.com/ethereum/go-ethereum/rlp/typecache.go:86.2,86.18 1 27
+github.com/ethereum/go-ethereum/rlp/typecache.go:63.2,64.31 1 1
+github.com/ethereum/go-ethereum/rlp/typecache.go:65.2,66.36 1 2
+github.com/ethereum/go-ethereum/rlp/typecache.go:67.2,68.30 1 1
+github.com/ethereum/go-ethereum/rlp/typecache.go:69.2,70.35 1 1
+github.com/ethereum/go-ethereum/rlp/typecache.go:71.2,72.37 1 2
+github.com/ethereum/go-ethereum/rlp/typecache.go:73.2,74.30 1 1
+github.com/ethereum/go-ethereum/rlp/typecache.go:75.2,76.43 1 8
+github.com/ethereum/go-ethereum/rlp/typecache.go:77.2,78.45 1 4
+github.com/ethereum/go-ethereum/rlp/typecache.go:79.2,80.42 1 5
+github.com/ethereum/go-ethereum/rlp/typecache.go:81.2,82.33 1 1
+github.com/ethereum/go-ethereum/rlp/typecache.go:83.2,84.64 1 1
+github.com/ethereum/go-ethereum/rlp/typecache.go:89.37,91.2 1 22
+github.com/ethereum/go-ethereum/state/dump.go:23.34,29.70 2 1
+github.com/ethereum/go-ethereum/state/dump.go:42.2,43.16 2 1
+github.com/ethereum/go-ethereum/state/dump.go:47.2,47.13 1 1
+github.com/ethereum/go-ethereum/state/dump.go:29.70,35.66 4 0
+github.com/ethereum/go-ethereum/state/dump.go:39.3,39.59 1 0
+github.com/ethereum/go-ethereum/state/dump.go:35.66,38.4 2 0
+github.com/ethereum/go-ethereum/state/dump.go:43.16,45.3 1 0
+github.com/ethereum/go-ethereum/state/dump.go:51.48,53.59 2 0
+github.com/ethereum/go-ethereum/state/dump.go:53.59,55.3 1 0
+github.com/ethereum/go-ethereum/state/errors.go:13.36,17.2 2 0
+github.com/ethereum/go-ethereum/state/errors.go:18.40,20.2 1 0
+github.com/ethereum/go-ethereum/state/errors.go:21.51,23.2 1 0
+github.com/ethereum/go-ethereum/state/log.go:16.51,23.16 3 0
+github.com/ethereum/go-ethereum/state/log.go:27.2,27.12 1 0
+github.com/ethereum/go-ethereum/state/log.go:23.16,25.3 1 0
+github.com/ethereum/go-ethereum/state/log.go:30.40,32.2 1 0
+github.com/ethereum/go-ethereum/state/log.go:34.34,36.2 1 0
+github.com/ethereum/go-ethereum/state/log.go:40.40,42.27 2 0
+github.com/ethereum/go-ethereum/state/log.go:46.2,46.13 1 0
+github.com/ethereum/go-ethereum/state/log.go:42.27,44.3 1 0
+github.com/ethereum/go-ethereum/state/log.go:49.34,51.27 2 0
+github.com/ethereum/go-ethereum/state/log.go:54.2,54.47 1 0
+github.com/ethereum/go-ethereum/state/log.go:51.27,53.3 1 0
+github.com/ethereum/go-ethereum/state/manifest.go:16.30,21.2 3 6
+github.com/ethereum/go-ethereum/state/manifest.go:23.28,25.2 1 6
+github.com/ethereum/go-ethereum/state/manifest.go:27.57,31.2 2 0
+github.com/ethereum/go-ethereum/state/manifest.go:49.52,51.2 1 0
+github.com/ethereum/go-ethereum/state/manifest.go:53.38,55.2 1 0
+github.com/ethereum/go-ethereum/state/state.go:32.34,34.2 1 6
+github.com/ethereum/go-ethereum/state/state.go:36.32,38.2 1 0
+github.com/ethereum/go-ethereum/state/state.go:40.37,42.2 1 0
+github.com/ethereum/go-ethereum/state/state.go:44.32,46.2 1 0
+github.com/ethereum/go-ethereum/state/state.go:49.53,51.24 2 0
+github.com/ethereum/go-ethereum/state/state.go:55.2,55.21 1 0
+github.com/ethereum/go-ethereum/state/state.go:51.24,53.3 1 0
+github.com/ethereum/go-ethereum/state/state.go:58.61,61.38 2 0
+github.com/ethereum/go-ethereum/state/state.go:65.2,65.66 1 0
+github.com/ethereum/go-ethereum/state/state.go:61.38,63.3 1 0
+github.com/ethereum/go-ethereum/state/state.go:68.61,70.24 2 0
+github.com/ethereum/go-ethereum/state/state.go:70.24,72.3 1 0
+github.com/ethereum/go-ethereum/state/state.go:75.49,77.24 2 0
+github.com/ethereum/go-ethereum/state/state.go:81.2,81.10 1 0
+github.com/ethereum/go-ethereum/state/state.go:77.24,79.3 1 0
+github.com/ethereum/go-ethereum/state/state.go:84.56,86.24 2 0
+github.com/ethereum/go-ethereum/state/state.go:86.24,88.3 1 0
+github.com/ethereum/go-ethereum/state/state.go:91.48,93.24 2 0
+github.com/ethereum/go-ethereum/state/state.go:97.2,97.12 1 0
+github.com/ethereum/go-ethereum/state/state.go:93.24,95.3 1 0
+github.com/ethereum/go-ethereum/state/state.go:100.49,102.24 2 0
+github.com/ethereum/go-ethereum/state/state.go:106.2,106.12 1 0
+github.com/ethereum/go-ethereum/state/state.go:102.24,104.3 1 0
+github.com/ethereum/go-ethereum/state/state.go:109.66,111.24 2 0
+github.com/ethereum/go-ethereum/state/state.go:111.24,113.3 1 0
+github.com/ethereum/go-ethereum/state/state.go:116.45,118.24 2 0
+github.com/ethereum/go-ethereum/state/state.go:124.2,124.14 1 0
+github.com/ethereum/go-ethereum/state/state.go:118.24,122.3 2 0
+github.com/ethereum/go-ethereum/state/state.go:132.64,135.37 2 0
+github.com/ethereum/go-ethereum/state/state.go:139.2,139.65 1 0
+github.com/ethereum/go-ethereum/state/state.go:135.37,137.3 1 0
+github.com/ethereum/go-ethereum/state/state.go:143.64,147.2 2 0
+github.com/ethereum/go-ethereum/state/state.go:150.61,154.24 3 3
+github.com/ethereum/go-ethereum/state/state.go:158.2,159.20 2 1
+github.com/ethereum/go-ethereum/state/state.go:163.2,166.20 3 0
+github.com/ethereum/go-ethereum/state/state.go:154.24,156.3 1 2
+github.com/ethereum/go-ethereum/state/state.go:159.20,161.3 1 1
+github.com/ethereum/go-ethereum/state/state.go:169.56,171.2 1 0
+github.com/ethereum/go-ethereum/state/state.go:174.66,176.24 2 1
+github.com/ethereum/go-ethereum/state/state.go:180.2,180.20 1 1
+github.com/ethereum/go-ethereum/state/state.go:176.24,178.3 1 1
+github.com/ethereum/go-ethereum/state/state.go:184.61,193.2 5 1
+github.com/ethereum/go-ethereum/state/state.go:196.57,198.2 1 0
+github.com/ethereum/go-ethereum/state/state.go:204.40,206.2 1 0
+github.com/ethereum/go-ethereum/state/state.go:208.34,209.22 1 2
+github.com/ethereum/go-ethereum/state/state.go:226.2,226.12 1 0
+github.com/ethereum/go-ethereum/state/state.go:209.22,211.49 2 2
+github.com/ethereum/go-ethereum/state/state.go:215.3,215.41 1 2
+github.com/ethereum/go-ethereum/state/state.go:219.3,223.15 4 2
+github.com/ethereum/go-ethereum/state/state.go:211.49,213.4 1 1
+github.com/ethereum/go-ethereum/state/state.go:215.41,217.4 1 0
+github.com/ethereum/go-ethereum/state/state.go:229.38,230.18 1 1
+github.com/ethereum/go-ethereum/state/state.go:234.2,237.24 4 1
+github.com/ethereum/go-ethereum/state/state.go:230.18,232.3 1 0
+github.com/ethereum/go-ethereum/state/state.go:240.31,242.2 1 0
+github.com/ethereum/go-ethereum/state/state.go:245.25,249.45 2 0
+github.com/ethereum/go-ethereum/state/state.go:258.2,258.11 1 0
+github.com/ethereum/go-ethereum/state/state.go:249.45,250.31 1 0
+github.com/ethereum/go-ethereum/state/state.go:255.3,255.22 1 0
+github.com/ethereum/go-ethereum/state/state.go:250.31,251.12 1 0
+github.com/ethereum/go-ethereum/state/state.go:262.24,264.45 1 0
+github.com/ethereum/go-ethereum/state/state.go:272.2,274.11 2 0
+github.com/ethereum/go-ethereum/state/state.go:264.45,265.31 1 0
+github.com/ethereum/go-ethereum/state/state.go:269.3,269.27 1 0
+github.com/ethereum/go-ethereum/state/state.go:265.31,266.12 1 0
+github.com/ethereum/go-ethereum/state/state.go:277.28,280.2 2 0
+github.com/ethereum/go-ethereum/state/state.go:282.29,286.40 2 0
+github.com/ethereum/go-ethereum/state/state.go:290.2,290.48 1 0
+github.com/ethereum/go-ethereum/state/state.go:302.2,302.13 1 0
+github.com/ethereum/go-ethereum/state/state.go:286.40,288.3 1 0
+github.com/ethereum/go-ethereum/state/state.go:290.48,291.25 1 0
+github.com/ethereum/go-ethereum/state/state.go:291.25,294.4 2 0
+github.com/ethereum/go-ethereum/state/state.go:294.5,298.4 2 0
+github.com/ethereum/go-ethereum/state/state.go:302.13,304.13 2 0
+github.com/ethereum/go-ethereum/state/state.go:304.13,308.4 2 0
+github.com/ethereum/go-ethereum/state/state.go:312.41,314.2 1 0
+github.com/ethereum/go-ethereum/state/state.go:317.42,318.48 1 0
+github.com/ethereum/go-ethereum/state/state.go:318.48,320.3 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:14.34,16.2 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:20.36,22.31 2 1
+github.com/ethereum/go-ethereum/state/state_object.go:27.2,27.12 1 1
+github.com/ethereum/go-ethereum/state/state_object.go:22.31,25.3 1 1
+github.com/ethereum/go-ethereum/state/state_object.go:55.34,58.2 2 0
+github.com/ethereum/go-ethereum/state/state_object.go:60.47,70.2 6 2
+github.com/ethereum/go-ethereum/state/state_object.go:72.78,78.2 4 0
+github.com/ethereum/go-ethereum/state/state_object.go:80.65,85.2 3 0
+github.com/ethereum/go-ethereum/state/state_object.go:87.44,90.2 2 0
+github.com/ethereum/go-ethereum/state/state_object.go:92.59,94.2 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:96.63,98.2 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:100.66,102.2 1 1
+github.com/ethereum/go-ethereum/state/state_object.go:103.73,105.2 1 2
+github.com/ethereum/go-ethereum/state/state_object.go:107.62,109.2 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:111.60,115.18 3 1
+github.com/ethereum/go-ethereum/state/state_object.go:123.2,123.14 1 1
+github.com/ethereum/go-ethereum/state/state_object.go:115.18,118.21 2 0
+github.com/ethereum/go-ethereum/state/state_object.go:118.21,120.4 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:126.67,129.2 2 2
+github.com/ethereum/go-ethereum/state/state_object.go:132.60,134.39 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:140.2,141.49 2 0
+github.com/ethereum/go-ethereum/state/state_object.go:134.39,138.3 2 0
+github.com/ethereum/go-ethereum/state/state_object.go:141.49,143.31 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:143.31,145.4 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:149.33,150.39 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:161.2,162.12 2 0
+github.com/ethereum/go-ethereum/state/state_object.go:150.39,151.23 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:158.3,158.35 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:151.23,155.12 2 0
+github.com/ethereum/go-ethereum/state/state_object.go:162.12,166.3 2 0
+github.com/ethereum/go-ethereum/state/state_object.go:169.60,170.39 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:174.2,174.62 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:170.39,172.3 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:177.51,181.2 2 0
+github.com/ethereum/go-ethereum/state/state_object.go:182.50,182.74 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:184.51,188.2 2 0
+github.com/ethereum/go-ethereum/state/state_object.go:189.50,189.74 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:191.51,193.2 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:195.45,195.68 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:202.54,202.56 0 0
+github.com/ethereum/go-ethereum/state/state_object.go:203.61,205.30 2 0
+github.com/ethereum/go-ethereum/state/state_object.go:209.2,211.12 2 0
+github.com/ethereum/go-ethereum/state/state_object.go:205.30,207.3 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:214.56,218.2 2 0
+github.com/ethereum/go-ethereum/state/state_object.go:220.60,221.31 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:225.2,230.12 4 0
+github.com/ethereum/go-ethereum/state/state_object.go:221.31,223.3 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:233.57,240.2 4 0
+github.com/ethereum/go-ethereum/state/state_object.go:242.46,247.23 5 1
+github.com/ethereum/go-ethereum/state/state_object.go:250.2,256.20 6 1
+github.com/ethereum/go-ethereum/state/state_object.go:247.23,249.3 1 1
+github.com/ethereum/go-ethereum/state/state_object.go:259.56,261.2 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:267.36,269.2 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:272.40,274.2 1 1
+github.com/ethereum/go-ethereum/state/state_object.go:277.35,279.2 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:282.48,284.2 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:286.40,288.2 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:295.42,297.2 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:299.48,301.2 1 0
+github.com/ethereum/go-ethereum/state/state_object.go:303.46,315.2 8 0
+github.com/ethereum/go-ethereum/trie/encoding.go:9.44,11.37 2 17
+github.com/ethereum/go-ethereum/trie/encoding.go:15.2,15.21 1 17
+github.com/ethereum/go-ethereum/trie/encoding.go:19.2,21.17 3 17
+github.com/ethereum/go-ethereum/trie/encoding.go:27.2,28.40 2 17
+github.com/ethereum/go-ethereum/trie/encoding.go:32.2,32.22 1 17
+github.com/ethereum/go-ethereum/trie/encoding.go:11.37,13.3 1 9
+github.com/ethereum/go-ethereum/trie/encoding.go:15.21,17.3 1 9
+github.com/ethereum/go-ethereum/trie/encoding.go:21.17,23.3 1 9
+github.com/ethereum/go-ethereum/trie/encoding.go:23.4,25.3 1 8
+github.com/ethereum/go-ethereum/trie/encoding.go:28.40,30.3 1 46
+github.com/ethereum/go-ethereum/trie/encoding.go:35.39,38.18 3 12
+github.com/ethereum/go-ethereum/trie/encoding.go:41.2,41.20 1 12
+github.com/ethereum/go-ethereum/trie/encoding.go:47.2,47.13 1 12
+github.com/ethereum/go-ethereum/trie/encoding.go:38.18,40.3 1 7
+github.com/ethereum/go-ethereum/trie/encoding.go:41.20,43.3 1 6
+github.com/ethereum/go-ethereum/trie/encoding.go:43.4,45.3 1 6
+github.com/ethereum/go-ethereum/trie/encoding.go:50.42,55.24 4 21
+github.com/ethereum/go-ethereum/trie/encoding.go:58.2,60.17 2 21
+github.com/ethereum/go-ethereum/trie/encoding.go:55.24,57.3 1 152
+github.com/ethereum/go-ethereum/trie/encoding.go:63.39,67.24 3 0
+github.com/ethereum/go-ethereum/trie/encoding.go:73.2,75.20 2 0
+github.com/ethereum/go-ethereum/trie/encoding.go:67.24,68.13 1 0
+github.com/ethereum/go-ethereum/trie/encoding.go:68.13,70.4 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:18.44,19.21 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:23.2,23.21 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:32.2,32.19 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:19.21,21.3 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:23.21,25.17 2 0
+github.com/ethereum/go-ethereum/trie/iterator.go:29.3,29.17 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:25.17,27.4 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:43.40,45.2 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:47.70,48.23 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:73.2,73.12 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:49.2,55.11 4 0
+github.com/ethereum/go-ethereum/trie/iterator.go:56.2,57.29 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:61.3,61.33 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:67.2,70.79 2 0
+github.com/ethereum/go-ethereum/trie/iterator.go:57.29,59.4 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:61.33,63.16 2 0
+github.com/ethereum/go-ethereum/trie/iterator.go:63.16,65.5 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:76.83,77.35 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:129.2,129.12 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:78.2,79.13 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:80.2,81.19 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:90.3,91.19 2 0
+github.com/ethereum/go-ethereum/trie/iterator.go:95.3,95.27 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:102.2,104.22 2 0
+github.com/ethereum/go-ethereum/trie/iterator.go:81.19,85.16 3 0
+github.com/ethereum/go-ethereum/trie/iterator.go:85.16,87.5 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:91.19,93.4 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:95.27,98.16 3 0
+github.com/ethereum/go-ethereum/trie/iterator.go:98.16,100.5 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:104.22,105.49 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:105.49,110.5 3 0
+github.com/ethereum/go-ethereum/trie/iterator.go:111.5,115.26 4 0
+github.com/ethereum/go-ethereum/trie/iterator.go:123.4,123.18 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:115.26,117.5 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:117.6,117.49 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:117.49,119.5 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:119.6,121.5 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:123.18,125.5 1 0
+github.com/ethereum/go-ethereum/trie/iterator.go:133.47,143.2 6 0
+github.com/ethereum/go-ethereum/trie/slice.go:9.39,10.22 1 0
+github.com/ethereum/go-ethereum/trie/slice.go:13.2,13.22 1 0
+github.com/ethereum/go-ethereum/trie/slice.go:18.2,18.13 1 0
+github.com/ethereum/go-ethereum/trie/slice.go:10.22,12.3 1 0
+github.com/ethereum/go-ethereum/trie/slice.go:13.22,14.16 1 0
+github.com/ethereum/go-ethereum/trie/slice.go:14.16,16.4 1 0
+github.com/ethereum/go-ethereum/trie/slice.go:22.44,25.17 2 6
+github.com/ethereum/go-ethereum/trie/slice.go:32.2,32.10 1 6
+github.com/ethereum/go-ethereum/trie/slice.go:25.17,26.19 1 11
+github.com/ethereum/go-ethereum/trie/slice.go:29.3,29.6 1 7
+github.com/ethereum/go-ethereum/trie/slice.go:26.19,27.9 1 4
+github.com/ethereum/go-ethereum/trie/slice.go:35.29,37.2 1 0
+github.com/ethereum/go-ethereum/trie/slice.go:39.31,40.16 1 0
+github.com/ethereum/go-ethereum/trie/slice.go:44.2,44.10 1 0
+github.com/ethereum/go-ethereum/trie/slice.go:40.16,42.3 1 0
+github.com/ethereum/go-ethereum/trie/slice.go:47.35,48.21 1 0
+github.com/ethereum/go-ethereum/trie/slice.go:52.2,52.35 1 0
+github.com/ethereum/go-ethereum/trie/slice.go:48.21,50.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:12.44,15.59 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:19.2,19.59 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:15.59,17.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:22.27,24.2 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:41.64,43.2 1 16
+github.com/ethereum/go-ethereum/trie/trie.go:45.29,47.2 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:55.43,57.2 1 1
+github.com/ethereum/go-ethereum/trie/trie.go:59.69,63.29 3 26
+github.com/ethereum/go-ethereum/trie/trie.go:72.2,72.10 1 10
+github.com/ethereum/go-ethereum/trie/trie.go:63.29,70.3 4 16
+github.com/ethereum/go-ethereum/trie/trie.go:75.52,77.2 1 25
+github.com/ethereum/go-ethereum/trie/trie.go:79.52,81.37 1 13
+github.com/ethereum/go-ethereum/trie/trie.go:86.2,90.15 3 0
+github.com/ethereum/go-ethereum/trie/trie.go:97.2,99.14 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:81.37,83.3 1 13
+github.com/ethereum/go-ethereum/trie/trie.go:90.15,91.31 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:91.31,94.4 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:102.40,106.2 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:108.30,110.20 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:114.2,114.37 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:120.2,124.28 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:110.20,112.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:114.37,115.17 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:115.17,118.4 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:124.28,126.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:129.28,130.37 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:135.2,135.23 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:130.37,131.17 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:131.17,133.4 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:152.45,154.32 2 2
+github.com/ethereum/go-ethereum/trie/trie.go:160.2,160.21 1 2
+github.com/ethereum/go-ethereum/trie/trie.go:154.32,156.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:156.4,158.3 1 2
+github.com/ethereum/go-ethereum/trie/trie.go:163.55,172.2 5 1
+github.com/ethereum/go-ethereum/trie/trie.go:174.45,175.26 1 9
+github.com/ethereum/go-ethereum/trie/trie.go:176.2,182.24 1 1
+github.com/ethereum/go-ethereum/trie/trie.go:183.2,184.19 1 7
+github.com/ethereum/go-ethereum/trie/trie.go:185.2,186.46 1 1
+github.com/ethereum/go-ethereum/trie/trie.go:194.42,201.17 5 8
+github.com/ethereum/go-ethereum/trie/trie.go:206.2,206.17 1 8
+github.com/ethereum/go-ethereum/trie/trie.go:201.17,203.3 1 6
+github.com/ethereum/go-ethereum/trie/trie.go:203.4,205.3 1 2
+github.com/ethereum/go-ethereum/trie/trie.go:209.39,217.2 5 0
+github.com/ethereum/go-ethereum/trie/trie.go:219.35,227.2 5 0
+github.com/ethereum/go-ethereum/trie/trie.go:229.36,230.31 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:231.2,232.14 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:235.3,235.19 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:236.2,237.18 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:241.3,241.11 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:242.2,243.72 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:232.14,234.4 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:237.18,239.4 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:248.37,250.2 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:253.29,255.39 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:259.2,259.13 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:255.39,257.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:263.23,266.2 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:268.23,271.2 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:273.31,275.2 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:277.67,280.48 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:284.2,287.17 3 0
+github.com/ethereum/go-ethereum/trie/trie.go:304.2,304.28 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:280.48,282.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:287.17,289.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:289.4,289.24 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:289.24,294.57 3 0
+github.com/ethereum/go-ethereum/trie/trie.go:294.57,296.4 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:296.5,298.4 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:299.4,299.25 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:299.25,301.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:307.57,310.23 2 18
+github.com/ethereum/go-ethereum/trie/trie.go:314.2,315.19 2 13
+github.com/ethereum/go-ethereum/trie/trie.go:321.2,323.13 2 13
+github.com/ethereum/go-ethereum/trie/trie.go:310.23,312.3 1 5
+github.com/ethereum/go-ethereum/trie/trie.go:315.19,317.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:317.4,317.26 1 13
+github.com/ethereum/go-ethereum/trie/trie.go:317.26,319.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:326.84,328.2 1 6
+github.com/ethereum/go-ethereum/trie/trie.go:330.50,333.2 1 25
+github.com/ethereum/go-ethereum/trie/trie.go:335.44,337.25 2 13
+github.com/ethereum/go-ethereum/trie/trie.go:340.2,340.14 1 13
+github.com/ethereum/go-ethereum/trie/trie.go:337.25,339.3 1 221
+github.com/ethereum/go-ethereum/trie/trie.go:343.89,344.19 1 22
+github.com/ethereum/go-ethereum/trie/trie.go:349.2,350.33 2 19
+github.com/ethereum/go-ethereum/trie/trie.go:356.2,358.28 2 12
+github.com/ethereum/go-ethereum/trie/trie.go:412.2,412.25 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:344.19,346.3 1 3
+github.com/ethereum/go-ethereum/trie/trie.go:350.33,354.3 2 7
+github.com/ethereum/go-ethereum/trie/trie.go:358.28,365.26 3 6
+github.com/ethereum/go-ethereum/trie/trie.go:370.3,372.31 3 6
+github.com/ethereum/go-ethereum/trie/trie.go:388.3,388.26 1 6
+github.com/ethereum/go-ethereum/trie/trie.go:365.26,368.4 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:372.31,375.4 1 2
+github.com/ethereum/go-ethereum/trie/trie.go:375.5,386.4 6 4
+github.com/ethereum/go-ethereum/trie/trie.go:388.26,391.4 1 1
+github.com/ethereum/go-ethereum/trie/trie.go:391.5,394.4 2 5
+github.com/ethereum/go-ethereum/trie/trie.go:395.4,400.27 2 6
+github.com/ethereum/go-ethereum/trie/trie.go:407.3,409.24 2 6
+github.com/ethereum/go-ethereum/trie/trie.go:400.27,402.18 2 102
+github.com/ethereum/go-ethereum/trie/trie.go:402.18,404.5 1 102
+github.com/ethereum/go-ethereum/trie/trie.go:415.70,416.19 1 5
+github.com/ethereum/go-ethereum/trie/trie.go:421.2,423.33 2 5
+github.com/ethereum/go-ethereum/trie/trie.go:430.2,432.28 2 5
+github.com/ethereum/go-ethereum/trie/trie.go:502.2,502.28 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:416.19,418.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:423.33,428.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:432.28,438.26 3 2
+github.com/ethereum/go-ethereum/trie/trie.go:438.26,442.4 1 2
+github.com/ethereum/go-ethereum/trie/trie.go:442.5,442.42 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:442.42,447.24 4 0
+github.com/ethereum/go-ethereum/trie/trie.go:456.4,456.25 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:447.24,450.5 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:450.6,452.5 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:457.5,459.4 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:460.4,465.27 3 3
+github.com/ethereum/go-ethereum/trie/trie.go:472.3,474.27 3 3
+github.com/ethereum/go-ethereum/trie/trie.go:483.3,483.19 1 3
+github.com/ethereum/go-ethereum/trie/trie.go:499.3,499.24 1 3
+github.com/ethereum/go-ethereum/trie/trie.go:465.27,467.18 2 51
+github.com/ethereum/go-ethereum/trie/trie.go:467.18,469.5 1 51
+github.com/ethereum/go-ethereum/trie/trie.go:474.27,475.18 1 51
+github.com/ethereum/go-ethereum/trie/trie.go:475.18,476.21 1 5
+github.com/ethereum/go-ethereum/trie/trie.go:476.21,478.6 1 3
+github.com/ethereum/go-ethereum/trie/trie.go:478.7,480.6 1 2
+github.com/ethereum/go-ethereum/trie/trie.go:483.19,485.4 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:485.5,485.25 1 3
+github.com/ethereum/go-ethereum/trie/trie.go:485.25,487.25 2 1
+github.com/ethereum/go-ethereum/trie/trie.go:487.25,489.5 1 1
+github.com/ethereum/go-ethereum/trie/trie.go:489.6,489.31 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:489.31,492.5 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:494.5,496.4 1 2
+github.com/ethereum/go-ethereum/trie/trie.go:516.44,518.2 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:520.40,522.2 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:526.62,527.28 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:527.28,530.37 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:530.37,532.4 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:532.5,533.25 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:533.25,535.5 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:535.6,538.5 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:540.4,541.42 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:541.42,542.48 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:542.48,544.5 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:544.6,545.39 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:545.39,547.6 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:547.7,549.19 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:549.19,552.7 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:559.46,562.2 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:564.44,565.24 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:569.2,571.16 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:565.24,567.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:574.37,576.27 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:579.2,579.23 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:576.27,578.3 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:582.38,584.2 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:586.40,588.2 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:592.47,594.2 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:596.77,598.2 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:600.94,601.28 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:601.28,605.70 3 0
+github.com/ethereum/go-ethereum/trie/trie.go:605.70,607.4 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:607.5,608.25 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:608.25,610.5 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:610.6,612.5 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:614.4,615.42 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:615.42,617.48 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:617.48,619.5 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:619.6,620.72 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:620.72,622.6 1 0
+github.com/ethereum/go-ethereum/trie/trie.go:622.7,624.19 2 0
+github.com/ethereum/go-ethereum/trie/trie.go:624.19,626.7 1 0
+github.com/ethereum/go-ethereum/vm/stack.go:25.24,27.2 1 4
+github.com/ethereum/go-ethereum/vm/stack.go:29.36,31.2 1 0
+github.com/ethereum/go-ethereum/vm/stack.go:33.28,35.2 1 141
+github.com/ethereum/go-ethereum/vm/stack.go:37.33,44.2 4 42
+github.com/ethereum/go-ethereum/vm/stack.go:46.46,53.2 4 20
+github.com/ethereum/go-ethereum/vm/stack.go:55.34,59.2 2 16
+github.com/ethereum/go-ethereum/vm/stack.go:61.47,65.2 2 0
+github.com/ethereum/go-ethereum/vm/stack.go:67.52,71.2 2 0
+github.com/ethereum/go-ethereum/vm/stack.go:73.39,77.2 2 0
+github.com/ethereum/go-ethereum/vm/stack.go:79.35,81.2 1 84
+github.com/ethereum/go-ethereum/vm/stack.go:83.50,86.29 2 0
+github.com/ethereum/go-ethereum/vm/stack.go:91.2,91.12 1 0
+github.com/ethereum/go-ethereum/vm/stack.go:86.29,89.3 2 0
+github.com/ethereum/go-ethereum/vm/stack.go:94.26,96.22 2 0
+github.com/ethereum/go-ethereum/vm/stack.go:103.2,103.30 1 0
+github.com/ethereum/go-ethereum/vm/stack.go:96.22,97.31 1 0
+github.com/ethereum/go-ethereum/vm/stack.go:97.31,99.4 1 0
+github.com/ethereum/go-ethereum/vm/stack.go:100.4,102.3 1 0
+github.com/ethereum/go-ethereum/vm/stack.go:110.26,112.2 1 3
+github.com/ethereum/go-ethereum/vm/stack.go:114.56,115.20 1 2
+github.com/ethereum/go-ethereum/vm/stack.go:115.20,118.24 3 2
+github.com/ethereum/go-ethereum/vm/stack.go:128.3,128.43 1 2
+github.com/ethereum/go-ethereum/vm/stack.go:118.24,121.16 2 2
+github.com/ethereum/go-ethereum/vm/stack.go:121.16,126.5 2 2
+github.com/ethereum/go-ethereum/vm/stack.go:132.38,133.28 1 28
+github.com/ethereum/go-ethereum/vm/stack.go:133.28,135.3 1 8
+github.com/ethereum/go-ethereum/vm/stack.go:138.49,139.32 1 4
+github.com/ethereum/go-ethereum/vm/stack.go:145.2,145.12 1 0
+github.com/ethereum/go-ethereum/vm/stack.go:139.32,143.3 2 4
+github.com/ethereum/go-ethereum/vm/stack.go:148.59,149.35 1 0
+github.com/ethereum/go-ethereum/vm/stack.go:157.2,157.8 1 0
+github.com/ethereum/go-ethereum/vm/stack.go:149.35,155.3 4 0
+github.com/ethereum/go-ethereum/vm/stack.go:160.28,162.2 1 139
+github.com/ethereum/go-ethereum/vm/stack.go:164.32,166.2 1 0
+github.com/ethereum/go-ethereum/vm/stack.go:168.26,170.22 2 0
+github.com/ethereum/go-ethereum/vm/stack.go:179.2,179.37 1 0
+github.com/ethereum/go-ethereum/vm/stack.go:170.22,172.45 2 0
+github.com/ethereum/go-ethereum/vm/stack.go:172.45,175.4 2 0
+github.com/ethereum/go-ethereum/vm/stack.go:176.4,178.3 1 0
+github.com/ethereum/go-ethereum/vm/address.go:19.55,21.2 1 2
+github.com/ethereum/go-ethereum/vm/address.go:29.35,31.2 1 1
+github.com/ethereum/go-ethereum/vm/address.go:33.38,35.2 1 1
+github.com/ethereum/go-ethereum/vm/address.go:37.38,39.15 1 0
+github.com/ethereum/go-ethereum/vm/address.go:41.2,41.29 1 0
+github.com/ethereum/go-ethereum/vm/address.go:39.15,39.28 1 0
+github.com/ethereum/go-ethereum/vm/execution.go:19.103,21.2 1 2
+github.com/ethereum/go-ethereum/vm/execution.go:23.38,25.2 1 0
+github.com/ethereum/go-ethereum/vm/execution.go:27.81,32.2 2 2
+github.com/ethereum/go-ethereum/vm/execution.go:34.92,39.15 4 2
+github.com/ethereum/go-ethereum/vm/execution.go:46.2,56.24 3 2
+github.com/ethereum/go-ethereum/vm/execution.go:60.2,60.16 1 2
+github.com/ethereum/go-ethereum/vm/execution.go:90.2,90.8 1 2
+github.com/ethereum/go-ethereum/vm/execution.go:39.15,40.39 1 2
+github.com/ethereum/go-ethereum/vm/execution.go:43.3,43.57 1 2
+github.com/ethereum/go-ethereum/vm/execution.go:40.39,42.4 1 0
+github.com/ethereum/go-ethereum/vm/execution.go:56.24,58.3 1 2
+github.com/ethereum/go-ethereum/vm/execution.go:60.16,64.3 2 0
+github.com/ethereum/go-ethereum/vm/execution.go:64.4,68.40 3 2
+github.com/ethereum/go-ethereum/vm/execution.go:68.40,69.32 1 2
+github.com/ethereum/go-ethereum/vm/execution.go:69.32,72.5 2 2
+github.com/ethereum/go-ethereum/vm/execution.go:73.5,78.39 3 0
+github.com/ethereum/go-ethereum/vm/execution.go:85.4,86.20 2 0
+github.com/ethereum/go-ethereum/vm/execution.go:78.39,82.5 2 0
+github.com/ethereum/go-ethereum/vm/execution.go:93.74,95.2 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:20.52,21.13 1 4
+github.com/ethereum/go-ethereum/vm/vm.go:22.2,23.25 1 3
+github.com/ethereum/go-ethereum/vm/vm.go:24.2,25.23 1 1
+github.com/ethereum/go-ethereum/vm/vm.go:29.70,33.15 2 1
+github.com/ethereum/go-ethereum/vm/vm.go:41.2,41.28 1 1
+github.com/ethereum/go-ethereum/vm/vm.go:45.2,52.25 1 1
+github.com/ethereum/go-ethereum/vm/vm.go:59.2,59.6 1 1
+github.com/ethereum/go-ethereum/vm/vm.go:33.15,34.31 1 1
+github.com/ethereum/go-ethereum/vm/vm.go:34.31,37.4 2 1
+github.com/ethereum/go-ethereum/vm/vm.go:41.28,43.3 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:52.25,53.23 1 15
+github.com/ethereum/go-ethereum/vm/vm.go:53.23,55.5 1 1
+github.com/ethereum/go-ethereum/vm/vm.go:59.6,68.44 5 22
+github.com/ethereum/go-ethereum/vm/vm.go:72.3,75.13 3 22
+github.com/ethereum/go-ethereum/vm/vm.go:144.3,144.39 1 22
+github.com/ethereum/go-ethereum/vm/vm.go:158.3,158.27 1 22
+github.com/ethereum/go-ethereum/vm/vm.go:166.3,168.13 2 22
+github.com/ethereum/go-ethereum/vm/vm.go:707.3,707.7 1 21
+github.com/ethereum/go-ethereum/vm/vm.go:68.44,70.4 1 24
+github.com/ethereum/go-ethereum/vm/vm.go:76.3,77.25 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:78.3,79.25 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:80.3,81.21 1 3
+github.com/ethereum/go-ethereum/vm/vm.go:82.3,86.65 4 0
+github.com/ethereum/go-ethereum/vm/vm.go:93.4,93.43 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:94.3,95.23 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:96.3,98.52 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:99.3,102.52 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:103.3,105.51 2 4
+github.com/ethereum/go-ethereum/vm/vm.go:106.3,109.69 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:110.3,115.69 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:116.3,119.69 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:120.3,123.69 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:124.3,127.82 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:128.3,136.37 6 0
+github.com/ethereum/go-ethereum/vm/vm.go:137.3,141.82 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:86.65,88.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:88.6,88.73 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:88.73,90.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:90.6,92.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:144.39,149.50 4 4
+github.com/ethereum/go-ethereum/vm/vm.go:149.50,155.5 4 2
+github.com/ethereum/go-ethereum/vm/vm.go:158.27,164.4 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:170.3,179.20 5 3
+github.com/ethereum/go-ethereum/vm/vm.go:180.3,189.20 5 0
+github.com/ethereum/go-ethereum/vm/vm.go:190.3,199.20 5 0
+github.com/ethereum/go-ethereum/vm/vm.go:200.3,204.32 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:208.4,211.20 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:212.3,216.32 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:231.4,231.20 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:232.3,240.20 5 0
+github.com/ethereum/go-ethereum/vm/vm.go:241.3,245.32 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:260.4,260.20 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:262.3,270.20 5 1
+github.com/ethereum/go-ethereum/vm/vm.go:271.3,277.20 4 0
+github.com/ethereum/go-ethereum/vm/vm.go:278.3,282.20 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:287.3,292.20 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:298.3,302.26 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:307.3,312.20 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:318.3,323.21 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:328.3,331.35 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:338.3,342.30 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:343.3,347.29 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:348.3,352.30 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:353.3,356.85 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:363.3,375.20 8 0
+github.com/ethereum/go-ethereum/vm/vm.go:376.3,388.20 8 0
+github.com/ethereum/go-ethereum/vm/vm.go:391.3,396.34 4 0
+github.com/ethereum/go-ethereum/vm/vm.go:399.3,400.47 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:402.3,408.23 4 0
+github.com/ethereum/go-ethereum/vm/vm.go:410.3,413.36 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:415.3,417.36 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:419.3,422.21 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:424.3,432.32 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:439.4,439.34 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:440.3,442.29 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:444.3,452.19 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:459.4,461.26 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:462.3,464.25 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:472.4,473.17 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:475.3,477.25 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:485.4,492.19 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:499.4,501.30 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:502.3,503.29 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:506.3,509.38 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:511.3,514.38 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:516.3,519.32 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:521.3,524.22 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:526.3,529.26 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:531.3,533.29 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:536.3,544.36 5 11
+github.com/ethereum/go-ethereum/vm/vm.go:545.3,547.15 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:548.3,550.17 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:551.3,553.18 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:555.3,559.19 4 0
+github.com/ethereum/go-ethereum/vm/vm.go:561.3,565.61 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:567.3,572.53 4 4
+github.com/ethereum/go-ethereum/vm/vm.go:574.3,579.28 4 3
+github.com/ethereum/go-ethereum/vm/vm.go:581.3,586.49 4 0
+github.com/ethereum/go-ethereum/vm/vm.go:588.3,593.12 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:594.3,597.38 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:606.3,606.17 0 0
+github.com/ethereum/go-ethereum/vm/vm.go:607.3,608.31 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:609.3,610.44 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:611.3,612.27 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:614.3,637.18 8 0
+github.com/ethereum/go-ethereum/vm/vm.go:649.3,664.22 8 0
+github.com/ethereum/go-ethereum/vm/vm.go:670.4,672.18 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:680.3,685.35 4 0
+github.com/ethereum/go-ethereum/vm/vm.go:686.3,695.15 5 0
+github.com/ethereum/go-ethereum/vm/vm.go:696.3,698.35 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:699.3,704.67 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:204.32,206.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:216.32,218.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:218.6,220.53 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:226.5,228.15 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:220.53,222.6 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:222.7,224.6 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:245.32,247.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:247.6,249.32 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:255.5,257.15 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:249.32,251.6 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:251.7,253.6 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:282.20,284.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:284.6,286.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:292.20,294.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:294.6,296.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:302.26,304.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:304.6,306.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:312.20,314.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:314.6,316.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:323.21,325.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:325.6,327.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:331.35,333.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:333.6,335.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:356.85,360.5 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:360.6,362.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:432.32,437.5 3 0
+github.com/ethereum/go-ethereum/vm/vm.go:452.19,455.5 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:455.6,455.28 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:455.28,457.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:464.25,468.5 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:468.6,470.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:477.25,481.5 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:481.6,483.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:492.19,495.5 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:495.6,495.28 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:495.28,497.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:597.38,600.43 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:604.5,604.13 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:600.43,602.6 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:637.18,643.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:643.6,647.5 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:664.22,666.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:666.6,668.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:672.18,674.5 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:674.6,678.5 2 0
+github.com/ethereum/go-ethereum/vm/vm.go:711.35,713.2 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:715.29,717.2 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:719.72,719.87 1 0
+github.com/ethereum/go-ethereum/vm/vm.go:720.72,720.87 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:32.43,34.25 2 3
+github.com/ethereum/go-ethereum/vm/vm_debug.go:38.2,38.57 1 3
+github.com/ethereum/go-ethereum/vm/vm_debug.go:34.25,36.3 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:41.75,44.22 2 3
+github.com/ethereum/go-ethereum/vm/vm_debug.go:60.2,70.30 1 3
+github.com/ethereum/go-ethereum/vm/vm_debug.go:100.2,100.21 1 3
+github.com/ethereum/go-ethereum/vm/vm_debug.go:105.2,105.28 1 3
+github.com/ethereum/go-ethereum/vm/vm_debug.go:109.2,111.6 2 3
+github.com/ethereum/go-ethereum/vm/vm_debug.go:44.22,46.16 1 3
+github.com/ethereum/go-ethereum/vm/vm_debug.go:46.16,47.32 1 3
+github.com/ethereum/go-ethereum/vm/vm_debug.go:47.32,56.5 4 1
+github.com/ethereum/go-ethereum/vm/vm_debug.go:70.30,71.23 1 33
+github.com/ethereum/go-ethereum/vm/vm_debug.go:71.23,73.5 1 1
+github.com/ethereum/go-ethereum/vm/vm_debug.go:76.34,81.14 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:95.4,95.15 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:81.14,83.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:83.6,85.64 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:91.5,91.12 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:85.64,87.6 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:87.7,87.43 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:87.43,89.6 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:100.21,102.3 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:105.28,107.3 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:111.6,122.30 5 80
+github.com/ethereum/go-ethereum/vm/vm_debug.go:139.3,140.44 2 80
+github.com/ethereum/go-ethereum/vm/vm_debug.go:146.3,150.13 3 80
+github.com/ethereum/go-ethereum/vm/vm_debug.go:253.3,253.39 1 79
+github.com/ethereum/go-ethereum/vm/vm_debug.go:270.3,273.27 3 79
+github.com/ethereum/go-ethereum/vm/vm_debug.go:283.3,283.13 1 79
+github.com/ethereum/go-ethereum/vm/vm_debug.go:917.3,921.22 3 77
+github.com/ethereum/go-ethereum/vm/vm_debug.go:122.30,123.14 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:131.4,132.19 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:136.4,136.92 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:124.4,125.98 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:125.98,128.6 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:132.19,134.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:140.44,141.37 1 88
+github.com/ethereum/go-ethereum/vm/vm_debug.go:141.37,143.5 1 88
+github.com/ethereum/go-ethereum/vm/vm_debug.go:152.3,153.14 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:154.3,155.14 1 10
+github.com/ethereum/go-ethereum/vm/vm_debug.go:156.3,157.14 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:158.3,160.14 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:161.3,163.14 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:164.3,171.52 6 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:173.3,174.25 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:175.3,178.25 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:179.3,182.21 2 9
+github.com/ethereum/go-ethereum/vm/vm_debug.go:184.3,190.65 5 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:201.4,201.46 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:202.3,204.23 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:205.3,207.52 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:208.3,211.52 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:212.3,214.51 2 10
+github.com/ethereum/go-ethereum/vm/vm_debug.go:215.3,218.69 2 2
+github.com/ethereum/go-ethereum/vm/vm_debug.go:219.3,224.69 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:225.3,228.69 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:229.3,232.69 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:233.3,236.82 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:237.3,245.37 6 2
+github.com/ethereum/go-ethereum/vm/vm_debug.go:246.3,250.82 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:190.65,193.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:193.6,193.73 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:193.73,197.5 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:197.6,200.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:253.39,258.50 4 12
+github.com/ethereum/go-ethereum/vm/vm_debug.go:258.50,266.5 5 6
+github.com/ethereum/go-ethereum/vm/vm_debug.go:273.27,281.4 4 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:285.3,295.20 6 9
+github.com/ethereum/go-ethereum/vm/vm_debug.go:296.3,306.20 6 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:307.3,317.20 6 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:318.3,322.32 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:326.4,330.20 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:331.3,336.32 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:351.4,352.20 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:353.3,358.32 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:364.4,367.20 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:368.3,373.32 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:388.4,389.20 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:391.3,402.20 6 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:403.3,405.17 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:422.3,428.20 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:429.3,433.20 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:438.3,443.20 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:449.3,453.26 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:458.3,463.20 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:469.3,474.21 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:479.3,481.35 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:488.3,492.30 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:493.3,497.29 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:498.3,502.30 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:503.3,506.34 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:514.4,516.20 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:517.3,530.20 8 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:531.3,544.20 8 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:547.3,553.31 4 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:555.3,558.44 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:559.3,566.45 4 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:567.3,572.33 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:573.3,577.33 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:578.3,583.32 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:584.3,591.32 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:598.4,600.34 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:601.3,605.28 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:606.3,614.19 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:621.4,625.72 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:626.3,628.25 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:636.4,639.28 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:640.3,642.25 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:650.4,657.19 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:664.4,668.72 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:669.3,672.40 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:675.3,680.37 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:681.3,686.37 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:687.3,692.33 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:693.3,698.43 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:699.3,704.47 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:705.3,706.35 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:709.3,720.41 8 47
+github.com/ethereum/go-ethereum/vm/vm_debug.go:721.3,722.15 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:723.3,729.151 4 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:732.3,736.62 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:737.3,742.27 5 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:746.4,749.30 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:750.3,755.40 4 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:756.3,761.32 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:762.3,768.42 4 10
+github.com/ethereum/go-ethereum/vm/vm_debug.go:769.3,774.59 4 9
+github.com/ethereum/go-ethereum/vm/vm_debug.go:775.3,780.30 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:784.4,784.59 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:785.3,789.12 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:790.3,793.38 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:799.3,799.17 0 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:800.3,801.18 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:802.3,803.44 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:804.3,805.27 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:807.3,831.18 9 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:844.4,847.23 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:850.3,865.22 8 2
+github.com/ethereum/go-ethereum/vm/vm_debug.go:871.4,873.18 3 2
+github.com/ethereum/go-ethereum/vm/vm_debug.go:882.4,885.23 2 2
+github.com/ethereum/go-ethereum/vm/vm_debug.go:889.3,895.35 4 2
+github.com/ethereum/go-ethereum/vm/vm_debug.go:896.3,903.15 4 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:904.3,907.35 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:908.3,914.67 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:322.32,324.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:336.32,338.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:338.6,340.53 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:346.5,348.15 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:340.53,342.6 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:342.7,344.6 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:358.32,360.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:360.6,362.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:373.32,375.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:375.6,377.32 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:383.5,385.15 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:377.32,379.6 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:379.7,381.6 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:405.17,410.39 5 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:416.5,420.20 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:410.39,412.6 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:412.7,414.6 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:433.20,435.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:435.6,437.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:443.20,445.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:445.6,447.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:453.26,455.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:455.6,457.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:463.20,465.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:465.6,467.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:474.21,476.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:476.6,478.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:481.35,483.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:483.6,485.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:506.34,510.5 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:510.6,512.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:591.32,596.5 3 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:614.19,617.5 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:617.6,617.28 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:617.28,619.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:628.25,632.5 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:632.6,634.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:642.25,646.5 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:646.6,648.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:657.19,660.5 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:660.6,660.28 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:660.28,662.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:729.151,731.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:742.27,744.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:780.30,782.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:793.38,796.13 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:831.18,838.5 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:838.6,842.5 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:847.23,849.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:865.22,867.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:867.6,869.5 1 2
+github.com/ethereum/go-ethereum/vm/vm_debug.go:873.18,877.5 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:877.6,881.5 2 2
+github.com/ethereum/go-ethereum/vm/vm_debug.go:885.23,887.5 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:921.22,922.51 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:922.51,923.41 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:923.41,926.98 2 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:926.98,928.7 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:929.7,929.29 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:929.29,930.97 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:930.97,932.7 1 0
+github.com/ethereum/go-ethereum/vm/vm_debug.go:940.77,941.31 1 248
+github.com/ethereum/go-ethereum/vm/vm_debug.go:945.2,945.13 1 248
+github.com/ethereum/go-ethereum/vm/vm_debug.go:941.31,943.3 1 248
+github.com/ethereum/go-ethereum/vm/vm_debug.go:948.44,949.31 1 82
+github.com/ethereum/go-ethereum/vm/vm_debug.go:954.2,954.13 1 82
+github.com/ethereum/go-ethereum/vm/vm_debug.go:949.31,952.3 2 82
+github.com/ethereum/go-ethereum/vm/vm_debug.go:957.40,959.2 1 4
+github.com/ethereum/go-ethereum/vm/vm_debug.go:961.34,963.2 1 0
+github.com/ethereum/go-ethereum/vm/closure.go:34.126,46.2 5 4
+github.com/ethereum/go-ethereum/vm/closure.go:49.57,51.14 2 3
+github.com/ethereum/go-ethereum/vm/closure.go:55.2,55.10 1 3
+github.com/ethereum/go-ethereum/vm/closure.go:51.14,53.3 1 0
+github.com/ethereum/go-ethereum/vm/closure.go:58.50,60.2 1 0
+github.com/ethereum/go-ethereum/vm/closure.go:62.39,64.2 1 102
+github.com/ethereum/go-ethereum/vm/closure.go:66.39,67.21 1 102
+github.com/ethereum/go-ethereum/vm/closure.go:71.2,71.10 1 0
+github.com/ethereum/go-ethereum/vm/closure.go:67.21,69.3 1 102
+github.com/ethereum/go-ethereum/vm/closure.go:74.45,75.42 1 11
+github.com/ethereum/go-ethereum/vm/closure.go:79.2,79.24 1 11
+github.com/ethereum/go-ethereum/vm/closure.go:75.42,77.3 1 0
+github.com/ethereum/go-ethereum/vm/closure.go:82.54,83.72 1 47
+github.com/ethereum/go-ethereum/vm/closure.go:87.2,89.34 2 47
+github.com/ethereum/go-ethereum/vm/closure.go:83.72,85.3 1 0
+github.com/ethereum/go-ethereum/vm/closure.go:92.62,94.2 1 0
+github.com/ethereum/go-ethereum/vm/closure.go:96.36,98.2 1 16
+github.com/ethereum/go-ethereum/vm/closure.go:100.82,106.2 3 4
+github.com/ethereum/go-ethereum/vm/closure.go:108.45,113.2 2 4
+github.com/ethereum/go-ethereum/vm/closure.go:115.45,116.24 1 102
+github.com/ethereum/go-ethereum/vm/closure.go:121.2,124.13 3 102
+github.com/ethereum/go-ethereum/vm/closure.go:116.24,118.3 1 0
+github.com/ethereum/go-ethereum/vm/closure.go:128.50,132.2 2 0
+github.com/ethereum/go-ethereum/vm/closure.go:134.47,136.2 1 2
+github.com/ethereum/go-ethereum/vm/closure.go:138.39,140.2 1 0
+github.com/ethereum/go-ethereum/vm/closure.go:142.51,144.2 1 0
+github.com/ethereum/go-ethereum/vm/common.go:46.44,47.30 1 20
+github.com/ethereum/go-ethereum/vm/common.go:51.2,51.33 1 18
+github.com/ethereum/go-ethereum/vm/common.go:47.30,49.3 1 2
+github.com/ethereum/go-ethereum/vm/common.go:55.29,57.2 1 94
+github.com/ethereum/go-ethereum/vm/common.go:60.40,63.59 2 0
+github.com/ethereum/go-ethereum/vm/common.go:67.2,67.12 1 0
+github.com/ethereum/go-ethereum/vm/common.go:63.59,65.3 1 0
+github.com/ethereum/go-ethereum/vm/types.go:328.33,330.19 2 81
+github.com/ethereum/go-ethereum/vm/types.go:334.2,334.12 1 81
+github.com/ethereum/go-ethereum/vm/types.go:330.19,332.3 1 0
+github.com/ethereum/go-ethereum/vm/asm.go:10.48,12.6 2 0
+github.com/ethereum/go-ethereum/vm/asm.go:44.2,44.8 1 0
+github.com/ethereum/go-ethereum/vm/asm.go:12.6,13.50 1 0
+github.com/ethereum/go-ethereum/vm/asm.go:18.3,24.13 4 0
+github.com/ethereum/go-ethereum/vm/asm.go:41.3,41.27 1 0
+github.com/ethereum/go-ethereum/vm/asm.go:13.50,15.4 1 0
+github.com/ethereum/go-ethereum/vm/asm.go:25.3,28.39 3 0
+github.com/ethereum/go-ethereum/vm/asm.go:32.4,33.22 2 0
+github.com/ethereum/go-ethereum/vm/asm.go:36.4,38.31 2 0
+github.com/ethereum/go-ethereum/vm/asm.go:28.39,30.5 1 0
+github.com/ethereum/go-ethereum/vm/asm.go:33.22,35.5 1 0
+github.com/ethereum/go-ethereum/vm/errors.go:12.43,14.2 1 0
+github.com/ethereum/go-ethereum/vm/errors.go:16.42,18.2 1 0
+github.com/ethereum/go-ethereum/vm/errors.go:20.31,23.2 2 2
+github.com/ethereum/go-ethereum/vm/errors.go:29.40,31.2 1 0
+github.com/ethereum/go-ethereum/vm/errors.go:33.39,35.2 1 0
+github.com/ethereum/go-ethereum/vm/errors.go:37.30,40.2 2 0
+github.com/ethereum/go-ethereum/vm/errors.go:44.39,46.2 1 0
+github.com/ethereum/go-ethereum/vm/errors.go:48.33,51.2 2 2
+github.com/ethereum/go-ethereum/vm/analysis.go:9.63,14.50 4 3
+github.com/ethereum/go-ethereum/vm/analysis.go:34.2,34.8 1 3
+github.com/ethereum/go-ethereum/vm/analysis.go:14.50,16.13 2 117
+github.com/ethereum/go-ethereum/vm/analysis.go:17.3,19.33 2 61
+github.com/ethereum/go-ethereum/vm/analysis.go:23.4,24.13 2 61
+github.com/ethereum/go-ethereum/vm/analysis.go:25.3,26.10 1 0
+github.com/ethereum/go-ethereum/vm/analysis.go:30.3,31.14 1 56
+github.com/ethereum/go-ethereum/vm/analysis.go:19.33,21.5 1 61
+github.com/ethereum/go-ethereum/vm/analysis.go:26.10,28.5 1 0
+github.com/ethereum/go-ethereum/vm/environment.go:38.56,39.36 1 0
+github.com/ethereum/go-ethereum/vm/environment.go:43.2,50.12 3 0
+github.com/ethereum/go-ethereum/vm/environment.go:39.36,41.3 1 0
+github.com/ethereum/go-ethereum/wire/client_identity.go:21.118,31.2 2 1
+github.com/ethereum/go-ethereum/wire/client_identity.go:33.39,34.2 0 0
+github.com/ethereum/go-ethereum/wire/client_identity.go:36.48,38.33 2 2
+github.com/ethereum/go-ethereum/wire/client_identity.go:42.2,47.20 1 2
+github.com/ethereum/go-ethereum/wire/client_identity.go:38.33,40.3 1 2
+github.com/ethereum/go-ethereum/wire/client_identity.go:50.77,52.2 1 1
+github.com/ethereum/go-ethereum/wire/client_identity.go:54.61,56.2 1 2
+github.com/ethereum/go-ethereum/wire/messages2.go:23.37,25.2 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:28.37,29.36 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:33.2,36.12 3 0
+github.com/ethereum/go-ethereum/wire/messages2.go:29.36,31.3 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:43.68,47.26 3 0
+github.com/ethereum/go-ethereum/wire/messages2.go:58.2,67.16 6 0
+github.com/ethereum/go-ethereum/wire/messages2.go:71.2,71.12 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:47.26,48.59 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:48.59,50.4 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:50.5,50.50 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:50.50,52.4 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:52.5,54.4 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:67.16,69.3 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:74.101,75.20 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:79.2,79.20 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:84.2,84.46 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:88.2,90.40 3 0
+github.com/ethereum/go-ethereum/wire/messages2.go:94.2,106.8 6 0
+github.com/ethereum/go-ethereum/wire/messages2.go:75.20,77.3 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:79.20,81.3 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:84.46,86.3 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:90.40,92.3 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:112.52,114.15 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:122.2,124.6 3 0
+github.com/ethereum/go-ethereum/wire/messages2.go:149.2,151.78 3 0
+github.com/ethereum/go-ethereum/wire/messages2.go:159.2,159.8 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:114.15,115.31 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:115.31,117.4 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:124.6,131.27 4 0
+github.com/ethereum/go-ethereum/wire/messages2.go:144.3,145.18 2 0
+github.com/ethereum/go-ethereum/wire/messages2.go:131.27,132.28 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:132.28,135.5 2 0
+github.com/ethereum/go-ethereum/wire/messages2.go:135.6,136.10 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:140.5,140.20 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:140.20,141.9 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:151.78,154.17 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:154.17,156.4 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:162.82,163.20 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:167.2,167.20 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:172.2,172.46 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:176.2,178.40 3 0
+github.com/ethereum/go-ethereum/wire/messages2.go:182.2,194.8 6 0
+github.com/ethereum/go-ethereum/wire/messages2.go:163.20,165.3 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:167.20,169.3 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:172.46,174.3 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:178.40,180.3 1 0
+github.com/ethereum/go-ethereum/wire/messages2.go:197.50,199.2 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:62.35,64.2 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:72.57,77.2 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:84.59,86.15 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:92.2,98.6 2 0
+github.com/ethereum/go-ethereum/wire/messaging.go:145.2,145.29 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:155.2,155.8 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:86.15,87.31 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:87.31,89.4 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:98.6,104.27 4 0
+github.com/ethereum/go-ethereum/wire/messaging.go:113.3,113.31 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:120.3,121.21 2 0
+github.com/ethereum/go-ethereum/wire/messaging.go:134.3,134.29 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:104.27,105.28 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:105.28,108.5 2 0
+github.com/ethereum/go-ethereum/wire/messaging.go:108.6,109.10 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:113.31,117.12 2 0
+github.com/ethereum/go-ethereum/wire/messaging.go:121.21,123.48 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:128.4,131.19 2 0
+github.com/ethereum/go-ethereum/wire/messaging.go:123.48,125.5 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:134.29,139.22 4 0
+github.com/ethereum/go-ethereum/wire/messaging.go:139.22,140.10 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:145.29,153.3 4 0
+github.com/ethereum/go-ethereum/wire/messaging.go:160.50,174.16 7 0
+github.com/ethereum/go-ethereum/wire/messaging.go:178.2,178.12 1 0
+github.com/ethereum/go-ethereum/wire/messaging.go:174.16,176.3 1 0
diff --git a/ptrie/cache.go b/ptrie/cache.go
new file mode 100644
index 000000000..721dc4cf6
--- /dev/null
+++ b/ptrie/cache.go
@@ -0,0 +1,42 @@
+package ptrie
+
+type Backend interface {
+ Get([]byte) ([]byte, error)
+ Put([]byte, []byte)
+}
+
+type Cache struct {
+ store map[string][]byte
+ backend Backend
+}
+
+func NewCache(backend Backend) *Cache {
+ return &Cache{make(map[string][]byte), backend}
+}
+
+func (self *Cache) Get(key []byte) []byte {
+ data := self.store[string(key)]
+ if data == nil {
+ data, _ = self.backend.Get(key)
+ }
+
+ return data
+}
+
+func (self *Cache) Put(key []byte, data []byte) {
+ self.store[string(key)] = data
+}
+
+func (self *Cache) Flush() {
+ for k, v := range self.store {
+ self.backend.Put([]byte(k), v)
+ }
+
+ // This will eventually grow too large. We'd could
+ // do a make limit on storage and push out not-so-popular nodes.
+ //self.Reset()
+}
+
+func (self *Cache) Reset() {
+ self.store = make(map[string][]byte)
+}
diff --git a/ptrie/fullnode.go b/ptrie/fullnode.go
new file mode 100644
index 000000000..7a7f7d22d
--- /dev/null
+++ b/ptrie/fullnode.go
@@ -0,0 +1,69 @@
+package ptrie
+
+type FullNode struct {
+ trie *Trie
+ nodes [17]Node
+}
+
+func NewFullNode(t *Trie) *FullNode {
+ return &FullNode{trie: t}
+}
+
+func (self *FullNode) Dirty() bool { return true }
+func (self *FullNode) Value() Node {
+ self.nodes[16] = self.trie.trans(self.nodes[16])
+ return self.nodes[16]
+}
+func (self *FullNode) Branches() []Node {
+ return self.nodes[:16]
+}
+
+func (self *FullNode) Copy() Node {
+ nnode := NewFullNode(self.trie)
+ for i, node := range self.nodes {
+ nnode.nodes[i] = node
+ }
+
+ return nnode
+}
+
+// Returns the length of non-nil nodes
+func (self *FullNode) Len() (amount int) {
+ for _, node := range self.nodes {
+ if node != nil {
+ amount++
+ }
+ }
+
+ return
+}
+
+func (self *FullNode) Hash() interface{} {
+ return self.trie.store(self)
+}
+
+func (self *FullNode) RlpData() interface{} {
+ t := make([]interface{}, 17)
+ for i, node := range self.nodes {
+ if node != nil {
+ t[i] = node.Hash()
+ } else {
+ t[i] = ""
+ }
+ }
+
+ return t
+}
+
+func (self *FullNode) set(k byte, value Node) {
+ self.nodes[int(k)] = value
+}
+
+func (self *FullNode) branch(i byte) Node {
+ if self.nodes[int(i)] != nil {
+ self.nodes[int(i)] = self.trie.trans(self.nodes[int(i)])
+
+ return self.nodes[int(i)]
+ }
+ return nil
+}
diff --git a/ptrie/hashnode.go b/ptrie/hashnode.go
new file mode 100644
index 000000000..4c17569d7
--- /dev/null
+++ b/ptrie/hashnode.go
@@ -0,0 +1,22 @@
+package ptrie
+
+type HashNode struct {
+ key []byte
+}
+
+func NewHash(key []byte) *HashNode {
+ return &HashNode{key}
+}
+
+func (self *HashNode) RlpData() interface{} {
+ return self.key
+}
+
+func (self *HashNode) Hash() interface{} {
+ return self.key
+}
+
+// These methods will never be called but we have to satisfy Node interface
+func (self *HashNode) Value() Node { return nil }
+func (self *HashNode) Dirty() bool { return true }
+func (self *HashNode) Copy() Node { return self }
diff --git a/ptrie/iterator.go b/ptrie/iterator.go
new file mode 100644
index 000000000..5714bdbc8
--- /dev/null
+++ b/ptrie/iterator.go
@@ -0,0 +1,115 @@
+package ptrie
+
+import (
+ "bytes"
+
+ "github.com/ethereum/go-ethereum/trie"
+)
+
+type Iterator struct {
+ trie *Trie
+
+ Key []byte
+ Value []byte
+}
+
+func NewIterator(trie *Trie) *Iterator {
+ return &Iterator{trie: trie, Key: []byte{0}}
+}
+
+func (self *Iterator) Next() bool {
+ self.trie.mu.Lock()
+ defer self.trie.mu.Unlock()
+
+ key := trie.RemTerm(trie.CompactHexDecode(string(self.Key)))
+ k := self.next(self.trie.root, key)
+
+ self.Key = []byte(trie.DecodeCompact(k))
+
+ return len(k) > 0
+
+}
+
+func (self *Iterator) next(node Node, key []byte) []byte {
+ if node == nil {
+ return nil
+ }
+
+ switch node := node.(type) {
+ case *FullNode:
+ if len(key) > 0 {
+ k := self.next(node.branch(key[0]), key[1:])
+ if k != nil {
+ return append([]byte{key[0]}, k...)
+ }
+ }
+
+ var r byte
+ if len(key) > 0 {
+ r = key[0] + 1
+ }
+
+ for i := r; i < 16; i++ {
+ k := self.key(node.branch(byte(i)))
+ if k != nil {
+ return append([]byte{i}, k...)
+ }
+ }
+
+ case *ShortNode:
+ k := trie.RemTerm(node.Key())
+ if vnode, ok := node.Value().(*ValueNode); ok {
+ if bytes.Compare([]byte(k), key) > 0 {
+ self.Value = vnode.Val()
+ return k
+ }
+ } else {
+ cnode := node.Value()
+
+ var ret []byte
+ skey := key[len(k):]
+ if trie.BeginsWith(key, k) {
+ ret = self.next(cnode, skey)
+ } else if bytes.Compare(k, key[:len(k)]) > 0 {
+ ret = self.key(node)
+ }
+
+ if ret != nil {
+ return append(k, ret...)
+ }
+ }
+ }
+
+ return nil
+}
+
+func (self *Iterator) key(node Node) []byte {
+ switch node := node.(type) {
+ case *ShortNode:
+ // Leaf node
+ if vnode, ok := node.Value().(*ValueNode); ok {
+ k := trie.RemTerm(node.Key())
+ self.Value = vnode.Val()
+
+ return k
+ } else {
+ k := trie.RemTerm(node.Key())
+ return append(k, self.key(node.Value())...)
+ }
+ case *FullNode:
+ if node.Value() != nil {
+ self.Value = node.Value().(*ValueNode).Val()
+
+ return []byte{16}
+ }
+
+ for i := 0; i < 16; i++ {
+ k := self.key(node.branch(byte(i)))
+ if k != nil {
+ return append([]byte{byte(i)}, k...)
+ }
+ }
+ }
+
+ return nil
+}
diff --git a/ptrie/iterator_test.go b/ptrie/iterator_test.go
new file mode 100644
index 000000000..acfc03d63
--- /dev/null
+++ b/ptrie/iterator_test.go
@@ -0,0 +1,33 @@
+package ptrie
+
+import "testing"
+
+func TestIterator(t *testing.T) {
+ trie := NewEmpty()
+ vals := []struct{ k, v string }{
+ {"do", "verb"},
+ {"ether", "wookiedoo"},
+ {"horse", "stallion"},
+ {"shaman", "horse"},
+ {"doge", "coin"},
+ {"dog", "puppy"},
+ {"somethingveryoddindeedthis is", "myothernodedata"},
+ }
+ v := make(map[string]bool)
+ for _, val := range vals {
+ v[val.k] = false
+ trie.UpdateString(val.k, val.v)
+ }
+ trie.Commit()
+
+ it := trie.Iterator()
+ for it.Next() {
+ v[string(it.Key)] = true
+ }
+
+ for k, found := range v {
+ if !found {
+ t.Error("iterator didn't find", k)
+ }
+ }
+}
diff --git a/ptrie/node.go b/ptrie/node.go
new file mode 100644
index 000000000..2c85dbce7
--- /dev/null
+++ b/ptrie/node.go
@@ -0,0 +1,40 @@
+package ptrie
+
+import "fmt"
+
+var indices = []string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "[17]"}
+
+type Node interface {
+ Value() Node
+ Copy() Node // All nodes, for now, return them self
+ Dirty() bool
+ fstring(string) string
+ Hash() interface{}
+ RlpData() interface{}
+}
+
+// Value node
+func (self *ValueNode) String() string { return self.fstring("") }
+func (self *FullNode) String() string { return self.fstring("") }
+func (self *ShortNode) String() string { return self.fstring("") }
+func (self *ValueNode) fstring(ind string) string { return fmt.Sprintf("%s ", self.data) }
+func (self *HashNode) fstring(ind string) string { return fmt.Sprintf("%x ", self.key) }
+
+// Full node
+func (self *FullNode) fstring(ind string) string {
+ resp := fmt.Sprintf("[\n%s ", ind)
+ for i, node := range self.nodes {
+ if node == nil {
+ resp += fmt.Sprintf("%s: ", indices[i])
+ } else {
+ resp += fmt.Sprintf("%s: %v", indices[i], node.fstring(ind+" "))
+ }
+ }
+
+ return resp + fmt.Sprintf("\n%s] ", ind)
+}
+
+// Short node
+func (self *ShortNode) fstring(ind string) string {
+ return fmt.Sprintf("[ %s: %v ] ", self.key, self.value.fstring(ind+" "))
+}
diff --git a/ptrie/shortnode.go b/ptrie/shortnode.go
new file mode 100644
index 000000000..73ff2914b
--- /dev/null
+++ b/ptrie/shortnode.go
@@ -0,0 +1,31 @@
+package ptrie
+
+import "github.com/ethereum/go-ethereum/trie"
+
+type ShortNode struct {
+ trie *Trie
+ key []byte
+ value Node
+}
+
+func NewShortNode(t *Trie, key []byte, value Node) *ShortNode {
+ return &ShortNode{t, []byte(trie.CompactEncode(key)), value}
+}
+func (self *ShortNode) Value() Node {
+ self.value = self.trie.trans(self.value)
+
+ return self.value
+}
+func (self *ShortNode) Dirty() bool { return true }
+func (self *ShortNode) Copy() Node { return NewShortNode(self.trie, self.key, self.value) }
+
+func (self *ShortNode) RlpData() interface{} {
+ return []interface{}{self.key, self.value.Hash()}
+}
+func (self *ShortNode) Hash() interface{} {
+ return self.trie.store(self)
+}
+
+func (self *ShortNode) Key() []byte {
+ return trie.CompactDecode(string(self.key))
+}
diff --git a/ptrie/trie.go b/ptrie/trie.go
new file mode 100644
index 000000000..9fe9ea52a
--- /dev/null
+++ b/ptrie/trie.go
@@ -0,0 +1,312 @@
+package ptrie
+
+import (
+ "bytes"
+ "container/list"
+ "fmt"
+ "sync"
+
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/trie"
+)
+
+func ParanoiaCheck(t1 *Trie, backend Backend) (bool, *Trie) {
+ t2 := New(nil, backend)
+
+ it := t1.Iterator()
+ for it.Next() {
+ t2.Update(it.Key, it.Value)
+ }
+
+ return bytes.Compare(t2.Hash(), t1.Hash()) == 0, t2
+}
+
+type Trie struct {
+ mu sync.Mutex
+ root Node
+ roothash []byte
+ cache *Cache
+
+ revisions *list.List
+}
+
+func New(root []byte, backend Backend) *Trie {
+ trie := &Trie{}
+ trie.revisions = list.New()
+ trie.roothash = root
+ trie.cache = NewCache(backend)
+
+ if root != nil {
+ value := ethutil.NewValueFromBytes(trie.cache.Get(root))
+ trie.root = trie.mknode(value)
+ }
+
+ return trie
+}
+
+func (self *Trie) Iterator() *Iterator {
+ return NewIterator(self)
+}
+
+// Legacy support
+func (self *Trie) Root() []byte { return self.Hash() }
+func (self *Trie) Hash() []byte {
+ var hash []byte
+ if self.root != nil {
+ //hash = self.root.Hash().([]byte)
+ t := self.root.Hash()
+ if byts, ok := t.([]byte); ok {
+ hash = byts
+ } else {
+ hash = crypto.Sha3(ethutil.Encode(self.root.RlpData()))
+ }
+ } else {
+ hash = crypto.Sha3(ethutil.Encode(""))
+ }
+
+ if !bytes.Equal(hash, self.roothash) {
+ self.revisions.PushBack(self.roothash)
+ self.roothash = hash
+ }
+
+ return hash
+}
+func (self *Trie) Commit() {
+ // Hash first
+ self.Hash()
+
+ self.cache.Flush()
+}
+
+// Reset should only be called if the trie has been hashed
+func (self *Trie) Reset() {
+ self.cache.Reset()
+
+ revision := self.revisions.Remove(self.revisions.Back()).([]byte)
+ self.roothash = revision
+ value := ethutil.NewValueFromBytes(self.cache.Get(self.roothash))
+ self.root = self.mknode(value)
+}
+
+func (self *Trie) UpdateString(key, value string) Node { return self.Update([]byte(key), []byte(value)) }
+func (self *Trie) Update(key, value []byte) Node {
+ self.mu.Lock()
+ defer self.mu.Unlock()
+
+ k := trie.CompactHexDecode(string(key))
+
+ if len(value) != 0 {
+ self.root = self.insert(self.root, k, &ValueNode{self, value})
+ } else {
+ self.root = self.delete(self.root, k)
+ }
+
+ return self.root
+}
+
+func (self *Trie) GetString(key string) []byte { return self.Get([]byte(key)) }
+func (self *Trie) Get(key []byte) []byte {
+ self.mu.Lock()
+ defer self.mu.Unlock()
+
+ k := trie.CompactHexDecode(string(key))
+
+ n := self.get(self.root, k)
+ if n != nil {
+ return n.(*ValueNode).Val()
+ }
+
+ return nil
+}
+
+func (self *Trie) DeleteString(key string) Node { return self.Delete([]byte(key)) }
+func (self *Trie) Delete(key []byte) Node {
+ self.mu.Lock()
+ defer self.mu.Unlock()
+
+ k := trie.CompactHexDecode(string(key))
+ self.root = self.delete(self.root, k)
+
+ return self.root
+}
+
+func (self *Trie) insert(node Node, key []byte, value Node) Node {
+ if len(key) == 0 {
+ return value
+ }
+
+ if node == nil {
+ return NewShortNode(self, key, value)
+ }
+
+ switch node := node.(type) {
+ case *ShortNode:
+ k := node.Key()
+ cnode := node.Value()
+ if bytes.Equal(k, key) {
+ return NewShortNode(self, key, value)
+ }
+
+ var n Node
+ matchlength := trie.MatchingNibbleLength(key, k)
+ if matchlength == len(k) {
+ n = self.insert(cnode, key[matchlength:], value)
+ } else {
+ pnode := self.insert(nil, k[matchlength+1:], cnode)
+ nnode := self.insert(nil, key[matchlength+1:], value)
+ fulln := NewFullNode(self)
+ fulln.set(k[matchlength], pnode)
+ fulln.set(key[matchlength], nnode)
+ n = fulln
+ }
+ if matchlength == 0 {
+ return n
+ }
+
+ return NewShortNode(self, key[:matchlength], n)
+
+ case *FullNode:
+ cpy := node.Copy().(*FullNode)
+ cpy.set(key[0], self.insert(node.branch(key[0]), key[1:], value))
+
+ return cpy
+
+ default:
+ panic("Invalid node")
+ }
+}
+
+func (self *Trie) get(node Node, key []byte) Node {
+ if len(key) == 0 {
+ return node
+ }
+
+ if node == nil {
+ return nil
+ }
+
+ switch node := node.(type) {
+ case *ShortNode:
+ k := node.Key()
+ cnode := node.Value()
+
+ if len(key) >= len(k) && bytes.Equal(k, key[:len(k)]) {
+ return self.get(cnode, key[len(k):])
+ }
+
+ return nil
+ case *FullNode:
+ return self.get(node.branch(key[0]), key[1:])
+ default:
+ panic(fmt.Sprintf("%T: invalid node: %v", node, node))
+ }
+}
+
+func (self *Trie) delete(node Node, key []byte) Node {
+ if len(key) == 0 {
+ return nil
+ }
+
+ switch node := node.(type) {
+ case *ShortNode:
+ k := node.Key()
+ cnode := node.Value()
+ if bytes.Equal(key, k) {
+ return nil
+ } else if bytes.Equal(key[:len(k)], k) {
+ child := self.delete(cnode, key[len(k):])
+
+ var n Node
+ switch child := child.(type) {
+ case *ShortNode:
+ nkey := append(k, child.Key()...)
+ n = NewShortNode(self, nkey, child.Value())
+ case *FullNode:
+ n = NewShortNode(self, node.key, child)
+ }
+
+ return n
+ } else {
+ return node
+ }
+
+ case *FullNode:
+ n := node.Copy().(*FullNode)
+ n.set(key[0], self.delete(n.branch(key[0]), key[1:]))
+
+ pos := -1
+ for i := 0; i < 17; i++ {
+ if n.branch(byte(i)) != nil {
+ if pos == -1 {
+ pos = i
+ } else {
+ pos = -2
+ }
+ }
+ }
+
+ var nnode Node
+ if pos == 16 {
+ nnode = NewShortNode(self, []byte{16}, n.branch(byte(pos)))
+ } else if pos >= 0 {
+ cnode := n.branch(byte(pos))
+ switch cnode := cnode.(type) {
+ case *ShortNode:
+ // Stitch keys
+ k := append([]byte{byte(pos)}, cnode.Key()...)
+ nnode = NewShortNode(self, k, cnode.Value())
+ case *FullNode:
+ nnode = NewShortNode(self, []byte{byte(pos)}, n.branch(byte(pos)))
+ }
+ } else {
+ nnode = n
+ }
+
+ return nnode
+
+ default:
+ panic("Invalid node")
+ }
+}
+
+// casting functions and cache storing
+func (self *Trie) mknode(value *ethutil.Value) Node {
+ l := value.Len()
+ switch l {
+ case 2:
+ return NewShortNode(self, trie.CompactDecode(string(value.Get(0).Bytes())), self.mknode(value.Get(1)))
+ case 17:
+ fnode := NewFullNode(self)
+ for i := 0; i < l; i++ {
+ fnode.set(byte(i), self.mknode(value.Get(i)))
+ }
+ return fnode
+ case 32:
+ return &HashNode{value.Bytes()}
+ default:
+ return &ValueNode{self, value.Bytes()}
+ }
+}
+
+func (self *Trie) trans(node Node) Node {
+ switch node := node.(type) {
+ case *HashNode:
+ value := ethutil.NewValueFromBytes(self.cache.Get(node.key))
+ return self.mknode(value)
+ default:
+ return node
+ }
+}
+
+func (self *Trie) store(node Node) interface{} {
+ data := ethutil.Encode(node)
+ if len(data) >= 32 {
+ key := crypto.Sha3(data)
+ self.cache.Put(key, data)
+
+ return key
+ }
+
+ return node.RlpData()
+}
diff --git a/ptrie/trie_test.go b/ptrie/trie_test.go
new file mode 100644
index 000000000..5b1c64140
--- /dev/null
+++ b/ptrie/trie_test.go
@@ -0,0 +1,259 @@
+package ptrie
+
+import (
+ "bytes"
+ "fmt"
+ "testing"
+
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethutil"
+)
+
+type Db map[string][]byte
+
+func (self Db) Get(k []byte) ([]byte, error) { return self[string(k)], nil }
+func (self Db) Put(k, v []byte) { self[string(k)] = v }
+
+// Used for testing
+func NewEmpty() *Trie {
+ return New(nil, make(Db))
+}
+
+func TestEmptyTrie(t *testing.T) {
+ trie := NewEmpty()
+ res := trie.Hash()
+ exp := crypto.Sha3(ethutil.Encode(""))
+ if !bytes.Equal(res, exp) {
+ t.Errorf("expected %x got %x", exp, res)
+ }
+}
+
+func TestInsert(t *testing.T) {
+ trie := NewEmpty()
+
+ trie.UpdateString("doe", "reindeer")
+ trie.UpdateString("dog", "puppy")
+ trie.UpdateString("dogglesworth", "cat")
+
+ exp := ethutil.Hex2Bytes("8aad789dff2f538bca5d8ea56e8abe10f4c7ba3a5dea95fea4cd6e7c3a1168d3")
+ root := trie.Hash()
+ if !bytes.Equal(root, exp) {
+ t.Errorf("exp %x got %x", exp, root)
+ }
+
+ trie = NewEmpty()
+ trie.UpdateString("A", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
+
+ exp = ethutil.Hex2Bytes("d23786fb4a010da3ce639d66d5e904a11dbc02746d1ce25029e53290cabf28ab")
+ root = trie.Hash()
+ if !bytes.Equal(root, exp) {
+ t.Errorf("exp %x got %x", exp, root)
+ }
+}
+
+func TestGet(t *testing.T) {
+ trie := NewEmpty()
+
+ trie.UpdateString("doe", "reindeer")
+ trie.UpdateString("dog", "puppy")
+ trie.UpdateString("dogglesworth", "cat")
+
+ res := trie.GetString("dog")
+ if !bytes.Equal(res, []byte("puppy")) {
+ t.Errorf("expected puppy got %x", res)
+ }
+
+ unknown := trie.GetString("unknown")
+ if unknown != nil {
+ t.Errorf("expected nil got %x", unknown)
+ }
+}
+
+func TestDelete(t *testing.T) {
+ trie := NewEmpty()
+
+ vals := []struct{ k, v string }{
+ {"do", "verb"},
+ {"ether", "wookiedoo"},
+ {"horse", "stallion"},
+ {"shaman", "horse"},
+ {"doge", "coin"},
+ {"ether", ""},
+ {"dog", "puppy"},
+ {"shaman", ""},
+ }
+ for _, val := range vals {
+ if val.v != "" {
+ trie.UpdateString(val.k, val.v)
+ } else {
+ trie.DeleteString(val.k)
+ }
+ }
+
+ hash := trie.Hash()
+ exp := ethutil.Hex2Bytes("5991bb8c6514148a29db676a14ac506cd2cd5775ace63c30a4fe457715e9ac84")
+ if !bytes.Equal(hash, exp) {
+ t.Errorf("expected %x got %x", exp, hash)
+ }
+}
+
+func TestEmptyValues(t *testing.T) {
+ trie := NewEmpty()
+
+ vals := []struct{ k, v string }{
+ {"do", "verb"},
+ {"ether", "wookiedoo"},
+ {"horse", "stallion"},
+ {"shaman", "horse"},
+ {"doge", "coin"},
+ {"ether", ""},
+ {"dog", "puppy"},
+ {"shaman", ""},
+ }
+ for _, val := range vals {
+ trie.UpdateString(val.k, val.v)
+ }
+
+ hash := trie.Hash()
+ exp := ethutil.Hex2Bytes("5991bb8c6514148a29db676a14ac506cd2cd5775ace63c30a4fe457715e9ac84")
+ if !bytes.Equal(hash, exp) {
+ t.Errorf("expected %x got %x", exp, hash)
+ }
+}
+
+func TestReplication(t *testing.T) {
+ trie := NewEmpty()
+ vals := []struct{ k, v string }{
+ {"do", "verb"},
+ {"ether", "wookiedoo"},
+ {"horse", "stallion"},
+ {"shaman", "horse"},
+ {"doge", "coin"},
+ {"ether", ""},
+ {"dog", "puppy"},
+ {"shaman", ""},
+ {"somethingveryoddindeedthis is", "myothernodedata"},
+ }
+ for _, val := range vals {
+ trie.UpdateString(val.k, val.v)
+ }
+ trie.Commit()
+
+ trie2 := New(trie.roothash, trie.cache.backend)
+ if string(trie2.GetString("horse")) != "stallion" {
+ t.Error("expected to have harse => stallion")
+ }
+
+ hash := trie2.Hash()
+ exp := trie.Hash()
+ if !bytes.Equal(hash, exp) {
+ t.Errorf("root failure. expected %x got %x", exp, hash)
+ }
+
+}
+
+func TestReset(t *testing.T) {
+ trie := NewEmpty()
+ vals := []struct{ k, v string }{
+ {"do", "verb"},
+ {"ether", "wookiedoo"},
+ {"horse", "stallion"},
+ }
+ for _, val := range vals {
+ trie.UpdateString(val.k, val.v)
+ }
+ trie.Commit()
+
+ before := ethutil.CopyBytes(trie.roothash)
+ trie.UpdateString("should", "revert")
+ trie.Hash()
+ // Should have no effect
+ trie.Hash()
+ trie.Hash()
+ // ###
+
+ trie.Reset()
+ after := ethutil.CopyBytes(trie.roothash)
+
+ if !bytes.Equal(before, after) {
+ t.Errorf("expected roots to be equal. %x - %x", before, after)
+ }
+}
+
+func TestParanoia(t *testing.T) {
+ t.Skip()
+ trie := NewEmpty()
+
+ vals := []struct{ k, v string }{
+ {"do", "verb"},
+ {"ether", "wookiedoo"},
+ {"horse", "stallion"},
+ {"shaman", "horse"},
+ {"doge", "coin"},
+ {"ether", ""},
+ {"dog", "puppy"},
+ {"shaman", ""},
+ {"somethingveryoddindeedthis is", "myothernodedata"},
+ }
+ for _, val := range vals {
+ trie.UpdateString(val.k, val.v)
+ }
+ trie.Commit()
+
+ ok, t2 := ParanoiaCheck(trie, trie.cache.backend)
+ if !ok {
+ t.Errorf("trie paranoia check failed %x %x", trie.roothash, t2.roothash)
+ }
+}
+
+// Not an actual test
+func TestOutput(t *testing.T) {
+ t.Skip()
+
+ base := "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ trie := NewEmpty()
+ for i := 0; i < 50; i++ {
+ trie.UpdateString(fmt.Sprintf("%s%d", base, i), "valueeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee")
+ }
+ fmt.Println("############################## FULL ################################")
+ fmt.Println(trie.root)
+
+ trie.Commit()
+ fmt.Println("############################## SMALL ################################")
+ trie2 := New(trie.roothash, trie.cache.backend)
+ trie2.GetString(base + "20")
+ fmt.Println(trie2.root)
+}
+
+func BenchmarkGets(b *testing.B) {
+ trie := NewEmpty()
+ vals := []struct{ k, v string }{
+ {"do", "verb"},
+ {"ether", "wookiedoo"},
+ {"horse", "stallion"},
+ {"shaman", "horse"},
+ {"doge", "coin"},
+ {"ether", ""},
+ {"dog", "puppy"},
+ {"shaman", ""},
+ {"somethingveryoddindeedthis is", "myothernodedata"},
+ }
+ for _, val := range vals {
+ trie.UpdateString(val.k, val.v)
+ }
+
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ trie.Get([]byte("horse"))
+ }
+}
+
+func BenchmarkUpdate(b *testing.B) {
+ trie := NewEmpty()
+
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ trie.UpdateString(fmt.Sprintf("aaaaaaaaa%d", i), "value")
+ }
+ trie.Hash()
+}
diff --git a/ptrie/valuenode.go b/ptrie/valuenode.go
new file mode 100644
index 000000000..c593eb6c6
--- /dev/null
+++ b/ptrie/valuenode.go
@@ -0,0 +1,13 @@
+package ptrie
+
+type ValueNode struct {
+ trie *Trie
+ data []byte
+}
+
+func (self *ValueNode) Value() Node { return self } // Best not to call :-)
+func (self *ValueNode) Val() []byte { return self.data }
+func (self *ValueNode) Dirty() bool { return true }
+func (self *ValueNode) Copy() Node { return &ValueNode{self.trie, self.data} }
+func (self *ValueNode) RlpData() interface{} { return self.data }
+func (self *ValueNode) Hash() interface{} { return self.data }
diff --git a/rlp/decode.go b/rlp/decode.go
new file mode 100644
index 000000000..96d912f56
--- /dev/null
+++ b/rlp/decode.go
@@ -0,0 +1,667 @@
+package rlp
+
+import (
+ "encoding/binary"
+ "errors"
+ "fmt"
+ "io"
+ "math/big"
+ "reflect"
+)
+
+var (
+ errNoPointer = errors.New("rlp: interface given to Decode must be a pointer")
+ errDecodeIntoNil = errors.New("rlp: pointer given to Decode must not be nil")
+)
+
+// Decoder is implemented by types that require custom RLP
+// decoding rules or need to decode into private fields.
+//
+// The DecodeRLP method should read one value from the given
+// Stream. It is not forbidden to read less or more, but it might
+// be confusing.
+type Decoder interface {
+ DecodeRLP(*Stream) error
+}
+
+// Decode parses RLP-encoded data from r and stores the result
+// in the value pointed to by val. Val must be a non-nil pointer.
+//
+// Decode uses the following type-dependent decoding rules:
+//
+// If the type implements the Decoder interface, decode calls
+// DecodeRLP.
+//
+// To decode into a pointer, Decode will set the pointer to nil if the
+// input has size zero or the input is a single byte with value zero.
+// If the input has nonzero size, Decode will allocate a new value of
+// the type being pointed to.
+//
+// To decode into a struct, Decode expects the input to be an RLP
+// list. The decoded elements of the list are assigned to each public
+// field in the order given by the struct's definition. If the input
+// list has too few elements, no error is returned and the remaining
+// fields will have the zero value.
+// Recursive struct types are supported.
+//
+// To decode into a slice, the input must be a list and the resulting
+// slice will contain the input elements in order.
+// As a special case, if the slice has a byte-size element type, the input
+// can also be an RLP string.
+//
+// To decode into a Go string, the input must be an RLP string. The
+// bytes are taken as-is and will not necessarily be valid UTF-8.
+//
+// To decode into an integer type, the input must also be an RLP
+// string. The bytes are interpreted as a big endian representation of
+// the integer. If the RLP string is larger than the bit size of the
+// type, Decode will return an error. Decode also supports *big.Int.
+// There is no size limit for big integers.
+//
+// To decode into an interface value, Decode stores one of these
+// in the value:
+//
+// []interface{}, for RLP lists
+// []byte, for RLP strings
+//
+// Non-empty interface types are not supported, nor are bool, float32,
+// float64, maps, channel types and functions.
+func Decode(r ByteReader, val interface{}) error {
+ return NewStream(r).Decode(val)
+}
+
+func makeNumDecoder(typ reflect.Type) decoder {
+ kind := typ.Kind()
+ switch {
+ case kind <= reflect.Int64:
+ return decodeInt
+ case kind <= reflect.Uint64:
+ return decodeUint
+ default:
+ panic("fallthrough")
+ }
+}
+
+func decodeInt(s *Stream, val reflect.Value) error {
+ num, err := s.uint(val.Type().Bits())
+ if err != nil {
+ return err
+ }
+ val.SetInt(int64(num))
+ return nil
+}
+
+func decodeUint(s *Stream, val reflect.Value) error {
+ num, err := s.uint(val.Type().Bits())
+ if err != nil {
+ return err
+ }
+ val.SetUint(num)
+ return nil
+}
+
+func decodeString(s *Stream, val reflect.Value) error {
+ b, err := s.Bytes()
+ if err != nil {
+ return err
+ }
+ val.SetString(string(b))
+ return nil
+}
+
+func decodeBigIntNoPtr(s *Stream, val reflect.Value) error {
+ return decodeBigInt(s, val.Addr())
+}
+
+func decodeBigInt(s *Stream, val reflect.Value) error {
+ b, err := s.Bytes()
+ if err != nil {
+ return err
+ }
+ i := val.Interface().(*big.Int)
+ if i == nil {
+ i = new(big.Int)
+ val.Set(reflect.ValueOf(i))
+ }
+ i.SetBytes(b)
+ return nil
+}
+
+const maxInt = int(^uint(0) >> 1)
+
+func makeListDecoder(typ reflect.Type) (decoder, error) {
+ etype := typ.Elem()
+ if etype.Kind() == reflect.Uint8 && !reflect.PtrTo(etype).Implements(decoderInterface) {
+ if typ.Kind() == reflect.Array {
+ return decodeByteArray, nil
+ } else {
+ return decodeByteSlice, nil
+ }
+ }
+ etypeinfo, err := cachedTypeInfo1(etype)
+ if err != nil {
+ return nil, err
+ }
+ var maxLen = maxInt
+ if typ.Kind() == reflect.Array {
+ maxLen = typ.Len()
+ }
+ dec := func(s *Stream, val reflect.Value) error {
+ return decodeList(s, val, etypeinfo.decoder, maxLen)
+ }
+ return dec, nil
+}
+
+// decodeList decodes RLP list elements into slices and arrays.
+//
+// The approach here is stolen from package json, although we differ
+// in the semantics for arrays. package json discards remaining
+// elements that would not fit into the array. We generate an error in
+// this case because we'd be losing information.
+func decodeList(s *Stream, val reflect.Value, elemdec decoder, maxelem int) error {
+ size, err := s.List()
+ if err != nil {
+ return err
+ }
+ if size == 0 {
+ if val.Kind() == reflect.Slice {
+ val.Set(reflect.MakeSlice(val.Type(), 0, 0))
+ } else {
+ zero(val, 0)
+ }
+ return s.ListEnd()
+ }
+
+ i := 0
+ for {
+ if i > maxelem {
+ return fmt.Errorf("rlp: input List has more than %d elements", maxelem)
+ }
+ if val.Kind() == reflect.Slice {
+ // grow slice if necessary
+ if i >= val.Cap() {
+ newcap := val.Cap() + val.Cap()/2
+ if newcap < 4 {
+ newcap = 4
+ }
+ newv := reflect.MakeSlice(val.Type(), val.Len(), newcap)
+ reflect.Copy(newv, val)
+ val.Set(newv)
+ }
+ if i >= val.Len() {
+ val.SetLen(i + 1)
+ }
+ }
+ // decode into element
+ if err := elemdec(s, val.Index(i)); err == EOL {
+ break
+ } else if err != nil {
+ return err
+ }
+ i++
+ }
+ if i < val.Len() {
+ if val.Kind() == reflect.Array {
+ // zero the rest of the array.
+ zero(val, i)
+ } else {
+ val.SetLen(i)
+ }
+ }
+ return s.ListEnd()
+}
+
+func decodeByteSlice(s *Stream, val reflect.Value) error {
+ kind, _, err := s.Kind()
+ if err != nil {
+ return err
+ }
+ if kind == List {
+ return decodeList(s, val, decodeUint, maxInt)
+ }
+ b, err := s.Bytes()
+ if err == nil {
+ val.SetBytes(b)
+ }
+ return err
+}
+
+var errStringDoesntFitArray = errors.New("rlp: string value doesn't fit into target array")
+
+func decodeByteArray(s *Stream, val reflect.Value) error {
+ kind, size, err := s.Kind()
+ if err != nil {
+ return err
+ }
+ switch kind {
+ case Byte:
+ if val.Len() == 0 {
+ return errStringDoesntFitArray
+ }
+ bv, _ := s.Uint()
+ val.Index(0).SetUint(bv)
+ zero(val, 1)
+ case String:
+ if uint64(val.Len()) < size {
+ return errStringDoesntFitArray
+ }
+ slice := val.Slice(0, int(size)).Interface().([]byte)
+ if err := s.readFull(slice); err != nil {
+ return err
+ }
+ zero(val, int(size))
+ case List:
+ return decodeList(s, val, decodeUint, val.Len())
+ }
+ return nil
+}
+
+func zero(val reflect.Value, start int) {
+ z := reflect.Zero(val.Type().Elem())
+ for i := start; i < val.Len(); i++ {
+ val.Index(i).Set(z)
+ }
+}
+
+type field struct {
+ index int
+ info *typeinfo
+}
+
+func makeStructDecoder(typ reflect.Type) (decoder, error) {
+ var fields []field
+ for i := 0; i < typ.NumField(); i++ {
+ if f := typ.Field(i); f.PkgPath == "" { // exported
+ info, err := cachedTypeInfo1(f.Type)
+ if err != nil {
+ return nil, err
+ }
+ fields = append(fields, field{i, info})
+ }
+ }
+ dec := func(s *Stream, val reflect.Value) (err error) {
+ if _, err = s.List(); err != nil {
+ return err
+ }
+ for _, f := range fields {
+ err = f.info.decoder(s, val.Field(f.index))
+ if err == EOL {
+ // too few elements. leave the rest at their zero value.
+ break
+ } else if err != nil {
+ return err
+ }
+ }
+ if err = s.ListEnd(); err == errNotAtEOL {
+ err = errors.New("rlp: input List has too many elements")
+ }
+ return err
+ }
+ return dec, nil
+}
+
+func makePtrDecoder(typ reflect.Type) (decoder, error) {
+ etype := typ.Elem()
+ etypeinfo, err := cachedTypeInfo1(etype)
+ if err != nil {
+ return nil, err
+ }
+ dec := func(s *Stream, val reflect.Value) (err error) {
+ _, size, err := s.Kind()
+ if err != nil || size == 0 && s.byteval == 0 {
+ val.Set(reflect.Zero(typ)) // set to nil
+ return err
+ }
+ newval := val
+ if val.IsNil() {
+ newval = reflect.New(etype)
+ }
+ if err = etypeinfo.decoder(s, newval.Elem()); err == nil {
+ val.Set(newval)
+ }
+ return err
+ }
+ return dec, nil
+}
+
+var ifsliceType = reflect.TypeOf([]interface{}{})
+
+func decodeInterface(s *Stream, val reflect.Value) error {
+ kind, _, err := s.Kind()
+ if err != nil {
+ return err
+ }
+ if kind == List {
+ slice := reflect.New(ifsliceType).Elem()
+ if err := decodeList(s, slice, decodeInterface, maxInt); err != nil {
+ return err
+ }
+ val.Set(slice)
+ } else {
+ b, err := s.Bytes()
+ if err != nil {
+ return err
+ }
+ val.Set(reflect.ValueOf(b))
+ }
+ return nil
+}
+
+// This decoder is used for non-pointer values of types
+// that implement the Decoder interface using a pointer receiver.
+func decodeDecoderNoPtr(s *Stream, val reflect.Value) error {
+ return val.Addr().Interface().(Decoder).DecodeRLP(s)
+}
+
+func decodeDecoder(s *Stream, val reflect.Value) error {
+ // Decoder instances are not handled using the pointer rule if the type
+ // implements Decoder with pointer receiver (i.e. always)
+ // because it might handle empty values specially.
+ // We need to allocate one here in this case, like makePtrDecoder does.
+ if val.Kind() == reflect.Ptr && val.IsNil() {
+ val.Set(reflect.New(val.Type().Elem()))
+ }
+ return val.Interface().(Decoder).DecodeRLP(s)
+}
+
+// Kind represents the kind of value contained in an RLP stream.
+type Kind int
+
+const (
+ Byte Kind = iota
+ String
+ List
+)
+
+func (k Kind) String() string {
+ switch k {
+ case Byte:
+ return "Byte"
+ case String:
+ return "String"
+ case List:
+ return "List"
+ default:
+ return fmt.Sprintf("Unknown(%d)", k)
+ }
+}
+
+var (
+ // EOL is returned when the end of the current list
+ // has been reached during streaming.
+ EOL = errors.New("rlp: end of list")
+
+ // Other errors
+ ErrExpectedString = errors.New("rlp: expected String or Byte")
+ ErrExpectedList = errors.New("rlp: expected List")
+ ErrElemTooLarge = errors.New("rlp: element is larger than containing list")
+
+ // internal errors
+ errNotInList = errors.New("rlp: call of ListEnd outside of any list")
+ errNotAtEOL = errors.New("rlp: call of ListEnd not positioned at EOL")
+)
+
+// ByteReader must be implemented by any input reader for a Stream. It
+// is implemented by e.g. bufio.Reader and bytes.Reader.
+type ByteReader interface {
+ io.Reader
+ io.ByteReader
+}
+
+// Stream can be used for piecemeal decoding of an input stream. This
+// is useful if the input is very large or if the decoding rules for a
+// type depend on the input structure. Stream does not keep an
+// internal buffer. After decoding a value, the input reader will be
+// positioned just before the type information for the next value.
+//
+// When decoding a list and the input position reaches the declared
+// length of the list, all operations will return error EOL.
+// The end of the list must be acknowledged using ListEnd to continue
+// reading the enclosing list.
+//
+// Stream is not safe for concurrent use.
+type Stream struct {
+ r ByteReader
+ uintbuf []byte
+
+ kind Kind // kind of value ahead
+ size uint64 // size of value ahead
+ byteval byte // value of single byte in type tag
+ stack []listpos
+}
+
+type listpos struct{ pos, size uint64 }
+
+func NewStream(r ByteReader) *Stream {
+ return &Stream{r: r, uintbuf: make([]byte, 8), kind: -1}
+}
+
+// Bytes reads an RLP string and returns its contents as a byte slice.
+// If the input does not contain an RLP string, the returned
+// error will be ErrExpectedString.
+func (s *Stream) Bytes() ([]byte, error) {
+ kind, size, err := s.Kind()
+ if err != nil {
+ return nil, err
+ }
+ switch kind {
+ case Byte:
+ s.kind = -1 // rearm Kind
+ return []byte{s.byteval}, nil
+ case String:
+ b := make([]byte, size)
+ if err = s.readFull(b); err != nil {
+ return nil, err
+ }
+ return b, nil
+ default:
+ return nil, ErrExpectedString
+ }
+}
+
+// Uint reads an RLP string of up to 8 bytes and returns its contents
+// as an unsigned integer. If the input does not contain an RLP string, the
+// returned error will be ErrExpectedString.
+func (s *Stream) Uint() (uint64, error) {
+ return s.uint(64)
+}
+
+func (s *Stream) uint(maxbits int) (uint64, error) {
+ kind, size, err := s.Kind()
+ if err != nil {
+ return 0, err
+ }
+ switch kind {
+ case Byte:
+ s.kind = -1 // rearm Kind
+ return uint64(s.byteval), nil
+ case String:
+ if size > uint64(maxbits/8) {
+ return 0, fmt.Errorf("rlp: string is larger than %d bits", maxbits)
+ }
+ return s.readUint(byte(size))
+ default:
+ return 0, ErrExpectedString
+ }
+}
+
+// List starts decoding an RLP list. If the input does not contain a
+// list, the returned error will be ErrExpectedList. When the list's
+// end has been reached, any Stream operation will return EOL.
+func (s *Stream) List() (size uint64, err error) {
+ kind, size, err := s.Kind()
+ if err != nil {
+ return 0, err
+ }
+ if kind != List {
+ return 0, ErrExpectedList
+ }
+ s.stack = append(s.stack, listpos{0, size})
+ s.kind = -1
+ s.size = 0
+ return size, nil
+}
+
+// ListEnd returns to the enclosing list.
+// The input reader must be positioned at the end of a list.
+func (s *Stream) ListEnd() error {
+ if len(s.stack) == 0 {
+ return errNotInList
+ }
+ tos := s.stack[len(s.stack)-1]
+ if tos.pos != tos.size {
+ return errNotAtEOL
+ }
+ s.stack = s.stack[:len(s.stack)-1] // pop
+ if len(s.stack) > 0 {
+ s.stack[len(s.stack)-1].pos += tos.size
+ }
+ s.kind = -1
+ s.size = 0
+ return nil
+}
+
+// Decode decodes a value and stores the result in the value pointed
+// to by val. Please see the documentation for the Decode function
+// to learn about the decoding rules.
+func (s *Stream) Decode(val interface{}) error {
+ if val == nil {
+ return errDecodeIntoNil
+ }
+ rval := reflect.ValueOf(val)
+ rtyp := rval.Type()
+ if rtyp.Kind() != reflect.Ptr {
+ return errNoPointer
+ }
+ if rval.IsNil() {
+ return errDecodeIntoNil
+ }
+ info, err := cachedTypeInfo(rtyp.Elem())
+ if err != nil {
+ return err
+ }
+ return info.decoder(s, rval.Elem())
+}
+
+// Kind returns the kind and size of the next value in the
+// input stream.
+//
+// The returned size is the number of bytes that make up the value.
+// For kind == Byte, the size is zero because the value is
+// contained in the type tag.
+//
+// The first call to Kind will read size information from the input
+// reader and leave it positioned at the start of the actual bytes of
+// the value. Subsequent calls to Kind (until the value is decoded)
+// will not advance the input reader and return cached information.
+func (s *Stream) Kind() (kind Kind, size uint64, err error) {
+ var tos *listpos
+ if len(s.stack) > 0 {
+ tos = &s.stack[len(s.stack)-1]
+ }
+ if s.kind < 0 {
+ if tos != nil && tos.pos == tos.size {
+ return 0, 0, EOL
+ }
+ kind, size, err = s.readKind()
+ if err != nil {
+ return 0, 0, err
+ }
+ s.kind, s.size = kind, size
+ }
+ if tos != nil && tos.pos+s.size > tos.size {
+ return 0, 0, ErrElemTooLarge
+ }
+ return s.kind, s.size, nil
+}
+
+func (s *Stream) readKind() (kind Kind, size uint64, err error) {
+ b, err := s.readByte()
+ if err != nil {
+ return 0, 0, err
+ }
+ s.byteval = 0
+ switch {
+ case b < 0x80:
+ // For a single byte whose value is in the [0x00, 0x7F] range, that byte
+ // is its own RLP encoding.
+ s.byteval = b
+ return Byte, 0, nil
+ case b < 0xB8:
+ // Otherwise, if a string is 0-55 bytes long,
+ // the RLP encoding consists of a single byte with value 0x80 plus the
+ // length of the string followed by the string. The range of the first
+ // byte is thus [0x80, 0xB7].
+ return String, uint64(b - 0x80), nil
+ case b < 0xC0:
+ // If a string is more than 55 bytes long, the
+ // RLP encoding consists of a single byte with value 0xB7 plus the length
+ // of the length of the string in binary form, followed by the length of
+ // the string, followed by the string. For example, a length-1024 string
+ // would be encoded as 0xB90400 followed by the string. The range of
+ // the first byte is thus [0xB8, 0xBF].
+ size, err = s.readUint(b - 0xB7)
+ return String, size, err
+ case b < 0xF8:
+ // If the total payload of a list
+ // (i.e. the combined length of all its items) is 0-55 bytes long, the
+ // RLP encoding consists of a single byte with value 0xC0 plus the length
+ // of the list followed by the concatenation of the RLP encodings of the
+ // items. The range of the first byte is thus [0xC0, 0xF7].
+ return List, uint64(b - 0xC0), nil
+ default:
+ // If the total payload of a list is more than 55 bytes long,
+ // the RLP encoding consists of a single byte with value 0xF7
+ // plus the length of the length of the payload in binary
+ // form, followed by the length of the payload, followed by
+ // the concatenation of the RLP encodings of the items. The
+ // range of the first byte is thus [0xF8, 0xFF].
+ size, err = s.readUint(b - 0xF7)
+ return List, size, err
+ }
+}
+
+func (s *Stream) readUint(size byte) (uint64, error) {
+ if size == 1 {
+ b, err := s.readByte()
+ if err == io.EOF {
+ err = io.ErrUnexpectedEOF
+ }
+ return uint64(b), err
+ }
+ start := int(8 - size)
+ for i := 0; i < start; i++ {
+ s.uintbuf[i] = 0
+ }
+ err := s.readFull(s.uintbuf[start:])
+ return binary.BigEndian.Uint64(s.uintbuf), err
+}
+
+func (s *Stream) readFull(buf []byte) (err error) {
+ s.willRead(uint64(len(buf)))
+ var nn, n int
+ for n < len(buf) && err == nil {
+ nn, err = s.r.Read(buf[n:])
+ n += nn
+ }
+ if err == io.EOF {
+ err = io.ErrUnexpectedEOF
+ }
+ return err
+}
+
+func (s *Stream) readByte() (byte, error) {
+ s.willRead(1)
+ b, err := s.r.ReadByte()
+ if len(s.stack) > 0 && err == io.EOF {
+ err = io.ErrUnexpectedEOF
+ }
+ return b, err
+}
+
+func (s *Stream) willRead(n uint64) {
+ s.kind = -1 // rearm Kind
+ if len(s.stack) > 0 {
+ s.stack[len(s.stack)-1].pos += n
+ }
+}
diff --git a/rlp/decode_test.go b/rlp/decode_test.go
new file mode 100644
index 000000000..eb1618299
--- /dev/null
+++ b/rlp/decode_test.go
@@ -0,0 +1,476 @@
+package rlp
+
+import (
+ "bytes"
+ "encoding/hex"
+ "errors"
+ "fmt"
+ "io"
+ "math/big"
+ "reflect"
+ "testing"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+)
+
+func TestStreamKind(t *testing.T) {
+ tests := []struct {
+ input string
+ wantKind Kind
+ wantLen uint64
+ }{
+ {"00", Byte, 0},
+ {"01", Byte, 0},
+ {"7F", Byte, 0},
+ {"80", String, 0},
+ {"B7", String, 55},
+ {"B800", String, 0},
+ {"B90400", String, 1024},
+ {"BA000400", String, 1024},
+ {"BB00000400", String, 1024},
+ {"BFFFFFFFFFFFFFFFFF", String, ^uint64(0)},
+ {"C0", List, 0},
+ {"C8", List, 8},
+ {"F7", List, 55},
+ {"F800", List, 0},
+ {"F804", List, 4},
+ {"F90400", List, 1024},
+ {"FFFFFFFFFFFFFFFFFF", List, ^uint64(0)},
+ }
+
+ for i, test := range tests {
+ s := NewStream(bytes.NewReader(unhex(test.input)))
+ kind, len, err := s.Kind()
+ if err != nil {
+ t.Errorf("test %d: Type returned error: %v", i, err)
+ continue
+ }
+ if kind != test.wantKind {
+ t.Errorf("test %d: kind mismatch: got %d, want %d", i, kind, test.wantKind)
+ }
+ if len != test.wantLen {
+ t.Errorf("test %d: len mismatch: got %d, want %d", i, len, test.wantLen)
+ }
+ }
+}
+
+func TestStreamErrors(t *testing.T) {
+ type calls []string
+ tests := []struct {
+ string
+ calls
+ error
+ }{
+ {"", calls{"Kind"}, io.EOF},
+ {"", calls{"List"}, io.EOF},
+ {"", calls{"Uint"}, io.EOF},
+ {"C0", calls{"Bytes"}, ErrExpectedString},
+ {"C0", calls{"Uint"}, ErrExpectedString},
+ {"81", calls{"Bytes"}, io.ErrUnexpectedEOF},
+ {"81", calls{"Uint"}, io.ErrUnexpectedEOF},
+ {"BFFFFFFFFFFFFFFF", calls{"Bytes"}, io.ErrUnexpectedEOF},
+ {"89000000000000000001", calls{"Uint"}, errors.New("rlp: string is larger than 64 bits")},
+ {"00", calls{"List"}, ErrExpectedList},
+ {"80", calls{"List"}, ErrExpectedList},
+ {"C0", calls{"List", "Uint"}, EOL},
+ {"C801", calls{"List", "Uint", "Uint"}, io.ErrUnexpectedEOF},
+ {"C8C9", calls{"List", "Kind"}, ErrElemTooLarge},
+ {"C3C2010201", calls{"List", "List", "Uint", "Uint", "ListEnd", "Uint"}, EOL},
+ {"00", calls{"ListEnd"}, errNotInList},
+ {"C40102", calls{"List", "Uint", "ListEnd"}, errNotAtEOL},
+ }
+
+testfor:
+ for i, test := range tests {
+ s := NewStream(bytes.NewReader(unhex(test.string)))
+ rs := reflect.ValueOf(s)
+ for j, call := range test.calls {
+ fval := rs.MethodByName(call)
+ ret := fval.Call(nil)
+ err := ""
+ if lastret := ret[len(ret)-1].Interface(); lastret != nil {
+ err = lastret.(error).Error()
+ }
+ if j == len(test.calls)-1 {
+ if err != test.error.Error() {
+ t.Errorf("test %d: last call (%s) error mismatch\ngot: %s\nwant: %v",
+ i, call, err, test.error)
+ }
+ } else if err != "" {
+ t.Errorf("test %d: call %d (%s) unexpected error: %q", i, j, call, err)
+ continue testfor
+ }
+ }
+ }
+}
+
+func TestStreamList(t *testing.T) {
+ s := NewStream(bytes.NewReader(unhex("C80102030405060708")))
+
+ len, err := s.List()
+ if err != nil {
+ t.Fatalf("List error: %v", err)
+ }
+ if len != 8 {
+ t.Fatalf("List returned invalid length, got %d, want 8", len)
+ }
+
+ for i := uint64(1); i <= 8; i++ {
+ v, err := s.Uint()
+ if err != nil {
+ t.Fatalf("Uint error: %v", err)
+ }
+ if i != v {
+ t.Errorf("Uint returned wrong value, got %d, want %d", v, i)
+ }
+ }
+
+ if _, err := s.Uint(); err != EOL {
+ t.Errorf("Uint error mismatch, got %v, want %v", err, EOL)
+ }
+ if err = s.ListEnd(); err != nil {
+ t.Fatalf("ListEnd error: %v", err)
+ }
+}
+
+func TestDecodeErrors(t *testing.T) {
+ r := bytes.NewReader(nil)
+
+ if err := Decode(r, nil); err != errDecodeIntoNil {
+ t.Errorf("Decode(r, nil) error mismatch, got %q, want %q", err, errDecodeIntoNil)
+ }
+
+ var nilptr *struct{}
+ if err := Decode(r, nilptr); err != errDecodeIntoNil {
+ t.Errorf("Decode(r, nilptr) error mismatch, got %q, want %q", err, errDecodeIntoNil)
+ }
+
+ if err := Decode(r, struct{}{}); err != errNoPointer {
+ t.Errorf("Decode(r, struct{}{}) error mismatch, got %q, want %q", err, errNoPointer)
+ }
+
+ expectErr := "rlp: type chan bool is not RLP-serializable"
+ if err := Decode(r, new(chan bool)); err == nil || err.Error() != expectErr {
+ t.Errorf("Decode(r, new(chan bool)) error mismatch, got %q, want %q", err, expectErr)
+ }
+
+ if err := Decode(r, new(int)); err != io.EOF {
+ t.Errorf("Decode(r, new(int)) error mismatch, got %q, want %q", err, io.EOF)
+ }
+}
+
+type decodeTest struct {
+ input string
+ ptr interface{}
+ value interface{}
+ error error
+}
+
+type simplestruct struct {
+ A int
+ B string
+}
+
+type recstruct struct {
+ I int
+ Child *recstruct
+}
+
+var (
+ veryBigInt = big.NewInt(0).Add(
+ big.NewInt(0).Lsh(big.NewInt(0xFFFFFFFFFFFFFF), 16),
+ big.NewInt(0xFFFF),
+ )
+)
+
+var (
+ sharedByteArray [5]byte
+ sharedPtr = new(*int)
+)
+
+var decodeTests = []decodeTest{
+ // integers
+ {input: "05", ptr: new(uint32), value: uint32(5)},
+ {input: "80", ptr: new(uint32), value: uint32(0)},
+ {input: "8105", ptr: new(uint32), value: uint32(5)},
+ {input: "820505", ptr: new(uint32), value: uint32(0x0505)},
+ {input: "83050505", ptr: new(uint32), value: uint32(0x050505)},
+ {input: "8405050505", ptr: new(uint32), value: uint32(0x05050505)},
+ {input: "850505050505", ptr: new(uint32), error: errors.New("rlp: string is larger than 32 bits")},
+ {input: "C0", ptr: new(uint32), error: ErrExpectedString},
+
+ // slices
+ {input: "C0", ptr: new([]int), value: []int{}},
+ {input: "C80102030405060708", ptr: new([]int), value: []int{1, 2, 3, 4, 5, 6, 7, 8}},
+
+ // arrays
+ {input: "C0", ptr: new([5]int), value: [5]int{}},
+ {input: "C50102030405", ptr: new([5]int), value: [5]int{1, 2, 3, 4, 5}},
+ {input: "C6010203040506", ptr: new([5]int), error: errors.New("rlp: input List has more than 5 elements")},
+
+ // byte slices
+ {input: "01", ptr: new([]byte), value: []byte{1}},
+ {input: "80", ptr: new([]byte), value: []byte{}},
+ {input: "8D6162636465666768696A6B6C6D", ptr: new([]byte), value: []byte("abcdefghijklm")},
+ {input: "C0", ptr: new([]byte), value: []byte{}},
+ {input: "C3010203", ptr: new([]byte), value: []byte{1, 2, 3}},
+ {input: "C3820102", ptr: new([]byte), error: errors.New("rlp: string is larger than 8 bits")},
+
+ // byte arrays
+ {input: "01", ptr: new([5]byte), value: [5]byte{1}},
+ {input: "80", ptr: new([5]byte), value: [5]byte{}},
+ {input: "850102030405", ptr: new([5]byte), value: [5]byte{1, 2, 3, 4, 5}},
+ {input: "C0", ptr: new([5]byte), value: [5]byte{}},
+ {input: "C3010203", ptr: new([5]byte), value: [5]byte{1, 2, 3, 0, 0}},
+ {input: "C3820102", ptr: new([5]byte), error: errors.New("rlp: string is larger than 8 bits")},
+ {input: "86010203040506", ptr: new([5]byte), error: errStringDoesntFitArray},
+ {input: "850101", ptr: new([5]byte), error: io.ErrUnexpectedEOF},
+
+ // byte array reuse (should be zeroed)
+ {input: "850102030405", ptr: &sharedByteArray, value: [5]byte{1, 2, 3, 4, 5}},
+ {input: "8101", ptr: &sharedByteArray, value: [5]byte{1}}, // kind: String
+ {input: "850102030405", ptr: &sharedByteArray, value: [5]byte{1, 2, 3, 4, 5}},
+ {input: "01", ptr: &sharedByteArray, value: [5]byte{1}}, // kind: Byte
+ {input: "C3010203", ptr: &sharedByteArray, value: [5]byte{1, 2, 3, 0, 0}},
+ {input: "C101", ptr: &sharedByteArray, value: [5]byte{1}}, // kind: List
+
+ // zero sized byte arrays
+ {input: "80", ptr: new([0]byte), value: [0]byte{}},
+ {input: "C0", ptr: new([0]byte), value: [0]byte{}},
+ {input: "01", ptr: new([0]byte), error: errStringDoesntFitArray},
+ {input: "8101", ptr: new([0]byte), error: errStringDoesntFitArray},
+
+ // strings
+ {input: "00", ptr: new(string), value: "\000"},
+ {input: "8D6162636465666768696A6B6C6D", ptr: new(string), value: "abcdefghijklm"},
+ {input: "C0", ptr: new(string), error: ErrExpectedString},
+
+ // big ints
+ {input: "01", ptr: new(*big.Int), value: big.NewInt(1)},
+ {input: "89FFFFFFFFFFFFFFFFFF", ptr: new(*big.Int), value: veryBigInt},
+ {input: "10", ptr: new(big.Int), value: *big.NewInt(16)}, // non-pointer also works
+ {input: "C0", ptr: new(*big.Int), error: ErrExpectedString},
+
+ // structs
+ {input: "C0", ptr: new(simplestruct), value: simplestruct{0, ""}},
+ {input: "C105", ptr: new(simplestruct), value: simplestruct{5, ""}},
+ {input: "C50583343434", ptr: new(simplestruct), value: simplestruct{5, "444"}},
+ {input: "C3010101", ptr: new(simplestruct), error: errors.New("rlp: input List has too many elements")},
+ {
+ input: "C501C302C103",
+ ptr: new(recstruct),
+ value: recstruct{1, &recstruct{2, &recstruct{3, nil}}},
+ },
+
+ // pointers
+ {input: "00", ptr: new(*int), value: (*int)(nil)},
+ {input: "80", ptr: new(*int), value: (*int)(nil)},
+ {input: "C0", ptr: new(*int), value: (*int)(nil)},
+ {input: "07", ptr: new(*int), value: intp(7)},
+ {input: "8108", ptr: new(*int), value: intp(8)},
+ {input: "C109", ptr: new(*[]int), value: &[]int{9}},
+ {input: "C58403030303", ptr: new(*[][]byte), value: &[][]byte{{3, 3, 3, 3}}},
+
+ // pointer should be reset to nil
+ {input: "05", ptr: sharedPtr, value: intp(5)},
+ {input: "80", ptr: sharedPtr, value: (*int)(nil)},
+
+ // interface{}
+ {input: "00", ptr: new(interface{}), value: []byte{0}},
+ {input: "01", ptr: new(interface{}), value: []byte{1}},
+ {input: "80", ptr: new(interface{}), value: []byte{}},
+ {input: "850505050505", ptr: new(interface{}), value: []byte{5, 5, 5, 5, 5}},
+ {input: "C0", ptr: new(interface{}), value: []interface{}{}},
+ {input: "C50183040404", ptr: new(interface{}), value: []interface{}{[]byte{1}, []byte{4, 4, 4}}},
+}
+
+func intp(i int) *int { return &i }
+
+func TestDecode(t *testing.T) {
+ for i, test := range decodeTests {
+ input, err := hex.DecodeString(test.input)
+ if err != nil {
+ t.Errorf("test %d: invalid hex input %q", i, test.input)
+ continue
+ }
+ err = Decode(bytes.NewReader(input), test.ptr)
+ if err != nil && test.error == nil {
+ t.Errorf("test %d: unexpected Decode error: %v\ndecoding into %T\ninput %q",
+ i, err, test.ptr, test.input)
+ continue
+ }
+ if test.error != nil && fmt.Sprint(err) != fmt.Sprint(test.error) {
+ t.Errorf("test %d: Decode error mismatch\ngot %v\nwant %v\ndecoding into %T\ninput %q",
+ i, err, test.error, test.ptr, test.input)
+ continue
+ }
+ deref := reflect.ValueOf(test.ptr).Elem().Interface()
+ if err == nil && !reflect.DeepEqual(deref, test.value) {
+ t.Errorf("test %d: value mismatch\ngot %#v\nwant %#v\ndecoding into %T\ninput %q",
+ i, deref, test.value, test.ptr, test.input)
+ }
+ }
+}
+
+type testDecoder struct{ called bool }
+
+func (t *testDecoder) DecodeRLP(s *Stream) error {
+ if _, err := s.Uint(); err != nil {
+ return err
+ }
+ t.called = true
+ return nil
+}
+
+func TestDecodeDecoder(t *testing.T) {
+ var s struct {
+ T1 testDecoder
+ T2 *testDecoder
+ T3 **testDecoder
+ }
+ if err := Decode(bytes.NewReader(unhex("C3010203")), &s); err != nil {
+ t.Fatalf("Decode error: %v", err)
+ }
+
+ if !s.T1.called {
+ t.Errorf("DecodeRLP was not called for (non-pointer) testDecoder")
+ }
+
+ if s.T2 == nil {
+ t.Errorf("*testDecoder has not been allocated")
+ } else if !s.T2.called {
+ t.Errorf("DecodeRLP was not called for *testDecoder")
+ }
+
+ if s.T3 == nil || *s.T3 == nil {
+ t.Errorf("**testDecoder has not been allocated")
+ } else if !(*s.T3).called {
+ t.Errorf("DecodeRLP was not called for **testDecoder")
+ }
+}
+
+type byteDecoder byte
+
+func (bd *byteDecoder) DecodeRLP(s *Stream) error {
+ _, err := s.Uint()
+ *bd = 255
+ return err
+}
+
+func (bd byteDecoder) called() bool {
+ return bd == 255
+}
+
+// This test verifies that the byte slice/byte array logic
+// does not kick in for element types implementing Decoder.
+func TestDecoderInByteSlice(t *testing.T) {
+ var slice []byteDecoder
+ if err := Decode(bytes.NewReader(unhex("C101")), &slice); err != nil {
+ t.Errorf("unexpected Decode error %v", err)
+ } else if !slice[0].called() {
+ t.Errorf("DecodeRLP not called for slice element")
+ }
+
+ var array [1]byteDecoder
+ if err := Decode(bytes.NewReader(unhex("C101")), &array); err != nil {
+ t.Errorf("unexpected Decode error %v", err)
+ } else if !array[0].called() {
+ t.Errorf("DecodeRLP not called for array element")
+ }
+}
+
+func ExampleDecode() {
+ input, _ := hex.DecodeString("C90A1486666F6F626172")
+
+ type example struct {
+ A, B int
+ private int // private fields are ignored
+ String string
+ }
+
+ var s example
+ err := Decode(bytes.NewReader(input), &s)
+ if err != nil {
+ fmt.Printf("Error: %v\n", err)
+ } else {
+ fmt.Printf("Decoded value: %#v\n", s)
+ }
+ // Output:
+ // Decoded value: rlp.example{A:10, B:20, private:0, String:"foobar"}
+}
+
+func ExampleStream() {
+ input, _ := hex.DecodeString("C90A1486666F6F626172")
+ s := NewStream(bytes.NewReader(input))
+
+ // Check what kind of value lies ahead
+ kind, size, _ := s.Kind()
+ fmt.Printf("Kind: %v size:%d\n", kind, size)
+
+ // Enter the list
+ if _, err := s.List(); err != nil {
+ fmt.Printf("List error: %v\n", err)
+ return
+ }
+
+ // Decode elements
+ fmt.Println(s.Uint())
+ fmt.Println(s.Uint())
+ fmt.Println(s.Bytes())
+
+ // Acknowledge end of list
+ if err := s.ListEnd(); err != nil {
+ fmt.Printf("ListEnd error: %v\n", err)
+ }
+ // Output:
+ // Kind: List size:9
+ // 10
+ // 20
+ // [102 111 111 98 97 114]
+}
+
+func BenchmarkDecode(b *testing.B) {
+ enc := encTest(90000)
+ b.SetBytes(int64(len(enc)))
+ b.ReportAllocs()
+ b.ResetTimer()
+
+ for i := 0; i < b.N; i++ {
+ var s []int
+ r := bytes.NewReader(enc)
+ if err := Decode(r, &s); err != nil {
+ b.Fatalf("Decode error: %v", err)
+ }
+ }
+}
+
+func BenchmarkDecodeIntSliceReuse(b *testing.B) {
+ enc := encTest(100000)
+ b.SetBytes(int64(len(enc)))
+ b.ReportAllocs()
+ b.ResetTimer()
+
+ var s []int
+ for i := 0; i < b.N; i++ {
+ r := bytes.NewReader(enc)
+ if err := Decode(r, &s); err != nil {
+ b.Fatalf("Decode error: %v", err)
+ }
+ }
+}
+
+func encTest(n int) []byte {
+ s := make([]interface{}, n)
+ for i := 0; i < n; i++ {
+ s[i] = i
+ }
+ return ethutil.Encode(s)
+}
+
+func unhex(str string) []byte {
+ b, err := hex.DecodeString(str)
+ if err != nil {
+ panic(fmt.Sprintf("invalid hex string: %q", str))
+ }
+ return b
+}
diff --git a/rlp/doc.go b/rlp/doc.go
new file mode 100644
index 000000000..aab98ea43
--- /dev/null
+++ b/rlp/doc.go
@@ -0,0 +1,17 @@
+/*
+Package rlp implements the RLP serialization format.
+
+The purpose of RLP (Recursive Linear Prefix) qis to encode arbitrarily
+nested arrays of binary data, and RLP is the main encoding method used
+to serialize objects in Ethereum. The only purpose of RLP is to encode
+structure; encoding specific atomic data types (eg. strings, ints,
+floats) is left up to higher-order protocols; in Ethereum integers
+must be represented in big endian binary form with no leading zeroes
+(thus making the integer value zero be equivalent to the empty byte
+array).
+
+RLP values are distinguished by a type tag. The type tag precedes the
+value in the input stream and defines the size and kind of the bytes
+that follow.
+*/
+package rlp
diff --git a/rlp/typecache.go b/rlp/typecache.go
new file mode 100644
index 000000000..75dbb43c2
--- /dev/null
+++ b/rlp/typecache.go
@@ -0,0 +1,91 @@
+package rlp
+
+import (
+ "fmt"
+ "math/big"
+ "reflect"
+ "sync"
+)
+
+type decoder func(*Stream, reflect.Value) error
+
+type typeinfo struct {
+ decoder
+}
+
+var (
+ typeCacheMutex sync.RWMutex
+ typeCache = make(map[reflect.Type]*typeinfo)
+)
+
+func cachedTypeInfo(typ reflect.Type) (*typeinfo, error) {
+ typeCacheMutex.RLock()
+ info := typeCache[typ]
+ typeCacheMutex.RUnlock()
+ if info != nil {
+ return info, nil
+ }
+ // not in the cache, need to generate info for this type.
+ typeCacheMutex.Lock()
+ defer typeCacheMutex.Unlock()
+ return cachedTypeInfo1(typ)
+}
+
+func cachedTypeInfo1(typ reflect.Type) (*typeinfo, error) {
+ info := typeCache[typ]
+ if info != nil {
+ // another goroutine got the write lock first
+ return info, nil
+ }
+ // put a dummmy value into the cache before generating.
+ // if the generator tries to lookup itself, it will get
+ // the dummy value and won't call itself recursively.
+ typeCache[typ] = new(typeinfo)
+ info, err := genTypeInfo(typ)
+ if err != nil {
+ // remove the dummy value if the generator fails
+ delete(typeCache, typ)
+ return nil, err
+ }
+ *typeCache[typ] = *info
+ return typeCache[typ], err
+}
+
+var (
+ decoderInterface = reflect.TypeOf(new(Decoder)).Elem()
+ bigInt = reflect.TypeOf(big.Int{})
+)
+
+func genTypeInfo(typ reflect.Type) (info *typeinfo, err error) {
+ info = new(typeinfo)
+ kind := typ.Kind()
+ switch {
+ case typ.Implements(decoderInterface):
+ info.decoder = decodeDecoder
+ case kind != reflect.Ptr && reflect.PtrTo(typ).Implements(decoderInterface):
+ info.decoder = decodeDecoderNoPtr
+ case typ.AssignableTo(reflect.PtrTo(bigInt)):
+ info.decoder = decodeBigInt
+ case typ.AssignableTo(bigInt):
+ info.decoder = decodeBigIntNoPtr
+ case isInteger(kind):
+ info.decoder = makeNumDecoder(typ)
+ case kind == reflect.String:
+ info.decoder = decodeString
+ case kind == reflect.Slice || kind == reflect.Array:
+ info.decoder, err = makeListDecoder(typ)
+ case kind == reflect.Struct:
+ info.decoder, err = makeStructDecoder(typ)
+ case kind == reflect.Ptr:
+ info.decoder, err = makePtrDecoder(typ)
+ case kind == reflect.Interface && typ.NumMethod() == 0:
+ info.decoder = decodeInterface
+ default:
+ err = fmt.Errorf("rlp: type %v is not RLP-serializable", typ)
+ }
+ return info, err
+}
+
+func isInteger(k reflect.Kind) bool {
+ return k >= reflect.Int && k <= reflect.Uintptr
+}
diff --git a/state/dump.go b/state/dump.go
index be3b362c4..186c6dd73 100644
--- a/state/dump.go
+++ b/state/dump.go
@@ -46,3 +46,11 @@ func (self *State) Dump() []byte {
return json
}
+
+// Debug stuff
+func (self *StateObject) CreateOutputForDiff() {
+ fmt.Printf("%x %x %x %x\n", self.Address(), self.State.Root(), self.balance.Bytes(), self.Nonce)
+ self.EachStorage(func(addr string, value *ethutil.Value) {
+ fmt.Printf("%x %x\n", addr, value.Bytes())
+ })
+}
diff --git a/state/state_object.go b/state/state_object.go
index 5ce74c434..f02d1b5ab 100644
--- a/state/state_object.go
+++ b/state/state_object.go
@@ -148,9 +148,7 @@ func (self *StateObject) EachStorage(cb trie.EachCallback) {
func (self *StateObject) Sync() {
for key, value := range self.storage {
- if value.Len() == 0 { // value.BigInt().Cmp(ethutil.Big0) == 0 {
- //data := self.getStorage([]byte(key))
- //fmt.Printf("deleting %x %x 0x%x\n", self.Address(), []byte(key), data)
+ if value.Len() == 0 {
self.State.Trie.Delete(string(key))
continue
}
@@ -287,14 +285,6 @@ func (self *StateObject) Root() []byte {
return self.State.Trie.GetRoot()
}
-// Debug stuff
-func (self *StateObject) CreateOutputForDiff() {
- fmt.Printf("%x %x %x %x\n", self.Address(), self.State.Root(), self.balance.Bytes(), self.Nonce)
- self.EachStorage(func(addr string, value *ethutil.Value) {
- fmt.Printf("%x %x\n", addr, value.Bytes())
- })
-}
-
//
// Encoding
//
diff --git a/trie/trie.go b/trie/trie.go
index 139e3d286..d89c39775 100644
--- a/trie/trie.go
+++ b/trie/trie.go
@@ -197,7 +197,12 @@ func (t *Trie) Update(key, value string) {
k := CompactHexDecode(key)
- root := t.UpdateState(t.Root, k, value)
+ var root interface{}
+ if value != "" {
+ root = t.UpdateState(t.Root, k, value)
+ } else {
+ root = t.deleteState(t.Root, k)
+ }
t.setRoot(root)
}
diff --git a/trie/trie_test.go b/trie/trie_test.go
index 3d135ffa2..207d41f30 100644
--- a/trie/trie_test.go
+++ b/trie/trie_test.go
@@ -1,12 +1,14 @@
package trie
import (
+ "bytes"
"encoding/hex"
"encoding/json"
"fmt"
"io/ioutil"
"math/rand"
"net/http"
+ "testing"
"time"
checker "gopkg.in/check.v1"
@@ -387,3 +389,59 @@ func TestRndCase(t *testing.T) {
fmt.Printf("%x\n", trie.Get(string(ethutil.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001"))))
}
*/
+
+func TestOtherSomething(t *testing.T) {
+ _, trie := NewTrie()
+
+ vals := []struct{ k, v string }{
+ {"do", "verb"},
+ {"ether", "wookiedoo"},
+ {"horse", "stallion"},
+ {"shaman", "horse"},
+ {"doge", "coin"},
+ {"ether", ""},
+ {"dog", "puppy"},
+ {"shaman", ""},
+ }
+ for _, val := range vals {
+ trie.Update(val.k, val.v)
+ }
+
+ exp := ethutil.Hex2Bytes("5991bb8c6514148a29db676a14ac506cd2cd5775ace63c30a4fe457715e9ac84")
+ hash := trie.Root.([]byte)
+ if !bytes.Equal(hash, exp) {
+ t.Errorf("expected %x got %x", exp, hash)
+ }
+}
+
+func BenchmarkGets(b *testing.B) {
+ _, trie := NewTrie()
+ vals := []struct{ k, v string }{
+ {"do", "verb"},
+ {"ether", "wookiedoo"},
+ {"horse", "stallion"},
+ {"shaman", "horse"},
+ {"doge", "coin"},
+ {"ether", ""},
+ {"dog", "puppy"},
+ {"shaman", ""},
+ {"somethingveryoddindeedthis is", "myothernodedata"},
+ }
+ for _, val := range vals {
+ trie.Update(val.k, val.v)
+ }
+
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ trie.Get("horse")
+ }
+}
+
+func BenchmarkUpdate(b *testing.B) {
+ _, trie := NewTrie()
+
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ trie.Update(fmt.Sprintf("aaaaaaaaaaaaaaa%d", i), "value")
+ }
+}
diff --git a/vm/vm_debug.go b/vm/vm_debug.go
index ae5a20175..544e04a5f 100644
--- a/vm/vm_debug.go
+++ b/vm/vm_debug.go
@@ -805,7 +805,6 @@ func (self *DebugVm) RunClosure(closure *Closure) (ret []byte, err error) {
stack.Push(closure.Gas)
// 0x60 range
case CREATE:
-
var (
err error
value = stack.Pop()
diff --git a/xeth/hexface.go b/xeth/hexface.go
index 5ef3eaf1a..5bf9845d4 100644
--- a/xeth/hexface.go
+++ b/xeth/hexface.go
@@ -6,6 +6,7 @@ import (
"sync/atomic"
"github.com/ethereum/go-ethereum/chain"
+ "github.com/ethereum/go-ethereum/chain/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/state"
@@ -209,7 +210,7 @@ func (self *JSXEth) Transact(key, toStr, valueStr, gasStr, gasPriceStr, codeStr
gas = ethutil.Big(gasStr)
gasPrice = ethutil.Big(gasPriceStr)
data []byte
- tx *chain.Transaction
+ tx *types.Transaction
)
if ethutil.IsHex(codeStr) {
@@ -219,9 +220,9 @@ func (self *JSXEth) Transact(key, toStr, valueStr, gasStr, gasPriceStr, codeStr
}
if contractCreation {
- tx = chain.NewContractCreationTx(value, gas, gasPrice, data)
+ tx = types.NewContractCreationTx(value, gas, gasPrice, data)
} else {
- tx = chain.NewTransactionMessage(hash, value, gas, gasPrice, data)
+ tx = types.NewTransactionMessage(hash, value, gas, gasPrice, data)
}
acc := self.obj.BlockManager().TransState().GetOrNewStateObject(keyPair.Address())
@@ -240,7 +241,7 @@ func (self *JSXEth) Transact(key, toStr, valueStr, gasStr, gasPriceStr, codeStr
}
func (self *JSXEth) PushTx(txStr string) (*JSReceipt, error) {
- tx := chain.NewTransactionFromBytes(ethutil.Hex2Bytes(txStr))
+ tx := types.NewTransactionFromBytes(ethutil.Hex2Bytes(txStr))
self.obj.TxPool().QueueTransaction(tx)
return NewJSReciept(tx.CreatesContract(), tx.CreationAddress(self.World().State()), tx.Hash(), tx.Sender()), nil
}
diff --git a/xeth/js_types.go b/xeth/js_types.go
index ff240e21c..cba674416 100644
--- a/xeth/js_types.go
+++ b/xeth/js_types.go
@@ -6,6 +6,7 @@ import (
"strings"
"github.com/ethereum/go-ethereum/chain"
+ "github.com/ethereum/go-ethereum/chain/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/state"
@@ -14,7 +15,7 @@ import (
// Block interface exposed to QML
type JSBlock struct {
//Transactions string `json:"transactions"`
- ref *chain.Block
+ ref *types.Block
Size string `json:"size"`
Number int `json:"number"`
Hash string `json:"hash"`
@@ -31,7 +32,7 @@ type JSBlock struct {
}
// Creates a new QML Block from a chain block
-func NewJSBlock(block *chain.Block) *JSBlock {
+func NewJSBlock(block *types.Block) *JSBlock {
if block == nil {
return &JSBlock{}
}
@@ -79,7 +80,7 @@ func (self *JSBlock) GetTransaction(hash string) *JSTransaction {
}
type JSTransaction struct {
- ref *chain.Transaction
+ ref *types.Transaction
Value string `json:"value"`
Gas string `json:"gas"`
@@ -94,7 +95,7 @@ type JSTransaction struct {
Confirmations int `json:"confirmations"`
}
-func NewJSTx(tx *chain.Transaction, state *state.State) *JSTransaction {
+func NewJSTx(tx *types.Transaction, state *state.State) *JSTransaction {
hash := ethutil.Bytes2Hex(tx.Hash())
receiver := ethutil.Bytes2Hex(tx.Recipient)
if receiver == "0000000000000000000000000000000000000000" {
diff --git a/xeth/pipe.go b/xeth/pipe.go
index abed8ef9a..8130ab72e 100644
--- a/xeth/pipe.go
+++ b/xeth/pipe.go
@@ -9,6 +9,7 @@ import (
"strings"
"github.com/ethereum/go-ethereum/chain"
+ "github.com/ethereum/go-ethereum/chain/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/logger"
@@ -72,7 +73,7 @@ func (self *XEth) ExecuteObject(object *Object, data []byte, value, gas, price *
return ret, err
}
-func (self *XEth) Block(hash []byte) *chain.Block {
+func (self *XEth) Block(hash []byte) *types.Block {
return self.blockChain.GetBlock(hash)
}
@@ -115,7 +116,7 @@ func (self *XEth) Transact(key *crypto.KeyPair, rec []byte, value, gas, price *e
contractCreation = true
}
- var tx *chain.Transaction
+ var tx *types.Transaction
// Compile and assemble the given data
if contractCreation {
script, err := ethutil.Compile(string(data), false)
@@ -123,7 +124,7 @@ func (self *XEth) Transact(key *crypto.KeyPair, rec []byte, value, gas, price *e
return nil, err
}
- tx = chain.NewContractCreationTx(value.BigInt(), gas.BigInt(), price.BigInt(), script)
+ tx = types.NewContractCreationTx(value.BigInt(), gas.BigInt(), price.BigInt(), script)
} else {
data := ethutil.StringToByteFunc(string(data), func(s string) (ret []byte) {
slice := strings.Split(s, "\n")
@@ -134,7 +135,7 @@ func (self *XEth) Transact(key *crypto.KeyPair, rec []byte, value, gas, price *e
return
})
- tx = chain.NewTransactionMessage(hash, value.BigInt(), gas.BigInt(), price.BigInt(), data)
+ tx = types.NewTransactionMessage(hash, value.BigInt(), gas.BigInt(), price.BigInt(), data)
}
acc := self.blockManager.TransState().GetOrNewStateObject(key.Address())
@@ -155,7 +156,7 @@ func (self *XEth) Transact(key *crypto.KeyPair, rec []byte, value, gas, price *e
return tx.Hash(), nil
}
-func (self *XEth) PushTx(tx *chain.Transaction) ([]byte, error) {
+func (self *XEth) PushTx(tx *types.Transaction) ([]byte, error) {
self.obj.TxPool().QueueTransaction(tx)
if tx.Recipient == nil {
addr := tx.CreationAddress(self.World().State())
diff --git a/xeth/vm_env.go b/xeth/vm_env.go
index 68b13e5a8..10575ad79 100644
--- a/xeth/vm_env.go
+++ b/xeth/vm_env.go
@@ -2,20 +2,19 @@ package xeth
import (
"math/big"
-
- "github.com/ethereum/go-ethereum/chain"
+ "github.com/ethereum/go-ethereum/chain/types"
"github.com/ethereum/go-ethereum/state"
"github.com/ethereum/go-ethereum/vm"
)
type VMEnv struct {
state *state.State
- block *chain.Block
+ block *types.Block
value *big.Int
sender []byte
}
-func NewEnv(state *state.State, block *chain.Block, value *big.Int, sender []byte) *VMEnv {
+func NewEnv(state *state.State, block *types.Block, value *big.Int, sender []byte) *VMEnv {
return &VMEnv{
state: state,
block: block,