From 33afb10b0da43d55b1d6e1fe6b1b97c6ff8d8f75 Mon Sep 17 00:00:00 2001 From: obscuren Date: Sat, 15 Nov 2014 00:29:27 +0100 Subject: [PATCH 01/21] clean up --- cmd/ethtest/main.go | 2 +- cmd/mist/gui.go | 42 ++++++++++++++---------------------------- cmd/mist/main.go | 11 +++++++---- 3 files changed, 22 insertions(+), 33 deletions(-) diff --git a/cmd/ethtest/main.go b/cmd/ethtest/main.go index 224924498c..82e1c6d590 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/gui.go b/cmd/mist/gui.go index 785962ea05..62943fa9e3 100644 --- a/cmd/mist/gui.go +++ b/cmd/mist/gui.go @@ -63,6 +63,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 +121,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 +142,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 +160,6 @@ func (gui *Gui) Start(assetPath string) { panic(err) } - guilogger.Infoln("Starting GUI") gui.open = true win.Show() @@ -245,7 +244,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 +254,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") @@ -385,11 +380,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 +488,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 +498,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 +536,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/main.go b/cmd/mist/main.go index c106a7582a..bc05d4f3d5 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) From 74266d5bbd95ac07882b09230aec876bf7704f69 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 13 Nov 2014 20:31:48 +0100 Subject: [PATCH 02/21] rlp: new package for streaming RLP decoder --- rlp/decode.go | 666 +++++++++++++++++++++++++++++++++++++++++++++ rlp/decode_test.go | 469 +++++++++++++++++++++++++++++++ rlp/doc.go | 17 ++ rlp/typecache.go | 91 +++++++ 4 files changed, 1243 insertions(+) create mode 100644 rlp/decode.go create mode 100644 rlp/decode_test.go create mode 100644 rlp/doc.go create mode 100644 rlp/typecache.go diff --git a/rlp/decode.go b/rlp/decode.go new file mode 100644 index 0000000000..1a51e7130a --- /dev/null +++ b/rlp/decode.go @@ -0,0 +1,666 @@ +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 { + 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 0000000000..5cb42b870f --- /dev/null +++ b/rlp/decode_test.go @@ -0,0 +1,469 @@ +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 sharedByteArray [5]byte + +var ( + veryBigInt = big.NewInt(0).Add( + big.NewInt(0).Lsh(big.NewInt(0xFFFFFFFFFFFFFF), 16), + big.NewInt(0xFFFF), + ) +) + +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}}}, + + // 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 0000000000..aab98ea43a --- /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 0000000000..75dbb43c27 --- /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 +} From bd0a50fdc3550eba979b132a92960f1e08110033 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 17 Nov 2014 12:02:08 +0100 Subject: [PATCH 03/21] rlp: fix pointer reuse --- rlp/decode.go | 1 + rlp/decode_test.go | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/rlp/decode.go b/rlp/decode.go index 1a51e7130a..96d912f56a 100644 --- a/rlp/decode.go +++ b/rlp/decode.go @@ -309,6 +309,7 @@ func makePtrDecoder(typ reflect.Type) (decoder, error) { 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 diff --git a/rlp/decode_test.go b/rlp/decode_test.go index 5cb42b870f..eb1618299e 100644 --- a/rlp/decode_test.go +++ b/rlp/decode_test.go @@ -176,8 +176,6 @@ type recstruct struct { Child *recstruct } -var sharedByteArray [5]byte - var ( veryBigInt = big.NewInt(0).Add( big.NewInt(0).Lsh(big.NewInt(0xFFFFFFFFFFFFFF), 16), @@ -185,6 +183,11 @@ var ( ) ) +var ( + sharedByteArray [5]byte + sharedPtr = new(*int) +) + var decodeTests = []decodeTest{ // integers {input: "05", ptr: new(uint32), value: uint32(5)}, @@ -268,6 +271,10 @@ var decodeTests = []decodeTest{ {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}}, From ca74bcc4cdf389b5ef5520f9ab5a7aec08424f30 Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 17 Nov 2014 12:12:55 +0100 Subject: [PATCH 04/21] cleaning up --- block_pool.go | 8 +- chain/chain_manager.go | 285 +++++++++++++++++++---------------------- 2 files changed, 136 insertions(+), 157 deletions(-) diff --git a/block_pool.go b/block_pool.go index 090871fd38..f9bd3b28e3 100644 --- a/block_pool.go +++ b/block_pool.go @@ -333,9 +333,11 @@ 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) + for _, block := range blocks { + self.Remove(block.Hash()) + } } } } diff --git a/chain/chain_manager.go b/chain/chain_manager.go index df390a4c00..02741bc0b0 100644 --- a/chain/chain_manager.go +++ b/chain/chain_manager.go @@ -13,9 +13,39 @@ import ( var chainlogger = logger.NewLogger("CHAIN") +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 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 +} + type ChainManager struct { - Ethereum EthManager - // The famous, the fabulous Mister GENESIIIIIIS (block) + eth EthManager genesisBlock *Block // Last known total difficulty TD *big.Int @@ -31,17 +61,34 @@ type ChainManager struct { func NewChainManager(ethereum EthManager) *ChainManager { bc := &ChainManager{} bc.genesisBlock = NewBlockFromBytes(ethutil.Encode(Genesis)) - bc.Ethereum = ethereum + bc.eth = ethereum bc.setLastBlock() return bc } -func (bc *ChainManager) Genesis() *Block { - return bc.genesisBlock +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()) } +// Block creation & chain handling func (bc *ChainManager) NewBlock(coinbase []byte) *Block { var root interface{} hash := ZeroHash256 @@ -72,19 +119,6 @@ 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) @@ -99,38 +133,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 *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() *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,83 +179,6 @@ 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 { data, _ := ethutil.Config.Db.Get(hash) if len(data) == 0 { @@ -262,22 +212,29 @@ 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 *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 { @@ -303,24 +260,8 @@ 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 @@ -330,8 +271,8 @@ func (self *ChainManager) InsertChain(chain *BlockChain) { self.add(link.block) self.SetTotalDifficulty(link.td) - self.Ethereum.EventMux().Post(NewBlockEvent{link.block}) - self.Ethereum.EventMux().Post(link.messages) + self.eth.EventMux().Post(NewBlockEvent{link.block}) + self.eth.EventMux().Post(link.messages) } b, e := chain.Front(), chain.Back() @@ -352,16 +293,13 @@ func (self *ChainManager) TestChain(chain *BlockChain) (td *big.Int, err error) 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.eth.BlockManager().ProcessWithParent(block, parent) if err != nil { chainlogger.Infoln(err) chainlogger.Debugf("Block #%v failed (%x...)\n", block.Number, block.Hash()[0:4]) @@ -383,3 +321,42 @@ func (self *ChainManager) TestChain(chain *BlockChain) (td *big.Int, err error) return } + +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 *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 *Block // current block in the iterator +} + +func (self *ChainIterator) Prev() *Block { + self.block = self.cm.GetBlock(self.block.PrevHash) + return self.block +} From f7417d3552de86f5acf969b6eb882502fd104a11 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 18 Nov 2014 12:02:13 +0100 Subject: [PATCH 05/21] New modified patricia trie --- ptrie/fullnode.go | 59 ++++++++++ ptrie/hashnode.go | 22 ++++ ptrie/node.go | 40 +++++++ ptrie/shortnode.go | 31 +++++ ptrie/trie.go | 286 +++++++++++++++++++++++++++++++++++++++++++++ ptrie/trie_test.go | 138 ++++++++++++++++++++++ ptrie/valuenode.go | 13 +++ 7 files changed, 589 insertions(+) create mode 100644 ptrie/fullnode.go create mode 100644 ptrie/hashnode.go create mode 100644 ptrie/node.go create mode 100644 ptrie/shortnode.go create mode 100644 ptrie/trie.go create mode 100644 ptrie/trie_test.go create mode 100644 ptrie/valuenode.go diff --git a/ptrie/fullnode.go b/ptrie/fullnode.go new file mode 100644 index 0000000000..2b1a627891 --- /dev/null +++ b/ptrie/fullnode.go @@ -0,0 +1,59 @@ +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) Copy() Node { return self } + +// 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) get(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 0000000000..4c17569d78 --- /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/node.go b/ptrie/node.go new file mode 100644 index 0000000000..2c85dbce72 --- /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 0000000000..49319c555d --- /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 self } + +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 0000000000..3e642b3340 --- /dev/null +++ b/ptrie/trie.go @@ -0,0 +1,286 @@ +package ptrie + +import ( + "bytes" + "sync" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/trie" +) + +type Backend interface { + Get([]byte) []byte + Set([]byte, []byte) +} + +type Cache map[string][]byte + +func (self Cache) Get(key []byte) []byte { + return self[string(key)] +} +func (self Cache) Set(key []byte, data []byte) { + self[string(key)] = data +} + +type Trie struct { + mu sync.Mutex + root Node + roothash []byte + backend Backend +} + +func NewEmpty() *Trie { + return &Trie{sync.Mutex{}, nil, nil, make(Cache)} +} + +func New(root []byte, backend Backend) *Trie { + trie := &Trie{} + trie.roothash = root + trie.backend = backend + + value := ethutil.NewValueFromBytes(trie.backend.Get(root)) + trie.root = trie.mknode(value) + + return trie +} + +func (self *Trie) Hash() []byte { + var hash []byte + if self.root != nil { + 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(self.root)) + } + + self.roothash = hash + + return hash +} + +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.get(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.get(key[0]), key[1:]) + default: + panic("Invalid 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.get(key[0]), key[1:])) + + pos := -1 + for i := 0; i < 17; i++ { + if n.get(byte(i)) != nil { + if pos == -1 { + pos = i + } else { + pos = -2 + } + } + } + + var nnode Node + if pos == 16 { + nnode = NewShortNode(self, []byte{16}, n.get(byte(pos))) + } else if pos >= 0 { + cnode := n.get(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.get(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.backend.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.backend.Set(key, data) + + return key + } + + return node.RlpData() +} diff --git a/ptrie/trie_test.go b/ptrie/trie_test.go new file mode 100644 index 0000000000..29380d3f08 --- /dev/null +++ b/ptrie/trie_test.go @@ -0,0 +1,138 @@ +package ptrie + +import ( + "bytes" + "fmt" + "testing" + + "github.com/ethereum/go-ethereum/ethutil" +) + +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 { + 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.Hash() + + trie2 := New(trie.roothash, trie.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 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("aaaaaaaaaaaaaaa%d", j), "value") + } + trie.Hash() +} diff --git a/ptrie/valuenode.go b/ptrie/valuenode.go new file mode 100644 index 0000000000..c226621a70 --- /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 self } +func (self *ValueNode) RlpData() interface{} { return self.data } +func (self *ValueNode) Hash() interface{} { return self.data } From 3220a32ff056f5bffed031bf1c4d3b0bc71f1ec9 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 18 Nov 2014 12:03:09 +0100 Subject: [PATCH 06/21] Added some comparison tests for the new ptrie --- trie/trie.go | 7 +++++- trie/trie_test.go | 56 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/trie/trie.go b/trie/trie.go index 139e3d2867..d89c397756 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 4c7e621dcc..d00671c6a6 100644 --- a/trie/trie_test.go +++ b/trie/trie_test.go @@ -444,3 +444,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", j), "value") + } +} From 34f29d57b6790a38019a8bcef51a6e91d2945cbe Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 18 Nov 2014 12:03:51 +0100 Subject: [PATCH 07/21] Update vm_debug.go --- vm/vm_debug.go | 1 - 1 file changed, 1 deletion(-) diff --git a/vm/vm_debug.go b/vm/vm_debug.go index ae5a201759..544e04a5fb 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() From e08aba5dd9f1e481aab18c6c062c97e0e400f75b Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 18 Nov 2014 12:18:27 +0100 Subject: [PATCH 08/21] added output test --- ptrie/trie.go | 2 ++ ptrie/trie_test.go | 19 ++++++++++++++++++- trie/trie_test.go | 3 ++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/ptrie/trie.go b/ptrie/trie.go index 3e642b3340..207aad91e2 100644 --- a/ptrie/trie.go +++ b/ptrie/trie.go @@ -45,6 +45,8 @@ func New(root []byte, backend Backend) *Trie { return trie } +// Legacy support +func (self *Trie) Root() []byte { return self.Hash() } func (self *Trie) Hash() []byte { var hash []byte if self.root != nil { diff --git a/ptrie/trie_test.go b/ptrie/trie_test.go index 29380d3f08..8b98f4408c 100644 --- a/ptrie/trie_test.go +++ b/ptrie/trie_test.go @@ -132,7 +132,24 @@ func BenchmarkUpdate(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { - trie.UpdateString(fmt.Sprintf("aaaaaaaaaaaaaaa%d", j), "value") + trie.UpdateString(fmt.Sprintf("aaaaaaaaa%d", base, i), "value") } trie.Hash() } + +// Not actual test +func TestOutput(t *testing.T) { + base := "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + trie := NewEmpty() + for i := 0; i < 50; i++ { + trie.UpdateString(fmt.Sprintf("%s%d", base, i), "valueeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee") + } + trie.Hash() + fmt.Println("############################## FULL ################################") + fmt.Println(trie.root) + + trie2 := New(trie.roothash, trie.backend) + trie2.GetString(base + "20") + fmt.Println("############################## SMALL ################################") + fmt.Println(trie2.root) +} diff --git a/trie/trie_test.go b/trie/trie_test.go index d00671c6a6..9a21fd805f 100644 --- a/trie/trie_test.go +++ b/trie/trie_test.go @@ -497,6 +497,7 @@ func BenchmarkUpdate(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { - trie.Update(fmt.Sprintf("aaaaaaaaaaaaaaa%d", j), "value") + trie.Update(fmt.Sprintf("aaaaaaaaaaaaaaa%d", i), "value") } + fmt.Println(trie.root) } From 62cd9946ee16758a4e368cd0b5a0ba9fa4d94705 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 18 Nov 2014 12:20:14 +0100 Subject: [PATCH 09/21] j => i --- trie/trie_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/trie/trie_test.go b/trie/trie_test.go index 9a21fd805f..9ac4336629 100644 --- a/trie/trie_test.go +++ b/trie/trie_test.go @@ -499,5 +499,4 @@ func BenchmarkUpdate(b *testing.B) { for i := 0; i < b.N; i++ { trie.Update(fmt.Sprintf("aaaaaaaaaaaaaaa%d", i), "value") } - fmt.Println(trie.root) } From a1b6a9ac29d0aa8d29a2c0535bafdb5fe4d4830b Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 18 Nov 2014 16:58:22 +0100 Subject: [PATCH 10/21] Begin of moving objects to types package * Block(s) * Transaction(s) --- block_pool.go | 13 +++--- chain/block_manager.go | 38 +++++++++--------- chain/chain_manager.go | 68 +++++++++++++++++--------------- chain/dagger.go | 5 ++- chain/events.go | 8 ++-- chain/filter.go | 9 +++-- chain/state_transition.go | 11 +++--- chain/transaction_pool.go | 41 +++++++++---------- chain/transaction_test.go | 1 - chain/{ => types}/block.go | 4 +- chain/{ => types}/bloom9.go | 2 +- chain/{ => types}/bloom9_test.go | 3 +- chain/types/common.go | 10 +++++ chain/{ => types}/derive_sha.go | 2 +- chain/{ => types}/receipt.go | 10 ++++- chain/{ => types}/transaction.go | 2 +- chain/types/transaction_test.go | 1 + chain/vm_env.go | 7 ++-- cmd/mist/bindings.go | 5 +-- cmd/mist/ext_app.go | 3 +- cmd/mist/gui.go | 7 ++-- cmd/mist/html_container.go | 5 +-- cmd/mist/qml_container.go | 5 +-- cmd/mist/ui_lib.go | 5 ++- cmd/utils/vm_env.go | 7 ++-- ethereum.go | 3 +- javascript/javascript_runtime.go | 3 +- miner/miner.go | 15 +++---- peer.go | 11 +++--- xeth/hexface.go | 9 +++-- xeth/js_types.go | 9 +++-- xeth/pipe.go | 11 +++--- xeth/vm_env.go | 7 ++-- 33 files changed, 189 insertions(+), 151 deletions(-) delete mode 100644 chain/transaction_test.go rename chain/{ => types}/block.go (99%) rename chain/{ => types}/bloom9.go (98%) rename chain/{ => types}/bloom9_test.go (97%) create mode 100644 chain/types/common.go rename chain/{ => types}/derive_sha.go (96%) rename chain/{ => types}/receipt.go (84%) rename chain/{ => types}/transaction.go (99%) create mode 100644 chain/types/transaction_test.go diff --git a/block_pool.go b/block_pool.go index f9bd3b28e3..dcddca58e1 100644 --- a/block_pool.go +++ b/block_pool.go @@ -10,6 +10,7 @@ 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/wire" @@ -20,7 +21,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 +74,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 +124,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 +284,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 { diff --git a/chain/block_manager.go b/chain/block_manager.go index efe9e0862d..e652ad10e1 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 02741bc0b0..11df4e17e2 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,7 +14,7 @@ import ( var chainlogger = logger.NewLogger("CHAIN") -func AddTestNetFunds(block *Block) { +func AddTestNetFunds(block *types.Block) { for _, addr := range []string{ "51ba59315b3a95761d0863b05ccc7a7f54703d99", "e4157b34ea9615cfbde6b4fda419828124b70c78", @@ -25,13 +26,13 @@ func AddTestNetFunds(block *Block) { "1a26338f0d905e295fccb71fa9ea849ffa12aaf4", } { codedAddr := ethutil.Hex2Bytes(addr) - account := block.state.GetAccount(codedAddr) + account := block.State().GetAccount(codedAddr) account.SetBalance(ethutil.Big("1606938044258990275541962092341162602522202993782792835301376")) //ethutil.BigPow(2, 200) - block.state.UpdateStateObject(account) + block.State().UpdateStateObject(account) } } -func CalcDifficulty(block, parent *Block) *big.Int { +func CalcDifficulty(block, parent *types.Block) *big.Int { diff := new(big.Int) adjust := new(big.Int).Rsh(parent.Difficulty, 10) @@ -45,36 +46,41 @@ func CalcDifficulty(block, parent *Block) *big.Int { } type ChainManager struct { - eth EthManager - 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.eth = ethereum + bc.genesisBlock = types.NewBlockFromBytes(ethutil.Encode(Genesis)) + //bc.eth = ethereum bc.setLastBlock() return bc } +func (self *ChainManager) SetProcessor(proc types.BlockProcessor) { + self.processor = proc +} + func (bc *ChainManager) setLastBlock() { data, _ := ethutil.Config.Db.Get([]byte("LastBlock")) if len(data) != 0 { // Prep genesis AddTestNetFunds(bc.genesisBlock) - block := NewBlockFromBytes(data) + block := types.NewBlockFromBytes(data) bc.CurrentBlock = block bc.LastBlockHash = block.Hash() bc.LastBlockNumber = block.Number.Uint64() @@ -89,7 +95,7 @@ func (bc *ChainManager) setLastBlock() { } // Block creation & chain handling -func (bc *ChainManager) NewBlock(coinbase []byte) *Block { +func (bc *ChainManager) NewBlock(coinbase []byte) *types.Block { var root interface{} hash := ZeroHash256 @@ -98,7 +104,7 @@ func (bc *ChainManager) NewBlock(coinbase []byte) *Block { hash = bc.LastBlockHash } - block := CreateBlock( + block := types.CreateBlock( root, hash, coinbase, @@ -122,7 +128,7 @@ func (bc *ChainManager) NewBlock(coinbase []byte) *Block { 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 @@ -134,7 +140,7 @@ func (bc *ChainManager) Reset() { } // Add a block to the chain and record addition information -func (bc *ChainManager) add(block *Block) { +func (bc *ChainManager) add(block *types.Block) { bc.writeBlockInfo(block) bc.CurrentBlock = block @@ -148,7 +154,7 @@ func (bc *ChainManager) add(block *Block) { } // Accessors -func (bc *ChainManager) Genesis() *Block { +func (bc *ChainManager) Genesis() *types.Block { return bc.genesisBlock } @@ -179,7 +185,7 @@ func (self *ChainManager) GetChainHashesFromHash(hash []byte, max uint64) (chain return } -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 { @@ -194,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 { @@ -217,7 +223,7 @@ func (bc *ChainManager) SetTotalDifficulty(td *big.Int) { bc.TD = td } -func (self *ChainManager) CalcTotalDiff(block *Block) (*big.Int, error) { +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) @@ -237,8 +243,8 @@ func (self *ChainManager) CalcTotalDiff(block *Block) (*big.Int, error) { 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) @@ -246,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()) @@ -271,8 +277,8 @@ func (self *ChainManager) InsertChain(chain *BlockChain) { self.add(link.block) self.SetTotalDifficulty(link.td) - self.eth.EventMux().Post(NewBlockEvent{link.block}) - self.eth.EventMux().Post(link.messages) + //self.eth.EventMux().Post(NewBlockEvent{link.block}) + //self.eth.EventMux().Post(link.messages) } b, e := chain.Front(), chain.Back() @@ -299,7 +305,7 @@ func (self *ChainManager) TestChain(chain *BlockChain) (td *big.Int, err error) } var messages state.Messages - td, messages, err = self.eth.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]) @@ -323,7 +329,7 @@ func (self *ChainManager) TestChain(chain *BlockChain) (td *big.Int, err error) } type link struct { - block *Block + block *types.Block messages state.Messages td *big.Int } @@ -332,7 +338,7 @@ type BlockChain struct { *list.List } -func NewChain(blocks Blocks) *BlockChain { +func NewChain(blocks types.Blocks) *BlockChain { chain := &BlockChain{list.New()} for _, block := range blocks { @@ -353,10 +359,10 @@ func (self *BlockChain) RlpEncode() []byte { type ChainIterator struct { cm *ChainManager - block *Block // current block in the iterator + block *types.Block // current block in the iterator } -func (self *ChainIterator) Prev() *Block { +func (self *ChainIterator) Prev() *types.Block { self.block = self.cm.GetBlock(self.block.PrevHash) return self.block } diff --git a/chain/dagger.go b/chain/dagger.go index 2cf70e0915..f7e2229e9e 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 2703e955d0..06ab6be799 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 3c0b02d4f6..fd8adaa8f8 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/state_transition.go b/chain/state_transition.go index afe0442990..7896986754 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 ff75089d65..119712ba8f 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 fef1d2010b..0000000000 --- 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 a4ab560dc5..b311433e36 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 c610bd1013..626711ccab 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 8b1b962cb5..8ee63becb4 100644 --- a/chain/bloom9_test.go +++ b/chain/types/bloom9_test.go @@ -1,7 +1,8 @@ -package chain +package types import ( "testing" + "github.com/ethereum/go-ethereum/state" ) diff --git a/chain/types/common.go b/chain/types/common.go new file mode 100644 index 0000000000..ae0e7c3fa2 --- /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 4246aeb025..1897ff198f 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 fa53f1cdb8..25fa8fb073 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 d81a0ea1b6..626a7e5cec 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 0000000000..ab1254f4c2 --- /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 4f3dc3ca4d..c1911ff510 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/mist/bindings.go b/cmd/mist/bindings.go index 480c38b2ef..eb78c3accf 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 d004f98c59..22fa4bfaff 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 62943fa9e3..61b66cce3e 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" @@ -290,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() @@ -340,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) @@ -348,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 diff --git a/cmd/mist/html_container.go b/cmd/mist/html_container.go index 35e351b027..4c6609a95e 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/qml_container.go b/cmd/mist/qml_container.go index 60013ec2b5..b5986c16eb 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 4e480144f1..01352f1927 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 e201627e25..b2788efa1c 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/ethereum.go b/ethereum.go index ce8a92b58e..879a14bd5e 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/javascript/javascript_runtime.go b/javascript/javascript_runtime.go index 86a376fbfe..e8b785f50f 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 a678a68956..b25e253573 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -31,6 +31,7 @@ import ( "github.com/ethereum/go-ethereum/ethutil" "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 +45,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 +55,7 @@ type Miner struct { eth *eth.Ethereum events event.Subscription - uncles chain.Blocks + uncles types.Blocks localTxs map[int]*LocalTx localTxId int @@ -212,7 +213,7 @@ 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) @@ -229,15 +230,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 +248,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 b549788548..fa73da21a7 100644 --- a/peer.go +++ b/peer.go @@ -11,8 +11,7 @@ import ( "strings" "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" @@ -155,7 +154,7 @@ type Peer struct { pingTime time.Duration pingStartTime time.Time - lastRequestedBlock *chain.Block + lastRequestedBlock *types.Block protocolCaps *ethutil.Value } @@ -429,7 +428,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 +534,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 +542,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/xeth/hexface.go b/xeth/hexface.go index 5ef3eaf1a3..5bf9845d48 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 ff240e21c6..cba674416a 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 abed8ef9a9..8130ab72e7 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 68b13e5a8b..10575ad798 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, From f8d0cd9906a1ec4a4a1e95868a279312363f8b49 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 18 Nov 2014 19:44:17 +0100 Subject: [PATCH 11/21] Added a callback mechanism to chain adding. Not sure if this is the right approach. Why? BlockChain shouldn't need the "Ethereum" object. BlockChain shouldn't need to worry about notifying listeners or message propagation. --- block_pool.go | 14 +++++++------- chain/chain_manager.go | 6 +++--- miner/miner.go | 7 +++++-- peer.go | 3 ++- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/block_pool.go b/block_pool.go index dcddca58e1..38302a4c77 100644 --- a/block_pool.go +++ b/block_pool.go @@ -13,6 +13,7 @@ import ( "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" ) @@ -310,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 @@ -335,10 +332,13 @@ out: self.peer = nil } else { if !chain.IsTDError(err) { - chainManager.InsertChain(bchain) - for _, block := range blocks { + 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/chain_manager.go b/chain/chain_manager.go index 11df4e17e2..970fa5377b 100644 --- a/chain/chain_manager.go +++ b/chain/chain_manager.go @@ -271,14 +271,14 @@ func (self *ChainManager) NewIterator(startHash []byte) *ChainIterator { } // 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.eth.EventMux().Post(NewBlockEvent{link.block}) - //self.eth.EventMux().Post(link.messages) + + call(link.block, link.messages) } b, e := chain.Front(), chain.Back() diff --git a/miner/miner.go b/miner/miner.go index b25e253573..795385424b 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -29,6 +29,7 @@ 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" @@ -218,8 +219,10 @@ func (self *Miner) mine() { 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()) diff --git a/peer.go b/peer.go index fa73da21a7..ff35936048 100644 --- a/peer.go +++ b/peer.go @@ -11,6 +11,7 @@ import ( "strings" "sync/atomic" "time" + "github.com/ethereum/go-ethereum/chain/types" "github.com/ethereum/go-ethereum/ethutil" "github.com/ethereum/go-ethereum/logger" @@ -23,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 From 93e693be72e1a7734e826016316434c1e2320de9 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 18 Nov 2014 19:52:45 +0100 Subject: [PATCH 12/21] Fixed tests for 'types' --- chain/helper_test.go | 3 ++- cmd/ethereum/main.go | 5 ++--- ptrie/trie_test.go | 2 +- trie/trie_test.go | 2 ++ 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/chain/helper_test.go b/chain/helper_test.go index 459e3e63ab..8c7532111a 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/cmd/ethereum/main.go b/cmd/ethereum/main.go index c894a8f856..aa933c4e7a 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/ptrie/trie_test.go b/ptrie/trie_test.go index 8b98f4408c..6cdd2bde49 100644 --- a/ptrie/trie_test.go +++ b/ptrie/trie_test.go @@ -132,7 +132,7 @@ func BenchmarkUpdate(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { - trie.UpdateString(fmt.Sprintf("aaaaaaaaa%d", base, i), "value") + trie.UpdateString(fmt.Sprintf("aaaaaaaaa%d", i), "value") } trie.Hash() } diff --git a/trie/trie_test.go b/trie/trie_test.go index 25eb1742f7..207d41f30d 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" From 437d79f09418b24693b4e3fc4d2f88e291b5340f Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 18 Nov 2014 20:23:17 +0100 Subject: [PATCH 13/21] Updated readme --- README.md | 68 +++++++++++++++++++------------------------------------ 1 file changed, 23 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 3673873903..564e5c56dd 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 ============ From 14e2e488fdf0f4d6ed1a5a48ffbbe883faa7edb6 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 19 Nov 2014 12:25:52 +0100 Subject: [PATCH 14/21] Added `chain` tests & minor fixes * Fork tests (equal and larger chains) * `chain.link` fields are now exported * moved debug function from state to dump.go --- chain/chain_manager.go | 26 +- chain/chain_manager_test.go | 115 ++ event/profile.tmp | 40 - profile.cov | 3294 +++++++++++++++++++++++++++-------- state/dump.go | 8 + state/state_object.go | 8 - 6 files changed, 2751 insertions(+), 740 deletions(-) delete mode 100644 event/profile.tmp diff --git a/chain/chain_manager.go b/chain/chain_manager.go index 970fa5377b..11e16fa7d2 100644 --- a/chain/chain_manager.go +++ b/chain/chain_manager.go @@ -191,8 +191,8 @@ func (self *ChainManager) GetBlock(hash []byte) *types.Block { 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 } } } @@ -275,15 +275,15 @@ func (self *ChainManager) InsertChain(chain *BlockChain, call func(*types.Block, for e := chain.Front(); e != nil; e = e.Next() { link := e.Value.(*link) - self.add(link.block) - self.SetTotalDifficulty(link.td) + self.add(link.Block) + self.SetTotalDifficulty(link.Td) - call(link.block, link.messages) + 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]) } } @@ -295,7 +295,7 @@ 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) ) @@ -314,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 { @@ -329,9 +329,9 @@ func (self *ChainManager) TestChain(chain *BlockChain) (td *big.Int, err error) } type link struct { - block *types.Block - messages state.Messages - td *big.Int + Block *types.Block + Messages state.Messages + Td *big.Int } type BlockChain struct { @@ -351,7 +351,7 @@ func NewChain(blocks types.Blocks) *BlockChain { 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()) + dat = append(dat, e.Value.(*link).Block.RlpData()) } return ethutil.Encode(dat) diff --git a/chain/chain_manager_test.go b/chain/chain_manager_test.go index fef1d2010b..0314914a9f 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/event/profile.tmp b/event/profile.tmp deleted file mode 100644 index c6496902d2..0000000000 --- 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/profile.cov b/profile.cov index ef5eb1b881..e92cd379f3 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/state/dump.go b/state/dump.go index be3b362c45..186c6dd737 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 5ce74c434a..729e32ae40 100644 --- a/state/state_object.go +++ b/state/state_object.go @@ -287,14 +287,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 // From e70529a97785012368e7e0d5b272cccab705e551 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 19 Nov 2014 15:05:08 +0100 Subject: [PATCH 15/21] Added new iterator and tests --- ptrie/fullnode.go | 5 +- ptrie/iterator.go | 114 +++++++++++++++++++++++++++++++++++++++++ ptrie/iterator_test.go | 28 ++++++++++ ptrie/trie.go | 18 ++++--- ptrie/trie_test.go | 2 + state/state_object.go | 4 +- 6 files changed, 160 insertions(+), 11 deletions(-) create mode 100644 ptrie/iterator.go create mode 100644 ptrie/iterator_test.go diff --git a/ptrie/fullnode.go b/ptrie/fullnode.go index 2b1a627891..eaa4611b66 100644 --- a/ptrie/fullnode.go +++ b/ptrie/fullnode.go @@ -14,6 +14,9 @@ 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 { return self } @@ -49,7 +52,7 @@ func (self *FullNode) set(k byte, value Node) { self.nodes[int(k)] = value } -func (self *FullNode) get(i byte) Node { +func (self *FullNode) branch(i byte) Node { if self.nodes[int(i)] != nil { self.nodes[int(i)] = self.trie.trans(self.nodes[int(i)]) diff --git a/ptrie/iterator.go b/ptrie/iterator.go new file mode 100644 index 0000000000..c6d4f64a01 --- /dev/null +++ b/ptrie/iterator.go @@ -0,0 +1,114 @@ +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() + skey := key[len(k):] + + var ret []byte + 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 { + return 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 0000000000..8921bb6708 --- /dev/null +++ b/ptrie/iterator_test.go @@ -0,0 +1,28 @@ +package ptrie + +import "testing" + +func TestIterator(t *testing.T) { + trie := NewEmpty() + vals := []struct{ k, v string }{ + {"do", "verb"}, + {"ether", "wookiedoo"}, + {"horse", "stallion"}, + } + v := make(map[string]bool) + for _, val := range vals { + v[val.k] = false + trie.UpdateString(val.k, val.v) + } + + 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/trie.go b/ptrie/trie.go index 207aad91e2..bb2b3845ad 100644 --- a/ptrie/trie.go +++ b/ptrie/trie.go @@ -45,6 +45,10 @@ func New(root []byte, backend Backend) *Trie { 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 { @@ -144,7 +148,7 @@ func (self *Trie) insert(node Node, key []byte, value Node) Node { case *FullNode: cpy := node.Copy().(*FullNode) - cpy.set(key[0], self.insert(node.get(key[0]), key[1:], value)) + cpy.set(key[0], self.insert(node.branch(key[0]), key[1:], value)) return cpy @@ -173,7 +177,7 @@ func (self *Trie) get(node Node, key []byte) Node { return nil case *FullNode: - return self.get(node.get(key[0]), key[1:]) + return self.get(node.branch(key[0]), key[1:]) default: panic("Invalid node") } @@ -209,11 +213,11 @@ func (self *Trie) delete(node Node, key []byte) Node { case *FullNode: n := node.Copy().(*FullNode) - n.set(key[0], self.delete(n.get(key[0]), key[1:])) + n.set(key[0], self.delete(n.branch(key[0]), key[1:])) pos := -1 for i := 0; i < 17; i++ { - if n.get(byte(i)) != nil { + if n.branch(byte(i)) != nil { if pos == -1 { pos = i } else { @@ -224,16 +228,16 @@ func (self *Trie) delete(node Node, key []byte) Node { var nnode Node if pos == 16 { - nnode = NewShortNode(self, []byte{16}, n.get(byte(pos))) + nnode = NewShortNode(self, []byte{16}, n.branch(byte(pos))) } else if pos >= 0 { - cnode := n.get(byte(pos)) + 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.get(byte(pos))) + nnode = NewShortNode(self, []byte{byte(pos)}, n.branch(byte(pos))) } } else { nnode = n diff --git a/ptrie/trie_test.go b/ptrie/trie_test.go index 6cdd2bde49..6af6e1b406 100644 --- a/ptrie/trie_test.go +++ b/ptrie/trie_test.go @@ -139,6 +139,8 @@ func BenchmarkUpdate(b *testing.B) { // Not actual test func TestOutput(t *testing.T) { + t.Skip() + base := "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" trie := NewEmpty() for i := 0; i < 50; i++ { diff --git a/state/state_object.go b/state/state_object.go index 729e32ae40..f02d1b5abc 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 } From 0f460ad26e864ae8b4c4cf99147c5b57a10f3be9 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 19 Nov 2014 16:21:28 +0100 Subject: [PATCH 16/21] Added caching and database interface to trie * Reimplemented caching for trie * Reimplemented resetting and persisting trie --- ethdb/memory_database.go | 4 +++ ptrie/fullnode.go | 9 ++++- ptrie/shortnode.go | 2 +- ptrie/trie.go | 77 +++++++++++++++++++++++++++++++-------- ptrie/trie_test.go | 78 +++++++++++++++++++++++++++++----------- ptrie/valuenode.go | 2 +- 6 files changed, 134 insertions(+), 38 deletions(-) diff --git a/ethdb/memory_database.go b/ethdb/memory_database.go index 459373eeae..48aa830e77 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/ptrie/fullnode.go b/ptrie/fullnode.go index eaa4611b66..7a7f7d22d4 100644 --- a/ptrie/fullnode.go +++ b/ptrie/fullnode.go @@ -18,7 +18,14 @@ func (self *FullNode) Branches() []Node { return self.nodes[:16] } -func (self *FullNode) Copy() Node { return self } +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) { diff --git a/ptrie/shortnode.go b/ptrie/shortnode.go index 49319c555d..73ff2914bf 100644 --- a/ptrie/shortnode.go +++ b/ptrie/shortnode.go @@ -17,7 +17,7 @@ func (self *ShortNode) Value() Node { return self.value } func (self *ShortNode) Dirty() bool { return true } -func (self *ShortNode) Copy() Node { return self } +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()} diff --git a/ptrie/trie.go b/ptrie/trie.go index bb2b3845ad..687126aef8 100644 --- a/ptrie/trie.go +++ b/ptrie/trie.go @@ -2,6 +2,7 @@ package ptrie import ( "bytes" + "container/list" "sync" "github.com/ethereum/go-ethereum/crypto" @@ -14,33 +15,61 @@ type Backend interface { Set([]byte, []byte) } -type Cache map[string][]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) Set(key []byte, data []byte) { + self.store[string(key)] = data +} + +func (self *Cache) Flush() { + for k, v := range self.store { + self.backend.Set([]byte(k), v) + } -func (self Cache) Get(key []byte) []byte { - return self[string(key)] + // 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) Set(key []byte, data []byte) { - self[string(key)] = data + +func (self *Cache) Reset() { + self.store = make(map[string][]byte) } type Trie struct { mu sync.Mutex root Node roothash []byte - backend Backend -} + cache *Cache -func NewEmpty() *Trie { - return &Trie{sync.Mutex{}, nil, nil, make(Cache)} + revisions *list.List } func New(root []byte, backend Backend) *Trie { trie := &Trie{} + trie.revisions = list.New() trie.roothash = root - trie.backend = backend + trie.cache = NewCache(backend) - value := ethutil.NewValueFromBytes(trie.backend.Get(root)) - trie.root = trie.mknode(value) + if root != nil { + value := ethutil.NewValueFromBytes(trie.cache.Get(root)) + trie.root = trie.mknode(value) + } return trie } @@ -64,10 +93,28 @@ func (self *Trie) Hash() []byte { hash = crypto.Sha3(ethutil.Encode(self.root)) } - self.roothash = hash + 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() +} + +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 { @@ -272,7 +319,7 @@ func (self *Trie) mknode(value *ethutil.Value) Node { func (self *Trie) trans(node Node) Node { switch node := node.(type) { case *HashNode: - value := ethutil.NewValueFromBytes(self.backend.Get(node.key)) + value := ethutil.NewValueFromBytes(self.cache.Get(node.key)) return self.mknode(value) default: return node @@ -283,7 +330,7 @@ func (self *Trie) store(node Node) interface{} { data := ethutil.Encode(node) if len(data) >= 32 { key := crypto.Sha3(data) - self.backend.Set(key, data) + self.cache.Set(key, data) return key } diff --git a/ptrie/trie_test.go b/ptrie/trie_test.go index 6af6e1b406..478f59c602 100644 --- a/ptrie/trie_test.go +++ b/ptrie/trie_test.go @@ -8,6 +8,16 @@ import ( "github.com/ethereum/go-ethereum/ethutil" ) +type Db map[string][]byte + +func (self Db) Get(k []byte) []byte { return self[string(k)] } +func (self Db) Set(k, v []byte) { self[string(k)] = v } + +// Used for testing +func NewEmpty() *Trie { + return New(nil, make(Db)) +} + func TestInsert(t *testing.T) { trie := NewEmpty() @@ -91,7 +101,7 @@ func TestReplication(t *testing.T) { } trie.Hash() - trie2 := New(trie.roothash, trie.backend) + trie2 := New(trie.roothash, trie.cache) if string(trie2.GetString("horse")) != "stallion" { t.Error("expected to have harse => stallion") } @@ -104,37 +114,32 @@ func TestReplication(t *testing.T) { } -func BenchmarkGets(b *testing.B) { +func TestReset(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() - b.ResetTimer() - for i := 0; i < b.N; i++ { - trie.Get([]byte("horse")) - } -} + before := ethutil.CopyBytes(trie.roothash) + trie.UpdateString("should", "revert") + trie.Hash() + // Should have no effect + trie.Hash() + trie.Hash() + // ### -func BenchmarkUpdate(b *testing.B) { - trie := NewEmpty() + trie.Reset() + after := ethutil.CopyBytes(trie.roothash) - b.ResetTimer() - for i := 0; i < b.N; i++ { - trie.UpdateString(fmt.Sprintf("aaaaaaaaa%d", i), "value") + if !bytes.Equal(before, after) { + t.Errorf("expected roots to be equal. %x - %x", before, after) } - trie.Hash() } // Not actual test @@ -150,8 +155,41 @@ func TestOutput(t *testing.T) { fmt.Println("############################## FULL ################################") fmt.Println(trie.root) - trie2 := New(trie.roothash, trie.backend) + trie2 := New(trie.roothash, trie.cache) trie2.GetString(base + "20") fmt.Println("############################## SMALL ################################") 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 index c226621a70..c593eb6c60 100644 --- a/ptrie/valuenode.go +++ b/ptrie/valuenode.go @@ -8,6 +8,6 @@ type ValueNode struct { 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 self } +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 } From cab7e6000e20413d697d07a1a6b2abcc85dfc2e1 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 19 Nov 2014 16:35:57 +0100 Subject: [PATCH 17/21] Increased coverage --- ptrie/cache.go | 42 +++++++++++++++++++++++++++++++++ ptrie/trie.go | 59 +++++++++------------------------------------- ptrie/trie_test.go | 40 ++++++++++++++++++++++++++++++- 3 files changed, 92 insertions(+), 49 deletions(-) create mode 100644 ptrie/cache.go diff --git a/ptrie/cache.go b/ptrie/cache.go new file mode 100644 index 0000000000..8efdb047b7 --- /dev/null +++ b/ptrie/cache.go @@ -0,0 +1,42 @@ +package ptrie + +type Backend interface { + Get([]byte) []byte + Set([]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) Set(key []byte, data []byte) { + self.store[string(key)] = data +} + +func (self *Cache) Flush() { + for k, v := range self.store { + self.backend.Set([]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/trie.go b/ptrie/trie.go index 687126aef8..0ef498b10e 100644 --- a/ptrie/trie.go +++ b/ptrie/trie.go @@ -10,47 +10,6 @@ import ( "github.com/ethereum/go-ethereum/trie" ) -type Backend interface { - Get([]byte) []byte - Set([]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) Set(key []byte, data []byte) { - self.store[string(key)] = data -} - -func (self *Cache) Flush() { - for k, v := range self.store { - self.backend.Set([]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) -} - type Trie struct { mu sync.Mutex root Node @@ -83,14 +42,17 @@ func (self *Trie) Root() []byte { return self.Hash() } func (self *Trie) Hash() []byte { var hash []byte if self.root != nil { - t := self.root.Hash() - if byts, ok := t.([]byte); ok { - hash = byts - } else { - hash = crypto.Sha3(ethutil.Encode(self.root.RlpData())) - } + 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(self.root)) + hash = crypto.Sha3(ethutil.Encode("")) } if !bytes.Equal(hash, self.roothash) { @@ -107,6 +69,7 @@ func (self *Trie) Commit() { self.cache.Flush() } +// Reset should only be called if the trie has been hashed func (self *Trie) Reset() { self.cache.Reset() diff --git a/ptrie/trie_test.go b/ptrie/trie_test.go index 478f59c602..aed16a2ffc 100644 --- a/ptrie/trie_test.go +++ b/ptrie/trie_test.go @@ -5,6 +5,7 @@ import ( "fmt" "testing" + "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethutil" ) @@ -18,6 +19,15 @@ 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() @@ -62,6 +72,34 @@ func TestGet(t *testing.T) { 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"}, @@ -142,7 +180,7 @@ func TestReset(t *testing.T) { } } -// Not actual test +// Not an actual test func TestOutput(t *testing.T) { t.Skip() From b05e63c34d335e65c8c76ed9a9401b74170db617 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 19 Nov 2014 16:56:01 +0100 Subject: [PATCH 18/21] Added paranoia check for tries --- ptrie/cache.go | 10 +++++----- ptrie/trie.go | 13 ++++++++++++- ptrie/trie_test.go | 35 +++++++++++++++++++++++++++++++---- 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/ptrie/cache.go b/ptrie/cache.go index 8efdb047b7..721dc4cf64 100644 --- a/ptrie/cache.go +++ b/ptrie/cache.go @@ -1,8 +1,8 @@ package ptrie type Backend interface { - Get([]byte) []byte - Set([]byte, []byte) + Get([]byte) ([]byte, error) + Put([]byte, []byte) } type Cache struct { @@ -17,19 +17,19 @@ func NewCache(backend Backend) *Cache { func (self *Cache) Get(key []byte) []byte { data := self.store[string(key)] if data == nil { - data = self.backend.Get(key) + data, _ = self.backend.Get(key) } return data } -func (self *Cache) Set(key []byte, data []byte) { +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.Set([]byte(k), v) + self.backend.Put([]byte(k), v) } // This will eventually grow too large. We'd could diff --git a/ptrie/trie.go b/ptrie/trie.go index 0ef498b10e..4b0f20d8cc 100644 --- a/ptrie/trie.go +++ b/ptrie/trie.go @@ -10,6 +10,17 @@ import ( "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 @@ -293,7 +304,7 @@ func (self *Trie) store(node Node) interface{} { data := ethutil.Encode(node) if len(data) >= 32 { key := crypto.Sha3(data) - self.cache.Set(key, data) + self.cache.Put(key, data) return key } diff --git a/ptrie/trie_test.go b/ptrie/trie_test.go index aed16a2ffc..dfc89709d7 100644 --- a/ptrie/trie_test.go +++ b/ptrie/trie_test.go @@ -11,8 +11,8 @@ import ( type Db map[string][]byte -func (self Db) Get(k []byte) []byte { return self[string(k)] } -func (self Db) Set(k, v []byte) { self[string(k)] = v } +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 { @@ -122,6 +122,7 @@ func TestEmptyValues(t *testing.T) { } func TestReplication(t *testing.T) { + t.Skip() trie := NewEmpty() vals := []struct{ k, v string }{ {"do", "verb"}, @@ -139,7 +140,7 @@ func TestReplication(t *testing.T) { } trie.Hash() - trie2 := New(trie.roothash, trie.cache) + trie2 := New(trie.roothash, trie.cache.backend) if string(trie2.GetString("horse")) != "stallion" { t.Error("expected to have harse => stallion") } @@ -180,6 +181,32 @@ func TestReset(t *testing.T) { } } +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() @@ -193,7 +220,7 @@ func TestOutput(t *testing.T) { fmt.Println("############################## FULL ################################") fmt.Println(trie.root) - trie2 := New(trie.roothash, trie.cache) + trie2 := New(trie.roothash, trie.cache.backend) trie2.GetString(base + "20") fmt.Println("############################## SMALL ################################") fmt.Println(trie2.root) From 12f1aea38d6f9dd9748a95b2d9ea813ae16277a7 Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 20 Nov 2014 18:11:31 +0100 Subject: [PATCH 19/21] Fixed iterator for short nodes. In some cases the iterator didn't properly return the correct key because it didn't append fields to the reverse lookup. --- ptrie/iterator.go | 5 +++-- ptrie/iterator_test.go | 5 +++++ ptrie/trie_test.go | 3 +-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/ptrie/iterator.go b/ptrie/iterator.go index c6d4f64a01..5714bdbc8a 100644 --- a/ptrie/iterator.go +++ b/ptrie/iterator.go @@ -65,9 +65,9 @@ func (self *Iterator) next(node Node, key []byte) []byte { } } else { cnode := node.Value() - skey := key[len(k):] 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 { @@ -93,7 +93,8 @@ func (self *Iterator) key(node Node) []byte { return k } else { - return self.key(node.Value()) + k := trie.RemTerm(node.Key()) + return append(k, self.key(node.Value())...) } case *FullNode: if node.Value() != nil { diff --git a/ptrie/iterator_test.go b/ptrie/iterator_test.go index 8921bb6708..acfc03d633 100644 --- a/ptrie/iterator_test.go +++ b/ptrie/iterator_test.go @@ -8,12 +8,17 @@ func TestIterator(t *testing.T) { {"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() { diff --git a/ptrie/trie_test.go b/ptrie/trie_test.go index dfc89709d7..ba50f50a51 100644 --- a/ptrie/trie_test.go +++ b/ptrie/trie_test.go @@ -122,7 +122,6 @@ func TestEmptyValues(t *testing.T) { } func TestReplication(t *testing.T) { - t.Skip() trie := NewEmpty() vals := []struct{ k, v string }{ {"do", "verb"}, @@ -138,7 +137,7 @@ func TestReplication(t *testing.T) { for _, val := range vals { trie.UpdateString(val.k, val.v) } - trie.Hash() + trie.Commit() trie2 := New(trie.roothash, trie.cache.backend) if string(trie2.GetString("horse")) != "stallion" { From 9b8a12b4b53f319f6422a43e43b2274a337d7fec Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 20 Nov 2014 18:20:04 +0100 Subject: [PATCH 20/21] Removed naively casting to bytes --- ptrie/trie.go | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/ptrie/trie.go b/ptrie/trie.go index 4b0f20d8cc..7701966e5d 100644 --- a/ptrie/trie.go +++ b/ptrie/trie.go @@ -53,15 +53,13 @@ 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())) - } - */ + //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("")) } From 8cf9ed0ea588e97f2baf0f834248727e8fbca18f Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 21 Nov 2014 10:48:07 -0500 Subject: [PATCH 21/21] Fixed test --- ptrie/trie.go | 3 ++- ptrie/trie_test.go | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ptrie/trie.go b/ptrie/trie.go index 7701966e5d..9fe9ea52a5 100644 --- a/ptrie/trie.go +++ b/ptrie/trie.go @@ -3,6 +3,7 @@ package ptrie import ( "bytes" "container/list" + "fmt" "sync" "github.com/ethereum/go-ethereum/crypto" @@ -198,7 +199,7 @@ func (self *Trie) get(node Node, key []byte) Node { case *FullNode: return self.get(node.branch(key[0]), key[1:]) default: - panic("Invalid node") + panic(fmt.Sprintf("%T: invalid node: %v", node, node)) } } diff --git a/ptrie/trie_test.go b/ptrie/trie_test.go index ba50f50a51..5b1c641401 100644 --- a/ptrie/trie_test.go +++ b/ptrie/trie_test.go @@ -215,13 +215,13 @@ func TestOutput(t *testing.T) { for i := 0; i < 50; i++ { trie.UpdateString(fmt.Sprintf("%s%d", base, i), "valueeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee") } - trie.Hash() 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("############################## SMALL ################################") fmt.Println(trie2.root) }