diff options
author | obscuren <geffobscura@gmail.com> | 2014-12-20 09:34:12 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2014-12-20 09:34:12 +0800 |
commit | 3983dd2428137211f84f299f9ce8690c22f50afd (patch) | |
tree | 3a2dc53b365e6f377fc82a3514150d1297fe549c | |
parent | 7daa8c2f6eb25511c6a54ad420709af911fc6748 (diff) | |
parent | 0a9dc1536c5d776844d6947a0090ff7e1a7c6ab4 (diff) | |
download | go-tangerine-3983dd2428137211f84f299f9ce8690c22f50afd.tar.gz go-tangerine-3983dd2428137211f84f299f9ce8690c22f50afd.tar.zst go-tangerine-3983dd2428137211f84f299f9ce8690c22f50afd.zip |
Merge branch 'release/v0.7.10'vv0.7.10
344 files changed, 67743 insertions, 1445 deletions
diff --git a/.gitignore b/.gitignore index de3a847ac..fea7df6c2 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,4 @@ *un~ .DS_Store */**/.DS_Store -ethereum/ethereum -ethereal/ethereal - +.ethtest diff --git a/.travis.yml b/.travis.yml index 32740f91a..d09cbcdb0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,25 @@ -before_install: sudo apt-get install libgmp3-dev language: go go: - - 1.2 + - 1.3 +before_install: + - sudo add-apt-repository ppa:ubuntu-sdk-team/ppa -y + - sudo apt-get update -qq + - sudo apt-get install -yqq libgmp3-dev qtbase5-private-dev qtdeclarative5-private-dev libqt5opengl5-dev libreadline6-dev +install: + - go get code.google.com/p/go.tools/cmd/goimports + - go get github.com/golang/lint/golint + # - go get code.google.com/p/go.tools/cmd/vet + - go get code.google.com/p/go.tools/cmd/cover + - go get github.com/mattn/goveralls + - ./install_deps.sh +before_script: + - gofmt -l -w . + - goimports -l -w . + - golint . + # - go vet ./... + # - go test -race ./... +script: + - ./gocoverage.sh && goveralls -coverprofile=profile.cov -service=travis-ci -repotoken $COVERALLS_TOKEN +env: + - secure: "U2U1AmkU4NJBgKR/uUAebQY87cNL0+1JHjnLOmmXwxYYyj5ralWb1aSuSH3qSXiT93qLBmtaUkuv9fberHVqrbAeVlztVdUsKAq7JMQH+M99iFkC9UiRMqHmtjWJ0ok4COD1sRYixxi21wb/JrMe3M1iL4QJVS61iltjHhVdM64=" + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..1f37ce892 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,41 @@ +FROM ubuntu:14.04 + +## Environment setup +ENV HOME /root +ENV GOPATH /root/go +ENV PATH /go/bin:/root/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games + +RUN mkdir -p /root/go +ENV DEBIAN_FRONTEND noninteractive + +## Install base dependencies +RUN apt-get update && apt-get upgrade -y +RUN apt-get install -y git mercurial build-essential software-properties-common pkg-config libgmp3-dev libreadline6-dev libpcre3-dev libpcre++-dev + +## Build and install Go +RUN hg clone -u release https://code.google.com/p/go +RUN cd go && hg update go1.4 +RUN cd go/src && ./all.bash && go version + +## Install GUI dependencies +RUN add-apt-repository ppa:ubuntu-sdk-team/ppa -y +RUN apt-get update -y +RUN apt-get install -y qtbase5-private-dev qtdeclarative5-private-dev libqt5opengl5-dev + +## Fetch and install serpent-go +RUN go get -v -d github.com/ethereum/serpent-go +WORKDIR $GOPATH/src/github.com/ethereum/serpent-go +RUN git checkout master +RUN git submodule update --init +RUN go install -v + +# Fetch and install go-ethereum +RUN go get -v -d github.com/ethereum/go-ethereum/... +WORKDIR $GOPATH/src/github.com/ethereum/go-ethereum +RUN git checkout poc8 +RUN ETH_DEPS=$(go list -f '{{.Imports}} {{.TestImports}} {{.XTestImports}}' github.com/ethereum/go-ethereum/... | sed -e 's/\[//g' | sed -e 's/\]//g' | sed -e 's/C //g'); if [ "$ETH_DEPS" ]; then go get $ETH_DEPS; fi +RUN go install -v ./cmd/ethereum + +# Run JSON RPC +ENTRYPOINT ["ethereum", "-rpc=true", "-rpcport=8080"] +EXPOSE 8080 @@ -1,16 +1,16 @@ Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. This library is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public +modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -General Public License for more details. +Lesser General Public License for more details. -You should have received a copy of the GNU General Public License -along with this library; if not, write to the Free Software +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -1,4 +1,8 @@ +[![Bugs](https://badge.waffle.io/ethereum/go-ethereum.png?label=bug&title=Bugs)](https://waffle.io/ethereum/go-ethereum) [![Stories in Ready](https://badge.waffle.io/ethereum/go-ethereum.png?label=ready&title=Ready)](https://waffle.io/ethereum/go-ethereum) +[![Stories in +Progress](https://badge.waffle.io/ethereum/go-ethereum.svg?label=in%20progress&title=In Progress)](http://waffle.io/ethereum/go-ethereum) + Ethereum ======== @@ -8,38 +12,64 @@ Status](http://build.ethdev.com/buildstatusimage?builder=Linux%20Go%20develop%20 Ethereum Go Client © 2014 Jeffrey Wilcke. -Current state: Proof of Concept 0.6.7. +Current state: Proof of Concept 0.7 -For the development package please see the [eth-go package](https://github.com/ethereum/eth-go). +Ethereum is currently in its testing phase. Build -======= +===== -To build Ethereal (GUI): +To build Mist (GUI): -`go get github.com/ethereum/go-ethereum/ethereal` +`go get github.com/ethereum/go-ethereum/cmd/mist` To build the node (CLI): -`go get github.com/ethereum/go-ethereum/ethereum` +`go get github.com/ethereum/go-ethereum/cmd/ethereum` For further, detailed, build instruction please see the [Wiki](https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum(Go)) +Automated (dev) builds +====================== + +* [[OS X](http://build.ethdev.com/builds/OSX%20Go%20develop%20branch/latest/app/)] +* [Windows] Coming soon™ +* [Linux] Coming soon™ + +Binaries +======== + +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 ethereal +== 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] @@ -47,31 +77,34 @@ ethereum [options] [filename] filename Load the given file and interpret as JavaScript -m Start mining blocks -Etheral only +== Mist only == + -asset_path absolute path to GUI assets directory ``` Contribution ============ -If you would like to contribute to Ethereum Go, please fork, fix, commit and -send a pull request to the main repository. Commits which do not comply with the coding standards explained below -will be ignored. If you send a pull request, make sure that you -commit to the `develop` branch and that you do not merge to `master`. -Commits that are directly based off of the `master` branch instead of the `develop` branch will be ignored. +If you'd like to contribute to Ethereum please fork, fix, commit and +send a pull request. Commits who do not comply with the coding standards +are ignored (use gofmt!). If you send pull requests make absolute sure that you +commit on the `develop` branch and that you do not merge to master. +Commits that are directly based on master are simply ignored. -To make this process simpler try following the [git flow](http://nvie.com/posts/a-successful-git-branching-model/) branching model, as it sets this process up and streamlines work flow. +To make life easier try [git flow](http://nvie.com/posts/a-successful-git-branching-model/) it sets +this all up and streamlines your work flow. Coding standards ================ -Code should be formatted according to the [Go Formatting +Sources should be formatted according to the [Go Formatting Style](http://golang.org/doc/effective_go.html#formatting). -Unless struct fields are supposed to be directly accessible, provide -getters and hide the fields through Go's exporting facility. +Unless structs fields are supposed to be directly accesible, provide +Getters and hide the fields through Go's exporting facility. -Make comments in your code meaningful and only use them when necessary. Describe in detail what your code is trying to achieve. For example, this would be redundant and unnecessary commenting: +When you comment put meaningfull comments. Describe in detail what you +want to achieve. *wrong* @@ -82,7 +115,12 @@ if x > y { } ``` -Everyone reading the source code should know what this code snippet was meant to achieve, and so those are **not** meaningful comments. +Everyone reading the source probably know what you wanted to achieve +with above code. Those are **not** meaningful comments. -While this project is constantly tested and run, code tests should be written regardless. There is not time to evaluate every person's code specifically, so it is expected of you to write tests for the code so that it does not have to be tested manually. In fact, contributing by simply writing tests is perfectly fine! +While the project isn't 100% tested I want you to write tests non the +less. I haven't got time to evaluate everyone's code in detail so I +expect you to write tests for me so I don't have to test your code +manually. (If you want to contribute by just writing tests that's fine +too!) diff --git a/_data/chain1 b/_data/chain1 Binary files differnew file mode 100755 index 000000000..ef392e001 --- /dev/null +++ b/_data/chain1 diff --git a/_data/chain2 b/_data/chain2 Binary files differnew file mode 100755 index 000000000..48ed4d5ea --- /dev/null +++ b/_data/chain2 diff --git a/block_pool.go b/block_pool.go new file mode 100644 index 000000000..c618f6993 --- /dev/null +++ b/block_pool.go @@ -0,0 +1,351 @@ +package eth + +import ( + "bytes" + "container/list" + "fmt" + "math" + "math/big" + "sync" + "time" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/wire" +) + +var poollogger = logger.NewLogger("BPOOL") + +type block struct { + from *Peer + peer *Peer + block *types.Block + reqAt time.Time + requested int +} + +type BlockPool struct { + mut sync.Mutex + + eth *Ethereum + + hashes [][]byte + pool map[string]*block + + td *big.Int + quit chan bool + + fetchingHashes bool + downloadStartedAt time.Time + + ChainLength, BlocksProcessed int + + peer *Peer +} + +func NewBlockPool(eth *Ethereum) *BlockPool { + return &BlockPool{ + eth: eth, + pool: make(map[string]*block), + td: ethutil.Big0, + quit: make(chan bool), + } +} + +func (self *BlockPool) Len() int { + return len(self.hashes) +} + +func (self *BlockPool) Reset() { + self.pool = make(map[string]*block) + self.hashes = nil +} + +func (self *BlockPool) HasLatestHash() bool { + self.mut.Lock() + defer self.mut.Unlock() + + return self.pool[string(self.eth.ChainManager().CurrentBlock().Hash())] != nil +} + +func (self *BlockPool) HasCommonHash(hash []byte) bool { + return self.eth.ChainManager().GetBlock(hash) != nil +} + +func (self *BlockPool) Blocks() (blocks types.Blocks) { + for _, item := range self.pool { + if item.block != nil { + blocks = append(blocks, item.block) + } + } + + return +} + +func (self *BlockPool) FetchHashes(peer *Peer) bool { + highestTd := self.eth.HighestTDPeer() + + if (self.peer == nil && peer.td.Cmp(highestTd) >= 0) || (self.peer != nil && peer.td.Cmp(self.peer.td) > 0) || self.peer == peer { + if self.peer != peer { + poollogger.Infof("Found better suitable peer (%v vs %v)\n", self.td, peer.td) + + if self.peer != nil { + self.peer.doneFetchingHashes = true + } + } + + self.peer = peer + self.td = peer.td + + if !self.HasLatestHash() { + self.fetchHashes() + } + + return true + } + + return false +} + +func (self *BlockPool) fetchHashes() { + peer := self.peer + + peer.doneFetchingHashes = false + + const amount = 256 + peerlogger.Debugf("Fetching hashes (%d) %x...\n", amount, peer.lastReceivedHash[0:4]) + peer.QueueMessage(wire.NewMessage(wire.MsgGetBlockHashesTy, []interface{}{peer.lastReceivedHash, uint32(amount)})) +} + +func (self *BlockPool) AddHash(hash []byte, peer *Peer) { + self.mut.Lock() + defer self.mut.Unlock() + + if self.pool[string(hash)] == nil { + self.pool[string(hash)] = &block{peer, nil, nil, time.Now(), 0} + + self.hashes = append([][]byte{hash}, self.hashes...) + } +} + +func (self *BlockPool) Add(b *types.Block, peer *Peer) { + self.addBlock(b, peer, false) +} + +func (self *BlockPool) AddNew(b *types.Block, peer *Peer) { + self.addBlock(b, peer, true) +} + +func (self *BlockPool) addBlock(b *types.Block, peer *Peer, newBlock bool) { + self.mut.Lock() + defer self.mut.Unlock() + + hash := string(b.Hash()) + + if self.pool[hash] == nil && !self.eth.ChainManager().HasBlock(b.Hash()) { + poollogger.Infof("Got unrequested block (%x...)\n", hash[0:4]) + + self.hashes = append(self.hashes, b.Hash()) + self.pool[hash] = &block{peer, peer, b, time.Now(), 0} + + // The following is only performed on an unrequested new block + if newBlock { + fmt.Println("1.", !self.eth.ChainManager().HasBlock(b.PrevHash), ethutil.Bytes2Hex(b.Hash()[0:4]), ethutil.Bytes2Hex(b.PrevHash[0:4])) + fmt.Println("2.", self.pool[string(b.PrevHash)] == nil) + fmt.Println("3.", !self.fetchingHashes) + if !self.eth.ChainManager().HasBlock(b.PrevHash) /*&& self.pool[string(b.PrevHash)] == nil*/ && !self.fetchingHashes { + poollogger.Infof("Unknown chain, requesting (%x...)\n", b.PrevHash[0:4]) + peer.QueueMessage(wire.NewMessage(wire.MsgGetBlockHashesTy, []interface{}{b.Hash(), uint32(256)})) + } + } + } else if self.pool[hash] != nil { + self.pool[hash].block = b + } + + self.BlocksProcessed++ +} + +func (self *BlockPool) Remove(hash []byte) { + self.mut.Lock() + defer self.mut.Unlock() + + self.hashes = ethutil.DeleteFromByteSlice(self.hashes, hash) + delete(self.pool, string(hash)) +} + +func (self *BlockPool) DistributeHashes() { + self.mut.Lock() + defer self.mut.Unlock() + + var ( + peerLen = self.eth.peers.Len() + amount = 256 * peerLen + dist = make(map[*Peer][][]byte) + ) + + num := int(math.Min(float64(amount), float64(len(self.pool)))) + for i, j := 0, 0; i < len(self.hashes) && j < num; i++ { + hash := self.hashes[i] + item := self.pool[string(hash)] + + if item != nil && item.block == nil { + var peer *Peer + lastFetchFailed := time.Since(item.reqAt) > 5*time.Second + + // Handle failed requests + if lastFetchFailed && item.requested > 5 && item.peer != nil { + if item.requested < 100 { + // Select peer the hash was retrieved off + peer = item.from + } else { + // Remove it + self.hashes = ethutil.DeleteFromByteSlice(self.hashes, hash) + delete(self.pool, string(hash)) + } + } else if lastFetchFailed || item.peer == nil { + // Find a suitable, available peer + eachPeer(self.eth.peers, func(p *Peer, v *list.Element) { + if peer == nil && len(dist[p]) < amount/peerLen && p.statusKnown { + peer = p + } + }) + } + + if peer != nil { + item.reqAt = time.Now() + item.peer = peer + item.requested++ + + dist[peer] = append(dist[peer], hash) + } + } + } + + for peer, hashes := range dist { + peer.FetchBlocks(hashes) + } + + if len(dist) > 0 { + self.downloadStartedAt = time.Now() + } +} + +func (self *BlockPool) Start() { + go self.downloadThread() + go self.chainThread() +} + +func (self *BlockPool) Stop() { + close(self.quit) +} + +func (self *BlockPool) downloadThread() { + serviceTimer := time.NewTicker(100 * time.Millisecond) +out: + for { + select { + case <-self.quit: + break out + case <-serviceTimer.C: + // Check if we're catching up. If not distribute the hashes to + // the peers and download the blockchain + self.fetchingHashes = false + eachPeer(self.eth.peers, func(p *Peer, v *list.Element) { + if p.statusKnown && p.FetchingHashes() { + self.fetchingHashes = true + } + }) + + if len(self.hashes) > 0 { + self.DistributeHashes() + } + + if self.ChainLength < len(self.hashes) { + self.ChainLength = len(self.hashes) + } + + if self.peer != nil && + !self.peer.doneFetchingHashes && + time.Since(self.peer.lastHashAt) > 10*time.Second && + time.Since(self.peer.lastHashRequestedAt) > 5*time.Second { + self.fetchHashes() + } + + /* + if !self.fetchingHashes { + blocks := self.Blocks() + chain.BlockBy(chain.Number).Sort(blocks) + + if len(blocks) > 0 { + if !self.eth.ChainManager().HasBlock(b.PrevHash) && self.pool[string(b.PrevHash)] == nil && !self.fetchingHashes { + } + } + } + */ + } + } +} + +func (self *BlockPool) chainThread() { + procTimer := time.NewTicker(500 * time.Millisecond) +out: + for { + select { + case <-self.quit: + break out + case <-procTimer.C: + blocks := self.Blocks() + types.BlockBy(types.Number).Sort(blocks) + + // Find common block + for i, block := range blocks { + if self.eth.ChainManager().HasBlock(block.PrevHash) { + blocks = blocks[i:] + break + } + } + + if len(blocks) > 0 { + if self.eth.ChainManager().HasBlock(blocks[0].PrevHash) { + for i, block := range blocks[1:] { + // NOTE: The Ith element in this loop refers to the previous block in + // outer "blocks" + if bytes.Compare(block.PrevHash, blocks[i].Hash()) != 0 { + blocks = blocks[:i] + + break + } + } + } else { + blocks = nil + } + } + + if len(blocks) > 0 { + chainman := self.eth.ChainManager() + + err := chainman.InsertChain(blocks) + if err != nil { + poollogger.Debugln(err) + + self.Reset() + + if self.peer != nil && self.peer.conn != nil { + poollogger.Debugf("Punishing peer for supplying bad chain (%v)\n", self.peer.conn.RemoteAddr()) + } + + // This peer gave us bad hashes and made us fetch a bad chain, therefor he shall be punished. + self.eth.BlacklistPeer(self.peer) + self.peer.StopWithReason(DiscBadPeer) + self.td = ethutil.Big0 + self.peer = nil + } + + for _, block := range blocks { + self.Remove(block.Hash()) + } + } + } + } +} diff --git a/cmd/LICENSE b/cmd/LICENSE new file mode 100644 index 000000000..78efdaabe --- /dev/null +++ b/cmd/LICENSE @@ -0,0 +1,16 @@ +Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +MA 02110-1301 USA diff --git a/cmd/ethereum/cmd.go b/cmd/ethereum/cmd.go new file mode 100644 index 000000000..8710d6136 --- /dev/null +++ b/cmd/ethereum/cmd.go @@ -0,0 +1,52 @@ +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA + +package main + +import ( + "io/ioutil" + "os" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/cmd/ethereum/repl" + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/javascript" +) + +func InitJsConsole(ethereum *eth.Ethereum) { + repl := ethrepl.NewJSRepl(ethereum) + go repl.Start() + utils.RegisterInterrupt(func(os.Signal) { + repl.Stop() + }) +} + +func ExecJsFile(ethereum *eth.Ethereum, InputFile string) { + file, err := os.Open(InputFile) + if err != nil { + clilogger.Fatalln(err) + } + content, err := ioutil.ReadAll(file) + if err != nil { + clilogger.Fatalln(err) + } + re := javascript.NewJSRE(ethereum) + utils.RegisterInterrupt(func(os.Signal) { + re.Stop() + }) + re.Run(string(content)) +} diff --git a/ethereum/flags.go b/cmd/ethereum/flags.go index 58220f4e6..85aca47c3 100644 --- a/ethereum/flags.go +++ b/cmd/ethereum/flags.go @@ -1,13 +1,32 @@ +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA + package main import ( "flag" "fmt" + "log" "os" "os/user" "path" - "github.com/ethereum/eth-go/ethlog" + "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/vm" ) var ( @@ -37,6 +56,7 @@ var ( Dump bool DumpHash string DumpNumber int + VmType int ) // flags specific to cli client @@ -59,12 +79,13 @@ func Init() { flag.PrintDefaults() } + flag.IntVar(&VmType, "vm", 0, "Virtual Machine type: 0-1: standard, debug") flag.StringVar(&Identifier, "id", "", "Custom client identifier") flag.StringVar(&KeyRing, "keyring", "", "identifier for keyring to use") flag.StringVar(&KeyStore, "keystore", "db", "system to store keyrings: db|file (db)") flag.StringVar(&OutboundPort, "port", "30303", "listening port") flag.BoolVar(&UseUPnP, "upnp", false, "enable UPnP support") - flag.IntVar(&MaxPeer, "maxpeer", 10, "maximum desired peers") + flag.IntVar(&MaxPeer, "maxpeer", 30, "maximum desired peers") flag.IntVar(&RpcPort, "rpcport", 8080, "port to start json-rpc server on") flag.BoolVar(&StartRpc, "rpc", false, "start rpc server") flag.BoolVar(&StartWebSockets, "ws", false, "start websocket server") @@ -77,7 +98,7 @@ func Init() { flag.StringVar(&Datadir, "datadir", defaultDataDir(), "specifies the datadir to use") flag.StringVar(&ConfigFile, "conf", defaultConfigFile, "config file") flag.StringVar(&DebugFile, "debug", "", "debug file (no debugging if not set)") - flag.IntVar(&LogLevel, "loglevel", int(ethlog.InfoLevel), "loglevel: 0-5: silent,error,warn,info,debug,debug detail)") + flag.IntVar(&LogLevel, "loglevel", int(logger.InfoLevel), "loglevel: 0-5: silent,error,warn,info,debug,debug detail)") flag.BoolVar(&DiffTool, "difftool", false, "creates output for diff'ing. Sets LogLevel=0") flag.StringVar(&DiffType, "diff", "all", "sets the level of diff output [vm, all]. Has no effect if difftool=false") flag.BoolVar(&ShowGenesis, "genesis", false, "Dump the genesis block") @@ -91,5 +112,9 @@ func Init() { flag.Parse() + if VmType >= int(vm.MaxVmTy) { + log.Fatal("Invalid VM type ", VmType) + } + InputFile = flag.Arg(0) } diff --git a/ethereum/main.go b/cmd/ethereum/main.go index 0f0df20bb..2a3c46054 100644 --- a/ethereum/main.go +++ b/cmd/ethereum/main.go @@ -1,3 +1,20 @@ +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA + package main import ( @@ -5,18 +22,18 @@ import ( "os" "runtime" - "github.com/ethereum/eth-go/ethchain" - "github.com/ethereum/eth-go/ethlog" - "github.com/ethereum/eth-go/ethutil" - "github.com/ethereum/go-ethereum/utils" + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/logger" ) const ( ClientIdentifier = "Ethereum(G)" - Version = "0.6.7" + Version = "0.7.10" ) -var logger = ethlog.NewLogger("CLI") +var clilogger = logger.NewLogger("CLI") func main() { runtime.GOMAXPROCS(runtime.NumCPU()) @@ -31,7 +48,7 @@ func main() { LogLevel = 0 } - utils.InitConfig(ConfigFile, Datadir, "ETH") + utils.InitConfig(VmType, ConfigFile, Datadir, "ETH") ethutil.Config.Diff = DiffTool ethutil.Config.DiffType = DiffType @@ -42,7 +59,7 @@ func main() { db := utils.NewDatabase() err := utils.DBSanityCheck(db) if err != nil { - logger.Errorln(err) + fmt.Println(err) os.Exit(1) } @@ -57,14 +74,14 @@ func main() { ethereum := utils.NewEthereum(db, clientIdentity, keyManager, UseUPnP, OutboundPort, MaxPeer) if Dump { - var block *ethchain.Block + var block *types.Block if len(DumpHash) == 0 && DumpNumber == -1 { - block = ethereum.BlockChain().CurrentBlock + block = ethereum.ChainManager().CurrentBlock() } else if len(DumpHash) > 0 { - block = ethereum.BlockChain().GetBlock(ethutil.Hex2Bytes(DumpHash)) + block = ethereum.ChainManager().GetBlock(ethutil.Hex2Bytes(DumpHash)) } else { - block = ethereum.BlockChain().GetBlockByNumber(uint64(DumpNumber)) + block = ethereum.ChainManager().GetBlockByNumber(uint64(DumpNumber)) } if block == nil { @@ -76,11 +93,14 @@ func main() { os.Exit(1) } - fmt.Printf("RLP: %x\nstate: %x\nhash: %x\n", ethutil.Rlp(block), block.GetRoot(), block.Hash()) + // block.GetRoot() does not exist + //fmt.Printf("RLP: %x\nstate: %x\nhash: %x\n", ethutil.Rlp(block), block.GetRoot(), block.Hash()) // Leave the Println. This needs clean output for piping fmt.Printf("%s\n", block.State().Dump()) + fmt.Println(block) + os.Exit(0) } @@ -111,5 +131,5 @@ func main() { // this blocks the thread ethereum.WaitForShutdown() - ethlog.Flush() + logger.Flush() } diff --git a/cmd/ethereum/repl/console_colors_windows.go b/cmd/ethereum/repl/console_colors_windows.go new file mode 100644 index 000000000..8062746fb --- /dev/null +++ b/cmd/ethereum/repl/console_colors_windows.go @@ -0,0 +1,97 @@ +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA + +/* Inspired by https://github.com/xuyu/logging/blob/master/colorful_win.go */ + +package ethrepl + +import ( + "syscall" + "unsafe" +) + +type color uint16 + +const ( + green = color(0x0002) + red = color(0x0004) + yellow = color(0x000E) +) + +const ( + mask = uint16(yellow | green | red) +) + +var ( + kernel32 = syscall.NewLazyDLL("kernel32.dll") + procGetStdHandle = kernel32.NewProc("GetStdHandle") + procSetConsoleTextAttribute = kernel32.NewProc("SetConsoleTextAttribute") + procGetConsoleScreenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo") + hStdout uintptr + initScreenInfo *consoleScreenBufferInfo +) + +func setConsoleTextAttribute(hConsoleOutput uintptr, wAttributes uint16) bool { + ret, _, _ := procSetConsoleTextAttribute.Call(hConsoleOutput, uintptr(wAttributes)) + return ret != 0 +} + +type coord struct { + X, Y int16 +} + +type smallRect struct { + Left, Top, Right, Bottom int16 +} + +type consoleScreenBufferInfo struct { + DwSize coord + DwCursorPosition coord + WAttributes uint16 + SrWindow smallRect + DwMaximumWindowSize coord +} + +func getConsoleScreenBufferInfo(hConsoleOutput uintptr) *consoleScreenBufferInfo { + var csbi consoleScreenBufferInfo + ret, _, _ := procGetConsoleScreenBufferInfo.Call(hConsoleOutput, uintptr(unsafe.Pointer(&csbi))) + if ret == 0 { + return nil + } + return &csbi +} + +const ( + stdOutputHandle = uint32(-11 & 0xFFFFFFFF) +) + +func init() { + hStdout, _, _ = procGetStdHandle.Call(uintptr(stdOutputHandle)) + initScreenInfo = getConsoleScreenBufferInfo(hStdout) +} + +func resetColorful() { + if initScreenInfo == nil { + return + } + setConsoleTextAttribute(hStdout, initScreenInfo.WAttributes) +} + +func changeColor(c color) { + attr := uint16(0) & ^mask | uint16(c) + setConsoleTextAttribute(hStdout, attr) +} diff --git a/ethereum/repl/repl.go b/cmd/ethereum/repl/repl.go index d08feb7b4..a5146fecd 100644 --- a/ethereum/repl/repl.go +++ b/cmd/ethereum/repl/repl.go @@ -1,3 +1,20 @@ +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA + package ethrepl import ( @@ -7,13 +24,13 @@ import ( "os" "path" - "github.com/ethereum/eth-go" - "github.com/ethereum/eth-go/ethlog" - "github.com/ethereum/eth-go/ethutil" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/ethutil" "github.com/ethereum/go-ethereum/javascript" + "github.com/ethereum/go-ethereum/logger" ) -var logger = ethlog.NewLogger("REPL") +var repllogger = logger.NewLogger("REPL") type Repl interface { Start() @@ -42,7 +59,7 @@ func NewJSRepl(ethereum *eth.Ethereum) *JSRepl { func (self *JSRepl) Start() { if !self.running { self.running = true - logger.Infoln("init JS Console") + repllogger.Infoln("init JS Console") reader := bufio.NewReader(self.history) for { line, err := reader.ReadString('\n') @@ -63,7 +80,7 @@ func (self *JSRepl) Stop() { if self.running { self.running = false self.re.Stop() - logger.Infoln("exit JS Console") + repllogger.Infoln("exit JS Console") self.history.Close() } } diff --git a/ethereum/repl/repl_darwin.go b/cmd/ethereum/repl/repl_darwin.go index 4c07280f7..3710150cc 100644 --- a/ethereum/repl/repl_darwin.go +++ b/cmd/ethereum/repl/repl_darwin.go @@ -1,3 +1,20 @@ +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA + package ethrepl // #cgo darwin CFLAGS: -I/usr/local/opt/readline/include @@ -9,6 +26,7 @@ package ethrepl // #include <readline/history.h> import "C" import ( + "fmt" "os" "os/signal" "strings" @@ -118,6 +136,9 @@ func (self *JSRepl) PrintValue(v interface{}) { method, _ := self.re.Vm.Get("prettyPrint") v, err := self.re.Vm.ToValue(v) if err == nil { - method.Call(method, v) + val, err := method.Call(method, v) + if err == nil { + fmt.Printf("%v", val) + } } } diff --git a/ethereum/repl/repl_linux.go b/cmd/ethereum/repl/repl_linux.go index 276f135d7..276f135d7 120000 --- a/ethereum/repl/repl_linux.go +++ b/cmd/ethereum/repl/repl_linux.go diff --git a/cmd/ethereum/repl/repl_windows.go b/cmd/ethereum/repl/repl_windows.go new file mode 100644 index 000000000..d2c405ee9 --- /dev/null +++ b/cmd/ethereum/repl/repl_windows.go @@ -0,0 +1,92 @@ +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA + +package ethrepl + +import ( + "bufio" + "fmt" + "os" + "strings" +) + +func (self *JSRepl) read() { + reader := bufio.NewReader(os.Stdin) + for { + fmt.Printf(self.prompt) + str, _, err := reader.ReadLine() + if err != nil { + fmt.Println("Error reading input", err) + } else { + if string(str) == "exit" { + self.Stop() + break + } else { + self.parseInput(string(str)) + } + } + } +} + +func addHistory(s string) { +} + +func printColored(outputVal string) { + for outputVal != "" { + codePart := "" + if strings.HasPrefix(outputVal, "\033[32m") { + codePart = "\033[32m" + changeColor(2) + } + if strings.HasPrefix(outputVal, "\033[1m\033[30m") { + codePart = "\033[1m\033[30m" + changeColor(8) + } + if strings.HasPrefix(outputVal, "\033[31m") { + codePart = "\033[31m" + changeColor(red) + } + if strings.HasPrefix(outputVal, "\033[35m") { + codePart = "\033[35m" + changeColor(5) + } + if strings.HasPrefix(outputVal, "\033[0m") { + codePart = "\033[0m" + resetColorful() + } + textPart := outputVal[len(codePart):len(outputVal)] + index := strings.Index(textPart, "\033") + if index == -1 { + outputVal = "" + } else { + outputVal = textPart[index:len(textPart)] + textPart = textPart[0:index] + } + fmt.Printf("%v", textPart) + } +} + +func (self *JSRepl) PrintValue(v interface{}) { + method, _ := self.re.Vm.Get("prettyPrint") + v, err := self.re.Vm.ToValue(v) + if err == nil { + val, err := method.Call(method, v) + if err == nil { + printColored(fmt.Sprintf("%v", val)) + } + } +} diff --git a/cmd/ethtest/main.go b/cmd/ethtest/main.go new file mode 100644 index 000000000..94ab779db --- /dev/null +++ b/cmd/ethtest/main.go @@ -0,0 +1,128 @@ +/* + This file is part of go-ethereum + + go-ethereum is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + go-ethereum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with go-ethereum. If not, see <http://www.gnu.org/licenses/>. +*/ +/** + * @authors: + * Jeffrey Wilcke <i@jev.io> + * @date 2014 + * + */ + +package main + +import ( + "bytes" + "encoding/json" + "io/ioutil" + "log" + "os" + "strings" + + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/state" + "github.com/ethereum/go-ethereum/tests/helper" +) + +type Account struct { + Balance string + Code string + Nonce string + Storage map[string]string +} + +func StateObjectFromAccount(addr string, account Account) *state.StateObject { + obj := state.NewStateObject(ethutil.Hex2Bytes(addr)) + obj.SetBalance(ethutil.Big(account.Balance)) + + if ethutil.IsHex(account.Code) { + account.Code = account.Code[2:] + } + obj.Code = ethutil.Hex2Bytes(account.Code) + obj.Nonce = ethutil.Big(account.Nonce).Uint64() + + return obj +} + +type VmTest struct { + Callcreates interface{} + Env map[string]string + Exec map[string]string + Gas string + Out string + Post map[string]Account + Pre map[string]Account +} + +func RunVmTest(js string) (failed int) { + tests := make(map[string]VmTest) + + data, _ := ioutil.ReadAll(strings.NewReader(js)) + err := json.Unmarshal(data, &tests) + if err != nil { + log.Fatalln(err) + } + + for name, test := range tests { + state := state.New(helper.NewTrie()) + for addr, account := range test.Pre { + obj := StateObjectFromAccount(addr, account) + state.SetStateObject(obj) + } + + ret, _, gas, err := helper.RunVm(state, test.Env, test.Exec) + // When an error is returned it doesn't always mean the tests fails. + // Have to come up with some conditional failing mechanism. + if err != nil { + log.Println(err) + } + + rexp := helper.FromHex(test.Out) + if bytes.Compare(rexp, ret) != 0 { + log.Printf("%s's return failed. Expected %x, got %x\n", name, rexp, ret) + failed = 1 + } + + gexp := ethutil.Big(test.Gas) + if gexp.Cmp(gas) != 0 { + log.Printf("%s's gas failed. Expected %v, got %v\n", name, gexp, gas) + failed = 1 + } + + for addr, account := range test.Post { + obj := state.GetStateObject(helper.FromHex(addr)) + for addr, value := range account.Storage { + v := obj.GetState(helper.FromHex(addr)).Bytes() + vexp := helper.FromHex(value) + + if bytes.Compare(v, vexp) != 0 { + log.Printf("%s's : (%x: %s) storage failed. Expected %x, got %x (%v %v)\n", name, obj.Address()[0:4], addr, vexp, v, ethutil.BigD(vexp), ethutil.BigD(v)) + failed = 1 + } + } + } + } + + return +} + +func main() { + helper.Logger.SetLogLevel(5) + if len(os.Args) == 1 { + log.Fatalln("no json supplied") + } + + os.Exit(RunVmTest(os.Args[1])) +} diff --git a/cmd/evm/code.txt b/cmd/evm/code.txt new file mode 100644 index 000000000..a964ad9d2 --- /dev/null +++ b/cmd/evm/code.txt @@ -0,0 +1 @@ +60006102ff5360003560001a60008114156103395760013560405260216040516020025990590160009052606052604051602002816060513760405160200281019050506002604051121561005957604051602002606051f35b604051602002599059016000905260a052600060c052604051602002599059016000905260e0526000610100526001610120525b604051610120511215610109576060515161012051602002606051015112156100d8576101205160200260605101516101005160200260e051015260016101005101610100526100f9565b61012051602002606051015160c05160200260a0510152600160c0510160c0525b600161012051016101205261008d565b60216020599059016000905260c051808252806020028301925050602082015990590160009052600081538151600182015260218101825160200260a0518260005b8381101561016657808301518186015260208101905061014b565b50505050825160200281019050604059905901600090526102405281610240515283602061024051015261024051905090509050905060c05160200280599059016000905281816020850151855160003060195a03f1508090509050905060a05260216020599059016000905261010051808252806020028301925050602082015990590160009052600081538151600182015260218101825160200260e0518260005b8381101561022557808301518186015260208101905061020a565b50505050825160200281019050604059905901600090526102c052816102c051528360206102c05101526102c05190509050905090506101005160200280599059016000905281816020850151855160003060195a03f1508090509050905060e05260405160200259905901600090526102e0526000610120525b610100516101205112156102d7576101205160200260e0510151610120516020026102e051015260016101205101610120526102a0565b60605151610100516020026102e05101526000610120525b60c05161012051121561032d576101205160200260a05101516101205160016101005101016020026102e051015260016101205101610120526102ef565b6040516020026102e051f35b50 diff --git a/cmd/evm/input.txt b/cmd/evm/input.txt new file mode 100644 index 000000000..1b6857ab9 --- /dev/null +++ b/cmd/evm/input.txt @@ -0,0 +1 @@ +0000000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001f0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000023000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000250000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002700000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000033000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000039000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000003f0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004100000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000480000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000004f0000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000005100000000000000000000000000000000000000000000000000000000000000520000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000005400000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000005700000000000000000000000000000000000000000000000000000000000000580000000000000000000000000000000000000000000000000000000000000059000000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000005f0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000066000000000000000000000000000000000000000000000000000000000000006700000000000000000000000000000000000000000000000000000000000000680000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000006b000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000006f0000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000007100000000000000000000000000000000000000000000000000000000000000720000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000750000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000780000000000000000000000000000000000000000000000000000000000000079000000000000000000000000000000000000000000000000000000000000007a000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000008100000000000000000000000000000000000000000000000000000000000000820000000000000000000000000000000000000000000000000000000000000083000000000000000000000000000000000000000000000000000000000000008400000000000000000000000000000000000000000000000000000000000000850000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000008700000000000000000000000000000000000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000089000000000000000000000000000000000000000000000000000000000000008a000000000000000000000000000000000000000000000000000000000000008b000000000000000000000000000000000000000000000000000000000000008c000000000000000000000000000000000000000000000000000000000000008d000000000000000000000000000000000000000000000000000000000000008e000000000000000000000000000000000000000000000000000000000000008f0000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000920000000000000000000000000000000000000000000000000000000000000093000000000000000000000000000000000000000000000000000000000000009400000000000000000000000000000000000000000000000000000000000000950000000000000000000000000000000000000000000000000000000000000096000000000000000000000000000000000000000000000000000000000000009700000000000000000000000000000000000000000000000000000000000000980000000000000000000000000000000000000000000000000000000000000099000000000000000000000000000000000000000000000000000000000000009a000000000000000000000000000000000000000000000000000000000000009b000000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000009d000000000000000000000000000000000000000000000000000000000000009e000000000000000000000000000000000000000000000000000000000000009f00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a100000000000000000000000000000000000000000000000000000000000000a200000000000000000000000000000000000000000000000000000000000000a300000000000000000000000000000000000000000000000000000000000000a400000000000000000000000000000000000000000000000000000000000000a500000000000000000000000000000000000000000000000000000000000000a600000000000000000000000000000000000000000000000000000000000000a700000000000000000000000000000000000000000000000000000000000000a800000000000000000000000000000000000000000000000000000000000000a900000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000ab00000000000000000000000000000000000000000000000000000000000000ac00000000000000000000000000000000000000000000000000000000000000ad00000000000000000000000000000000000000000000000000000000000000ae00000000000000000000000000000000000000000000000000000000000000af00000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000b100000000000000000000000000000000000000000000000000000000000000b200000000000000000000000000000000000000000000000000000000000000b300000000000000000000000000000000000000000000000000000000000000b400000000000000000000000000000000000000000000000000000000000000b500000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000b700000000000000000000000000000000000000000000000000000000000000b800000000000000000000000000000000000000000000000000000000000000b900000000000000000000000000000000000000000000000000000000000000ba00000000000000000000000000000000000000000000000000000000000000bb00000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000bd00000000000000000000000000000000000000000000000000000000000000be00000000000000000000000000000000000000000000000000000000000000bf00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000c300000000000000000000000000000000000000000000000000000000000000c400000000000000000000000000000000000000000000000000000000000000c500000000000000000000000000000000000000000000000000000000000000c600000000000000000000000000000000000000000000000000000000000000c7 diff --git a/cmd/evm/main.go b/cmd/evm/main.go new file mode 100644 index 000000000..c6c986a04 --- /dev/null +++ b/cmd/evm/main.go @@ -0,0 +1,164 @@ +/* + This file is part of go-ethereum + + go-ethereum is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + go-ethereum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with go-ethereum. If not, see <http://www.gnu.org/licenses/>. +*/ +/** + * @authors + * Jeffrey Wilcke <i@jev.io> + * @date 2014 + * + */ + +package main + +import ( + "flag" + "fmt" + "log" + "math/big" + "os" + "runtime" + "time" + + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/state" + "github.com/ethereum/go-ethereum/trie" + "github.com/ethereum/go-ethereum/vm" +) + +var ( + code = flag.String("code", "", "evm code") + loglevel = flag.Int("log", 4, "log level") + gas = flag.String("gas", "1000000000", "gas amount") + price = flag.String("price", "0", "gas price") + value = flag.String("value", "0", "tx value") + dump = flag.Bool("dump", false, "dump state after run") + data = flag.String("data", "", "data") +) + +func perr(v ...interface{}) { + fmt.Println(v...) + //os.Exit(1) +} + +func main() { + flag.Parse() + + logger.AddLogSystem(logger.NewStdLogSystem(os.Stdout, log.LstdFlags, logger.LogLevel(*loglevel))) + + ethutil.ReadConfig("/tmp/evmtest", "/tmp/evm", "") + + db, _ := ethdb.NewMemDatabase() + statedb := state.New(trie.New(db, "")) + sender := statedb.NewStateObject([]byte("sender")) + receiver := statedb.NewStateObject([]byte("receiver")) + //receiver.SetCode([]byte(*code)) + receiver.SetCode(ethutil.Hex2Bytes(*code)) + + vmenv := NewEnv(statedb, []byte("evmuser"), ethutil.Big(*value)) + + tstart := time.Now() + + ret, e := vmenv.Call(sender, receiver.Address(), ethutil.Hex2Bytes(*data), ethutil.Big(*gas), ethutil.Big(*price), ethutil.Big(*value)) + + logger.Flush() + if e != nil { + perr(e) + } + + if *dump { + fmt.Println(string(statedb.Dump())) + } + + var mem runtime.MemStats + runtime.ReadMemStats(&mem) + fmt.Printf("vm took %v\n", time.Since(tstart)) + fmt.Printf(`alloc: %d +tot alloc: %d +no. malloc: %d +heap alloc: %d +heap objs: %d +num gc: %d +`, mem.Alloc, mem.TotalAlloc, mem.Mallocs, mem.HeapAlloc, mem.HeapObjects, mem.NumGC) + + fmt.Printf("%x\n", ret) +} + +type VMEnv struct { + state *state.StateDB + block *types.Block + + transactor []byte + value *big.Int + + depth int + Gas *big.Int + time int64 +} + +func NewEnv(state *state.StateDB, transactor []byte, value *big.Int) *VMEnv { + return &VMEnv{ + state: state, + transactor: transactor, + value: value, + time: time.Now().Unix(), + } +} + +func (self *VMEnv) State() *state.StateDB { return self.state } +func (self *VMEnv) Origin() []byte { return self.transactor } +func (self *VMEnv) BlockNumber() *big.Int { return ethutil.Big0 } +func (self *VMEnv) PrevHash() []byte { return make([]byte, 32) } +func (self *VMEnv) Coinbase() []byte { return self.transactor } +func (self *VMEnv) Time() int64 { return self.time } +func (self *VMEnv) Difficulty() *big.Int { return ethutil.Big1 } +func (self *VMEnv) BlockHash() []byte { return make([]byte, 32) } +func (self *VMEnv) Value() *big.Int { return self.value } +func (self *VMEnv) GasLimit() *big.Int { return big.NewInt(1000000000) } +func (self *VMEnv) Depth() int { return 0 } +func (self *VMEnv) SetDepth(i int) { self.depth = i } +func (self *VMEnv) AddLog(log state.Log) { + self.state.AddLog(log) +} +func (self *VMEnv) Transfer(from, to vm.Account, amount *big.Int) error { + return vm.Transfer(from, to, amount) +} + +func (self *VMEnv) vm(addr, data []byte, gas, price, value *big.Int) *core.Execution { + evm := vm.New(self, vm.DebugVmTy) + + return core.NewExecution(evm, addr, data, gas, price, value) +} + +func (self *VMEnv) Call(caller vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) { + exe := self.vm(addr, data, gas, price, value) + ret, err := exe.Call(addr, caller) + self.Gas = exe.Gas + + return ret, err +} +func (self *VMEnv) CallCode(caller vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) { + exe := self.vm(caller.Address(), data, gas, price, value) + return exe.Call(addr, caller) +} + +func (self *VMEnv) Create(caller vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error, vm.ClosureRef) { + exe := self.vm(addr, data, gas, price, value) + return exe.Create(caller) +} diff --git a/mist/assets/back.png b/cmd/mist/assets/back.png Binary files differindex 38fc84d6e..38fc84d6e 100644 --- a/mist/assets/back.png +++ b/cmd/mist/assets/back.png diff --git a/mist/assets/browser.png b/cmd/mist/assets/browser.png Binary files differindex 1d7348170..1d7348170 100644 --- a/mist/assets/browser.png +++ b/cmd/mist/assets/browser.png diff --git a/mist/assets/bug.png b/cmd/mist/assets/bug.png Binary files differindex f5e85dc99..f5e85dc99 100644 --- a/mist/assets/bug.png +++ b/cmd/mist/assets/bug.png diff --git a/mist/assets/close.png b/cmd/mist/assets/close.png Binary files differindex 88df442c5..88df442c5 100644 --- a/mist/assets/close.png +++ b/cmd/mist/assets/close.png diff --git a/mist/assets/debugger/debugger.qml b/cmd/mist/assets/debugger/debugger.qml index b30d20e6b..b30d20e6b 100644 --- a/mist/assets/debugger/debugger.qml +++ b/cmd/mist/assets/debugger/debugger.qml diff --git a/mist/assets/ext/big.js b/cmd/mist/assets/ext/big.js index db633fd2f..daa8d7227 100644 --- a/mist/assets/ext/big.js +++ b/cmd/mist/assets/ext/big.js @@ -1,3 +1,20 @@ +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA + var bigInt = (function () { var base = 10000000, logBase = 7; var sign = { diff --git a/cmd/mist/assets/ext/eth.js/.gitignore b/cmd/mist/assets/ext/eth.js/.gitignore new file mode 100644 index 000000000..de3a847ac --- /dev/null +++ b/cmd/mist/assets/ext/eth.js/.gitignore @@ -0,0 +1,14 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. +# +# If you find yourself ignoring temporary files generated by your text editor +# or operating system, you probably want to add a global ignore instead: +# git config --global core.excludesfile ~/.gitignore_global + +/tmp +*/**/*un~ +*un~ +.DS_Store +*/**/.DS_Store +ethereum/ethereum +ethereal/ethereal + diff --git a/cmd/mist/assets/ext/eth.js/README.md b/cmd/mist/assets/ext/eth.js/README.md new file mode 100644 index 000000000..86e2969be --- /dev/null +++ b/cmd/mist/assets/ext/eth.js/README.md @@ -0,0 +1,18 @@ +# Ethereum JavaScript API + +This is the Ethereum compatible JavaScript API using `Promise`s +which implements the [Generic JSON RPC](https://github.com/ethereum/wiki/wiki/Generic-JSON-RPC) spec. + +For an example see `index.html`. + +**Please note this repo is in it's early stage.** + +If you'd like to run a WebSocket ethereum node check out +[go-ethereum](https://github.com/ethereum/go-ethereum). + +To install ethereum and spawn a node: + +``` +go get github.com/ethereum/go-ethereum/ethereum +ethereum -ws -loglevel=4 +``` diff --git a/cmd/mist/assets/ext/eth.js/httprpc.js b/cmd/mist/assets/ext/eth.js/httprpc.js new file mode 100644 index 000000000..085b4693d --- /dev/null +++ b/cmd/mist/assets/ext/eth.js/httprpc.js @@ -0,0 +1,70 @@ +(function () { + var HttpRpcProvider = function (host) { + this.handlers = []; + this.host = host; + }; + + function formatJsonRpcObject(object) { + return { + jsonrpc: '2.0', + method: object.call, + params: object.args, + id: object._id + } + }; + + function formatJsonRpcMessage(message) { + var object = JSON.parse(message); + + return { + _id: object.id, + data: object.result + }; + }; + + HttpRpcProvider.prototype.sendRequest = function (payload, cb) { + var data = formatJsonRpcObject(payload); + + var request = new XMLHttpRequest(); + request.open("POST", this.host, true); + request.send(JSON.stringify(data)); + request.onreadystatechange = function () { + if (request.readyState === 4 && cb) { + cb(request); + } + } + }; + + HttpRpcProvider.prototype.send = function (payload) { + var self = this; + this.sendRequest(payload, function (request) { + self.handlers.forEach(function (handler) { + handler.call(self, formatJsonRpcMessage(request.responseText)); + }); + }); + }; + + HttpRpcProvider.prototype.poll = function (payload, id) { + var self = this; + this.sendRequest(payload, function (request) { + var parsed = JSON.parse(request.responseText); + if (parsed.result instanceof Array ? parsed.result.length === 0 : !parsed.result) { + return; + } + self.handlers.forEach(function (handler) { + handler.call(self, {_event: payload.call, _id: id, data: parsed.result}); + }); + }); + }; + + Object.defineProperty(HttpRpcProvider.prototype, "onmessage", { + set: function (handler) { + this.handlers.push(handler); + } + }); + + if (typeof(web3) !== "undefined" && web3.providers !== undefined) { + web3.providers.HttpRpcProvider = HttpRpcProvider; + } +})(); + diff --git a/cmd/mist/assets/ext/eth.js/index.html b/cmd/mist/assets/ext/eth.js/index.html new file mode 100644 index 000000000..2b3f50a14 --- /dev/null +++ b/cmd/mist/assets/ext/eth.js/index.html @@ -0,0 +1,33 @@ +<!doctype> +<html> + +<head> +<script type="text/javascript" src="main.js"></script> +<script type="text/javascript" src="websocket.js"></script> +<script type="text/javascript" src="qt.js"></script> +<script type="text/javascript" src="httprpc.js"></script> +<script type="text/javascript"> +function registerName() { + var name = document.querySelector("#name").value; + name = web3.fromAscii(name); + + var eth = web3.eth; + eth.transact({to: "NameReg", gas: "10000", gasPrice: eth.gasPrice, data: [web3.fromAscii("register"), name]}).then(function(tx) { + document.querySelector("#result").innerHTML = "Registered name. Please wait for the next block to come through."; + }, function(err) { + console.log(err); + }); +} +</script> +</head> + +<body> + +<h1>std::name_reg</h1> +<input type="text" id="name"></input> +<input type="submit" onClick="registerName();"></input> +<div id="result"></div> + +</body> + +</html> diff --git a/cmd/mist/assets/ext/eth.js/main.js b/cmd/mist/assets/ext/eth.js/main.js new file mode 100644 index 000000000..5c7ca0603 --- /dev/null +++ b/cmd/mist/assets/ext/eth.js/main.js @@ -0,0 +1,432 @@ +(function(window) { + function isPromise(o) { + return o instanceof Promise + } + + function flattenPromise (obj) { + if (obj instanceof Promise) { + return Promise.resolve(obj); + } + + if (obj instanceof Array) { + return new Promise(function (resolve) { + var promises = obj.map(function (o) { + return flattenPromise(o); + }); + + return Promise.all(promises).then(function (res) { + for (var i = 0; i < obj.length; i++) { + obj[i] = res[i]; + } + resolve(obj); + }); + }); + } + + if (obj instanceof Object) { + return new Promise(function (resolve) { + var keys = Object.keys(obj); + var promises = keys.map(function (key) { + return flattenPromise(obj[key]); + }); + + return Promise.all(promises).then(function (res) { + for (var i = 0; i < keys.length; i++) { + obj[keys[i]] = res[i]; + } + resolve(obj); + }); + }); + } + + return Promise.resolve(obj); + }; + + var ethMethods = function () { + var blockCall = function (args) { + return typeof args[0] === "string" ? "blockByHash" : "blockByNumber"; + }; + + var transactionCall = function (args) { + return typeof args[0] === "string" ? 'transactionByHash' : 'transactionByNumber'; + }; + + var uncleCall = function (args) { + return typeof args[0] === "string" ? 'uncleByHash' : 'uncleByNumber'; + }; + + var methods = [ + { name: 'balanceAt', call: 'balanceAt' }, + { name: 'stateAt', call: 'stateAt' }, + { name: 'countAt', call: 'countAt'}, + { name: 'codeAt', call: 'codeAt' }, + { name: 'transact', call: 'transact' }, + { name: 'call', call: 'call' }, + { name: 'block', call: blockCall }, + { name: 'transaction', call: transactionCall }, + { name: 'uncle', call: uncleCall }, + { name: 'compile', call: 'compile' } + ]; + return methods; + }; + + var ethProperties = function () { + return [ + { name: 'coinbase', getter: 'coinbase', setter: 'setCoinbase' }, + { name: 'listening', getter: 'listening', setter: 'setListening' }, + { name: 'mining', getter: 'mining', setter: 'setMining' }, + { name: 'gasPrice', getter: 'gasPrice' }, + { name: 'account', getter: 'account' }, + { name: 'accounts', getter: 'accounts' }, + { name: 'peerCount', getter: 'peerCount' }, + { name: 'defaultBlock', getter: 'defaultBlock', setter: 'setDefaultBlock' }, + { name: 'number', getter: 'number'} + ]; + }; + + var dbMethods = function () { + return [ + { name: 'put', call: 'put' }, + { name: 'get', call: 'get' }, + { name: 'putString', call: 'putString' }, + { name: 'getString', call: 'getString' } + ]; + }; + + var shhMethods = function () { + return [ + { name: 'post', call: 'post' }, + { name: 'newIdentity', call: 'newIdentity' }, + { name: 'haveIdentity', call: 'haveIdentity' }, + { name: 'newGroup', call: 'newGroup' }, + { name: 'addToGroup', call: 'addToGroup' } + ]; + }; + + var ethWatchMethods = function () { + var newFilter = function (args) { + return typeof args[0] === 'string' ? 'newFilterString' : 'newFilter'; + }; + + return [ + { name: 'newFilter', call: newFilter }, + { name: 'uninstallFilter', call: 'uninstallFilter' }, + { name: 'getMessages', call: 'getMessages' } + ]; + }; + + var shhWatchMethods = function () { + return [ + { name: 'newFilter', call: 'shhNewFilter' }, + { name: 'uninstallFilter', call: 'shhUninstallFilter' }, + { name: 'getMessage', call: 'shhGetMessages' } + ]; + }; + + var setupMethods = function (obj, methods) { + methods.forEach(function (method) { + obj[method.name] = function () { + return flattenPromise(Array.prototype.slice.call(arguments)).then(function (args) { + var call = typeof method.call === "function" ? method.call(args) : method.call; + return {call: call, args: args}; + }).then(function (request) { + return new Promise(function (resolve, reject) { + web3.provider.send(request, function (result) { + //if (result || typeof result === "boolean") { + resolve(result); + return; + //} + //reject(result); + }); + }); + }).catch(function( err) { + console.error(err); + }); + }; + }); + }; + + var setupProperties = function (obj, properties) { + properties.forEach(function (property) { + var proto = {}; + proto.get = function () { + return new Promise(function(resolve, reject) { + web3.provider.send({call: property.getter}, function(result) { + resolve(result); + }); + }); + }; + if (property.setter) { + proto.set = function (val) { + return flattenPromise([val]).then(function (args) { + return new Promise(function (resolve) { + web3.provider.send({call: property.setter, args: args}, function (result) { + resolve(result); + }); + }); + }).catch(function (err) { + console.error(err); + }); + } + } + Object.defineProperty(obj, property.name, proto); + }); + }; + + var web3 = { + _callbacks: {}, + _events: {}, + providers: {}, + toHex: function(str) { + var hex = ""; + for(var i = 0; i < str.length; i++) { + var n = str.charCodeAt(i).toString(16); + hex += n.length < 2 ? '0' + n : n; + } + + return hex; + }, + + toAscii: function(hex) { + // Find termination + var str = ""; + var i = 0, l = hex.length; + for(; i < l; i+=2) { + var code = hex.charCodeAt(i) + if(code == 0) { + break; + } + + str += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); + } + + return str; + }, + + toDecimal: function (val) { + return parseInt(val, 16); + }, + + fromAscii: function(str, pad) { + pad = pad === undefined ? 32 : pad; + var hex = this.toHex(str); + while(hex.length < pad*2) + hex += "00"; + return hex + }, + + eth: { + prototype: Object(), + watch: function (params) { + return new Filter(params, ethWatch); + }, + }, + + db: { + prototype: Object() + }, + + shh: { + prototype: Object(), + watch: function (params) { + return new Filter(params, shhWatch); + } + }, + + on: function(event, id, cb) { + if(web3._events[event] === undefined) { + web3._events[event] = {}; + } + + web3._events[event][id] = cb; + return this + }, + + off: function(event, id) { + if(web3._events[event] !== undefined) { + delete web3._events[event][id]; + } + + return this + }, + + trigger: function(event, id, data) { + var callbacks = web3._events[event]; + if (!callbacks || !callbacks[id]) { + return; + } + var cb = callbacks[id]; + cb(data); + }, + }; + + var eth = web3.eth; + setupMethods(eth, ethMethods()); + setupProperties(eth, ethProperties()); + setupMethods(web3.db, dbMethods()); + setupMethods(web3.shh, shhMethods()); + + var ethWatch = { + changed: 'changed' + }; + setupMethods(ethWatch, ethWatchMethods()); + var shhWatch = { + changed: 'shhChanged' + }; + setupMethods(shhWatch, shhWatchMethods()); + + var ProviderManager = function() { + this.queued = []; + this.polls = []; + this.ready = false; + this.provider = undefined; + this.id = 1; + + var self = this; + var poll = function () { + if (self.provider && self.provider.poll) { + self.polls.forEach(function (data) { + data.data._id = self.id; + self.id++; + self.provider.poll(data.data, data.id); + }); + } + setTimeout(poll, 12000); + }; + poll(); + }; + + ProviderManager.prototype.send = function(data, cb) { + data._id = this.id; + if (cb) { + web3._callbacks[data._id] = cb; + } + + data.args = data.args || []; + this.id++; + + if(this.provider !== undefined) { + this.provider.send(data); + } else { + console.warn("provider is not set"); + this.queued.push(data); + } + }; + + ProviderManager.prototype.set = function(provider) { + if(this.provider !== undefined && this.provider.unload !== undefined) { + this.provider.unload(); + } + + this.provider = provider; + this.ready = true; + }; + + ProviderManager.prototype.sendQueued = function() { + for(var i = 0; this.queued.length; i++) { + // Resend + this.send(this.queued[i]); + } + }; + + ProviderManager.prototype.installed = function() { + return this.provider !== undefined; + }; + + ProviderManager.prototype.startPolling = function (data, pollId) { + if (!this.provider || !this.provider.poll) { + return; + } + this.polls.push({data: data, id: pollId}); + }; + + ProviderManager.prototype.stopPolling = function (pollId) { + for (var i = this.polls.length; i--;) { + var poll = this.polls[i]; + if (poll.id === pollId) { + this.polls.splice(i, 1); + } + } + }; + + web3.provider = new ProviderManager(); + + web3.setProvider = function(provider) { + provider.onmessage = messageHandler; + web3.provider.set(provider); + web3.provider.sendQueued(); + }; + + var Filter = function(options, impl) { + this.impl = impl; + this.callbacks = []; + + var self = this; + this.promise = impl.newFilter(options); + this.promise.then(function (id) { + self.id = id; + web3.on(impl.changed, id, self.trigger.bind(self)); + web3.provider.startPolling({call: impl.changed, args: [id]}, id); + }); + }; + + Filter.prototype.arrived = function(callback) { + this.changed(callback); + } + + Filter.prototype.changed = function(callback) { + var self = this; + this.promise.then(function(id) { + self.callbacks.push(callback); + }); + }; + + Filter.prototype.trigger = function(messages) { + for(var i = 0; i < this.callbacks.length; i++) { + this.callbacks[i].call(this, messages); + } + }; + + Filter.prototype.uninstall = function() { + var self = this; + this.promise.then(function (id) { + self.impl.uninstallFilter(id); + web3.provider.stopPolling(id); + web3.off(impl.changed, id); + }); + }; + + Filter.prototype.messages = function() { + var self = this; + return this.promise.then(function (id) { + return self.impl.getMessages(id); + }); + }; + + function messageHandler(data) { + if(data._event !== undefined) { + web3.trigger(data._event, data._id, data.data); + return; + } + + if(data._id) { + var cb = web3._callbacks[data._id]; + if (cb) { + cb.call(this, data.data) + delete web3._callbacks[data._id]; + } + } + } + + /* + // Install default provider + if(!web3.provider.installed()) { + var sock = new web3.WebSocket("ws://localhost:40404/eth"); + + web3.setProvider(sock); + } + */ + + window.web3 = web3; + +})(this); diff --git a/cmd/mist/assets/ext/eth.js/qt.js b/cmd/mist/assets/ext/eth.js/qt.js new file mode 100644 index 000000000..644c37737 --- /dev/null +++ b/cmd/mist/assets/ext/eth.js/qt.js @@ -0,0 +1,27 @@ +(function() { + var QtProvider = function() { + this.handlers = []; + + var self = this; + navigator.qt.onmessage = function (message) { + self.handlers.forEach(function (handler) { + handler.call(self, JSON.parse(message.data)); + }); + } + }; + + QtProvider.prototype.send = function(payload) { + navigator.qt.postMessage(JSON.stringify(payload)); + }; + + Object.defineProperty(QtProvider.prototype, "onmessage", { + set: function(handler) { + this.handlers.push(handler); + }, + }); + + if(typeof(web3) !== "undefined" && web3.providers !== undefined) { + web3.providers.QtProvider = QtProvider; + } +})(); + diff --git a/cmd/mist/assets/ext/eth.js/websocket.js b/cmd/mist/assets/ext/eth.js/websocket.js new file mode 100644 index 000000000..732a086f2 --- /dev/null +++ b/cmd/mist/assets/ext/eth.js/websocket.js @@ -0,0 +1,51 @@ +(function() { + var WebSocketProvider = function(host) { + // onmessage handlers + this.handlers = []; + // queue will be filled with messages if send is invoked before the ws is ready + this.queued = []; + this.ready = false; + + this.ws = new WebSocket(host); + + var self = this; + this.ws.onmessage = function(event) { + for(var i = 0; i < self.handlers.length; i++) { + self.handlers[i].call(self, JSON.parse(event.data), event) + } + }; + + this.ws.onopen = function() { + self.ready = true; + + for(var i = 0; i < self.queued.length; i++) { + // Resend + self.send(self.queued[i]); + } + }; + }; + WebSocketProvider.prototype.send = function(payload) { + if(this.ready) { + var data = JSON.stringify(payload); + + this.ws.send(data); + } else { + this.queued.push(payload); + } + }; + + WebSocketProvider.prototype.onMessage = function(handler) { + this.handlers.push(handler); + }; + + WebSocketProvider.prototype.unload = function() { + this.ws.close(); + }; + Object.defineProperty(WebSocketProvider.prototype, "onmessage", { + set: function(provider) { this.onMessage(provider); } + }); + + if(typeof(web3) !== "undefined" && web3.providers !== undefined) { + web3.providers.WebSocketProvider = WebSocketProvider; + } +})(); diff --git a/mist/assets/ext/ethereum.js b/cmd/mist/assets/ext/ethereum.js index 697a404a3..aeb79e488 100644 --- a/mist/assets/ext/ethereum.js +++ b/cmd/mist/assets/ext/ethereum.js @@ -1,3 +1,20 @@ +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA + // Main Ethereum library window.eth = { prototype: Object(), diff --git a/mist/assets/ext/filter.js b/cmd/mist/assets/ext/filter.js index c23706249..f8529c54b 100644 --- a/mist/assets/ext/filter.js +++ b/cmd/mist/assets/ext/filter.js @@ -1,3 +1,20 @@ +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA + var ethx = { prototype: Object, diff --git a/mist/assets/ext/home.html b/cmd/mist/assets/ext/home.html index a524e8403..a524e8403 100644 --- a/mist/assets/ext/home.html +++ b/cmd/mist/assets/ext/home.html diff --git a/mist/assets/ext/html_messaging.js b/cmd/mist/assets/ext/html_messaging.js index 91310e998..f58eb7c29 100644 --- a/mist/assets/ext/html_messaging.js +++ b/cmd/mist/assets/ext/html_messaging.js @@ -1,3 +1,20 @@ +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA + // The magic return variable. The magic return variable will be set during the execution of the QML call. (function(window) { var Promise = window.Promise; diff --git a/cmd/mist/assets/ext/http.js b/cmd/mist/assets/ext/http.js new file mode 100644 index 000000000..81908266f --- /dev/null +++ b/cmd/mist/assets/ext/http.js @@ -0,0 +1,30 @@ +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA + +// this function is included locally, but you can also include separately via a header definition +function request(url, callback) { + var xhr = new XMLHttpRequest(); + xhr.onreadystatechange = (function(req) { + return function() { + if(req.readyState === 4) { + callback(req); + } + } + })(xhr); + xhr.open('GET', url, true); + xhr.send(''); +} diff --git a/mist/assets/ext/q.js b/cmd/mist/assets/ext/q.js index 23c4245ee..23c4245ee 100644 --- a/mist/assets/ext/q.js +++ b/cmd/mist/assets/ext/q.js diff --git a/cmd/mist/assets/ext/qml_messaging.js b/cmd/mist/assets/ext/qml_messaging.js new file mode 100644 index 000000000..031c5efd1 --- /dev/null +++ b/cmd/mist/assets/ext/qml_messaging.js @@ -0,0 +1,30 @@ +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA + +function HandleMessage(data) { + var message; + try { message = JSON.parse(data) } catch(e) {}; + + if(message) { + switch(message.type) { + case "coinbase": + return eth.coinBase(); + case "block": + return eth.blockByNumber(0); + } + } +} diff --git a/cmd/mist/assets/ext/qt_messaging_adapter.js b/cmd/mist/assets/ext/qt_messaging_adapter.js new file mode 100644 index 000000000..04f8e034a --- /dev/null +++ b/cmd/mist/assets/ext/qt_messaging_adapter.js @@ -0,0 +1,38 @@ +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA + +window._messagingAdapter = function(data) { + navigator.qt.postMessage(data); +}; + +navigator.qt.onmessage = function(ev) { + var data = JSON.parse(ev.data) + + if(data._event !== undefined) { + eth.trigger(data._event, data.data); + } else { + if(data._seed) { + var cb = eth._callbacks[data._seed]; + if(cb) { + cb.call(this, data.data) + + // Remove the "trigger" callback + delete eth._callbacks[ev._seed]; + } + } + } +} diff --git a/cmd/mist/assets/ext/setup.js b/cmd/mist/assets/ext/setup.js new file mode 100644 index 000000000..8317937b3 --- /dev/null +++ b/cmd/mist/assets/ext/setup.js @@ -0,0 +1,8 @@ +(function() { + if (typeof(Promise) === "undefined") + window.Promise = Q.Promise; + + var eth = web3.eth; + + web3.setProvider(new web3.providers.QtProvider()); +})() diff --git a/mist/assets/ext/string.js b/cmd/mist/assets/ext/string.js index 2473b5c36..e8dbd14d4 100644 --- a/mist/assets/ext/string.js +++ b/cmd/mist/assets/ext/string.js @@ -1,3 +1,20 @@ +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA + String.prototype.pad = function(l, r) { if (r === undefined) { r = l diff --git a/mist/assets/ext/test.html b/cmd/mist/assets/ext/test.html index 4bac7d36f..4bac7d36f 100644 --- a/mist/assets/ext/test.html +++ b/cmd/mist/assets/ext/test.html diff --git a/mist/assets/facet.png b/cmd/mist/assets/facet.png Binary files differindex 49a266e96..49a266e96 100644 --- a/mist/assets/facet.png +++ b/cmd/mist/assets/facet.png diff --git a/mist/assets/heart.png b/cmd/mist/assets/heart.png Binary files differindex 3c874ab7f..3c874ab7f 100644 --- a/mist/assets/heart.png +++ b/cmd/mist/assets/heart.png diff --git a/mist/assets/icecream.png b/cmd/mist/assets/icecream.png Binary files differindex 2438ca845..2438ca845 100644 --- a/mist/assets/icecream.png +++ b/cmd/mist/assets/icecream.png diff --git a/cmd/mist/assets/miner.png b/cmd/mist/assets/miner.png Binary files differnew file mode 100644 index 000000000..58e3f4dfe --- /dev/null +++ b/cmd/mist/assets/miner.png diff --git a/mist/assets/muted/codemirror.css b/cmd/mist/assets/muted/codemirror.css index 098a317a2..098a317a2 100644 --- a/mist/assets/muted/codemirror.css +++ b/cmd/mist/assets/muted/codemirror.css diff --git a/mist/assets/muted/debugger.html b/cmd/mist/assets/muted/debugger.html index b7552f030..b7552f030 100644 --- a/mist/assets/muted/debugger.html +++ b/cmd/mist/assets/muted/debugger.html diff --git a/mist/assets/muted/eclipse.css b/cmd/mist/assets/muted/eclipse.css index 317218e3d..317218e3d 100644 --- a/mist/assets/muted/eclipse.css +++ b/cmd/mist/assets/muted/eclipse.css diff --git a/mist/assets/muted/index.html b/cmd/mist/assets/muted/index.html index 14949b5ac..14949b5ac 100644 --- a/mist/assets/muted/index.html +++ b/cmd/mist/assets/muted/index.html diff --git a/mist/assets/muted/lib/codemirror.js b/cmd/mist/assets/muted/lib/codemirror.js index 0ab217711..0ab217711 100644 --- a/mist/assets/muted/lib/codemirror.js +++ b/cmd/mist/assets/muted/lib/codemirror.js diff --git a/mist/assets/muted/lib/go.js b/cmd/mist/assets/muted/lib/go.js index 9f1c1c4ab..9f1c1c4ab 100644 --- a/mist/assets/muted/lib/go.js +++ b/cmd/mist/assets/muted/lib/go.js diff --git a/mist/assets/muted/lib/matchbrackets.js b/cmd/mist/assets/muted/lib/matchbrackets.js index dcdde81df..dcdde81df 100644 --- a/mist/assets/muted/lib/matchbrackets.js +++ b/cmd/mist/assets/muted/lib/matchbrackets.js diff --git a/mist/assets/muted/muted.js b/cmd/mist/assets/muted/muted.js index 72e858d7a..467411577 100644 --- a/mist/assets/muted/muted.js +++ b/cmd/mist/assets/muted/muted.js @@ -1,3 +1,20 @@ +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA + // Helper function for generating pseudo callbacks and sending data to the QML part of the application function postData(data, cb) { data._seed = Math.floor(Math.random() * 1000000) diff --git a/mist/assets/net.png b/cmd/mist/assets/net.png Binary files differindex 65a20ea00..65a20ea00 100644 --- a/mist/assets/net.png +++ b/cmd/mist/assets/net.png diff --git a/mist/assets/network.png b/cmd/mist/assets/network.png Binary files differindex 0a9ffe2ec..0a9ffe2ec 100644 --- a/mist/assets/network.png +++ b/cmd/mist/assets/network.png diff --git a/mist/assets/new.png b/cmd/mist/assets/new.png Binary files differindex e80096748..e80096748 100644 --- a/mist/assets/new.png +++ b/cmd/mist/assets/new.png diff --git a/mist/assets/pick.png b/cmd/mist/assets/pick.png Binary files differindex 2f5a261c2..2f5a261c2 100644 --- a/mist/assets/pick.png +++ b/cmd/mist/assets/pick.png diff --git a/mist/assets/qml/QmlApp.qml b/cmd/mist/assets/qml/QmlApp.qml index f5c503f4c..f5c503f4c 100644 --- a/mist/assets/qml/QmlApp.qml +++ b/cmd/mist/assets/qml/QmlApp.qml diff --git a/mist/assets/qml/first_run.qml b/cmd/mist/assets/qml/first_run.qml index 0b1dac4c6..0b1dac4c6 100644 --- a/mist/assets/qml/first_run.qml +++ b/cmd/mist/assets/qml/first_run.qml diff --git a/mist/assets/qml/main.qml b/cmd/mist/assets/qml/main.qml index 3d9204ce8..a08a8b4ef 100644 --- a/mist/assets/qml/main.qml +++ b/cmd/mist/assets/qml/main.qml @@ -12,7 +12,6 @@ import "../ext/http.js" as Http ApplicationWindow { id: root - property alias miningButtonText: miningButton.text property var ethx : Eth.ethx property var browser @@ -48,12 +47,12 @@ ApplicationWindow { var wallet = addPlugin("./views/wallet.qml", {noAdd: true, close: false, section: "ethereum", active: true}); var browser = addPlugin("./webapp.qml", {noAdd: true, close: false, section: "ethereum", active: true}); root.browser = browser; + addPlugin("./views/miner.qml", {noAdd: true, close: false, section: "ethereum", active: true}); addPlugin("./views/transaction.qml", {noAdd: true, close: false, section: "legacy"}); addPlugin("./views/chain.qml", {noAdd: true, close: false, section: "legacy"}); - addPlugin("./views/info.qml", {noAdd: true, close: false, section: "legacy"}); addPlugin("./views/pending_tx.qml", {noAdd: true, close: false, section: "legacy"}); - addPlugin("./views/javascript.qml", {noAdd: true, close: false, section: "legacy"}); + addPlugin("./views/info.qml", {noAdd: true, close: false, section: "legacy"}); addPlugin("./views/jeffcoin/jeffcoin.qml", {noAdd: true, close: false, section: "apps"}) @@ -253,29 +252,18 @@ ApplicationWindow { } statusBar: StatusBar { - height: 32 + //height: 32 id: statusBar - RowLayout { - Button { - id: miningButton - text: "Start Mining" - onClicked: { - gui.toggleMining() - } - } - - RowLayout { - Label { - id: walletValueLabel + Label { + //y: 6 + id: walletValueLabel - font.pixelSize: 10 - styleColor: "#797979" - } - } + font.pixelSize: 10 + styleColor: "#797979" } Label { - y: 6 + //y: 6 objectName: "miningLabel" visible: true font.pixelSize: 10 @@ -284,7 +272,7 @@ ApplicationWindow { } Label { - y: 6 + //y: 6 id: lastBlockLabel objectName: "lastBlockLabel" visible: true @@ -298,14 +286,14 @@ ApplicationWindow { id: downloadIndicator value: 0 objectName: "downloadIndicator" - y: 3 + y: -4 x: statusBar.width / 2 - this.width / 2 width: 160 } Label { objectName: "downloadLabel" - y: 7 + //y: 7 anchors.left: downloadIndicator.right anchors.leftMargin: 5 font.pixelSize: 10 @@ -315,7 +303,7 @@ ApplicationWindow { RowLayout { id: peerGroup - y: 7 + //y: 7 anchors.right: parent.right MouseArea { onDoubleClicked: peerWindow.visible = true @@ -324,14 +312,9 @@ ApplicationWindow { Label { id: peerLabel - font.pixelSize: 8 + font.pixelSize: 10 text: "0 / 0" } - Image { - id: peerImage - width: 10; height: 10 - source: "../network.png" - } } } @@ -363,12 +346,7 @@ ApplicationWindow { view.visible = false view.anchors.fill = mainView - if( !view.hasOwnProperty("iconSource") ) { - console.log("Could not load plugin. Property 'iconSourc' not found on view."); - return; - } - - var menuItem = menu.createMenuItem(view.iconSource, view, options); + var menuItem = menu.createMenuItem(view, options); if( view.hasOwnProperty("menuItem") ) { view.menuItem = menuItem; } @@ -525,7 +503,7 @@ ApplicationWindow { } } - function createMenuItem(icon, view, options) { + function createMenuItem(view, options) { if(options === undefined) { options = {}; } @@ -547,7 +525,10 @@ ApplicationWindow { comp.view = view comp.title = view.title - comp.icon = view.iconSource + + if(view.hasOwnProperty("iconSource")) { + comp.icon = view.iconSource; + } comp.closable = options.close; return comp @@ -805,8 +786,8 @@ ApplicationWindow { title: "About" minimumWidth: 350 maximumWidth: 350 - maximumHeight: 200 - minimumHeight: 200 + maximumHeight: 280 + minimumHeight: 280 Image { id: aboutIcon @@ -816,7 +797,7 @@ ApplicationWindow { smooth: true source: "../facet.png" x: 10 - y: 10 + y: 30 } Text { @@ -825,7 +806,7 @@ ApplicationWindow { anchors.top: parent.top anchors.topMargin: 30 font.pointSize: 12 - text: "<h2>Mist (0.6.5)</h2><h4>Amalthea</h4><br><h3>Development</h3>Jeffrey Wilcke<br>Viktor Trón<br><h3>Building</h3>Maran Hidskes" + text: "<h2>Mist (0.7.10)</h2><br><h3>Development</h3>Jeffrey Wilcke<br>Viktor Trón<br>Felix Lange<br>Taylor Gerring<br>Daniel Nagy<br><h3>UX</h3>Alex van de Sande<br>" } } @@ -889,7 +870,7 @@ ApplicationWindow { pastPeers.append({text: ips.get(i)}) } - pastPeers.insert(0, {text: "poc-6.ethdev.com:30303"}) + pastPeers.insert(0, {text: "poc-7.ethdev.com:30303"}) } } diff --git a/mist/assets/qml/muted.qml b/cmd/mist/assets/qml/muted.qml index fac8267c4..fac8267c4 100644 --- a/mist/assets/qml/muted.qml +++ b/cmd/mist/assets/qml/muted.qml diff --git a/mist/assets/qml/test_app.qml b/cmd/mist/assets/qml/test_app.qml index c69587839..c69587839 100644 --- a/mist/assets/qml/test_app.qml +++ b/cmd/mist/assets/qml/test_app.qml diff --git a/mist/assets/qml/transactions.qml b/cmd/mist/assets/qml/transactions.qml index e9a035a85..e9a035a85 100644 --- a/mist/assets/qml/transactions.qml +++ b/cmd/mist/assets/qml/transactions.qml diff --git a/mist/assets/qml/views/chain.qml b/cmd/mist/assets/qml/views/chain.qml index 130ff8bb9..6baf757a5 100644 --- a/mist/assets/qml/views/chain.qml +++ b/cmd/mist/assets/qml/views/chain.qml @@ -8,8 +8,7 @@ import Ethereum 1.0 Rectangle { id: root - property var title: "Network" - property var iconSource: "../net.png" + property var title: "Block Chain" property var menuItem objectName: "chainView" @@ -64,12 +63,12 @@ Rectangle { Menu { id: contextMenu - property var row; + property var row MenuItem { text: "Details" onTriggered: { popup.visible = true - popup.setDetails(blockModel.get(this.row)) + popup.setDetails(blockModel.get(contextMenu.row)) } } @@ -78,7 +77,7 @@ Rectangle { MenuItem { text: "Copy" onTriggered: { - copyToClipboard(blockModel.get(this.row).hash) + copyToClipboard(blockModel.get(contextMenu.row).hash) } } @@ -86,7 +85,7 @@ Rectangle { text: "Dump State" onTriggered: { generalFileDialog.show(false, function(path) { - var hash = blockModel.get(this.row).hash; + var hash = blockModel.get(contextMenu.row).hash; gui.dumpState(hash, path); }); @@ -102,22 +101,18 @@ Rectangle { initial = false } - /* - var txs = JSON.parse(block.transactions); - if(txs != null){ - amount = txs.length - } - */ - var txs = block.transactions; var amount = block.transactions.length; + var txs = []; + for(var i = 0; i < block.transactions.length; i++) { + var tx = JSON.parse(block.transactions.getAsJson(i)); + txs.push(tx); + } if(initial){ - blockModel.append({size: block.size, number: block.number, name: block.name, gasLimit: block.gasLimit, gasUsed: block.gasUsed, coinbase: block.coinbase, hash: block.hash, txs: txs, txAmount: amount, time: block.time, prettyTime: convertToPretty(block.time)}) + blockModel.append({raw: block.raw, bloom: block.bloom, size: block.size, number: block.number, name: block.name, gasLimit: block.gasLimit, gasUsed: block.gasUsed, coinbase: block.coinbase, hash: block.hash, txs: txs, txAmount: amount, time: block.time, prettyTime: convertToPretty(block.time)}) } else { - blockModel.insert(0, {size: block.size, number: block.number, name: block.name, gasLimit: block.gasLimit, gasUsed: block.gasUsed, coinbase: block.coinbase, hash: block.hash, txs: txs, txAmount: amount, time: block.time, prettyTime: convertToPretty(block.time)}) + blockModel.insert(0, {bloom: block.bloom, size: block.size, number: block.number, name: block.name, gasLimit: block.gasLimit, gasUsed: block.gasUsed, coinbase: block.coinbase, hash: block.hash, txs: txs, txAmount: amount, time: block.time, prettyTime: convertToPretty(block.time)}) } - - //root.secondary.text = "#" + block.number; } Window { @@ -141,6 +136,7 @@ Rectangle { Text { text: '<h3>Block details</h3>'; color: "#F2F2F2"} Text { text: '<b>Block number:</b> ' + number + " (Size: " + size + ")"; color: "#F2F2F2"} Text { text: '<b>Hash:</b> ' + hash; color: "#F2F2F2"} + Text { text: '<b>Bloom:</b> ' + bloom; color: "#F2F2F2"} Text { text: '<b>Coinbase:</b> <' + name + '> ' + coinbase; color: "#F2F2F2"} Text { text: '<b>Block found at:</b> ' + prettyTime; color: "#F2F2F2"} Text { text: '<b>Gas used:</b> ' + gasUsed + " / " + gasLimit; color: "#F2F2F2"} @@ -215,7 +211,7 @@ Rectangle { anchors.topMargin: 10 text: "Debug contract" onClicked: { - if(tx.createsContract){ + if(tx && tx.createsContract){ eth.startDbWithCode(tx.rawData) }else { eth.startDbWithContractAndData(tx.address, tx.rawData) @@ -227,11 +223,17 @@ Rectangle { text: "Contract" anchors.top: contractLabel.bottom anchors.left: parent.left - anchors.bottom: popup.bottom + anchors.right: parent.right wrapMode: Text.Wrap - width: parent.width - 30 height: 80 - anchors.leftMargin: 10 + } + TextArea { + id: dumpData + anchors.top: contractData.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + height: 300 } } property var transactionModel: ListModel { @@ -240,19 +242,20 @@ Rectangle { property var singleBlock: ListModel { id: singleBlock } - function setDetails(block){ - singleBlock.set(0,block) + function setDetails(bl){ + singleBlock.set(0, bl) popup.height = 300 transactionModel.clear() - if(block.txs !== undefined){ - for(var i = 0; i < block.txs.length; i++) { - transactionModel.insert(0, block.txs.get(i)) + if(bl.txs !== undefined){ + for(var i = 0; i < bl.txs.count; i++) { + transactionModel.insert(0, bl.txs.get(i)) } - if(block.txs.length > 0 && block.txs.get(0).data){ - popup.showContractData(block.txs.get(0)) + if(bl.txs.count > 0 && bl.txs.get(0).data){ + popup.showContractData(bl.txs.get(0)) } } txView.forceActiveFocus() + dumpData.text = bl.raw; } } } diff --git a/mist/assets/qml/views/history.qml b/cmd/mist/assets/qml/views/history.qml index 9eee883e3..c72f8f3ae 100644 --- a/mist/assets/qml/views/history.qml +++ b/cmd/mist/assets/qml/views/history.qml @@ -7,7 +7,6 @@ import QtQuick.Controls.Styles 1.1 import Ethereum 1.0 Rectangle { - property var iconSource: "../tx.png" property var title: "Transactions" property var menuItem diff --git a/mist/assets/qml/views/info.qml b/cmd/mist/assets/qml/views/info.qml index 158e2c960..3ff551b05 100644 --- a/mist/assets/qml/views/info.qml +++ b/cmd/mist/assets/qml/views/info.qml @@ -7,8 +7,7 @@ import QtQuick.Controls.Styles 1.1 import Ethereum 1.0 Rectangle { - property var title: "Information" - property var iconSource: "../heart.png" + property var title: "Debug Info" property var menuItem objectName: "infoView" diff --git a/mist/assets/qml/views/jeffcoin/jeff.png b/cmd/mist/assets/qml/views/jeffcoin/jeff.png Binary files differindex 2b9c6651a..2b9c6651a 100644 --- a/mist/assets/qml/views/jeffcoin/jeff.png +++ b/cmd/mist/assets/qml/views/jeffcoin/jeff.png diff --git a/mist/assets/qml/views/jeffcoin/jeffcoin.qml b/cmd/mist/assets/qml/views/jeffcoin/jeffcoin.qml index 23502d334..23502d334 100644 --- a/mist/assets/qml/views/jeffcoin/jeffcoin.qml +++ b/cmd/mist/assets/qml/views/jeffcoin/jeffcoin.qml diff --git a/cmd/mist/assets/qml/views/miner.qml b/cmd/mist/assets/qml/views/miner.qml new file mode 100644 index 000000000..e0182649f --- /dev/null +++ b/cmd/mist/assets/qml/views/miner.qml @@ -0,0 +1,254 @@ +import QtQuick 2.0 +import QtQuick.Controls 1.0; +import QtQuick.Layouts 1.0; +import QtQuick.Dialogs 1.0; +import QtQuick.Window 2.1; +import QtQuick.Controls.Styles 1.1 +import Ethereum 1.0 + +Rectangle { + id: root + property var title: "Miner" + property var iconSource: "../miner.png" + property var menuItem + + color: "#00000000" + + ColumnLayout { + spacing: 10 + anchors.fill: parent + + Rectangle { + id: mainPane + color: "#00000000" + anchors { + top: parent.top + bottom: localTxPane.top + left: parent.left + right: parent.right + } + + Rectangle { + id: menu + height: 25 + anchors { + left: parent.left + } + + RowLayout { + id: tools + anchors { + left: parent.left + right: parent.right + } + + Button { + text: "Start" + onClicked: { + eth.setGasPrice(minGasPrice.text || "10000000000000"); + if (eth.toggleMining()) { + this.text = "Stop"; + } else { + this.text = "Start"; + } + } + } + + Rectangle { + anchors.top: parent.top + anchors.topMargin: 2 + width: 200 + TextField { + id: minGasPrice + placeholderText: "Min Gas: 10000000000000" + width: 200 + validator: RegExpValidator { regExp: /\d*/ } + } + } + } + } + + Column { + anchors { + left: parent.left + right: parent.right + top: menu.bottom + topMargin: 5 + } + + Text { + text: "<b>Merged mining options</b>" + } + + TableView { + id: mergedMiningTable + height: 300 + anchors { + left: parent.left + right: parent.right + } + Component { + id: checkBoxDelegate + + Item { + id: test + CheckBox { + anchors.fill: parent + checked: styleData.value + + onClicked: { + var model = mergedMiningModel.get(styleData.row) + + if (this.checked) { + model.id = txModel.createLocalTx(model.address, "0", "5000", "0", "") + } else { + txModel.removeWithId(model.id); + model.id = 0; + } + } + } + } + } + TableViewColumn{ role: "checked" ; title: "" ; width: 40 ; delegate: checkBoxDelegate } + TableViewColumn{ role: "name" ; title: "Name" ; width: 480 } + model: ListModel { + objectName: "mergedMiningModel" + id: mergedMiningModel + function addMergedMiningOption(model) { + this.append(model); + } + } + Component.onCompleted: { + /* + // XXX Temp. replace with above eventually + var tmpItems = ["JEVCoin", "Some coin", "Other coin", "Etc coin"]; + var address = "e6716f9544a56c530d868e4bfbacb172315bdead"; + for (var i = 0; i < tmpItems.length; i++) { + mergedMiningModel.append({checked: false, name: tmpItems[i], address: address, id: 0, itemId: i}); + } + */ + } + } + } + } + + Rectangle { + id: localTxPane + color: "#ececec" + border.color: "#cccccc" + border.width: 1 + anchors { + left: parent.left + right: parent.right + bottom: parent.bottom + } + height: 300 + + ColumnLayout { + spacing: 10 + anchors.fill: parent + RowLayout { + id: newLocalTx + anchors { + left: parent.left + leftMargin: 5 + top: parent.top + topMargin: 5 + bottomMargin: 5 + } + + Text { + text: "Local tx" + } + + Rectangle { + width: 250 + color: "#00000000" + anchors.top: parent.top + anchors.topMargin: 2 + + TextField { + id: to + placeholderText: "To" + width: 250 + validator: RegExpValidator { regExp: /[abcdefABCDEF1234567890]*/ } + } + } + TextField { + property var defaultGas: "5000" + id: gas + placeholderText: "Gas" + text: defaultGas + validator: RegExpValidator { regExp: /\d*/ } + } + TextField { + id: gasPrice + placeholderText: "Price" + validator: RegExpValidator { regExp: /\d*/ } + } + TextField { + id: value + placeholderText: "Amount" + text: "0" + validator: RegExpValidator { regExp: /\d*/ } + } + TextField { + id: data + placeholderText: "Data" + validator: RegExpValidator { regExp: /[abcdefABCDEF1234567890]*/ } + } + Button { + text: "Create" + onClicked: { + if (to.text.length == 40 && gasPrice.text.length != 0 && value.text.length != 0 && gas.text.length != 0) { + txModel.createLocalTx(to.text, gasPrice.text, gas.text, value.text, data.text); + + to.text = ""; gasPrice.text = ""; + gas.text = gas.defaultGas; + value.text = "0" + } + } + } + } + + TableView { + id: txTableView + anchors { + top: newLocalTx.bottom + topMargin: 5 + left: parent.left + right: parent.right + bottom: parent.bottom + } + TableViewColumn{ role: "to" ; title: "To" ; width: 480 } + TableViewColumn{ role: "gas" ; title: "Gas" ; width: 100 } + TableViewColumn{ role: "gasPrice" ; title: "Gas Price" ; width: 100 } + TableViewColumn{ role: "value" ; title: "Amount" ; width: 100 } + TableViewColumn{ role: "data" ; title: "Data" ; width: 100 } + + model: ListModel { + id: txModel + Component.onCompleted: { + } + function removeWithId(id) { + for (var i = 0; i < this.count; i++) { + if (txModel.get(i).id == id) { + this.remove(i); + eth.removeLocalTransaction(id) + break; + } + } + } + + function createLocalTx(to, gasPrice, gas, value, data) { + var id = eth.addLocalTransaction(to, data, gas, gasPrice, value) + txModel.insert(0, {to: to, gas: gas, gasPrice: gasPrice, value: value, data: data, id: id}); + + return id + } + } + } + } + } + } +} diff --git a/mist/assets/qml/views/pending_tx.qml b/cmd/mist/assets/qml/views/pending_tx.qml index abfa25790..4442a69db 100644 --- a/mist/assets/qml/views/pending_tx.qml +++ b/cmd/mist/assets/qml/views/pending_tx.qml @@ -8,7 +8,6 @@ import Ethereum 1.0 Rectangle { property var title: "Pending Transactions" - property var iconSource: "../tx.png" property var menuItem objectName: "pendingTxView" diff --git a/mist/assets/qml/views/transaction.qml b/cmd/mist/assets/qml/views/transaction.qml index 7d689733f..62c762956 100644 --- a/mist/assets/qml/views/transaction.qml +++ b/cmd/mist/assets/qml/views/transaction.qml @@ -7,8 +7,7 @@ import QtQuick.Controls.Styles 1.1 import Ethereum 1.0 Rectangle { - property var iconSource: "../new.png" - property var title: "New transaction" + property var title: "New Transaction" property var menuItem objectName: "newTxView" @@ -115,7 +114,7 @@ Rectangle { width: 50 validator: RegExpValidator { regExp: /\d*/ } placeholderText: "Gas" - text: "500" + text: "5000" } Label { id: atLabel diff --git a/mist/assets/qml/views/wallet.qml b/cmd/mist/assets/qml/views/wallet.qml index a57e7869a..9727ef35c 100644 --- a/mist/assets/qml/views/wallet.qml +++ b/cmd/mist/assets/qml/views/wallet.qml @@ -16,7 +16,13 @@ Rectangle { anchors.fill: parent function onReady() { - menuItem.secondaryTitle = eth.numberToHuman(eth.balanceAt(eth.key().address)) + setBalance() + } + + function setBalance() { + balance.text = "<b>Balance</b>: " + eth.numberToHuman(eth.balanceAt(eth.key().address)) + if(menuItem) + menuItem.secondaryTitle = eth.numberToHuman(eth.balanceAt(eth.key().address)) } ListModel { @@ -39,7 +45,6 @@ Rectangle { Text { id: balance - text: "<b>Balance</b>: " + eth.numberToHuman(eth.balanceAt(eth.key().address)) font.pixelSize: 24 anchors { horizontalCenter: parent.horizontalCenter @@ -126,7 +131,6 @@ Rectangle { var value = txValue.text + denomModel.get(valueDenom.currentIndex).zeros; var gasPrice = "10000000000000" var res = eth.transact({from: eth.key().privateKey, to: txTo.text, value: value, gas: "500", gasPrice: gasPrice}) - console.log(res) } } } @@ -144,24 +148,35 @@ Rectangle { id: txTableView anchors.fill : parent TableViewColumn{ role: "num" ; title: "#" ; width: 30 } - TableViewColumn{ role: "from" ; title: "From" ; width: 280 } - TableViewColumn{ role: "to" ; title: "To" ; width: 280 } + TableViewColumn{ role: "from" ; title: "From" ; width: 340 } + TableViewColumn{ role: "to" ; title: "To" ; width: 340 } TableViewColumn{ role: "value" ; title: "Amount" ; width: 100 } model: ListModel { id: txModel Component.onCompleted: { - var filter = ethx.watch({latest: -1, from: eth.key().address}); - filter.changed(addTxs) - - addTxs(filter.messages()) + var me = eth.key().address; + var filterTo = ethx.watch({latest: -1, to: me}); + var filterFrom = ethx.watch({latest: -1, from: me}); + filterTo.changed(addTxs) + filterFrom.changed(addTxs) + + addTxs(filterTo.messages()) + addTxs(filterFrom.messages()) } function addTxs(messages) { + setBalance() + for(var i = 0; i < messages.length; i++) { var message = messages.get(i); var to = eth.lookupName(message.to); - var from = eth.lookupName(message.from); + var from; + if(message.from.length == 0) { + from = "- MINED -"; + } else { + from = eth.lookupName(message.from); + } txModel.insert(0, {num: txModel.count, from: from, to: to, value: eth.numberToHuman(message.value)}) } } diff --git a/cmd/mist/assets/qml/webapp.qml b/cmd/mist/assets/qml/webapp.qml new file mode 100644 index 000000000..bd7399dc9 --- /dev/null +++ b/cmd/mist/assets/qml/webapp.qml @@ -0,0 +1,413 @@ +import QtQuick 2.0 +import QtWebKit 3.0 +import QtWebKit.experimental 1.0 +import QtQuick.Controls 1.0; +import QtQuick.Controls.Styles 1.0 +import QtQuick.Layouts 1.0; +import QtQuick.Window 2.1; +import Ethereum 1.0 + +Rectangle { + id: window + property var title: "Browser" + property var iconSource: "../browser.png" + property var menuItem + + property alias url: webview.url + property alias webView: webview + + property var cleanPath: false + property var open: function(url) { + if(!window.cleanPath) { + var uri = url; + if(!/.*\:\/\/.*/.test(uri)) { + uri = "http://" + uri; + } + + var reg = /(^https?\:\/\/(?:www\.)?)([a-zA-Z0-9_\-]*\.eth)(.*)/ + + if(reg.test(uri)) { + uri.replace(reg, function(match, pre, domain, path) { + uri = pre; + + var lookup = eth.lookupDomain(domain.substring(0, domain.length - 4)); + var ip = []; + for(var i = 0, l = lookup.length; i < l; i++) { + ip.push(lookup.charCodeAt(i)) + } + + if(ip.length != 0) { + uri += lookup; + } else { + uri += domain; + } + + uri += path; + }); + } + + window.cleanPath = true; + + webview.url = uri; + + //uriNav.text = uri.text.replace(/(^https?\:\/\/(?:www\.)?)([a-zA-Z0-9_\-]*\.\w{2,3})(.*)/, "$1$2<span style='color:#CCC'>$3</span>"); + uriNav.text = uri; + } else { + // Prevent inf loop. + window.cleanPath = false; + } + } + + Component.onCompleted: { + webview.url = "http://etherian.io" + } + + signal messages(var messages, int id); + onMessages: { + // Bit of a cheat to get proper JSON + var m = JSON.parse(JSON.parse(JSON.stringify(messages))) + webview.postEvent("messages", [m, id]); + } + + Item { + objectName: "root" + id: root + anchors.fill: parent + state: "inspectorShown" + + RowLayout { + id: navBar + height: 40 + anchors { + left: parent.left + right: parent.right + leftMargin: 7 + } + + Button { + id: back + onClicked: { + webview.goBack() + } + style: ButtonStyle { + background: Image { + source: "../back.png" + width: 30 + height: 30 + } + } + } + + TextField { + anchors { + left: back.right + right: toggleInspector.left + leftMargin: 5 + rightMargin: 5 + } + text: "http://etherian.io" + id: uriNav + y: parent.height / 2 - this.height / 2 + + Keys.onReturnPressed: { + webview.url = this.text; + } + } + + Button { + id: toggleInspector + anchors { + right: parent.right + } + iconSource: "../bug.png" + onClicked: { + if(inspector.visible == true){ + inspector.visible = false + }else{ + inspector.visible = true + inspector.url = webview.experimental.remoteInspectorUrl + } + } + } + } + + + WebView { + objectName: "webView" + id: webview + anchors { + left: parent.left + right: parent.right + bottom: parent.bottom + top: navBar.bottom + } + + //property var cleanPath: false + onNavigationRequested: { + window.open(request.url.toString()); + } + + function sendMessage(data) { + webview.experimental.postMessage(JSON.stringify(data)) + } + + + experimental.preferences.javascriptEnabled: true + experimental.preferences.navigatorQtObjectEnabled: true + experimental.preferences.developerExtrasEnabled: true + //experimental.userScripts: ["../ext/qt_messaging_adapter.js", "../ext/q.js", "../ext/big.js", "../ext/string.js", "../ext/html_messaging.js"] + experimental.userScripts: ["../ext/q.js", "../ext/eth.js/main.js", "../ext/eth.js/qt.js", "../ext/setup.js"] + experimental.onMessageReceived: { + console.log("[onMessageReceived]: ", message.data) + // TODO move to messaging.js + var data = JSON.parse(message.data) + + try { + switch(data.call) { + case "compile": + postData(data._id, eth.compile(data.args[0])) + break + + case "coinbase": + postData(data._id, eth.coinBase()) + + case "account": + postData(data._id, eth.key().address); + + case "isListening": + postData(data._id, eth.isListening()) + + break + + case "isMining": + postData(data._id, eth.isMining()) + + break + + case "peerCount": + postData(data._id, eth.peerCount()) + + break + + case "countAt": + require(1) + postData(data._id, eth.txCountAt(data.args[0])) + + break + + case "codeAt": + require(1) + var code = eth.codeAt(data.args[0]) + postData(data._id, code); + + break + + case "blockByNumber": + require(1) + var block = eth.blockByNumber(data.args[0]) + postData(data._id, block) + break + + case "blockByHash": + require(1) + var block = eth.blockByHash(data.args[0]) + postData(data._id, block) + break + + require(2) + var block = eth.blockByHash(data.args[0]) + postData(data._id, block.transactions[data.args[1]]) + break + + case "transactionByHash": + case "transactionByNumber": + require(2) + + var block; + if (data.call === "transactionByHash") + block = eth.blockByHash(data.args[0]) + else + block = eth.blockByNumber(data.args[0]) + + var tx = block.transactions.get(data.args[1]) + + postData(data._id, tx) + break + + case "uncleByHash": + case "uncleByNumber": + require(2) + + var block; + if (data.call === "uncleByHash") + block = eth.blockByHash(data.args[0]) + else + block = eth.blockByNumber(data.args[0]) + + var uncle = block.uncles.get(data.args[1]) + + postData(data._id, uncle) + + break + + case "transact": + require(5) + + var tx = eth.transact(data.args) + postData(data._id, tx) + + break + + case "stateAt": + require(2); + + var storage = eth.storageAt(data.args[0], data.args[1]); + postData(data._id, storage) + + break + + case "call": + require(1); + var ret = eth.call(data.args) + postData(data._id, ret) + break + + case "balanceAt": + require(1); + + postData(data._id, eth.balanceAt(data.args[0])); + break + + case "watch": + require(2) + eth.watch(data.args[0], data.args[1]) + + case "disconnect": + require(1) + postData(data._id, null) + break; + + case "messages": + require(1); + + var messages = JSON.parse(eth.getMessages(data.args[0])) + postData(data._id, messages) + break + + case "mutan": + require(1) + + var code = eth.compileMutan(data.args[0]) + postData(data._id, "0x"+code) + break; + + case "newFilterString": + require(1) + var id = eth.newFilterString(data.args[0]) + postData(data._id, id); + break; + + case "newFilter": + require(1) + var id = eth.newFilter(data.args[0]) + + postData(data._id, id); + break; + + case "getMessages": + require(1); + + var messages = eth.messages(data.args[0]); + var m = JSON.parse(JSON.parse(JSON.stringify(messages))) + postData(data._id, m); + + break; + + case "deleteFilter": + require(1); + eth.uninstallFilter(data.args[0]) + break; + } + } catch(e) { + console.log(data.call + ": " + e) + + postData(data._id, null); + } + } + + + function post(seed, data) { + postData(data._id, data) + } + + function require(args, num) { + if(args.length < num) { + throw("required argument count of "+num+" got "+args.length); + } + } + function postData(seed, data) { + webview.experimental.postMessage(JSON.stringify({data: data, _id: seed})) + } + function postEvent(event, data) { + webview.experimental.postMessage(JSON.stringify({data: data, _event: event})) + } + + function onWatchedCb(data, id) { + var messages = JSON.parse(data) + postEvent("watched:"+id, messages) + } + + function onNewBlockCb(block) { + postEvent("block:new", block) + } + function onObjectChangeCb(stateObject) { + postEvent("object:"+stateObject.address(), stateObject) + } + function onStorageChangeCb(storageObject) { + var ev = ["storage", storageObject.stateAddress, storageObject.address].join(":"); + postEvent(ev, [storageObject.address, storageObject.value]) + } + } + + + Rectangle { + id: sizeGrip + color: "gray" + visible: false + height: 10 + anchors { + left: root.left + right: root.right + } + y: Math.round(root.height * 2 / 3) + + MouseArea { + anchors.fill: parent + drag.target: sizeGrip + drag.minimumY: 0 + drag.maximumY: root.height + drag.axis: Drag.YAxis + } + } + + WebView { + id: inspector + visible: false + anchors { + left: root.left + right: root.right + top: sizeGrip.bottom + bottom: root.bottom + } + } + + states: [ + State { + name: "inspectorShown" + PropertyChanges { + target: inspector + } + } + ] + } +} diff --git a/mist/assets/tx.png b/cmd/mist/assets/tx.png Binary files differindex 62204c315..62204c315 100644 --- a/mist/assets/tx.png +++ b/cmd/mist/assets/tx.png diff --git a/mist/assets/util/test.html b/cmd/mist/assets/util/test.html index d458e6670..d458e6670 100644 --- a/mist/assets/util/test.html +++ b/cmd/mist/assets/util/test.html diff --git a/mist/assets/wallet.png b/cmd/mist/assets/wallet.png Binary files differindex 92c401e52..92c401e52 100644 --- a/mist/assets/wallet.png +++ b/cmd/mist/assets/wallet.png diff --git a/mist/bindings.go b/cmd/mist/bindings.go index 141c4a469..6d2342c87 100644 --- a/mist/bindings.go +++ b/cmd/mist/bindings.go @@ -1,16 +1,31 @@ +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA + package main import ( "encoding/json" - "fmt" "os" "strconv" - "github.com/ethereum/eth-go/ethchain" - "github.com/ethereum/eth-go/ethlog" - "github.com/ethereum/eth-go/ethpipe" - "github.com/ethereum/eth-go/ethutil" - "github.com/ethereum/go-ethereum/utils" + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/logger" ) type plugin struct { @@ -18,16 +33,8 @@ type plugin struct { Path string `json:"path"` } -func (gui *Gui) Println(v ...interface{}) { - gui.printLog(fmt.Sprintln(v...)) -} - -func (gui *Gui) Printf(format string, v ...interface{}) { - gui.printLog(fmt.Sprintf(format, v...)) -} - -// Print function that logs directly to the GUI -func (gui *Gui) printLog(s string) { +// LogPrint writes to the GUI log. +func (gui *Gui) LogPrint(level logger.LogLevel, msg string) { /* str := strings.TrimRight(s, "\n") lines := strings.Split(str, "\n") @@ -38,12 +45,12 @@ func (gui *Gui) printLog(s string) { } */ } -func (gui *Gui) Transact(recipient, value, gas, gasPrice, d string) (*ethpipe.JSReceipt, error) { +func (gui *Gui) Transact(recipient, value, gas, gasPrice, d string) (string, error) { var data string if len(recipient) == 0 { code, err := ethutil.Compile(d, false) if err != nil { - return nil, err + return "", err } data = ethutil.Bytes2Hex(code) } else { @@ -62,18 +69,14 @@ func (gui *Gui) GetCustomIdentifier() string { return gui.clientIdentity.GetCustomIdentifier() } -func (gui *Gui) ToggleTurboMining() { - gui.miner.ToggleTurbo() -} - -// functions that allow Gui to implement interface ethlog.LogSystem -func (gui *Gui) SetLogLevel(level ethlog.LogLevel) { +// functions that allow Gui to implement interface guilogger.LogSystem +func (gui *Gui) SetLogLevel(level logger.LogLevel) { gui.logLevel = level gui.stdLog.SetLogLevel(level) gui.config.Save("loglevel", level) } -func (gui *Gui) GetLogLevel() ethlog.LogLevel { +func (gui *Gui) GetLogLevel() logger.LogLevel { return gui.logLevel } @@ -100,18 +103,18 @@ func (self *Gui) DumpState(hash, path string) { var stateDump []byte if len(hash) == 0 { - stateDump = self.eth.StateManager().CurrentState().Dump() + stateDump = self.eth.ChainManager().State().Dump() } else { - var block *ethchain.Block + var block *types.Block if hash[0] == '#' { i, _ := strconv.Atoi(hash[1:]) - block = self.eth.BlockChain().GetBlockByNumber(uint64(i)) + block = self.eth.ChainManager().GetBlockByNumber(uint64(i)) } else { - block = self.eth.BlockChain().GetBlock(ethutil.Hex2Bytes(hash)) + block = self.eth.ChainManager().GetBlock(ethutil.Hex2Bytes(hash)) } if block == nil { - logger.Infof("block err: not found %s\n", hash) + guilogger.Infof("block err: not found %s\n", hash) return } @@ -120,29 +123,12 @@ func (self *Gui) DumpState(hash, path string) { file, err := os.OpenFile(path[7:], os.O_CREATE|os.O_RDWR, os.ModePerm) if err != nil { - logger.Infoln("dump err: ", err) + guilogger.Infoln("dump err: ", err) return } defer file.Close() - logger.Infof("dumped state (%s) to %s\n", hash, path) + guilogger.Infof("dumped state (%s) to %s\n", hash, path) file.Write(stateDump) } -func (gui *Gui) ToggleMining() { - var txt string - if gui.eth.Mining { - utils.StopMining(gui.eth) - txt = "Start mining" - - gui.getObjectByName("miningLabel").Set("visible", false) - } else { - utils.StartMining(gui.eth) - gui.miner = utils.GetMiner() - txt = "Stop mining" - - gui.getObjectByName("miningLabel").Set("visible", true) - } - - gui.win.Root().Set("miningButtonText", txt) -} diff --git a/mist/debugger.go b/cmd/mist/debugger.go index 9d1de8c42..a7a286e23 100644 --- a/mist/debugger.go +++ b/cmd/mist/debugger.go @@ -1,3 +1,20 @@ +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA + package main import ( @@ -7,11 +24,11 @@ import ( "strings" "unicode" - "github.com/ethereum/eth-go/ethchain" - "github.com/ethereum/eth-go/ethstate" - "github.com/ethereum/eth-go/ethutil" - "github.com/ethereum/eth-go/ethvm" - "github.com/ethereum/go-ethereum/utils" + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/state" + "github.com/ethereum/go-ethereum/vm" "gopkg.in/qml.v1" ) @@ -20,10 +37,10 @@ type DebuggerWindow struct { engine *qml.Engine lib *UiLib - vm *ethvm.Vm + vm *vm.DebugVm Db *Debugger - state *ethstate.State + state *state.StateDB } func NewDebuggerWindow(lib *UiLib) *DebuggerWindow { @@ -37,7 +54,7 @@ func NewDebuggerWindow(lib *UiLib) *DebuggerWindow { win := component.CreateWindow(nil) - w := &DebuggerWindow{engine: engine, win: win, lib: lib, vm: ðvm.Vm{}} + w := &DebuggerWindow{engine: engine, win: win, lib: lib, vm: &vm.DebugVm{}} w.Db = NewDebugger(w) return w @@ -64,7 +81,7 @@ func (self *DebuggerWindow) SetData(data string) { func (self *DebuggerWindow) SetAsm(data []byte) { self.win.Root().Call("clearAsm") - dis := ethchain.Disassemble(data) + dis := core.Disassemble(data) for _, str := range dis { self.win.Root().Call("setAsm", str) } @@ -124,28 +141,24 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data keyPair = self.lib.eth.KeyManager().KeyPair() ) - state := self.lib.eth.StateManager().TransState() - account := self.lib.eth.StateManager().TransState().GetAccount(keyPair.Address()) - contract := ethstate.NewStateObject([]byte{0}) - contract.Balance = value + statedb := self.lib.eth.ChainManager().TransState() + account := self.lib.eth.ChainManager().TransState().GetAccount(keyPair.Address()) + contract := statedb.NewStateObject([]byte{0}) + contract.SetCode(script) + contract.SetBalance(value) self.SetAsm(script) - block := self.lib.eth.BlockChain().CurrentBlock + block := self.lib.eth.ChainManager().CurrentBlock() - callerClosure := ethvm.NewClosure(ðstate.Message{}, account, contract, script, gas, gasPrice) - env := utils.NewEnv(state, block, account.Address(), value) - vm := ethvm.New(env) - vm.Verbose = true - vm.Dbg = self.Db + env := utils.NewEnv(statedb, block, account.Address(), value) - self.vm = vm - self.Db.done = false self.Logf("callsize %d", len(script)) go func() { - ret, g, err := callerClosure.Call(vm, data) - tot := new(big.Int).Mul(g, gasPrice) - self.Logf("gas usage %v total price = %v (%v)", g, tot, ethutil.CurrencyToString(tot)) + ret, err := env.Call(account, contract.Address(), data, gas, gasPrice, ethutil.Big0) + //ret, g, err := callerClosure.Call(evm, data) + tot := new(big.Int).Mul(env.Gas, gasPrice) + self.Logf("gas usage %v total price = %v (%v)", env.Gas, tot, ethutil.CurrencyToString(tot)) if err != nil { self.Logln("exited with errors:", err) } else { @@ -156,7 +169,7 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data } } - state.Reset() + statedb.Reset() if !self.Db.interrupt { self.Db.done = true @@ -251,13 +264,13 @@ type storeVal struct { Key, Value string } -func (self *Debugger) BreakHook(pc int, op ethvm.OpCode, mem *ethvm.Memory, stack *ethvm.Stack, stateObject *ethstate.StateObject) bool { +func (self *Debugger) BreakHook(pc int, op vm.OpCode, mem *vm.Memory, stack *vm.Stack, stateObject *state.StateObject) bool { self.main.Logln("break on instr:", pc) return self.halting(pc, op, mem, stack, stateObject) } -func (self *Debugger) StepHook(pc int, op ethvm.OpCode, mem *ethvm.Memory, stack *ethvm.Stack, stateObject *ethstate.StateObject) bool { +func (self *Debugger) StepHook(pc int, op vm.OpCode, mem *vm.Memory, stack *vm.Stack, stateObject *state.StateObject) bool { return self.halting(pc, op, mem, stack, stateObject) } @@ -269,7 +282,7 @@ func (self *Debugger) BreakPoints() []int64 { return self.breakPoints } -func (d *Debugger) halting(pc int, op ethvm.OpCode, mem *ethvm.Memory, stack *ethvm.Stack, stateObject *ethstate.StateObject) bool { +func (d *Debugger) halting(pc int, op vm.OpCode, mem *vm.Memory, stack *vm.Stack, stateObject *state.StateObject) bool { d.win.Root().Call("setInstruction", pc) d.win.Root().Call("clearMem") d.win.Root().Call("clearStack") diff --git a/cmd/mist/errors.go b/cmd/mist/errors.go new file mode 100644 index 000000000..2069bf26d --- /dev/null +++ b/cmd/mist/errors.go @@ -0,0 +1,53 @@ +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA + +package main + +import ( + "fmt" + "os" + + "gopkg.in/qml.v1" +) + +func ErrorWindow(err error) { + engine := qml.NewEngine() + component, e := engine.LoadString("local", qmlErr) + if e != nil { + fmt.Println("err:", err) + os.Exit(1) + } + + win := component.CreateWindow(nil) + win.Root().ObjectByName("label").Set("text", err.Error()) + win.Show() + win.Wait() +} + +const qmlErr = ` +import QtQuick 2.0; import QtQuick.Controls 1.0; +ApplicationWindow { + width: 600; height: 150; + flags: Qt.CustomizeWindowHint | Qt.WindowTitleHint | Qt.WindowCloseButtonHint + title: "Error" + Text { + x: parent.width / 2 - this.width / 2; + y: parent.height / 2 - this.height / 2; + objectName: "label"; + } +} +` diff --git a/cmd/mist/ext_app.go b/cmd/mist/ext_app.go new file mode 100644 index 000000000..33c420a7a --- /dev/null +++ b/cmd/mist/ext_app.go @@ -0,0 +1,143 @@ +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA + +package main + +import ( + "encoding/json" + + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/javascript" + "github.com/ethereum/go-ethereum/state" + "github.com/ethereum/go-ethereum/ui/qt" + "github.com/ethereum/go-ethereum/xeth" + "gopkg.in/qml.v1" +) + +type AppContainer interface { + Create() error + Destroy() + + Window() *qml.Window + Engine() *qml.Engine + + NewBlock(*types.Block) + NewWatcher(chan bool) + Messages(state.Messages, string) + Post(string, int) +} + +type ExtApplication struct { + *xeth.JSXEth + eth core.EthManager + + events event.Subscription + watcherQuitChan chan bool + + filters map[string]*core.Filter + + container AppContainer + lib *UiLib +} + +func NewExtApplication(container AppContainer, lib *UiLib) *ExtApplication { + return &ExtApplication{ + JSXEth: xeth.NewJSXEth(lib.eth), + eth: lib.eth, + watcherQuitChan: make(chan bool), + filters: make(map[string]*core.Filter), + container: container, + lib: lib, + } +} + +func (app *ExtApplication) run() { + // Set the "eth" api on to the containers context + context := app.container.Engine().Context() + context.SetVar("eth", app) + context.SetVar("ui", app.lib) + + err := app.container.Create() + if err != nil { + guilogger.Errorln(err) + return + } + + // Subscribe to events + mux := app.lib.eth.EventMux() + app.events = mux.Subscribe(core.NewBlockEvent{}, state.Messages(nil)) + + // Call the main loop + go app.mainLoop() + + app.container.NewWatcher(app.watcherQuitChan) + + win := app.container.Window() + win.Show() + win.Wait() + + app.stop() +} + +func (app *ExtApplication) stop() { + app.events.Unsubscribe() + + // Kill the main loop + app.watcherQuitChan <- true + + app.container.Destroy() +} + +func (app *ExtApplication) mainLoop() { + for ev := range app.events.Chan() { + switch ev := ev.(type) { + case core.NewBlockEvent: + app.container.NewBlock(ev.Block) + + case state.Messages: + for id, filter := range app.filters { + msgs := filter.FilterMessages(ev) + if len(msgs) > 0 { + app.container.Messages(msgs, id) + } + } + } + } +} + +func (self *ExtApplication) Watch(filterOptions map[string]interface{}, identifier string) { + self.filters[identifier] = qt.NewFilterFromMap(filterOptions, self.eth) +} + +func (self *ExtApplication) GetMessages(object map[string]interface{}) string { + filter := qt.NewFilterFromMap(object, self.eth) + + messages := filter.Find() + var msgs []javascript.JSMessage + for _, m := range messages { + msgs = append(msgs, javascript.NewJSMessage(m)) + } + + b, err := json.Marshal(msgs) + if err != nil { + return "{\"error\":" + err.Error() + "}" + } + + return string(b) +} diff --git a/mist/flags.go b/cmd/mist/flags.go index d2e7d3fb0..e49408181 100644 --- a/mist/flags.go +++ b/cmd/mist/flags.go @@ -1,8 +1,26 @@ +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA + package main import ( "flag" "fmt" + "log" "os" "os/user" "path" @@ -10,29 +28,34 @@ import ( "runtime" "bitbucket.org/kardianos/osext" - "github.com/ethereum/eth-go/ethlog" + "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/vm" ) -var Identifier string -var KeyRing string -var KeyStore string -var StartRpc bool -var RpcPort int -var UseUPnP bool -var OutboundPort string -var ShowGenesis bool -var AddPeer string -var MaxPeer int -var GenAddr bool -var UseSeed bool -var SecretFile string -var ExportDir string -var NonInteractive bool -var Datadir string -var LogFile string -var ConfigFile string -var DebugFile string -var LogLevel int +var ( + Identifier string + KeyRing string + KeyStore string + StartRpc bool + StartWebSockets bool + RpcPort int + UseUPnP bool + OutboundPort string + ShowGenesis bool + AddPeer string + MaxPeer int + GenAddr bool + UseSeed bool + SecretFile string + ExportDir string + NonInteractive bool + Datadir string + LogFile string + ConfigFile string + DebugFile string + LogLevel int + VmType int +) // flags specific to gui client var AssetPath string @@ -44,7 +67,7 @@ func defaultAssetPath() string { // assume a debug build and use the source directory as // asset directory. pwd, _ := os.Getwd() - if pwd == path.Join(os.Getenv("GOPATH"), "src", "github.com", "ethereum", "go-ethereum", "mist") { + if pwd == path.Join(os.Getenv("GOPATH"), "src", "github.com", "ethereum", "go-ethereum", "cmd", "mist") { assetPath = path.Join(pwd, "assets") } else { switch runtime.GOOS { @@ -75,14 +98,16 @@ func Init() { flag.PrintDefaults() } + flag.IntVar(&VmType, "vm", 0, "Virtual Machine type: 0-1: standard, debug") flag.StringVar(&Identifier, "id", "", "Custom client identifier") flag.StringVar(&KeyRing, "keyring", "", "identifier for keyring to use") flag.StringVar(&KeyStore, "keystore", "db", "system to store keyrings: db|file (db)") flag.StringVar(&OutboundPort, "port", "30303", "listening port") flag.BoolVar(&UseUPnP, "upnp", true, "enable UPnP support") - flag.IntVar(&MaxPeer, "maxpeer", 10, "maximum desired peers") + flag.IntVar(&MaxPeer, "maxpeer", 30, "maximum desired peers") flag.IntVar(&RpcPort, "rpcport", 8080, "port to start json-rpc server on") flag.BoolVar(&StartRpc, "rpc", false, "start rpc server") + flag.BoolVar(&StartWebSockets, "ws", false, "start websocket server") flag.BoolVar(&NonInteractive, "y", false, "non-interactive mode (say yes to confirmations)") flag.BoolVar(&UseSeed, "seed", true, "seed peers") flag.BoolVar(&GenAddr, "genaddr", false, "create a new priv/pub key") @@ -92,9 +117,13 @@ func Init() { flag.StringVar(&Datadir, "datadir", defaultDataDir(), "specifies the datadir to use") flag.StringVar(&ConfigFile, "conf", defaultConfigFile, "config file") flag.StringVar(&DebugFile, "debug", "", "debug file (no debugging if not set)") - flag.IntVar(&LogLevel, "loglevel", int(ethlog.InfoLevel), "loglevel: 0-5: silent,error,warn,info,debug,debug detail)") + flag.IntVar(&LogLevel, "loglevel", int(logger.InfoLevel), "loglevel: 0-5: silent,error,warn,info,debug,debug detail)") flag.StringVar(&AssetPath, "asset_path", defaultAssetPath(), "absolute path to GUI assets directory") flag.Parse() + + if VmType >= int(vm.MaxVmTy) { + log.Fatal("Invalid VM type ", VmType) + } } diff --git a/mist/gui.go b/cmd/mist/gui.go index 80d4a1fc3..7775889cc 100644 --- a/mist/gui.go +++ b/cmd/mist/gui.go @@ -1,3 +1,20 @@ +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA + package main import "C" @@ -13,15 +30,15 @@ import ( "strings" "time" - "github.com/ethereum/eth-go" - "github.com/ethereum/eth-go/ethchain" - "github.com/ethereum/eth-go/ethdb" - "github.com/ethereum/eth-go/ethlog" - "github.com/ethereum/eth-go/ethminer" - "github.com/ethereum/eth-go/ethpipe" - "github.com/ethereum/eth-go/ethreact" - "github.com/ethereum/eth-go/ethutil" - "github.com/ethereum/eth-go/ethwire" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/miner" + "github.com/ethereum/go-ethereum/wire" + "github.com/ethereum/go-ethereum/xeth" "gopkg.in/qml.v1" ) @@ -47,8 +64,17 @@ 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 logger = ethlog.NewLogger("GUI") +var guilogger = logger.NewLogger("GUI") type Gui struct { // The main application window @@ -65,30 +91,30 @@ type Gui struct { txDb *ethdb.LDBDatabase - logLevel ethlog.LogLevel + logLevel logger.LogLevel open bool - pipe *ethpipe.JSPipe + pipe *xeth.JSXEth Session string - clientIdentity *ethwire.SimpleClientIdentity + clientIdentity *wire.SimpleClientIdentity config *ethutil.ConfigManager plugins map[string]plugin - miner *ethminer.Miner - stdLog ethlog.LogSystem + miner *miner.Miner + stdLog logger.LogSystem } // Create GUI, but doesn't start it -func NewWindow(ethereum *eth.Ethereum, config *ethutil.ConfigManager, clientIdentity *ethwire.SimpleClientIdentity, session string, logLevel int) *Gui { +func NewWindow(ethereum *eth.Ethereum, config *ethutil.ConfigManager, clientIdentity *wire.SimpleClientIdentity, session string, logLevel int) *Gui { db, err := ethdb.NewLDBDatabase("tx_database") if err != nil { panic(err) } - pipe := ethpipe.NewJSPipe(ethereum) - gui := &Gui{eth: ethereum, txDb: db, pipe: pipe, logLevel: ethlog.LogLevel(logLevel), Session: session, open: false, clientIdentity: clientIdentity, config: config, plugins: make(map[string]plugin)} + pipe := xeth.NewJSXEth(ethereum) + gui := &Gui{eth: ethereum, txDb: db, pipe: pipe, logLevel: logger.LogLevel(logLevel), Session: session, open: false, clientIdentity: clientIdentity, config: config, plugins: make(map[string]plugin)} data, _ := ethutil.ReadAllFile(path.Join(ethutil.Config.ExecPath, "plugins.json")) json.Unmarshal([]byte(data), &gui.plugins) @@ -96,16 +122,17 @@ 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 *ethpipe.JSBlock, obj qml.Object) { p.Number = 0; p.Hash = "" }, + Init: func(p *xeth.JSBlock, obj qml.Object) { p.Number = 0; p.Hash = "" }, }, { - Init: func(p *ethpipe.JSTransaction, obj qml.Object) { p.Value = ""; p.Hash = ""; p.Address = "" }, + Init: func(p *xeth.JSTransaction, obj qml.Object) { p.Value = ""; p.Hash = ""; p.Address = "" }, }, { - Init: func(p *ethpipe.KeyVal, obj qml.Object) { p.Key = ""; p.Value = "" }, + Init: func(p *xeth.KeyVal, obj qml.Object) { p.Key = ""; p.Value = "" }, }}) // Create a new QML engine gui.engine = qml.NewEngine() @@ -116,16 +143,6 @@ func (gui *Gui) Start(assetPath string) { context.SetVar("gui", gui) context.SetVar("eth", gui.uiLib) - /* - vec, errr := LoadExtension("/Users/jeffrey/Desktop/build-libqmltest-Desktop_Qt_5_2_1_clang_64bit-Debug/liblibqmltest_debug.dylib") - fmt.Printf("Fetched vec with addr: %#x\n", vec) - if errr != nil { - fmt.Println(errr) - } else { - context.SetVar("vec", (unsafe.Pointer)(vec)) - } - */ - // Load the main QML interface data, _ := ethutil.Config.Db.Get([]byte("KeyRing")) @@ -139,36 +156,35 @@ func (gui *Gui) Start(assetPath string) { addlog = true } if err != nil { - logger.Errorln("asset not found: you can set an alternative asset path on the command line using option 'asset_path'", err) + guilogger.Errorln("asset not found: you can set an alternative asset path on the command line using option 'asset_path'", err) panic(err) } - logger.Infoln("Starting GUI") gui.open = true win.Show() - // only add the gui logger after window is shown otherwise slider wont be shown + // only add the gui guilogger after window is shown otherwise slider wont be shown if addlog { - ethlog.AddLogSystem(gui) + logger.AddLogSystem(gui) } win.Wait() - // need to silence gui logger after window closed otherwise logsystem hangs (but do not save loglevel) - gui.logLevel = ethlog.Silence + // need to silence gui guilogger after window closed otherwise logsystem hangs (but do not save loglevel) + gui.logLevel = logger.Silence gui.open = false } func (gui *Gui) Stop() { if gui.open { - gui.logLevel = ethlog.Silence + gui.logLevel = logger.Silence gui.open = false gui.win.Hide() } gui.uiLib.jsEngine.Stop() - logger.Infoln("Stopped") + guilogger.Infoln("Stopped") } func (gui *Gui) showWallet(context *qml.Context) (*qml.Window, error) { @@ -213,51 +229,34 @@ func (gui *Gui) createWindow(comp qml.Object) *qml.Window { func (gui *Gui) ImportAndSetPrivKey(secret string) bool { err := gui.eth.KeyManager().InitFromString(gui.Session, 0, secret) if err != nil { - logger.Errorln("unable to import: ", err) + guilogger.Errorln("unable to import: ", err) return false } - logger.Errorln("successfully imported: ", err) + guilogger.Errorln("successfully imported: ", err) return true } func (gui *Gui) CreateAndSetPrivKey() (string, string, string, string) { err := gui.eth.KeyManager().Init(gui.Session, 0, true) if err != nil { - logger.Errorln("unable to create key: ", err) + guilogger.Errorln("unable to create key: ", err) return "", "", "", "" } return gui.eth.KeyManager().KeyPair().AsStrings() } -func (gui *Gui) setInitialBlockChain() { - sBlk := gui.eth.BlockChain().LastBlockHash - blk := gui.eth.BlockChain().GetBlock(sBlk) - for ; blk != nil; blk = gui.eth.BlockChain().GetBlock(sBlk) { +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) { sBlk = blk.PrevHash - addr := gui.address() - - // Loop through all transactions to see if we missed any while being offline - for _, tx := range blk.Transactions() { - if bytes.Compare(tx.Sender(), addr) == 0 || bytes.Compare(tx.Recipient, addr) == 0 { - if ok, _ := gui.txDb.Get(tx.Hash()); ok == nil { - gui.txDb.Put(tx.Hash(), tx.RlpEncode()) - } - - } - } gui.processBlock(blk, true) } } -type address struct { - Name, Address string -} - func (gui *Gui) loadAddressBook() { view := gui.getObjectByName("infoView") - view.Call("clearAddress") - nameReg := gui.pipe.World().Config().Get("NameReg") if nameReg != nil { nameReg.EachStorage(func(name string, value *ethutil.Value) { @@ -270,8 +269,30 @@ func (gui *Gui) loadAddressBook() { } } -func (gui *Gui) insertTransaction(window string, tx *ethchain.Transaction) { - pipe := ethpipe.New(gui.eth) +func (self *Gui) loadMergedMiningOptions() { + view := self.getObjectByName("mergedMiningModel") + + nameReg := self.pipe.World().Config().Get("MergeMining") + if nameReg != nil { + i := 0 + nameReg.EachStorage(func(name string, value *ethutil.Value) { + if name[0] != 0 { + value.Decode() + + view.Call("addMergedMiningOption", struct { + Checked bool + Name, Address string + Id, ItemId int + }{false, name, ethutil.Bytes2Hex(value.Bytes()), 0, i}) + + i++ + } + }) + } +} + +func (gui *Gui) insertTransaction(window string, tx *types.Transaction) { + pipe := xeth.New(gui.eth) nameReg := pipe.World().Config().Get("NameReg") addr := gui.address() @@ -283,14 +304,14 @@ func (gui *Gui) insertTransaction(window string, tx *ethchain.Transaction) { } var ( - ptx = ethpipe.NewJSTx(tx, pipe.World().State()) - send = nameReg.Storage(tx.Sender()) - rec = nameReg.Storage(tx.Recipient) + ptx = xeth.NewJSTx(tx, pipe.World().State()) + send = nameReg.Storage(tx.From()) + rec = nameReg.Storage(tx.To()) s, r string ) - if tx.CreatesContract() { - rec = nameReg.Storage(tx.CreationAddress(pipe.World().State())) + if core.MessageCreatesContract(tx) { + rec = nameReg.Storage(core.AddressFromMessage(tx)) } if send.Len() != 0 { @@ -301,10 +322,10 @@ func (gui *Gui) insertTransaction(window string, tx *ethchain.Transaction) { if rec.Len() != 0 { r = strings.Trim(rec.Str(), "\x00") } else { - if tx.CreatesContract() { - r = ethutil.Bytes2Hex(tx.CreationAddress(pipe.World().State())) + if core.MessageCreatesContract(tx) { + r = ethutil.Bytes2Hex(core.AddressFromMessage(tx)) } else { - r = ethutil.Bytes2Hex(tx.Recipient) + r = ethutil.Bytes2Hex(tx.To()) } } ptx.Sender = s @@ -318,9 +339,9 @@ func (gui *Gui) insertTransaction(window string, tx *ethchain.Transaction) { } func (gui *Gui) readPreviousTransactions() { - it := gui.txDb.Db().NewIterator(nil, nil) + it := gui.txDb.NewIterator() for it.Next() { - tx := ethchain.NewTransactionFromBytes(it.Value()) + tx := types.NewTransactionFromBytes(it.Value()) gui.insertTransaction("post", tx) @@ -328,9 +349,9 @@ func (gui *Gui) readPreviousTransactions() { it.Release() } -func (gui *Gui) processBlock(block *ethchain.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 := ethpipe.NewJSBlock(block) + b := xeth.NewJSBlock(block) b.Name = name gui.getObjectByName("chainView").Call("addBlock", b, initial) @@ -360,106 +381,96 @@ 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.setInitialBlockChain() + go gui.setInitialChain(false) gui.loadAddressBook() + gui.loadMergedMiningOptions() gui.setPeerInfo() - gui.readPreviousTransactions() }() for _, plugin := range gui.plugins { - logger.Infoln("Loading plugin ", plugin.Name) + guilogger.Infoln("Loading plugin ", plugin.Name) gui.win.Root().Call("addPlugin", plugin.Path, "") } - var ( - blockChan = make(chan ethreact.Event, 100) - txChan = make(chan ethreact.Event, 100) - objectChan = make(chan ethreact.Event, 100) - peerChan = make(chan ethreact.Event, 100) - chainSyncChan = make(chan ethreact.Event, 100) - miningChan = make(chan ethreact.Event, 100) - ) - peerUpdateTicker := time.NewTicker(5 * time.Second) generalUpdateTicker := time.NewTicker(500 * time.Millisecond) statsUpdateTicker := time.NewTicker(5 * time.Second) - state := gui.eth.StateManager().TransState() + state := gui.eth.ChainManager().TransState() - unconfirmedFunds := new(big.Int) - gui.win.Root().Call("setWalletValue", fmt.Sprintf("%v", ethutil.CurrencyToString(state.GetAccount(gui.address()).Balance))) + gui.win.Root().Call("setWalletValue", fmt.Sprintf("%v", ethutil.CurrencyToString(state.GetAccount(gui.address()).Balance()))) lastBlockLabel := gui.getObjectByName("lastBlockLabel") miningLabel := gui.getObjectByName("miningLabel") + events := gui.eth.EventMux().Subscribe( + eth.ChainSyncEvent{}, + eth.PeerListEvent{}, + core.NewBlockEvent{}, + core.TxPreEvent{}, + core.TxPostEvent{}, + ) + go func() { + defer events.Unsubscribe() for { select { - case b := <-blockChan: - block := b.Resource.(*ethchain.Block) - gui.processBlock(block, false) - if bytes.Compare(block.Coinbase, gui.address()) == 0 { - gui.setWalletValue(gui.eth.StateManager().CurrentState().GetAccount(gui.address()).Balance, nil) + case ev, isopen := <-events.Chan(): + if !isopen { + return } - case txMsg := <-txChan: - tx := txMsg.Resource.(*ethchain.Transaction) + switch ev := ev.(type) { + case core.NewBlockEvent: + gui.processBlock(ev.Block, false) + if bytes.Compare(ev.Block.Coinbase, gui.address()) == 0 { + gui.setWalletValue(gui.eth.ChainManager().State().GetBalance(gui.address()), nil) + } - if txMsg.Name == "newTx:pre" { - object := state.GetAccount(gui.address()) + case core.TxPreEvent: + tx := ev.Tx - if bytes.Compare(tx.Sender(), gui.address()) == 0 { - unconfirmedFunds.Sub(unconfirmedFunds, tx.Value) - } else if bytes.Compare(tx.Recipient, gui.address()) == 0 { - unconfirmedFunds.Add(unconfirmedFunds, tx.Value) - } + tstate := gui.eth.ChainManager().TransState() + cstate := gui.eth.ChainManager().State() - gui.setWalletValue(object.Balance, unconfirmedFunds) + taccount := tstate.GetAccount(gui.address()) + caccount := cstate.GetAccount(gui.address()) + unconfirmedFunds := new(big.Int).Sub(taccount.Balance(), caccount.Balance()) + gui.setWalletValue(taccount.Balance(), unconfirmedFunds) gui.insertTransaction("pre", tx) - } else { + + case core.TxPostEvent: + tx := ev.Tx object := state.GetAccount(gui.address()) + if bytes.Compare(tx.Sender(), gui.address()) == 0 { - object.SubAmount(tx.Value) + object.SubAmount(tx.Value()) - //gui.getObjectByName("transactionView").Call("addTx", ethpipe.NewJSTx(tx), "send") gui.txDb.Put(tx.Hash(), tx.RlpEncode()) - } else if bytes.Compare(tx.Recipient, gui.address()) == 0 { - object.AddAmount(tx.Value) + } else if bytes.Compare(tx.To(), gui.address()) == 0 { + object.AddAmount(tx.Value()) - //gui.getObjectByName("transactionView").Call("addTx", ethpipe.NewJSTx(tx), "recv") gui.txDb.Put(tx.Hash(), tx.RlpEncode()) } - gui.setWalletValue(object.Balance, nil) - + gui.setWalletValue(object.Balance(), nil) state.UpdateStateObject(object) + + case eth.PeerListEvent: + gui.setPeerInfo() } - case <-objectChan: - gui.loadAddressBook() - case <-peerChan: - gui.setPeerInfo() case <-peerUpdateTicker.C: gui.setPeerInfo() - case msg := <-miningChan: - if msg.Name == "miner:start" { - gui.miner = msg.Resource.(*ethminer.Miner) - } else { - gui.miner = nil - } case <-generalUpdateTicker.C: - statusText := "#" + gui.eth.BlockChain().CurrentBlock.Number.String() + statusText := "#" + gui.eth.ChainManager().CurrentBlock().Number.String() lastBlockLabel.Set("text", statusText) - - if gui.miner != nil { - pow := gui.miner.GetPow() - miningLabel.Set("text", "Mining @ "+strconv.FormatInt(pow.GetHashrate(), 10)+"Khash") - } + miningLabel.Set("text", "Mining @ "+strconv.FormatInt(gui.uiLib.miner.GetPow().GetHashrate(), 10)+"Khash") blockLength := gui.eth.BlockPool().BlocksProcessed chainLength := gui.eth.BlockPool().ChainLength @@ -469,7 +480,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)) @@ -478,20 +488,6 @@ func (gui *Gui) update() { } } }() - - reactor := gui.eth.Reactor() - - reactor.Subscribe("newBlock", blockChan) - reactor.Subscribe("newTx:pre", txChan) - reactor.Subscribe("newTx:post", txChan) - reactor.Subscribe("chainSync", chainSyncChan) - reactor.Subscribe("miner:start", miningChan) - reactor.Subscribe("miner:stop", miningChan) - - nameReg := gui.pipe.World().Config().Get("NameReg") - reactor.Subscribe("object:"+string(nameReg.Address()), objectChan) - - reactor.Subscribe("peerList", peerChan) } func (gui *Gui) setStatsPane() { @@ -499,7 +495,7 @@ func (gui *Gui) setStatsPane() { runtime.ReadMemStats(&memStats) statsPane := gui.getObjectByName("statsPane") - statsPane.Set("text", fmt.Sprintf(`###### Mist 0.6.8 (%s) ####### + statsPane.Set("text", fmt.Sprintf(`###### Mist %s (%s) ####### eth %d (p2p = %d) @@ -512,7 +508,7 @@ Heap Alloc: %d CGNext: %x NumGC: %d -`, runtime.Version(), +`, Version, runtime.Version(), eth.ProtocolVersion, eth.P2PVersion, runtime.NumCPU, runtime.NumGoroutine(), runtime.NumCgoCall(), memStats.Alloc, memStats.HeapAlloc, @@ -522,7 +518,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/mist/html_container.go b/cmd/mist/html_container.go index 69edea570..b3fc219fa 100644 --- a/mist/html_container.go +++ b/cmd/mist/html_container.go @@ -1,3 +1,20 @@ +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA + package main import ( @@ -10,11 +27,11 @@ import ( "path" "path/filepath" - "github.com/ethereum/eth-go/ethchain" - "github.com/ethereum/eth-go/ethpipe" - "github.com/ethereum/eth-go/ethstate" - "github.com/ethereum/eth-go/ethutil" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethutil" "github.com/ethereum/go-ethereum/javascript" + "github.com/ethereum/go-ethereum/state" + "github.com/ethereum/go-ethereum/xeth" "github.com/howeyc/fsnotify" "gopkg.in/qml.v1" ) @@ -81,12 +98,12 @@ func (app *HtmlApplication) NewWatcher(quitChan chan bool) { app.watcher, err = fsnotify.NewWatcher() if err != nil { - logger.Infoln("Could not create new auto-reload watcher:", err) + guilogger.Infoln("Could not create new auto-reload watcher:", err) return } err = app.watcher.Watch(app.RootFolder()) if err != nil { - logger.Infoln("Could not start auto-reload watcher:", err) + guilogger.Infoln("Could not start auto-reload watcher:", err) return } for _, folder := range app.RecursiveFolders() { @@ -102,11 +119,11 @@ func (app *HtmlApplication) NewWatcher(quitChan chan bool) { app.watcher.Close() break out case <-app.watcher.Event: - //logger.Debugln("Got event:", ev) + //guilogger.Debugln("Got event:", ev) app.webView.Call("reload") case err := <-app.watcher.Error: // TODO: Do something here - logger.Infoln("Watcher error:", err) + guilogger.Infoln("Watcher error:", err) } } }() @@ -121,12 +138,12 @@ func (app *HtmlApplication) Window() *qml.Window { return app.win } -func (app *HtmlApplication) NewBlock(block *ethchain.Block) { - b := ðpipe.JSBlock{Number: int(block.BlockInfo().Number), Hash: ethutil.Bytes2Hex(block.Hash())} +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) } -func (self *HtmlApplication) Messages(messages ethstate.Messages, id string) { +func (self *HtmlApplication) Messages(messages state.Messages, id string) { var msgs []javascript.JSMessage for _, m := range messages { msgs = append(msgs, javascript.NewJSMessage(m)) diff --git a/mist/main.go b/cmd/mist/main.go index 6e4554352..eaf0af0c7 100644 --- a/mist/main.go +++ b/cmd/mist/main.go @@ -1,18 +1,37 @@ +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA + package main import ( + "fmt" "os" "runtime" + "time" - "github.com/ethereum/eth-go" - "github.com/ethereum/eth-go/ethlog" - "github.com/ethereum/go-ethereum/utils" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/logger" "gopkg.in/qml.v1" ) const ( ClientIdentifier = "Mist" - Version = "0.6.7" + Version = "0.7.10" ) var ethereum *eth.Ethereum @@ -21,7 +40,8 @@ func run() error { // precedence: code-internal flag default < config file < environment variables < command line Init() // parsing command line - config := utils.InitConfig(ConfigFile, Datadir, "ETH") + tstart := time.Now() + config := utils.InitConfig(VmType, ConfigFile, Datadir, "ETH") utils.InitDataDir(Datadir) @@ -34,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 { @@ -58,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) @@ -80,6 +100,10 @@ func main() { utils.HandleInterrupt() + if StartWebSockets { + utils.StartWebSockets(ethereum) + } + // we need to run the interrupt callbacks in case gui is closed // this skips if we got here by actual interrupt stopping the GUI if !interrupted { @@ -87,5 +111,5 @@ func main() { } // this blocks the thread ethereum.WaitForShutdown() - ethlog.Flush() + logger.Flush() } diff --git a/cmd/mist/qml_container.go b/cmd/mist/qml_container.go new file mode 100644 index 000000000..a0a46f9b1 --- /dev/null +++ b/cmd/mist/qml_container.go @@ -0,0 +1,85 @@ +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA + +package main + +import ( + "fmt" + "runtime" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/state" + "github.com/ethereum/go-ethereum/xeth" + "gopkg.in/qml.v1" +) + +type QmlApplication struct { + win *qml.Window + engine *qml.Engine + lib *UiLib + path string +} + +func NewQmlApplication(path string, lib *UiLib) *QmlApplication { + engine := qml.NewEngine() + return &QmlApplication{engine: engine, path: path, lib: lib} +} + +func (app *QmlApplication) Create() error { + path := string(app.path) + + // For some reason for windows we get /c:/path/to/something, windows doesn't like the first slash but is fine with the others so we are removing it + if app.path[0] == '/' && runtime.GOOS == "windows" { + path = app.path[1:] + } + + component, err := app.engine.LoadFile(path) + if err != nil { + guilogger.Warnln(err) + } + app.win = component.CreateWindow(nil) + + return nil +} + +func (app *QmlApplication) Destroy() { + app.engine.Destroy() +} + +func (app *QmlApplication) NewWatcher(quitChan chan bool) { +} + +// Events +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) +} + +func (self *QmlApplication) Messages(msgs state.Messages, id string) { + fmt.Println("IMPLEMENT QML APPLICATION MESSAGES METHOD") +} + +// Getters +func (app *QmlApplication) Engine() *qml.Engine { + return app.engine +} +func (app *QmlApplication) Window() *qml.Window { + return app.win +} + +func (app *QmlApplication) Post(data string, s int) {} diff --git a/mist/ui_lib.go b/cmd/mist/ui_lib.go index e77336c90..fdbde50fd 100644 --- a/mist/ui_lib.go +++ b/cmd/mist/ui_lib.go @@ -1,3 +1,20 @@ +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA + package main import ( @@ -7,13 +24,16 @@ import ( "strconv" "strings" - "github.com/ethereum/eth-go" - "github.com/ethereum/eth-go/ethchain" - "github.com/ethereum/eth-go/ethcrypto" - "github.com/ethereum/eth-go/ethpipe" - "github.com/ethereum/eth-go/ethstate" - "github.com/ethereum/eth-go/ethutil" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethutil" "github.com/ethereum/go-ethereum/javascript" + "github.com/ethereum/go-ethereum/miner" + "github.com/ethereum/go-ethereum/state" + "github.com/ethereum/go-ethereum/ui/qt" + "github.com/ethereum/go-ethereum/xeth" "gopkg.in/qml.v1" ) @@ -24,7 +44,7 @@ type memAddr struct { // UI Library that has some basic functionality exposed type UiLib struct { - *ethpipe.JSPipe + *xeth.JSXEth engine *qml.Engine eth *eth.Ethereum connected bool @@ -37,21 +57,26 @@ type UiLib struct { jsEngine *javascript.JSRE filterCallbacks map[int][]int + + miner *miner.Miner } func NewUiLib(engine *qml.Engine, eth *eth.Ethereum, assetPath string) *UiLib { - return &UiLib{JSPipe: ethpipe.NewJSPipe(eth), engine: engine, eth: eth, assetPath: assetPath, jsEngine: javascript.NewJSRE(eth), filterCallbacks: make(map[int][]int)} //, filters: make(map[int]*ethpipe.JSFilter)} + lib := &UiLib{JSXEth: xeth.NewJSXEth(eth), engine: engine, eth: eth, assetPath: assetPath, jsEngine: javascript.NewJSRE(eth), filterCallbacks: make(map[int][]int)} //, filters: make(map[int]*xeth.JSFilter)} + lib.miner = miner.New(eth.KeyManager().Address(), eth) + + return lib } func (self *UiLib) Notef(args []interface{}) { - logger.Infoln(args...) + guilogger.Infoln(args...) } func (self *UiLib) LookupDomain(domain string) string { world := self.World() if len(domain) > 32 { - domain = string(ethcrypto.Sha3Bin([]byte(domain))) + domain = string(crypto.Sha3([]byte(domain))) } data := world.Config().Get("DnsReg").StorageString(domain).Bytes() @@ -102,8 +127,11 @@ func (self *UiLib) PastPeers() *ethutil.List { } func (self *UiLib) ImportTx(rlpTx string) { - tx := ethchain.NewTransactionFromBytes(ethutil.Hex2Bytes(rlpTx)) - self.eth.TxPool().QueueTransaction(tx) + tx := types.NewTransactionFromBytes(ethutil.Hex2Bytes(rlpTx)) + err := self.eth.TxPool().Add(tx) + if err != nil { + guilogger.Infoln("import tx failed ", err) + } } func (self *UiLib) EvalJavascriptFile(path string) { @@ -140,7 +168,7 @@ func (ui *UiLib) OpenBrowser() { func (ui *UiLib) Muted(content string) { component, err := ui.engine.LoadFile(ui.AssetPath("qml/muted.qml")) if err != nil { - logger.Debugln(err) + guilogger.Debugln(err) return } @@ -172,7 +200,7 @@ func (ui *UiLib) AssetPath(p string) string { func (self *UiLib) StartDbWithContractAndData(contractHash, data string) { dbWindow := NewDebuggerWindow(self) - object := self.eth.StateManager().CurrentState().GetStateObject(ethutil.Hex2Bytes(contractHash)) + object := self.eth.ChainManager().State().GetStateObject(ethutil.Hex2Bytes(contractHash)) if len(object.Code) > 0 { dbWindow.SetCode("0x" + ethutil.Bytes2Hex(object.Code)) } @@ -193,28 +221,32 @@ func (self *UiLib) StartDebugger() { dbWindow.Show() } -func (self *UiLib) NewFilter(object map[string]interface{}) int { - filter, id := self.eth.InstallFilter(object) - filter.MessageCallback = func(messages ethstate.Messages) { - self.win.Root().Call("invokeFilterCallback", ethpipe.ToJSMessages(messages), id) +func (self *UiLib) NewFilter(object map[string]interface{}) (id int) { + filter := qt.NewFilterFromMap(object, self.eth) + filter.MessageCallback = func(messages state.Messages) { + self.win.Root().Call("invokeFilterCallback", xeth.ToJSMessages(messages), id) } - + id = self.eth.InstallFilter(filter) return id } -func (self *UiLib) NewFilterString(typ string) int { - filter, id := self.eth.InstallFilter(nil) - filter.BlockCallback = func(block *ethchain.Block) { - self.win.Root().Call("invokeFilterCallback", "{}", id) +func (self *UiLib) NewFilterString(typ string) (id int) { + filter := core.NewFilter(self.eth) + filter.BlockCallback = func(block *types.Block) { + if self.win != nil && self.win.Root() != nil { + self.win.Root().Call("invokeFilterCallback", "{}", id) + } else { + fmt.Println("QML is lagging") + } } - + id = self.eth.InstallFilter(filter) return id } func (self *UiLib) Messages(id int) *ethutil.List { filter := self.eth.GetFilter(id) if filter != nil { - messages := ethpipe.ToJSMessages(filter.Find()) + messages := xeth.ToJSMessages(filter.Find()) return messages } @@ -277,10 +309,10 @@ func mapToTxParams(object map[string]interface{}) map[string]string { return conv } -func (self *UiLib) Transact(params map[string]interface{}) (*ethpipe.JSReceipt, error) { +func (self *UiLib) Transact(params map[string]interface{}) (string, error) { object := mapToTxParams(params) - return self.JSPipe.Transact( + return self.JSXEth.Transact( object["from"], object["to"], object["value"], @@ -302,7 +334,7 @@ func (self *UiLib) Compile(code string) (string, error) { func (self *UiLib) Call(params map[string]interface{}) (string, error) { object := mapToTxParams(params) - return self.JSPipe.Execute( + return self.JSXEth.Execute( object["to"], object["value"], object["gas"], @@ -310,3 +342,33 @@ func (self *UiLib) Call(params map[string]interface{}) (string, error) { object["data"], ) } + +func (self *UiLib) AddLocalTransaction(to, data, gas, gasPrice, value string) int { + return self.miner.AddLocalTx(&miner.LocalTx{ + To: ethutil.Hex2Bytes(to), + Data: ethutil.Hex2Bytes(data), + Gas: gas, + GasPrice: gasPrice, + Value: value, + }) - 1 +} + +func (self *UiLib) RemoveLocalTransaction(id int) { + self.miner.RemoveLocalTx(id) +} + +func (self *UiLib) SetGasPrice(price string) { + self.miner.MinAcceptedGasPrice = ethutil.Big(price) +} + +func (self *UiLib) ToggleMining() bool { + if !self.miner.Mining() { + self.miner.Start() + + return true + } else { + self.miner.Stop() + + return false + } +} diff --git a/cmd/peerserver/main.go b/cmd/peerserver/main.go new file mode 100644 index 000000000..0fa7a9b44 --- /dev/null +++ b/cmd/peerserver/main.go @@ -0,0 +1,40 @@ +package main + +import ( + "crypto/elliptic" + "fmt" + "log" + "net" + "os" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/p2p" +) + +func main() { + logger.AddLogSystem(logger.NewStdLogSystem(os.Stdout, log.LstdFlags, logger.InfoLevel)) + key, _ := crypto.GenerateKey() + marshaled := elliptic.Marshal(crypto.S256(), key.PublicKey.X, key.PublicKey.Y) + + srv := p2p.Server{ + MaxPeers: 10, + Identity: p2p.NewSimpleClientIdentity("Ethereum(G)", "0.1", "Peer Server Two", string(marshaled)), + ListenAddr: ":30301", + NAT: p2p.UPNP(), + } + if err := srv.Start(); err != nil { + fmt.Println("could not start server:", err) + os.Exit(1) + } + + // add seed peers + seed, err := net.ResolveTCPAddr("tcp", "poc-7.ethdev.com:30300") + if err != nil { + fmt.Println("couldn't resolve:", err) + os.Exit(1) + } + srv.SuggestPeer(seed.IP, seed.Port, nil) + + select {} +} diff --git a/utils/cmd.go b/cmd/utils/cmd.go index 700542cae..db7bcd35e 100644 --- a/utils/cmd.go +++ b/cmd/utils/cmd.go @@ -13,18 +13,18 @@ import ( "time" "bitbucket.org/kardianos/osext" - "github.com/ethereum/eth-go" - "github.com/ethereum/eth-go/ethcrypto" - "github.com/ethereum/eth-go/ethdb" - "github.com/ethereum/eth-go/ethlog" - "github.com/ethereum/eth-go/ethminer" - "github.com/ethereum/eth-go/ethpipe" - "github.com/ethereum/eth-go/ethrpc" - "github.com/ethereum/eth-go/ethutil" - "github.com/ethereum/eth-go/ethwire" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/miner" + "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/wire" + "github.com/ethereum/go-ethereum/xeth" ) -var logger = ethlog.NewLogger("CLI") +var clilogger = logger.NewLogger("CLI") var interruptCallbacks = []func(os.Signal){} // Register interrupt handlers callbacks @@ -38,7 +38,7 @@ func HandleInterrupt() { go func() { signal.Notify(c, os.Interrupt) for sig := range c { - logger.Errorf("Shutting down (%v) ... \n", sig) + clilogger.Errorf("Shutting down (%v) ... \n", sig) RunInterruptCallbacks(sig) } }() @@ -100,7 +100,7 @@ func InitDataDir(Datadir string) { } } -func InitLogging(Datadir string, LogFile string, LogLevel int, DebugFile string) ethlog.LogSystem { +func InitLogging(Datadir string, LogFile string, LogLevel int, DebugFile string) logger.LogSystem { var writer io.Writer if LogFile == "" { writer = os.Stdout @@ -108,28 +108,31 @@ func InitLogging(Datadir string, LogFile string, LogLevel int, DebugFile string) writer = openLogFile(Datadir, LogFile) } - sys := ethlog.NewStdLogSystem(writer, log.LstdFlags, ethlog.LogLevel(LogLevel)) - ethlog.AddLogSystem(sys) + sys := logger.NewStdLogSystem(writer, log.LstdFlags, logger.LogLevel(LogLevel)) + logger.AddLogSystem(sys) if DebugFile != "" { writer = openLogFile(Datadir, DebugFile) - ethlog.AddLogSystem(ethlog.NewStdLogSystem(writer, log.LstdFlags, ethlog.DebugLevel)) + logger.AddLogSystem(logger.NewStdLogSystem(writer, log.LstdFlags, logger.DebugLevel)) } return sys } -func InitConfig(ConfigFile string, Datadir string, EnvPrefix string) *ethutil.ConfigManager { +func InitConfig(vmType int, ConfigFile string, Datadir string, EnvPrefix string) *ethutil.ConfigManager { InitDataDir(Datadir) - return ethutil.ReadConfig(ConfigFile, Datadir, EnvPrefix) + cfg := ethutil.ReadConfig(ConfigFile, Datadir, EnvPrefix) + cfg.VmType = vmType + + return cfg } func exit(err error) { status := 0 if err != nil { - logger.Errorln("Fatal: ", err) + clilogger.Errorln("Fatal: ", err) status = 1 } - ethlog.Flush() + logger.Flush() os.Exit(status) } @@ -141,15 +144,14 @@ func NewDatabase() ethutil.Database { return db } -func NewClientIdentity(clientIdentifier, version, customIdentifier string) *ethwire.SimpleClientIdentity { - logger.Infoln("identity created") - return ethwire.NewSimpleClientIdentity(clientIdentifier, version, customIdentifier) +func NewClientIdentity(clientIdentifier, version, customIdentifier string) *wire.SimpleClientIdentity { + return wire.NewSimpleClientIdentity(clientIdentifier, version, customIdentifier) } -func NewEthereum(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager *ethcrypto.KeyManager, usePnp bool, OutboundPort string, MaxPeer int) *eth.Ethereum { +func NewEthereum(db ethutil.Database, clientIdentity wire.ClientIdentity, keyManager *crypto.KeyManager, usePnp bool, OutboundPort string, MaxPeer int) *eth.Ethereum { ethereum, err := eth.New(db, clientIdentity, keyManager, eth.CapDefault, usePnp) if err != nil { - logger.Fatalln("eth start err:", err) + clilogger.Fatalln("eth start err:", err) } ethereum.Port = OutboundPort ethereum.MaxPeers = MaxPeer @@ -157,26 +159,26 @@ func NewEthereum(db ethutil.Database, clientIdentity ethwire.ClientIdentity, key } func StartEthereum(ethereum *eth.Ethereum, UseSeed bool) { - logger.Infof("Starting %s", ethereum.ClientIdentity()) + clilogger.Infof("Starting %s", ethereum.ClientIdentity()) ethereum.Start(UseSeed) RegisterInterrupt(func(sig os.Signal) { ethereum.Stop() - ethlog.Flush() + logger.Flush() }) } func ShowGenesis(ethereum *eth.Ethereum) { - logger.Infoln(ethereum.BlockChain().Genesis()) + clilogger.Infoln(ethereum.ChainManager().Genesis()) exit(nil) } -func NewKeyManager(KeyStore string, Datadir string, db ethutil.Database) *ethcrypto.KeyManager { - var keyManager *ethcrypto.KeyManager +func NewKeyManager(KeyStore string, Datadir string, db ethutil.Database) *crypto.KeyManager { + var keyManager *crypto.KeyManager switch { case KeyStore == "db": - keyManager = ethcrypto.NewDBKeyManager(db) + keyManager = crypto.NewDBKeyManager(db) case KeyStore == "file": - keyManager = ethcrypto.NewFileKeyManager(Datadir) + keyManager = crypto.NewFileKeyManager(Datadir) default: exit(fmt.Errorf("unknown keystore type: %s", KeyStore)) } @@ -189,7 +191,7 @@ func DefaultAssetPath() string { // assume a debug build and use the source directory as // asset directory. pwd, _ := os.Getwd() - if pwd == path.Join(os.Getenv("GOPATH"), "src", "github.com", "ethereum", "go-ethereum", "mist") { + if pwd == path.Join(os.Getenv("GOPATH"), "src", "github.com", "ethereum", "go-ethereum", "cmd", "mist") { assetPath = path.Join(pwd, "assets") } else { switch runtime.GOOS { @@ -208,7 +210,7 @@ func DefaultAssetPath() string { return assetPath } -func KeyTasks(keyManager *ethcrypto.KeyManager, KeyRing string, GenAddr bool, SecretFile string, ExportDir string, NonInteractive bool) { +func KeyTasks(keyManager *crypto.KeyManager, KeyRing string, GenAddr bool, SecretFile string, ExportDir string, NonInteractive bool) { var err error switch { @@ -237,22 +239,23 @@ func KeyTasks(keyManager *ethcrypto.KeyManager, KeyRing string, GenAddr bool, Se exit(err) } } + clilogger.Infof("Main address %x\n", keyManager.Address()) } func StartRpc(ethereum *eth.Ethereum, RpcPort int) { var err error - ethereum.RpcServer, err = ethrpc.NewJsonRpcServer(ethpipe.NewJSPipe(ethereum), RpcPort) + ethereum.RpcServer, err = rpc.NewJsonRpcServer(xeth.NewJSXEth(ethereum), RpcPort) if err != nil { - logger.Errorf("Could not start RPC interface (port %v): %v", RpcPort, err) + clilogger.Errorf("Could not start RPC interface (port %v): %v", RpcPort, err) } else { go ethereum.RpcServer.Start() } } -var miner *ethminer.Miner +var gminer *miner.Miner -func GetMiner() *ethminer.Miner { - return miner +func GetMiner() *miner.Miner { + return gminer } func StartMining(ethereum *eth.Ethereum) bool { @@ -261,16 +264,16 @@ func StartMining(ethereum *eth.Ethereum) bool { addr := ethereum.KeyManager().Address() go func() { - logger.Infoln("Start mining") - if miner == nil { - miner = ethminer.NewDefaultMiner(addr, ethereum) + clilogger.Infoln("Start mining") + if gminer == nil { + gminer = miner.New(addr, ethereum) } // Give it some time to connect with peers time.Sleep(3 * time.Second) for !ethereum.IsUpToDate() { time.Sleep(5 * time.Second) } - miner.Start() + gminer.Start() }() RegisterInterrupt(func(os.Signal) { StopMining(ethereum) @@ -294,9 +297,9 @@ func FormatTransactionData(data string) []byte { } func StopMining(ethereum *eth.Ethereum) bool { - if ethereum.Mining && miner != nil { - miner.Stop() - logger.Infoln("Stopped mining") + if ethereum.Mining && gminer != nil { + gminer.Stop() + clilogger.Infoln("Stopped mining") ethereum.Mining = false return true @@ -307,14 +310,14 @@ func StopMining(ethereum *eth.Ethereum) bool { // Replay block func BlockDo(ethereum *eth.Ethereum, hash []byte) error { - block := ethereum.BlockChain().GetBlock(hash) + block := ethereum.ChainManager().GetBlock(hash) if block == nil { return fmt.Errorf("unknown block %x", hash) } - parent := ethereum.BlockChain().GetBlock(block.PrevHash) + parent := ethereum.ChainManager().GetBlock(block.PrevHash) - _, err := ethereum.StateManager().ApplyDiff(parent.State(), parent, block) + _, err := ethereum.BlockManager().TransitionState(parent.State(), parent, block) if err != nil { return err } diff --git a/cmd/utils/vm_env.go b/cmd/utils/vm_env.go new file mode 100644 index 000000000..461a797c2 --- /dev/null +++ b/cmd/utils/vm_env.go @@ -0,0 +1,70 @@ +package utils + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/state" + "github.com/ethereum/go-ethereum/vm" +) + +type VMEnv struct { + state *state.StateDB + block *types.Block + + transactor []byte + value *big.Int + + depth int + Gas *big.Int +} + +func NewEnv(state *state.StateDB, block *types.Block, transactor []byte, value *big.Int) *VMEnv { + return &VMEnv{ + state: state, + block: block, + transactor: transactor, + value: value, + } +} + +func (self *VMEnv) Origin() []byte { return self.transactor } +func (self *VMEnv) BlockNumber() *big.Int { return self.block.Number } +func (self *VMEnv) PrevHash() []byte { return self.block.PrevHash } +func (self *VMEnv) Coinbase() []byte { return self.block.Coinbase } +func (self *VMEnv) Time() int64 { return self.block.Time } +func (self *VMEnv) Difficulty() *big.Int { return self.block.Difficulty } +func (self *VMEnv) BlockHash() []byte { return self.block.Hash() } +func (self *VMEnv) Value() *big.Int { return self.value } +func (self *VMEnv) State() *state.StateDB { return self.state } +func (self *VMEnv) GasLimit() *big.Int { return self.block.GasLimit } +func (self *VMEnv) Depth() int { return self.depth } +func (self *VMEnv) SetDepth(i int) { self.depth = i } +func (self *VMEnv) AddLog(log state.Log) { + self.state.AddLog(log) +} +func (self *VMEnv) Transfer(from, to vm.Account, amount *big.Int) error { + return vm.Transfer(from, to, amount) +} + +func (self *VMEnv) vm(addr, data []byte, gas, price, value *big.Int) *core.Execution { + return core.NewExecution(self, addr, data, gas, price, value) +} + +func (self *VMEnv) Call(caller vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) { + exe := self.vm(addr, data, gas, price, value) + ret, err := exe.Call(addr, caller) + self.Gas = exe.Gas + + return ret, err +} +func (self *VMEnv) CallCode(caller vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) { + exe := self.vm(caller.Address(), data, gas, price, value) + return exe.Call(addr, caller) +} + +func (self *VMEnv) Create(caller vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error, vm.ClosureRef) { + exe := self.vm(addr, data, gas, price, value) + return exe.Create(caller) +} diff --git a/utils/websockets.go b/cmd/utils/websockets.go index e89331a98..d3ba50e78 100644 --- a/utils/websockets.go +++ b/cmd/utils/websockets.go @@ -1,10 +1,10 @@ package utils import ( - "github.com/ethereum/eth-go" - "github.com/ethereum/eth-go/ethpipe" - "github.com/ethereum/eth-go/ethutil" - "github.com/ethereum/eth-go/websocket" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/websocket" + "github.com/ethereum/go-ethereum/xeth" ) func args(v ...interface{}) []interface{} { @@ -21,7 +21,7 @@ func NewWebSocketServer(eth *eth.Ethereum) *WebSocketServer { } func (self *WebSocketServer) Serv() { - pipe := ethpipe.NewJSPipe(self.ethereum) + pipe := xeth.NewJSXEth(self.ethereum) wsServ := websocket.NewServer("/eth", ":40404") wsServ.MessageFunc(func(c *websocket.Client, msg *websocket.Message) { diff --git a/compression/rle/read_write.go b/compression/rle/read_write.go new file mode 100644 index 000000000..dde0e41ab --- /dev/null +++ b/compression/rle/read_write.go @@ -0,0 +1,84 @@ +package rle + +import ( + "bytes" + "errors" + + "github.com/ethereum/go-ethereum/crypto" +) + +const ( + token byte = 0xfe + emptyShaToken = 0xfd + emptyListShaToken = 0xfe + tokenToken = 0xff +) + +var empty = crypto.Sha3([]byte("")) +var emptyList = crypto.Sha3([]byte{0x80}) + +func Decompress(dat []byte) ([]byte, error) { + buf := new(bytes.Buffer) + + for i := 0; i < len(dat); i++ { + if dat[i] == token { + if i+1 < len(dat) { + switch dat[i+1] { + case emptyShaToken: + buf.Write(empty) + case emptyListShaToken: + buf.Write(emptyList) + case tokenToken: + buf.WriteByte(token) + default: + buf.Write(make([]byte, int(dat[i+1]-2))) + } + i++ + } else { + return nil, errors.New("error reading bytes. token encountered without proceeding bytes") + } + } else { + buf.WriteByte(dat[i]) + } + } + + return buf.Bytes(), nil +} + +func compressChunk(dat []byte) (ret []byte, n int) { + switch { + case dat[0] == token: + return []byte{token, tokenToken}, 1 + case len(dat) > 1 && dat[0] == 0x0 && dat[1] == 0x0: + j := 0 + for j <= 254 && j < len(dat) { + if dat[j] != 0 { + break + } + j++ + } + return []byte{token, byte(j + 2)}, j + case len(dat) >= 32: + if dat[0] == empty[0] && bytes.Compare(dat[:32], empty) == 0 { + return []byte{token, emptyShaToken}, 32 + } else if dat[0] == emptyList[0] && bytes.Compare(dat[:32], emptyList) == 0 { + return []byte{token, emptyListShaToken}, 32 + } + fallthrough + default: + return dat[:1], 1 + } +} + +func Compress(dat []byte) []byte { + buf := new(bytes.Buffer) + + i := 0 + for i < len(dat) { + b, n := compressChunk(dat[i:]) + buf.Write(b) + i += n + } + + return buf.Bytes() +} diff --git a/compression/rle/read_write_test.go b/compression/rle/read_write_test.go new file mode 100644 index 000000000..e6aac9093 --- /dev/null +++ b/compression/rle/read_write_test.go @@ -0,0 +1,118 @@ +package rle + +import ( + "testing" + + checker "gopkg.in/check.v1" +) + +func Test(t *testing.T) { checker.TestingT(t) } + +type CompressionRleSuite struct{} + +var _ = checker.Suite(&CompressionRleSuite{}) + +func (s *CompressionRleSuite) TestDecompressSimple(c *checker.C) { + exp := []byte{0xc5, 0xd2, 0x46, 0x1, 0x86, 0xf7, 0x23, 0x3c, 0x92, 0x7e, 0x7d, 0xb2, 0xdc, 0xc7, 0x3, 0xc0, 0xe5, 0x0, 0xb6, 0x53, 0xca, 0x82, 0x27, 0x3b, 0x7b, 0xfa, 0xd8, 0x4, 0x5d, 0x85, 0xa4, 0x70} + res, err := Decompress([]byte{token, 0xfd}) + c.Assert(err, checker.IsNil) + c.Assert(res, checker.DeepEquals, exp) + // if bytes.Compare(res, exp) != 0 { + // t.Error("empty sha3", res) + // } + + exp = []byte{0x56, 0xe8, 0x1f, 0x17, 0x1b, 0xcc, 0x55, 0xa6, 0xff, 0x83, 0x45, 0xe6, 0x92, 0xc0, 0xf8, 0x6e, 0x5b, 0x48, 0xe0, 0x1b, 0x99, 0x6c, 0xad, 0xc0, 0x1, 0x62, 0x2f, 0xb5, 0xe3, 0x63, 0xb4, 0x21} + res, err = Decompress([]byte{token, 0xfe}) + c.Assert(err, checker.IsNil) + c.Assert(res, checker.DeepEquals, exp) + // if bytes.Compare(res, exp) != 0 { + // t.Error("0x80 sha3", res) + // } + + res, err = Decompress([]byte{token, 0xff}) + c.Assert(err, checker.IsNil) + c.Assert(res, checker.DeepEquals, []byte{token}) + // if bytes.Compare(res, []byte{token}) != 0 { + // t.Error("token", res) + // } + + res, err = Decompress([]byte{token, 12}) + c.Assert(err, checker.IsNil) + c.Assert(res, checker.DeepEquals, make([]byte, 10)) + // if bytes.Compare(res, make([]byte, 10)) != 0 { + // t.Error("10 * zero", res) + // } +} + +// func TestDecompressMulti(t *testing.T) { +// res, err := Decompress([]byte{token, 0xfd, token, 0xfe, token, 12}) +// if err != nil { +// t.Error(err) +// } + +// var exp []byte +// exp = append(exp, crypto.Sha3([]byte(""))...) +// exp = append(exp, crypto.Sha3([]byte{0x80})...) +// exp = append(exp, make([]byte, 10)...) + +// if bytes.Compare(res, res) != 0 { +// t.Error("Expected", exp, "result", res) +// } +// } + +// func TestCompressSimple(t *testing.T) { +// res := Compress([]byte{0, 0, 0, 0, 0}) +// if bytes.Compare(res, []byte{token, 7}) != 0 { +// t.Error("5 * zero", res) +// } + +// res = Compress(crypto.Sha3([]byte(""))) +// if bytes.Compare(res, []byte{token, emptyShaToken}) != 0 { +// t.Error("empty sha", res) +// } + +// res = Compress(crypto.Sha3([]byte{0x80})) +// if bytes.Compare(res, []byte{token, emptyListShaToken}) != 0 { +// t.Error("empty list sha", res) +// } + +// res = Compress([]byte{token}) +// if bytes.Compare(res, []byte{token, tokenToken}) != 0 { +// t.Error("token", res) +// } +// } + +// func TestCompressMulti(t *testing.T) { +// in := []byte{0, 0, 0, 0, 0} +// in = append(in, crypto.Sha3([]byte(""))...) +// in = append(in, crypto.Sha3([]byte{0x80})...) +// in = append(in, token) +// res := Compress(in) + +// exp := []byte{token, 7, token, emptyShaToken, token, emptyListShaToken, token, tokenToken} +// if bytes.Compare(res, exp) != 0 { +// t.Error("expected", exp, "got", res) +// } +// } + +// func TestCompressDecompress(t *testing.T) { +// var in []byte + +// for i := 0; i < 20; i++ { +// in = append(in, []byte{0, 0, 0, 0, 0}...) +// in = append(in, crypto.Sha3([]byte(""))...) +// in = append(in, crypto.Sha3([]byte{0x80})...) +// in = append(in, []byte{123, 2, 19, 89, 245, 254, 255, token, 98, 233}...) +// in = append(in, token) +// } + +// c := Compress(in) +// d, err := Decompress(c) +// if err != nil { +// t.Error(err) +// } + +// if bytes.Compare(d, in) != 0 { +// t.Error("multi failed\n", d, "\n", in) +// } +// } diff --git a/core/.gitignore b/core/.gitignore new file mode 100644 index 000000000..f725d58d1 --- /dev/null +++ b/core/.gitignore @@ -0,0 +1,12 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. +# +# If you find yourself ignoring temporary files generated by your text editor +# or operating system, you probably want to add a global ignore instead: +# git config --global core.excludesfile ~/.gitignore_global + +/tmp +*/**/*un~ +*un~ +.DS_Store +*/**/.DS_Store + diff --git a/core/asm.go b/core/asm.go new file mode 100644 index 000000000..a8b3023f4 --- /dev/null +++ b/core/asm.go @@ -0,0 +1,50 @@ +package core + +import ( + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/vm" +) + +func Disassemble(script []byte) (asm []string) { + pc := new(big.Int) + for { + if pc.Cmp(big.NewInt(int64(len(script)))) >= 0 { + return + } + + // Get the memory location of pc + val := script[pc.Int64()] + // Get the opcode (it must be an opcode!) + op := vm.OpCode(val) + + asm = append(asm, fmt.Sprintf("%04v: %v", pc, op)) + + switch op { + case vm.PUSH1, vm.PUSH2, vm.PUSH3, vm.PUSH4, vm.PUSH5, vm.PUSH6, vm.PUSH7, vm.PUSH8, + vm.PUSH9, vm.PUSH10, vm.PUSH11, vm.PUSH12, vm.PUSH13, vm.PUSH14, vm.PUSH15, + vm.PUSH16, vm.PUSH17, vm.PUSH18, vm.PUSH19, vm.PUSH20, vm.PUSH21, vm.PUSH22, + vm.PUSH23, vm.PUSH24, vm.PUSH25, vm.PUSH26, vm.PUSH27, vm.PUSH28, vm.PUSH29, + vm.PUSH30, vm.PUSH31, vm.PUSH32: + pc.Add(pc, ethutil.Big1) + a := int64(op) - int64(vm.PUSH1) + 1 + if int(pc.Int64()+a) > len(script) { + return + } + + data := script[pc.Int64() : pc.Int64()+a] + if len(data) == 0 { + data = []byte{0} + } + asm = append(asm, fmt.Sprintf("%04v: 0x%x", pc, data)) + + pc.Add(pc, big.NewInt(a-1)) + } + + pc.Add(pc, ethutil.Big1) + } + + return asm +} diff --git a/core/block_manager.go b/core/block_manager.go new file mode 100644 index 000000000..2567e39c4 --- /dev/null +++ b/core/block_manager.go @@ -0,0 +1,371 @@ +package core + +import ( + "bytes" + "container/list" + "errors" + "fmt" + "math/big" + "sync" + "time" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/pow" + "github.com/ethereum/go-ethereum/pow/ezp" + "github.com/ethereum/go-ethereum/state" + "github.com/ethereum/go-ethereum/wire" +) + +var statelogger = logger.NewLogger("BLOCK") + +type Peer interface { + Inbound() bool + LastSend() time.Time + LastPong() int64 + Host() []byte + Port() uint16 + Version() string + PingTime() string + Connected() *int32 + Caps() *ethutil.Value +} + +type EthManager interface { + BlockManager() *BlockManager + ChainManager() *ChainManager + TxPool() *TxPool + Broadcast(msgType wire.MsgType, data []interface{}) + PeerCount() int + IsMining() bool + IsListening() bool + Peers() *list.List + KeyManager() *crypto.KeyManager + ClientIdentity() wire.ClientIdentity + Db() ethutil.Database + EventMux() *event.TypeMux +} + +type BlockManager struct { + // Mutex for locking the block processor. Blocks can only be handled one at a time + mutex sync.Mutex + // Canonical block chain + bc *ChainManager + // non-persistent key/value memory storage + mem map[string]*big.Int + // Proof of work used for validating + Pow pow.PoW + + txpool *TxPool + + // 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 *types.Block + + events event.Subscription + + eventMux *event.TypeMux +} + +func NewBlockManager(txpool *TxPool, chainManager *ChainManager, eventMux *event.TypeMux) *BlockManager { + sm := &BlockManager{ + mem: make(map[string]*big.Int), + Pow: ezp.New(), + bc: chainManager, + eventMux: eventMux, + txpool: txpool, + } + + return sm +} + +func (sm *BlockManager) TransitionState(statedb *state.StateDB, parent, block *types.Block) (receipts types.Receipts, err error) { + coinbase := statedb.GetOrNewStateObject(block.Coinbase) + coinbase.SetGasPool(block.CalcGasLimit(parent)) + + // Process the transactions on to current block + receipts, _, _, _, err = sm.ApplyTransactions(coinbase, statedb, block, block.Transactions(), false) + if err != nil { + return nil, err + } + + return receipts, nil +} + +func (self *BlockManager) ApplyTransactions(coinbase *state.StateObject, state *state.StateDB, block *types.Block, txs types.Transactions, transientProcess bool) (types.Receipts, types.Transactions, types.Transactions, types.Transactions, error) { + var ( + receipts types.Receipts + handled, unhandled types.Transactions + erroneous types.Transactions + totalUsedGas = big.NewInt(0) + err error + cumulativeSum = new(big.Int) + ) + +done: + for i, tx := range txs { + // If we are mining this block and validating we want to set the logs back to 0 + state.EmptyLogs() + + txGas := new(big.Int).Set(tx.Gas()) + + cb := state.GetStateObject(coinbase.Address()) + st := NewStateTransition(cb, tx, state, block) + _, err = st.TransitionState() + if err != nil { + switch { + case IsNonceErr(err): + err = nil // ignore error + continue + case IsGasLimitErr(err): + unhandled = txs[i:] + + break done + default: + statelogger.Infoln(err) + erroneous = append(erroneous, tx) + err = nil + } + } + + txGas.Sub(txGas, st.gas) + cumulativeSum.Add(cumulativeSum, new(big.Int).Mul(txGas, tx.GasPrice())) + + // Update the state with pending changes + state.Update(txGas) + + cumulative := new(big.Int).Set(totalUsedGas.Add(totalUsedGas, txGas)) + receipt := types.NewReceipt(state.Root(), cumulative) + receipt.SetLogs(state.Logs()) + receipt.Bloom = types.CreateBloom(types.Receipts{receipt}) + chainlogger.Debugln(receipt) + + // Notify all subscribers + if !transientProcess { + go self.eventMux.Post(TxPostEvent{tx}) + } + + receipts = append(receipts, receipt) + handled = append(handled, tx) + + if ethutil.Config.Diff && ethutil.Config.DiffType == "all" { + state.CreateOutputForDiff() + } + } + + block.Reward = cumulativeSum + block.GasUsed = totalUsedGas + + return receipts, handled, unhandled, erroneous, err +} + +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() + + if sm.bc.HasBlock(block.Hash()) { + return nil, nil, &KnownBlockError{block.Number, block.Hash()} + } + + if !sm.bc.HasBlock(block.PrevHash) { + return nil, nil, ParentError(block.PrevHash) + } + parent := sm.bc.GetBlock(block.PrevHash) + + return sm.ProcessWithParent(block, parent) +} + +func (sm *BlockManager) ProcessWithParent(block, parent *types.Block) (td *big.Int, messages state.Messages, err error) { + sm.lastAttemptedBlock = block + + state := parent.State().Copy() + + // Defer the Undo on the Trie. If the block processing happened + // we don't want to undo but since undo only happens on dirty + // nodes this won't happen because Commit would have been called + // before that. + defer state.Reset() + + // Block validation + if err = sm.ValidateBlock(block, parent); err != nil { + return + } + + receipts, err := sm.TransitionState(state, parent, block) + if err != nil { + return + } + + rbloom := types.CreateBloom(receipts) + if bytes.Compare(rbloom, block.LogsBloom) != 0 { + err = fmt.Errorf("unable to replicate block's bloom=%x", rbloom) + return + } + + 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 := types.DeriveSha(receipts) + if bytes.Compare(receiptSha, block.ReceiptSha) != 0 { + //chainlogger.Debugf("validating receipt root. received=%x got=%x", block.ReceiptSha, receiptSha) + fmt.Printf("%x\n", ethutil.Encode(receipts)) + err = fmt.Errorf("validating receipt root. received=%x got=%x", block.ReceiptSha, receiptSha) + return + } + + if err = sm.AccumelateRewards(state, block, parent); err != nil { + return + } + + state.Update(ethutil.Big0) + + if !block.State().Cmp(state) { + err = fmt.Errorf("invalid merkle root. received=%x got=%x", block.Root(), state.Root()) + return + } + + // Calculate the new total difficulty and sync back to the db + if td, ok := sm.CalculateTD(block); ok { + // Sync the current block's state to the database and cancelling out the deferred Undo + state.Sync() + + messages := state.Manifest().Messages + state.Manifest().Reset() + + chainlogger.Infof("Processed block #%d (%x...)\n", block.Number, block.Hash()[0:4]) + + sm.txpool.RemoveSet(block.Transactions()) + + return td, messages, nil + } else { + return nil, nil, errors.New("total diff failed") + } +} + +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) + } + + // TD(genesis_block) = 0 and TD(B) = TD(B.parent) + sum(u.difficulty for u in B.uncles) + B.difficulty + td := new(big.Int) + td = td.Add(sm.bc.Td(), uncleDiff) + td = td.Add(td, block.Difficulty) + + // The new TD will only be accepted if the new difficulty is + // is greater than the previous. + if td.Cmp(sm.bc.Td()) > 0 { + return td, true + } + + return nil, false +} + +// 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 *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) + } + + diff := block.Time - parent.Time + if diff < 0 { + return ValidationError("Block timestamp less then prev block %v (%v - %v)", diff, block.Time, sm.bc.CurrentBlock().Time) + } + + /* XXX + // New blocks must be within the 15 minute range of the last block. + if diff > int64(15*time.Minute) { + return ValidationError("Block is too far in the future of last block (> 15 minutes)") + } + */ + + // Verify the nonce of the block. Return an error if it's not valid + if !sm.Pow.Verify(block /*block.HashNoNonce(), block.Difficulty, block.Nonce*/) { + return ValidationError("Block's nonce is invalid (= %v)", ethutil.Bytes2Hex(block.Nonce)) + } + + return nil +} + +func (sm *BlockManager) AccumelateRewards(statedb *state.StateDB, block, parent *types.Block) error { + reward := new(big.Int).Set(BlockReward) + + knownUncles := ethutil.Set(parent.Uncles) + nonces := ethutil.NewSet(block.Nonce) + for _, uncle := range block.Uncles { + if nonces.Include(uncle.Nonce) { + // Error not unique + return UncleError("Uncle not unique") + } + + uncleParent := sm.bc.GetBlock(uncle.PrevHash) + if uncleParent == nil { + return UncleError(fmt.Sprintf("Uncle's parent unknown (%x)", uncle.PrevHash[0:4])) + } + + if uncleParent.Number.Cmp(new(big.Int).Sub(parent.Number, big.NewInt(6))) < 0 { + return UncleError("Uncle too old") + } + + if knownUncles.Include(uncle.Hash()) { + return UncleError("Uncle in chain") + } + + nonces.Insert(uncle.Nonce) + + r := new(big.Int) + r.Mul(BlockReward, big.NewInt(15)).Div(r, big.NewInt(16)) + + uncleAccount := statedb.GetAccount(uncle.Coinbase) + uncleAccount.AddAmount(r) + + reward.Add(reward, new(big.Int).Div(BlockReward, big.NewInt(32))) + } + + // Get the account associated with the coinbase + account := statedb.GetAccount(block.Coinbase) + // Reward amount of ether to the coinbase address + account.AddAmount(reward) + + statedb.Manifest().AddMessage(&state.Message{ + To: block.Coinbase, + Input: nil, + Origin: nil, + Block: block.Hash(), Timestamp: block.Time, Coinbase: block.Coinbase, Number: block.Number, + Value: new(big.Int).Add(reward, block.Reward), + }) + + return nil +} + +func (sm *BlockManager) GetMessages(block *types.Block) (messages []*state.Message, err error) { + if !sm.bc.HasBlock(block.PrevHash) { + return nil, ParentError(block.PrevHash) + } + + sm.lastAttemptedBlock = block + + var ( + parent = sm.bc.GetBlock(block.PrevHash) + state = parent.State().Copy() + ) + + defer state.Reset() + + sm.TransitionState(state, parent, block) + sm.AccumelateRewards(state, block, parent) + + return state.Manifest().Messages, nil +} diff --git a/core/chain_manager.go b/core/chain_manager.go new file mode 100644 index 000000000..794ae0011 --- /dev/null +++ b/core/chain_manager.go @@ -0,0 +1,355 @@ +package core + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/state" +) + +var chainlogger = logger.NewLogger("CHAIN") + +func AddTestNetFunds(block *types.Block) { + for _, addr := range []string{ + "51ba59315b3a95761d0863b05ccc7a7f54703d99", + "e4157b34ea9615cfbde6b4fda419828124b70c78", + "b9c015918bdaba24b4ff057a92a3873d6eb201be", + "6c386a4b26f73c802f34673f7248bb118f97424a", + "cd2a3d9f938e13cd947ec05abc7fe734df8dd826", + "2ef47100e0787b915105fd5e3f4ff6752079d5cb", + "e6716f9544a56c530d868e4bfbacb172315bdead", + "1a26338f0d905e295fccb71fa9ea849ffa12aaf4", + } { + codedAddr := ethutil.Hex2Bytes(addr) + account := block.State().GetAccount(codedAddr) + account.SetBalance(ethutil.Big("1606938044258990275541962092341162602522202993782792835301376")) //ethutil.BigPow(2, 200) + block.State().UpdateStateObject(account) + } +} + +func CalcDifficulty(block, parent *types.Block) *big.Int { + diff := new(big.Int) + + adjust := new(big.Int).Rsh(parent.Difficulty, 10) + if block.Time >= parent.Time+5 { + diff.Sub(parent.Difficulty, adjust) + } else { + diff.Add(parent.Difficulty, adjust) + } + + return diff +} + +type ChainManager struct { + //eth EthManager + processor types.BlockProcessor + eventMux *event.TypeMux + genesisBlock *types.Block + // Last known total difficulty + mu sync.RWMutex + td *big.Int + lastBlockNumber uint64 + currentBlock *types.Block + lastBlockHash []byte + + transState *state.StateDB +} + +func (self *ChainManager) Td() *big.Int { + self.mu.RLock() + defer self.mu.RUnlock() + + return self.td +} + +func (self *ChainManager) LastBlockNumber() uint64 { + self.mu.RLock() + defer self.mu.RUnlock() + + return self.lastBlockNumber +} + +func (self *ChainManager) LastBlockHash() []byte { + self.mu.RLock() + defer self.mu.RUnlock() + + return self.lastBlockHash +} + +func (self *ChainManager) CurrentBlock() *types.Block { + self.mu.RLock() + defer self.mu.RUnlock() + + return self.currentBlock +} + +func NewChainManager(mux *event.TypeMux) *ChainManager { + bc := &ChainManager{} + bc.genesisBlock = types.NewBlockFromBytes(ethutil.Encode(Genesis)) + bc.eventMux = mux + + bc.setLastBlock() + + bc.transState = bc.State().Copy() + + return bc +} + +func (self *ChainManager) SetProcessor(proc types.BlockProcessor) { + self.processor = proc +} + +func (self *ChainManager) State() *state.StateDB { + return self.CurrentBlock().State() +} + +func (self *ChainManager) TransState() *state.StateDB { + return self.transState +} + +func (bc *ChainManager) setLastBlock() { + data, _ := ethutil.Config.Db.Get([]byte("LastBlock")) + if len(data) != 0 { + // Prep genesis + AddTestNetFunds(bc.genesisBlock) + + block := types.NewBlockFromBytes(data) + bc.currentBlock = block + bc.lastBlockHash = block.Hash() + bc.lastBlockNumber = block.Number.Uint64() + + // Set the last know difficulty (might be 0x0 as initial value, Genesis) + bc.td = ethutil.BigD(ethutil.Config.Db.LastKnownTD()) + } else { + bc.Reset() + } + + chainlogger.Infof("Last block (#%d) %x\n", bc.lastBlockNumber, bc.currentBlock.Hash()) +} + +// Block creation & chain handling +func (bc *ChainManager) NewBlock(coinbase []byte) *types.Block { + bc.mu.RLock() + defer bc.mu.RUnlock() + + var root interface{} + hash := ZeroHash256 + + if bc.CurrentBlock != nil { + root = bc.currentBlock.Root() + hash = bc.lastBlockHash + } + + block := types.CreateBlock( + root, + hash, + coinbase, + ethutil.BigPow(2, 32), + nil, + "") + + parent := bc.currentBlock + if parent != nil { + block.Difficulty = CalcDifficulty(block, parent) + block.Number = new(big.Int).Add(bc.currentBlock.Number, ethutil.Big1) + block.GasLimit = block.CalcGasLimit(bc.currentBlock) + + } + + return block +} + +func (bc *ChainManager) Reset() { + bc.mu.Lock() + defer bc.mu.Unlock() + + AddTestNetFunds(bc.genesisBlock) + + bc.genesisBlock.Trie().Sync() + // Prepare the genesis block + bc.write(bc.genesisBlock) + bc.insert(bc.genesisBlock) + bc.currentBlock = bc.genesisBlock + + bc.setTotalDifficulty(ethutil.Big("0")) + + // Set the last know difficulty (might be 0x0 as initial value, Genesis) + bc.td = ethutil.BigD(ethutil.Config.Db.LastKnownTD()) +} + +func (self *ChainManager) Export() []byte { + self.mu.RLock() + defer self.mu.RUnlock() + + chainlogger.Infof("exporting %v blocks...\n", self.currentBlock.Number) + + blocks := make([]*types.Block, int(self.currentBlock.Number.Int64())+1) + for block := self.currentBlock; block != nil; block = self.GetBlock(block.PrevHash) { + blocks[block.Number.Int64()] = block + } + + return ethutil.Encode(blocks) +} + +func (bc *ChainManager) insert(block *types.Block) { + encodedBlock := block.RlpEncode() + ethutil.Config.Db.Put([]byte("LastBlock"), encodedBlock) + bc.currentBlock = block + bc.lastBlockHash = block.Hash() +} + +func (bc *ChainManager) write(block *types.Block) { + bc.writeBlockInfo(block) + + encodedBlock := block.RlpEncode() + ethutil.Config.Db.Put(block.Hash(), encodedBlock) +} + +// Accessors +func (bc *ChainManager) Genesis() *types.Block { + return bc.genesisBlock +} + +// Block fetching methods +func (bc *ChainManager) HasBlock(hash []byte) bool { + data, _ := ethutil.Config.Db.Get(hash) + return len(data) != 0 +} + +func (self *ChainManager) GetChainHashesFromHash(hash []byte, max uint64) (chain [][]byte) { + block := self.GetBlock(hash) + if block == nil { + return + } + + // XXX Could be optimised by using a different database which only holds hashes (i.e., linked list) + for i := uint64(0); i < max; i++ { + chain = append(chain, block.Hash()) + + if block.Number.Cmp(ethutil.Big0) <= 0 { + break + } + + block = self.GetBlock(block.PrevHash) + } + + return +} + +func (self *ChainManager) GetBlock(hash []byte) *types.Block { + data, _ := ethutil.Config.Db.Get(hash) + if len(data) == 0 { + return nil + } + + return types.NewBlockFromBytes(data) +} + +func (self *ChainManager) GetBlockByNumber(num uint64) *types.Block { + self.mu.RLock() + defer self.mu.RUnlock() + + block := self.currentBlock + for ; block != nil; block = self.GetBlock(block.PrevHash) { + if block.Number.Uint64() == num { + break + } + } + + if block != nil && block.Number.Uint64() == 0 && num != 0 { + return nil + } + + return block +} + +func (bc *ChainManager) setTotalDifficulty(td *big.Int) { + ethutil.Config.Db.Put([]byte("LTD"), td.Bytes()) + bc.td = td +} + +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) + } + + 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 (bc *ChainManager) BlockInfo(block *types.Block) types.BlockInfo { + bi := types.BlockInfo{} + data, _ := ethutil.Config.Db.Get(append(block.Hash(), []byte("Info")...)) + bi.RlpDecode(data) + + return bi +} + +// Unexported method for writing extra non-essential block info to the db +func (bc *ChainManager) writeBlockInfo(block *types.Block) { + bc.lastBlockNumber++ + 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()) +} + +func (bc *ChainManager) Stop() { + if bc.CurrentBlock != nil { + chainlogger.Infoln("Stopped") + } +} + +func (self *ChainManager) InsertChain(chain types.Blocks) error { + for _, block := range chain { + td, messages, err := self.processor.Process(block) + if err != nil { + if IsKnownBlockErr(err) { + continue + } + + chainlogger.Infof("block #%v process failed (%x)\n", block.Number, block.Hash()[:4]) + chainlogger.Infoln(block) + chainlogger.Infoln(err) + return err + } + + self.mu.Lock() + { + + self.write(block) + if td.Cmp(self.td) > 0 { + if block.Number.Cmp(new(big.Int).Add(self.currentBlock.Number, ethutil.Big1)) < 0 { + chainlogger.Infof("Split detected. New head #%v (%x), was #%v (%x)\n", block.Number, block.Hash()[:4], self.currentBlock.Number, self.currentBlock.Hash()[:4]) + } + + self.setTotalDifficulty(td) + self.insert(block) + self.transState = self.currentBlock.State().Copy() + } + + } + self.mu.Unlock() + + self.eventMux.Post(NewBlockEvent{block}) + self.eventMux.Post(messages) + } + + return nil +} diff --git a/core/chain_manager_test.go b/core/chain_manager_test.go new file mode 100644 index 000000000..52be8b0ea --- /dev/null +++ b/core/chain_manager_test.go @@ -0,0 +1,77 @@ +package core + +import ( + "fmt" + "path" + "runtime" + "testing" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/event" + //logpkg "github.com/ethereum/go-ethereum/logger" +) + +//var Logger logpkg.LogSystem +//var Log = logpkg.NewLogger("TEST") + +func init() { + runtime.GOMAXPROCS(runtime.NumCPU()) + //Logger = logpkg.NewStdLogSystem(os.Stdout, log.LstdFlags, logpkg.InfoLevel) + //logpkg.AddLogSystem(Logger) + + ethutil.ReadConfig("/tmp/ethtest", "/tmp/ethtest", "ETH") + + db, err := ethdb.NewMemDatabase() + if err != nil { + panic("Could not create mem-db, failing") + } + ethutil.Config.Db = db +} + +func loadChain(fn string, t *testing.T) types.Blocks { + c1, err := ethutil.ReadAllFile(path.Join("..", "_data", fn)) + if err != nil { + fmt.Println(err) + t.FailNow() + } + value := ethutil.NewValueFromBytes([]byte(c1)) + blocks := make(types.Blocks, value.Len()) + it := value.NewIterator() + for it.Next() { + blocks[it.Idx()] = types.NewBlockFromRlpValue(it.Value()) + } + + return blocks +} + +func insertChain(done chan bool, chainMan *ChainManager, chain types.Blocks, t *testing.T) { + err := chainMan.InsertChain(chain) + if err != nil { + fmt.Println(err) + t.FailNow() + } + done <- true +} + +func TestChainInsertions(t *testing.T) { + chain1 := loadChain("chain1", t) + chain2 := loadChain("chain2", t) + var eventMux event.TypeMux + chainMan := NewChainManager(&eventMux) + txPool := NewTxPool(chainMan, nil, &eventMux) + blockMan := NewBlockManager(txPool, chainMan, &eventMux) + chainMan.SetProcessor(blockMan) + + const max = 2 + done := make(chan bool, max) + + go insertChain(done, chainMan, chain1, t) + go insertChain(done, chainMan, chain2, t) + + for i := 0; i < max; i++ { + <-done + } + fmt.Println(chainMan.CurrentBlock()) +} diff --git a/core/dagger.go b/core/dagger.go new file mode 100644 index 000000000..3039d8995 --- /dev/null +++ b/core/dagger.go @@ -0,0 +1,160 @@ +package core + +import ( + "hash" + "math/big" + "math/rand" + "time" + + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/logger" + "github.com/obscuren/sha3" +) + +var powlogger = logger.NewLogger("POW") + +type Dagger struct { + hash *big.Int + xn *big.Int +} + +var Found bool + +func (dag *Dagger) Find(obj *big.Int, resChan chan int64) { + r := rand.New(rand.NewSource(time.Now().UnixNano())) + + for i := 0; i < 1000; i++ { + rnd := r.Int63() + + res := dag.Eval(big.NewInt(rnd)) + powlogger.Infof("rnd %v\nres %v\nobj %v\n", rnd, res, obj) + if res.Cmp(obj) < 0 { + // Post back result on the channel + resChan <- rnd + // Notify other threads we've found a valid nonce + Found = true + } + + // Break out if found + if Found { + break + } + } + + resChan <- 0 +} + +func (dag *Dagger) Search(hash, diff *big.Int) *big.Int { + // TODO fix multi threading. Somehow it results in the wrong nonce + amountOfRoutines := 1 + + dag.hash = hash + + obj := ethutil.BigPow(2, 256) + obj = obj.Div(obj, diff) + + Found = false + resChan := make(chan int64, 3) + var res int64 + + for k := 0; k < amountOfRoutines; k++ { + go dag.Find(obj, resChan) + + // Wait for each go routine to finish + } + for k := 0; k < amountOfRoutines; k++ { + // Get the result from the channel. 0 = quit + if r := <-resChan; r != 0 { + res = r + } + } + + return big.NewInt(res) +} + +func (dag *Dagger) Verify(hash, diff, nonce *big.Int) bool { + dag.hash = hash + + obj := ethutil.BigPow(2, 256) + obj = obj.Div(obj, diff) + + return dag.Eval(nonce).Cmp(obj) < 0 +} + +func DaggerVerify(hash, diff, nonce *big.Int) bool { + dagger := &Dagger{} + dagger.hash = hash + + obj := ethutil.BigPow(2, 256) + obj = obj.Div(obj, diff) + + return dagger.Eval(nonce).Cmp(obj) < 0 +} + +func (dag *Dagger) Node(L uint64, i uint64) *big.Int { + if L == i { + return dag.hash + } + + var m *big.Int + if L == 9 { + m = big.NewInt(16) + } else { + m = big.NewInt(3) + } + + sha := sha3.NewKeccak256() + sha.Reset() + d := sha3.NewKeccak256() + b := new(big.Int) + ret := new(big.Int) + + for k := 0; k < int(m.Uint64()); k++ { + d.Reset() + d.Write(dag.hash.Bytes()) + d.Write(dag.xn.Bytes()) + d.Write(big.NewInt(int64(L)).Bytes()) + d.Write(big.NewInt(int64(i)).Bytes()) + d.Write(big.NewInt(int64(k)).Bytes()) + + b.SetBytes(Sum(d)) + pk := b.Uint64() & ((1 << ((L - 1) * 3)) - 1) + sha.Write(dag.Node(L-1, pk).Bytes()) + } + + ret.SetBytes(Sum(sha)) + + return ret +} + +func Sum(sha hash.Hash) []byte { + //in := make([]byte, 32) + return sha.Sum(nil) +} + +func (dag *Dagger) Eval(N *big.Int) *big.Int { + pow := ethutil.BigPow(2, 26) + dag.xn = pow.Div(N, pow) + + sha := sha3.NewKeccak256() + sha.Reset() + ret := new(big.Int) + + for k := 0; k < 4; k++ { + d := sha3.NewKeccak256() + b := new(big.Int) + + d.Reset() + d.Write(dag.hash.Bytes()) + d.Write(dag.xn.Bytes()) + d.Write(N.Bytes()) + d.Write(big.NewInt(int64(k)).Bytes()) + + b.SetBytes(Sum(d)) + pk := (b.Uint64() & 0x1ffffff) + + sha.Write(dag.Node(9, pk).Bytes()) + } + + return ret.SetBytes(Sum(sha)) +} diff --git a/core/dagger_test.go b/core/dagger_test.go new file mode 100644 index 000000000..e80064e6b --- /dev/null +++ b/core/dagger_test.go @@ -0,0 +1,19 @@ +package core + +import ( + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/ethutil" +) + +func BenchmarkDaggerSearch(b *testing.B) { + hash := big.NewInt(0) + diff := ethutil.BigPow(2, 36) + o := big.NewInt(0) // nonce doesn't matter. We're only testing against speed, not validity + + // Reset timer so the big generation isn't included in the benchmark + b.ResetTimer() + // Validate + DaggerVerify(hash, diff, o) +} diff --git a/core/error.go b/core/error.go new file mode 100644 index 000000000..11d8c1653 --- /dev/null +++ b/core/error.go @@ -0,0 +1,141 @@ +package core + +import ( + "fmt" + "math/big" +) + +// Parent error. In case a parent is unknown this error will be thrown +// by the block manager +type ParentErr struct { + Message string +} + +func (err *ParentErr) Error() string { + return err.Message +} + +func ParentError(hash []byte) error { + return &ParentErr{Message: fmt.Sprintf("Block's parent unkown %x", hash)} +} + +func IsParentErr(err error) bool { + _, ok := err.(*ParentErr) + + return ok +} + +type UncleErr struct { + Message string +} + +func (err *UncleErr) Error() string { + return err.Message +} + +func UncleError(str string) error { + return &UncleErr{Message: str} +} + +func IsUncleErr(err error) bool { + _, ok := err.(*UncleErr) + + return ok +} + +// Block validation error. If any validation fails, this error will be thrown +type ValidationErr struct { + Message string +} + +func (err *ValidationErr) Error() string { + return err.Message +} + +func ValidationError(format string, v ...interface{}) *ValidationErr { + return &ValidationErr{Message: fmt.Sprintf(format, v...)} +} + +func IsValidationErr(err error) bool { + _, ok := err.(*ValidationErr) + + return ok +} + +type GasLimitErr struct { + Message string + Is, Max *big.Int +} + +func IsGasLimitErr(err error) bool { + _, ok := err.(*GasLimitErr) + + return ok +} +func (err *GasLimitErr) Error() string { + return err.Message +} +func GasLimitError(is, max *big.Int) *GasLimitErr { + return &GasLimitErr{Message: fmt.Sprintf("GasLimit error. Max %s, transaction would take it to %s", max, is), Is: is, Max: max} +} + +type NonceErr struct { + Message string + Is, Exp uint64 +} + +func (err *NonceErr) Error() string { + return err.Message +} + +func NonceError(is, exp uint64) *NonceErr { + return &NonceErr{Message: fmt.Sprintf("Nonce err. Is %d, expected %d", is, exp), Is: is, Exp: exp} +} + +func IsNonceErr(err error) bool { + _, ok := err.(*NonceErr) + + return ok +} + +type OutOfGasErr struct { + Message string +} + +func OutOfGasError() *OutOfGasErr { + return &OutOfGasErr{Message: "Out of gas"} +} +func (self *OutOfGasErr) Error() string { + return self.Message +} + +func IsOutOfGasErr(err error) bool { + _, ok := err.(*OutOfGasErr) + + return ok +} + +type TDError struct { + a, b *big.Int +} + +func (self *TDError) Error() string { + return fmt.Sprintf("incoming chain has a lower or equal TD (%v <= %v)", self.a, self.b) +} +func IsTDError(e error) bool { + _, ok := e.(*TDError) + return ok +} + +type KnownBlockError struct { + number *big.Int + hash []byte +} + +func (self *KnownBlockError) Error() string { + return fmt.Sprintf("block %v already known (%x)", self.number, self.hash[0:4]) +} +func IsKnownBlockErr(e error) bool { + _, ok := e.(*KnownBlockError) + return ok +} diff --git a/core/events.go b/core/events.go new file mode 100644 index 000000000..deeba3e98 --- /dev/null +++ b/core/events.go @@ -0,0 +1,12 @@ +package core + +import "github.com/ethereum/go-ethereum/core/types" + +// TxPreEvent is posted when a transaction enters the transaction pool. +type TxPreEvent struct{ Tx *types.Transaction } + +// TxPostEvent is posted when a transaction has been processed. +type TxPostEvent struct{ Tx *types.Transaction } + +// NewBlockEvent is posted when a block has been imported. +type NewBlockEvent struct{ Block *types.Block } diff --git a/core/execution.go b/core/execution.go new file mode 100644 index 000000000..b7eead0dd --- /dev/null +++ b/core/execution.go @@ -0,0 +1,71 @@ +package core + +import ( + "fmt" + "math/big" + "time" + + "github.com/ethereum/go-ethereum/state" + "github.com/ethereum/go-ethereum/vm" +) + +type Execution struct { + env vm.Environment + address, input []byte + Gas, price, value *big.Int + SkipTransfer bool +} + +func NewExecution(env vm.Environment, address, input []byte, gas, gasPrice, value *big.Int) *Execution { + return &Execution{env: env, address: address, input: input, Gas: gas, price: gasPrice, value: value} +} + +func (self *Execution) Addr() []byte { + return self.address +} + +func (self *Execution) Call(codeAddr []byte, caller vm.ClosureRef) ([]byte, error) { + // Retrieve the executing code + code := self.env.State().GetCode(codeAddr) + + return self.exec(code, codeAddr, caller) +} + +func (self *Execution) exec(code, contextAddr []byte, caller vm.ClosureRef) (ret []byte, err error) { + env := self.env + evm := vm.New(env, vm.DebugVmTy) + + if env.Depth() == vm.MaxCallDepth { + // Consume all gas (by not returning it) and return a depth error + return nil, vm.DepthError{} + } + + from, to := env.State().GetStateObject(caller.Address()), env.State().GetOrNewStateObject(self.address) + // Skipping transfer is used on testing for the initial call + if !self.SkipTransfer { + err = env.Transfer(from, to, self.value) + if err != nil { + caller.ReturnGas(self.Gas, self.price) + + err = fmt.Errorf("Insufficient funds to transfer value. Req %v, has %v", self.value, from.Balance) + return + } + } + + snapshot := env.State().Copy() + start := time.Now() + ret, err = evm.Run(to, caller, code, self.value, self.Gas, self.price, self.input) + if err != nil { + env.State().Set(snapshot) + } + chainlogger.Debugf("vm took %v\n", time.Since(start)) + + return +} + +func (self *Execution) Create(caller vm.ClosureRef) (ret []byte, err error, account *state.StateObject) { + ret, err = self.exec(self.input, nil, caller) + account = self.env.State().GetStateObject(self.address) + + return +} diff --git a/core/fees.go b/core/fees.go new file mode 100644 index 000000000..bbce01b84 --- /dev/null +++ b/core/fees.go @@ -0,0 +1,7 @@ +package core + +import ( + "math/big" +) + +var BlockReward *big.Int = big.NewInt(1.5e+18) diff --git a/core/filter.go b/core/filter.go new file mode 100644 index 000000000..fb992782d --- /dev/null +++ b/core/filter.go @@ -0,0 +1,200 @@ +package core + +import ( + "bytes" + "math" + "math/big" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/state" +) + +type AccountChange struct { + Address, StateAddress []byte +} + +// Filtering interface +type Filter struct { + eth EthManager + earliest int64 + latest int64 + skip int + from, to [][]byte + max int + + Altered []AccountChange + + BlockCallback func(*types.Block) + MessageCallback func(state.Messages) +} + +// Create a new filter which uses a bloom filter on blocks to figure out whether a particular block +// is interesting or not. +func NewFilter(eth EthManager) *Filter { + return &Filter{eth: eth} +} + +func (self *Filter) AddAltered(address, stateAddress []byte) { + self.Altered = append(self.Altered, AccountChange{address, stateAddress}) +} + +// Set the earliest and latest block for filtering. +// -1 = latest block (i.e., the current block) +// hash = particular hash from-to +func (self *Filter) SetEarliestBlock(earliest int64) { + self.earliest = earliest +} + +func (self *Filter) SetLatestBlock(latest int64) { + self.latest = latest +} + +func (self *Filter) SetFrom(addr [][]byte) { + self.from = addr +} + +func (self *Filter) AddFrom(addr []byte) { + self.from = append(self.from, addr) +} + +func (self *Filter) SetTo(addr [][]byte) { + self.to = addr +} + +func (self *Filter) AddTo(addr []byte) { + self.to = append(self.to, addr) +} + +func (self *Filter) SetMax(max int) { + self.max = max +} + +func (self *Filter) SetSkip(skip int) { + self.skip = skip +} + +// Run filters messages with the current parameters set +func (self *Filter) Find() []*state.Message { + var earliestBlockNo uint64 = uint64(self.earliest) + if self.earliest == -1 { + earliestBlockNo = self.eth.ChainManager().CurrentBlock().Number.Uint64() + } + var latestBlockNo uint64 = uint64(self.latest) + if self.latest == -1 { + latestBlockNo = self.eth.ChainManager().CurrentBlock().Number.Uint64() + } + + var ( + messages []*state.Message + block = self.eth.ChainManager().GetBlockByNumber(latestBlockNo) + quit bool + ) + for i := 0; !quit && block != nil; i++ { + // Quit on latest + switch { + case block.Number.Uint64() == earliestBlockNo, block.Number.Uint64() == 0: + quit = true + case self.max <= len(messages): + break + } + + // Use bloom filtering to see if this block is interesting given the + // current parameters + if self.bloomFilter(block) { + // Get the messages of the block + msgs, err := self.eth.BlockManager().GetMessages(block) + if err != nil { + chainlogger.Warnln("err: filter get messages ", err) + + break + } + + messages = append(messages, self.FilterMessages(msgs)...) + } + + block = self.eth.ChainManager().GetBlock(block.PrevHash) + } + + skip := int(math.Min(float64(len(messages)), float64(self.skip))) + + return messages[skip:] +} + +func includes(addresses [][]byte, a []byte) (found bool) { + for _, addr := range addresses { + if bytes.Compare(addr, a) == 0 { + return true + } + } + + return +} + +func (self *Filter) FilterMessages(msgs []*state.Message) []*state.Message { + var messages []*state.Message + + // Filter the messages for interesting stuff + for _, message := range msgs { + if len(self.to) > 0 && !includes(self.to, message.To) { + continue + } + + if len(self.from) > 0 && !includes(self.from, message.From) { + continue + } + + var match bool + if len(self.Altered) == 0 { + match = true + } + + for _, accountChange := range self.Altered { + if len(accountChange.Address) > 0 && bytes.Compare(message.To, accountChange.Address) != 0 { + continue + } + + if len(accountChange.StateAddress) > 0 && !includes(message.ChangedAddresses, accountChange.StateAddress) { + continue + } + + match = true + break + } + + if !match { + continue + } + + messages = append(messages, message) + } + + return messages +} + +func (self *Filter) bloomFilter(block *types.Block) bool { + var fromIncluded, toIncluded bool + if len(self.from) > 0 { + for _, from := range self.from { + if types.BloomLookup(block.LogsBloom, from) || bytes.Equal(block.Coinbase, from) { + fromIncluded = true + break + } + } + } else { + fromIncluded = true + } + + if len(self.to) > 0 { + for _, to := range self.to { + if types.BloomLookup(block.LogsBloom, ethutil.U256(new(big.Int).Add(ethutil.Big1, ethutil.BigD(to))).Bytes()) || bytes.Equal(block.Coinbase, to) { + toIncluded = true + break + } + } + } else { + toIncluded = true + } + + return fromIncluded && toIncluded +} diff --git a/core/filter_test.go b/core/filter_test.go new file mode 100644 index 000000000..9a8bc9592 --- /dev/null +++ b/core/filter_test.go @@ -0,0 +1 @@ +package core diff --git a/core/genesis.go b/core/genesis.go new file mode 100644 index 000000000..707154759 --- /dev/null +++ b/core/genesis.go @@ -0,0 +1,52 @@ +package core + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethutil" +) + +/* + * This is the special genesis block. + */ + +var ZeroHash256 = make([]byte, 32) +var ZeroHash160 = make([]byte, 20) +var ZeroHash512 = make([]byte, 64) +var EmptyShaList = crypto.Sha3(ethutil.Encode([]interface{}{})) +var EmptyListRoot = crypto.Sha3(ethutil.Encode("")) + +var GenesisHeader = []interface{}{ + // Previous hash (none) + ZeroHash256, + // Empty uncles + EmptyShaList, + // Coinbase + ZeroHash160, + // Root state + EmptyShaList, + // tx root + EmptyListRoot, + // receipt root + EmptyListRoot, + // bloom + ZeroHash512, + // Difficulty + //ethutil.BigPow(2, 22), + big.NewInt(131072), + // Number + ethutil.Big0, + // Block upper gas bound + big.NewInt(1000000), + // Block gas used + ethutil.Big0, + // Time + ethutil.Big0, + // Extra + nil, + // Nonce + crypto.Sha3(big.NewInt(42).Bytes()), +} + +var Genesis = []interface{}{GenesisHeader, []interface{}{}, []interface{}{}} diff --git a/core/helper_test.go b/core/helper_test.go new file mode 100644 index 000000000..b340144fd --- /dev/null +++ b/core/helper_test.go @@ -0,0 +1,93 @@ +package core + +import ( + "container/list" + "fmt" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/wire" +) + +// Implement our EthTest Manager +type TestManager struct { + // stateManager *StateManager + eventMux *event.TypeMux + + db ethutil.Database + txPool *TxPool + blockChain *ChainManager + Blocks []*types.Block +} + +func (s *TestManager) IsListening() bool { + return false +} + +func (s *TestManager) IsMining() bool { + return false +} + +func (s *TestManager) PeerCount() int { + return 0 +} + +func (s *TestManager) Peers() *list.List { + return list.New() +} + +func (s *TestManager) ChainManager() *ChainManager { + return s.blockChain +} + +func (tm *TestManager) TxPool() *TxPool { + return tm.txPool +} + +// func (tm *TestManager) StateManager() *StateManager { +// return tm.stateManager +// } + +func (tm *TestManager) EventMux() *event.TypeMux { + return tm.eventMux +} +func (tm *TestManager) Broadcast(msgType wire.MsgType, data []interface{}) { + fmt.Println("Broadcast not implemented") +} + +func (tm *TestManager) ClientIdentity() wire.ClientIdentity { + return nil +} +func (tm *TestManager) KeyManager() *crypto.KeyManager { + return nil +} + +func (tm *TestManager) Db() ethutil.Database { + return tm.db +} + +func NewTestManager() *TestManager { + ethutil.ReadConfig(".ethtest", "/tmp/ethtest", "ETH") + + db, err := ethdb.NewMemDatabase() + if err != nil { + fmt.Println("Could not create mem-db, failing") + return nil + } + ethutil.Config.Db = db + + testManager := &TestManager{} + testManager.eventMux = new(event.TypeMux) + testManager.db = db + // testManager.txPool = NewTxPool(testManager) + // testManager.blockChain = NewChainManager(testManager) + // testManager.stateManager = NewStateManager(testManager) + + // Start the tx pool + testManager.txPool.Start() + + return testManager +} diff --git a/core/simple_pow.go b/core/simple_pow.go new file mode 100644 index 000000000..9a8bc9592 --- /dev/null +++ b/core/simple_pow.go @@ -0,0 +1 @@ +package core diff --git a/core/state_transition.go b/core/state_transition.go new file mode 100644 index 000000000..7b7026c29 --- /dev/null +++ b/core/state_transition.go @@ -0,0 +1,238 @@ +package core + +import ( + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/state" + "github.com/ethereum/go-ethereum/vm" +) + +/* + * The State transitioning model + * + * A state transition is a change made when a transaction is applied to the current world state + * The state transitioning model does all all the necessary work to work out a valid new state root. + * 1) Nonce handling + * 2) Pre pay / buy gas of the coinbase (miner) + * 3) Create a new state object if the recipient is \0*32 + * 4) Value transfer + * == If contract creation == + * 4a) Attempt to run transaction data + * 4b) If valid, use result as code for the new state object + * == end == + * 5) Run Script section + * 6) Derive new state root + */ +type StateTransition struct { + coinbase, receiver []byte + msg Message + gas, gasPrice *big.Int + initialGas *big.Int + value *big.Int + data []byte + state *state.StateDB + block *types.Block + + cb, rec, sen *state.StateObject + + Env vm.Environment +} + +type Message interface { + Hash() []byte + + From() []byte + To() []byte + + GasPrice() *big.Int + Gas() *big.Int + Value() *big.Int + + Nonce() uint64 + Data() []byte +} + +func AddressFromMessage(msg Message) []byte { + // Generate a new address + return crypto.Sha3(ethutil.NewValue([]interface{}{msg.From(), msg.Nonce()}).Encode())[12:] +} + +func MessageCreatesContract(msg Message) bool { + return len(msg.To()) == 0 +} + +func MessageGasValue(msg Message) *big.Int { + return new(big.Int).Mul(msg.Gas(), msg.GasPrice()) +} + +func NewStateTransition(coinbase *state.StateObject, msg Message, state *state.StateDB, block *types.Block) *StateTransition { + return &StateTransition{coinbase.Address(), msg.To(), msg, new(big.Int), new(big.Int).Set(msg.GasPrice()), new(big.Int), msg.Value(), msg.Data(), state, block, coinbase, nil, nil, nil} +} + +func (self *StateTransition) VmEnv() vm.Environment { + if self.Env == nil { + self.Env = NewEnv(self.state, self.msg, self.block) + } + + return self.Env +} + +func (self *StateTransition) Coinbase() *state.StateObject { + return self.state.GetOrNewStateObject(self.coinbase) +} +func (self *StateTransition) From() *state.StateObject { + return self.state.GetOrNewStateObject(self.msg.From()) +} +func (self *StateTransition) To() *state.StateObject { + if self.msg != nil && MessageCreatesContract(self.msg) { + return nil + } + return self.state.GetOrNewStateObject(self.msg.To()) +} + +func (self *StateTransition) UseGas(amount *big.Int) error { + if self.gas.Cmp(amount) < 0 { + return OutOfGasError() + } + self.gas.Sub(self.gas, amount) + + return nil +} + +func (self *StateTransition) AddGas(amount *big.Int) { + self.gas.Add(self.gas, amount) +} + +func (self *StateTransition) BuyGas() error { + var err error + + sender := self.From() + if sender.Balance().Cmp(MessageGasValue(self.msg)) < 0 { + return fmt.Errorf("insufficient ETH for gas (%x). Req %v, has %v", sender.Address()[:4], MessageGasValue(self.msg), sender.Balance()) + } + + coinbase := self.Coinbase() + err = coinbase.BuyGas(self.msg.Gas(), self.msg.GasPrice()) + if err != nil { + return err + } + + self.AddGas(self.msg.Gas()) + self.initialGas.Set(self.msg.Gas()) + sender.SubAmount(MessageGasValue(self.msg)) + + return nil +} + +func (self *StateTransition) preCheck() (err error) { + var ( + msg = self.msg + sender = self.From() + ) + + // Make sure this transaction's nonce is correct + if sender.Nonce != msg.Nonce() { + return NonceError(msg.Nonce(), sender.Nonce) + } + + // Pre-pay gas / Buy gas of the coinbase account + if err = self.BuyGas(); err != nil { + return err + } + + return nil +} + +func (self *StateTransition) TransitionState() (ret []byte, err error) { + statelogger.Debugf("(~) %x\n", self.msg.Hash()) + + // XXX Transactions after this point are considered valid. + if err = self.preCheck(); err != nil { + return + } + + var ( + msg = self.msg + sender = self.From() + ) + + defer self.RefundGas() + + // Increment the nonce for the next transaction + sender.Nonce += 1 + + // Transaction gas + if err = self.UseGas(vm.GasTx); err != nil { + return + } + + // Pay data gas + var dgas int64 + for _, byt := range self.data { + if byt != 0 { + dgas += vm.GasData.Int64() + } else { + dgas += 1 // This is 1/5. If GasData changes this fails + } + } + if err = self.UseGas(big.NewInt(dgas)); err != nil { + return + } + + vmenv := self.VmEnv() + var ref vm.ClosureRef + if MessageCreatesContract(msg) { + contract := MakeContract(msg, self.state) + ret, err, ref = vmenv.Create(sender, contract.Address(), self.msg.Data(), self.gas, self.gasPrice, self.value) + if err == nil { + dataGas := big.NewInt(int64(len(ret))) + dataGas.Mul(dataGas, vm.GasCreateByte) + if err = self.UseGas(dataGas); err == nil { + //self.state.SetCode(ref.Address(), ret) + ref.SetCode(ret) + } + } + } else { + ret, err = vmenv.Call(self.From(), self.To().Address(), self.msg.Data(), self.gas, self.gasPrice, self.value) + } + + if err != nil { + self.UseGas(self.gas) + } + + return +} + +// Converts an transaction in to a state object +func MakeContract(msg Message, state *state.StateDB) *state.StateObject { + addr := AddressFromMessage(msg) + + contract := state.GetOrNewStateObject(addr) + contract.InitCode = msg.Data() + + return contract +} + +func (self *StateTransition) RefundGas() { + coinbase, sender := self.Coinbase(), self.From() + // Return remaining gas + remaining := new(big.Int).Mul(self.gas, self.msg.GasPrice()) + sender.AddAmount(remaining) + + uhalf := new(big.Int).Div(self.GasUsed(), ethutil.Big2) + for addr, ref := range self.state.Refunds() { + refund := ethutil.BigMin(uhalf, ref) + self.gas.Add(self.gas, refund) + self.state.AddBalance([]byte(addr), refund.Mul(refund, self.msg.GasPrice())) + } + + coinbase.RefundGas(self.gas, self.msg.GasPrice()) +} + +func (self *StateTransition) GasUsed() *big.Int { + return new(big.Int).Sub(self.initialGas, self.gas) +} diff --git a/core/transaction_pool.go b/core/transaction_pool.go new file mode 100644 index 000000000..58c2255a4 --- /dev/null +++ b/core/transaction_pool.go @@ -0,0 +1,233 @@ +package core + +import ( + "bytes" + "container/list" + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/state" + "github.com/ethereum/go-ethereum/wire" +) + +var txplogger = logger.NewLogger("TXP") + +const txPoolQueueSize = 50 + +type TxPoolHook chan *types.Transaction +type TxMsgTy byte + +const ( + minGasPrice = 1000000 +) + +var MinGasPrice = big.NewInt(10000000000000) + +type TxMsg struct { + Tx *types.Transaction + Type TxMsgTy +} + +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.(*types.Transaction), e) { + break + } + } +} + +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.(*types.Transaction); ok { + if finder(tx, e) { + return tx + } + } + } + + return nil +} + +type TxProcessor interface { + ProcessTransaction(tx *types.Transaction) +} + +// The tx pool a thread safe transaction pool handler. In order to +// guarantee a non blocking pool we use a queue channel which can be +// independently read without needing access to the actual pool. If the +// pool is being drained or synced for whatever reason the transactions +// will simple queue up and handled when the mutex is freed. +type TxPool struct { + // The mutex for accessing the Tx pool. + mutex sync.Mutex + // Queueing channel for reading and writing incoming + // transactions to + queueChan chan *types.Transaction + // Quiting channel + quit chan bool + // The actual pool + pool *list.List + + SecondaryProcessor TxProcessor + + subscribers []chan TxMsg + + broadcaster types.Broadcaster + chainManager *ChainManager + eventMux *event.TypeMux +} + +func NewTxPool(chainManager *ChainManager, broadcaster types.Broadcaster, eventMux *event.TypeMux) *TxPool { + return &TxPool{ + pool: list.New(), + queueChan: make(chan *types.Transaction, txPoolQueueSize), + quit: make(chan bool), + chainManager: chainManager, + eventMux: eventMux, + broadcaster: broadcaster, + } +} + +// Blocking function. Don't use directly. Use QueueTransaction instead +func (pool *TxPool) addTransaction(tx *types.Transaction) { + pool.mutex.Lock() + defer pool.mutex.Unlock() + + pool.pool.PushBack(tx) + + // Broadcast the transaction to the rest of the peers + pool.broadcaster.Broadcast(wire.MsgTxTy, []interface{}{tx.RlpData()}) +} + +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.chainManager.CurrentBlock + // Something has gone horribly wrong if this happens + if block == nil { + return fmt.Errorf("No last block on the block chain") + } + + if len(tx.To()) != 0 && len(tx.To()) != 20 { + return fmt.Errorf("Invalid recipient. len = %d", len(tx.To())) + } + + v, _, _ := tx.Curve() + if v > 28 || v < 27 { + return fmt.Errorf("tx.v != (28 || 27)") + } + + // Get the sender + sender := pool.chainManager.State().GetAccount(tx.Sender()) + + totAmount := new(big.Int).Set(tx.Value()) + // Make sure there's enough in the sender's account. Having insufficient + // funds won't invalidate this transaction but simple ignores it. + if sender.Balance().Cmp(totAmount) < 0 { + return fmt.Errorf("Insufficient amount in sender's (%x) account", tx.From()) + } + + // Increment the nonce making each tx valid only once to prevent replay + // attacks + + return nil +} + +func (self *TxPool) Add(tx *types.Transaction) error { + hash := tx.Hash() + foundTx := FindTx(self.pool, func(tx *types.Transaction, e *list.Element) bool { + return bytes.Compare(tx.Hash(), hash) == 0 + }) + + if foundTx != nil { + return fmt.Errorf("Known transaction (%x)", hash[0:4]) + } + + err := self.ValidateTransaction(tx) + if err != nil { + return err + } + + self.addTransaction(tx) + + txplogger.Debugf("(t) %x => %x (%v) %x\n", tx.From()[:4], tx.To()[:4], tx.Value, tx.Hash()) + + // Notify the subscribers + go self.eventMux.Post(TxPreEvent{tx}) + + return nil +} + +func (self *TxPool) Size() int { + return self.pool.Len() +} + +func (pool *TxPool) CurrentTransactions() []*types.Transaction { + pool.mutex.Lock() + defer pool.mutex.Unlock() + + txList := make([]*types.Transaction, pool.pool.Len()) + i := 0 + for e := pool.pool.Front(); e != nil; e = e.Next() { + tx := e.Value.(*types.Transaction) + + txList[i] = tx + + i++ + } + + return txList +} + +func (pool *TxPool) RemoveInvalid(state *state.StateDB) { + pool.mutex.Lock() + defer pool.mutex.Unlock() + + for e := pool.pool.Front(); e != nil; e = e.Next() { + tx := e.Value.(*types.Transaction) + sender := state.GetAccount(tx.Sender()) + err := pool.ValidateTransaction(tx) + if err != nil || sender.Nonce >= tx.Nonce() { + pool.pool.Remove(e) + } + } +} + +func (self *TxPool) RemoveSet(txs types.Transactions) { + self.mutex.Lock() + defer self.mutex.Unlock() + + for _, tx := range txs { + EachTx(self.pool, func(t *types.Transaction, element *list.Element) bool { + if t == tx { + self.pool.Remove(element) + return true // To stop the loop + } + return false + }) + } +} + +func (pool *TxPool) Flush() []*types.Transaction { + txList := pool.CurrentTransactions() + + // Recreate a new list all together + // XXX Is this the fastest way? + pool.pool = list.New() + + return txList +} + +func (pool *TxPool) Start() { + //go pool.queueHandler() +} + +func (pool *TxPool) Stop() { + pool.Flush() + + txplogger.Infoln("Stopped") +} diff --git a/core/types/block.go b/core/types/block.go new file mode 100644 index 000000000..2d889f35f --- /dev/null +++ b/core/types/block.go @@ -0,0 +1,416 @@ +package types + +import ( + "bytes" + "fmt" + "math/big" + "sort" + "time" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/state" + "github.com/ethereum/go-ethereum/trie" +) + +type BlockInfo struct { + Number uint64 + Hash []byte + Parent []byte + TD *big.Int +} + +func (bi *BlockInfo) RlpDecode(data []byte) { + decoder := ethutil.NewValueFromBytes(data) + + bi.Number = decoder.Get(0).Uint() + bi.Hash = decoder.Get(1).Bytes() + bi.Parent = decoder.Get(2).Bytes() + bi.TD = decoder.Get(3).BigInt() +} + +func (bi *BlockInfo) RlpEncode() []byte { + return ethutil.Encode([]interface{}{bi.Number, bi.Hash, bi.Parent, bi.TD}) +} + +type Blocks []*Block + +func (self Blocks) AsSet() ethutil.UniqueSet { + set := make(ethutil.UniqueSet) + for _, block := range self { + set.Insert(block.Hash()) + } + + return set +} + +type BlockBy func(b1, b2 *Block) bool + +func (self BlockBy) Sort(blocks Blocks) { + bs := blockSorter{ + blocks: blocks, + by: self, + } + sort.Sort(bs) +} + +type blockSorter struct { + blocks Blocks + by func(b1, b2 *Block) bool +} + +func (self blockSorter) Len() int { return len(self.blocks) } +func (self blockSorter) Swap(i, j int) { + self.blocks[i], self.blocks[j] = self.blocks[j], self.blocks[i] +} +func (self blockSorter) Less(i, j int) bool { return self.by(self.blocks[i], self.blocks[j]) } + +func Number(b1, b2 *Block) bool { return b1.Number.Cmp(b2.Number) < 0 } + +type Block struct { + // Hash to the previous block + PrevHash ethutil.Bytes + // Uncles of this block + Uncles Blocks + UncleSha []byte + // The coin base address + Coinbase []byte + // Block Trie state + //state *ethutil.Trie + state *state.StateDB + // Difficulty for the current block + Difficulty *big.Int + // Creation time + Time int64 + // The block number + Number *big.Int + // Gas limit + GasLimit *big.Int + // Gas used + GasUsed *big.Int + // Extra data + Extra string + // Block Nonce for verification + Nonce ethutil.Bytes + // List of transactions and/or contracts + transactions Transactions + receipts Receipts + TxSha, ReceiptSha []byte + LogsBloom []byte + + Reward *big.Int +} + +func NewBlockFromBytes(raw []byte) *Block { + block := &Block{} + block.RlpDecode(raw) + + return block +} + +// New block takes a raw encoded string +func NewBlockFromRlpValue(rlpValue *ethutil.Value) *Block { + block := &Block{} + block.RlpValueDecode(rlpValue) + + return block +} + +func CreateBlock(root interface{}, + prevHash []byte, + base []byte, + Difficulty *big.Int, + Nonce []byte, + extra string) *Block { + + block := &Block{ + PrevHash: prevHash, + Coinbase: base, + Difficulty: Difficulty, + Nonce: Nonce, + Time: time.Now().Unix(), + Extra: extra, + UncleSha: nil, + GasUsed: new(big.Int), + GasLimit: new(big.Int), + } + block.SetUncles([]*Block{}) + + block.state = state.New(trie.New(ethutil.Config.Db, root)) + + return block +} + +// Returns a hash of the block +func (block *Block) Hash() ethutil.Bytes { + return crypto.Sha3(ethutil.NewValue(block.header()).Encode()) + //return crypto.Sha3(block.Value().Encode()) +} + +func (block *Block) HashNoNonce() []byte { + return crypto.Sha3(ethutil.Encode(block.miningHeader())) +} + +func (block *Block) State() *state.StateDB { + return block.state +} + +func (block *Block) Transactions() Transactions { + return block.transactions +} + +func (block *Block) CalcGasLimit(parent *Block) *big.Int { + if block.Number.Cmp(big.NewInt(0)) == 0 { + return ethutil.BigPow(10, 6) + } + + // ((1024-1) * parent.gasLimit + (gasUsed * 6 / 5)) / 1024 + + previous := new(big.Int).Mul(big.NewInt(1024-1), parent.GasLimit) + current := new(big.Rat).Mul(new(big.Rat).SetInt(parent.GasUsed), big.NewRat(6, 5)) + curInt := new(big.Int).Div(current.Num(), current.Denom()) + + result := new(big.Int).Add(previous, curInt) + result.Div(result, big.NewInt(1024)) + + min := big.NewInt(125000) + + return ethutil.BigMax(min, result) +} + +func (block *Block) BlockInfo() BlockInfo { + bi := BlockInfo{} + data, _ := ethutil.Config.Db.Get(append(block.Hash(), []byte("Info")...)) + bi.RlpDecode(data) + + return bi +} + +func (self *Block) GetTransaction(hash []byte) *Transaction { + for _, tx := range self.transactions { + if bytes.Compare(tx.Hash(), hash) == 0 { + return tx + } + } + + return nil +} + +// Sync the block's state and contract respectively +func (block *Block) Sync() { + block.state.Sync() +} + +func (block *Block) Undo() { + // Sync the block state itself + block.state.Reset() +} + +/////// Block Encoding +func (block *Block) rlpReceipts() interface{} { + // Marshal the transactions of this block + encR := make([]interface{}, len(block.receipts)) + for i, r := range block.receipts { + // Cast it to a string (safe) + encR[i] = r.RlpData() + } + + return encR +} + +func (block *Block) rlpUncles() interface{} { + // Marshal the transactions of this block + uncles := make([]interface{}, len(block.Uncles)) + for i, uncle := range block.Uncles { + // Cast it to a string (safe) + uncles[i] = uncle.header() + } + + return uncles +} + +func (block *Block) SetUncles(uncles []*Block) { + block.Uncles = uncles + block.UncleSha = crypto.Sha3(ethutil.Encode(block.rlpUncles())) +} + +func (self *Block) SetReceipts(receipts Receipts) { + self.receipts = receipts + self.ReceiptSha = DeriveSha(receipts) + self.LogsBloom = CreateBloom(receipts) +} + +func (self *Block) SetTransactions(txs Transactions) { + self.transactions = txs + self.TxSha = DeriveSha(txs) +} + +func (block *Block) Value() *ethutil.Value { + return ethutil.NewValue([]interface{}{block.header(), block.transactions, block.rlpUncles()}) +} + +func (block *Block) RlpEncode() []byte { + // Encode a slice interface which contains the header and the list of + // transactions. + return block.Value().Encode() +} + +func (block *Block) RlpDecode(data []byte) { + rlpValue := ethutil.NewValueFromBytes(data) + block.RlpValueDecode(rlpValue) +} + +func (block *Block) RlpValueDecode(decoder *ethutil.Value) { + block.setHeader(decoder.Get(0)) + + // Tx list might be empty if this is an uncle. Uncles only have their + // header set. + if decoder.Get(1).IsNil() == false { // Yes explicitness + //receipts := decoder.Get(1) + //block.receipts = make([]*Receipt, receipts.Len()) + txs := decoder.Get(1) + block.transactions = make(Transactions, txs.Len()) + for i := 0; i < txs.Len(); i++ { + block.transactions[i] = NewTransactionFromValue(txs.Get(i)) + //receipt := NewRecieptFromValue(receipts.Get(i)) + //block.transactions[i] = receipt.Tx + //block.receipts[i] = receipt + } + + } + + if decoder.Get(2).IsNil() == false { // Yes explicitness + uncles := decoder.Get(2) + block.Uncles = make([]*Block, uncles.Len()) + for i := 0; i < uncles.Len(); i++ { + block.Uncles[i] = NewUncleBlockFromValue(uncles.Get(i)) + } + } + +} + +func (self *Block) setHeader(header *ethutil.Value) { + self.PrevHash = header.Get(0).Bytes() + self.UncleSha = header.Get(1).Bytes() + self.Coinbase = header.Get(2).Bytes() + self.state = state.New(trie.New(ethutil.Config.Db, header.Get(3).Val)) + self.TxSha = header.Get(4).Bytes() + self.ReceiptSha = header.Get(5).Bytes() + self.LogsBloom = header.Get(6).Bytes() + self.Difficulty = header.Get(7).BigInt() + self.Number = header.Get(8).BigInt() + self.GasLimit = header.Get(9).BigInt() + self.GasUsed = header.Get(10).BigInt() + self.Time = int64(header.Get(11).BigInt().Uint64()) + self.Extra = header.Get(12).Str() + self.Nonce = header.Get(13).Bytes() +} + +func NewUncleBlockFromValue(header *ethutil.Value) *Block { + block := &Block{} + block.setHeader(header) + + return block +} + +func (block *Block) Trie() *trie.Trie { + return block.state.Trie +} + +func (block *Block) Root() interface{} { + return block.state.Root() +} + +func (block *Block) Diff() *big.Int { + return block.Difficulty +} + +func (self *Block) Receipts() []*Receipt { + return self.receipts +} + +func (block *Block) miningHeader() []interface{} { + return []interface{}{ + // Sha of the previous block + block.PrevHash, + // Sha of uncles + block.UncleSha, + // Coinbase address + block.Coinbase, + // root state + block.Root(), + // tx root + block.TxSha, + // Sha of tx + block.ReceiptSha, + // Bloom + block.LogsBloom, + // Current block Difficulty + block.Difficulty, + // The block number + block.Number, + // Block upper gas bound + block.GasLimit, + // Block gas used + block.GasUsed, + // Time the block was found? + block.Time, + // Extra data + block.Extra, + } +} + +func (block *Block) header() []interface{} { + return append(block.miningHeader(), block.Nonce) +} + +func (block *Block) String() string { + return fmt.Sprintf(` + BLOCK(%x): Size: %v + PrevHash: %x + UncleSha: %x + Coinbase: %x + Root: %x + TxSha %x + ReceiptSha: %x + Bloom: %x + Difficulty: %v + Number: %v + MaxLimit: %v + GasUsed: %v + Time: %v + Extra: %v + Nonce: %x + NumTx: %v +`, + block.Hash(), + block.Size(), + block.PrevHash, + block.UncleSha, + block.Coinbase, + block.Root(), + block.TxSha, + block.ReceiptSha, + block.LogsBloom, + block.Difficulty, + block.Number, + block.GasLimit, + block.GasUsed, + block.Time, + block.Extra, + block.Nonce, + len(block.transactions), + ) +} + +func (self *Block) Size() ethutil.StorageSize { + return ethutil.StorageSize(len(self.RlpEncode())) +} + +// Implement RlpEncodable +func (self *Block) RlpData() interface{} { + return []interface{}{self.header(), self.transactions, self.rlpUncles()} +} + +// Implement pow.Block +func (self *Block) N() []byte { return self.Nonce } diff --git a/core/types/bloom9.go b/core/types/bloom9.go new file mode 100644 index 000000000..c1841e553 --- /dev/null +++ b/core/types/bloom9.go @@ -0,0 +1,54 @@ +package types + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/state" +) + +func CreateBloom(receipts Receipts) []byte { + bin := new(big.Int) + for _, receipt := range receipts { + bin.Or(bin, LogsBloom(receipt.logs)) + } + + return ethutil.LeftPadBytes(bin.Bytes(), 64) +} + +func LogsBloom(logs state.Logs) *big.Int { + bin := new(big.Int) + for _, log := range logs { + data := make([][]byte, len(log.Topics())+1) + data[0] = log.Address() + + for i, topic := range log.Topics() { + data[i+1] = topic + } + + for _, b := range data { + bin.Or(bin, ethutil.BigD(bloom9(crypto.Sha3(b)).Bytes())) + } + } + + return bin +} + +func bloom9(b []byte) *big.Int { + r := new(big.Int) + for _, i := range []int{0, 2, 4} { + t := big.NewInt(1) + b := uint(b[i+1]) + 256*(uint(b[i])&1) + r.Or(r, t.Lsh(t, b)) + } + + return r +} + +func BloomLookup(bin, topic []byte) bool { + bloom := ethutil.BigD(bin) + cmp := bloom9(crypto.Sha3(topic)) + + return bloom.And(bloom, cmp).Cmp(cmp) == 0 +} diff --git a/core/types/bloom9_test.go b/core/types/bloom9_test.go new file mode 100644 index 000000000..74e00cac6 --- /dev/null +++ b/core/types/bloom9_test.go @@ -0,0 +1,31 @@ +package types + +/* +import ( + "testing" + + "github.com/ethereum/go-ethereum/state" +) + +func TestBloom9(t *testing.T) { + testCase := []byte("testtest") + bin := LogsBloom([]state.Log{ + {testCase, [][]byte{[]byte("hellohello")}, nil}, + }).Bytes() + res := BloomLookup(bin, testCase) + + if !res { + t.Errorf("Bloom lookup failed") + } +} + + +func TestAddress(t *testing.T) { + block := &Block{} + block.Coinbase = ethutil.Hex2Bytes("22341ae42d6dd7384bc8584e50419ea3ac75b83f") + fmt.Printf("%x\n", crypto.Sha3(block.Coinbase)) + + bin := CreateBloom(block) + fmt.Printf("bin = %x\n", ethutil.LeftPadBytes(bin, 64)) +} +*/ diff --git a/core/types/common.go b/core/types/common.go new file mode 100644 index 000000000..89cb5f498 --- /dev/null +++ b/core/types/common.go @@ -0,0 +1,16 @@ +package types + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/state" + "github.com/ethereum/go-ethereum/wire" +) + +type BlockProcessor interface { + Process(*Block) (*big.Int, state.Messages, error) +} + +type Broadcaster interface { + Broadcast(wire.MsgType, []interface{}) +} diff --git a/core/types/derive_sha.go b/core/types/derive_sha.go new file mode 100644 index 000000000..1897ff198 --- /dev/null +++ b/core/types/derive_sha.go @@ -0,0 +1,20 @@ +package types + +import ( + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/trie" +) + +type DerivableList interface { + Len() int + GetRlp(i int) []byte +} + +func DeriveSha(list DerivableList) []byte { + trie := trie.New(ethutil.Config.Db, "") + for i := 0; i < list.Len(); i++ { + trie.Update(string(ethutil.NewValue(i).Encode()), string(list.GetRlp(i))) + } + + return trie.GetRoot() +} diff --git a/core/types/receipt.go b/core/types/receipt.go new file mode 100644 index 000000000..bac64e41d --- /dev/null +++ b/core/types/receipt.go @@ -0,0 +1,81 @@ +package types + +import ( + "bytes" + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/state" +) + +type Receipt struct { + PostState []byte + CumulativeGasUsed *big.Int + Bloom []byte + 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) + + 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() + self.Bloom = decoder.Get(2).Bytes() + + it := decoder.Get(3).NewIterator() + for it.Next() { + self.logs = append(self.logs, state.NewLogFromValue(it.Value())) + } +} + +func (self *Receipt) RlpData() interface{} { + return []interface{}{self.PostState, self.CumulativeGasUsed, self.Bloom, self.logs.RlpData()} +} + +func (self *Receipt) RlpEncode() []byte { + return ethutil.Encode(self.RlpData()) +} + +func (self *Receipt) Cmp(other *Receipt) bool { + if bytes.Compare(self.PostState, other.PostState) != 0 { + return false + } + + return true +} + +func (self *Receipt) String() string { + return fmt.Sprintf("receipt{med=%x cgas=%v bloom=%x logs=%v}", self.PostState, self.CumulativeGasUsed, self.Bloom, self.logs) +} + +type Receipts []*Receipt + +func (self Receipts) RlpData() interface{} { + data := make([]interface{}, len(self)) + for i, receipt := range self { + data[i] = receipt.RlpData() + } + + return data +} + +func (self Receipts) RlpEncode() []byte { + return ethutil.Encode(self.RlpData()) +} + +func (self Receipts) Len() int { return len(self) } +func (self Receipts) GetRlp(i int) []byte { return ethutil.Rlp(self[i]) } diff --git a/core/types/transaction.go b/core/types/transaction.go new file mode 100644 index 000000000..f6ad0774b --- /dev/null +++ b/core/types/transaction.go @@ -0,0 +1,224 @@ +package types + +import ( + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/obscuren/secp256k1-go" +) + +func IsContractAddr(addr []byte) bool { + return len(addr) == 0 +} + +type Transaction struct { + nonce uint64 + recipient []byte + value *big.Int + gas *big.Int + gasPrice *big.Int + data []byte + v byte + r, s []byte +} + +func NewContractCreationTx(value, gas, gasPrice *big.Int, script []byte) *Transaction { + return &Transaction{recipient: nil, value: value, gas: gas, gasPrice: gasPrice, data: script} +} + +func NewTransactionMessage(to []byte, value, gas, gasPrice *big.Int, data []byte) *Transaction { + return &Transaction{recipient: to, value: value, gasPrice: gasPrice, gas: gas, data: data} +} + +func NewTransactionFromBytes(data []byte) *Transaction { + tx := &Transaction{} + tx.RlpDecode(data) + + return tx +} + +func NewTransactionFromValue(val *ethutil.Value) *Transaction { + tx := &Transaction{} + tx.RlpValueDecode(val) + + return tx +} + +func (tx *Transaction) Hash() []byte { + data := []interface{}{tx.nonce, tx.gasPrice, tx.gas, tx.recipient, tx.value, tx.data} + + return crypto.Sha3(ethutil.NewValue(data).Encode()) +} + +func (self *Transaction) Data() []byte { + return self.data +} + +func (self *Transaction) Gas() *big.Int { + return self.gas +} + +func (self *Transaction) GasPrice() *big.Int { + return self.gasPrice +} + +func (self *Transaction) Value() *big.Int { + return self.value +} + +func (self *Transaction) Nonce() uint64 { + return self.nonce +} + +func (self *Transaction) SetNonce(nonce uint64) { + self.nonce = nonce +} + +func (self *Transaction) From() []byte { + return self.Sender() +} + +func (self *Transaction) To() []byte { + return self.recipient +} + +func (tx *Transaction) Curve() (v byte, r []byte, s []byte) { + v = tx.v + r = ethutil.LeftPadBytes(tx.r, 32) + s = ethutil.LeftPadBytes(tx.s, 32) + + return +} + +func (tx *Transaction) Signature(key []byte) []byte { + hash := tx.Hash() + + sig, _ := secp256k1.Sign(hash, key) + + return sig +} + +func (tx *Transaction) PublicKey() []byte { + hash := tx.Hash() + + v, r, s := tx.Curve() + + sig := append(r, s...) + sig = append(sig, v-27) + + //pubkey := crypto.Ecrecover(append(hash, sig...)) + pubkey, _ := secp256k1.RecoverPubkey(hash, sig) + + return pubkey +} + +func (tx *Transaction) Sender() []byte { + pubkey := tx.PublicKey() + + // Validate the returned key. + // Return nil if public key isn't in full format + if len(pubkey) != 0 && pubkey[0] != 4 { + return nil + } + + return crypto.Sha3(pubkey[1:])[12:] +} + +func (tx *Transaction) Sign(privk []byte) error { + + sig := tx.Signature(privk) + + tx.r = sig[:32] + tx.s = sig[32:64] + tx.v = sig[64] + 27 + + return nil +} + +func (tx *Transaction) RlpData() interface{} { + data := []interface{}{tx.nonce, tx.gasPrice, tx.gas, tx.recipient, tx.value, tx.data} + + return append(data, tx.v, new(big.Int).SetBytes(tx.r).Bytes(), new(big.Int).SetBytes(tx.s).Bytes()) +} + +func (tx *Transaction) RlpValue() *ethutil.Value { + return ethutil.NewValue(tx.RlpData()) +} + +func (tx *Transaction) RlpEncode() []byte { + return tx.RlpValue().Encode() +} + +func (tx *Transaction) RlpDecode(data []byte) { + tx.RlpValueDecode(ethutil.NewValueFromBytes(data)) +} + +func (tx *Transaction) RlpValueDecode(decoder *ethutil.Value) { + tx.nonce = decoder.Get(0).Uint() + tx.gasPrice = decoder.Get(1).BigInt() + tx.gas = decoder.Get(2).BigInt() + tx.recipient = decoder.Get(3).Bytes() + tx.value = decoder.Get(4).BigInt() + tx.data = decoder.Get(5).Bytes() + tx.v = byte(decoder.Get(6).Uint()) + + tx.r = decoder.Get(7).Bytes() + tx.s = decoder.Get(8).Bytes() +} + +func (tx *Transaction) String() string { + return fmt.Sprintf(` + TX(%x) + Contract: %v + From: %x + To: %x + Nonce: %v + GasPrice: %v + Gas: %v + Value: %v + Data: 0x%x + V: 0x%x + R: 0x%x + S: 0x%x + Hex: %x + `, + tx.Hash(), + len(tx.recipient) == 0, + tx.Sender(), + tx.recipient, + tx.nonce, + tx.gasPrice, + tx.gas, + tx.value, + tx.data, + tx.v, + tx.r, + tx.s, + ethutil.Encode(tx), + ) +} + +// Transaction slice type for basic sorting +type Transactions []*Transaction + +func (self Transactions) RlpData() interface{} { + // Marshal the transactions of this block + enc := make([]interface{}, len(self)) + for i, tx := range self { + // Cast it to a string (safe) + enc[i] = tx.RlpData() + } + + return enc +} +func (s Transactions) Len() int { return len(s) } +func (s Transactions) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s Transactions) GetRlp(i int) []byte { return ethutil.Rlp(s[i]) } + +type TxByNonce struct{ Transactions } + +func (s TxByNonce) Less(i, j int) bool { + return s.Transactions[i].nonce < s.Transactions[j].nonce +} diff --git a/core/types/transaction_test.go b/core/types/transaction_test.go new file mode 100644 index 000000000..ab1254f4c --- /dev/null +++ b/core/types/transaction_test.go @@ -0,0 +1 @@ +package types diff --git a/core/vm_env.go b/core/vm_env.go new file mode 100644 index 000000000..ad63ecf9c --- /dev/null +++ b/core/vm_env.go @@ -0,0 +1,61 @@ +package core + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/state" + "github.com/ethereum/go-ethereum/vm" +) + +type VMEnv struct { + state *state.StateDB + block *types.Block + msg Message + depth int +} + +func NewEnv(state *state.StateDB, msg Message, block *types.Block) *VMEnv { + return &VMEnv{ + state: state, + block: block, + msg: msg, + } +} + +func (self *VMEnv) Origin() []byte { return self.msg.From() } +func (self *VMEnv) BlockNumber() *big.Int { return self.block.Number } +func (self *VMEnv) PrevHash() []byte { return self.block.PrevHash } +func (self *VMEnv) Coinbase() []byte { return self.block.Coinbase } +func (self *VMEnv) Time() int64 { return self.block.Time } +func (self *VMEnv) Difficulty() *big.Int { return self.block.Difficulty } +func (self *VMEnv) BlockHash() []byte { return self.block.Hash() } +func (self *VMEnv) Value() *big.Int { return self.msg.Value() } +func (self *VMEnv) State() *state.StateDB { return self.state } +func (self *VMEnv) GasLimit() *big.Int { return self.block.GasLimit } +func (self *VMEnv) Depth() int { return self.depth } +func (self *VMEnv) SetDepth(i int) { self.depth = i } +func (self *VMEnv) AddLog(log state.Log) { + self.state.AddLog(log) +} +func (self *VMEnv) Transfer(from, to vm.Account, amount *big.Int) error { + return vm.Transfer(from, to, amount) +} + +func (self *VMEnv) vm(addr, data []byte, gas, price, value *big.Int) *Execution { + return NewExecution(self, addr, data, gas, price, value) +} + +func (self *VMEnv) Call(me vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) { + exe := self.vm(addr, data, gas, price, value) + return exe.Call(addr, me) +} +func (self *VMEnv) CallCode(me vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) { + exe := self.vm(me.Address(), data, gas, price, value) + return exe.Call(addr, me) +} + +func (self *VMEnv) Create(me vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error, vm.ClosureRef) { + exe := self.vm(addr, data, gas, price, value) + return exe.Create(me) +} diff --git a/crypto/crypto.go b/crypto/crypto.go new file mode 100644 index 000000000..b8fd78fa2 --- /dev/null +++ b/crypto/crypto.go @@ -0,0 +1,115 @@ +package crypto + +import ( + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + "crypto/sha256" + + "code.google.com/p/go.crypto/ripemd160" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/obscuren/ecies" + "github.com/obscuren/secp256k1-go" + "github.com/obscuren/sha3" +) + +func init() { + // specify the params for the s256 curve + ecies.AddParamsForCurve(S256(), ecies.ECIES_AES128_SHA256) +} + +func Sha3(data []byte) []byte { + d := sha3.NewKeccak256() + d.Write(data) + + return d.Sum(nil) +} + +// Creates an ethereum address given the bytes and the nonce +func CreateAddress(b []byte, nonce uint64) []byte { + return Sha3(ethutil.NewValue([]interface{}{b, nonce}).Encode())[12:] +} + +func Sha256(data []byte) []byte { + hash := sha256.Sum256(data) + + return hash[:] +} + +func Ripemd160(data []byte) []byte { + ripemd := ripemd160.New() + ripemd.Write(data) + + return ripemd.Sum(nil) +} + +func Ecrecover(data []byte) []byte { + var in = struct { + hash []byte + sig []byte + }{data[:32], data[32:]} + + r, _ := secp256k1.RecoverPubkey(in.hash, in.sig) + + return r +} + +// New methods using proper ecdsa keys from the stdlib +func ToECDSA(prv []byte) *ecdsa.PrivateKey { + if len(prv) == 0 { + return nil + } + + priv := new(ecdsa.PrivateKey) + priv.PublicKey.Curve = S256() + priv.D = ethutil.BigD(prv) + priv.PublicKey.X, priv.PublicKey.Y = S256().ScalarBaseMult(prv) + return priv +} + +func FromECDSA(prv *ecdsa.PrivateKey) []byte { + if prv == nil { + return nil + } + return prv.D.Bytes() +} + +func ToECDSAPub(pub []byte) *ecdsa.PublicKey { + if len(pub) == 0 { + return nil + } + x, y := elliptic.Unmarshal(S256(), pub) + return &ecdsa.PublicKey{S256(), x, y} +} + +func FromECDSAPub(pub *ecdsa.PublicKey) []byte { + if pub == nil { + return nil + } + return elliptic.Marshal(S256(), pub.X, pub.Y) +} + +func GenerateKey() (*ecdsa.PrivateKey, error) { + return ecdsa.GenerateKey(S256(), rand.Reader) +} + +func SigToPub(hash, sig []byte) *ecdsa.PublicKey { + s := Ecrecover(append(hash, sig...)) + x, y := elliptic.Unmarshal(S256(), s) + + return &ecdsa.PublicKey{S256(), x, y} +} + +func Sign(hash []byte, prv *ecdsa.PrivateKey) (sig []byte, err error) { + sig, err = secp256k1.Sign(hash, prv.D.Bytes()) + return +} + +func Encrypt(pub *ecdsa.PublicKey, message []byte) ([]byte, error) { + return ecies.Encrypt(rand.Reader, ecies.ImportECDSAPublic(pub), message, nil, nil) +} + +func Decrypt(prv *ecdsa.PrivateKey, ct []byte) ([]byte, error) { + key := ecies.ImportECDSA(prv) + return key.Decrypt(rand.Reader, ct, nil, nil) +} diff --git a/crypto/crypto_test.go b/crypto/crypto_test.go new file mode 100644 index 000000000..af62a02a2 --- /dev/null +++ b/crypto/crypto_test.go @@ -0,0 +1,36 @@ +package crypto + +import ( + "bytes" + "encoding/hex" + "testing" +) + +// These tests are sanity checks. +// They should ensure that we don't e.g. use Sha3-224 instead of Sha3-256 +// and that the sha3 library uses keccak-f permutation. + +func TestSha3(t *testing.T) { + msg := []byte("abc") + exp, _ := hex.DecodeString("4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45") + checkhash(t, "Sha3-256", Sha3, msg, exp) +} + +func TestSha256(t *testing.T) { + msg := []byte("abc") + exp, _ := hex.DecodeString("ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad") + checkhash(t, "Sha256", Sha256, msg, exp) +} + +func TestRipemd160(t *testing.T) { + msg := []byte("abc") + exp, _ := hex.DecodeString("8eb208f7e05d987a9b044a8e98c6b087f15a0bfc") + checkhash(t, "Ripemd160", Ripemd160, msg, exp) +} + +func checkhash(t *testing.T, name string, f func([]byte) []byte, msg, exp []byte) { + sum := f(msg) + if bytes.Compare(exp, sum) != 0 { + t.Errorf("hash %s returned wrong result.\ngot: %x\nwant: %x", name, sum, exp) + } +} diff --git a/crypto/curve.go b/crypto/curve.go new file mode 100644 index 000000000..131a0dd2f --- /dev/null +++ b/crypto/curve.go @@ -0,0 +1,363 @@ +package crypto + +// Copyright 2010 The Go Authors. All rights reserved. +// Copyright 2011 ThePiachu. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package bitelliptic implements several Koblitz elliptic curves over prime +// fields. + +// This package operates, internally, on Jacobian coordinates. For a given +// (x, y) position on the curve, the Jacobian coordinates are (x1, y1, z1) +// where x = x1/z1² and y = y1/z1³. The greatest speedups come when the whole +// calculation can be performed within the transform (as in ScalarMult and +// ScalarBaseMult). But even for Add and Double, it's faster to apply and +// reverse the transform than to operate in affine coordinates. + +import ( + "crypto/elliptic" + "io" + "math/big" + "sync" +) + +// A BitCurve represents a Koblitz Curve with a=0. +// See http://www.hyperelliptic.org/EFD/g1p/auto-shortw.html +type BitCurve struct { + P *big.Int // the order of the underlying field + N *big.Int // the order of the base point + B *big.Int // the constant of the BitCurve equation + Gx, Gy *big.Int // (x,y) of the base point + BitSize int // the size of the underlying field +} + +func (BitCurve *BitCurve) Params() *elliptic.CurveParams { + return &elliptic.CurveParams{BitCurve.P, BitCurve.N, BitCurve.B, BitCurve.Gx, BitCurve.Gy, BitCurve.BitSize} +} + +// IsOnBitCurve returns true if the given (x,y) lies on the BitCurve. +func (BitCurve *BitCurve) IsOnCurve(x, y *big.Int) bool { + // y² = x³ + b + y2 := new(big.Int).Mul(y, y) //y² + y2.Mod(y2, BitCurve.P) //y²%P + + x3 := new(big.Int).Mul(x, x) //x² + x3.Mul(x3, x) //x³ + + x3.Add(x3, BitCurve.B) //x³+B + x3.Mod(x3, BitCurve.P) //(x³+B)%P + + return x3.Cmp(y2) == 0 +} + +//TODO: double check if the function is okay +// affineFromJacobian reverses the Jacobian transform. See the comment at the +// top of the file. +func (BitCurve *BitCurve) affineFromJacobian(x, y, z *big.Int) (xOut, yOut *big.Int) { + zinv := new(big.Int).ModInverse(z, BitCurve.P) + zinvsq := new(big.Int).Mul(zinv, zinv) + + xOut = new(big.Int).Mul(x, zinvsq) + xOut.Mod(xOut, BitCurve.P) + zinvsq.Mul(zinvsq, zinv) + yOut = new(big.Int).Mul(y, zinvsq) + yOut.Mod(yOut, BitCurve.P) + return +} + +// Add returns the sum of (x1,y1) and (x2,y2) +func (BitCurve *BitCurve) Add(x1, y1, x2, y2 *big.Int) (*big.Int, *big.Int) { + z := new(big.Int).SetInt64(1) + return BitCurve.affineFromJacobian(BitCurve.addJacobian(x1, y1, z, x2, y2, z)) +} + +// addJacobian takes two points in Jacobian coordinates, (x1, y1, z1) and +// (x2, y2, z2) and returns their sum, also in Jacobian form. +func (BitCurve *BitCurve) addJacobian(x1, y1, z1, x2, y2, z2 *big.Int) (*big.Int, *big.Int, *big.Int) { + // See http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#addition-add-2007-bl + z1z1 := new(big.Int).Mul(z1, z1) + z1z1.Mod(z1z1, BitCurve.P) + z2z2 := new(big.Int).Mul(z2, z2) + z2z2.Mod(z2z2, BitCurve.P) + + u1 := new(big.Int).Mul(x1, z2z2) + u1.Mod(u1, BitCurve.P) + u2 := new(big.Int).Mul(x2, z1z1) + u2.Mod(u2, BitCurve.P) + h := new(big.Int).Sub(u2, u1) + if h.Sign() == -1 { + h.Add(h, BitCurve.P) + } + i := new(big.Int).Lsh(h, 1) + i.Mul(i, i) + j := new(big.Int).Mul(h, i) + + s1 := new(big.Int).Mul(y1, z2) + s1.Mul(s1, z2z2) + s1.Mod(s1, BitCurve.P) + s2 := new(big.Int).Mul(y2, z1) + s2.Mul(s2, z1z1) + s2.Mod(s2, BitCurve.P) + r := new(big.Int).Sub(s2, s1) + if r.Sign() == -1 { + r.Add(r, BitCurve.P) + } + r.Lsh(r, 1) + v := new(big.Int).Mul(u1, i) + + x3 := new(big.Int).Set(r) + x3.Mul(x3, x3) + x3.Sub(x3, j) + x3.Sub(x3, v) + x3.Sub(x3, v) + x3.Mod(x3, BitCurve.P) + + y3 := new(big.Int).Set(r) + v.Sub(v, x3) + y3.Mul(y3, v) + s1.Mul(s1, j) + s1.Lsh(s1, 1) + y3.Sub(y3, s1) + y3.Mod(y3, BitCurve.P) + + z3 := new(big.Int).Add(z1, z2) + z3.Mul(z3, z3) + z3.Sub(z3, z1z1) + if z3.Sign() == -1 { + z3.Add(z3, BitCurve.P) + } + z3.Sub(z3, z2z2) + if z3.Sign() == -1 { + z3.Add(z3, BitCurve.P) + } + z3.Mul(z3, h) + z3.Mod(z3, BitCurve.P) + + return x3, y3, z3 +} + +// Double returns 2*(x,y) +func (BitCurve *BitCurve) Double(x1, y1 *big.Int) (*big.Int, *big.Int) { + z1 := new(big.Int).SetInt64(1) + return BitCurve.affineFromJacobian(BitCurve.doubleJacobian(x1, y1, z1)) +} + +// doubleJacobian takes a point in Jacobian coordinates, (x, y, z), and +// returns its double, also in Jacobian form. +func (BitCurve *BitCurve) doubleJacobian(x, y, z *big.Int) (*big.Int, *big.Int, *big.Int) { + // See http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l + + a := new(big.Int).Mul(x, x) //X1² + b := new(big.Int).Mul(y, y) //Y1² + c := new(big.Int).Mul(b, b) //B² + + d := new(big.Int).Add(x, b) //X1+B + d.Mul(d, d) //(X1+B)² + d.Sub(d, a) //(X1+B)²-A + d.Sub(d, c) //(X1+B)²-A-C + d.Mul(d, big.NewInt(2)) //2*((X1+B)²-A-C) + + e := new(big.Int).Mul(big.NewInt(3), a) //3*A + f := new(big.Int).Mul(e, e) //E² + + x3 := new(big.Int).Mul(big.NewInt(2), d) //2*D + x3.Sub(f, x3) //F-2*D + x3.Mod(x3, BitCurve.P) + + y3 := new(big.Int).Sub(d, x3) //D-X3 + y3.Mul(e, y3) //E*(D-X3) + y3.Sub(y3, new(big.Int).Mul(big.NewInt(8), c)) //E*(D-X3)-8*C + y3.Mod(y3, BitCurve.P) + + z3 := new(big.Int).Mul(y, z) //Y1*Z1 + z3.Mul(big.NewInt(2), z3) //3*Y1*Z1 + z3.Mod(z3, BitCurve.P) + + return x3, y3, z3 +} + +//TODO: double check if it is okay +// ScalarMult returns k*(Bx,By) where k is a number in big-endian form. +func (BitCurve *BitCurve) ScalarMult(Bx, By *big.Int, k []byte) (*big.Int, *big.Int) { + // We have a slight problem in that the identity of the group (the + // point at infinity) cannot be represented in (x, y) form on a finite + // machine. Thus the standard add/double algorithm has to be tweaked + // slightly: our initial state is not the identity, but x, and we + // ignore the first true bit in |k|. If we don't find any true bits in + // |k|, then we return nil, nil, because we cannot return the identity + // element. + + Bz := new(big.Int).SetInt64(1) + x := Bx + y := By + z := Bz + + seenFirstTrue := false + for _, byte := range k { + for bitNum := 0; bitNum < 8; bitNum++ { + if seenFirstTrue { + x, y, z = BitCurve.doubleJacobian(x, y, z) + } + if byte&0x80 == 0x80 { + if !seenFirstTrue { + seenFirstTrue = true + } else { + x, y, z = BitCurve.addJacobian(Bx, By, Bz, x, y, z) + } + } + byte <<= 1 + } + } + + if !seenFirstTrue { + return nil, nil + } + + return BitCurve.affineFromJacobian(x, y, z) +} + +// ScalarBaseMult returns k*G, where G is the base point of the group and k is +// an integer in big-endian form. +func (BitCurve *BitCurve) ScalarBaseMult(k []byte) (*big.Int, *big.Int) { + return BitCurve.ScalarMult(BitCurve.Gx, BitCurve.Gy, k) +} + +var mask = []byte{0xff, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f} + +//TODO: double check if it is okay +// GenerateKey returns a public/private key pair. The private key is generated +// using the given reader, which must return random data. +func (BitCurve *BitCurve) GenerateKey(rand io.Reader) (priv []byte, x, y *big.Int, err error) { + byteLen := (BitCurve.BitSize + 7) >> 3 + priv = make([]byte, byteLen) + + for x == nil { + _, err = io.ReadFull(rand, priv) + if err != nil { + return + } + // We have to mask off any excess bits in the case that the size of the + // underlying field is not a whole number of bytes. + priv[0] &= mask[BitCurve.BitSize%8] + // This is because, in tests, rand will return all zeros and we don't + // want to get the point at infinity and loop forever. + priv[1] ^= 0x42 + x, y = BitCurve.ScalarBaseMult(priv) + } + return +} + +// Marshal converts a point into the form specified in section 4.3.6 of ANSI +// X9.62. +func (BitCurve *BitCurve) Marshal(x, y *big.Int) []byte { + byteLen := (BitCurve.BitSize + 7) >> 3 + + ret := make([]byte, 1+2*byteLen) + ret[0] = 4 // uncompressed point + + xBytes := x.Bytes() + copy(ret[1+byteLen-len(xBytes):], xBytes) + yBytes := y.Bytes() + copy(ret[1+2*byteLen-len(yBytes):], yBytes) + return ret +} + +// Unmarshal converts a point, serialised by Marshal, into an x, y pair. On +// error, x = nil. +func (BitCurve *BitCurve) Unmarshal(data []byte) (x, y *big.Int) { + byteLen := (BitCurve.BitSize + 7) >> 3 + if len(data) != 1+2*byteLen { + return + } + if data[0] != 4 { // uncompressed form + return + } + x = new(big.Int).SetBytes(data[1 : 1+byteLen]) + y = new(big.Int).SetBytes(data[1+byteLen:]) + return +} + +//curve parameters taken from: +//http://www.secg.org/collateral/sec2_final.pdf + +var initonce sync.Once +var ecp160k1 *BitCurve +var ecp192k1 *BitCurve +var ecp224k1 *BitCurve +var ecp256k1 *BitCurve + +func initAll() { + initS160() + initS192() + initS224() + initS256() +} + +func initS160() { + // See SEC 2 section 2.4.1 + ecp160k1 = new(BitCurve) + ecp160k1.P, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73", 16) + ecp160k1.N, _ = new(big.Int).SetString("0100000000000000000001B8FA16DFAB9ACA16B6B3", 16) + ecp160k1.B, _ = new(big.Int).SetString("0000000000000000000000000000000000000007", 16) + ecp160k1.Gx, _ = new(big.Int).SetString("3B4C382CE37AA192A4019E763036F4F5DD4D7EBB", 16) + ecp160k1.Gy, _ = new(big.Int).SetString("938CF935318FDCED6BC28286531733C3F03C4FEE", 16) + ecp160k1.BitSize = 160 +} + +func initS192() { + // See SEC 2 section 2.5.1 + ecp192k1 = new(BitCurve) + ecp192k1.P, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37", 16) + ecp192k1.N, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D", 16) + ecp192k1.B, _ = new(big.Int).SetString("000000000000000000000000000000000000000000000003", 16) + ecp192k1.Gx, _ = new(big.Int).SetString("DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D", 16) + ecp192k1.Gy, _ = new(big.Int).SetString("9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D", 16) + ecp192k1.BitSize = 192 +} + +func initS224() { + // See SEC 2 section 2.6.1 + ecp224k1 = new(BitCurve) + ecp224k1.P, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D", 16) + ecp224k1.N, _ = new(big.Int).SetString("010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7", 16) + ecp224k1.B, _ = new(big.Int).SetString("00000000000000000000000000000000000000000000000000000005", 16) + ecp224k1.Gx, _ = new(big.Int).SetString("A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C", 16) + ecp224k1.Gy, _ = new(big.Int).SetString("7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5", 16) + ecp224k1.BitSize = 224 +} + +func initS256() { + // See SEC 2 section 2.7.1 + ecp256k1 = new(BitCurve) + ecp256k1.P, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", 16) + ecp256k1.N, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", 16) + ecp256k1.B, _ = new(big.Int).SetString("0000000000000000000000000000000000000000000000000000000000000007", 16) + ecp256k1.Gx, _ = new(big.Int).SetString("79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", 16) + ecp256k1.Gy, _ = new(big.Int).SetString("483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", 16) + ecp256k1.BitSize = 256 +} + +// S160 returns a BitCurve which implements secp160k1 (see SEC 2 section 2.4.1) +func S160() *BitCurve { + initonce.Do(initAll) + return ecp160k1 +} + +// S192 returns a BitCurve which implements secp192k1 (see SEC 2 section 2.5.1) +func S192() *BitCurve { + initonce.Do(initAll) + return ecp192k1 +} + +// S224 returns a BitCurve which implements secp224k1 (see SEC 2 section 2.6.1) +func S224() *BitCurve { + initonce.Do(initAll) + return ecp224k1 +} + +// S256 returns a BitCurve which implements secp256k1 (see SEC 2 section 2.7.1) +func S256() *BitCurve { + initonce.Do(initAll) + return ecp256k1 +} diff --git a/crypto/encrypt_decrypt_test.go b/crypto/encrypt_decrypt_test.go new file mode 100644 index 000000000..85b43c406 --- /dev/null +++ b/crypto/encrypt_decrypt_test.go @@ -0,0 +1,40 @@ +package crypto + +import ( + "bytes" + "fmt" + "testing" + + "github.com/ethereum/go-ethereum/ethutil" +) + +func TestBox(t *testing.T) { + prv1 := ToECDSA(ethutil.Hex2Bytes("4b50fa71f5c3eeb8fdc452224b2395af2fcc3d125e06c32c82e048c0559db03f")) + prv2 := ToECDSA(ethutil.Hex2Bytes("d0b043b4c5d657670778242d82d68a29d25d7d711127d17b8e299f156dad361a")) + pub2 := ToECDSAPub(ethutil.Hex2Bytes("04bd27a63c91fe3233c5777e6d3d7b39204d398c8f92655947eb5a373d46e1688f022a1632d264725cbc7dc43ee1cfebde42fa0a86d08b55d2acfbb5e9b3b48dc5")) + + message := []byte("Hello, world.") + ct, err := Encrypt(pub2, message) + if err != nil { + fmt.Println(err.Error()) + t.FailNow() + } + + pt, err := Decrypt(prv2, ct) + if err != nil { + fmt.Println(err.Error()) + t.FailNow() + } + + if !bytes.Equal(pt, message) { + fmt.Println("ecies: plaintext doesn't match message") + t.FailNow() + } + + _, err = Decrypt(prv1, pt) + if err == nil { + fmt.Println("ecies: encryption should not have succeeded") + t.FailNow() + } + +} diff --git a/crypto/key_manager.go b/crypto/key_manager.go new file mode 100644 index 000000000..326e559e0 --- /dev/null +++ b/crypto/key_manager.go @@ -0,0 +1,134 @@ +package crypto + +import ( + "fmt" + "sync" + + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/logger" +) + +var keylogger = logger.NewLogger("KEY") + +type KeyManager struct { + keyRing *KeyRing + session string + keyStore KeyStore // interface + keyRings map[string]*KeyRing // cache + keyPair *KeyPair +} + +func NewDBKeyManager(db ethutil.Database) *KeyManager { + return &KeyManager{keyStore: &DBKeyStore{db: db}, keyRings: make(map[string]*KeyRing)} +} + +func NewFileKeyManager(basedir string) *KeyManager { + return &KeyManager{keyStore: &FileKeyStore{basedir: basedir}, keyRings: make(map[string]*KeyRing)} +} + +func (k *KeyManager) KeyPair() *KeyPair { + return k.keyPair +} + +func (k *KeyManager) KeyRing() *KeyPair { + return k.keyPair +} + +func (k *KeyManager) PrivateKey() []byte { + return k.keyPair.PrivateKey +} + +func (k *KeyManager) PublicKey() []byte { + return k.keyPair.PublicKey +} + +func (k *KeyManager) Address() []byte { + return k.keyPair.Address() +} + +func (k *KeyManager) save(session string, keyRing *KeyRing) error { + err := k.keyStore.Save(session, keyRing) + if err != nil { + return err + } + k.keyRings[session] = keyRing + return nil +} + +func (k *KeyManager) load(session string) (*KeyRing, error) { + keyRing, found := k.keyRings[session] + if !found { + var err error + keyRing, err = k.keyStore.Load(session) + if err != nil { + return nil, err + } + } + return keyRing, nil +} + +func cursorError(cursor int, len int) error { + return fmt.Errorf("cursor %d out of range (0..%d)", cursor, len) +} + +func (k *KeyManager) reset(session string, cursor int, keyRing *KeyRing) error { + if cursor >= keyRing.Len() { + return cursorError(cursor, keyRing.Len()) + } + lock := &sync.Mutex{} + lock.Lock() + defer lock.Unlock() + err := k.save(session, keyRing) + if err != nil { + return err + } + k.session = session + k.keyRing = keyRing + k.keyPair = keyRing.GetKeyPair(cursor) + return nil +} + +func (k *KeyManager) SetCursor(cursor int) error { + if cursor >= k.keyRing.Len() { + return cursorError(cursor, k.keyRing.Len()) + } + k.keyPair = k.keyRing.GetKeyPair(cursor) + return nil +} + +func (k *KeyManager) Init(session string, cursor int, force bool) error { + var keyRing *KeyRing + if !force { + var err error + keyRing, err = k.load(session) + if err != nil { + return err + } + } + if keyRing == nil { + keyRing = NewGeneratedKeyRing(1) + keylogger.Infof("Created keypair. Private key: %x\n", keyRing.keys[0].PrivateKey) + } + return k.reset(session, cursor, keyRing) +} + +func (k *KeyManager) InitFromSecretsFile(session string, cursor int, secretsfile string) error { + keyRing, err := NewKeyRingFromFile(secretsfile) + if err != nil { + return err + } + return k.reset(session, cursor, keyRing) +} + +func (k *KeyManager) InitFromString(session string, cursor int, secrets string) error { + keyRing, err := NewKeyRingFromString(secrets) + if err != nil { + return err + } + return k.reset(session, cursor, keyRing) +} + +func (k *KeyManager) Export(dir string) error { + fileKeyStore := FileKeyStore{dir} + return fileKeyStore.Save(k.session, k.keyRing) +} diff --git a/crypto/key_store.go b/crypto/key_store.go new file mode 100644 index 000000000..04560a04e --- /dev/null +++ b/crypto/key_store.go @@ -0,0 +1,113 @@ +package crypto + +import ( + "fmt" + "io/ioutil" + "os" + "path" + "strings" + + "github.com/ethereum/go-ethereum/ethutil" +) + +type KeyStore interface { + Load(string) (*KeyRing, error) + Save(string, *KeyRing) error +} + +type DBKeyStore struct { + db ethutil.Database +} + +const dbKeyPrefix = "KeyRing" + +func (k *DBKeyStore) dbKey(session string) []byte { + return []byte(fmt.Sprintf("%s%s", dbKeyPrefix, session)) +} + +func (k *DBKeyStore) Save(session string, keyRing *KeyRing) error { + k.db.Put(k.dbKey(session), keyRing.RlpEncode()) + return nil +} + +func (k *DBKeyStore) Load(session string) (*KeyRing, error) { + data, err := k.db.Get(k.dbKey(session)) + if err != nil { + return nil, nil + } + var keyRing *KeyRing + keyRing, err = NewKeyRingFromBytes(data) + if err != nil { + return nil, err + } + // if empty keyRing is found we return nil, no error + if keyRing.Len() == 0 { + return nil, nil + } + return keyRing, nil +} + +type FileKeyStore struct { + basedir string +} + +func (k *FileKeyStore) Save(session string, keyRing *KeyRing) error { + var content []byte + var err error + var privateKeys []string + var publicKeys []string + var mnemonics []string + var addresses []string + keyRing.Each(func(keyPair *KeyPair) { + privateKeys = append(privateKeys, ethutil.Bytes2Hex(keyPair.PrivateKey)) + publicKeys = append(publicKeys, ethutil.Bytes2Hex(keyPair.PublicKey)) + addresses = append(addresses, ethutil.Bytes2Hex(keyPair.Address())) + mnemonics = append(mnemonics, keyPair.Mnemonic()) + }) + + basename := session + if session == "" { + basename = "default" + } + + path := path.Join(k.basedir, basename) + content = []byte(strings.Join(privateKeys, "\n")) + err = ioutil.WriteFile(path+".prv", content, 0600) + if err != nil { + return err + } + + content = []byte(strings.Join(publicKeys, "\n")) + err = ioutil.WriteFile(path+".pub", content, 0644) + if err != nil { + return err + } + + content = []byte(strings.Join(addresses, "\n")) + err = ioutil.WriteFile(path+".addr", content, 0644) + if err != nil { + return err + } + + content = []byte(strings.Join(mnemonics, "\n")) + err = ioutil.WriteFile(path+".mne", content, 0600) + if err != nil { + return err + } + + return nil +} + +func (k *FileKeyStore) Load(session string) (*KeyRing, error) { + basename := session + if session == "" { + basename = "default" + } + secfile := path.Join(k.basedir, basename+".prv") + _, err := os.Stat(secfile) + // if file is not found then we return nil, no error + if err != nil { + return nil, nil + } + return NewKeyRingFromFile(secfile) +} diff --git a/crypto/keypair.go b/crypto/keypair.go new file mode 100644 index 000000000..d02875ded --- /dev/null +++ b/crypto/keypair.go @@ -0,0 +1,58 @@ +package crypto + +import ( + "strings" + + "github.com/ethereum/go-ethereum/ethutil" + "github.com/obscuren/secp256k1-go" +) + +type KeyPair struct { + PrivateKey []byte + PublicKey []byte + address []byte + mnemonic string + // The associated account + // account *StateObject +} + +func GenerateNewKeyPair() *KeyPair { + _, prv := secp256k1.GenerateKeyPair() + keyPair, _ := NewKeyPairFromSec(prv) // swallow error, this one cannot err + return keyPair +} + +func NewKeyPairFromSec(seckey []byte) (*KeyPair, error) { + pubkey, err := secp256k1.GeneratePubKey(seckey) + if err != nil { + return nil, err + } + + return &KeyPair{PrivateKey: seckey, PublicKey: pubkey}, nil +} + +func (k *KeyPair) Address() []byte { + if k.address == nil { + k.address = Sha3(k.PublicKey[1:])[12:] + } + return k.address +} + +func (k *KeyPair) Mnemonic() string { + if k.mnemonic == "" { + k.mnemonic = strings.Join(MnemonicEncode(ethutil.Bytes2Hex(k.PrivateKey)), " ") + } + return k.mnemonic +} + +func (k *KeyPair) AsStrings() (string, string, string, string) { + return k.Mnemonic(), ethutil.Bytes2Hex(k.Address()), ethutil.Bytes2Hex(k.PrivateKey), ethutil.Bytes2Hex(k.PublicKey) +} + +func (k *KeyPair) RlpEncode() []byte { + return k.RlpValue().Encode() +} + +func (k *KeyPair) RlpValue() *ethutil.Value { + return ethutil.NewValue(k.PrivateKey) +} diff --git a/crypto/keyring.go b/crypto/keyring.go new file mode 100644 index 000000000..eab13dbc4 --- /dev/null +++ b/crypto/keyring.go @@ -0,0 +1,123 @@ +package crypto + +import ( + "fmt" + "io/ioutil" + "strings" + + "github.com/ethereum/go-ethereum/ethutil" +) + +type KeyRing struct { + keys []*KeyPair +} + +func NewKeyRing() *KeyRing { + return &KeyRing{} +} + +func (k *KeyRing) AddKeyPair(keyPair *KeyPair) { + k.keys = append(k.keys, keyPair) +} + +func (k *KeyRing) GetKeyPair(i int) *KeyPair { + if len(k.keys) > i { + return k.keys[i] + } + + return nil +} + +func (k *KeyRing) Empty() bool { + return k.Len() == 0 +} + +func (k *KeyRing) Len() int { + return len(k.keys) +} + +func (k *KeyRing) Each(f func(*KeyPair)) { + for _, keyPair := range k.keys { + f(keyPair) + } +} + +func NewGeneratedKeyRing(len int) *KeyRing { + keyRing := NewKeyRing() + for i := 0; i < len; i++ { + keyRing.AddKeyPair(GenerateNewKeyPair()) + } + return keyRing +} + +func NewKeyRingFromFile(secfile string) (*KeyRing, error) { + var content []byte + var err error + content, err = ioutil.ReadFile(secfile) + if err != nil { + return nil, err + } + keyRing, err := NewKeyRingFromString(string(content)) + if err != nil { + return nil, err + } + return keyRing, nil +} + +func NewKeyRingFromString(content string) (*KeyRing, error) { + secretStrings := strings.Split(content, "\n") + var secrets [][]byte + for _, secretString := range secretStrings { + secret := secretString + words := strings.Split(secretString, " ") + if len(words) == 24 { + secret = MnemonicDecode(words) + } else if len(words) != 1 { + return nil, fmt.Errorf("Unrecognised key format") + } + + if len(secret) != 0 { + secrets = append(secrets, ethutil.Hex2Bytes(secret)) + } + } + + return NewKeyRingFromSecrets(secrets) +} + +func NewKeyRingFromSecrets(secs [][]byte) (*KeyRing, error) { + keyRing := NewKeyRing() + for _, sec := range secs { + keyPair, err := NewKeyPairFromSec(sec) + if err != nil { + return nil, err + } + keyRing.AddKeyPair(keyPair) + } + return keyRing, nil +} + +func NewKeyRingFromBytes(data []byte) (*KeyRing, error) { + var secrets [][]byte + it := ethutil.NewValueFromBytes(data).NewIterator() + for it.Next() { + secret := it.Value().Bytes() + secrets = append(secrets, secret) + } + keyRing, err := NewKeyRingFromSecrets(secrets) + if err != nil { + return nil, err + } + return keyRing, nil +} + +func (k *KeyRing) RlpEncode() []byte { + return k.RlpValue().Encode() +} + +func (k *KeyRing) RlpValue() *ethutil.Value { + v := ethutil.EmptyValue() + k.Each(func(keyPair *KeyPair) { + v.Append(keyPair.RlpValue()) + }) + return v +} diff --git a/crypto/keys_test.go b/crypto/keys_test.go new file mode 100644 index 000000000..56e851969 --- /dev/null +++ b/crypto/keys_test.go @@ -0,0 +1,122 @@ +package crypto + +// import ( +// "github.com/ethereum/go-ethereum/ethdb" +// // "io/ioutil" +// "fmt" +// "os" +// "path" +// "testing" +// ) + +// // test if persistence layer works +// func TestDBKeyManager(t *testing.T) { +// memdb, _ := ethdb.NewMemDatabase() +// keyManager0 := NewDBKeyManager(memdb) +// err := keyManager0.Init("", 0, false) +// if err != nil { +// t.Error("Unexpected error: ", err) +// } +// keyManager1 := NewDBKeyManager(memdb) +// err = keyManager1.Init("", 0, false) +// if err != nil { +// t.Error("Unexpected error: ", err) +// } +// if string(keyManager0.PrivateKey()) != string(keyManager1.PrivateKey()) { +// t.Error("Expected private keys %x, %x, to be identical via db persistence", keyManager0.PrivateKey(), keyManager1.PrivateKey()) +// } +// err = keyManager1.Init("", 0, true) +// if err != nil { +// t.Error("Unexpected error: ", err) +// } +// if string(keyManager0.PrivateKey()) == string(keyManager1.PrivateKey()) { +// t.Error("Expected private keys %x, %x, to be be different despite db persistence if force generate", keyManager0.PrivateKey(), keyManager1.PrivateKey()) +// } +// } + +// func TestFileKeyManager(t *testing.T) { +// basedir0 := "/tmp/ethtest0" +// os.RemoveAll(basedir0) +// os.Mkdir(basedir0, 0777) + +// keyManager0 := NewFileKeyManager(basedir0) +// err := keyManager0.Init("", 0, false) +// if err != nil { +// t.Error("Unexpected error: ", err) +// } + +// keyManager1 := NewFileKeyManager(basedir0) + +// err = keyManager1.Init("", 0, false) +// if err != nil { +// t.Error("Unexpected error: ", err) +// } +// if string(keyManager0.PrivateKey()) != string(keyManager1.PrivateKey()) { +// t.Error("Expected private keys %x, %x, to be identical via db persistence", keyManager0.PrivateKey(), keyManager1.PrivateKey()) +// } + +// err = keyManager1.Init("", 0, true) +// if err != nil { +// t.Error("Unexpected error: ", err) +// } +// if string(keyManager0.PrivateKey()) == string(keyManager1.PrivateKey()) { +// t.Error("Expected private keys %x, %x, to be be different despite db persistence if force generate", keyManager0.PrivateKey(), keyManager1.PrivateKey()) +// } +// } + +// // cursor errors +// func TestCursorErrors(t *testing.T) { +// memdb, _ := ethdb.NewMemDatabase() +// keyManager0 := NewDBKeyManager(memdb) +// err := keyManager0.Init("", 0, false) +// err = keyManager0.Init("", 1, false) +// if err == nil { +// t.Error("Expected cursor error") +// } +// err = keyManager0.SetCursor(1) +// if err == nil { +// t.Error("Expected cursor error") +// } +// } + +// func TestExportImport(t *testing.T) { +// memdb, _ := ethdb.NewMemDatabase() +// keyManager0 := NewDBKeyManager(memdb) +// err := keyManager0.Init("", 0, false) +// basedir0 := "/tmp/ethtest0" +// os.RemoveAll(basedir0) +// os.Mkdir(basedir0, 0777) +// keyManager0.Export(basedir0) + +// keyManager1 := NewFileKeyManager(basedir0) +// err = keyManager1.Init("", 0, false) +// if err != nil { +// t.Error("Unexpected error: ", err) +// } +// fmt.Printf("keyRing: %v\n", keyManager0.KeyPair()) +// fmt.Printf("keyRing: %v\n", keyManager1.KeyPair()) +// if string(keyManager0.PrivateKey()) != string(keyManager1.PrivateKey()) { +// t.Error("Expected private keys %x, %x, to be identical via export to filestore basedir", keyManager0.PrivateKey(), keyManager1.PrivateKey()) +// } +// path.Join("") + +// // memdb, _ = ethdb.NewMemDatabase() +// // keyManager2 := NewDBKeyManager(memdb) +// // err = keyManager2.InitFromSecretsFile("", 0, path.Join(basedir0, "default.prv")) +// // if err != nil { +// // t.Error("Unexpected error: ", err) +// // } +// // if string(keyManager0.PrivateKey()) != string(keyManager2.PrivateKey()) { +// // t.Error("Expected private keys %s, %s, to be identical via export/import prv", keyManager0.PrivateKey(), keyManager1.PrivateKey()) +// // } + +// // memdb, _ = ethdb.NewMemDatabase() +// // keyManager3 := NewDBKeyManager(memdb) +// // err = keyManager3.InitFromSecretsFile("", 0, path.Join(basedir0, "default.mne")) +// // if err != nil { +// // t.Error("Unexpected error: ", err) +// // } +// // if string(keyManager0.PrivateKey()) != string(keyManager3.PrivateKey()) { +// // t.Error("Expected private keys %s, %s, to be identical via export/import mnemonic file", keyManager0.PrivateKey(), keyManager1.PrivateKey()) +// // } +// } diff --git a/crypto/mnemonic.go b/crypto/mnemonic.go new file mode 100644 index 000000000..0d690f245 --- /dev/null +++ b/crypto/mnemonic.go @@ -0,0 +1,60 @@ +package crypto + +import ( + "fmt" + "strconv" +) + +// TODO: See if we can refactor this into a shared util lib if we need it multiple times +func IndexOf(slice []string, value string) int64 { + for p, v := range slice { + if v == value { + return int64(p) + } + } + return -1 +} + +func MnemonicEncode(message string) []string { + var out []string + n := int64(len(MnemonicWords)) + + for i := 0; i < len(message); i += (len(message) / 8) { + x := message[i : i+8] + bit, _ := strconv.ParseInt(x, 16, 64) + w1 := (bit % n) + w2 := ((bit / n) + w1) % n + w3 := ((bit / n / n) + w2) % n + out = append(out, MnemonicWords[w1], MnemonicWords[w2], MnemonicWords[w3]) + } + return out +} + +func MnemonicDecode(wordsar []string) string { + var out string + n := int64(len(MnemonicWords)) + + for i := 0; i < len(wordsar); i += 3 { + word1 := wordsar[i] + word2 := wordsar[i+1] + word3 := wordsar[i+2] + w1 := IndexOf(MnemonicWords, word1) + w2 := IndexOf(MnemonicWords, word2) + w3 := IndexOf(MnemonicWords, word3) + + y := (w2 - w1) % n + z := (w3 - w2) % n + + // Golang handles modulo with negative numbers different then most languages + // The modulo can be negative, we don't want that. + if z < 0 { + z += n + } + if y < 0 { + y += n + } + x := w1 + n*(y) + n*n*(z) + out += fmt.Sprintf("%08x", x) + } + return out +} diff --git a/crypto/mnemonic_test.go b/crypto/mnemonic_test.go new file mode 100644 index 000000000..beff476e0 --- /dev/null +++ b/crypto/mnemonic_test.go @@ -0,0 +1,74 @@ +package crypto + +import ( + "testing" +) + +func TestMnDecode(t *testing.T) { + words := []string{ + "ink", + "balance", + "gain", + "fear", + "happen", + "melt", + "mom", + "surface", + "stir", + "bottle", + "unseen", + "expression", + "important", + "curl", + "grant", + "fairy", + "across", + "back", + "figure", + "breast", + "nobody", + "scratch", + "worry", + "yesterday", + } + encode := "c61d43dc5bb7a4e754d111dae8105b6f25356492df5e50ecb33b858d94f8c338" + result := MnemonicDecode(words) + if encode != result { + t.Error("We expected", encode, "got", result, "instead") + } +} +func TestMnEncode(t *testing.T) { + encode := "c61d43dc5bb7a4e754d111dae8105b6f25356492df5e50ecb33b858d94f8c338" + result := []string{ + "ink", + "balance", + "gain", + "fear", + "happen", + "melt", + "mom", + "surface", + "stir", + "bottle", + "unseen", + "expression", + "important", + "curl", + "grant", + "fairy", + "across", + "back", + "figure", + "breast", + "nobody", + "scratch", + "worry", + "yesterday", + } + words := MnemonicEncode(encode) + for i, word := range words { + if word != result[i] { + t.Error("Mnenonic does not match:", words, result) + } + } +} diff --git a/crypto/mnemonic_words.go b/crypto/mnemonic_words.go new file mode 100644 index 000000000..ebd0d2690 --- /dev/null +++ b/crypto/mnemonic_words.go @@ -0,0 +1,1630 @@ +package crypto + +var MnemonicWords []string = []string{ + "like", + "just", + "love", + "know", + "never", + "want", + "time", + "out", + "there", + "make", + "look", + "eye", + "down", + "only", + "think", + "heart", + "back", + "then", + "into", + "about", + "more", + "away", + "still", + "them", + "take", + "thing", + "even", + "through", + "long", + "always", + "world", + "too", + "friend", + "tell", + "try", + "hand", + "thought", + "over", + "here", + "other", + "need", + "smile", + "again", + "much", + "cry", + "been", + "night", + "ever", + "little", + "said", + "end", + "some", + "those", + "around", + "mind", + "people", + "girl", + "leave", + "dream", + "left", + "turn", + "myself", + "give", + "nothing", + "really", + "off", + "before", + "something", + "find", + "walk", + "wish", + "good", + "once", + "place", + "ask", + "stop", + "keep", + "watch", + "seem", + "everything", + "wait", + "got", + "yet", + "made", + "remember", + "start", + "alone", + "run", + "hope", + "maybe", + "believe", + "body", + "hate", + "after", + "close", + "talk", + "stand", + "own", + "each", + "hurt", + "help", + "home", + "god", + "soul", + "new", + "many", + "two", + "inside", + "should", + "true", + "first", + "fear", + "mean", + "better", + "play", + "another", + "gone", + "change", + "use", + "wonder", + "someone", + "hair", + "cold", + "open", + "best", + "any", + "behind", + "happen", + "water", + "dark", + "laugh", + "stay", + "forever", + "name", + "work", + "show", + "sky", + "break", + "came", + "deep", + "door", + "put", + "black", + "together", + "upon", + "happy", + "such", + "great", + "white", + "matter", + "fill", + "past", + "please", + "burn", + "cause", + "enough", + "touch", + "moment", + "soon", + "voice", + "scream", + "anything", + "stare", + "sound", + "red", + "everyone", + "hide", + "kiss", + "truth", + "death", + "beautiful", + "mine", + "blood", + "broken", + "very", + "pass", + "next", + "forget", + "tree", + "wrong", + "air", + "mother", + "understand", + "lip", + "hit", + "wall", + "memory", + "sleep", + "free", + "high", + "realize", + "school", + "might", + "skin", + "sweet", + "perfect", + "blue", + "kill", + "breath", + "dance", + "against", + "fly", + "between", + "grow", + "strong", + "under", + "listen", + "bring", + "sometimes", + "speak", + "pull", + "person", + "become", + "family", + "begin", + "ground", + "real", + "small", + "father", + "sure", + "feet", + "rest", + "young", + "finally", + "land", + "across", + "today", + "different", + "guy", + "line", + "fire", + "reason", + "reach", + "second", + "slowly", + "write", + "eat", + "smell", + "mouth", + "step", + "learn", + "three", + "floor", + "promise", + "breathe", + "darkness", + "push", + "earth", + "guess", + "save", + "song", + "above", + "along", + "both", + "color", + "house", + "almost", + "sorry", + "anymore", + "brother", + "okay", + "dear", + "game", + "fade", + "already", + "apart", + "warm", + "beauty", + "heard", + "notice", + "question", + "shine", + "began", + "piece", + "whole", + "shadow", + "secret", + "street", + "within", + "finger", + "point", + "morning", + "whisper", + "child", + "moon", + "green", + "story", + "glass", + "kid", + "silence", + "since", + "soft", + "yourself", + "empty", + "shall", + "angel", + "answer", + "baby", + "bright", + "dad", + "path", + "worry", + "hour", + "drop", + "follow", + "power", + "war", + "half", + "flow", + "heaven", + "act", + "chance", + "fact", + "least", + "tired", + "children", + "near", + "quite", + "afraid", + "rise", + "sea", + "taste", + "window", + "cover", + "nice", + "trust", + "lot", + "sad", + "cool", + "force", + "peace", + "return", + "blind", + "easy", + "ready", + "roll", + "rose", + "drive", + "held", + "music", + "beneath", + "hang", + "mom", + "paint", + "emotion", + "quiet", + "clear", + "cloud", + "few", + "pretty", + "bird", + "outside", + "paper", + "picture", + "front", + "rock", + "simple", + "anyone", + "meant", + "reality", + "road", + "sense", + "waste", + "bit", + "leaf", + "thank", + "happiness", + "meet", + "men", + "smoke", + "truly", + "decide", + "self", + "age", + "book", + "form", + "alive", + "carry", + "escape", + "damn", + "instead", + "able", + "ice", + "minute", + "throw", + "catch", + "leg", + "ring", + "course", + "goodbye", + "lead", + "poem", + "sick", + "corner", + "desire", + "known", + "problem", + "remind", + "shoulder", + "suppose", + "toward", + "wave", + "drink", + "jump", + "woman", + "pretend", + "sister", + "week", + "human", + "joy", + "crack", + "grey", + "pray", + "surprise", + "dry", + "knee", + "less", + "search", + "bleed", + "caught", + "clean", + "embrace", + "future", + "king", + "son", + "sorrow", + "chest", + "hug", + "remain", + "sat", + "worth", + "blow", + "daddy", + "final", + "parent", + "tight", + "also", + "create", + "lonely", + "safe", + "cross", + "dress", + "evil", + "silent", + "bone", + "fate", + "perhaps", + "anger", + "class", + "scar", + "snow", + "tiny", + "tonight", + "continue", + "control", + "dog", + "edge", + "mirror", + "month", + "suddenly", + "comfort", + "given", + "loud", + "quickly", + "gaze", + "plan", + "rush", + "stone", + "town", + "battle", + "ignore", + "spirit", + "stood", + "stupid", + "yours", + "brown", + "build", + "dust", + "hey", + "kept", + "pay", + "phone", + "twist", + "although", + "ball", + "beyond", + "hidden", + "nose", + "taken", + "fail", + "float", + "pure", + "somehow", + "wash", + "wrap", + "angry", + "cheek", + "creature", + "forgotten", + "heat", + "rip", + "single", + "space", + "special", + "weak", + "whatever", + "yell", + "anyway", + "blame", + "job", + "choose", + "country", + "curse", + "drift", + "echo", + "figure", + "grew", + "laughter", + "neck", + "suffer", + "worse", + "yeah", + "disappear", + "foot", + "forward", + "knife", + "mess", + "somewhere", + "stomach", + "storm", + "beg", + "idea", + "lift", + "offer", + "breeze", + "field", + "five", + "often", + "simply", + "stuck", + "win", + "allow", + "confuse", + "enjoy", + "except", + "flower", + "seek", + "strength", + "calm", + "grin", + "gun", + "heavy", + "hill", + "large", + "ocean", + "shoe", + "sigh", + "straight", + "summer", + "tongue", + "accept", + "crazy", + "everyday", + "exist", + "grass", + "mistake", + "sent", + "shut", + "surround", + "table", + "ache", + "brain", + "destroy", + "heal", + "nature", + "shout", + "sign", + "stain", + "choice", + "doubt", + "glance", + "glow", + "mountain", + "queen", + "stranger", + "throat", + "tomorrow", + "city", + "either", + "fish", + "flame", + "rather", + "shape", + "spin", + "spread", + "ash", + "distance", + "finish", + "image", + "imagine", + "important", + "nobody", + "shatter", + "warmth", + "became", + "feed", + "flesh", + "funny", + "lust", + "shirt", + "trouble", + "yellow", + "attention", + "bare", + "bite", + "money", + "protect", + "amaze", + "appear", + "born", + "choke", + "completely", + "daughter", + "fresh", + "friendship", + "gentle", + "probably", + "six", + "deserve", + "expect", + "grab", + "middle", + "nightmare", + "river", + "thousand", + "weight", + "worst", + "wound", + "barely", + "bottle", + "cream", + "regret", + "relationship", + "stick", + "test", + "crush", + "endless", + "fault", + "itself", + "rule", + "spill", + "art", + "circle", + "join", + "kick", + "mask", + "master", + "passion", + "quick", + "raise", + "smooth", + "unless", + "wander", + "actually", + "broke", + "chair", + "deal", + "favorite", + "gift", + "note", + "number", + "sweat", + "box", + "chill", + "clothes", + "lady", + "mark", + "park", + "poor", + "sadness", + "tie", + "animal", + "belong", + "brush", + "consume", + "dawn", + "forest", + "innocent", + "pen", + "pride", + "stream", + "thick", + "clay", + "complete", + "count", + "draw", + "faith", + "press", + "silver", + "struggle", + "surface", + "taught", + "teach", + "wet", + "bless", + "chase", + "climb", + "enter", + "letter", + "melt", + "metal", + "movie", + "stretch", + "swing", + "vision", + "wife", + "beside", + "crash", + "forgot", + "guide", + "haunt", + "joke", + "knock", + "plant", + "pour", + "prove", + "reveal", + "steal", + "stuff", + "trip", + "wood", + "wrist", + "bother", + "bottom", + "crawl", + "crowd", + "fix", + "forgive", + "frown", + "grace", + "loose", + "lucky", + "party", + "release", + "surely", + "survive", + "teacher", + "gently", + "grip", + "speed", + "suicide", + "travel", + "treat", + "vein", + "written", + "cage", + "chain", + "conversation", + "date", + "enemy", + "however", + "interest", + "million", + "page", + "pink", + "proud", + "sway", + "themselves", + "winter", + "church", + "cruel", + "cup", + "demon", + "experience", + "freedom", + "pair", + "pop", + "purpose", + "respect", + "shoot", + "softly", + "state", + "strange", + "bar", + "birth", + "curl", + "dirt", + "excuse", + "lord", + "lovely", + "monster", + "order", + "pack", + "pants", + "pool", + "scene", + "seven", + "shame", + "slide", + "ugly", + "among", + "blade", + "blonde", + "closet", + "creek", + "deny", + "drug", + "eternity", + "gain", + "grade", + "handle", + "key", + "linger", + "pale", + "prepare", + "swallow", + "swim", + "tremble", + "wheel", + "won", + "cast", + "cigarette", + "claim", + "college", + "direction", + "dirty", + "gather", + "ghost", + "hundred", + "loss", + "lung", + "orange", + "present", + "swear", + "swirl", + "twice", + "wild", + "bitter", + "blanket", + "doctor", + "everywhere", + "flash", + "grown", + "knowledge", + "numb", + "pressure", + "radio", + "repeat", + "ruin", + "spend", + "unknown", + "buy", + "clock", + "devil", + "early", + "false", + "fantasy", + "pound", + "precious", + "refuse", + "sheet", + "teeth", + "welcome", + "add", + "ahead", + "block", + "bury", + "caress", + "content", + "depth", + "despite", + "distant", + "marry", + "purple", + "threw", + "whenever", + "bomb", + "dull", + "easily", + "grasp", + "hospital", + "innocence", + "normal", + "receive", + "reply", + "rhyme", + "shade", + "someday", + "sword", + "toe", + "visit", + "asleep", + "bought", + "center", + "consider", + "flat", + "hero", + "history", + "ink", + "insane", + "muscle", + "mystery", + "pocket", + "reflection", + "shove", + "silently", + "smart", + "soldier", + "spot", + "stress", + "train", + "type", + "view", + "whether", + "bus", + "energy", + "explain", + "holy", + "hunger", + "inch", + "magic", + "mix", + "noise", + "nowhere", + "prayer", + "presence", + "shock", + "snap", + "spider", + "study", + "thunder", + "trail", + "admit", + "agree", + "bag", + "bang", + "bound", + "butterfly", + "cute", + "exactly", + "explode", + "familiar", + "fold", + "further", + "pierce", + "reflect", + "scent", + "selfish", + "sharp", + "sink", + "spring", + "stumble", + "universe", + "weep", + "women", + "wonderful", + "action", + "ancient", + "attempt", + "avoid", + "birthday", + "branch", + "chocolate", + "core", + "depress", + "drunk", + "especially", + "focus", + "fruit", + "honest", + "match", + "palm", + "perfectly", + "pillow", + "pity", + "poison", + "roar", + "shift", + "slightly", + "thump", + "truck", + "tune", + "twenty", + "unable", + "wipe", + "wrote", + "coat", + "constant", + "dinner", + "drove", + "egg", + "eternal", + "flight", + "flood", + "frame", + "freak", + "gasp", + "glad", + "hollow", + "motion", + "peer", + "plastic", + "root", + "screen", + "season", + "sting", + "strike", + "team", + "unlike", + "victim", + "volume", + "warn", + "weird", + "attack", + "await", + "awake", + "built", + "charm", + "crave", + "despair", + "fought", + "grant", + "grief", + "horse", + "limit", + "message", + "ripple", + "sanity", + "scatter", + "serve", + "split", + "string", + "trick", + "annoy", + "blur", + "boat", + "brave", + "clearly", + "cling", + "connect", + "fist", + "forth", + "imagination", + "iron", + "jock", + "judge", + "lesson", + "milk", + "misery", + "nail", + "naked", + "ourselves", + "poet", + "possible", + "princess", + "sail", + "size", + "snake", + "society", + "stroke", + "torture", + "toss", + "trace", + "wise", + "bloom", + "bullet", + "cell", + "check", + "cost", + "darling", + "during", + "footstep", + "fragile", + "hallway", + "hardly", + "horizon", + "invisible", + "journey", + "midnight", + "mud", + "nod", + "pause", + "relax", + "shiver", + "sudden", + "value", + "youth", + "abuse", + "admire", + "blink", + "breast", + "bruise", + "constantly", + "couple", + "creep", + "curve", + "difference", + "dumb", + "emptiness", + "gotta", + "honor", + "plain", + "planet", + "recall", + "rub", + "ship", + "slam", + "soar", + "somebody", + "tightly", + "weather", + "adore", + "approach", + "bond", + "bread", + "burst", + "candle", + "coffee", + "cousin", + "crime", + "desert", + "flutter", + "frozen", + "grand", + "heel", + "hello", + "language", + "level", + "movement", + "pleasure", + "powerful", + "random", + "rhythm", + "settle", + "silly", + "slap", + "sort", + "spoken", + "steel", + "threaten", + "tumble", + "upset", + "aside", + "awkward", + "bee", + "blank", + "board", + "button", + "card", + "carefully", + "complain", + "crap", + "deeply", + "discover", + "drag", + "dread", + "effort", + "entire", + "fairy", + "giant", + "gotten", + "greet", + "illusion", + "jeans", + "leap", + "liquid", + "march", + "mend", + "nervous", + "nine", + "replace", + "rope", + "spine", + "stole", + "terror", + "accident", + "apple", + "balance", + "boom", + "childhood", + "collect", + "demand", + "depression", + "eventually", + "faint", + "glare", + "goal", + "group", + "honey", + "kitchen", + "laid", + "limb", + "machine", + "mere", + "mold", + "murder", + "nerve", + "painful", + "poetry", + "prince", + "rabbit", + "shelter", + "shore", + "shower", + "soothe", + "stair", + "steady", + "sunlight", + "tangle", + "tease", + "treasure", + "uncle", + "begun", + "bliss", + "canvas", + "cheer", + "claw", + "clutch", + "commit", + "crimson", + "crystal", + "delight", + "doll", + "existence", + "express", + "fog", + "football", + "gay", + "goose", + "guard", + "hatred", + "illuminate", + "mass", + "math", + "mourn", + "rich", + "rough", + "skip", + "stir", + "student", + "style", + "support", + "thorn", + "tough", + "yard", + "yearn", + "yesterday", + "advice", + "appreciate", + "autumn", + "bank", + "beam", + "bowl", + "capture", + "carve", + "collapse", + "confusion", + "creation", + "dove", + "feather", + "girlfriend", + "glory", + "government", + "harsh", + "hop", + "inner", + "loser", + "moonlight", + "neighbor", + "neither", + "peach", + "pig", + "praise", + "screw", + "shield", + "shimmer", + "sneak", + "stab", + "subject", + "throughout", + "thrown", + "tower", + "twirl", + "wow", + "army", + "arrive", + "bathroom", + "bump", + "cease", + "cookie", + "couch", + "courage", + "dim", + "guilt", + "howl", + "hum", + "husband", + "insult", + "led", + "lunch", + "mock", + "mostly", + "natural", + "nearly", + "needle", + "nerd", + "peaceful", + "perfection", + "pile", + "price", + "remove", + "roam", + "sanctuary", + "serious", + "shiny", + "shook", + "sob", + "stolen", + "tap", + "vain", + "void", + "warrior", + "wrinkle", + "affection", + "apologize", + "blossom", + "bounce", + "bridge", + "cheap", + "crumble", + "decision", + "descend", + "desperately", + "dig", + "dot", + "flip", + "frighten", + "heartbeat", + "huge", + "lazy", + "lick", + "odd", + "opinion", + "process", + "puzzle", + "quietly", + "retreat", + "score", + "sentence", + "separate", + "situation", + "skill", + "soak", + "square", + "stray", + "taint", + "task", + "tide", + "underneath", + "veil", + "whistle", + "anywhere", + "bedroom", + "bid", + "bloody", + "burden", + "careful", + "compare", + "concern", + "curtain", + "decay", + "defeat", + "describe", + "double", + "dreamer", + "driver", + "dwell", + "evening", + "flare", + "flicker", + "grandma", + "guitar", + "harm", + "horrible", + "hungry", + "indeed", + "lace", + "melody", + "monkey", + "nation", + "object", + "obviously", + "rainbow", + "salt", + "scratch", + "shown", + "shy", + "stage", + "stun", + "third", + "tickle", + "useless", + "weakness", + "worship", + "worthless", + "afternoon", + "beard", + "boyfriend", + "bubble", + "busy", + "certain", + "chin", + "concrete", + "desk", + "diamond", + "doom", + "drawn", + "due", + "felicity", + "freeze", + "frost", + "garden", + "glide", + "harmony", + "hopefully", + "hunt", + "jealous", + "lightning", + "mama", + "mercy", + "peel", + "physical", + "position", + "pulse", + "punch", + "quit", + "rant", + "respond", + "salty", + "sane", + "satisfy", + "savior", + "sheep", + "slept", + "social", + "sport", + "tuck", + "utter", + "valley", + "wolf", + "aim", + "alas", + "alter", + "arrow", + "awaken", + "beaten", + "belief", + "brand", + "ceiling", + "cheese", + "clue", + "confidence", + "connection", + "daily", + "disguise", + "eager", + "erase", + "essence", + "everytime", + "expression", + "fan", + "flag", + "flirt", + "foul", + "fur", + "giggle", + "glorious", + "ignorance", + "law", + "lifeless", + "measure", + "mighty", + "muse", + "north", + "opposite", + "paradise", + "patience", + "patient", + "pencil", + "petal", + "plate", + "ponder", + "possibly", + "practice", + "slice", + "spell", + "stock", + "strife", + "strip", + "suffocate", + "suit", + "tender", + "tool", + "trade", + "velvet", + "verse", + "waist", + "witch", + "aunt", + "bench", + "bold", + "cap", + "certainly", + "click", + "companion", + "creator", + "dart", + "delicate", + "determine", + "dish", + "dragon", + "drama", + "drum", + "dude", + "everybody", + "feast", + "forehead", + "former", + "fright", + "fully", + "gas", + "hook", + "hurl", + "invite", + "juice", + "manage", + "moral", + "possess", + "raw", + "rebel", + "royal", + "scale", + "scary", + "several", + "slight", + "stubborn", + "swell", + "talent", + "tea", + "terrible", + "thread", + "torment", + "trickle", + "usually", + "vast", + "violence", + "weave", + "acid", + "agony", + "ashamed", + "awe", + "belly", + "blend", + "blush", + "character", + "cheat", + "common", + "company", + "coward", + "creak", + "danger", + "deadly", + "defense", + "define", + "depend", + "desperate", + "destination", + "dew", + "duck", + "dusty", + "embarrass", + "engine", + "example", + "explore", + "foe", + "freely", + "frustrate", + "generation", + "glove", + "guilty", + "health", + "hurry", + "idiot", + "impossible", + "inhale", + "jaw", + "kingdom", + "mention", + "mist", + "moan", + "mumble", + "mutter", + "observe", + "ode", + "pathetic", + "pattern", + "pie", + "prefer", + "puff", + "rape", + "rare", + "revenge", + "rude", + "scrape", + "spiral", + "squeeze", + "strain", + "sunset", + "suspend", + "sympathy", + "thigh", + "throne", + "total", + "unseen", + "weapon", + "weary", +} diff --git a/ethdb/.gitignore b/ethdb/.gitignore new file mode 100644 index 000000000..f725d58d1 --- /dev/null +++ b/ethdb/.gitignore @@ -0,0 +1,12 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. +# +# If you find yourself ignoring temporary files generated by your text editor +# or operating system, you probably want to add a global ignore instead: +# git config --global core.excludesfile ~/.gitignore_global + +/tmp +*/**/*un~ +*un~ +.DS_Store +*/**/.DS_Store + diff --git a/ethdb/README.md b/ethdb/README.md new file mode 100644 index 000000000..5bed8eedc --- /dev/null +++ b/ethdb/README.md @@ -0,0 +1,11 @@ +# ethdb + +The ethdb package contains the ethereum database interfaces + +# Installation + +`go get github.com/ethereum/ethdb-go` + +# Usage + +Todo :-) diff --git a/ethdb/database.go b/ethdb/database.go new file mode 100644 index 000000000..19aa83466 --- /dev/null +++ b/ethdb/database.go @@ -0,0 +1,89 @@ +package ethdb + +import ( + "fmt" + "path" + + "github.com/ethereum/go-ethereum/compression/rle" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/syndtr/goleveldb/leveldb" + "github.com/syndtr/goleveldb/leveldb/iterator" +) + +type LDBDatabase struct { + db *leveldb.DB + comp bool +} + +func NewLDBDatabase(name string) (*LDBDatabase, error) { + dbPath := path.Join(ethutil.Config.ExecPath, name) + + // Open the db + db, err := leveldb.OpenFile(dbPath, nil) + if err != nil { + return nil, err + } + + database := &LDBDatabase{db: db, comp: true} + + return database, nil +} + +func (self *LDBDatabase) Put(key []byte, value []byte) { + if self.comp { + value = rle.Compress(value) + } + + err := self.db.Put(key, value, nil) + if err != nil { + fmt.Println("Error put", err) + } +} + +func (self *LDBDatabase) Get(key []byte) ([]byte, error) { + dat, err := self.db.Get(key, nil) + if err != nil { + return nil, err + } + + if self.comp { + return rle.Decompress(dat) + } + + return dat, nil +} + +func (self *LDBDatabase) Delete(key []byte) error { + return self.db.Delete(key, nil) +} + +func (self *LDBDatabase) LastKnownTD() []byte { + data, _ := self.Get([]byte("LTD")) + + if len(data) == 0 { + data = []byte{0x0} + } + + return data +} + +func (self *LDBDatabase) NewIterator() iterator.Iterator { + return self.db.NewIterator(nil, nil) +} + +func (self *LDBDatabase) Close() { + // Close the leveldb database + self.db.Close() +} + +func (self *LDBDatabase) Print() { + iter := self.db.NewIterator(nil, nil) + for iter.Next() { + key := iter.Key() + value := iter.Value() + + fmt.Printf("%x(%d): ", key, len(key)) + node := ethutil.NewValueFromBytes(value) + fmt.Printf("%v\n", node) + } +} diff --git a/ethdb/database_test.go b/ethdb/database_test.go new file mode 100644 index 000000000..2cbaf58e0 --- /dev/null +++ b/ethdb/database_test.go @@ -0,0 +1,28 @@ +package ethdb + +/* +import ( + "bytes" + "testing" +) + +func TestCompression(t *testing.T) { + ethutil.ReadConfig("", "/tmp", "") + + db, err := NewLDBDatabase("testdb") + if err != nil { + t.Fatal(err) + } + + in := make([]byte, 10) + db.Put([]byte("test1"), in) + out, err := db.Get([]byte("test1")) + if err != nil { + t.Fatal(err) + } + + if bytes.Compare(out, in) != 0 { + t.Error("put get", in, out) + } +} +*/ diff --git a/ethdb/memory_database.go b/ethdb/memory_database.go new file mode 100644 index 000000000..48aa830e7 --- /dev/null +++ b/ethdb/memory_database.go @@ -0,0 +1,67 @@ +package ethdb + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/ethutil" +) + +/* + * This is a test memory database. Do not use for any production it does not get persisted + */ +type MemDatabase struct { + db map[string][]byte +} + +func NewMemDatabase() (*MemDatabase, error) { + db := &MemDatabase{db: make(map[string][]byte)} + + return db, nil +} + +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 +} + +/* +func (db *MemDatabase) GetKeys() []*ethutil.Key { + data, _ := db.Get([]byte("KeyRing")) + + return []*ethutil.Key{ethutil.NewKeyFromBytes(data)} +} +*/ + +func (db *MemDatabase) Delete(key []byte) error { + delete(db.db, string(key)) + + return nil +} + +func (db *MemDatabase) Print() { + for key, val := range db.db { + fmt.Printf("%x(%d): ", key, len(key)) + node := ethutil.NewValueFromBytes(val) + fmt.Printf("%q\n", node.Interface()) + } +} + +func (db *MemDatabase) Close() { +} + +func (db *MemDatabase) LastKnownTD() []byte { + data, _ := db.Get([]byte("LastKnownTotalDifficulty")) + + if len(data) == 0 || data == nil { + data = []byte{0x0} + } + + return data +} diff --git a/ethereum.go b/ethereum.go new file mode 100644 index 000000000..5d74e28e9 --- /dev/null +++ b/ethereum.go @@ -0,0 +1,659 @@ +package eth + +import ( + "container/list" + "encoding/json" + "fmt" + "math/big" + "math/rand" + "net" + "path" + "strconv" + "strings" + "sync" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/state" + "github.com/ethereum/go-ethereum/wire" +) + +const ( + seedTextFileUri string = "http://www.ethereum.org/servers.poc3.txt" + seedNodeAddress = "poc-7.ethdev.com:30303" +) + +var loggerger = logger.NewLogger("SERV") + +func eachPeer(peers *list.List, callback func(*Peer, *list.Element)) { + // Loop thru the peers and close them (if we had them) + for e := peers.Front(); e != nil; e = e.Next() { + callback(e.Value.(*Peer), e) + } +} + +const ( + processReapingTimeout = 60 // TODO increase +) + +type Ethereum struct { + // Channel for shutting down the ethereum + shutdownChan chan bool + quit chan bool + + // DB interface + db ethutil.Database + // State manager for processing new blocks and managing the over all states + blockManager *core.BlockManager + // The transaction pool. Transaction can be pushed on this pool + // for later including in the blocks + txPool *core.TxPool + // The canonical chain + blockChain *core.ChainManager + // The block pool + blockPool *BlockPool + // Eventer + eventMux event.TypeMux + // Peers + peers *list.List + // Nonce + Nonce uint64 + + Addr net.Addr + Port string + + blacklist [][]byte + + peerMut sync.Mutex + + // Capabilities for outgoing peers + serverCaps Caps + + nat NAT + + // Specifies the desired amount of maximum peers + MaxPeers int + + Mining bool + + listening bool + + RpcServer *rpc.JsonRpcServer + + keyManager *crypto.KeyManager + + clientIdentity wire.ClientIdentity + + isUpToDate bool + + filterMu sync.RWMutex + filterId int + filters map[int]*core.Filter +} + +func New(db ethutil.Database, clientIdentity wire.ClientIdentity, keyManager *crypto.KeyManager, caps Caps, usePnp bool) (*Ethereum, error) { + var err error + var nat NAT + + if usePnp { + nat, err = Discover() + if err != nil { + loggerger.Debugln("UPnP failed", err) + } + } + + bootstrapDb(db) + + ethutil.Config.Db = db + + nonce, _ := ethutil.RandomUint64() + ethereum := &Ethereum{ + shutdownChan: make(chan bool), + quit: make(chan bool), + db: db, + peers: list.New(), + Nonce: nonce, + serverCaps: caps, + nat: nat, + keyManager: keyManager, + clientIdentity: clientIdentity, + isUpToDate: true, + filters: make(map[int]*core.Filter), + } + + ethereum.blockPool = NewBlockPool(ethereum) + ethereum.blockChain = core.NewChainManager(ethereum.EventMux()) + ethereum.txPool = core.NewTxPool(ethereum.blockChain, ethereum, ethereum.EventMux()) + ethereum.blockManager = core.NewBlockManager(ethereum.txPool, ethereum.blockChain, ethereum.EventMux()) + ethereum.blockChain.SetProcessor(ethereum.blockManager) + + // Start the tx pool + ethereum.txPool.Start() + + return ethereum, nil +} + +func (s *Ethereum) KeyManager() *crypto.KeyManager { + return s.keyManager +} + +func (s *Ethereum) ClientIdentity() wire.ClientIdentity { + return s.clientIdentity +} + +func (s *Ethereum) ChainManager() *core.ChainManager { + return s.blockChain +} + +func (s *Ethereum) BlockManager() *core.BlockManager { + return s.blockManager +} + +func (s *Ethereum) TxPool() *core.TxPool { + return s.txPool +} +func (s *Ethereum) BlockPool() *BlockPool { + return s.blockPool +} +func (s *Ethereum) EventMux() *event.TypeMux { + return &s.eventMux +} +func (self *Ethereum) Db() ethutil.Database { + return self.db +} + +func (s *Ethereum) ServerCaps() Caps { + return s.serverCaps +} +func (s *Ethereum) IsMining() bool { + return s.Mining +} +func (s *Ethereum) PeerCount() int { + return s.peers.Len() +} +func (s *Ethereum) IsUpToDate() bool { + upToDate := true + eachPeer(s.peers, func(peer *Peer, e *list.Element) { + if atomic.LoadInt32(&peer.connected) == 1 { + if peer.catchingUp == true && peer.versionKnown { + upToDate = false + } + } + }) + return upToDate +} +func (s *Ethereum) PushPeer(peer *Peer) { + s.peers.PushBack(peer) +} +func (s *Ethereum) IsListening() bool { + return s.listening +} + +func (s *Ethereum) HighestTDPeer() (td *big.Int) { + td = big.NewInt(0) + + eachPeer(s.peers, func(p *Peer, v *list.Element) { + if p.td.Cmp(td) > 0 { + td = p.td + } + }) + + return +} + +func (self *Ethereum) BlacklistPeer(peer *Peer) { + self.blacklist = append(self.blacklist, peer.pubkey) +} + +func (s *Ethereum) AddPeer(conn net.Conn) { + peer := NewPeer(conn, s, true) + + if peer != nil { + if s.peers.Len() < s.MaxPeers { + peer.Start() + } else { + loggerger.Debugf("Max connected peers reached. Not adding incoming peer.") + } + } +} + +func (s *Ethereum) ProcessPeerList(addrs []string) { + for _, addr := range addrs { + // TODO Probably requires some sanity checks + s.ConnectToPeer(addr) + } +} + +func (s *Ethereum) ConnectToPeer(addr string) error { + if s.peers.Len() < s.MaxPeers { + var alreadyConnected bool + + ahost, aport, _ := net.SplitHostPort(addr) + var chost string + + ips, err := net.LookupIP(ahost) + + if err != nil { + return err + } else { + // If more then one ip is available try stripping away the ipv6 ones + if len(ips) > 1 { + var ipsv4 []net.IP + // For now remove the ipv6 addresses + for _, ip := range ips { + if strings.Contains(ip.String(), "::") { + continue + } else { + ipsv4 = append(ipsv4, ip) + } + } + if len(ipsv4) == 0 { + return fmt.Errorf("[SERV] No IPV4 addresses available for hostname") + } + + // Pick a random ipv4 address, simulating round-robin DNS. + rand.Seed(time.Now().UTC().UnixNano()) + i := rand.Intn(len(ipsv4)) + chost = ipsv4[i].String() + } else { + if len(ips) == 0 { + return fmt.Errorf("[SERV] No IPs resolved for the given hostname") + return nil + } + chost = ips[0].String() + } + } + + eachPeer(s.peers, func(p *Peer, v *list.Element) { + if p.conn == nil { + return + } + phost, pport, _ := net.SplitHostPort(p.conn.RemoteAddr().String()) + + if phost == chost && pport == aport { + alreadyConnected = true + //loggerger.Debugf("Peer %s already added.\n", chost) + return + } + }) + + if alreadyConnected { + return nil + } + + NewOutboundPeer(addr, s, s.serverCaps) + } + + return nil +} + +func (s *Ethereum) OutboundPeers() []*Peer { + // Create a new peer slice with at least the length of the total peers + outboundPeers := make([]*Peer, s.peers.Len()) + length := 0 + eachPeer(s.peers, func(p *Peer, e *list.Element) { + if !p.inbound && p.conn != nil { + outboundPeers[length] = p + length++ + } + }) + + return outboundPeers[:length] +} + +func (s *Ethereum) InboundPeers() []*Peer { + // Create a new peer slice with at least the length of the total peers + inboundPeers := make([]*Peer, s.peers.Len()) + length := 0 + eachPeer(s.peers, func(p *Peer, e *list.Element) { + if p.inbound { + inboundPeers[length] = p + length++ + } + }) + + return inboundPeers[:length] +} + +func (s *Ethereum) InOutPeers() []*Peer { + // Reap the dead peers first + s.reapPeers() + + // Create a new peer slice with at least the length of the total peers + inboundPeers := make([]*Peer, s.peers.Len()) + length := 0 + eachPeer(s.peers, func(p *Peer, e *list.Element) { + // Only return peers with an actual ip + if len(p.host) > 0 { + inboundPeers[length] = p + length++ + } + }) + + return inboundPeers[:length] +} + +func (s *Ethereum) Broadcast(msgType wire.MsgType, data []interface{}) { + msg := wire.NewMessage(msgType, data) + s.BroadcastMsg(msg) +} + +func (s *Ethereum) BroadcastMsg(msg *wire.Msg) { + eachPeer(s.peers, func(p *Peer, e *list.Element) { + p.QueueMessage(msg) + }) +} + +func (s *Ethereum) Peers() *list.List { + return s.peers +} + +func (s *Ethereum) reapPeers() { + eachPeer(s.peers, func(p *Peer, e *list.Element) { + if atomic.LoadInt32(&p.disconnect) == 1 || (p.inbound && (time.Now().Unix()-p.lastPong) > int64(5*time.Minute)) { + s.removePeerElement(e) + } + }) +} + +func (s *Ethereum) removePeerElement(e *list.Element) { + s.peerMut.Lock() + defer s.peerMut.Unlock() + + s.peers.Remove(e) + + s.eventMux.Post(PeerListEvent{s.peers}) +} + +func (s *Ethereum) RemovePeer(p *Peer) { + eachPeer(s.peers, func(peer *Peer, e *list.Element) { + if peer == p { + s.removePeerElement(e) + } + }) +} + +func (s *Ethereum) reapDeadPeerHandler() { + reapTimer := time.NewTicker(processReapingTimeout * time.Second) + + for { + select { + case <-reapTimer.C: + s.reapPeers() + } + } +} + +// Start the ethereum +func (s *Ethereum) Start(seed bool) { + s.blockPool.Start() + + // Bind to addr and port + ln, err := net.Listen("tcp", ":"+s.Port) + if err != nil { + loggerger.Warnf("Port %s in use. Connection listening disabled. Acting as client", s.Port) + s.listening = false + } else { + s.listening = true + // Starting accepting connections + loggerger.Infoln("Ready and accepting connections") + // Start the peer handler + go s.peerHandler(ln) + } + + if s.nat != nil { + go s.upnpUpdateThread() + } + + // Start the reaping processes + go s.reapDeadPeerHandler() + go s.update() + go s.filterLoop() + + if seed { + s.Seed() + } + s.ConnectToPeer("localhost:40404") + loggerger.Infoln("Server started") +} + +func (s *Ethereum) Seed() { + // Sorry Py person. I must blacklist. you perform badly + s.blacklist = append(s.blacklist, ethutil.Hex2Bytes("64656330303561383532336435376331616537643864663236623336313863373537353163636634333530626263396330346237336262623931383064393031")) + ips := PastPeers() + if len(ips) > 0 { + for _, ip := range ips { + loggerger.Infoln("Connecting to previous peer ", ip) + s.ConnectToPeer(ip) + } + } else { + loggerger.Debugln("Retrieving seed nodes") + + // Eth-Go Bootstrapping + ips, er := net.LookupIP("seed.bysh.me") + if er == nil { + peers := []string{} + for _, ip := range ips { + node := fmt.Sprintf("%s:%d", ip.String(), 30303) + loggerger.Debugln("Found DNS Go Peer:", node) + peers = append(peers, node) + } + s.ProcessPeerList(peers) + } + + // Official DNS Bootstrapping + _, nodes, err := net.LookupSRV("eth", "tcp", "ethereum.org") + if err == nil { + peers := []string{} + // Iterate SRV nodes + for _, n := range nodes { + target := n.Target + port := strconv.Itoa(int(n.Port)) + // Resolve target to ip (Go returns list, so may resolve to multiple ips?) + addr, err := net.LookupHost(target) + if err == nil { + for _, a := range addr { + // Build string out of SRV port and Resolved IP + peer := net.JoinHostPort(a, port) + loggerger.Debugln("Found DNS Bootstrap Peer:", peer) + peers = append(peers, peer) + } + } else { + loggerger.Debugln("Couldn't resolve :", target) + } + } + // Connect to Peer list + s.ProcessPeerList(peers) + } + + s.ConnectToPeer(seedNodeAddress) + } +} + +func (s *Ethereum) peerHandler(listener net.Listener) { + for { + conn, err := listener.Accept() + if err != nil { + loggerger.Debugln(err) + + continue + } + + go s.AddPeer(conn) + } +} + +func (s *Ethereum) Stop() { + // Stop eventMux first, it will close all subscriptions. + s.eventMux.Stop() + + // Close the database + defer s.db.Close() + + var ips []string + eachPeer(s.peers, func(p *Peer, e *list.Element) { + ips = append(ips, p.conn.RemoteAddr().String()) + }) + + if len(ips) > 0 { + d, _ := json.MarshalIndent(ips, "", " ") + ethutil.WriteFile(path.Join(ethutil.Config.ExecPath, "known_peers.json"), d) + } + + eachPeer(s.peers, func(p *Peer, e *list.Element) { + p.Stop() + }) + + close(s.quit) + + if s.RpcServer != nil { + s.RpcServer.Stop() + } + s.txPool.Stop() + s.blockPool.Stop() + + loggerger.Infoln("Server stopped") + close(s.shutdownChan) +} + +// This function will wait for a shutdown and resumes main thread execution +func (s *Ethereum) WaitForShutdown() { + <-s.shutdownChan +} + +func (s *Ethereum) upnpUpdateThread() { + // Go off immediately to prevent code duplication, thereafter we renew + // lease every 15 minutes. + timer := time.NewTimer(5 * time.Minute) + lport, _ := strconv.ParseInt(s.Port, 10, 16) + first := true +out: + for { + select { + case <-timer.C: + var err error + _, err = s.nat.AddPortMapping("TCP", int(lport), int(lport), "eth listen port", 20*60) + if err != nil { + loggerger.Debugln("can't add UPnP port mapping:", err) + break out + } + if first && err == nil { + _, err = s.nat.GetExternalAddress() + if err != nil { + loggerger.Debugln("UPnP can't get external address:", err) + continue out + } + first = false + } + timer.Reset(time.Minute * 15) + case <-s.quit: + break out + } + } + + timer.Stop() + + if err := s.nat.DeletePortMapping("TCP", int(lport), int(lport)); err != nil { + loggerger.Debugln("unable to remove UPnP port mapping:", err) + } else { + loggerger.Debugln("succesfully disestablished UPnP port mapping") + } +} + +func (self *Ethereum) update() { + upToDateTimer := time.NewTicker(1 * time.Second) + +out: + for { + select { + case <-upToDateTimer.C: + if self.IsUpToDate() && !self.isUpToDate { + self.eventMux.Post(ChainSyncEvent{false}) + self.isUpToDate = true + } else if !self.IsUpToDate() && self.isUpToDate { + self.eventMux.Post(ChainSyncEvent{true}) + self.isUpToDate = false + } + case <-self.quit: + break out + } + } +} + +// InstallFilter adds filter for blockchain events. +// The filter's callbacks will run for matching blocks and messages. +// The filter should not be modified after it has been installed. +func (self *Ethereum) InstallFilter(filter *core.Filter) (id int) { + self.filterMu.Lock() + id = self.filterId + self.filters[id] = filter + self.filterId++ + self.filterMu.Unlock() + return id +} + +func (self *Ethereum) UninstallFilter(id int) { + self.filterMu.Lock() + delete(self.filters, id) + self.filterMu.Unlock() +} + +// GetFilter retrieves a filter installed using InstallFilter. +// The filter may not be modified. +func (self *Ethereum) GetFilter(id int) *core.Filter { + self.filterMu.RLock() + defer self.filterMu.RUnlock() + return self.filters[id] +} + +func (self *Ethereum) filterLoop() { + // Subscribe to events + events := self.eventMux.Subscribe(core.NewBlockEvent{}, state.Messages(nil)) + for event := range events.Chan() { + switch event := event.(type) { + case core.NewBlockEvent: + self.filterMu.RLock() + for _, filter := range self.filters { + if filter.BlockCallback != nil { + filter.BlockCallback(event.Block) + } + } + self.filterMu.RUnlock() + + case state.Messages: + self.filterMu.RLock() + for _, filter := range self.filters { + if filter.MessageCallback != nil { + msgs := filter.FilterMessages(event) + if len(msgs) > 0 { + filter.MessageCallback(msgs) + } + } + } + self.filterMu.RUnlock() + } + } +} + +func bootstrapDb(db ethutil.Database) { + d, _ := db.Get([]byte("ProtocolVersion")) + protov := ethutil.NewValue(d).Uint() + + if protov == 0 { + db.Put([]byte("ProtocolVersion"), ethutil.NewValue(ProtocolVersion).Bytes()) + } +} + +func PastPeers() []string { + var ips []string + data, _ := ethutil.ReadAllFile(path.Join(ethutil.Config.ExecPath, "known_peers.json")) + json.Unmarshal([]byte(data), &ips) + + return ips +} diff --git a/ethereum/cmd.go b/ethereum/cmd.go deleted file mode 100644 index 5ddc91619..000000000 --- a/ethereum/cmd.go +++ /dev/null @@ -1,35 +0,0 @@ -package main - -import ( - "io/ioutil" - "os" - - "github.com/ethereum/eth-go" - "github.com/ethereum/go-ethereum/ethereum/repl" - "github.com/ethereum/go-ethereum/javascript" - "github.com/ethereum/go-ethereum/utils" -) - -func InitJsConsole(ethereum *eth.Ethereum) { - repl := ethrepl.NewJSRepl(ethereum) - go repl.Start() - utils.RegisterInterrupt(func(os.Signal) { - repl.Stop() - }) -} - -func ExecJsFile(ethereum *eth.Ethereum, InputFile string) { - file, err := os.Open(InputFile) - if err != nil { - logger.Fatalln(err) - } - content, err := ioutil.ReadAll(file) - if err != nil { - logger.Fatalln(err) - } - re := javascript.NewJSRE(ethereum) - utils.RegisterInterrupt(func(os.Signal) { - re.Stop() - }) - re.Run(string(content)) -} diff --git a/ethereum/repl/repl_windows.go b/ethereum/repl/repl_windows.go deleted file mode 100644 index 4106c89bc..000000000 --- a/ethereum/repl/repl_windows.go +++ /dev/null @@ -1,24 +0,0 @@ -package ethrepl - -import ( - "bufio" - "fmt" - "os" -) - -func (self *JSRepl) read() { - reader := bufio.NewReader(os.Stdin) - for { - fmt.Printf(self.prompt) - str, _, err := reader.ReadLine() - if err != nil { - fmt.Println("Error reading input", err) - } else { - self.parseInput(string(str)) - } - } -} - -func (self *JSRepl) PrintValue(value otto.Value) { - fmt.Println(value) -} diff --git a/ethutil/.gitignore b/ethutil/.gitignore new file mode 100644 index 000000000..f725d58d1 --- /dev/null +++ b/ethutil/.gitignore @@ -0,0 +1,12 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. +# +# If you find yourself ignoring temporary files generated by your text editor +# or operating system, you probably want to add a global ignore instead: +# git config --global core.excludesfile ~/.gitignore_global + +/tmp +*/**/*un~ +*un~ +.DS_Store +*/**/.DS_Store + diff --git a/ethutil/.travis.yml b/ethutil/.travis.yml new file mode 100644 index 000000000..69359072d --- /dev/null +++ b/ethutil/.travis.yml @@ -0,0 +1,3 @@ +language: go +go: + - 1.2 diff --git a/ethutil/README.md b/ethutil/README.md new file mode 100644 index 000000000..1ed56b71b --- /dev/null +++ b/ethutil/README.md @@ -0,0 +1,139 @@ +# ethutil + +[![Build +Status](https://travis-ci.org/ethereum/go-ethereum.png?branch=master)](https://travis-ci.org/ethereum/go-ethereum) + +The ethutil package contains the ethereum utility library. + +# Installation + +`go get github.com/ethereum/ethutil-go` + +# Usage + +## RLP (Recursive Linear Prefix) Encoding + +RLP Encoding is an encoding scheme utilized by the Ethereum project. It +encodes any native value or list to string. + +More in depth information about the Encoding scheme see the [Wiki](http://wiki.ethereum.org/index.php/RLP) +article. + +```go +rlp := ethutil.Encode("doge") +fmt.Printf("%q\n", rlp) // => "\0x83dog" + +rlp = ethutil.Encode([]interface{}{"dog", "cat"}) +fmt.Printf("%q\n", rlp) // => "\0xc8\0x83dog\0x83cat" +decoded := ethutil.Decode(rlp) +fmt.Println(decoded) // => ["dog" "cat"] +``` + +## Patricia Trie + +Patricie Tree is a merkle trie utilized by the Ethereum project. + +More in depth information about the (modified) Patricia Trie can be +found on the [Wiki](http://wiki.ethereum.org/index.php/Patricia_Tree). + +The patricia trie uses a db as backend and could be anything as long as +it satisfies the Database interface found in `ethutil/db.go`. + +```go +db := NewDatabase() + +// db, root +trie := ethutil.NewTrie(db, "") + +trie.Put("puppy", "dog") +trie.Put("horse", "stallion") +trie.Put("do", "verb") +trie.Put("doge", "coin") + +// Look up the key "do" in the trie +out := trie.Get("do") +fmt.Println(out) // => verb + +trie.Delete("puppy") +``` + +The patricia trie, in combination with RLP, provides a robust, +cryptographically authenticated data structure that can be used to store +all (key, value) bindings. + +```go +// ... Create db/trie + +// Note that RLP uses interface slices as list +value := ethutil.Encode([]interface{}{"one", 2, "three", []interface{}{42}}) +// Store the RLP encoded value of the list +trie.Put("mykey", value) +``` + +## Value + +Value is a Generic Value which is used in combination with RLP data or +`([])interface{}` structures. It may serve as a bridge between RLP data +and actual real values and takes care of all the type checking and +casting. Unlike Go's `reflect.Value` it does not panic if it's unable to +cast to the requested value. It simple returns the base value of that +type (e.g. `Slice()` returns []interface{}, `Uint()` return 0, etc). + +### Creating a new Value + +`NewEmptyValue()` returns a new \*Value with it's initial value set to a +`[]interface{}` + +`AppendList()` appends a list to the current value. + +`Append(v)` appends the value (v) to the current value/list. + +```go +val := ethutil.NewEmptyValue().Append(1).Append("2") +val.AppendList().Append(3) +``` + +### Retrieving values + +`Get(i)` returns the `i` item in the list. + +`Uint()` returns the value as an unsigned int64. + +`Slice()` returns the value as a interface slice. + +`Str()` returns the value as a string. + +`Bytes()` returns the value as a byte slice. + +`Len()` assumes current to be a slice and returns its length. + +`Byte()` returns the value as a single byte. + +```go +val := ethutil.NewValue([]interface{}{1,"2",[]interface{}{3}}) +val.Get(0).Uint() // => 1 +val.Get(1).Str() // => "2" +s := val.Get(2) // => Value([]interface{}{3}) +s.Get(0).Uint() // => 3 +``` + +## Decoding + +Decoding streams of RLP data is simplified + +```go +val := ethutil.NewValueFromBytes(rlpData) +val.Get(0).Uint() +``` + +## Encoding + +Encoding from Value to RLP is done with the `Encode` method. The +underlying value can be anything RLP can encode (int, str, lists, bytes) + +```go +val := ethutil.NewValue([]interface{}{1,"2",[]interface{}{3}}) +rlp := val.Encode() +// Store the rlp data +Store(rlp) +``` diff --git a/ethutil/big.go b/ethutil/big.go new file mode 100644 index 000000000..2ff1c72d8 --- /dev/null +++ b/ethutil/big.go @@ -0,0 +1,116 @@ +package ethutil + +import "math/big" + +// Big pow +// +// Returns the power of two big integers +func BigPow(a, b int) *big.Int { + c := new(big.Int) + c.Exp(big.NewInt(int64(a)), big.NewInt(int64(b)), big.NewInt(0)) + + return c +} + +// Big +// +// Shortcut for new(big.Int).SetString(..., 0) +func Big(num string) *big.Int { + n := new(big.Int) + n.SetString(num, 0) + + return n +} + +// BigD +// +// Shortcut for new(big.Int).SetBytes(...) +func BigD(data []byte) *big.Int { + n := new(big.Int) + n.SetBytes(data) + + return n +} + +func BitTest(num *big.Int, i int) bool { + return num.Bit(i) > 0 +} + +// To256 +// +// "cast" the big int to a 256 big int (i.e., limit to) +var tt256 = new(big.Int).Lsh(big.NewInt(1), 256) +var tt256m1 = new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 256), big.NewInt(1)) +var tt255 = new(big.Int).Lsh(big.NewInt(1), 255) + +func U256(x *big.Int) *big.Int { + //if x.Cmp(Big0) < 0 { + // return new(big.Int).Add(tt256, x) + // } + + x.And(x, tt256m1) + + return x +} + +func S256(x *big.Int) *big.Int { + if x.Cmp(tt255) < 0 { + return x + } else { + // We don't want to modify x, ever + return new(big.Int).Sub(x, tt256) + } +} + +func FirstBitSet(v *big.Int) int { + for i := 0; i < v.BitLen(); i++ { + if v.Bit(i) > 0 { + return i + } + } + + return v.BitLen() +} + +// Big to bytes +// +// Returns the bytes of a big integer with the size specified by **base** +// Attempts to pad the byte array with zeros. +func BigToBytes(num *big.Int, base int) []byte { + ret := make([]byte, base/8) + + if len(num.Bytes()) > base/8 { + return num.Bytes() + } + + return append(ret[:len(ret)-len(num.Bytes())], num.Bytes()...) +} + +// Big copy +// +// Creates a copy of the given big integer +func BigCopy(src *big.Int) *big.Int { + return new(big.Int).Set(src) +} + +// Big max +// +// Returns the maximum size big integer +func BigMax(x, y *big.Int) *big.Int { + if x.Cmp(y) <= 0 { + return y + } + + return x +} + +// Big min +// +// Returns the minimum size big integer +func BigMin(x, y *big.Int) *big.Int { + if x.Cmp(y) >= 0 { + return y + } + + return x +} diff --git a/ethutil/big_test.go b/ethutil/big_test.go new file mode 100644 index 000000000..bf3c96c6d --- /dev/null +++ b/ethutil/big_test.go @@ -0,0 +1,73 @@ +package ethutil + +import ( + "bytes" + "testing" +) + +func TestMisc(t *testing.T) { + a := Big("10") + b := Big("57896044618658097711785492504343953926634992332820282019728792003956564819968") + c := []byte{1, 2, 3, 4} + z := BitTest(a, 1) + + if z != true { + t.Error("Expected true got", z) + } + + U256(a) + S256(a) + + U256(b) + S256(b) + + BigD(c) +} + +func TestBigMax(t *testing.T) { + a := Big("10") + b := Big("5") + + max1 := BigMax(a, b) + if max1 != a { + t.Errorf("Expected %d got %d", a, max1) + } + + max2 := BigMax(b, a) + if max2 != a { + t.Errorf("Expected %d got %d", a, max2) + } +} + +func TestBigMin(t *testing.T) { + a := Big("10") + b := Big("5") + + min1 := BigMin(a, b) + if min1 != b { + t.Errorf("Expected %d got %d", b, min1) + } + + min2 := BigMin(b, a) + if min2 != b { + t.Errorf("Expected %d got %d", b, min2) + } +} + +func TestBigCopy(t *testing.T) { + a := Big("10") + b := BigCopy(a) + c := Big("1000000000000") + y := BigToBytes(b, 16) + ybytes := []byte{0, 10} + z := BigToBytes(c, 16) + zbytes := []byte{232, 212, 165, 16, 0} + + if bytes.Compare(y, ybytes) != 0 { + t.Error("Got", ybytes) + } + + if bytes.Compare(z, zbytes) != 0 { + t.Error("Got", zbytes) + } +} diff --git a/ethutil/bytes.go b/ethutil/bytes.go new file mode 100644 index 000000000..bd294f28a --- /dev/null +++ b/ethutil/bytes.go @@ -0,0 +1,234 @@ +package ethutil + +import ( + "bytes" + "encoding/binary" + "encoding/hex" + "fmt" + "math/big" + "strings" +) + +type Bytes []byte + +func (self Bytes) String() string { + return string(self) +} + +func DeleteFromByteSlice(s [][]byte, hash []byte) [][]byte { + for i, h := range s { + if bytes.Compare(h, hash) == 0 { + return append(s[:i:i], s[i+1:]...) + } + } + + return s +} + +// Number to bytes +// +// Returns the number in bytes with the specified base +func NumberToBytes(num interface{}, bits int) []byte { + buf := new(bytes.Buffer) + err := binary.Write(buf, binary.BigEndian, num) + if err != nil { + fmt.Println("NumberToBytes failed:", err) + } + + return buf.Bytes()[buf.Len()-(bits/8):] +} + +// Bytes to number +// +// Attempts to cast a byte slice to a unsigned integer +func BytesToNumber(b []byte) uint64 { + var number uint64 + + // Make sure the buffer is 64bits + data := make([]byte, 8) + data = append(data[:len(b)], b...) + + buf := bytes.NewReader(data) + err := binary.Read(buf, binary.BigEndian, &number) + if err != nil { + fmt.Println("BytesToNumber failed:", err) + } + + return number +} + +// Read variable int +// +// Read a variable length number in big endian byte order +func ReadVarInt(buff []byte) (ret uint64) { + switch l := len(buff); { + case l > 4: + d := LeftPadBytes(buff, 8) + binary.Read(bytes.NewReader(d), binary.BigEndian, &ret) + case l > 2: + var num uint32 + d := LeftPadBytes(buff, 4) + binary.Read(bytes.NewReader(d), binary.BigEndian, &num) + ret = uint64(num) + case l > 1: + var num uint16 + d := LeftPadBytes(buff, 2) + binary.Read(bytes.NewReader(d), binary.BigEndian, &num) + ret = uint64(num) + default: + var num uint8 + binary.Read(bytes.NewReader(buff), binary.BigEndian, &num) + ret = uint64(num) + } + + return +} + +// Binary length +// +// Returns the true binary length of the given number +func BinaryLength(num int) int { + if num == 0 { + return 0 + } + + return 1 + BinaryLength(num>>8) +} + +// Copy bytes +// +// Returns an exact copy of the provided bytes +func CopyBytes(b []byte) (copiedBytes []byte) { + copiedBytes = make([]byte, len(b)) + copy(copiedBytes, b) + + return +} + +func IsHex(str string) bool { + l := len(str) + return l >= 4 && l%2 == 0 && str[0:2] == "0x" +} + +func Bytes2Hex(d []byte) string { + return hex.EncodeToString(d) +} + +func Hex2Bytes(str string) []byte { + h, _ := hex.DecodeString(str) + + return h +} + +func StringToByteFunc(str string, cb func(str string) []byte) (ret []byte) { + if len(str) > 1 && str[0:2] == "0x" && !strings.Contains(str, "\n") { + ret = Hex2Bytes(str[2:]) + } else { + ret = cb(str) + } + + return +} + +func FormatData(data string) []byte { + if len(data) == 0 { + return nil + } + // Simple stupid + d := new(big.Int) + if data[0:1] == "\"" && data[len(data)-1:] == "\"" { + return RightPadBytes([]byte(data[1:len(data)-1]), 32) + } else if len(data) > 1 && data[:2] == "0x" { + d.SetBytes(Hex2Bytes(data[2:])) + } else { + d.SetString(data, 0) + } + + return BigToBytes(d, 256) +} + +func ParseData(data ...interface{}) (ret []byte) { + for _, item := range data { + switch t := item.(type) { + case string: + var str []byte + if IsHex(t) { + str = Hex2Bytes(t[2:]) + } else { + str = []byte(t) + } + + ret = append(ret, RightPadBytes(str, 32)...) + case []byte: + ret = append(ret, LeftPadBytes(t, 32)...) + } + } + + return +} + +func RightPadBytes(slice []byte, l int) []byte { + if l < len(slice) { + return slice + } + + padded := make([]byte, l) + copy(padded[0:len(slice)], slice) + + return padded +} + +func LeftPadBytes(slice []byte, l int) []byte { + if l < len(slice) { + return slice + } + + padded := make([]byte, l) + copy(padded[l-len(slice):], slice) + + return padded +} + +func LeftPadString(str string, l int) string { + if l < len(str) { + return str + } + + zeros := Bytes2Hex(make([]byte, (l-len(str))/2)) + + return zeros + str + +} + +func RightPadString(str string, l int) string { + if l < len(str) { + return str + } + + zeros := Bytes2Hex(make([]byte, (l-len(str))/2)) + + return str + zeros + +} + +func Address(slice []byte) (addr []byte) { + if len(slice) < 20 { + addr = LeftPadBytes(slice, 20) + } else if len(slice) > 20 { + addr = slice[len(slice)-20:] + } else { + addr = slice + } + + addr = CopyBytes(addr) + + return +} + +func ByteSliceToInterface(slice [][]byte) (ret []interface{}) { + for _, i := range slice { + ret = append(ret, i) + } + + return +} diff --git a/ethutil/bytes_test.go b/ethutil/bytes_test.go new file mode 100644 index 000000000..179a8c7ef --- /dev/null +++ b/ethutil/bytes_test.go @@ -0,0 +1,193 @@ +package ethutil + +import ( + checker "gopkg.in/check.v1" +) + +type BytesSuite struct{} + +var _ = checker.Suite(&BytesSuite{}) + +func (s *BytesSuite) TestByteString(c *checker.C) { + var data Bytes + data = []byte{102, 111, 111} + exp := "foo" + res := data.String() + + c.Assert(res, checker.Equals, exp) +} + +/* +func (s *BytesSuite) TestDeleteFromByteSlice(c *checker.C) { + data := []byte{1, 2, 3, 4} + slice := []byte{1, 2, 3, 4} + exp := []byte{1, 4} + res := DeleteFromByteSlice(data, slice) + + c.Assert(res, checker.DeepEquals, exp) +} + +*/ +func (s *BytesSuite) TestNumberToBytes(c *checker.C) { + // data1 := int(1) + // res1 := NumberToBytes(data1, 16) + // c.Check(res1, checker.Panics) + + var data2 float64 = 3.141592653 + exp2 := []byte{0xe9, 0x38} + res2 := NumberToBytes(data2, 16) + c.Assert(res2, checker.DeepEquals, exp2) +} + +func (s *BytesSuite) TestBytesToNumber(c *checker.C) { + datasmall := []byte{0xe9, 0x38, 0xe9, 0x38} + datalarge := []byte{0xe9, 0x38, 0xe9, 0x38, 0xe9, 0x38, 0xe9, 0x38} + + var expsmall uint64 = 0xe938e938 + var explarge uint64 = 0x0 + + ressmall := BytesToNumber(datasmall) + reslarge := BytesToNumber(datalarge) + + c.Assert(ressmall, checker.Equals, expsmall) + c.Assert(reslarge, checker.Equals, explarge) + +} + +func (s *BytesSuite) TestReadVarInt(c *checker.C) { + data8 := []byte{1, 2, 3, 4, 5, 6, 7, 8} + data4 := []byte{1, 2, 3, 4} + data2 := []byte{1, 2} + data1 := []byte{1} + + exp8 := uint64(72623859790382856) + exp4 := uint64(16909060) + exp2 := uint64(258) + exp1 := uint64(1) + + res8 := ReadVarInt(data8) + res4 := ReadVarInt(data4) + res2 := ReadVarInt(data2) + res1 := ReadVarInt(data1) + + c.Assert(res8, checker.Equals, exp8) + c.Assert(res4, checker.Equals, exp4) + c.Assert(res2, checker.Equals, exp2) + c.Assert(res1, checker.Equals, exp1) +} + +func (s *BytesSuite) TestBinaryLength(c *checker.C) { + data1 := 0 + data2 := 920987656789 + + exp1 := 0 + exp2 := 5 + + res1 := BinaryLength(data1) + res2 := BinaryLength(data2) + + c.Assert(res1, checker.Equals, exp1) + c.Assert(res2, checker.Equals, exp2) +} + +func (s *BytesSuite) TestCopyBytes(c *checker.C) { + data1 := []byte{1, 2, 3, 4} + exp1 := []byte{1, 2, 3, 4} + res1 := CopyBytes(data1) + c.Assert(res1, checker.DeepEquals, exp1) +} + +func (s *BytesSuite) TestIsHex(c *checker.C) { + data1 := "a9e67e" + exp1 := false + res1 := IsHex(data1) + c.Assert(res1, checker.DeepEquals, exp1) + + data2 := "0xa9e67e00" + exp2 := true + res2 := IsHex(data2) + c.Assert(res2, checker.DeepEquals, exp2) + +} + +func (s *BytesSuite) TestParseDataString(c *checker.C) { + res1 := ParseData("hello", "world", "0x0106") + data := "68656c6c6f000000000000000000000000000000000000000000000000000000776f726c640000000000000000000000000000000000000000000000000000000106000000000000000000000000000000000000000000000000000000000000" + exp1 := Hex2Bytes(data) + c.Assert(res1, checker.DeepEquals, exp1) +} + +func (s *BytesSuite) TestParseDataBytes(c *checker.C) { + data1 := []byte{232, 212, 165, 16, 0} + exp1 := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 212, 165, 16, 0} + + res1 := ParseData(data1) + c.Assert(res1, checker.DeepEquals, exp1) + +} + +func (s *BytesSuite) TestLeftPadBytes(c *checker.C) { + val1 := []byte{1, 2, 3, 4} + exp1 := []byte{0, 0, 0, 0, 1, 2, 3, 4} + + res1 := LeftPadBytes(val1, 8) + res2 := LeftPadBytes(val1, 2) + + c.Assert(res1, checker.DeepEquals, exp1) + c.Assert(res2, checker.DeepEquals, val1) +} + +func (s *BytesSuite) TestFormatData(c *checker.C) { + data1 := "" + data2 := "0xa9e67e00" + data3 := "a9e67e" + data4 := "\"a9e67e00\"" + + // exp1 := []byte{} + exp2 := []byte{00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 0xa9, 0xe6, 0x7e, 00} + exp3 := []byte{00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00} + exp4 := []byte{0x61, 0x39, 0x65, 0x36, 0x37, 0x65, 0x30, 0x30, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00} + + res1 := FormatData(data1) + res2 := FormatData(data2) + res3 := FormatData(data3) + res4 := FormatData(data4) + + c.Assert(res1, checker.IsNil) + c.Assert(res2, checker.DeepEquals, exp2) + c.Assert(res3, checker.DeepEquals, exp3) + c.Assert(res4, checker.DeepEquals, exp4) +} + +func (s *BytesSuite) TestRightPadBytes(c *checker.C) { + val := []byte{1, 2, 3, 4} + exp := []byte{1, 2, 3, 4, 0, 0, 0, 0} + + resstd := RightPadBytes(val, 8) + resshrt := RightPadBytes(val, 2) + + c.Assert(resstd, checker.DeepEquals, exp) + c.Assert(resshrt, checker.DeepEquals, val) +} + +func (s *BytesSuite) TestLeftPadString(c *checker.C) { + val := "test" + exp := "\x30\x30\x30\x30" + val + + resstd := LeftPadString(val, 8) + resshrt := LeftPadString(val, 2) + + c.Assert(resstd, checker.Equals, exp) + c.Assert(resshrt, checker.Equals, val) +} + +func (s *BytesSuite) TestRightPadString(c *checker.C) { + val := "test" + exp := val + "\x30\x30\x30\x30" + + resstd := RightPadString(val, 8) + resshrt := RightPadString(val, 2) + + c.Assert(resstd, checker.Equals, exp) + c.Assert(resshrt, checker.Equals, val) +} diff --git a/ethutil/common.go b/ethutil/common.go new file mode 100644 index 000000000..0a29cac6c --- /dev/null +++ b/ethutil/common.go @@ -0,0 +1,87 @@ +package ethutil + +import ( + "fmt" + "math/big" + "runtime" +) + +func IsWindows() bool { + return runtime.GOOS == "windows" +} + +func WindonizePath(path string) string { + if string(path[0]) == "/" && IsWindows() { + path = path[1:] + } + return path +} + +// The different number of units +var ( + Douglas = BigPow(10, 42) + Einstein = BigPow(10, 21) + Ether = BigPow(10, 18) + Finney = BigPow(10, 15) + Szabo = BigPow(10, 12) + Shannon = BigPow(10, 9) + Babbage = BigPow(10, 6) + Ada = BigPow(10, 3) + Wei = big.NewInt(1) +) + +// +// Currency to string +// Returns a string representing a human readable format +func CurrencyToString(num *big.Int) string { + var ( + fin *big.Int = num + denom string = "Wei" + ) + + switch { + case num.Cmp(Douglas) >= 0: + fin = new(big.Int).Div(num, Douglas) + denom = "Douglas" + case num.Cmp(Einstein) >= 0: + fin = new(big.Int).Div(num, Einstein) + denom = "Einstein" + case num.Cmp(Ether) >= 0: + fin = new(big.Int).Div(num, Ether) + denom = "Ether" + case num.Cmp(Finney) >= 0: + fin = new(big.Int).Div(num, Finney) + denom = "Finney" + case num.Cmp(Szabo) >= 0: + fin = new(big.Int).Div(num, Szabo) + denom = "Szabo" + case num.Cmp(Shannon) >= 0: + fin = new(big.Int).Div(num, Shannon) + denom = "Shannon" + case num.Cmp(Babbage) >= 0: + fin = new(big.Int).Div(num, Babbage) + denom = "Babbage" + case num.Cmp(Ada) >= 0: + fin = new(big.Int).Div(num, Ada) + denom = "Ada" + } + + // TODO add comment clarifying expected behavior + if len(fin.String()) > 5 { + return fmt.Sprintf("%sE%d %s", fin.String()[0:5], len(fin.String())-5, denom) + } + + return fmt.Sprintf("%v %s", fin, denom) +} + +// Common big integers often used +var ( + Big1 = big.NewInt(1) + Big2 = big.NewInt(2) + Big3 = big.NewInt(3) + Big0 = big.NewInt(0) + BigTrue = Big1 + BigFalse = Big0 + Big32 = big.NewInt(32) + Big256 = big.NewInt(0xff) +) diff --git a/ethutil/common_test.go b/ethutil/common_test.go new file mode 100644 index 000000000..c2b6077e9 --- /dev/null +++ b/ethutil/common_test.go @@ -0,0 +1,68 @@ +package ethutil + +import ( + "math/big" + "os" + + checker "gopkg.in/check.v1" +) + +type CommonSuite struct{} + +var _ = checker.Suite(&CommonSuite{}) + +func (s *CommonSuite) TestOS(c *checker.C) { + expwin := (os.PathSeparator == '\\' && os.PathListSeparator == ';') + res := IsWindows() + + if !expwin { + c.Assert(res, checker.Equals, expwin, checker.Commentf("IsWindows is", res, "but path is", os.PathSeparator)) + } else { + c.Assert(res, checker.Not(checker.Equals), expwin, checker.Commentf("IsWindows is", res, "but path is", os.PathSeparator)) + } +} + +func (s *CommonSuite) TestWindonziePath(c *checker.C) { + iswindowspath := os.PathSeparator == '\\' + path := "/opt/eth/test/file.ext" + res := WindonizePath(path) + ressep := string(res[0]) + + if !iswindowspath { + c.Assert(ressep, checker.Equals, "/") + } else { + c.Assert(ressep, checker.Not(checker.Equals), "/") + } +} + +func (s *CommonSuite) TestCommon(c *checker.C) { + douglas := CurrencyToString(BigPow(10, 43)) + einstein := CurrencyToString(BigPow(10, 22)) + ether := CurrencyToString(BigPow(10, 19)) + finney := CurrencyToString(BigPow(10, 16)) + szabo := CurrencyToString(BigPow(10, 13)) + shannon := CurrencyToString(BigPow(10, 10)) + babbage := CurrencyToString(BigPow(10, 7)) + ada := CurrencyToString(BigPow(10, 4)) + wei := CurrencyToString(big.NewInt(10)) + + c.Assert(douglas, checker.Equals, "10 Douglas") + c.Assert(einstein, checker.Equals, "10 Einstein") + c.Assert(ether, checker.Equals, "10 Ether") + c.Assert(finney, checker.Equals, "10 Finney") + c.Assert(szabo, checker.Equals, "10 Szabo") + c.Assert(shannon, checker.Equals, "10 Shannon") + c.Assert(babbage, checker.Equals, "10 Babbage") + c.Assert(ada, checker.Equals, "10 Ada") + c.Assert(wei, checker.Equals, "10 Wei") +} + +func (s *CommonSuite) TestLarge(c *checker.C) { + douglaslarge := CurrencyToString(BigPow(100000000, 43)) + adalarge := CurrencyToString(BigPow(100000000, 4)) + weilarge := CurrencyToString(big.NewInt(100000000)) + + c.Assert(douglaslarge, checker.Equals, "10000E298 Douglas") + c.Assert(adalarge, checker.Equals, "10000E7 Einstein") + c.Assert(weilarge, checker.Equals, "100 Babbage") +} diff --git a/ethutil/config.go b/ethutil/config.go new file mode 100644 index 000000000..ccc7714d0 --- /dev/null +++ b/ethutil/config.go @@ -0,0 +1,72 @@ +package ethutil + +import ( + "flag" + "fmt" + "os" + + "github.com/rakyll/globalconf" +) + +// Config struct +type ConfigManager struct { + Db Database + + ExecPath string + Debug bool + Diff bool + DiffType string + Paranoia bool + VmType int + + conf *globalconf.GlobalConf +} + +var Config *ConfigManager + +// Read config +// +// Initialize Config from Config File +func ReadConfig(ConfigFile string, Datadir string, EnvPrefix string) *ConfigManager { + if Config == nil { + // create ConfigFile if does not exist, otherwise globalconf panic when trying to persist flags + if !FileExist(ConfigFile) { + fmt.Printf("config file '%s' doesn't exist, creating it\n", ConfigFile) + os.Create(ConfigFile) + } + g, err := globalconf.NewWithOptions(&globalconf.Options{ + Filename: ConfigFile, + EnvPrefix: EnvPrefix, + }) + if err != nil { + fmt.Println(err) + } else { + g.ParseAll() + } + Config = &ConfigManager{ExecPath: Datadir, Debug: true, conf: g, Paranoia: true} + } + return Config +} + +// provides persistence for flags +func (c *ConfigManager) Save(key string, value interface{}) { + f := &flag.Flag{Name: key, Value: newConfValue(value)} + c.conf.Set("", f) +} + +func (c *ConfigManager) Delete(key string) { + c.conf.Delete("", key) +} + +// private type implementing flag.Value +type confValue struct { + value string +} + +// generic constructor to allow persising non-string values directly +func newConfValue(value interface{}) *confValue { + return &confValue{fmt.Sprintf("%v", value)} +} + +func (self confValue) String() string { return self.value } +func (self confValue) Set(s string) error { self.value = s; return nil } diff --git a/ethutil/db.go b/ethutil/db.go new file mode 100644 index 000000000..e02a80fca --- /dev/null +++ b/ethutil/db.go @@ -0,0 +1,12 @@ +package ethutil + +// Database interface +type Database interface { + Put(key []byte, value []byte) + Get(key []byte) ([]byte, error) + //GetKeys() []*Key + Delete(key []byte) error + LastKnownTD() []byte + Close() + Print() +} diff --git a/ethutil/list.go b/ethutil/list.go new file mode 100644 index 000000000..db276f1e3 --- /dev/null +++ b/ethutil/list.go @@ -0,0 +1,81 @@ +package ethutil + +import ( + "encoding/json" + "reflect" + "sync" +) + +// The list type is an anonymous slice handler which can be used +// for containing any slice type to use in an environment which +// does not support slice types (e.g., JavaScript, QML) +type List struct { + mut sync.Mutex + val interface{} + list reflect.Value + Length int +} + +// Initialise a new list. Panics if non-slice type is given. +func NewList(t interface{}) *List { + list := reflect.ValueOf(t) + if list.Kind() != reflect.Slice { + panic("list container initialized with a non-slice type") + } + + return &List{sync.Mutex{}, t, list, list.Len()} +} + +func EmptyList() *List { + return NewList([]interface{}{}) +} + +// Get N element from the embedded slice. Returns nil if OOB. +func (self *List) Get(i int) interface{} { + if self.list.Len() > i { + self.mut.Lock() + defer self.mut.Unlock() + + i := self.list.Index(i).Interface() + + return i + } + + return nil +} + +func (self *List) GetAsJson(i int) interface{} { + e := self.Get(i) + + r, _ := json.Marshal(e) + + return string(r) +} + +// Appends value at the end of the slice. Panics when incompatible value +// is given. +func (self *List) Append(v interface{}) { + self.mut.Lock() + defer self.mut.Unlock() + + self.list = reflect.Append(self.list, reflect.ValueOf(v)) + self.Length = self.list.Len() +} + +// Returns the underlying slice as interface. +func (self *List) Interface() interface{} { + return self.list.Interface() +} + +// For JavaScript <3 +func (self *List) ToJSON() string { + // make(T, 0) != nil + list := make([]interface{}, 0) + for i := 0; i < self.Length; i++ { + list = append(list, self.Get(i)) + } + + data, _ := json.Marshal(list) + + return string(data) +} diff --git a/ethutil/main_test.go b/ethutil/main_test.go new file mode 100644 index 000000000..fd4278ce7 --- /dev/null +++ b/ethutil/main_test.go @@ -0,0 +1,9 @@ +package ethutil + +import ( + "testing" + + checker "gopkg.in/check.v1" +) + +func Test(t *testing.T) { checker.TestingT(t) } diff --git a/ethutil/package.go b/ethutil/package.go new file mode 100644 index 000000000..e5df989d2 --- /dev/null +++ b/ethutil/package.go @@ -0,0 +1,123 @@ +package ethutil + +import ( + "archive/zip" + "encoding/json" + "fmt" + "io" + "io/ioutil" + "strings" +) + +// Manifest object +// +// The manifest object holds all the relevant information supplied with the +// the manifest specified in the package +type Manifest struct { + Entry string + Height, Width int +} + +// External package +// +// External package contains the main html file and manifest +type ExtPackage struct { + EntryHtml string + Manifest *Manifest +} + +// Read file +// +// Read a given compressed file and returns the read bytes. +// Returns an error otherwise +func ReadFile(f *zip.File) ([]byte, error) { + rc, err := f.Open() + if err != nil { + return nil, err + } + defer rc.Close() + + content, err := ioutil.ReadAll(rc) + if err != nil { + return nil, err + } + + return content, nil +} + +// Reads manifest +// +// Reads and returns a manifest object. Returns error otherwise +func ReadManifest(m []byte) (*Manifest, error) { + var manifest Manifest + + dec := json.NewDecoder(strings.NewReader(string(m))) + if err := dec.Decode(&manifest); err == io.EOF { + } else if err != nil { + return nil, err + } + + return &manifest, nil +} + +// Find file in archive +// +// Returns the index of the given file name if it exists. -1 if file not found +func FindFileInArchive(fn string, files []*zip.File) (index int) { + index = -1 + // Find the manifest first + for i, f := range files { + if f.Name == fn { + index = i + } + } + + return +} + +// Open package +// +// Opens a prepared ethereum package +// Reads the manifest file and determines file contents and returns and +// the external package. +func OpenPackage(fn string) (*ExtPackage, error) { + r, err := zip.OpenReader(fn) + if err != nil { + return nil, err + } + defer r.Close() + + manifestIndex := FindFileInArchive("manifest.json", r.File) + + if manifestIndex < 0 { + return nil, fmt.Errorf("No manifest file found in archive") + } + + f, err := ReadFile(r.File[manifestIndex]) + if err != nil { + return nil, err + } + + manifest, err := ReadManifest(f) + if err != nil { + return nil, err + } + + if manifest.Entry == "" { + return nil, fmt.Errorf("Entry file specified but appears to be empty: %s", manifest.Entry) + } + + entryIndex := FindFileInArchive(manifest.Entry, r.File) + if entryIndex < 0 { + return nil, fmt.Errorf("Entry file not found: '%s'", manifest.Entry) + } + + f, err = ReadFile(r.File[entryIndex]) + if err != nil { + return nil, err + } + + extPackage := &ExtPackage{string(f), manifest} + + return extPackage, nil +} diff --git a/ethutil/path.go b/ethutil/path.go new file mode 100644 index 000000000..cfbc38950 --- /dev/null +++ b/ethutil/path.go @@ -0,0 +1,60 @@ +package ethutil + +import ( + "io/ioutil" + "os" + "os/user" + "strings" +) + +func ExpandHomePath(p string) (path string) { + path = p + + // Check in case of paths like "/something/~/something/" + if path[:2] == "~/" { + usr, _ := user.Current() + dir := usr.HomeDir + + path = strings.Replace(p, "~", dir, 1) + } + + return +} + +func FileExist(filePath string) bool { + _, err := os.Stat(filePath) + if err != nil && os.IsNotExist(err) { + return false + } + + return true +} + +func ReadAllFile(filePath string) (string, error) { + file, err := os.Open(filePath) + if err != nil { + return "", err + } + + data, err := ioutil.ReadAll(file) + if err != nil { + return "", err + } + + return string(data), nil +} + +func WriteFile(filePath string, content []byte) error { + fh, err := os.OpenFile(filePath, os.O_TRUNC|os.O_RDWR|os.O_CREATE, os.ModePerm) + if err != nil { + return err + } + defer fh.Close() + + _, err = fh.Write(content) + if err != nil { + return err + } + + return nil +} diff --git a/ethutil/path_test.go b/ethutil/path_test.go new file mode 100644 index 000000000..908c94ee7 --- /dev/null +++ b/ethutil/path_test.go @@ -0,0 +1,51 @@ +package ethutil + +import ( + // "os" + "testing" +) + +func TestGoodFile(t *testing.T) { + goodpath := "~/goethereumtest.pass" + path := ExpandHomePath(goodpath) + contentstring := "3.14159265358979323846" + + err := WriteFile(path, []byte(contentstring)) + if err != nil { + t.Error("Could not write file") + } + + if !FileExist(path) { + t.Error("File not found at", path) + } + + v, err := ReadAllFile(path) + if err != nil { + t.Error("Could not read file", path) + } + if v != contentstring { + t.Error("Expected", contentstring, "Got", v) + } + +} + +func TestBadFile(t *testing.T) { + badpath := "/this/path/should/not/exist/goethereumtest.fail" + path := ExpandHomePath(badpath) + contentstring := "3.14159265358979323846" + + err := WriteFile(path, []byte(contentstring)) + if err == nil { + t.Error("Wrote file, but should not be able to", path) + } + + if FileExist(path) { + t.Error("Found file, but should not be able to", path) + } + + v, err := ReadAllFile(path) + if err == nil { + t.Error("Read file, but should not be able to", v) + } + +} diff --git a/ethutil/rand.go b/ethutil/rand.go new file mode 100644 index 000000000..91dafec7e --- /dev/null +++ b/ethutil/rand.go @@ -0,0 +1,24 @@ +package ethutil + +import ( + "crypto/rand" + "encoding/binary" + "io" +) + +func randomUint64(r io.Reader) (uint64, error) { + b := make([]byte, 8) + n, err := r.Read(b) + if n != len(b) { + return 0, io.ErrShortBuffer + } + if err != nil { + return 0, err + } + return binary.BigEndian.Uint64(b), nil +} + +// RandomUint64 returns a cryptographically random uint64 value. +func RandomUint64() (uint64, error) { + return randomUint64(rand.Reader) +} diff --git a/ethutil/rand_test.go b/ethutil/rand_test.go new file mode 100644 index 000000000..c12698538 --- /dev/null +++ b/ethutil/rand_test.go @@ -0,0 +1,17 @@ +package ethutil + +import ( + checker "gopkg.in/check.v1" +) + +type RandomSuite struct{} + +var _ = checker.Suite(&RandomSuite{}) + +func (s *RandomSuite) TestRandomUint64(c *checker.C) { + res1, _ := RandomUint64() + res2, _ := RandomUint64() + c.Assert(res1, checker.NotNil) + c.Assert(res2, checker.NotNil) + c.Assert(res1, checker.Not(checker.Equals), res2) +} diff --git a/ethutil/rlp.go b/ethutil/rlp.go new file mode 100644 index 000000000..1bc1a58a7 --- /dev/null +++ b/ethutil/rlp.go @@ -0,0 +1,276 @@ +package ethutil + +import ( + "bytes" + "fmt" + "math/big" + "reflect" +) + +type RlpEncode interface { + RlpEncode() []byte +} + +type RlpEncodeDecode interface { + RlpEncode + RlpValue() []interface{} +} + +type RlpEncodable interface { + RlpData() interface{} +} + +func Rlp(encoder RlpEncode) []byte { + return encoder.RlpEncode() +} + +type RlpEncoder struct { + rlpData []byte +} + +func NewRlpEncoder() *RlpEncoder { + encoder := &RlpEncoder{} + + return encoder +} +func (coder *RlpEncoder) EncodeData(rlpData interface{}) []byte { + return Encode(rlpData) +} + +const ( + RlpEmptyList = 0x80 + RlpEmptyStr = 0x40 +) + +const rlpEof = -1 + +func Char(c []byte) int { + if len(c) > 0 { + return int(c[0]) + } + + return rlpEof +} + +func DecodeWithReader(reader *bytes.Buffer) interface{} { + var slice []interface{} + + // Read the next byte + char := Char(reader.Next(1)) + switch { + case char <= 0x7f: + return char + + case char <= 0xb7: + return reader.Next(int(char - 0x80)) + + case char <= 0xbf: + length := ReadVarInt(reader.Next(int(char - 0xb7))) + + return reader.Next(int(length)) + + case char <= 0xf7: + length := int(char - 0xc0) + for i := 0; i < length; i++ { + obj := DecodeWithReader(reader) + slice = append(slice, obj) + } + + return slice + case char <= 0xff: + length := ReadVarInt(reader.Next(int(char - 0xf7))) + for i := uint64(0); i < length; i++ { + obj := DecodeWithReader(reader) + slice = append(slice, obj) + } + + return slice + default: + panic(fmt.Sprintf("byte not supported: %q", char)) + } + + return slice +} + +var ( + directRlp = big.NewInt(0x7f) + numberRlp = big.NewInt(0xb7) + zeroRlp = big.NewInt(0x0) +) + +func intlen(i int64) (length int) { + for i > 0 { + i = i >> 8 + length++ + } + return +} + +func Encode(object interface{}) []byte { + var buff bytes.Buffer + + if object != nil { + switch t := object.(type) { + case *Value: + buff.Write(Encode(t.Raw())) + case RlpEncodable: + buff.Write(Encode(t.RlpData())) + // Code dup :-/ + case int: + buff.Write(Encode(big.NewInt(int64(t)))) + case uint: + buff.Write(Encode(big.NewInt(int64(t)))) + case int8: + buff.Write(Encode(big.NewInt(int64(t)))) + case int16: + buff.Write(Encode(big.NewInt(int64(t)))) + case int32: + buff.Write(Encode(big.NewInt(int64(t)))) + case int64: + buff.Write(Encode(big.NewInt(t))) + case uint16: + buff.Write(Encode(big.NewInt(int64(t)))) + case uint32: + buff.Write(Encode(big.NewInt(int64(t)))) + case uint64: + buff.Write(Encode(big.NewInt(int64(t)))) + case byte: + buff.Write(Encode(big.NewInt(int64(t)))) + case *big.Int: + // Not sure how this is possible while we check for + if t == nil { + buff.WriteByte(0xc0) + } else { + buff.Write(Encode(t.Bytes())) + } + case Bytes: + buff.Write(Encode([]byte(t))) + case []byte: + if len(t) == 1 && t[0] <= 0x7f { + buff.Write(t) + } else if len(t) < 56 { + buff.WriteByte(byte(len(t) + 0x80)) + buff.Write(t) + } else { + b := big.NewInt(int64(len(t))) + buff.WriteByte(byte(len(b.Bytes()) + 0xb7)) + buff.Write(b.Bytes()) + buff.Write(t) + } + case string: + buff.Write(Encode([]byte(t))) + case []interface{}: + // Inline function for writing the slice header + WriteSliceHeader := func(length int) { + if length < 56 { + buff.WriteByte(byte(length + 0xc0)) + } else { + b := big.NewInt(int64(length)) + buff.WriteByte(byte(len(b.Bytes()) + 0xf7)) + buff.Write(b.Bytes()) + } + } + + var b bytes.Buffer + for _, val := range t { + b.Write(Encode(val)) + } + WriteSliceHeader(len(b.Bytes())) + buff.Write(b.Bytes()) + default: + // This is how it should have been from the start + // needs refactoring (@fjl) + v := reflect.ValueOf(t) + switch v.Kind() { + case reflect.Slice: + var b bytes.Buffer + for i := 0; i < v.Len(); i++ { + b.Write(Encode(v.Index(i).Interface())) + } + + blen := b.Len() + if blen < 56 { + buff.WriteByte(byte(blen) + 0xc0) + } else { + ilen := byte(intlen(int64(blen))) + buff.WriteByte(ilen + 0xf7) + t := make([]byte, ilen) + for i := byte(0); i < ilen; i++ { + t[ilen-i-1] = byte(blen >> (i * 8)) + } + buff.Write(t) + } + buff.ReadFrom(&b) + } + } + } else { + // Empty list for nil + buff.WriteByte(0xc0) + } + + return buff.Bytes() +} + +// TODO Use a bytes.Buffer instead of a raw byte slice. +// Cleaner code, and use draining instead of seeking the next bytes to read +func Decode(data []byte, pos uint64) (interface{}, uint64) { + var slice []interface{} + char := int(data[pos]) + switch { + case char <= 0x7f: + return data[pos], pos + 1 + + case char <= 0xb7: + b := uint64(data[pos]) - 0x80 + + return data[pos+1 : pos+1+b], pos + 1 + b + + case char <= 0xbf: + b := uint64(data[pos]) - 0xb7 + + b2 := ReadVarInt(data[pos+1 : pos+1+b]) + + return data[pos+1+b : pos+1+b+b2], pos + 1 + b + b2 + + case char <= 0xf7: + b := uint64(data[pos]) - 0xc0 + prevPos := pos + pos++ + for i := uint64(0); i < b; { + var obj interface{} + + // Get the next item in the data list and append it + obj, prevPos = Decode(data, pos) + slice = append(slice, obj) + + // Increment i by the amount bytes read in the previous + // read + i += (prevPos - pos) + pos = prevPos + } + return slice, pos + + case char <= 0xff: + l := uint64(data[pos]) - 0xf7 + b := ReadVarInt(data[pos+1 : pos+1+l]) + + pos = pos + l + 1 + + prevPos := b + for i := uint64(0); i < uint64(b); { + var obj interface{} + + obj, prevPos = Decode(data, pos) + slice = append(slice, obj) + + i += (prevPos - pos) + pos = prevPos + } + return slice, pos + + default: + panic(fmt.Sprintf("byte not supported: %q", char)) + } + + return slice, 0 +} diff --git a/ethutil/rlp_test.go b/ethutil/rlp_test.go new file mode 100644 index 000000000..ff98d3269 --- /dev/null +++ b/ethutil/rlp_test.go @@ -0,0 +1,156 @@ +package ethutil + +import ( + "bytes" + "math/big" + "reflect" + "testing" +) + +func TestNonInterfaceSlice(t *testing.T) { + vala := []string{"value1", "value2", "value3"} + valb := []interface{}{"value1", "value2", "value3"} + resa := Encode(vala) + resb := Encode(valb) + if !bytes.Equal(resa, resb) { + t.Errorf("expected []string & []interface{} to be equal") + } +} + +func TestRlpValueEncoding(t *testing.T) { + val := EmptyValue() + val.AppendList().Append(1).Append(2).Append(3) + val.Append("4").AppendList().Append(5) + + res := val.Encode() + exp := Encode([]interface{}{[]interface{}{1, 2, 3}, "4", []interface{}{5}}) + if bytes.Compare(res, exp) != 0 { + t.Errorf("expected %q, got %q", res, exp) + } +} + +func TestValueSlice(t *testing.T) { + val := []interface{}{ + "value1", + "valeu2", + "value3", + } + + value := NewValue(val) + splitVal := value.SliceFrom(1) + + if splitVal.Len() != 2 { + t.Error("SliceFrom: Expected len", 2, "got", splitVal.Len()) + } + + splitVal = value.SliceTo(2) + if splitVal.Len() != 2 { + t.Error("SliceTo: Expected len", 2, "got", splitVal.Len()) + } + + splitVal = value.SliceFromTo(1, 3) + if splitVal.Len() != 2 { + t.Error("SliceFromTo: Expected len", 2, "got", splitVal.Len()) + } +} + +func TestLargeData(t *testing.T) { + data := make([]byte, 100000) + enc := Encode(data) + value := NewValue(enc) + value.Decode() + + if value.Len() != len(data) { + t.Error("Expected data to be", len(data), "got", value.Len()) + } +} + +func TestValue(t *testing.T) { + value := NewValueFromBytes([]byte("\xcd\x83dog\x83god\x83cat\x01")) + if value.Get(0).Str() != "dog" { + t.Errorf("expected '%v', got '%v'", value.Get(0).Str(), "dog") + } + + if value.Get(3).Uint() != 1 { + t.Errorf("expected '%v', got '%v'", value.Get(3).Uint(), 1) + } +} + +func TestEncode(t *testing.T) { + strRes := "\x83dog" + bytes := Encode("dog") + + str := string(bytes) + if str != strRes { + t.Errorf("Expected %q, got %q", strRes, str) + } + + sliceRes := "\xcc\x83dog\x83god\x83cat" + strs := []interface{}{"dog", "god", "cat"} + bytes = Encode(strs) + slice := string(bytes) + if slice != sliceRes { + t.Error("Expected %q, got %q", sliceRes, slice) + } + + intRes := "\x82\x04\x00" + bytes = Encode(1024) + if string(bytes) != intRes { + t.Errorf("Expected %q, got %q", intRes, bytes) + } +} + +func TestDecode(t *testing.T) { + single := []byte("\x01") + b, _ := Decode(single, 0) + + if b.(uint8) != 1 { + t.Errorf("Expected 1, got %q", b) + } + + str := []byte("\x83dog") + b, _ = Decode(str, 0) + if bytes.Compare(b.([]byte), []byte("dog")) != 0 { + t.Errorf("Expected dog, got %q", b) + } + + slice := []byte("\xcc\x83dog\x83god\x83cat") + res := []interface{}{"dog", "god", "cat"} + b, _ = Decode(slice, 0) + if reflect.DeepEqual(b, res) { + t.Errorf("Expected %q, got %q", res, b) + } +} + +func TestEncodeDecodeBigInt(t *testing.T) { + bigInt := big.NewInt(1391787038) + encoded := Encode(bigInt) + + value := NewValueFromBytes(encoded) + if value.BigInt().Cmp(bigInt) != 0 { + t.Errorf("Expected %v, got %v", bigInt, value.BigInt()) + } +} + +func TestEncodeDecodeBytes(t *testing.T) { + b := NewValue([]interface{}{[]byte{1, 2, 3, 4, 5}, byte(6)}) + val := NewValueFromBytes(b.Encode()) + if !b.Cmp(val) { + t.Errorf("Expected %v, got %v", val, b) + } +} + +func TestEncodeZero(t *testing.T) { + b := NewValue(0).Encode() + exp := []byte{0xc0} + if bytes.Compare(b, exp) == 0 { + t.Error("Expected", exp, "got", b) + } +} + +func BenchmarkEncodeDecode(b *testing.B) { + for i := 0; i < b.N; i++ { + bytes := Encode([]interface{}{"dog", "god", "cat"}) + Decode(bytes, 0) + } +} diff --git a/ethutil/script_unix.go b/ethutil/script_unix.go new file mode 100644 index 000000000..9250dda57 --- /dev/null +++ b/ethutil/script_unix.go @@ -0,0 +1,19 @@ +// +build !windows + +package ethutil + +import "github.com/ethereum/serpent-go" + +// General compile function +func Compile(script string, silent bool) (ret []byte, err error) { + if len(script) > 2 { + byteCode, err := serpent.Compile(script) + if err != nil { + return nil, err + } + + return byteCode, nil + } + + return nil, nil +} diff --git a/ethutil/script_windows.go b/ethutil/script_windows.go new file mode 100644 index 000000000..1dedc5f60 --- /dev/null +++ b/ethutil/script_windows.go @@ -0,0 +1,12 @@ +// +build windows + +package ethutil + +// General compile function +func Compile(script string, silent bool) (ret []byte, err error) { + if len(script) > 2 { + return nil, nil + } + + return nil, nil +} diff --git a/ethutil/set.go b/ethutil/set.go new file mode 100644 index 000000000..7955edac0 --- /dev/null +++ b/ethutil/set.go @@ -0,0 +1,36 @@ +package ethutil + +type Settable interface { + AsSet() UniqueSet +} + +type Stringable interface { + String() string +} + +type UniqueSet map[string]struct{} + +func NewSet(v ...Stringable) UniqueSet { + set := make(UniqueSet) + for _, val := range v { + set.Insert(val) + } + + return set +} + +func (self UniqueSet) Insert(k Stringable) UniqueSet { + self[k.String()] = struct{}{} + + return self +} + +func (self UniqueSet) Include(k Stringable) bool { + _, ok := self[k.String()] + + return ok +} + +func Set(s Settable) UniqueSet { + return s.AsSet() +} diff --git a/ethutil/size.go b/ethutil/size.go new file mode 100644 index 000000000..b4426465e --- /dev/null +++ b/ethutil/size.go @@ -0,0 +1,15 @@ +package ethutil + +import "fmt" + +type StorageSize float64 + +func (self StorageSize) String() string { + if self > 1000000 { + return fmt.Sprintf("%.2f mB", self/1000000) + } else if self > 1000 { + return fmt.Sprintf("%.2f kB", self/1000) + } else { + return fmt.Sprintf("%.2f B", self) + } +} diff --git a/ethutil/size_test.go b/ethutil/size_test.go new file mode 100644 index 000000000..e0f28abc5 --- /dev/null +++ b/ethutil/size_test.go @@ -0,0 +1,23 @@ +package ethutil + +import ( + checker "gopkg.in/check.v1" +) + +type SizeSuite struct{} + +var _ = checker.Suite(&SizeSuite{}) + +func (s *SizeSuite) TestStorageSizeString(c *checker.C) { + data1 := 2381273 + data2 := 2192 + data3 := 12 + + exp1 := "2.38 mB" + exp2 := "2.19 kB" + exp3 := "12.00 B" + + c.Assert(StorageSize(data1).String(), checker.Equals, exp1) + c.Assert(StorageSize(data2).String(), checker.Equals, exp2) + c.Assert(StorageSize(data3).String(), checker.Equals, exp3) +} diff --git a/ethutil/value.go b/ethutil/value.go new file mode 100644 index 000000000..7d4a7d98c --- /dev/null +++ b/ethutil/value.go @@ -0,0 +1,401 @@ +package ethutil + +import ( + "bytes" + "fmt" + "math/big" + "reflect" + "strconv" +) + +// Data values are returned by the rlp decoder. The data values represents +// one item within the rlp data structure. It's responsible for all the casting +// It always returns something valid +type Value struct { + Val interface{} + kind reflect.Value +} + +func (val *Value) String() string { + return fmt.Sprintf("%x", val.Val) +} + +func NewValue(val interface{}) *Value { + t := val + if v, ok := val.(*Value); ok { + t = v.Val + } + + return &Value{Val: t} +} + +func (val *Value) Type() reflect.Kind { + return reflect.TypeOf(val.Val).Kind() +} + +func (val *Value) IsNil() bool { + return val.Val == nil +} + +func (val *Value) Len() int { + //return val.kind.Len() + if data, ok := val.Val.([]interface{}); ok { + return len(data) + } + + return len(val.Bytes()) +} + +func (val *Value) Raw() interface{} { + return val.Val +} + +func (val *Value) Interface() interface{} { + return val.Val +} + +func (val *Value) Uint() uint64 { + if Val, ok := val.Val.(uint8); ok { + return uint64(Val) + } else if Val, ok := val.Val.(uint16); ok { + return uint64(Val) + } else if Val, ok := val.Val.(uint32); ok { + return uint64(Val) + } else if Val, ok := val.Val.(uint64); ok { + return Val + } else if Val, ok := val.Val.(float32); ok { + return uint64(Val) + } else if Val, ok := val.Val.(float64); ok { + return uint64(Val) + } else if Val, ok := val.Val.(int); ok { + return uint64(Val) + } else if Val, ok := val.Val.(uint); ok { + return uint64(Val) + } else if Val, ok := val.Val.([]byte); ok { + return new(big.Int).SetBytes(Val).Uint64() + } else if Val, ok := val.Val.(*big.Int); ok { + return Val.Uint64() + } + + return 0 +} + +func (val *Value) Int() int64 { + if Val, ok := val.Val.(int8); ok { + return int64(Val) + } else if Val, ok := val.Val.(int16); ok { + return int64(Val) + } else if Val, ok := val.Val.(int32); ok { + return int64(Val) + } else if Val, ok := val.Val.(int64); ok { + return Val + } else if Val, ok := val.Val.(int); ok { + return int64(Val) + } else if Val, ok := val.Val.(float32); ok { + return int64(Val) + } else if Val, ok := val.Val.(float64); ok { + return int64(Val) + } else if Val, ok := val.Val.([]byte); ok { + return new(big.Int).SetBytes(Val).Int64() + } else if Val, ok := val.Val.(*big.Int); ok { + return Val.Int64() + } else if Val, ok := val.Val.(string); ok { + n, _ := strconv.Atoi(Val) + return int64(n) + } + + return 0 +} + +func (val *Value) Byte() byte { + if Val, ok := val.Val.(byte); ok { + return Val + } + + return 0x0 +} + +func (val *Value) BigInt() *big.Int { + if a, ok := val.Val.([]byte); ok { + b := new(big.Int).SetBytes(a) + + return b + } else if a, ok := val.Val.(*big.Int); ok { + return a + } else if a, ok := val.Val.(string); ok { + return Big(a) + } else { + return big.NewInt(int64(val.Uint())) + } + + return big.NewInt(0) +} + +func (val *Value) Str() string { + if a, ok := val.Val.([]byte); ok { + return string(a) + } else if a, ok := val.Val.(string); ok { + return a + } else if a, ok := val.Val.(byte); ok { + return string(a) + } + + return "" +} + +func (val *Value) Bytes() []byte { + if a, ok := val.Val.([]byte); ok { + return a + } else if s, ok := val.Val.(byte); ok { + return []byte{s} + } else if s, ok := val.Val.(string); ok { + return []byte(s) + } else if s, ok := val.Val.(*big.Int); ok { + return s.Bytes() + } else { + return big.NewInt(val.Int()).Bytes() + } + + return []byte{} +} + +func (val *Value) Err() error { + if err, ok := val.Val.(error); ok { + return err + } + + return nil +} + +func (val *Value) Slice() []interface{} { + if d, ok := val.Val.([]interface{}); ok { + return d + } + + return []interface{}{} +} + +func (val *Value) SliceFrom(from int) *Value { + slice := val.Slice() + + return NewValue(slice[from:]) +} + +func (val *Value) SliceTo(to int) *Value { + slice := val.Slice() + + return NewValue(slice[:to]) +} + +func (val *Value) SliceFromTo(from, to int) *Value { + slice := val.Slice() + + return NewValue(slice[from:to]) +} + +// TODO More type checking methods +func (val *Value) IsSlice() bool { + return val.Type() == reflect.Slice +} + +func (val *Value) IsStr() bool { + return val.Type() == reflect.String +} + +func (self *Value) IsErr() bool { + _, ok := self.Val.(error) + return ok +} + +// Special list checking function. Something is considered +// a list if it's of type []interface{}. The list is usually +// used in conjunction with rlp decoded streams. +func (val *Value) IsList() bool { + _, ok := val.Val.([]interface{}) + + return ok +} + +func (val *Value) IsEmpty() bool { + return val.Val == nil || ((val.IsSlice() || val.IsStr()) && val.Len() == 0) +} + +// Threat the value as a slice +func (val *Value) Get(idx int) *Value { + if d, ok := val.Val.([]interface{}); ok { + // Guard for oob + if len(d) <= idx { + return NewValue(nil) + } + + if idx < 0 { + return NewValue(nil) + } + + return NewValue(d[idx]) + } + + // If this wasn't a slice you probably shouldn't be using this function + return NewValue(nil) +} + +func (self *Value) Copy() *Value { + switch val := self.Val.(type) { + case *big.Int: + return NewValue(new(big.Int).Set(val)) + case []byte: + return NewValue(CopyBytes(val)) + default: + return NewValue(self.Val) + } + + return nil +} + +func (val *Value) Cmp(o *Value) bool { + return reflect.DeepEqual(val.Val, o.Val) +} + +func (self *Value) DeepCmp(o *Value) bool { + return bytes.Compare(self.Bytes(), o.Bytes()) == 0 +} + +func (val *Value) Encode() []byte { + return Encode(val.Val) +} + +// Assume that the data we have is encoded +func (self *Value) Decode() { + v, _ := Decode(self.Bytes(), 0) + self.Val = v + //self.Val = DecodeWithReader(bytes.NewBuffer(self.Bytes())) +} + +func NewValueFromBytes(data []byte) *Value { + if len(data) != 0 { + value := NewValue(data) + value.Decode() + + return value + } + + return NewValue(nil) +} + +// Value setters +func NewSliceValue(s interface{}) *Value { + list := EmptyValue() + + if s != nil { + if slice, ok := s.([]interface{}); ok { + for _, val := range slice { + list.Append(val) + } + } else if slice, ok := s.([]string); ok { + for _, val := range slice { + list.Append(val) + } + } + } + + return list +} + +func EmptyValue() *Value { + return NewValue([]interface{}{}) +} + +func (val *Value) AppendList() *Value { + list := EmptyValue() + val.Val = append(val.Slice(), list) + + return list +} + +func (val *Value) Append(v interface{}) *Value { + val.Val = append(val.Slice(), v) + + return val +} + +const ( + valOpAdd = iota + valOpDiv + valOpMul + valOpPow + valOpSub +) + +// Math stuff +func (self *Value) doOp(op int, other interface{}) *Value { + left := self.BigInt() + right := NewValue(other).BigInt() + + switch op { + case valOpAdd: + self.Val = left.Add(left, right) + case valOpDiv: + self.Val = left.Div(left, right) + case valOpMul: + self.Val = left.Mul(left, right) + case valOpPow: + self.Val = left.Exp(left, right, Big0) + case valOpSub: + self.Val = left.Sub(left, right) + } + + return self +} + +func (self *Value) Add(other interface{}) *Value { + return self.doOp(valOpAdd, other) +} + +func (self *Value) Sub(other interface{}) *Value { + return self.doOp(valOpSub, other) +} + +func (self *Value) Div(other interface{}) *Value { + return self.doOp(valOpDiv, other) +} + +func (self *Value) Mul(other interface{}) *Value { + return self.doOp(valOpMul, other) +} + +func (self *Value) Pow(other interface{}) *Value { + return self.doOp(valOpPow, other) +} + +type ValueIterator struct { + value *Value + currentValue *Value + idx int +} + +func (val *Value) NewIterator() *ValueIterator { + return &ValueIterator{value: val} +} + +func (it *ValueIterator) Len() int { + return it.value.Len() +} + +func (it *ValueIterator) Next() bool { + if it.idx >= it.value.Len() { + return false + } + + it.currentValue = it.value.Get(it.idx) + it.idx++ + + return true +} + +func (it *ValueIterator) Value() *Value { + return it.currentValue +} + +func (it *ValueIterator) Idx() int { + return it.idx - 1 +} diff --git a/ethutil/value_test.go b/ethutil/value_test.go new file mode 100644 index 000000000..861d35184 --- /dev/null +++ b/ethutil/value_test.go @@ -0,0 +1,70 @@ +package ethutil + +import ( + "math/big" + + checker "gopkg.in/check.v1" +) + +type ValueSuite struct{} + +var _ = checker.Suite(&ValueSuite{}) + +func (s *ValueSuite) TestValueCmp(c *checker.C) { + val1 := NewValue("hello") + val2 := NewValue("world") + c.Assert(val1.Cmp(val2), checker.Equals, false) + + val3 := NewValue("hello") + val4 := NewValue("hello") + c.Assert(val3.Cmp(val4), checker.Equals, true) +} + +func (s *ValueSuite) TestValueTypes(c *checker.C) { + str := NewValue("str") + num := NewValue(1) + inter := NewValue([]interface{}{1}) + byt := NewValue([]byte{1, 2, 3, 4}) + bigInt := NewValue(big.NewInt(10)) + + strExp := "str" + numExp := uint64(1) + interExp := []interface{}{1} + bytExp := []byte{1, 2, 3, 4} + bigExp := big.NewInt(10) + + c.Assert(str.Str(), checker.Equals, strExp) + c.Assert(num.Uint(), checker.Equals, numExp) + c.Assert(NewValue(inter.Interface()).Cmp(NewValue(interExp)), checker.Equals, true) + c.Assert(byt.Bytes(), checker.DeepEquals, bytExp) + c.Assert(bigInt.BigInt(), checker.DeepEquals, bigExp) +} + +func (s *ValueSuite) TestIterator(c *checker.C) { + value := NewValue([]interface{}{1, 2, 3}) + iter := value.NewIterator() + values := []uint64{1, 2, 3} + i := 0 + for iter.Next() { + c.Assert(values[i], checker.Equals, iter.Value().Uint()) + i++ + } +} + +func (s *ValueSuite) TestMath(c *checker.C) { + data1 := NewValue(1) + data1.Add(1).Add(1) + exp1 := NewValue(3) + data2 := NewValue(2) + data2.Sub(1).Sub(1) + exp2 := NewValue(0) + + c.Assert(data1.DeepCmp(exp1), checker.Equals, true) + c.Assert(data2.DeepCmp(exp2), checker.Equals, true) +} + +func (s *ValueSuite) TestString(c *checker.C) { + data := "10" + exp := int64(10) + c.Assert(NewValue(data).Int(), checker.DeepEquals, exp) +} diff --git a/event/event.go b/event/event.go new file mode 100644 index 000000000..540fbba65 --- /dev/null +++ b/event/event.go @@ -0,0 +1,183 @@ +// Package event implements an event multiplexer. +package event + +import ( + "errors" + "fmt" + "reflect" + "sync" +) + +// Subscription is implemented by event subscriptions. +type Subscription interface { + // Chan returns a channel that carries events. + // Implementations should return the same channel + // for any subsequent calls to Chan. + Chan() <-chan interface{} + + // Unsubscribe stops delivery of events to a subscription. + // The event channel is closed. + // Unsubscribe can be called more than once. + Unsubscribe() +} + +// A TypeMux dispatches events to registered receivers. Receivers can be +// registered to handle events of certain type. Any operation +// called after mux is stopped will return ErrMuxClosed. +// +// The zero value is ready to use. +type TypeMux struct { + mutex sync.RWMutex + subm map[reflect.Type][]*muxsub + stopped bool +} + +// ErrMuxClosed is returned when Posting on a closed TypeMux. +var ErrMuxClosed = errors.New("event: mux closed") + +// Subscribe creates a subscription for events of the given types. The +// subscription's channel is closed when it is unsubscribed +// or the mux is closed. +func (mux *TypeMux) Subscribe(types ...interface{}) Subscription { + sub := newsub(mux) + mux.mutex.Lock() + defer mux.mutex.Unlock() + if mux.stopped { + close(sub.postC) + } else { + if mux.subm == nil { + mux.subm = make(map[reflect.Type][]*muxsub) + } + for _, t := range types { + rtyp := reflect.TypeOf(t) + oldsubs := mux.subm[rtyp] + if find(oldsubs, sub) != -1 { + panic(fmt.Sprintf("event: duplicate type %s in Subscribe", rtyp)) + } + subs := make([]*muxsub, len(oldsubs)+1) + copy(subs, oldsubs) + subs[len(oldsubs)] = sub + mux.subm[rtyp] = subs + } + } + return sub +} + +// Post sends an event to all receivers registered for the given type. +// It returns ErrMuxClosed if the mux has been stopped. +func (mux *TypeMux) Post(ev interface{}) error { + rtyp := reflect.TypeOf(ev) + mux.mutex.RLock() + if mux.stopped { + mux.mutex.RUnlock() + return ErrMuxClosed + } + subs := mux.subm[rtyp] + mux.mutex.RUnlock() + for _, sub := range subs { + sub.deliver(ev) + } + return nil +} + +// Stop closes a mux. The mux can no longer be used. +// Future Post calls will fail with ErrMuxClosed. +// Stop blocks until all current deliveries have finished. +func (mux *TypeMux) Stop() { + mux.mutex.Lock() + for _, subs := range mux.subm { + for _, sub := range subs { + sub.closewait() + } + } + mux.subm = nil + mux.stopped = true + mux.mutex.Unlock() +} + +func (mux *TypeMux) del(s *muxsub) { + mux.mutex.Lock() + for typ, subs := range mux.subm { + if pos := find(subs, s); pos >= 0 { + if len(subs) == 1 { + delete(mux.subm, typ) + } else { + mux.subm[typ] = posdelete(subs, pos) + } + } + } + s.mux.mutex.Unlock() +} + +func find(slice []*muxsub, item *muxsub) int { + for i, v := range slice { + if v == item { + return i + } + } + return -1 +} + +func posdelete(slice []*muxsub, pos int) []*muxsub { + news := make([]*muxsub, len(slice)-1) + copy(news[:pos], slice[:pos]) + copy(news[pos:], slice[pos+1:]) + return news +} + +type muxsub struct { + mux *TypeMux + closeMu sync.Mutex + closing chan struct{} + closed bool + + // these two are the same channel. they are stored separately so + // postC can be set to nil without affecting the return value of + // Chan. + postMu sync.RWMutex + readC <-chan interface{} + postC chan<- interface{} +} + +func newsub(mux *TypeMux) *muxsub { + c := make(chan interface{}) + return &muxsub{ + mux: mux, + readC: c, + postC: c, + closing: make(chan struct{}), + } +} + +func (s *muxsub) Chan() <-chan interface{} { + return s.readC +} + +func (s *muxsub) Unsubscribe() { + s.mux.del(s) + s.closewait() +} + +func (s *muxsub) closewait() { + s.closeMu.Lock() + defer s.closeMu.Unlock() + if s.closed { + return + } + close(s.closing) + s.closed = true + + s.postMu.Lock() + close(s.postC) + s.postC = nil + s.postMu.Unlock() +} + +func (s *muxsub) deliver(ev interface{}) { + s.postMu.RLock() + select { + case s.postC <- ev: + case <-s.closing: + } + s.postMu.RUnlock() +} diff --git a/event/event_test.go b/event/event_test.go new file mode 100644 index 000000000..c7c0266c1 --- /dev/null +++ b/event/event_test.go @@ -0,0 +1,176 @@ +package event + +import ( + "math/rand" + "sync" + "testing" + "time" +) + +type testEvent int + +func TestSub(t *testing.T) { + mux := new(TypeMux) + defer mux.Stop() + + sub := mux.Subscribe(testEvent(0)) + go func() { + if err := mux.Post(testEvent(5)); err != nil { + t.Errorf("Post returned unexpected error: %v", err) + } + }() + ev := <-sub.Chan() + + if ev.(testEvent) != testEvent(5) { + t.Errorf("Got %v (%T), expected event %v (%T)", + ev, ev, testEvent(5), testEvent(5)) + } +} + +func TestMuxErrorAfterStop(t *testing.T) { + mux := new(TypeMux) + mux.Stop() + + sub := mux.Subscribe(testEvent(0)) + if _, isopen := <-sub.Chan(); isopen { + t.Errorf("subscription channel was not closed") + } + if err := mux.Post(testEvent(0)); err != ErrMuxClosed { + t.Errorf("Post error mismatch, got: %s, expected: %s", err, ErrMuxClosed) + } +} + +func TestUnsubscribeUnblockPost(t *testing.T) { + mux := new(TypeMux) + defer mux.Stop() + + sub := mux.Subscribe(testEvent(0)) + unblocked := make(chan bool) + go func() { + mux.Post(testEvent(5)) + unblocked <- true + }() + + select { + case <-unblocked: + t.Errorf("Post returned before Unsubscribe") + default: + sub.Unsubscribe() + <-unblocked + } +} + +func TestSubscribeDuplicateType(t *testing.T) { + mux := new(TypeMux) + expected := "event: duplicate type event.testEvent in Subscribe" + + defer func() { + err := recover() + if err == nil { + t.Errorf("Subscribe didn't panic for duplicate type") + } else if err != expected { + t.Errorf("panic mismatch: got %#v, expected %#v", err, expected) + } + }() + mux.Subscribe(testEvent(1), testEvent(2)) +} + +func TestMuxConcurrent(t *testing.T) { + rand.Seed(time.Now().Unix()) + mux := new(TypeMux) + defer mux.Stop() + + recv := make(chan int) + poster := func() { + for { + err := mux.Post(testEvent(0)) + if err != nil { + return + } + } + } + sub := func(i int) { + time.Sleep(time.Duration(rand.Intn(99)) * time.Millisecond) + sub := mux.Subscribe(testEvent(0)) + <-sub.Chan() + sub.Unsubscribe() + recv <- i + } + + go poster() + go poster() + go poster() + nsubs := 1000 + for i := 0; i < nsubs; i++ { + go sub(i) + } + + // wait until everyone has been served + counts := make(map[int]int, nsubs) + for i := 0; i < nsubs; i++ { + counts[<-recv]++ + } + for i, count := range counts { + if count != 1 { + t.Errorf("receiver %d called %d times, expected only 1 call", i, count) + } + } +} + +func emptySubscriber(mux *TypeMux, types ...interface{}) { + s := mux.Subscribe(testEvent(0)) + go func() { + for _ = range s.Chan() { + } + }() +} + +func BenchmarkPost3(b *testing.B) { + var mux = new(TypeMux) + defer mux.Stop() + emptySubscriber(mux, testEvent(0)) + emptySubscriber(mux, testEvent(0)) + emptySubscriber(mux, testEvent(0)) + + for i := 0; i < b.N; i++ { + mux.Post(testEvent(0)) + } +} + +func BenchmarkPostConcurrent(b *testing.B) { + var mux = new(TypeMux) + defer mux.Stop() + emptySubscriber(mux, testEvent(0)) + emptySubscriber(mux, testEvent(0)) + emptySubscriber(mux, testEvent(0)) + + var wg sync.WaitGroup + poster := func() { + for i := 0; i < b.N; i++ { + mux.Post(testEvent(0)) + } + wg.Done() + } + wg.Add(5) + for i := 0; i < 5; i++ { + go poster() + } + wg.Wait() +} + +// for comparison +func BenchmarkChanSend(b *testing.B) { + c := make(chan interface{}) + closed := make(chan struct{}) + go func() { + for _ = range c { + } + }() + + for i := 0; i < b.N; i++ { + select { + case c <- i: + case <-closed: + } + } +} diff --git a/event/example_test.go b/event/example_test.go new file mode 100644 index 000000000..2f47f6f27 --- /dev/null +++ b/event/example_test.go @@ -0,0 +1,42 @@ +package event + +import "fmt" + +func ExampleTypeMux() { + type someEvent struct{ I int } + type otherEvent struct{ S string } + type yetAnotherEvent struct{ X, Y int } + + var mux TypeMux + + // Start a subscriber. + done := make(chan struct{}) + sub := mux.Subscribe(someEvent{}, otherEvent{}) + go func() { + for event := range sub.Chan() { + fmt.Printf("Received: %#v\n", event) + } + fmt.Println("done") + close(done) + }() + + // Post some events. + mux.Post(someEvent{5}) + mux.Post(yetAnotherEvent{X: 3, Y: 4}) + mux.Post(someEvent{6}) + mux.Post(otherEvent{"whoa"}) + + // Stop closes all subscription channels. + // The subscriber goroutine will print "done" + // and exit. + mux.Stop() + + // Wait for subscriber to return. + <-done + + // Output: + // Received: event.someEvent{I:5} + // Received: event.someEvent{I:6} + // Received: event.otherEvent{S:"whoa"} + // done +} diff --git a/event/filter/filter.go b/event/filter/filter.go new file mode 100644 index 000000000..9817d5782 --- /dev/null +++ b/event/filter/filter.go @@ -0,0 +1,70 @@ +package filter + +import "reflect" + +type Filter interface { + Compare(Filter) bool + Trigger(data interface{}) +} + +type FilterEvent struct { + filter Filter + data interface{} +} + +type Filters struct { + id int + watchers map[int]Filter + ch chan FilterEvent + + quit chan struct{} +} + +func New() *Filters { + return &Filters{ + ch: make(chan FilterEvent), + watchers: make(map[int]Filter), + quit: make(chan struct{}), + } +} + +func (self *Filters) Start() { + go self.loop() +} + +func (self *Filters) Stop() { + close(self.quit) +} + +func (self *Filters) Notify(filter Filter, data interface{}) { + self.ch <- FilterEvent{filter, data} +} + +func (self *Filters) Install(watcher Filter) int { + self.watchers[self.id] = watcher + self.id++ + + return self.id - 1 +} + +func (self *Filters) Uninstall(id int) { + delete(self.watchers, id) +} + +func (self *Filters) loop() { +out: + for { + select { + case <-self.quit: + break out + case event := <-self.ch: + for _, watcher := range self.watchers { + if reflect.TypeOf(watcher) == reflect.TypeOf(event.filter) { + if watcher.Compare(event.filter) { + watcher.Trigger(event.data) + } + } + } + } + } +} diff --git a/event/filter/filter_test.go b/event/filter/filter_test.go new file mode 100644 index 000000000..815deb63a --- /dev/null +++ b/event/filter/filter_test.go @@ -0,0 +1,34 @@ +package filter + +import "testing" + +func TestFilters(t *testing.T) { + var success bool + var failure bool + + fm := New() + fm.Start() + fm.Install(Generic{ + Str1: "hello", + Fn: func(data interface{}) { + success = data.(bool) + }, + }) + fm.Install(Generic{ + Str1: "hello1", + Str2: "hello", + Fn: func(data interface{}) { + failure = true + }, + }) + fm.Notify(Generic{Str1: "hello"}, true) + fm.Stop() + + if !success { + t.Error("expected 'hello' to be posted") + } + + if failure { + t.Error("hello1 was triggered") + } +} diff --git a/event/filter/generic_filter.go b/event/filter/generic_filter.go new file mode 100644 index 000000000..b04b4801e --- /dev/null +++ b/event/filter/generic_filter.go @@ -0,0 +1,22 @@ +package filter + +type Generic struct { + Str1, Str2, Str3 string + + Fn func(data interface{}) +} + +func (self Generic) Compare(f Filter) bool { + filter := f.(Generic) + if (len(self.Str1) == 0 || filter.Str1 == self.Str1) && + (len(self.Str2) == 0 || filter.Str2 == self.Str2) && + (len(self.Str3) == 0 || filter.Str3 == self.Str3) { + return true + } + + return false +} + +func (self Generic) Trigger(data interface{}) { + self.Fn(data) +} diff --git a/events.go b/events.go new file mode 100644 index 000000000..5fff1d831 --- /dev/null +++ b/events.go @@ -0,0 +1,11 @@ +package eth + +import "container/list" + +type PeerListEvent struct { + Peers *list.List +} + +type ChainSyncEvent struct { + InSync bool +} diff --git a/gocoverage.sh b/gocoverage.sh new file mode 100755 index 000000000..35038108b --- /dev/null +++ b/gocoverage.sh @@ -0,0 +1,29 @@ +#!/bin/bash +# The script does automatic checking on a Go package and its sub-packages, including: +# 6. test coverage (http://blog.golang.org/cover) + +set -e + +# Run test coverage on each subdirectories and merge the coverage profile. + +echo "mode: count" > profile.cov + +# Standard go tooling behavior is to ignore dirs with leading underscors +for dir in $(find . -maxdepth 10 -not -path './.git*' -not -path '*/_*' -type d); +do +if ls $dir/*.go &> /dev/null; then + # echo $dir + go test -covermode=count -coverprofile=$dir/profile.tmp $dir + if [ -f $dir/profile.tmp ] + then + cat $dir/profile.tmp | tail -n +2 >> profile.cov + rm $dir/profile.tmp + fi +fi +done + +go tool cover -func profile.cov + +# To submit the test coverage result to coveralls.io, +# use goveralls (https://github.com/mattn/goveralls) +# goveralls -coverprofile=profile.cov -service=travis-ci diff --git a/install.sh b/install.sh index 9719a1afc..30a3802e4 100755 --- a/install.sh +++ b/install.sh @@ -1,15 +1,20 @@ #!/bin/sh if [ "$1" == "" ]; then - echo "Usage $0 executable branch ethereum develop" - echo "executable ethereum or ethereal" - echo "branch develop or master" + echo "Usage $0 executable branch" + echo "executable ethereum | mist" + echo "branch develop | master" exit fi exe=$1 +path=$exe branch=$2 +if [ "$branch" == "develop" ]; then + path="cmd/$exe" +fi + # Test if go is installed command -v go >/dev/null 2>&1 || { echo >&2 "Unable to find 'go'. This script requires go."; exit 1; } @@ -19,39 +24,30 @@ if [ "$GOPATH" == "" ]; then exit fi -echo "go get -u -d github.com/ethereum/go-ethereum/$exe" -go get -v -u -d github.com/ethereum/go-ethereum/$exe -if [ $? != 0 ]; then - echo "go get failed" - exit -fi +echo "changing branch to $branch" +cd $GOPATH/src/github.com/ethereum/go-ethereum +git checkout $branch -echo "serpent-go" -cd $GOPATH/src/github.com/obscuren/serpent-go +# installing package dependencies doesn't work for develop +# branch as go get always pulls from master head +# so build will continue to fail, but this installs locally +# for people who git clone since go install will manage deps -echo "init submodule" -git submodule init -git submodule update +#echo "go get -u -d github.com/ethereum/go-ethereum/$path" +#go get -v -u -d github.com/ethereum/go-ethereum/$path +#if [ $? != 0 ]; then +# echo "go get failed" +# exit +#fi -echo "eth-go" -cd $GOPATH/src/github.com/ethereum/eth-go -git checkout $branch +cd $GOPATH/src/github.com/ethereum/go-ethereum/$path -echo "go-ethereum" -cd $GOPATH/src/github.com/ethereum/go-ethereum/$exe -git checkout $branch - -if [ "$exe" == "ethereal" ]; then - echo "Building ethereal GUI. Assuming Qt is installed. If this step" +if [ "$exe" == "mist" ]; then + echo "Building Mist GUI. Assuming Qt is installed. If this step" echo "fails; please refer to: https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum(Go)" else echo "Building ethereum CLI." fi go install -if [ $? == 0 ]; then - echo "go install failed" - exit -fi - echo "done. Please run $exe :-)" diff --git a/install_deps.sh b/install_deps.sh new file mode 100755 index 000000000..73a313324 --- /dev/null +++ b/install_deps.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +set -e + +TEST_DEPS=$(go list -f '{{.Imports}} {{.TestImports}} {{.XTestImports}}' github.com/ethereum/go-ethereum/... | sed -e 's/\[//g' | sed -e 's/\]//g' | sed -e 's/C //g') +if [ "$TEST_DEPS" ]; then + go get -race $TEST_DEPS +fi diff --git a/javascript/javascript_runtime.go b/javascript/javascript_runtime.go index ffc672a63..a26f0154e 100644 --- a/javascript/javascript_runtime.go +++ b/javascript/javascript_runtime.go @@ -7,27 +7,26 @@ import ( "path" "path/filepath" - "github.com/ethereum/eth-go" - "github.com/ethereum/eth-go/ethchain" - "github.com/ethereum/eth-go/ethlog" - "github.com/ethereum/eth-go/ethpipe" - "github.com/ethereum/eth-go/ethreact" - "github.com/ethereum/eth-go/ethstate" - "github.com/ethereum/eth-go/ethutil" - "github.com/ethereum/go-ethereum/utils" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/state" + "github.com/ethereum/go-ethereum/xeth" "github.com/obscuren/otto" ) -var jsrelogger = ethlog.NewLogger("JSRE") +var jsrelogger = logger.NewLogger("JSRE") type JSRE struct { ethereum *eth.Ethereum Vm *otto.Otto - pipe *ethpipe.JSPipe + pipe *xeth.JSXEth - blockChan chan ethreact.Event - changeChan chan ethreact.Event - quitChan chan bool + events event.Subscription objectCb map[string][]otto.Value } @@ -42,7 +41,7 @@ func (jsre *JSRE) LoadExtFile(path string) { } func (jsre *JSRE) LoadIntFile(file string) { - assetPath := path.Join(os.Getenv("GOPATH"), "src", "github.com", "ethereum", "go-ethereum", "mist", "assets", "ext") + assetPath := path.Join(os.Getenv("GOPATH"), "src", "github.com", "ethereum", "go-ethereum", "cmd", "mist", "assets", "ext") jsre.LoadExtFile(path.Join(assetPath, file)) } @@ -50,10 +49,8 @@ func NewJSRE(ethereum *eth.Ethereum) *JSRE { re := &JSRE{ ethereum, otto.New(), - ethpipe.NewJSPipe(ethereum), - make(chan ethreact.Event, 10), - make(chan ethreact.Event, 10), - make(chan bool), + xeth.NewJSXEth(ethereum), + nil, make(map[string][]otto.Value), } @@ -64,13 +61,13 @@ func NewJSRE(ethereum *eth.Ethereum) *JSRE { re.LoadIntFile("string.js") re.LoadIntFile("big.js") + // Subscribe to events + mux := ethereum.EventMux() + re.events = mux.Subscribe(core.NewBlockEvent{}) + // We have to make sure that, whoever calls this, calls "Stop" go re.mainLoop() - // Subscribe to events - reactor := ethereum.Reactor() - reactor.Subscribe("newBlock", re.blockChan) - re.Bind("eth", &JSEthereum{re.pipe, re.Vm, ethereum}) re.initStdFuncs() @@ -105,25 +102,12 @@ func (self *JSRE) Require(file string) error { } func (self *JSRE) Stop() { - // Kill the main loop - self.quitChan <- true - - close(self.blockChan) - close(self.quitChan) - close(self.changeChan) + self.events.Unsubscribe() jsrelogger.Infoln("stopped") } func (self *JSRE) mainLoop() { -out: - for { - select { - case <-self.quitChan: - break out - case block := <-self.blockChan: - if _, ok := block.Resource.(*ethchain.Block); ok { - } - } + for _ = range self.events.Chan() { } } @@ -137,6 +121,7 @@ func (self *JSRE) initStdFuncs() { eth.Set("startMining", self.startMining) eth.Set("execBlock", self.execBlock) eth.Set("dump", self.dump) + eth.Set("export", self.export) } /* @@ -144,16 +129,16 @@ func (self *JSRE) initStdFuncs() { */ func (self *JSRE) dump(call otto.FunctionCall) otto.Value { - var state *ethstate.State + var state *state.StateDB if len(call.ArgumentList) > 0 { - var block *ethchain.Block + var block *types.Block if call.Argument(0).IsNumber() { num, _ := call.Argument(0).ToInteger() - block = self.ethereum.BlockChain().GetBlockByNumber(uint64(num)) + block = self.ethereum.ChainManager().GetBlockByNumber(uint64(num)) } else if call.Argument(0).IsString() { hash, _ := call.Argument(0).ToString() - block = self.ethereum.BlockChain().GetBlock(ethutil.Hex2Bytes(hash)) + block = self.ethereum.ChainManager().GetBlock(ethutil.Hex2Bytes(hash)) } else { fmt.Println("invalid argument for dump. Either hex string or number") } @@ -166,7 +151,7 @@ func (self *JSRE) dump(call otto.FunctionCall) otto.Value { state = block.State() } else { - state = self.ethereum.StateManager().CurrentState() + state = self.ethereum.ChainManager().State() } v, _ := self.Vm.ToValue(state.Dump()) @@ -201,13 +186,13 @@ func (self *JSRE) watch(call otto.FunctionCall) otto.Value { if storageCallback { self.objectCb[addr+storageAddr] = append(self.objectCb[addr+storageAddr], cb) - event := "storage:" + string(ethutil.Hex2Bytes(addr)) + ":" + string(ethutil.Hex2Bytes(storageAddr)) - self.ethereum.Reactor().Subscribe(event, self.changeChan) + // event := "storage:" + string(ethutil.Hex2Bytes(addr)) + ":" + string(ethutil.Hex2Bytes(storageAddr)) + // self.ethereum.EventMux().Subscribe(event, self.changeChan) } else { self.objectCb[addr] = append(self.objectCb[addr], cb) - event := "object:" + string(ethutil.Hex2Bytes(addr)) - self.ethereum.Reactor().Subscribe(event, self.changeChan) + // event := "object:" + string(ethutil.Hex2Bytes(addr)) + // self.ethereum.EventMux().Subscribe(event, self.changeChan) } return otto.UndefinedValue() @@ -252,3 +237,20 @@ func (self *JSRE) execBlock(call otto.FunctionCall) otto.Value { return otto.TrueValue() } + +func (self *JSRE) export(call otto.FunctionCall) otto.Value { + fn, err := call.Argument(0).ToString() + if err != nil { + fmt.Println(err) + return otto.FalseValue() + } + + data := self.ethereum.ChainManager().Export() + + if err := ethutil.WriteFile(fn, data); err != nil { + fmt.Println(err) + return otto.FalseValue() + } + + return otto.TrueValue() +} diff --git a/javascript/js_lib.go b/javascript/js_lib.go index a3e9b8a5b..dd1fe5f4d 100644 --- a/javascript/js_lib.go +++ b/javascript/js_lib.go @@ -44,9 +44,11 @@ function pp(object) { function prettyPrint(/* */) { var args = arguments; + var ret = ""; for(var i = 0, l = args.length; i < l; i++) { - console.log(pp(args[i])) + ret += pp(args[i]) + "\n"; } + return ret; } var print = prettyPrint; diff --git a/javascript/types.go b/javascript/types.go index 53a2977a8..d5acaecce 100644 --- a/javascript/types.go +++ b/javascript/types.go @@ -3,16 +3,16 @@ package javascript import ( "fmt" - "github.com/ethereum/eth-go" - "github.com/ethereum/eth-go/ethchain" - "github.com/ethereum/eth-go/ethpipe" - "github.com/ethereum/eth-go/ethstate" - "github.com/ethereum/eth-go/ethutil" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/state" + "github.com/ethereum/go-ethereum/ui" + "github.com/ethereum/go-ethereum/xeth" "github.com/obscuren/otto" ) type JSStateObject struct { - *ethpipe.JSObject + *xeth.JSObject eth *JSEthereum } @@ -30,7 +30,7 @@ func (self *JSStateObject) EachStorage(call otto.FunctionCall) otto.Value { // The JSEthereum object attempts to wrap the PEthereum object and returns // meaningful javascript objects type JSBlock struct { - *ethpipe.JSBlock + *xeth.JSBlock eth *JSEthereum } @@ -51,7 +51,7 @@ type JSMessage struct { Number int32 `json:"number"` } -func NewJSMessage(message *ethstate.Message) JSMessage { +func NewJSMessage(message *state.Message) JSMessage { return JSMessage{ To: ethutil.Bytes2Hex(message.To), From: ethutil.Bytes2Hex(message.From), @@ -67,33 +67,33 @@ func NewJSMessage(message *ethstate.Message) JSMessage { } type JSEthereum struct { - *ethpipe.JSPipe + *xeth.JSXEth vm *otto.Otto ethereum *eth.Ethereum } func (self *JSEthereum) GetBlock(hash string) otto.Value { - return self.toVal(&JSBlock{self.JSPipe.BlockByHash(hash), self}) + return self.toVal(&JSBlock{self.JSXEth.BlockByHash(hash), self}) } func (self *JSEthereum) GetPeers() otto.Value { - return self.toVal(self.JSPipe.Peers()) + return self.toVal(self.JSXEth.Peers()) } func (self *JSEthereum) GetKey() otto.Value { - return self.toVal(self.JSPipe.Key()) + return self.toVal(self.JSXEth.Key()) } func (self *JSEthereum) GetStateObject(addr string) otto.Value { - return self.toVal(&JSStateObject{ethpipe.NewJSObject(self.JSPipe.World().SafeGet(ethutil.Hex2Bytes(addr))), self}) + return self.toVal(&JSStateObject{xeth.NewJSObject(self.JSXEth.World().SafeGet(ethutil.Hex2Bytes(addr))), self}) } func (self *JSEthereum) Peers() otto.Value { - return self.toVal(self.JSPipe.Peers()) + return self.toVal(self.JSXEth.Peers()) } func (self *JSEthereum) Transact(key, recipient, valueStr, gasStr, gasPriceStr, dataStr string) otto.Value { - r, err := self.JSPipe.Transact(key, recipient, valueStr, gasStr, gasPriceStr, dataStr) + r, err := self.JSXEth.Transact(key, recipient, valueStr, gasStr, gasPriceStr, dataStr) if err != nil { fmt.Println(err) @@ -104,7 +104,7 @@ func (self *JSEthereum) Transact(key, recipient, valueStr, gasStr, gasPriceStr, } func (self *JSEthereum) Create(key, valueStr, gasStr, gasPriceStr, scriptStr string) otto.Value { - r, err := self.JSPipe.Transact(key, "", valueStr, gasStr, gasPriceStr, scriptStr) + r, err := self.JSXEth.Transact(key, "", valueStr, gasStr, gasPriceStr, scriptStr) if err != nil { fmt.Println(err) @@ -128,7 +128,7 @@ func (self *JSEthereum) toVal(v interface{}) otto.Value { } func (self *JSEthereum) Messages(object map[string]interface{}) otto.Value { - filter := ethchain.NewFilterFromMap(object, self.ethereum) + filter := ui.NewFilterFromMap(object, self.ethereum) messages := filter.Find() var msgs []JSMessage diff --git a/logger/example_test.go b/logger/example_test.go new file mode 100644 index 000000000..c624252b8 --- /dev/null +++ b/logger/example_test.go @@ -0,0 +1,21 @@ +package logger + +import "os" + +func ExampleLogger() { + logger := NewLogger("TAG") + logger.Infoln("so awesome") // prints [TAG] so awesome + logger.Infof("this %q is raw", "coin") // prints [TAG] this "coin" is raw +} + +func ExampleLogSystem() { + filename := "test.log" + file, _ := os.OpenFile(filename, os.O_RDWR|os.O_CREATE, os.ModePerm) + fileLog := NewStdLogSystem(file, 0, WarnLevel) + AddLogSystem(fileLog) + + stdoutLog := NewStdLogSystem(os.Stdout, 0, WarnLevel) + AddLogSystem(stdoutLog) + + NewLogger("TAG").Warnln("reactor meltdown") // writes to both logs +} diff --git a/logger/loggers.go b/logger/loggers.go new file mode 100644 index 000000000..1bf7bfa0e --- /dev/null +++ b/logger/loggers.go @@ -0,0 +1,248 @@ +/* +Package logger implements a multi-output leveled logger. + +Other packages use tagged logger to send log messages to shared +(process-wide) logging engine. The shared logging engine dispatches to +multiple log systems. The log level can be set separately per log +system. + +Logging is asynchronous and does not block the caller. Message +formatting is performed by the caller goroutine to avoid incorrect +logging of mutable state. +*/ +package logger + +import ( + "fmt" + "io" + "log" + "os" + "sync" + "sync/atomic" +) + +// LogSystem is implemented by log output devices. +// All methods can be called concurrently from multiple goroutines. +type LogSystem interface { + GetLogLevel() LogLevel + SetLogLevel(i LogLevel) + LogPrint(LogLevel, string) +} + +type message struct { + level LogLevel + msg string +} + +type LogLevel uint8 + +const ( + // Standard log levels + Silence LogLevel = iota + ErrorLevel + WarnLevel + InfoLevel + DebugLevel + DebugDetailLevel +) + +var ( + logMessageC = make(chan message) + addSystemC = make(chan LogSystem) + flushC = make(chan chan struct{}) + resetC = make(chan chan struct{}) +) + +func init() { + go dispatchLoop() +} + +// each system can buffer this many messages before +// blocking incoming log messages. +const sysBufferSize = 500 + +func dispatchLoop() { + var ( + systems []LogSystem + systemIn []chan message + systemWG sync.WaitGroup + ) + bootSystem := func(sys LogSystem) { + in := make(chan message, sysBufferSize) + systemIn = append(systemIn, in) + systemWG.Add(1) + go sysLoop(sys, in, &systemWG) + } + + for { + select { + case msg := <-logMessageC: + for _, c := range systemIn { + c <- msg + } + + case sys := <-addSystemC: + systems = append(systems, sys) + bootSystem(sys) + + case waiter := <-resetC: + // reset means terminate all systems + for _, c := range systemIn { + close(c) + } + systems = nil + systemIn = nil + systemWG.Wait() + close(waiter) + + case waiter := <-flushC: + // flush means reboot all systems + for _, c := range systemIn { + close(c) + } + systemIn = nil + systemWG.Wait() + for _, sys := range systems { + bootSystem(sys) + } + close(waiter) + } + } +} + +func sysLoop(sys LogSystem, in <-chan message, wg *sync.WaitGroup) { + for msg := range in { + if sys.GetLogLevel() >= msg.level { + sys.LogPrint(msg.level, msg.msg) + } + } + wg.Done() +} + +// Reset removes all active log systems. +// It blocks until all current messages have been delivered. +func Reset() { + waiter := make(chan struct{}) + resetC <- waiter + <-waiter +} + +// Flush waits until all current log messages have been dispatched to +// the active log systems. +func Flush() { + waiter := make(chan struct{}) + flushC <- waiter + <-waiter +} + +// AddLogSystem starts printing messages to the given LogSystem. +func AddLogSystem(sys LogSystem) { + addSystemC <- sys +} + +// A Logger prints messages prefixed by a given tag. It provides named +// Printf and Println style methods for all loglevels. Each ethereum +// component should have its own logger with a unique prefix. +type Logger struct { + tag string +} + +func NewLogger(tag string) *Logger { + return &Logger{"[" + tag + "] "} +} + +func (logger *Logger) sendln(level LogLevel, v ...interface{}) { + logMessageC <- message{level, logger.tag + fmt.Sprintln(v...)} +} + +func (logger *Logger) sendf(level LogLevel, format string, v ...interface{}) { + logMessageC <- message{level, logger.tag + fmt.Sprintf(format, v...)} +} + +// Errorln writes a message with ErrorLevel. +func (logger *Logger) Errorln(v ...interface{}) { + logger.sendln(ErrorLevel, v...) +} + +// Warnln writes a message with WarnLevel. +func (logger *Logger) Warnln(v ...interface{}) { + logger.sendln(WarnLevel, v...) +} + +// Infoln writes a message with InfoLevel. +func (logger *Logger) Infoln(v ...interface{}) { + logger.sendln(InfoLevel, v...) +} + +// Debugln writes a message with DebugLevel. +func (logger *Logger) Debugln(v ...interface{}) { + logger.sendln(DebugLevel, v...) +} + +// DebugDetailln writes a message with DebugDetailLevel. +func (logger *Logger) DebugDetailln(v ...interface{}) { + logger.sendln(DebugDetailLevel, v...) +} + +// Errorf writes a message with ErrorLevel. +func (logger *Logger) Errorf(format string, v ...interface{}) { + logger.sendf(ErrorLevel, format, v...) +} + +// Warnf writes a message with WarnLevel. +func (logger *Logger) Warnf(format string, v ...interface{}) { + logger.sendf(WarnLevel, format, v...) +} + +// Infof writes a message with InfoLevel. +func (logger *Logger) Infof(format string, v ...interface{}) { + logger.sendf(InfoLevel, format, v...) +} + +// Debugf writes a message with DebugLevel. +func (logger *Logger) Debugf(format string, v ...interface{}) { + logger.sendf(DebugLevel, format, v...) +} + +// DebugDetailf writes a message with DebugDetailLevel. +func (logger *Logger) DebugDetailf(format string, v ...interface{}) { + logger.sendf(DebugDetailLevel, format, v...) +} + +// Fatalln writes a message with ErrorLevel and exits the program. +func (logger *Logger) Fatalln(v ...interface{}) { + logger.sendln(ErrorLevel, v...) + Flush() + os.Exit(0) +} + +// Fatalf writes a message with ErrorLevel and exits the program. +func (logger *Logger) Fatalf(format string, v ...interface{}) { + logger.sendf(ErrorLevel, format, v...) + Flush() + os.Exit(0) +} + +// NewStdLogSystem creates a LogSystem that prints to the given writer. +// The flag values are defined package log. +func NewStdLogSystem(writer io.Writer, flags int, level LogLevel) LogSystem { + logger := log.New(writer, "", flags) + return &stdLogSystem{logger, uint32(level)} +} + +type stdLogSystem struct { + logger *log.Logger + level uint32 +} + +func (t *stdLogSystem) LogPrint(level LogLevel, msg string) { + t.logger.Print(msg) +} + +func (t *stdLogSystem) SetLogLevel(i LogLevel) { + atomic.StoreUint32(&t.level, uint32(i)) +} + +func (t *stdLogSystem) GetLogLevel() LogLevel { + return LogLevel(atomic.LoadUint32(&t.level)) +} diff --git a/logger/loggers_test.go b/logger/loggers_test.go new file mode 100644 index 000000000..adc4df016 --- /dev/null +++ b/logger/loggers_test.go @@ -0,0 +1,174 @@ +package logger + +import ( + "io/ioutil" + "math/rand" + "os" + "sync" + "testing" + "time" +) + +type TestLogSystem struct { + mutex sync.Mutex + output string + level LogLevel +} + +func (ls *TestLogSystem) LogPrint(level LogLevel, msg string) { + ls.mutex.Lock() + ls.output += msg + ls.mutex.Unlock() +} + +func (ls *TestLogSystem) SetLogLevel(i LogLevel) { + ls.mutex.Lock() + ls.level = i + ls.mutex.Unlock() +} + +func (ls *TestLogSystem) GetLogLevel() LogLevel { + ls.mutex.Lock() + defer ls.mutex.Unlock() + return ls.level +} + +func (ls *TestLogSystem) CheckOutput(t *testing.T, expected string) { + ls.mutex.Lock() + output := ls.output + ls.mutex.Unlock() + if output != expected { + t.Errorf("log output mismatch:\n got: %q\n want: %q\n", output, expected) + } +} + +type blockedLogSystem struct { + LogSystem + unblock chan struct{} +} + +func (ls blockedLogSystem) LogPrint(level LogLevel, msg string) { + <-ls.unblock + ls.LogSystem.LogPrint(level, msg) +} + +func TestLoggerFlush(t *testing.T) { + Reset() + + logger := NewLogger("TEST") + ls := blockedLogSystem{&TestLogSystem{level: WarnLevel}, make(chan struct{})} + AddLogSystem(ls) + for i := 0; i < 5; i++ { + // these writes shouldn't hang even though ls is blocked + logger.Errorf(".") + } + + beforeFlush := time.Now() + time.AfterFunc(80*time.Millisecond, func() { close(ls.unblock) }) + Flush() // this should hang for approx. 80ms + if blockd := time.Now().Sub(beforeFlush); blockd < 80*time.Millisecond { + t.Errorf("Flush didn't block long enough, blocked for %v, should've been >= 80ms", blockd) + } + + ls.LogSystem.(*TestLogSystem).CheckOutput(t, "[TEST] .[TEST] .[TEST] .[TEST] .[TEST] .") +} + +func TestLoggerPrintln(t *testing.T) { + Reset() + + logger := NewLogger("TEST") + testLogSystem := &TestLogSystem{level: WarnLevel} + AddLogSystem(testLogSystem) + logger.Errorln("error") + logger.Warnln("warn") + logger.Infoln("info") + logger.Debugln("debug") + Flush() + + testLogSystem.CheckOutput(t, "[TEST] error\n[TEST] warn\n") +} + +func TestLoggerPrintf(t *testing.T) { + Reset() + + logger := NewLogger("TEST") + testLogSystem := &TestLogSystem{level: WarnLevel} + AddLogSystem(testLogSystem) + logger.Errorf("error to %v\n", []int{1, 2, 3}) + logger.Warnf("warn %%d %d", 5) + logger.Infof("info") + logger.Debugf("debug") + Flush() + testLogSystem.CheckOutput(t, "[TEST] error to [1 2 3]\n[TEST] warn %d 5") +} + +func TestMultipleLogSystems(t *testing.T) { + Reset() + + logger := NewLogger("TEST") + testLogSystem0 := &TestLogSystem{level: ErrorLevel} + testLogSystem1 := &TestLogSystem{level: WarnLevel} + AddLogSystem(testLogSystem0) + AddLogSystem(testLogSystem1) + logger.Errorln("error") + logger.Warnln("warn") + Flush() + + testLogSystem0.CheckOutput(t, "[TEST] error\n") + testLogSystem1.CheckOutput(t, "[TEST] error\n[TEST] warn\n") +} + +func TestFileLogSystem(t *testing.T) { + Reset() + + logger := NewLogger("TEST") + filename := "test.log" + file, _ := os.OpenFile(filename, os.O_RDWR|os.O_CREATE, os.ModePerm) + testLogSystem := NewStdLogSystem(file, 0, WarnLevel) + AddLogSystem(testLogSystem) + logger.Errorf("error to %s\n", filename) + logger.Warnln("warn") + Flush() + contents, _ := ioutil.ReadFile(filename) + output := string(contents) + if output != "[TEST] error to test.log\n[TEST] warn\n" { + t.Error("Expected contents of file 'test.log': '[TEST] error to test.log\\n[TEST] warn\\n', got ", output) + } else { + os.Remove(filename) + } +} + +func TestNoLogSystem(t *testing.T) { + Reset() + + logger := NewLogger("TEST") + logger.Warnln("warn") + Flush() +} + +func TestConcurrentAddSystem(t *testing.T) { + rand.Seed(time.Now().Unix()) + Reset() + + logger := NewLogger("TEST") + stop := make(chan struct{}) + writer := func() { + select { + case <-stop: + return + default: + logger.Infoln("foo") + Flush() + } + } + + go writer() + go writer() + + stopTime := time.Now().Add(100 * time.Millisecond) + for time.Now().Before(stopTime) { + time.Sleep(time.Duration(rand.Intn(20)) * time.Millisecond) + AddLogSystem(NewStdLogSystem(ioutil.Discard, 0, InfoLevel)) + } + close(stop) +} diff --git a/miner/miner.go b/miner/miner.go new file mode 100644 index 000000000..f63096b63 --- /dev/null +++ b/miner/miner.go @@ -0,0 +1,261 @@ +/* + This file is part of go-ethereum + + go-ethereum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + go-ethereum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with go-ethereum. If not, see <http://www.gnu.org/licenses/>. +*/ +/** + * @authors + * Jeffrey Wilcke <i@jev.io> + * @date 2014 + * + */ + +package miner + +import ( + "math/big" + "sort" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/pow" + "github.com/ethereum/go-ethereum/pow/ezp" + + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/wire" +) + +type LocalTx struct { + To []byte `json:"to"` + Data []byte `json:"data"` + Gas string `json:"gas"` + GasPrice string `json:"gasPrice"` + Value string `json:"value"` +} + +func (self *LocalTx) Sign(key []byte) *types.Transaction { + return nil +} + +var minerlogger = logger.NewLogger("MINER") + +type Miner struct { + eth *eth.Ethereum + events event.Subscription + + uncles types.Blocks + localTxs map[int]*LocalTx + localTxId int + + pow pow.PoW + quitCh chan struct{} + powQuitCh chan struct{} + + Coinbase []byte + + mining bool + + MinAcceptedGasPrice *big.Int +} + +func New(coinbase []byte, eth *eth.Ethereum) *Miner { + return &Miner{ + eth: eth, + powQuitCh: make(chan struct{}), + pow: ezp.New(), + mining: false, + localTxs: make(map[int]*LocalTx), + MinAcceptedGasPrice: big.NewInt(10000000000000), + Coinbase: coinbase, + } +} + +func (self *Miner) GetPow() pow.PoW { + return self.pow +} + +func (self *Miner) AddLocalTx(tx *LocalTx) int { + minerlogger.Infof("Added local tx (%x %v / %v)\n", tx.To[0:4], tx.GasPrice, tx.Value) + + self.localTxId++ + self.localTxs[self.localTxId] = tx + self.eth.EventMux().Post(tx) + + return self.localTxId +} + +func (self *Miner) RemoveLocalTx(id int) { + if tx := self.localTxs[id]; tx != nil { + minerlogger.Infof("Removed local tx (%x %v / %v)\n", tx.To[0:4], tx.GasPrice, tx.Value) + } + self.eth.EventMux().Post(&LocalTx{}) + + delete(self.localTxs, id) +} + +func (self *Miner) Start() { + if self.mining { + return + } + + minerlogger.Infoln("Starting mining operations") + self.mining = true + self.quitCh = make(chan struct{}) + self.powQuitCh = make(chan struct{}) + + mux := self.eth.EventMux() + self.events = mux.Subscribe(core.NewBlockEvent{}, core.TxPreEvent{}, &LocalTx{}) + + go self.update() + go self.mine() +} + +func (self *Miner) Stop() { + if !self.mining { + return + } + + self.mining = false + + minerlogger.Infoln("Stopping mining operations") + + self.events.Unsubscribe() + + close(self.quitCh) + close(self.powQuitCh) +} + +func (self *Miner) Mining() bool { + return self.mining +} + +func (self *Miner) update() { +out: + for { + select { + case event := <-self.events.Chan(): + switch event := event.(type) { + case core.NewBlockEvent: + block := event.Block + if self.eth.ChainManager().HasBlock(block.Hash()) { + self.reset() + self.eth.TxPool().RemoveSet(block.Transactions()) + go self.mine() + } else if true { + // do uncle stuff + } + case core.TxPreEvent, *LocalTx: + self.reset() + go self.mine() + } + case <-self.quitCh: + break out + } + } +} + +func (self *Miner) reset() { + close(self.powQuitCh) + self.powQuitCh = make(chan struct{}) +} + +func (self *Miner) mine() { + var ( + blockManager = self.eth.BlockManager() + chainMan = self.eth.ChainManager() + block = chainMan.NewBlock(self.Coinbase) + ) + + // Apply uncles + if len(self.uncles) > 0 { + block.SetUncles(self.uncles) + } + + parent := chainMan.GetBlock(block.PrevHash) + coinbase := block.State().GetOrNewStateObject(block.Coinbase) + coinbase.SetGasPool(block.CalcGasLimit(parent)) + + transactions := self.finiliseTxs() + + // Accumulate all valid transactions and apply them to the new state + // Error may be ignored. It's not important during mining + receipts, txs, _, erroneous, err := blockManager.ApplyTransactions(coinbase, block.State(), block, transactions, true) + if err != nil { + minerlogger.Debugln(err) + } + self.eth.TxPool().RemoveSet(erroneous) + + block.SetTransactions(txs) + block.SetReceipts(receipts) + + // Accumulate the rewards included for this block + blockManager.AccumelateRewards(block.State(), block, parent) + + block.State().Update(ethutil.Big0) + + minerlogger.Infof("Mining on block. Includes %v transactions", len(transactions)) + + // Find a valid nonce + nonce := self.pow.Search(block, self.powQuitCh) + if nonce != nil { + block.Nonce = nonce + err := chainMan.InsertChain(types.Blocks{block}) + if err != nil { + minerlogger.Infoln(err) + } else { + self.eth.Broadcast(wire.MsgBlockTy, []interface{}{block.Value().Val}) + + minerlogger.Infof("🔨 Mined block %x\n", block.Hash()) + minerlogger.Infoln(block) + } + + go self.mine() + } +} + +func (self *Miner) finiliseTxs() types.Transactions { + // Sort the transactions by nonce in case of odd network propagation + actualSize := len(self.localTxs) // See copy below + txs := make(types.Transactions, actualSize+self.eth.TxPool().Size()) + + state := self.eth.ChainManager().TransState() + // XXX This has to change. Coinbase is, for new, same as key. + key := self.eth.KeyManager() + for i, ltx := range self.localTxs { + tx := types.NewTransactionMessage(ltx.To, ethutil.Big(ltx.Value), ethutil.Big(ltx.Gas), ethutil.Big(ltx.GasPrice), ltx.Data) + tx.SetNonce(state.GetNonce(self.Coinbase)) + state.SetNonce(self.Coinbase, tx.Nonce()+1) + + tx.Sign(key.PrivateKey()) + + txs[i] = tx + } + + // Faster than append + for _, tx := range self.eth.TxPool().CurrentTransactions() { + if tx.GasPrice().Cmp(self.MinAcceptedGasPrice) >= 0 { + txs[actualSize] = tx + actualSize++ + } + } + + newTransactions := make(types.Transactions, actualSize) + copy(newTransactions, txs[:actualSize]) + sort.Sort(types.TxByNonce{newTransactions}) + + return newTransactions +} diff --git a/mist/assets/ext/http.js b/mist/assets/ext/http.js deleted file mode 100644 index 725ce8e6b..000000000 --- a/mist/assets/ext/http.js +++ /dev/null @@ -1,13 +0,0 @@ -// this function is included locally, but you can also include separately via a header definition -function request(url, callback) { - var xhr = new XMLHttpRequest(); - xhr.onreadystatechange = (function(req) { - return function() { - if(req.readyState === 4) { - callback(req); - } - } - })(xhr); - xhr.open('GET', url, true); - xhr.send(''); -} diff --git a/mist/assets/ext/qml_messaging.js b/mist/assets/ext/qml_messaging.js deleted file mode 100644 index 8222c848d..000000000 --- a/mist/assets/ext/qml_messaging.js +++ /dev/null @@ -1,13 +0,0 @@ -function HandleMessage(data) { - var message; - try { message = JSON.parse(data) } catch(e) {}; - - if(message) { - switch(message.type) { - case "coinbase": - return eth.coinBase(); - case "block": - return eth.blockByNumber(0); - } - } -} diff --git a/mist/assets/ext/qt_messaging_adapter.js b/mist/assets/ext/qt_messaging_adapter.js deleted file mode 100644 index ff6976177..000000000 --- a/mist/assets/ext/qt_messaging_adapter.js +++ /dev/null @@ -1,21 +0,0 @@ -window._messagingAdapter = function(data) { - navigator.qt.postMessage(data); -}; - -navigator.qt.onmessage = function(ev) { - var data = JSON.parse(ev.data) - - if(data._event !== undefined) { - eth.trigger(data._event, data.data); - } else { - if(data._seed) { - var cb = eth._callbacks[data._seed]; - if(cb) { - cb.call(this, data.data) - - // Remove the "trigger" callback - delete eth._callbacks[ev._seed]; - } - } - } -} diff --git a/mist/assets/qml/views/javascript.qml b/mist/assets/qml/views/javascript.qml deleted file mode 100644 index ea05c4148..000000000 --- a/mist/assets/qml/views/javascript.qml +++ /dev/null @@ -1,45 +0,0 @@ -import QtQuick 2.0 -import QtQuick.Controls 1.0; -import QtQuick.Layouts 1.0; -import QtQuick.Dialogs 1.0; -import QtQuick.Window 2.1; -import QtQuick.Controls.Styles 1.1 -import Ethereum 1.0 - -Rectangle { - property var title: "JavaScript" - property var iconSource: "../tx.png" - property var menuItem - - objectName: "javascriptView" - visible: false - anchors.fill: parent - - TextField { - id: input - anchors { - left: parent.left - right: parent.right - bottom: parent.bottom - } - height: 20 - - Keys.onReturnPressed: { - var res = eth.evalJavascriptString(this.text); - this.text = ""; - - output.append(res) - } - } - - TextArea { - id: output - text: "> JSRE Ready..." - anchors { - top: parent.top - left: parent.left - right: parent.right - bottom: input.top - } - } -} diff --git a/mist/assets/qml/webapp.qml b/mist/assets/qml/webapp.qml deleted file mode 100644 index 09e6a83ad..000000000 --- a/mist/assets/qml/webapp.qml +++ /dev/null @@ -1,417 +0,0 @@ -import QtQuick 2.0 -import QtWebKit 3.0 -import QtWebKit.experimental 1.0 -import QtQuick.Controls 1.0; -import QtQuick.Controls.Styles 1.0 -import QtQuick.Layouts 1.0; -import QtQuick.Window 2.1; -import Ethereum 1.0 - -import "../ext/qml_messaging.js" as Messaging - -//ApplicationWindow { - Rectangle { - id: window - property var title: "Browser" - property var iconSource: "../browser.png" - property var menuItem - - property alias url: webview.url - property alias webView: webview - - property var cleanPath: false - property var open: function(url) { - if(!window.cleanPath) { - var uri = url; - if(!/.*\:\/\/.*/.test(uri)) { - uri = "http://" + uri; - } - - var reg = /(^https?\:\/\/(?:www\.)?)([a-zA-Z0-9_\-]*\.eth)(.*)/ - - if(reg.test(uri)) { - uri.replace(reg, function(match, pre, domain, path) { - uri = pre; - - var lookup = eth.lookupDomain(domain.substring(0, domain.length - 4)); - var ip = []; - for(var i = 0, l = lookup.length; i < l; i++) { - ip.push(lookup.charCodeAt(i)) - } - - if(ip.length != 0) { - uri += lookup; - } else { - uri += domain; - } - - uri += path; - }); - } - - window.cleanPath = true; - - webview.url = uri; - - //uriNav.text = uri.text.replace(/(^https?\:\/\/(?:www\.)?)([a-zA-Z0-9_\-]*\.\w{2,3})(.*)/, "$1$2<span style='color:#CCC'>$3</span>"); - uriNav.text = uri; - } else { - // Prevent inf loop. - window.cleanPath = false; - } - } - - Component.onCompleted: { - webview.url = "http://etherian.io" - } - - signal messages(var messages, int id); - onMessages: { - // Bit of a cheat to get proper JSON - var m = JSON.parse(JSON.parse(JSON.stringify(messages))) - webview.postEvent("messages", [m, id]); - } - - Item { - objectName: "root" - id: root - anchors.fill: parent - state: "inspectorShown" - - RowLayout { - id: navBar - height: 40 - anchors { - left: parent.left - right: parent.right - leftMargin: 7 - } - - Button { - id: back - onClicked: { - webview.goBack() - } - style: ButtonStyle { - background: Image { - source: "../back.png" - width: 30 - height: 30 - } - } - } - - TextField { - anchors { - left: back.right - right: toggleInspector.left - leftMargin: 5 - rightMargin: 5 - } - text: "http://etherian.io" - id: uriNav - y: parent.height / 2 - this.height / 2 - - Keys.onReturnPressed: { - webview.url = this.text; - } - } - - Button { - id: toggleInspector - anchors { - right: parent.right - } - iconSource: "../bug.png" - onClicked: { - if(inspector.visible == true){ - inspector.visible = false - }else{ - inspector.visible = true - inspector.url = webview.experimental.remoteInspectorUrl - } - } - } - } - - - WebView { - objectName: "webView" - id: webview - anchors { - left: parent.left - right: parent.right - bottom: parent.bottom - top: navBar.bottom - } - - //property var cleanPath: false - onNavigationRequested: { - window.open(request.url.toString()); - } - - function sendMessage(data) { - webview.experimental.postMessage(JSON.stringify(data)) - } - - onTitleChanged: { - var data = Messaging.HandleMessage(title); - if(data) { - sendMessage(data) - } - } - - experimental.preferences.javascriptEnabled: true - experimental.preferences.navigatorQtObjectEnabled: true - experimental.preferences.developerExtrasEnabled: true - experimental.userScripts: ["../ext/qt_messaging_adapter.js", "../ext/q.js", "../ext/big.js", "../ext/string.js", "../ext/html_messaging.js"] - experimental.onMessageReceived: { - console.log("[onMessageReceived]: ", message.data) - // TODO move to messaging.js - var data = JSON.parse(message.data) - - try { - switch(data.call) { - case "compile": - postData(data._seed, eth.compile(data.args[0])) - break - - case "getCoinBase": - postData(data._seed, eth.coinBase()) - - break - - case "getIsListening": - postData(data._seed, eth.isListening()) - - break - - case "getIsMining": - postData(data._seed, eth.isMining()) - - break - - case "getPeerCount": - postData(data._seed, eth.peerCount()) - - break - - case "getCountAt": - require(1) - postData(data._seed, eth.txCountAt(data.args[0])) - - break - - case "getCodeAt": - require(1) - var code = eth.codeAt(data.args[0]) - postData(data._seed, code); - - break - - case "getBlockByNumber": - var block = eth.blockByNumber(data.args[0]) - postData(data._seed, block) - - break - - case "getBlockByHash": - var block = eth.blockByHash(data.args[0]) - postData(data._seed, block) - - break - - case "transact": - require(5) - - var tx = eth.transact(data.args) - postData(data._seed, tx) - - break - - case "getStorageAt": - require(2); - - var storage = eth.storageAt(data.args[0], data.args[1]); - postData(data._seed, storage) - - break - - case "call": - require(1); - var ret = eth.call(data.args) - postData(data._seed, ret) - - break - - case "getEachStorage": - require(1); - var storage = JSON.parse(eth.eachStorage(data.args[0])) - postData(data._seed, storage) - - break - - case "getTransactionsFor": - require(1); - var txs = eth.transactionsFor(data.args[0], true) - postData(data._seed, txs) - - break - - case "getBalanceAt": - require(1); - - postData(data._seed, eth.balanceAt(data.args[0])); - - break - - case "getKey": - var key = eth.key().privateKey; - - postData(data._seed, key) - break - - case "watch": - require(2) - eth.watch(data.args[0], data.args[1]) - - case "disconnect": - require(1) - postData(data._seed, null) - - break; - - case "getSecretToAddress": - require(1) - - var addr = eth.secretToAddress(data.args[0]) - console.log("getsecret", addr) - postData(data._seed, addr) - - break; - - case "messages": - require(1); - - var messages = JSON.parse(eth.getMessages(data.args[0])) - postData(data._seed, messages) - - break - - case "mutan": - require(1) - - var code = eth.compileMutan(data.args[0]) - postData(data._seed, "0x"+code) - - break; - - case "newFilterString": - require(1) - var id = eth.newFilterString(data.args[0]) - postData(data._seed, id); - break; - case "newFilter": - require(1) - var id = eth.newFilter(data.args[0]) - - postData(data._seed, id); - break; - - case "getMessages": - require(1); - - var messages = eth.messages(data.args[0]); - var m = JSON.parse(JSON.parse(JSON.stringify(messages))) - postData(data._seed, m); - - break; - - case "deleteFilter": - require(1); - eth.uninstallFilter(data.args[0]) - break; - } - } catch(e) { - console.log(data.call + ": " + e) - - postData(data._seed, null); - } - } - - - function post(seed, data) { - postData(data._seed, data) - } - - function require(args, num) { - if(args.length < num) { - throw("required argument count of "+num+" got "+args.length); - } - } - function postData(seed, data) { - webview.experimental.postMessage(JSON.stringify({data: data, _seed: seed})) - } - function postEvent(event, data) { - webview.experimental.postMessage(JSON.stringify({data: data, _event: event})) - } - - function onWatchedCb(data, id) { - var messages = JSON.parse(data) - postEvent("watched:"+id, messages) - } - - function onNewBlockCb(block) { - postEvent("block:new", block) - } - function onObjectChangeCb(stateObject) { - postEvent("object:"+stateObject.address(), stateObject) - } - function onStorageChangeCb(storageObject) { - var ev = ["storage", storageObject.stateAddress, storageObject.address].join(":"); - postEvent(ev, [storageObject.address, storageObject.value]) - } - } - - - Rectangle { - id: sizeGrip - color: "gray" - visible: false - height: 10 - anchors { - left: root.left - right: root.right - } - y: Math.round(root.height * 2 / 3) - - MouseArea { - anchors.fill: parent - drag.target: sizeGrip - drag.minimumY: 0 - drag.maximumY: root.height - drag.axis: Drag.YAxis - } - } - - WebView { - id: inspector - visible: false - anchors { - left: root.left - right: root.right - top: sizeGrip.bottom - bottom: root.bottom - } - } - - states: [ - State { - name: "inspectorShown" - PropertyChanges { - target: inspector - } - } - ] - } - } diff --git a/mist/errors.go b/mist/errors.go deleted file mode 100644 index 409b7a281..000000000 --- a/mist/errors.go +++ /dev/null @@ -1,36 +0,0 @@ -package main - -import ( - "fmt" - "os" - - "gopkg.in/qml.v1" -) - -func ErrorWindow(err error) { - engine := qml.NewEngine() - component, e := engine.LoadString("local", qmlErr) - if e != nil { - fmt.Println("err:", err) - os.Exit(1) - } - - win := component.CreateWindow(nil) - win.Root().ObjectByName("label").Set("text", err.Error()) - win.Show() - win.Wait() -} - -const qmlErr = ` -import QtQuick 2.0; import QtQuick.Controls 1.0; -ApplicationWindow { - width: 600; height: 150; - flags: Qt.CustomizeWindowHint | Qt.WindowTitleHint | Qt.WindowCloseButtonHint - title: "Error" - Text { - x: parent.width / 2 - this.width / 2; - y: parent.height / 2 - this.height / 2; - objectName: "label"; - } -} -` diff --git a/mist/ext_app.go b/mist/ext_app.go deleted file mode 100644 index 514084c97..000000000 --- a/mist/ext_app.go +++ /dev/null @@ -1,145 +0,0 @@ -package main - -import ( - "encoding/json" - - "github.com/ethereum/eth-go/ethchain" - "github.com/ethereum/eth-go/ethpipe" - "github.com/ethereum/eth-go/ethreact" - "github.com/ethereum/eth-go/ethstate" - "github.com/ethereum/go-ethereum/javascript" - "gopkg.in/qml.v1" -) - -type AppContainer interface { - Create() error - Destroy() - - Window() *qml.Window - Engine() *qml.Engine - - NewBlock(*ethchain.Block) - NewWatcher(chan bool) - Messages(ethstate.Messages, string) - Post(string, int) -} - -type ExtApplication struct { - *ethpipe.JSPipe - eth ethchain.EthManager - - blockChan chan ethreact.Event - messageChan chan ethreact.Event - quitChan chan bool - watcherQuitChan chan bool - - filters map[string]*ethchain.Filter - - container AppContainer - lib *UiLib -} - -func NewExtApplication(container AppContainer, lib *UiLib) *ExtApplication { - app := &ExtApplication{ - ethpipe.NewJSPipe(lib.eth), - lib.eth, - make(chan ethreact.Event, 100), - make(chan ethreact.Event, 100), - make(chan bool), - make(chan bool), - make(map[string]*ethchain.Filter), - container, - lib, - } - - return app -} - -func (app *ExtApplication) run() { - // Set the "eth" api on to the containers context - context := app.container.Engine().Context() - context.SetVar("eth", app) - context.SetVar("ui", app.lib) - - err := app.container.Create() - if err != nil { - logger.Errorln(err) - return - } - - // Call the main loop - go app.mainLoop() - - // Subscribe to events - reactor := app.lib.eth.Reactor() - reactor.Subscribe("newBlock", app.blockChan) - reactor.Subscribe("messages", app.messageChan) - - app.container.NewWatcher(app.watcherQuitChan) - - win := app.container.Window() - win.Show() - win.Wait() - - app.stop() -} - -func (app *ExtApplication) stop() { - // Clean up - reactor := app.lib.eth.Reactor() - reactor.Unsubscribe("newBlock", app.blockChan) - - // Kill the main loop - app.quitChan <- true - app.watcherQuitChan <- true - - close(app.blockChan) - close(app.quitChan) - - app.container.Destroy() -} - -func (app *ExtApplication) mainLoop() { -out: - for { - select { - case <-app.quitChan: - break out - case block := <-app.blockChan: - if block, ok := block.Resource.(*ethchain.Block); ok { - app.container.NewBlock(block) - } - case msg := <-app.messageChan: - if messages, ok := msg.Resource.(ethstate.Messages); ok { - for id, filter := range app.filters { - msgs := filter.FilterMessages(messages) - if len(msgs) > 0 { - app.container.Messages(msgs, id) - } - } - } - } - } - -} - -func (self *ExtApplication) Watch(filterOptions map[string]interface{}, identifier string) { - self.filters[identifier] = ethchain.NewFilterFromMap(filterOptions, self.eth) -} - -func (self *ExtApplication) GetMessages(object map[string]interface{}) string { - filter := ethchain.NewFilterFromMap(object, self.eth) - - messages := filter.Find() - var msgs []javascript.JSMessage - for _, m := range messages { - msgs = append(msgs, javascript.NewJSMessage(m)) - } - - b, err := json.Marshal(msgs) - if err != nil { - return "{\"error\":" + err.Error() + "}" - } - - return string(b) -} diff --git a/mist/qml_container.go b/mist/qml_container.go deleted file mode 100644 index 85bd7c699..000000000 --- a/mist/qml_container.go +++ /dev/null @@ -1,68 +0,0 @@ -package main - -import ( - "fmt" - "runtime" - - "github.com/ethereum/eth-go/ethchain" - "github.com/ethereum/eth-go/ethpipe" - "github.com/ethereum/eth-go/ethstate" - "github.com/ethereum/eth-go/ethutil" - "gopkg.in/qml.v1" -) - -type QmlApplication struct { - win *qml.Window - engine *qml.Engine - lib *UiLib - path string -} - -func NewQmlApplication(path string, lib *UiLib) *QmlApplication { - engine := qml.NewEngine() - return &QmlApplication{engine: engine, path: path, lib: lib} -} - -func (app *QmlApplication) Create() error { - path := string(app.path) - - // For some reason for windows we get /c:/path/to/something, windows doesn't like the first slash but is fine with the others so we are removing it - if app.path[0] == '/' && runtime.GOOS == "windows" { - path = app.path[1:] - } - - component, err := app.engine.LoadFile(path) - if err != nil { - logger.Warnln(err) - } - app.win = component.CreateWindow(nil) - - return nil -} - -func (app *QmlApplication) Destroy() { - app.engine.Destroy() -} - -func (app *QmlApplication) NewWatcher(quitChan chan bool) { -} - -// Events -func (app *QmlApplication) NewBlock(block *ethchain.Block) { - pblock := ðpipe.JSBlock{Number: int(block.BlockInfo().Number), Hash: ethutil.Bytes2Hex(block.Hash())} - app.win.Call("onNewBlockCb", pblock) -} - -func (self *QmlApplication) Messages(msgs ethstate.Messages, id string) { - fmt.Println("IMPLEMENT QML APPLICATION MESSAGES METHOD") -} - -// Getters -func (app *QmlApplication) Engine() *qml.Engine { - return app.engine -} -func (app *QmlApplication) Window() *qml.Window { - return app.win -} - -func (app *QmlApplication) Post(data string, s int) {} @@ -0,0 +1,12 @@ +package eth + +import ( + "net" +) + +// protocol is either "udp" or "tcp" +type NAT interface { + GetExternalAddress() (addr net.IP, err error) + AddPortMapping(protocol string, externalPort, internalPort int, description string, timeout int) (mappedExternalPort int, err error) + DeletePortMapping(protocol string, externalPort, internalPort int) (err error) +} diff --git a/natpmp.go b/natpmp.go new file mode 100644 index 000000000..489342a4b --- /dev/null +++ b/natpmp.go @@ -0,0 +1,55 @@ +package eth + +import ( + "fmt" + "net" + + natpmp "github.com/jackpal/go-nat-pmp" +) + +// Adapt the NAT-PMP protocol to the NAT interface + +// TODO: +// + Register for changes to the external address. +// + Re-register port mapping when router reboots. +// + A mechanism for keeping a port mapping registered. + +type natPMPClient struct { + client *natpmp.Client +} + +func NewNatPMP(gateway net.IP) (nat NAT) { + return &natPMPClient{natpmp.NewClient(gateway)} +} + +func (n *natPMPClient) GetExternalAddress() (addr net.IP, err error) { + response, err := n.client.GetExternalAddress() + if err != nil { + return + } + ip := response.ExternalIPAddress + addr = net.IPv4(ip[0], ip[1], ip[2], ip[3]) + return +} + +func (n *natPMPClient) AddPortMapping(protocol string, externalPort, internalPort int, + description string, timeout int) (mappedExternalPort int, err error) { + if timeout <= 0 { + err = fmt.Errorf("timeout must not be <= 0") + return + } + // Note order of port arguments is switched between our AddPortMapping and the client's AddPortMapping. + response, err := n.client.AddPortMapping(protocol, internalPort, externalPort, timeout) + if err != nil { + return + } + mappedExternalPort = int(response.MappedExternalPort) + return +} + +func (n *natPMPClient) DeletePortMapping(protocol string, externalPort, internalPort int) (err error) { + // To destroy a mapping, send an add-port with + // an internalPort of the internal port to destroy, an external port of zero and a time of zero. + _, err = n.client.AddPortMapping(protocol, internalPort, 0, 0) + return +} diff --git a/natupnp.go b/natupnp.go new file mode 100644 index 000000000..c7f9eeb62 --- /dev/null +++ b/natupnp.go @@ -0,0 +1,338 @@ +package eth + +// Just enough UPnP to be able to forward ports +// + +import ( + "bytes" + "encoding/xml" + "errors" + "net" + "net/http" + "os" + "strconv" + "strings" + "time" +) + +type upnpNAT struct { + serviceURL string + ourIP string +} + +func Discover() (nat NAT, err error) { + ssdp, err := net.ResolveUDPAddr("udp4", "239.255.255.250:1900") + if err != nil { + return + } + conn, err := net.ListenPacket("udp4", ":0") + if err != nil { + return + } + socket := conn.(*net.UDPConn) + defer socket.Close() + + err = socket.SetDeadline(time.Now().Add(10 * time.Second)) + if err != nil { + return + } + + st := "ST: urn:schemas-upnp-org:device:InternetGatewayDevice:1\r\n" + buf := bytes.NewBufferString( + "M-SEARCH * HTTP/1.1\r\n" + + "HOST: 239.255.255.250:1900\r\n" + + st + + "MAN: \"ssdp:discover\"\r\n" + + "MX: 2\r\n\r\n") + message := buf.Bytes() + answerBytes := make([]byte, 1024) + for i := 0; i < 3; i++ { + _, err = socket.WriteToUDP(message, ssdp) + if err != nil { + return + } + var n int + n, _, err = socket.ReadFromUDP(answerBytes) + if err != nil { + continue + // socket.Close() + // return + } + answer := string(answerBytes[0:n]) + if strings.Index(answer, "\r\n"+st) < 0 { + continue + } + // HTTP header field names are case-insensitive. + // http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2 + locString := "\r\nlocation: " + answer = strings.ToLower(answer) + locIndex := strings.Index(answer, locString) + if locIndex < 0 { + continue + } + loc := answer[locIndex+len(locString):] + endIndex := strings.Index(loc, "\r\n") + if endIndex < 0 { + continue + } + locURL := loc[0:endIndex] + var serviceURL string + serviceURL, err = getServiceURL(locURL) + if err != nil { + return + } + var ourIP string + ourIP, err = getOurIP() + if err != nil { + return + } + nat = &upnpNAT{serviceURL: serviceURL, ourIP: ourIP} + return + } + err = errors.New("UPnP port discovery failed.") + return +} + +// service represents the Service type in an UPnP xml description. +// Only the parts we care about are present and thus the xml may have more +// fields than present in the structure. +type service struct { + ServiceType string `xml:"serviceType"` + ControlURL string `xml:"controlURL"` +} + +// deviceList represents the deviceList type in an UPnP xml description. +// Only the parts we care about are present and thus the xml may have more +// fields than present in the structure. +type deviceList struct { + XMLName xml.Name `xml:"deviceList"` + Device []device `xml:"device"` +} + +// serviceList represents the serviceList type in an UPnP xml description. +// Only the parts we care about are present and thus the xml may have more +// fields than present in the structure. +type serviceList struct { + XMLName xml.Name `xml:"serviceList"` + Service []service `xml:"service"` +} + +// device represents the device type in an UPnP xml description. +// Only the parts we care about are present and thus the xml may have more +// fields than present in the structure. +type device struct { + XMLName xml.Name `xml:"device"` + DeviceType string `xml:"deviceType"` + DeviceList deviceList `xml:"deviceList"` + ServiceList serviceList `xml:"serviceList"` +} + +// specVersion represents the specVersion in a UPnP xml description. +// Only the parts we care about are present and thus the xml may have more +// fields than present in the structure. +type specVersion struct { + XMLName xml.Name `xml:"specVersion"` + Major int `xml:"major"` + Minor int `xml:"minor"` +} + +// root represents the Root document for a UPnP xml description. +// Only the parts we care about are present and thus the xml may have more +// fields than present in the structure. +type root struct { + XMLName xml.Name `xml:"root"` + SpecVersion specVersion + Device device +} + +func getChildDevice(d *device, deviceType string) *device { + dl := d.DeviceList.Device + for i := 0; i < len(dl); i++ { + if dl[i].DeviceType == deviceType { + return &dl[i] + } + } + return nil +} + +func getChildService(d *device, serviceType string) *service { + sl := d.ServiceList.Service + for i := 0; i < len(sl); i++ { + if sl[i].ServiceType == serviceType { + return &sl[i] + } + } + return nil +} + +func getOurIP() (ip string, err error) { + hostname, err := os.Hostname() + if err != nil { + return + } + p, err := net.LookupIP(hostname) + if err != nil && len(p) > 0 { + return + } + return p[0].String(), nil +} + +func getServiceURL(rootURL string) (url string, err error) { + r, err := http.Get(rootURL) + if err != nil { + return + } + defer r.Body.Close() + if r.StatusCode >= 400 { + err = errors.New(string(r.StatusCode)) + return + } + var root root + err = xml.NewDecoder(r.Body).Decode(&root) + + if err != nil { + return + } + a := &root.Device + if a.DeviceType != "urn:schemas-upnp-org:device:InternetGatewayDevice:1" { + err = errors.New("No InternetGatewayDevice") + return + } + b := getChildDevice(a, "urn:schemas-upnp-org:device:WANDevice:1") + if b == nil { + err = errors.New("No WANDevice") + return + } + c := getChildDevice(b, "urn:schemas-upnp-org:device:WANConnectionDevice:1") + if c == nil { + err = errors.New("No WANConnectionDevice") + return + } + d := getChildService(c, "urn:schemas-upnp-org:service:WANIPConnection:1") + if d == nil { + err = errors.New("No WANIPConnection") + return + } + url = combineURL(rootURL, d.ControlURL) + return +} + +func combineURL(rootURL, subURL string) string { + protocolEnd := "://" + protoEndIndex := strings.Index(rootURL, protocolEnd) + a := rootURL[protoEndIndex+len(protocolEnd):] + rootIndex := strings.Index(a, "/") + return rootURL[0:protoEndIndex+len(protocolEnd)+rootIndex] + subURL +} + +func soapRequest(url, function, message string) (r *http.Response, err error) { + fullMessage := "<?xml version=\"1.0\" ?>" + + "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\r\n" + + "<s:Body>" + message + "</s:Body></s:Envelope>" + + req, err := http.NewRequest("POST", url, strings.NewReader(fullMessage)) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", "text/xml ; charset=\"utf-8\"") + req.Header.Set("User-Agent", "Darwin/10.0.0, UPnP/1.0, MiniUPnPc/1.3") + //req.Header.Set("Transfer-Encoding", "chunked") + req.Header.Set("SOAPAction", "\"urn:schemas-upnp-org:service:WANIPConnection:1#"+function+"\"") + req.Header.Set("Connection", "Close") + req.Header.Set("Cache-Control", "no-cache") + req.Header.Set("Pragma", "no-cache") + + // log.Stderr("soapRequest ", req) + //fmt.Println(fullMessage) + + r, err = http.DefaultClient.Do(req) + if err != nil { + return + } + + if r.Body != nil { + defer r.Body.Close() + } + + if r.StatusCode >= 400 { + // log.Stderr(function, r.StatusCode) + err = errors.New("Error " + strconv.Itoa(r.StatusCode) + " for " + function) + r = nil + return + } + return +} + +type statusInfo struct { + externalIpAddress string +} + +func (n *upnpNAT) getStatusInfo() (info statusInfo, err error) { + + message := "<u:GetStatusInfo xmlns:u=\"urn:schemas-upnp-org:service:WANIPConnection:1\">\r\n" + + "</u:GetStatusInfo>" + + var response *http.Response + response, err = soapRequest(n.serviceURL, "GetStatusInfo", message) + if err != nil { + return + } + + // TODO: Write a soap reply parser. It has to eat the Body and envelope tags... + + response.Body.Close() + return +} + +func (n *upnpNAT) GetExternalAddress() (addr net.IP, err error) { + info, err := n.getStatusInfo() + if err != nil { + return + } + addr = net.ParseIP(info.externalIpAddress) + return +} + +func (n *upnpNAT) AddPortMapping(protocol string, externalPort, internalPort int, description string, timeout int) (mappedExternalPort int, err error) { + // A single concatenation would break ARM compilation. + message := "<u:AddPortMapping xmlns:u=\"urn:schemas-upnp-org:service:WANIPConnection:1\">\r\n" + + "<NewRemoteHost></NewRemoteHost><NewExternalPort>" + strconv.Itoa(externalPort) + message += "</NewExternalPort><NewProtocol>" + protocol + "</NewProtocol>" + message += "<NewInternalPort>" + strconv.Itoa(internalPort) + "</NewInternalPort>" + + "<NewInternalClient>" + n.ourIP + "</NewInternalClient>" + + "<NewEnabled>1</NewEnabled><NewPortMappingDescription>" + message += description + + "</NewPortMappingDescription><NewLeaseDuration>" + strconv.Itoa(timeout) + + "</NewLeaseDuration></u:AddPortMapping>" + + var response *http.Response + response, err = soapRequest(n.serviceURL, "AddPortMapping", message) + if err != nil { + return + } + + // TODO: check response to see if the port was forwarded + // log.Println(message, response) + mappedExternalPort = externalPort + _ = response + return +} + +func (n *upnpNAT) DeletePortMapping(protocol string, externalPort, internalPort int) (err error) { + + message := "<u:DeletePortMapping xmlns:u=\"urn:schemas-upnp-org:service:WANIPConnection:1\">\r\n" + + "<NewRemoteHost></NewRemoteHost><NewExternalPort>" + strconv.Itoa(externalPort) + + "</NewExternalPort><NewProtocol>" + protocol + "</NewProtocol>" + + "</u:DeletePortMapping>" + + var response *http.Response + response, err = soapRequest(n.serviceURL, "DeletePortMapping", message) + if err != nil { + return + } + + // TODO: check response to see if the port was deleted + // log.Println(message, response) + _ = response + return +} diff --git a/p2p/client_identity.go b/p2p/client_identity.go new file mode 100644 index 000000000..bc865b63b --- /dev/null +++ b/p2p/client_identity.go @@ -0,0 +1,63 @@ +package p2p + +import ( + "fmt" + "runtime" +) + +// ClientIdentity represents the identity of a peer. +type ClientIdentity interface { + String() string // human readable identity + Pubkey() []byte // 512-bit public key +} + +type SimpleClientIdentity struct { + clientIdentifier string + version string + customIdentifier string + os string + implementation string + pubkey string +} + +func NewSimpleClientIdentity(clientIdentifier string, version string, customIdentifier string, pubkey string) *SimpleClientIdentity { + clientIdentity := &SimpleClientIdentity{ + clientIdentifier: clientIdentifier, + version: version, + customIdentifier: customIdentifier, + os: runtime.GOOS, + implementation: runtime.Version(), + pubkey: pubkey, + } + + return clientIdentity +} + +func (c *SimpleClientIdentity) init() { +} + +func (c *SimpleClientIdentity) String() string { + var id string + if len(c.customIdentifier) > 0 { + id = "/" + c.customIdentifier + } + + return fmt.Sprintf("%s/v%s%s/%s/%s", + c.clientIdentifier, + c.version, + id, + c.os, + c.implementation) +} + +func (c *SimpleClientIdentity) Pubkey() []byte { + return []byte(c.pubkey) +} + +func (c *SimpleClientIdentity) SetCustomIdentifier(customIdentifier string) { + c.customIdentifier = customIdentifier +} + +func (c *SimpleClientIdentity) GetCustomIdentifier() string { + return c.customIdentifier +} diff --git a/p2p/client_identity_test.go b/p2p/client_identity_test.go new file mode 100644 index 000000000..40b0e6f5e --- /dev/null +++ b/p2p/client_identity_test.go @@ -0,0 +1,30 @@ +package p2p + +import ( + "fmt" + "runtime" + "testing" +) + +func TestClientIdentity(t *testing.T) { + clientIdentity := NewSimpleClientIdentity("Ethereum(G)", "0.5.16", "test", "pubkey") + clientString := clientIdentity.String() + expected := fmt.Sprintf("Ethereum(G)/v0.5.16/test/%s/%s", runtime.GOOS, runtime.Version()) + if clientString != expected { + t.Errorf("Expected clientIdentity to be %v, got %v", expected, clientString) + } + customIdentifier := clientIdentity.GetCustomIdentifier() + if customIdentifier != "test" { + t.Errorf("Expected clientIdentity.GetCustomIdentifier() to be 'test', got %v", customIdentifier) + } + clientIdentity.SetCustomIdentifier("test2") + customIdentifier = clientIdentity.GetCustomIdentifier() + if customIdentifier != "test2" { + t.Errorf("Expected clientIdentity.GetCustomIdentifier() to be 'test2', got %v", customIdentifier) + } + clientString = clientIdentity.String() + expected = fmt.Sprintf("Ethereum(G)/v0.5.16/test2/%s/%s", runtime.GOOS, runtime.Version()) + if clientString != expected { + t.Errorf("Expected clientIdentity to be %v, got %v", expected, clientString) + } +} diff --git a/p2p/message.go b/p2p/message.go new file mode 100644 index 000000000..f5418ff47 --- /dev/null +++ b/p2p/message.go @@ -0,0 +1,232 @@ +package p2p + +import ( + "bytes" + "encoding/binary" + "errors" + "io" + "io/ioutil" + "math/big" + "sync/atomic" + + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/rlp" +) + +// Msg defines the structure of a p2p message. +// +// Note that a Msg can only be sent once since the Payload reader is +// consumed during sending. It is not possible to create a Msg and +// send it any number of times. If you want to reuse an encoded +// structure, encode the payload into a byte array and create a +// separate Msg with a bytes.Reader as Payload for each send. +type Msg struct { + Code uint64 + Size uint32 // size of the paylod + Payload io.Reader +} + +// NewMsg creates an RLP-encoded message with the given code. +func NewMsg(code uint64, params ...interface{}) Msg { + buf := new(bytes.Buffer) + for _, p := range params { + buf.Write(ethutil.Encode(p)) + } + return Msg{Code: code, Size: uint32(buf.Len()), Payload: buf} +} + +func encodePayload(params ...interface{}) []byte { + buf := new(bytes.Buffer) + for _, p := range params { + buf.Write(ethutil.Encode(p)) + } + return buf.Bytes() +} + +// Decode parse the RLP content of a message into +// the given value, which must be a pointer. +// +// For the decoding rules, please see package rlp. +func (msg Msg) Decode(val interface{}) error { + s := rlp.NewListStream(msg.Payload, uint64(msg.Size)) + return s.Decode(val) +} + +// Discard reads any remaining payload data into a black hole. +func (msg Msg) Discard() error { + _, err := io.Copy(ioutil.Discard, msg.Payload) + return err +} + +type MsgReader interface { + ReadMsg() (Msg, error) +} + +type MsgWriter interface { + // WriteMsg sends an existing message. + // The Payload reader of the message is consumed. + // Note that messages can be sent only once. + WriteMsg(Msg) error + + // EncodeMsg writes an RLP-encoded message with the given + // code and data elements. + EncodeMsg(code uint64, data ...interface{}) error +} + +// MsgReadWriter provides reading and writing of encoded messages. +type MsgReadWriter interface { + MsgReader + MsgWriter +} + +var magicToken = []byte{34, 64, 8, 145} + +func writeMsg(w io.Writer, msg Msg) error { + // TODO: handle case when Size + len(code) + len(listhdr) overflows uint32 + code := ethutil.Encode(uint32(msg.Code)) + listhdr := makeListHeader(msg.Size + uint32(len(code))) + payloadLen := uint32(len(listhdr)) + uint32(len(code)) + msg.Size + + start := make([]byte, 8) + copy(start, magicToken) + binary.BigEndian.PutUint32(start[4:], payloadLen) + + for _, b := range [][]byte{start, listhdr, code} { + if _, err := w.Write(b); err != nil { + return err + } + } + _, err := io.CopyN(w, msg.Payload, int64(msg.Size)) + return err +} + +func makeListHeader(length uint32) []byte { + if length < 56 { + return []byte{byte(length + 0xc0)} + } + enc := big.NewInt(int64(length)).Bytes() + lenb := byte(len(enc)) + 0xf7 + return append([]byte{lenb}, enc...) +} + +// readMsg reads a message header from r. +// It takes an rlp.ByteReader to ensure that the decoding doesn't buffer. +func readMsg(r rlp.ByteReader) (msg Msg, err error) { + // read magic and payload size + start := make([]byte, 8) + if _, err = io.ReadFull(r, start); err != nil { + return msg, newPeerError(errRead, "%v", err) + } + if !bytes.HasPrefix(start, magicToken) { + return msg, newPeerError(errMagicTokenMismatch, "got %x, want %x", start[:4], magicToken) + } + size := binary.BigEndian.Uint32(start[4:]) + + // decode start of RLP message to get the message code + posr := &postrack{r, 0} + s := rlp.NewStream(posr) + if _, err := s.List(); err != nil { + return msg, err + } + code, err := s.Uint() + if err != nil { + return msg, err + } + payloadsize := size - posr.p + return Msg{code, payloadsize, io.LimitReader(r, int64(payloadsize))}, nil +} + +// postrack wraps an rlp.ByteReader with a position counter. +type postrack struct { + r rlp.ByteReader + p uint32 +} + +func (r *postrack) Read(buf []byte) (int, error) { + n, err := r.r.Read(buf) + r.p += uint32(n) + return n, err +} + +func (r *postrack) ReadByte() (byte, error) { + b, err := r.r.ReadByte() + if err == nil { + r.p++ + } + return b, err +} + +// MsgPipe creates a message pipe. Reads on one end are matched +// with writes on the other. The pipe is full-duplex, both ends +// implement MsgReadWriter. +func MsgPipe() (*MsgPipeRW, *MsgPipeRW) { + var ( + c1, c2 = make(chan Msg), make(chan Msg) + closing = make(chan struct{}) + closed = new(int32) + rw1 = &MsgPipeRW{c1, c2, closing, closed} + rw2 = &MsgPipeRW{c2, c1, closing, closed} + ) + return rw1, rw2 +} + +// ErrPipeClosed is returned from pipe operations after the +// pipe has been closed. +var ErrPipeClosed = errors.New("p2p: read or write on closed message pipe") + +// MsgPipeRW is an endpoint of a MsgReadWriter pipe. +type MsgPipeRW struct { + w chan<- Msg + r <-chan Msg + closing chan struct{} + closed *int32 +} + +// WriteMsg sends a messsage on the pipe. +// It blocks until the receiver has consumed the message payload. +func (p *MsgPipeRW) WriteMsg(msg Msg) error { + if atomic.LoadInt32(p.closed) == 0 { + consumed := make(chan struct{}, 1) + msg.Payload = &eofSignal{msg.Payload, int64(msg.Size), consumed} + select { + case p.w <- msg: + if msg.Size > 0 { + // wait for payload read or discard + <-consumed + } + return nil + case <-p.closing: + } + } + return ErrPipeClosed +} + +// EncodeMsg is a convenient shorthand for sending an RLP-encoded message. +func (p *MsgPipeRW) EncodeMsg(code uint64, data ...interface{}) error { + return p.WriteMsg(NewMsg(code, data...)) +} + +// ReadMsg returns a message sent on the other end of the pipe. +func (p *MsgPipeRW) ReadMsg() (Msg, error) { + if atomic.LoadInt32(p.closed) == 0 { + select { + case msg := <-p.r: + return msg, nil + case <-p.closing: + } + } + return Msg{}, ErrPipeClosed +} + +// Close unblocks any pending ReadMsg and WriteMsg calls on both ends +// of the pipe. They will return ErrPipeClosed. Note that Close does +// not interrupt any reads from a message payload. +func (p *MsgPipeRW) Close() error { + if atomic.AddInt32(p.closed, 1) != 1 { + // someone else is already closing + atomic.StoreInt32(p.closed, 1) // avoid overflow + return nil + } + close(p.closing) + return nil +} diff --git a/p2p/message_test.go b/p2p/message_test.go new file mode 100644 index 000000000..066d2516d --- /dev/null +++ b/p2p/message_test.go @@ -0,0 +1,133 @@ +package p2p + +import ( + "bytes" + "fmt" + "io/ioutil" + "runtime" + "testing" + "time" + + "github.com/ethereum/go-ethereum/ethutil" +) + +func TestNewMsg(t *testing.T) { + msg := NewMsg(3, 1, "000") + if msg.Code != 3 { + t.Errorf("incorrect code %d, want %d", msg.Code) + } + if msg.Size != 5 { + t.Errorf("incorrect size %d, want %d", msg.Size, 5) + } + pl, _ := ioutil.ReadAll(msg.Payload) + expect := []byte{0x01, 0x83, 0x30, 0x30, 0x30} + if !bytes.Equal(pl, expect) { + t.Errorf("incorrect payload content, got %x, want %x", pl, expect) + } +} + +func TestEncodeDecodeMsg(t *testing.T) { + msg := NewMsg(3, 1, "000") + buf := new(bytes.Buffer) + if err := writeMsg(buf, msg); err != nil { + t.Fatalf("encodeMsg error: %v", err) + } + // t.Logf("encoded: %x", buf.Bytes()) + + decmsg, err := readMsg(buf) + if err != nil { + t.Fatalf("readMsg error: %v", err) + } + if decmsg.Code != 3 { + t.Errorf("incorrect code %d, want %d", decmsg.Code, 3) + } + if decmsg.Size != 5 { + t.Errorf("incorrect size %d, want %d", decmsg.Size, 5) + } + + var data struct { + I uint + S string + } + if err := decmsg.Decode(&data); err != nil { + t.Fatalf("Decode error: %v", err) + } + if data.I != 1 { + t.Errorf("incorrect data.I: got %v, expected %d", data.I, 1) + } + if data.S != "000" { + t.Errorf("incorrect data.S: got %q, expected %q", data.S, "000") + } +} + +func TestDecodeRealMsg(t *testing.T) { + data := ethutil.Hex2Bytes("2240089100000080f87e8002b5457468657265756d282b2b292f5065657220536572766572204f6e652f76302e372e382f52656c656173652f4c696e75782f672b2bc082765fb84086dd80b7aefd6a6d2e3b93f4f300a86bfb6ef7bdc97cb03f793db6bb") + msg, err := readMsg(bytes.NewReader(data)) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if msg.Code != 0 { + t.Errorf("incorrect code %d, want %d", msg.Code, 0) + } +} + +func ExampleMsgPipe() { + rw1, rw2 := MsgPipe() + go func() { + rw1.EncodeMsg(8, []byte{0, 0}) + rw1.EncodeMsg(5, []byte{1, 1}) + rw1.Close() + }() + + for { + msg, err := rw2.ReadMsg() + if err != nil { + break + } + var data [1][]byte + msg.Decode(&data) + fmt.Printf("msg: %d, %x\n", msg.Code, data[0]) + } + // Output: + // msg: 8, 0000 + // msg: 5, 0101 +} + +func TestMsgPipeUnblockWrite(t *testing.T) { +loop: + for i := 0; i < 100; i++ { + rw1, rw2 := MsgPipe() + done := make(chan struct{}) + go func() { + if err := rw1.EncodeMsg(1); err == nil { + t.Error("EncodeMsg returned nil error") + } else if err != ErrPipeClosed { + t.Error("EncodeMsg returned wrong error: got %v, want %v", err, ErrPipeClosed) + } + close(done) + }() + + // this call should ensure that EncodeMsg is waiting to + // deliver sometimes. if this isn't done, Close is likely to + // be executed before EncodeMsg starts and then we won't test + // all the cases. + runtime.Gosched() + + rw2.Close() + select { + case <-done: + case <-time.After(200 * time.Millisecond): + t.Errorf("write didn't unblock") + break loop + } + } +} + +// This test should panic if concurrent close isn't implemented correctly. +func TestMsgPipeConcurrentClose(t *testing.T) { + rw1, _ := MsgPipe() + for i := 0; i < 10; i++ { + go rw1.Close() + } +} diff --git a/p2p/natpmp.go b/p2p/natpmp.go new file mode 100644 index 000000000..6714678c4 --- /dev/null +++ b/p2p/natpmp.go @@ -0,0 +1,55 @@ +package p2p + +import ( + "fmt" + "net" + "time" + + natpmp "github.com/jackpal/go-nat-pmp" +) + +// Adapt the NAT-PMP protocol to the NAT interface + +// TODO: +// + Register for changes to the external address. +// + Re-register port mapping when router reboots. +// + A mechanism for keeping a port mapping registered. +// + Discover gateway address automatically. + +type natPMPClient struct { + client *natpmp.Client +} + +// PMP returns a NAT traverser that uses NAT-PMP. The provided gateway +// address should be the IP of your router. +func PMP(gateway net.IP) (nat NAT) { + return &natPMPClient{natpmp.NewClient(gateway)} +} + +func (*natPMPClient) String() string { + return "NAT-PMP" +} + +func (n *natPMPClient) GetExternalAddress() (net.IP, error) { + response, err := n.client.GetExternalAddress() + if err != nil { + return nil, err + } + return response.ExternalIPAddress[:], nil +} + +func (n *natPMPClient) AddPortMapping(protocol string, extport, intport int, name string, lifetime time.Duration) error { + if lifetime <= 0 { + return fmt.Errorf("lifetime must not be <= 0") + } + // Note order of port arguments is switched between our AddPortMapping and the client's AddPortMapping. + _, err := n.client.AddPortMapping(protocol, intport, extport, int(lifetime/time.Second)) + return err +} + +func (n *natPMPClient) DeletePortMapping(protocol string, externalPort, internalPort int) (err error) { + // To destroy a mapping, send an add-port with + // an internalPort of the internal port to destroy, an external port of zero and a time of zero. + _, err = n.client.AddPortMapping(protocol, internalPort, 0, 0) + return +} diff --git a/p2p/natupnp.go b/p2p/natupnp.go new file mode 100644 index 000000000..2e0d8ce8d --- /dev/null +++ b/p2p/natupnp.go @@ -0,0 +1,341 @@ +package p2p + +// Just enough UPnP to be able to forward ports +// + +import ( + "bytes" + "encoding/xml" + "errors" + "fmt" + "net" + "net/http" + "os" + "strconv" + "strings" + "time" +) + +const ( + upnpDiscoverAttempts = 3 + upnpDiscoverTimeout = 5 * time.Second +) + +// UPNP returns a NAT port mapper that uses UPnP. It will attempt to +// discover the address of your router using UDP broadcasts. +func UPNP() NAT { + return &upnpNAT{} +} + +type upnpNAT struct { + serviceURL string + ourIP string +} + +func (n *upnpNAT) String() string { + return "UPNP" +} + +func (n *upnpNAT) discover() error { + if n.serviceURL != "" { + // already discovered + return nil + } + + ssdp, err := net.ResolveUDPAddr("udp4", "239.255.255.250:1900") + if err != nil { + return err + } + // TODO: try on all network interfaces simultaneously. + // Broadcasting on 0.0.0.0 could select a random interface + // to send on (platform specific). + conn, err := net.ListenPacket("udp4", ":0") + if err != nil { + return err + } + defer conn.Close() + + conn.SetDeadline(time.Now().Add(10 * time.Second)) + st := "ST: urn:schemas-upnp-org:device:InternetGatewayDevice:1\r\n" + buf := bytes.NewBufferString( + "M-SEARCH * HTTP/1.1\r\n" + + "HOST: 239.255.255.250:1900\r\n" + + st + + "MAN: \"ssdp:discover\"\r\n" + + "MX: 2\r\n\r\n") + message := buf.Bytes() + answerBytes := make([]byte, 1024) + for i := 0; i < upnpDiscoverAttempts; i++ { + _, err = conn.WriteTo(message, ssdp) + if err != nil { + return err + } + nn, _, err := conn.ReadFrom(answerBytes) + if err != nil { + continue + } + answer := string(answerBytes[0:nn]) + if strings.Index(answer, "\r\n"+st) < 0 { + continue + } + // HTTP header field names are case-insensitive. + // http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2 + locString := "\r\nlocation: " + answer = strings.ToLower(answer) + locIndex := strings.Index(answer, locString) + if locIndex < 0 { + continue + } + loc := answer[locIndex+len(locString):] + endIndex := strings.Index(loc, "\r\n") + if endIndex < 0 { + continue + } + locURL := loc[0:endIndex] + var serviceURL string + serviceURL, err = getServiceURL(locURL) + if err != nil { + return err + } + var ourIP string + ourIP, err = getOurIP() + if err != nil { + return err + } + n.serviceURL = serviceURL + n.ourIP = ourIP + return nil + } + return errors.New("UPnP port discovery failed.") +} + +func (n *upnpNAT) GetExternalAddress() (addr net.IP, err error) { + if err := n.discover(); err != nil { + return nil, err + } + info, err := n.getStatusInfo() + return net.ParseIP(info.externalIpAddress), err +} + +func (n *upnpNAT) AddPortMapping(protocol string, extport, intport int, description string, lifetime time.Duration) error { + if err := n.discover(); err != nil { + return err + } + + // A single concatenation would break ARM compilation. + message := "<u:AddPortMapping xmlns:u=\"urn:schemas-upnp-org:service:WANIPConnection:1\">\r\n" + + "<NewRemoteHost></NewRemoteHost><NewExternalPort>" + strconv.Itoa(extport) + message += "</NewExternalPort><NewProtocol>" + protocol + "</NewProtocol>" + message += "<NewInternalPort>" + strconv.Itoa(extport) + "</NewInternalPort>" + + "<NewInternalClient>" + n.ourIP + "</NewInternalClient>" + + "<NewEnabled>1</NewEnabled><NewPortMappingDescription>" + message += description + + "</NewPortMappingDescription><NewLeaseDuration>" + fmt.Sprint(lifetime/time.Second) + + "</NewLeaseDuration></u:AddPortMapping>" + + // TODO: check response to see if the port was forwarded + _, err := soapRequest(n.serviceURL, "AddPortMapping", message) + return err +} + +func (n *upnpNAT) DeletePortMapping(protocol string, externalPort, internalPort int) error { + if err := n.discover(); err != nil { + return err + } + + message := "<u:DeletePortMapping xmlns:u=\"urn:schemas-upnp-org:service:WANIPConnection:1\">\r\n" + + "<NewRemoteHost></NewRemoteHost><NewExternalPort>" + strconv.Itoa(externalPort) + + "</NewExternalPort><NewProtocol>" + protocol + "</NewProtocol>" + + "</u:DeletePortMapping>" + + // TODO: check response to see if the port was deleted + _, err := soapRequest(n.serviceURL, "DeletePortMapping", message) + return err +} + +type statusInfo struct { + externalIpAddress string +} + +func (n *upnpNAT) getStatusInfo() (info statusInfo, err error) { + message := "<u:GetStatusInfo xmlns:u=\"urn:schemas-upnp-org:service:WANIPConnection:1\">\r\n" + + "</u:GetStatusInfo>" + + var response *http.Response + response, err = soapRequest(n.serviceURL, "GetStatusInfo", message) + if err != nil { + return + } + + // TODO: Write a soap reply parser. It has to eat the Body and envelope tags... + + response.Body.Close() + return +} + +// service represents the Service type in an UPnP xml description. +// Only the parts we care about are present and thus the xml may have more +// fields than present in the structure. +type service struct { + ServiceType string `xml:"serviceType"` + ControlURL string `xml:"controlURL"` +} + +// deviceList represents the deviceList type in an UPnP xml description. +// Only the parts we care about are present and thus the xml may have more +// fields than present in the structure. +type deviceList struct { + XMLName xml.Name `xml:"deviceList"` + Device []device `xml:"device"` +} + +// serviceList represents the serviceList type in an UPnP xml description. +// Only the parts we care about are present and thus the xml may have more +// fields than present in the structure. +type serviceList struct { + XMLName xml.Name `xml:"serviceList"` + Service []service `xml:"service"` +} + +// device represents the device type in an UPnP xml description. +// Only the parts we care about are present and thus the xml may have more +// fields than present in the structure. +type device struct { + XMLName xml.Name `xml:"device"` + DeviceType string `xml:"deviceType"` + DeviceList deviceList `xml:"deviceList"` + ServiceList serviceList `xml:"serviceList"` +} + +// specVersion represents the specVersion in a UPnP xml description. +// Only the parts we care about are present and thus the xml may have more +// fields than present in the structure. +type specVersion struct { + XMLName xml.Name `xml:"specVersion"` + Major int `xml:"major"` + Minor int `xml:"minor"` +} + +// root represents the Root document for a UPnP xml description. +// Only the parts we care about are present and thus the xml may have more +// fields than present in the structure. +type root struct { + XMLName xml.Name `xml:"root"` + SpecVersion specVersion + Device device +} + +func getChildDevice(d *device, deviceType string) *device { + dl := d.DeviceList.Device + for i := 0; i < len(dl); i++ { + if dl[i].DeviceType == deviceType { + return &dl[i] + } + } + return nil +} + +func getChildService(d *device, serviceType string) *service { + sl := d.ServiceList.Service + for i := 0; i < len(sl); i++ { + if sl[i].ServiceType == serviceType { + return &sl[i] + } + } + return nil +} + +func getOurIP() (ip string, err error) { + hostname, err := os.Hostname() + if err != nil { + return + } + p, err := net.LookupIP(hostname) + if err != nil && len(p) > 0 { + return + } + return p[0].String(), nil +} + +func getServiceURL(rootURL string) (url string, err error) { + r, err := http.Get(rootURL) + if err != nil { + return + } + defer r.Body.Close() + if r.StatusCode >= 400 { + err = errors.New(string(r.StatusCode)) + return + } + var root root + err = xml.NewDecoder(r.Body).Decode(&root) + + if err != nil { + return + } + a := &root.Device + if a.DeviceType != "urn:schemas-upnp-org:device:InternetGatewayDevice:1" { + err = errors.New("No InternetGatewayDevice") + return + } + b := getChildDevice(a, "urn:schemas-upnp-org:device:WANDevice:1") + if b == nil { + err = errors.New("No WANDevice") + return + } + c := getChildDevice(b, "urn:schemas-upnp-org:device:WANConnectionDevice:1") + if c == nil { + err = errors.New("No WANConnectionDevice") + return + } + d := getChildService(c, "urn:schemas-upnp-org:service:WANIPConnection:1") + if d == nil { + err = errors.New("No WANIPConnection") + return + } + url = combineURL(rootURL, d.ControlURL) + return +} + +func combineURL(rootURL, subURL string) string { + protocolEnd := "://" + protoEndIndex := strings.Index(rootURL, protocolEnd) + a := rootURL[protoEndIndex+len(protocolEnd):] + rootIndex := strings.Index(a, "/") + return rootURL[0:protoEndIndex+len(protocolEnd)+rootIndex] + subURL +} + +func soapRequest(url, function, message string) (r *http.Response, err error) { + fullMessage := "<?xml version=\"1.0\" ?>" + + "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\r\n" + + "<s:Body>" + message + "</s:Body></s:Envelope>" + + req, err := http.NewRequest("POST", url, strings.NewReader(fullMessage)) + if err != nil { + return + } + req.Header.Set("Content-Type", "text/xml ; charset=\"utf-8\"") + req.Header.Set("User-Agent", "Darwin/10.0.0, UPnP/1.0, MiniUPnPc/1.3") + //req.Header.Set("Transfer-Encoding", "chunked") + req.Header.Set("SOAPAction", "\"urn:schemas-upnp-org:service:WANIPConnection:1#"+function+"\"") + req.Header.Set("Connection", "Close") + req.Header.Set("Cache-Control", "no-cache") + req.Header.Set("Pragma", "no-cache") + + r, err = http.DefaultClient.Do(req) + if err != nil { + return + } + + if r.Body != nil { + defer r.Body.Close() + } + + if r.StatusCode >= 400 { + // log.Stderr(function, r.StatusCode) + err = errors.New("Error " + strconv.Itoa(r.StatusCode) + " for " + function) + r = nil + return + } + return +} diff --git a/p2p/peer.go b/p2p/peer.go new file mode 100644 index 000000000..86c4d7ab5 --- /dev/null +++ b/p2p/peer.go @@ -0,0 +1,462 @@ +package p2p + +import ( + "bufio" + "bytes" + "fmt" + "io" + "io/ioutil" + "net" + "sort" + "sync" + "time" + + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/logger" +) + +// peerAddr is the structure of a peer list element. +// It is also a valid net.Addr. +type peerAddr struct { + IP net.IP + Port uint64 + Pubkey []byte // optional +} + +func newPeerAddr(addr net.Addr, pubkey []byte) *peerAddr { + n := addr.Network() + if n != "tcp" && n != "tcp4" && n != "tcp6" { + // for testing with non-TCP + return &peerAddr{net.ParseIP("127.0.0.1"), 30303, pubkey} + } + ta := addr.(*net.TCPAddr) + return &peerAddr{ta.IP, uint64(ta.Port), pubkey} +} + +func (d peerAddr) Network() string { + if d.IP.To4() != nil { + return "tcp4" + } else { + return "tcp6" + } +} + +func (d peerAddr) String() string { + return fmt.Sprintf("%v:%d", d.IP, d.Port) +} + +func (d peerAddr) RlpData() interface{} { + return []interface{}{d.IP, d.Port, d.Pubkey} +} + +// Peer represents a remote peer. +type Peer struct { + // Peers have all the log methods. + // Use them to display messages related to the peer. + *logger.Logger + + infolock sync.Mutex + identity ClientIdentity + caps []Cap + listenAddr *peerAddr // what remote peer is listening on + dialAddr *peerAddr // non-nil if dialing + + // The mutex protects the connection + // so only one protocol can write at a time. + writeMu sync.Mutex + conn net.Conn + bufconn *bufio.ReadWriter + + // These fields maintain the running protocols. + protocols []Protocol + runBaseProtocol bool // for testing + + runlock sync.RWMutex // protects running + running map[string]*proto + + protoWG sync.WaitGroup + protoErr chan error + closed chan struct{} + disc chan DiscReason + + activity event.TypeMux // for activity events + + slot int // index into Server peer list + + // These fields are kept so base protocol can access them. + // TODO: this should be one or more interfaces + ourID ClientIdentity // client id of the Server + ourListenAddr *peerAddr // listen addr of Server, nil if not listening + newPeerAddr chan<- *peerAddr // tell server about received peers + otherPeers func() []*Peer // should return the list of all peers + pubkeyHook func(*peerAddr) error // called at end of handshake to validate pubkey +} + +// NewPeer returns a peer for testing purposes. +func NewPeer(id ClientIdentity, caps []Cap) *Peer { + conn, _ := net.Pipe() + peer := newPeer(conn, nil, nil) + peer.setHandshakeInfo(id, nil, caps) + close(peer.closed) + return peer +} + +func newServerPeer(server *Server, conn net.Conn, dialAddr *peerAddr) *Peer { + p := newPeer(conn, server.Protocols, dialAddr) + p.ourID = server.Identity + p.newPeerAddr = server.peerConnect + p.otherPeers = server.Peers + p.pubkeyHook = server.verifyPeer + p.runBaseProtocol = true + + // laddr can be updated concurrently by NAT traversal. + // newServerPeer must be called with the server lock held. + if server.laddr != nil { + p.ourListenAddr = newPeerAddr(server.laddr, server.Identity.Pubkey()) + } + return p +} + +func newPeer(conn net.Conn, protocols []Protocol, dialAddr *peerAddr) *Peer { + p := &Peer{ + Logger: logger.NewLogger("P2P " + conn.RemoteAddr().String()), + conn: conn, + dialAddr: dialAddr, + bufconn: bufio.NewReadWriter(bufio.NewReader(conn), bufio.NewWriter(conn)), + protocols: protocols, + running: make(map[string]*proto), + disc: make(chan DiscReason), + protoErr: make(chan error), + closed: make(chan struct{}), + } + return p +} + +// Identity returns the client identity of the remote peer. The +// identity can be nil if the peer has not yet completed the +// handshake. +func (p *Peer) Identity() ClientIdentity { + p.infolock.Lock() + defer p.infolock.Unlock() + return p.identity +} + +// Caps returns the capabilities (supported subprotocols) of the remote peer. +func (p *Peer) Caps() []Cap { + p.infolock.Lock() + defer p.infolock.Unlock() + return p.caps +} + +func (p *Peer) setHandshakeInfo(id ClientIdentity, laddr *peerAddr, caps []Cap) { + p.infolock.Lock() + p.identity = id + p.listenAddr = laddr + p.caps = caps + p.infolock.Unlock() +} + +// RemoteAddr returns the remote address of the network connection. +func (p *Peer) RemoteAddr() net.Addr { + return p.conn.RemoteAddr() +} + +// LocalAddr returns the local address of the network connection. +func (p *Peer) LocalAddr() net.Addr { + return p.conn.LocalAddr() +} + +// Disconnect terminates the peer connection with the given reason. +// It returns immediately and does not wait until the connection is closed. +func (p *Peer) Disconnect(reason DiscReason) { + select { + case p.disc <- reason: + case <-p.closed: + } +} + +// String implements fmt.Stringer. +func (p *Peer) String() string { + kind := "inbound" + p.infolock.Lock() + if p.dialAddr != nil { + kind = "outbound" + } + p.infolock.Unlock() + return fmt.Sprintf("Peer(%p %v %s)", p, p.conn.RemoteAddr(), kind) +} + +const ( + // maximum amount of time allowed for reading a message + msgReadTimeout = 5 * time.Second + // maximum amount of time allowed for writing a message + msgWriteTimeout = 5 * time.Second + // messages smaller than this many bytes will be read at + // once before passing them to a protocol. + wholePayloadSize = 64 * 1024 +) + +var ( + inactivityTimeout = 2 * time.Second + disconnectGracePeriod = 2 * time.Second +) + +func (p *Peer) loop() (reason DiscReason, err error) { + defer p.activity.Stop() + defer p.closeProtocols() + defer close(p.closed) + defer p.conn.Close() + + // read loop + readMsg := make(chan Msg) + readErr := make(chan error) + readNext := make(chan bool, 1) + protoDone := make(chan struct{}, 1) + go p.readLoop(readMsg, readErr, readNext) + readNext <- true + + if p.runBaseProtocol { + p.startBaseProtocol() + } + +loop: + for { + select { + case msg := <-readMsg: + // a new message has arrived. + var wait bool + if wait, err = p.dispatch(msg, protoDone); err != nil { + p.Errorf("msg dispatch error: %v\n", err) + reason = discReasonForError(err) + break loop + } + if !wait { + // Msg has already been read completely, continue with next message. + readNext <- true + } + p.activity.Post(time.Now()) + case <-protoDone: + // protocol has consumed the message payload, + // we can continue reading from the socket. + readNext <- true + + case err := <-readErr: + // read failed. there is no need to run the + // polite disconnect sequence because the connection + // is probably dead anyway. + // TODO: handle write errors as well + return DiscNetworkError, err + case err = <-p.protoErr: + reason = discReasonForError(err) + break loop + case reason = <-p.disc: + break loop + } + } + + // wait for read loop to return. + close(readNext) + <-readErr + // tell the remote end to disconnect + done := make(chan struct{}) + go func() { + p.conn.SetDeadline(time.Now().Add(disconnectGracePeriod)) + p.writeMsg(NewMsg(discMsg, reason), disconnectGracePeriod) + io.Copy(ioutil.Discard, p.conn) + close(done) + }() + select { + case <-done: + case <-time.After(disconnectGracePeriod): + } + return reason, err +} + +func (p *Peer) readLoop(msgc chan<- Msg, errc chan<- error, unblock <-chan bool) { + for _ = range unblock { + p.conn.SetReadDeadline(time.Now().Add(msgReadTimeout)) + if msg, err := readMsg(p.bufconn); err != nil { + errc <- err + } else { + msgc <- msg + } + } + close(errc) +} + +func (p *Peer) dispatch(msg Msg, protoDone chan struct{}) (wait bool, err error) { + proto, err := p.getProto(msg.Code) + if err != nil { + return false, err + } + if msg.Size <= wholePayloadSize { + // optimization: msg is small enough, read all + // of it and move on to the next message + buf, err := ioutil.ReadAll(msg.Payload) + if err != nil { + return false, err + } + msg.Payload = bytes.NewReader(buf) + proto.in <- msg + } else { + wait = true + pr := &eofSignal{msg.Payload, int64(msg.Size), protoDone} + msg.Payload = pr + proto.in <- msg + } + return wait, nil +} + +func (p *Peer) startBaseProtocol() { + p.runlock.Lock() + defer p.runlock.Unlock() + p.running[""] = p.startProto(0, Protocol{ + Length: baseProtocolLength, + Run: runBaseProtocol, + }) +} + +// startProtocols starts matching named subprotocols. +func (p *Peer) startSubprotocols(caps []Cap) { + sort.Sort(capsByName(caps)) + + p.runlock.Lock() + defer p.runlock.Unlock() + offset := baseProtocolLength +outer: + for _, cap := range caps { + for _, proto := range p.protocols { + if proto.Name == cap.Name && + proto.Version == cap.Version && + p.running[cap.Name] == nil { + p.running[cap.Name] = p.startProto(offset, proto) + offset += proto.Length + continue outer + } + } + } +} + +func (p *Peer) startProto(offset uint64, impl Protocol) *proto { + rw := &proto{ + in: make(chan Msg), + offset: offset, + maxcode: impl.Length, + peer: p, + } + p.protoWG.Add(1) + go func() { + err := impl.Run(p, rw) + if err == nil { + p.Infof("protocol %q returned", impl.Name) + err = newPeerError(errMisc, "protocol returned") + } else { + p.Errorf("protocol %q error: %v\n", impl.Name, err) + } + select { + case p.protoErr <- err: + case <-p.closed: + } + p.protoWG.Done() + }() + return rw +} + +// getProto finds the protocol responsible for handling +// the given message code. +func (p *Peer) getProto(code uint64) (*proto, error) { + p.runlock.RLock() + defer p.runlock.RUnlock() + for _, proto := range p.running { + if code >= proto.offset && code < proto.offset+proto.maxcode { + return proto, nil + } + } + return nil, newPeerError(errInvalidMsgCode, "%d", code) +} + +func (p *Peer) closeProtocols() { + p.runlock.RLock() + for _, p := range p.running { + close(p.in) + } + p.runlock.RUnlock() + p.protoWG.Wait() +} + +// writeProtoMsg sends the given message on behalf of the given named protocol. +func (p *Peer) writeProtoMsg(protoName string, msg Msg) error { + p.runlock.RLock() + proto, ok := p.running[protoName] + p.runlock.RUnlock() + if !ok { + return fmt.Errorf("protocol %s not handled by peer", protoName) + } + if msg.Code >= proto.maxcode { + return newPeerError(errInvalidMsgCode, "code %x is out of range for protocol %q", msg.Code, protoName) + } + msg.Code += proto.offset + return p.writeMsg(msg, msgWriteTimeout) +} + +// writeMsg writes a message to the connection. +func (p *Peer) writeMsg(msg Msg, timeout time.Duration) error { + p.writeMu.Lock() + defer p.writeMu.Unlock() + p.conn.SetWriteDeadline(time.Now().Add(timeout)) + if err := writeMsg(p.bufconn, msg); err != nil { + return newPeerError(errWrite, "%v", err) + } + return p.bufconn.Flush() +} + +type proto struct { + name string + in chan Msg + maxcode, offset uint64 + peer *Peer +} + +func (rw *proto) WriteMsg(msg Msg) error { + if msg.Code >= rw.maxcode { + return newPeerError(errInvalidMsgCode, "not handled") + } + msg.Code += rw.offset + return rw.peer.writeMsg(msg, msgWriteTimeout) +} + +func (rw *proto) EncodeMsg(code uint64, data ...interface{}) error { + return rw.WriteMsg(NewMsg(code, data)) +} + +func (rw *proto) ReadMsg() (Msg, error) { + msg, ok := <-rw.in + if !ok { + return msg, io.EOF + } + msg.Code -= rw.offset + return msg, nil +} + +// eofSignal wraps a reader with eof signaling. the eof channel is +// closed when the wrapped reader returns an error or when count bytes +// have been read. +// +type eofSignal struct { + wrapped io.Reader + count int64 + eof chan<- struct{} +} + +// note: when using eofSignal to detect whether a message payload +// has been read, Read might not be called for zero sized messages. + +func (r *eofSignal) Read(buf []byte) (int, error) { + n, err := r.wrapped.Read(buf) + r.count -= int64(n) + if (err != nil || r.count <= 0) && r.eof != nil { + r.eof <- struct{}{} // tell Peer that msg has been consumed + r.eof = nil + } + return n, err +} diff --git a/p2p/peer_error.go b/p2p/peer_error.go new file mode 100644 index 000000000..0eb7ec838 --- /dev/null +++ b/p2p/peer_error.go @@ -0,0 +1,133 @@ +package p2p + +import ( + "fmt" +) + +const ( + errMagicTokenMismatch = iota + errRead + errWrite + errMisc + errInvalidMsgCode + errInvalidMsg + errP2PVersionMismatch + errPubkeyMissing + errPubkeyInvalid + errPubkeyForbidden + errProtocolBreach + errPingTimeout + errInvalidNetworkId + errInvalidProtocolVersion +) + +var errorToString = map[int]string{ + errMagicTokenMismatch: "Magic token mismatch", + errRead: "Read error", + errWrite: "Write error", + errMisc: "Misc error", + errInvalidMsgCode: "Invalid message code", + errInvalidMsg: "Invalid message", + errP2PVersionMismatch: "P2P Version Mismatch", + errPubkeyMissing: "Public key missing", + errPubkeyInvalid: "Public key invalid", + errPubkeyForbidden: "Public key forbidden", + errProtocolBreach: "Protocol Breach", + errPingTimeout: "Ping timeout", + errInvalidNetworkId: "Invalid network id", + errInvalidProtocolVersion: "Invalid protocol version", +} + +type peerError struct { + Code int + message string +} + +func newPeerError(code int, format string, v ...interface{}) *peerError { + desc, ok := errorToString[code] + if !ok { + panic("invalid error code") + } + err := &peerError{code, desc} + if format != "" { + err.message += ": " + fmt.Sprintf(format, v...) + } + return err +} + +func (self *peerError) Error() string { + return self.message +} + +type DiscReason byte + +const ( + DiscRequested DiscReason = 0x00 + DiscNetworkError = 0x01 + DiscProtocolError = 0x02 + DiscUselessPeer = 0x03 + DiscTooManyPeers = 0x04 + DiscAlreadyConnected = 0x05 + DiscIncompatibleVersion = 0x06 + DiscInvalidIdentity = 0x07 + DiscQuitting = 0x08 + DiscUnexpectedIdentity = 0x09 + DiscSelf = 0x0a + DiscReadTimeout = 0x0b + DiscSubprotocolError = 0x10 +) + +var discReasonToString = [DiscSubprotocolError + 1]string{ + DiscRequested: "Disconnect requested", + DiscNetworkError: "Network error", + DiscProtocolError: "Breach of protocol", + DiscUselessPeer: "Useless peer", + DiscTooManyPeers: "Too many peers", + DiscAlreadyConnected: "Already connected", + DiscIncompatibleVersion: "Incompatible P2P protocol version", + DiscInvalidIdentity: "Invalid node identity", + DiscQuitting: "Client quitting", + DiscUnexpectedIdentity: "Unexpected identity", + DiscSelf: "Connected to self", + DiscReadTimeout: "Read timeout", + DiscSubprotocolError: "Subprotocol error", +} + +func (d DiscReason) String() string { + if len(discReasonToString) < int(d) { + return fmt.Sprintf("Unknown Reason(%d)", d) + } + return discReasonToString[d] +} + +type discRequestedError DiscReason + +func (err discRequestedError) Error() string { + return fmt.Sprintf("disconnect requested: %v", DiscReason(err)) +} + +func discReasonForError(err error) DiscReason { + if reason, ok := err.(discRequestedError); ok { + return DiscReason(reason) + } + peerError, ok := err.(*peerError) + if !ok { + return DiscSubprotocolError + } + switch peerError.Code { + case errP2PVersionMismatch: + return DiscIncompatibleVersion + case errPubkeyMissing, errPubkeyInvalid: + return DiscInvalidIdentity + case errPubkeyForbidden: + return DiscUselessPeer + case errInvalidMsgCode, errMagicTokenMismatch, errProtocolBreach: + return DiscProtocolError + case errPingTimeout: + return DiscReadTimeout + case errRead, errWrite, errMisc: + return DiscNetworkError + default: + return DiscSubprotocolError + } +} diff --git a/p2p/peer_test.go b/p2p/peer_test.go new file mode 100644 index 000000000..f7759786e --- /dev/null +++ b/p2p/peer_test.go @@ -0,0 +1,295 @@ +package p2p + +import ( + "bufio" + "bytes" + "encoding/hex" + "io" + "io/ioutil" + "net" + "reflect" + "testing" + "time" +) + +var discard = Protocol{ + Name: "discard", + Length: 1, + Run: func(p *Peer, rw MsgReadWriter) error { + for { + msg, err := rw.ReadMsg() + if err != nil { + return err + } + if err = msg.Discard(); err != nil { + return err + } + } + }, +} + +func testPeer(protos []Protocol) (net.Conn, *Peer, <-chan error) { + conn1, conn2 := net.Pipe() + id := NewSimpleClientIdentity("test", "0", "0", "public key") + peer := newPeer(conn1, protos, nil) + peer.ourID = id + peer.pubkeyHook = func(*peerAddr) error { return nil } + errc := make(chan error, 1) + go func() { + _, err := peer.loop() + errc <- err + }() + return conn2, peer, errc +} + +func TestPeerProtoReadMsg(t *testing.T) { + defer testlog(t).detach() + + done := make(chan struct{}) + proto := Protocol{ + Name: "a", + Length: 5, + Run: func(peer *Peer, rw MsgReadWriter) error { + msg, err := rw.ReadMsg() + if err != nil { + t.Errorf("read error: %v", err) + } + if msg.Code != 2 { + t.Errorf("incorrect msg code %d relayed to protocol", msg.Code) + } + data, err := ioutil.ReadAll(msg.Payload) + if err != nil { + t.Errorf("payload read error: %v", err) + } + expdata, _ := hex.DecodeString("0183303030") + if !bytes.Equal(expdata, data) { + t.Errorf("incorrect msg data %x", data) + } + close(done) + return nil + }, + } + + net, peer, errc := testPeer([]Protocol{proto}) + defer net.Close() + peer.startSubprotocols([]Cap{proto.cap()}) + + writeMsg(net, NewMsg(18, 1, "000")) + select { + case <-done: + case err := <-errc: + t.Errorf("peer returned: %v", err) + case <-time.After(2 * time.Second): + t.Errorf("receive timeout") + } +} + +func TestPeerProtoReadLargeMsg(t *testing.T) { + defer testlog(t).detach() + + msgsize := uint32(10 * 1024 * 1024) + done := make(chan struct{}) + proto := Protocol{ + Name: "a", + Length: 5, + Run: func(peer *Peer, rw MsgReadWriter) error { + msg, err := rw.ReadMsg() + if err != nil { + t.Errorf("read error: %v", err) + } + if msg.Size != msgsize+4 { + t.Errorf("incorrect msg.Size, got %d, expected %d", msg.Size, msgsize) + } + msg.Discard() + close(done) + return nil + }, + } + + net, peer, errc := testPeer([]Protocol{proto}) + defer net.Close() + peer.startSubprotocols([]Cap{proto.cap()}) + + writeMsg(net, NewMsg(18, make([]byte, msgsize))) + select { + case <-done: + case err := <-errc: + t.Errorf("peer returned: %v", err) + case <-time.After(2 * time.Second): + t.Errorf("receive timeout") + } +} + +func TestPeerProtoEncodeMsg(t *testing.T) { + defer testlog(t).detach() + + proto := Protocol{ + Name: "a", + Length: 2, + Run: func(peer *Peer, rw MsgReadWriter) error { + if err := rw.EncodeMsg(2); err == nil { + t.Error("expected error for out-of-range msg code, got nil") + } + if err := rw.EncodeMsg(1); err != nil { + t.Errorf("write error: %v", err) + } + return nil + }, + } + net, peer, _ := testPeer([]Protocol{proto}) + defer net.Close() + peer.startSubprotocols([]Cap{proto.cap()}) + + bufr := bufio.NewReader(net) + msg, err := readMsg(bufr) + if err != nil { + t.Errorf("read error: %v", err) + } + if msg.Code != 17 { + t.Errorf("incorrect message code: got %d, expected %d", msg.Code, 17) + } +} + +func TestPeerWrite(t *testing.T) { + defer testlog(t).detach() + + net, peer, peerErr := testPeer([]Protocol{discard}) + defer net.Close() + peer.startSubprotocols([]Cap{discard.cap()}) + + // test write errors + if err := peer.writeProtoMsg("b", NewMsg(3)); err == nil { + t.Errorf("expected error for unknown protocol, got nil") + } + if err := peer.writeProtoMsg("discard", NewMsg(8)); err == nil { + t.Errorf("expected error for out-of-range msg code, got nil") + } else if perr, ok := err.(*peerError); !ok || perr.Code != errInvalidMsgCode { + t.Errorf("wrong error for out-of-range msg code, got %#v", err) + } + + // setup for reading the message on the other end + read := make(chan struct{}) + go func() { + bufr := bufio.NewReader(net) + msg, err := readMsg(bufr) + if err != nil { + t.Errorf("read error: %v", err) + } else if msg.Code != 16 { + t.Errorf("wrong code, got %d, expected %d", msg.Code, 16) + } + msg.Discard() + close(read) + }() + + // test succcessful write + if err := peer.writeProtoMsg("discard", NewMsg(0)); err != nil { + t.Errorf("expect no error for known protocol: %v", err) + } + select { + case <-read: + case err := <-peerErr: + t.Fatalf("peer stopped: %v", err) + } +} + +func TestPeerActivity(t *testing.T) { + // shorten inactivityTimeout while this test is running + oldT := inactivityTimeout + defer func() { inactivityTimeout = oldT }() + inactivityTimeout = 20 * time.Millisecond + + net, peer, peerErr := testPeer([]Protocol{discard}) + defer net.Close() + peer.startSubprotocols([]Cap{discard.cap()}) + + sub := peer.activity.Subscribe(time.Time{}) + defer sub.Unsubscribe() + + for i := 0; i < 6; i++ { + writeMsg(net, NewMsg(16)) + select { + case <-sub.Chan(): + case <-time.After(inactivityTimeout / 2): + t.Fatal("no event within ", inactivityTimeout/2) + case err := <-peerErr: + t.Fatal("peer error", err) + } + } + + select { + case <-time.After(inactivityTimeout * 2): + case <-sub.Chan(): + t.Fatal("got activity event while connection was inactive") + case err := <-peerErr: + t.Fatal("peer error", err) + } +} + +func TestNewPeer(t *testing.T) { + id := NewSimpleClientIdentity("clientid", "version", "customid", "pubkey") + caps := []Cap{{"foo", 2}, {"bar", 3}} + p := NewPeer(id, caps) + if !reflect.DeepEqual(p.Caps(), caps) { + t.Errorf("Caps mismatch: got %v, expected %v", p.Caps(), caps) + } + if p.Identity() != id { + t.Errorf("Identity mismatch: got %v, expected %v", p.Identity(), id) + } + // Should not hang. + p.Disconnect(DiscAlreadyConnected) +} + +func TestEOFSignal(t *testing.T) { + rb := make([]byte, 10) + + // empty reader + eof := make(chan struct{}, 1) + sig := &eofSignal{new(bytes.Buffer), 0, eof} + if n, err := sig.Read(rb); n != 0 || err != io.EOF { + t.Errorf("Read returned unexpected values: (%v, %v)", n, err) + } + select { + case <-eof: + default: + t.Error("EOF chan not signaled") + } + + // count before error + eof = make(chan struct{}, 1) + sig = &eofSignal{bytes.NewBufferString("aaaaaaaa"), 4, eof} + if n, err := sig.Read(rb); n != 8 || err != nil { + t.Errorf("Read returned unexpected values: (%v, %v)", n, err) + } + select { + case <-eof: + default: + t.Error("EOF chan not signaled") + } + + // error before count + eof = make(chan struct{}, 1) + sig = &eofSignal{bytes.NewBufferString("aaaa"), 999, eof} + if n, err := sig.Read(rb); n != 4 || err != nil { + t.Errorf("Read returned unexpected values: (%v, %v)", n, err) + } + if n, err := sig.Read(rb); n != 0 || err != io.EOF { + t.Errorf("Read returned unexpected values: (%v, %v)", n, err) + } + select { + case <-eof: + default: + t.Error("EOF chan not signaled") + } + + // no signal if neither occurs + eof = make(chan struct{}, 1) + sig = &eofSignal{bytes.NewBufferString("aaaaaaaaaaaaaaaaaaaaa"), 999, eof} + if n, err := sig.Read(rb); n != 10 || err != nil { + t.Errorf("Read returned unexpected values: (%v, %v)", n, err) + } + select { + case <-eof: + t.Error("unexpected EOF signal") + default: + } +} diff --git a/p2p/protocol.go b/p2p/protocol.go new file mode 100644 index 000000000..3f52205f5 --- /dev/null +++ b/p2p/protocol.go @@ -0,0 +1,294 @@ +package p2p + +import ( + "bytes" + "time" + + "github.com/ethereum/go-ethereum/ethutil" +) + +// Protocol represents a P2P subprotocol implementation. +type Protocol struct { + // Name should contain the official protocol name, + // often a three-letter word. + Name string + + // Version should contain the version number of the protocol. + Version uint + + // Length should contain the number of message codes used + // by the protocol. + Length uint64 + + // Run is called in a new groutine when the protocol has been + // negotiated with a peer. It should read and write messages from + // rw. The Payload for each message must be fully consumed. + // + // The peer connection is closed when Start returns. It should return + // any protocol-level error (such as an I/O error) that is + // encountered. + Run func(peer *Peer, rw MsgReadWriter) error +} + +func (p Protocol) cap() Cap { + return Cap{p.Name, p.Version} +} + +const ( + baseProtocolVersion = 2 + baseProtocolLength = uint64(16) + baseProtocolMaxMsgSize = 10 * 1024 * 1024 +) + +const ( + // devp2p message codes + handshakeMsg = 0x00 + discMsg = 0x01 + pingMsg = 0x02 + pongMsg = 0x03 + getPeersMsg = 0x04 + peersMsg = 0x05 +) + +// handshake is the structure of a handshake list. +type handshake struct { + Version uint64 + ID string + Caps []Cap + ListenPort uint64 + NodeID []byte +} + +func (h *handshake) String() string { + return h.ID +} +func (h *handshake) Pubkey() []byte { + return h.NodeID +} + +// Cap is the structure of a peer capability. +type Cap struct { + Name string + Version uint +} + +func (cap Cap) RlpData() interface{} { + return []interface{}{cap.Name, cap.Version} +} + +type capsByName []Cap + +func (cs capsByName) Len() int { return len(cs) } +func (cs capsByName) Less(i, j int) bool { return cs[i].Name < cs[j].Name } +func (cs capsByName) Swap(i, j int) { cs[i], cs[j] = cs[j], cs[i] } + +type baseProtocol struct { + rw MsgReadWriter + peer *Peer +} + +func runBaseProtocol(peer *Peer, rw MsgReadWriter) error { + bp := &baseProtocol{rw, peer} + if err := bp.doHandshake(rw); err != nil { + return err + } + // run main loop + quit := make(chan error, 1) + go func() { + for { + if err := bp.handle(rw); err != nil { + quit <- err + break + } + } + }() + return bp.loop(quit) +} + +var pingTimeout = 2 * time.Second + +func (bp *baseProtocol) loop(quit <-chan error) error { + ping := time.NewTimer(pingTimeout) + activity := bp.peer.activity.Subscribe(time.Time{}) + lastActive := time.Time{} + defer ping.Stop() + defer activity.Unsubscribe() + + getPeersTick := time.NewTicker(10 * time.Second) + defer getPeersTick.Stop() + err := bp.rw.EncodeMsg(getPeersMsg) + + for err == nil { + select { + case err = <-quit: + return err + case <-getPeersTick.C: + err = bp.rw.EncodeMsg(getPeersMsg) + case event := <-activity.Chan(): + ping.Reset(pingTimeout) + lastActive = event.(time.Time) + case t := <-ping.C: + if lastActive.Add(pingTimeout * 2).Before(t) { + err = newPeerError(errPingTimeout, "") + } else if lastActive.Add(pingTimeout).Before(t) { + err = bp.rw.EncodeMsg(pingMsg) + } + } + } + return err +} + +func (bp *baseProtocol) handle(rw MsgReadWriter) error { + msg, err := rw.ReadMsg() + if err != nil { + return err + } + if msg.Size > baseProtocolMaxMsgSize { + return newPeerError(errMisc, "message too big") + } + // make sure that the payload has been fully consumed + defer msg.Discard() + + switch msg.Code { + case handshakeMsg: + return newPeerError(errProtocolBreach, "extra handshake received") + + case discMsg: + var reason [1]DiscReason + if err := msg.Decode(&reason); err != nil { + return err + } + return discRequestedError(reason[0]) + + case pingMsg: + return bp.rw.EncodeMsg(pongMsg) + + case pongMsg: + + case getPeersMsg: + peers := bp.peerList() + // this is dangerous. the spec says that we should _delay_ + // sending the response if no new information is available. + // this means that would need to send a response later when + // new peers become available. + // + // TODO: add event mechanism to notify baseProtocol for new peers + if len(peers) > 0 { + return bp.rw.EncodeMsg(peersMsg, peers) + } + + case peersMsg: + var peers []*peerAddr + if err := msg.Decode(&peers); err != nil { + return err + } + for _, addr := range peers { + bp.peer.Debugf("received peer suggestion: %v", addr) + bp.peer.newPeerAddr <- addr + } + + default: + return newPeerError(errInvalidMsgCode, "unknown message code %v", msg.Code) + } + return nil +} + +func (bp *baseProtocol) doHandshake(rw MsgReadWriter) error { + // send our handshake + if err := rw.WriteMsg(bp.handshakeMsg()); err != nil { + return err + } + + // read and handle remote handshake + msg, err := rw.ReadMsg() + if err != nil { + return err + } + if msg.Code != handshakeMsg { + return newPeerError(errProtocolBreach, "first message must be handshake, got %x", msg.Code) + } + if msg.Size > baseProtocolMaxMsgSize { + return newPeerError(errMisc, "message too big") + } + + var hs handshake + if err := msg.Decode(&hs); err != nil { + return err + } + + // validate handshake info + if hs.Version != baseProtocolVersion { + return newPeerError(errP2PVersionMismatch, "Require protocol %d, received %d\n", + baseProtocolVersion, hs.Version) + } + if len(hs.NodeID) == 0 { + return newPeerError(errPubkeyMissing, "") + } + if len(hs.NodeID) != 64 { + return newPeerError(errPubkeyInvalid, "require 512 bit, got %v", len(hs.NodeID)*8) + } + if da := bp.peer.dialAddr; da != nil { + // verify that the peer we wanted to connect to + // actually holds the target public key. + if da.Pubkey != nil && !bytes.Equal(da.Pubkey, hs.NodeID) { + return newPeerError(errPubkeyForbidden, "dial address pubkey mismatch") + } + } + pa := newPeerAddr(bp.peer.conn.RemoteAddr(), hs.NodeID) + if err := bp.peer.pubkeyHook(pa); err != nil { + return newPeerError(errPubkeyForbidden, "%v", err) + } + + // TODO: remove Caps with empty name + + var addr *peerAddr + if hs.ListenPort != 0 { + addr = newPeerAddr(bp.peer.conn.RemoteAddr(), hs.NodeID) + addr.Port = hs.ListenPort + } + bp.peer.setHandshakeInfo(&hs, addr, hs.Caps) + bp.peer.startSubprotocols(hs.Caps) + return nil +} + +func (bp *baseProtocol) handshakeMsg() Msg { + var ( + port uint64 + caps []interface{} + ) + if bp.peer.ourListenAddr != nil { + port = bp.peer.ourListenAddr.Port + } + for _, proto := range bp.peer.protocols { + caps = append(caps, proto.cap()) + } + return NewMsg(handshakeMsg, + baseProtocolVersion, + bp.peer.ourID.String(), + caps, + port, + bp.peer.ourID.Pubkey()[1:], + ) +} + +func (bp *baseProtocol) peerList() []ethutil.RlpEncodable { + peers := bp.peer.otherPeers() + ds := make([]ethutil.RlpEncodable, 0, len(peers)) + for _, p := range peers { + p.infolock.Lock() + addr := p.listenAddr + p.infolock.Unlock() + // filter out this peer and peers that are not listening or + // have not completed the handshake. + // TODO: track previously sent peers and exclude them as well. + if p == bp.peer || addr == nil { + continue + } + ds = append(ds, addr) + } + ourAddr := bp.peer.ourListenAddr + if ourAddr != nil && !ourAddr.IP.IsLoopback() && !ourAddr.IP.IsUnspecified() { + ds = append(ds, ourAddr) + } + return ds +} diff --git a/p2p/protocol_test.go b/p2p/protocol_test.go new file mode 100644 index 000000000..65f26fb12 --- /dev/null +++ b/p2p/protocol_test.go @@ -0,0 +1,58 @@ +package p2p + +import ( + "fmt" + "testing" +) + +func TestBaseProtocolDisconnect(t *testing.T) { + peer := NewPeer(NewSimpleClientIdentity("p1", "", "", "foo"), nil) + peer.ourID = NewSimpleClientIdentity("p2", "", "", "bar") + peer.pubkeyHook = func(*peerAddr) error { return nil } + + rw1, rw2 := MsgPipe() + done := make(chan struct{}) + go func() { + if err := expectMsg(rw2, handshakeMsg); err != nil { + t.Error(err) + } + err := rw2.EncodeMsg(handshakeMsg, + baseProtocolVersion, + "", + []interface{}{}, + 0, + make([]byte, 64), + ) + if err != nil { + t.Error(err) + } + if err := expectMsg(rw2, getPeersMsg); err != nil { + t.Error(err) + } + if err := rw2.EncodeMsg(discMsg, DiscQuitting); err != nil { + t.Error(err) + } + close(done) + }() + + if err := runBaseProtocol(peer, rw1); err == nil { + t.Errorf("base protocol returned without error") + } else if reason, ok := err.(discRequestedError); !ok || reason != DiscQuitting { + t.Errorf("base protocol returned wrong error: %v", err) + } + <-done +} + +func expectMsg(r MsgReader, code uint64) error { + msg, err := r.ReadMsg() + if err != nil { + return err + } + if err := msg.Discard(); err != nil { + return err + } + if msg.Code != code { + return fmt.Errorf("wrong message code: got %d, expected %d", msg.Code, code) + } + return nil +} diff --git a/p2p/server.go b/p2p/server.go new file mode 100644 index 000000000..8a6087566 --- /dev/null +++ b/p2p/server.go @@ -0,0 +1,467 @@ +package p2p + +import ( + "bytes" + "errors" + "fmt" + "net" + "sync" + "time" + + "github.com/ethereum/go-ethereum/logger" +) + +const ( + outboundAddressPoolSize = 500 + defaultDialTimeout = 10 * time.Second + portMappingUpdateInterval = 15 * time.Minute + portMappingTimeout = 20 * time.Minute +) + +var srvlog = logger.NewLogger("P2P Server") + +// Server manages all peer connections. +// +// The fields of Server are used as configuration parameters. +// You should set them before starting the Server. Fields may not be +// modified while the server is running. +type Server struct { + // This field must be set to a valid client identity. + Identity ClientIdentity + + // MaxPeers is the maximum number of peers that can be + // connected. It must be greater than zero. + MaxPeers int + + // Protocols should contain the protocols supported + // by the server. Matching protocols are launched for + // each peer. + Protocols []Protocol + + // If Blacklist is set to a non-nil value, the given Blacklist + // is used to verify peer connections. + Blacklist Blacklist + + // If ListenAddr is set to a non-nil address, the server + // will listen for incoming connections. + // + // If the port is zero, the operating system will pick a port. The + // ListenAddr field will be updated with the actual address when + // the server is started. + ListenAddr string + + // If set to a non-nil value, the given NAT port mapper + // is used to make the listening port available to the + // Internet. + NAT NAT + + // If Dialer is set to a non-nil value, the given Dialer + // is used to dial outbound peer connections. + Dialer *net.Dialer + + // If NoDial is true, the server will not dial any peers. + NoDial bool + + // Hook for testing. This is useful because we can inhibit + // the whole protocol stack. + newPeerFunc peerFunc + + lock sync.RWMutex + running bool + listener net.Listener + laddr *net.TCPAddr // real listen addr + peers []*Peer + peerSlots chan int + peerCount int + + quit chan struct{} + wg sync.WaitGroup + peerConnect chan *peerAddr + peerDisconnect chan *Peer +} + +// NAT is implemented by NAT traversal methods. +type NAT interface { + GetExternalAddress() (net.IP, error) + AddPortMapping(protocol string, extport, intport int, name string, lifetime time.Duration) error + DeletePortMapping(protocol string, extport, intport int) error + + // Should return name of the method. + String() string +} + +type peerFunc func(srv *Server, c net.Conn, dialAddr *peerAddr) *Peer + +// Peers returns all connected peers. +func (srv *Server) Peers() (peers []*Peer) { + srv.lock.RLock() + defer srv.lock.RUnlock() + for _, peer := range srv.peers { + if peer != nil { + peers = append(peers, peer) + } + } + return +} + +// PeerCount returns the number of connected peers. +func (srv *Server) PeerCount() int { + srv.lock.RLock() + defer srv.lock.RUnlock() + return srv.peerCount +} + +// SuggestPeer injects an address into the outbound address pool. +func (srv *Server) SuggestPeer(ip net.IP, port int, nodeID []byte) { + select { + case srv.peerConnect <- &peerAddr{ip, uint64(port), nodeID}: + default: // don't block + } +} + +// Broadcast sends an RLP-encoded message to all connected peers. +// This method is deprecated and will be removed later. +func (srv *Server) Broadcast(protocol string, code uint64, data ...interface{}) { + var payload []byte + if data != nil { + payload = encodePayload(data...) + } + srv.lock.RLock() + defer srv.lock.RUnlock() + for _, peer := range srv.peers { + if peer != nil { + var msg = Msg{Code: code} + if data != nil { + msg.Payload = bytes.NewReader(payload) + msg.Size = uint32(len(payload)) + } + peer.writeProtoMsg(protocol, msg) + } + } +} + +// Start starts running the server. +// Servers can be re-used and started again after stopping. +func (srv *Server) Start() (err error) { + srv.lock.Lock() + defer srv.lock.Unlock() + if srv.running { + return errors.New("server already running") + } + srvlog.Infoln("Starting Server") + + // initialize fields + if srv.Identity == nil { + return fmt.Errorf("Server.Identity must be set to a non-nil identity") + } + if srv.MaxPeers <= 0 { + return fmt.Errorf("Server.MaxPeers must be > 0") + } + srv.quit = make(chan struct{}) + srv.peers = make([]*Peer, srv.MaxPeers) + srv.peerSlots = make(chan int, srv.MaxPeers) + srv.peerConnect = make(chan *peerAddr, outboundAddressPoolSize) + srv.peerDisconnect = make(chan *Peer) + if srv.newPeerFunc == nil { + srv.newPeerFunc = newServerPeer + } + if srv.Blacklist == nil { + srv.Blacklist = NewBlacklist() + } + if srv.Dialer == nil { + srv.Dialer = &net.Dialer{Timeout: defaultDialTimeout} + } + + if srv.ListenAddr != "" { + if err := srv.startListening(); err != nil { + return err + } + } + if !srv.NoDial { + srv.wg.Add(1) + go srv.dialLoop() + } + if srv.NoDial && srv.ListenAddr == "" { + srvlog.Warnln("I will be kind-of useless, neither dialing nor listening.") + } + + // make all slots available + for i := range srv.peers { + srv.peerSlots <- i + } + // note: discLoop is not part of WaitGroup + go srv.discLoop() + srv.running = true + return nil +} + +func (srv *Server) startListening() error { + listener, err := net.Listen("tcp", srv.ListenAddr) + if err != nil { + return err + } + srv.ListenAddr = listener.Addr().String() + srv.laddr = listener.Addr().(*net.TCPAddr) + srv.listener = listener + srv.wg.Add(1) + go srv.listenLoop() + if !srv.laddr.IP.IsLoopback() && srv.NAT != nil { + srv.wg.Add(1) + go srv.natLoop(srv.laddr.Port) + } + return nil +} + +// Stop terminates the server and all active peer connections. +// It blocks until all active connections have been closed. +func (srv *Server) Stop() { + srv.lock.Lock() + if !srv.running { + srv.lock.Unlock() + return + } + srv.running = false + srv.lock.Unlock() + + srvlog.Infoln("Stopping server") + if srv.listener != nil { + // this unblocks listener Accept + srv.listener.Close() + } + close(srv.quit) + for _, peer := range srv.Peers() { + peer.Disconnect(DiscQuitting) + } + srv.wg.Wait() + + // wait till they actually disconnect + // this is checked by claiming all peerSlots. + // slots become available as the peers disconnect. + for i := 0; i < cap(srv.peerSlots); i++ { + <-srv.peerSlots + } + // terminate discLoop + close(srv.peerDisconnect) +} + +func (srv *Server) discLoop() { + for peer := range srv.peerDisconnect { + // peer has just disconnected. free up its slot. + srvlog.Infof("%v is gone", peer) + srv.peerSlots <- peer.slot + srv.lock.Lock() + srv.peers[peer.slot] = nil + srv.lock.Unlock() + } +} + +// main loop for adding connections via listening +func (srv *Server) listenLoop() { + defer srv.wg.Done() + + srvlog.Infoln("Listening on", srv.listener.Addr()) + for { + select { + case slot := <-srv.peerSlots: + conn, err := srv.listener.Accept() + if err != nil { + srv.peerSlots <- slot + return + } + srvlog.Debugf("Accepted conn %v (slot %d)\n", conn.RemoteAddr(), slot) + srv.addPeer(conn, nil, slot) + case <-srv.quit: + return + } + } +} + +func (srv *Server) natLoop(port int) { + defer srv.wg.Done() + for { + srv.updatePortMapping(port) + select { + case <-time.After(portMappingUpdateInterval): + // one more round + case <-srv.quit: + srv.removePortMapping(port) + return + } + } +} + +func (srv *Server) updatePortMapping(port int) { + srvlog.Infoln("Attempting to map port", port, "with", srv.NAT) + err := srv.NAT.AddPortMapping("tcp", port, port, "ethereum p2p", portMappingTimeout) + if err != nil { + srvlog.Errorln("Port mapping error:", err) + return + } + extip, err := srv.NAT.GetExternalAddress() + if err != nil { + srvlog.Errorln("Error getting external IP:", err) + return + } + srv.lock.Lock() + extaddr := *(srv.listener.Addr().(*net.TCPAddr)) + extaddr.IP = extip + srvlog.Infoln("Mapped port, external addr is", &extaddr) + srv.laddr = &extaddr + srv.lock.Unlock() +} + +func (srv *Server) removePortMapping(port int) { + srvlog.Infoln("Removing port mapping for", port, "with", srv.NAT) + srv.NAT.DeletePortMapping("tcp", port, port) +} + +func (srv *Server) dialLoop() { + defer srv.wg.Done() + var ( + suggest chan *peerAddr + slot *int + slots = srv.peerSlots + ) + for { + select { + case i := <-slots: + // we need a peer in slot i, slot reserved + slot = &i + // now we can watch for candidate peers in the next loop + suggest = srv.peerConnect + // do not consume more until candidate peer is found + slots = nil + + case desc := <-suggest: + // candidate peer found, will dial out asyncronously + // if connection fails slot will be released + go srv.dialPeer(desc, *slot) + // we can watch if more peers needed in the next loop + slots = srv.peerSlots + // until then we dont care about candidate peers + suggest = nil + + case <-srv.quit: + // give back the currently reserved slot + if slot != nil { + srv.peerSlots <- *slot + } + return + } + } +} + +// connect to peer via dial out +func (srv *Server) dialPeer(desc *peerAddr, slot int) { + srvlog.Debugf("Dialing %v (slot %d)\n", desc, slot) + conn, err := srv.Dialer.Dial(desc.Network(), desc.String()) + if err != nil { + srvlog.Errorf("Dial error: %v", err) + srv.peerSlots <- slot + return + } + go srv.addPeer(conn, desc, slot) +} + +// creates the new peer object and inserts it into its slot +func (srv *Server) addPeer(conn net.Conn, desc *peerAddr, slot int) *Peer { + srv.lock.Lock() + defer srv.lock.Unlock() + if !srv.running { + conn.Close() + srv.peerSlots <- slot // release slot + return nil + } + peer := srv.newPeerFunc(srv, conn, desc) + peer.slot = slot + srv.peers[slot] = peer + srv.peerCount++ + go func() { peer.loop(); srv.peerDisconnect <- peer }() + return peer +} + +// removes peer: sending disconnect msg, stop peer, remove rom list/table, release slot +func (srv *Server) removePeer(peer *Peer) { + srv.lock.Lock() + defer srv.lock.Unlock() + srvlog.Debugf("Removing peer %v %v (slot %v)\n", peer, peer.slot) + if srv.peers[peer.slot] != peer { + srvlog.Warnln("Invalid peer to remove:", peer) + return + } + // remove from list and index + srv.peerCount-- + srv.peers[peer.slot] = nil + // release slot to signal need for a new peer, last! + srv.peerSlots <- peer.slot +} + +func (srv *Server) verifyPeer(addr *peerAddr) error { + if srv.Blacklist.Exists(addr.Pubkey) { + return errors.New("blacklisted") + } + if bytes.Equal(srv.Identity.Pubkey()[1:], addr.Pubkey) { + return newPeerError(errPubkeyForbidden, "not allowed to connect to srv") + } + srv.lock.RLock() + defer srv.lock.RUnlock() + for _, peer := range srv.peers { + if peer != nil { + id := peer.Identity() + if id != nil && bytes.Equal(id.Pubkey(), addr.Pubkey) { + return errors.New("already connected") + } + } + } + return nil +} + +type Blacklist interface { + Get([]byte) (bool, error) + Put([]byte) error + Delete([]byte) error + Exists(pubkey []byte) (ok bool) +} + +type BlacklistMap struct { + blacklist map[string]bool + lock sync.RWMutex +} + +func NewBlacklist() *BlacklistMap { + return &BlacklistMap{ + blacklist: make(map[string]bool), + } +} + +func (self *BlacklistMap) Get(pubkey []byte) (bool, error) { + self.lock.RLock() + defer self.lock.RUnlock() + v, ok := self.blacklist[string(pubkey)] + var err error + if !ok { + err = fmt.Errorf("not found") + } + return v, err +} + +func (self *BlacklistMap) Exists(pubkey []byte) (ok bool) { + self.lock.RLock() + defer self.lock.RUnlock() + _, ok = self.blacklist[string(pubkey)] + return +} + +func (self *BlacklistMap) Put(pubkey []byte) error { + self.lock.RLock() + defer self.lock.RUnlock() + self.blacklist[string(pubkey)] = true + return nil +} + +func (self *BlacklistMap) Delete(pubkey []byte) error { + self.lock.RLock() + defer self.lock.RUnlock() + delete(self.blacklist, string(pubkey)) + return nil +} diff --git a/p2p/server_test.go b/p2p/server_test.go new file mode 100644 index 000000000..5c0d08d39 --- /dev/null +++ b/p2p/server_test.go @@ -0,0 +1,161 @@ +package p2p + +import ( + "bytes" + "io" + "net" + "sync" + "testing" + "time" +) + +func startTestServer(t *testing.T, pf peerFunc) *Server { + server := &Server{ + Identity: NewSimpleClientIdentity("clientIdentifier", "version", "customIdentifier", "pubkey"), + MaxPeers: 10, + ListenAddr: "127.0.0.1:0", + newPeerFunc: pf, + } + if err := server.Start(); err != nil { + t.Fatalf("Could not start server: %v", err) + } + return server +} + +func TestServerListen(t *testing.T) { + defer testlog(t).detach() + + // start the test server + connected := make(chan *Peer) + srv := startTestServer(t, func(srv *Server, conn net.Conn, dialAddr *peerAddr) *Peer { + if conn == nil { + t.Error("peer func called with nil conn") + } + if dialAddr != nil { + t.Error("peer func called with non-nil dialAddr") + } + peer := newPeer(conn, nil, dialAddr) + connected <- peer + return peer + }) + defer close(connected) + defer srv.Stop() + + // dial the test server + conn, err := net.DialTimeout("tcp", srv.ListenAddr, 5*time.Second) + if err != nil { + t.Fatalf("could not dial: %v", err) + } + defer conn.Close() + + select { + case peer := <-connected: + if peer.conn.LocalAddr().String() != conn.RemoteAddr().String() { + t.Errorf("peer started with wrong conn: got %v, want %v", + peer.conn.LocalAddr(), conn.RemoteAddr()) + } + case <-time.After(1 * time.Second): + t.Error("server did not accept within one second") + } +} + +func TestServerDial(t *testing.T) { + defer testlog(t).detach() + + // run a fake TCP server to handle the connection. + listener, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatalf("could not setup listener: %v") + } + defer listener.Close() + accepted := make(chan net.Conn) + go func() { + conn, err := listener.Accept() + if err != nil { + t.Error("acccept error:", err) + } + conn.Close() + accepted <- conn + }() + + // start the test server + connected := make(chan *Peer) + srv := startTestServer(t, func(srv *Server, conn net.Conn, dialAddr *peerAddr) *Peer { + if conn == nil { + t.Error("peer func called with nil conn") + } + peer := newPeer(conn, nil, dialAddr) + connected <- peer + return peer + }) + defer close(connected) + defer srv.Stop() + + // tell the server to connect. + connAddr := newPeerAddr(listener.Addr(), nil) + srv.peerConnect <- connAddr + + select { + case conn := <-accepted: + select { + case peer := <-connected: + if peer.conn.RemoteAddr().String() != conn.LocalAddr().String() { + t.Errorf("peer started with wrong conn: got %v, want %v", + peer.conn.RemoteAddr(), conn.LocalAddr()) + } + if peer.dialAddr != connAddr { + t.Errorf("peer started with wrong dialAddr: got %v, want %v", + peer.dialAddr, connAddr) + } + case <-time.After(1 * time.Second): + t.Error("server did not launch peer within one second") + } + + case <-time.After(1 * time.Second): + t.Error("server did not connect within one second") + } +} + +func TestServerBroadcast(t *testing.T) { + defer testlog(t).detach() + var connected sync.WaitGroup + srv := startTestServer(t, func(srv *Server, c net.Conn, dialAddr *peerAddr) *Peer { + peer := newPeer(c, []Protocol{discard}, dialAddr) + peer.startSubprotocols([]Cap{discard.cap()}) + connected.Done() + return peer + }) + defer srv.Stop() + + // dial a bunch of conns + var conns = make([]net.Conn, 8) + connected.Add(len(conns)) + deadline := time.Now().Add(3 * time.Second) + dialer := &net.Dialer{Deadline: deadline} + for i := range conns { + conn, err := dialer.Dial("tcp", srv.ListenAddr) + if err != nil { + t.Fatalf("conn %d: dial error: %v", i, err) + } + defer conn.Close() + conn.SetDeadline(deadline) + conns[i] = conn + } + connected.Wait() + + // broadcast one message + srv.Broadcast("discard", 0, "foo") + goldbuf := new(bytes.Buffer) + writeMsg(goldbuf, NewMsg(16, "foo")) + golden := goldbuf.Bytes() + + // check that the message has been written everywhere + for i, conn := range conns { + buf := make([]byte, len(golden)) + if _, err := io.ReadFull(conn, buf); err != nil { + t.Errorf("conn %d: read error: %v", i, err) + } else if !bytes.Equal(buf, golden) { + t.Errorf("conn %d: msg mismatch\ngot: %x\nwant: %x", i, buf, golden) + } + } +} diff --git a/p2p/testlog_test.go b/p2p/testlog_test.go new file mode 100644 index 000000000..951d43243 --- /dev/null +++ b/p2p/testlog_test.go @@ -0,0 +1,28 @@ +package p2p + +import ( + "testing" + + "github.com/ethereum/go-ethereum/logger" +) + +type testLogger struct{ t *testing.T } + +func testlog(t *testing.T) testLogger { + logger.Reset() + l := testLogger{t} + logger.AddLogSystem(l) + return l +} + +func (testLogger) GetLogLevel() logger.LogLevel { return logger.DebugLevel } +func (testLogger) SetLogLevel(logger.LogLevel) {} + +func (l testLogger) LogPrint(level logger.LogLevel, msg string) { + l.t.Logf("%s", msg) +} + +func (testLogger) detach() { + logger.Flush() + logger.Reset() +} diff --git a/p2p/testpoc7.go b/p2p/testpoc7.go new file mode 100644 index 000000000..c0cc5c544 --- /dev/null +++ b/p2p/testpoc7.go @@ -0,0 +1,40 @@ +// +build none + +package main + +import ( + "fmt" + "log" + "net" + "os" + + "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/p2p" + "github.com/obscuren/secp256k1-go" +) + +func main() { + logger.AddLogSystem(logger.NewStdLogSystem(os.Stdout, log.LstdFlags, logger.DebugLevel)) + + pub, _ := secp256k1.GenerateKeyPair() + srv := p2p.Server{ + MaxPeers: 10, + Identity: p2p.NewSimpleClientIdentity("test", "1.0", "", string(pub)), + ListenAddr: ":30303", + NAT: p2p.PMP(net.ParseIP("10.0.0.1")), + } + if err := srv.Start(); err != nil { + fmt.Println("could not start server:", err) + os.Exit(1) + } + + // add seed peers + seed, err := net.ResolveTCPAddr("tcp", "poc-7.ethdev.com:30303") + if err != nil { + fmt.Println("couldn't resolve:", err) + os.Exit(1) + } + srv.SuggestPeer(seed.IP, seed.Port, nil) + + select {} +} diff --git a/peer.go b/peer.go new file mode 100644 index 000000000..13f0239d4 --- /dev/null +++ b/peer.go @@ -0,0 +1,881 @@ +package eth + +import ( + "bytes" + "container/list" + "fmt" + "math" + "math/big" + "net" + "strconv" + "strings" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/wire" +) + +var peerlogger = logger.NewLogger("PEER") + +const ( + // The size of the output buffer for writing messages + outputBufferSize = 50 + // Current protocol version + ProtocolVersion = 49 + // Current P2P version + P2PVersion = 2 + // Ethereum network version + NetVersion = 0 + // Interval for ping/pong message + pingPongTimer = 2 * time.Second +) + +type DiscReason byte + +const ( + // Values are given explicitly instead of by iota because these values are + // defined by the wire protocol spec; it is easier for humans to ensure + // correctness when values are explicit. + DiscRequested DiscReason = iota + DiscReTcpSysErr + DiscBadProto + DiscBadPeer + DiscTooManyPeers + DiscConnDup + DiscGenesisErr + DiscProtoErr + DiscQuitting +) + +var discReasonToString = []string{ + "requested", + "TCP sys error", + "bad protocol", + "useless peer", + "too many peers", + "already connected", + "wrong genesis block", + "incompatible network", + "quitting", +} + +func (d DiscReason) String() string { + if len(discReasonToString) < int(d) { + return "Unknown" + } + + return discReasonToString[d] +} + +// Peer capabilities +type Caps byte + +const ( + CapPeerDiscTy Caps = 1 << iota + CapTxTy + CapChainTy + + CapDefault = CapChainTy | CapTxTy | CapPeerDiscTy +) + +var capsToString = map[Caps]string{ + CapPeerDiscTy: "Peer discovery", + CapTxTy: "Transaction relaying", + CapChainTy: "Block chain relaying", +} + +func (c Caps) IsCap(cap Caps) bool { + return c&cap > 0 +} + +func (c Caps) String() string { + var caps []string + if c.IsCap(CapPeerDiscTy) { + caps = append(caps, capsToString[CapPeerDiscTy]) + } + if c.IsCap(CapChainTy) { + caps = append(caps, capsToString[CapChainTy]) + } + if c.IsCap(CapTxTy) { + caps = append(caps, capsToString[CapTxTy]) + } + + return strings.Join(caps, " | ") +} + +type Peer struct { + // Ethereum interface + ethereum *Ethereum + // Net connection + conn net.Conn + // Output queue which is used to communicate and handle messages + outputQueue chan *wire.Msg + // Quit channel + quit chan bool + // Determines whether it's an inbound or outbound peer + inbound bool + // Flag for checking the peer's connectivity state + connected int32 + disconnect int32 + // Last known message send + lastSend time.Time + // Indicated whether a verack has been send or not + // This flag is used by writeMessage to check if messages are allowed + // to be send or not. If no version is known all messages are ignored. + versionKnown bool + statusKnown bool + + // Last received pong message + lastPong int64 + lastBlockReceived time.Time + doneFetchingHashes bool + lastHashAt time.Time + lastHashRequestedAt time.Time + + host []byte + port uint16 + caps Caps + td *big.Int + bestHash []byte + lastReceivedHash []byte + requestedHashes [][]byte + + // This peer's public key + pubkey []byte + + // Indicated whether the node is catching up or not + catchingUp bool + diverted bool + blocksRequested int + + version string + + // We use this to give some kind of pingtime to a node, not very accurate, could be improved. + pingTime time.Duration + pingStartTime time.Time + + lastRequestedBlock *types.Block + + protocolCaps *ethutil.Value +} + +func NewPeer(conn net.Conn, ethereum *Ethereum, inbound bool) *Peer { + pubkey := ethereum.KeyManager().PublicKey()[1:] + + return &Peer{ + outputQueue: make(chan *wire.Msg, outputBufferSize), + quit: make(chan bool), + ethereum: ethereum, + conn: conn, + inbound: inbound, + disconnect: 0, + connected: 1, + port: 30303, + pubkey: pubkey, + blocksRequested: 10, + caps: ethereum.ServerCaps(), + version: ethereum.ClientIdentity().String(), + protocolCaps: ethutil.NewValue(nil), + td: big.NewInt(0), + doneFetchingHashes: true, + } +} + +func NewOutboundPeer(addr string, ethereum *Ethereum, caps Caps) *Peer { + p := &Peer{ + outputQueue: make(chan *wire.Msg, outputBufferSize), + quit: make(chan bool), + ethereum: ethereum, + inbound: false, + connected: 0, + disconnect: 0, + port: 30303, + caps: caps, + version: ethereum.ClientIdentity().String(), + protocolCaps: ethutil.NewValue(nil), + td: big.NewInt(0), + doneFetchingHashes: true, + } + + // Set up the connection in another goroutine so we don't block the main thread + go func() { + conn, err := p.Connect(addr) + if err != nil { + //peerlogger.Debugln("Connection to peer failed. Giving up.", err) + p.Stop() + return + } + p.conn = conn + + // Atomically set the connection state + atomic.StoreInt32(&p.connected, 1) + atomic.StoreInt32(&p.disconnect, 0) + + p.Start() + }() + + return p +} + +func (self *Peer) Connect(addr string) (conn net.Conn, err error) { + const maxTries = 3 + for attempts := 0; attempts < maxTries; attempts++ { + conn, err = net.DialTimeout("tcp", addr, 10*time.Second) + if err != nil { + time.Sleep(time.Duration(attempts*20) * time.Second) + continue + } + + // Success + return + } + + return +} + +// Getters +func (p *Peer) PingTime() string { + return p.pingTime.String() +} +func (p *Peer) Inbound() bool { + return p.inbound +} +func (p *Peer) LastSend() time.Time { + return p.lastSend +} +func (p *Peer) LastPong() int64 { + return p.lastPong +} +func (p *Peer) Host() []byte { + return p.host +} +func (p *Peer) Port() uint16 { + return p.port +} +func (p *Peer) Version() string { + return p.version +} +func (p *Peer) Connected() *int32 { + return &p.connected +} + +// Setters +func (p *Peer) SetVersion(version string) { + p.version = version +} + +// Outputs any RLP encoded data to the peer +func (p *Peer) QueueMessage(msg *wire.Msg) { + if atomic.LoadInt32(&p.connected) != 1 { + return + } + p.outputQueue <- msg +} + +func (p *Peer) writeMessage(msg *wire.Msg) { + // Ignore the write if we're not connected + if atomic.LoadInt32(&p.connected) != 1 { + return + } + + if !p.versionKnown { + switch msg.Type { + case wire.MsgHandshakeTy: // Ok + default: // Anything but ack is allowed + return + } + } else { + /* + if !p.statusKnown { + switch msg.Type { + case wire.MsgStatusTy: // Ok + default: // Anything but ack is allowed + return + } + } + */ + } + + peerlogger.DebugDetailf("(%v) <= %v\n", p.conn.RemoteAddr(), formatMessage(msg)) + + err := wire.WriteMessage(p.conn, msg) + if err != nil { + peerlogger.Debugln(" Can't send message:", err) + // Stop the client if there was an error writing to it + p.Stop() + return + } +} + +// Outbound message handler. Outbound messages are handled here +func (p *Peer) HandleOutbound() { + // The ping timer. Makes sure that every 2 minutes a ping is send to the peer + pingTimer := time.NewTicker(pingPongTimer) + serviceTimer := time.NewTicker(10 * time.Second) + +out: + for { + skip: + select { + // Main message queue. All outbound messages are processed through here + case msg := <-p.outputQueue: + if !p.statusKnown { + switch msg.Type { + case wire.MsgTxTy, wire.MsgGetBlockHashesTy, wire.MsgBlockHashesTy, wire.MsgGetBlocksTy, wire.MsgBlockTy: + break skip + } + } + + switch msg.Type { + case wire.MsgGetBlockHashesTy: + p.lastHashRequestedAt = time.Now() + } + + p.writeMessage(msg) + p.lastSend = time.Now() + + // Ping timer + case <-pingTimer.C: + p.writeMessage(wire.NewMessage(wire.MsgPingTy, "")) + p.pingStartTime = time.Now() + + // Service timer takes care of peer broadcasting, transaction + // posting or block posting + case <-serviceTimer.C: + p.QueueMessage(wire.NewMessage(wire.MsgGetPeersTy, "")) + + case <-p.quit: + // Break out of the for loop if a quit message is posted + break out + } + } + +clean: + // This loop is for draining the output queue and anybody waiting for us + for { + select { + case <-p.outputQueue: + // TODO + default: + break clean + } + } +} + +func formatMessage(msg *wire.Msg) (ret string) { + ret = fmt.Sprintf("%v %v", msg.Type, msg.Data) + + /* + XXX Commented out because I need the log level here to determine + if i should or shouldn't generate this message + */ + /* + switch msg.Type { + case wire.MsgPeersTy: + ret += fmt.Sprintf("(%d entries)", msg.Data.Len()) + case wire.MsgBlockTy: + b1, b2 := chain.NewBlockFromRlpValue(msg.Data.Get(0)), ethchain.NewBlockFromRlpValue(msg.Data.Get(msg.Data.Len()-1)) + ret += fmt.Sprintf("(%d entries) %x - %x", msg.Data.Len(), b1.Hash()[0:4], b2.Hash()[0:4]) + case wire.MsgBlockHashesTy: + h1, h2 := msg.Data.Get(0).Bytes(), msg.Data.Get(msg.Data.Len()-1).Bytes() + ret += fmt.Sprintf("(%d entries) %x - %x", msg.Data.Len(), h1, h2) + } + */ + + return +} + +// Inbound handler. Inbound messages are received here and passed to the appropriate methods +func (p *Peer) HandleInbound() { + for atomic.LoadInt32(&p.disconnect) == 0 { + + // HMM? + time.Sleep(50 * time.Millisecond) + // Wait for a message from the peer + msgs, err := wire.ReadMessages(p.conn) + if err != nil { + peerlogger.Debugln(err) + } + for _, msg := range msgs { + peerlogger.DebugDetailf("(%v) => %v\n", p.conn.RemoteAddr(), formatMessage(msg)) + + switch msg.Type { + case wire.MsgHandshakeTy: + // Version message + p.handleHandshake(msg) + + //if p.caps.IsCap(CapPeerDiscTy) { + p.QueueMessage(wire.NewMessage(wire.MsgGetPeersTy, "")) + //} + + case wire.MsgDiscTy: + p.Stop() + peerlogger.Infoln("Disconnect peer: ", DiscReason(msg.Data.Get(0).Uint())) + case wire.MsgPingTy: + // Respond back with pong + p.QueueMessage(wire.NewMessage(wire.MsgPongTy, "")) + case wire.MsgPongTy: + // If we received a pong back from a peer we set the + // last pong so the peer handler knows this peer is still + // active. + p.lastPong = time.Now().Unix() + p.pingTime = time.Since(p.pingStartTime) + case wire.MsgTxTy: + // If the message was a transaction queue the transaction + // 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 := types.NewTransactionFromValue(msg.Data.Get(i)) + err := p.ethereum.TxPool().Add(tx) + if err != nil { + peerlogger.Infoln(err) + } else { + peerlogger.Infof("tx OK (%x)\n", tx.Hash()[0:4]) + } + } + case wire.MsgGetPeersTy: + // Peer asked for list of connected peers + //p.pushPeers() + case wire.MsgPeersTy: + // Received a list of peers (probably because MsgGetPeersTy was send) + data := msg.Data + // Create new list of possible peers for the ethereum to process + peers := make([]string, data.Len()) + // Parse each possible peer + for i := 0; i < data.Len(); i++ { + value := data.Get(i) + peers[i] = unpackAddr(value.Get(0), value.Get(1).Uint()) + } + + // Connect to the list of peers + p.ethereum.ProcessPeerList(peers) + + case wire.MsgStatusTy: + // Handle peer's status msg + p.handleStatus(msg) + } + + // TMP + if p.statusKnown { + switch msg.Type { + + case wire.MsgGetBlockHashesTy: + if msg.Data.Len() < 2 { + peerlogger.Debugln("err: argument length invalid ", msg.Data.Len()) + } + + hash := msg.Data.Get(0).Bytes() + amount := msg.Data.Get(1).Uint() + + hashes := p.ethereum.ChainManager().GetChainHashesFromHash(hash, amount) + + p.QueueMessage(wire.NewMessage(wire.MsgBlockHashesTy, ethutil.ByteSliceToInterface(hashes))) + + case wire.MsgGetBlocksTy: + // Limit to max 300 blocks + max := int(math.Min(float64(msg.Data.Len()), 300.0)) + var blocks []interface{} + + for i := 0; i < max; i++ { + hash := msg.Data.Get(i).Bytes() + block := p.ethereum.ChainManager().GetBlock(hash) + if block != nil { + blocks = append(blocks, block.Value().Raw()) + } + } + + p.QueueMessage(wire.NewMessage(wire.MsgBlockTy, blocks)) + + case wire.MsgBlockHashesTy: + p.catchingUp = true + + blockPool := p.ethereum.blockPool + + foundCommonHash := false + p.lastHashAt = time.Now() + + it := msg.Data.NewIterator() + for it.Next() { + hash := it.Value().Bytes() + p.lastReceivedHash = hash + + if blockPool.HasCommonHash(hash) { + foundCommonHash = true + + break + } + + blockPool.AddHash(hash, p) + } + + if !foundCommonHash { + p.FetchHashes() + } else { + peerlogger.Infof("Found common hash (%x...)\n", p.lastReceivedHash[0:4]) + p.doneFetchingHashes = true + } + + case wire.MsgBlockTy: + p.catchingUp = true + + blockPool := p.ethereum.blockPool + + it := msg.Data.NewIterator() + for it.Next() { + block := types.NewBlockFromRlpValue(it.Value()) + blockPool.Add(block, p) + + p.lastBlockReceived = time.Now() + } + case wire.MsgNewBlockTy: + var ( + blockPool = p.ethereum.blockPool + block = types.NewBlockFromRlpValue(msg.Data.Get(0)) + td = msg.Data.Get(1).BigInt() + ) + + if td.Cmp(blockPool.td) > 0 { + p.ethereum.blockPool.AddNew(block, p) + } + } + + } + } + } + + p.Stop() +} + +func (self *Peer) FetchBlocks(hashes [][]byte) { + if len(hashes) > 0 { + peerlogger.Debugf("Fetching blocks (%d)\n", len(hashes)) + + self.QueueMessage(wire.NewMessage(wire.MsgGetBlocksTy, ethutil.ByteSliceToInterface(hashes))) + } +} + +func (self *Peer) FetchHashes() bool { + blockPool := self.ethereum.blockPool + + return blockPool.FetchHashes(self) +} + +func (self *Peer) FetchingHashes() bool { + return !self.doneFetchingHashes +} + +// General update method +func (self *Peer) update() { + serviceTimer := time.NewTicker(100 * time.Millisecond) + +out: + for { + select { + case <-serviceTimer.C: + if self.IsCap("eth") { + var ( + sinceBlock = time.Since(self.lastBlockReceived) + ) + + if sinceBlock > 5*time.Second { + self.catchingUp = false + } + } + case <-self.quit: + break out + } + } + + serviceTimer.Stop() +} + +func (p *Peer) Start() { + peerHost, peerPort, _ := net.SplitHostPort(p.conn.LocalAddr().String()) + servHost, servPort, _ := net.SplitHostPort(p.conn.RemoteAddr().String()) + + if p.inbound { + p.host, p.port = packAddr(peerHost, peerPort) + } else { + p.host, p.port = packAddr(servHost, servPort) + } + + err := p.pushHandshake() + if err != nil { + peerlogger.Debugln("Peer can't send outbound version ack", err) + + p.Stop() + + return + } + + go p.HandleOutbound() + // Run the inbound handler in a new goroutine + go p.HandleInbound() + // Run the general update handler + go p.update() + + // Wait a few seconds for startup and then ask for an initial ping + time.Sleep(2 * time.Second) + p.writeMessage(wire.NewMessage(wire.MsgPingTy, "")) + p.pingStartTime = time.Now() + +} + +func (p *Peer) Stop() { + p.StopWithReason(DiscRequested) +} + +func (p *Peer) StopWithReason(reason DiscReason) { + if atomic.AddInt32(&p.disconnect, 1) != 1 { + return + } + + // Pre-emptively remove the peer; don't wait for reaping. We already know it's dead if we are here + p.ethereum.RemovePeer(p) + + close(p.quit) + if atomic.LoadInt32(&p.connected) != 0 { + p.writeMessage(wire.NewMessage(wire.MsgDiscTy, reason)) + p.conn.Close() + } +} + +func (p *Peer) peersMessage() *wire.Msg { + outPeers := make([]interface{}, len(p.ethereum.InOutPeers())) + // Serialise each peer + for i, peer := range p.ethereum.InOutPeers() { + // Don't return localhost as valid peer + if !net.ParseIP(peer.conn.RemoteAddr().String()).IsLoopback() { + outPeers[i] = peer.RlpData() + } + } + + // Return the message to the peer with the known list of connected clients + return wire.NewMessage(wire.MsgPeersTy, outPeers) +} + +// Pushes the list of outbound peers to the client when requested +func (p *Peer) pushPeers() { + p.QueueMessage(p.peersMessage()) +} + +func (self *Peer) pushStatus() { + msg := wire.NewMessage(wire.MsgStatusTy, []interface{}{ + uint32(ProtocolVersion), + uint32(NetVersion), + self.ethereum.ChainManager().Td(), + self.ethereum.ChainManager().CurrentBlock().Hash(), + self.ethereum.ChainManager().Genesis().Hash(), + }) + + self.QueueMessage(msg) +} + +func (self *Peer) handleStatus(msg *wire.Msg) { + c := msg.Data + + var ( + //protoVersion = c.Get(0).Uint() + netVersion = c.Get(1).Uint() + td = c.Get(2).BigInt() + bestHash = c.Get(3).Bytes() + genesis = c.Get(4).Bytes() + ) + + if bytes.Compare(self.ethereum.ChainManager().Genesis().Hash(), genesis) != 0 { + loggerger.Warnf("Invalid genisis hash %x. Disabling [eth]\n", genesis) + return + } + + if netVersion != NetVersion { + loggerger.Warnf("Invalid network version %d. Disabling [eth]\n", netVersion) + return + } + + /* + if protoVersion != ProtocolVersion { + loggerger.Warnf("Invalid protocol version %d. Disabling [eth]\n", protoVersion) + return + } + */ + + // Get the td and last hash + self.td = td + self.bestHash = bestHash + self.lastReceivedHash = bestHash + + self.statusKnown = true + + // Compare the total TD with the blockchain TD. If remote is higher + // fetch hashes from highest TD node. + self.FetchHashes() + + loggerger.Infof("Peer is [eth] capable. (TD = %v ~ %x)", self.td, self.bestHash) + +} + +func (p *Peer) pushHandshake() error { + pubkey := p.ethereum.KeyManager().PublicKey() + msg := wire.NewMessage(wire.MsgHandshakeTy, []interface{}{ + P2PVersion, []byte(p.version), []interface{}{[]interface{}{"eth", ProtocolVersion}}, p.port, pubkey[1:], + }) + + p.QueueMessage(msg) + + return nil +} + +func (p *Peer) handleHandshake(msg *wire.Msg) { + c := msg.Data + + var ( + p2pVersion = c.Get(0).Uint() + clientId = c.Get(1).Str() + caps = c.Get(2) + port = c.Get(3).Uint() + pub = c.Get(4).Bytes() + ) + + // Check correctness of p2p protocol version + if p2pVersion != P2PVersion { + peerlogger.Debugf("Invalid P2P version. Require protocol %d, received %d\n", P2PVersion, p2pVersion) + p.Stop() + return + } + + // Handle the pub key (validation, uniqueness) + if len(pub) == 0 { + peerlogger.Warnln("Pubkey required, not supplied in handshake.") + p.Stop() + return + } + + // Self connect detection + pubkey := p.ethereum.KeyManager().PublicKey() + if bytes.Compare(pubkey[1:], pub) == 0 { + p.Stop() + + return + } + + // Check for blacklisting + for _, pk := range p.ethereum.blacklist { + if bytes.Compare(pk, pub) == 0 { + peerlogger.Debugf("Blacklisted peer tried to connect (%x...)\n", pubkey[0:4]) + p.StopWithReason(DiscBadPeer) + + return + } + } + + usedPub := 0 + // This peer is already added to the peerlist so we expect to find a double pubkey at least once + eachPeer(p.ethereum.Peers(), func(peer *Peer, e *list.Element) { + if bytes.Compare(pub, peer.pubkey) == 0 { + usedPub++ + } + }) + + if usedPub > 0 { + peerlogger.Debugf("Pubkey %x found more then once. Already connected to client.", p.pubkey) + p.Stop() + return + } + p.pubkey = pub + + // If this is an inbound connection send an ack back + if p.inbound { + p.port = uint16(port) + } + + p.SetVersion(clientId) + + p.versionKnown = true + + p.ethereum.PushPeer(p) + p.ethereum.eventMux.Post(PeerListEvent{p.ethereum.Peers()}) + + p.protocolCaps = caps + + it := caps.NewIterator() + var capsStrs []string + for it.Next() { + cap := it.Value().Get(0).Str() + ver := it.Value().Get(1).Uint() + switch cap { + case "eth": + if ver != ProtocolVersion { + loggerger.Warnf("Invalid protocol version %d. Disabling [eth]\n", ver) + continue + } + p.pushStatus() + } + + capsStrs = append(capsStrs, fmt.Sprintf("%s/%d", cap, ver)) + } + + peerlogger.Infof("Added peer (%s) %d / %d (%v)\n", p.conn.RemoteAddr(), p.ethereum.Peers().Len(), p.ethereum.MaxPeers, capsStrs) + + peerlogger.Debugln(p) +} + +func (self *Peer) IsCap(cap string) bool { + capsIt := self.protocolCaps.NewIterator() + for capsIt.Next() { + if capsIt.Value().Str() == cap { + return true + } + } + + return false +} + +func (self *Peer) Caps() *ethutil.Value { + return self.protocolCaps +} + +func (p *Peer) String() string { + var strBoundType string + if p.inbound { + strBoundType = "inbound" + } else { + strBoundType = "outbound" + } + var strConnectType string + if atomic.LoadInt32(&p.disconnect) == 0 { + strConnectType = "connected" + } else { + strConnectType = "disconnected" + } + + return fmt.Sprintf("[%s] (%s) %v %s", strConnectType, strBoundType, p.conn.RemoteAddr(), p.version) + +} + +func (p *Peer) RlpData() []interface{} { + return []interface{}{p.host, p.port, p.pubkey} +} + +func packAddr(address, _port string) (host []byte, port uint16) { + p, _ := strconv.Atoi(_port) + port = uint16(p) + + h := net.ParseIP(address) + if ip := h.To4(); ip != nil { + host = []byte(ip) + } else { + host = []byte(h) + } + + return +} + +func unpackAddr(value *ethutil.Value, p uint64) string { + host, _ := net.IP(value.Bytes()).MarshalText() + prt := strconv.Itoa(int(p)) + + return net.JoinHostPort(string(host), prt) +} diff --git a/pow/ar/block.go b/pow/ar/block.go new file mode 100644 index 000000000..2124b53b4 --- /dev/null +++ b/pow/ar/block.go @@ -0,0 +1,12 @@ +package ar + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/trie" +) + +type Block interface { + Trie() *trie.Trie + Diff() *big.Int +} diff --git a/pow/ar/ops.go b/pow/ar/ops.go new file mode 100644 index 000000000..3a099be08 --- /dev/null +++ b/pow/ar/ops.go @@ -0,0 +1,54 @@ +package ar + +import "math/big" + +const lenops int64 = 9 + +type OpsFunc func(a, b *big.Int) *big.Int + +var ops [lenops]OpsFunc + +func init() { + ops[0] = Add + ops[1] = Mul + ops[2] = Mod + ops[3] = Xor + ops[4] = And + ops[5] = Or + ops[6] = Sub1 + ops[7] = XorSub + ops[8] = Rsh +} + +func Add(x, y *big.Int) *big.Int { + return new(big.Int).Add(x, y) +} +func Mul(x, y *big.Int) *big.Int { + return new(big.Int).Mul(x, y) +} +func Mod(x, y *big.Int) *big.Int { + return new(big.Int).Mod(x, y) +} +func Xor(x, y *big.Int) *big.Int { + return new(big.Int).Xor(x, y) +} +func And(x, y *big.Int) *big.Int { + return new(big.Int).And(x, y) +} +func Or(x, y *big.Int) *big.Int { + return new(big.Int).Or(x, y) +} +func Sub1(x, y *big.Int) *big.Int { + a := big.NewInt(-1) + a.Sub(a, x) + + return a +} +func XorSub(x, y *big.Int) *big.Int { + t := Sub1(x, nil) + + return t.Xor(t, y) +} +func Rsh(x, y *big.Int) *big.Int { + return new(big.Int).Rsh(x, uint(y.Uint64()%64)) +} diff --git a/pow/ar/pow.go b/pow/ar/pow.go new file mode 100644 index 000000000..8991a674b --- /dev/null +++ b/pow/ar/pow.go @@ -0,0 +1,122 @@ +package ar + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/ethutil" +) + +type Entry struct { + op OpsFunc + i, j *big.Int +} + +type Tape struct { + tape []Entry + block Block +} + +func NewTape(block Block) *Tape { + return &Tape{nil, block} +} + +func (self *Tape) gen(w, h int64, gen NumberGenerator) { + self.tape = nil + + for v := int64(0); v < h; v++ { + op := ops[gen.rand64(lenops).Int64()] + r := gen.rand64(100).Uint64() + + var j *big.Int + if r < 20 && v > 20 { + j = self.tape[len(self.tape)-1].i + } else { + j = gen.rand64(w) + } + + i := gen.rand64(w) + self.tape = append(self.tape, Entry{op, i, j}) + } +} + +func (self *Tape) runTape(w, h int64, gen NumberGenerator) *big.Int { + var mem []*big.Int + for i := int64(0); i < w; i++ { + mem = append(mem, gen.rand(ethutil.BigPow(2, 64))) + } + + set := func(i, j int) Entry { + entry := self.tape[i*100+j] + mem[entry.i.Uint64()] = entry.op(entry.i, entry.j) + + return entry + } + + dir := true + for i := 0; i < int(h)/100; i++ { + var entry Entry + if dir { + for j := 0; j < 100; j++ { + entry = set(i, j) + } + } else { + for j := 99; i >= 0; j-- { + entry = set(i, j) + } + } + + t := mem[entry.i.Uint64()] + if big.NewInt(2).Cmp(new(big.Int).Mod(t, big.NewInt(37))) < 0 { + dir = !dir + } + } + + return Sha3(mem) +} + +func (self *Tape) Verify(header, nonce []byte) bool { + n := ethutil.BigD(nonce) + + var w int64 = 10000 + var h int64 = 150000 + gen := Rnd(Sha3([]interface{}{header, new(big.Int).Div(n, big.NewInt(1000))})) + self.gen(w, h, gen) + + gen = Rnd(Sha3([]interface{}{header, new(big.Int).Mod(n, big.NewInt(1000))})) + hash := self.runTape(w, h, gen) + + it := self.block.Trie().Iterator() + next := it.Next(string(new(big.Int).Mod(hash, ethutil.BigPow(2, 160)).Bytes())) + + req := ethutil.BigPow(2, 256) + req.Div(req, self.block.Diff()) + return Sha3([]interface{}{hash, next}).Cmp(req) < 0 +} + +func (self *Tape) Run(header []byte) []byte { + nonce := big.NewInt(0) + var w int64 = 10000 + var h int64 = 150000 + + req := ethutil.BigPow(2, 256) + req.Div(req, self.block.Diff()) + + for { + if new(big.Int).Mod(nonce, b(1000)).Cmp(b(0)) == 0 { + gen := Rnd(Sha3([]interface{}{header, new(big.Int).Div(nonce, big.NewInt(1000))})) + self.gen(w, h, gen) + } + + gen := Rnd(Sha3([]interface{}{header, new(big.Int).Mod(nonce, big.NewInt(1000))})) + hash := self.runTape(w, h, gen) + + it := self.block.Trie().Iterator() + next := it.Next(string(new(big.Int).Mod(hash, ethutil.BigPow(2, 160)).Bytes())) + + if Sha3([]interface{}{hash, next}).Cmp(req) < 0 { + return nonce.Bytes() + } else { + nonce.Add(nonce, ethutil.Big1) + } + } +} diff --git a/pow/ar/pow_test.go b/pow/ar/pow_test.go new file mode 100644 index 000000000..b1ebf9281 --- /dev/null +++ b/pow/ar/pow_test.go @@ -0,0 +1,47 @@ +package ar + +import ( + "fmt" + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/trie" +) + +type TestBlock struct { + trie *trie.Trie +} + +func NewTestBlock() *TestBlock { + db, _ := ethdb.NewMemDatabase() + return &TestBlock{ + trie: trie.New(db, ""), + } +} + +func (self *TestBlock) Diff() *big.Int { + return b(10) +} + +func (self *TestBlock) Trie() *trie.Trie { + return self.trie +} + +func (self *TestBlock) Hash() []byte { + a := make([]byte, 32) + a[0] = 10 + a[1] = 2 + return a +} + +func TestPow(t *testing.T) { + entry := make([]byte, 32) + entry[0] = 255 + + block := NewTestBlock() + + pow := NewTape(block) + nonce := pow.Run(block.Hash()) + fmt.Println("Found nonce", nonce) +} diff --git a/pow/ar/rnd.go b/pow/ar/rnd.go new file mode 100644 index 000000000..c62f4e062 --- /dev/null +++ b/pow/ar/rnd.go @@ -0,0 +1,66 @@ +package ar + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethutil" +) + +var b = big.NewInt + +type Node interface { + Big() *big.Int +} + +type ByteNode []byte + +func (self ByteNode) Big() *big.Int { + return ethutil.BigD(ethutil.Encode([]byte(self))) +} + +func Sha3(v interface{}) *big.Int { + if b, ok := v.(*big.Int); ok { + return ethutil.BigD(crypto.Sha3(b.Bytes())) + } else if b, ok := v.([]interface{}); ok { + return ethutil.BigD(crypto.Sha3(ethutil.Encode(b))) + } else if s, ok := v.([]*big.Int); ok { + v := make([]interface{}, len(s)) + for i, b := range s { + v[i] = b + } + + return ethutil.BigD(crypto.Sha3(ethutil.Encode(v))) + } + + return nil +} + +type NumberGenerator interface { + rand(r *big.Int) *big.Int + rand64(r int64) *big.Int +} + +type rnd struct { + seed *big.Int +} + +func Rnd(s *big.Int) rnd { + return rnd{s} +} + +func (self rnd) rand(r *big.Int) *big.Int { + o := b(0).Mod(self.seed, r) + + self.seed.Div(self.seed, r) + + if self.seed.Cmp(ethutil.BigPow(2, 64)) < 0 { + self.seed = Sha3(self.seed) + } + + return o +} + +func (self rnd) rand64(r int64) *big.Int { + return self.rand(b(r)) +} diff --git a/pow/block.go b/pow/block.go new file mode 100644 index 000000000..4759e19fb --- /dev/null +++ b/pow/block.go @@ -0,0 +1,9 @@ +package pow + +import "math/big" + +type Block interface { + Diff() *big.Int + HashNoNonce() []byte + N() []byte +} diff --git a/pow/ezp/pow.go b/pow/ezp/pow.go new file mode 100644 index 000000000..bfe3ea098 --- /dev/null +++ b/pow/ezp/pow.go @@ -0,0 +1,89 @@ +package ezp + +import ( + "math/big" + "math/rand" + "time" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/pow" + "github.com/obscuren/sha3" +) + +var powlogger = logger.NewLogger("POW") + +type EasyPow struct { + hash *big.Int + HashRate int64 + turbo bool +} + +func New() *EasyPow { + return &EasyPow{turbo: true} +} + +func (pow *EasyPow) GetHashrate() int64 { + return pow.HashRate +} + +func (pow *EasyPow) Turbo(on bool) { + pow.turbo = on +} + +func (pow *EasyPow) Search(block pow.Block, stop <-chan struct{}) []byte { + r := rand.New(rand.NewSource(time.Now().UnixNano())) + hash := block.HashNoNonce() + diff := block.Diff() + i := int64(0) + start := time.Now().UnixNano() + t := time.Now() + + for { + select { + case <-stop: + powlogger.Infoln("Breaking from mining") + pow.HashRate = 0 + return nil + default: + i++ + + if time.Since(t) > (1 * time.Second) { + elapsed := time.Now().UnixNano() - start + hashes := ((float64(1e9) / float64(elapsed)) * float64(i)) / 1000 + pow.HashRate = int64(hashes) + powlogger.Infoln("Hashing @", pow.HashRate, "khash") + + t = time.Now() + } + + sha := crypto.Sha3(big.NewInt(r.Int63()).Bytes()) + if pow.verify(hash, diff, sha) { + return sha + } + } + + if !pow.turbo { + time.Sleep(20 * time.Microsecond) + } + } + + return nil +} + +func (pow *EasyPow) verify(hash []byte, diff *big.Int, nonce []byte) bool { + sha := sha3.NewKeccak256() + + d := append(hash, nonce...) + sha.Write(d) + + verification := new(big.Int).Div(ethutil.BigPow(2, 256), diff) + res := ethutil.U256(ethutil.BigD(sha.Sum(nil))) + + return res.Cmp(verification) <= 0 +} + +func (pow *EasyPow) Verify(block pow.Block) bool { + return pow.verify(block.HashNoNonce(), block.Diff(), block.N()) +} diff --git a/pow/pow.go b/pow/pow.go new file mode 100644 index 000000000..c94ee40ba --- /dev/null +++ b/pow/pow.go @@ -0,0 +1,8 @@ +package pow + +type PoW interface { + Search(block Block, stop <-chan struct{}) []byte + Verify(block Block) bool + GetHashrate() int64 + Turbo(bool) +} diff --git a/profile.cov b/profile.cov new file mode 100644 index 000000000..e92cd379f --- /dev/null +++ b/profile.cov @@ -0,0 +1,3038 @@ +mode: count +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 +github.com/ethereum/go-ethereum/chain/error.go:32.37,34.2 1 0 +github.com/ethereum/go-ethereum/chain/error.go:36.35,38.2 1 0 +github.com/ethereum/go-ethereum/chain/error.go:40.33,44.2 2 0 +github.com/ethereum/go-ethereum/chain/error.go:51.42,53.2 1 0 +github.com/ethereum/go-ethereum/chain/error.go:55.70,57.2 1 0 +github.com/ethereum/go-ethereum/chain/error.go:59.38,63.2 2 0 +github.com/ethereum/go-ethereum/chain/error.go:70.36,74.2 2 0 +github.com/ethereum/go-ethereum/chain/error.go:75.40,77.2 1 0 +github.com/ethereum/go-ethereum/chain/error.go:78.51,80.2 1 0 +github.com/ethereum/go-ethereum/chain/error.go:87.37,89.2 1 0 +github.com/ethereum/go-ethereum/chain/error.go:91.43,93.2 1 0 +github.com/ethereum/go-ethereum/chain/error.go:95.33,99.2 2 0 +github.com/ethereum/go-ethereum/chain/error.go:105.35,107.2 1 0 +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/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 +github.com/ethereum/go-ethereum/compression/rle/read_write.go:24.22,25.22 1 4 +github.com/ethereum/go-ethereum/compression/rle/read_write.go:25.22,26.21 1 4 +github.com/ethereum/go-ethereum/compression/rle/read_write.go:36.5,36.8 1 4 +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.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 +github.com/ethereum/go-ethereum/compression/rle/read_write.go:60.3,60.39 1 0 +github.com/ethereum/go-ethereum/compression/rle/read_write.go:61.2,62.64 1 0 +github.com/ethereum/go-ethereum/compression/rle/read_write.go:67.3,67.14 1 0 +github.com/ethereum/go-ethereum/compression/rle/read_write.go:68.2,69.20 1 0 +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.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 +github.com/ethereum/go-ethereum/compression/rle/read_write.go:77.19,81.3 3 0 +github.com/ethereum/go-ethereum/crypto/crypto.go:13.31,18.2 3 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:21.51,23.2 1 0 +github.com/ethereum/go-ethereum/crypto/crypto.go:25.33,29.2 2 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:31.36,36.2 3 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:38.36,47.2 3 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:18.55,20.2 1 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:22.52,24.2 1 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:26.41,28.2 1 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:30.41,32.2 1 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:34.42,36.2 1 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:38.41,40.2 1 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:42.39,44.2 1 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:46.67,48.16 2 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:51.2,52.12 2 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:48.16,50.3 1 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:55.61,57.12 2 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:64.2,64.21 1 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:57.12,60.17 3 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:60.17,62.4 1 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:67.45,69.2 1 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:71.80,72.29 1 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:75.2,79.16 5 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:82.2,85.12 4 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:72.29,74.3 1 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:79.16,81.3 1 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:88.50,89.31 1 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:92.2,93.12 2 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:89.31,91.3 1 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:96.73,98.12 2 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:105.2,105.20 1 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:108.2,108.42 1 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:98.12,101.17 3 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:101.17,103.4 1 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:105.20,107.3 1 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:111.96,113.16 2 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:116.2,116.42 1 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:113.16,115.3 1 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:119.87,121.16 2 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:124.2,124.42 1 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:121.16,123.3 1 0 +github.com/ethereum/go-ethereum/crypto/key_manager.go:127.47,130.2 2 0 +github.com/ethereum/go-ethereum/crypto/key_store.go:24.51,26.2 1 0 +github.com/ethereum/go-ethereum/crypto/key_store.go:28.67,31.2 2 0 +github.com/ethereum/go-ethereum/crypto/key_store.go:33.61,35.16 2 0 +github.com/ethereum/go-ethereum/crypto/key_store.go:38.2,40.16 3 0 +github.com/ethereum/go-ethereum/crypto/key_store.go:44.2,44.24 1 0 +github.com/ethereum/go-ethereum/crypto/key_store.go:47.2,47.21 1 0 +github.com/ethereum/go-ethereum/crypto/key_store.go:35.16,37.3 1 0 +github.com/ethereum/go-ethereum/crypto/key_store.go:40.16,42.3 1 0 +github.com/ethereum/go-ethereum/crypto/key_store.go:44.24,46.3 1 0 +github.com/ethereum/go-ethereum/crypto/key_store.go:54.69,61.38 7 0 +github.com/ethereum/go-ethereum/crypto/key_store.go:68.2,69.19 2 0 +github.com/ethereum/go-ethereum/crypto/key_store.go:73.2,76.16 4 0 +github.com/ethereum/go-ethereum/crypto/key_store.go:80.2,82.16 3 0 +github.com/ethereum/go-ethereum/crypto/key_store.go:86.2,88.16 3 0 +github.com/ethereum/go-ethereum/crypto/key_store.go:92.2,94.16 3 0 +github.com/ethereum/go-ethereum/crypto/key_store.go:98.2,98.12 1 0 +github.com/ethereum/go-ethereum/crypto/key_store.go:61.38,66.3 4 0 +github.com/ethereum/go-ethereum/crypto/key_store.go:69.19,71.3 1 0 +github.com/ethereum/go-ethereum/crypto/key_store.go:76.16,78.3 1 0 +github.com/ethereum/go-ethereum/crypto/key_store.go:82.16,84.3 1 0 +github.com/ethereum/go-ethereum/crypto/key_store.go:88.16,90.3 1 0 +github.com/ethereum/go-ethereum/crypto/key_store.go:94.16,96.3 1 0 +github.com/ethereum/go-ethereum/crypto/key_store.go:101.63,103.19 2 0 +github.com/ethereum/go-ethereum/crypto/key_store.go:106.2,109.16 3 0 +github.com/ethereum/go-ethereum/crypto/key_store.go:112.2,112.36 1 0 +github.com/ethereum/go-ethereum/crypto/key_store.go:103.19,105.3 1 0 +github.com/ethereum/go-ethereum/crypto/key_store.go:109.16,111.3 1 0 +github.com/ethereum/go-ethereum/crypto/keypair.go:19.36,23.2 3 0 +github.com/ethereum/go-ethereum/crypto/keypair.go:25.57,27.16 2 0 +github.com/ethereum/go-ethereum/crypto/keypair.go:31.2,31.61 1 0 +github.com/ethereum/go-ethereum/crypto/keypair.go:27.16,29.3 1 0 +github.com/ethereum/go-ethereum/crypto/keypair.go:34.36,35.22 1 0 +github.com/ethereum/go-ethereum/crypto/keypair.go:38.2,38.18 1 0 +github.com/ethereum/go-ethereum/crypto/keypair.go:35.22,37.3 1 0 +github.com/ethereum/go-ethereum/crypto/keypair.go:41.37,42.22 1 0 +github.com/ethereum/go-ethereum/crypto/keypair.go:45.2,45.19 1 0 +github.com/ethereum/go-ethereum/crypto/keypair.go:42.22,44.3 1 0 +github.com/ethereum/go-ethereum/crypto/keypair.go:48.64,50.2 1 0 +github.com/ethereum/go-ethereum/crypto/keypair.go:52.38,54.2 1 0 +github.com/ethereum/go-ethereum/crypto/keypair.go:56.45,58.2 1 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:15.28,17.2 1 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:19.48,21.2 1 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:23.46,24.21 1 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:28.2,28.12 1 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:24.21,26.3 1 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:31.32,33.2 1 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:35.29,37.2 1 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:39.42,40.33 1 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:40.33,42.3 1 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:45.44,47.27 2 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:50.2,50.16 1 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:47.27,49.3 1 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:53.59,57.16 4 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:60.2,61.16 2 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:64.2,64.21 1 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:57.16,59.3 1 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:61.16,63.3 1 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:67.61,70.45 3 0 +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.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 +github.com/ethereum/go-ethereum/crypto/keyring.go:96.2,96.21 1 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:89.27,91.17 2 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:94.3,94.30 1 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:91.17,93.4 1 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:99.57,102.16 3 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:106.2,107.16 2 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:110.2,110.21 1 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:102.16,105.3 2 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:107.16,109.3 1 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:113.38,115.2 1 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:117.45,119.32 2 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:122.2,122.10 1 0 +github.com/ethereum/go-ethereum/crypto/keyring.go:119.32,121.3 1 0 +github.com/ethereum/go-ethereum/crypto/mnemonic.go:9.50,10.26 1 24 +github.com/ethereum/go-ethereum/crypto/mnemonic.go:15.2,15.11 1 0 +github.com/ethereum/go-ethereum/crypto/mnemonic.go:10.26,11.17 1 18817 +github.com/ethereum/go-ethereum/crypto/mnemonic.go:11.17,13.4 1 24 +github.com/ethereum/go-ethereum/crypto/mnemonic.go:18.46,22.56 3 1 +github.com/ethereum/go-ethereum/crypto/mnemonic.go:30.2,30.12 1 1 +github.com/ethereum/go-ethereum/crypto/mnemonic.go:22.56,29.3 6 8 +github.com/ethereum/go-ethereum/crypto/mnemonic.go:33.46,37.39 3 1 +github.com/ethereum/go-ethereum/crypto/mnemonic.go:59.2,59.12 1 1 +github.com/ethereum/go-ethereum/crypto/mnemonic.go:37.39,50.12 9 8 +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 +github.com/ethereum/go-ethereum/ethdb/database.go:32.56,33.15 1 0 +github.com/ethereum/go-ethereum/ethdb/database.go:37.2,38.16 2 0 +github.com/ethereum/go-ethereum/ethdb/database.go:33.15,35.3 1 0 +github.com/ethereum/go-ethereum/ethdb/database.go:38.16,40.3 1 0 +github.com/ethereum/go-ethereum/ethdb/database.go:43.58,45.16 2 0 +github.com/ethereum/go-ethereum/ethdb/database.go:49.2,49.15 1 0 +github.com/ethereum/go-ethereum/ethdb/database.go:53.2,53.17 1 0 +github.com/ethereum/go-ethereum/ethdb/database.go:45.16,47.3 1 0 +github.com/ethereum/go-ethereum/ethdb/database.go:49.15,51.3 1 0 +github.com/ethereum/go-ethereum/ethdb/database.go:56.51,58.2 1 0 +github.com/ethereum/go-ethereum/ethdb/database.go:60.47,63.20 2 0 +github.com/ethereum/go-ethereum/ethdb/database.go:67.2,67.13 1 0 +github.com/ethereum/go-ethereum/ethdb/database.go:63.20,65.3 1 0 +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/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 +github.com/ethereum/go-ethereum/ethutil/rlp.go:46.25,47.16 1 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:51.2,51.15 1 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:47.16,49.3 1 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:54.57,59.9 3 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:91.2,91.14 1 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:60.2,61.14 1 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:63.2,64.39 1 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:66.2,69.34 2 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:71.2,73.31 2 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:78.3,78.15 1 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:79.2,81.39 2 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:86.3,86.15 1 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:87.2,88.53 1 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:73.31,76.4 2 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:81.39,84.4 2 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:100.40,103.19 2 59 +github.com/ethereum/go-ethereum/ethutil/rlp.go:177.2,177.21 1 59 +github.com/ethereum/go-ethereum/ethutil/rlp.go:103.19,104.29 1 59 +github.com/ethereum/go-ethereum/ethutil/rlp.go:105.3,106.31 1 2 +github.com/ethereum/go-ethereum/ethutil/rlp.go:107.3,108.35 1 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:110.3,111.44 1 10 +github.com/ethereum/go-ethereum/ethutil/rlp.go:112.3,113.44 1 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:114.3,115.44 1 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:116.3,117.44 1 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:118.3,119.44 1 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:120.3,121.37 1 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:122.3,123.44 1 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:124.3,125.44 1 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:126.3,127.44 1 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:128.3,129.44 1 1 +github.com/ethereum/go-ethereum/ethutil/rlp.go:130.3,132.16 1 12 +github.com/ethereum/go-ethereum/ethutil/rlp.go:137.3,138.33 1 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:139.3,140.35 1 20 +github.com/ethereum/go-ethereum/ethutil/rlp.go:151.3,152.33 1 6 +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.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.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.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.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.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 +github.com/ethereum/go-ethereum/ethutil/rlp.go:189.2,192.44 2 9 +github.com/ethereum/go-ethereum/ethutil/rlp.go:194.2,199.54 3 1 +github.com/ethereum/go-ethereum/ethutil/rlp.go:201.2,205.30 4 3 +github.com/ethereum/go-ethereum/ethutil/rlp.go:217.3,217.20 1 3 +github.com/ethereum/go-ethereum/ethutil/rlp.go:219.2,226.38 5 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:235.3,235.20 1 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:237.2,238.53 1 0 +github.com/ethereum/go-ethereum/ethutil/rlp.go:205.30,216.4 5 9 +github.com/ethereum/go-ethereum/ethutil/rlp.go:226.38,234.4 5 0 +github.com/ethereum/go-ethereum/ethutil/set.go:13.40,15.24 2 0 +github.com/ethereum/go-ethereum/ethutil/set.go:19.2,19.12 1 0 +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 +github.com/ethereum/go-ethereum/ethutil/package.go:35.16,37.3 1 0 +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.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 +github.com/ethereum/go-ethereum/ethutil/package.go:69.26,70.19 1 0 +github.com/ethereum/go-ethereum/ethutil/package.go:70.19,72.4 1 0 +github.com/ethereum/go-ethereum/ethutil/package.go:83.50,85.16 2 0 +github.com/ethereum/go-ethereum/ethutil/package.go:88.2,92.23 3 0 +github.com/ethereum/go-ethereum/ethutil/package.go:96.2,97.16 2 0 +github.com/ethereum/go-ethereum/ethutil/package.go:101.2,102.16 2 0 +github.com/ethereum/go-ethereum/ethutil/package.go:106.2,106.26 1 0 +github.com/ethereum/go-ethereum/ethutil/package.go:110.2,111.20 2 0 +github.com/ethereum/go-ethereum/ethutil/package.go:115.2,116.16 2 0 +github.com/ethereum/go-ethereum/ethutil/package.go:120.2,122.24 2 0 +github.com/ethereum/go-ethereum/ethutil/package.go:85.16,87.3 1 0 +github.com/ethereum/go-ethereum/ethutil/package.go:92.23,94.3 1 0 +github.com/ethereum/go-ethereum/ethutil/package.go:97.16,99.3 1 0 +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/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 +github.com/ethereum/go-ethereum/ethutil/common.go:14.43,16.3 1 0 +github.com/ethereum/go-ethereum/ethutil/common.go:36.44,42.9 2 12 +github.com/ethereum/go-ethereum/ethutil/common.go:70.2,70.27 1 12 +github.com/ethereum/go-ethereum/ethutil/common.go:74.2,74.41 1 10 +github.com/ethereum/go-ethereum/ethutil/common.go:43.2,45.20 2 2 +github.com/ethereum/go-ethereum/ethutil/common.go:46.2,48.21 2 2 +github.com/ethereum/go-ethereum/ethutil/common.go:49.2,51.18 2 1 +github.com/ethereum/go-ethereum/ethutil/common.go:52.2,54.19 2 1 +github.com/ethereum/go-ethereum/ethutil/common.go:55.2,57.18 2 1 +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/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 +github.com/ethereum/go-ethereum/ethutil/value.go:25.31,27.3 1 0 +github.com/ethereum/go-ethereum/ethutil/value.go:32.39,34.2 1 0 +github.com/ethereum/go-ethereum/ethutil/value.go:36.32,38.2 1 0 +github.com/ethereum/go-ethereum/ethutil/value.go:40.29,42.45 1 8 +github.com/ethereum/go-ethereum/ethutil/value.go:46.2,46.25 1 1 +github.com/ethereum/go-ethereum/ethutil/value.go:42.45,44.3 1 7 +github.com/ethereum/go-ethereum/ethutil/value.go:49.37,51.2 1 2 +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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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 +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.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.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.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.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.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.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.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.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.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 +github.com/ethereum/go-ethereum/ethutil/value.go:170.41,171.42 1 10 +github.com/ethereum/go-ethereum/ethutil/value.go:175.2,175.24 1 0 +github.com/ethereum/go-ethereum/ethutil/value.go:171.42,173.3 1 10 +github.com/ethereum/go-ethereum/ethutil/value.go:178.46,182.2 2 1 +github.com/ethereum/go-ethereum/ethutil/value.go:184.42,188.2 2 1 +github.com/ethereum/go-ethereum/ethutil/value.go:190.52,194.2 2 1 +github.com/ethereum/go-ethereum/ethutil/value.go:197.34,199.2 1 0 +github.com/ethereum/go-ethereum/ethutil/value.go:201.32,203.2 1 0 +github.com/ethereum/go-ethereum/ethutil/value.go:205.33,208.2 2 0 +github.com/ethereum/go-ethereum/ethutil/value.go:213.33,217.2 2 0 +github.com/ethereum/go-ethereum/ethutil/value.go:219.34,221.2 1 0 +github.com/ethereum/go-ethereum/ethutil/value.go:224.39,225.42 1 5 +github.com/ethereum/go-ethereum/ethutil/value.go:239.2,239.22 1 0 +github.com/ethereum/go-ethereum/ethutil/value.go:225.42,227.20 1 5 +github.com/ethereum/go-ethereum/ethutil/value.go:231.3,231.14 1 5 +github.com/ethereum/go-ethereum/ethutil/value.go:235.3,235.26 1 5 +github.com/ethereum/go-ethereum/ethutil/value.go:227.20,229.4 1 0 +github.com/ethereum/go-ethereum/ethutil/value.go:231.14,233.4 1 0 +github.com/ethereum/go-ethereum/ethutil/value.go:242.34,243.32 1 0 +github.com/ethereum/go-ethereum/ethutil/value.go:252.2,252.12 1 0 +github.com/ethereum/go-ethereum/ethutil/value.go:244.2,245.41 1 0 +github.com/ethereum/go-ethereum/ethutil/value.go:246.2,247.34 1 0 +github.com/ethereum/go-ethereum/ethutil/value.go:248.2,249.28 1 0 +github.com/ethereum/go-ethereum/ethutil/value.go:255.38,257.2 1 4 +github.com/ethereum/go-ethereum/ethutil/value.go:259.43,261.2 1 2 +github.com/ethereum/go-ethereum/ethutil/value.go:263.35,265.2 1 3 +github.com/ethereum/go-ethereum/ethutil/value.go:268.29,272.2 2 4 +github.com/ethereum/go-ethereum/ethutil/value.go:274.44,275.20 1 3 +github.com/ethereum/go-ethereum/ethutil/value.go:282.2,282.22 1 0 +github.com/ethereum/go-ethereum/ethutil/value.go:275.20,280.3 3 3 +github.com/ethereum/go-ethereum/ethutil/value.go:286.42,289.14 2 0 +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.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 +github.com/ethereum/go-ethereum/ethutil/value.go:308.39,313.2 3 2 +github.com/ethereum/go-ethereum/ethutil/value.go:315.48,319.2 2 5 +github.com/ethereum/go-ethereum/ethutil/value.go:330.59,334.12 3 4 +github.com/ethereum/go-ethereum/ethutil/value.go:347.2,347.13 1 4 +github.com/ethereum/go-ethereum/ethutil/value.go:335.2,336.35 1 2 +github.com/ethereum/go-ethereum/ethutil/value.go:337.2,338.35 1 0 +github.com/ethereum/go-ethereum/ethutil/value.go:339.2,340.35 1 0 +github.com/ethereum/go-ethereum/ethutil/value.go:341.2,342.41 1 0 +github.com/ethereum/go-ethereum/ethutil/value.go:343.2,344.35 1 2 +github.com/ethereum/go-ethereum/ethutil/value.go:350.50,352.2 1 2 +github.com/ethereum/go-ethereum/ethutil/value.go:354.50,356.2 1 2 +github.com/ethereum/go-ethereum/ethutil/value.go:358.50,360.2 1 0 +github.com/ethereum/go-ethereum/ethutil/value.go:362.50,364.2 1 0 +github.com/ethereum/go-ethereum/ethutil/value.go:366.50,368.2 1 0 +github.com/ethereum/go-ethereum/ethutil/value.go:376.48,378.2 1 1 +github.com/ethereum/go-ethereum/ethutil/value.go:380.36,382.2 1 0 +github.com/ethereum/go-ethereum/ethutil/value.go:384.38,385.30 1 4 +github.com/ethereum/go-ethereum/ethutil/value.go:389.2,392.13 3 3 +github.com/ethereum/go-ethereum/ethutil/value.go:385.30,387.3 1 1 +github.com/ethereum/go-ethereum/ethutil/value.go:395.41,397.2 1 3 +github.com/ethereum/go-ethereum/ethutil/value.go:399.36,401.2 1 0 +github.com/ethereum/go-ethereum/event/event.go:41.66,45.17 4 1005 +github.com/ethereum/go-ethereum/event/event.go:63.2,63.12 1 1004 +github.com/ethereum/go-ethereum/event/event.go:45.17,47.3 1 1 +github.com/ethereum/go-ethereum/event/event.go:47.4,48.22 1 1004 +github.com/ethereum/go-ethereum/event/event.go:51.3,51.27 1 1004 +github.com/ethereum/go-ethereum/event/event.go:48.22,50.4 1 5 +github.com/ethereum/go-ethereum/event/event.go:51.27,54.32 3 1006 +github.com/ethereum/go-ethereum/event/event.go:57.4,60.25 4 1005 +github.com/ethereum/go-ethereum/event/event.go:54.32,56.5 1 1 +github.com/ethereum/go-ethereum/event/event.go:68.48,71.17 3 6657815 +github.com/ethereum/go-ethereum/event/event.go:75.2,77.27 3 6657811 +github.com/ethereum/go-ethereum/event/event.go:80.2,80.12 1 6657811 +github.com/ethereum/go-ethereum/event/event.go:71.17,74.3 2 4 +github.com/ethereum/go-ethereum/event/event.go:77.27,79.3 1 4004 +github.com/ethereum/go-ethereum/event/event.go:86.28,88.32 2 5 +github.com/ethereum/go-ethereum/event/event.go:93.2,95.20 3 5 +github.com/ethereum/go-ethereum/event/event.go:88.32,89.28 1 3 +github.com/ethereum/go-ethereum/event/event.go:89.28,91.4 1 3 +github.com/ethereum/go-ethereum/event/event.go:98.36,100.34 2 1001 +github.com/ethereum/go-ethereum/event/event.go:109.2,109.22 1 1001 +github.com/ethereum/go-ethereum/event/event.go:100.34,101.37 1 1001 +github.com/ethereum/go-ethereum/event/event.go:101.37,102.22 1 1001 +github.com/ethereum/go-ethereum/event/event.go:102.22,104.5 1 5 +github.com/ethereum/go-ethereum/event/event.go:104.6,106.5 1 996 +github.com/ethereum/go-ethereum/event/event.go:112.46,113.26 1 2007 +github.com/ethereum/go-ethereum/event/event.go:118.2,118.11 1 1005 +github.com/ethereum/go-ethereum/event/event.go:113.26,114.16 1 17982 +github.com/ethereum/go-ethereum/event/event.go:114.16,116.4 1 1002 +github.com/ethereum/go-ethereum/event/event.go:121.52,126.2 4 996 +github.com/ethereum/go-ethereum/event/event.go:142.35,150.2 2 1005 +github.com/ethereum/go-ethereum/event/event.go:152.44,154.2 1 1003 +github.com/ethereum/go-ethereum/event/event.go:156.32,159.2 2 1001 +github.com/ethereum/go-ethereum/event/event.go:161.30,164.14 3 1004 +github.com/ethereum/go-ethereum/event/event.go:167.2,173.19 6 1003 +github.com/ethereum/go-ethereum/event/event.go:164.14,166.3 1 1 +github.com/ethereum/go-ethereum/event/event.go:176.42,178.9 2 4004 +github.com/ethereum/go-ethereum/event/event.go:182.2,182.20 1 4004 +github.com/ethereum/go-ethereum/event/event.go:179.2,179.21 0 1004 +github.com/ethereum/go-ethereum/event/event.go:180.2,180.19 0 3000 +github.com/ethereum/go-ethereum/logger/loggers.go:56.13,58.2 1 1 +github.com/ethereum/go-ethereum/logger/loggers.go:64.21,70.36 2 1 +github.com/ethereum/go-ethereum/logger/loggers.go:77.2,77.6 1 1 +github.com/ethereum/go-ethereum/logger/loggers.go:70.36,75.3 4 22 +github.com/ethereum/go-ethereum/logger/loggers.go:77.6,78.10 1 52 +github.com/ethereum/go-ethereum/logger/loggers.go:79.3,80.31 1 20 +github.com/ethereum/go-ethereum/logger/loggers.go:84.3,86.19 2 16 +github.com/ethereum/go-ethereum/logger/loggers.go:88.3,90.31 1 7 +github.com/ethereum/go-ethereum/logger/loggers.go:93.4,96.17 4 7 +github.com/ethereum/go-ethereum/logger/loggers.go:98.3,100.31 1 8 +github.com/ethereum/go-ethereum/logger/loggers.go:103.4,105.32 3 8 +github.com/ethereum/go-ethereum/logger/loggers.go:108.4,108.17 1 8 +github.com/ethereum/go-ethereum/logger/loggers.go:80.31,82.5 1 19 +github.com/ethereum/go-ethereum/logger/loggers.go:90.31,92.5 1 6 +github.com/ethereum/go-ethereum/logger/loggers.go:100.31,102.5 1 6 +github.com/ethereum/go-ethereum/logger/loggers.go:105.32,107.5 1 6 +github.com/ethereum/go-ethereum/logger/loggers.go:113.68,114.22 1 22 +github.com/ethereum/go-ethereum/logger/loggers.go:119.2,119.11 1 12 +github.com/ethereum/go-ethereum/logger/loggers.go:114.22,115.37 1 19 +github.com/ethereum/go-ethereum/logger/loggers.go:115.37,117.4 1 14 +github.com/ethereum/go-ethereum/logger/loggers.go:124.14,128.2 3 7 +github.com/ethereum/go-ethereum/logger/loggers.go:132.14,136.2 3 8 +github.com/ethereum/go-ethereum/logger/loggers.go:139.34,141.2 1 16 +github.com/ethereum/go-ethereum/logger/loggers.go:150.36,152.2 1 7 +github.com/ethereum/go-ethereum/logger/loggers.go:154.64,156.2 1 10 +github.com/ethereum/go-ethereum/logger/loggers.go:158.78,160.2 1 10 +github.com/ethereum/go-ethereum/logger/loggers.go:163.49,165.2 1 2 +github.com/ethereum/go-ethereum/logger/loggers.go:168.48,170.2 1 4 +github.com/ethereum/go-ethereum/logger/loggers.go:173.48,175.2 1 3 +github.com/ethereum/go-ethereum/logger/loggers.go:178.49,180.2 1 1 +github.com/ethereum/go-ethereum/logger/loggers.go:183.55,185.2 1 0 +github.com/ethereum/go-ethereum/logger/loggers.go:188.63,190.2 1 7 +github.com/ethereum/go-ethereum/logger/loggers.go:193.62,195.2 1 1 +github.com/ethereum/go-ethereum/logger/loggers.go:198.62,200.2 1 1 +github.com/ethereum/go-ethereum/logger/loggers.go:203.63,205.2 1 1 +github.com/ethereum/go-ethereum/logger/loggers.go:208.69,210.2 1 0 +github.com/ethereum/go-ethereum/logger/loggers.go:213.49,217.2 3 0 +github.com/ethereum/go-ethereum/logger/loggers.go:220.63,224.2 3 0 +github.com/ethereum/go-ethereum/logger/loggers.go:228.77,231.2 2 11 +github.com/ethereum/go-ethereum/logger/loggers.go:238.61,240.2 1 2 +github.com/ethereum/go-ethereum/logger/loggers.go:242.48,244.2 1 0 +github.com/ethereum/go-ethereum/logger/loggers.go:246.47,248.2 1 2 +github.com/ethereum/go-ethereum/p2p/client_identity.go:23.133,34.2 2 6 +github.com/ethereum/go-ethereum/p2p/client_identity.go:36.39,37.2 0 0 +github.com/ethereum/go-ethereum/p2p/client_identity.go:39.48,41.33 2 11 +github.com/ethereum/go-ethereum/p2p/client_identity.go:45.2,50.20 1 11 +github.com/ethereum/go-ethereum/p2p/client_identity.go:41.33,43.3 1 11 +github.com/ethereum/go-ethereum/p2p/client_identity.go:53.48,55.2 1 23 +github.com/ethereum/go-ethereum/p2p/client_identity.go:57.77,59.2 1 1 +github.com/ethereum/go-ethereum/p2p/client_identity.go:61.61,63.2 1 2 +github.com/ethereum/go-ethereum/p2p/natpmp.go:21.42,23.2 1 0 +github.com/ethereum/go-ethereum/p2p/natpmp.go:25.70,27.16 2 0 +github.com/ethereum/go-ethereum/p2p/natpmp.go:30.2,32.8 3 0 +github.com/ethereum/go-ethereum/p2p/natpmp.go:27.16,29.3 1 0 +github.com/ethereum/go-ethereum/p2p/natpmp.go:36.71,37.18 1 0 +github.com/ethereum/go-ethereum/p2p/natpmp.go:42.2,43.16 2 0 +github.com/ethereum/go-ethereum/p2p/natpmp.go:46.2,47.8 2 0 +github.com/ethereum/go-ethereum/p2p/natpmp.go:37.18,40.3 2 0 +github.com/ethereum/go-ethereum/p2p/natpmp.go:43.16,45.3 1 0 +github.com/ethereum/go-ethereum/p2p/natpmp.go:50.103,55.2 2 0 +github.com/ethereum/go-ethereum/p2p/peer_error.go:60.79,62.9 2 17 +github.com/ethereum/go-ethereum/p2p/peer_error.go:65.2,67.34 3 17 +github.com/ethereum/go-ethereum/p2p/peer_error.go:62.9,64.3 1 0 +github.com/ethereum/go-ethereum/p2p/peer_error.go:70.39,72.2 1 15 +github.com/ethereum/go-ethereum/p2p/peer_error.go:74.44,76.2 1 19 +github.com/ethereum/go-ethereum/p2p/protocol.go:81.37,82.38 1 0 +github.com/ethereum/go-ethereum/p2p/protocol.go:86.2,86.30 1 0 +github.com/ethereum/go-ethereum/p2p/protocol.go:82.38,84.3 1 0 +github.com/ethereum/go-ethereum/p2p/protocol.go:95.48,101.2 2 10 +github.com/ethereum/go-ethereum/p2p/protocol.go:103.35,104.22 1 10 +github.com/ethereum/go-ethereum/p2p/protocol.go:104.22,112.3 2 7 +github.com/ethereum/go-ethereum/p2p/protocol.go:115.34,116.2 0 10 +github.com/ethereum/go-ethereum/p2p/protocol.go:118.34,121.2 2 6 +github.com/ethereum/go-ethereum/p2p/protocol.go:123.37,125.2 1 0 +github.com/ethereum/go-ethereum/p2p/protocol.go:127.41,129.2 1 0 +github.com/ethereum/go-ethereum/p2p/protocol.go:131.44,133.2 1 16 +github.com/ethereum/go-ethereum/p2p/protocol.go:135.64,138.25 3 8 +github.com/ethereum/go-ethereum/p2p/protocol.go:138.25,140.3 1 8 +github.com/ethereum/go-ethereum/p2p/protocol.go:140.4,142.3 1 0 +github.com/ethereum/go-ethereum/p2p/protocol.go:145.66,146.32 1 3 +github.com/ethereum/go-ethereum/p2p/protocol.go:176.2,176.17 1 1 +github.com/ethereum/go-ethereum/p2p/protocol.go:146.32,148.3 1 1 +github.com/ethereum/go-ethereum/p2p/protocol.go:148.4,149.42 1 2 +github.com/ethereum/go-ethereum/p2p/protocol.go:154.3,154.21 1 0 +github.com/ethereum/go-ethereum/p2p/protocol.go:149.42,153.4 3 2 +github.com/ethereum/go-ethereum/p2p/protocol.go:155.3,160.5 2 0 +github.com/ethereum/go-ethereum/p2p/protocol.go:161.3,163.19 2 0 +github.com/ethereum/go-ethereum/p2p/protocol.go:164.3,164.16 0 0 +github.com/ethereum/go-ethereum/p2p/protocol.go:165.3,167.65 1 0 +github.com/ethereum/go-ethereum/p2p/protocol.go:170.3,171.25 1 0 +github.com/ethereum/go-ethereum/p2p/protocol.go:172.3,173.73 1 0 +github.com/ethereum/go-ethereum/p2p/protocol.go:167.65,169.5 1 0 +github.com/ethereum/go-ethereum/p2p/protocol.go:179.62,183.2 2 21 +github.com/ethereum/go-ethereum/p2p/protocol.go:185.91,189.22 4 2 +github.com/ethereum/go-ethereum/p2p/protocol.go:189.22,191.3 1 0 +github.com/ethereum/go-ethereum/p2p/protocol.go:194.49,196.16 2 0 +github.com/ethereum/go-ethereum/p2p/protocol.go:196.16,201.3 4 0 +github.com/ethereum/go-ethereum/p2p/protocol.go:204.53,207.29 3 1 +github.com/ethereum/go-ethereum/p2p/protocol.go:212.2,224.30 4 1 +github.com/ethereum/go-ethereum/p2p/protocol.go:230.2,230.22 1 1 +github.com/ethereum/go-ethereum/p2p/protocol.go:235.2,235.23 1 1 +github.com/ethereum/go-ethereum/p2p/protocol.go:241.2,241.82 1 1 +github.com/ethereum/go-ethereum/p2p/protocol.go:247.2,247.77 1 1 +github.com/ethereum/go-ethereum/p2p/protocol.go:253.2,253.23 1 1 +github.com/ethereum/go-ethereum/p2p/protocol.go:263.2,264.20 2 1 +github.com/ethereum/go-ethereum/p2p/protocol.go:268.2,277.8 5 1 +github.com/ethereum/go-ethereum/p2p/protocol.go:207.29,210.3 2 0 +github.com/ethereum/go-ethereum/p2p/protocol.go:224.30,227.3 2 0 +github.com/ethereum/go-ethereum/p2p/protocol.go:230.22,233.3 2 0 +github.com/ethereum/go-ethereum/p2p/protocol.go:235.23,238.3 2 0 +github.com/ethereum/go-ethereum/p2p/protocol.go:241.82,244.3 2 0 +github.com/ethereum/go-ethereum/p2p/protocol.go:247.77,250.3 2 0 +github.com/ethereum/go-ethereum/p2p/protocol.go:253.23,255.57 2 1 +github.com/ethereum/go-ethereum/p2p/protocol.go:255.57,258.4 2 0 +github.com/ethereum/go-ethereum/p2p/protocol.go:258.5,260.4 1 1 +github.com/ethereum/go-ethereum/p2p/protocol.go:264.20,267.3 2 3 +github.com/ethereum/go-ethereum/p2p/server.go:32.35,36.2 1 6 +github.com/ethereum/go-ethereum/p2p/server.go:38.60,43.9 5 0 +github.com/ethereum/go-ethereum/p2p/server.go:46.2,46.15 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:43.9,45.3 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:49.59,54.2 4 1 +github.com/ethereum/go-ethereum/p2p/server.go:56.52,61.2 4 0 +github.com/ethereum/go-ethereum/p2p/server.go:63.55,68.2 4 0 +github.com/ethereum/go-ethereum/p2p/server.go:98.129,101.33 2 5 +github.com/ethereum/go-ethereum/p2p/server.go:104.2,130.32 5 5 +github.com/ethereum/go-ethereum/p2p/server.go:133.2,133.13 1 5 +github.com/ethereum/go-ethereum/p2p/server.go:101.33,103.3 1 3 +github.com/ethereum/go-ethereum/p2p/server.go:130.32,132.3 1 10 +github.com/ethereum/go-ethereum/p2p/server.go:136.79,139.2 2 0 +github.com/ethereum/go-ethereum/p2p/server.go:141.74,144.2 2 0 +github.com/ethereum/go-ethereum/p2p/server.go:146.53,148.2 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:150.58,155.16 4 1 +github.com/ethereum/go-ethereum/p2p/server.go:168.2,168.8 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:155.16,157.37 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:161.3,161.25 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:157.37,160.4 2 2 +github.com/ethereum/go-ethereum/p2p/server.go:161.25,163.4 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:163.5,166.4 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:171.45,174.34 3 0 +github.com/ethereum/go-ethereum/p2p/server.go:179.2,179.8 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:174.34,175.18 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:175.18,177.4 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:182.37,186.2 3 1 +github.com/ethereum/go-ethereum/p2p/server.go:190.48,193.9 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:194.2,195.34 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:196.2,196.10 0 0 +github.com/ethereum/go-ethereum/p2p/server.go:200.61,202.2 1 7 +github.com/ethereum/go-ethereum/p2p/server.go:204.43,206.2 1 7 +github.com/ethereum/go-ethereum/p2p/server.go:208.41,210.2 1 7 +github.com/ethereum/go-ethereum/p2p/server.go:212.58,215.34 3 1 +github.com/ethereum/go-ethereum/p2p/server.go:215.34,216.18 1 2 +github.com/ethereum/go-ethereum/p2p/server.go:216.18,218.4 1 2 +github.com/ethereum/go-ethereum/p2p/server.go:223.51,225.12 2 4 +github.com/ethereum/go-ethereum/p2p/server.go:237.2,237.10 1 4 +github.com/ethereum/go-ethereum/p2p/server.go:249.2,249.33 1 4 +github.com/ethereum/go-ethereum/p2p/server.go:225.12,227.17 2 3 +github.com/ethereum/go-ethereum/p2p/server.go:227.17,231.4 3 0 +github.com/ethereum/go-ethereum/p2p/server.go:231.5,235.4 3 3 +github.com/ethereum/go-ethereum/p2p/server.go:237.10,239.17 2 3 +github.com/ethereum/go-ethereum/p2p/server.go:239.17,243.4 3 0 +github.com/ethereum/go-ethereum/p2p/server.go:243.5,247.4 3 3 +github.com/ethereum/go-ethereum/p2p/server.go:252.28,255.18 2 4 +github.com/ethereum/go-ethereum/p2p/server.go:263.2,263.20 1 4 +github.com/ethereum/go-ethereum/p2p/server.go:271.2,277.34 6 4 +github.com/ethereum/go-ethereum/p2p/server.go:282.2,283.32 2 4 +github.com/ethereum/go-ethereum/p2p/server.go:291.2,295.6 3 4 +github.com/ethereum/go-ethereum/p2p/server.go:305.2,305.33 1 4 +github.com/ethereum/go-ethereum/p2p/server.go:255.18,261.3 5 3 +github.com/ethereum/go-ethereum/p2p/server.go:263.20,269.3 5 3 +github.com/ethereum/go-ethereum/p2p/server.go:277.34,278.18 1 8 +github.com/ethereum/go-ethereum/p2p/server.go:278.18,280.4 1 6 +github.com/ethereum/go-ethereum/p2p/server.go:283.32,288.3 1 6 +github.com/ethereum/go-ethereum/p2p/server.go:295.6,296.10 1 8 +github.com/ethereum/go-ethereum/p2p/server.go:297.3,300.26 3 8 +github.com/ethereum/go-ethereum/p2p/server.go:300.26,301.14 1 4 +github.com/ethereum/go-ethereum/p2p/server.go:309.63,310.6 1 3 +github.com/ethereum/go-ethereum/p2p/server.go:310.6,311.10 1 2591 +github.com/ethereum/go-ethereum/p2p/server.go:312.3,313.46 1 2588 +github.com/ethereum/go-ethereum/p2p/server.go:314.3,318.10 4 3 +github.com/ethereum/go-ethereum/p2p/server.go:325.56,330.6 4 3 +github.com/ethereum/go-ethereum/p2p/server.go:330.6,331.10 1 10 +github.com/ethereum/go-ethereum/p2p/server.go:332.3,338.15 3 4 +github.com/ethereum/go-ethereum/p2p/server.go:339.3,346.21 3 3 +github.com/ethereum/go-ethereum/p2p/server.go:347.3,348.31 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:349.3,350.41 1 3 +github.com/ethereum/go-ethereum/p2p/server.go:353.4,355.10 3 3 +github.com/ethereum/go-ethereum/p2p/server.go:350.41,352.5 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:361.61,366.11 4 6 +github.com/ethereum/go-ethereum/p2p/server.go:369.2,369.8 1 6 +github.com/ethereum/go-ethereum/p2p/server.go:366.11,368.3 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:373.73,376.16 3 2588 +github.com/ethereum/go-ethereum/p2p/server.go:383.2,383.16 1 2588 +github.com/ethereum/go-ethereum/p2p/server.go:376.16,379.17 3 3 +github.com/ethereum/go-ethereum/p2p/server.go:379.17,381.4 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:383.16,386.3 2 2585 +github.com/ethereum/go-ethereum/p2p/server.go:386.4,389.3 2 3 +github.com/ethereum/go-ethereum/p2p/server.go:393.84,396.16 3 3 +github.com/ethereum/go-ethereum/p2p/server.go:399.2,399.16 1 3 +github.com/ethereum/go-ethereum/p2p/server.go:396.16,398.3 1 3 +github.com/ethereum/go-ethereum/p2p/server.go:399.16,402.3 2 0 +github.com/ethereum/go-ethereum/p2p/server.go:402.4,404.3 1 3 +github.com/ethereum/go-ethereum/p2p/server.go:408.86,411.17 3 6 +github.com/ethereum/go-ethereum/p2p/server.go:411.17,415.3 3 0 +github.com/ethereum/go-ethereum/p2p/server.go:415.4,424.3 7 6 +github.com/ethereum/go-ethereum/p2p/server.go:428.59,435.17 6 6 +github.com/ethereum/go-ethereum/p2p/server.go:441.2,459.24 13 6 +github.com/ethereum/go-ethereum/p2p/server.go:435.17,439.3 3 0 +github.com/ethereum/go-ethereum/p2p/server.go:463.38,467.2 3 8 +github.com/ethereum/go-ethereum/p2p/server.go:469.74,471.35 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:475.2,477.34 3 1 +github.com/ethereum/go-ethereum/p2p/server.go:482.2,483.12 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:471.35,473.3 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:477.34,478.82 1 2 +github.com/ethereum/go-ethereum/p2p/server.go:478.82,480.4 1 0 +github.com/ethereum/go-ethereum/p2p/connection.go:32.32,35.2 2 18 +github.com/ethereum/go-ethereum/p2p/connection.go:37.33,40.2 2 18 +github.com/ethereum/go-ethereum/p2p/connection.go:42.35,46.2 3 18 +github.com/ethereum/go-ethereum/p2p/connection.go:48.36,52.2 3 18 +github.com/ethereum/go-ethereum/p2p/connection.go:54.72,64.2 1 18 +github.com/ethereum/go-ethereum/p2p/connection.go:66.46,68.2 1 18 +github.com/ethereum/go-ethereum/p2p/connection.go:70.47,72.2 1 19 +github.com/ethereum/go-ethereum/p2p/connection.go:74.51,76.2 1 8 +github.com/ethereum/go-ethereum/p2p/connection.go:78.37,86.6 7 18 +github.com/ethereum/go-ethereum/p2p/connection.go:86.6,89.23 2 304 +github.com/ethereum/go-ethereum/p2p/connection.go:96.3,96.10 1 304 +github.com/ethereum/go-ethereum/p2p/connection.go:89.23,92.4 2 12 +github.com/ethereum/go-ethereum/p2p/connection.go:92.5,94.4 1 292 +github.com/ethereum/go-ethereum/p2p/connection.go:97.3,98.32 1 136 +github.com/ethereum/go-ethereum/p2p/connection.go:99.3,100.18 1 136 +github.com/ethereum/go-ethereum/p2p/connection.go:112.4,112.46 1 136 +github.com/ethereum/go-ethereum/p2p/connection.go:113.3,115.42 2 7 +github.com/ethereum/go-ethereum/p2p/connection.go:120.4,120.46 1 7 +github.com/ethereum/go-ethereum/p2p/connection.go:121.3,122.25 1 7 +github.com/ethereum/go-ethereum/p2p/connection.go:123.3,126.10 3 18 +github.com/ethereum/go-ethereum/p2p/connection.go:100.18,101.43 1 133 +github.com/ethereum/go-ethereum/p2p/connection.go:101.43,103.6 1 129 +github.com/ethereum/go-ethereum/p2p/connection.go:103.7,103.25 1 4 +github.com/ethereum/go-ethereum/p2p/connection.go:103.25,105.6 1 0 +github.com/ethereum/go-ethereum/p2p/connection.go:105.7,107.6 1 4 +github.com/ethereum/go-ethereum/p2p/connection.go:108.6,111.5 2 3 +github.com/ethereum/go-ethereum/p2p/connection.go:115.42,117.5 1 0 +github.com/ethereum/go-ethereum/p2p/connection.go:117.6,119.5 1 7 +github.com/ethereum/go-ethereum/p2p/connection.go:132.38,136.6 4 18 +github.com/ethereum/go-ethereum/p2p/connection.go:136.6,137.35 1 56 +github.com/ethereum/go-ethereum/p2p/connection.go:141.3,141.10 1 56 +github.com/ethereum/go-ethereum/p2p/connection.go:137.35,140.4 2 19 +github.com/ethereum/go-ethereum/p2p/connection.go:142.3,143.38 1 19 +github.com/ethereum/go-ethereum/p2p/connection.go:144.3,145.18 1 19 +github.com/ethereum/go-ethereum/p2p/connection.go:151.3,154.10 3 18 +github.com/ethereum/go-ethereum/p2p/connection.go:145.18,148.5 2 19 +github.com/ethereum/go-ethereum/p2p/connection.go:148.6,150.5 1 0 +github.com/ethereum/go-ethereum/p2p/connection.go:159.43,166.2 4 19 +github.com/ethereum/go-ethereum/p2p/connection.go:168.39,169.34 1 19 +github.com/ethereum/go-ethereum/p2p/connection.go:169.34,173.3 3 0 +github.com/ethereum/go-ethereum/p2p/connection.go:176.69,180.15 4 19 +github.com/ethereum/go-ethereum/p2p/connection.go:184.2,184.13 1 19 +github.com/ethereum/go-ethereum/p2p/connection.go:180.15,183.3 2 0 +github.com/ethereum/go-ethereum/p2p/connection.go:187.74,199.6 8 136 +github.com/ethereum/go-ethereum/p2p/connection.go:248.2,248.13 1 136 +github.com/ethereum/go-ethereum/p2p/connection.go:199.6,203.28 1 152 +github.com/ethereum/go-ethereum/p2p/connection.go:218.3,218.12 1 17 +github.com/ethereum/go-ethereum/p2p/connection.go:203.28,205.11 2 145 +github.com/ethereum/go-ethereum/p2p/connection.go:216.4,216.39 1 10 +github.com/ethereum/go-ethereum/p2p/connection.go:205.11,207.38 2 135 +github.com/ethereum/go-ethereum/p2p/connection.go:214.5,214.14 1 135 +github.com/ethereum/go-ethereum/p2p/connection.go:207.38,208.15 1 2 +github.com/ethereum/go-ethereum/p2p/connection.go:208.15,210.7 1 1 +github.com/ethereum/go-ethereum/p2p/connection.go:210.8,212.7 1 1 +github.com/ethereum/go-ethereum/p2p/connection.go:218.12,220.50 1 10 +github.com/ethereum/go-ethereum/p2p/connection.go:224.4,227.18 3 9 +github.com/ethereum/go-ethereum/p2p/connection.go:220.50,222.10 2 1 +github.com/ethereum/go-ethereum/p2p/connection.go:227.18,229.5 1 8 +github.com/ethereum/go-ethereum/p2p/connection.go:229.6,232.5 2 1 +github.com/ethereum/go-ethereum/p2p/connection.go:233.5,239.4 4 7 +github.com/ethereum/go-ethereum/p2p/connection.go:251.82,253.6 2 136 +github.com/ethereum/go-ethereum/p2p/connection.go:274.2,274.13 1 136 +github.com/ethereum/go-ethereum/p2p/connection.go:253.6,259.41 4 136 +github.com/ethereum/go-ethereum/p2p/connection.go:259.41,260.21 1 136 +github.com/ethereum/go-ethereum/p2p/connection.go:263.4,263.42 1 136 +github.com/ethereum/go-ethereum/p2p/connection.go:260.21,262.5 1 10 +github.com/ethereum/go-ethereum/p2p/connection.go:263.42,264.10 1 136 +github.com/ethereum/go-ethereum/p2p/connection.go:266.5,272.4 4 0 +github.com/ethereum/go-ethereum/p2p/message.go:16.33,18.2 1 54 +github.com/ethereum/go-ethereum/p2p/message.go:20.40,22.2 1 5 +github.com/ethereum/go-ethereum/p2p/message.go:24.72,43.2 1 37 +github.com/ethereum/go-ethereum/p2p/message.go:45.60,59.2 5 5 +github.com/ethereum/go-ethereum/p2p/message.go:61.41,63.2 1 5 +github.com/ethereum/go-ethereum/p2p/message.go:67.54,68.28 1 28 +github.com/ethereum/go-ethereum/p2p/message.go:74.2,74.8 1 28 +github.com/ethereum/go-ethereum/p2p/message.go:68.28,71.3 2 27 +github.com/ethereum/go-ethereum/p2p/message.go:71.4,73.3 1 1 +github.com/ethereum/go-ethereum/p2p/messenger.go:28.104,41.2 2 10 +github.com/ethereum/go-ethereum/p2p/messenger.go:43.32,49.2 5 10 +github.com/ethereum/go-ethereum/p2p/messenger.go:51.31,56.42 4 10 +github.com/ethereum/go-ethereum/p2p/messenger.go:59.2,62.19 4 10 +github.com/ethereum/go-ethereum/p2p/messenger.go:56.42,58.3 1 14 +github.com/ethereum/go-ethereum/p2p/messenger.go:65.36,67.6 2 10 +github.com/ethereum/go-ethereum/p2p/messenger.go:67.6,68.10 1 14 +github.com/ethereum/go-ethereum/p2p/messenger.go:69.3,71.10 1 4 +github.com/ethereum/go-ethereum/p2p/messenger.go:76.3,78.10 2 10 +github.com/ethereum/go-ethereum/p2p/messenger.go:71.10,73.5 1 4 +github.com/ethereum/go-ethereum/p2p/messenger.go:73.6,75.5 1 0 +github.com/ethereum/go-ethereum/p2p/messenger.go:88.47,97.16 3 4 +github.com/ethereum/go-ethereum/p2p/messenger.go:102.2,103.16 2 4 +github.com/ethereum/go-ethereum/p2p/messenger.go:108.2,114.6 5 4 +github.com/ethereum/go-ethereum/p2p/messenger.go:97.16,100.3 2 0 +github.com/ethereum/go-ethereum/p2p/messenger.go:103.16,106.3 2 0 +github.com/ethereum/go-ethereum/p2p/messenger.go:114.6,115.10 1 4 +github.com/ethereum/go-ethereum/p2p/messenger.go:116.3,118.10 1 4 +github.com/ethereum/go-ethereum/p2p/messenger.go:123.3,124.10 1 0 +github.com/ethereum/go-ethereum/p2p/messenger.go:118.10,120.5 1 0 +github.com/ethereum/go-ethereum/p2p/messenger.go:120.6,122.5 1 4 +github.com/ethereum/go-ethereum/p2p/messenger.go:134.82,138.42 4 4 +github.com/ethereum/go-ethereum/p2p/messenger.go:144.2,144.67 1 0 +github.com/ethereum/go-ethereum/p2p/messenger.go:138.42,139.20 1 5 +github.com/ethereum/go-ethereum/p2p/messenger.go:142.3,142.16 1 1 +github.com/ethereum/go-ethereum/p2p/messenger.go:139.20,141.4 1 4 +github.com/ethereum/go-ethereum/p2p/messenger.go:147.128,152.6 4 8 +github.com/ethereum/go-ethereum/p2p/messenger.go:152.6,153.10 1 19 +github.com/ethereum/go-ethereum/p2p/messenger.go:154.3,155.10 1 10 +github.com/ethereum/go-ethereum/p2p/messenger.go:162.3,163.14 1 9 +github.com/ethereum/go-ethereum/p2p/messenger.go:155.10,158.5 2 3 +github.com/ethereum/go-ethereum/p2p/messenger.go:158.6,161.5 1 7 +github.com/ethereum/go-ethereum/p2p/messenger.go:163.14,167.5 3 1 +github.com/ethereum/go-ethereum/p2p/messenger.go:167.6,172.5 4 8 +github.com/ethereum/go-ethereum/p2p/messenger.go:177.57,182.33 5 3 +github.com/ethereum/go-ethereum/p2p/messenger.go:182.33,184.9 2 5 +github.com/ethereum/go-ethereum/p2p/messenger.go:184.9,194.4 8 4 +github.com/ethereum/go-ethereum/p2p/messenger.go:194.5,197.4 1 1 +github.com/ethereum/go-ethereum/p2p/messenger.go:201.63,206.23 5 26 +github.com/ethereum/go-ethereum/p2p/messenger.go:214.2,216.28 2 24 +github.com/ethereum/go-ethereum/p2p/messenger.go:219.2,219.12 1 24 +github.com/ethereum/go-ethereum/p2p/messenger.go:206.23,209.10 3 5 +github.com/ethereum/go-ethereum/p2p/messenger.go:212.3,212.29 1 3 +github.com/ethereum/go-ethereum/p2p/messenger.go:209.10,211.4 1 2 +github.com/ethereum/go-ethereum/p2p/messenger.go:216.28,218.3 1 18 +github.com/ethereum/go-ethereum/p2p/natupnp.go:23.54,25.16 2 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:28.2,29.16 2 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:32.2,36.16 4 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:40.2,49.32 5 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:92.2,93.8 2 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:25.16,27.3 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:29.16,31.3 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:36.16,38.3 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:49.32,51.17 2 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:54.3,56.17 3 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:61.3,62.43 2 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:67.3,70.19 4 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:73.3,75.19 3 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:78.3,81.17 4 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:84.3,86.17 3 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:89.3,90.9 2 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:51.17,53.4 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:56.17,57.12 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:62.43,63.12 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:70.19,71.12 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:75.19,76.12 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:81.17,83.4 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:86.17,88.4 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:148.59,150.31 2 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:155.2,155.12 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:150.31,151.37 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:151.37,153.4 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:158.62,160.31 2 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:165.2,165.12 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:160.31,161.39 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:161.39,163.4 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:168.40,170.16 2 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:173.2,174.30 2 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:177.2,177.27 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:170.16,172.3 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:174.30,176.3 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:180.60,182.16 2 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:185.2,186.25 2 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:190.2,193.16 3 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:196.2,197.75 2 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:201.2,202.14 2 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:206.2,207.14 2 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:211.2,212.14 2 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:216.2,217.8 2 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:182.16,184.3 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:186.25,189.3 2 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:193.16,195.3 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:197.75,200.3 2 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:202.14,205.3 2 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:207.14,210.3 2 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:212.14,215.3 2 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:220.48,226.2 5 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:228.79,234.16 3 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:237.2,246.16 8 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:250.2,250.19 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:254.2,254.25 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:260.2,260.8 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:234.16,236.3 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:246.16,248.3 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:250.19,252.3 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:254.25,259.3 3 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:267.64,274.16 4 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:280.2,281.8 2 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:274.16,276.3 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:284.65,286.16 2 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:289.2,290.8 2 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:286.16,288.3 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:293.152,307.16 7 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:313.2,315.8 3 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:307.16,309.3 1 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:318.98,327.16 4 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:333.2,334.8 2 0 +github.com/ethereum/go-ethereum/p2p/natupnp.go:327.16,329.3 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:57.55,62.2 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:64.63,70.2 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:72.71,73.26 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:81.2,81.50 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:73.26,75.23 2 0 +github.com/ethereum/go-ethereum/p2p/network.go:79.3,79.21 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:75.23,78.4 2 0 +github.com/ethereum/go-ethereum/p2p/network.go:84.45,85.22 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:99.2,99.8 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:86.2,86.12 0 0 +github.com/ethereum/go-ethereum/p2p/network.go:87.2,89.18 2 0 +github.com/ethereum/go-ethereum/p2p/network.go:94.2,95.42 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:96.2,97.57 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:89.18,91.4 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:91.5,93.4 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:102.32,106.2 3 0 +github.com/ethereum/go-ethereum/p2p/network.go:108.63,110.16 2 0 +github.com/ethereum/go-ethereum/p2p/network.go:115.2,115.8 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:110.16,112.3 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:112.4,114.3 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:118.46,122.6 3 0 +github.com/ethereum/go-ethereum/p2p/network.go:141.2,142.28 2 0 +github.com/ethereum/go-ethereum/p2p/network.go:122.6,123.10 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:124.3,127.53 3 0 +github.com/ethereum/go-ethereum/p2p/network.go:130.3,131.30 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:135.3,137.13 2 0 +github.com/ethereum/go-ethereum/p2p/network.go:127.53,129.5 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:131.30,132.54 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:132.54,133.6 0 0 +github.com/ethereum/go-ethereum/p2p/network.go:142.28,143.73 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:143.73,145.4 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:145.5,147.4 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:151.74,153.16 2 0 +github.com/ethereum/go-ethereum/p2p/network.go:159.2,159.17 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:153.16,158.3 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:162.69,164.16 2 0 +github.com/ethereum/go-ethereum/p2p/network.go:169.2,169.17 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:164.16,168.3 3 0 +github.com/ethereum/go-ethereum/p2p/network.go:172.65,173.39 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:177.2,179.16 3 0 +github.com/ethereum/go-ethereum/p2p/network.go:183.2,183.19 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:188.2,188.18 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:195.2,195.8 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:173.39,175.3 1 0 +github.com/ethereum/go-ethereum/p2p/network.go:179.16,182.3 2 0 +github.com/ethereum/go-ethereum/p2p/network.go:183.19,187.3 3 0 +github.com/ethereum/go-ethereum/p2p/network.go:188.18,192.3 2 0 +github.com/ethereum/go-ethereum/p2p/network.go:192.4,194.3 1 0 +github.com/ethereum/go-ethereum/p2p/peer.go:24.42,26.2 1 9 +github.com/ethereum/go-ethereum/p2p/peer.go:28.51,30.2 1 0 +github.com/ethereum/go-ethereum/p2p/peer.go:32.36,34.2 1 9 +github.com/ethereum/go-ethereum/p2p/peer.go:36.83,52.2 8 7 +github.com/ethereum/go-ethereum/p2p/peer.go:54.35,56.18 2 20 +github.com/ethereum/go-ethereum/p2p/peer.go:61.2,61.89 1 18 +github.com/ethereum/go-ethereum/p2p/peer.go:56.18,58.3 1 9 +github.com/ethereum/go-ethereum/p2p/peer.go:58.4,60.3 1 9 +github.com/ethereum/go-ethereum/p2p/peer.go:64.58,66.2 1 24 +github.com/ethereum/go-ethereum/p2p/peer.go:68.27,71.2 2 7 +github.com/ethereum/go-ethereum/p2p/peer.go:73.26,79.2 2 7 +github.com/ethereum/go-ethereum/p2p/peer.go:81.39,83.2 1 2 +github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:25.153,33.2 1 8 +github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:35.39,37.2 1 8 +github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:39.38,43.2 3 8 +github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:45.40,46.6 1 8 +github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:46.6,47.10 1 19 +github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:48.3,49.10 1 11 +github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:55.3,57.10 2 8 +github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:49.10,52.5 2 11 +github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:52.6,54.5 1 0 +github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:62.60,64.24 2 11 +github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:83.2,83.40 1 11 +github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:86.2,86.31 1 11 +github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:65.2,66.35 1 0 +github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:67.2,68.31 1 0 +github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:69.2,70.27 1 0 +github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:71.2,72.29 1 0 +github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:73.2,74.27 1 0 +github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:75.2,76.28 1 11 +github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:77.2,78.32 1 0 +github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:79.2,80.47 1 0 +github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:83.40,85.3 1 0 +github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:86.31,91.3 1 11 +github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:94.69,95.24 1 0 +github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:96.2,97.11 1 0 +github.com/ethereum/go-ethereum/p2p/peer_error_handler.go:98.2,99.11 1 0 +github.com/ethereum/go-ethereum/pow/ar/ops.go:11.13,21.2 9 1 +github.com/ethereum/go-ethereum/pow/ar/ops.go:23.34,25.2 1 899964 +github.com/ethereum/go-ethereum/pow/ar/ops.go:26.34,28.2 1 6 +github.com/ethereum/go-ethereum/pow/ar/ops.go:29.34,31.2 1 12 +github.com/ethereum/go-ethereum/pow/ar/ops.go:32.34,34.2 1 12 +github.com/ethereum/go-ethereum/pow/ar/ops.go:35.34,37.2 1 0 +github.com/ethereum/go-ethereum/pow/ar/ops.go:38.33,40.2 1 0 +github.com/ethereum/go-ethereum/pow/ar/ops.go:41.35,46.2 3 6 +github.com/ethereum/go-ethereum/pow/ar/ops.go:47.37,51.2 2 6 +github.com/ethereum/go-ethereum/pow/ar/ops.go:52.34,54.2 1 0 +github.com/ethereum/go-ethereum/pow/ar/pow.go:19.33,21.2 1 1 +github.com/ethereum/go-ethereum/pow/ar/pow.go:23.56,26.32 2 1 +github.com/ethereum/go-ethereum/pow/ar/pow.go:26.32,31.23 4 150000 +github.com/ethereum/go-ethereum/pow/ar/pow.go:37.3,38.49 2 150000 +github.com/ethereum/go-ethereum/pow/ar/pow.go:31.23,33.4 1 149979 +github.com/ethereum/go-ethereum/pow/ar/pow.go:33.5,35.4 1 21 +github.com/ethereum/go-ethereum/pow/ar/pow.go:42.69,44.32 2 6 +github.com/ethereum/go-ethereum/pow/ar/pow.go:48.2,48.30 1 6 +github.com/ethereum/go-ethereum/pow/ar/pow.go:55.2,56.34 2 6 +github.com/ethereum/go-ethereum/pow/ar/pow.go:74.2,74.18 1 6 +github.com/ethereum/go-ethereum/pow/ar/pow.go:44.32,46.3 1 60000 +github.com/ethereum/go-ethereum/pow/ar/pow.go:48.30,53.3 3 900000 +github.com/ethereum/go-ethereum/pow/ar/pow.go:56.34,58.10 2 9000 +github.com/ethereum/go-ethereum/pow/ar/pow.go:68.3,69.65 2 9000 +github.com/ethereum/go-ethereum/pow/ar/pow.go:58.10,59.29 1 9000 +github.com/ethereum/go-ethereum/pow/ar/pow.go:59.29,61.5 1 900000 +github.com/ethereum/go-ethereum/pow/ar/pow.go:62.5,63.29 1 0 +github.com/ethereum/go-ethereum/pow/ar/pow.go:63.29,65.5 1 0 +github.com/ethereum/go-ethereum/pow/ar/pow.go:69.65,71.4 1 0 +github.com/ethereum/go-ethereum/pow/ar/pow.go:77.53,94.2 12 0 +github.com/ethereum/go-ethereum/pow/ar/pow.go:96.45,104.6 6 1 +github.com/ethereum/go-ethereum/pow/ar/pow.go:104.6,105.54 1 6 +github.com/ethereum/go-ethereum/pow/ar/pow.go:110.3,116.51 5 6 +github.com/ethereum/go-ethereum/pow/ar/pow.go:105.54,108.4 2 1 +github.com/ethereum/go-ethereum/pow/ar/pow.go:116.51,118.4 1 1 +github.com/ethereum/go-ethereum/pow/ar/pow.go:118.5,120.4 1 5 +github.com/ethereum/go-ethereum/pow/ar/rnd.go:18.37,20.2 1 0 +github.com/ethereum/go-ethereum/pow/ar/rnd.go:22.35,23.31 1 510007 +github.com/ethereum/go-ethereum/pow/ar/rnd.go:36.2,36.12 1 0 +github.com/ethereum/go-ethereum/pow/ar/rnd.go:23.31,25.3 1 509988 +github.com/ethereum/go-ethereum/pow/ar/rnd.go:25.4,25.43 1 19 +github.com/ethereum/go-ethereum/pow/ar/rnd.go:25.43,27.3 1 13 +github.com/ethereum/go-ethereum/pow/ar/rnd.go:27.4,27.40 1 6 +github.com/ethereum/go-ethereum/pow/ar/rnd.go:27.40,29.23 2 6 +github.com/ethereum/go-ethereum/pow/ar/rnd.go:33.3,33.54 1 6 +github.com/ethereum/go-ethereum/pow/ar/rnd.go:29.23,31.4 1 60000 +github.com/ethereum/go-ethereum/pow/ar/rnd.go:48.26,50.2 1 7 +github.com/ethereum/go-ethereum/pow/ar/rnd.go:52.43,57.46 3 510021 +github.com/ethereum/go-ethereum/pow/ar/rnd.go:61.2,61.10 1 510021 +github.com/ethereum/go-ethereum/pow/ar/rnd.go:57.46,59.3 1 509988 +github.com/ethereum/go-ethereum/pow/ar/rnd.go:64.42,66.2 1 450021 +github.com/ethereum/go-ethereum/ptrie/hashnode.go:7.36,9.2 1 0 +github.com/ethereum/go-ethereum/ptrie/hashnode.go:11.45,13.2 1 0 +github.com/ethereum/go-ethereum/ptrie/hashnode.go:15.42,17.2 1 2 +github.com/ethereum/go-ethereum/ptrie/hashnode.go:20.36,20.50 1 0 +github.com/ethereum/go-ethereum/ptrie/hashnode.go:21.36,21.51 1 0 +github.com/ethereum/go-ethereum/ptrie/hashnode.go:22.36,22.51 1 0 +github.com/ethereum/go-ethereum/ptrie/node.go:17.51,17.78 1 0 +github.com/ethereum/go-ethereum/ptrie/node.go:18.51,18.78 1 0 +github.com/ethereum/go-ethereum/ptrie/node.go:19.51,19.78 1 2 +github.com/ethereum/go-ethereum/ptrie/node.go:20.51,20.91 1 81 +github.com/ethereum/go-ethereum/ptrie/node.go:21.51,21.90 1 18 +github.com/ethereum/go-ethereum/ptrie/node.go:24.50,26.34 2 12 +github.com/ethereum/go-ethereum/ptrie/node.go:34.2,34.42 1 12 +github.com/ethereum/go-ethereum/ptrie/node.go:26.34,27.18 1 204 +github.com/ethereum/go-ethereum/ptrie/node.go:27.18,29.4 1 95 +github.com/ethereum/go-ethereum/ptrie/node.go:29.5,31.4 1 109 +github.com/ethereum/go-ethereum/ptrie/node.go:38.51,40.2 1 49 +github.com/ethereum/go-ethereum/ptrie/shortnode.go:11.63,13.2 1 147 +github.com/ethereum/go-ethereum/ptrie/shortnode.go:14.37,18.2 2 85 +github.com/ethereum/go-ethereum/ptrie/shortnode.go:19.37,19.52 1 0 +github.com/ethereum/go-ethereum/ptrie/shortnode.go:20.37,20.52 1 0 +github.com/ethereum/go-ethereum/ptrie/shortnode.go:22.46,24.2 1 97 +github.com/ethereum/go-ethereum/ptrie/shortnode.go:25.43,27.2 1 76 +github.com/ethereum/go-ethereum/ptrie/shortnode.go:29.37,31.2 1 85 +github.com/ethereum/go-ethereum/ptrie/trie.go:19.42,21.2 1 7 +github.com/ethereum/go-ethereum/ptrie/trie.go:22.48,24.2 1 76 +github.com/ethereum/go-ethereum/ptrie/trie.go:33.23,35.2 1 6 +github.com/ethereum/go-ethereum/ptrie/trie.go:37.46,46.2 6 2 +github.com/ethereum/go-ethereum/ptrie/trie.go:49.33,49.55 1 0 +github.com/ethereum/go-ethereum/ptrie/trie.go:50.33,52.22 2 7 +github.com/ethereum/go-ethereum/ptrie/trie.go:63.2,65.13 2 7 +github.com/ethereum/go-ethereum/ptrie/trie.go:52.22,54.33 2 7 +github.com/ethereum/go-ethereum/ptrie/trie.go:54.33,56.4 1 7 +github.com/ethereum/go-ethereum/ptrie/trie.go:56.5,58.4 1 0 +github.com/ethereum/go-ethereum/ptrie/trie.go:59.4,61.3 1 0 +github.com/ethereum/go-ethereum/ptrie/trie.go:68.56,68.106 1 74 +github.com/ethereum/go-ethereum/ptrie/trie.go:69.50,75.21 4 74 +github.com/ethereum/go-ethereum/ptrie/trie.go:81.2,81.18 1 74 +github.com/ethereum/go-ethereum/ptrie/trie.go:75.21,77.3 1 70 +github.com/ethereum/go-ethereum/ptrie/trie.go:77.4,79.3 1 4 +github.com/ethereum/go-ethereum/ptrie/trie.go:84.48,84.80 1 4 +github.com/ethereum/go-ethereum/ptrie/trie.go:85.42,92.14 5 4 +github.com/ethereum/go-ethereum/ptrie/trie.go:96.2,96.12 1 1 +github.com/ethereum/go-ethereum/ptrie/trie.go:92.14,94.3 1 3 +github.com/ethereum/go-ethereum/ptrie/trie.go:99.49,99.84 1 0 +github.com/ethereum/go-ethereum/ptrie/trie.go:100.43,108.2 5 0 +github.com/ethereum/go-ethereum/ptrie/trie.go:110.66,111.19 1 298 +github.com/ethereum/go-ethereum/ptrie/trie.go:115.2,115.17 1 285 +github.com/ethereum/go-ethereum/ptrie/trie.go:119.2,119.29 1 206 +github.com/ethereum/go-ethereum/ptrie/trie.go:111.19,113.3 1 13 +github.com/ethereum/go-ethereum/ptrie/trie.go:115.17,117.3 1 79 +github.com/ethereum/go-ethereum/ptrie/trie.go:120.2,123.26 3 76 +github.com/ethereum/go-ethereum/ptrie/trie.go:127.3,129.28 3 76 +github.com/ethereum/go-ethereum/ptrie/trie.go:139.3,139.23 1 76 +github.com/ethereum/go-ethereum/ptrie/trie.go:143.3,143.50 1 63 +github.com/ethereum/go-ethereum/ptrie/trie.go:145.2,149.13 3 130 +github.com/ethereum/go-ethereum/ptrie/trie.go:151.2,152.24 1 0 +github.com/ethereum/go-ethereum/ptrie/trie.go:123.26,125.4 1 0 +github.com/ethereum/go-ethereum/ptrie/trie.go:129.28,131.4 1 54 +github.com/ethereum/go-ethereum/ptrie/trie.go:131.5,138.4 6 22 +github.com/ethereum/go-ethereum/ptrie/trie.go:139.23,141.4 1 13 +github.com/ethereum/go-ethereum/ptrie/trie.go:156.51,157.19 1 15 +github.com/ethereum/go-ethereum/ptrie/trie.go:161.2,161.17 1 12 +github.com/ethereum/go-ethereum/ptrie/trie.go:165.2,165.29 1 12 +github.com/ethereum/go-ethereum/ptrie/trie.go:157.19,159.3 1 3 +github.com/ethereum/go-ethereum/ptrie/trie.go:161.17,163.3 1 0 +github.com/ethereum/go-ethereum/ptrie/trie.go:166.2,170.57 3 5 +github.com/ethereum/go-ethereum/ptrie/trie.go:174.3,174.13 1 1 +github.com/ethereum/go-ethereum/ptrie/trie.go:175.2,176.45 1 7 +github.com/ethereum/go-ethereum/ptrie/trie.go:177.2,178.24 1 0 +github.com/ethereum/go-ethereum/ptrie/trie.go:170.57,172.4 1 4 +github.com/ethereum/go-ethereum/ptrie/trie.go:182.54,183.19 1 10 +github.com/ethereum/go-ethereum/ptrie/trie.go:187.2,187.29 1 10 +github.com/ethereum/go-ethereum/ptrie/trie.go:183.19,185.3 1 0 +github.com/ethereum/go-ethereum/ptrie/trie.go:188.2,191.26 3 4 +github.com/ethereum/go-ethereum/ptrie/trie.go:210.2,215.27 4 6 +github.com/ethereum/go-ethereum/ptrie/trie.go:225.3,226.16 2 6 +github.com/ethereum/go-ethereum/ptrie/trie.go:242.3,242.15 1 6 +github.com/ethereum/go-ethereum/ptrie/trie.go:244.2,245.24 1 0 +github.com/ethereum/go-ethereum/ptrie/trie.go:191.26,193.4 1 4 +github.com/ethereum/go-ethereum/ptrie/trie.go:193.5,193.42 1 0 +github.com/ethereum/go-ethereum/ptrie/trie.go:193.42,197.33 3 0 +github.com/ethereum/go-ethereum/ptrie/trie.go:205.4,205.12 1 0 +github.com/ethereum/go-ethereum/ptrie/trie.go:198.4,200.48 2 0 +github.com/ethereum/go-ethereum/ptrie/trie.go:201.4,202.44 1 0 +github.com/ethereum/go-ethereum/ptrie/trie.go:206.5,208.4 1 0 +github.com/ethereum/go-ethereum/ptrie/trie.go:215.27,216.29 1 102 +github.com/ethereum/go-ethereum/ptrie/trie.go:216.29,217.18 1 10 +github.com/ethereum/go-ethereum/ptrie/trie.go:217.18,219.6 1 6 +github.com/ethereum/go-ethereum/ptrie/trie.go:219.7,221.6 1 4 +github.com/ethereum/go-ethereum/ptrie/trie.go:226.16,228.4 1 0 +github.com/ethereum/go-ethereum/ptrie/trie.go:228.5,228.22 1 6 +github.com/ethereum/go-ethereum/ptrie/trie.go:228.22,230.33 2 2 +github.com/ethereum/go-ethereum/ptrie/trie.go:231.4,234.49 2 0 +github.com/ethereum/go-ethereum/ptrie/trie.go:235.4,236.68 1 2 +github.com/ethereum/go-ethereum/ptrie/trie.go:238.5,240.4 1 4 +github.com/ethereum/go-ethereum/ptrie/trie.go:250.53,252.11 2 95 +github.com/ethereum/go-ethereum/ptrie/trie.go:253.2,254.105 1 3 +github.com/ethereum/go-ethereum/ptrie/trie.go:255.2,257.26 2 5 +github.com/ethereum/go-ethereum/ptrie/trie.go:260.3,260.15 1 5 +github.com/ethereum/go-ethereum/ptrie/trie.go:261.2,262.34 1 25 +github.com/ethereum/go-ethereum/ptrie/trie.go:263.2,264.41 1 62 +github.com/ethereum/go-ethereum/ptrie/trie.go:257.26,259.4 1 85 +github.com/ethereum/go-ethereum/ptrie/trie.go:268.41,269.29 1 200 +github.com/ethereum/go-ethereum/ptrie/trie.go:270.2,272.28 2 5 +github.com/ethereum/go-ethereum/ptrie/trie.go:273.2,274.14 1 195 +github.com/ethereum/go-ethereum/ptrie/trie.go:278.48,280.21 2 103 +github.com/ethereum/go-ethereum/ptrie/trie.go:287.2,287.23 1 27 +github.com/ethereum/go-ethereum/ptrie/trie.go:280.21,285.3 3 76 +github.com/ethereum/go-ethereum/ptrie/valuenode.go:8.46,8.61 1 0 +github.com/ethereum/go-ethereum/ptrie/valuenode.go:9.46,9.66 1 3 +github.com/ethereum/go-ethereum/ptrie/valuenode.go:10.46,10.61 1 0 +github.com/ethereum/go-ethereum/ptrie/valuenode.go:11.46,11.61 1 0 +github.com/ethereum/go-ethereum/ptrie/valuenode.go:12.46,12.66 1 0 +github.com/ethereum/go-ethereum/ptrie/valuenode.go:13.46,13.66 1 135 +github.com/ethereum/go-ethereum/ptrie/fullnode.go:8.37,10.2 1 27 +github.com/ethereum/go-ethereum/ptrie/fullnode.go:12.36,12.51 1 0 +github.com/ethereum/go-ethereum/ptrie/fullnode.go:13.36,16.2 2 0 +github.com/ethereum/go-ethereum/ptrie/fullnode.go:18.35,18.50 1 136 +github.com/ethereum/go-ethereum/ptrie/fullnode.go:21.42,22.34 1 0 +github.com/ethereum/go-ethereum/ptrie/fullnode.go:28.2,28.8 1 0 +github.com/ethereum/go-ethereum/ptrie/fullnode.go:22.34,23.18 1 0 +github.com/ethereum/go-ethereum/ptrie/fullnode.go:23.18,25.4 1 0 +github.com/ethereum/go-ethereum/ptrie/fullnode.go:31.42,33.2 1 27 +github.com/ethereum/go-ethereum/ptrie/fullnode.go:35.45,37.34 2 33 +github.com/ethereum/go-ethereum/ptrie/fullnode.go:45.2,45.10 1 33 +github.com/ethereum/go-ethereum/ptrie/fullnode.go:37.34,38.18 1 561 +github.com/ethereum/go-ethereum/ptrie/fullnode.go:38.18,40.4 1 136 +github.com/ethereum/go-ethereum/ptrie/fullnode.go:40.5,42.4 1 425 +github.com/ethereum/go-ethereum/ptrie/fullnode.go:48.47,50.2 1 265 +github.com/ethereum/go-ethereum/ptrie/fullnode.go:52.40,53.31 1 249 +github.com/ethereum/go-ethereum/ptrie/fullnode.go:58.2,58.12 1 134 +github.com/ethereum/go-ethereum/ptrie/fullnode.go:53.31,57.3 2 115 +github.com/ethereum/go-ethereum/rlp/decode.go:69.50,71.2 1 73 +github.com/ethereum/go-ethereum/rlp/decode.go:73.47,75.9 2 2 +github.com/ethereum/go-ethereum/rlp/decode.go:76.2,77.19 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:78.2,79.20 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:80.2,81.23 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:85.52,87.16 2 36 +github.com/ethereum/go-ethereum/rlp/decode.go:90.2,91.12 2 31 +github.com/ethereum/go-ethereum/rlp/decode.go:87.16,89.3 1 5 +github.com/ethereum/go-ethereum/rlp/decode.go:94.53,96.16 2 24 +github.com/ethereum/go-ethereum/rlp/decode.go:99.2,100.12 2 16 +github.com/ethereum/go-ethereum/rlp/decode.go:96.16,98.3 1 8 +github.com/ethereum/go-ethereum/rlp/decode.go:103.55,105.16 2 7 +github.com/ethereum/go-ethereum/rlp/decode.go:108.2,109.12 2 5 +github.com/ethereum/go-ethereum/rlp/decode.go:105.16,107.3 1 2 +github.com/ethereum/go-ethereum/rlp/decode.go:112.60,114.2 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:116.55,118.16 2 4 +github.com/ethereum/go-ethereum/rlp/decode.go:121.2,122.14 2 3 +github.com/ethereum/go-ethereum/rlp/decode.go:126.2,127.12 2 3 +github.com/ethereum/go-ethereum/rlp/decode.go:118.16,120.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:122.14,125.3 2 2 +github.com/ethereum/go-ethereum/rlp/decode.go:132.57,134.89 2 8 +github.com/ethereum/go-ethereum/rlp/decode.go:141.2,142.16 2 5 +github.com/ethereum/go-ethereum/rlp/decode.go:145.2,146.33 2 5 +github.com/ethereum/go-ethereum/rlp/decode.go:149.2,149.50 1 5 +github.com/ethereum/go-ethereum/rlp/decode.go:152.2,152.17 1 5 +github.com/ethereum/go-ethereum/rlp/decode.go:134.89,135.34 1 3 +github.com/ethereum/go-ethereum/rlp/decode.go:135.34,137.4 1 2 +github.com/ethereum/go-ethereum/rlp/decode.go:137.5,139.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:142.16,144.3 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:146.33,148.3 1 2 +github.com/ethereum/go-ethereum/rlp/decode.go:149.50,151.3 1 9 +github.com/ethereum/go-ethereum/rlp/decode.go:161.83,163.16 2 20 +github.com/ethereum/go-ethereum/rlp/decode.go:166.2,166.15 1 20 +github.com/ethereum/go-ethereum/rlp/decode.go:175.2,176.6 2 14 +github.com/ethereum/go-ethereum/rlp/decode.go:203.2,203.19 1 11 +github.com/ethereum/go-ethereum/rlp/decode.go:211.2,211.20 1 11 +github.com/ethereum/go-ethereum/rlp/decode.go:163.16,165.3 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:166.15,167.34 1 6 +github.com/ethereum/go-ethereum/rlp/decode.go:172.3,172.21 1 6 +github.com/ethereum/go-ethereum/rlp/decode.go:167.34,169.4 1 3 +github.com/ethereum/go-ethereum/rlp/decode.go:169.5,171.4 1 3 +github.com/ethereum/go-ethereum/rlp/decode.go:176.6,177.18 1 49 +github.com/ethereum/go-ethereum/rlp/decode.go:180.3,180.34 1 48 +github.com/ethereum/go-ethereum/rlp/decode.go:196.3,196.50 1 48 +github.com/ethereum/go-ethereum/rlp/decode.go:201.3,201.6 1 35 +github.com/ethereum/go-ethereum/rlp/decode.go:177.18,179.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:180.34,182.22 1 23 +github.com/ethereum/go-ethereum/rlp/decode.go:191.4,191.22 1 23 +github.com/ethereum/go-ethereum/rlp/decode.go:182.22,184.19 2 9 +github.com/ethereum/go-ethereum/rlp/decode.go:187.5,189.18 3 9 +github.com/ethereum/go-ethereum/rlp/decode.go:184.19,186.6 1 7 +github.com/ethereum/go-ethereum/rlp/decode.go:191.22,193.5 1 23 +github.com/ethereum/go-ethereum/rlp/decode.go:196.50,197.9 1 11 +github.com/ethereum/go-ethereum/rlp/decode.go:198.5,198.24 1 37 +github.com/ethereum/go-ethereum/rlp/decode.go:198.24,200.4 1 2 +github.com/ethereum/go-ethereum/rlp/decode.go:203.19,204.34 1 9 +github.com/ethereum/go-ethereum/rlp/decode.go:204.34,207.4 1 3 +github.com/ethereum/go-ethereum/rlp/decode.go:207.5,209.4 1 6 +github.com/ethereum/go-ethereum/rlp/decode.go:214.58,216.16 2 8 +github.com/ethereum/go-ethereum/rlp/decode.go:219.2,219.18 1 7 +github.com/ethereum/go-ethereum/rlp/decode.go:222.2,223.16 2 4 +github.com/ethereum/go-ethereum/rlp/decode.go:226.2,226.12 1 4 +github.com/ethereum/go-ethereum/rlp/decode.go:216.16,218.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:219.18,221.3 1 3 +github.com/ethereum/go-ethereum/rlp/decode.go:223.16,225.3 1 4 +github.com/ethereum/go-ethereum/rlp/decode.go:231.58,233.16 2 18 +github.com/ethereum/go-ethereum/rlp/decode.go:236.2,236.14 1 18 +github.com/ethereum/go-ethereum/rlp/decode.go:256.2,256.12 1 8 +github.com/ethereum/go-ethereum/rlp/decode.go:233.16,235.3 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:237.2,238.21 1 3 +github.com/ethereum/go-ethereum/rlp/decode.go:241.3,243.15 3 2 +github.com/ethereum/go-ethereum/rlp/decode.go:244.2,245.31 1 9 +github.com/ethereum/go-ethereum/rlp/decode.go:248.3,249.43 2 7 +github.com/ethereum/go-ethereum/rlp/decode.go:252.3,252.23 1 6 +github.com/ethereum/go-ethereum/rlp/decode.go:253.2,254.51 1 6 +github.com/ethereum/go-ethereum/rlp/decode.go:238.21,240.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:245.31,247.4 1 2 +github.com/ethereum/go-ethereum/rlp/decode.go:249.43,251.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:259.41,261.37 2 14 +github.com/ethereum/go-ethereum/rlp/decode.go:261.37,263.3 1 35 +github.com/ethereum/go-ethereum/rlp/decode.go:271.59,273.38 2 4 +github.com/ethereum/go-ethereum/rlp/decode.go:282.2,282.56 1 4 +github.com/ethereum/go-ethereum/rlp/decode.go:300.2,300.17 1 4 +github.com/ethereum/go-ethereum/rlp/decode.go:273.38,274.41 1 11 +github.com/ethereum/go-ethereum/rlp/decode.go:274.41,276.18 2 10 +github.com/ethereum/go-ethereum/rlp/decode.go:279.4,279.43 1 10 +github.com/ethereum/go-ethereum/rlp/decode.go:276.18,278.5 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:282.56,283.36 1 9 +github.com/ethereum/go-ethereum/rlp/decode.go:286.3,286.28 1 9 +github.com/ethereum/go-ethereum/rlp/decode.go:295.3,295.44 1 9 +github.com/ethereum/go-ethereum/rlp/decode.go:298.3,298.13 1 9 +github.com/ethereum/go-ethereum/rlp/decode.go:283.36,285.4 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:286.28,288.18 2 19 +github.com/ethereum/go-ethereum/rlp/decode.go:288.18,290.10 1 3 +github.com/ethereum/go-ethereum/rlp/decode.go:291.6,291.25 1 16 +github.com/ethereum/go-ethereum/rlp/decode.go:291.25,293.5 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:295.44,297.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:303.56,306.16 3 5 +github.com/ethereum/go-ethereum/rlp/decode.go:309.2,309.56 1 5 +github.com/ethereum/go-ethereum/rlp/decode.go:324.2,324.17 1 5 +github.com/ethereum/go-ethereum/rlp/decode.go:306.16,308.3 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:309.56,311.48 2 13 +github.com/ethereum/go-ethereum/rlp/decode.go:315.3,316.18 2 8 +github.com/ethereum/go-ethereum/rlp/decode.go:319.3,319.60 1 8 +github.com/ethereum/go-ethereum/rlp/decode.go:322.3,322.13 1 8 +github.com/ethereum/go-ethereum/rlp/decode.go:311.48,314.4 2 5 +github.com/ethereum/go-ethereum/rlp/decode.go:316.18,318.4 1 8 +github.com/ethereum/go-ethereum/rlp/decode.go:319.60,321.4 1 8 +github.com/ethereum/go-ethereum/rlp/decode.go:329.58,331.16 2 9 +github.com/ethereum/go-ethereum/rlp/decode.go:334.2,334.18 1 8 +github.com/ethereum/go-ethereum/rlp/decode.go:347.2,347.12 1 8 +github.com/ethereum/go-ethereum/rlp/decode.go:331.16,333.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:334.18,336.71 2 2 +github.com/ethereum/go-ethereum/rlp/decode.go:339.3,339.17 1 2 +github.com/ethereum/go-ethereum/rlp/decode.go:336.71,338.4 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:340.4,342.17 2 6 +github.com/ethereum/go-ethereum/rlp/decode.go:345.3,345.30 1 6 +github.com/ethereum/go-ethereum/rlp/decode.go:342.17,344.4 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:352.61,354.2 1 5 +github.com/ethereum/go-ethereum/rlp/decode.go:356.56,361.46 1 2 +github.com/ethereum/go-ethereum/rlp/decode.go:364.2,364.47 1 2 +github.com/ethereum/go-ethereum/rlp/decode.go:361.46,363.3 1 2 +github.com/ethereum/go-ethereum/rlp/decode.go:376.31,377.11 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:378.2,379.16 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:380.2,381.18 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:382.2,383.16 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:384.2,385.39 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:435.38,437.2 1 109 +github.com/ethereum/go-ethereum/rlp/decode.go:442.42,444.16 2 25 +github.com/ethereum/go-ethereum/rlp/decode.go:447.2,447.14 1 23 +github.com/ethereum/go-ethereum/rlp/decode.go:444.16,446.3 1 2 +github.com/ethereum/go-ethereum/rlp/decode.go:448.2,450.32 2 8 +github.com/ethereum/go-ethereum/rlp/decode.go:451.2,453.38 2 12 +github.com/ethereum/go-ethereum/rlp/decode.go:456.3,456.16 1 11 +github.com/ethereum/go-ethereum/rlp/decode.go:457.2,458.32 1 3 +github.com/ethereum/go-ethereum/rlp/decode.go:453.38,455.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:465.41,467.2 1 31 +github.com/ethereum/go-ethereum/rlp/decode.go:469.52,471.16 2 91 +github.com/ethereum/go-ethereum/rlp/decode.go:474.2,474.14 1 75 +github.com/ethereum/go-ethereum/rlp/decode.go:471.16,473.3 1 16 +github.com/ethereum/go-ethereum/rlp/decode.go:475.2,477.32 2 62 +github.com/ethereum/go-ethereum/rlp/decode.go:478.2,479.31 1 11 +github.com/ethereum/go-ethereum/rlp/decode.go:482.3,482.32 1 7 +github.com/ethereum/go-ethereum/rlp/decode.go:483.2,484.30 1 2 +github.com/ethereum/go-ethereum/rlp/decode.go:479.31,481.4 1 4 +github.com/ethereum/go-ethereum/rlp/decode.go:491.50,493.16 2 40 +github.com/ethereum/go-ethereum/rlp/decode.go:496.2,496.18 1 39 +github.com/ethereum/go-ethereum/rlp/decode.go:499.2,502.18 4 37 +github.com/ethereum/go-ethereum/rlp/decode.go:493.16,495.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:496.18,498.3 1 2 +github.com/ethereum/go-ethereum/rlp/decode.go:507.34,508.23 1 31 +github.com/ethereum/go-ethereum/rlp/decode.go:511.2,512.25 2 30 +github.com/ethereum/go-ethereum/rlp/decode.go:515.2,516.22 2 28 +github.com/ethereum/go-ethereum/rlp/decode.go:519.2,521.12 3 28 +github.com/ethereum/go-ethereum/rlp/decode.go:508.23,510.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:512.25,514.3 1 2 +github.com/ethereum/go-ethereum/rlp/decode.go:516.22,518.3 1 3 +github.com/ethereum/go-ethereum/rlp/decode.go:527.48,528.16 1 73 +github.com/ethereum/go-ethereum/rlp/decode.go:531.2,533.32 3 72 +github.com/ethereum/go-ethereum/rlp/decode.go:536.2,536.18 1 71 +github.com/ethereum/go-ethereum/rlp/decode.go:539.2,540.16 2 70 +github.com/ethereum/go-ethereum/rlp/decode.go:543.2,543.37 1 69 +github.com/ethereum/go-ethereum/rlp/decode.go:528.16,530.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:533.32,535.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:536.18,538.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:540.16,542.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:557.61,559.22 2 224 +github.com/ethereum/go-ethereum/rlp/decode.go:562.2,562.16 1 224 +github.com/ethereum/go-ethereum/rlp/decode.go:572.2,572.45 1 201 +github.com/ethereum/go-ethereum/rlp/decode.go:575.2,575.28 1 200 +github.com/ethereum/go-ethereum/rlp/decode.go:559.22,561.3 1 94 +github.com/ethereum/go-ethereum/rlp/decode.go:562.16,563.40 1 192 +github.com/ethereum/go-ethereum/rlp/decode.go:566.3,567.17 2 175 +github.com/ethereum/go-ethereum/rlp/decode.go:570.3,570.30 1 169 +github.com/ethereum/go-ethereum/rlp/decode.go:563.40,565.4 1 17 +github.com/ethereum/go-ethereum/rlp/decode.go:567.17,569.4 1 6 +github.com/ethereum/go-ethereum/rlp/decode.go:572.45,574.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:578.65,580.16 2 175 +github.com/ethereum/go-ethereum/rlp/decode.go:583.2,584.9 2 170 +github.com/ethereum/go-ethereum/rlp/decode.go:580.16,582.3 1 5 +github.com/ethereum/go-ethereum/rlp/decode.go:585.2,589.22 2 76 +github.com/ethereum/go-ethereum/rlp/decode.go:590.2,595.39 1 37 +github.com/ethereum/go-ethereum/rlp/decode.go:596.2,604.27 2 6 +github.com/ethereum/go-ethereum/rlp/decode.go:605.2,611.37 1 47 +github.com/ethereum/go-ethereum/rlp/decode.go:612.2,620.25 2 4 +github.com/ethereum/go-ethereum/rlp/decode.go:624.54,625.15 1 17 +github.com/ethereum/go-ethereum/rlp/decode.go:632.2,633.29 2 11 +github.com/ethereum/go-ethereum/rlp/decode.go:636.2,637.48 2 11 +github.com/ethereum/go-ethereum/rlp/decode.go:625.15,627.20 2 6 +github.com/ethereum/go-ethereum/rlp/decode.go:630.3,630.24 1 6 +github.com/ethereum/go-ethereum/rlp/decode.go:627.20,629.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:633.29,635.3 1 44 +github.com/ethereum/go-ethereum/rlp/decode.go:640.51,643.33 3 30 +github.com/ethereum/go-ethereum/rlp/decode.go:647.2,647.19 1 30 +github.com/ethereum/go-ethereum/rlp/decode.go:650.2,650.12 1 30 +github.com/ethereum/go-ethereum/rlp/decode.go:643.33,646.3 2 27 +github.com/ethereum/go-ethereum/rlp/decode.go:647.19,649.3 1 3 +github.com/ethereum/go-ethereum/rlp/decode.go:653.43,656.39 3 181 +github.com/ethereum/go-ethereum/rlp/decode.go:659.2,659.15 1 181 +github.com/ethereum/go-ethereum/rlp/decode.go:656.39,658.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:662.37,664.22 2 211 +github.com/ethereum/go-ethereum/rlp/decode.go:664.22,666.3 1 76 +github.com/ethereum/go-ethereum/rlp/typecache.go:21.58,25.17 4 70 +github.com/ethereum/go-ethereum/rlp/typecache.go:29.2,31.29 3 21 +github.com/ethereum/go-ethereum/rlp/typecache.go:25.17,27.3 1 49 +github.com/ethereum/go-ethereum/rlp/typecache.go:34.59,36.17 2 41 +github.com/ethereum/go-ethereum/rlp/typecache.go:43.2,45.16 3 27 +github.com/ethereum/go-ethereum/rlp/typecache.go:50.2,51.28 2 26 +github.com/ethereum/go-ethereum/rlp/typecache.go:36.17,39.3 1 14 +github.com/ethereum/go-ethereum/rlp/typecache.go:45.16,49.3 2 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:59.64,62.9 3 27 +github.com/ethereum/go-ethereum/rlp/typecache.go:86.2,86.18 1 27 +github.com/ethereum/go-ethereum/rlp/typecache.go:63.2,64.31 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:65.2,66.36 1 2 +github.com/ethereum/go-ethereum/rlp/typecache.go:67.2,68.30 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:69.2,70.35 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:71.2,72.37 1 2 +github.com/ethereum/go-ethereum/rlp/typecache.go:73.2,74.30 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:75.2,76.43 1 8 +github.com/ethereum/go-ethereum/rlp/typecache.go:77.2,78.45 1 4 +github.com/ethereum/go-ethereum/rlp/typecache.go:79.2,80.42 1 5 +github.com/ethereum/go-ethereum/rlp/typecache.go:81.2,82.33 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:83.2,84.64 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:89.37,91.2 1 22 +github.com/ethereum/go-ethereum/state/dump.go:23.34,29.70 2 1 +github.com/ethereum/go-ethereum/state/dump.go:42.2,43.16 2 1 +github.com/ethereum/go-ethereum/state/dump.go:47.2,47.13 1 1 +github.com/ethereum/go-ethereum/state/dump.go:29.70,35.66 4 0 +github.com/ethereum/go-ethereum/state/dump.go:39.3,39.59 1 0 +github.com/ethereum/go-ethereum/state/dump.go:35.66,38.4 2 0 +github.com/ethereum/go-ethereum/state/dump.go:43.16,45.3 1 0 +github.com/ethereum/go-ethereum/state/dump.go:51.48,53.59 2 0 +github.com/ethereum/go-ethereum/state/dump.go:53.59,55.3 1 0 +github.com/ethereum/go-ethereum/state/errors.go:13.36,17.2 2 0 +github.com/ethereum/go-ethereum/state/errors.go:18.40,20.2 1 0 +github.com/ethereum/go-ethereum/state/errors.go:21.51,23.2 1 0 +github.com/ethereum/go-ethereum/state/log.go:16.51,23.16 3 0 +github.com/ethereum/go-ethereum/state/log.go:27.2,27.12 1 0 +github.com/ethereum/go-ethereum/state/log.go:23.16,25.3 1 0 +github.com/ethereum/go-ethereum/state/log.go:30.40,32.2 1 0 +github.com/ethereum/go-ethereum/state/log.go:34.34,36.2 1 0 +github.com/ethereum/go-ethereum/state/log.go:40.40,42.27 2 0 +github.com/ethereum/go-ethereum/state/log.go:46.2,46.13 1 0 +github.com/ethereum/go-ethereum/state/log.go:42.27,44.3 1 0 +github.com/ethereum/go-ethereum/state/log.go:49.34,51.27 2 0 +github.com/ethereum/go-ethereum/state/log.go:54.2,54.47 1 0 +github.com/ethereum/go-ethereum/state/log.go:51.27,53.3 1 0 +github.com/ethereum/go-ethereum/state/manifest.go:16.30,21.2 3 6 +github.com/ethereum/go-ethereum/state/manifest.go:23.28,25.2 1 6 +github.com/ethereum/go-ethereum/state/manifest.go:27.57,31.2 2 0 +github.com/ethereum/go-ethereum/state/manifest.go:49.52,51.2 1 0 +github.com/ethereum/go-ethereum/state/manifest.go:53.38,55.2 1 0 +github.com/ethereum/go-ethereum/state/state.go:32.34,34.2 1 6 +github.com/ethereum/go-ethereum/state/state.go:36.32,38.2 1 0 +github.com/ethereum/go-ethereum/state/state.go:40.37,42.2 1 0 +github.com/ethereum/go-ethereum/state/state.go:44.32,46.2 1 0 +github.com/ethereum/go-ethereum/state/state.go:49.53,51.24 2 0 +github.com/ethereum/go-ethereum/state/state.go:55.2,55.21 1 0 +github.com/ethereum/go-ethereum/state/state.go:51.24,53.3 1 0 +github.com/ethereum/go-ethereum/state/state.go:58.61,61.38 2 0 +github.com/ethereum/go-ethereum/state/state.go:65.2,65.66 1 0 +github.com/ethereum/go-ethereum/state/state.go:61.38,63.3 1 0 +github.com/ethereum/go-ethereum/state/state.go:68.61,70.24 2 0 +github.com/ethereum/go-ethereum/state/state.go:70.24,72.3 1 0 +github.com/ethereum/go-ethereum/state/state.go:75.49,77.24 2 0 +github.com/ethereum/go-ethereum/state/state.go:81.2,81.10 1 0 +github.com/ethereum/go-ethereum/state/state.go:77.24,79.3 1 0 +github.com/ethereum/go-ethereum/state/state.go:84.56,86.24 2 0 +github.com/ethereum/go-ethereum/state/state.go:86.24,88.3 1 0 +github.com/ethereum/go-ethereum/state/state.go:91.48,93.24 2 0 +github.com/ethereum/go-ethereum/state/state.go:97.2,97.12 1 0 +github.com/ethereum/go-ethereum/state/state.go:93.24,95.3 1 0 +github.com/ethereum/go-ethereum/state/state.go:100.49,102.24 2 0 +github.com/ethereum/go-ethereum/state/state.go:106.2,106.12 1 0 +github.com/ethereum/go-ethereum/state/state.go:102.24,104.3 1 0 +github.com/ethereum/go-ethereum/state/state.go:109.66,111.24 2 0 +github.com/ethereum/go-ethereum/state/state.go:111.24,113.3 1 0 +github.com/ethereum/go-ethereum/state/state.go:116.45,118.24 2 0 +github.com/ethereum/go-ethereum/state/state.go:124.2,124.14 1 0 +github.com/ethereum/go-ethereum/state/state.go:118.24,122.3 2 0 +github.com/ethereum/go-ethereum/state/state.go:132.64,135.37 2 0 +github.com/ethereum/go-ethereum/state/state.go:139.2,139.65 1 0 +github.com/ethereum/go-ethereum/state/state.go:135.37,137.3 1 0 +github.com/ethereum/go-ethereum/state/state.go:143.64,147.2 2 0 +github.com/ethereum/go-ethereum/state/state.go:150.61,154.24 3 3 +github.com/ethereum/go-ethereum/state/state.go:158.2,159.20 2 1 +github.com/ethereum/go-ethereum/state/state.go:163.2,166.20 3 0 +github.com/ethereum/go-ethereum/state/state.go:154.24,156.3 1 2 +github.com/ethereum/go-ethereum/state/state.go:159.20,161.3 1 1 +github.com/ethereum/go-ethereum/state/state.go:169.56,171.2 1 0 +github.com/ethereum/go-ethereum/state/state.go:174.66,176.24 2 1 +github.com/ethereum/go-ethereum/state/state.go:180.2,180.20 1 1 +github.com/ethereum/go-ethereum/state/state.go:176.24,178.3 1 1 +github.com/ethereum/go-ethereum/state/state.go:184.61,193.2 5 1 +github.com/ethereum/go-ethereum/state/state.go:196.57,198.2 1 0 +github.com/ethereum/go-ethereum/state/state.go:204.40,206.2 1 0 +github.com/ethereum/go-ethereum/state/state.go:208.34,209.22 1 2 +github.com/ethereum/go-ethereum/state/state.go:226.2,226.12 1 0 +github.com/ethereum/go-ethereum/state/state.go:209.22,211.49 2 2 +github.com/ethereum/go-ethereum/state/state.go:215.3,215.41 1 2 +github.com/ethereum/go-ethereum/state/state.go:219.3,223.15 4 2 +github.com/ethereum/go-ethereum/state/state.go:211.49,213.4 1 1 +github.com/ethereum/go-ethereum/state/state.go:215.41,217.4 1 0 +github.com/ethereum/go-ethereum/state/state.go:229.38,230.18 1 1 +github.com/ethereum/go-ethereum/state/state.go:234.2,237.24 4 1 +github.com/ethereum/go-ethereum/state/state.go:230.18,232.3 1 0 +github.com/ethereum/go-ethereum/state/state.go:240.31,242.2 1 0 +github.com/ethereum/go-ethereum/state/state.go:245.25,249.45 2 0 +github.com/ethereum/go-ethereum/state/state.go:258.2,258.11 1 0 +github.com/ethereum/go-ethereum/state/state.go:249.45,250.31 1 0 +github.com/ethereum/go-ethereum/state/state.go:255.3,255.22 1 0 +github.com/ethereum/go-ethereum/state/state.go:250.31,251.12 1 0 +github.com/ethereum/go-ethereum/state/state.go:262.24,264.45 1 0 +github.com/ethereum/go-ethereum/state/state.go:272.2,274.11 2 0 +github.com/ethereum/go-ethereum/state/state.go:264.45,265.31 1 0 +github.com/ethereum/go-ethereum/state/state.go:269.3,269.27 1 0 +github.com/ethereum/go-ethereum/state/state.go:265.31,266.12 1 0 +github.com/ethereum/go-ethereum/state/state.go:277.28,280.2 2 0 +github.com/ethereum/go-ethereum/state/state.go:282.29,286.40 2 0 +github.com/ethereum/go-ethereum/state/state.go:290.2,290.48 1 0 +github.com/ethereum/go-ethereum/state/state.go:302.2,302.13 1 0 +github.com/ethereum/go-ethereum/state/state.go:286.40,288.3 1 0 +github.com/ethereum/go-ethereum/state/state.go:290.48,291.25 1 0 +github.com/ethereum/go-ethereum/state/state.go:291.25,294.4 2 0 +github.com/ethereum/go-ethereum/state/state.go:294.5,298.4 2 0 +github.com/ethereum/go-ethereum/state/state.go:302.13,304.13 2 0 +github.com/ethereum/go-ethereum/state/state.go:304.13,308.4 2 0 +github.com/ethereum/go-ethereum/state/state.go:312.41,314.2 1 0 +github.com/ethereum/go-ethereum/state/state.go:317.42,318.48 1 0 +github.com/ethereum/go-ethereum/state/state.go:318.48,320.3 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:14.34,16.2 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:20.36,22.31 2 1 +github.com/ethereum/go-ethereum/state/state_object.go:27.2,27.12 1 1 +github.com/ethereum/go-ethereum/state/state_object.go:22.31,25.3 1 1 +github.com/ethereum/go-ethereum/state/state_object.go:55.34,58.2 2 0 +github.com/ethereum/go-ethereum/state/state_object.go:60.47,70.2 6 2 +github.com/ethereum/go-ethereum/state/state_object.go:72.78,78.2 4 0 +github.com/ethereum/go-ethereum/state/state_object.go:80.65,85.2 3 0 +github.com/ethereum/go-ethereum/state/state_object.go:87.44,90.2 2 0 +github.com/ethereum/go-ethereum/state/state_object.go:92.59,94.2 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:96.63,98.2 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:100.66,102.2 1 1 +github.com/ethereum/go-ethereum/state/state_object.go:103.73,105.2 1 2 +github.com/ethereum/go-ethereum/state/state_object.go:107.62,109.2 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:111.60,115.18 3 1 +github.com/ethereum/go-ethereum/state/state_object.go:123.2,123.14 1 1 +github.com/ethereum/go-ethereum/state/state_object.go:115.18,118.21 2 0 +github.com/ethereum/go-ethereum/state/state_object.go:118.21,120.4 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:126.67,129.2 2 2 +github.com/ethereum/go-ethereum/state/state_object.go:132.60,134.39 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:140.2,141.49 2 0 +github.com/ethereum/go-ethereum/state/state_object.go:134.39,138.3 2 0 +github.com/ethereum/go-ethereum/state/state_object.go:141.49,143.31 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:143.31,145.4 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:149.33,150.39 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:161.2,162.12 2 0 +github.com/ethereum/go-ethereum/state/state_object.go:150.39,151.23 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:158.3,158.35 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:151.23,155.12 2 0 +github.com/ethereum/go-ethereum/state/state_object.go:162.12,166.3 2 0 +github.com/ethereum/go-ethereum/state/state_object.go:169.60,170.39 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:174.2,174.62 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:170.39,172.3 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:177.51,181.2 2 0 +github.com/ethereum/go-ethereum/state/state_object.go:182.50,182.74 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:184.51,188.2 2 0 +github.com/ethereum/go-ethereum/state/state_object.go:189.50,189.74 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:191.51,193.2 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:195.45,195.68 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:202.54,202.56 0 0 +github.com/ethereum/go-ethereum/state/state_object.go:203.61,205.30 2 0 +github.com/ethereum/go-ethereum/state/state_object.go:209.2,211.12 2 0 +github.com/ethereum/go-ethereum/state/state_object.go:205.30,207.3 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:214.56,218.2 2 0 +github.com/ethereum/go-ethereum/state/state_object.go:220.60,221.31 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:225.2,230.12 4 0 +github.com/ethereum/go-ethereum/state/state_object.go:221.31,223.3 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:233.57,240.2 4 0 +github.com/ethereum/go-ethereum/state/state_object.go:242.46,247.23 5 1 +github.com/ethereum/go-ethereum/state/state_object.go:250.2,256.20 6 1 +github.com/ethereum/go-ethereum/state/state_object.go:247.23,249.3 1 1 +github.com/ethereum/go-ethereum/state/state_object.go:259.56,261.2 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:267.36,269.2 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:272.40,274.2 1 1 +github.com/ethereum/go-ethereum/state/state_object.go:277.35,279.2 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:282.48,284.2 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:286.40,288.2 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:295.42,297.2 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:299.48,301.2 1 0 +github.com/ethereum/go-ethereum/state/state_object.go:303.46,315.2 8 0 +github.com/ethereum/go-ethereum/trie/encoding.go:9.44,11.37 2 17 +github.com/ethereum/go-ethereum/trie/encoding.go:15.2,15.21 1 17 +github.com/ethereum/go-ethereum/trie/encoding.go:19.2,21.17 3 17 +github.com/ethereum/go-ethereum/trie/encoding.go:27.2,28.40 2 17 +github.com/ethereum/go-ethereum/trie/encoding.go:32.2,32.22 1 17 +github.com/ethereum/go-ethereum/trie/encoding.go:11.37,13.3 1 9 +github.com/ethereum/go-ethereum/trie/encoding.go:15.21,17.3 1 9 +github.com/ethereum/go-ethereum/trie/encoding.go:21.17,23.3 1 9 +github.com/ethereum/go-ethereum/trie/encoding.go:23.4,25.3 1 8 +github.com/ethereum/go-ethereum/trie/encoding.go:28.40,30.3 1 46 +github.com/ethereum/go-ethereum/trie/encoding.go:35.39,38.18 3 12 +github.com/ethereum/go-ethereum/trie/encoding.go:41.2,41.20 1 12 +github.com/ethereum/go-ethereum/trie/encoding.go:47.2,47.13 1 12 +github.com/ethereum/go-ethereum/trie/encoding.go:38.18,40.3 1 7 +github.com/ethereum/go-ethereum/trie/encoding.go:41.20,43.3 1 6 +github.com/ethereum/go-ethereum/trie/encoding.go:43.4,45.3 1 6 +github.com/ethereum/go-ethereum/trie/encoding.go:50.42,55.24 4 21 +github.com/ethereum/go-ethereum/trie/encoding.go:58.2,60.17 2 21 +github.com/ethereum/go-ethereum/trie/encoding.go:55.24,57.3 1 152 +github.com/ethereum/go-ethereum/trie/encoding.go:63.39,67.24 3 0 +github.com/ethereum/go-ethereum/trie/encoding.go:73.2,75.20 2 0 +github.com/ethereum/go-ethereum/trie/encoding.go:67.24,68.13 1 0 +github.com/ethereum/go-ethereum/trie/encoding.go:68.13,70.4 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:18.44,19.21 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:23.2,23.21 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:32.2,32.19 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:19.21,21.3 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:23.21,25.17 2 0 +github.com/ethereum/go-ethereum/trie/iterator.go:29.3,29.17 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:25.17,27.4 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:43.40,45.2 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:47.70,48.23 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:73.2,73.12 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:49.2,55.11 4 0 +github.com/ethereum/go-ethereum/trie/iterator.go:56.2,57.29 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:61.3,61.33 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:67.2,70.79 2 0 +github.com/ethereum/go-ethereum/trie/iterator.go:57.29,59.4 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:61.33,63.16 2 0 +github.com/ethereum/go-ethereum/trie/iterator.go:63.16,65.5 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:76.83,77.35 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:129.2,129.12 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:78.2,79.13 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:80.2,81.19 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:90.3,91.19 2 0 +github.com/ethereum/go-ethereum/trie/iterator.go:95.3,95.27 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:102.2,104.22 2 0 +github.com/ethereum/go-ethereum/trie/iterator.go:81.19,85.16 3 0 +github.com/ethereum/go-ethereum/trie/iterator.go:85.16,87.5 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:91.19,93.4 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:95.27,98.16 3 0 +github.com/ethereum/go-ethereum/trie/iterator.go:98.16,100.5 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:104.22,105.49 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:105.49,110.5 3 0 +github.com/ethereum/go-ethereum/trie/iterator.go:111.5,115.26 4 0 +github.com/ethereum/go-ethereum/trie/iterator.go:123.4,123.18 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:115.26,117.5 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:117.6,117.49 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:117.49,119.5 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:119.6,121.5 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:123.18,125.5 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:133.47,143.2 6 0 +github.com/ethereum/go-ethereum/trie/slice.go:9.39,10.22 1 0 +github.com/ethereum/go-ethereum/trie/slice.go:13.2,13.22 1 0 +github.com/ethereum/go-ethereum/trie/slice.go:18.2,18.13 1 0 +github.com/ethereum/go-ethereum/trie/slice.go:10.22,12.3 1 0 +github.com/ethereum/go-ethereum/trie/slice.go:13.22,14.16 1 0 +github.com/ethereum/go-ethereum/trie/slice.go:14.16,16.4 1 0 +github.com/ethereum/go-ethereum/trie/slice.go:22.44,25.17 2 6 +github.com/ethereum/go-ethereum/trie/slice.go:32.2,32.10 1 6 +github.com/ethereum/go-ethereum/trie/slice.go:25.17,26.19 1 11 +github.com/ethereum/go-ethereum/trie/slice.go:29.3,29.6 1 7 +github.com/ethereum/go-ethereum/trie/slice.go:26.19,27.9 1 4 +github.com/ethereum/go-ethereum/trie/slice.go:35.29,37.2 1 0 +github.com/ethereum/go-ethereum/trie/slice.go:39.31,40.16 1 0 +github.com/ethereum/go-ethereum/trie/slice.go:44.2,44.10 1 0 +github.com/ethereum/go-ethereum/trie/slice.go:40.16,42.3 1 0 +github.com/ethereum/go-ethereum/trie/slice.go:47.35,48.21 1 0 +github.com/ethereum/go-ethereum/trie/slice.go:52.2,52.35 1 0 +github.com/ethereum/go-ethereum/trie/slice.go:48.21,50.3 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:12.44,15.59 2 0 +github.com/ethereum/go-ethereum/trie/trie.go:19.2,19.59 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:15.59,17.3 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:22.27,24.2 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:41.64,43.2 1 16 +github.com/ethereum/go-ethereum/trie/trie.go:45.29,47.2 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:55.43,57.2 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:59.69,63.29 3 26 +github.com/ethereum/go-ethereum/trie/trie.go:72.2,72.10 1 10 +github.com/ethereum/go-ethereum/trie/trie.go:63.29,70.3 4 16 +github.com/ethereum/go-ethereum/trie/trie.go:75.52,77.2 1 25 +github.com/ethereum/go-ethereum/trie/trie.go:79.52,81.37 1 13 +github.com/ethereum/go-ethereum/trie/trie.go:86.2,90.15 3 0 +github.com/ethereum/go-ethereum/trie/trie.go:97.2,99.14 2 0 +github.com/ethereum/go-ethereum/trie/trie.go:81.37,83.3 1 13 +github.com/ethereum/go-ethereum/trie/trie.go:90.15,91.31 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:91.31,94.4 2 0 +github.com/ethereum/go-ethereum/trie/trie.go:102.40,106.2 2 0 +github.com/ethereum/go-ethereum/trie/trie.go:108.30,110.20 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:114.2,114.37 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:120.2,124.28 2 0 +github.com/ethereum/go-ethereum/trie/trie.go:110.20,112.3 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:114.37,115.17 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:115.17,118.4 2 0 +github.com/ethereum/go-ethereum/trie/trie.go:124.28,126.3 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:129.28,130.37 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:135.2,135.23 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:130.37,131.17 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:131.17,133.4 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:152.45,154.32 2 2 +github.com/ethereum/go-ethereum/trie/trie.go:160.2,160.21 1 2 +github.com/ethereum/go-ethereum/trie/trie.go:154.32,156.3 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:156.4,158.3 1 2 +github.com/ethereum/go-ethereum/trie/trie.go:163.55,172.2 5 1 +github.com/ethereum/go-ethereum/trie/trie.go:174.45,175.26 1 9 +github.com/ethereum/go-ethereum/trie/trie.go:176.2,182.24 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:183.2,184.19 1 7 +github.com/ethereum/go-ethereum/trie/trie.go:185.2,186.46 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:194.42,201.17 5 8 +github.com/ethereum/go-ethereum/trie/trie.go:206.2,206.17 1 8 +github.com/ethereum/go-ethereum/trie/trie.go:201.17,203.3 1 6 +github.com/ethereum/go-ethereum/trie/trie.go:203.4,205.3 1 2 +github.com/ethereum/go-ethereum/trie/trie.go:209.39,217.2 5 0 +github.com/ethereum/go-ethereum/trie/trie.go:219.35,227.2 5 0 +github.com/ethereum/go-ethereum/trie/trie.go:229.36,230.31 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:231.2,232.14 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:235.3,235.19 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:236.2,237.18 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:241.3,241.11 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:242.2,243.72 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:232.14,234.4 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:237.18,239.4 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:248.37,250.2 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:253.29,255.39 2 0 +github.com/ethereum/go-ethereum/trie/trie.go:259.2,259.13 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:255.39,257.3 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:263.23,266.2 2 0 +github.com/ethereum/go-ethereum/trie/trie.go:268.23,271.2 2 0 +github.com/ethereum/go-ethereum/trie/trie.go:273.31,275.2 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:277.67,280.48 2 0 +github.com/ethereum/go-ethereum/trie/trie.go:284.2,287.17 3 0 +github.com/ethereum/go-ethereum/trie/trie.go:304.2,304.28 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:280.48,282.3 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:287.17,289.3 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:289.4,289.24 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:289.24,294.57 3 0 +github.com/ethereum/go-ethereum/trie/trie.go:294.57,296.4 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:296.5,298.4 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:299.4,299.25 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:299.25,301.3 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:307.57,310.23 2 18 +github.com/ethereum/go-ethereum/trie/trie.go:314.2,315.19 2 13 +github.com/ethereum/go-ethereum/trie/trie.go:321.2,323.13 2 13 +github.com/ethereum/go-ethereum/trie/trie.go:310.23,312.3 1 5 +github.com/ethereum/go-ethereum/trie/trie.go:315.19,317.3 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:317.4,317.26 1 13 +github.com/ethereum/go-ethereum/trie/trie.go:317.26,319.3 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:326.84,328.2 1 6 +github.com/ethereum/go-ethereum/trie/trie.go:330.50,333.2 1 25 +github.com/ethereum/go-ethereum/trie/trie.go:335.44,337.25 2 13 +github.com/ethereum/go-ethereum/trie/trie.go:340.2,340.14 1 13 +github.com/ethereum/go-ethereum/trie/trie.go:337.25,339.3 1 221 +github.com/ethereum/go-ethereum/trie/trie.go:343.89,344.19 1 22 +github.com/ethereum/go-ethereum/trie/trie.go:349.2,350.33 2 19 +github.com/ethereum/go-ethereum/trie/trie.go:356.2,358.28 2 12 +github.com/ethereum/go-ethereum/trie/trie.go:412.2,412.25 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:344.19,346.3 1 3 +github.com/ethereum/go-ethereum/trie/trie.go:350.33,354.3 2 7 +github.com/ethereum/go-ethereum/trie/trie.go:358.28,365.26 3 6 +github.com/ethereum/go-ethereum/trie/trie.go:370.3,372.31 3 6 +github.com/ethereum/go-ethereum/trie/trie.go:388.3,388.26 1 6 +github.com/ethereum/go-ethereum/trie/trie.go:365.26,368.4 2 0 +github.com/ethereum/go-ethereum/trie/trie.go:372.31,375.4 1 2 +github.com/ethereum/go-ethereum/trie/trie.go:375.5,386.4 6 4 +github.com/ethereum/go-ethereum/trie/trie.go:388.26,391.4 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:391.5,394.4 2 5 +github.com/ethereum/go-ethereum/trie/trie.go:395.4,400.27 2 6 +github.com/ethereum/go-ethereum/trie/trie.go:407.3,409.24 2 6 +github.com/ethereum/go-ethereum/trie/trie.go:400.27,402.18 2 102 +github.com/ethereum/go-ethereum/trie/trie.go:402.18,404.5 1 102 +github.com/ethereum/go-ethereum/trie/trie.go:415.70,416.19 1 5 +github.com/ethereum/go-ethereum/trie/trie.go:421.2,423.33 2 5 +github.com/ethereum/go-ethereum/trie/trie.go:430.2,432.28 2 5 +github.com/ethereum/go-ethereum/trie/trie.go:502.2,502.28 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:416.19,418.3 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:423.33,428.3 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:432.28,438.26 3 2 +github.com/ethereum/go-ethereum/trie/trie.go:438.26,442.4 1 2 +github.com/ethereum/go-ethereum/trie/trie.go:442.5,442.42 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:442.42,447.24 4 0 +github.com/ethereum/go-ethereum/trie/trie.go:456.4,456.25 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:447.24,450.5 2 0 +github.com/ethereum/go-ethereum/trie/trie.go:450.6,452.5 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:457.5,459.4 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:460.4,465.27 3 3 +github.com/ethereum/go-ethereum/trie/trie.go:472.3,474.27 3 3 +github.com/ethereum/go-ethereum/trie/trie.go:483.3,483.19 1 3 +github.com/ethereum/go-ethereum/trie/trie.go:499.3,499.24 1 3 +github.com/ethereum/go-ethereum/trie/trie.go:465.27,467.18 2 51 +github.com/ethereum/go-ethereum/trie/trie.go:467.18,469.5 1 51 +github.com/ethereum/go-ethereum/trie/trie.go:474.27,475.18 1 51 +github.com/ethereum/go-ethereum/trie/trie.go:475.18,476.21 1 5 +github.com/ethereum/go-ethereum/trie/trie.go:476.21,478.6 1 3 +github.com/ethereum/go-ethereum/trie/trie.go:478.7,480.6 1 2 +github.com/ethereum/go-ethereum/trie/trie.go:483.19,485.4 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:485.5,485.25 1 3 +github.com/ethereum/go-ethereum/trie/trie.go:485.25,487.25 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:487.25,489.5 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:489.6,489.31 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:489.31,492.5 2 0 +github.com/ethereum/go-ethereum/trie/trie.go:494.5,496.4 1 2 +github.com/ethereum/go-ethereum/trie/trie.go:516.44,518.2 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:520.40,522.2 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:526.62,527.28 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:527.28,530.37 2 0 +github.com/ethereum/go-ethereum/trie/trie.go:530.37,532.4 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:532.5,533.25 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:533.25,535.5 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:535.6,538.5 2 0 +github.com/ethereum/go-ethereum/trie/trie.go:540.4,541.42 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:541.42,542.48 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:542.48,544.5 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:544.6,545.39 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:545.39,547.6 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:547.7,549.19 2 0 +github.com/ethereum/go-ethereum/trie/trie.go:549.19,552.7 2 0 +github.com/ethereum/go-ethereum/trie/trie.go:559.46,562.2 2 0 +github.com/ethereum/go-ethereum/trie/trie.go:564.44,565.24 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:569.2,571.16 2 0 +github.com/ethereum/go-ethereum/trie/trie.go:565.24,567.3 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:574.37,576.27 2 0 +github.com/ethereum/go-ethereum/trie/trie.go:579.2,579.23 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:576.27,578.3 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:582.38,584.2 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:586.40,588.2 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:592.47,594.2 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:596.77,598.2 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:600.94,601.28 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:601.28,605.70 3 0 +github.com/ethereum/go-ethereum/trie/trie.go:605.70,607.4 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:607.5,608.25 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:608.25,610.5 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:610.6,612.5 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:614.4,615.42 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:615.42,617.48 2 0 +github.com/ethereum/go-ethereum/trie/trie.go:617.48,619.5 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:619.6,620.72 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:620.72,622.6 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:622.7,624.19 2 0 +github.com/ethereum/go-ethereum/trie/trie.go:624.19,626.7 1 0 +github.com/ethereum/go-ethereum/vm/stack.go:25.24,27.2 1 4 +github.com/ethereum/go-ethereum/vm/stack.go:29.36,31.2 1 0 +github.com/ethereum/go-ethereum/vm/stack.go:33.28,35.2 1 141 +github.com/ethereum/go-ethereum/vm/stack.go:37.33,44.2 4 42 +github.com/ethereum/go-ethereum/vm/stack.go:46.46,53.2 4 20 +github.com/ethereum/go-ethereum/vm/stack.go:55.34,59.2 2 16 +github.com/ethereum/go-ethereum/vm/stack.go:61.47,65.2 2 0 +github.com/ethereum/go-ethereum/vm/stack.go:67.52,71.2 2 0 +github.com/ethereum/go-ethereum/vm/stack.go:73.39,77.2 2 0 +github.com/ethereum/go-ethereum/vm/stack.go:79.35,81.2 1 84 +github.com/ethereum/go-ethereum/vm/stack.go:83.50,86.29 2 0 +github.com/ethereum/go-ethereum/vm/stack.go:91.2,91.12 1 0 +github.com/ethereum/go-ethereum/vm/stack.go:86.29,89.3 2 0 +github.com/ethereum/go-ethereum/vm/stack.go:94.26,96.22 2 0 +github.com/ethereum/go-ethereum/vm/stack.go:103.2,103.30 1 0 +github.com/ethereum/go-ethereum/vm/stack.go:96.22,97.31 1 0 +github.com/ethereum/go-ethereum/vm/stack.go:97.31,99.4 1 0 +github.com/ethereum/go-ethereum/vm/stack.go:100.4,102.3 1 0 +github.com/ethereum/go-ethereum/vm/stack.go:110.26,112.2 1 3 +github.com/ethereum/go-ethereum/vm/stack.go:114.56,115.20 1 2 +github.com/ethereum/go-ethereum/vm/stack.go:115.20,118.24 3 2 +github.com/ethereum/go-ethereum/vm/stack.go:128.3,128.43 1 2 +github.com/ethereum/go-ethereum/vm/stack.go:118.24,121.16 2 2 +github.com/ethereum/go-ethereum/vm/stack.go:121.16,126.5 2 2 +github.com/ethereum/go-ethereum/vm/stack.go:132.38,133.28 1 28 +github.com/ethereum/go-ethereum/vm/stack.go:133.28,135.3 1 8 +github.com/ethereum/go-ethereum/vm/stack.go:138.49,139.32 1 4 +github.com/ethereum/go-ethereum/vm/stack.go:145.2,145.12 1 0 +github.com/ethereum/go-ethereum/vm/stack.go:139.32,143.3 2 4 +github.com/ethereum/go-ethereum/vm/stack.go:148.59,149.35 1 0 +github.com/ethereum/go-ethereum/vm/stack.go:157.2,157.8 1 0 +github.com/ethereum/go-ethereum/vm/stack.go:149.35,155.3 4 0 +github.com/ethereum/go-ethereum/vm/stack.go:160.28,162.2 1 139 +github.com/ethereum/go-ethereum/vm/stack.go:164.32,166.2 1 0 +github.com/ethereum/go-ethereum/vm/stack.go:168.26,170.22 2 0 +github.com/ethereum/go-ethereum/vm/stack.go:179.2,179.37 1 0 +github.com/ethereum/go-ethereum/vm/stack.go:170.22,172.45 2 0 +github.com/ethereum/go-ethereum/vm/stack.go:172.45,175.4 2 0 +github.com/ethereum/go-ethereum/vm/stack.go:176.4,178.3 1 0 +github.com/ethereum/go-ethereum/vm/address.go:19.55,21.2 1 2 +github.com/ethereum/go-ethereum/vm/address.go:29.35,31.2 1 1 +github.com/ethereum/go-ethereum/vm/address.go:33.38,35.2 1 1 +github.com/ethereum/go-ethereum/vm/address.go:37.38,39.15 1 0 +github.com/ethereum/go-ethereum/vm/address.go:41.2,41.29 1 0 +github.com/ethereum/go-ethereum/vm/address.go:39.15,39.28 1 0 +github.com/ethereum/go-ethereum/vm/execution.go:19.103,21.2 1 2 +github.com/ethereum/go-ethereum/vm/execution.go:23.38,25.2 1 0 +github.com/ethereum/go-ethereum/vm/execution.go:27.81,32.2 2 2 +github.com/ethereum/go-ethereum/vm/execution.go:34.92,39.15 4 2 +github.com/ethereum/go-ethereum/vm/execution.go:46.2,56.24 3 2 +github.com/ethereum/go-ethereum/vm/execution.go:60.2,60.16 1 2 +github.com/ethereum/go-ethereum/vm/execution.go:90.2,90.8 1 2 +github.com/ethereum/go-ethereum/vm/execution.go:39.15,40.39 1 2 +github.com/ethereum/go-ethereum/vm/execution.go:43.3,43.57 1 2 +github.com/ethereum/go-ethereum/vm/execution.go:40.39,42.4 1 0 +github.com/ethereum/go-ethereum/vm/execution.go:56.24,58.3 1 2 +github.com/ethereum/go-ethereum/vm/execution.go:60.16,64.3 2 0 +github.com/ethereum/go-ethereum/vm/execution.go:64.4,68.40 3 2 +github.com/ethereum/go-ethereum/vm/execution.go:68.40,69.32 1 2 +github.com/ethereum/go-ethereum/vm/execution.go:69.32,72.5 2 2 +github.com/ethereum/go-ethereum/vm/execution.go:73.5,78.39 3 0 +github.com/ethereum/go-ethereum/vm/execution.go:85.4,86.20 2 0 +github.com/ethereum/go-ethereum/vm/execution.go:78.39,82.5 2 0 +github.com/ethereum/go-ethereum/vm/execution.go:93.74,95.2 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:20.52,21.13 1 4 +github.com/ethereum/go-ethereum/vm/vm.go:22.2,23.25 1 3 +github.com/ethereum/go-ethereum/vm/vm.go:24.2,25.23 1 1 +github.com/ethereum/go-ethereum/vm/vm.go:29.70,33.15 2 1 +github.com/ethereum/go-ethereum/vm/vm.go:41.2,41.28 1 1 +github.com/ethereum/go-ethereum/vm/vm.go:45.2,52.25 1 1 +github.com/ethereum/go-ethereum/vm/vm.go:59.2,59.6 1 1 +github.com/ethereum/go-ethereum/vm/vm.go:33.15,34.31 1 1 +github.com/ethereum/go-ethereum/vm/vm.go:34.31,37.4 2 1 +github.com/ethereum/go-ethereum/vm/vm.go:41.28,43.3 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:52.25,53.23 1 15 +github.com/ethereum/go-ethereum/vm/vm.go:53.23,55.5 1 1 +github.com/ethereum/go-ethereum/vm/vm.go:59.6,68.44 5 22 +github.com/ethereum/go-ethereum/vm/vm.go:72.3,75.13 3 22 +github.com/ethereum/go-ethereum/vm/vm.go:144.3,144.39 1 22 +github.com/ethereum/go-ethereum/vm/vm.go:158.3,158.27 1 22 +github.com/ethereum/go-ethereum/vm/vm.go:166.3,168.13 2 22 +github.com/ethereum/go-ethereum/vm/vm.go:707.3,707.7 1 21 +github.com/ethereum/go-ethereum/vm/vm.go:68.44,70.4 1 24 +github.com/ethereum/go-ethereum/vm/vm.go:76.3,77.25 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:78.3,79.25 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:80.3,81.21 1 3 +github.com/ethereum/go-ethereum/vm/vm.go:82.3,86.65 4 0 +github.com/ethereum/go-ethereum/vm/vm.go:93.4,93.43 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:94.3,95.23 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:96.3,98.52 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:99.3,102.52 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:103.3,105.51 2 4 +github.com/ethereum/go-ethereum/vm/vm.go:106.3,109.69 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:110.3,115.69 3 0 +github.com/ethereum/go-ethereum/vm/vm.go:116.3,119.69 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:120.3,123.69 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:124.3,127.82 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:128.3,136.37 6 0 +github.com/ethereum/go-ethereum/vm/vm.go:137.3,141.82 3 0 +github.com/ethereum/go-ethereum/vm/vm.go:86.65,88.5 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:88.6,88.73 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:88.73,90.5 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:90.6,92.5 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:144.39,149.50 4 4 +github.com/ethereum/go-ethereum/vm/vm.go:149.50,155.5 4 2 +github.com/ethereum/go-ethereum/vm/vm.go:158.27,164.4 3 0 +github.com/ethereum/go-ethereum/vm/vm.go:170.3,179.20 5 3 +github.com/ethereum/go-ethereum/vm/vm.go:180.3,189.20 5 0 +github.com/ethereum/go-ethereum/vm/vm.go:190.3,199.20 5 0 +github.com/ethereum/go-ethereum/vm/vm.go:200.3,204.32 3 0 +github.com/ethereum/go-ethereum/vm/vm.go:208.4,211.20 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:212.3,216.32 3 0 +github.com/ethereum/go-ethereum/vm/vm.go:231.4,231.20 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:232.3,240.20 5 0 +github.com/ethereum/go-ethereum/vm/vm.go:241.3,245.32 3 0 +github.com/ethereum/go-ethereum/vm/vm.go:260.4,260.20 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:262.3,270.20 5 1 +github.com/ethereum/go-ethereum/vm/vm.go:271.3,277.20 4 0 +github.com/ethereum/go-ethereum/vm/vm.go:278.3,282.20 3 0 +github.com/ethereum/go-ethereum/vm/vm.go:287.3,292.20 3 0 +github.com/ethereum/go-ethereum/vm/vm.go:298.3,302.26 3 0 +github.com/ethereum/go-ethereum/vm/vm.go:307.3,312.20 3 0 +github.com/ethereum/go-ethereum/vm/vm.go:318.3,323.21 3 0 +github.com/ethereum/go-ethereum/vm/vm.go:328.3,331.35 3 0 +github.com/ethereum/go-ethereum/vm/vm.go:338.3,342.30 3 0 +github.com/ethereum/go-ethereum/vm/vm.go:343.3,347.29 3 0 +github.com/ethereum/go-ethereum/vm/vm.go:348.3,352.30 3 0 +github.com/ethereum/go-ethereum/vm/vm.go:353.3,356.85 3 0 +github.com/ethereum/go-ethereum/vm/vm.go:363.3,375.20 8 0 +github.com/ethereum/go-ethereum/vm/vm.go:376.3,388.20 8 0 +github.com/ethereum/go-ethereum/vm/vm.go:391.3,396.34 4 0 +github.com/ethereum/go-ethereum/vm/vm.go:399.3,400.47 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:402.3,408.23 4 0 +github.com/ethereum/go-ethereum/vm/vm.go:410.3,413.36 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:415.3,417.36 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:419.3,422.21 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:424.3,432.32 3 0 +github.com/ethereum/go-ethereum/vm/vm.go:439.4,439.34 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:440.3,442.29 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:444.3,452.19 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:459.4,461.26 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:462.3,464.25 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:472.4,473.17 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:475.3,477.25 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:485.4,492.19 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:499.4,501.30 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:502.3,503.29 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:506.3,509.38 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:511.3,514.38 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:516.3,519.32 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:521.3,524.22 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:526.3,529.26 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:531.3,533.29 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:536.3,544.36 5 11 +github.com/ethereum/go-ethereum/vm/vm.go:545.3,547.15 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:548.3,550.17 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:551.3,553.18 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:555.3,559.19 4 0 +github.com/ethereum/go-ethereum/vm/vm.go:561.3,565.61 3 0 +github.com/ethereum/go-ethereum/vm/vm.go:567.3,572.53 4 4 +github.com/ethereum/go-ethereum/vm/vm.go:574.3,579.28 4 3 +github.com/ethereum/go-ethereum/vm/vm.go:581.3,586.49 4 0 +github.com/ethereum/go-ethereum/vm/vm.go:588.3,593.12 3 0 +github.com/ethereum/go-ethereum/vm/vm.go:594.3,597.38 3 0 +github.com/ethereum/go-ethereum/vm/vm.go:606.3,606.17 0 0 +github.com/ethereum/go-ethereum/vm/vm.go:607.3,608.31 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:609.3,610.44 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:611.3,612.27 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:614.3,637.18 8 0 +github.com/ethereum/go-ethereum/vm/vm.go:649.3,664.22 8 0 +github.com/ethereum/go-ethereum/vm/vm.go:670.4,672.18 3 0 +github.com/ethereum/go-ethereum/vm/vm.go:680.3,685.35 4 0 +github.com/ethereum/go-ethereum/vm/vm.go:686.3,695.15 5 0 +github.com/ethereum/go-ethereum/vm/vm.go:696.3,698.35 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:699.3,704.67 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:204.32,206.5 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:216.32,218.5 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:218.6,220.53 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:226.5,228.15 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:220.53,222.6 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:222.7,224.6 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:245.32,247.5 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:247.6,249.32 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:255.5,257.15 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:249.32,251.6 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:251.7,253.6 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:282.20,284.5 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:284.6,286.5 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:292.20,294.5 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:294.6,296.5 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:302.26,304.5 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:304.6,306.5 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:312.20,314.5 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:314.6,316.5 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:323.21,325.5 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:325.6,327.5 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:331.35,333.5 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:333.6,335.5 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:356.85,360.5 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:360.6,362.5 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:432.32,437.5 3 0 +github.com/ethereum/go-ethereum/vm/vm.go:452.19,455.5 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:455.6,455.28 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:455.28,457.5 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:464.25,468.5 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:468.6,470.5 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:477.25,481.5 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:481.6,483.5 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:492.19,495.5 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:495.6,495.28 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:495.28,497.5 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:597.38,600.43 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:604.5,604.13 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:600.43,602.6 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:637.18,643.5 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:643.6,647.5 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:664.22,666.5 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:666.6,668.5 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:672.18,674.5 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:674.6,678.5 2 0 +github.com/ethereum/go-ethereum/vm/vm.go:711.35,713.2 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:715.29,717.2 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:719.72,719.87 1 0 +github.com/ethereum/go-ethereum/vm/vm.go:720.72,720.87 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:32.43,34.25 2 3 +github.com/ethereum/go-ethereum/vm/vm_debug.go:38.2,38.57 1 3 +github.com/ethereum/go-ethereum/vm/vm_debug.go:34.25,36.3 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:41.75,44.22 2 3 +github.com/ethereum/go-ethereum/vm/vm_debug.go:60.2,70.30 1 3 +github.com/ethereum/go-ethereum/vm/vm_debug.go:100.2,100.21 1 3 +github.com/ethereum/go-ethereum/vm/vm_debug.go:105.2,105.28 1 3 +github.com/ethereum/go-ethereum/vm/vm_debug.go:109.2,111.6 2 3 +github.com/ethereum/go-ethereum/vm/vm_debug.go:44.22,46.16 1 3 +github.com/ethereum/go-ethereum/vm/vm_debug.go:46.16,47.32 1 3 +github.com/ethereum/go-ethereum/vm/vm_debug.go:47.32,56.5 4 1 +github.com/ethereum/go-ethereum/vm/vm_debug.go:70.30,71.23 1 33 +github.com/ethereum/go-ethereum/vm/vm_debug.go:71.23,73.5 1 1 +github.com/ethereum/go-ethereum/vm/vm_debug.go:76.34,81.14 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:95.4,95.15 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:81.14,83.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:83.6,85.64 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:91.5,91.12 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:85.64,87.6 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:87.7,87.43 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:87.43,89.6 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:100.21,102.3 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:105.28,107.3 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:111.6,122.30 5 80 +github.com/ethereum/go-ethereum/vm/vm_debug.go:139.3,140.44 2 80 +github.com/ethereum/go-ethereum/vm/vm_debug.go:146.3,150.13 3 80 +github.com/ethereum/go-ethereum/vm/vm_debug.go:253.3,253.39 1 79 +github.com/ethereum/go-ethereum/vm/vm_debug.go:270.3,273.27 3 79 +github.com/ethereum/go-ethereum/vm/vm_debug.go:283.3,283.13 1 79 +github.com/ethereum/go-ethereum/vm/vm_debug.go:917.3,921.22 3 77 +github.com/ethereum/go-ethereum/vm/vm_debug.go:122.30,123.14 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:131.4,132.19 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:136.4,136.92 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:124.4,125.98 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:125.98,128.6 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:132.19,134.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:140.44,141.37 1 88 +github.com/ethereum/go-ethereum/vm/vm_debug.go:141.37,143.5 1 88 +github.com/ethereum/go-ethereum/vm/vm_debug.go:152.3,153.14 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:154.3,155.14 1 10 +github.com/ethereum/go-ethereum/vm/vm_debug.go:156.3,157.14 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:158.3,160.14 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:161.3,163.14 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:164.3,171.52 6 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:173.3,174.25 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:175.3,178.25 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:179.3,182.21 2 9 +github.com/ethereum/go-ethereum/vm/vm_debug.go:184.3,190.65 5 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:201.4,201.46 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:202.3,204.23 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:205.3,207.52 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:208.3,211.52 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:212.3,214.51 2 10 +github.com/ethereum/go-ethereum/vm/vm_debug.go:215.3,218.69 2 2 +github.com/ethereum/go-ethereum/vm/vm_debug.go:219.3,224.69 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:225.3,228.69 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:229.3,232.69 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:233.3,236.82 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:237.3,245.37 6 2 +github.com/ethereum/go-ethereum/vm/vm_debug.go:246.3,250.82 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:190.65,193.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:193.6,193.73 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:193.73,197.5 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:197.6,200.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:253.39,258.50 4 12 +github.com/ethereum/go-ethereum/vm/vm_debug.go:258.50,266.5 5 6 +github.com/ethereum/go-ethereum/vm/vm_debug.go:273.27,281.4 4 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:285.3,295.20 6 9 +github.com/ethereum/go-ethereum/vm/vm_debug.go:296.3,306.20 6 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:307.3,317.20 6 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:318.3,322.32 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:326.4,330.20 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:331.3,336.32 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:351.4,352.20 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:353.3,358.32 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:364.4,367.20 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:368.3,373.32 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:388.4,389.20 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:391.3,402.20 6 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:403.3,405.17 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:422.3,428.20 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:429.3,433.20 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:438.3,443.20 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:449.3,453.26 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:458.3,463.20 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:469.3,474.21 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:479.3,481.35 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:488.3,492.30 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:493.3,497.29 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:498.3,502.30 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:503.3,506.34 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:514.4,516.20 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:517.3,530.20 8 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:531.3,544.20 8 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:547.3,553.31 4 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:555.3,558.44 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:559.3,566.45 4 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:567.3,572.33 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:573.3,577.33 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:578.3,583.32 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:584.3,591.32 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:598.4,600.34 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:601.3,605.28 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:606.3,614.19 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:621.4,625.72 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:626.3,628.25 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:636.4,639.28 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:640.3,642.25 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:650.4,657.19 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:664.4,668.72 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:669.3,672.40 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:675.3,680.37 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:681.3,686.37 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:687.3,692.33 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:693.3,698.43 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:699.3,704.47 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:705.3,706.35 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:709.3,720.41 8 47 +github.com/ethereum/go-ethereum/vm/vm_debug.go:721.3,722.15 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:723.3,729.151 4 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:732.3,736.62 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:737.3,742.27 5 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:746.4,749.30 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:750.3,755.40 4 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:756.3,761.32 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:762.3,768.42 4 10 +github.com/ethereum/go-ethereum/vm/vm_debug.go:769.3,774.59 4 9 +github.com/ethereum/go-ethereum/vm/vm_debug.go:775.3,780.30 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:784.4,784.59 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:785.3,789.12 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:790.3,793.38 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:799.3,799.17 0 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:800.3,801.18 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:802.3,803.44 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:804.3,805.27 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:807.3,831.18 9 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:844.4,847.23 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:850.3,865.22 8 2 +github.com/ethereum/go-ethereum/vm/vm_debug.go:871.4,873.18 3 2 +github.com/ethereum/go-ethereum/vm/vm_debug.go:882.4,885.23 2 2 +github.com/ethereum/go-ethereum/vm/vm_debug.go:889.3,895.35 4 2 +github.com/ethereum/go-ethereum/vm/vm_debug.go:896.3,903.15 4 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:904.3,907.35 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:908.3,914.67 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:322.32,324.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:336.32,338.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:338.6,340.53 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:346.5,348.15 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:340.53,342.6 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:342.7,344.6 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:358.32,360.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:360.6,362.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:373.32,375.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:375.6,377.32 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:383.5,385.15 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:377.32,379.6 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:379.7,381.6 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:405.17,410.39 5 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:416.5,420.20 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:410.39,412.6 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:412.7,414.6 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:433.20,435.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:435.6,437.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:443.20,445.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:445.6,447.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:453.26,455.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:455.6,457.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:463.20,465.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:465.6,467.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:474.21,476.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:476.6,478.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:481.35,483.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:483.6,485.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:506.34,510.5 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:510.6,512.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:591.32,596.5 3 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:614.19,617.5 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:617.6,617.28 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:617.28,619.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:628.25,632.5 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:632.6,634.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:642.25,646.5 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:646.6,648.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:657.19,660.5 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:660.6,660.28 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:660.28,662.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:729.151,731.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:742.27,744.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:780.30,782.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:793.38,796.13 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:831.18,838.5 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:838.6,842.5 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:847.23,849.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:865.22,867.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:867.6,869.5 1 2 +github.com/ethereum/go-ethereum/vm/vm_debug.go:873.18,877.5 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:877.6,881.5 2 2 +github.com/ethereum/go-ethereum/vm/vm_debug.go:885.23,887.5 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:921.22,922.51 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:922.51,923.41 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:923.41,926.98 2 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:926.98,928.7 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:929.7,929.29 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:929.29,930.97 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:930.97,932.7 1 0 +github.com/ethereum/go-ethereum/vm/vm_debug.go:940.77,941.31 1 248 +github.com/ethereum/go-ethereum/vm/vm_debug.go:945.2,945.13 1 248 +github.com/ethereum/go-ethereum/vm/vm_debug.go:941.31,943.3 1 248 +github.com/ethereum/go-ethereum/vm/vm_debug.go:948.44,949.31 1 82 +github.com/ethereum/go-ethereum/vm/vm_debug.go:954.2,954.13 1 82 +github.com/ethereum/go-ethereum/vm/vm_debug.go:949.31,952.3 2 82 +github.com/ethereum/go-ethereum/vm/vm_debug.go:957.40,959.2 1 4 +github.com/ethereum/go-ethereum/vm/vm_debug.go:961.34,963.2 1 0 +github.com/ethereum/go-ethereum/vm/closure.go:34.126,46.2 5 4 +github.com/ethereum/go-ethereum/vm/closure.go:49.57,51.14 2 3 +github.com/ethereum/go-ethereum/vm/closure.go:55.2,55.10 1 3 +github.com/ethereum/go-ethereum/vm/closure.go:51.14,53.3 1 0 +github.com/ethereum/go-ethereum/vm/closure.go:58.50,60.2 1 0 +github.com/ethereum/go-ethereum/vm/closure.go:62.39,64.2 1 102 +github.com/ethereum/go-ethereum/vm/closure.go:66.39,67.21 1 102 +github.com/ethereum/go-ethereum/vm/closure.go:71.2,71.10 1 0 +github.com/ethereum/go-ethereum/vm/closure.go:67.21,69.3 1 102 +github.com/ethereum/go-ethereum/vm/closure.go:74.45,75.42 1 11 +github.com/ethereum/go-ethereum/vm/closure.go:79.2,79.24 1 11 +github.com/ethereum/go-ethereum/vm/closure.go:75.42,77.3 1 0 +github.com/ethereum/go-ethereum/vm/closure.go:82.54,83.72 1 47 +github.com/ethereum/go-ethereum/vm/closure.go:87.2,89.34 2 47 +github.com/ethereum/go-ethereum/vm/closure.go:83.72,85.3 1 0 +github.com/ethereum/go-ethereum/vm/closure.go:92.62,94.2 1 0 +github.com/ethereum/go-ethereum/vm/closure.go:96.36,98.2 1 16 +github.com/ethereum/go-ethereum/vm/closure.go:100.82,106.2 3 4 +github.com/ethereum/go-ethereum/vm/closure.go:108.45,113.2 2 4 +github.com/ethereum/go-ethereum/vm/closure.go:115.45,116.24 1 102 +github.com/ethereum/go-ethereum/vm/closure.go:121.2,124.13 3 102 +github.com/ethereum/go-ethereum/vm/closure.go:116.24,118.3 1 0 +github.com/ethereum/go-ethereum/vm/closure.go:128.50,132.2 2 0 +github.com/ethereum/go-ethereum/vm/closure.go:134.47,136.2 1 2 +github.com/ethereum/go-ethereum/vm/closure.go:138.39,140.2 1 0 +github.com/ethereum/go-ethereum/vm/closure.go:142.51,144.2 1 0 +github.com/ethereum/go-ethereum/vm/common.go:46.44,47.30 1 20 +github.com/ethereum/go-ethereum/vm/common.go:51.2,51.33 1 18 +github.com/ethereum/go-ethereum/vm/common.go:47.30,49.3 1 2 +github.com/ethereum/go-ethereum/vm/common.go:55.29,57.2 1 94 +github.com/ethereum/go-ethereum/vm/common.go:60.40,63.59 2 0 +github.com/ethereum/go-ethereum/vm/common.go:67.2,67.12 1 0 +github.com/ethereum/go-ethereum/vm/common.go:63.59,65.3 1 0 +github.com/ethereum/go-ethereum/vm/types.go:328.33,330.19 2 81 +github.com/ethereum/go-ethereum/vm/types.go:334.2,334.12 1 81 +github.com/ethereum/go-ethereum/vm/types.go:330.19,332.3 1 0 +github.com/ethereum/go-ethereum/vm/asm.go:10.48,12.6 2 0 +github.com/ethereum/go-ethereum/vm/asm.go:44.2,44.8 1 0 +github.com/ethereum/go-ethereum/vm/asm.go:12.6,13.50 1 0 +github.com/ethereum/go-ethereum/vm/asm.go:18.3,24.13 4 0 +github.com/ethereum/go-ethereum/vm/asm.go:41.3,41.27 1 0 +github.com/ethereum/go-ethereum/vm/asm.go:13.50,15.4 1 0 +github.com/ethereum/go-ethereum/vm/asm.go:25.3,28.39 3 0 +github.com/ethereum/go-ethereum/vm/asm.go:32.4,33.22 2 0 +github.com/ethereum/go-ethereum/vm/asm.go:36.4,38.31 2 0 +github.com/ethereum/go-ethereum/vm/asm.go:28.39,30.5 1 0 +github.com/ethereum/go-ethereum/vm/asm.go:33.22,35.5 1 0 +github.com/ethereum/go-ethereum/vm/errors.go:12.43,14.2 1 0 +github.com/ethereum/go-ethereum/vm/errors.go:16.42,18.2 1 0 +github.com/ethereum/go-ethereum/vm/errors.go:20.31,23.2 2 2 +github.com/ethereum/go-ethereum/vm/errors.go:29.40,31.2 1 0 +github.com/ethereum/go-ethereum/vm/errors.go:33.39,35.2 1 0 +github.com/ethereum/go-ethereum/vm/errors.go:37.30,40.2 2 0 +github.com/ethereum/go-ethereum/vm/errors.go:44.39,46.2 1 0 +github.com/ethereum/go-ethereum/vm/errors.go:48.33,51.2 2 2 +github.com/ethereum/go-ethereum/vm/analysis.go:9.63,14.50 4 3 +github.com/ethereum/go-ethereum/vm/analysis.go:34.2,34.8 1 3 +github.com/ethereum/go-ethereum/vm/analysis.go:14.50,16.13 2 117 +github.com/ethereum/go-ethereum/vm/analysis.go:17.3,19.33 2 61 +github.com/ethereum/go-ethereum/vm/analysis.go:23.4,24.13 2 61 +github.com/ethereum/go-ethereum/vm/analysis.go:25.3,26.10 1 0 +github.com/ethereum/go-ethereum/vm/analysis.go:30.3,31.14 1 56 +github.com/ethereum/go-ethereum/vm/analysis.go:19.33,21.5 1 61 +github.com/ethereum/go-ethereum/vm/analysis.go:26.10,28.5 1 0 +github.com/ethereum/go-ethereum/vm/environment.go:38.56,39.36 1 0 +github.com/ethereum/go-ethereum/vm/environment.go:43.2,50.12 3 0 +github.com/ethereum/go-ethereum/vm/environment.go:39.36,41.3 1 0 +github.com/ethereum/go-ethereum/wire/client_identity.go:21.118,31.2 2 1 +github.com/ethereum/go-ethereum/wire/client_identity.go:33.39,34.2 0 0 +github.com/ethereum/go-ethereum/wire/client_identity.go:36.48,38.33 2 2 +github.com/ethereum/go-ethereum/wire/client_identity.go:42.2,47.20 1 2 +github.com/ethereum/go-ethereum/wire/client_identity.go:38.33,40.3 1 2 +github.com/ethereum/go-ethereum/wire/client_identity.go:50.77,52.2 1 1 +github.com/ethereum/go-ethereum/wire/client_identity.go:54.61,56.2 1 2 +github.com/ethereum/go-ethereum/wire/messages2.go:23.37,25.2 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:28.37,29.36 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:33.2,36.12 3 0 +github.com/ethereum/go-ethereum/wire/messages2.go:29.36,31.3 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:43.68,47.26 3 0 +github.com/ethereum/go-ethereum/wire/messages2.go:58.2,67.16 6 0 +github.com/ethereum/go-ethereum/wire/messages2.go:71.2,71.12 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:47.26,48.59 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:48.59,50.4 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:50.5,50.50 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:50.50,52.4 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:52.5,54.4 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:67.16,69.3 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:74.101,75.20 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:79.2,79.20 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:84.2,84.46 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:88.2,90.40 3 0 +github.com/ethereum/go-ethereum/wire/messages2.go:94.2,106.8 6 0 +github.com/ethereum/go-ethereum/wire/messages2.go:75.20,77.3 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:79.20,81.3 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:84.46,86.3 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:90.40,92.3 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:112.52,114.15 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:122.2,124.6 3 0 +github.com/ethereum/go-ethereum/wire/messages2.go:149.2,151.78 3 0 +github.com/ethereum/go-ethereum/wire/messages2.go:159.2,159.8 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:114.15,115.31 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:115.31,117.4 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:124.6,131.27 4 0 +github.com/ethereum/go-ethereum/wire/messages2.go:144.3,145.18 2 0 +github.com/ethereum/go-ethereum/wire/messages2.go:131.27,132.28 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:132.28,135.5 2 0 +github.com/ethereum/go-ethereum/wire/messages2.go:135.6,136.10 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:140.5,140.20 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:140.20,141.9 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:151.78,154.17 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:154.17,156.4 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:162.82,163.20 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:167.2,167.20 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:172.2,172.46 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:176.2,178.40 3 0 +github.com/ethereum/go-ethereum/wire/messages2.go:182.2,194.8 6 0 +github.com/ethereum/go-ethereum/wire/messages2.go:163.20,165.3 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:167.20,169.3 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:172.46,174.3 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:178.40,180.3 1 0 +github.com/ethereum/go-ethereum/wire/messages2.go:197.50,199.2 1 0 +github.com/ethereum/go-ethereum/wire/messaging.go:62.35,64.2 1 0 +github.com/ethereum/go-ethereum/wire/messaging.go:72.57,77.2 1 0 +github.com/ethereum/go-ethereum/wire/messaging.go:84.59,86.15 1 0 +github.com/ethereum/go-ethereum/wire/messaging.go:92.2,98.6 2 0 +github.com/ethereum/go-ethereum/wire/messaging.go:145.2,145.29 1 0 +github.com/ethereum/go-ethereum/wire/messaging.go:155.2,155.8 1 0 +github.com/ethereum/go-ethereum/wire/messaging.go:86.15,87.31 1 0 +github.com/ethereum/go-ethereum/wire/messaging.go:87.31,89.4 1 0 +github.com/ethereum/go-ethereum/wire/messaging.go:98.6,104.27 4 0 +github.com/ethereum/go-ethereum/wire/messaging.go:113.3,113.31 1 0 +github.com/ethereum/go-ethereum/wire/messaging.go:120.3,121.21 2 0 +github.com/ethereum/go-ethereum/wire/messaging.go:134.3,134.29 1 0 +github.com/ethereum/go-ethereum/wire/messaging.go:104.27,105.28 1 0 +github.com/ethereum/go-ethereum/wire/messaging.go:105.28,108.5 2 0 +github.com/ethereum/go-ethereum/wire/messaging.go:108.6,109.10 1 0 +github.com/ethereum/go-ethereum/wire/messaging.go:113.31,117.12 2 0 +github.com/ethereum/go-ethereum/wire/messaging.go:121.21,123.48 1 0 +github.com/ethereum/go-ethereum/wire/messaging.go:128.4,131.19 2 0 +github.com/ethereum/go-ethereum/wire/messaging.go:123.48,125.5 1 0 +github.com/ethereum/go-ethereum/wire/messaging.go:134.29,139.22 4 0 +github.com/ethereum/go-ethereum/wire/messaging.go:139.22,140.10 1 0 +github.com/ethereum/go-ethereum/wire/messaging.go:145.29,153.3 4 0 +github.com/ethereum/go-ethereum/wire/messaging.go:160.50,174.16 7 0 +github.com/ethereum/go-ethereum/wire/messaging.go:178.2,178.12 1 0 +github.com/ethereum/go-ethereum/wire/messaging.go:174.16,176.3 1 0 diff --git a/ptrie/cache.go b/ptrie/cache.go new file mode 100644 index 000000000..721dc4cf6 --- /dev/null +++ b/ptrie/cache.go @@ -0,0 +1,42 @@ +package ptrie + +type Backend interface { + Get([]byte) ([]byte, error) + Put([]byte, []byte) +} + +type Cache struct { + store map[string][]byte + backend Backend +} + +func NewCache(backend Backend) *Cache { + return &Cache{make(map[string][]byte), backend} +} + +func (self *Cache) Get(key []byte) []byte { + data := self.store[string(key)] + if data == nil { + data, _ = self.backend.Get(key) + } + + return data +} + +func (self *Cache) Put(key []byte, data []byte) { + self.store[string(key)] = data +} + +func (self *Cache) Flush() { + for k, v := range self.store { + self.backend.Put([]byte(k), v) + } + + // This will eventually grow too large. We'd could + // do a make limit on storage and push out not-so-popular nodes. + //self.Reset() +} + +func (self *Cache) Reset() { + self.store = make(map[string][]byte) +} diff --git a/ptrie/fullnode.go b/ptrie/fullnode.go new file mode 100644 index 000000000..7a7f7d22d --- /dev/null +++ b/ptrie/fullnode.go @@ -0,0 +1,69 @@ +package ptrie + +type FullNode struct { + trie *Trie + nodes [17]Node +} + +func NewFullNode(t *Trie) *FullNode { + return &FullNode{trie: t} +} + +func (self *FullNode) Dirty() bool { return true } +func (self *FullNode) Value() Node { + self.nodes[16] = self.trie.trans(self.nodes[16]) + return self.nodes[16] +} +func (self *FullNode) Branches() []Node { + return self.nodes[:16] +} + +func (self *FullNode) Copy() Node { + nnode := NewFullNode(self.trie) + for i, node := range self.nodes { + nnode.nodes[i] = node + } + + return nnode +} + +// Returns the length of non-nil nodes +func (self *FullNode) Len() (amount int) { + for _, node := range self.nodes { + if node != nil { + amount++ + } + } + + return +} + +func (self *FullNode) Hash() interface{} { + return self.trie.store(self) +} + +func (self *FullNode) RlpData() interface{} { + t := make([]interface{}, 17) + for i, node := range self.nodes { + if node != nil { + t[i] = node.Hash() + } else { + t[i] = "" + } + } + + return t +} + +func (self *FullNode) set(k byte, value Node) { + self.nodes[int(k)] = value +} + +func (self *FullNode) branch(i byte) Node { + if self.nodes[int(i)] != nil { + self.nodes[int(i)] = self.trie.trans(self.nodes[int(i)]) + + return self.nodes[int(i)] + } + return nil +} diff --git a/ptrie/hashnode.go b/ptrie/hashnode.go new file mode 100644 index 000000000..4c17569d7 --- /dev/null +++ b/ptrie/hashnode.go @@ -0,0 +1,22 @@ +package ptrie + +type HashNode struct { + key []byte +} + +func NewHash(key []byte) *HashNode { + return &HashNode{key} +} + +func (self *HashNode) RlpData() interface{} { + return self.key +} + +func (self *HashNode) Hash() interface{} { + return self.key +} + +// These methods will never be called but we have to satisfy Node interface +func (self *HashNode) Value() Node { return nil } +func (self *HashNode) Dirty() bool { return true } +func (self *HashNode) Copy() Node { return self } diff --git a/ptrie/iterator.go b/ptrie/iterator.go new file mode 100644 index 000000000..5714bdbc8 --- /dev/null +++ b/ptrie/iterator.go @@ -0,0 +1,115 @@ +package ptrie + +import ( + "bytes" + + "github.com/ethereum/go-ethereum/trie" +) + +type Iterator struct { + trie *Trie + + Key []byte + Value []byte +} + +func NewIterator(trie *Trie) *Iterator { + return &Iterator{trie: trie, Key: []byte{0}} +} + +func (self *Iterator) Next() bool { + self.trie.mu.Lock() + defer self.trie.mu.Unlock() + + key := trie.RemTerm(trie.CompactHexDecode(string(self.Key))) + k := self.next(self.trie.root, key) + + self.Key = []byte(trie.DecodeCompact(k)) + + return len(k) > 0 + +} + +func (self *Iterator) next(node Node, key []byte) []byte { + if node == nil { + return nil + } + + switch node := node.(type) { + case *FullNode: + if len(key) > 0 { + k := self.next(node.branch(key[0]), key[1:]) + if k != nil { + return append([]byte{key[0]}, k...) + } + } + + var r byte + if len(key) > 0 { + r = key[0] + 1 + } + + for i := r; i < 16; i++ { + k := self.key(node.branch(byte(i))) + if k != nil { + return append([]byte{i}, k...) + } + } + + case *ShortNode: + k := trie.RemTerm(node.Key()) + if vnode, ok := node.Value().(*ValueNode); ok { + if bytes.Compare([]byte(k), key) > 0 { + self.Value = vnode.Val() + return k + } + } else { + cnode := node.Value() + + var ret []byte + skey := key[len(k):] + if trie.BeginsWith(key, k) { + ret = self.next(cnode, skey) + } else if bytes.Compare(k, key[:len(k)]) > 0 { + ret = self.key(node) + } + + if ret != nil { + return append(k, ret...) + } + } + } + + return nil +} + +func (self *Iterator) key(node Node) []byte { + switch node := node.(type) { + case *ShortNode: + // Leaf node + if vnode, ok := node.Value().(*ValueNode); ok { + k := trie.RemTerm(node.Key()) + self.Value = vnode.Val() + + return k + } else { + k := trie.RemTerm(node.Key()) + return append(k, self.key(node.Value())...) + } + case *FullNode: + if node.Value() != nil { + self.Value = node.Value().(*ValueNode).Val() + + return []byte{16} + } + + for i := 0; i < 16; i++ { + k := self.key(node.branch(byte(i))) + if k != nil { + return append([]byte{byte(i)}, k...) + } + } + } + + return nil +} diff --git a/ptrie/iterator_test.go b/ptrie/iterator_test.go new file mode 100644 index 000000000..acfc03d63 --- /dev/null +++ b/ptrie/iterator_test.go @@ -0,0 +1,33 @@ +package ptrie + +import "testing" + +func TestIterator(t *testing.T) { + trie := NewEmpty() + vals := []struct{ k, v string }{ + {"do", "verb"}, + {"ether", "wookiedoo"}, + {"horse", "stallion"}, + {"shaman", "horse"}, + {"doge", "coin"}, + {"dog", "puppy"}, + {"somethingveryoddindeedthis is", "myothernodedata"}, + } + v := make(map[string]bool) + for _, val := range vals { + v[val.k] = false + trie.UpdateString(val.k, val.v) + } + trie.Commit() + + it := trie.Iterator() + for it.Next() { + v[string(it.Key)] = true + } + + for k, found := range v { + if !found { + t.Error("iterator didn't find", k) + } + } +} diff --git a/ptrie/node.go b/ptrie/node.go new file mode 100644 index 000000000..2c85dbce7 --- /dev/null +++ b/ptrie/node.go @@ -0,0 +1,40 @@ +package ptrie + +import "fmt" + +var indices = []string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "[17]"} + +type Node interface { + Value() Node + Copy() Node // All nodes, for now, return them self + Dirty() bool + fstring(string) string + Hash() interface{} + RlpData() interface{} +} + +// Value node +func (self *ValueNode) String() string { return self.fstring("") } +func (self *FullNode) String() string { return self.fstring("") } +func (self *ShortNode) String() string { return self.fstring("") } +func (self *ValueNode) fstring(ind string) string { return fmt.Sprintf("%s ", self.data) } +func (self *HashNode) fstring(ind string) string { return fmt.Sprintf("%x ", self.key) } + +// Full node +func (self *FullNode) fstring(ind string) string { + resp := fmt.Sprintf("[\n%s ", ind) + for i, node := range self.nodes { + if node == nil { + resp += fmt.Sprintf("%s: <nil> ", indices[i]) + } else { + resp += fmt.Sprintf("%s: %v", indices[i], node.fstring(ind+" ")) + } + } + + return resp + fmt.Sprintf("\n%s] ", ind) +} + +// Short node +func (self *ShortNode) fstring(ind string) string { + return fmt.Sprintf("[ %s: %v ] ", self.key, self.value.fstring(ind+" ")) +} diff --git a/ptrie/shortnode.go b/ptrie/shortnode.go new file mode 100644 index 000000000..73ff2914b --- /dev/null +++ b/ptrie/shortnode.go @@ -0,0 +1,31 @@ +package ptrie + +import "github.com/ethereum/go-ethereum/trie" + +type ShortNode struct { + trie *Trie + key []byte + value Node +} + +func NewShortNode(t *Trie, key []byte, value Node) *ShortNode { + return &ShortNode{t, []byte(trie.CompactEncode(key)), value} +} +func (self *ShortNode) Value() Node { + self.value = self.trie.trans(self.value) + + return self.value +} +func (self *ShortNode) Dirty() bool { return true } +func (self *ShortNode) Copy() Node { return NewShortNode(self.trie, self.key, self.value) } + +func (self *ShortNode) RlpData() interface{} { + return []interface{}{self.key, self.value.Hash()} +} +func (self *ShortNode) Hash() interface{} { + return self.trie.store(self) +} + +func (self *ShortNode) Key() []byte { + return trie.CompactDecode(string(self.key)) +} diff --git a/ptrie/trie.go b/ptrie/trie.go new file mode 100644 index 000000000..9fe9ea52a --- /dev/null +++ b/ptrie/trie.go @@ -0,0 +1,312 @@ +package ptrie + +import ( + "bytes" + "container/list" + "fmt" + "sync" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/trie" +) + +func ParanoiaCheck(t1 *Trie, backend Backend) (bool, *Trie) { + t2 := New(nil, backend) + + it := t1.Iterator() + for it.Next() { + t2.Update(it.Key, it.Value) + } + + return bytes.Compare(t2.Hash(), t1.Hash()) == 0, t2 +} + +type Trie struct { + mu sync.Mutex + root Node + roothash []byte + cache *Cache + + revisions *list.List +} + +func New(root []byte, backend Backend) *Trie { + trie := &Trie{} + trie.revisions = list.New() + trie.roothash = root + trie.cache = NewCache(backend) + + if root != nil { + value := ethutil.NewValueFromBytes(trie.cache.Get(root)) + trie.root = trie.mknode(value) + } + + return trie +} + +func (self *Trie) Iterator() *Iterator { + return NewIterator(self) +} + +// Legacy support +func (self *Trie) Root() []byte { return self.Hash() } +func (self *Trie) Hash() []byte { + var hash []byte + if self.root != nil { + //hash = self.root.Hash().([]byte) + t := self.root.Hash() + if byts, ok := t.([]byte); ok { + hash = byts + } else { + hash = crypto.Sha3(ethutil.Encode(self.root.RlpData())) + } + } else { + hash = crypto.Sha3(ethutil.Encode("")) + } + + if !bytes.Equal(hash, self.roothash) { + self.revisions.PushBack(self.roothash) + self.roothash = hash + } + + return hash +} +func (self *Trie) Commit() { + // Hash first + self.Hash() + + self.cache.Flush() +} + +// Reset should only be called if the trie has been hashed +func (self *Trie) Reset() { + self.cache.Reset() + + revision := self.revisions.Remove(self.revisions.Back()).([]byte) + self.roothash = revision + value := ethutil.NewValueFromBytes(self.cache.Get(self.roothash)) + self.root = self.mknode(value) +} + +func (self *Trie) UpdateString(key, value string) Node { return self.Update([]byte(key), []byte(value)) } +func (self *Trie) Update(key, value []byte) Node { + self.mu.Lock() + defer self.mu.Unlock() + + k := trie.CompactHexDecode(string(key)) + + if len(value) != 0 { + self.root = self.insert(self.root, k, &ValueNode{self, value}) + } else { + self.root = self.delete(self.root, k) + } + + return self.root +} + +func (self *Trie) GetString(key string) []byte { return self.Get([]byte(key)) } +func (self *Trie) Get(key []byte) []byte { + self.mu.Lock() + defer self.mu.Unlock() + + k := trie.CompactHexDecode(string(key)) + + n := self.get(self.root, k) + if n != nil { + return n.(*ValueNode).Val() + } + + return nil +} + +func (self *Trie) DeleteString(key string) Node { return self.Delete([]byte(key)) } +func (self *Trie) Delete(key []byte) Node { + self.mu.Lock() + defer self.mu.Unlock() + + k := trie.CompactHexDecode(string(key)) + self.root = self.delete(self.root, k) + + return self.root +} + +func (self *Trie) insert(node Node, key []byte, value Node) Node { + if len(key) == 0 { + return value + } + + if node == nil { + return NewShortNode(self, key, value) + } + + switch node := node.(type) { + case *ShortNode: + k := node.Key() + cnode := node.Value() + if bytes.Equal(k, key) { + return NewShortNode(self, key, value) + } + + var n Node + matchlength := trie.MatchingNibbleLength(key, k) + if matchlength == len(k) { + n = self.insert(cnode, key[matchlength:], value) + } else { + pnode := self.insert(nil, k[matchlength+1:], cnode) + nnode := self.insert(nil, key[matchlength+1:], value) + fulln := NewFullNode(self) + fulln.set(k[matchlength], pnode) + fulln.set(key[matchlength], nnode) + n = fulln + } + if matchlength == 0 { + return n + } + + return NewShortNode(self, key[:matchlength], n) + + case *FullNode: + cpy := node.Copy().(*FullNode) + cpy.set(key[0], self.insert(node.branch(key[0]), key[1:], value)) + + return cpy + + default: + panic("Invalid node") + } +} + +func (self *Trie) get(node Node, key []byte) Node { + if len(key) == 0 { + return node + } + + if node == nil { + return nil + } + + switch node := node.(type) { + case *ShortNode: + k := node.Key() + cnode := node.Value() + + if len(key) >= len(k) && bytes.Equal(k, key[:len(k)]) { + return self.get(cnode, key[len(k):]) + } + + return nil + case *FullNode: + return self.get(node.branch(key[0]), key[1:]) + default: + panic(fmt.Sprintf("%T: invalid node: %v", node, node)) + } +} + +func (self *Trie) delete(node Node, key []byte) Node { + if len(key) == 0 { + return nil + } + + switch node := node.(type) { + case *ShortNode: + k := node.Key() + cnode := node.Value() + if bytes.Equal(key, k) { + return nil + } else if bytes.Equal(key[:len(k)], k) { + child := self.delete(cnode, key[len(k):]) + + var n Node + switch child := child.(type) { + case *ShortNode: + nkey := append(k, child.Key()...) + n = NewShortNode(self, nkey, child.Value()) + case *FullNode: + n = NewShortNode(self, node.key, child) + } + + return n + } else { + return node + } + + case *FullNode: + n := node.Copy().(*FullNode) + n.set(key[0], self.delete(n.branch(key[0]), key[1:])) + + pos := -1 + for i := 0; i < 17; i++ { + if n.branch(byte(i)) != nil { + if pos == -1 { + pos = i + } else { + pos = -2 + } + } + } + + var nnode Node + if pos == 16 { + nnode = NewShortNode(self, []byte{16}, n.branch(byte(pos))) + } else if pos >= 0 { + cnode := n.branch(byte(pos)) + switch cnode := cnode.(type) { + case *ShortNode: + // Stitch keys + k := append([]byte{byte(pos)}, cnode.Key()...) + nnode = NewShortNode(self, k, cnode.Value()) + case *FullNode: + nnode = NewShortNode(self, []byte{byte(pos)}, n.branch(byte(pos))) + } + } else { + nnode = n + } + + return nnode + + default: + panic("Invalid node") + } +} + +// casting functions and cache storing +func (self *Trie) mknode(value *ethutil.Value) Node { + l := value.Len() + switch l { + case 2: + return NewShortNode(self, trie.CompactDecode(string(value.Get(0).Bytes())), self.mknode(value.Get(1))) + case 17: + fnode := NewFullNode(self) + for i := 0; i < l; i++ { + fnode.set(byte(i), self.mknode(value.Get(i))) + } + return fnode + case 32: + return &HashNode{value.Bytes()} + default: + return &ValueNode{self, value.Bytes()} + } +} + +func (self *Trie) trans(node Node) Node { + switch node := node.(type) { + case *HashNode: + value := ethutil.NewValueFromBytes(self.cache.Get(node.key)) + return self.mknode(value) + default: + return node + } +} + +func (self *Trie) store(node Node) interface{} { + data := ethutil.Encode(node) + if len(data) >= 32 { + key := crypto.Sha3(data) + self.cache.Put(key, data) + + return key + } + + return node.RlpData() +} diff --git a/ptrie/trie_test.go b/ptrie/trie_test.go new file mode 100644 index 000000000..5b1c64140 --- /dev/null +++ b/ptrie/trie_test.go @@ -0,0 +1,259 @@ +package ptrie + +import ( + "bytes" + "fmt" + "testing" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethutil" +) + +type Db map[string][]byte + +func (self Db) Get(k []byte) ([]byte, error) { return self[string(k)], nil } +func (self Db) Put(k, v []byte) { self[string(k)] = v } + +// Used for testing +func NewEmpty() *Trie { + return New(nil, make(Db)) +} + +func TestEmptyTrie(t *testing.T) { + trie := NewEmpty() + res := trie.Hash() + exp := crypto.Sha3(ethutil.Encode("")) + if !bytes.Equal(res, exp) { + t.Errorf("expected %x got %x", exp, res) + } +} + +func TestInsert(t *testing.T) { + trie := NewEmpty() + + trie.UpdateString("doe", "reindeer") + trie.UpdateString("dog", "puppy") + trie.UpdateString("dogglesworth", "cat") + + exp := ethutil.Hex2Bytes("8aad789dff2f538bca5d8ea56e8abe10f4c7ba3a5dea95fea4cd6e7c3a1168d3") + root := trie.Hash() + if !bytes.Equal(root, exp) { + t.Errorf("exp %x got %x", exp, root) + } + + trie = NewEmpty() + trie.UpdateString("A", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") + + exp = ethutil.Hex2Bytes("d23786fb4a010da3ce639d66d5e904a11dbc02746d1ce25029e53290cabf28ab") + root = trie.Hash() + if !bytes.Equal(root, exp) { + t.Errorf("exp %x got %x", exp, root) + } +} + +func TestGet(t *testing.T) { + trie := NewEmpty() + + trie.UpdateString("doe", "reindeer") + trie.UpdateString("dog", "puppy") + trie.UpdateString("dogglesworth", "cat") + + res := trie.GetString("dog") + if !bytes.Equal(res, []byte("puppy")) { + t.Errorf("expected puppy got %x", res) + } + + unknown := trie.GetString("unknown") + if unknown != nil { + t.Errorf("expected nil got %x", unknown) + } +} + +func TestDelete(t *testing.T) { + trie := NewEmpty() + + vals := []struct{ k, v string }{ + {"do", "verb"}, + {"ether", "wookiedoo"}, + {"horse", "stallion"}, + {"shaman", "horse"}, + {"doge", "coin"}, + {"ether", ""}, + {"dog", "puppy"}, + {"shaman", ""}, + } + for _, val := range vals { + if val.v != "" { + trie.UpdateString(val.k, val.v) + } else { + trie.DeleteString(val.k) + } + } + + hash := trie.Hash() + exp := ethutil.Hex2Bytes("5991bb8c6514148a29db676a14ac506cd2cd5775ace63c30a4fe457715e9ac84") + if !bytes.Equal(hash, exp) { + t.Errorf("expected %x got %x", exp, hash) + } +} + +func TestEmptyValues(t *testing.T) { + trie := NewEmpty() + + vals := []struct{ k, v string }{ + {"do", "verb"}, + {"ether", "wookiedoo"}, + {"horse", "stallion"}, + {"shaman", "horse"}, + {"doge", "coin"}, + {"ether", ""}, + {"dog", "puppy"}, + {"shaman", ""}, + } + for _, val := range vals { + trie.UpdateString(val.k, val.v) + } + + hash := trie.Hash() + exp := ethutil.Hex2Bytes("5991bb8c6514148a29db676a14ac506cd2cd5775ace63c30a4fe457715e9ac84") + if !bytes.Equal(hash, exp) { + t.Errorf("expected %x got %x", exp, hash) + } +} + +func TestReplication(t *testing.T) { + trie := NewEmpty() + vals := []struct{ k, v string }{ + {"do", "verb"}, + {"ether", "wookiedoo"}, + {"horse", "stallion"}, + {"shaman", "horse"}, + {"doge", "coin"}, + {"ether", ""}, + {"dog", "puppy"}, + {"shaman", ""}, + {"somethingveryoddindeedthis is", "myothernodedata"}, + } + for _, val := range vals { + trie.UpdateString(val.k, val.v) + } + trie.Commit() + + trie2 := New(trie.roothash, trie.cache.backend) + if string(trie2.GetString("horse")) != "stallion" { + t.Error("expected to have harse => stallion") + } + + hash := trie2.Hash() + exp := trie.Hash() + if !bytes.Equal(hash, exp) { + t.Errorf("root failure. expected %x got %x", exp, hash) + } + +} + +func TestReset(t *testing.T) { + trie := NewEmpty() + vals := []struct{ k, v string }{ + {"do", "verb"}, + {"ether", "wookiedoo"}, + {"horse", "stallion"}, + } + for _, val := range vals { + trie.UpdateString(val.k, val.v) + } + trie.Commit() + + before := ethutil.CopyBytes(trie.roothash) + trie.UpdateString("should", "revert") + trie.Hash() + // Should have no effect + trie.Hash() + trie.Hash() + // ### + + trie.Reset() + after := ethutil.CopyBytes(trie.roothash) + + if !bytes.Equal(before, after) { + t.Errorf("expected roots to be equal. %x - %x", before, after) + } +} + +func TestParanoia(t *testing.T) { + t.Skip() + trie := NewEmpty() + + vals := []struct{ k, v string }{ + {"do", "verb"}, + {"ether", "wookiedoo"}, + {"horse", "stallion"}, + {"shaman", "horse"}, + {"doge", "coin"}, + {"ether", ""}, + {"dog", "puppy"}, + {"shaman", ""}, + {"somethingveryoddindeedthis is", "myothernodedata"}, + } + for _, val := range vals { + trie.UpdateString(val.k, val.v) + } + trie.Commit() + + ok, t2 := ParanoiaCheck(trie, trie.cache.backend) + if !ok { + t.Errorf("trie paranoia check failed %x %x", trie.roothash, t2.roothash) + } +} + +// Not an actual test +func TestOutput(t *testing.T) { + t.Skip() + + base := "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + trie := NewEmpty() + for i := 0; i < 50; i++ { + trie.UpdateString(fmt.Sprintf("%s%d", base, i), "valueeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee") + } + fmt.Println("############################## FULL ################################") + fmt.Println(trie.root) + + trie.Commit() + fmt.Println("############################## SMALL ################################") + trie2 := New(trie.roothash, trie.cache.backend) + trie2.GetString(base + "20") + fmt.Println(trie2.root) +} + +func BenchmarkGets(b *testing.B) { + trie := NewEmpty() + vals := []struct{ k, v string }{ + {"do", "verb"}, + {"ether", "wookiedoo"}, + {"horse", "stallion"}, + {"shaman", "horse"}, + {"doge", "coin"}, + {"ether", ""}, + {"dog", "puppy"}, + {"shaman", ""}, + {"somethingveryoddindeedthis is", "myothernodedata"}, + } + for _, val := range vals { + trie.UpdateString(val.k, val.v) + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + trie.Get([]byte("horse")) + } +} + +func BenchmarkUpdate(b *testing.B) { + trie := NewEmpty() + + b.ResetTimer() + for i := 0; i < b.N; i++ { + trie.UpdateString(fmt.Sprintf("aaaaaaaaa%d", i), "value") + } + trie.Hash() +} diff --git a/ptrie/valuenode.go b/ptrie/valuenode.go new file mode 100644 index 000000000..c593eb6c6 --- /dev/null +++ b/ptrie/valuenode.go @@ -0,0 +1,13 @@ +package ptrie + +type ValueNode struct { + trie *Trie + data []byte +} + +func (self *ValueNode) Value() Node { return self } // Best not to call :-) +func (self *ValueNode) Val() []byte { return self.data } +func (self *ValueNode) Dirty() bool { return true } +func (self *ValueNode) Copy() Node { return &ValueNode{self.trie, self.data} } +func (self *ValueNode) RlpData() interface{} { return self.data } +func (self *ValueNode) Hash() interface{} { return self.data } diff --git a/rlp/decode.go b/rlp/decode.go new file mode 100644 index 000000000..712d9fcf1 --- /dev/null +++ b/rlp/decode.go @@ -0,0 +1,743 @@ +package rlp + +import ( + "bufio" + "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. If r does +// not implement ByteReader, Decode will do its own buffering. +// +// 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 unsigned 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 booleans, +// signed integers, floating point numbers, maps, channels and +// functions. +func Decode(r io.Reader, val interface{}) error { + return NewStream(r).Decode(val) +} + +type decodeError struct { + msg string + typ reflect.Type +} + +func (err decodeError) Error() string { + return fmt.Sprintf("rlp: %s for %v", err.msg, err.typ) +} + +func wrapStreamError(err error, typ reflect.Type) error { + switch err { + case ErrExpectedList: + return decodeError{"expected input list", typ} + case ErrExpectedString: + return decodeError{"expected input string or byte", typ} + case errUintOverflow: + return decodeError{"input string too long", typ} + case errNotAtEOL: + return decodeError{"input list has too many elements", typ} + } + return err +} + +var ( + decoderInterface = reflect.TypeOf(new(Decoder)).Elem() + bigInt = reflect.TypeOf(big.Int{}) +) + +func makeDecoder(typ reflect.Type) (dec decoder, err error) { + kind := typ.Kind() + switch { + case typ.Implements(decoderInterface): + return decodeDecoder, nil + case kind != reflect.Ptr && reflect.PtrTo(typ).Implements(decoderInterface): + return decodeDecoderNoPtr, nil + case typ.AssignableTo(reflect.PtrTo(bigInt)): + return decodeBigInt, nil + case typ.AssignableTo(bigInt): + return decodeBigIntNoPtr, nil + case isUint(kind): + return decodeUint, nil + case kind == reflect.String: + return decodeString, nil + case kind == reflect.Slice || kind == reflect.Array: + return makeListDecoder(typ) + case kind == reflect.Struct: + return makeStructDecoder(typ) + case kind == reflect.Ptr: + return makePtrDecoder(typ) + case kind == reflect.Interface && typ.NumMethod() == 0: + return decodeInterface, nil + default: + return nil, fmt.Errorf("rlp: type %v is not RLP-serializable", typ) + } +} + +func decodeUint(s *Stream, val reflect.Value) error { + typ := val.Type() + num, err := s.uint(typ.Bits()) + if err != nil { + return wrapStreamError(err, val.Type()) + } + val.SetUint(num) + return nil +} + +func decodeString(s *Stream, val reflect.Value) error { + b, err := s.Bytes() + if err != nil { + return wrapStreamError(err, val.Type()) + } + 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 wrapStreamError(err, val.Type()) + } + i := val.Interface().(*big.Int) + if i == nil { + i = new(big.Int) + val.Set(reflect.ValueOf(i)) + } + i.SetBytes(b) + return nil +} + +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 + } + + if typ.Kind() == reflect.Array { + return func(s *Stream, val reflect.Value) error { + return decodeListArray(s, val, etypeinfo.decoder) + }, nil + } + return func(s *Stream, val reflect.Value) error { + return decodeListSlice(s, val, etypeinfo.decoder) + }, nil +} + +func decodeListSlice(s *Stream, val reflect.Value, elemdec decoder) error { + size, err := s.List() + if err != nil { + return wrapStreamError(err, val.Type()) + } + if size == 0 { + val.Set(reflect.MakeSlice(val.Type(), 0, 0)) + return s.ListEnd() + } + + i := 0 + for ; ; i++ { + // 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 + } + } + if i < val.Len() { + val.SetLen(i) + } + return s.ListEnd() +} + +func decodeListArray(s *Stream, val reflect.Value, elemdec decoder) error { + size, err := s.List() + if err != nil { + return err + } + if size == 0 { + zero(val, 0) + return s.ListEnd() + } + + // 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. + vlen := val.Len() + i := 0 + for ; i < vlen; i++ { + if err := elemdec(s, val.Index(i)); err == EOL { + break + } else if err != nil { + return err + } + } + if i < vlen { + zero(val, i) + } + return wrapStreamError(s.ListEnd(), val.Type()) +} + +func decodeByteSlice(s *Stream, val reflect.Value) error { + kind, _, err := s.Kind() + if err != nil { + return err + } + if kind == List { + return decodeListSlice(s, val, decodeUint) + } + b, err := s.Bytes() + if err == nil { + val.SetBytes(b) + } + return err +} + +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 decodeError{"input string too long", val.Type()} + } + bv, _ := s.Uint() + val.Index(0).SetUint(bv) + zero(val, 1) + case String: + if uint64(val.Len()) < size { + return decodeError{"input string too long", val.Type()} + } + slice := val.Slice(0, int(size)).Interface().([]byte) + if err := s.readFull(slice); err != nil { + return err + } + zero(val, int(size)) + case List: + return decodeListArray(s, val, decodeUint) + } + return nil +} + +func zero(val reflect.Value, start int) { + z := reflect.Zero(val.Type().Elem()) + end := val.Len() + for i := start; i < end; 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 wrapStreamError(err, typ) + } + 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 + } + } + return wrapStreamError(s.ListEnd(), typ) + } + return dec, nil +} + +func makePtrDecoder(typ reflect.Type) (decoder, error) { + etype := typ.Elem() + etypeinfo, err := cachedTypeInfo1(etype) + if err != nil { + return nil, err + } + dec := func(s *Stream, val reflect.Value) (err error) { + _, size, err := s.Kind() + if err != nil || size == 0 && s.byteval == 0 { + val.Set(reflect.Zero(typ)) // set to nil + return err + } + newval := val + if val.IsNil() { + newval = reflect.New(etype) + } + if err = etypeinfo.decoder(s, newval.Elem()); err == nil { + val.Set(newval) + } + return err + } + return dec, nil +} + +var ifsliceType = reflect.TypeOf([]interface{}{}) + +func decodeInterface(s *Stream, val reflect.Value) error { + kind, _, err := s.Kind() + if err != nil { + return err + } + if kind == List { + slice := reflect.New(ifsliceType).Elem() + if err := decodeListSlice(s, slice, decodeInterface); 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 } + +// NewStream creates a new stream reading from r. +// If r does not implement ByteReader, the Stream will +// introduce its own buffering. +func NewStream(r io.Reader) *Stream { + s := new(Stream) + s.Reset(r) + return s +} + +// NewListStream creates a new stream that pretends to be positioned +// at an encoded list of the given length. +func NewListStream(r io.Reader, len uint64) *Stream { + s := new(Stream) + s.Reset(r) + s.kind = List + s.size = len + return s +} + +// 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 + } +} + +var errUintOverflow = errors.New("rlp: uint overflow") + +// 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, errUintOverflow + } + 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()) +} + +// Reset discards any information about the current decoding context +// and starts reading from r. If r does not also implement ByteReader, +// Stream will do its own buffering. +func (s *Stream) Reset(r io.Reader) { + bufr, ok := r.(ByteReader) + if !ok { + bufr = bufio.NewReader(r) + } + s.r = bufr + s.stack = s.stack[:0] + s.size = 0 + s.kind = -1 + if s.uintbuf == nil { + s.uintbuf = make([]byte, 8) + } +} + +// Kind returns the kind and size of the next value in the +// input stream. +// +// The returned size is the number of bytes that make up the value. +// For kind == Byte, the size is zero because the value is +// contained in the type tag. +// +// The first call to Kind will read size information from the input +// reader and leave it positioned at the start of the actual bytes of +// the value. Subsequent calls to Kind (until the value is decoded) +// will not advance the input reader and return cached information. +func (s *Stream) Kind() (kind Kind, size uint64, err error) { + var tos *listpos + if len(s.stack) > 0 { + tos = &s.stack[len(s.stack)-1] + } + if s.kind < 0 { + if tos != nil && tos.pos == tos.size { + return 0, 0, EOL + } + kind, size, err = s.readKind() + if err != nil { + return 0, 0, err + } + s.kind, s.size = kind, size + } + if tos != nil && tos.pos+s.size > tos.size { + return 0, 0, ErrElemTooLarge + } + return s.kind, s.size, nil +} + +func (s *Stream) readKind() (kind Kind, size uint64, err error) { + b, err := s.readByte() + if err != nil { + return 0, 0, err + } + s.byteval = 0 + switch { + case b < 0x80: + // For a single byte whose value is in the [0x00, 0x7F] range, that byte + // is its own RLP encoding. + s.byteval = b + return Byte, 0, nil + case b < 0xB8: + // Otherwise, if a string is 0-55 bytes long, + // the RLP encoding consists of a single byte with value 0x80 plus the + // length of the string followed by the string. The range of the first + // byte is thus [0x80, 0xB7]. + return String, uint64(b - 0x80), nil + case b < 0xC0: + // If a string is more than 55 bytes long, the + // RLP encoding consists of a single byte with value 0xB7 plus the length + // of the length of the string in binary form, followed by the length of + // the string, followed by the string. For example, a length-1024 string + // would be encoded as 0xB90400 followed by the string. The range of + // the first byte is thus [0xB8, 0xBF]. + size, err = s.readUint(b - 0xB7) + return String, size, err + case b < 0xF8: + // If the total payload of a list + // (i.e. the combined length of all its items) is 0-55 bytes long, the + // RLP encoding consists of a single byte with value 0xC0 plus the length + // of the list followed by the concatenation of the RLP encodings of the + // items. The range of the first byte is thus [0xC0, 0xF7]. + return List, uint64(b - 0xC0), nil + default: + // If the total payload of a list is more than 55 bytes long, + // the RLP encoding consists of a single byte with value 0xF7 + // plus the length of the length of the payload in binary + // form, followed by the length of the payload, followed by + // the concatenation of the RLP encodings of the items. The + // range of the first byte is thus [0xF8, 0xFF]. + size, err = s.readUint(b - 0xF7) + return List, size, err + } +} + +func (s *Stream) readUint(size byte) (uint64, error) { + if size == 1 { + b, err := s.readByte() + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + return uint64(b), err + } + start := int(8 - size) + for i := 0; i < start; i++ { + s.uintbuf[i] = 0 + } + err := s.readFull(s.uintbuf[start:]) + return binary.BigEndian.Uint64(s.uintbuf), err +} + +func (s *Stream) readFull(buf []byte) (err error) { + s.willRead(uint64(len(buf))) + var nn, n int + for n < len(buf) && err == nil { + nn, err = s.r.Read(buf[n:]) + n += nn + } + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + return err +} + +func (s *Stream) readByte() (byte, error) { + s.willRead(1) + b, err := s.r.ReadByte() + if len(s.stack) > 0 && err == io.EOF { + err = io.ErrUnexpectedEOF + } + return b, err +} + +func (s *Stream) willRead(n uint64) { + s.kind = -1 // rearm Kind + if len(s.stack) > 0 { + s.stack[len(s.stack)-1].pos += n + } +} diff --git a/rlp/decode_test.go b/rlp/decode_test.go new file mode 100644 index 000000000..7a1743937 --- /dev/null +++ b/rlp/decode_test.go @@ -0,0 +1,527 @@ +package rlp + +import ( + "bytes" + "encoding/hex" + "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 TestNewListStream(t *testing.T) { + ls := NewListStream(bytes.NewReader(unhex("0101010101")), 3) + if k, size, err := ls.Kind(); k != List || size != 3 || err != nil { + t.Errorf("Kind() returned (%v, %d, %v), expected (List, 3, nil)", k, size, err) + } + if size, err := ls.List(); size != 3 || err != nil { + t.Errorf("List() returned (%d, %v), expected (3, nil)", size, err) + } + for i := 0; i < 3; i++ { + if val, err := ls.Uint(); val != 1 || err != nil { + t.Errorf("Uint() returned (%d, %v), expected (1, nil)", val, err) + } + } + if err := ls.ListEnd(); err != nil { + t.Errorf("ListEnd() returned %v, expected (3, nil)", err) + } +} + +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"}, errUintOverflow}, + {"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 := "<nil>" + 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 != "<nil>" { + 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(uint)); 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 string +} + +type simplestruct struct { + A uint + B string +} + +type recstruct struct { + I uint + Child *recstruct +} + +var ( + veryBigInt = big.NewInt(0).Add( + big.NewInt(0).Lsh(big.NewInt(0xFFFFFFFFFFFFFF), 16), + big.NewInt(0xFFFF), + ) +) + +var ( + sharedByteArray [5]byte + sharedPtr = new(*uint) +) + +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: "rlp: input string too long for uint32"}, + {input: "C0", ptr: new(uint32), error: "rlp: expected input string or byte for uint32"}, + + // slices + {input: "C0", ptr: new([]uint), value: []uint{}}, + {input: "C80102030405060708", ptr: new([]uint), value: []uint{1, 2, 3, 4, 5, 6, 7, 8}}, + + // arrays + {input: "C0", ptr: new([5]uint), value: [5]uint{}}, + {input: "C50102030405", ptr: new([5]uint), value: [5]uint{1, 2, 3, 4, 5}}, + {input: "C6010203040506", ptr: new([5]uint), error: "rlp: input list has too many elements for [5]uint"}, + + // 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: "rlp: input string too long for uint8"}, + + // 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: "rlp: input string too long for uint8"}, + {input: "86010203040506", ptr: new([5]byte), error: "rlp: input string too long for [5]uint8"}, + {input: "850101", ptr: new([5]byte), error: io.ErrUnexpectedEOF.Error()}, + + // 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: "rlp: input string too long for [0]uint8"}, + {input: "8101", ptr: new([0]byte), error: "rlp: input string too long for [0]uint8"}, + + // strings + {input: "00", ptr: new(string), value: "\000"}, + {input: "8D6162636465666768696A6B6C6D", ptr: new(string), value: "abcdefghijklm"}, + {input: "C0", ptr: new(string), error: "rlp: expected input string or byte for string"}, + + // 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: "rlp: expected input string or byte for *big.Int"}, + + // 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: "rlp: input list has too many elements for rlp.simplestruct"}, + { + input: "C501C302C103", + ptr: new(recstruct), + value: recstruct{1, &recstruct{2, &recstruct{3, nil}}}, + }, + + // pointers + {input: "00", ptr: new(*uint), value: (*uint)(nil)}, + {input: "80", ptr: new(*uint), value: (*uint)(nil)}, + {input: "C0", ptr: new(*uint), value: (*uint)(nil)}, + {input: "07", ptr: new(*uint), value: uintp(7)}, + {input: "8108", ptr: new(*uint), value: uintp(8)}, + {input: "C109", ptr: new(*[]uint), value: &[]uint{9}}, + {input: "C58403030303", ptr: new(*[][]byte), value: &[][]byte{{3, 3, 3, 3}}}, + + // pointer should be reset to nil + {input: "05", ptr: sharedPtr, value: uintp(5)}, + {input: "80", ptr: sharedPtr, value: (*uint)(nil)}, + + // interface{} + {input: "00", ptr: new(interface{}), value: []byte{0}}, + {input: "01", ptr: new(interface{}), value: []byte{1}}, + {input: "80", ptr: new(interface{}), value: []byte{}}, + {input: "850505050505", ptr: new(interface{}), value: []byte{5, 5, 5, 5, 5}}, + {input: "C0", ptr: new(interface{}), value: []interface{}{}}, + {input: "C50183040404", ptr: new(interface{}), value: []interface{}{[]byte{1}, []byte{4, 4, 4}}}, +} + +func uintp(i uint) *uint { return &i } + +func runTests(t *testing.T, decode func([]byte, interface{}) error) { + 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(input, test.ptr) + if err != nil && test.error == "" { + t.Errorf("test %d: unexpected Decode error: %v\ndecoding into %T\ninput %q", + i, err, test.ptr, test.input) + continue + } + if test.error != "" && fmt.Sprint(err) != 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) + } + } +} + +func TestDecodeWithByteReader(t *testing.T) { + runTests(t, func(input []byte, into interface{}) error { + return Decode(bytes.NewReader(input), into) + }) +} + +// dumbReader reads from a byte slice but does not +// implement ReadByte. +type dumbReader []byte + +func (r *dumbReader) Read(buf []byte) (n int, err error) { + if len(*r) == 0 { + return 0, io.EOF + } + n = copy(buf, *r) + *r = (*r)[n:] + return n, nil +} + +func TestDecodeWithNonByteReader(t *testing.T) { + runTests(t, func(input []byte, into interface{}) error { + r := dumbReader(input) + return Decode(&r, into) + }) +} + +func TestDecodeStreamReset(t *testing.T) { + s := NewStream(nil) + runTests(t, func(input []byte, into interface{}) error { + s.Reset(bytes.NewReader(input)) + return s.Decode(into) + }) +} + +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 uint + private uint // 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:0xa, B:0x14, private:0x0, 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 <nil> + // 20 <nil> + // [102 111 111 98 97 114] <nil> +} + +func BenchmarkDecode(b *testing.B) { + enc := encTest(90000) + b.SetBytes(int64(len(enc))) + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + var s []int + r := bytes.NewReader(enc) + if err := Decode(r, &s); err != nil { + b.Fatalf("Decode error: %v", err) + } + } +} + +func BenchmarkDecodeIntSliceReuse(b *testing.B) { + enc := encTest(100000) + b.SetBytes(int64(len(enc))) + b.ReportAllocs() + b.ResetTimer() + + var s []int + for i := 0; i < b.N; i++ { + r := bytes.NewReader(enc) + if err := Decode(r, &s); err != nil { + b.Fatalf("Decode error: %v", err) + } + } +} + +func encTest(n int) []byte { + s := make([]interface{}, n) + for i := 0; i < n; i++ { + s[i] = i + } + return ethutil.Encode(s) +} + +func unhex(str string) []byte { + b, err := hex.DecodeString(str) + if err != nil { + panic(fmt.Sprintf("invalid hex string: %q", str)) + } + return b +} diff --git a/rlp/doc.go b/rlp/doc.go new file mode 100644 index 000000000..aab98ea43 --- /dev/null +++ b/rlp/doc.go @@ -0,0 +1,17 @@ +/* +Package rlp implements the RLP serialization format. + +The purpose of RLP (Recursive Linear Prefix) qis to encode arbitrarily +nested arrays of binary data, and RLP is the main encoding method used +to serialize objects in Ethereum. The only purpose of RLP is to encode +structure; encoding specific atomic data types (eg. strings, ints, +floats) is left up to higher-order protocols; in Ethereum integers +must be represented in big endian binary form with no leading zeroes +(thus making the integer value zero be equivalent to the empty byte +array). + +RLP values are distinguished by a type tag. The type tag precedes the +value in the input stream and defines the size and kind of the bytes +that follow. +*/ +package rlp diff --git a/rlp/typecache.go b/rlp/typecache.go new file mode 100644 index 000000000..52e68a3c5 --- /dev/null +++ b/rlp/typecache.go @@ -0,0 +1,62 @@ +package rlp + +import ( + "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 +} + +func genTypeInfo(typ reflect.Type) (info *typeinfo, err error) { + info = new(typeinfo) + if info.decoder, err = makeDecoder(typ); err != nil { + return nil, err + } + return info, nil +} + +func isUint(k reflect.Kind) bool { + return k >= reflect.Uint && k <= reflect.Uintptr +} diff --git a/rpc/json.go b/rpc/json.go new file mode 100644 index 000000000..e467f9a34 --- /dev/null +++ b/rpc/json.go @@ -0,0 +1,20 @@ +package rpc + +import ( + "encoding/json" + "io" +) + +type jsonWrapper struct{} + +func (self jsonWrapper) Send(writer io.Writer, v interface{}) (n int, err error) { + var payload []byte + payload, err = json.Marshal(v) + if err != nil { + return 0, err + } + + return writer.Write(payload) +} + +var JSON jsonWrapper diff --git a/rpc/message.go b/rpc/message.go new file mode 100644 index 000000000..c8103eded --- /dev/null +++ b/rpc/message.go @@ -0,0 +1,14 @@ +package rpc + +import "github.com/ethereum/go-ethereum/ethutil" + +type Message struct { + Call string `json:"call"` + Args []interface{} `json:"args"` + Id int `json:"_id"` + Data interface{} `json:"data"` +} + +func (self *Message) Arguments() *ethutil.Value { + return ethutil.NewValue(self.Args) +} diff --git a/rpc/packages.go b/rpc/packages.go new file mode 100644 index 000000000..5535e6e79 --- /dev/null +++ b/rpc/packages.go @@ -0,0 +1,311 @@ +package rpc + +import ( + "encoding/json" + "errors" + "math/big" + "strings" + + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/xeth" +) + +type EthereumApi struct { + pipe *xeth.JSXEth +} + +type JsonArgs interface { + requirements() error +} + +type BlockResponse struct { + JsonResponse +} +type GetBlockArgs struct { + BlockNumber int + Hash string +} + +type ErrorResponse struct { + Error bool `json:"error"` + ErrorText string `json:"errorText"` +} + +type JsonResponse interface { +} + +type SuccessRes struct { + Error bool `json:"error"` + Result JsonResponse `json:"result"` +} + +func NewSuccessRes(object JsonResponse) string { + e := SuccessRes{Error: false, Result: object} + res, err := json.Marshal(e) + if err != nil { + // This should never happen + panic("Creating json error response failed, help") + } + success := string(res) + return success +} + +func NewErrorResponse(msg string) error { + e := ErrorResponse{Error: true, ErrorText: msg} + res, err := json.Marshal(e) + if err != nil { + // This should never happen + panic("Creating json error response failed, help") + } + newErr := errors.New(string(res)) + return newErr +} + +func (b *GetBlockArgs) requirements() error { + if b.BlockNumber == 0 && b.Hash == "" { + return NewErrorResponse("GetBlock requires either a block 'number' or a block 'hash' as argument") + } + return nil +} + +func (p *EthereumApi) GetBlock(args *GetBlockArgs, reply *string) error { + err := args.requirements() + if err != nil { + return err + } + + block := p.pipe.BlockByHash(args.Hash) + *reply = NewSuccessRes(block) + return nil +} + +type NewTxArgs struct { + Sec string + Recipient string + Value string + Gas string + GasPrice string + Init string + Body string +} +type TxResponse struct { + Hash string +} + +func (a *NewTxArgs) requirements() error { + if a.Recipient == "" { + return NewErrorResponse("Transact requires a 'recipient' address as argument") + } + if a.Value == "" { + return NewErrorResponse("Transact requires a 'value' as argument") + } + if a.Gas == "" { + return NewErrorResponse("Transact requires a 'gas' value as argument") + } + if a.GasPrice == "" { + return NewErrorResponse("Transact requires a 'gasprice' value as argument") + } + return nil +} + +func (a *NewTxArgs) requirementsContract() error { + if a.Value == "" { + return NewErrorResponse("Create requires a 'value' as argument") + } + if a.Gas == "" { + return NewErrorResponse("Create requires a 'gas' value as argument") + } + if a.GasPrice == "" { + return NewErrorResponse("Create requires a 'gasprice' value as argument") + } + if a.Body == "" { + return NewErrorResponse("Create requires a 'body' value as argument") + } + return nil +} + +func (p *EthereumApi) Transact(args *NewTxArgs, reply *string) error { + err := args.requirements() + if err != nil { + return err + } + result, _ := p.pipe.Transact(p.pipe.Key().PrivateKey, args.Recipient, args.Value, args.Gas, args.GasPrice, args.Body) + *reply = NewSuccessRes(result) + return nil +} + +func (p *EthereumApi) Create(args *NewTxArgs, reply *string) error { + err := args.requirementsContract() + if err != nil { + return err + } + + result, _ := p.pipe.Transact(p.pipe.Key().PrivateKey, "", args.Value, args.Gas, args.GasPrice, args.Body) + *reply = NewSuccessRes(result) + return nil +} + +type PushTxArgs struct { + Tx string +} + +func (a *PushTxArgs) requirementsPushTx() error { + if a.Tx == "" { + return NewErrorResponse("PushTx requires a 'tx' as argument") + } + return nil +} + +func (p *EthereumApi) PushTx(args *PushTxArgs, reply *string) error { + err := args.requirementsPushTx() + if err != nil { + return err + } + result, _ := p.pipe.PushTx(args.Tx) + *reply = NewSuccessRes(result) + return nil +} + +func (p *EthereumApi) GetKey(args interface{}, reply *string) error { + *reply = NewSuccessRes(p.pipe.Key()) + return nil +} + +type GetStorageArgs struct { + Address string + Key string +} + +func (a *GetStorageArgs) requirements() error { + if a.Address == "" { + return NewErrorResponse("GetStorageAt requires an 'address' value as argument") + } + if a.Key == "" { + return NewErrorResponse("GetStorageAt requires an 'key' value as argument") + } + return nil +} + +type GetStorageAtRes struct { + Key string `json:"key"` + Value string `json:"value"` + Address string `json:"address"` +} + +func (p *EthereumApi) GetStorageAt(args *GetStorageArgs, reply *string) error { + err := args.requirements() + if err != nil { + return err + } + + state := p.pipe.World().SafeGet(ethutil.Hex2Bytes(args.Address)) + + var hx string + if strings.Index(args.Key, "0x") == 0 { + hx = string([]byte(args.Key)[2:]) + } else { + // Convert the incoming string (which is a bigint) into hex + i, _ := new(big.Int).SetString(args.Key, 10) + hx = ethutil.Bytes2Hex(i.Bytes()) + } + jsonlogger.Debugf("GetStorageAt(%s, %s)\n", args.Address, hx) + value := state.Storage(ethutil.Hex2Bytes(hx)) + *reply = NewSuccessRes(GetStorageAtRes{Address: args.Address, Key: args.Key, Value: value.Str()}) + return nil +} + +type GetTxCountArgs struct { + Address string `json:"address"` +} +type GetTxCountRes struct { + Nonce int `json:"nonce"` +} + +func (a *GetTxCountArgs) requirements() error { + if a.Address == "" { + return NewErrorResponse("GetTxCountAt requires an 'address' value as argument") + } + return nil +} + +type GetPeerCountRes struct { + PeerCount int `json:"peerCount"` +} + +func (p *EthereumApi) GetPeerCount(args *interface{}, reply *string) error { + *reply = NewSuccessRes(GetPeerCountRes{PeerCount: p.pipe.PeerCount()}) + return nil +} + +type GetListeningRes struct { + IsListening bool `json:"isListening"` +} + +func (p *EthereumApi) GetIsListening(args *interface{}, reply *string) error { + *reply = NewSuccessRes(GetListeningRes{IsListening: p.pipe.IsListening()}) + return nil +} + +type GetCoinbaseRes struct { + Coinbase string `json:"coinbase"` +} + +func (p *EthereumApi) GetCoinbase(args *interface{}, reply *string) error { + *reply = NewSuccessRes(GetCoinbaseRes{Coinbase: p.pipe.CoinBase()}) + return nil +} + +type GetMiningRes struct { + IsMining bool `json:"isMining"` +} + +func (p *EthereumApi) GetIsMining(args *interface{}, reply *string) error { + *reply = NewSuccessRes(GetMiningRes{IsMining: p.pipe.IsMining()}) + return nil +} + +func (p *EthereumApi) GetTxCountAt(args *GetTxCountArgs, reply *string) error { + err := args.requirements() + if err != nil { + return err + } + state := p.pipe.TxCountAt(args.Address) + *reply = NewSuccessRes(GetTxCountRes{Nonce: state}) + return nil +} + +type GetBalanceArgs struct { + Address string +} + +func (a *GetBalanceArgs) requirements() error { + if a.Address == "" { + return NewErrorResponse("GetBalanceAt requires an 'address' value as argument") + } + return nil +} + +type BalanceRes struct { + Balance string `json:"balance"` + Address string `json:"address"` +} + +func (p *EthereumApi) GetBalanceAt(args *GetBalanceArgs, reply *string) error { + err := args.requirements() + if err != nil { + return err + } + state := p.pipe.World().SafeGet(ethutil.Hex2Bytes(args.Address)) + *reply = NewSuccessRes(BalanceRes{Balance: state.Balance().String(), Address: args.Address}) + return nil +} + +type TestRes struct { + JsonResponse `json:"-"` + Answer int `json:"answer"` +} + +func (p *EthereumApi) Test(args *GetBlockArgs, reply *string) error { + *reply = NewSuccessRes(TestRes{Answer: 15}) + return nil +} diff --git a/rpc/server.go b/rpc/server.go new file mode 100644 index 000000000..983dc6c33 --- /dev/null +++ b/rpc/server.go @@ -0,0 +1,67 @@ +package rpc + +import ( + "fmt" + "net" + "net/rpc" + "net/rpc/jsonrpc" + + "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/xeth" +) + +var jsonlogger = logger.NewLogger("JSON") + +type JsonRpcServer struct { + quit chan bool + listener net.Listener + pipe *xeth.JSXEth +} + +func (s *JsonRpcServer) exitHandler() { +out: + for { + select { + case <-s.quit: + s.listener.Close() + break out + } + } + + jsonlogger.Infoln("Shutdown JSON-RPC server") +} + +func (s *JsonRpcServer) Stop() { + close(s.quit) +} + +func (s *JsonRpcServer) Start() { + jsonlogger.Infoln("Starting JSON-RPC server") + go s.exitHandler() + rpc.Register(&EthereumApi{pipe: s.pipe}) + rpc.HandleHTTP() + + for { + conn, err := s.listener.Accept() + if err != nil { + jsonlogger.Infoln("Error starting JSON-RPC:", err) + break + } + jsonlogger.Debugln("Incoming request.") + go jsonrpc.ServeConn(conn) + } +} + +func NewJsonRpcServer(pipe *xeth.JSXEth, port int) (*JsonRpcServer, error) { + sport := fmt.Sprintf(":%d", port) + l, err := net.Listen("tcp", sport) + if err != nil { + return nil, err + } + + return &JsonRpcServer{ + listener: l, + quit: make(chan bool), + pipe: pipe, + }, nil +} diff --git a/rpc/writer.go b/rpc/writer.go new file mode 100644 index 000000000..4cc39f577 --- /dev/null +++ b/rpc/writer.go @@ -0,0 +1,75 @@ +package rpc + +/* +func pack(id int, v ...interface{}) Message { + return Message{Data: v, Id: id} +} + +func WriteOn(msg *Message, writer io.Writer) { + //msg := &Message{Seed: seed, Data: data} + + switch msg.Call { + case "compile": + data := ethutil.NewValue(msg.Args) + bcode, err := ethutil.Compile(data.Get(0).Str(), false) + if err != nil { + JSON.Send(writer, pack(msg.Id, err.Error())) + } + + code := ethutil.Bytes2Hex(bcode) + + JSON.Send(writer, pack(msg.Id, code, nil)) + case "block": + args := msg.Arguments() + + block := pipe.BlockByNumber(int32(args.Get(0).Uint())) + + JSON.Send(writer, pack(msg.Id, block)) + case "transact": + if mp, ok := msg.Args[0].(map[string]interface{}); ok { + object := mapToTxParams(mp) + JSON.Send( + writer, + pack(msg.Id, args(pipe.Transact(object["from"], object["to"], object["value"], object["gas"], object["gasPrice"], object["data"]))), + ) + + } + case "coinbase": + JSON.Send(writer, pack(msg.Id, pipe.CoinBase(), msg.Seed)) + + case "listening": + JSON.Send(writer, pack(msg.Id, pipe.IsListening())) + + case "mining": + JSON.Send(writer, pack(msg.Id, pipe.IsMining())) + + case "peerCoint": + JSON.Send(writer, pack(msg.Id, pipe.PeerCount())) + + case "countAt": + args := msg.Arguments() + + JSON.Send(writer, pack(msg.Id, pipe.TxCountAt(args.Get(0).Str()))) + + case "codeAt": + args := msg.Arguments() + + JSON.Send(writer, pack(msg.Id, len(pipe.CodeAt(args.Get(0).Str())))) + + case "stateAt": + args := msg.Arguments() + + JSON.Send(writer, pack(msg.Id, pipe.StorageAt(args.Get(0).Str(), args.Get(1).Str()))) + + case "balanceAt": + args := msg.Arguments() + + JSON.Send(writer, pack(msg.Id, pipe.BalanceAt(args.Get(0).Str()))) + + case "newFilter": + case "newFilterString": + case "messages": + // TODO + } +} +*/ diff --git a/state/dump.go b/state/dump.go new file mode 100644 index 000000000..c1f5ecf3a --- /dev/null +++ b/state/dump.go @@ -0,0 +1,56 @@ +package state + +import ( + "encoding/json" + "fmt" + + "github.com/ethereum/go-ethereum/ethutil" +) + +type Account struct { + Balance string `json:"balance"` + Nonce uint64 `json:"nonce"` + Root string `json:"root"` + CodeHash string `json:"codeHash"` + Storage map[string]string `json:"storage"` +} + +type World struct { + Root string `json:"root"` + Accounts map[string]Account `json:"accounts"` +} + +func (self *StateDB) Dump() []byte { + world := World{ + Root: ethutil.Bytes2Hex(self.Trie.GetRoot()), + Accounts: make(map[string]Account), + } + + self.Trie.NewIterator().Each(func(key string, value *ethutil.Value) { + stateObject := NewStateObjectFromBytes([]byte(key), value.Bytes()) + + account := Account{Balance: stateObject.balance.String(), Nonce: stateObject.Nonce, Root: ethutil.Bytes2Hex(stateObject.Root()), CodeHash: ethutil.Bytes2Hex(stateObject.codeHash)} + account.Storage = make(map[string]string) + + stateObject.EachStorage(func(key string, value *ethutil.Value) { + value.Decode() + account.Storage[ethutil.Bytes2Hex([]byte(key))] = ethutil.Bytes2Hex(value.Bytes()) + }) + world.Accounts[ethutil.Bytes2Hex([]byte(key))] = account + }) + + json, err := json.MarshalIndent(world, "", " ") + if err != nil { + fmt.Println("dump err", err) + } + + 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/errors.go b/state/errors.go new file mode 100644 index 000000000..5a847d38b --- /dev/null +++ b/state/errors.go @@ -0,0 +1,23 @@ +package state + +import ( + "fmt" + "math/big" +) + +type GasLimitErr struct { + Message string + Is, Max *big.Int +} + +func IsGasLimitErr(err error) bool { + _, ok := err.(*GasLimitErr) + + return ok +} +func (err *GasLimitErr) Error() string { + return err.Message +} +func GasLimitError(is, max *big.Int) *GasLimitErr { + return &GasLimitErr{Message: fmt.Sprintf("GasLimit error. Max %s, transaction would take it to %s", max, is), Is: is, Max: max} +} diff --git a/state/log.go b/state/log.go new file mode 100644 index 000000000..46360f4aa --- /dev/null +++ b/state/log.go @@ -0,0 +1,78 @@ +package state + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/ethutil" +) + +type Log interface { + ethutil.RlpEncodable + + Address() []byte + Topics() [][]byte + Data() []byte +} + +type StateLog struct { + address []byte + topics [][]byte + data []byte +} + +func NewLog(address []byte, topics [][]byte, data []byte) *StateLog { + return &StateLog{address, topics, data} +} + +func (self *StateLog) Address() []byte { + return self.address +} + +func (self *StateLog) Topics() [][]byte { + return self.topics +} + +func (self *StateLog) Data() []byte { + return self.data +} + +func NewLogFromValue(decoder *ethutil.Value) *StateLog { + log := &StateLog{ + address: decoder.Get(0).Bytes(), + data: decoder.Get(2).Bytes(), + } + + it := decoder.Get(1).NewIterator() + for it.Next() { + log.topics = append(log.topics, it.Value().Bytes()) + } + + return log +} + +func (self *StateLog) RlpData() interface{} { + return []interface{}{self.address, ethutil.ByteSliceToInterface(self.topics), self.data} +} + +func (self *StateLog) String() string { + return fmt.Sprintf(`log: %x %x %x`, self.address, self.topics, self.data) +} + +type Logs []Log + +func (self Logs) RlpData() interface{} { + data := make([]interface{}, len(self)) + for i, log := range self { + data[i] = log.RlpData() + } + + return data +} + +func (self Logs) String() (ret string) { + for _, log := range self { + ret += fmt.Sprintf("%v", log) + } + + return "[" + ret + "]" +} diff --git a/state/main_test.go b/state/main_test.go new file mode 100644 index 000000000..f3d3f7e23 --- /dev/null +++ b/state/main_test.go @@ -0,0 +1,9 @@ +package state + +import ( + "testing" + + checker "gopkg.in/check.v1" +) + +func Test(t *testing.T) { checker.TestingT(t) } diff --git a/state/manifest.go b/state/manifest.go new file mode 100644 index 000000000..21cd04a1a --- /dev/null +++ b/state/manifest.go @@ -0,0 +1,55 @@ +package state + +import ( + "fmt" + "math/big" +) + +// Object manifest +// +// The object manifest is used to keep changes to the state so we can keep track of the changes +// that occurred during a state transitioning phase. +type Manifest struct { + Messages Messages +} + +func NewManifest() *Manifest { + m := &Manifest{} + m.Reset() + + return m +} + +func (m *Manifest) Reset() { + m.Messages = nil +} + +func (self *Manifest) AddMessage(msg *Message) *Message { + self.Messages = append(self.Messages, msg) + + return msg +} + +type Messages []*Message +type Message struct { + To, From []byte + Input []byte + Output []byte + Path int + Origin []byte + Timestamp int64 + Coinbase []byte + Block []byte + Number *big.Int + Value *big.Int + + ChangedAddresses [][]byte +} + +func (self *Message) AddStorageChange(addr []byte) { + self.ChangedAddresses = append(self.ChangedAddresses, addr) +} + +func (self *Message) String() string { + return fmt.Sprintf("Message{to: %x from: %x input: %x output: %x origin: %x coinbase: %x block: %x number: %v timestamp: %d path: %d value: %v", self.To, self.From, self.Input, self.Output, self.Origin, self.Coinbase, self.Block, self.Number, self.Timestamp, self.Path, self.Value) +} diff --git a/state/state.go b/state/state.go new file mode 100644 index 000000000..f77da72f0 --- /dev/null +++ b/state/state.go @@ -0,0 +1,325 @@ +package state + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/trie" +) + +var statelogger = logger.NewLogger("STATE") + +// StateDBs within the ethereum protocol are used to store anything +// within the merkle trie. StateDBs take care of caching and storing +// nested states. It's the general query interface to retrieve: +// * Contracts +// * Accounts +type StateDB struct { + // The trie for this structure + Trie *trie.Trie + + stateObjects map[string]*StateObject + + manifest *Manifest + + refund map[string]*big.Int + + logs Logs +} + +// Create a new state from a given trie +func New(trie *trie.Trie) *StateDB { + return &StateDB{Trie: trie, stateObjects: make(map[string]*StateObject), manifest: NewManifest(), refund: make(map[string]*big.Int)} +} + +func (self *StateDB) EmptyLogs() { + self.logs = nil +} + +func (self *StateDB) AddLog(log Log) { + self.logs = append(self.logs, log) +} + +func (self *StateDB) Logs() Logs { + return self.logs +} + +// Retrieve the balance from the given address or 0 if object not found +func (self *StateDB) GetBalance(addr []byte) *big.Int { + stateObject := self.GetStateObject(addr) + if stateObject != nil { + return stateObject.balance + } + + return ethutil.Big0 +} + +func (self *StateDB) Refund(addr []byte, gas *big.Int) { + if self.refund[string(addr)] == nil { + self.refund[string(addr)] = new(big.Int) + } + self.refund[string(addr)].Add(self.refund[string(addr)], gas) +} + +func (self *StateDB) AddBalance(addr []byte, amount *big.Int) { + stateObject := self.GetStateObject(addr) + if stateObject != nil { + stateObject.AddBalance(amount) + } +} + +func (self *StateDB) GetNonce(addr []byte) uint64 { + stateObject := self.GetStateObject(addr) + if stateObject != nil { + return stateObject.Nonce + } + + return 0 +} + +func (self *StateDB) SetNonce(addr []byte, nonce uint64) { + stateObject := self.GetStateObject(addr) + if stateObject != nil { + stateObject.Nonce = nonce + } +} + +func (self *StateDB) GetCode(addr []byte) []byte { + stateObject := self.GetStateObject(addr) + if stateObject != nil { + return stateObject.Code + } + + return nil +} + +func (self *StateDB) SetCode(addr, code []byte) { + stateObject := self.GetStateObject(addr) + if stateObject != nil { + stateObject.SetCode(code) + } +} + +func (self *StateDB) GetState(a, b []byte) []byte { + stateObject := self.GetStateObject(a) + if stateObject != nil { + return stateObject.GetState(b).Bytes() + } + + return nil +} + +func (self *StateDB) SetState(addr, key []byte, value interface{}) { + stateObject := self.GetStateObject(addr) + if stateObject != nil { + stateObject.SetState(key, ethutil.NewValue(value)) + } +} + +func (self *StateDB) Delete(addr []byte) bool { + stateObject := self.GetStateObject(addr) + if stateObject != nil { + stateObject.MarkForDeletion() + + return true + } + + return false +} + +// +// Setting, updating & deleting state object methods +// + +// Update the given state object and apply it to state trie +func (self *StateDB) UpdateStateObject(stateObject *StateObject) { + addr := stateObject.Address() + + if len(stateObject.CodeHash()) > 0 { + ethutil.Config.Db.Put(stateObject.CodeHash(), stateObject.Code) + } + + self.Trie.Update(string(addr), string(stateObject.RlpEncode())) +} + +// Delete the given state object and delete it from the state trie +func (self *StateDB) DeleteStateObject(stateObject *StateObject) { + self.Trie.Delete(string(stateObject.Address())) + + delete(self.stateObjects, string(stateObject.Address())) +} + +// Retrieve a state object given my the address. Nil if not found +func (self *StateDB) GetStateObject(addr []byte) *StateObject { + addr = ethutil.Address(addr) + + stateObject := self.stateObjects[string(addr)] + if stateObject != nil { + return stateObject + } + + data := self.Trie.Get(string(addr)) + if len(data) == 0 { + return nil + } + + stateObject = NewStateObjectFromBytes(addr, []byte(data)) + self.SetStateObject(stateObject) + + return stateObject +} + +func (self *StateDB) SetStateObject(object *StateObject) { + self.stateObjects[string(object.address)] = object +} + +// Retrieve a state object or create a new state object if nil +func (self *StateDB) GetOrNewStateObject(addr []byte) *StateObject { + stateObject := self.GetStateObject(addr) + if stateObject == nil { + stateObject = self.NewStateObject(addr) + } + + return stateObject +} + +// Create a state object whether it exist in the trie or not +func (self *StateDB) NewStateObject(addr []byte) *StateObject { + addr = ethutil.Address(addr) + + statelogger.Debugf("(+) %x\n", addr) + + stateObject := NewStateObject(addr) + self.stateObjects[string(addr)] = stateObject + + return stateObject +} + +// Deprecated +func (self *StateDB) GetAccount(addr []byte) *StateObject { + return self.GetOrNewStateObject(addr) +} + +// +// Setting, copying of the state methods +// + +func (s *StateDB) Cmp(other *StateDB) bool { + return s.Trie.Cmp(other.Trie) +} + +func (self *StateDB) Copy() *StateDB { + if self.Trie != nil { + state := New(self.Trie.Copy()) + for k, stateObject := range self.stateObjects { + state.stateObjects[k] = stateObject.Copy() + } + + for addr, refund := range self.refund { + state.refund[addr] = new(big.Int).Set(refund) + } + + logs := make(Logs, len(self.logs)) + copy(logs, self.logs) + state.logs = logs + + return state + } + + return nil +} + +func (self *StateDB) Set(state *StateDB) { + if state == nil { + panic("Tried setting 'state' to nil through 'Set'") + } + + self.Trie = state.Trie + self.stateObjects = state.stateObjects + self.refund = state.refund + self.logs = state.logs +} + +func (s *StateDB) Root() []byte { + return s.Trie.GetRoot() +} + +// Resets the trie and all siblings +func (s *StateDB) Reset() { + s.Trie.Undo() + + // Reset all nested states + for _, stateObject := range s.stateObjects { + if stateObject.State == nil { + continue + } + + stateObject.Reset() + } + + s.Empty() +} + +// Syncs the trie and all siblings +func (s *StateDB) Sync() { + // Sync all nested states + for _, stateObject := range s.stateObjects { + if stateObject.State == nil { + continue + } + + stateObject.State.Sync() + } + + s.Trie.Sync() + + s.Empty() +} + +func (self *StateDB) Empty() { + self.stateObjects = make(map[string]*StateObject) + self.refund = make(map[string]*big.Int) +} + +func (self *StateDB) Refunds() map[string]*big.Int { + return self.refund +} + +func (self *StateDB) Update(gasUsed *big.Int) { + var deleted bool + + self.refund = make(map[string]*big.Int) + + for _, stateObject := range self.stateObjects { + if stateObject.remove { + self.DeleteStateObject(stateObject) + deleted = true + } else { + stateObject.Sync() + + self.UpdateStateObject(stateObject) + } + } + + // FIXME trie delete is broken + if deleted { + valid, t2 := trie.ParanoiaCheck(self.Trie) + if !valid { + statelogger.Infof("Warn: PARANOIA: Different state root during copy %x vs %x\n", self.Trie.GetRoot(), t2.GetRoot()) + + self.Trie = t2 + } + } +} + +func (self *StateDB) Manifest() *Manifest { + return self.manifest +} + +// Debug stuff +func (self *StateDB) CreateOutputForDiff() { + for _, stateObject := range self.stateObjects { + stateObject.CreateOutputForDiff() + } +} diff --git a/state/state_object.go b/state/state_object.go new file mode 100644 index 000000000..b8af4e702 --- /dev/null +++ b/state/state_object.go @@ -0,0 +1,320 @@ +package state + +import ( + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/trie" +) + +type Code []byte + +func (self Code) String() string { + return string(self) //strings.Join(Disassemble(self), " ") +} + +type Storage map[string]*ethutil.Value + +func (self Storage) Copy() Storage { + cpy := make(Storage) + for key, value := range self { + // XXX Do we need a 'value' copy or is this sufficient? + cpy[key] = value + } + + return cpy +} + +type StateObject struct { + // Address of the object + address []byte + // Shared attributes + balance *big.Int + codeHash []byte + Nonce uint64 + // Contract related attributes + State *StateDB + Code Code + InitCode Code + + storage Storage + + // Total gas pool is the total amount of gas currently + // left if this object is the coinbase. Gas is directly + // purchased of the coinbase. + gasPool *big.Int + + // Mark for deletion + // When an object is marked for deletion it will be delete from the trie + // during the "update" phase of the state transition + remove bool +} + +func (self *StateObject) Reset() { + self.storage = make(Storage) + self.State.Reset() +} + +func NewStateObject(addr []byte) *StateObject { + // This to ensure that it has 20 bytes (and not 0 bytes), thus left or right pad doesn't matter. + address := ethutil.Address(addr) + + object := &StateObject{address: address, balance: new(big.Int), gasPool: new(big.Int)} + object.State = New(trie.New(ethutil.Config.Db, "")) + object.storage = make(Storage) + object.gasPool = new(big.Int) + + return object +} + +func NewContract(address []byte, balance *big.Int, root []byte) *StateObject { + contract := NewStateObject(address) + contract.balance = balance + contract.State = New(trie.New(ethutil.Config.Db, string(root))) + + return contract +} + +func NewStateObjectFromBytes(address, data []byte) *StateObject { + object := &StateObject{address: address} + object.RlpDecode(data) + + return object +} + +func (self *StateObject) MarkForDeletion() { + self.remove = true + statelogger.DebugDetailf("%x: #%d %v (deletion)\n", self.Address(), self.Nonce, self.balance) +} + +func (c *StateObject) GetAddr(addr []byte) *ethutil.Value { + return ethutil.NewValueFromBytes([]byte(c.State.Trie.Get(string(addr)))) +} + +func (c *StateObject) SetAddr(addr []byte, value interface{}) { + c.State.Trie.Update(string(addr), string(ethutil.NewValue(value).Encode())) +} + +func (self *StateObject) GetStorage(key *big.Int) *ethutil.Value { + return self.GetState(key.Bytes()) +} +func (self *StateObject) SetStorage(key *big.Int, value *ethutil.Value) { + self.SetState(key.Bytes(), value) +} + +func (self *StateObject) Storage() map[string]*ethutil.Value { + return self.storage +} + +func (self *StateObject) GetState(k []byte) *ethutil.Value { + key := ethutil.LeftPadBytes(k, 32) + + value := self.storage[string(key)] + if value == nil { + value = self.GetAddr(key) + + if !value.IsNil() { + self.storage[string(key)] = value + } + } + + return value +} + +func (self *StateObject) SetState(k []byte, value *ethutil.Value) { + key := ethutil.LeftPadBytes(k, 32) + self.storage[string(key)] = value.Copy() +} + +// Iterate over each storage address and yield callback +func (self *StateObject) EachStorage(cb trie.EachCallback) { + // First loop over the uncommit/cached values in storage + for key, value := range self.storage { + // XXX Most iterators Fns as it stands require encoded values + encoded := ethutil.NewValue(value.Encode()) + cb(key, encoded) + } + + it := self.State.Trie.NewIterator() + it.Each(func(key string, value *ethutil.Value) { + // If it's cached don't call the callback. + if self.storage[key] == nil { + cb(key, value) + } + }) +} + +func (self *StateObject) Sync() { + for key, value := range self.storage { + if value.Len() == 0 { + self.State.Trie.Delete(string(key)) + continue + } + + self.SetAddr([]byte(key), value) + } + + valid, t2 := trie.ParanoiaCheck(self.State.Trie) + if !valid { + statelogger.Infof("Warn: PARANOIA: Different state storage root during copy %x vs %x\n", self.State.Root(), t2.GetRoot()) + + self.State.Trie = t2 + } +} + +func (c *StateObject) GetInstr(pc *big.Int) *ethutil.Value { + if int64(len(c.Code)-1) < pc.Int64() { + return ethutil.NewValue(0) + } + + return ethutil.NewValueFromBytes([]byte{c.Code[pc.Int64()]}) +} + +func (c *StateObject) AddBalance(amount *big.Int) { + c.SetBalance(new(big.Int).Add(c.balance, amount)) + + statelogger.Debugf("%x: #%d %v (+ %v)\n", c.Address(), c.Nonce, c.balance, amount) +} +func (c *StateObject) AddAmount(amount *big.Int) { c.AddBalance(amount) } + +func (c *StateObject) SubBalance(amount *big.Int) { + c.SetBalance(new(big.Int).Sub(c.balance, amount)) + + statelogger.Debugf("%x: #%d %v (- %v)\n", c.Address(), c.Nonce, c.balance, amount) +} +func (c *StateObject) SubAmount(amount *big.Int) { c.SubBalance(amount) } + +func (c *StateObject) SetBalance(amount *big.Int) { + c.balance = amount +} + +func (self *StateObject) Balance() *big.Int { return self.balance } + +// +// Gas setters and getters +// + +// Return the gas back to the origin. Used by the Virtual machine or Closures +func (c *StateObject) ReturnGas(gas, price *big.Int) {} +func (c *StateObject) ConvertGas(gas, price *big.Int) error { + total := new(big.Int).Mul(gas, price) + if total.Cmp(c.balance) > 0 { + return fmt.Errorf("insufficient amount: %v, %v", c.balance, total) + } + + c.SubAmount(total) + + return nil +} + +func (self *StateObject) SetGasPool(gasLimit *big.Int) { + self.gasPool = new(big.Int).Set(gasLimit) + + statelogger.Debugf("%x: gas (+ %v)", self.Address(), self.gasPool) +} + +func (self *StateObject) BuyGas(gas, price *big.Int) error { + if self.gasPool.Cmp(gas) < 0 { + return GasLimitError(self.gasPool, gas) + } + + rGas := new(big.Int).Set(gas) + rGas.Mul(rGas, price) + + self.AddAmount(rGas) + + return nil +} + +func (self *StateObject) RefundGas(gas, price *big.Int) { + self.gasPool.Add(self.gasPool, gas) + + rGas := new(big.Int).Set(gas) + rGas.Mul(rGas, price) + + self.balance.Sub(self.balance, rGas) +} + +func (self *StateObject) Copy() *StateObject { + stateObject := NewStateObject(self.Address()) + stateObject.balance.Set(self.balance) + stateObject.codeHash = ethutil.CopyBytes(self.codeHash) + stateObject.Nonce = self.Nonce + if self.State != nil { + stateObject.State = self.State.Copy() + } + stateObject.Code = ethutil.CopyBytes(self.Code) + stateObject.InitCode = ethutil.CopyBytes(self.InitCode) + stateObject.storage = self.storage.Copy() + stateObject.gasPool.Set(self.gasPool) + stateObject.remove = self.remove + + return stateObject +} + +func (self *StateObject) Set(stateObject *StateObject) { + *self = *stateObject +} + +// +// Attribute accessors +// + +func (c *StateObject) N() *big.Int { + return big.NewInt(int64(c.Nonce)) +} + +// Returns the address of the contract/account +func (c *StateObject) Address() []byte { + return c.address +} + +// Returns the initialization Code +func (c *StateObject) Init() Code { + return c.InitCode +} + +func (self *StateObject) Root() []byte { + return self.State.Trie.GetRoot() +} + +func (self *StateObject) SetCode(code []byte) { + self.Code = code +} + +// +// Encoding +// + +// State object encoding methods +func (c *StateObject) RlpEncode() []byte { + return ethutil.Encode([]interface{}{c.Nonce, c.balance, c.Root(), c.CodeHash()}) +} + +func (c *StateObject) CodeHash() ethutil.Bytes { + return crypto.Sha3(c.Code) +} + +func (c *StateObject) RlpDecode(data []byte) { + decoder := ethutil.NewValueFromBytes(data) + + c.Nonce = decoder.Get(0).Uint() + c.balance = decoder.Get(1).BigInt() + c.State = New(trie.New(ethutil.Config.Db, decoder.Get(2).Interface())) + c.storage = make(map[string]*ethutil.Value) + c.gasPool = new(big.Int) + + c.codeHash = decoder.Get(3).Bytes() + + c.Code, _ = ethutil.Config.Db.Get(c.codeHash) +} + +// Storage change object. Used by the manifest for notifying changes to +// the sub channels. +type StorageState struct { + StateAddress []byte + Address []byte + Value *big.Int +} diff --git a/state/state_test.go b/state/state_test.go new file mode 100644 index 000000000..28e4fc5da --- /dev/null +++ b/state/state_test.go @@ -0,0 +1,61 @@ +package state + +import ( + checker "gopkg.in/check.v1" + + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/trie" +) + +type StateSuite struct { + state *StateDB +} + +var _ = checker.Suite(&StateSuite{}) + +// var ZeroHash256 = make([]byte, 32) + +func (s *StateSuite) TestDump(c *checker.C) { + key := []byte{0x01} + value := "foo" + node := []interface{}{key, value} + s.state.Trie.Put(node) + dump := s.state.Dump() + c.Assert(dump, checker.NotNil) +} + +func (s *StateSuite) SetUpTest(c *checker.C) { + db, _ := ethdb.NewMemDatabase() + ethutil.ReadConfig(".ethtest", "/tmp/ethtest", "") + ethutil.Config.Db = db + s.state = New(trie.New(db, "")) +} + +func (s *StateSuite) TestSnapshot(c *checker.C) { + stateobjaddr := []byte("aa") + storageaddr := ethutil.Big("0") + data1 := ethutil.NewValue(42) + data2 := ethutil.NewValue(43) + + // get state object + stateObject := s.state.GetOrNewStateObject(stateobjaddr) + // set inital state object value + stateObject.SetStorage(storageaddr, data1) + // get snapshot of current state + snapshot := s.state.Copy() + + // get state object. is this strictly necessary? + stateObject = s.state.GetStateObject(stateobjaddr) + // set new state object value + stateObject.SetStorage(storageaddr, data2) + // restore snapshot + s.state.Set(snapshot) + + // get state object + stateObject = s.state.GetStateObject(stateobjaddr) + // get state storage value + res := stateObject.GetStorage(storageaddr) + + c.Assert(data1, checker.DeepEquals, res) +} diff --git a/tests/files/BasicTests/blockgenesistest.json b/tests/files/BasicTests/blockgenesistest.json new file mode 100644 index 000000000..8ad5590f1 --- /dev/null +++ b/tests/files/BasicTests/blockgenesistest.json @@ -0,0 +1,20 @@ +[ + { + "inputs": { + }, + "result": "f892f88ea00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479400000000000000000000000000000000000000008080834000008087038d7ea4c68000830f4240808080a004994f67dc55b09e814ab7ffc8df3686b4afb2bb53e60eae97ef043fe03fb829c0c0" + }, + { + "inputs": { + "cd2a3d9f938e13cd947ec05abc7fe734df8dd826": 100000000000000000000 + }, + "result": "f8b2f8aea00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a05e5b074eca68ed6f5cf3ef14712b7c97f431a41deff21e3f211cf687f618026780834000008087038d7ea4c68000830f4240808080a004994f67dc55b09e814ab7ffc8df3686b4afb2bb53e60eae97ef043fe03fb829c0c0" + }, + { + "inputs": { + "cd2a3d9f938e13cd947ec05abc7fe734df8dd826": 99000000000000000000, + "13978aee95f38490e9769c39b2773ed763d9cd5f": 1000000000000000000 + }, + "result": "f8b2f8aea00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0b1062e564d1bdb302a2feae46e837fef59c4f8a408967009dcc48327d80d8fff80834000008087038d7ea4c68000830f4240808080a004994f67dc55b09e814ab7ffc8df3686b4afb2bb53e60eae97ef043fe03fb829c0c0" + } +] diff --git a/tests/files/BasicTests/genesishashestest.json b/tests/files/BasicTests/genesishashestest.json new file mode 100644 index 000000000..ba733e36e --- /dev/null +++ b/tests/files/BasicTests/genesishashestest.json @@ -0,0 +1,15 @@ +{ + "genesis_rlp_hex": "f9012ef90129a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0c67c70f5d7d3049337d1dcc0503a249881120019a8e7322774dbfe57b463718ca056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080830f4240808080a004994f67dc55b09e814ab7ffc8df3686b4afb2bb53e60eae97ef043fe03fb829c0c0", + "genesis_state_root": "c67c70f5d7d3049337d1dcc0503a249881120019a8e7322774dbfe57b463718c", + "initial_alloc": { + "51ba59315b3a95761d0863b05ccc7a7f54703d99": "1606938044258990275541962092341162602522202993782792835301376", + "e4157b34ea9615cfbde6b4fda419828124b70c78": "1606938044258990275541962092341162602522202993782792835301376", + "b9c015918bdaba24b4ff057a92a3873d6eb201be": "1606938044258990275541962092341162602522202993782792835301376", + "6c386a4b26f73c802f34673f7248bb118f97424a": "1606938044258990275541962092341162602522202993782792835301376", + "cd2a3d9f938e13cd947ec05abc7fe734df8dd826": "1606938044258990275541962092341162602522202993782792835301376", + "2ef47100e0787b915105fd5e3f4ff6752079d5cb": "1606938044258990275541962092341162602522202993782792835301376", + "e6716f9544a56c530d868e4bfbacb172315bdead": "1606938044258990275541962092341162602522202993782792835301376", + "1a26338f0d905e295fccb71fa9ea849ffa12aaf4": "1606938044258990275541962092341162602522202993782792835301376" + }, + "genesis_hash": "779b1b620b03c0fb24963e183d5e88e3dbe4484e3f6e2aa05942e3be7b48e179" +} diff --git a/tests/files/BasicTests/hexencodetest.json b/tests/files/BasicTests/hexencodetest.json new file mode 100644 index 000000000..26c5bc7ed --- /dev/null +++ b/tests/files/BasicTests/hexencodetest.json @@ -0,0 +1,62 @@ +{ + "zz,odd,open": { + "seq": [ 0, 0, 1, 2, 3, 4, 5 ], + "term": false, + "out": "10012345" + }, + "z,even,open": { + "seq": [ 0, 1, 2, 3, 4, 5 ], + "term": false, + "out": "00012345" + }, + "nz,odd,open": { + "seq": [ 1, 2, 3, 4, 5 ], + "term": false, + "out": "112345" + }, + "zz,even,open": { + "seq": [ 0, 0, 1, 2, 3, 4 ], + "term": false, + "out": "00001234" + }, + "z,odd,open": { + "seq": [ 0, 1, 2, 3, 4 ], + "term": false, + "out": "101234" + }, + "nz,even,open": { + "seq": [ 1, 2, 3, 4 ], + "term": false, + "out": "001234" + }, + "zz,odd,term": { + "seq": [ 0, 0, 1, 2, 3, 4, 5 ], + "term": true, + "out": "30012345" + }, + "z,even,term": { + "seq": [ 0, 1, 2, 3, 4, 5 ], + "term": true, + "out": "20012345" + }, + "nz,odd,term": { + "seq": [ 1, 2, 3, 4, 5 ], + "term": true, + "out": "312345" + }, + "zz,even,term": { + "seq": [ 0, 0, 1, 2, 3, 4 ], + "term": true, + "out": "20001234" + }, + "z,odd,term": { + "seq": [ 0, 1, 2, 3, 4 ], + "term": true, + "out": "301234" + }, + "nz,even,term": { + "seq": [ 1, 2, 3, 4 ], + "term": true, + "out": "201234" + } +} diff --git a/tests/files/BasicTests/keyaddrtest.json b/tests/files/BasicTests/keyaddrtest.json new file mode 100644 index 000000000..c65b2ae33 --- /dev/null +++ b/tests/files/BasicTests/keyaddrtest.json @@ -0,0 +1,22 @@ +[ + { + "seed": "cow", + "key": "c85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4", + "addr": "cd2a3d9f938e13cd947ec05abc7fe734df8dd826", + "sig_of_emptystring": { + "v": "27", + "r": "55022946425863772466282515086640833500580355555249003729267710149987842051473", + "s": "3021698389129950584349170550428805649435913935175976180112863059249983907949" + } + }, + { + "seed": "horse", + "key": "c87f65ff3f271bf5dc8643484f66b200109caffe4bf98c4cb393dc35740b28c0", + "addr": "13978aee95f38490e9769c39b2773ed763d9cd5f", + "sig_of_emptystring": { + "v": "28", + "r": "20570452350081260599473412372903969148670549754219103025003129053348571714359", + "s": "76892551129780267788164835941580941601518827936179476514262023835864819088004" + } + } +] diff --git a/tests/files/BasicTests/rlptest.json b/tests/files/BasicTests/rlptest.json new file mode 100644 index 000000000..19adbb8e2 --- /dev/null +++ b/tests/files/BasicTests/rlptest.json @@ -0,0 +1,146 @@ +{ + "emptystring": { + "in": "", + "out": "80" + }, + "shortstring": { + "in": "dog", + "out": "83646f67" + }, + "shortstring2": { + "in": "Lorem ipsum dolor sit amet, consectetur adipisicing eli", + "out": "b74c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e7365637465747572206164697069736963696e6720656c69" + }, + "longstring": { + "in": "Lorem ipsum dolor sit amet, consectetur adipisicing elit", + "out": "b8384c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e7365637465747572206164697069736963696e6720656c6974" + }, + "longstring2": { + "in": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur mauris magna, suscipit sed vehicula non, iaculis faucibus tortor. Proin suscipit ultricies malesuada. Duis tortor elit, dictum quis tristique eu, ultrices at risus. Morbi a est imperdiet mi ullamcorper aliquet suscipit nec lorem. Aenean quis leo mollis, vulputate elit varius, consequat enim. Nulla ultrices turpis justo, et posuere urna consectetur nec. Proin non convallis metus. Donec tempor ipsum in mauris congue sollicitudin. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Suspendisse convallis sem vel massa faucibus, eget lacinia lacus tempor. Nulla quis ultricies purus. Proin auctor rhoncus nibh condimentum mollis. Aliquam consequat enim at metus luctus, a eleifend purus egestas. Curabitur at nibh metus. Nam bibendum, neque at auctor tristique, lorem libero aliquet arcu, non interdum tellus lectus sit amet eros. Cras rhoncus, metus ac ornare cursus, dolor justo ultrices metus, at ullamcorper volutpat", + "out": "b904004c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e73656374657475722061646970697363696e6720656c69742e20437572616269747572206d6175726973206d61676e612c20737573636970697420736564207665686963756c61206e6f6e2c20696163756c697320666175636962757320746f72746f722e2050726f696e20737573636970697420756c74726963696573206d616c6573756164612e204475697320746f72746f7220656c69742c2064696374756d2071756973207472697374697175652065752c20756c7472696365732061742072697375732e204d6f72626920612065737420696d70657264696574206d6920756c6c616d636f7270657220616c6971756574207375736369706974206e6563206c6f72656d2e2041656e65616e2071756973206c656f206d6f6c6c69732c2076756c70757461746520656c6974207661726975732c20636f6e73657175617420656e696d2e204e756c6c6120756c74726963657320747572706973206a7573746f2c20657420706f73756572652075726e6120636f6e7365637465747572206e65632e2050726f696e206e6f6e20636f6e76616c6c6973206d657475732e20446f6e65632074656d706f7220697073756d20696e206d617572697320636f6e67756520736f6c6c696369747564696e2e20566573746962756c756d20616e746520697073756d207072696d697320696e206661756369627573206f726369206c756374757320657420756c74726963657320706f737565726520637562696c69612043757261653b2053757370656e646973736520636f6e76616c6c69732073656d2076656c206d617373612066617563696275732c2065676574206c6163696e6961206c616375732074656d706f722e204e756c6c61207175697320756c747269636965732070757275732e2050726f696e20617563746f722072686f6e637573206e69626820636f6e64696d656e74756d206d6f6c6c69732e20416c697175616d20636f6e73657175617420656e696d206174206d65747573206c75637475732c206120656c656966656e6420707572757320656765737461732e20437572616269747572206174206e696268206d657475732e204e616d20626962656e64756d2c206e6571756520617420617563746f72207472697374697175652c206c6f72656d206c696265726f20616c697175657420617263752c206e6f6e20696e74657264756d2074656c6c7573206c65637475732073697420616d65742065726f732e20437261732072686f6e6375732c206d65747573206163206f726e617265206375727375732c20646f6c6f72206a7573746f20756c747269636573206d657475732c20617420756c6c616d636f7270657220766f6c7574706174" + }, + "zero": { + "in": 0, + "out": "80" + }, + "smallint": { + "in": 1, + "out": "01" + }, + "smallint2": { + "in": 16, + "out": "10" + }, + "smallint3": { + "in": 79, + "out": "4f" + }, + "smallint4": { + "in": 127, + "out": "7f" + }, + "mediumint1": { + "in": 128, + "out": "8180" + }, + "mediumint2": { + "in": 1000, + "out": "8203e8" + }, + "mediumint3": { + "in": 100000, + "out": "830186a0" + }, + "mediumint4": { + "in": "#83729609699884896815286331701780722", + "out": "8F102030405060708090A0B0C0D0E0F2" + }, + "mediumint5": { + "in": "#105315505618206987246253880190783558935785933862974822347068935681", + "out": "9C0100020003000400050006000700080009000A000B000C000D000E01" + }, + "emptylist": { + "in": [], + "out": "c0" + }, + "stringlist": { + "in": [ "dog", "god", "cat" ], + "out": "cc83646f6783676f6483636174" + }, + "multilist": { + "in": [ "zw", [ 4 ], 1 ], + "out": "c6827a77c10401" + }, + "shortListMax1": { + "in": [ "asdf", "qwer", "zxcv", "asdf","qwer", "zxcv", "asdf", "qwer", "zxcv", "asdf", "qwer"], + "out": "F784617364668471776572847a78637684617364668471776572847a78637684617364668471776572847a78637684617364668471776572" + }, + "longList1" : { + "in" : [ + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"] + ], + "out": "F840CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376" + }, + "longList2" : { + "in" : [ + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"], + ["asdf","qwer","zxcv"] + ], + "out": "F90200CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376CF84617364668471776572847a786376" + }, + + "listsoflists": { + "in": [ [ [], [] ], [] ], + "out": "c4c2c0c0c0" + }, + "listsoflists2": { + "in": [ [], [[]], [ [], [[]] ] ], + "out": "c7c0c1c0c3c0c1c0" + }, + "dictTest1" : { + "in" : [ + ["key1", "val1"], + ["key2", "val2"], + ["key3", "val3"], + ["key4", "val4"] + ], + "out" : "ECCA846b6579318476616c31CA846b6579328476616c32CA846b6579338476616c33CA846b6579348476616c34" + }, + "bigint": { + "in": "#115792089237316195423570985008687907853269984665640564039457584007913129639936", + "out": "a1010000000000000000000000000000000000000000000000000000000000000000" + } +} diff --git a/tests/files/BasicTests/txtest.json b/tests/files/BasicTests/txtest.json new file mode 100644 index 000000000..1261d0766 --- /dev/null +++ b/tests/files/BasicTests/txtest.json @@ -0,0 +1,24 @@ +[ + { + "key": "c85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4", + "nonce": 0, + "gasprice": 1000000000000, + "startgas": 10000, + "to": "13978aee95f38490e9769c39b2773ed763d9cd5f", + "value": 10000000000000000, + "data": "", + "unsigned": "eb8085e8d4a510008227109413978aee95f38490e9769c39b2773ed763d9cd5f872386f26fc1000080808080", + "signed": "f86b8085e8d4a510008227109413978aee95f38490e9769c39b2773ed763d9cd5f872386f26fc10000801ba0eab47c1a49bf2fe5d40e01d313900e19ca485867d462fe06e139e3a536c6d4f4a014a569d327dcda4b29f74f93c0e9729d2f49ad726e703f9cd90dbb0fbf6649f1" + }, + { + "key": "c87f65ff3f271bf5dc8643484f66b200109caffe4bf98c4cb393dc35740b28c0", + "nonce": 0, + "gasprice": 1000000000000, + "startgas": 10000, + "to": "", + "value": 0, + "data": "6025515b525b600a37f260003556601b596020356000355760015b525b54602052f260255860005b525b54602052f2", + "unsigned": "f83f8085e8d4a510008227108080af6025515b525b600a37f260003556601b596020356000355760015b525b54602052f260255860005b525b54602052f2808080", + "signed": "f87f8085e8d4a510008227108080af6025515b525b600a37f260003556601b596020356000355760015b525b54602052f260255860005b525b54602052f21ba05afed0244d0da90b67cf8979b0f246432a5112c0d31e8d5eedd2bc17b171c694a0bb1035c834677c2e1185b8dc90ca6d1fa585ab3d7ef23707e1a497a98e752d1b" + } +] diff --git a/tests/files/README.md b/tests/files/README.md new file mode 100644 index 000000000..0f7dbe5a6 --- /dev/null +++ b/tests/files/README.md @@ -0,0 +1,26 @@ +tests +===== + +Common tests for all clients to test against. + +All files should be of the form: + +``` +{ + "test1name": + { + "test1property1": ..., + "test1property2": ..., + ... + }, + "test2name": + { + "test2property1": ..., + "test2property2": ..., + ... + } +} +``` + +Arrays are allowed, but don't use them for sets of properties - only use them for data that is clearly a continuous contiguous sequence of values. + diff --git a/tests/files/StateTests/stExample.json b/tests/files/StateTests/stExample.json new file mode 100644 index 000000000..34bb4dd8e --- /dev/null +++ b/tests/files/StateTests/stExample.json @@ -0,0 +1,64 @@ +{ + "add11" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000100000", + "code" : "0x6001600101600055", + "nonce" : "0", + "storage" : { + "0x" : "0x02" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "804", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899196", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x6001600101600055", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + } +}
\ No newline at end of file diff --git a/tests/files/StateTests/stInitCodeTest.json b/tests/files/StateTests/stInitCodeTest.json new file mode 100644 index 000000000..67aa42853 --- /dev/null +++ b/tests/files/StateTests/stInitCodeTest.json @@ -0,0 +1,870 @@ +{ + "CallRecursiveContract" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "45678256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "04110d816c380812a427968ece99b1c963dfbce6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x04110d816c380812a427968ece99b1c963dfbce6" + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1", + "code" : "0x3060025560206000600039602060006000f0", + "nonce" : "1", + "storage" : { + "0x02" : "0x095e7baea6a6c7c4c2dfeb977efac326af552d87" + } + }, + "0a517d755cebbf66312b30fff713666a9cb917e0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x0a517d755cebbf66312b30fff713666a9cb917e0" + } + }, + "24dd378f51adc67a50e339e8031fe9bd4aafab36" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x24dd378f51adc67a50e339e8031fe9bd4aafab36" + } + }, + "293f982d000532a7861ab122bdc4bbfd26bf9030" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x293f982d000532a7861ab122bdc4bbfd26bf9030" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "10000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "2cf5732f017b0cf1b1f13a1478e10239716bf6b5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x2cf5732f017b0cf1b1f13a1478e10239716bf6b5" + } + }, + "31c640b92c21a1f1465c91070b4b3b4d6854195f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "37f998764813b136ddf5a754f34063fd03065e36" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x37f998764813b136ddf5a754f34063fd03065e36" + } + }, + "37fa399a749c121f8a15ce77e3d9f9bec8020d7a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x37fa399a749c121f8a15ce77e3d9f9bec8020d7a" + } + }, + "4f36659fa632310b6ec438dea4085b522a2dd077" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x4f36659fa632310b6ec438dea4085b522a2dd077" + } + }, + "62c01474f089b07dae603491675dc5b5748f7049" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x62c01474f089b07dae603491675dc5b5748f7049" + } + }, + "729af7294be595a0efd7d891c9e51f89c07950c7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x729af7294be595a0efd7d891c9e51f89c07950c7" + } + }, + "83e3e5a16d3b696a0314b30b2534804dd5e11197" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x83e3e5a16d3b696a0314b30b2534804dd5e11197" + } + }, + "8703df2417e0d7c59d063caa9583cb10a4d20532" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x8703df2417e0d7c59d063caa9583cb10a4d20532" + } + }, + "8dffcd74e5b5923512916c6a64b502689cfa65e1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x8dffcd74e5b5923512916c6a64b502689cfa65e1" + } + }, + "95a4d7cccb5204733874fa87285a176fe1e9e240" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x95a4d7cccb5204733874fa87285a176fe1e9e240" + } + }, + "99b2fcba8120bedd048fe79f5262a6690ed38c39" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x99b2fcba8120bedd048fe79f5262a6690ed38c39" + } + }, + "a4202b8b8afd5354e3e40a219bdc17f6001bf2cf" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0xa4202b8b8afd5354e3e40a219bdc17f6001bf2cf" + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "89999", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a9647f4a0a14042d91dc33c0328030a7157c93ae" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0xa9647f4a0a14042d91dc33c0328030a7157c93ae" + } + }, + "aa6cffe5185732689c18f37a7f86170cb7304c2a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0xaa6cffe5185732689c18f37a7f86170cb7304c2a" + } + }, + "aae4a2e3c51c04606dcb3723456e58f3ed214f45" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0xaae4a2e3c51c04606dcb3723456e58f3ed214f45" + } + }, + "c37a43e940dfb5baf581a0b82b351d48305fc885" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0xc37a43e940dfb5baf581a0b82b351d48305fc885" + } + }, + "d2571607e241ecf590ed94b12d87c94babe36db6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0xd2571607e241ecf590ed94b12d87c94babe36db6" + } + }, + "f735071cbee190d76b704ce68384fc21e389fbe7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0xf735071cbee190d76b704ce68384fc21e389fbe7" + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0", + "code" : "0x3060025560206000600039602060006000f0", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "100000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "0x00", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "1" + } + }, + "CallTheContractToCreateContractWithInitCode" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "45678256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "04110d816c380812a427968ece99b1c963dfbce6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x04110d816c380812a427968ece99b1c963dfbce6" + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "10001", + "code" : "0x3060025560206000600039602060006000f0", + "nonce" : "1", + "storage" : { + "0x02" : "0x095e7baea6a6c7c4c2dfeb977efac326af552d87" + } + }, + "0a517d755cebbf66312b30fff713666a9cb917e0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x0a517d755cebbf66312b30fff713666a9cb917e0" + } + }, + "24dd378f51adc67a50e339e8031fe9bd4aafab36" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x24dd378f51adc67a50e339e8031fe9bd4aafab36" + } + }, + "293f982d000532a7861ab122bdc4bbfd26bf9030" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x293f982d000532a7861ab122bdc4bbfd26bf9030" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "10000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "2cf5732f017b0cf1b1f13a1478e10239716bf6b5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x2cf5732f017b0cf1b1f13a1478e10239716bf6b5" + } + }, + "31c640b92c21a1f1465c91070b4b3b4d6854195f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "37f998764813b136ddf5a754f34063fd03065e36" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x37f998764813b136ddf5a754f34063fd03065e36" + } + }, + "37fa399a749c121f8a15ce77e3d9f9bec8020d7a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x37fa399a749c121f8a15ce77e3d9f9bec8020d7a" + } + }, + "4f36659fa632310b6ec438dea4085b522a2dd077" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x4f36659fa632310b6ec438dea4085b522a2dd077" + } + }, + "62c01474f089b07dae603491675dc5b5748f7049" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x62c01474f089b07dae603491675dc5b5748f7049" + } + }, + "729af7294be595a0efd7d891c9e51f89c07950c7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x729af7294be595a0efd7d891c9e51f89c07950c7" + } + }, + "83e3e5a16d3b696a0314b30b2534804dd5e11197" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x83e3e5a16d3b696a0314b30b2534804dd5e11197" + } + }, + "8703df2417e0d7c59d063caa9583cb10a4d20532" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x8703df2417e0d7c59d063caa9583cb10a4d20532" + } + }, + "8dffcd74e5b5923512916c6a64b502689cfa65e1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x8dffcd74e5b5923512916c6a64b502689cfa65e1" + } + }, + "95a4d7cccb5204733874fa87285a176fe1e9e240" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x95a4d7cccb5204733874fa87285a176fe1e9e240" + } + }, + "99b2fcba8120bedd048fe79f5262a6690ed38c39" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0x99b2fcba8120bedd048fe79f5262a6690ed38c39" + } + }, + "a4202b8b8afd5354e3e40a219bdc17f6001bf2cf" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0xa4202b8b8afd5354e3e40a219bdc17f6001bf2cf" + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "89999", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a9647f4a0a14042d91dc33c0328030a7157c93ae" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0xa9647f4a0a14042d91dc33c0328030a7157c93ae" + } + }, + "aa6cffe5185732689c18f37a7f86170cb7304c2a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0xaa6cffe5185732689c18f37a7f86170cb7304c2a" + } + }, + "aae4a2e3c51c04606dcb3723456e58f3ed214f45" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0xaae4a2e3c51c04606dcb3723456e58f3ed214f45" + } + }, + "c37a43e940dfb5baf581a0b82b351d48305fc885" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0xc37a43e940dfb5baf581a0b82b351d48305fc885" + } + }, + "d2571607e241ecf590ed94b12d87c94babe36db6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0xd2571607e241ecf590ed94b12d87c94babe36db6" + } + }, + "f735071cbee190d76b704ce68384fc21e389fbe7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + "0x02" : "0xf735071cbee190d76b704ce68384fc21e389fbe7" + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "10000", + "code" : "0x3060025560206000600039602060006000f0", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "100000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "0x00", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "1" + } + }, + "CallTheContractToCreateEmptyContract" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "45678256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1", + "code" : "0x602060006000f0", + "nonce" : "1", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "605", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "99394", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d2571607e241ecf590ed94b12d87c94babe36db6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0", + "code" : "0x602060006000f0", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "100000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "0x00", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "1" + } + }, + "NotEnoughCashContractCreation" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "45678256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "2", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "2", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "0x600a80600c6000396000f200600160008035811a8100", + "gasLimit" : "599", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "", + "value" : "1" + } + }, + "OutOfGasContractCreation" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "45678256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1770", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "6295ee1b4f6dd65047762f924ecd367c17eabf8f" : { + "balance" : "1", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "8229", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "10000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "0x600a80600c6000396000f200600160008035811a8100", + "gasLimit" : "590", + "gasPrice" : "3", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "", + "value" : "1" + } + }, + "TransactionContractCreation" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "45678256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "599", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "6295ee1b4f6dd65047762f924ecd367c17eabf8f" : { + "balance" : "1", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "99400", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "100000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "0x600a80600c6000396000f200600160008035811a8100", + "gasLimit" : "599", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "", + "value" : "1" + } + }, + "TransactionCreateSuicideContract" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "45678256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "6295ee1b4f6dd65047762f924ecd367c17eabf8f" : { + "balance" : "1", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "8999", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "10000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "0x600a80600c6000396000f200ff600160008035811a81", + "gasLimit" : "1000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "", + "value" : "1" + } + }, + "TransactionStopInitCode" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "45678256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "599", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "6295ee1b4f6dd65047762f924ecd367c17eabf8f" : { + "balance" : "1", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "9400", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "10000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "0x600a80600c600039600000f20000600160008035811a81", + "gasLimit" : "1000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "", + "value" : "1" + } + }, + "TransactionSuicideInitCode" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "45678256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000000" : { + "balance" : "1", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "611", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "9388", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "10000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "0x600a80600c6000396000fff2ffff600160008035811a81", + "gasLimit" : "1000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "", + "value" : "1" + } + } +}
\ No newline at end of file diff --git a/tests/files/StateTests/stLogTests.json b/tests/files/StateTests/stLogTests.json new file mode 100644 index 000000000..888f6c5bb --- /dev/null +++ b/tests/files/StateTests/stLogTests.json @@ -0,0 +1,3712 @@ +{ + "log0_emptyMem" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x", + "topics" : [ + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x60006000a0", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "862", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899138", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60006000a0", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log0_logMemStartTooHigh" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1628", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898372", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log0_logMemsizeTooHigh" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a0", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1628", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898372", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a0", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log0_logMemsizeZero" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x", + "topics" : [ + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006001a0", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "866", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899134", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006001a0", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log0_nonEmptyMem" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000a0", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "898", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899102", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000a0", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log0_nonEmptyMem_logMemSize1" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xaa", + "topics" : [ + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260016000a0", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "867", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899133", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260016000a0", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log0_nonEmptyMem_logMemSize1_logMemStart31" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xdd", + "topics" : [ + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526001601fa0", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "867", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899133", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526001601fa0", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log1_Caller" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000002880000000000000000000010000004000000000000000000000000000000000000000000000", + "data" : "0xff00000000000000000000000000000000000000000000000000000000000000", + "topics" : [ + "000000000000000000000000095e7baea6a6c7c4c2dfeb977efac326af552d87" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x60ff6000533360206000a1", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "931", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899069", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff6000533360206000a1", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log1_MaxTopic" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000200000800000000000000000000000000000000880000000000000000000000000000000000000000000000010000000000000000000000020", + "data" : "0xaabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd", + "topics" : [ + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a1", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "931", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899069", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a1", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log1_emptyMem" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0x", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x600060006000a1", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "895", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899105", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600060006000a1", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log1_logMemStartTooHigh" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1628", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898372", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log1_logMemsizeTooHigh" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a1", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1628", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898372", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a1", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log1_logMemsizeZero" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0x", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006001a1", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "899", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899101", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006001a1", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log1_nonEmptyMem" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600052600060206000a1", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "931", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899069", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600052600060206000a1", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log1_nonEmptyMem_logMemSize1" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0xaa", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060016000a1", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "900", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899100", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060016000a1", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log1_nonEmptyMem_logMemSize1_logMemStart31" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0xdd", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006001601fa1", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "900", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899100", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006001601fa1", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log2_Caller" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000002880000020000000000002010000004000000000080000000000000000000000000000000000", + "data" : "0xff00000000000000000000000000000000000000000000000000000000000000", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000095e7baea6a6c7c4c2dfeb977efac326af552d87" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x60ff60005333600060206000a2", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "964", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899036", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff60005333600060206000a2", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log2_MaxTopic" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000200000800000000000000000000000000000000880000000000000000000000000000000000000000000000010000000000000000000000020", + "data" : "0xaabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd", + "topics" : [ + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a2", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "964", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899036", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a2", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log2_emptyMem" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0x", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x6000600060006000a2", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "928", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899072", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6000600060006000a2", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log2_logMemStartTooHigh" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa2", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1628", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898372", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa2", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log2_logMemsizeTooHigh" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a2", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1628", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898372", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a2", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log2_logMemsizeZero" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0x", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060006001a2", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "932", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899068", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060006001a2", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log2_nonEmptyMem" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000526000600060206000a2", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "964", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899036", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000526000600060206000a2", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log2_nonEmptyMem_logMemSize1" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0xaa", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060016000a2", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "933", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899067", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060016000a2", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log2_nonEmptyMem_logMemSize1_logMemStart31" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0xdd", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006001601fa2", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "933", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899067", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006001601fa2", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log3_Caller" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000002880000020000000000002010000004000000000080000000000000000000000000000000000", + "data" : "0xff00000000000000000000000000000000000000000000000000000000000000", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000095e7baea6a6c7c4c2dfeb977efac326af552d87" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x60ff600053336000600060206000a3", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "997", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899003", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff600053336000600060206000a3", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log3_MaxTopic" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000200000800000000000000000000000000000000880000000000000000000000000000000000000000000000010000000000000000000000020", + "data" : "0xaabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd", + "topics" : [ + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a3", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "997", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899003", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a3", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log3_PC" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00003004000000000000800000000010000008000000000000000980000000000000000000000000000000000000000000001000000400000000000800000000", + "data" : "0xff00000000000000000000000000000000000000000000000000000000000000", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000007", + "0000000000000000000000000000000000000000000000000000000000000006", + "0000000000000000000000000000000000000000000000000000000000000005" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x60ff60005358585860206000a3", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "997", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899003", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff60005358585860206000a3", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log3_emptyMem" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0x", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x60006000600060006000a3", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "961", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899039", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006000a3", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log3_logMemStartTooHigh" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa3", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1628", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898372", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa3", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log3_logMemsizeTooHigh" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a3", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1628", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898372", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a3", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log3_logMemsizeZero" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0x", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060006001a3", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "965", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899035", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060006001a3", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log3_nonEmptyMem" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260006000600060206000a3", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "997", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899003", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260006000600060206000a3", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log3_nonEmptyMem_logMemSize1" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0xaa", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060016000a3", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "966", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899034", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060016000a3", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log3_nonEmptyMem_logMemSize1_logMemStart31" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0xdd", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060006001601fa3", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "966", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899034", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060006001601fa3", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log4_Caller" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "828", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899172", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log4_MaxTopic" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000200000800000000000000000000000000000000880000000000000000000000000000000000000000000000010000000000000000000000020", + "data" : "0xaabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd", + "topics" : [ + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a4", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1030", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898970", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a4", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log4_PC" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "828", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899172", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log4_emptyMem" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0x", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x600060006000600060006000a4", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "994", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899006", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600060006000600060006000a4", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log4_logMemStartTooHigh" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa4", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1628", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898372", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa4", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log4_logMemsizeTooHigh" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a4", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1628", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898372", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a4", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log4_logMemsizeZero" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0x", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060006001a4", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "998", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899002", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060006001a4", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log4_nonEmptyMem" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600052600060006000600060206000a4", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1030", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898970", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600052600060006000600060206000a4", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log4_nonEmptyMem_logMemSize1" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0xaa", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060016000a4", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "999", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899001", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060016000a4", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "log4_nonEmptyMem_logMemSize1_logMemStart31" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0xdd", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000023", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060006001601fa4", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "999", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899001", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006017730f572e5295c57f15886f9b263e2f6d2d6c7b5ec66103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060006001601fa4", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + } +}
\ No newline at end of file diff --git a/tests/files/StateTests/stPreCompiledContracts.json b/tests/files/StateTests/stPreCompiledContracts.json new file mode 100644 index 000000000..0f1db1275 --- /dev/null +++ b/tests/files/StateTests/stPreCompiledContracts.json @@ -0,0 +1,1674 @@ +{ + "CallEcrecover0" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000001" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c600052601c6020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6040527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496060526020608060806000600060016103e8f160025560a060020a608051066000556000543214600155", + "nonce" : "0", + "storage" : { + "0x" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "0x01" : "0x01", + "0x02" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1977", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898023", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c600052601c6020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6040527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496060526020608060806000600060016103e8f160025560a060020a608051066000556000543214600155", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "365224", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallEcrecover0_0input" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000001" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x6020608060806000600060016103e8f160025560a060020a60805106600055", + "nonce" : "0", + "storage" : { + "0x02" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1441", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898559", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x6020608060806000600060016103e8f160025560a060020a60805106600055", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "365224", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallEcrecover0_Gas499" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000001" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c600052601c6020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6040527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496060526020608060806000600060016101f3f160025560a060020a608051066000556000543214600155", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1376", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898624", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c600052601c6020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6040527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496060526020608060806000600060016101f3f160025560a060020a608051066000556000543214600155", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "365224", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallEcrecover0_completeReturnValue" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000001" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c600052601c6020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6040527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496060526020608060806000600060016103e8f1600255608051600055", + "nonce" : "0", + "storage" : { + "0x" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "0x02" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1648", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898352", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c600052601c6020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6040527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496060526020608060806000600060016103e8f1600255608051600055", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "365224", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallEcrecover0_gas500" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000001" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c600052601c6020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6040527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496060526020608060806000600060016101f4f160025560a060020a608051066000556000543214600155", + "nonce" : "0", + "storage" : { + "0x" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "0x01" : "0x01", + "0x02" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1977", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898023", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c600052601c6020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6040527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496060526020608060806000600060016101f4f160025560a060020a608051066000556000543214600155", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "365224", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallEcrecover0_overlappingInputOutput" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000001" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c600052601c6020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6040527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496060526020604060806000600060016103e8f160025560a060020a604051066000556000543214600155", + "nonce" : "0", + "storage" : { + "0x" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "0x01" : "0x01", + "0x02" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1976", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898024", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c600052601c6020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6040527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496060526020604060806000600060016103e8f160025560a060020a604051066000556000543214600155", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "365224", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallEcrecover1" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000001" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c60005260016020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6040527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496060526020608060806000600060016103e8f160025560a060020a608051066000556000543214600155", + "nonce" : "0", + "storage" : { + "0x02" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1577", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898423", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c60005260016020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6040527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496060526020608060806000600060016103e8f160025560a060020a608051066000556000543214600155", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "365224", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallEcrecover2" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000001" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c600052601c6020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6021527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496041526020606160616000600060016103e8f160025560a060020a606151066000556000543214600155", + "nonce" : "0", + "storage" : { + "0x02" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1577", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898423", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x7f18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c600052601c6020527f73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f6021527feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c45496041526020606160616000600060016103e8f160025560a060020a606151066000556000543214600155", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "365224", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallEcrecover3" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000001" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x7f2f380a2dea7e778d81affc2443403b8fe4644db442ae4862ff5bb3732829cdb9600052601b6020527f6b65ccb0558806e9b097f27a396d08f964e37b8b7af6ceeb516ff86739fbea0a6040527f37cbc8d883e129a4b1ef9d5f1df53c4f21a3ef147cf2a50a4ede0eb06ce092d46060526020608060806000600060016103e8f160025560a060020a608051066000556000543214600155", + "nonce" : "0", + "storage" : { + "0x" : "0xe4319f4b631c6d0fcfc84045dbcb676865fe5e13", + "0x02" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1777", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898223", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x7f2f380a2dea7e778d81affc2443403b8fe4644db442ae4862ff5bb3732829cdb9600052601b6020527f6b65ccb0558806e9b097f27a396d08f964e37b8b7af6ceeb516ff86739fbea0a6040527f37cbc8d883e129a4b1ef9d5f1df53c4f21a3ef147cf2a50a4ede0eb06ce092d46060526020608060806000600060016103e8f160025560a060020a608051066000556000543214600155", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "365224", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallRipemd160_0" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000003" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x600160005260206000602060006000600360fff1600051600055", + "nonce" : "0", + "storage" : { + "0x" : "0xae387fcfeb723c3f5964509af111cf5a67f30661" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "934", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899066", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x600160005260206000602060006000600360fff1600051600055", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "365224", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallRipemd160_1" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000003" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x6020600060006000600060036101f4f1600255600051600055", + "nonce" : "0", + "storage" : { + "0x" : "0x9c1185a5c5e9fc54612808977ee8f548b2258d31", + "0x02" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1182", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898818", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x6020600060006000600060036101f4f1600255600051600055", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "365224", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallRipemd160_2" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000003" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x64f34578907f6005526020600060256000600060036101f4f1600255600051600055", + "nonce" : "0", + "storage" : { + "0x" : "0xdbc100f916bfbc53535573d98cf0cbb3a5b36124", + "0x02" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1286", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898714", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x64f34578907f6005526020600060256000600060036101f4f1600255600051600055", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "365224", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallRipemd160_3" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000003" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x64f34578907f6000526020600060256000600060036101f4f1600255600051600055", + "nonce" : "0", + "storage" : { + "0x" : "0x316750573f9be26bc17727b47cacedbd0ab3e6ca", + "0x02" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1286", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898714", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x64f34578907f6000526020600060256000600060036101f4f1600255600051600055", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "365224", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallRipemd160_4" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000003" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000526020600060206000600060036064f1600255600051600055", + "nonce" : "0", + "storage" : { + "0x" : "0x1cf4e77f5966e13e109703cd8a0df7ceda7f3dc3", + "0x02" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1235", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898765", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000526020600060206000600060036064f1600255600051600055", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "365224", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallRipemd160_4_gas99" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000003" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000526020600060206000600060036063f1600255600051600055", + "nonce" : "0", + "storage" : { + "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1034", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898966", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000526020600060206000600060036063f1600255600051600055", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "365224", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallRipemd160_5" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000003" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000620f42406000600060036101f4f1600255600051600055", + "nonce" : "0", + "storage" : { + "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "32684", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999867316", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000620f42406000600060036101f4f1600255600051600055", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallSha256_0" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000002" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x600160005260206000602060006000600260fff1600051600055", + "nonce" : "0", + "storage" : { + "0x" : "0xec4916dd28fc4c10d78e287ca5d9cc51ee1ae73cbfde08c6b37324cbfaac8bc5" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "934", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899066", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x600160005260206000602060006000600260fff1600051600055", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "365224", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallSha256_1" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000002" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x6020600060006000600060026101f4f1600255600051600055", + "nonce" : "0", + "storage" : { + "0x" : "0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "0x02" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1182", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898818", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x6020600060006000600060026101f4f1600255600051600055", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "365224", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallSha256_1_nonzeroValue" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000002" : { + "balance" : "19", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20099981", + "code" : "0x6020600060006000601360026101f4f1600255600051600055", + "nonce" : "0", + "storage" : { + "0x" : "0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "0x02" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1182", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898818", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x6020600060006000601360026101f4f1600255600051600055", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "365224", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallSha256_2" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000002" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x64f34578907f6005526020600060256000600060026101f4f1600255600051600055", + "nonce" : "0", + "storage" : { + "0x" : "0xcb39b3bde22925b2f931111130c774761d8895e0e08437c9b396c1e97d10f34d", + "0x02" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1286", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898714", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x64f34578907f6005526020600060256000600060026101f4f1600255600051600055", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "365224", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallSha256_3" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000002" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x64f34578907f6000526020600060256000600060026101f4f1600255600051600055", + "nonce" : "0", + "storage" : { + "0x" : "0x7392925565d67be8e9620aacbcfaecd8cb6ec58d709d25da9eccf1d08a41ce35", + "0x02" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1286", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898714", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x64f34578907f6000526020600060256000600060026101f4f1600255600051600055", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "365224", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallSha256_4" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000002" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000526020600060206000600060026064f1600255600051600055", + "nonce" : "0", + "storage" : { + "0x" : "0xaf9613760f72635fbdb44a5a0a63c39f12af30f950a6ee5c971be188e89c4051", + "0x02" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1235", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898765", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000526020600060206000600060026064f1600255600051600055", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "365224", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallSha256_4_gas99" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000002" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000526020600060206000600060026063f1600255600051600055", + "nonce" : "0", + "storage" : { + "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1034", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898966", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000526020600060206000600060026063f1600255600051600055", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "365224", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallSha256_5" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000002" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000620f42406000600060026101f4f1600255600051600055", + "nonce" : "0", + "storage" : { + "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "32684", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999867316", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000620f42406000600060026101f4f1600255600051600055", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + } +}
\ No newline at end of file diff --git a/tests/files/StateTests/stRecursiveCreate.json b/tests/files/StateTests/stRecursiveCreate.json new file mode 100644 index 000000000..983431484 --- /dev/null +++ b/tests/files/StateTests/stRecursiveCreate.json @@ -0,0 +1,7231 @@ +{ + "recursiveCreate" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0007318879928543f66b36e58900a870dfa83312" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "001864a1fbee8126e530b9242353d9cb76b043f9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "002b88d7e31f20b1cec3ae31ef8ae3f017820cf7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "00ae33b99c24c45ce086aa9a1844fe8ed55ec312" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "00c3d96a0eaddf7975da5c8718c26d65de0de59b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "00eb1775a16c0965c299f06a0873e11825f915e3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "00eb67f5e410e28c16861fea7a2ecc1e0011a75f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0116be8937cb591d6db17246c91dc3deb1fd0e1e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "012255fe8647bfe207603a62536ac6ae7a230ca9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "014337758eb4abf60a8e458a97acbd8b47fa0c31" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "01619145d576c5b3130eeed16f29501f2773c958" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "016cfb16ce1ab4c15eab782e1ac3b0d7f5bb264b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0177fee01c15eede3b794e761753c1f6d108b7f3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "018b456893203c6e3a5661e7328b5a858904cdc1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0199dd91369b5ce0467b68d57beaf1d96fdc769a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "01b26e834122a942828698305a84789ec47c0454" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "02391d38c9b4f03e9225ae5b28230284fa397a09" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "029f9045d1904fe6076c4dbe77bd33290f390714" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "02c577c9c1b247c0ea60b1dd50fa895c086e2f2a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "02c7efe87a470a521338ba476a0eaf7a535c9c56" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "02fa5c7476f2d423f27ac8afa1e357db95f920fd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "02fee10ca6c1ed23e651f29c97a310b1b4dad13f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "033b61ab81ffc5adce16d365458629d9f3482129" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "03b685fb90981f103fde64c3bbb5fd701c84dd0d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "03f3095f9e46a8ac62005c42aaccbc0fcdc3aa32" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "04110d816c380812a427968ece99b1c963dfbce6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "04308fa2e7af944dd7008a7edbe5221a52e2bc87" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0441738f9f0a045afd77a72ef8398475c1111471" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0462dd089e0519c581654520d17763635011fdff" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0473710fb4277459429e0c4a862ad3e4b45692e4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "04929feafa156581a24d8a0bfe8154ffab39fb37" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "04a104904b31f401966da211ef40874d6e97ae46" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0581dee4d5420c2f6b1614ca62a4d66bcf383d0e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "059ec3d5a255df8a5b592659ea5fdd963e9bd0c2" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "05e29ccc32df8edacbc5bd6fe19fb4ca02928969" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0602479ffb0636a1ce0fb57bf7949cc978250d2a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "060e7bcadd084fcf19db5cc1ea769550bd8f7508" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "065c627bc67fca3636da49c34994b6efb2adaad0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "06c4341ea63b3431260716e2162ba90abd9628c3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0723789d0c7093f6e97c3fdeb1324a75427ca6e8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "076ad7e168093f590a74f6fdce56b492a23baa2b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0801871b468dfdcc2d3bc0c0d01cb6ee02afe581" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0802fc1dc1a5dec7fcbf1d50f3d8a944099ad72e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "080e2ae63ad3891bfba9ec5200f4ba383209ecde" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0891a47ead61f684dc876e12d5261ab614d0fa09" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "08d19f247ca974ee89d4f988cac4becf7a177723" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "08f86cd9e45cd0f821b6088ce2f1b3c0f70dba07" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x60206000600039602060006000f0", + "nonce" : "1", + "storage" : { + } + }, + "098de34931d0d159e2631aee55524c217624d095" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "09957f64c3396f36daa03c68fa6c997eb7903df1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "09986b78d02ae7c8eaa8b62053a3ee78deba79ab" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0a1960fde1fc2010660dc9cdc299facac4502363" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0a517d755cebbf66312b30fff713666a9cb917e0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0a9015286f76ca4fbcc33e74e9c414be9774a67c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0b4b7f08623d9b3d6514baf529399e4f1c0ad944" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0b98f3276e76e9982d7f6996878ea5196fda62f1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0ba7f30a90b699e3f906bff7599b230890bbd56b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0bec2514a2a40586ec75e27442352d1dd2bce537" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0c0cd995ac9e488544723e3e8e90a5fed98a6958" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0c1e13b0604290abd900eba3fb6b7560b3401f58" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0d11b1966fa90191f6927943c476d36fa3a31556" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0d1e5ab3b0c2d1ad5a562c123b7f01f4145074ce" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0e0905211a442bb5838d2d6860f4f21e6b9c6593" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0e639c40606e9329259d2f945f59dbcc6c5c5cfe" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0e700a2aba22bd639abf05addbb24c53c3f0f3cb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0e8dab5716375707d97656230beb5f1445e56309" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0eca69ecf3068082cff932c044fe39142ab6268b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0f065de4c5c4a842f52a30fdf7b0162594df70a3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0f0f333b14cae00e0f74e1de336437d5644ae336" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0f2fc64833681664e54ca74ea756c7233a05dd85" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0f8f271215cf51a0646c8a60ed626515b3ddb739" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1039c22c55420b0d7e65e6e6e65798f3f4c1e725" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "104f577c92f14f3684c13eb179b9969c05115604" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1057c6ef671b124fc14b5641c167c6e6756d8cb8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1121c3fb4f490140339dabac59a62dd59a9912de" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "11895349d40ea4683803f8eb7ad1d2355ff906d8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "11fde66f162bbb0e19d68f0c774c997d0165fa56" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1209046d7bf46e81d8202422e630719c906653da" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "120e38f3899a4e2f9f848a82c7afee288d14e7a4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1236efbead5ada892f61e7e4e59faa143e3bc01a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "128aabc28c928691ad3415e3c57010c40694cd6e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "12eed250610e4d59e841381dc46deaea3d9305b1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "130d08c2381d23796ff403d8f1fbaf204d90e3b8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "134c36c64db09ad23fde5b43a3a7a92d84dd5300" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "13911c90a6ddef5182a772116c1d9e98f27fb1af" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "141182812579a73e13dd878d8a94bb628143b097" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1456fa2cf6376b40069504e491e64aa40484fe3f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1480213270423eae9d6b0a603541e989998453d1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "149d393bffe9be2336e7ffd6a109f05318dc798c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "14a76e43bc292a0e69bace56681c4eb50d8e52d7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "15146e7f5a3d2db1c655ba9d8eaea6c62ca34496" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1555dfd05f003c056dc219415443be1a502fdee1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "157f8c66dd3cae32485b2d68a51c1dd7923bf91e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1588c83de3fa7b22bf6aa67a4e91f303b490cbb8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1591af76c716952018e52e54c716e8b2226d494b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "15c4f7ebfc781a41226d61bdc0fcdc98fdd8bf45" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "15e75e648b604b0b8028f7955647eac6bc850088" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "161f83bac94d326e2a8debba84379ab72a14c6d6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1622e5aa3015448c3a7560b15a289d9aacc5370e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1660ada72b0a07040df8d063f2f3f3fee891f1d0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "16c5f61453cff59c6b7e2a690cd902b72208427f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "16cab73035afa73268745a3c2937b551813c4960" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "16f5ee37c60dfd70f8281ac16cda47d665ef8789" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1756aed6799c904988cc7a1dfabe77fcca058655" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "17c7a85a071c3dee708baeaf56c208752c362e56" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "18500d6a8e3e20ace9aeb507c213b6261b23f5d3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1872142d84f7023b181766b790a4487f4012527c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "18731575d0a6339f6317c2a1b628d8a4c145328e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "187749fd89567f9519f0d50b4a19ad2600440e3a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "187dea0407359c9579adbdf1ba9fad4a92fb358b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "188921ab89b5b8bcbe443676626e6012a1ed7dfb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1889f5317912e414fda653c710d2c17b7d5651e2" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "18934934c2f7d8b6b645fcc90460a966df3a716f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "18e0cdfc5a23465cfb3566091849c044d2210b55" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1963ac8fc10167891e91b4d3f53e09e0b7c9b55d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1a6bbe5380998bea238848b7a5927fa87e7b9fe1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1ab2ec9fb4e5d9d8cd15a1ad495ff314b97869c6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1ac3dd6a958d88e45c2c55d938dba74fa892084e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1b6ec3b2772285abeba8f53839fd96de995c4bd1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1b8a6f09f8fc9743b59ddbb2f105034e32262552" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1bce33a58c2741f74daab60067f759e9fc5f8c40" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1c2749b3a6c574b21622761bef7274261597ef2e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1c32901c93008d3e09928bdf3385f32ecff9500e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1c6c53405b0eb8800a527cc5990fe3b259b50a4a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1c827d36ec915dae96fdc0b164fb7bc1be9467b6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1cd063768378c77cbcb93dab0ba4c345d76bb0fe" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1cd52bab323ca2180a747d3c8b8405397003feb9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1d3289a828d2bb4a86cda52b7772e2d0d508bac9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1e1505a86f6b0fb5f7a4500cca953462cde929e4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1ea264b74c8f6e50586097e2e7c9a39419fd88de" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1ec05c9f7c0ececff5088a06157f47f3e9dac9c0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1ec26f14651cc567ce691ce83ef09eced6b12a6e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1f01dbf8bd02bed14cc0a21831e044faa3f66fca" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1f1960aa296fd1f00ff131357138001afcd858a9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1f323b00b7be1e9c0713b080cadc05f45e5e7ec3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1f5cdfaf598bd8002997b576e9ba849636c8431f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1f95c6da6a9e0abe74900ec00388094d32d98a42" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1fce5879444d729719c03b5af6e074b87a49d933" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1fdfe5402a88f71bfbaf9c65f6df05b8eb6232c1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "202474905af37a5074cfbc2d2dd0f2f205a099ab" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2040d98a367ea817f76fcf8574d4df51234eb492" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "208d07e7177b2e975c6b6d0eb3c5566900b87dfc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2099c5bdda1d98ce3b99988d768fa9f812a21f24" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "21115fe08f7ec434d4ec27e8dcfdf31a6e50aa09" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "21190aebff29feb773919d8572f8cc825bbf7144" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "21368af8397276e6e4b284fe36f525dd323bd3da" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "22230d8d10e81e01450aa68bdfbee3c20d969de9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "22affea985c1a1ab7007a55e77e80c54111708be" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "22df73cba33d8fd14fc985fccded670de4041f25" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "22f2f312befc07db595b5d9fcbc4caa7ee8df51c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "23138c70217200a44c58dceaa4f5ab06470213a4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "241b46962af48709f1a19739ffdc7bd3f0d2c7ad" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "24248d1242acc87dc331e87f3142951a977a3d2c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "24ce22b6a7f4227e1e3a6c03c14d07acdb2ec553" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "24cea63a6f0ede9a0fa91907e841ba4174e1cd0c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "24dd378f51adc67a50e339e8031fe9bd4aafab36" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "253a31b068a402910eb30758704b78c375ea349a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2559cea11e9d8fd293253a8ffada7558c9c4db86" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "25c0d5ce71eec198760c001497350ad83df55ea8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "25f81565c6ac2e22d7e320168222450c2cdf4f6d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2600b9122847ee06e201ff6a734fdcfa74b2be73" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2652f49b5ad98503231b3befe7587c231be8a5e8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "269f24e1ae86f63876b0504b7b26e20483fa95f8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "26be5205dce0ce433dca3602886578160e6d52c1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "277c19a0f1e4f5e4339de4d0223fa254a6c8a5df" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "27b3a0698a207d5ed960cf71b1ee9fc54c229eb4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "28313061667479bb25119ca3090cd25c4a99a20f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "284452c049bb65ec77ed7502b19abf699127c21d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "28cd47ab2e86fe040740206eb31fe193df7cbab4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "28ce21f7f28c8a546bca1697ada45cd73473465d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "291cfb4b02976ffde7f1f269a3e7d30940367e55" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "293f982d000532a7861ab122bdc4bbfd26bf9030" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "295882ddd91b2f92c43bad0a51fd0ef7af61e729" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "29799a64a736832cda536d687dd443ef3bc31e57" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "298b8bde7997684bfe4434cf6d24d50ddabb69b2" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "299528bfdcf20ff8e19a7a3fbbdfe98eddc2604c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "299f80e93d68725830c27cb084265d0e634e4f77" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "29f147c366199719adcb2ed1d528c4f34c10dc03" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2abef5958c8b283eaeec4557844ff1fe194e6cd3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "465224", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "2b5fbc2f7e76f6281861cb4282effb94d609844d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2bab1d9132d47e56f937ef50987cc52c9adddf0b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2bb175c167599417f2192d9f926a5c648d17de8f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2c4a413bc345da77b2d07a17313b6d89aef2c2c1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2c748f96ae0e6e9b01395e8a73dfc351c46658be" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2ccccc0744051db25927d850055234117778c1fd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2cd26944d7baa6d92eee478960d5778375862e85" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2cf5732f017b0cf1b1f13a1478e10239716bf6b5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2d142ccaa1337198d592bc36ce7c5447da73f906" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2d960addf6048f155cfaac4ad513f46429bb58f1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2db5e35091789102bd0019b4ee49bcae42524428" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2dbc14a87a2b5a8b780e460dbe0083d8260326f4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2e070631694c093a9a329ec0b4a1cfa57e20ab77" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2e574f7a4c8f0e80964604262ef68b3168fd31ef" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2e83c90e7fa359705ed2138854a83a9145c27a8e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2ea29d9016f2b1141475e4c3c62e031c0a908a07" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2eabf4237f49d4cd44ec256436b99ba41828d36c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2ed524088290909f92ade6d5f9d9c24071c26662" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2f171d1f2cf19f4a458b7dc4db89fa7cd818dda0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2f8ac479ce5baade6a63ecadf9599bfb0ecdecde" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "305773e25e157761c9d55cb7d9e24fc1b953a8b9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "30b37f280d6735ee04239de0963b071f83c13a27" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "30c5bc3861dfc5a70325aca029ab5dcb2d72928f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "30f51302b4630ea1b8bdcac380bd97d78c8f60d3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "310782e2f6d97ef0abd4a4ccb75b401a7d348be6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "311f9efa9544b1c8a8277c52e0f1ca47daec8c00" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "312f80de0869a8fed49c8ba843484411c47dd13e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3174a074366bc04bfb7f2a728a725cb01cd575d3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "317f31be5e04361b11b97ff2d6fc682030d8cd8d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "317fda8ec45232a8259546a4ca8ebef16338d47b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "31a87a9e67b2728c14767de26753f205b793c5ac" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "31c640b92c21a1f1465c91070b4b3b4d6854195f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "31e7dce7c8469a6dc612dd8c0a1242846d31c069" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3229e332af8eaf358f44aad3a902a6c47f96983e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "32a48ace80773ad092de1d9bcaa00787353b5fad" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "32de9810bbf442f9209f994556bc9a7f7e6da500" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "32f9418411245a8bc6982ff71436ed2de87e3d96" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "331a1cbbb58594c3636c0e54de517c4a6cedc27b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "33207da78e5ef3dde6fceab85bee1b5bf717e139" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "333872ba7e8ce9c43e158b12a3d038d06672db7e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "33b82c3871bc89d9137c62af099a0c4e5911a047" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "33c85ce982d0996ff7313c1387ab93348a6777d7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3432c3f9f90cb61e79f39d310bdc6cb8dcb3a49a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "34c972120d50fbdbb38ba536e4d61bc8f995d19d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "352e4ddc3153285117254b1cc378d297b7a057b5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3539fe0192009fe1a9d35901b0ba951a59348a97" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "36630619f71ccd89ea6fba8b13099d1483187b17" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3671a99d2a485b30fafa2a65f405b6b03ed32ea9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "36a9d95fe0c701c65370560445c6a80b4e13c8d9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "37609ce3799a1b75ea6090da3d014d59e5e7851c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "379ef6dde2bc54ced45146d4907639ee7cf1c8eb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "37f998764813b136ddf5a754f34063fd03065e36" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "37fa399a749c121f8a15ce77e3d9f9bec8020d7a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3820c20f3f8ee1b164dab460b05a979640a41369" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "38450559e7ed9b72c80aa00855b942f9bac1b281" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "38479ce52243f1a8b358515a084fb41533a723fd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3867a470ae1d99ccc7af287ed95ea4da4fd49e52" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "387b1112283308ce33f63062a7531e6fe0f3af16" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "38813e8d77b07f357888ea1a7805ebf52c59189b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "38ae3c2e0c1fa2eaec3648a2829fa362b5e01351" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "38c622aecb7e84ad4fcfc327ae9a1a17e2dbc36e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "38fe3b47fed5fa6d060bde66598bf5a773b831eb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3917f5ac4614ab7d126adf2f5b1d578f2b91c370" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "39457953215cb93e68bc5b351d63a8b7fd16031e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "39d9b351db53d59af4907116d594ebba910474f2" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "39ea196ad4678ac786f9ff4ba12edbb364cd1baf" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "39ed2d94ee4aae100b111c773d4f3b78bd4e9291" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3a9d3ead70f9c3cdf9a64b25b5c1bf765fe09fec" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3b7465c98051ca273d8909857047d5dc5b022af7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3b7d7653d3a7c2712d08bd29668163cb775c74a9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3bfd62743dab66288fe0b993d893a41d2dc3fbba" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3c4a4ef39f21e45a8f56e5c8bf8bacfaba78a777" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3c7c94fe8e900964a9885a19e09a4ab80213c5c3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3d082c9477c05d23447d1682257a9d0ac1f948be" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3d64e9c7cee7c3d41cfbeed851fff8642bd0200b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3d7b61ce014d1cb84465f1f908a6a940fd991b39" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3da1b91d461c3220510e60c0c5b87be635068740" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3dd6e0baadd05402f490e3030ef1970d884a1caf" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3debce965330c2da68edb1cdd3ac380d5ce67b10" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3dff39a90e67e86536dcc8b4dbfac04da831e0b5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3e0506e272fb9d9369627282cd76a40e4046ee84" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3e1b0d3f5819f63c9621ba4d4af623a7b89b99ae" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3e3069deb6f503bb8bf155eb2f89801140831f5b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3e85699a24243e147ec809e30761d92c0d21392a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3edca986feba79717853d9b91595ae61d953736e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3ef5e42a0012b430169dae579f8dac0f6ef5dc38" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3f5bf6c71c4fae1a91c1cca72b539dd83762a716" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3f8bd9d9410af417dcc6969b64096380e1a6d0b3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3fabe5e3c3a59fd322cb638dc5295d1e94cbcea3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3fde19fb418799c0e1744b322314c17a863a0c9c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "401f65fb53496c7746dc6477f6f9d67246965d51" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "40652c9cf91678111a21c62d7206ffbca3d47c9b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "40e0cce7d94ab21453c5576f30a598cf9fa80e1a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "411456908355aa037314aa920e8afef3632503fa" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "41493b8488a0ae34cade12733e8df93a87f3ec7f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "41eeae22551bd18167a31036b363bdcec89a7d9c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "42bbb8e2c7347e29f3a679e4cc9d1ca75319fbd3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "42ea619ae1a90979837ad2137458d991ea0613be" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "42f56890357c304762f1c57171cef30f044ea09b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "42f8c6079f5658fc8dc5629b63684f278acb7648" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "43b0edac3c2c58f16fa2380089d841c420a14236" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "43ec9b975f37266d0ff7f044581db559fb9376c4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "444e8af4b323407d02a7f96c209b712a65c6aba9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "44b329f4eb8ebaa00d731472964de821f8e53a26" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "44d13c51fb706efb7394346b00debea9ea46e9f3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "44ed3a04032bf3585faf1dfedb9806eeb8345809" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "44f344790e299b22484749266ea59bbcd58e4b0e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4582048e819b7d55b3c6f47e46ef8dd8fdd12038" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "45eb1861d0701efb338468964c2495db8e7e3411" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "462cf0e5071404ef569338a6f0a5b113d64a11a2" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "46aa4a5c336dbecbabd4cdfef3b9fa65a8a12a15" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "479544e8b67a7e82120d3c5d7869b4c55f4a0de3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "483940025f2d36cb32e93ed80caa41f15487ee7f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "48e958f074c27f1d190e69ef8c01f86931b278f9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "49a01a2696857efac9ba53c2705ea4ffdeb30419" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "49fc4b5136601d856188898008375b9c1bf5897e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4a0ec2620d55cefe3e80960f83ebc81219ebabcb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4a1edf2110e4ff29c69b835bdd375ac88525dde6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4a466c64765157e1a9dee46e1a26d95ac2664c4f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4a635e63aadc395c1801c73640f256250d209b25" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4aebaa9fbdb040e8037e78fc37785f33dc3cafec" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4af174d239e86ee19d40026eae04486804602061" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4b2c0c38418eb142d686d124ac5fcb363b061fd7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4b414d48f3871bc957751d5895c96f090b509bbb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4b6dcb9105adc3ccc34c6c180e9e2212c1789975" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4b8558347f669cd9b50f70cb501cdbf05f93b575" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4bb5fc5d686cfb132c177aee8ef426e5de98cc6b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4bdd7615ee906a0c88233acc5816b4fdb4656dfa" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4c0cfb86a402c70e6b110a1237d10c7fc7fe9cd5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4cada4d5773385e68f4ff1efd1a23d75dbf1e61c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4cd33b31663c159fbd73cbb32f616eb46f7b18a2" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4d47d935a3a4a4618c67f337a0075d26d9c1f852" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4d4ad735b52df9e88fbebebac2de1ede991f9994" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4d7a1e5009218cf5176a313f6922c3ab01d4970d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4d92228ffbe5ea89389a34a7086e4420d61eb70b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4dbe6269722a6063d594dfb65eba1f2a10488963" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4e36ffe7590f8dd7fa9c4c03cba3120674814abc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4e4ad0ada6b3beffa2436bef1f6a8054f4476be8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4e5cd86dc5f716ebbdf6ef572a369c227986bde4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4e76fc5e619a4200846eecdd5545b39499debb10" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4e86f346747b828937501ebfda05b2b8fa16f87a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4ebc77b7203cce293550d92b2b5587621cf53219" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4ec27065c52d294799b93700dcee6e32778f1b18" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4ec674e8eb6b890cbb7df926def8fbbb2a6bba70" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4f14a61b9f2f99e50b719f1345e76339f7618202" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4f36659fa632310b6ec438dea4085b522a2dd077" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4f5af8eccb582ad30e2702d07577479599461c54" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4f5c55986b93d742d196235aa7329df2c8ae5562" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4f86da4fecade6017d7f15e30d8320446306870a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4fc34bdd654289653ffc904f86ab2f17bad8431d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4fe8f4ad85487cfe365ca212848f7c970c21e135" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5038bd4d6b5b31100c52c85ae3294d525596836c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "504ba70fca5091ea426c964ac631082e4ad51672" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "50aada85d21c462d9c2803fd3c22beacc61f496b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "50dc3dab5836e25872ec87bb2bb30ab57a35fb0c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "511b33319d0f7df487e07c4f5d149b27cecace46" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5154569b5138f7c1b77d4434860a92ff5707e047" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "51a578dc2949f3881535733a5b1a7b5bd308215f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "51cc4a0bffdbdd8313ed94ebfd5524e8200f4876" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "51fd18c9ab9bbb67c27373e8ad754e253e09dbdd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5216a59dcffc6105f9b58a0b397baad604c0dfb6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "52b774b5fab1f557024bd4a7cbec4cd014b81557" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "52b90967c04ab8adba7c6908b04eabf2c00bcf82" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "52f1ef4cc038ef92d0c1f9e7afd3dd3cd0c25b38" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "52ff6062b4e65231065d5579f870b7f1472a5853" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "533069310b9741214f30aeec58be9d19f40161fe" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "533a4a1adbae2d561beb729c53e46251ab3a407c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "534d2d9ab80a99d598de600ac2843f751e8bef3a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "54819bf1efa86437d2f38b4211bdd5229247d9b5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "54a1706bea8f61e354b5296afa5a9f488f88ba0d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "54d1de66a65ecf30d79037a8c8af99c633113516" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "55010017736ad7e8e14327cf0230ba4c6bab0450" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5503d35e96e76e02db22c51fd7fd3d5c0667c885" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "552e158ca0fbd97f7b3c6208ad3f956a67c8df78" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5555d9bb89b76deec0c8c0cf37dcbf4b9e3449d1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "558fb0163d7794abf1b241aa4728390028291ce7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "559bf1337f14e89aee38a9859ec9bf8035e8f6c1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "560d5f4c8933c5ca0c2c1b4f3e8b22958c9d7cda" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "569e42b9cd8d79ee5c5ea9c68ba948b7b4d8d84e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "56cb9d29e9be519d3fc1cd21fcae7750aaa8b845" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "570dce0f67e367a085e51a47d6c93891a82d452b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "57cb48688d626a12fd4caee130b11e1b06ebaacb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "58cbb2379b1fdac0a036bf75bb598e7d4fa232bb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "59ad59b53c0d9bbdf0ee0912732baa43eacaae99" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5a18f1d5e443321d54d1dafb3e3b5b6f2899378d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5a5e4ae2fd570b079f26dd7f8b9c90456d4b11c8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5affb7ff218092cf60bc1ba4b32ea65a32cd6844" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5b1718e3af89692315a673b5c134361408069b00" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5b2ed45c5376c8359479e1b48f8c07437ec78336" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5b4615bc4b0f10948e46f967ca6e64cf91a7753f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5b71d8cc27346cf6d64e101aab9c88dfd58d26fc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5bcf5f7ba278df5a31f48a5706e69816727a6e9b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5bd96b317d4163401c9b1a2271c03b9439e73e6e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5bf1ac936d2312daf08e481d85e99151cdfdb9e1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5c0ddde0773ca1b8f9b07ecdad9f47f2705640e1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5c45b1eefac6061c7713919b34f5dcae9d5cfc7b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5c70cf636b26ffc099fba8ddd5093e95ca8e7782" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5cf45d08c0b55dd9c34cc4cb718c917333f2e9f9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5d07bd78606705bb5c62fd390123b4e45f7d74d8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5d11f35386d10cfa7121b02056d97dd932659943" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5d3292b79851f68d3907a550dc1a0b569d603f66" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5d57e28e16bcf33b37672eeb891b29c481e89120" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5de8956c0c99e2dc6715201b3a9e1d5fd53b2dd4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5e0ea0c533298d20ebcd19482a8b1e1854dda425" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5e5a0b9c4c36067c8730abecdb29ba97aed877a7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5e74c3c0f3bc39154407e9a3c55cde944d1ca04a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5e76969932c5d314142b23c555af4625fa6b9343" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5e89d5dd43fa9fa54381f234d1f7251387a0692c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5f1703b93938752face6e4657a90825b77f455da" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5f3f9c388dc0c9c01a5fd540bf9eb714a47fc5c1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5ff4d4daf0a832422c4675a77720abbfb5afbba8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5ff4ef866c3ad4102444d020c1d21c3d35a119eb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "60a2db26238d52510209c569dca17c1f41c9a544" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "61144e43a08b3852bcd531d13f0485743bd835a3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6123d3be4335107712685be2d575958b17501067" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "61306db8b4ac256266cb379b5f686e25cc117590" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "614037f9a7be1ab2131d485845f297f2d62d569a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "615a957b818ce70fec123daafe552c482c59c5a8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6168c5e3b7d7c870e3e7eb53b152fcb920c8e1eb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "62123ac69c46a06f7e3644b0dfcfcded535b8727" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "621ada91fe8f65407ac963de8e75d88d4c388cd3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "624a9bd6345be1a95c7fb509ca4bb77d05138adb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "629fdbc407b70b57eaa1523ab12c5178e81a5d52" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "62c01474f089b07dae603491675dc5b5748f7049" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "62cde2103198f54d31cdb9e9495fd7e1243c2c27" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "62e75c838a732abab87e1846f361721f03e7d973" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "636b02091904e5b452d19455f484306b8fe62dd6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "64134c8f0ed52a13bd0a00ff9fc6db6e0832e39e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6454029b19b69bcda3ba156684d58283636dea40" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "65e3776618742b90f1d9844c907b276854869abc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "66e68e1d0f65b4379c2864f5228d98de265c5e30" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "674840a9e918ae6b7560a4ddfb60b96a32636ba4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6792d18ead88bff9193e50fa12c02779f2a0f4bd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "67a66435543da4130940ccc47e3d9d164db65fd1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "67df3bc5f86456f2bc57f75c99a0389bca7e5850" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "689a40b4f540d145f6dc4ba4079e17f84b650f9c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "68ec6ebf20b30a31b09c7a35d847da342e24a3c4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "692a1a4da0b418dd701f5133e2b3c5686015a3df" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "697f8deffc4b33738f1dc02e792b5cb4a37ead06" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "69afd0683057a214d3bb3cc7d438961cf8c8b200" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "69fd2b9233b83e54861436496ad6b9fb28afaf40" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6a22049b6339e13438521842386a7118d6a1a15b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6a31cc57646f3d9ae3b63e1f604dde04d1ba52b7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6ac56f1ceee102b85819d789e6b29308eabc373c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6ad37e86c8d4b961b0302ebf0a540ae83f3679ec" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6af2602221d2477af828ddb2c1dec8f70a24abe0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6afeffe32a56293f23d655a1d1b2bf31d616c2ea" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6b0105812868d533882ea4f08bb628e5e9d811db" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6b5ced188780878d8a72b3e6f02618db2bb97584" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6b5fe85d1513c1a29fa825a343db7a80558e6de5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6b6945d5fd5172355825871803b93e57c5040653" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6bd29846f9fdbf3efcd3c5f3beff837ecbe9f4cd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6bda06aef03a04b8eb3e4c7d1ef001fc806f5f6f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6bed38b822d8823a2cb71883522f932cdde95b0a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6c14bbac448312636b86fe713185cf7d8ea6f1be" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6c3bed6efc677ccb136c0d886a6f3fdb375798c1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6cc6da179301a7ec4290cc0a5860a42ad188399f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6cdf4bc6759fe45be60aae1cb72d3fc2bb7f2d23" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6d1f3f15f36d76d52d65b1b78a4ac85e91f33d25" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6d27b8cb6b9af8a56fca98f13033d15f10f66da4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6d33e2eaa419844043bc41073bf3a2bc0a6c1b1e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6d9834013a85a25df2e3dead1986d753457d7b67" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6e0a20c94065e338c7715046a320ff4495b4fa84" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6e24d18a80aeccbace499b6d26b655633c0bee99" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6e2da6b24262f419933bd63b03d470ba019350e3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6e53f8efbbec77187f733cb053a53a28e14ade81" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6f257471f06ece199232aaaa082d2b1ae7ddb483" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6f3dda610ec5a3722ff4ab49d1f215dd26bd8ad6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6f562b4994dff65756e316febb8d5a5b99e11420" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6fc7016fa33af287b3b9cacd092c26bd9a054569" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6ff9622ab3c22e4357e90274d00291c527991d21" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "702433f6bfbd76274ec1bb641c4a0428298487f1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "711b5163728968ec016a924238f743fa04f2d11f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "714213a080e1d2988acadbfc5e441df5173f81ba" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7161527e54370ad8fe44bc83d692b10b9f9b877e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "71a2fa577619a37c2e2336bb6c20fc1af193860f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7213c423e1db8af095bd3cefb15e43c6067635ee" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "723bce7438e7c70d113e954e9aad5dfb4551dbff" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "72969d083705c924922b857922930f2087426ca0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "729af7294be595a0efd7d891c9e51f89c07950c7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7343c0aaebc045465ffebca00e201c1f554c2eea" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "73c85788bca3bc1fb2e9b3056c595a4a7b3d2e46" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "73f9912db6e86599f256f090dffd915a845a9631" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "751c9d6e9b6d91897ab1754b15b72712953de9be" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7528088649b574b14d14f4b5ba45285eb8a78ffc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "752e929cfb45fd739923f562b146db315b8cc4ca" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "754144c0c9b9fe7f9a8e40df23f3c315a7e244bc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7642513288c9da66960a6f3df0c156a8e1dcb119" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "769277251b9d3f0906a338f156238b159bc126dd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "76ca5805dcccf57966da8489d1720fb8c5dc4b81" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "76ea1b9309253b5c03bbd6e9fca6591b51fb3785" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7702eec59b0ee531bef08c14d0e6c89e7e43ebac" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7797a5c4bb655b5ea51bc966875abb3b19c0d105" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "77d724d278fa787544189c4774f03849be2868ef" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "77f14e248490de6b7afb327c0f013c54ae31d2a6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "77f263b8c785ec73f9f77dd11ab64fb0089cb164" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7845e6c6f5d014cabfeffe6d4d9d18c547d00fa7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "784c21d8eb231135ac99a64dd2ee334b045043ad" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "786102f7205ad86bb77b14a1b80d8b26cbf3562b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "791812110230af4583a4a6dff7eb425b0b0dfab4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "79225179187b35144fe9e8505cce2bcff3986ff9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "795d6e09eedae3febc172169c017fb67aa62efbc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "799b6226b099fc75d1fc2cf6f833bdfc1fe63e48" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "799dcaea1d20bf1428807757a84d6792798b74cf" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "79cf9a7b86c0a7adb03ecb8967d70413f21b925e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "79f2d463ce2404b3e77db5dea5cc19d76ac223dc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7a315595e01d6e16134063232a01395187c9650e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7ab73fe69000d4087d0b9ceedfda0af8c4fe2d2a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7ba53872256e6762bbfdbefb1bb80b26f94df9f1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7be1a5856ef5951cf1991b57c00f73939c7030f8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7bfac062ec8fd11810639cc02f02aa8c61c6cfb8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7c26d9c9b73a75f1a468d06bd69e08f4d316845b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7c41aaac568600537f36df0e35cb625dfbed75a7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7c7d893aa4fba1deebfc9a5a14b27e2ae7f66403" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7cadcf3f4031ebc2bc85040ea16d1ad26ce1704a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7d3b079a8306f7cc89f1b9b23319ec904e3ad853" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7d4e21638e756b9953576f460037cd702d10211f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7d699e5ea61a26a7f677478cc79887e2f27ab345" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7d8dde5a13af888557ddd5b931dda20ae59e9e23" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7d8e57afa6550a1be621fb6c083aca311a1e229c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7e15566ad3e90f3c4c12c4d7fdb17e12c24da66b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7e2a31e29b84cb193202609dbd86ebaf9a83c119" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7e2bd10d506af5eaada030590c8073495230f37c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7e44d26c7ef8dc51a45248573f6a8e5a9f91a0ae" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7e9f915d9417cd7bc8220546680fa5eeb73a2192" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7ebf86bf849b6097c8af6dae10c52438538a0711" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7ee27699bf52e4db7f72b3f2591f48e8ad7972a4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7f0506a35713c6a2c68152d15a4bfb1ccaec98a8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7f16eb03b09934c61a424e6a1c4649f193d157fb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7f3d23738538a34184e3cf16506685cf0884bac5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7f57dd2b577f0d5cb1fad7bbb2cf8f07ec0f0199" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7fe4672c6fd2a05c7a91676e5ae2e75ea197567c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8069a4fb09d35f100d18c98d02ec1bfd997bb893" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "80a784f83657ad12a742b94e01c3bbaf3fb2c6bd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8135c9c23bfa97243ea79214772816339552f835" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8142cb33b22222bb9e39a66b53af12c6ca0b5375" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "814a465f554f949e6e2a6878539c705f319c627d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "81b26e12027f5df776edd5539791e683dc2e57f0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "81d6578dc3e3c0fb07a8d62f66c1eaf3b97dc2ae" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8228837a1a7d0ae41b857d852a8dd6b7c6cb3e38" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "82afbc3f6dba388dba71ee35f56ea772a53033a8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "82d03794122107972c0d075f16754791224b507c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "833bafb51e8a34c93f3100430fffc5ba61ef95c9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "83602911153c9c176419a17276ada844bb932527" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "83802f999d793e8985b916465ccf6050195c0167" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "83abf69971313b011ee30466e8f703a460400557" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "83e3e5a16d3b696a0314b30b2534804dd5e11197" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "83ed885c9759d5524052681a5602616a4d565e87" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8405a655c77ae3ebef4410c924cba9ef22a57f42" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "844301835752f15f39550cdf531e07ccef5d133d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8507d90ee605e59469a35fdc78e844c59894e003" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "857109cf04811d5273ec3af3f3d3bb56e93d1dfb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8692f270fea1b23b492dea1755f48cdd1dd78534" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8703df2417e0d7c59d063caa9583cb10a4d20532" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "871986919b8ac4032193739eeae09c66765f0f15" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8719f47f3dd875955760868a4fb23f761cf7d4ad" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "87946e396d4fd04d02f117adf25ac427895878b3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "87b02d6f0e02d90fb05adf14ae74570ea8ca6aeb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "87b27e4b436adde9bf724b4889980331dd038d49" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "87dbe63fcbb0c90d20021f9c01a03e7d94916b3b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "88a16f4f893665cf06d9ad7a7ede8d9cdf833b7a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "891c7f214e32206e8f497fdaa7ee419e2e8f3ddd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "897003bcc0313258e7a3517771982e05e4cfce1f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "89e81283794cb458b9590002ce69ddba3c976a42" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "89f02008028773d99248943a6bcb14200f4509a0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8a05aa8ab787526a0591016c2aee95037b8a478b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8a2cab44ea3d5c52c704f060f4088e505791a57e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8b0c28ef1527a918fc7dc134ee6c00f069c7073a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8b0dfaaf9135721f01f3712572ea9963d70f49c0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8bbe1ac3ee5866589a669dd95744af5ee83e1b72" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8c25b51ae5745b82c7b489b8fd4a9994b9679a0b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8c2e2a704d809931e711b89162391f2dba837406" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8ce9124341c4ca3c690b29f3575f3cb9833c8c3c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8cfda5300d7544327e32aca175840f90860305e7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8d7912a42951e7201c8854b98a36e4203508c3a2" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8de072b1fc7f48cb2a42e7ee579a462e50e4cd8c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8dffcd74e5b5923512916c6a64b502689cfa65e1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8e1320b630d8a411819c16dc0edc2cb77ed8049d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8e15b61b6735457672c8d4809e30ca7877e9fabd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8e1f5c577cd5a404507687ef379cd1e41c4a9a9e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8e4354916a56d367dd99d3eb120e27a1d8ec6e66" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8efc24fec9b67ce053a55abaaedcbbcc64e97eaf" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8f55e75b453fbb3071e4454119a33477c6028788" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8f75ec2d8d77fd6a26f4c01f7b0384bd60418874" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8faf239455a012d6ef377a83448c8185466f8511" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8fb5af158980be77e5d137ab6f95000407041099" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8fb5f5dc4d66ea0233a652230d44299718cb9f9e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8ff9fb732fc13f492704a9f47c47db4e877f6dc3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "90344e80aead27d6b007ee73dd8fd8169f870f51" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "90f8d2eba99d7e50525edae64a61a28526eef894" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9137343457792227d68316f6ac0bc3518a7702e3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "91aaa30b2bf342c6bb6a315251ffe5b7e123bfa3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "91acc7d4c4cc7affac116157a53f5614959485f9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "91c87b19dcd811fc5efc567a022bca52d5e2e252" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "925cdeaf40df0ac82648432e65481350417fd848" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "92bbf48cf4a124ffff047cad76c82db1a1889803" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "931543d59701f1a123f3850e4c6e4b0ea097ae5a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "93840036a3c19b1e91ba0ea10f95a5041ef61a3f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "939023fa69f246b709a97f16c37367e36267828c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "93a5ddc7d7b2a2bbb7a61086aa6fd0cc9e202b0d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "93beac08e1b6f1ac32c5ee628bc4356feb5e54ea" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "94602cccae39d50fdc504869eff546d1678f0ae2" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "94bcc8632137dd2d666003e33d1e7c2fdd6e95e4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "94cceeb51248e76f0fa711e92986ad36208f6e93" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "954933598dcf8e04d6f4ae5b311673409e85c809" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9580d4c2c6795fcb1ec84bf6a58b873fb2737788" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "95a4d7cccb5204733874fa87285a176fe1e9e240" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "95f36953203283bc9358f396b627dc79480a8ec8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9606aeadd83c5da2a613b0e132f0a6c13cee43bf" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "965025b3b611003c82c8c9b69b35b4c5444cde69" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9663275f953d54a345f3dd00e2eeb0f156710129" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "96f4278992ff6da5e8e60456279d9bc5d1f7a845" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "970e2fc1f55b1e2b214f84e155ae6a9403f891b3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "97316b1fd92c5e6611acffe79899064fd9274c8a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9747756fd264dfe7fbb2f46aebb3e9b084ccf45e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "974beeae03d1860c485c0dbb68e5413317770b16" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "97a3956189161fe3d52554c2a599bb619983be5d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "97b61770815f0589776243ec8ffa365b86548b28" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "97c99c7f158206d19196df8d21573126569d918e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "97f0981b0a6cb647dd7b11b52c92bc1a3206d2f5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "980410833d9ce53a0f944ccc629032fb0e6ae6aa" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9848ce910f5874ffb5cad5fdc3507e8d54fd668a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "985e84916da5ee358e1c119c9b12ff133da52d29" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9862b64181c8bf5bd53e51c5f596528ff82bf652" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "986e30c8512ac023f09da460202322a88e98aa66" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "987600e63a25755048e018d1976d8ec4657f359d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "98ae7604effcc8bf6accb109ebf78fb6f5dad01d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "98ae76bbf3fe4b779df55df06eb0081ac95d660f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "98b163f2929e5c92709759e3215879acf32a3a98" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "98cf6cec29c58634b6022fd1e8f54f912921eef3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9917620c3df2e3cae0f0e690b4da82221bc26efe" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9985ca2474151f5ab79a388ec3b0d6fbf42da1fa" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "99b2fcba8120bedd048fe79f5262a6690ed38c39" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "99d6d7fe1a4f0f7d92837486a1f9d7dd500edc11" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9a0ca249b7e4f00f62ba5230a602c3233895cee2" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9a0fa2b2dd4993b5ac3370b4047f5e4472121674" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9a2f4d9e7fd12bd7dd8141098bd3363bb644f068" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9a45843cf7ed63ab79f7df4d2bf80512d259b0c2" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9b0a69ce744a08c595426d7cfa5fe5f4dc844a25" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9beadb15fd4fe1f0755ce82dd160e1a798544a1b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9c5fc050311de43f7b7d9a66e8319ad3c051a252" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9c89251856283a8e3aed6d801ca965fdc1da4aa7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9cb15938a825ff7c17ae775b6454730983522906" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9cbb5a7f2afe219ffb9b787065cbd94ad44ebd24" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9ce1b776e1a050af28b1034980a628b7728b0831" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9cefc7e38d2a714318e5c36c3c21b226b10218e7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9cfe89d89bfe28ba95777b6a90ac7ed86b0e202f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9d0e24467eaf9b797b9e3f6a6084958889592ba8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9d9fcb724db6738e2ed07f6815a0e5d45b3042bb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9deb7e973e3567140c51750e92d7c5091174f506" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9e30a8e67c1dc0ddcbcb8c0d957101801fd250cc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9e8fe9f31e954787e0f9d01b4a7a0c8d3d320614" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9f28528f2db498c3a0e79b15b97d3b3e9357e942" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9f42a00ab7bea15357b54e16867383fdc02e7060" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9fbf90147bf6ca022818372bf38637738d553552" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9fdd9d67e3e2c78c419e3ac9bccc7322041c3b1d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a015c57718562f3839cdabd7d4e9c86f1a321a1b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a02b80b54ccc306e042c286172ba903dd53fa4c3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a06ebfd07c3daff1115b82d67be5bf4079ef6ea1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a086d90b189bda22a2ebf3e9b7092f1782e4fe84" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a0ebd1b4fc0821dde34f102f6030fc9c40b29ab0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a1230890b4634e4461d6295fef3b4ca6d8899bd4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a1ef404093a02445fe14243e853a641c23ecaff7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a20b30a1e7723ce15f80e9706fe9c1ea05170a2f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a24089bde6e39fea0d157ab9aa4173882e62f39f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a2442dd71a4e937fd73ff383067f97ad4c83b4a1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a301df371257a12c7bc93194ec045d211a2d4359" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a30dcb9cfbd0e8c874e4f919dbe71be3545464a1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a318ee3c41da839fa1002dba1f9a140274ce59e8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a31b0038c42665206876c410caf02e67405dcfff" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a31be87c0ce167d8e9380a34c7d5004e42f37840" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a3396b3bca8473c21f9ab1fca8a40ecd580bc625" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a381c1eb58a73d7e7c8b857fcf3a1b50c6116e1b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a3a80c15cc0e13dd1aea5949c48ad5b120a8d831" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a3ad081c8f3b79ad20285e881e0e4d011efc012f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a40a11c1f943538e64466de3b3bf8c022b883094" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a4202b8b8afd5354e3e40a219bdc17f6001bf2cf" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a479aac07f3b83ee401944a36812d665f54ca6f7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a4a5e07598b0d6a40fe62ca88813b63a1c02710e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a4cd6039bfcc6295533a985631a151bf2e0e8b21" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a5303b50e97dc17384209bdc3723ddc6eda7aea0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a5552ed8dae24eaed9346af3186f634d38ee9aaf" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a5ddf08c7de55ca258e346fd1acb1b71cc2f8829" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a5ec829bcc187b6d19e825b5b6f12f86f81cc063" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a60724458ce6cca04016e99826fff8c99c32e3b3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a6495f085bc30ac47e89a9a700e406e26286c3f8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a65929129c13f2405697b704fb1c840987ad36f1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a65ece83e15c7320aa0ef7ff2d69c2ff61fde661" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a686b20553a38e866228ce003657a71200957c3b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a6eab9c538a79d9ffeebc5d4495fed68dccacbd5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a71525ab6694ead3c1be0aad07bac06e69192524" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a724835568fb5e3986c1e87331a18b6628b73e25" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a7547a96b2c999509ae062509a0d426fa46ade62" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a770dccb354eae253f170825000386233ebed231" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a777e559211613e73d9d0cbcdad62c88957d6f25" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a7aaf603309127956371841badc44b69252d142e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a7f111e1b259c9bbd4beba8ebab4dd6d35bb9ee3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a89361425f7403ec9e757b5d1a31993a79189a34" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999434776", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a9647f4a0a14042d91dc33c0328030a7157c93ae" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a9ed1d8a969237243d26f8728287cb3eb8730662" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a9f73dca799231e385ce5038c826b03eff0d1145" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "aa6cffe5185732689c18f37a7f86170cb7304c2a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "aa839cff1f78242d01a33305e1d9973cd7c66d4d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "aac939ac7c11bbbfb7f4520d14442a2460a51e87" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "aae4a2e3c51c04606dcb3723456e58f3ed214f45" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "aae4f6978a8eb4a7be406a2a787d31dd49cd551e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ab118214a2227c79eab2680df0a96d0ad67dafd3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ab1b93b6a83c275972ec2a6b513c3106dda84f47" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "abf67dec2d1ec31dd111c2f1135818b6af86c662" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ac0dbbd8aa555e012e1b5fde0b4e1f20e30a057e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "acbb287ca3f98d4775dce56e40ffce57ce4ba179" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ad02a5cab29480ea5b67e354b0da540082500327" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "adecbe660a4943fb6feada38775e51259ea15af1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ae17512fd9edf51989081b42962b2fc85de4a2d8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ae5837876e23fcefa0f204d7b6433966ebb854b3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "aecb52facdff422fd67875967e9278a7b872af32" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "aeef5b5a721ea3c03ca909bf1f71c122ebcd32af" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "af3cf705624b239ce07280597a55dc8ca69dd086" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "afbd8818fe046adfa468ea58a217b83f7d5e75a0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b008af759b5359810c78d181f0743ed85c286116" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b021f73dfd1500257934aacddd707e6f67173edf" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b03a2acc80fce6d54bd1db95d7ff24123ed6e106" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b0a10fa71a1c4c621345666be094909ac112ec82" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b0a9ac49b7fc9a45c9e7b358cc2e9e09dfe361d1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b0ea2ec7623a1faebead30c8007b260a4c62f99f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b0f8d2e75cd431ef9d818a2552aab19a6a99c1d3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b14b3e0660d147b2603ed92fec4ff337e3c259df" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b15c7770a476be2c77c3bd50d60ea6b2cde3186d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b1691d2608aea9d7a56083dc7dcbfacc93a4287a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b1ec052c576186de285bbd31164de3b19a844dc1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b2c10a1979ac6236e586ed704cf9dcecb034b8b7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b2da69bc3361eaf80dce81a17d610217ebbc7a17" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b2f828407f1a5fcbb1e4ec079c22d791c7fa5478" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b31b1fe90a535ed66dfaf1bf9e1062190fbe88a6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b376b876f7137844ef5e2db1e307713885ee5d33" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b39c43369a4ec5e4b2dfa8b3dbb3a12bad630b30" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b39c8c3ee619a2946cf540cbf16720a881110f83" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b3b4dcc6ba6c6d8c352684bc69a135cccb2d88fe" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b3edb875f0dc5faa556edf77a97e53c9d828d146" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b4429d6274f10ef0b7ba30837c5de603ed4c16ef" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b4481bed4acdd11d8f22f535016a762cc87845c2" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b4c315d98fa6cbed10c6331e2a5e4688ed0b7f7d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b4c898e7d827a75d991aec0a837c23aa8d9041e2" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b572b99fc06b16a232d74898e587398d25d7d33f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b5f4de69833ef9f1392c74a5ab905c5cd1ab2874" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b6367a493bbaed7334456b3646e4541c9e96012e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b651decbba52842e8fc86afda1168ac549dea7d6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b678cef4a4ba3f3642fa128daef4ed6d50ba1a0f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b6bcc464b7b7f0359e87e9a9517d10823a2e0c93" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b705cdd0dbc620e11fa470f9b4938c5f9f42d84e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b7650fa902a0ad81e8d48deb557323bfcf32efdd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b78428568fc511f4a6ed34c2d57c4e104138ca98" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b7b7c5f65fc11a6bee686b9363884811be247c43" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b7c425948402f9382208346ff48ef6ac4667baab" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b7fbcbcd3389df89233f8bf6bfa8acf892958a33" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b88173b953f6c1b613b6e878cfdb34899e3339ac" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b8fc89fa4eae09e1b4bbb51f4c1791e589368801" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b9261902783bf36bab49f18323a9c8e4ad86519f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b94d3b46afb9954a375e50a6fede26705800a057" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b96672ac912cc5ad6f75157401ccd9003512ffc3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b96982fae6a70aff19c2d99c3b2adc57b151d784" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b9f7e8e7ea5b1a7f184a152373526ac7acf4477c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ba158ff71047c0322b1474461f94c0246d0dfb2e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ba3adb3b7ccccb748a65932e0254e52ce092c5b5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ba56f0f804625c0ff8b7b119bd03af0a10b5886e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ba70f98f64f041290dd6794e5cbc9e8144c8c914" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "baf332c908b38d0c5e825b41a500525fa990b0cc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bb26680f6bb423720c6437fab35913d0a86e2a78" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bb7a0556525b43c750e380a0ac1ca3bb719e601c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bbdb82e2b1ebae617370e1c27542ea087a4fa937" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bc2929a7819bb70f10676f4bc004fff40ce5a52b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bc843b0159d8f7cf6fa1bda55e3ddcf78e1617b2" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bc845b8623c7af6b07eda7a5363298989cc007db" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bccf73dc6498406a51b4183e22c4be57de5c4975" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bd4f71cc4a8facf8612158e418fa394cabef27b7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bdb0e729f9136a166efc4ddea366fc3b6bf6bf5c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bdd290243af494ef27e986a3cc432ba3f873758d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bddd1619fd3c4703733b1648b7db0ffa6dd09a19" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bea830535682332041ad318232044f5e914af083" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "becf51bad165c4b8544ecc57c7859ee946e610df" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bed1a42fdb56c7d562a773650bb2785737caca3b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bf36bc1d23eebe66f84a0f119552dc7b46fe2402" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bf574eebdcc7ff3617200fe07c8c7154a8d129f4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c052f8b19df2c41d807bde1c041a8ba2e87f15d5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c06bd5d93ac2ecab95942d1639b700e3a2cc48b8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c071690916c15657eba376c7c6b4b06d38e815be" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c07b721215b231d9820dc8d186e3dcabc6c75e66" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c0cbd80b185007c05f50e6f2fbb03e8d6b2ed652" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c0f36c8efba9e6e4e677faab240ccf0cf3e7d03d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c101a7eb0ac863e824eea705432530c65aa0c518" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c19f48a0a131e8b9f44989bbac80a30ffe2a2e4d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c1ab531ecade623c0c908c1fbf104fb8c647a37e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c1ff6275aeeeacd2c79dc02f8cd5cdb44a81e6be" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c20cf04f10caa057314759a2908524925294efb3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c291bf92ff9bdc0e60f049e6a5b143b940658857" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c2a603dfbb0734c098e5b6b7c8a9b64bab11054e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c2afed79b83fc6b8d98802f52b1fea6648571ee7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c30727a70f64c82d0d8837f1b45b931ebf80b106" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c33582140ad3da6d7fde2c3c73d0530cbde93555" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c37a43e940dfb5baf581a0b82b351d48305fc885" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c37d1d79868b6a4c25db68301b8575ae4a8336fb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c3d826f0bcf2d353afaea99ec55eb9162438e315" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c4170be517e6c67a9e65dddb09220df58e547102" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c44e39eed84adf0c399a9d5af8d0053715d0f5f9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c489e22b54124b98b17b68e7c38676efb81c1862" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c4be49d4dcee6efd96c35ddf346b969db9981091" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c57abf0b9724f82736bee2a05a9238a45de5512a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c5a28cdc8c4b089c87ed4938ed4718253c48dd7a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c5c5d6ad672b24a2ddedbd2418c4c131c212cb0f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c608a6fa0f9f3a6af68270740ed6c998e145eede" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c694bd4edd4e806b9c7d4ad742a3be423391470b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c71253e1b049c2b5acba1893c74007a26797e111" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c71abd039da56d4c1d783ed06a48adf0808e9cef" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c775193c9d81ed6ee806f6005a874b927e96ff19" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c7e31a320a9a7969a6f4c3cf98bd6d92a6119055" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c82d5a989ed7c8ffdf79ea0724b3c9ba3fb84e57" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c8732f022b6c57d291b26c830c651b3617c75b2a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c8b331eb5ad444567964f34dc24757bdd3425943" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c8c3cf855531e1d06c07245e76c5298b4fc90d8a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c8c90ba51e74ac5d9e462ffcafbb6df11795ebe5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c8ca05f5e8391cd5004c3c4020e570ed4a520c20" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c9113ae38fc632738ad4722046d8e07ba9363ca7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c95ee3b530d4b057840c2d9cb542a51e4e3a00cd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c98b82b246d3eca7562ae19d8ca605e77cd53a3a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "caf720d275e228b58bcd8b2686714ed8819cdc2b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cb0ef5a0d3f9427d66aa2b00d4b25c2445d96cf1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cb5e208c02a68f2d97601da482c419af989e097f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cc0302264a5d0f269e26ca3ac24d7695b562b4f4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cc40f2616fb396bfc25e9b22ba3218b2b217ea3d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cc7c2f8a3070489cfca48f5fa0db9fa2d65e40e4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ccc8cd23dc6755bbb516af6ef2a04cc82a5ce5c7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ccce4f34ac3a550c95747823a00fecce349734f7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cce1e6f23dccba1aa1830b1b7714fe985f9f2032" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cd1171381ba62ff31b56a001b8144e64e365eba1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cd2910fb9ae3395ed149b28a1ce7c3cc58bc5481" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cd5fca46bbc468b84b493f7b52ff50386b174d40" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cdc1f2aa2853b37723f415aeb181583e11ae7b8f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cdcc86f0d7e95ea5b2f9f5e802015c8ff855b257" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ce20ac750c9549b466d48c90352a255f6b7c8294" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ce7600131bfe22040ad75febed54cd4ad181276d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cebebe455b6a15d2e4705ebe51fe5007afda76eb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cedbc4eaa94298536ad368e8ac9819c5e7448738" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ceee86e99b04198c09fc8ebf3e2f45253bddeed5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cf3f58bfe41401084fd1e997e8e36dfb35e363cc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cfb0d9c00c0b7ad292f221584394a3ae7d30e0ab" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cfb86844738d5373ad23eb3185e1e9fc5d517ae6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d032f83c65a584f6e47f9fff9bc864d51a164a94" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d09a49b1cdb208e2504486267ca2418c87152962" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d0a97217cb0a4211e28a58222c1b038c44a3f211" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d10afb219e80a211c9072b18de0ff2317f67e573" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d111da05d7193bc295a4956543810071fcbe4238" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d19b2ebcfea3994bf30a7e4283b73d4bdd319cbb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d2468d6da54259507d07f74ef0a246f97e52f035" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d2571607e241ecf590ed94b12d87c94babe36db6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d25b7ae72c049f91091a4abedc4d618e5a05e1e0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d269786262f853ed769ef3ea9a7e5b98db3bfb32" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d2a0b130c0834eb0ad2717ad13233242280a6fd0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d2be9413f150b2eaf2666b42ee719fc66e5066f1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d2c8bda3e1481b96b4a3ee0a2e1f3f1aa6299feb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d2e450aa145ce97dc054b1bcf391407fbf202bd5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d3a4f3cc7113eb16572eced68ab395a40ceeda1c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d3ba8bc2aa219ba0aacc8960b92832c3b0693bac" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d3c1c3359ed1906851379272964b7d96e2977654" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d49825eca3314ad0c5918472615055010cf4a4fa" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d49daab5099319cdda477f5ba715ae685c031db7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d5144e55ee02feec18f2ff293f08b8379d1509d3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d577d44f2748e151afdb1ded254c942ca9933b0b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d65386ce109ffa3570dd27e54f32e2528fe01fc3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d7409d185224a0284e7451923e3d094ec309ef92" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d743161f0f7beed30155e171b4d577d5ce2a70d3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d758e9a701769fe9e5a80b3a09180e7631866f55" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d79995f1fbdf19beff429a94fa9dd184827c68c4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d7a36da4e6e26a99b038e34a6eb74d10d422ba9f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d7ae2e59d0776d0ba96fb4b23d1eccb3d57a14eb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d80ba0ac6edb71367c1634ae5bf72970e596a99c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d87693ae6d35928467daf90aac749654e9c57644" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d9860a22b84f982363ab9684d767a347a5c4fb74" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d99befc655ecd5df508569aaadd729af7371687e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d9d8272a3b205f71494f9009705f4f30dd31c607" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d9dd1aa8519580888c402dd4fae66ca68b4a7b47" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "da1849a4f9df2e58d30c94732ff5f3aea19ccd8d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "da3580da73b2986fe0da9b6caebe17818b7b3645" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "da5828cee8e61bd0d8af71ef5da9a7a9019ade13" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "da7555a43e7a3790290cd20a19ec19032e28a6dd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dae44ad9bfab81783c1dd591ebe3409fa8967883" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "db06ebb361ef006c17f89ad92165185a38f6e630" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "db4ed990c69c3b67a04a96ccf079649facb9c433" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "db58d0b35d26edeb0efcb49f7eb627cf49bb3a47" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dba37eb3483100bc89a7bf11b7f110ad71ecf41c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dc19c28fa6124ee9d0688d0e2879f1269b4b7fc5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dc1baaa8621b513d62e8aeb02543ce5c7b8020c0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dc280f2887ea315f70692eb247e399b18a07bda8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dce512ecde5a4c27da464f846e71c8272da4ad80" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dceb9854f220556f595bd655bf6c023457341e4a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dd0eda6e9a3dccc3d430e5dd333c83b759cc7883" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dd8317eb76e8949315e601fa8a6959e2ffd277c1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ddb6aeb5e1bb4cdb44ca3a9b979996c529d9fa3c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dddb23bf0a55d0197810e062a5a24a1503705ae5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dddda651d375f5352d2ff488eace1de63b6ffca9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dde0b1e9b9ecc980c5614012f9afae25cb1a1c16" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ddfb1c855ea2b2f198d2b6c7dc8ea0ee16d7319a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "de63eef4b269d8572b6b00574ad8e34c471a07d6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "def94fccb1b7dfbe1cf0b3dcaa03a77cf58ae768" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "df50b2ca876e4174d276dac0c64e644cb1b5a118" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "df5767dc4d8111e8641198f637e4423c62e57e27" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dfc26965c20fea217850a28c08021f1468146101" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dfeb403cff0aabe20cb07d8451caacfe31260132" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e026a4835edf27c2705c97f237e5b59b7b5da1f7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e059d3aac9a568120467ddbba3e4d25bbc82dc64" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e089f14df5e00aff3b03cac5e1236f5cf5832d5f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e0a1885b4057f65dc75636f4fb0e4b57da82429c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e0b3647d7252d53d397fa6af6d9da4749f4caadf" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e0e5744863b26418baf12f94f0bdad2ef2546a92" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e0e8eb511c8a93cbc42dec4e3c0b8492ca1d81f4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e0f04368af17d56c8cdb50f0fd5f1847d9a49cb1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e0fbdd03e0e490770d671965ccce5f5ed42bbb9d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e134cc9b2be1a15b9e270a9f7baacbda3c8b3659" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e14b8b08ed9b569d2945b078fe94225924c5987e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e1954d1413f4f50c7bb3aa0ee368b94dfeae7c1b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e19f216f6b8b78ff1e705cb56d0cb07db60a05ec" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e1e31732ce0075070c8d7e2ef7a44b93949493d0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e1f79aa1d6477ffd08d4e5ce185637434147e4f8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e21b2668bb1e9cf057606c44d49648f1c140aa76" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e24778b9ec00cc9bef91643e31885deee719207e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e28a959abf1b36ad7778737d992690cb73a51a91" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e292ba16ee32e94ba88b4b72821bf90fe7b1b845" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e2982af9c977c39cb4633346b916a3897ffeb6f9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e326d4acceedb3e572b98d4a45a6f1e37ee42501" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e32bec776748185042cb02d58fad1d5027bbaeff" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e3443d812bb8204255a1d249b82aa19508dff5c9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e355b484879e20943aca2c6655953ec8121b64e8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e365d9256480b1e9d3cc6eafdcad5912b75ad149" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e3d08fe78f595bede290f820ec0e878572803a6a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e4028c8f2888697e9939562de475f70a841ee713" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e475b2b441a9b1cdf24e0ea992dfaecedd58d6d0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e49d92946422e69977a94d1b4b769f97efcfb8eb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e50c29688b2c3dbe6633797d2a200ed7c2cb1cba" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e59b406835db0d4c63ae28072c64c664da637557" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e5baf7303b008f333c57491345e604d52fce0d63" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e5fa8de537f7665e2aed751b8ca7c6b5bf0cdca0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e635349c1e038d62f774f4201cbda082b8af403c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e64dff0ba3f0eb9e054a638d4d5f6f0cb47e1e98" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e6df36db61ae2c46d2cda2f6c8d1856ac181e6cc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e6f12dc0baf6536aa75f226bfb0262d8266433d1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e703236fc6d1dcc955b9abf34f490e2bf5057fdd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e71d6b1facc3de5c246f7d14e35a2b4a2d983c11" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e74299a026e8a481c1db07e6065ca30af9858cbc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e75900e645ce8d1abbb97d408989b159b2a50a1c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e7b8aae66ff70d59fcc5a8b4de5a246081547146" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e81f08cfb60f7c156cf7dcbee1b8790901a1eadc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e8373e7e464120da8a84da82c8137872cda65780" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e857a6c6f502dd2bd0ec341b2d4ed55f2e87e8e7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e908278cc1515f214049c48c3a8908524f2cc407" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e913f5b697154f99bfc159a132c6c253b457ef18" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e93e7128f80bef53e3217782f21f4bd6a6d19c7c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e9d157e81c306452f8494f681813037b146660eb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ea186a9a4815581b71403480abae5cc7c57c00be" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ea216bc75a65a838ea3d63f7c05588c2840ec1ab" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ea2f1211c66cdabf2b618a4dd965ce133592763b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "eadf36b1baf942879b0b5c45469fa05add1d61b3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "eb203eec55c1da2fd38977032c79ada414cc914c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "eb4e97f22f12995949c371f2df690f68f71070eb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "eb5ad2481a57a6b7ede3a16ad8bfe2991eef3ad7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "eb9414a32f85461cf4ac7c9c73761f3f1e5ab14e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ebff1a1539630b2f7b5260a93ea602372e539366" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ec184f693f222b3e48622f5253c134339e7e2e7d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ec318906ab052a41ef13ea33deee554704a307c1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ec45f260d4d758d6d23ae0297a9516190d935a5b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ec5f2ac1947c51c5982eb0ab63d1e6439f45c2e3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "eca2fc261f07a269c2487e6d1b0539d0950ff792" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ecb643ddbca1cfa6dd22964c20ef57ab47c0fda9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ecd38089d14a75b93afa634276bbe8965f5642dc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ece9d0b9393f64338ec6ca5b0efbcec2175f19ec" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ed1a5e97e3415b484e6bc8b84bd170dbdd879cb3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ee21d08004e0b6f2c1cd4bcb2a04ab74f7b7b708" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ee439948c6dead863ab2ba9105b70916d45f9e79" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ee6f3914a1e5d955fd62a29562ee0ab776235ff5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ef36b064bb706bc0540e4ed2b341ae8a0b7756b7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "efe2a6d8859b14ecc69baf66dcd47f4067df18e5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f00d30ecf763691115d2314d14ea1e11f61ad874" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f026ce3f255ef9fc7b93719a3f6926ce4953bfe1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f07ee5b0729c565f7b57995a108f94e4fcb81558" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f0dc197380bc632e5078f75f5ef0b814b7eb2ec6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f12be871bc1a1f3ca254eb027786085dd79494c5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f134cf7fd6ed2e962db26c4b3d99ee5884102c85" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f191a9c00fe780f63cf4f68a06e895bd53981254" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f1970ea5af8456fee42cc087e79bd5c6a6efaa87" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f1ba5e0a4a27d8dafcf87f049b178fe83574ac06" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f25da1517af0e2fce2b9d75fd964e8827cc0cb72" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f2866fb67103c69f10edaed228d2dd64b7e6df83" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f2d3cbe7357ee858c2b7f6ea28fc95c1af508ca8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f2d923a66a9684f2268530094ce8e3f8b8cae52e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f3b37fd9258f2c883c44e8ddaa90f91bfe9f5d51" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f3c5a341248911dda9d694ee74bf997365941dbf" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f4489af2af8424c6edf0d0adc525680dea208a31" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f475a28a9649aa00ab8a40af393f1961587c2275" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f48270bfa988db4518f9b1db9e78bb398c954550" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f49ecf0e4378b1957686d8d0b227f83e48e5523c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f4a32ec7fde64e7d3ceb53fcc00511ffe13ff5d4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f4d2d03bf70c2500fe431fdc8fbed2c13437bdc9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f4e76b020a22e8c1929ba2163e413385fc0cf884" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f53e504312e2ff787bbb9ba4ea921e9edb7b18ff" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f5472ede25cb83dc2fe392b01111133b777709b9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f619381383c69659fe81a10d695b2663426624d4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f62f676443b29c513964f01cbb356165ace54b78" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f6ee7d8bf313f837bbfed7f10b16fb2f182fd416" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f735071cbee190d76b704ce68384fc21e389fbe7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f74f956ea3d122e47f4aa0066b5e3605c80d0282" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f783f583fc06d2c88e9e0d263a6ab66f8b8a0514" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f78b2d97c8af245b705c0a19601b95f983e9aaf6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f78ff2d350615b858077a50ff85b3a9e2edcc995" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f85aaa082ae886506141245ea3b43ee74babca65" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f86c50909ddce25f4d4e71e16d78b2f6a244e8cb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f8e4de2f36fa5e9861fe3af86d05db4cae1bb1a4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f8fc32491119dea2b7fda5080ef9cf0027590265" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f904cb6a599db50cc635bb70f3c23f056e39914e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f94e8e9f1511f8cede3bfd8e1be0db35085e8e6d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f9c7db4a48b918ad6e44d2b55e2339fdcde01d26" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f9d417c0b18ff731a88a17f3b31d9d6ed1e288f1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fa849bc1ece08222f4bf249ca06a6468b3de5b1a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fa9c2ac45638e511b06ebe051411ebdc2c4c228a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fabaccc45975d14c53b830fd4fa0576da541d22e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fac000880bdfdbd780ffa7c4a1d5d8b4a1d87b03" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fafa31e9b477adf7a26b651aa9913f8664e536a4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fb04fd4e715c760c91ddc0f30b000b52203f66a4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fb5d7c75f272b07450867579978314661c3e1206" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fbdc8132551b0ed5c50b6c0f279097592b5c87ef" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fc55e6958f11444ae56c09af726f2ec57525db58" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fc70ade160bd76694149f3f439f5d4f78bdc483e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fc86915f4e8884b49adeb6f23a8f69e643d9db7b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fcdb751de1dc7c5246ce698b4b104016d034cfdb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fcf47e5c1414303d55afc40c75c41cf42079d560" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fd096ec4540dacfebbabf2dd6ffd3493a09cc38f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fd09bf9b58980d6a5776bb391d8c6881bcca2ae9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fd0dea1a583400fc29051c8192b70022d8d92c48" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fd437bf9d51bac3a2757bf4b8bf38045e78d5ada" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fd5b134edd8931ca2102693d88070dd49fc13350" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fd91b246a065cde3fc10edd6457b9e6c10fb386f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fdc6c80a86ea555b5de26c3db49a779eea6beb0c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fe4f48d16a7ec27241b987f3545423291c7cce77" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fe686acb3b7cc09ec6379af828b4b3b638898130" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fe8d768de7a723c23583162dbef207b6dcb4fb58" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fed73d1755549bd523a775e81cf80a1a507eec50" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ffb9bfb24fb671413a3aae05e0f21b870eeb2ab9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ffc4569dfb86db2e584a1138a75747dffb794466" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fff1cd2c481ce0fba0c97ef77c79227d3b67832a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x60206000600039602060006000f0", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "465224", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + } +}
\ No newline at end of file diff --git a/tests/files/StateTests/stRefundTest.json b/tests/files/StateTests/stRefundTest.json new file mode 100644 index 000000000..08ae1fac8 --- /dev/null +++ b/tests/files/StateTests/stRefundTest.json @@ -0,0 +1,523 @@ +{ + "refund500" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x600154506002545060ff60020a600a553031600b55600060015560006002556000600355600060045560006005556000600655", + "nonce" : "0", + "storage" : { + "0x0a" : "0x8000000000000000000000000000000000000000000000000000000000000000", + "0x0b" : "0x0de0b6b3a7640000" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "592", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "9408", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x600154506002545060ff60020a600a553031600b55600060015560006002556000600355600060045560006005556000600655", + "nonce" : "0", + "storage" : { + "0x01" : "0x01", + "0x02" : "0x01", + "0x03" : "0x01", + "0x04" : "0x01", + "0x05" : "0x01", + "0x06" : "0x01" + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "10000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "0" + } + }, + "refund50_1" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006001556000600255600060035560006004556000600555", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "255", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "9745", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60006001556000600255600060035560006004556000600555", + "nonce" : "0", + "storage" : { + "0x01" : "0x01", + "0x02" : "0x01", + "0x03" : "0x01", + "0x04" : "0x01", + "0x05" : "0x01" + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "10000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "0" + } + }, + "refund50_2" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x6001600a556001600b5560006001556000600255600060035560006004556000600555", + "nonce" : "0", + "storage" : { + "0x0a" : "0x01", + "0x0b" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "614", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "9386", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x6001600a556001600b5560006001556000600255600060035560006004556000600555", + "nonce" : "0", + "storage" : { + "0x01" : "0x01", + "0x02" : "0x01", + "0x03" : "0x01", + "0x04" : "0x01", + "0x05" : "0x01" + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "10000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "0" + } + }, + "refund600" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x600154506002545061ffff60020a600a553031600b55600060015560006002556000600355600060045560006005556000600655", + "nonce" : "0", + "storage" : { + "0x0b" : "0x0de0b6b3a7640000" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "492", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "9508", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x600154506002545061ffff60020a600a553031600b55600060015560006002556000600355600060045560006005556000600655", + "nonce" : "0", + "storage" : { + "0x01" : "0x01", + "0x02" : "0x01", + "0x03" : "0x01", + "0x04" : "0x01", + "0x05" : "0x01", + "0x06" : "0x01" + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "10000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "0" + } + }, + "refund_NoOOG_1" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x6000600155", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "402", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "100", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x6000600155", + "nonce" : "0", + "storage" : { + "0x01" : "0x01" + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "502", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "502", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "0" + } + }, + "refund_OOG" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x6000600155", + "nonce" : "0", + "storage" : { + "0x01" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "500", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x6000600155", + "nonce" : "0", + "storage" : { + "0x01" : "0x01" + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "500", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "500", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "0" + } + }, + "refund_changeNonZeroStorage" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000010", + "code" : "0x6017600155", + "nonce" : "0", + "storage" : { + "0x01" : "0x17" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "602", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "388", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x6017600155", + "nonce" : "0", + "storage" : { + "0x01" : "0x01" + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "850", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "10" + } + }, + "refund_getEtherBack" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000010", + "code" : "0x6000600155", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "402", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "588", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x6000600155", + "nonce" : "0", + "storage" : { + "0x01" : "0x01" + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "850", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "10" + } + } +}
\ No newline at end of file diff --git a/tests/files/StateTests/stSpecialTest.json b/tests/files/StateTests/stSpecialTest.json new file mode 100644 index 000000000..91b51fdb0 --- /dev/null +++ b/tests/files/StateTests/stSpecialTest.json @@ -0,0 +1,77 @@ +{ + "makeMoney" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000010", + "code" : "0x7b601080600c6000396000f200600035541560095700602035600035556000526000600060006000601773aaaaaaaaace5edbc8e2a8697c15331677e6ebf0b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecf1", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "850", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "140", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "aaaaaaaaace5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x600160015532600255", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x7b601080600c6000396000f200600035541560095700602035600035556000526000600060006000601773aaaaaaaaace5edbc8e2a8697c15331677e6ebf0b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecf1", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "aaaaaaaaace5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x600160015532600255", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "850", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "10" + } + } +}
\ No newline at end of file diff --git a/tests/files/StateTests/stSystemOperationsTest.json b/tests/files/StateTests/stSystemOperationsTest.json new file mode 100644 index 000000000..612331ae3 --- /dev/null +++ b/tests/files/StateTests/stSystemOperationsTest.json @@ -0,0 +1,5830 @@ +{ + "ABAcalls0" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099999", + "code" : "0x6000600060006000601873945304eb96065b2a98b57a48a06ae28d285a71b56103e8f15855", + "nonce" : "0", + "storage" : { + "0x23" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1658", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "24", + "code" : "0x6000600060006000601773095e7baea6a6c7c4c2dfeb977efac326af552d876101f4f16001015855", + "nonce" : "0", + "storage" : { + "0x26" : "0x01" + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898342", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x6000600060006000601873945304eb96065b2a98b57a48a06ae28d285a71b56103e8f15855", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "23", + "code" : "0x6000600060006000601773095e7baea6a6c7c4c2dfeb977efac326af552d876101f4f16001015855", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "1000000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "ABAcalls1" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099481", + "code" : "0x6000600060006000601873945304eb96065b2a98b57a48a06ae28d285a71b56103e85a03f15855", + "nonce" : "0", + "storage" : { + "0x25" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "131292", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "542", + "code" : "0x6000600060006000601773095e7baea6a6c7c4c2dfeb977efac326af552d876103e85a03f16001015855", + "nonce" : "0", + "storage" : { + "0x28" : "0x02" + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999768708", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x6000600060006000601873945304eb96065b2a98b57a48a06ae28d285a71b56103e85a03f15855", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "23", + "code" : "0x6000600060006000601773095e7baea6a6c7c4c2dfeb977efac326af552d876103e85a03f16001015855", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "1000000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "ABAcalls2" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099488", + "code" : "0x6001600054016000556000600060006000600173945304eb96065b2a98b57a48a06ae28d285a71b56103e85a03f1", + "nonce" : "0", + "storage" : { + "0x" : "0x0200" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "8997504", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "512", + "code" : "0x6001600054016000556000600060006000600073095e7baea6a6c7c4c2dfeb977efac326af552d876103e85a03f1", + "nonce" : "0", + "storage" : { + "0x" : "0x0200" + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999990902496", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x6001600054016000556000600060006000600173945304eb96065b2a98b57a48a06ae28d285a71b56103e85a03f1", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "0", + "code" : "0x6001600054016000556000600060006000600073095e7baea6a6c7c4c2dfeb977efac326af552d876103e85a03f1", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "ABAcalls3" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1124488", + "code" : "0x6001600054016000556000600060006000600173945304eb96065b2a98b57a48a06ae28d285a71b56103e85a03f1", + "nonce" : "0", + "storage" : { + "0x" : "0x0200" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "8997504", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "512", + "code" : "0x6001600054016000556000600060006000600073095e7baea6a6c7c4c2dfeb977efac326af552d876103e85a03f1", + "nonce" : "0", + "storage" : { + "0x" : "0x0200" + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999990902496", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1025000", + "code" : "0x6001600054016000556000600060006000600173945304eb96065b2a98b57a48a06ae28d285a71b56103e85a03f1", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "0", + "code" : "0x6001600054016000556000600060006000600073095e7baea6a6c7c4c2dfeb977efac326af552d876103e85a03f1", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "ABAcallsSuicide0" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1659", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "1000000000000100023", + "code" : "0x6000600060006000601773095e7baea6a6c7c4c2dfeb977efac326af552d876101f4f16001015855", + "nonce" : "0", + "storage" : { + "0x26" : "0x01" + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898341", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x6000600060006000601873945304eb96065b2a98b57a48a06ae28d285a71b56103e8f1585573945304eb96065b2a98b57a48a06ae28d285a71b5ff", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "23", + "code" : "0x6000600060006000601773095e7baea6a6c7c4c2dfeb977efac326af552d876101f4f16001015855", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "ABAcallsSuicide1" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099999", + "code" : "0x6000600060006000601873945304eb96065b2a98b57a48a06ae28d285a71b56103e8f15855", + "nonce" : "0", + "storage" : { + "0x23" : "0x01" + } + }, + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "24", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1659", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898341", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x6000600060006000601873945304eb96065b2a98b57a48a06ae28d285a71b56103e8f15855", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "23", + "code" : "0x6000600060006000601773095e7baea6a6c7c4c2dfeb977efac326af552d876101f4f16001015855730f572e5295c57f15886f9b263e2f6d2d6c7b5ec6ff", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallRecursiveBomb0" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20099977", + "code" : "0x6000600060006000601773945304eb96065b2a98b57a48a06ae28d285a71b5620186a0f1", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "72167", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "1000000000000000023", + "code" : "0x600160005401600055600060006000600060003060e05a03f1600155", + "nonce" : "0", + "storage" : { + "0x" : "0x0118", + "0x01" : "0x01" + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999827833", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x6000600060006000601773945304eb96065b2a98b57a48a06ae28d285a71b5620186a0f1", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "1000000000000000000", + "code" : "0x600160005401600055600060006000600060003060e05a03f1600155", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "1000000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallRecursiveBomb1" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x600160005401600055600060006000600060003060e05a03f1600155", + "nonce" : "0", + "storage" : { + "0x" : "0x03ff", + "0x01" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "261077", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999638923", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x600160005401600055600060006000600060003060e05a03f1600155", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "365223", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallRecursiveBomb2" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x600160005401600055600060006000600060003060e05a03f1600155", + "nonce" : "0", + "storage" : { + "0x" : "0x03ff", + "0x01" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "261078", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999638922", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x600160005401600055600060006000600060003060e05a03f1600155", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "365224", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallRecursiveBomb3" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x600160005401600055600060006000600060003060e05a03f1600155", + "nonce" : "0", + "storage" : { + "0x" : "0x0400", + "0x01" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "895752", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999004248", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x600160005401600055600060006000600060003060e05a03f1600155", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "1000000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallRecursiveBombLog" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20099977", + "code" : "0x6000600060006000601773945304eb96065b2a98b57a48a06ae28d285a71b5620186a0f1", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "76859", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "1000000000000000023", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000a0600160005401600055600060006000600060003060e05a03f1600155", + "nonce" : "0", + "storage" : { + "0x" : "0xea", + "0x01" : "0x01" + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999823141", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x6000600060006000601773945304eb96065b2a98b57a48a06ae28d285a71b5620186a0f1", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000a0600160005401600055600060006000600060003060e05a03f1600155", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "1000000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallRecursiveBombLog2" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000001869f", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000001842d", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000018283", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000180d9", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000017f2f", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000017d85", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000017bdb", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000017a31", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000017887", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000176dd", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000017533", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000017389", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000171df", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000017035", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000016e8b", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000016ce1", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000016b37", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000001698d", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000167e3", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000016639", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000001648f", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000162e5", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000001613b", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000015f91", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000015de7", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000015c3d", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000015a93", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000158e9", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000001573f", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000015595", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000153eb", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000015241", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000015097", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000014eed", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000014d43", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000014b99", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000149ef", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000014845", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000001469b", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000144f1", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000014347", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000001419d", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000013ff3", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000013e49", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000013c9f", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000013af5", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000001394b", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000137a1", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000135f7", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000001344d", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000132a3", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000130f9", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000012f4f", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000012da5", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000012bfb", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000012a51", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000128a7", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000126fd", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000012553", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000123a9", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000121ff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000012055", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000011eab", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000011d01", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000011b57", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000119ad", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000011803", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000011659", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000114af", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000011305", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000001115b", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000010fb1", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000010e07", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000010c5d", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000010ab3", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000010909", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000001075f", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000105b5", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000001040b", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000010261", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000100b7", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000ff0d", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000fd63", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000fbb9", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000fa0f", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000f865", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000f6bb", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000f511", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000f367", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000f1bd", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000f013", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000ee69", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000ecbf", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000eb15", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000e96b", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000e7c1", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000e617", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000e46d", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000e2c3", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000e119", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000df6f", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000ddc5", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000dc1b", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000da71", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000d8c7", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000d71d", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000d573", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000d3c9", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000d21f", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000d075", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000cecb", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000cd21", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000cb77", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000c9cd", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000c823", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000c679", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000c4cf", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000c325", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000c17b", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000bfd1", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000be27", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000bc7d", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000bad3", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000b929", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000b77f", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000b5d5", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000b42b", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000b281", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000b0d7", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000af2d", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000ad83", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000abd9", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000aa2f", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000a885", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000a6db", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000a531", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000a387", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000a1dd", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000a033", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000009e89", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000009cdf", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000009b35", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000998b", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000097e1", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000009637", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000948d", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000092e3", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000009139", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000008f8f", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000008de5", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000008c3b", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000008a91", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000088e7", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000873d", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000008593", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000083e9", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000823f", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000008095", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000007eeb", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000007d41", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000007b97", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000079ed", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000007843", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000007699", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000074ef", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000007345", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000719b", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000006ff1", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000006e47", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000006c9d", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000006af3", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000006949", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000679f", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000065f5", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000644b", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000062a1", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000060f7", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000005f4d", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000005da3", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000005bf9", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000005a4f", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000058a5", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000056fb", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000005551", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000053a7", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000051fd", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000005053", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000004ea9", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000004cff", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000004b55", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000049ab", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000004801", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000004657", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000044ad", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000004303", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000004159", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000003faf", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000003e05", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000003c5b", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000003ab1", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000003907", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000375d", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000035b3", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000003409", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000325f", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000030b5", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000002f0b", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000002d61", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000002bb7", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000002a0d", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000002863", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000026b9", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000250f", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000002365", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000021bb", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000002011", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000001e67", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000001cbd", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000001b13", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000001969", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000017bf", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000001615", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000146b", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000012c1", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000001117", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000000f6d", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000000dc3", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000000c19", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000000a6f", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000008c5", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000071b", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x0000000000000000000000000000000000000000000000000000000000000571", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x00000000000000000000000000000000000000000000000000000000000003c7", + "topics" : [ + ] + }, + { + "address" : "945304eb96065b2a98b57a48a06ae28d285a71b5", + "bloom" : "00000000000000040000000000010000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x000000000000000000000000000000000000000000000000000000000000021d", + "topics" : [ + ] + } + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20099977", + "code" : "0x6000600060006000601773945304eb96065b2a98b57a48a06ae28d285a71b5620186a0f1", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "76859", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "1000000000000000023", + "code" : "0x5a60005260206000a0600160005401600055600060006000600060003060e05a03f1600155", + "nonce" : "0", + "storage" : { + "0x" : "0xea", + "0x01" : "0x01" + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999823141", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x6000600060006000601773945304eb96065b2a98b57a48a06ae28d285a71b5620186a0f1", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "1000000000000000000", + "code" : "0x5a60005260206000a0600160005401600055600060006000600060003060e05a03f1600155", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "1000000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallToNameRegistrator0" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526000604060406000601773945304eb96065b2a98b57a48a06ae28d285a71b56103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1165", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "46", + "code" : "0x60003554156009570060203560003555", + "nonce" : "0", + "storage" : { + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" : "0xaaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa" + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898835", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526000604060406000601773945304eb96065b2a98b57a48a06ae28d285a71b56103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "23", + "code" : "0x60003554156009570060203560003555", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallToNameRegistratorNotMuchMemory0" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x7feeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526000620f120660406000601773945304eb96065b2a98b57a48a06ae28d285a71b56101f4f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1165", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "46", + "code" : "0x60003554156009570060203560003555", + "nonce" : "0", + "storage" : { + "0xeeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00" : "0xaaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa" + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898835", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x7feeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526000620f120660406000601773945304eb96065b2a98b57a48a06ae28d285a71b56101f4f1600055", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "23", + "code" : "0x60003554156009570060203560003555", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallToNameRegistratorNotMuchMemory1" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x7feeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa602052600060406000620f1206601773945304eb96065b2a98b57a48a06ae28d285a71b56101f4f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "965", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "46", + "code" : "0x60003554156009570060203560003555", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899035", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x7feeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa602052600060406000620f1206601773945304eb96065b2a98b57a48a06ae28d285a71b56101f4f1600055", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "23", + "code" : "0x60003554156009570060203560003555", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallToNameRegistratorOutOfGas" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x7feeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526000604060406000601773945304eb96065b2a98b57a48a06ae28d285a71b56064f1600055", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "736", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "46", + "code" : "0x60003554156009570060203560003555", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899264", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x7feeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526000604060406000601773945304eb96065b2a98b57a48a06ae28d285a71b56064f1600055", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "23", + "code" : "0x60003554156009570060203560003555", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallToNameRegistratorTooMuchMemory0" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000100000", + "code" : "0x7feeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa602052600060406040633ade68b1601773945304eb96065b2a98b57a48a06ae28d285a71b56101f4f1600055", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "10000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "23", + "code" : "0x60003554156009570060203560003555", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999890000", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x7feeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa602052600060406040633ade68b1601773945304eb96065b2a98b57a48a06ae28d285a71b56101f4f1600055", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "23", + "code" : "0x60003554156009570060203560003555", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallToNameRegistratorTooMuchMemory1" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000100000", + "code" : "0x7feeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa60205260006040629688d86000601773945304eb96065b2a98b57a48a06ae28d285a71b56101f4f1600055", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "10000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "23", + "code" : "0x60003554156009570060203560003555", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999890000", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x7feeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa60205260006040629688d86000601773945304eb96065b2a98b57a48a06ae28d285a71b56101f4f1600055", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "23", + "code" : "0x60003554156009570060203560003555", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallToNameRegistratorTooMuchMemory2" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000100000", + "code" : "0x7feeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526001620f120660406000601773945304eb96065b2a98b57a48a06ae28d285a71b56101f4f1600055", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "10000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "23", + "code" : "0x60003554156009570060203560003555", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999890000", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x7feeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526001620f120660406000601773945304eb96065b2a98b57a48a06ae28d285a71b56101f4f1600055", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "23", + "code" : "0x60003554156009570060203560003555", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "CallToReturn1" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526002600060406000601773945304eb96065b2a98b57a48a06ae28d285a71b56103e8f1600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1145", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "46", + "code" : "0x6001600155603760005360026000f3", + "nonce" : "0", + "storage" : { + "0x01" : "0x01" + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898855", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526002600060406000601773945304eb96065b2a98b57a48a06ae28d285a71b56103e8f1600055", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "23", + "code" : "0x6001600155603760005360026000f3", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "PostToReturn1" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000100000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526080", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "509", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "23", + "code" : "0x603760005360026000f2", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899491", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526080", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "23", + "code" : "0x603760005360026000f2", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "TestNameRegistrator" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000100000", + "code" : "0x60003554156009570060203560003555", + "nonce" : "0", + "storage" : { + "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa" : "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1149", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898851", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x60003554156009570060203560003555", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa", + "gasLimit" : "1000000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "callcodeToNameRegistrator0" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000100000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526000604060406000601773945304eb96065b2a98b57a48a06ae28d285a71b56103e8f2600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" : "0xaaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1165", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "23", + "code" : "0x60003554156009570060203560003555", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898835", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526000604060406000601773945304eb96065b2a98b57a48a06ae28d285a71b56103e8f2600055", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "23", + "code" : "0x60003554156009570060203560003555", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "1000000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "callcodeToReturn1" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000100000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526002600060406000601773945304eb96065b2a98b57a48a06ae28d285a71b56101f4f2600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01", + "0x01" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "1145", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "23", + "code" : "0x6001600155603760005360026000f3", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999898855", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526002600060406000601773945304eb96065b2a98b57a48a06ae28d285a71b56101f4f2600055", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "23", + "code" : "0x6001600155603760005360026000f3", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "callstatelessToReturn1" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000100000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526080600055", + "nonce" : "0", + "storage" : { + "0x" : "0x80" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "810", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "23", + "code" : "0x6001600155603760005360026000f2", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899190", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526080600055", + "nonce" : "0", + "storage" : { + } + }, + "945304eb96065b2a98b57a48a06ae28d285a71b5" : { + "balance" : "23", + "code" : "0x6001600155603760005360026000f2", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "createNameRegistrator" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000099977", + "code" : "0x7b601080600c6000396000f30060003554156009570060203560003555600052601c60046017f0600055", + "nonce" : "1", + "storage" : { + "0x" : "0xd2571607e241ecf590ed94b12d87c94babe36db6" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "997", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899003", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d2571607e241ecf590ed94b12d87c94babe36db6" : { + "balance" : "23", + "code" : "0x60003554156009570060203560003555", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x7b601080600c6000396000f30060003554156009570060203560003555600052601c60046017f0600055", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "createNameRegistratorOutOfMemoryBonds0" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000100000", + "code" : "0x7b601080600c6000396000f30060003554156009570060203560003555600052601c650fffffffffff6017f0600055", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "10000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999890000", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x7b601080600c6000396000f30060003554156009570060203560003555600052601c650fffffffffff6017f0600055", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "createNameRegistratorOutOfMemoryBonds1" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000100000", + "code" : "0x7b601080600c6000396000f30060003554156009570060203560003555600052650fffffffffff60046017f0600055", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "10000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999890000", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x7b601080600c6000396000f30060003554156009570060203560003555600052650fffffffffff60046017f0600055", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "createNameRegistratorValueTooHigh" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x7b601080600c6000396000f30060003554156009570060203560003555600052601c60046103e8f0600055", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x7b601080600c6000396000f30060003554156009570060203560003555600052601c60046103e8f0600055", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "10000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "return0" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x37", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "100023", + "code" : "0x603760005360016000f3", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "507", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899493", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "23", + "code" : "0x603760005360016000f3", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "1000000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "return1" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x3700", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "100023", + "code" : "0x603760005360026000f3", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "507", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899493", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "23", + "code" : "0x603760005360026000f3", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "1000000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "return2" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x370000000000000000000000000000000000000000000000000000000000000000", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "100023", + "code" : "0x603760005360216000f3", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "508", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899492", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "23", + "code" : "0x603760005360216000f3", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "1000000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "suicideAddress" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "803", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899197", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x3060005530ff", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "1000000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "suicideCaller" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "803", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1999999999999999197", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x3360005533ff", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "1000000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "suicideNotExistingAccount" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "501", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899499", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "aa1722f3947def4cf144679da39c4c32bdc35681" : { + "balance" : "1000000000000100000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x73aa1722f3947def4cf144679da39c4c32bdc35681ff", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "1000000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "suicideOrigin" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "803", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1999999999999999197", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x3260005532ff", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "1000000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + }, + "suicideSendEtherToMe" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "501", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999899499", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "1000000000000000000", + "code" : "0x30ff", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "1000000", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } + } +}
\ No newline at end of file diff --git a/tests/files/StateTests/stTransactionTest.json b/tests/files/StateTests/stTransactionTest.json new file mode 100644 index 000000000..0de850797 --- /dev/null +++ b/tests/files/StateTests/stTransactionTest.json @@ -0,0 +1,277 @@ +{ + "EmptyTransaction" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "45678256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "100000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "100000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "", + "gasPrice" : "", + "nonce" : "", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "", + "value" : "" + } + }, + "TransactionFromCoinbaseNotEnoughFounds" : { + "env" : { + "currentCoinbase" : "a94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "currentDifficulty" : "45678256", + "currentGasLimit" : "1100", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "b94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "b94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "600", + "gasPrice" : "1", + "nonce" : "", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "b94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "value" : "502" + } + }, + "TransactionSendingToEmpty" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "45678256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "500", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "6295ee1b4f6dd65047762f924ecd367c17eabf8f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "99500", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "100000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "500", + "gasPrice" : "1", + "nonce" : "", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "", + "value" : "" + } + }, + "TransactionSendingToZero" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "45678256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000000" : { + "balance" : "1", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "500", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "99499", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "100000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "5000", + "gasPrice" : "1", + "nonce" : "", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "0000000000000000000000000000000000000000", + "value" : "1" + } + }, + "TransactionToItself" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "45678256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "500", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "99500", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "100000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "5000", + "gasPrice" : "1", + "nonce" : "", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "a94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "value" : "1" + } + }, + "TransactionToItselfNotEnoughFounds" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "45678256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1101", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1101", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "600", + "gasPrice" : "1", + "nonce" : "", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "a94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "value" : "502" + } + } +}
\ No newline at end of file diff --git a/tests/files/TODO b/tests/files/TODO new file mode 100644 index 000000000..91d0f358b --- /dev/null +++ b/tests/files/TODO @@ -0,0 +1,21 @@ +- Move over to standard and clear JSON format: + +All files should be of the form: + +{ + "test1name": + { + "test1property1": ..., + "test1property2": ..., + ... + }, + "test2name": + { + "test2property1": ..., + "test2property2": ..., + ... + } +} + +Arrays are allowed, but don't use them for sets of properties - only use them for data that is clearly a continuous contiguous sequence of values. + diff --git a/tests/files/TrieTests/trieanyorder.json b/tests/files/TrieTests/trieanyorder.json new file mode 100644 index 000000000..ebf5fbff0 --- /dev/null +++ b/tests/files/TrieTests/trieanyorder.json @@ -0,0 +1,55 @@ +{ + "singleItem": { + "in": { + "A": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "root": "0xd23786fb4a010da3ce639d66d5e904a11dbc02746d1ce25029e53290cabf28ab" + }, + "dogs": { + "in": { + "doe": "reindeer", + "dog": "puppy", + "dogglesworth": "cat" + }, + "root": "0x8aad789dff2f538bca5d8ea56e8abe10f4c7ba3a5dea95fea4cd6e7c3a1168d3" + }, + "puppy": { + "in": { + "do": "verb", + "horse": "stallion", + "doge": "coin", + "dog": "puppy" + }, + "root": "0x5991bb8c6514148a29db676a14ac506cd2cd5775ace63c30a4fe457715e9ac84" + }, + "foo": { + "in": { + "foo": "bar", + "food": "bat", + "food": "bass" + }, + "root": "0x17beaa1648bafa633cda809c90c04af50fc8aed3cb40d16efbddee6fdf63c4c3" + }, + "smallValues": { + "in": { + "be": "e", + "dog": "puppy", + "bed": "d" + }, + "root": "0x3f67c7a47520f79faa29255d2d3c084a7a6df0453116ed7232ff10277a8be68b" + }, + "testy": { + "in": { + "test": "test", + "te": "testy" + }, + "root": "0x8452568af70d8d140f58d941338542f645fcca50094b20f3c3d8c3df49337928" + }, + "hex": { + "in": { + "0x0045": "0x0123456789", + "0x4500": "0x9876543210" + }, + "root": "0x285505fcabe84badc8aa310e2aae17eddc7d120aabec8a476902c8184b3a3503" + } +} diff --git a/tests/files/TrieTests/trietest.json b/tests/files/TrieTests/trietest.json new file mode 100644 index 000000000..ce5c2d191 --- /dev/null +++ b/tests/files/TrieTests/trietest.json @@ -0,0 +1,31 @@ +{ + "emptyValues": { + "in": [ + ["do", "verb"], + ["ether", "wookiedoo"], + ["horse", "stallion"], + ["shaman", "horse"], + ["doge", "coin"], + ["ether", null], + ["dog", "puppy"], + ["shaman", null] + ], + "root": "0x5991bb8c6514148a29db676a14ac506cd2cd5775ace63c30a4fe457715e9ac84" + }, + "jeff": { + "in": [ + ["0x0000000000000000000000000000000000000000000000000000000000000045", "0x22b224a1420a802ab51d326e29fa98e34c4f24ea"], + ["0x0000000000000000000000000000000000000000000000000000000000000046", "0x67706c2076330000000000000000000000000000000000000000000000000000"], + ["0x0000000000000000000000000000000000000000000000000000001234567890", "0x697c7b8c961b56f675d570498424ac8de1a918f6"], + ["0x000000000000000000000000697c7b8c961b56f675d570498424ac8de1a918f6", "0x1234567890"], + ["0x0000000000000000000000007ef9e639e2733cb34e4dfc576d4b23f72db776b2", "0x4655474156000000000000000000000000000000000000000000000000000000"], + ["0x000000000000000000000000ec4f34c97e43fbb2816cfd95e388353c7181dab1", "0x4e616d6552656700000000000000000000000000000000000000000000000000"], + ["0x4655474156000000000000000000000000000000000000000000000000000000", "0x7ef9e639e2733cb34e4dfc576d4b23f72db776b2"], + ["0x4e616d6552656700000000000000000000000000000000000000000000000000", "0xec4f34c97e43fbb2816cfd95e388353c7181dab1"], + ["0x0000000000000000000000000000000000000000000000000000001234567890", null], + ["0x000000000000000000000000697c7b8c961b56f675d570498424ac8de1a918f6", "0x6f6f6f6820736f2067726561742c207265616c6c6c793f000000000000000000"], + ["0x6f6f6f6820736f2067726561742c207265616c6c6c793f000000000000000000", "0x697c7b8c961b56f675d570498424ac8de1a918f6"] + ], + "root": "0x9f6221ebb8efe7cff60a716ecb886e67dd042014be444669f0159d8e68b42100" + } +} diff --git a/tests/files/TrieTests/trietestnextprev.json b/tests/files/TrieTests/trietestnextprev.json new file mode 100644 index 000000000..f2ad924e3 --- /dev/null +++ b/tests/files/TrieTests/trietestnextprev.json @@ -0,0 +1,19 @@ +{ + "basic": { + "in": [ "cat", "doge", "wallace" ], + "tests": [ + [ "", "", "cat" ], + [ "bobo", "", "cat" ], + [ "c", "", "cat" ], + [ "car", "", "cat" ], + [ "cat", "", "doge" ], + [ "catering", "cat", "doge" ], + [ "d", "cat", "doge" ], + [ "doge", "cat", "wallace" ], + [ "dogerton", "doge", "wallace" ], + [ "w", "doge", "wallace" ], + [ "wallace", "doge", "" ], + [ "wallace123", "wallace", ""] + ] + } +} diff --git a/tests/files/VMTests/RandomTests/randomTest.json b/tests/files/VMTests/RandomTests/randomTest.json new file mode 100644 index 000000000..dad2ee4a2 --- /dev/null +++ b/tests/files/VMTests/RandomTests/randomTest.json @@ -0,0 +1,46 @@ +{ + "randomVMtest" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x675545", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9999", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x675545", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x675545", + "nonce" : "0", + "storage" : { + } + } + } + } +}
\ No newline at end of file diff --git a/tests/files/VMTests/vmArithmeticTest.json b/tests/files/VMTests/vmArithmeticTest.json new file mode 100644 index 000000000..88d209dfa --- /dev/null +++ b/tests/files/VMTests/vmArithmeticTest.json @@ -0,0 +1,3261 @@ +{ + "add0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01600055", + "nonce" : "0", + "storage" : { + "0x" : "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "add1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01600055", + "nonce" : "0", + "storage" : { + "0x" : "0x03" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "add2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "10000", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + } + }, + "add3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x6000600001600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9896", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6000600001600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6000600001600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "add4" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600101600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9896", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600101600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600101600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "addmod0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60026002600108600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9695", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60026002600108600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60026002600108600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "addmod1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60026002600003600160000308600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9691", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60026002600003600160000308600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60026002600003600160000308600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "addmod2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60036001600660000308600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9693", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60036001600660000308600055", + "nonce" : "0", + "storage" : { + "0x" : "0x02" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60036001600660000308600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "addmod2_0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60036001600660000308600360056000030714600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9887", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60036001600660000308600360056000030714600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60036001600660000308600360056000030714600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "addmod2_1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60036001600660000308600360056000030614600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9687", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60036001600660000308600360056000030614600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60036001600660000308600360056000030614600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "addmod3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60036000036001600408600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9693", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60036000036001600408600055", + "nonce" : "0", + "storage" : { + "0x" : "0x05" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60036000036001600408600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "addmod3_0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60026003600003600160040814600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9891", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60026003600003600160040814600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60026003600003600160040814600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "divByNonZero0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x6002600504600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6002600504600055", + "nonce" : "0", + "storage" : { + "0x" : "0x02" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6002600504600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "divByNonZero1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x6018601704600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9896", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6018601704600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6018601704600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "divByNonZero2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x6018600004600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9896", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6018600004600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6018600004600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "divByNonZero3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x6001600104600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6001600104600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6001600104600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "divByZero" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x6000600204600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9896", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6000600204600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6000600204600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "exp0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x600260020a600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9695", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600260020a600055", + "nonce" : "0", + "storage" : { + "0x" : "0x04" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600260020a600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "exp1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9664", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "exp2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x637fffffff637fffffff0a600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9692", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x637fffffff637fffffff0a600055", + "nonce" : "0", + "storage" : { + "0x" : "0xbc8cccccccc888888880000000aaaaaab00000000fffffffffffffff7fffffff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x637fffffff637fffffff0a600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "exp3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x637fffffff60000a600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9892", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x637fffffff60000a600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x637fffffff60000a600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "exp4" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x6000637fffffff0a600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6000637fffffff0a600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6000637fffffff0a600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "exp5" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60016101010a600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9695", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60016101010a600055", + "nonce" : "0", + "storage" : { + "0x" : "0x0101" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60016101010a600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "exp6" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x61010160010a600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9694", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x61010160010a600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x61010160010a600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "exp7" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x61010160020a600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9894", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x61010160020a600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x61010160020a600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mod0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x6003600206600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6003600206600055", + "nonce" : "0", + "storage" : { + "0x" : "0x02" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6003600206600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mod1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff06600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff06600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff06600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mod2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600006600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9896", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600006600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600006600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mod3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x6000600306600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9896", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6000600306600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6000600306600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mod4" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x6003600260000306600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9694", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6003600260000306600055", + "nonce" : "0", + "storage" : { + "0x" : "0x02" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6003600260000306600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mul0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x6003600202600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6003600202600055", + "nonce" : "0", + "storage" : { + "0x" : "0x06" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6003600202600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mul1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mul2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x6017600002600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9896", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6017600002600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6017600002600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mul3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x6001601702600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6001601702600055", + "nonce" : "0", + "storage" : { + "0x" : "0x17" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6001601702600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mul4" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f800000000000000000000000000000000000000000000000000000000000000002600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f800000000000000000000000000000000000000000000000000000000000000002600055", + "nonce" : "0", + "storage" : { + "0x" : "0x8000000000000000000000000000000000000000000000000000000000000000" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f800000000000000000000000000000000000000000000000000000000000000002600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mul5" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x7f80000000000000000000000000000000000000000000000000000000000000007f800000000000000000000000000000000000000000000000000000000000000002600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9896", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7f80000000000000000000000000000000000000000000000000000000000000007f800000000000000000000000000000000000000000000000000000000000000002600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7f80000000000000000000000000000000000000000000000000000000000000007f800000000000000000000000000000000000000000000000000000000000000002600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mul6" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mulmod0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60026002600109600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9895", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60026002600109600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60026002600109600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mulmod1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60036002600003600160000309600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9891", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60036002600003600160000309600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60036002600003600160000309600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mulmod2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60036001600560000309600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9693", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60036001600560000309600055", + "nonce" : "0", + "storage" : { + "0x" : "0x02" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60036001600560000309600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mulmod2_0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60036001600560000309600360056000030714600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9887", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60036001600560000309600360056000030714600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60036001600560000309600360056000030714600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mulmod2_1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60036001600560000309600360056000030614600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9687", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60036001600560000309600360056000030614600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60036001600560000309600360056000030614600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mulmod3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60036000036001600509600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9693", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60036000036001600509600055", + "nonce" : "0", + "storage" : { + "0x" : "0x05" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60036000036001600509600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mulmod3_0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60026003600003600160050914600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9891", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60026003600003600160050914600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60026003600003600160050914600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "sdiv0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000305600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9694", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000305600055", + "nonce" : "0", + "storage" : { + "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000305600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "sdiv1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff05600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9694", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff05600055", + "nonce" : "0", + "storage" : { + "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff05600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "sdiv2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x6004600003600260000305600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9892", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6004600003600260000305600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6004600003600260000305600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "sdiv3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x6002600003600405600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9694", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6002600003600405600055", + "nonce" : "0", + "storage" : { + "0x" : "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6002600003600405600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "sdivByZero0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x6000600003600360000305600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9892", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6000600003600360000305600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6000600003600360000305600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "sdivByZero1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000305600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9894", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000305600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000305600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "signextendInvalidByteNumber" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x62126af460500b600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x62126af460500b600055", + "nonce" : "0", + "storage" : { + "0x" : "0x126af4" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x62126af460500b600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "signextend_00" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x600060000b600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9896", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600060000b600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600060000b600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "signextend_0_BigByte" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000b600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000b600055", + "nonce" : "0", + "storage" : { + "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000b600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "signextend_AlmostBiggestByte" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0b600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0b600055", + "nonce" : "0", + "storage" : { + "0x" : "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0b600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "signextend_BigByteBigByte" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0b600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0b600055", + "nonce" : "0", + "storage" : { + "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0b600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "signextend_BigBytePlus1_2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60ff68f000000000000000010b600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff68f000000000000000010b600055", + "nonce" : "0", + "storage" : { + "0x" : "0xff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff68f000000000000000010b600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "signextend_BigByte_0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0b600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9896", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0b600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0b600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "signextend_BitIsNotSet" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x62122f6a60000b600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x62122f6a60000b600055", + "nonce" : "0", + "storage" : { + "0x" : "0x6a" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x62122f6a60000b600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "signextend_BitIsNotSetInHigherByte" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x62126af460010b600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x62126af460010b600055", + "nonce" : "0", + "storage" : { + "0x" : "0x6af4" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x62126af460010b600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "signextend_BitIsSetInHigherByte" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x6212faf460010b600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6212faf460010b600055", + "nonce" : "0", + "storage" : { + "0x" : "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaf4" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6212faf460010b600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "signextend_bigBytePlus1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x66f000000000000161ffff0b600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x66f000000000000161ffff0b600055", + "nonce" : "0", + "storage" : { + "0x" : "0xf0000000000001" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x66f000000000000161ffff0b600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "signextend_bitIsSet" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x62122ff460000b600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x62122ff460000b600055", + "nonce" : "0", + "storage" : { + "0x" : "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x62122ff460000b600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "smod0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x6003600003600560000307600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9692", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6003600003600560000307600055", + "nonce" : "0", + "storage" : { + "0x" : "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6003600003600560000307600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "smod1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x6003600003600507600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9694", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6003600003600507600055", + "nonce" : "0", + "storage" : { + "0x" : "0x02" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6003600003600507600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "smod2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x6003600560000307600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9694", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6003600560000307600055", + "nonce" : "0", + "storage" : { + "0x" : "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6003600560000307600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "smod3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600260000307600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9894", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600260000307600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600260000307600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "smod4" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x6000600260000307600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9894", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6000600260000307600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6000600260000307600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "stop" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x00", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "10000", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x00", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x00", + "nonce" : "0", + "storage" : { + } + } + } + }, + "sub0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x6001601703600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6001601703600055", + "nonce" : "0", + "storage" : { + "0x" : "0x16" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6001601703600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "sub1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x6003600203600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6003600203600055", + "nonce" : "0", + "storage" : { + "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6003600203600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "sub2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x6017600003600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6017600003600055", + "nonce" : "0", + "storage" : { + "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe9" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6017600003600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "sub3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600003600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600003600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600003600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "sub4" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03600055", + "nonce" : "0", + "storage" : { + "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03600055", + "nonce" : "0", + "storage" : { + } + } + } + } +} diff --git a/tests/files/VMTests/vmBitwiseLogicOperationTest.json b/tests/files/VMTests/vmBitwiseLogicOperationTest.json new file mode 100644 index 000000000..f72711995 --- /dev/null +++ b/tests/files/VMTests/vmBitwiseLogicOperationTest.json @@ -0,0 +1,2682 @@ +{ + "and0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6002600216600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6002600216600055", + "nonce" : "0", + "storage" : { + "0x" : "0x02" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6002600216600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "and1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6001600216600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9896", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6001600216600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6001600216600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "and2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6001600316600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6001600316600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6001600316600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "and3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7f0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7f0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600055", + "nonce" : "0", + "storage" : { + "0x" : "0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7f0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "and4" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee16600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee16600055", + "nonce" : "0", + "storage" : { + "0x" : "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee16600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "and5" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeefeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee16600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeefeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee16600055", + "nonce" : "0", + "storage" : { + "0x" : "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeefeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeefeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee16600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "byte0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6780402010080402016000601f031a600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9694", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6780402010080402016000601f031a600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6780402010080402016000601f031a600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "byte1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6780402010080402016001601f031a600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9694", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6780402010080402016001601f031a600055", + "nonce" : "0", + "storage" : { + "0x" : "0x02" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6780402010080402016001601f031a600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "byte10" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6780402010080402017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1a600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9896", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6780402010080402017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1a600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6780402010080402017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1a600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "byte11" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x67804020100804020160001a600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9896", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x67804020100804020160001a600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x67804020100804020160001a600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "byte2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6780402010080402016002601f031a600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9694", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6780402010080402016002601f031a600055", + "nonce" : "0", + "storage" : { + "0x" : "0x04" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6780402010080402016002601f031a600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "byte3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6780402010080402016003601f031a600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9694", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6780402010080402016003601f031a600055", + "nonce" : "0", + "storage" : { + "0x" : "0x08" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6780402010080402016003601f031a600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "byte4" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6780402010080402016004601f031a600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9694", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6780402010080402016004601f031a600055", + "nonce" : "0", + "storage" : { + "0x" : "0x10" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6780402010080402016004601f031a600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "byte5" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6780402010080402016005601f031a600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9694", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6780402010080402016005601f031a600055", + "nonce" : "0", + "storage" : { + "0x" : "0x20" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6780402010080402016005601f031a600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "byte6" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6780402010080402016006601f031a600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9694", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6780402010080402016006601f031a600055", + "nonce" : "0", + "storage" : { + "0x" : "0x40" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6780402010080402016006601f031a600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "byte7" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6780402010080402016007601f031a600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9694", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6780402010080402016007601f031a600055", + "nonce" : "0", + "storage" : { + "0x" : "0x80" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6780402010080402016007601f031a600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "byte8" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x678040201008040201601f601f031a600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9894", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x678040201008040201601f601f031a600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x678040201008040201601f601f031a600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "byte9" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6780402010080402016020601f051a600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9894", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6780402010080402016020601f051a600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6780402010080402016020601f051a600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "eq0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6003600003600560000314600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9892", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6003600003600560000314600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6003600003600560000314600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "eq1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6000600014600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6000600014600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6000600014600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "eq2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "gt0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6000600260000311600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9694", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6000600260000311600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6000600260000311600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "gt1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6002600003600011600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9894", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6002600003600011600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6002600003600011600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "gt2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff11600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff11600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff11600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "gt3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600011600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9896", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600011600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600011600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "iszeo2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6080600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6080600055", + "nonce" : "0", + "storage" : { + "0x" : "0x80" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6080600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "iszero0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6080600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6080600055", + "nonce" : "0", + "storage" : { + "0x" : "0x80" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6080600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "iszero1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6080600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6080600055", + "nonce" : "0", + "storage" : { + "0x" : "0x80" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6080600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "lt0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6000600260000310600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9894", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6000600260000310600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6000600260000310600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "lt1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6002600003600010600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9694", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6002600003600010600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6002600003600010600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "lt2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff10600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9896", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff10600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff10600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "lt3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600010600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600010600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600010600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "not0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600015600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9697", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600015600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600015600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "not1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600215600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9897", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600215600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600215600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "not2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff15600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9897", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff15600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff15600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "not3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600260000315600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9895", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600260000315600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600260000315600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "not4" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000315600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9895", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000315600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000315600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "not5" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600060000315600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9695", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600060000315600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600060000315600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "or0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6002600217600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6002600217600055", + "nonce" : "0", + "storage" : { + "0x" : "0x02" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6002600217600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "or1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6001600217600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6001600217600055", + "nonce" : "0", + "storage" : { + "0x" : "0x03" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6001600217600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "or2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6001600317600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6001600317600055", + "nonce" : "0", + "storage" : { + "0x" : "0x03" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6001600317600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "or3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7f0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff17600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7f0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff17600055", + "nonce" : "0", + "storage" : { + "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7f0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff17600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "or4" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee17600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee17600055", + "nonce" : "0", + "storage" : { + "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee17600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "or5" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeefeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee17600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeefeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee17600055", + "nonce" : "0", + "storage" : { + "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeefeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee17600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "sgt0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6000600260000313600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9894", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6000600260000313600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6000600260000313600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "sgt1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6002600003600013600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9694", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6002600003600013600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6002600003600013600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "sgt2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff13600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9896", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff13600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff13600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "sgt3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600013600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600013600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600013600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "sgt4" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6003600003600560000313600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9892", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6003600003600560000313600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6003600003600560000313600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "slt0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6000600260000312600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9694", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6000600260000312600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6000600260000312600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "slt1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6002600003600012600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9894", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6002600003600012600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6002600003600012600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "slt2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff12600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff12600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff12600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "slt3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600012600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9896", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600012600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600012600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "slt4" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6003600003600560000312600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9692", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6003600003600560000312600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6003600003600560000312600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "xor0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6002600218600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9896", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6002600218600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6002600218600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "xor1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6001600218600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6001600218600055", + "nonce" : "0", + "storage" : { + "0x" : "0x03" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6001600218600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "xor2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6001600318600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6001600318600055", + "nonce" : "0", + "storage" : { + "0x" : "0x02" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6001600318600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "xor3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7f0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff18600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7f0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff18600055", + "nonce" : "0", + "storage" : { + "0x" : "0xfedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7f0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff18600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "xor4" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee18600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee18600055", + "nonce" : "0", + "storage" : { + "0x" : "0x1111111111111111111111111111111111111111111111111111111111111111" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee18600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "xor5" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeefeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee18600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeefeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee18600055", + "nonce" : "0", + "storage" : { + "0x" : "0x1111111111111111111111111111101111111111111111111111111111111111" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7feeeeeeeeeeeeeeeeeeeeeeeeeeeeefeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee18600055", + "nonce" : "0", + "storage" : { + } + } + } + } +}
\ No newline at end of file diff --git a/tests/files/VMTests/vmBlockInfoTest.json b/tests/files/VMTests/vmBlockInfoTest.json new file mode 100644 index 000000000..90fa77a3d --- /dev/null +++ b/tests/files/VMTests/vmBlockInfoTest.json @@ -0,0 +1,271 @@ +{ + "coinbase" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x41600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x41600055", + "nonce" : "0", + "storage" : { + "0x" : "0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x41600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "difficulty" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x44600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x44600055", + "nonce" : "0", + "storage" : { + "0x" : "0x0100" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x44600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "gaslimit" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x45600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x45600055", + "nonce" : "0", + "storage" : { + "0x" : "0x0f4240" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x45600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "number" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x43600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9898", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x43600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x43600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "prevhash" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x40600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x40600055", + "nonce" : "0", + "storage" : { + "0x" : "0x5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x40600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "timestamp" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x42600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x42600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x42600055", + "nonce" : "0", + "storage" : { + } + } + } + } +}
\ No newline at end of file diff --git a/tests/files/VMTests/vmEnvironmentalInfoTest.json b/tests/files/VMTests/vmEnvironmentalInfoTest.json new file mode 100644 index 000000000..37563707b --- /dev/null +++ b/tests/files/VMTests/vmEnvironmentalInfoTest.json @@ -0,0 +1,1401 @@ +{ + "address0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x30600055", + "data" : "0x", + "gas" : "100000000000", + "gasPrice" : "1000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x30600055", + "nonce" : "0", + "storage" : { + "0x" : "0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x30600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "address1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "caller" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "code" : "0x30600055", + "data" : "0x", + "gas" : "100000000000", + "gasPrice" : "1000000000", + "origin" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "value" : "1000000000000000000" + }, + "gas" : "99999999698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "cd1722f3947def4cf144679da39c4c32bdc35681" : { + "balance" : "1000000000000000000", + "code" : "0x30600055", + "nonce" : "0", + "storage" : { + "0x" : "0xcd1722f3947def4cf144679da39c4c32bdc35681" + } + } + }, + "pre" : { + "cd1722f3947def4cf144679da39c4c32bdc35681" : { + "balance" : "1000000000000000000", + "code" : "0x30600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "balance0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x73cd1722f3947def4cf144679da39c4c32bdc3568131600055", + "data" : "0x", + "gas" : "100000000000", + "gasPrice" : "1000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999878", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x73cd1722f3947def4cf144679da39c4c32bdc3568131600055", + "nonce" : "0", + "storage" : { + } + }, + "cd1722f3947def4cf144679da39c4c32bdc35681" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x73cd1722f3947def4cf144679da39c4c32bdc3568131600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "balance1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x730f572e5295c57f15886f9b263e2f6d2d6c7b5ec631600055", + "data" : "0x", + "gas" : "100000000000", + "gasPrice" : "1000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999678", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x730f572e5295c57f15886f9b263e2f6d2d6c7b5ec631600055", + "nonce" : "0", + "storage" : { + "0x" : "0x0de0b6b3a7640000" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x730f572e5295c57f15886f9b263e2f6d2d6c7b5ec631600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "balanceAddress2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x3031730f572e5295c57f15886f9b263e2f6d2d6c7b5ec63114600055", + "data" : "0x", + "gas" : "100000000000", + "gasPrice" : "1000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999656", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x3031730f572e5295c57f15886f9b263e2f6d2d6c7b5ec63114600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x3031730f572e5295c57f15886f9b263e2f6d2d6c7b5ec63114600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "balanceCaller3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x333173cd1722f3947def4cf144679da39c4c32bdc356813114600055", + "data" : "0x", + "gas" : "100000000000", + "gasPrice" : "1000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999656", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x333173cd1722f3947def4cf144679da39c4c32bdc356813114600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "cd1722f3947def4cf144679da39c4c32bdc35681" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x333173cd1722f3947def4cf144679da39c4c32bdc356813114600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "calldatacopy0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60026001600037600051600055", + "data" : "0x01234567890abcdef01234567890abcdef", + "gas" : "100000000000", + "gasPrice" : "1000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999691", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60026001600037600051600055", + "nonce" : "0", + "storage" : { + "0x" : "0x2345000000000000000000000000000000000000000000000000000000000000" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60026001600037600051600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "calldatacopy1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60016001600037600051600055", + "data" : "0x01234567890abcdef01234567890abcdef", + "gas" : "100000000000", + "gasPrice" : "1000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999691", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60016001600037600051600055", + "nonce" : "0", + "storage" : { + "0x" : "0x2300000000000000000000000000000000000000000000000000000000000000" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60016001600037600051600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "calldatacopy2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60006001600037600051600055", + "data" : "0x01234567890abcdef01234567890abcdef", + "gas" : "100000000000", + "gasPrice" : "1000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999892", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60006001600037600051600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60006001600037600051600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "calldatacopy_DataIndexTooHigh" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60ff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa600037600051600055", + "data" : "0x01234567890abcdef01234567890abcdef", + "gas" : "100000000000", + "gasPrice" : "1000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999877", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa600037600051600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa600037600051600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "calldatacopy_DataIndexTooHigh2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60097ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa600037600051600055", + "data" : "0x01234567890abcdef01234567890abcdef", + "gas" : "100000000000", + "gasPrice" : "1000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999891", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60097ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa600037600051600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60097ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa600037600051600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "calldataload0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600035600055", + "data" : "0x0256", + "gas" : "100000000000", + "gasPrice" : "1000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999697", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600035600055", + "nonce" : "0", + "storage" : { + "0x" : "0x0256000000000000000000000000000000000000000000000000000000000000" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600035600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "calldataload1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600135600055", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff23", + "gas" : "100000000000", + "gasPrice" : "1000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999697", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600135600055", + "nonce" : "0", + "storage" : { + "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff23" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600135600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "calldataload2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600535600055", + "data" : "0x0123456789abcdef0000000000000000000000000000000000000000000000000024", + "gas" : "100000000000", + "gasPrice" : "1000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999697", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600535600055", + "nonce" : "0", + "storage" : { + "0x" : "0xabcdef0000000000000000000000000000000000000000000000000024000000" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600535600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "calldataloadSizeTooHigh" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa35600055", + "data" : "0x0123456789abcdef0000000000000000000000000000000000000000000000000024", + "gas" : "100000000000", + "gasPrice" : "1000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999897", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa35600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa35600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "calldatasize0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x36600055", + "data" : "0x0256", + "gas" : "100000000000", + "gasPrice" : "1000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x36600055", + "nonce" : "0", + "storage" : { + "0x" : "0x02" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x36600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "calldatasize1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x36600055", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff23", + "gas" : "100000000000", + "gasPrice" : "1000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x36600055", + "nonce" : "0", + "storage" : { + "0x" : "0x21" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x36600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "calldatasize2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x36600055", + "data" : "0x230000000000000000000000000000000000000000000000000000000000000023", + "gas" : "100000000000", + "gasPrice" : "1000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x36600055", + "nonce" : "0", + "storage" : { + "0x" : "0x21" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x36600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "caller" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x33600055", + "data" : "0x", + "gas" : "100000000000", + "gasPrice" : "1000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x33600055", + "nonce" : "0", + "storage" : { + "0x" : "0xcd1722f3947def4cf144679da39c4c32bdc35681" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x33600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "callvalue" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x34600055", + "data" : "0x", + "gas" : "100000000000", + "gasPrice" : "1000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x34600055", + "nonce" : "0", + "storage" : { + "0x" : "0x0de0b6b3a7640000" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x34600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "codecopy0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60056000600039600051600055", + "data" : "0x01234567890abcdef01234567890abcdef", + "gas" : "100000000000", + "gasPrice" : "1000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999691", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60056000600039600051600055", + "nonce" : "0", + "storage" : { + "0x" : "0x6005600060000000000000000000000000000000000000000000000000000000" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60056000600039600051600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "codecopy1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x386000600039600051600055", + "data" : "0x01234567890abcdef01234567890abcdef", + "gas" : "100000000000", + "gasPrice" : "1000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999691", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x386000600039600051600055", + "nonce" : "0", + "storage" : { + "0x" : "0x3860006000396000516000550000000000000000000000000000000000000000" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x386000600039600051600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "codecopy_DataIndexTooHigh" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60087ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa600039600051600055", + "data" : "0x01234567890abcdef01234567890abcdef", + "gas" : "100000000000", + "gasPrice" : "1000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999891", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60087ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa600039600051600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60087ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa600039600051600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "codesize" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x38600055", + "data" : "0x01234567890abcdef01234567890abcdef", + "gas" : "100000000000", + "gasPrice" : "1000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x38600055", + "nonce" : "0", + "storage" : { + "0x" : "0x04" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x38600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "extcodecopy0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x333b60006000333c600051600055", + "data" : "0x01234567890abcdef01234567890abcdef", + "gas" : "100000000000", + "gasPrice" : "123456789", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999689", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x333b60006000333c600051600055", + "nonce" : "0", + "storage" : { + "0x" : "0x6005600055000000000000000000000000000000000000000000000000000000" + } + }, + "cd1722f3947def4cf144679da39c4c32bdc35681" : { + "balance" : "1000000000000000000", + "code" : "0x6005600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x333b60006000333c600051600055", + "nonce" : "0", + "storage" : { + } + }, + "cd1722f3947def4cf144679da39c4c32bdc35681" : { + "balance" : "1000000000000000000", + "code" : "0x6005600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "extcodecopy_DataIndexTooHigh" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60087ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa6000303c600051600055", + "data" : "0x01234567890abcdef01234567890abcdef", + "gas" : "100000000000", + "gasPrice" : "1000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999890", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60087ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa6000303c600051600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60087ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa6000303c600051600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "extcodesize0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x38333b14600055", + "data" : "0x01234567890abcdef01234567890abcdef", + "gas" : "100000000000", + "gasPrice" : "123456789", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999695", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x38333b14600055", + "nonce" : "0", + "storage" : { + "0x" : "0x01" + } + }, + "cd1722f3947def4cf144679da39c4c32bdc35681" : { + "balance" : "1000000000000000000", + "code" : "0x38333b14600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x38333b14600055", + "nonce" : "0", + "storage" : { + } + }, + "cd1722f3947def4cf144679da39c4c32bdc35681" : { + "balance" : "1000000000000000000", + "code" : "0x38333b14600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "extcodesize1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "caller" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "code" : "0x333b600055", + "data" : "0x01234567890abcdef01234567890abcdef", + "gas" : "100000000000", + "gasPrice" : "123456789", + "origin" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "value" : "1000000000000000000" + }, + "gas" : "99999999697", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x38600055", + "nonce" : "0", + "storage" : { + } + }, + "cd1722f3947def4cf144679da39c4c32bdc35681" : { + "balance" : "1000000000000000000", + "code" : "0x333b600055", + "nonce" : "0", + "storage" : { + "0x" : "0x04" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x38600055", + "nonce" : "0", + "storage" : { + } + }, + "cd1722f3947def4cf144679da39c4c32bdc35681" : { + "balance" : "1000000000000000000", + "code" : "0x333b600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "gasprice" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x3a600055", + "data" : "0x01234567890abcdef01234567890abcdef", + "gas" : "100000000000", + "gasPrice" : "123456789", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x3a600055", + "nonce" : "0", + "storage" : { + "0x" : "0x075bcd15" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x3a600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "origin" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x32600055", + "data" : "0x", + "gas" : "100000000000", + "gasPrice" : "1000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x32600055", + "nonce" : "0", + "storage" : { + "0x" : "0xcd1722f3947def4cf144679da39c4c32bdc35681" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x32600055", + "nonce" : "0", + "storage" : { + } + } + } + } +}
\ No newline at end of file diff --git a/tests/files/VMTests/vmIOandFlowOperationsTest.json b/tests/files/VMTests/vmIOandFlowOperationsTest.json new file mode 100644 index 000000000..120977086 --- /dev/null +++ b/tests/files/VMTests/vmIOandFlowOperationsTest.json @@ -0,0 +1,1527 @@ +{ + "dupAt51becameMload" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600260035155", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9695", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600260035155", + "nonce" : "0", + "storage" : { + "0x" : "0x02" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600260035155", + "nonce" : "0", + "storage" : { + } + } + } + }, + "gas0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x64ffffffffff60005261eeee605a525a600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9688", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x64ffffffffff60005261eeee605a525a600055", + "nonce" : "0", + "storage" : { + "0x" : "0x2705" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x64ffffffffff60005261eeee605a525a600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "gas1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x5a600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x5a600055", + "nonce" : "0", + "storage" : { + "0x" : "0x270f" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x5a600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "jump0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60236007566001600255", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60236007566001600255", + "nonce" : "0", + "storage" : { + "0x02" : "0x23" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60236007566001600255", + "nonce" : "0", + "storage" : { + } + } + } + }, + "jump0_foreverOutOfGas" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600056", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600056", + "nonce" : "0", + "storage" : { + } + } + } + }, + "jump0_jumpdest0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x602360075660015b600255", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9695", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x602360075660015b600255", + "nonce" : "0", + "storage" : { + "0x02" : "0x23" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x602360075660015b600255", + "nonce" : "0", + "storage" : { + } + } + } + }, + "jump0_jumpdest1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x602360085660015b600255", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x602360085660015b600255", + "nonce" : "0", + "storage" : { + "0x02" : "0x23" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x602360085660015b600255", + "nonce" : "0", + "storage" : { + } + } + } + }, + "jump0_jumpdest2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6023600a6008505660015b600255", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9693", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6023600a6008505660015b600255", + "nonce" : "0", + "storage" : { + "0x02" : "0x23" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6023600a6008505660015b600255", + "nonce" : "0", + "storage" : { + } + } + } + }, + "jump0_jumpdest3" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6023600b6008505660015b600255", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6023600b6008505660015b600255", + "nonce" : "0", + "storage" : { + } + } + } + }, + "jump1" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x620fffff620fffff0156", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x620fffff620fffff0156", + "nonce" : "0", + "storage" : { + } + } + } + }, + "jumpi0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x602360016009576001600255", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9695", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x602360016009576001600255", + "nonce" : "0", + "storage" : { + "0x02" : "0x23" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x602360016009576001600255", + "nonce" : "0", + "storage" : { + } + } + } + }, + "jumpi1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x602360006009576001600255", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9694", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x602360006009576001600255", + "nonce" : "0", + "storage" : { + "0x02" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x602360006009576001600255", + "nonce" : "0", + "storage" : { + } + } + } + }, + "jumpi1_jumpdest" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60236001600a5760015b600255", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9695", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60236001600a5760015b600255", + "nonce" : "0", + "storage" : { + "0x02" : "0x23" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60236001600a5760015b600255", + "nonce" : "0", + "storage" : { + } + } + } + }, + "jumpi2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff576002600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9997", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff576002600355", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff576002600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mloadError0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600051600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9896", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600051600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600051600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mloadError1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6017600152600051600155", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9892", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6017600152600051600155", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6017600152600051600155", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mloadOutOfGasError2" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6272482551600155", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6272482551600155", + "nonce" : "0", + "storage" : { + } + } + } + }, + "msize0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60ff60005259600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9694", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff60005259600055", + "nonce" : "0", + "storage" : { + "0x" : "0x20" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff60005259600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "msize1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x64ffffffffff60005259600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9694", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x64ffffffffff60005259600055", + "nonce" : "0", + "storage" : { + "0x" : "0x20" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x64ffffffffff60005259600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "msize2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x64ffffffffff60005261eeee60205259600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9690", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x64ffffffffff60005261eeee60205259600055", + "nonce" : "0", + "storage" : { + "0x" : "0x40" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x64ffffffffff60005261eeee60205259600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "msize3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x64ffffffffff60005261eeee605a5259600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9688", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x64ffffffffff60005261eeee605a5259600055", + "nonce" : "0", + "storage" : { + "0x" : "0x80" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x64ffffffffff60005261eeee605a5259600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mstore0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600152600151600155", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9692", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600152600151600155", + "nonce" : "0", + "storage" : { + "0x01" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600152600151600155", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mstore1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600201600152600151600155", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9690", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600201600152600151600155", + "nonce" : "0", + "storage" : { + "0x01" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600201600152600151600155", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mstore8WordToBigError" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "10000", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mstore8_0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600153600151600155", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9692", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600153600151600155", + "nonce" : "0", + "storage" : { + "0x01" : "0xff00000000000000000000000000000000000000000000000000000000000000" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600153600151600155", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mstore8_1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60ff60015360ee600253600051600155", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9690", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff60015360ee600253600051600155", + "nonce" : "0", + "storage" : { + "0x01" : "0xffee0000000000000000000000000000000000000000000000000000000000" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff60015360ee600253600051600155", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mstoreWordToBigError" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "10000", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mstore_mload0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6017600052600051600155", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9693", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6017600052600051600155", + "nonce" : "0", + "storage" : { + "0x01" : "0x17" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6017600052600051600155", + "nonce" : "0", + "storage" : { + } + } + } + }, + "pc0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x58600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9898", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x58600055", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x58600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "pc1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60ff60005558600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9596", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff60005558600055", + "nonce" : "0", + "storage" : { + "0x" : "0x05" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff60005558600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "pop0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6002600360045055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6002600360045055", + "nonce" : "0", + "storage" : { + "0x03" : "0x02" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6002600360045055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "pop1" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x5060026003600455", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x5060026003600455", + "nonce" : "0", + "storage" : { + } + } + } + }, + "sstore_load_0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60ff60005560ee600a55600054601455", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9074", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff60005560ee600a55600054601455", + "nonce" : "0", + "storage" : { + "0x" : "0xff", + "0x0a" : "0xee", + "0x14" : "0xff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff60005560ee600a55600054601455", + "nonce" : "0", + "storage" : { + } + } + } + }, + "sstore_load_1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60ff60005560ee600a55606454601455", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9274", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff60005560ee600a55606454601455", + "nonce" : "0", + "storage" : { + "0x" : "0xff", + "0x0a" : "0xee" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff60005560ee600a55606454601455", + "nonce" : "0", + "storage" : { + } + } + } + }, + "sstore_load_2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60ff60005560ee60015560dd600255600154600a55600254601455", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "8450", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff60005560ee60015560dd600255600154600a55600254601455", + "nonce" : "0", + "storage" : { + "0x" : "0xff", + "0x01" : "0xee", + "0x02" : "0xdd", + "0x0a" : "0xee", + "0x14" : "0xdd" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff60005560ee60015560dd600255600154600a55600254601455", + "nonce" : "0", + "storage" : { + } + } + } + }, + "swapAt52becameMstore" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600260035255", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600260035255", + "nonce" : "0", + "storage" : { + } + } + } + } +}
\ No newline at end of file diff --git a/tests/files/VMTests/vmLogTest.json b/tests/files/VMTests/vmLogTest.json new file mode 100644 index 000000000..48e20ac63 --- /dev/null +++ b/tests/files/VMTests/vmLogTest.json @@ -0,0 +1,2190 @@ +{ + "log0_emptyMem" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60006000a0", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9966", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x", + "topics" : [ + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60006000a0", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60006000a0", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log0_logMemStartTooHigh" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log0_logMemsizeTooHigh" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a0", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a0", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log0_logMemsizeZero" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006001a0", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9962", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0x", + "topics" : [ + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006001a0", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006001a0", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log0_nonEmptyMem" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000a0", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9930", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000a0", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000a0", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log0_nonEmptyMem_logMemSize1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260016000a0", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9961", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xaa", + "topics" : [ + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260016000a0", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260016000a0", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log0_nonEmptyMem_logMemSize1_logMemStart31" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526001601fa0", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9961", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xdd", + "topics" : [ + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526001601fa0", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526001601fa0", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log1_Caller" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60ff6000533360206000a1", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9897", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000008000000808100000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xff00000000000000000000000000000000000000000000000000000000000000", + "topics" : [ + "000000000000000000000000cd1722f3947def4cf144679da39c4c32bdc35681" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff6000533360206000a1", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff6000533360206000a1", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log1_MaxTopic" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a1", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9897", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000200000800000000000000000000000000000000880000000000000000000000000000000000000000000000010000000000000000000000020", + "data" : "0xaabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd", + "topics" : [ + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a1", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a1", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log1_emptyMem" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600060006000a1", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9933", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0x", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600060006000a1", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600060006000a1", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log1_logMemStartTooHigh" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log1_logMemsizeTooHigh" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a1", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a1", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log1_logMemsizeZero" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006001a1", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9929", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0x", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006001a1", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006001a1", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log1_nonEmptyMem" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600052600060206000a1", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9897", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600052600060206000a1", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600052600060206000a1", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log1_nonEmptyMem_logMemSize1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060016000a1", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9928", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0xaa", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060016000a1", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060016000a1", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log1_nonEmptyMem_logMemSize1_logMemStart31" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006001601fa1", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9928", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0xdd", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006001601fa1", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006001601fa1", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log2_Caller" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60ff60005333600060206000a2", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9864", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000008000000808100000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0xff00000000000000000000000000000000000000000000000000000000000000", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000cd1722f3947def4cf144679da39c4c32bdc35681" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff60005333600060206000a2", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff60005333600060206000a2", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log2_MaxTopic" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a2", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9864", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000200000800000000000000000000000000000000880000000000000000000000000000000000000000000000010000000000000000000000020", + "data" : "0xaabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd", + "topics" : [ + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a2", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a2", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log2_emptyMem" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6000600060006000a2", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9900", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0x", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6000600060006000a2", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6000600060006000a2", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log2_logMemStartTooHigh" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa2", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa2", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log2_logMemsizeTooHigh" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a2", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a2", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log2_logMemsizeZero" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060006001a2", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9896", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0x", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060006001a2", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060006001a2", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log2_nonEmptyMem" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000526000600060206000a2", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9864", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000526000600060206000a2", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000526000600060206000a2", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log2_nonEmptyMem_logMemSize1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060016000a2", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9895", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0xaa", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060016000a2", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060016000a2", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log2_nonEmptyMem_logMemSize1_logMemStart31" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006001601fa2", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9895", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0xdd", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006001601fa2", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006001601fa2", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log3_Caller" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60ff600053336000600060206000a3", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9831", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000008000000808100000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0xff00000000000000000000000000000000000000000000000000000000000000", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000cd1722f3947def4cf144679da39c4c32bdc35681" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff600053336000600060206000a3", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff600053336000600060206000a3", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log3_MaxTopic" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a3", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9831", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000200000800000000000000000000000000000000880000000000000000000000000000000000000000000000010000000000000000000000020", + "data" : "0xaabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd", + "topics" : [ + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a3", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a3", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log3_PC" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60ff60005358585860206000a3", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9831", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00003004000000000000800000000010000008000000000000000980000000000000000000000000000000000000000000001000000400000000000800000000", + "data" : "0xff00000000000000000000000000000000000000000000000000000000000000", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000007", + "0000000000000000000000000000000000000000000000000000000000000006", + "0000000000000000000000000000000000000000000000000000000000000005" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff60005358585860206000a3", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff60005358585860206000a3", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log3_emptyMem" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60006000600060006000a3", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9867", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0x", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006000a3", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006000a3", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log3_logMemStartTooHigh" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa3", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa3", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log3_logMemsizeTooHigh" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a3", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a3", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log3_logMemsizeZero" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060006001a3", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9863", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0x", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060006001a3", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060006001a3", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log3_nonEmptyMem" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260006000600060206000a3", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9831", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260006000600060206000a3", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260006000600060206000a3", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log3_nonEmptyMem_logMemSize1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060016000a3", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9862", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0xaa", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060016000a3", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060016000a3", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log3_nonEmptyMem_logMemSize1_logMemStart31" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060006001601fa3", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9862", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0xdd", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060006001601fa3", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000526000600060006001601fa3", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log4_Caller" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "10000", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log4_MaxTopic" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a4", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9798", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000200000800000000000000000000000000000000880000000000000000000000000000000000000000000000010000000000000000000000020", + "data" : "0xaabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd", + "topics" : [ + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a4", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd6000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60206000a4", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log4_PC" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "10000", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log4_emptyMem" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600060006000600060006000a4", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9834", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0x", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600060006000600060006000a4", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600060006000600060006000a4", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log4_logMemStartTooHigh" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa4", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa4", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log4_logMemsizeTooHigh" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a4", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001a4", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log4_logMemsizeZero" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060006001a4", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9830", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0x", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060006001a4", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060006001a4", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log4_nonEmptyMem" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600052600060006000600060206000a4", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9798", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600052600060006000600060206000a4", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600052600060006000600060206000a4", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log4_nonEmptyMem_logMemSize1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060016000a4", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9829", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0xaa", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060016000a4", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd600052600060006000600060016000a4", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log4_nonEmptyMem_logMemSize1_logMemStart31" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060006001601fa4", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9829", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000020000000000002000000000000000000080000000000000000000000000000000000", + "data" : "0xdd", + "topics" : [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060006001601fa4", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7faabbffffffffffffffffffffffffffffffffffffffffffffffffffffffffccdd60005260006000600060006001601fa4", + "nonce" : "0", + "storage" : { + } + } + } + }, + "log_2logs" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000a060106002a0", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9880", + "logs" : [ + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "topics" : [ + ] + }, + { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "bloom" : "00000000000000000000800000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000000000000", + "data" : "0xffffffffffffffffffffffffffffffff", + "topics" : [ + ] + } + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000a060106002a0", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000a060106002a0", + "nonce" : "0", + "storage" : { + } + } + } + } +}
\ No newline at end of file diff --git a/tests/files/VMTests/vmPushDupSwapTest.json b/tests/files/VMTests/vmPushDupSwapTest.json new file mode 100644 index 000000000..9c69aed80 --- /dev/null +++ b/tests/files/VMTests/vmPushDupSwapTest.json @@ -0,0 +1,3072 @@ +{ + "dup1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7f10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff80600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9697", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7f10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff80600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7f10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff80600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "dup10" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600a60096008600760066005600460036002600189600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9688", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600a60096008600760066005600460036002600189600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x0a" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600a60096008600760066005600460036002600189600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "dup11" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600b600a6009600860076006600560046003600260018a600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9687", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600b600a6009600860076006600560046003600260018a600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x0b" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600b600a6009600860076006600560046003600260018a600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "dup12" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600c600b600a6009600860076006600560046003600260018b600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9686", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600c600b600a6009600860076006600560046003600260018b600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x0c" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600c600b600a6009600860076006600560046003600260018b600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "dup13" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600d600c600b600a6009600860076006600560046003600260018c600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9685", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600d600c600b600a6009600860076006600560046003600260018c600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x0d" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600d600c600b600a6009600860076006600560046003600260018c600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "dup14" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600e600d600c600b600a6009600860076006600560046003600260018d600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9684", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600e600d600c600b600a6009600860076006600560046003600260018d600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x0e" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600e600d600c600b600a6009600860076006600560046003600260018d600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "dup15" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600f600e600d600c600b600a6009600860076006600560046003600260018e600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9683", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600f600e600d600c600b600a6009600860076006600560046003600260018e600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x0f" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600f600e600d600c600b600a6009600860076006600560046003600260018e600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "dup16" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6010600f600e600d600c600b600a6009600860076006600560046003600260018f600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9682", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6010600f600e600d600c600b600a6009600860076006600560046003600260018f600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x10" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6010600f600e600d600c600b600a6009600860076006600560046003600260018f600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "dup2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6002600181600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6002600181600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x02" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6002600181600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "dup2error" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7f10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff81600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7f10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff81600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "dup3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60036002600182600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9695", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60036002600182600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x03" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60036002600182600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "dup4" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600460036002600183600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9694", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600460036002600183600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x04" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600460036002600183600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "dup5" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6005600460036002600184600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9693", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6005600460036002600184600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x05" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6005600460036002600184600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "dup6" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60066005600460036002600185600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9692", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60066005600460036002600185600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x06" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60066005600460036002600185600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "dup7" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600760066005600460036002600186600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9691", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600760066005600460036002600186600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x07" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600760066005600460036002600186600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "dup8" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6008600760066005600460036002600187600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9690", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6008600760066005600460036002600187600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x08" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6008600760066005600460036002600187600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "dup9" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60096008600760066005600460036002600188600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9689", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60096008600760066005600460036002600188600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x09" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60096008600760066005600460036002600188600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60ff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0xff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60ff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push10" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6966778899aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6966778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x66778899aabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6966778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push11" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6a5566778899aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6a5566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x5566778899aabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6a5566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push12" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6b445566778899aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6b445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x445566778899aabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6b445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push13" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6c33445566778899aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6c33445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x33445566778899aabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6c33445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push14" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6d2233445566778899aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6d2233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x2233445566778899aabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6d2233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push15" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6e112233445566778899aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6e112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x112233445566778899aabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6e112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push16" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6f10112233445566778899aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6f10112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x10112233445566778899aabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6f10112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push17" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x70ff00112233445566778899aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x70ff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0xff00112233445566778899aabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x70ff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push18" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x71eeff00112233445566778899aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x71eeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0xeeff00112233445566778899aabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x71eeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push19" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x72ddeeff00112233445566778899aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x72ddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0xddeeff00112233445566778899aabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x72ddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push1_missingStack" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9999", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x61eeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x61eeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0xeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x61eeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push20" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x73ccddeeff00112233445566778899aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x73ccddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0xccddeeff00112233445566778899aabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x73ccddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push21" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x74bbccddeeff00112233445566778899aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x74bbccddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0xbbccddeeff00112233445566778899aabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x74bbccddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push22" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x75aabbccddeeff00112233445566778899aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x75aabbccddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0xaabbccddeeff00112233445566778899aabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x75aabbccddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push23" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7699aabbccddeeff00112233445566778899aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7699aabbccddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x99aabbccddeeff00112233445566778899aabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7699aabbccddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push24" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x8899aabbccddeeff00112233445566778899aabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push25" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x78778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x78778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x778899aabbccddeeff00112233445566778899aabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x78778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push26" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7966778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7966778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x66778899aabbccddeeff00112233445566778899aabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7966778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push27" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7a5566778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7a5566778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x5566778899aabbccddeeff00112233445566778899aabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7a5566778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push28" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7b445566778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7b445566778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x445566778899aabbccddeeff00112233445566778899aabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7b445566778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push29" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7c33445566778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7c33445566778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x33445566778899aabbccddeeff00112233445566778899aabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7c33445566778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x62ddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x62ddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0xddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x62ddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push30" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7d2233445566778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7d2233445566778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x2233445566778899aabbccddeeff00112233445566778899aabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7d2233445566778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push31" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7e112233445566778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7e112233445566778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x112233445566778899aabbccddeeff00112233445566778899aabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7e112233445566778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push32" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7f10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7f10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7f10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push32AndSuicide" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7fff10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9999", + "logs" : [ + ], + "out" : "0x", + "post" : { + "bbccddeeff00112233445566778899aabbccddee" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fff10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push32FillUpInputWithZerosAtTheEnd" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7fff10112233445566778899aabbccddeeff00112233445566778899aabbccdd", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9999", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fff10112233445566778899aabbccddeeff00112233445566778899aabbccdd", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fff10112233445566778899aabbccddeeff00112233445566778899aabbccdd", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push4" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x63ccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x63ccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0xccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x63ccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push5" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x64bbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x64bbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0xbbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x64bbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push6" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x65aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x65aabbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0xaabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x65aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push7" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6699aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6699aabbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x99aabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6699aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push8" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x678899aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x678899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x8899aabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x678899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "push9" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x68778899aabbccddeeff600355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9698", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x68778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + "0x03" : "0x778899aabbccddeeff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x68778899aabbccddeeff600355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "swap1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7f10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff60039055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9697", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7f10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff60039055", + "nonce" : "0", + "storage" : { + "0x10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff" : "0x03" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7f10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff60039055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "swap10" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600a60096008600760066005600460036002600160039955", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9688", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600a60096008600760066005600460036002600160039955", + "nonce" : "0", + "storage" : { + "0x0a" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600a60096008600760066005600460036002600160039955", + "nonce" : "0", + "storage" : { + } + } + } + }, + "swap11" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600b600a60096008600760066005600460036002600160039a55", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9687", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600b600a60096008600760066005600460036002600160039a55", + "nonce" : "0", + "storage" : { + "0x0b" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600b600a60096008600760066005600460036002600160039a55", + "nonce" : "0", + "storage" : { + } + } + } + }, + "swap12" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600c600b600a60096008600760066005600460036002600160039b55", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9686", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600c600b600a60096008600760066005600460036002600160039b55", + "nonce" : "0", + "storage" : { + "0x0c" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600c600b600a60096008600760066005600460036002600160039b55", + "nonce" : "0", + "storage" : { + } + } + } + }, + "swap13" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600d600c600b600a60096008600760066005600460036002600160039c55", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9685", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600d600c600b600a60096008600760066005600460036002600160039c55", + "nonce" : "0", + "storage" : { + "0x0d" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600d600c600b600a60096008600760066005600460036002600160039c55", + "nonce" : "0", + "storage" : { + } + } + } + }, + "swap14" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600e600d600c600b600a60096008600760066005600460036002600160039d55", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9684", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600e600d600c600b600a60096008600760066005600460036002600160039d55", + "nonce" : "0", + "storage" : { + "0x0e" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600e600d600c600b600a60096008600760066005600460036002600160039d55", + "nonce" : "0", + "storage" : { + } + } + } + }, + "swap15" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600f600e600d600c600b600a60096008600760066005600460036002600160039e55", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9683", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600f600e600d600c600b600a60096008600760066005600460036002600160039e55", + "nonce" : "0", + "storage" : { + "0x0f" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600f600e600d600c600b600a60096008600760066005600460036002600160039e55", + "nonce" : "0", + "storage" : { + } + } + } + }, + "swap16" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6010600f600e600d600c600b600a60096008600760066005600460036002600160039f55", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9682", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6010600f600e600d600c600b600a60096008600760066005600460036002600160039f55", + "nonce" : "0", + "storage" : { + "0x10" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6010600f600e600d600c600b600a60096008600760066005600460036002600160039f55", + "nonce" : "0", + "storage" : { + } + } + } + }, + "swap2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6002600160039155", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9696", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6002600160039155", + "nonce" : "0", + "storage" : { + "0x02" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6002600160039155", + "nonce" : "0", + "storage" : { + } + } + } + }, + "swap2error" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7f10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff60039155", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7f10112233445566778899aabbccddeeff00112233445566778899aabbccddeeff60039155", + "nonce" : "0", + "storage" : { + } + } + } + }, + "swap3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60036002600160039255", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9695", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60036002600160039255", + "nonce" : "0", + "storage" : { + "0x03" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60036002600160039255", + "nonce" : "0", + "storage" : { + } + } + } + }, + "swap4" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600460036002600160039355", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9694", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600460036002600160039355", + "nonce" : "0", + "storage" : { + "0x04" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600460036002600160039355", + "nonce" : "0", + "storage" : { + } + } + } + }, + "swap5" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6005600460036002600160039455", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9693", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6005600460036002600160039455", + "nonce" : "0", + "storage" : { + "0x05" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6005600460036002600160039455", + "nonce" : "0", + "storage" : { + } + } + } + }, + "swap6" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60066005600460036002600160039555", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9692", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60066005600460036002600160039555", + "nonce" : "0", + "storage" : { + "0x06" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60066005600460036002600160039555", + "nonce" : "0", + "storage" : { + } + } + } + }, + "swap7" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600760066005600460036002600160039655", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9691", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600760066005600460036002600160039655", + "nonce" : "0", + "storage" : { + "0x07" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600760066005600460036002600160039655", + "nonce" : "0", + "storage" : { + } + } + } + }, + "swap8" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6008600760066005600460036002600160039755", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9690", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6008600760066005600460036002600160039755", + "nonce" : "0", + "storage" : { + "0x08" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6008600760066005600460036002600160039755", + "nonce" : "0", + "storage" : { + } + } + } + }, + "swap9" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60096008600760066005600460036002600160039855", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9689", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60096008600760066005600460036002600160039855", + "nonce" : "0", + "storage" : { + "0x09" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60096008600760066005600460036002600160039855", + "nonce" : "0", + "storage" : { + } + } + } + } +}
\ No newline at end of file diff --git a/tests/files/VMTests/vmSha3Test.json b/tests/files/VMTests/vmSha3Test.json new file mode 100644 index 000000000..b9e6b46a1 --- /dev/null +++ b/tests/files/VMTests/vmSha3Test.json @@ -0,0 +1,253 @@ +{ + "sha3_0" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6000600020600055", + "data" : "0x", + "gas" : "100000000000", + "gasPrice" : "1000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "99999999687", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6000600020600055", + "nonce" : "0", + "storage" : { + "0x" : "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6000600020600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "sha3_1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6005600420600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9676", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6005600420600055", + "nonce" : "0", + "storage" : { + "0x" : "0xc41589e7559804ea4a2080dad19d876a024ccb05117835447d72ce08c1d020ec" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6005600420600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "sha3_2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600a600a20600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9676", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600a600a20600055", + "nonce" : "0", + "storage" : { + "0x" : "0x6bd2dd6bd408cbee33429358bf24fdc64612fbf8b1b4db604518f40ffd34b607" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600a600a20600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "sha3_3" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x620fffff6103e820600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x620fffff6103e820600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "sha3_4" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6064640fffffffff20600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x6064640fffffffff20600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "sha3_5" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x640fffffffff61271020600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x640fffffffff61271020600055", + "nonce" : "0", + "storage" : { + } + } + } + }, + "sha3_6" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff20600055", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff20600055", + "nonce" : "0", + "storage" : { + } + } + } + } +}
\ No newline at end of file diff --git a/tests/files/VMTests/vmtests.json b/tests/files/VMTests/vmtests.json new file mode 100644 index 000000000..e1d73ee5d --- /dev/null +++ b/tests/files/VMTests/vmtests.json @@ -0,0 +1,214 @@ +{ + "arith" : { + "callcreates" : [ + { + "data" : "0x", + "destination" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "gasLimit" : "9770", + "value" : "74" + } + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600060006000600060026002600803036002600306600260020460046004600402026002600201010101013360c85a03f1", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9949", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "999999999999999926", + "code" : "0x600060006000600060026002600803036002600306600260020460046004600402026002600201010101013360c85a03f1", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600060006000600060026002600803036002600306600260020460046004600402026002600201010101013360c85a03f1", + "nonce" : "0", + "storage" : { + } + } + } + }, + "boolean" : { + "callcreates" : [ + { + "data" : "0x", + "destination" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "gasLimit" : "9786", + "value" : "2" + }, + { + "data" : "0x", + "destination" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "gasLimit" : "9728", + "value" : "12" + }, + { + "data" : "0x", + "destination" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "gasLimit" : "9691", + "value" : "13" + }, + { + "data" : "0x", + "destination" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "gasLimit" : "9654", + "value" : "14" + } + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600160011615601a57600060006000600060023360c85a03f1505b600060011615603557600060006000600060033360c85a03f1505b600160001615605057600060006000600060043360c85a03f1505b600060001615606b57600060006000600060053360c85a03f1505b6001600117156086576000600060006000600c3360c85a03f1505b60006001171560a1576000600060006000600d3360c85a03f1505b60016000171560bc576000600060006000600e3360c85a03f1505b60006000171560d7576000600060006000600f3360c85a03f1505b", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9824", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "999999999999999959", + "code" : "0x600160011615601a57600060006000600060023360c85a03f1505b600060011615603557600060006000600060033360c85a03f1505b600160001615605057600060006000600060043360c85a03f1505b600060001615606b57600060006000600060053360c85a03f1505b6001600117156086576000600060006000600c3360c85a03f1505b60006001171560a1576000600060006000600d3360c85a03f1505b60016000171560bc576000600060006000600e3360c85a03f1505b60006000171560d7576000600060006000600f3360c85a03f1505b", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x600160011615601a57600060006000600060023360c85a03f1505b600060011615603557600060006000600060033360c85a03f1505b600160001615605057600060006000600060043360c85a03f1505b600060001615606b57600060006000600060053360c85a03f1505b6001600117156086576000600060006000600c3360c85a03f1505b60006001171560a1576000600060006000600d3360c85a03f1505b60016000171560bc576000600060006000600e3360c85a03f1505b60006000171560d7576000600060006000600f3360c85a03f1505b", + "nonce" : "0", + "storage" : { + } + } + } + }, + "mktx" : { + "callcreates" : [ + { + "data" : "0x", + "destination" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "gasLimit" : "9792", + "value" : "500000000000000000" + } + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60006000600060006706f05b59d3b200003360c85a03f1", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9971", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "500000000000000000", + "code" : "0x60006000600060006706f05b59d3b200003360c85a03f1", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x60006000600060006706f05b59d3b200003360c85a03f1", + "nonce" : "0", + "storage" : { + } + } + } + }, + "suicide" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x33ff", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9999", + "logs" : [ + ], + "out" : "0x", + "post" : { + "cd1722f3947def4cf144679da39c4c32bdc35681" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x33ff", + "nonce" : "0", + "storage" : { + } + } + } + } +}
\ No newline at end of file diff --git a/tests/files/index.js b/tests/files/index.js new file mode 100644 index 000000000..34a03d8b2 --- /dev/null +++ b/tests/files/index.js @@ -0,0 +1,32 @@ +module.exports = { + blockgenesis: require('./BasicTests/blockgenesistest'), + genesishashes: require('./BasicTests/genesishashestest'), + hexencode: require('./BasicTests/hexencodetest'), + keyaddrtests: require('./BasicTests/keyaddrtest'), + rlptest: require('./BasicTests/rlptest'), + trietest: require('./TrieTests/trietest'), + trietestnextprev: require('./TrieTests/trietestnextprev'), + txtest: require('./BasicTests/txtest'), + StateTests: { + stExample: require('./StateTests/stExample.json'), + stInitCodeTest: require('./StateTests/stInitCodeTest.json'), + stLogTests: require('./StateTests/stLogTests.json'), + stPreCompiledContracts: require('./StateTests/stPreCompiledContracts'), + stRecursiveCreate: require('./StateTests/stRecursiveCreate'), + stSpecial: require('./StateTests/stSpecialTest'), + stSystemOperationsTest: require('./StateTests/stSystemOperationsTest'), + stTransactionTest: require('./StateTests/stTransactionTest') + }, + VMTests: { + vmRandom: require('./VMTests/RandomTests/randomTest'), + vmArithmeticTest: require('./VMTests/vmArithmeticTest'), + vmBitwiseLogicOperationTest: require('./VMTests/vmBitwiseLogicOperationTest'), + vmBlockInfoTest: require('./VMTests/vmBlockInfoTest'), + vmEnvironmentalInfoTest: require('./VMTests/vmEnvironmentalInfoTest'), + vmIOandFlowOperationsTest: require('./VMTests/vmIOandFlowOperationsTest'), + vmLogTest: require('./VMTests/vmLogTest'), + vmPushDupSwapTest: require('./VMTests/vmPushDupSwapTest'), + vmSha3Test: require('./VMTests/vmSha3Test'), + vmtests: require('./VMTests/vmtests') + } +}; diff --git a/tests/files/package.json b/tests/files/package.json new file mode 100644 index 000000000..eb0841450 --- /dev/null +++ b/tests/files/package.json @@ -0,0 +1,23 @@ +{ + "name": "ethereum-tests", + "version": "0.0.0", + "description": "tests for ethereum", + "main": "index.js", + "scripts": { + "test": "echo \"There are no tests for there tests\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://github.com/ethereum/tests" + }, + "keywords": [ + "tests", + "ethereum" + ], + "author": "", + "license": "MIT", + "bugs": { + "url": "https://github.com/ethereum/tests/issues" + }, + "homepage": "https://github.com/ethereum/tests" +} diff --git a/tests/helper/common.go b/tests/helper/common.go new file mode 100644 index 000000000..6a071968d --- /dev/null +++ b/tests/helper/common.go @@ -0,0 +1,11 @@ +package helper + +import "github.com/ethereum/go-ethereum/ethutil" + +func FromHex(h string) []byte { + if ethutil.IsHex(h) { + h = h[2:] + } + + return ethutil.Hex2Bytes(h) +} diff --git a/tests/helper/init.go b/tests/helper/init.go new file mode 100644 index 000000000..578314e20 --- /dev/null +++ b/tests/helper/init.go @@ -0,0 +1,20 @@ +package helper + +import ( + "log" + "os" + + "github.com/ethereum/go-ethereum/ethutil" + logpkg "github.com/ethereum/go-ethereum/logger" +) + +var Logger logpkg.LogSystem +var Log = logpkg.NewLogger("TEST") + +func init() { + Logger = logpkg.NewStdLogSystem(os.Stdout, log.LstdFlags, logpkg.InfoLevel) + logpkg.AddLogSystem(Logger) + + ethutil.ReadConfig(".ethtest", "/tmp/ethtest", "") + ethutil.Config.Db, _ = NewMemDatabase() +} diff --git a/tests/helper/readers.go b/tests/helper/readers.go new file mode 100644 index 000000000..03313aeda --- /dev/null +++ b/tests/helper/readers.go @@ -0,0 +1,42 @@ +package helper + +import ( + "encoding/json" + "io" + "io/ioutil" + "net/http" + "os" + "testing" +) + +func readJSON(t *testing.T, reader io.Reader, value interface{}) { + data, err := ioutil.ReadAll(reader) + err = json.Unmarshal(data, &value) + if err != nil { + t.Error(err) + } +} + +func CreateHttpTests(t *testing.T, uri string, value interface{}) { + resp, err := http.Get(uri) + if err != nil { + t.Error(err) + + return + } + defer resp.Body.Close() + + readJSON(t, resp.Body, value) +} + +func CreateFileTests(t *testing.T, fn string, value interface{}) { + file, err := os.Open(fn) + if err != nil { + t.Error(err) + + return + } + defer file.Close() + + readJSON(t, file, value) +} diff --git a/tests/helper/trie.go b/tests/helper/trie.go new file mode 100644 index 000000000..32432cc7a --- /dev/null +++ b/tests/helper/trie.go @@ -0,0 +1,31 @@ +package helper + +import "github.com/ethereum/go-ethereum/trie" + +type MemDatabase struct { + db map[string][]byte +} + +func NewMemDatabase() (*MemDatabase, error) { + db := &MemDatabase{db: make(map[string][]byte)} + return db, nil +} +func (db *MemDatabase) Put(key []byte, value []byte) { + db.db[string(key)] = value +} +func (db *MemDatabase) Get(key []byte) ([]byte, error) { + return db.db[string(key)], nil +} +func (db *MemDatabase) Delete(key []byte) error { + delete(db.db, string(key)) + return nil +} +func (db *MemDatabase) Print() {} +func (db *MemDatabase) Close() {} +func (db *MemDatabase) LastKnownTD() []byte { return nil } + +func NewTrie() *trie.Trie { + db, _ := NewMemDatabase() + + return trie.New(db, "") +} diff --git a/tests/helper/vm.go b/tests/helper/vm.go new file mode 100644 index 000000000..e174e0892 --- /dev/null +++ b/tests/helper/vm.go @@ -0,0 +1,156 @@ +package helper + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/state" + "github.com/ethereum/go-ethereum/vm" +) + +type Env struct { + depth int + state *state.StateDB + skipTransfer bool + Gas *big.Int + + origin []byte + parent []byte + coinbase []byte + + number *big.Int + time int64 + difficulty *big.Int + gasLimit *big.Int + + logs state.Logs +} + +func NewEnv(state *state.StateDB) *Env { + return &Env{ + state: state, + } +} + +func NewEnvFromMap(state *state.StateDB, envValues map[string]string, exeValues map[string]string) *Env { + env := NewEnv(state) + + env.origin = ethutil.Hex2Bytes(exeValues["caller"]) + env.parent = ethutil.Hex2Bytes(envValues["previousHash"]) + env.coinbase = ethutil.Hex2Bytes(envValues["currentCoinbase"]) + env.number = ethutil.Big(envValues["currentNumber"]) + env.time = ethutil.Big(envValues["currentTimestamp"]).Int64() + env.difficulty = ethutil.Big(envValues["currentDifficulty"]) + env.gasLimit = ethutil.Big(envValues["currentGasLimit"]) + env.Gas = new(big.Int) + + return env +} + +func (self *Env) Origin() []byte { return self.origin } +func (self *Env) BlockNumber() *big.Int { return self.number } +func (self *Env) PrevHash() []byte { return self.parent } +func (self *Env) Coinbase() []byte { return self.coinbase } +func (self *Env) Time() int64 { return self.time } +func (self *Env) Difficulty() *big.Int { return self.difficulty } +func (self *Env) BlockHash() []byte { return nil } +func (self *Env) State() *state.StateDB { return self.state } +func (self *Env) GasLimit() *big.Int { return self.gasLimit } +func (self *Env) AddLog(log state.Log) { + self.logs = append(self.logs, log) +} +func (self *Env) Depth() int { return self.depth } +func (self *Env) SetDepth(i int) { self.depth = i } +func (self *Env) Transfer(from, to vm.Account, amount *big.Int) error { + return vm.Transfer(from, to, amount) +} + +func (self *Env) vm(addr, data []byte, gas, price, value *big.Int) *core.Execution { + exec := core.NewExecution(self, addr, data, gas, price, value) + exec.SkipTransfer = self.skipTransfer + + return exec +} + +func (self *Env) Call(caller vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) { + exe := self.vm(addr, data, gas, price, value) + ret, err := exe.Call(addr, caller) + self.Gas = exe.Gas + + return ret, err +} +func (self *Env) CallCode(caller vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) { + exe := self.vm(caller.Address(), data, gas, price, value) + return exe.Call(addr, caller) +} + +func (self *Env) Create(caller vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error, vm.ClosureRef) { + exe := self.vm(addr, data, gas, price, value) + return exe.Create(caller) +} + +func RunVm(state *state.StateDB, env, exec map[string]string) ([]byte, state.Logs, *big.Int, error) { + var ( + to = FromHex(exec["address"]) + from = FromHex(exec["caller"]) + data = FromHex(exec["data"]) + gas = ethutil.Big(exec["gas"]) + price = ethutil.Big(exec["gasPrice"]) + value = ethutil.Big(exec["value"]) + ) + + caller := state.GetOrNewStateObject(from) + + vmenv := NewEnvFromMap(state, env, exec) + vmenv.skipTransfer = true + ret, err := vmenv.Call(caller, to, data, gas, price, value) + + return ret, vmenv.logs, vmenv.Gas, err +} + +func RunState(statedb *state.StateDB, env, tx map[string]string) ([]byte, state.Logs, *big.Int, error) { + var ( + keyPair, _ = crypto.NewKeyPairFromSec([]byte(ethutil.Hex2Bytes(tx["secretKey"]))) + to = FromHex(tx["to"]) + data = FromHex(tx["data"]) + gas = ethutil.Big(tx["gasLimit"]) + price = ethutil.Big(tx["gasPrice"]) + value = ethutil.Big(tx["value"]) + caddr = FromHex(env["currentCoinbase"]) + ) + + coinbase := statedb.GetOrNewStateObject(caddr) + coinbase.SetGasPool(ethutil.Big(env["currentGasLimit"])) + + message := NewMessage(keyPair.Address(), to, data, value, gas, price) + Log.DebugDetailf("message{ to: %x, from %x, value: %v, gas: %v, price: %v }\n", message.to[:4], message.from[:4], message.value, message.gas, message.price) + st := core.NewStateTransition(coinbase, message, statedb, nil) + vmenv := NewEnvFromMap(statedb, env, tx) + vmenv.origin = keyPair.Address() + st.Env = vmenv + ret, err := st.TransitionState() + statedb.Update(vmenv.Gas) + + return ret, vmenv.logs, vmenv.Gas, err +} + +type Message struct { + from, to []byte + value, gas, price *big.Int + data []byte +} + +func NewMessage(from, to, data []byte, value, gas, price *big.Int) Message { + return Message{from, to, value, gas, price, data} +} + +func (self Message) Hash() []byte { return nil } +func (self Message) From() []byte { return self.from } +func (self Message) To() []byte { return self.to } +func (self Message) GasPrice() *big.Int { return self.price } +func (self Message) Gas() *big.Int { return self.gas } +func (self Message) Value() *big.Int { return self.value } +func (self Message) Nonce() uint64 { return 0 } +func (self Message) Data() []byte { return self.data } diff --git a/tests/vm/.ethtest b/tests/vm/.ethtest new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/vm/.ethtest diff --git a/tests/vm/gh_test.go b/tests/vm/gh_test.go new file mode 100644 index 000000000..1efda7fe0 --- /dev/null +++ b/tests/vm/gh_test.go @@ -0,0 +1,238 @@ +package vm + +import ( + "bytes" + "math/big" + "strconv" + "testing" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/state" + "github.com/ethereum/go-ethereum/tests/helper" +) + +type Account struct { + Balance string + Code string + Nonce string + Storage map[string]string +} + +type Log struct { + AddressF string `json:"address"` + DataF string `json:"data"` + TopicsF []string `json:"topics"` + BloomF string `json:"bloom"` +} + +func (self Log) Address() []byte { return ethutil.Hex2Bytes(self.AddressF) } +func (self Log) Data() []byte { return ethutil.Hex2Bytes(self.DataF) } +func (self Log) RlpData() interface{} { return nil } +func (self Log) Topics() [][]byte { + t := make([][]byte, len(self.TopicsF)) + for i, topic := range self.TopicsF { + t[i] = ethutil.Hex2Bytes(topic) + } + return t +} + +func StateObjectFromAccount(addr string, account Account) *state.StateObject { + obj := state.NewStateObject(ethutil.Hex2Bytes(addr)) + obj.SetBalance(ethutil.Big(account.Balance)) + + if ethutil.IsHex(account.Code) { + account.Code = account.Code[2:] + } + obj.Code = ethutil.Hex2Bytes(account.Code) + obj.Nonce = ethutil.Big(account.Nonce).Uint64() + + return obj +} + +type Env struct { + CurrentCoinbase string + CurrentDifficulty string + CurrentGasLimit string + CurrentNumber string + CurrentTimestamp interface{} + PreviousHash string +} + +type VmTest struct { + Callcreates interface{} + //Env map[string]string + Env Env + Exec map[string]string + Transaction map[string]string + Logs []Log + Gas string + Out string + Post map[string]Account + Pre map[string]Account +} + +func RunVmTest(p string, t *testing.T) { + tests := make(map[string]VmTest) + helper.CreateFileTests(t, p, &tests) + + for name, test := range tests { + statedb := state.New(helper.NewTrie()) + for addr, account := range test.Pre { + obj := StateObjectFromAccount(addr, account) + statedb.SetStateObject(obj) + for a, v := range account.Storage { + obj.SetState(helper.FromHex(a), ethutil.NewValue(helper.FromHex(v))) + } + } + + // XXX Yeah, yeah... + env := make(map[string]string) + env["currentCoinbase"] = test.Env.CurrentCoinbase + env["currentDifficulty"] = test.Env.CurrentDifficulty + env["currentGasLimit"] = test.Env.CurrentGasLimit + env["currentNumber"] = test.Env.CurrentNumber + env["previousHash"] = test.Env.PreviousHash + if n, ok := test.Env.CurrentTimestamp.(float64); ok { + env["currentTimestamp"] = strconv.Itoa(int(n)) + } else { + env["currentTimestamp"] = test.Env.CurrentTimestamp.(string) + } + + var ( + ret []byte + gas *big.Int + err error + logs state.Logs + ) + + if len(test.Exec) > 0 { + ret, logs, gas, err = helper.RunVm(statedb, env, test.Exec) + } else { + ret, logs, gas, err = helper.RunState(statedb, env, test.Transaction) + } + + // When an error is returned it doesn't always mean the tests fails. + // Have to come up with some conditional failing mechanism. + if err != nil { + helper.Log.Infoln(err) + } + + rexp := helper.FromHex(test.Out) + if bytes.Compare(rexp, ret) != 0 { + t.Errorf("%s's return failed. Expected %x, got %x\n", name, rexp, ret) + } + + if len(test.Gas) > 0 { + gexp := ethutil.Big(test.Gas) + if gexp.Cmp(gas) != 0 { + t.Errorf("%s's gas failed. Expected %v, got %v\n", name, gexp, gas) + } + } + + for addr, account := range test.Post { + obj := statedb.GetStateObject(helper.FromHex(addr)) + if obj == nil { + continue + } + + if len(test.Exec) == 0 { + if obj.Balance().Cmp(ethutil.Big(account.Balance)) != 0 { + t.Errorf("%s's : (%x) balance failed. Expected %v, got %v => %v\n", name, obj.Address()[:4], account.Balance, obj.Balance(), new(big.Int).Sub(ethutil.Big(account.Balance), obj.Balance())) + } + } + + for addr, value := range account.Storage { + v := obj.GetState(helper.FromHex(addr)).Bytes() + vexp := helper.FromHex(value) + + if bytes.Compare(v, vexp) != 0 { + t.Errorf("%s's : (%x: %s) storage failed. Expected %x, got %x (%v %v)\n", name, obj.Address()[0:4], addr, vexp, v, ethutil.BigD(vexp), ethutil.BigD(v)) + } + } + } + + if len(test.Logs) > 0 { + // Logs within the test itself aren't correct, missing empty fields (32 0s) + for i, log := range test.Logs { + genBloom := ethutil.LeftPadBytes(types.LogsBloom(state.Logs{logs[i]}).Bytes(), 64) + if !bytes.Equal(genBloom, ethutil.Hex2Bytes(log.BloomF)) { + t.Errorf("bloom mismatch") + } + } + } + } + logger.Flush() +} + +// I've created a new function for each tests so it's easier to identify where the problem lies if any of them fail. +func TestVMArithmetic(t *testing.T) { + const fn = "../files/vmtests/vmArithmeticTest.json" + RunVmTest(fn, t) +} + +func TestBitwiseLogicOperation(t *testing.T) { + const fn = "../files/vmtests/vmBitwiseLogicOperationTest.json" + RunVmTest(fn, t) +} + +func TestBlockInfo(t *testing.T) { + const fn = "../files/vmtests/vmBlockInfoTest.json" + RunVmTest(fn, t) +} + +func TestEnvironmentalInfo(t *testing.T) { + const fn = "../files/vmtests/vmEnvironmentalInfoTest.json" + RunVmTest(fn, t) +} + +func TestFlowOperation(t *testing.T) { + const fn = "../files/vmtests/vmIOandFlowOperationsTest.json" + RunVmTest(fn, t) +} + +func TestPushDupSwap(t *testing.T) { + const fn = "../files/vmtests/vmPushDupSwapTest.json" + RunVmTest(fn, t) +} + +func TestVMSha3(t *testing.T) { + const fn = "../files/vmtests/vmSha3Test.json" + RunVmTest(fn, t) +} + +func TestVm(t *testing.T) { + const fn = "../files/vmtests/vmtests.json" + RunVmTest(fn, t) +} + +func TestVmLog(t *testing.T) { + const fn = "../files/vmtests/vmLogTest.json" + RunVmTest(fn, t) +} + +func TestStateSystemOperations(t *testing.T) { + const fn = "../files/StateTests/stSystemOperationsTest.json" + RunVmTest(fn, t) +} + +func TestStatePreCompiledContracts(t *testing.T) { + const fn = "../files/StateTests/stPreCompiledContracts.json" + RunVmTest(fn, t) +} + +func TestStateRecursiveCreate(t *testing.T) { + const fn = "../files/StateTests/stRecursiveCreate.json" + RunVmTest(fn, t) +} + +func TestStateSpecial(t *testing.T) { + const fn = "../files/StateTests/stSpecialTest.json" + RunVmTest(fn, t) +} + +func TestStateRefund(t *testing.T) { + const fn = "../files/StateTests/stRefundTest.json" + RunVmTest(fn, t) +} diff --git a/trie/encoding.go b/trie/encoding.go new file mode 100644 index 000000000..4906bc90b --- /dev/null +++ b/trie/encoding.go @@ -0,0 +1,76 @@ +package trie + +import ( + "bytes" + "encoding/hex" + "strings" +) + +func CompactEncode(hexSlice []byte) string { + terminator := 0 + if hexSlice[len(hexSlice)-1] == 16 { + terminator = 1 + } + + if terminator == 1 { + hexSlice = hexSlice[:len(hexSlice)-1] + } + + oddlen := len(hexSlice) % 2 + flags := byte(2*terminator + oddlen) + if oddlen != 0 { + hexSlice = append([]byte{flags}, hexSlice...) + } else { + hexSlice = append([]byte{flags, 0}, hexSlice...) + } + + var buff bytes.Buffer + for i := 0; i < len(hexSlice); i += 2 { + buff.WriteByte(byte(16*hexSlice[i] + hexSlice[i+1])) + } + + return buff.String() +} + +func CompactDecode(str string) []byte { + base := CompactHexDecode(str) + base = base[:len(base)-1] + if base[0] >= 2 { + base = append(base, 16) + } + if base[0]%2 == 1 { + base = base[1:] + } else { + base = base[2:] + } + + return base +} + +func CompactHexDecode(str string) []byte { + base := "0123456789abcdef" + hexSlice := make([]byte, 0) + + enc := hex.EncodeToString([]byte(str)) + for _, v := range enc { + hexSlice = append(hexSlice, byte(strings.IndexByte(base, byte(v)))) + } + hexSlice = append(hexSlice, 16) + + return hexSlice +} + +func DecodeCompact(key []byte) string { + base := "0123456789abcdef" + var str string + + for _, v := range key { + if v < 16 { + str += string(base[v]) + } + } + + res, _ := hex.DecodeString(str) + + return string(res) +} diff --git a/trie/encoding_test.go b/trie/encoding_test.go new file mode 100644 index 000000000..193c898f3 --- /dev/null +++ b/trie/encoding_test.go @@ -0,0 +1,59 @@ +package trie + +import ( + checker "gopkg.in/check.v1" +) + +type TrieEncodingSuite struct{} + +var _ = checker.Suite(&TrieEncodingSuite{}) + +func (s *TrieEncodingSuite) TestCompactEncode(c *checker.C) { + // even compact encode + test1 := []byte{1, 2, 3, 4, 5} + res1 := CompactEncode(test1) + c.Assert(res1, checker.Equals, "\x11\x23\x45") + + // odd compact encode + test2 := []byte{0, 1, 2, 3, 4, 5} + res2 := CompactEncode(test2) + c.Assert(res2, checker.Equals, "\x00\x01\x23\x45") + + //odd terminated compact encode + test3 := []byte{0, 15, 1, 12, 11, 8 /*term*/, 16} + res3 := CompactEncode(test3) + c.Assert(res3, checker.Equals, "\x20\x0f\x1c\xb8") + + // even terminated compact encode + test4 := []byte{15, 1, 12, 11, 8 /*term*/, 16} + res4 := CompactEncode(test4) + c.Assert(res4, checker.Equals, "\x3f\x1c\xb8") +} + +func (s *TrieEncodingSuite) TestCompactHexDecode(c *checker.C) { + exp := []byte{7, 6, 6, 5, 7, 2, 6, 2, 16} + res := CompactHexDecode("verb") + c.Assert(res, checker.DeepEquals, exp) +} + +func (s *TrieEncodingSuite) TestCompactDecode(c *checker.C) { + // odd compact decode + exp := []byte{1, 2, 3, 4, 5} + res := CompactDecode("\x11\x23\x45") + c.Assert(res, checker.DeepEquals, exp) + + // even compact decode + exp = []byte{0, 1, 2, 3, 4, 5} + res = CompactDecode("\x00\x01\x23\x45") + c.Assert(res, checker.DeepEquals, exp) + + // even terminated compact decode + exp = []byte{0, 15, 1, 12, 11, 8 /*term*/, 16} + res = CompactDecode("\x20\x0f\x1c\xb8") + c.Assert(res, checker.DeepEquals, exp) + + // even terminated compact decode + exp = []byte{15, 1, 12, 11, 8 /*term*/, 16} + res = CompactDecode("\x3f\x1c\xb8") + c.Assert(res, checker.DeepEquals, exp) +} diff --git a/trie/iterator.go b/trie/iterator.go new file mode 100644 index 000000000..53d099a0c --- /dev/null +++ b/trie/iterator.go @@ -0,0 +1,143 @@ +package trie + +import ( + "bytes" + + "github.com/ethereum/go-ethereum/ethutil" +) + +type NodeType byte + +const ( + EmptyNode NodeType = iota + BranchNode + LeafNode + ExtNode +) + +func getType(node *ethutil.Value) NodeType { + if node.Len() == 0 { + return EmptyNode + } + + if node.Len() == 2 { + k := CompactDecode(node.Get(0).Str()) + if HasTerm(k) { + return LeafNode + } + + return ExtNode + } + + return BranchNode +} + +type Iterator struct { + Path [][]byte + trie *Trie + + Key []byte + Value *ethutil.Value +} + +func NewIterator(trie *Trie) *Iterator { + return &Iterator{trie: trie} +} + +func (self *Iterator) key(node *ethutil.Value, path [][]byte) []byte { + switch getType(node) { + case LeafNode: + k := RemTerm(CompactDecode(node.Get(0).Str())) + + self.Path = append(path, k) + self.Value = node.Get(1) + + return k + case BranchNode: + if node.Get(16).Len() > 0 { + return []byte{16} + } + + for i := byte(0); i < 16; i++ { + o := self.key(self.trie.getNode(node.Get(int(i)).Raw()), append(path, []byte{i})) + if o != nil { + return append([]byte{i}, o...) + } + } + case ExtNode: + currKey := node.Get(0).Bytes() + + return self.key(self.trie.getNode(node.Get(1).Raw()), append(path, currKey)) + } + + return nil +} + +func (self *Iterator) next(node *ethutil.Value, key []byte, path [][]byte) []byte { + switch typ := getType(node); typ { + case EmptyNode: + return nil + case BranchNode: + if len(key) > 0 { + subNode := self.trie.getNode(node.Get(int(key[0])).Raw()) + + o := self.next(subNode, key[1:], append(path, key[:1])) + if o != nil { + return append([]byte{key[0]}, o...) + } + } + + var r byte = 0 + if len(key) > 0 { + r = key[0] + 1 + } + + for i := r; i < 16; i++ { + subNode := self.trie.getNode(node.Get(int(i)).Raw()) + o := self.key(subNode, append(path, []byte{i})) + if o != nil { + return append([]byte{i}, o...) + } + } + case LeafNode, ExtNode: + k := RemTerm(CompactDecode(node.Get(0).Str())) + if typ == LeafNode { + if bytes.Compare([]byte(k), []byte(key)) > 0 { + self.Value = node.Get(1) + self.Path = append(path, k) + + return k + } + } else { + subNode := self.trie.getNode(node.Get(1).Raw()) + subKey := key[len(k):] + var ret []byte + if BeginsWith(key, k) { + ret = self.next(subNode, subKey, append(path, k)) + } else if bytes.Compare(k, key[:len(k)]) > 0 { + ret = self.key(node, append(path, k)) + } else { + ret = nil + } + + if ret != nil { + return append(k, ret...) + } + } + } + + return nil +} + +// Get the next in keys +func (self *Iterator) Next(key string) []byte { + self.trie.mut.Lock() + defer self.trie.mut.Unlock() + + k := RemTerm(CompactHexDecode(key)) + n := self.next(self.trie.getNode(self.trie.Root), k, nil) + + self.Key = []byte(DecodeCompact(n)) + + return self.Key +} diff --git a/trie/main_test.go b/trie/main_test.go new file mode 100644 index 000000000..f6f64c06f --- /dev/null +++ b/trie/main_test.go @@ -0,0 +1,9 @@ +package trie + +import ( + "testing" + + checker "gopkg.in/check.v1" +) + +func Test(t *testing.T) { checker.TestingT(t) } diff --git a/trie/slice.go b/trie/slice.go new file mode 100644 index 000000000..f53b6c749 --- /dev/null +++ b/trie/slice.go @@ -0,0 +1,53 @@ +package trie + +import ( + "bytes" + "math" +) + +// Helper function for comparing slices +func CompareIntSlice(a, b []int) bool { + if len(a) != len(b) { + return false + } + for i, v := range a { + if v != b[i] { + return false + } + } + return true +} + +// Returns the amount of nibbles that match each other from 0 ... +func MatchingNibbleLength(a, b []byte) int { + var i, length = 0, int(math.Min(float64(len(a)), float64(len(b)))) + + for i < length { + if a[i] != b[i] { + break + } + i++ + } + + return i +} + +func HasTerm(s []byte) bool { + return s[len(s)-1] == 16 +} + +func RemTerm(s []byte) []byte { + if HasTerm(s) { + return s[:len(s)-1] + } + + return s +} + +func BeginsWith(a, b []byte) bool { + if len(b) > len(a) { + return false + } + + return bytes.Equal(a[:len(b)], b) +} diff --git a/trie/trie.go b/trie/trie.go new file mode 100644 index 000000000..d89c39775 --- /dev/null +++ b/trie/trie.go @@ -0,0 +1,631 @@ +package trie + +import ( + "bytes" + "fmt" + "sync" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethutil" +) + +func ParanoiaCheck(t1 *Trie) (bool, *Trie) { + t2 := New(ethutil.Config.Db, "") + + t1.NewIterator().Each(func(key string, v *ethutil.Value) { + t2.Update(key, v.Str()) + }) + + return bytes.Compare(t2.GetRoot(), t1.GetRoot()) == 0, t2 +} + +func (s *Cache) Len() int { + return len(s.nodes) +} + +// TODO +// A StateObject is an object that has a state root +// This is goig to be the object for the second level caching (the caching of object which have a state such as contracts) +type StateObject interface { + State() *Trie + Sync() + Undo() +} + +type Node struct { + Key []byte + Value *ethutil.Value + Dirty bool +} + +func NewNode(key []byte, val *ethutil.Value, dirty bool) *Node { + return &Node{Key: key, Value: val, Dirty: dirty} +} + +func (n *Node) Copy() *Node { + return NewNode(n.Key, n.Value, n.Dirty) +} + +type Cache struct { + nodes map[string]*Node + db ethutil.Database + IsDirty bool +} + +func NewCache(db ethutil.Database) *Cache { + return &Cache{db: db, nodes: make(map[string]*Node)} +} + +func (cache *Cache) PutValue(v interface{}, force bool) interface{} { + value := ethutil.NewValue(v) + + enc := value.Encode() + if len(enc) >= 32 || force { + sha := crypto.Sha3(enc) + + cache.nodes[string(sha)] = NewNode(sha, value, true) + cache.IsDirty = true + + return sha + } + + return v +} + +func (cache *Cache) Put(v interface{}) interface{} { + return cache.PutValue(v, false) +} + +func (cache *Cache) Get(key []byte) *ethutil.Value { + // First check if the key is the cache + if cache.nodes[string(key)] != nil { + return cache.nodes[string(key)].Value + } + + // Get the key of the database instead and cache it + data, _ := cache.db.Get(key) + // Create the cached value + value := ethutil.NewValueFromBytes(data) + + defer func() { + if r := recover(); r != nil { + fmt.Println("RECOVER GET", cache, cache.nodes) + panic("bye") + } + }() + // Create caching node + cache.nodes[string(key)] = NewNode(key, value, true) + + return value +} + +func (cache *Cache) Delete(key []byte) { + delete(cache.nodes, string(key)) + + cache.db.Delete(key) +} + +func (cache *Cache) Commit() { + // Don't try to commit if it isn't dirty + if !cache.IsDirty { + return + } + + for key, node := range cache.nodes { + if node.Dirty { + cache.db.Put([]byte(key), node.Value.Encode()) + node.Dirty = false + } + } + cache.IsDirty = false + + // If the nodes grows beyond the 200 entries we simple empty it + // FIXME come up with something better + if len(cache.nodes) > 200 { + cache.nodes = make(map[string]*Node) + } +} + +func (cache *Cache) Undo() { + for key, node := range cache.nodes { + if node.Dirty { + delete(cache.nodes, key) + } + } + cache.IsDirty = false +} + +// A (modified) Radix Trie implementation. The Trie implements +// a caching mechanism and will used cached values if they are +// present. If a node is not present in the cache it will try to +// fetch it from the database and store the cached value. +// Please note that the data isn't persisted unless `Sync` is +// explicitly called. +type Trie struct { + mut sync.RWMutex + prevRoot interface{} + Root interface{} + //db Database + cache *Cache +} + +func copyRoot(root interface{}) interface{} { + var prevRootCopy interface{} + if b, ok := root.([]byte); ok { + prevRootCopy = ethutil.CopyBytes(b) + } else { + prevRootCopy = root + } + + return prevRootCopy +} + +func New(db ethutil.Database, Root interface{}) *Trie { + // Make absolute sure the root is copied + r := copyRoot(Root) + p := copyRoot(Root) + + trie := &Trie{cache: NewCache(db), Root: r, prevRoot: p} + trie.setRoot(Root) + + return trie +} + +func (self *Trie) setRoot(root interface{}) { + switch t := root.(type) { + case string: + /* + if t == "" { + root = crypto.Sha3(ethutil.Encode("")) + } + */ + self.Root = []byte(t) + case []byte: + self.Root = root + default: + self.Root = self.cache.PutValue(root, true) + } +} + +/* + * Public (query) interface functions + */ + +func (t *Trie) Update(key, value string) { + t.mut.Lock() + defer t.mut.Unlock() + + k := CompactHexDecode(key) + + var root interface{} + if value != "" { + root = t.UpdateState(t.Root, k, value) + } else { + root = t.deleteState(t.Root, k) + } + t.setRoot(root) +} + +func (t *Trie) Get(key string) string { + t.mut.Lock() + defer t.mut.Unlock() + + k := CompactHexDecode(key) + c := ethutil.NewValue(t.getState(t.Root, k)) + + return c.Str() +} + +func (t *Trie) Delete(key string) { + t.mut.Lock() + defer t.mut.Unlock() + + k := CompactHexDecode(key) + + root := t.deleteState(t.Root, k) + t.setRoot(root) +} + +func (self *Trie) GetRoot() []byte { + switch t := self.Root.(type) { + case string: + if t == "" { + return crypto.Sha3(ethutil.Encode("")) + } + return []byte(t) + case []byte: + if len(t) == 0 { + return crypto.Sha3(ethutil.Encode("")) + } + + return t + default: + panic(fmt.Sprintf("invalid root type %T (%v)", self.Root, self.Root)) + } +} + +// Simple compare function which creates a rlp value out of the evaluated objects +func (t *Trie) Cmp(trie *Trie) bool { + return ethutil.NewValue(t.Root).Cmp(ethutil.NewValue(trie.Root)) +} + +// Returns a copy of this trie +func (t *Trie) Copy() *Trie { + trie := New(t.cache.db, t.Root) + for key, node := range t.cache.nodes { + trie.cache.nodes[key] = node.Copy() + } + + return trie +} + +// Save the cached value to the database. +func (t *Trie) Sync() { + t.cache.Commit() + t.prevRoot = copyRoot(t.Root) +} + +func (t *Trie) Undo() { + t.cache.Undo() + t.Root = t.prevRoot +} + +func (t *Trie) Cache() *Cache { + return t.cache +} + +func (t *Trie) getState(node interface{}, key []byte) interface{} { + n := ethutil.NewValue(node) + // Return the node if key is empty (= found) + if len(key) == 0 || n.IsNil() || n.Len() == 0 { + return node + } + + currentNode := t.getNode(node) + length := currentNode.Len() + + if length == 0 { + return "" + } else if length == 2 { + // Decode the key + k := CompactDecode(currentNode.Get(0).Str()) + v := currentNode.Get(1).Raw() + + if len(key) >= len(k) && bytes.Equal(k, key[:len(k)]) { //CompareIntSlice(k, key[:len(k)]) { + return t.getState(v, key[len(k):]) + } else { + return "" + } + } else if length == 17 { + return t.getState(currentNode.Get(int(key[0])).Raw(), key[1:]) + } + + // It shouldn't come this far + panic("unexpected return") +} + +func (t *Trie) getNode(node interface{}) *ethutil.Value { + n := ethutil.NewValue(node) + + if !n.Get(0).IsNil() { + return n + } + + str := n.Str() + if len(str) == 0 { + return n + } else if len(str) < 32 { + return ethutil.NewValueFromBytes([]byte(str)) + } + + data := t.cache.Get(n.Bytes()) + + return data +} + +func (t *Trie) UpdateState(node interface{}, key []byte, value string) interface{} { + return t.InsertState(node, key, value) +} + +func (t *Trie) Put(node interface{}) interface{} { + return t.cache.Put(node) + +} + +func EmptyStringSlice(l int) []interface{} { + slice := make([]interface{}, l) + for i := 0; i < l; i++ { + slice[i] = "" + } + return slice +} + +func (t *Trie) InsertState(node interface{}, key []byte, value interface{}) interface{} { + if len(key) == 0 { + return value + } + + // New node + n := ethutil.NewValue(node) + if node == nil || n.Len() == 0 { + newNode := []interface{}{CompactEncode(key), value} + + return t.Put(newNode) + } + + currentNode := t.getNode(node) + // Check for "special" 2 slice type node + if currentNode.Len() == 2 { + // Decode the key + + k := CompactDecode(currentNode.Get(0).Str()) + v := currentNode.Get(1).Raw() + + // Matching key pair (ie. there's already an object with this key) + if bytes.Equal(k, key) { //CompareIntSlice(k, key) { + newNode := []interface{}{CompactEncode(key), value} + return t.Put(newNode) + } + + var newHash interface{} + matchingLength := MatchingNibbleLength(key, k) + if matchingLength == len(k) { + // Insert the hash, creating a new node + newHash = t.InsertState(v, key[matchingLength:], value) + } else { + // Expand the 2 length slice to a 17 length slice + oldNode := t.InsertState("", k[matchingLength+1:], v) + newNode := t.InsertState("", key[matchingLength+1:], value) + // Create an expanded slice + scaledSlice := EmptyStringSlice(17) + // Set the copied and new node + scaledSlice[k[matchingLength]] = oldNode + scaledSlice[key[matchingLength]] = newNode + + newHash = t.Put(scaledSlice) + } + + if matchingLength == 0 { + // End of the chain, return + return newHash + } else { + newNode := []interface{}{CompactEncode(key[:matchingLength]), newHash} + return t.Put(newNode) + } + } else { + + // Copy the current node over to the new node and replace the first nibble in the key + newNode := EmptyStringSlice(17) + + for i := 0; i < 17; i++ { + cpy := currentNode.Get(i).Raw() + if cpy != nil { + newNode[i] = cpy + } + } + + newNode[key[0]] = t.InsertState(currentNode.Get(int(key[0])).Raw(), key[1:], value) + + return t.Put(newNode) + } + + panic("unexpected end") +} + +func (t *Trie) deleteState(node interface{}, key []byte) interface{} { + if len(key) == 0 { + return "" + } + + // New node + n := ethutil.NewValue(node) + //if node == nil || (n.Type() == reflect.String && (n.Str() == "" || n.Get(0).IsNil())) || n.Len() == 0 { + if node == nil || n.Len() == 0 { + //return nil + //fmt.Printf("<empty ret> %x %d\n", n, len(n.Bytes())) + + return "" + } + + currentNode := t.getNode(node) + // Check for "special" 2 slice type node + if currentNode.Len() == 2 { + // Decode the key + k := CompactDecode(currentNode.Get(0).Str()) + v := currentNode.Get(1).Raw() + + // Matching key pair (ie. there's already an object with this key) + if bytes.Equal(k, key) { //CompareIntSlice(k, key) { + //fmt.Printf("<delete ret> %x\n", v) + + return "" + } else if bytes.Equal(key[:len(k)], k) { //CompareIntSlice(key[:len(k)], k) { + hash := t.deleteState(v, key[len(k):]) + child := t.getNode(hash) + + var newNode []interface{} + if child.Len() == 2 { + newKey := append(k, CompactDecode(child.Get(0).Str())...) + newNode = []interface{}{CompactEncode(newKey), child.Get(1).Raw()} + } else { + newNode = []interface{}{currentNode.Get(0).Str(), hash} + } + + //fmt.Printf("%x\n", newNode) + + return t.Put(newNode) + } else { + return node + } + } else { + // Copy the current node over to the new node and replace the first nibble in the key + n := EmptyStringSlice(17) + var newNode []interface{} + + for i := 0; i < 17; i++ { + cpy := currentNode.Get(i).Raw() + if cpy != nil { + n[i] = cpy + } + } + + n[key[0]] = t.deleteState(n[key[0]], key[1:]) + amount := -1 + for i := 0; i < 17; i++ { + if n[i] != "" { + if amount == -1 { + amount = i + } else { + amount = -2 + } + } + } + if amount == 16 { + newNode = []interface{}{CompactEncode([]byte{16}), n[amount]} + } else if amount >= 0 { + child := t.getNode(n[amount]) + if child.Len() == 17 { + newNode = []interface{}{CompactEncode([]byte{byte(amount)}), n[amount]} + } else if child.Len() == 2 { + key := append([]byte{byte(amount)}, CompactDecode(child.Get(0).Str())...) + newNode = []interface{}{CompactEncode(key), child.Get(1).Str()} + } + + } else { + newNode = n + } + + //fmt.Printf("%x\n", newNode) + return t.Put(newNode) + } + + panic("unexpected return") +} + +type TrieIterator struct { + trie *Trie + key string + value string + + shas [][]byte + values []string + + lastNode []byte +} + +func (t *Trie) NewIterator() *TrieIterator { + return &TrieIterator{trie: t} +} + +func (self *Trie) Iterator() *Iterator { + return NewIterator(self) +} + +// Some time in the near future this will need refactoring :-) +// XXX Note to self, IsSlice == inline node. Str == sha3 to node +func (it *TrieIterator) workNode(currentNode *ethutil.Value) { + if currentNode.Len() == 2 { + k := CompactDecode(currentNode.Get(0).Str()) + + if currentNode.Get(1).Str() == "" { + it.workNode(currentNode.Get(1)) + } else { + if k[len(k)-1] == 16 { + it.values = append(it.values, currentNode.Get(1).Str()) + } else { + it.shas = append(it.shas, currentNode.Get(1).Bytes()) + it.getNode(currentNode.Get(1).Bytes()) + } + } + } else { + for i := 0; i < currentNode.Len(); i++ { + if i == 16 && currentNode.Get(i).Len() != 0 { + it.values = append(it.values, currentNode.Get(i).Str()) + } else { + if currentNode.Get(i).Str() == "" { + it.workNode(currentNode.Get(i)) + } else { + val := currentNode.Get(i).Str() + if val != "" { + it.shas = append(it.shas, currentNode.Get(1).Bytes()) + it.getNode([]byte(val)) + } + } + } + } + } +} + +func (it *TrieIterator) getNode(node []byte) { + currentNode := it.trie.cache.Get(node) + it.workNode(currentNode) +} + +func (it *TrieIterator) Collect() [][]byte { + if it.trie.Root == "" { + return nil + } + + it.getNode(ethutil.NewValue(it.trie.Root).Bytes()) + + return it.shas +} + +func (it *TrieIterator) Purge() int { + shas := it.Collect() + for _, sha := range shas { + it.trie.cache.Delete(sha) + } + return len(it.values) +} + +func (it *TrieIterator) Key() string { + return "" +} + +func (it *TrieIterator) Value() string { + return "" +} + +type EachCallback func(key string, node *ethutil.Value) + +func (it *TrieIterator) Each(cb EachCallback) { + it.fetchNode(nil, ethutil.NewValue(it.trie.Root).Bytes(), cb) +} + +func (it *TrieIterator) fetchNode(key []byte, node []byte, cb EachCallback) { + it.iterateNode(key, it.trie.cache.Get(node), cb) +} + +func (it *TrieIterator) iterateNode(key []byte, currentNode *ethutil.Value, cb EachCallback) { + if currentNode.Len() == 2 { + k := CompactDecode(currentNode.Get(0).Str()) + + pk := append(key, k...) + if currentNode.Get(1).Len() != 0 && currentNode.Get(1).Str() == "" { + it.iterateNode(pk, currentNode.Get(1), cb) + } else { + if k[len(k)-1] == 16 { + cb(DecodeCompact(pk), currentNode.Get(1)) + } else { + it.fetchNode(pk, currentNode.Get(1).Bytes(), cb) + } + } + } else { + for i := 0; i < currentNode.Len(); i++ { + pk := append(key, byte(i)) + if i == 16 && currentNode.Get(i).Len() != 0 { + cb(DecodeCompact(pk), currentNode.Get(i)) + } else { + if currentNode.Get(i).Len() != 0 && currentNode.Get(i).Str() == "" { + it.iterateNode(pk, currentNode.Get(i), cb) + } else { + val := currentNode.Get(i).Str() + if val != "" { + it.fetchNode(pk, []byte(val), cb) + } + } + } + } + } +} diff --git a/trie/trie_test.go b/trie/trie_test.go new file mode 100644 index 000000000..207d41f30 --- /dev/null +++ b/trie/trie_test.go @@ -0,0 +1,447 @@ +package trie + +import ( + "bytes" + "encoding/hex" + "encoding/json" + "fmt" + "io/ioutil" + "math/rand" + "net/http" + "testing" + "time" + + checker "gopkg.in/check.v1" + + "github.com/ethereum/go-ethereum/ethutil" +) + +const LONG_WORD = "1234567890abcdefghijklmnopqrstuvwxxzABCEFGHIJKLMNOPQRSTUVWXYZ" + +type TrieSuite struct { + db *MemDatabase + trie *Trie +} + +type MemDatabase struct { + db map[string][]byte +} + +func NewMemDatabase() (*MemDatabase, error) { + db := &MemDatabase{db: make(map[string][]byte)} + return db, nil +} +func (db *MemDatabase) Put(key []byte, value []byte) { + db.db[string(key)] = value +} +func (db *MemDatabase) Get(key []byte) ([]byte, error) { + return db.db[string(key)], nil +} +func (db *MemDatabase) Delete(key []byte) error { + delete(db.db, string(key)) + return nil +} +func (db *MemDatabase) Print() {} +func (db *MemDatabase) Close() {} +func (db *MemDatabase) LastKnownTD() []byte { return nil } + +func NewTrie() (*MemDatabase, *Trie) { + db, _ := NewMemDatabase() + return db, New(db, "") +} + +func (s *TrieSuite) SetUpTest(c *checker.C) { + s.db, s.trie = NewTrie() +} + +func (s *TrieSuite) TestTrieSync(c *checker.C) { + s.trie.Update("dog", LONG_WORD) + c.Assert(s.db.db, checker.HasLen, 0, checker.Commentf("Expected no data in database")) + s.trie.Sync() + c.Assert(s.db.db, checker.HasLen, 3) +} + +func (s *TrieSuite) TestTrieDirtyTracking(c *checker.C) { + s.trie.Update("dog", LONG_WORD) + c.Assert(s.trie.cache.IsDirty, checker.Equals, true, checker.Commentf("Expected no data in database")) + + s.trie.Sync() + c.Assert(s.trie.cache.IsDirty, checker.Equals, false, checker.Commentf("Expected trie to be dirty")) + + s.trie.Update("test", LONG_WORD) + s.trie.cache.Undo() + c.Assert(s.trie.cache.IsDirty, checker.Equals, false) +} + +func (s *TrieSuite) TestTrieReset(c *checker.C) { + s.trie.Update("cat", LONG_WORD) + c.Assert(s.trie.cache.nodes, checker.HasLen, 1, checker.Commentf("Expected cached nodes")) + + s.trie.cache.Undo() + c.Assert(s.trie.cache.nodes, checker.HasLen, 0, checker.Commentf("Expected no nodes after undo")) +} + +func (s *TrieSuite) TestTrieGet(c *checker.C) { + s.trie.Update("cat", LONG_WORD) + x := s.trie.Get("cat") + c.Assert(x, checker.DeepEquals, LONG_WORD) +} + +func (s *TrieSuite) TestTrieUpdating(c *checker.C) { + s.trie.Update("cat", LONG_WORD) + s.trie.Update("cat", LONG_WORD+"1") + x := s.trie.Get("cat") + c.Assert(x, checker.DeepEquals, LONG_WORD+"1") +} + +func (s *TrieSuite) TestTrieCmp(c *checker.C) { + _, trie1 := NewTrie() + _, trie2 := NewTrie() + + trie1.Update("doge", LONG_WORD) + trie2.Update("doge", LONG_WORD) + c.Assert(trie1, checker.DeepEquals, trie2) + + trie1.Update("dog", LONG_WORD) + trie2.Update("cat", LONG_WORD) + c.Assert(trie1, checker.Not(checker.DeepEquals), trie2) +} + +func (s *TrieSuite) TestTrieDelete(c *checker.C) { + s.trie.Update("cat", LONG_WORD) + exp := s.trie.Root + s.trie.Update("dog", LONG_WORD) + s.trie.Delete("dog") + c.Assert(s.trie.Root, checker.DeepEquals, exp) + + s.trie.Update("dog", LONG_WORD) + exp = s.trie.Root + s.trie.Update("dude", LONG_WORD) + s.trie.Delete("dude") + c.Assert(s.trie.Root, checker.DeepEquals, exp) +} + +func (s *TrieSuite) TestTrieDeleteWithValue(c *checker.C) { + s.trie.Update("c", LONG_WORD) + exp := s.trie.Root + s.trie.Update("ca", LONG_WORD) + s.trie.Update("cat", LONG_WORD) + s.trie.Delete("ca") + s.trie.Delete("cat") + c.Assert(s.trie.Root, checker.DeepEquals, exp) +} + +func (s *TrieSuite) TestTriePurge(c *checker.C) { + s.trie.Update("c", LONG_WORD) + s.trie.Update("ca", LONG_WORD) + s.trie.Update("cat", LONG_WORD) + + lenBefore := len(s.trie.cache.nodes) + it := s.trie.NewIterator() + num := it.Purge() + c.Assert(num, checker.Equals, 3) + c.Assert(len(s.trie.cache.nodes), checker.Equals, lenBefore) +} + +func h(str string) string { + d, err := hex.DecodeString(str) + if err != nil { + panic(err) + } + + return string(d) +} + +func get(in string) (out string) { + if len(in) > 2 && in[:2] == "0x" { + out = h(in[2:]) + } else { + out = in + } + + return +} + +type TrieTest struct { + Name string + In map[string]string + Root string +} + +func CreateTest(name string, data []byte) (TrieTest, error) { + t := TrieTest{Name: name} + err := json.Unmarshal(data, &t) + if err != nil { + return TrieTest{}, fmt.Errorf("%v", err) + } + + return t, nil +} + +func CreateTests(uri string, cb func(TrieTest)) map[string]TrieTest { + resp, err := http.Get(uri) + if err != nil { + panic(err) + } + defer resp.Body.Close() + + data, err := ioutil.ReadAll(resp.Body) + + var objmap map[string]*json.RawMessage + err = json.Unmarshal(data, &objmap) + if err != nil { + panic(err) + } + + tests := make(map[string]TrieTest) + for name, testData := range objmap { + test, err := CreateTest(name, *testData) + if err != nil { + panic(err) + } + + if cb != nil { + cb(test) + } + tests[name] = test + } + + return tests +} + +func RandomData() [][]string { + data := [][]string{ + {"0x000000000000000000000000ec4f34c97e43fbb2816cfd95e388353c7181dab1", "0x4e616d6552656700000000000000000000000000000000000000000000000000"}, + {"0x0000000000000000000000000000000000000000000000000000000000000045", "0x22b224a1420a802ab51d326e29fa98e34c4f24ea"}, + {"0x0000000000000000000000000000000000000000000000000000000000000046", "0x67706c2076330000000000000000000000000000000000000000000000000000"}, + {"0x000000000000000000000000697c7b8c961b56f675d570498424ac8de1a918f6", "0x6f6f6f6820736f2067726561742c207265616c6c6c793f000000000000000000"}, + {"0x0000000000000000000000007ef9e639e2733cb34e4dfc576d4b23f72db776b2", "0x4655474156000000000000000000000000000000000000000000000000000000"}, + {"0x6f6f6f6820736f2067726561742c207265616c6c6c793f000000000000000000", "0x697c7b8c961b56f675d570498424ac8de1a918f6"}, + {"0x4655474156000000000000000000000000000000000000000000000000000000", "0x7ef9e639e2733cb34e4dfc576d4b23f72db776b2"}, + {"0x4e616d6552656700000000000000000000000000000000000000000000000000", "0xec4f34c97e43fbb2816cfd95e388353c7181dab1"}, + } + + var c [][]string + for len(data) != 0 { + e := rand.Intn(len(data)) + c = append(c, data[e]) + + copy(data[e:], data[e+1:]) + data[len(data)-1] = nil + data = data[:len(data)-1] + } + + return c +} + +const MaxTest = 1000 + +// This test insert data in random order and seeks to find indifferences between the different tries +func (s *TrieSuite) TestRegression(c *checker.C) { + rand.Seed(time.Now().Unix()) + + roots := make(map[string]int) + for i := 0; i < MaxTest; i++ { + _, trie := NewTrie() + data := RandomData() + + for _, test := range data { + trie.Update(test[0], test[1]) + } + trie.Delete("0x4e616d6552656700000000000000000000000000000000000000000000000000") + + roots[string(trie.Root.([]byte))] += 1 + } + + c.Assert(len(roots) <= 1, checker.Equals, true) + // if len(roots) > 1 { + // for root, num := range roots { + // t.Errorf("%x => %d\n", root, num) + // } + // } +} + +func (s *TrieSuite) TestDelete(c *checker.C) { + s.trie.Update("a", "jeffreytestlongstring") + s.trie.Update("aa", "otherstring") + s.trie.Update("aaa", "othermorestring") + s.trie.Update("aabbbbccc", "hithere") + s.trie.Update("abbcccdd", "hstanoehutnaheoustnh") + s.trie.Update("rnthaoeuabbcccdd", "hstanoehutnaheoustnh") + s.trie.Update("rneuabbcccdd", "hstanoehutnaheoustnh") + s.trie.Update("rneuabboeusntahoeucccdd", "hstanoehutnaheoustnh") + s.trie.Update("rnxabboeusntahoeucccdd", "hstanoehutnaheoustnh") + s.trie.Delete("aaboaestnuhbccc") + s.trie.Delete("a") + s.trie.Update("a", "nthaonethaosentuh") + s.trie.Update("c", "shtaosntehua") + s.trie.Delete("a") + s.trie.Update("aaaa", "testmegood") + + _, t2 := NewTrie() + s.trie.NewIterator().Each(func(key string, v *ethutil.Value) { + if key == "aaaa" { + t2.Update(key, v.Str()) + } else { + t2.Update(key, v.Str()) + } + }) + + a := ethutil.NewValue(s.trie.Root).Bytes() + b := ethutil.NewValue(t2.Root).Bytes() + + c.Assert(a, checker.DeepEquals, b) +} + +func (s *TrieSuite) TestTerminator(c *checker.C) { + key := CompactDecode("hello") + c.Assert(HasTerm(key), checker.Equals, true, checker.Commentf("Expected %v to have a terminator", key)) +} + +func (s *TrieSuite) TestIt(c *checker.C) { + s.trie.Update("cat", "cat") + s.trie.Update("doge", "doge") + s.trie.Update("wallace", "wallace") + it := s.trie.Iterator() + + inputs := []struct { + In, Out string + }{ + {"", "cat"}, + {"bobo", "cat"}, + {"c", "cat"}, + {"car", "cat"}, + {"catering", "doge"}, + {"w", "wallace"}, + {"wallace123", ""}, + } + + for _, test := range inputs { + res := string(it.Next(test.In)) + c.Assert(res, checker.Equals, test.Out) + } +} + +func (s *TrieSuite) TestBeginsWith(c *checker.C) { + a := CompactDecode("hello") + b := CompactDecode("hel") + + c.Assert(BeginsWith(a, b), checker.Equals, false) + c.Assert(BeginsWith(b, a), checker.Equals, true) +} + +func (s *TrieSuite) TestItems(c *checker.C) { + s.trie.Update("A", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") + exp := "d23786fb4a010da3ce639d66d5e904a11dbc02746d1ce25029e53290cabf28ab" + + c.Assert(s.trie.GetRoot(), checker.DeepEquals, ethutil.Hex2Bytes(exp)) +} + +/* +func TestRndCase(t *testing.T) { + _, trie := NewTrie() + + data := []struct{ k, v string }{ + {"0000000000000000000000000000000000000000000000000000000000000001", "a07573657264617461000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000003", "8453bb5b31"}, + {"0000000000000000000000000000000000000000000000000000000000000004", "850218711a00"}, + {"0000000000000000000000000000000000000000000000000000000000000005", "9462d7705bd0b3ecbc51a8026a25597cb28a650c79"}, + {"0000000000000000000000000000000000000000000000000000000000000010", "947e70f9460402290a3e487dae01f610a1a8218fda"}, + {"0000000000000000000000000000000000000000000000000000000000000111", "01"}, + {"0000000000000000000000000000000000000000000000000000000000000112", "a053656e6174650000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000113", "a053656e6174650000000000000000000000000000000000000000000000000000"}, + {"53656e6174650000000000000000000000000000000000000000000000000000", "94977e3f62f5e1ed7953697430303a3cfa2b5b736e"}, + } + for _, e := range data { + trie.Update(string(ethutil.Hex2Bytes(e.k)), string(ethutil.Hex2Bytes(e.v))) + } + + fmt.Printf("root after update %x\n", trie.Root) + trie.NewIterator().Each(func(k string, v *ethutil.Value) { + fmt.Printf("%x %x\n", k, v.Bytes()) + }) + + data = []struct{ k, v string }{ + {"0000000000000000000000000000000000000000000000000000000000000112", ""}, + {"436974697a656e73000000000000000000000000000000000000000000000001", ""}, + {"436f757274000000000000000000000000000000000000000000000000000002", ""}, + {"53656e6174650000000000000000000000000000000000000000000000000000", ""}, + {"436f757274000000000000000000000000000000000000000000000000000000", ""}, + {"53656e6174650000000000000000000000000000000000000000000000000001", ""}, + {"0000000000000000000000000000000000000000000000000000000000000113", ""}, + {"436974697a656e73000000000000000000000000000000000000000000000000", ""}, + {"436974697a656e73000000000000000000000000000000000000000000000002", ""}, + {"436f757274000000000000000000000000000000000000000000000000000001", ""}, + {"0000000000000000000000000000000000000000000000000000000000000111", ""}, + {"53656e6174650000000000000000000000000000000000000000000000000002", ""}, + } + + for _, e := range data { + trie.Delete(string(ethutil.Hex2Bytes(e.k))) + } + + fmt.Printf("root after delete %x\n", trie.Root) + + trie.NewIterator().Each(func(k string, v *ethutil.Value) { + fmt.Printf("%x %x\n", k, v.Bytes()) + }) + + fmt.Printf("%x\n", trie.Get(string(ethutil.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")))) +} +*/ + +func TestOtherSomething(t *testing.T) { + _, trie := NewTrie() + + vals := []struct{ k, v string }{ + {"do", "verb"}, + {"ether", "wookiedoo"}, + {"horse", "stallion"}, + {"shaman", "horse"}, + {"doge", "coin"}, + {"ether", ""}, + {"dog", "puppy"}, + {"shaman", ""}, + } + for _, val := range vals { + trie.Update(val.k, val.v) + } + + exp := ethutil.Hex2Bytes("5991bb8c6514148a29db676a14ac506cd2cd5775ace63c30a4fe457715e9ac84") + hash := trie.Root.([]byte) + if !bytes.Equal(hash, exp) { + t.Errorf("expected %x got %x", exp, hash) + } +} + +func BenchmarkGets(b *testing.B) { + _, trie := NewTrie() + vals := []struct{ k, v string }{ + {"do", "verb"}, + {"ether", "wookiedoo"}, + {"horse", "stallion"}, + {"shaman", "horse"}, + {"doge", "coin"}, + {"ether", ""}, + {"dog", "puppy"}, + {"shaman", ""}, + {"somethingveryoddindeedthis is", "myothernodedata"}, + } + for _, val := range vals { + trie.Update(val.k, val.v) + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + trie.Get("horse") + } +} + +func BenchmarkUpdate(b *testing.B) { + _, trie := NewTrie() + + b.ResetTimer() + for i := 0; i < b.N; i++ { + trie.Update(fmt.Sprintf("aaaaaaaaaaaaaaa%d", i), "value") + } +} diff --git a/types/ethereum.go b/types/ethereum.go new file mode 100644 index 000000000..ab1254f4c --- /dev/null +++ b/types/ethereum.go @@ -0,0 +1 @@ +package types diff --git a/ui/filter.go b/ui/filter.go new file mode 100644 index 000000000..88faad5ca --- /dev/null +++ b/ui/filter.go @@ -0,0 +1,75 @@ +package ui + +import ( + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/ethutil" +) + +func NewFilterFromMap(object map[string]interface{}, eth core.EthManager) *core.Filter { + filter := core.NewFilter(eth) + + if object["earliest"] != nil { + val := ethutil.NewValue(object["earliest"]) + filter.SetEarliestBlock(val.Int()) + } + + if object["latest"] != nil { + val := ethutil.NewValue(object["latest"]) + filter.SetLatestBlock(val.Int()) + } + + if object["to"] != nil { + val := ethutil.NewValue(object["to"]) + filter.AddTo(ethutil.Hex2Bytes(val.Str())) + } + + if object["from"] != nil { + val := ethutil.NewValue(object["from"]) + filter.AddFrom(ethutil.Hex2Bytes(val.Str())) + } + + if object["max"] != nil { + val := ethutil.NewValue(object["max"]) + filter.SetMax(int(val.Uint())) + } + + if object["skip"] != nil { + val := ethutil.NewValue(object["skip"]) + filter.SetSkip(int(val.Uint())) + } + + if object["altered"] != nil { + filter.Altered = makeAltered(object["altered"]) + } + + return filter +} + +// Conversion methodn +func mapToAccountChange(m map[string]interface{}) (d core.AccountChange) { + if str, ok := m["id"].(string); ok { + d.Address = ethutil.Hex2Bytes(str) + } + + if str, ok := m["at"].(string); ok { + d.StateAddress = ethutil.Hex2Bytes(str) + } + + return +} + +// data can come in in the following formats: +// ["aabbccdd", {id: "ccddee", at: "11223344"}], "aabbcc", {id: "ccddee", at: "1122"} +func makeAltered(v interface{}) (d []core.AccountChange) { + if str, ok := v.(string); ok { + d = append(d, core.AccountChange{ethutil.Hex2Bytes(str), nil}) + } else if obj, ok := v.(map[string]interface{}); ok { + d = append(d, mapToAccountChange(obj)) + } else if slice, ok := v.([]interface{}); ok { + for _, item := range slice { + d = append(d, makeAltered(item)...) + } + } + + return +} diff --git a/ui/qt/filter.go b/ui/qt/filter.go new file mode 100644 index 000000000..c68936401 --- /dev/null +++ b/ui/qt/filter.go @@ -0,0 +1,38 @@ +package qt + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/ui" + "gopkg.in/qml.v1" +) + +func NewFilterFromMap(object map[string]interface{}, eth core.EthManager) *core.Filter { + filter := ui.NewFilterFromMap(object, eth) + + if object["altered"] != nil { + filter.Altered = makeAltered(object["altered"]) + } + + return filter +} + +func makeAltered(v interface{}) (d []core.AccountChange) { + if qList, ok := v.(*qml.List); ok { + var s []interface{} + qList.Convert(&s) + + fmt.Println(s) + + d = makeAltered(s) + } else if qMap, ok := v.(*qml.Map); ok { + var m map[string]interface{} + qMap.Convert(&m) + fmt.Println(m) + + d = makeAltered(m) + } + + return +} diff --git a/ui/qt/qwhisper/whisper.go b/ui/qt/qwhisper/whisper.go new file mode 100644 index 000000000..bed23c8a7 --- /dev/null +++ b/ui/qt/qwhisper/whisper.go @@ -0,0 +1,70 @@ +package qwhisper + +import ( + "time" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/whisper" +) + +func fromHex(s string) []byte { + if len(s) > 1 { + return ethutil.Hex2Bytes(s[2:]) + } + return nil +} +func toHex(b []byte) string { return "0x" + ethutil.Bytes2Hex(b) } + +type Whisper struct { + *whisper.Whisper +} + +func New(w *whisper.Whisper) *Whisper { + return &Whisper{w} +} + +func (self *Whisper) Post(data string, pow, ttl uint32, to, from string) { + msg := whisper.NewMessage(fromHex(data)) + envelope, err := msg.Seal(time.Duration(pow), whisper.Opts{ + Ttl: time.Duration(ttl), + To: crypto.ToECDSAPub(fromHex(to)), + From: crypto.ToECDSA(fromHex(from)), + }) + if err != nil { + // handle error + return + } + + if err := self.Whisper.Send(envelope); err != nil { + // handle error + return + } +} + +func (self *Whisper) NewIdentity() string { + return toHex(self.Whisper.NewIdentity().D.Bytes()) +} + +func (self *Whisper) HasIdentify(key string) bool { + return self.Whisper.HasIdentity(crypto.ToECDSA(fromHex(key))) +} + +func (self *Whisper) Watch(opts map[string]interface{}) { + filter := filterFromMap(opts) + filter.Fn = func(msg *whisper.Message) { + // TODO POST TO QT WINDOW + } + self.Whisper.Watch(filter) +} + +func filterFromMap(opts map[string]interface{}) (f whisper.Filter) { + if to, ok := opts["to"].(string); ok { + f.To = crypto.ToECDSA(fromHex(to)) + } + if from, ok := opts["from"].(string); ok { + f.From = crypto.ToECDSAPub(fromHex(from)) + } + + return +} diff --git a/utils/vm_env.go b/utils/vm_env.go deleted file mode 100644 index 30568c421..000000000 --- a/utils/vm_env.go +++ /dev/null @@ -1,35 +0,0 @@ -package utils - -import ( - "math/big" - - "github.com/ethereum/eth-go/ethchain" - "github.com/ethereum/eth-go/ethstate" -) - -type VMEnv struct { - state *ethstate.State - block *ethchain.Block - - transactor []byte - value *big.Int -} - -func NewEnv(state *ethstate.State, block *ethchain.Block, transactor []byte, value *big.Int) *VMEnv { - return &VMEnv{ - state: state, - block: block, - transactor: transactor, - value: value, - } -} - -func (self *VMEnv) Origin() []byte { return self.transactor } -func (self *VMEnv) BlockNumber() *big.Int { return self.block.Number } -func (self *VMEnv) PrevHash() []byte { return self.block.PrevHash } -func (self *VMEnv) Coinbase() []byte { return self.block.Coinbase } -func (self *VMEnv) Time() int64 { return self.block.Time } -func (self *VMEnv) Difficulty() *big.Int { return self.block.Difficulty } -func (self *VMEnv) BlockHash() []byte { return self.block.Hash() } -func (self *VMEnv) Value() *big.Int { return self.value } -func (self *VMEnv) State() *ethstate.State { return self.state } diff --git a/vm/.ethtest b/vm/.ethtest new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/vm/.ethtest diff --git a/vm/address.go b/vm/address.go new file mode 100644 index 000000000..611979c94 --- /dev/null +++ b/vm/address.go @@ -0,0 +1,56 @@ +package vm + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethutil" +) + +type Address interface { + Call(in []byte) []byte +} + +type PrecompiledAccount struct { + Gas func(l int) *big.Int + fn func(in []byte) []byte +} + +func (self PrecompiledAccount) Call(in []byte) []byte { + return self.fn(in) +} + +var Precompiled = map[string]*PrecompiledAccount{ + string(ethutil.LeftPadBytes([]byte{1}, 20)): &PrecompiledAccount{func(l int) *big.Int { + return GasEcrecover + }, ecrecoverFunc}, + string(ethutil.LeftPadBytes([]byte{2}, 20)): &PrecompiledAccount{func(l int) *big.Int { + n := big.NewInt(int64(l+31)/32 + 1) + n.Mul(n, GasSha256) + return n + }, sha256Func}, + string(ethutil.LeftPadBytes([]byte{3}, 20)): &PrecompiledAccount{func(l int) *big.Int { + n := big.NewInt(int64(l+31)/32 + 1) + n.Mul(n, GasRipemd) + return n + }, ripemd160Func}, +} + +func sha256Func(in []byte) []byte { + return crypto.Sha256(in) +} + +func ripemd160Func(in []byte) []byte { + return ethutil.LeftPadBytes(crypto.Ripemd160(in), 32) +} + +func ecrecoverFunc(in []byte) []byte { + // In case of an invalid sig. Defaults to return nil + defer func() { recover() }() + + hash := in[:32] + v := ethutil.BigD(in[32:64]).Bytes()[0] - 27 + sig := append(in[64:], v) + + return ethutil.LeftPadBytes(crypto.Sha3(crypto.Ecrecover(append(hash, sig...))[1:])[12:], 32) +} diff --git a/vm/analysis.go b/vm/analysis.go new file mode 100644 index 000000000..fef448b7b --- /dev/null +++ b/vm/analysis.go @@ -0,0 +1,35 @@ +package vm + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/ethutil" +) + +func analyseJumpDests(code []byte) (dests map[uint64]*big.Int) { + dests = make(map[uint64]*big.Int) + + lp := false + var lpv *big.Int + for pc := uint64(0); pc < uint64(len(code)); pc++ { + var op OpCode = OpCode(code[pc]) + switch op { + case PUSH1, PUSH2, PUSH3, PUSH4, PUSH5, PUSH6, PUSH7, PUSH8, PUSH9, PUSH10, PUSH11, PUSH12, PUSH13, PUSH14, PUSH15, PUSH16, PUSH17, PUSH18, PUSH19, PUSH20, PUSH21, PUSH22, PUSH23, PUSH24, PUSH25, PUSH26, PUSH27, PUSH28, PUSH29, PUSH30, PUSH31, PUSH32: + a := uint64(op) - uint64(PUSH1) + 1 + if uint64(len(code)) > pc+1+a { + lpv = ethutil.BigD(code[pc+1 : pc+1+a]) + } + + pc += a + lp = true + case JUMP, JUMPI: + if lp { + dests[pc] = lpv + } + + default: + lp = false + } + } + return +} diff --git a/vm/asm.go b/vm/asm.go new file mode 100644 index 000000000..a94f01d3d --- /dev/null +++ b/vm/asm.go @@ -0,0 +1,45 @@ +package vm + +import ( + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/ethutil" +) + +func Disassemble(script []byte) (asm []string) { + pc := new(big.Int) + for { + if pc.Cmp(big.NewInt(int64(len(script)))) >= 0 { + return + } + + // Get the memory location of pc + val := script[pc.Int64()] + // Get the opcode (it must be an opcode!) + op := OpCode(val) + + asm = append(asm, fmt.Sprintf("%v", op)) + + switch op { + case PUSH1, PUSH2, PUSH3, PUSH4, PUSH5, PUSH6, PUSH7, PUSH8, PUSH9, PUSH10, PUSH11, PUSH12, PUSH13, PUSH14, PUSH15, PUSH16, PUSH17, PUSH18, PUSH19, PUSH20, PUSH21, PUSH22, PUSH23, PUSH24, PUSH25, PUSH26, PUSH27, PUSH28, PUSH29, PUSH30, PUSH31, PUSH32: + pc.Add(pc, ethutil.Big1) + a := int64(op) - int64(PUSH1) + 1 + if int(pc.Int64()+a) > len(script) { + return nil + } + + data := script[pc.Int64() : pc.Int64()+a] + if len(data) == 0 { + data = []byte{0} + } + asm = append(asm, fmt.Sprintf("0x%x", data)) + + pc.Add(pc, big.NewInt(a-1)) + } + + pc.Add(pc, ethutil.Big1) + } + + return +} diff --git a/vm/closure.go b/vm/closure.go new file mode 100644 index 000000000..97b31ada0 --- /dev/null +++ b/vm/closure.go @@ -0,0 +1,107 @@ +package vm + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/state" +) + +type ClosureRef interface { + ReturnGas(*big.Int, *big.Int) + Address() []byte + SetCode([]byte) +} + +type Closure struct { + caller ClosureRef + object ClosureRef + Code []byte + message *state.Message + + Gas, UsedGas, Price *big.Int + + Args []byte +} + +// Create a new closure for the given data items +func NewClosure(msg *state.Message, caller ClosureRef, object ClosureRef, code []byte, gas, price *big.Int) *Closure { + c := &Closure{message: msg, caller: caller, object: object, Code: code, Args: nil} + + // Gas should be a pointer so it can safely be reduced through the run + // This pointer will be off the state transition + c.Gas = gas //new(big.Int).Set(gas) + // In most cases price and value are pointers to transaction objects + // and we don't want the transaction's values to change. + c.Price = new(big.Int).Set(price) + c.UsedGas = new(big.Int) + + return c +} + +func (c *Closure) GetOp(x uint64) OpCode { + return OpCode(c.GetByte(x)) +} + +func (c *Closure) GetByte(x uint64) byte { + if x < uint64(len(c.Code)) { + return c.Code[x] + } + + return 0 +} + +func (c *Closure) GetBytes(x, y int) []byte { + if x >= len(c.Code) || y >= len(c.Code) { + return nil + } + + return c.Code[x : x+y] +} + +func (c *Closure) GetRangeValue(x, y uint64) []byte { + if x >= uint64(len(c.Code)) || y >= uint64(len(c.Code)) { + return nil + } + + return c.Code[x : x+y] +} + +func (c *Closure) Return(ret []byte) []byte { + // Return the remaining gas to the caller + c.caller.ReturnGas(c.Gas, c.Price) + + return ret +} + +/* + * Gas functions + */ +func (c *Closure) UseGas(gas *big.Int) bool { + if c.Gas.Cmp(gas) < 0 { + return false + } + + // Sub the amount of gas from the remaining + c.Gas.Sub(c.Gas, gas) + c.UsedGas.Add(c.UsedGas, gas) + + return true +} + +// Implement the caller interface +func (c *Closure) ReturnGas(gas, price *big.Int) { + // Return the gas to the closure + c.Gas.Add(c.Gas, gas) + c.UsedGas.Sub(c.UsedGas, gas) +} + +/* + * Set / Get + */ +func (c *Closure) Address() []byte { + return c.object.Address() +} + +func (self *Closure) SetCode(code []byte) { + self.Code = code +} diff --git a/vm/common.go b/vm/common.go new file mode 100644 index 000000000..529bbdeb1 --- /dev/null +++ b/vm/common.go @@ -0,0 +1,75 @@ +package vm + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/logger" +) + +var vmlogger = logger.NewLogger("VM") + +type Type int + +const ( + StandardVmTy Type = iota + DebugVmTy + + MaxVmTy +) + +var ( + GasStep = big.NewInt(1) + GasSha = big.NewInt(10) + GasSLoad = big.NewInt(20) + GasSStore = big.NewInt(100) + GasSStoreRefund = big.NewInt(100) + GasBalance = big.NewInt(20) + GasCreate = big.NewInt(100) + GasCall = big.NewInt(20) + GasCreateByte = big.NewInt(5) + GasSha3Byte = big.NewInt(10) + GasSha256Byte = big.NewInt(50) + GasRipemdByte = big.NewInt(50) + GasMemory = big.NewInt(1) + GasData = big.NewInt(5) + GasTx = big.NewInt(500) + GasLog = big.NewInt(32) + GasSha256 = big.NewInt(50) + GasRipemd = big.NewInt(50) + GasEcrecover = big.NewInt(500) + + Pow256 = ethutil.BigPow(2, 256) + + LogTyPretty byte = 0x1 + LogTyDiff byte = 0x2 + + U256 = ethutil.U256 + S256 = ethutil.S256 +) + +const MaxCallDepth = 1024 + +func calcMemSize(off, l *big.Int) *big.Int { + if l.Cmp(ethutil.Big0) == 0 { + return ethutil.Big0 + } + + return new(big.Int).Add(off, l) +} + +// Simple helper +func u256(n int64) *big.Int { + return big.NewInt(n) +} + +// Mainly used for print variables and passing to Print* +func toValue(val *big.Int) interface{} { + // Let's assume a string on right padded zero's + b := val.Bytes() + if b[0] != 0 && b[len(b)-1] == 0x0 && b[len(b)-2] == 0x0 { + return string(b) + } + + return val +} diff --git a/vm/debugger.go b/vm/debugger.go new file mode 100644 index 000000000..9b08634c6 --- /dev/null +++ b/vm/debugger.go @@ -0,0 +1,10 @@ +package vm + +import "github.com/ethereum/go-ethereum/state" + +type Debugger interface { + BreakHook(step int, op OpCode, mem *Memory, stack *Stack, object *state.StateObject) bool + StepHook(step int, op OpCode, mem *Memory, stack *Stack, object *state.StateObject) bool + BreakPoints() []int64 + SetCode(byteCode []byte) +} diff --git a/vm/environment.go b/vm/environment.go new file mode 100644 index 000000000..969bc5e43 --- /dev/null +++ b/vm/environment.go @@ -0,0 +1,81 @@ +package vm + +import ( + "errors" + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/state" +) + +type Environment interface { + State() *state.StateDB + + Origin() []byte + BlockNumber() *big.Int + PrevHash() []byte + Coinbase() []byte + Time() int64 + Difficulty() *big.Int + BlockHash() []byte + GasLimit() *big.Int + Transfer(from, to Account, amount *big.Int) error + AddLog(state.Log) + + Depth() int + SetDepth(i int) + + Call(me ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) + CallCode(me ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) + Create(me ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error, ClosureRef) +} + +type Object interface { + GetStorage(key *big.Int) *ethutil.Value + SetStorage(key *big.Int, value *ethutil.Value) +} + +type Account interface { + SubBalance(amount *big.Int) + AddBalance(amount *big.Int) + Balance() *big.Int +} + +// generic transfer method +func Transfer(from, to Account, amount *big.Int) error { + if from.Balance().Cmp(amount) < 0 { + return errors.New("Insufficient balance in account") + } + + from.SubBalance(amount) + to.AddBalance(amount) + + return nil +} + +type Log struct { + address []byte + topics [][]byte + data []byte +} + +func (self *Log) Address() []byte { + return self.address +} + +func (self *Log) Topics() [][]byte { + return self.topics +} + +func (self *Log) Data() []byte { + return self.data +} + +func (self *Log) RlpData() interface{} { + return []interface{}{self.address, ethutil.ByteSliceToInterface(self.topics), self.data} +} + +func (self *Log) String() string { + return fmt.Sprintf("[A=%x T=%x D=%x]", self.address, self.topics, self.data) +} diff --git a/vm/errors.go b/vm/errors.go new file mode 100644 index 000000000..ab011bd62 --- /dev/null +++ b/vm/errors.go @@ -0,0 +1,51 @@ +package vm + +import ( + "fmt" + "math/big" +) + +type OutOfGasError struct { + req, has *big.Int +} + +func OOG(req, has *big.Int) OutOfGasError { + return OutOfGasError{req, has} +} + +func (self OutOfGasError) Error() string { + return fmt.Sprintf("out of gas! require %v, have %v", self.req, self.has) +} + +func IsOOGErr(err error) bool { + _, ok := err.(OutOfGasError) + return ok +} + +type StackError struct { + req, has int +} + +func StackErr(req, has int) StackError { + return StackError{req, has} +} + +func (self StackError) Error() string { + return fmt.Sprintf("stack error! require %v, have %v", self.req, self.has) +} + +func IsStack(err error) bool { + _, ok := err.(StackError) + return ok +} + +type DepthError struct{} + +func (self DepthError) Error() string { + return fmt.Sprintf("Max call depth exceeded (%d)", MaxCallDepth) +} + +func IsDepthErr(err error) bool { + _, ok := err.(DepthError) + return ok +} diff --git a/vm/main_test.go b/vm/main_test.go new file mode 100644 index 000000000..0ae03bf6a --- /dev/null +++ b/vm/main_test.go @@ -0,0 +1,9 @@ +package vm + +import ( + "testing" + + checker "gopkg.in/check.v1" +) + +func Test(t *testing.T) { checker.TestingT(t) } diff --git a/vm/stack.go b/vm/stack.go new file mode 100644 index 000000000..6091479cb --- /dev/null +++ b/vm/stack.go @@ -0,0 +1,179 @@ +package vm + +import ( + "fmt" + "math" + "math/big" +) + +type OpType int + +const ( + tNorm = iota + tData + tExtro + tCrypto +) + +type TxCallback func(opType OpType) bool + +// Simple push/pop stack mechanism +type Stack struct { + data []*big.Int +} + +func NewStack() *Stack { + return &Stack{} +} + +func (st *Stack) Data() []*big.Int { + return st.data +} + +func (st *Stack) Len() int { + return len(st.data) +} + +func (st *Stack) Pop() *big.Int { + str := st.data[len(st.data)-1] + + copy(st.data[:len(st.data)-1], st.data[:len(st.data)-1]) + st.data = st.data[:len(st.data)-1] + + return str +} + +func (st *Stack) Popn() (*big.Int, *big.Int) { + ints := st.data[len(st.data)-2:] + + copy(st.data[:len(st.data)-2], st.data[:len(st.data)-2]) + st.data = st.data[:len(st.data)-2] + + return ints[0], ints[1] +} + +func (st *Stack) Peek() *big.Int { + str := st.data[len(st.data)-1] + + return str +} + +func (st *Stack) Peekn() (*big.Int, *big.Int) { + ints := st.data[len(st.data)-2:] + + return ints[0], ints[1] +} + +func (st *Stack) Swapn(n int) (*big.Int, *big.Int) { + st.data[len(st.data)-n], st.data[len(st.data)-1] = st.data[len(st.data)-1], st.data[len(st.data)-n] + + return st.data[len(st.data)-n], st.data[len(st.data)-1] +} + +func (st *Stack) Dupn(n int) *big.Int { + st.Push(st.data[len(st.data)-n]) + + return st.Peek() +} + +func (st *Stack) Push(d *big.Int) { + st.data = append(st.data, new(big.Int).Set(d)) +} + +func (st *Stack) Get(amount *big.Int) []*big.Int { + // offset + size <= len(data) + length := big.NewInt(int64(len(st.data))) + if amount.Cmp(length) <= 0 { + start := new(big.Int).Sub(length, amount) + return st.data[start.Int64():length.Int64()] + } + + return nil +} + +func (st *Stack) Print() { + fmt.Println("### stack ###") + if len(st.data) > 0 { + for i, val := range st.data { + fmt.Printf("%-3d %v\n", i, val) + } + } else { + fmt.Println("-- empty --") + } + fmt.Println("#############") +} + +type Memory struct { + store []byte +} + +func NewMemory() *Memory { + return &Memory{nil} +} + +func (m *Memory) Set(offset, size uint64, value []byte) { + if len(value) > 0 { + totSize := offset + size + lenSize := uint64(len(m.store) - 1) + if totSize > lenSize { + // Calculate the diff between the sizes + diff := totSize - lenSize + if diff > 0 { + // Create a new empty slice and append it + newSlice := make([]byte, diff-1) + // Resize slice + m.store = append(m.store, newSlice...) + } + } + copy(m.store[offset:offset+size], value) + } +} + +func (m *Memory) Resize(size uint64) { + if uint64(m.Len()) < size { + m.store = append(m.store, make([]byte, size-uint64(m.Len()))...) + } +} + +func (m *Memory) Get(offset, size int64) []byte { + if len(m.store) > int(offset) { + end := int(math.Min(float64(len(m.store)), float64(offset+size))) + + return m.store[offset:end] + } + + return nil +} + +func (self *Memory) Geti(offset, size int64) (cpy []byte) { + if len(self.store) > int(offset) { + cpy = make([]byte, size) + copy(cpy, self.store[offset:offset+size]) + + return + } + + return +} + +func (m *Memory) Len() int { + return len(m.store) +} + +func (m *Memory) Data() []byte { + return m.store +} + +func (m *Memory) Print() { + fmt.Printf("### mem %d bytes ###\n", len(m.store)) + if len(m.store) > 0 { + addr := 0 + for i := 0; i+32 <= len(m.store); i += 32 { + fmt.Printf("%03d: % x\n", addr, m.store[i:i+32]) + addr++ + } + } else { + fmt.Println("-- empty --") + } + fmt.Println("####################") +} diff --git a/vm/types.go b/vm/types.go new file mode 100644 index 000000000..ec9c7e74e --- /dev/null +++ b/vm/types.go @@ -0,0 +1,334 @@ +package vm + +import ( + "fmt" +) + +type OpCode byte + +// Op codes +const ( + // 0x0 range - arithmetic ops + STOP OpCode = iota + ADD + MUL + SUB + DIV + SDIV + MOD + SMOD + ADDMOD + MULMOD + EXP + SIGNEXTEND +) + +const ( + LT OpCode = iota + 0x10 + GT + SLT + SGT + EQ + ISZERO + AND + OR + XOR + NOT + BYTE + + SHA3 = 0x20 +) + +const ( + // 0x30 range - closure state + ADDRESS OpCode = 0x30 + iota + BALANCE + ORIGIN + CALLER + CALLVALUE + CALLDATALOAD + CALLDATASIZE + CALLDATACOPY + CODESIZE + CODECOPY + GASPRICE + EXTCODESIZE + EXTCODECOPY +) + +const ( + + // 0x40 range - block operations + PREVHASH OpCode = 0x40 + iota + COINBASE + TIMESTAMP + NUMBER + DIFFICULTY + GASLIMIT +) + +const ( + // 0x50 range - 'storage' and execution + POP OpCode = 0x50 + iota + MLOAD + MSTORE + MSTORE8 + SLOAD + SSTORE + JUMP + JUMPI + PC + MSIZE + GAS + JUMPDEST +) + +const ( + // 0x60 range + PUSH1 OpCode = 0x60 + iota + PUSH2 + PUSH3 + PUSH4 + PUSH5 + PUSH6 + PUSH7 + PUSH8 + PUSH9 + PUSH10 + PUSH11 + PUSH12 + PUSH13 + PUSH14 + PUSH15 + PUSH16 + PUSH17 + PUSH18 + PUSH19 + PUSH20 + PUSH21 + PUSH22 + PUSH23 + PUSH24 + PUSH25 + PUSH26 + PUSH27 + PUSH28 + PUSH29 + PUSH30 + PUSH31 + PUSH32 + DUP1 + DUP2 + DUP3 + DUP4 + DUP5 + DUP6 + DUP7 + DUP8 + DUP9 + DUP10 + DUP11 + DUP12 + DUP13 + DUP14 + DUP15 + DUP16 + SWAP1 + SWAP2 + SWAP3 + SWAP4 + SWAP5 + SWAP6 + SWAP7 + SWAP8 + SWAP9 + SWAP10 + SWAP11 + SWAP12 + SWAP13 + SWAP14 + SWAP15 + SWAP16 +) + +const ( + LOG0 OpCode = 0xa0 + iota + LOG1 + LOG2 + LOG3 + LOG4 +) + +const ( + // 0xf0 range - closures + CREATE OpCode = 0xf0 + iota + CALL + CALLCODE + RETURN + + // 0x70 range - other + SUICIDE = 0xff +) + +// Since the opcodes aren't all in order we can't use a regular slice +var opCodeToString = map[OpCode]string{ + // 0x0 range - arithmetic ops + STOP: "STOP", + ADD: "ADD", + MUL: "MUL", + SUB: "SUB", + DIV: "DIV", + SDIV: "SDIV", + MOD: "MOD", + SMOD: "SMOD", + EXP: "EXP", + NOT: "NOT", + LT: "LT", + GT: "GT", + SLT: "SLT", + SGT: "SGT", + EQ: "EQ", + ISZERO: "ISZERO", + SIGNEXTEND: "SIGNEXTEND", + + // 0x10 range - bit ops + AND: "AND", + OR: "OR", + XOR: "XOR", + BYTE: "BYTE", + ADDMOD: "ADDMOD", + MULMOD: "MULMOD", + + // 0x20 range - crypto + SHA3: "SHA3", + + // 0x30 range - closure state + ADDRESS: "ADDRESS", + BALANCE: "BALANCE", + ORIGIN: "ORIGIN", + CALLER: "CALLER", + CALLVALUE: "CALLVALUE", + CALLDATALOAD: "CALLDATALOAD", + CALLDATASIZE: "CALLDATASIZE", + CALLDATACOPY: "CALLDATACOPY", + CODESIZE: "CODESIZE", + CODECOPY: "CODECOPY", + GASPRICE: "TXGASPRICE", + + // 0x40 range - block operations + PREVHASH: "PREVHASH", + COINBASE: "COINBASE", + TIMESTAMP: "TIMESTAMP", + NUMBER: "NUMBER", + DIFFICULTY: "DIFFICULTY", + GASLIMIT: "GASLIMIT", + EXTCODESIZE: "EXTCODESIZE", + EXTCODECOPY: "EXTCODECOPY", + + // 0x50 range - 'storage' and execution + POP: "POP", + //DUP: "DUP", + //SWAP: "SWAP", + MLOAD: "MLOAD", + MSTORE: "MSTORE", + MSTORE8: "MSTORE8", + SLOAD: "SLOAD", + SSTORE: "SSTORE", + JUMP: "JUMP", + JUMPI: "JUMPI", + PC: "PC", + MSIZE: "MSIZE", + GAS: "GAS", + JUMPDEST: "JUMPDEST", + + // 0x60 range - push + PUSH1: "PUSH1", + PUSH2: "PUSH2", + PUSH3: "PUSH3", + PUSH4: "PUSH4", + PUSH5: "PUSH5", + PUSH6: "PUSH6", + PUSH7: "PUSH7", + PUSH8: "PUSH8", + PUSH9: "PUSH9", + PUSH10: "PUSH10", + PUSH11: "PUSH11", + PUSH12: "PUSH12", + PUSH13: "PUSH13", + PUSH14: "PUSH14", + PUSH15: "PUSH15", + PUSH16: "PUSH16", + PUSH17: "PUSH17", + PUSH18: "PUSH18", + PUSH19: "PUSH19", + PUSH20: "PUSH20", + PUSH21: "PUSH21", + PUSH22: "PUSH22", + PUSH23: "PUSH23", + PUSH24: "PUSH24", + PUSH25: "PUSH25", + PUSH26: "PUSH26", + PUSH27: "PUSH27", + PUSH28: "PUSH28", + PUSH29: "PUSH29", + PUSH30: "PUSH30", + PUSH31: "PUSH31", + PUSH32: "PUSH32", + + DUP1: "DUP1", + DUP2: "DUP2", + DUP3: "DUP3", + DUP4: "DUP4", + DUP5: "DUP5", + DUP6: "DUP6", + DUP7: "DUP7", + DUP8: "DUP8", + DUP9: "DUP9", + DUP10: "DUP10", + DUP11: "DUP11", + DUP12: "DUP12", + DUP13: "DUP13", + DUP14: "DUP14", + DUP15: "DUP15", + DUP16: "DUP16", + + SWAP1: "SWAP1", + SWAP2: "SWAP2", + SWAP3: "SWAP3", + SWAP4: "SWAP4", + SWAP5: "SWAP5", + SWAP6: "SWAP6", + SWAP7: "SWAP7", + SWAP8: "SWAP8", + SWAP9: "SWAP9", + SWAP10: "SWAP10", + SWAP11: "SWAP11", + SWAP12: "SWAP12", + SWAP13: "SWAP13", + SWAP14: "SWAP14", + SWAP15: "SWAP15", + SWAP16: "SWAP16", + LOG0: "LOG0", + LOG1: "LOG1", + LOG2: "LOG2", + LOG3: "LOG3", + LOG4: "LOG4", + + // 0xf0 range + CREATE: "CREATE", + CALL: "CALL", + RETURN: "RETURN", + CALLCODE: "CALLCODE", + + // 0x70 range - other + SUICIDE: "SUICIDE", +} + +func (o OpCode) String() string { + str := opCodeToString[o] + if len(str) == 0 { + return fmt.Sprintf("Missing opcode 0x%x", int(o)) + } + + return str +} diff --git a/vm/virtual_machine.go b/vm/virtual_machine.go new file mode 100644 index 000000000..3b6f98ab2 --- /dev/null +++ b/vm/virtual_machine.go @@ -0,0 +1,10 @@ +package vm + +import "math/big" + +type VirtualMachine interface { + Env() Environment + Run(me, caller ClosureRef, code []byte, value, gas, price *big.Int, data []byte) ([]byte, error) + Printf(string, ...interface{}) VirtualMachine + Endl() VirtualMachine +} diff --git a/vm/vm.go b/vm/vm.go new file mode 100644 index 000000000..22172cb3a --- /dev/null +++ b/vm/vm.go @@ -0,0 +1,36 @@ +package vm + +import "math/big" + +// BIG FAT WARNING. THIS VM IS NOT YET IS USE! +// I want to get all VM tests pass first before updating this VM + +type Vm struct { + env Environment + err error + depth int +} + +func New(env Environment, typ Type) VirtualMachine { + switch typ { + case DebugVmTy: + return NewDebugVm(env) + default: + return &Vm{env: env} + } +} + +func (self *Vm) Run(me, caller ClosureRef, code []byte, value, gas, price *big.Int, data []byte) (ret []byte, err error) { + panic("not implemented") +} + +func (self *Vm) Env() Environment { + return self.env +} + +func (self *Vm) Depth() int { + return self.depth +} + +func (self *Vm) Printf(format string, v ...interface{}) VirtualMachine { return self } +func (self *Vm) Endl() VirtualMachine { return self } diff --git a/vm/vm_debug.go b/vm/vm_debug.go new file mode 100644 index 000000000..aa3291e66 --- /dev/null +++ b/vm/vm_debug.go @@ -0,0 +1,983 @@ +package vm + +import ( + "fmt" + "math" + "math/big" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/state" +) + +type DebugVm struct { + env Environment + + logTy byte + logStr string + + err error + + // Debugging + Dbg Debugger + + BreakPoints []int64 + Stepping bool + Fn string + + Recoverable bool +} + +func NewDebugVm(env Environment) *DebugVm { + lt := LogTyPretty + if ethutil.Config.Diff { + lt = LogTyDiff + } + + return &DebugVm{env: env, logTy: lt, Recoverable: true} +} + +func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price *big.Int, callData []byte) (ret []byte, err error) { + self.env.SetDepth(self.env.Depth() + 1) + + msg := self.env.State().Manifest().AddMessage(&state.Message{ + To: me.Address(), From: caller.Address(), + Input: callData, + Origin: self.env.Origin(), + Block: self.env.BlockHash(), Timestamp: self.env.Time(), Coinbase: self.env.Coinbase(), Number: self.env.BlockNumber(), + Value: value, + }) + closure := NewClosure(msg, caller, me, code, gas, price) + + if p := Precompiled[string(me.Address())]; p != nil { + return self.RunPrecompiled(p, callData, closure) + } + + if self.Recoverable { + // Recover from any require exception + defer func() { + if r := recover(); r != nil { + self.Endl() + + closure.UseGas(closure.Gas) + + ret = closure.Return(nil) + + err = fmt.Errorf("%v", r) + + } + }() + } + + var ( + op OpCode + + destinations = analyseJumpDests(closure.Code) + mem = NewMemory() + stack = NewStack() + pc uint64 = 0 + step = 0 + prevStep = 0 + statedb = self.env.State() + require = func(m int) { + if stack.Len() < m { + panic(fmt.Sprintf("%04v (%v) stack err size = %d, required = %d", pc, op, stack.Len(), m)) + } + } + + jump = func(from uint64, to *big.Int) { + p := to.Uint64() + + self.Printf(" ~> %v", to) + // Return to start + if p == 0 { + pc = 0 + } else { + nop := OpCode(closure.GetOp(p)) + if !(nop == JUMPDEST || destinations[from] != nil) { + panic(fmt.Sprintf("invalid jump destination (%v) %v", nop, p)) + } else if nop == JUMP || nop == JUMPI { + panic(fmt.Sprintf("not allowed to JUMP(I) in to JUMP")) + } + + pc = to.Uint64() + + } + + self.Endl() + } + ) + + vmlogger.Debugf("(%d) (%x) %x (code=%d) gas: %v (d) %x\n", self.env.Depth(), caller.Address()[:4], closure.Address(), len(code), closure.Gas, callData) + + // Don't bother with the execution if there's no code. + if len(code) == 0 { + return closure.Return(nil), nil + } + + for { + prevStep = step + // The base for all big integer arithmetic + base := new(big.Int) + + step++ + // Get the memory location of pc + op = closure.GetOp(pc) + + gas := new(big.Int) + addStepGasUsage := func(amount *big.Int) { + if amount.Cmp(ethutil.Big0) >= 0 { + gas.Add(gas, amount) + } + } + + addStepGasUsage(GasStep) + + var newMemSize *big.Int = ethutil.Big0 + var additionalGas *big.Int = new(big.Int) + // Stack Check, memory resize & gas phase + switch op { + // Stack checks only + case ISZERO, CALLDATALOAD, POP, JUMP, NOT: // 1 + require(1) + case ADD, SUB, DIV, SDIV, MOD, SMOD, LT, GT, SLT, SGT, EQ, AND, OR, XOR, BYTE: // 2 + require(2) + case ADDMOD, MULMOD: // 3 + require(3) + case SWAP1, SWAP2, SWAP3, SWAP4, SWAP5, SWAP6, SWAP7, SWAP8, SWAP9, SWAP10, SWAP11, SWAP12, SWAP13, SWAP14, SWAP15, SWAP16: + n := int(op - SWAP1 + 2) + require(n) + case DUP1, DUP2, DUP3, DUP4, DUP5, DUP6, DUP7, DUP8, DUP9, DUP10, DUP11, DUP12, DUP13, DUP14, DUP15, DUP16: + n := int(op - DUP1 + 1) + require(n) + case LOG0, LOG1, LOG2, LOG3, LOG4: + n := int(op - LOG0) + require(n + 2) + + gas.Set(GasLog) + addStepGasUsage(new(big.Int).Mul(big.NewInt(int64(n)), GasLog)) + + mSize, mStart := stack.Peekn() + addStepGasUsage(mSize) + + newMemSize = calcMemSize(mStart, mSize) + case EXP: + require(2) + + gas.Set(big.NewInt(int64(len(stack.data[stack.Len()-2].Bytes()) + 1))) + // Gas only + case STOP: + gas.Set(ethutil.Big0) + case SUICIDE: + require(1) + + gas.Set(ethutil.Big0) + case SLOAD: + require(1) + + gas.Set(GasSLoad) + // Memory resize & Gas + case SSTORE: + require(2) + + var mult *big.Int + y, x := stack.Peekn() + val := statedb.GetState(closure.Address(), x.Bytes()) + if len(val) == 0 && len(y.Bytes()) > 0 { + // 0 => non 0 + mult = ethutil.Big3 + } else if len(val) > 0 && len(y.Bytes()) == 0 { + statedb.Refund(caller.Address(), GasSStoreRefund) + + mult = ethutil.Big0 + } else { + // non 0 => non 0 (or 0 => 0) + mult = ethutil.Big1 + } + gas.Set(new(big.Int).Mul(mult, GasSStore)) + case BALANCE: + require(1) + gas.Set(GasBalance) + case MSTORE: + require(2) + newMemSize = calcMemSize(stack.Peek(), u256(32)) + case MLOAD: + require(1) + + newMemSize = calcMemSize(stack.Peek(), u256(32)) + case MSTORE8: + require(2) + newMemSize = calcMemSize(stack.Peek(), u256(1)) + case RETURN: + require(2) + + newMemSize = calcMemSize(stack.Peek(), stack.data[stack.Len()-2]) + case SHA3: + require(2) + gas.Set(GasSha) + newMemSize = calcMemSize(stack.Peek(), stack.data[stack.Len()-2]) + additionalGas.Set(stack.data[stack.Len()-2]) + case CALLDATACOPY: + require(2) + + newMemSize = calcMemSize(stack.Peek(), stack.data[stack.Len()-3]) + additionalGas.Set(stack.data[stack.Len()-3]) + case CODECOPY: + require(3) + + newMemSize = calcMemSize(stack.Peek(), stack.data[stack.Len()-3]) + additionalGas.Set(stack.data[stack.Len()-3]) + case EXTCODECOPY: + require(4) + + newMemSize = calcMemSize(stack.data[stack.Len()-2], stack.data[stack.Len()-4]) + additionalGas.Set(stack.data[stack.Len()-4]) + case CALL, CALLCODE: + require(7) + gas.Set(GasCall) + addStepGasUsage(stack.data[stack.Len()-1]) + + x := calcMemSize(stack.data[stack.Len()-6], stack.data[stack.Len()-7]) + y := calcMemSize(stack.data[stack.Len()-4], stack.data[stack.Len()-5]) + + newMemSize = ethutil.BigMax(x, y) + case CREATE: + require(3) + gas.Set(GasCreate) + + newMemSize = calcMemSize(stack.data[stack.Len()-2], stack.data[stack.Len()-3]) + } + + switch op { + case CALLDATACOPY, CODECOPY, EXTCODECOPY: + additionalGas.Add(additionalGas, u256(31)) + additionalGas.Div(additionalGas, u256(32)) + addStepGasUsage(additionalGas) + case SHA3: + additionalGas.Add(additionalGas, u256(31)) + additionalGas.Div(additionalGas, u256(32)) + additionalGas.Mul(additionalGas, GasSha3Byte) + addStepGasUsage(additionalGas) + } + + if newMemSize.Cmp(ethutil.Big0) > 0 { + newMemSize.Add(newMemSize, u256(31)) + newMemSize.Div(newMemSize, u256(32)) + newMemSize.Mul(newMemSize, u256(32)) + + if newMemSize.Cmp(u256(int64(mem.Len()))) > 0 { + memGasUsage := new(big.Int).Sub(newMemSize, u256(int64(mem.Len()))) + memGasUsage.Mul(GasMemory, memGasUsage) + memGasUsage.Div(memGasUsage, u256(32)) + + addStepGasUsage(memGasUsage) + + } + + } + + self.Printf("(pc) %-3d -o- %-14s", pc, op.String()) + self.Printf(" (m) %-4d (s) %-4d (g) %-3v (%v)", mem.Len(), stack.Len(), gas, closure.Gas) + + if !closure.UseGas(gas) { + self.Endl() + + tmp := new(big.Int).Set(closure.Gas) + + closure.UseGas(closure.Gas) + + return closure.Return(nil), OOG(gas, tmp) + } + + mem.Resize(newMemSize.Uint64()) + + switch op { + // 0x20 range + case ADD: + x, y := stack.Popn() + self.Printf(" %v + %v", y, x) + + base.Add(y, x) + + U256(base) + + self.Printf(" = %v", base) + // Pop result back on the stack + stack.Push(base) + case SUB: + x, y := stack.Popn() + self.Printf(" %v - %v", y, x) + + base.Sub(y, x) + + U256(base) + + self.Printf(" = %v", base) + // Pop result back on the stack + stack.Push(base) + case MUL: + x, y := stack.Popn() + self.Printf(" %v * %v", y, x) + + base.Mul(y, x) + + U256(base) + + self.Printf(" = %v", base) + // Pop result back on the stack + stack.Push(base) + case DIV: + x, y := stack.Pop(), stack.Pop() + self.Printf(" %v / %v", x, y) + + if y.Cmp(ethutil.Big0) != 0 { + base.Div(x, y) + } + + U256(base) + + self.Printf(" = %v", base) + // Pop result back on the stack + stack.Push(base) + case SDIV: + x, y := S256(stack.Pop()), S256(stack.Pop()) + + self.Printf(" %v / %v", x, y) + + if y.Cmp(ethutil.Big0) == 0 { + base.Set(ethutil.Big0) + } else { + n := new(big.Int) + if new(big.Int).Mul(x, y).Cmp(ethutil.Big0) < 0 { + n.SetInt64(-1) + } else { + n.SetInt64(1) + } + + base.Div(x.Abs(x), y.Abs(y)).Mul(base, n) + + U256(base) + } + + self.Printf(" = %v", base) + stack.Push(base) + case MOD: + x, y := stack.Pop(), stack.Pop() + + self.Printf(" %v %% %v", x, y) + + if y.Cmp(ethutil.Big0) == 0 { + base.Set(ethutil.Big0) + } else { + base.Mod(x, y) + } + + U256(base) + + self.Printf(" = %v", base) + stack.Push(base) + case SMOD: + x, y := S256(stack.Pop()), S256(stack.Pop()) + + self.Printf(" %v %% %v", x, y) + + if y.Cmp(ethutil.Big0) == 0 { + base.Set(ethutil.Big0) + } else { + n := new(big.Int) + if x.Cmp(ethutil.Big0) < 0 { + n.SetInt64(-1) + } else { + n.SetInt64(1) + } + + base.Mod(x.Abs(x), y.Abs(y)).Mul(base, n) + + U256(base) + } + + self.Printf(" = %v", base) + stack.Push(base) + + case EXP: + x, y := stack.Popn() + + self.Printf(" %v ** %v", y, x) + + base.Exp(y, x, Pow256) + + U256(base) + + self.Printf(" = %v", base) + + stack.Push(base) + case SIGNEXTEND: + back := stack.Pop().Uint64() + if back < 31 { + bit := uint(back*8 + 7) + num := stack.Pop() + mask := new(big.Int).Lsh(ethutil.Big1, bit) + mask.Sub(mask, ethutil.Big1) + if ethutil.BitTest(num, int(bit)) { + num.Or(num, mask.Not(mask)) + } else { + num.And(num, mask) + } + + num = U256(num) + + self.Printf(" = %v", num) + + stack.Push(num) + } + case NOT: + base.Sub(Pow256, stack.Pop()).Sub(base, ethutil.Big1) + + // Not needed + //base = U256(base) + + stack.Push(base) + case LT: + x, y := stack.Popn() + self.Printf(" %v < %v", y, x) + // x < y + if y.Cmp(x) < 0 { + stack.Push(ethutil.BigTrue) + } else { + stack.Push(ethutil.BigFalse) + } + case GT: + x, y := stack.Popn() + self.Printf(" %v > %v", y, x) + + // x > y + if y.Cmp(x) > 0 { + stack.Push(ethutil.BigTrue) + } else { + stack.Push(ethutil.BigFalse) + } + + case SLT: + y, x := S256(stack.Pop()), S256(stack.Pop()) + self.Printf(" %v < %v", y, x) + // x < y + if y.Cmp(S256(x)) < 0 { + stack.Push(ethutil.BigTrue) + } else { + stack.Push(ethutil.BigFalse) + } + case SGT: + y, x := S256(stack.Pop()), S256(stack.Pop()) + self.Printf(" %v > %v", y, x) + + // x > y + if y.Cmp(x) > 0 { + stack.Push(ethutil.BigTrue) + } else { + stack.Push(ethutil.BigFalse) + } + + case EQ: + x, y := stack.Popn() + self.Printf(" %v == %v", y, x) + + // x == y + if x.Cmp(y) == 0 { + stack.Push(ethutil.BigTrue) + } else { + stack.Push(ethutil.BigFalse) + } + case ISZERO: + x := stack.Pop() + if x.Cmp(ethutil.BigFalse) > 0 { + stack.Push(ethutil.BigFalse) + } else { + stack.Push(ethutil.BigTrue) + } + + // 0x10 range + case AND: + x, y := stack.Popn() + self.Printf(" %v & %v", y, x) + + stack.Push(base.And(y, x)) + case OR: + x, y := stack.Popn() + self.Printf(" %v | %v", y, x) + + stack.Push(base.Or(y, x)) + case XOR: + x, y := stack.Popn() + self.Printf(" %v ^ %v", y, x) + + stack.Push(base.Xor(y, x)) + case BYTE: + val, th := stack.Popn() + + if th.Cmp(big.NewInt(32)) < 0 { + byt := big.NewInt(int64(ethutil.LeftPadBytes(val.Bytes(), 32)[th.Int64()])) + + base.Set(byt) + } else { + base.Set(ethutil.BigFalse) + } + + self.Printf(" => 0x%x", base.Bytes()) + + stack.Push(base) + case ADDMOD: + + x := stack.Pop() + y := stack.Pop() + z := stack.Pop() + + base.Add(x, y) + base.Mod(base, z) + + U256(base) + + self.Printf(" = %v", base) + + stack.Push(base) + case MULMOD: + + x := stack.Pop() + y := stack.Pop() + z := stack.Pop() + + base.Mul(x, y) + base.Mod(base, z) + + U256(base) + + self.Printf(" = %v", base) + + stack.Push(base) + + // 0x20 range + case SHA3: + size, offset := stack.Popn() + data := crypto.Sha3(mem.Get(offset.Int64(), size.Int64())) + + stack.Push(ethutil.BigD(data)) + + self.Printf(" => %x", data) + // 0x30 range + case ADDRESS: + stack.Push(ethutil.BigD(closure.Address())) + + self.Printf(" => %x", closure.Address()) + case BALANCE: + + addr := stack.Pop().Bytes() + balance := statedb.GetBalance(addr) + + stack.Push(balance) + + self.Printf(" => %v (%x)", balance, addr) + case ORIGIN: + origin := self.env.Origin() + + stack.Push(ethutil.BigD(origin)) + + self.Printf(" => %x", origin) + case CALLER: + caller := closure.caller.Address() + stack.Push(ethutil.BigD(caller)) + + self.Printf(" => %x", caller) + case CALLVALUE: + stack.Push(value) + + self.Printf(" => %v", value) + case CALLDATALOAD: + var ( + offset = stack.Pop() + data = make([]byte, 32) + lenData = big.NewInt(int64(len(callData))) + ) + + if lenData.Cmp(offset) >= 0 { + length := new(big.Int).Add(offset, ethutil.Big32) + length = ethutil.BigMin(length, lenData) + + copy(data, callData[offset.Int64():length.Int64()]) + } + + self.Printf(" => 0x%x", data) + + stack.Push(ethutil.BigD(data)) + case CALLDATASIZE: + l := int64(len(callData)) + stack.Push(big.NewInt(l)) + + self.Printf(" => %d", l) + case CALLDATACOPY: + var ( + size = uint64(len(callData)) + mOff = stack.Pop().Uint64() + cOff = stack.Pop().Uint64() + l = stack.Pop().Uint64() + ) + + if cOff > size { + cOff = 0 + l = 0 + } else if cOff+l > size { + l = 0 + } + + code := callData[cOff : cOff+l] + + mem.Set(mOff, l, code) + + self.Printf(" => [%v, %v, %v] %x", mOff, cOff, l, callData[cOff:cOff+l]) + case CODESIZE, EXTCODESIZE: + var code []byte + if op == EXTCODESIZE { + addr := stack.Pop().Bytes() + + code = statedb.GetCode(addr) + } else { + code = closure.Code + } + + l := big.NewInt(int64(len(code))) + stack.Push(l) + + self.Printf(" => %d", l) + case CODECOPY, EXTCODECOPY: + var code []byte + if op == EXTCODECOPY { + code = statedb.GetCode(stack.Pop().Bytes()) + } else { + code = closure.Code + } + + var ( + size = uint64(len(code)) + mOff = stack.Pop().Uint64() + cOff = stack.Pop().Uint64() + l = stack.Pop().Uint64() + ) + + if cOff > size { + cOff = 0 + l = 0 + } else if cOff+l > size { + l = uint64(math.Min(float64(cOff+l), float64(size))) + } + codeCopy := code[cOff : cOff+l] + + mem.Set(mOff, l, codeCopy) + + self.Printf(" => [%v, %v, %v] %x", mOff, cOff, l, codeCopy) + case GASPRICE: + stack.Push(closure.Price) + + self.Printf(" => %v", closure.Price) + + // 0x40 range + case PREVHASH: + prevHash := self.env.PrevHash() + + stack.Push(ethutil.BigD(prevHash)) + + self.Printf(" => 0x%x", prevHash) + case COINBASE: + coinbase := self.env.Coinbase() + + stack.Push(ethutil.BigD(coinbase)) + + self.Printf(" => 0x%x", coinbase) + case TIMESTAMP: + time := self.env.Time() + + stack.Push(big.NewInt(time)) + + self.Printf(" => 0x%x", time) + case NUMBER: + number := self.env.BlockNumber() + + stack.Push(number) + + self.Printf(" => 0x%x", number.Bytes()) + case DIFFICULTY: + difficulty := self.env.Difficulty() + + stack.Push(difficulty) + + self.Printf(" => 0x%x", difficulty.Bytes()) + case GASLIMIT: + stack.Push(self.env.GasLimit()) + + // 0x50 range + case PUSH1, PUSH2, PUSH3, PUSH4, PUSH5, PUSH6, PUSH7, PUSH8, PUSH9, PUSH10, PUSH11, PUSH12, PUSH13, PUSH14, PUSH15, PUSH16, PUSH17, PUSH18, PUSH19, PUSH20, PUSH21, PUSH22, PUSH23, PUSH24, PUSH25, PUSH26, PUSH27, PUSH28, PUSH29, PUSH30, PUSH31, PUSH32: + //a := big.NewInt(int64(op) - int64(PUSH1) + 1) + a := uint64(op - PUSH1 + 1) + //pc.Add(pc, ethutil.Big1) + val := ethutil.BigD(closure.GetRangeValue(pc+1, a)) + // Push value to stack + stack.Push(val) + pc += a + //pc.Add(pc, a.Sub(a, big.NewInt(1))) + + step += int(op) - int(PUSH1) + 1 + + self.Printf(" => 0x%x", val.Bytes()) + case POP: + stack.Pop() + case DUP1, DUP2, DUP3, DUP4, DUP5, DUP6, DUP7, DUP8, DUP9, DUP10, DUP11, DUP12, DUP13, DUP14, DUP15, DUP16: + n := int(op - DUP1 + 1) + stack.Dupn(n) + + self.Printf(" => [%d] 0x%x", n, stack.Peek().Bytes()) + case SWAP1, SWAP2, SWAP3, SWAP4, SWAP5, SWAP6, SWAP7, SWAP8, SWAP9, SWAP10, SWAP11, SWAP12, SWAP13, SWAP14, SWAP15, SWAP16: + n := int(op - SWAP1 + 2) + x, y := stack.Swapn(n) + + self.Printf(" => [%d] %x [0] %x", n, x.Bytes(), y.Bytes()) + case LOG0, LOG1, LOG2, LOG3, LOG4: + n := int(op - LOG0) + topics := make([][]byte, n) + mSize, mStart := stack.Popn() + for i := 0; i < n; i++ { + topics[i] = ethutil.LeftPadBytes(stack.Pop().Bytes(), 32) + } + + data := mem.Geti(mStart.Int64(), mSize.Int64()) + log := &Log{closure.Address(), topics, data} + self.env.AddLog(log) + + self.Printf(" => %v", log) + case MLOAD: + offset := stack.Pop() + val := ethutil.BigD(mem.Get(offset.Int64(), 32)) + stack.Push(val) + + self.Printf(" => 0x%x", val.Bytes()) + case MSTORE: // Store the value at stack top-1 in to memory at location stack top + // Pop value of the stack + val, mStart := stack.Popn() + mem.Set(mStart.Uint64(), 32, ethutil.BigToBytes(val, 256)) + + self.Printf(" => 0x%x", val) + case MSTORE8: + off := stack.Pop() + val := stack.Pop() + + mem.store[off.Int64()] = byte(val.Int64() & 0xff) + + self.Printf(" => [%v] 0x%x", off, val) + case SLOAD: + loc := stack.Pop() + val := ethutil.BigD(statedb.GetState(closure.Address(), loc.Bytes())) + stack.Push(val) + + self.Printf(" {0x%x : 0x%x}", loc.Bytes(), val.Bytes()) + case SSTORE: + val, loc := stack.Popn() + statedb.SetState(closure.Address(), loc.Bytes(), val) + + closure.message.AddStorageChange(loc.Bytes()) + + self.Printf(" {0x%x : 0x%x}", loc.Bytes(), val.Bytes()) + case JUMP: + jump(pc, stack.Pop()) + + continue + case JUMPI: + cond, pos := stack.Popn() + + if cond.Cmp(ethutil.BigTrue) >= 0 { + jump(pc, pos) + + continue + } + + case JUMPDEST: + case PC: + stack.Push(big.NewInt(int64(pc))) + case MSIZE: + stack.Push(big.NewInt(int64(mem.Len()))) + case GAS: + stack.Push(closure.Gas) + // 0x60 range + case CREATE: + + var ( + err error + value = stack.Pop() + size, offset = stack.Popn() + input = mem.Get(offset.Int64(), size.Int64()) + gas = new(big.Int).Set(closure.Gas) + + // Snapshot the current stack so we are able to + // revert back to it later. + //snapshot = self.env.State().Copy() + ) + + // Generate a new address + n := statedb.GetNonce(closure.Address()) + addr := crypto.CreateAddress(closure.Address(), n) + statedb.SetNonce(closure.Address(), n+1) + + self.Printf(" (*) %x", addr).Endl() + + closure.UseGas(closure.Gas) + + ret, err, ref := self.env.Create(closure, addr, input, gas, price, value) + if err != nil { + stack.Push(ethutil.BigFalse) + + self.Printf("CREATE err %v", err) + } else { + // gas < len(ret) * CreateDataGas == NO_CODE + dataGas := big.NewInt(int64(len(ret))) + dataGas.Mul(dataGas, GasCreateByte) + if closure.UseGas(dataGas) { + ref.SetCode(ret) + msg.Output = ret + } + + stack.Push(ethutil.BigD(addr)) + } + + self.Endl() + + // Debug hook + if self.Dbg != nil { + self.Dbg.SetCode(closure.Code) + } + case CALL, CALLCODE: + self.Endl() + + gas := stack.Pop() + // Pop gas and value of the stack. + value, addr := stack.Popn() + // Pop input size and offset + inSize, inOffset := stack.Popn() + // Pop return size and offset + retSize, retOffset := stack.Popn() + + // Get the arguments from the memory + args := mem.Get(inOffset.Int64(), inSize.Int64()) + + var ( + ret []byte + err error + ) + if op == CALLCODE { + ret, err = self.env.CallCode(closure, addr.Bytes(), args, gas, price, value) + } else { + ret, err = self.env.Call(closure, addr.Bytes(), args, gas, price, value) + } + + if err != nil { + stack.Push(ethutil.BigFalse) + + vmlogger.Debugln(err) + } else { + stack.Push(ethutil.BigTrue) + msg.Output = ret + + mem.Set(retOffset.Uint64(), retSize.Uint64(), ret) + } + self.Printf("resume %x (%v)", closure.Address(), closure.Gas) + + // Debug hook + if self.Dbg != nil { + self.Dbg.SetCode(closure.Code) + } + + case RETURN: + size, offset := stack.Popn() + ret := mem.Get(offset.Int64(), size.Int64()) + + self.Printf(" => [%v, %v] (%d) 0x%x", offset, size, len(ret), ret).Endl() + + return closure.Return(ret), nil + case SUICIDE: + receiver := statedb.GetOrNewStateObject(stack.Pop().Bytes()) + balance := statedb.GetBalance(closure.Address()) + + self.Printf(" => (%x) %v", receiver.Address()[:4], balance) + + receiver.AddAmount(balance) + statedb.Delete(closure.Address()) + + fallthrough + case STOP: // Stop the closure + self.Endl() + + return closure.Return(nil), nil + default: + vmlogger.Debugf("(pc) %-3v Invalid opcode %x\n", pc, op) + + closure.ReturnGas(big.NewInt(1), nil) + + return closure.Return(nil), fmt.Errorf("Invalid opcode %x", op) + } + + pc++ + + self.Endl() + + if self.Dbg != nil { + for _, instrNo := range self.Dbg.BreakPoints() { + if pc == uint64(instrNo) { + self.Stepping = true + + if !self.Dbg.BreakHook(prevStep, op, mem, stack, statedb.GetStateObject(closure.Address())) { + return nil, nil + } + } else if self.Stepping { + if !self.Dbg.StepHook(prevStep, op, mem, stack, statedb.GetStateObject(closure.Address())) { + return nil, nil + } + } + } + } + + } +} + +func (self *DebugVm) RunPrecompiled(p *PrecompiledAccount, callData []byte, closure *Closure) (ret []byte, err error) { + gas := p.Gas(len(callData)) + if closure.UseGas(gas) { + ret = p.Call(callData) + self.Printf("NATIVE_FUNC => %x", ret) + self.Endl() + + return closure.Return(ret), nil + } else { + self.Endl() + + tmp := new(big.Int).Set(closure.Gas) + + closure.UseGas(closure.Gas) + + return closure.Return(nil), OOG(gas, tmp) + } +} + +func (self *DebugVm) Printf(format string, v ...interface{}) VirtualMachine { + if self.logTy == LogTyPretty { + self.logStr += fmt.Sprintf(format, v...) + } + + return self +} + +func (self *DebugVm) Endl() VirtualMachine { + if self.logTy == LogTyPretty { + vmlogger.Debugln(self.logStr) + self.logStr = "" + } + + return self +} + +func (self *DebugVm) Env() Environment { + return self.env +} diff --git a/vm/vm_test.go b/vm/vm_test.go new file mode 100644 index 000000000..9bd147a72 --- /dev/null +++ b/vm/vm_test.go @@ -0,0 +1,3 @@ +package vm + +// Tests have been removed in favour of general tests. If anything implementation specific needs testing, put it here diff --git a/websocket/client.go b/websocket/client.go new file mode 100644 index 000000000..d961816e8 --- /dev/null +++ b/websocket/client.go @@ -0,0 +1,122 @@ +package websocket + +import ( + "fmt" + "io" + + ws "code.google.com/p/go.net/websocket" +) + +const channelBufSize = 100 + +var maxId int = 0 + +type MsgFunc func(c *Client, msg *Message) + +// Chat client. +type Client struct { + id int + ws *ws.Conn + server *Server + ch chan *Message + doneCh chan bool + + onMessage MsgFunc +} + +// Create new chat client. +func NewClient(ws *ws.Conn, server *Server) *Client { + + if ws == nil { + panic("ws cannot be nil") + } + + if server == nil { + panic("server cannot be nil") + } + + maxId++ + ch := make(chan *Message, channelBufSize) + doneCh := make(chan bool) + + return &Client{maxId, ws, server, ch, doneCh, nil} +} + +func (c *Client) Id() int { + return c.id +} + +func (c *Client) Conn() *ws.Conn { + return c.ws +} + +func (c *Client) Write(data interface{}, seed int) { + msg := &Message{Seed: seed, Data: data} + select { + case c.ch <- msg: + default: + c.server.Del(c) + err := fmt.Errorf("client %d is disconnected.", c.id) + c.server.Err(err) + } +} + +func (c *Client) Done() { + c.doneCh <- true +} + +// Listen Write and Read request via chanel +func (c *Client) Listen() { + go c.listenWrite() + c.listenRead() +} + +// Listen write request via chanel +func (c *Client) listenWrite() { + wslogger.Debugln("Listening write to client") + for { + select { + + // send message to the client + case msg := <-c.ch: + wslogger.Debugln("Send:", msg) + ws.JSON.Send(c.ws, msg) + + // receive done request + case <-c.doneCh: + c.server.Del(c) + c.doneCh <- true // for listenRead method + return + } + } +} + +// Listen read request via chanel +func (c *Client) listenRead() { + wslogger.Debugln("Listening read from client") + for { + select { + + // receive done request + case <-c.doneCh: + c.server.Del(c) + c.doneCh <- true // for listenWrite method + return + + // read data from ws connection + default: + var msg Message + err := ws.JSON.Receive(c.ws, &msg) + if err == io.EOF { + c.doneCh <- true + } else if err != nil { + c.server.Err(err) + } else { + wslogger.Debugln(&msg) + if c.onMessage != nil { + c.onMessage(c, &msg) + } + } + } + } +} diff --git a/websocket/message.go b/websocket/message.go new file mode 100644 index 000000000..67289c4c4 --- /dev/null +++ b/websocket/message.go @@ -0,0 +1,14 @@ +package websocket + +import "github.com/ethereum/go-ethereum/ethutil" + +type Message struct { + Call string `json:"call"` + Args []interface{} `json:"args"` + Seed int `json:"seed"` + Data interface{} `json:"data"` +} + +func (self *Message) Arguments() *ethutil.Value { + return ethutil.NewValue(self.Args) +} diff --git a/websocket/server.go b/websocket/server.go new file mode 100644 index 000000000..5fd923a0c --- /dev/null +++ b/websocket/server.go @@ -0,0 +1,127 @@ +package websocket + +import ( + "net/http" + + "github.com/ethereum/go-ethereum/logger" + + ws "code.google.com/p/go.net/websocket" +) + +var wslogger = logger.NewLogger("WS") + +// Chat server. +type Server struct { + httpServ string + pattern string + messages []*Message + clients map[int]*Client + addCh chan *Client + delCh chan *Client + sendAllCh chan string + doneCh chan bool + errCh chan error + msgFunc MsgFunc +} + +// Create new chat server. +func NewServer(pattern, httpServ string) *Server { + clients := make(map[int]*Client) + addCh := make(chan *Client) + delCh := make(chan *Client) + sendAllCh := make(chan string) + doneCh := make(chan bool) + errCh := make(chan error) + + return &Server{ + httpServ, + pattern, + nil, + clients, + addCh, + delCh, + sendAllCh, + doneCh, + errCh, + nil, + } +} + +func (s *Server) Add(c *Client) { + s.addCh <- c +} + +func (s *Server) Del(c *Client) { + s.delCh <- c +} + +func (s *Server) SendAll(msg string) { + s.sendAllCh <- msg +} + +func (s *Server) Done() { + s.doneCh <- true +} + +func (s *Server) Err(err error) { + s.errCh <- err +} + +func (s *Server) servHTTP() { + wslogger.Debugln("Serving http", s.httpServ) + err := http.ListenAndServe(s.httpServ, nil) + + wslogger.Warnln(err) +} + +func (s *Server) MessageFunc(f MsgFunc) { + s.msgFunc = f +} + +// Listen and serve. +// It serves client connection and broadcast request. +func (s *Server) Listen() { + wslogger.Debugln("Listening server...") + + // ws handler + onConnected := func(ws *ws.Conn) { + defer func() { + err := ws.Close() + if err != nil { + s.errCh <- err + } + }() + + client := NewClient(ws, s) + client.onMessage = s.msgFunc + s.Add(client) + client.Listen() + } + // Disable Origin check. Request don't need to come necessarily from origin. + http.HandleFunc(s.pattern, func(w http.ResponseWriter, req *http.Request) { + s := ws.Server{Handler: ws.Handler(onConnected)} + s.ServeHTTP(w, req) + }) + wslogger.Debugln("Created handler") + + go s.servHTTP() + + for { + select { + + // Add new a client + case c := <-s.addCh: + s.clients[c.id] = c + + // del a client + case c := <-s.delCh: + delete(s.clients, c.id) + + case err := <-s.errCh: + wslogger.Debugln("Error:", err.Error()) + + case <-s.doneCh: + return + } + } +} diff --git a/whisper/envelope.go b/whisper/envelope.go new file mode 100644 index 000000000..683e88128 --- /dev/null +++ b/whisper/envelope.go @@ -0,0 +1,121 @@ +package whisper + +import ( + "bytes" + "crypto/ecdsa" + "encoding/binary" + "fmt" + "io" + "time" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/rlp" +) + +const ( + DefaultPow = 50 * time.Millisecond +) + +type Envelope struct { + Expiry uint32 // Whisper protocol specifies int32, really should be int64 + Ttl uint32 // ^^^^^^ + Topics [][]byte + Data []byte + Nonce uint32 + + hash Hash +} + +func NewEnvelopeFromReader(reader io.Reader) (*Envelope, error) { + var envelope Envelope + + buf := new(bytes.Buffer) + buf.ReadFrom(reader) + + h := H(crypto.Sha3(buf.Bytes())) + if err := rlp.Decode(buf, &envelope); err != nil { + return nil, err + } + + envelope.hash = h + + return &envelope, nil +} + +func (self *Envelope) Hash() Hash { + if self.hash == EmptyHash { + self.hash = H(crypto.Sha3(ethutil.Encode(self))) + } + + return self.hash +} + +func NewEnvelope(ttl time.Duration, topics [][]byte, data *Message) *Envelope { + exp := time.Now().Add(ttl) + + return &Envelope{uint32(exp.Unix()), uint32(ttl.Seconds()), topics, data.Bytes(), 0, Hash{}} +} + +func (self *Envelope) Seal(pow time.Duration) { + self.proveWork(pow) +} + +func (self *Envelope) Open(prv *ecdsa.PrivateKey) (msg *Message, err error) { + data := self.Data + var message Message + dataStart := 1 + if data[0] > 0 { + if len(data) < 66 { + return nil, fmt.Errorf("unable to open envelope. First bit set but len(data) < 66") + } + dataStart = 66 + message.Flags = data[0] + message.Signature = data[1:66] + } + message.Payload = data[dataStart:] + if prv != nil { + message.Payload, err = crypto.Decrypt(prv, message.Payload) + if err != nil { + return nil, fmt.Errorf("unable to open envelope. Decrypt failed: %v", err) + } + } + + return &message, nil +} + +func (self *Envelope) proveWork(dura time.Duration) { + var bestBit int + d := make([]byte, 64) + copy(d[:32], ethutil.Encode(self.withoutNonce())) + + then := time.Now().Add(dura).UnixNano() + for n := uint32(0); time.Now().UnixNano() < then; { + for i := 0; i < 1024; i++ { + binary.BigEndian.PutUint32(d[60:], n) + + fbs := ethutil.FirstBitSet(ethutil.BigD(crypto.Sha3(d))) + if fbs > bestBit { + bestBit = fbs + self.Nonce = n + } + + n++ + } + } +} + +func (self *Envelope) valid() bool { + d := make([]byte, 64) + copy(d[:32], ethutil.Encode(self.withoutNonce())) + binary.BigEndian.PutUint32(d[60:], self.Nonce) + return ethutil.FirstBitSet(ethutil.BigD(crypto.Sha3(d))) > 0 +} + +func (self *Envelope) withoutNonce() interface{} { + return []interface{}{self.Expiry, self.Ttl, ethutil.ByteSliceToInterface(self.Topics), self.Data} +} + +func (self *Envelope) RlpData() interface{} { + return []interface{}{self.Expiry, self.Ttl, ethutil.ByteSliceToInterface(self.Topics), self.Data, self.Nonce} +} diff --git a/whisper/filter.go b/whisper/filter.go new file mode 100644 index 000000000..4315aa556 --- /dev/null +++ b/whisper/filter.go @@ -0,0 +1,10 @@ +package whisper + +import "crypto/ecdsa" + +type Filter struct { + To *ecdsa.PrivateKey + From *ecdsa.PublicKey + Topics [][]byte + Fn func(*Message) +} diff --git a/whisper/main.go b/whisper/main.go new file mode 100644 index 000000000..2ee2f3ff1 --- /dev/null +++ b/whisper/main.go @@ -0,0 +1,47 @@ +// +build none + +package main + +import ( + "fmt" + "log" + "net" + "os" + + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/whisper" + "github.com/obscuren/secp256k1-go" +) + +func main() { + logger.AddLogSystem(logger.NewStdLogSystem(os.Stdout, log.LstdFlags, logger.InfoLevel)) + + pub, _ := secp256k1.GenerateKeyPair() + + whisper := whisper.New(&event.TypeMux{}) + + srv := p2p.Server{ + MaxPeers: 10, + Identity: p2p.NewSimpleClientIdentity("whisper-go", "1.0", "", string(pub)), + ListenAddr: ":30303", + NAT: p2p.UPNP(), + + Protocols: []p2p.Protocol{whisper.Protocol()}, + } + if err := srv.Start(); err != nil { + fmt.Println("could not start server:", err) + os.Exit(1) + } + + // add seed peers + seed, err := net.ResolveTCPAddr("tcp", "poc-7.ethdev.com:30300") + if err != nil { + fmt.Println("couldn't resolve:", err) + os.Exit(1) + } + srv.SuggestPeer(seed.IP, seed.Port, nil) + + select {} +} diff --git a/whisper/message.go b/whisper/message.go new file mode 100644 index 000000000..db0110b4a --- /dev/null +++ b/whisper/message.go @@ -0,0 +1,74 @@ +package whisper + +import ( + "crypto/ecdsa" + "time" + + "github.com/ethereum/go-ethereum/crypto" +) + +type Message struct { + Flags byte + Signature []byte + Payload []byte +} + +func NewMessage(payload []byte) *Message { + return &Message{Flags: 0, Payload: payload} +} + +func (self *Message) hash() []byte { + return crypto.Sha3(append([]byte{self.Flags}, self.Payload...)) +} + +func (self *Message) sign(key *ecdsa.PrivateKey) (err error) { + self.Flags = 1 + self.Signature, err = crypto.Sign(self.hash(), key) + return +} + +func (self *Message) Recover() *ecdsa.PublicKey { + defer func() { recover() }() // in case of invalid sig + return crypto.SigToPub(self.hash(), self.Signature) +} + +func (self *Message) Encrypt(to *ecdsa.PublicKey) (err error) { + self.Payload, err = crypto.Encrypt(to, self.Payload) + if err != nil { + return err + } + + return nil +} + +func (self *Message) Bytes() []byte { + return append([]byte{self.Flags}, append(self.Signature, self.Payload...)...) +} + +type Opts struct { + From *ecdsa.PrivateKey + To *ecdsa.PublicKey + Ttl time.Duration + Topics [][]byte +} + +func (self *Message) Seal(pow time.Duration, opts Opts) (*Envelope, error) { + if opts.From != nil { + err := self.sign(opts.From) + if err != nil { + return nil, err + } + } + + if opts.To != nil { + err := self.Encrypt(opts.To) + if err != nil { + return nil, err + } + } + + envelope := NewEnvelope(DefaultTtl, opts.Topics, self) + envelope.Seal(pow) + + return envelope, nil +} diff --git a/whisper/messages_test.go b/whisper/messages_test.go new file mode 100644 index 000000000..cba103011 --- /dev/null +++ b/whisper/messages_test.go @@ -0,0 +1,51 @@ +package whisper + +import ( + "bytes" + "crypto/elliptic" + "fmt" + "testing" + + "github.com/ethereum/go-ethereum/crypto" +) + +func TestSign(t *testing.T) { + prv, _ := crypto.GenerateKey() + msg := NewMessage([]byte("hello world")) + msg.sign(prv) + + pubKey := msg.Recover() + p1 := elliptic.Marshal(crypto.S256(), prv.PublicKey.X, prv.PublicKey.Y) + p2 := elliptic.Marshal(crypto.S256(), pubKey.X, pubKey.Y) + + if !bytes.Equal(p1, p2) { + t.Error("recovered pub key did not match") + } +} + +func TestMessageEncryptDecrypt(t *testing.T) { + prv1, _ := crypto.GenerateKey() + prv2, _ := crypto.GenerateKey() + + data := []byte("hello world") + msg := NewMessage(data) + envelope, err := msg.Seal(DefaultPow, Opts{ + From: prv1, + To: &prv2.PublicKey, + }) + if err != nil { + fmt.Println(err) + t.FailNow() + } + + msg1, err := envelope.Open(prv2) + if err != nil { + fmt.Println(err) + t.FailNow() + } + + if !bytes.Equal(msg1.Payload, data) { + fmt.Println("encryption error. data did not match") + t.FailNow() + } +} diff --git a/whisper/peer.go b/whisper/peer.go new file mode 100644 index 000000000..d42b374b5 --- /dev/null +++ b/whisper/peer.go @@ -0,0 +1,128 @@ +package whisper + +import ( + "fmt" + "io/ioutil" + "time" + + "github.com/ethereum/go-ethereum/p2p" + "gopkg.in/fatih/set.v0" +) + +const ( + protocolVersion = 0x02 +) + +type peer struct { + host *Whisper + peer *p2p.Peer + ws p2p.MsgReadWriter + + // XXX Eventually this is going to reach exceptional large space. We need an expiry here + known *set.Set + + quit chan struct{} +} + +func NewPeer(host *Whisper, p *p2p.Peer, ws p2p.MsgReadWriter) *peer { + return &peer{host, p, ws, set.New(), make(chan struct{})} +} + +func (self *peer) init() error { + if err := self.handleStatus(); err != nil { + return err + } + + return nil +} + +func (self *peer) start() { + go self.update() + self.peer.Infoln("whisper started") +} + +func (self *peer) stop() { + self.peer.Infoln("whisper stopped") + + close(self.quit) +} + +func (self *peer) update() { + relay := time.NewTicker(300 * time.Millisecond) +out: + for { + select { + case <-relay.C: + err := self.broadcast(self.host.envelopes()) + if err != nil { + self.peer.Infoln(err) + break out + } + + case <-self.quit: + break out + } + } +} + +func (self *peer) broadcast(envelopes []*Envelope) error { + envs := make([]interface{}, len(envelopes)) + i := 0 + for _, envelope := range envelopes { + if !self.known.Has(envelope.Hash()) { + envs[i] = envelope + self.known.Add(envelope.Hash()) + i++ + } + } + + if i > 0 { + msg := p2p.NewMsg(envelopesMsg, envs[:i]...) + if err := self.ws.WriteMsg(msg); err != nil { + return err + } + self.peer.Infoln("broadcasted", i, "message(s)") + } + + return nil +} + +func (self *peer) addKnown(envelope *Envelope) { + self.known.Add(envelope.Hash()) +} + +func (self *peer) handleStatus() error { + ws := self.ws + + if err := ws.WriteMsg(self.statusMsg()); err != nil { + return err + } + + msg, err := ws.ReadMsg() + if err != nil { + return err + } + + if msg.Code != statusMsg { + return fmt.Errorf("peer send %x before status msg", msg.Code) + } + + data, err := ioutil.ReadAll(msg.Payload) + if err != nil { + return err + } + + if len(data) == 0 { + return fmt.Errorf("malformed status. data len = 0") + } + + if pv := data[0]; pv != protocolVersion { + return fmt.Errorf("protocol version mismatch %d != %d", pv, protocolVersion) + } + + return nil +} + +func (self *peer) statusMsg() p2p.Msg { + return p2p.NewMsg(statusMsg, protocolVersion) +} diff --git a/whisper/sort.go b/whisper/sort.go new file mode 100644 index 000000000..8c5b46e9e --- /dev/null +++ b/whisper/sort.go @@ -0,0 +1,25 @@ +package whisper + +import "sort" + +type sortedKeys struct { + k []int32 +} + +func (self *sortedKeys) Len() int { return len(self.k) } +func (self *sortedKeys) Less(i, j int) bool { return self.k[i] < self.k[j] } +func (self *sortedKeys) Swap(i, j int) { self.k[i], self.k[j] = self.k[j], self.k[i] } + +func sortKeys(m map[int32]Hash) []int32 { + sorted := new(sortedKeys) + sorted.k = make([]int32, len(m)) + i := 0 + for key, _ := range m { + sorted.k[i] = key + i++ + } + + sort.Sort(sorted) + + return sorted.k +} diff --git a/whisper/sort_test.go b/whisper/sort_test.go new file mode 100644 index 000000000..5d8177d41 --- /dev/null +++ b/whisper/sort_test.go @@ -0,0 +1,19 @@ +package whisper + +import "testing" + +func TestSorting(t *testing.T) { + m := map[int32]Hash{ + 1: HS("1"), + 3: HS("3"), + 2: HS("2"), + 5: HS("5"), + } + exp := []int32{1, 2, 3, 5} + res := sortKeys(m) + for i, k := range res { + if k != exp[i] { + t.Error(k, "failed. Expected", exp[i]) + } + } +} diff --git a/whisper/util.go b/whisper/util.go new file mode 100644 index 000000000..abef1d667 --- /dev/null +++ b/whisper/util.go @@ -0,0 +1,27 @@ +package whisper + +import "github.com/ethereum/go-ethereum/crypto" + +func hashTopic(topic []byte) []byte { + return crypto.Sha3(topic)[:4] +} + +// NOTE this isn't DRY, but I don't want to iterate twice. + +// Returns a formatted topics byte slice. +// data: unformatted data (e.g., no hashes needed) +func Topics(data [][]byte) [][]byte { + d := make([][]byte, len(data)) + for i, byts := range data { + d[i] = hashTopic(byts) + } + return d +} + +func TopicsFromString(data []string) [][]byte { + d := make([][]byte, len(data)) + for i, str := range data { + d[i] = hashTopic([]byte(str)) + } + return d +} diff --git a/whisper/whisper.go b/whisper/whisper.go new file mode 100644 index 000000000..356debd1c --- /dev/null +++ b/whisper/whisper.go @@ -0,0 +1,246 @@ +package whisper + +import ( + "bytes" + "crypto/ecdsa" + "errors" + "fmt" + "sync" + "time" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/event/filter" + "github.com/ethereum/go-ethereum/p2p" + "gopkg.in/fatih/set.v0" +) + +// MOVE ME +type Hash struct { + hash string +} + +var EmptyHash Hash + +func H(hash []byte) Hash { + return Hash{string(hash)} +} +func HS(hash string) Hash { + return Hash{hash} +} + +func (self Hash) Compare(other Hash) int { + return bytes.Compare([]byte(self.hash), []byte(other.hash)) +} + +// MOVE ME END + +const ( + statusMsg = 0x0 + envelopesMsg = 0x01 +) + +type MessageEvent struct { + To *ecdsa.PrivateKey + From *ecdsa.PublicKey + Message *Message +} + +const DefaultTtl = 50 * time.Second + +type Whisper struct { + protocol p2p.Protocol + filters *filter.Filters + + mmu sync.RWMutex + messages map[Hash]*Envelope + expiry map[uint32]*set.SetNonTS + + quit chan struct{} + + keys []*ecdsa.PrivateKey +} + +func New() *Whisper { + whisper := &Whisper{ + messages: make(map[Hash]*Envelope), + filters: filter.New(), + expiry: make(map[uint32]*set.SetNonTS), + quit: make(chan struct{}), + } + whisper.filters.Start() + go whisper.update() + + // XXX TODO REMOVE TESTING CODE + msg := NewMessage([]byte(fmt.Sprintf("Hello world. This is whisper-go. Incase you're wondering; the time is %v", time.Now()))) + envelope, _ := msg.Seal(DefaultPow, Opts{ + Ttl: DefaultTtl, + }) + if err := whisper.Send(envelope); err != nil { + fmt.Println(err) + } + // XXX TODO REMOVE TESTING CODE + + // p2p whisper sub protocol handler + whisper.protocol = p2p.Protocol{ + Name: "shh", + Version: 2, + Length: 2, + Run: whisper.msgHandler, + } + + return whisper +} + +func (self *Whisper) Stop() { + close(self.quit) +} + +func (self *Whisper) Send(envelope *Envelope) error { + return self.add(envelope) +} + +func (self *Whisper) NewIdentity() *ecdsa.PrivateKey { + key, err := crypto.GenerateKey() + if err != nil { + panic(err) + } + self.keys = append(self.keys, key) + + return key +} + +func (self *Whisper) HasIdentity(key *ecdsa.PrivateKey) bool { + for _, key := range self.keys { + if key.D.Cmp(key.D) == 0 { + return true + } + } + return false +} + +func (self *Whisper) Watch(opts Filter) int { + return self.filters.Install(filter.Generic{ + Str1: string(crypto.FromECDSA(opts.To)), + Str2: string(crypto.FromECDSAPub(opts.From)), + Fn: func(data interface{}) { + opts.Fn(data.(*Message)) + }, + }) +} + +// Main handler for passing whisper messages to whisper peer objects +func (self *Whisper) msgHandler(peer *p2p.Peer, ws p2p.MsgReadWriter) error { + wpeer := NewPeer(self, peer, ws) + // initialise whisper peer (handshake/status) + if err := wpeer.init(); err != nil { + return err + } + // kick of the main handler for broadcasting/managing envelopes + go wpeer.start() + defer wpeer.stop() + + // Main *read* loop. Writing is done by the peer it self. + for { + msg, err := ws.ReadMsg() + if err != nil { + return err + } + + envelope, err := NewEnvelopeFromReader(msg.Payload) + if err != nil { + peer.Infoln(err) + continue + } + + if err := self.add(envelope); err != nil { + // TODO Punish peer here. Invalid envelope. + peer.Infoln(err) + } + wpeer.addKnown(envelope) + } +} + +// takes care of adding envelopes to the messages pool. At this moment no sanity checks are being performed. +func (self *Whisper) add(envelope *Envelope) error { + if !envelope.valid() { + return errors.New("invalid pow provided for envelope") + } + + self.mmu.Lock() + defer self.mmu.Unlock() + + hash := envelope.Hash() + self.messages[hash] = envelope + if self.expiry[envelope.Expiry] == nil { + self.expiry[envelope.Expiry] = set.NewNonTS() + } + + if !self.expiry[envelope.Expiry].Has(hash) { + self.expiry[envelope.Expiry].Add(hash) + self.postEvent(envelope) + } + + return nil +} + +func (self *Whisper) update() { + expire := time.NewTicker(800 * time.Millisecond) +out: + for { + select { + case <-expire.C: + self.expire() + case <-self.quit: + break out + } + } +} + +func (self *Whisper) expire() { + self.mmu.Lock() + defer self.mmu.Unlock() + + now := uint32(time.Now().Unix()) + for then, hashSet := range self.expiry { + if then > now { + continue + } + + hashSet.Each(func(v interface{}) bool { + delete(self.messages, v.(Hash)) + return true + }) + self.expiry[then].Clear() + } +} + +func (self *Whisper) envelopes() (envelopes []*Envelope) { + self.mmu.RLock() + defer self.mmu.RUnlock() + + envelopes = make([]*Envelope, len(self.messages)) + i := 0 + for _, envelope := range self.messages { + envelopes[i] = envelope + i++ + } + + return +} + +func (self *Whisper) postEvent(envelope *Envelope) { + for _, key := range self.keys { + if message, err := envelope.Open(key); err == nil { + // Create a custom filter? + self.filters.Notify(filter.Generic{ + Str1: string(crypto.FromECDSA(key)), Str2: string(crypto.FromECDSAPub(message.Recover())), + }, message) + } else { + fmt.Println(err) + } + } +} + +func (self *Whisper) Protocol() p2p.Protocol { + return self.protocol +} diff --git a/whisper/whisper_test.go b/whisper/whisper_test.go new file mode 100644 index 000000000..107cb8c97 --- /dev/null +++ b/whisper/whisper_test.go @@ -0,0 +1,47 @@ +package whisper + +import ( + "fmt" + "testing" + "time" +) + +func TestKeyManagement(t *testing.T) { + whisper := New() + + key := whisper.NewIdentity() + if !whisper.HasIdentity(key) { + t.Error("expected whisper to have identify") + } +} + +func TestEvent(t *testing.T) { + res := make(chan *Message, 1) + whisper := New() + id := whisper.NewIdentity() + whisper.Watch(Filter{ + To: id, + Fn: func(msg *Message) { + res <- msg + }, + }) + + msg := NewMessage([]byte(fmt.Sprintf("Hello world. This is whisper-go. Incase you're wondering; the time is %v", time.Now()))) + envelope, err := msg.Seal(DefaultPow, Opts{ + Ttl: DefaultTtl, + From: id, + To: &id.PublicKey, + }) + if err != nil { + fmt.Println(err) + t.FailNow() + } + + tick := time.NewTicker(time.Second) + whisper.postEvent(envelope) + select { + case <-res: + case <-tick.C: + t.Error("did not receive message") + } +} diff --git a/wire/.gitignore b/wire/.gitignore new file mode 100644 index 000000000..f725d58d1 --- /dev/null +++ b/wire/.gitignore @@ -0,0 +1,12 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. +# +# If you find yourself ignoring temporary files generated by your text editor +# or operating system, you probably want to add a global ignore instead: +# git config --global core.excludesfile ~/.gitignore_global + +/tmp +*/**/*un~ +*un~ +.DS_Store +*/**/.DS_Store + diff --git a/wire/README.md b/wire/README.md new file mode 100644 index 000000000..7f63688b3 --- /dev/null +++ b/wire/README.md @@ -0,0 +1,36 @@ +# ethwire + +The ethwire package contains the ethereum wire protocol. The ethwire +package is required to write and read from the ethereum network. + +# Installation + +`go get github.com/ethereum/ethwire-go` + +# Messaging overview + +The Ethereum Wire protocol defines the communication between the nodes +running Ethereum. Further reader reading can be done on the +[Wiki](http://wiki.ethereum.org/index.php/Wire_Protocol). + +# Reading Messages + +```go +// Read and validate the next eth message from the provided connection. +// returns a error message with the details. +msg, err := ethwire.ReadMessage(conn) +if err != nil { + // Handle error +} +``` + +# Writing Messages + +```go +// Constructs a message which can be interpreted by the eth network. +// Write the inventory to network +err := ethwire.WriteMessage(conn, &Msg{ + Type: ethwire.MsgInvTy, + Data : []interface{}{...}, +}) +``` diff --git a/wire/client_identity.go b/wire/client_identity.go new file mode 100644 index 000000000..0a268024a --- /dev/null +++ b/wire/client_identity.go @@ -0,0 +1,56 @@ +package wire + +import ( + "fmt" + "runtime" +) + +// should be used in Peer handleHandshake, incorporate Caps, ProtocolVersion, Pubkey etc. +type ClientIdentity interface { + String() string +} + +type SimpleClientIdentity struct { + clientIdentifier string + version string + customIdentifier string + os string + implementation string +} + +func NewSimpleClientIdentity(clientIdentifier string, version string, customIdentifier string) *SimpleClientIdentity { + clientIdentity := &SimpleClientIdentity{ + clientIdentifier: clientIdentifier, + version: version, + customIdentifier: customIdentifier, + os: runtime.GOOS, + implementation: runtime.Version(), + } + + return clientIdentity +} + +func (c *SimpleClientIdentity) init() { +} + +func (c *SimpleClientIdentity) String() string { + var id string + if len(c.customIdentifier) > 0 { + id = "/" + c.customIdentifier + } + + return fmt.Sprintf("%s/v%s%s/%s/%s", + c.clientIdentifier, + c.version, + id, + c.os, + c.implementation) +} + +func (c *SimpleClientIdentity) SetCustomIdentifier(customIdentifier string) { + c.customIdentifier = customIdentifier +} + +func (c *SimpleClientIdentity) GetCustomIdentifier() string { + return c.customIdentifier +} diff --git a/wire/client_identity_test.go b/wire/client_identity_test.go new file mode 100644 index 000000000..c0e7a0159 --- /dev/null +++ b/wire/client_identity_test.go @@ -0,0 +1,30 @@ +package wire + +import ( + "fmt" + "runtime" + "testing" +) + +func TestClientIdentity(t *testing.T) { + clientIdentity := NewSimpleClientIdentity("Ethereum(G)", "0.5.16", "test") + clientString := clientIdentity.String() + expected := fmt.Sprintf("Ethereum(G)/v0.5.16/test/%s/%s", runtime.GOOS, runtime.Version()) + if clientString != expected { + t.Errorf("Expected clientIdentity to be %q, got %q", expected, clientString) + } + customIdentifier := clientIdentity.GetCustomIdentifier() + if customIdentifier != "test" { + t.Errorf("Expected clientIdentity.GetCustomIdentifier() to be 'test', got %q", customIdentifier) + } + clientIdentity.SetCustomIdentifier("test2") + customIdentifier = clientIdentity.GetCustomIdentifier() + if customIdentifier != "test2" { + t.Errorf("Expected clientIdentity.GetCustomIdentifier() to be 'test2', got %q", customIdentifier) + } + clientString = clientIdentity.String() + expected = fmt.Sprintf("Ethereum(G)/v0.5.16/test2/%s/%s", runtime.GOOS, runtime.Version()) + if clientString != expected { + t.Errorf("Expected clientIdentity to be %q, got %q", expected, clientString) + } +} diff --git a/wire/messages2.go b/wire/messages2.go new file mode 100644 index 000000000..acbd9e0d5 --- /dev/null +++ b/wire/messages2.go @@ -0,0 +1,199 @@ +package wire + +import ( + "bytes" + "errors" + "fmt" + "net" + "time" + + "github.com/ethereum/go-ethereum/ethutil" +) + +// The connection object allows you to set up a connection to the Ethereum network. +// The Connection object takes care of all encoding and sending objects properly over +// the network. +type Connection struct { + conn net.Conn + nTimeout time.Duration + pendingMessages Messages +} + +// Create a new connection to the Ethereum network +func New(conn net.Conn) *Connection { + return &Connection{conn: conn, nTimeout: 500} +} + +// Read, reads from the network. It will block until the next message is received. +func (self *Connection) Read() *Msg { + if len(self.pendingMessages) == 0 { + self.readMessages() + } + + ret := self.pendingMessages[0] + self.pendingMessages = self.pendingMessages[1:] + + return ret + +} + +// Write to the Ethereum network specifying the type of the message and +// the data. Data can be of type RlpEncodable or []interface{}. Returns +// nil or if something went wrong an error. +func (self *Connection) Write(typ MsgType, v ...interface{}) error { + var pack []byte + + slice := [][]interface{}{[]interface{}{byte(typ)}} + for _, value := range v { + if encodable, ok := value.(ethutil.RlpEncodeDecode); ok { + slice = append(slice, encodable.RlpValue()) + } else if raw, ok := value.([]interface{}); ok { + slice = append(slice, raw) + } else { + panic(fmt.Sprintf("Unable to 'write' object of type %T", value)) + } + } + + // Encode the type and the (RLP encoded) data for sending over the wire + encoded := ethutil.NewValue(slice).Encode() + payloadLength := ethutil.NumberToBytes(uint32(len(encoded)), 32) + + // Write magic token and payload length (first 8 bytes) + pack = append(MagicToken, payloadLength...) + pack = append(pack, encoded...) + + // Write to the connection + _, err := self.conn.Write(pack) + if err != nil { + return err + } + + return nil +} + +func (self *Connection) readMessage(data []byte) (msg *Msg, remaining []byte, done bool, err error) { + if len(data) == 0 { + return nil, nil, true, nil + } + + if len(data) <= 8 { + return nil, remaining, false, errors.New("Invalid message") + } + + // Check if the received 4 first bytes are the magic token + if bytes.Compare(MagicToken, data[:4]) != 0 { + return nil, nil, false, fmt.Errorf("MagicToken mismatch. Received %v", data[:4]) + } + + messageLength := ethutil.BytesToNumber(data[4:8]) + remaining = data[8+messageLength:] + if int(messageLength) > len(data[8:]) { + return nil, nil, false, fmt.Errorf("message length %d, expected %d", len(data[8:]), messageLength) + } + + message := data[8 : 8+messageLength] + decoder := ethutil.NewValueFromBytes(message) + // Type of message + t := decoder.Get(0).Uint() + // Actual data + d := decoder.SliceFrom(1) + + msg = &Msg{ + Type: MsgType(t), + Data: d, + } + + return +} + +// The basic message reader waits for data on the given connection, decoding +// and doing a few sanity checks such as if there's a data type and +// unmarhals the given data +func (self *Connection) readMessages() (err error) { + // The recovering function in case anything goes horribly wrong + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("wire.ReadMessage error: %v", r) + } + }() + + // Buff for writing network message to + //buff := make([]byte, 1440) + var buff []byte + var totalBytes int + for { + // Give buffering some time + self.conn.SetReadDeadline(time.Now().Add(self.nTimeout * time.Millisecond)) + // Create a new temporarily buffer + b := make([]byte, 1440) + // Wait for a message from this peer + n, _ := self.conn.Read(b) + if err != nil && n == 0 { + if err.Error() != "EOF" { + fmt.Println("err now", err) + return err + } else { + break + } + + // Messages can't be empty + } else if n == 0 { + break + } + + buff = append(buff, b[:n]...) + totalBytes += n + } + + // Reslice buffer + buff = buff[:totalBytes] + msg, remaining, done, err := self.readMessage(buff) + for ; done != true; msg, remaining, done, err = self.readMessage(remaining) { + //log.Println("rx", msg) + + if msg != nil { + self.pendingMessages = append(self.pendingMessages, msg) + } + } + + return +} + +func ReadMessage(data []byte) (msg *Msg, remaining []byte, done bool, err error) { + if len(data) == 0 { + return nil, nil, true, nil + } + + if len(data) <= 8 { + return nil, remaining, false, errors.New("Invalid message") + } + + // Check if the received 4 first bytes are the magic token + if bytes.Compare(MagicToken, data[:4]) != 0 { + return nil, nil, false, fmt.Errorf("MagicToken mismatch. Received %v", data[:4]) + } + + messageLength := ethutil.BytesToNumber(data[4:8]) + remaining = data[8+messageLength:] + if int(messageLength) > len(data[8:]) { + return nil, nil, false, fmt.Errorf("message length %d, expected %d", len(data[8:]), messageLength) + } + + message := data[8 : 8+messageLength] + decoder := ethutil.NewValueFromBytes(message) + // Type of message + t := decoder.Get(0).Uint() + // Actual data + d := decoder.SliceFrom(1) + + msg = &Msg{ + Type: MsgType(t), + Data: d, + } + + return +} + +func bufferedRead(conn net.Conn) ([]byte, error) { + return nil, nil +} diff --git a/wire/messaging.go b/wire/messaging.go new file mode 100644 index 000000000..9c6cb5944 --- /dev/null +++ b/wire/messaging.go @@ -0,0 +1,178 @@ +// Package wire provides low level access to the Ethereum network and allows +// you to broadcast data over the network. +package wire + +import ( + "bytes" + "fmt" + "net" + "time" + + "github.com/ethereum/go-ethereum/ethutil" +) + +// Connection interface describing the methods required to implement the wire protocol. +type Conn interface { + Write(typ MsgType, v ...interface{}) error + Read() *Msg +} + +// The magic token which should be the first 4 bytes of every message and can be used as separator between messages. +var MagicToken = []byte{34, 64, 8, 145} + +type MsgType byte + +const ( + // Values are given explicitly instead of by iota because these values are + // defined by the wire protocol spec; it is easier for humans to ensure + // correctness when values are explicit. + MsgHandshakeTy = 0x00 + MsgDiscTy = 0x01 + MsgPingTy = 0x02 + MsgPongTy = 0x03 + MsgGetPeersTy = 0x04 + MsgPeersTy = 0x05 + + MsgStatusTy = 0x10 + MsgTxTy = 0x12 + MsgGetBlockHashesTy = 0x13 + MsgBlockHashesTy = 0x14 + MsgGetBlocksTy = 0x15 + MsgBlockTy = 0x16 + MsgNewBlockTy = 0x17 +) + +var msgTypeToString = map[MsgType]string{ + MsgHandshakeTy: "Handshake", + MsgDiscTy: "Disconnect", + MsgPingTy: "Ping", + MsgPongTy: "Pong", + MsgGetPeersTy: "Get peers", + MsgStatusTy: "Status", + MsgPeersTy: "Peers", + MsgTxTy: "Transactions", + MsgBlockTy: "Blocks", + //MsgGetTxsTy: "Get Txs", + MsgGetBlockHashesTy: "Get block hashes", + MsgBlockHashesTy: "Block hashes", + MsgGetBlocksTy: "Get blocks", +} + +func (mt MsgType) String() string { + return msgTypeToString[mt] +} + +type Msg struct { + Type MsgType // Specifies how the encoded data should be interpreted + //Data []byte + Data *ethutil.Value +} + +func NewMessage(msgType MsgType, data interface{}) *Msg { + return &Msg{ + Type: msgType, + Data: ethutil.NewValue(data), + } +} + +type Messages []*Msg + +// The basic message reader waits for data on the given connection, decoding +// and doing a few sanity checks such as if there's a data type and +// unmarhals the given data +func ReadMessages(conn net.Conn) (msgs []*Msg, err error) { + // The recovering function in case anything goes horribly wrong + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("wire.ReadMessage error: %v", r) + } + }() + + var ( + buff []byte + messages [][]byte + msgLength int + ) + + for { + // Give buffering some time + conn.SetReadDeadline(time.Now().Add(5 * time.Millisecond)) + // Create a new temporarily buffer + b := make([]byte, 1440) + n, _ := conn.Read(b) + if err != nil && n == 0 { + if err.Error() != "EOF" { + fmt.Println("err now", err) + return nil, err + } else { + break + } + } + + if n == 0 && len(buff) == 0 { + // If there's nothing on the wire wait for a bit + time.Sleep(200 * time.Millisecond) + + continue + } + + buff = append(buff, b[:n]...) + if msgLength == 0 { + // Check if the received 4 first bytes are the magic token + if bytes.Compare(MagicToken, buff[:4]) != 0 { + return nil, fmt.Errorf("MagicToken mismatch. Received %v", buff[:4]) + } + + // Read the length of the message + msgLength = int(ethutil.BytesToNumber(buff[4:8])) + + // Remove the token and length + buff = buff[8:] + } + + if len(buff) >= msgLength { + messages = append(messages, buff[:msgLength]) + buff = buff[msgLength:] + msgLength = 0 + + if len(buff) == 0 { + break + } + } + } + + for _, m := range messages { + decoder := ethutil.NewValueFromBytes(m) + // Type of message + t := decoder.Get(0).Uint() + // Actual data + d := decoder.SliceFrom(1) + + msgs = append(msgs, &Msg{Type: MsgType(t), Data: d}) + } + + return +} + +// The basic message writer takes care of writing data over the given +// connection and does some basic error checking +func WriteMessage(conn net.Conn, msg *Msg) error { + var pack []byte + + // Encode the type and the (RLP encoded) data for sending over the wire + encoded := ethutil.NewValue(append([]interface{}{byte(msg.Type)}, msg.Data.Slice()...)).Encode() + payloadLength := ethutil.NumberToBytes(uint32(len(encoded)), 32) + + // Write magic token and payload length (first 8 bytes) + pack = append(MagicToken, payloadLength...) + pack = append(pack, encoded...) + //fmt.Printf("payload %v (%v) %q\n", msg.Type, conn.RemoteAddr(), encoded) + + // Write to the connection + _, err := conn.Write(pack) + if err != nil { + return err + } + + return nil +} diff --git a/xeth/config.go b/xeth/config.go new file mode 100644 index 000000000..ad0660d75 --- /dev/null +++ b/xeth/config.go @@ -0,0 +1,35 @@ +package xeth + +import "github.com/ethereum/go-ethereum/ethutil" + +var cnfCtr = ethutil.Hex2Bytes("661005d2720d855f1d9976f88bb10c1a3398c77f") + +type Config struct { + pipe *XEth +} + +func (self *Config) Get(name string) *Object { + configCtrl := self.pipe.World().safeGet(cnfCtr) + var addr []byte + + switch name { + case "NameReg": + addr = []byte{0} + case "DnsReg": + objectAddr := configCtrl.GetStorage(ethutil.BigD([]byte{0})) + domainAddr := (&Object{self.pipe.World().safeGet(objectAddr.Bytes())}).StorageString("DnsReg").Bytes() + return &Object{self.pipe.World().safeGet(domainAddr)} + case "MergeMining": + addr = []byte{4} + default: + addr = ethutil.RightPadBytes([]byte(name), 32) + } + + objectAddr := configCtrl.GetStorage(ethutil.BigD(addr)) + + return &Object{self.pipe.World().safeGet(objectAddr.Bytes())} +} + +func (self *Config) Exist() bool { + return self.pipe.World().Get(cnfCtr) != nil +} diff --git a/xeth/hexface.go b/xeth/hexface.go new file mode 100644 index 000000000..bfd2dddd9 --- /dev/null +++ b/xeth/hexface.go @@ -0,0 +1,255 @@ +package xeth + +import ( + "bytes" + "encoding/json" + "sync/atomic" + + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/state" +) + +type JSXEth struct { + *XEth +} + +func NewJSXEth(eth core.EthManager) *JSXEth { + return &JSXEth{New(eth)} +} + +func (self *JSXEth) BlockByHash(strHash string) *JSBlock { + hash := ethutil.Hex2Bytes(strHash) + block := self.obj.ChainManager().GetBlock(hash) + + return NewJSBlock(block) +} + +func (self *JSXEth) BlockByNumber(num int32) *JSBlock { + if num == -1 { + return NewJSBlock(self.obj.ChainManager().CurrentBlock()) + } + + return NewJSBlock(self.obj.ChainManager().GetBlockByNumber(uint64(num))) +} + +func (self *JSXEth) Block(v interface{}) *JSBlock { + if n, ok := v.(int32); ok { + return self.BlockByNumber(n) + } else if str, ok := v.(string); ok { + return self.BlockByHash(str) + } else if f, ok := v.(float64); ok { // Don't ask ... + return self.BlockByNumber(int32(f)) + } + + return nil +} + +func (self *JSXEth) Key() *JSKey { + return NewJSKey(self.obj.KeyManager().KeyPair()) +} + +func (self *JSXEth) StateObject(addr string) *JSObject { + object := &Object{self.World().safeGet(ethutil.Hex2Bytes(addr))} + + return NewJSObject(object) +} + +func (self *JSXEth) PeerCount() int { + return self.obj.PeerCount() +} + +func (self *JSXEth) Peers() []JSPeer { + var peers []JSPeer + for peer := self.obj.Peers().Front(); peer != nil; peer = peer.Next() { + p := peer.Value.(core.Peer) + // we only want connected peers + if atomic.LoadInt32(p.Connected()) != 0 { + peers = append(peers, *NewJSPeer(p)) + } + } + + return peers +} + +func (self *JSXEth) IsMining() bool { + return self.obj.IsMining() +} + +func (self *JSXEth) IsListening() bool { + return self.obj.IsListening() +} + +func (self *JSXEth) CoinBase() string { + return ethutil.Bytes2Hex(self.obj.KeyManager().Address()) +} + +func (self *JSXEth) NumberToHuman(balance string) string { + b := ethutil.Big(balance) + + return ethutil.CurrencyToString(b) +} + +func (self *JSXEth) StorageAt(addr, storageAddr string) string { + storage := self.World().SafeGet(ethutil.Hex2Bytes(addr)).Storage(ethutil.Hex2Bytes(storageAddr)) + + return ethutil.Bytes2Hex(storage.Bytes()) +} + +func (self *JSXEth) BalanceAt(addr string) string { + return self.World().SafeGet(ethutil.Hex2Bytes(addr)).Balance().String() +} + +func (self *JSXEth) TxCountAt(address string) int { + return int(self.World().SafeGet(ethutil.Hex2Bytes(address)).Nonce) +} + +func (self *JSXEth) CodeAt(address string) string { + return ethutil.Bytes2Hex(self.World().SafeGet(ethutil.Hex2Bytes(address)).Code) +} + +func (self *JSXEth) IsContract(address string) bool { + return len(self.World().SafeGet(ethutil.Hex2Bytes(address)).Code) > 0 +} + +func (self *JSXEth) SecretToAddress(key string) string { + pair, err := crypto.NewKeyPairFromSec(ethutil.Hex2Bytes(key)) + if err != nil { + return "" + } + + return ethutil.Bytes2Hex(pair.Address()) +} + +func (self *JSXEth) Execute(addr, value, gas, price, data string) (string, error) { + ret, err := self.ExecuteObject(&Object{ + self.World().safeGet(ethutil.Hex2Bytes(addr))}, + ethutil.Hex2Bytes(data), + ethutil.NewValue(value), + ethutil.NewValue(gas), + ethutil.NewValue(price), + ) + + return ethutil.Bytes2Hex(ret), err +} + +type KeyVal struct { + Key string `json:"key"` + Value string `json:"value"` +} + +func (self *JSXEth) EachStorage(addr string) string { + var values []KeyVal + object := self.World().SafeGet(ethutil.Hex2Bytes(addr)) + object.EachStorage(func(name string, value *ethutil.Value) { + value.Decode() + values = append(values, KeyVal{ethutil.Bytes2Hex([]byte(name)), ethutil.Bytes2Hex(value.Bytes())}) + }) + + valuesJson, err := json.Marshal(values) + if err != nil { + return "" + } + + return string(valuesJson) +} + +func (self *JSXEth) ToAscii(str string) string { + padded := ethutil.RightPadBytes([]byte(str), 32) + + return "0x" + ethutil.Bytes2Hex(padded) +} + +func (self *JSXEth) FromAscii(str string) string { + if ethutil.IsHex(str) { + str = str[2:] + } + + return string(bytes.Trim(ethutil.Hex2Bytes(str), "\x00")) +} + +func (self *JSXEth) FromNumber(str string) string { + if ethutil.IsHex(str) { + str = str[2:] + } + + return ethutil.BigD(ethutil.Hex2Bytes(str)).String() +} + +func (self *JSXEth) Transact(key, toStr, valueStr, gasStr, gasPriceStr, codeStr string) (string, error) { + var ( + to []byte + value = ethutil.NewValue(valueStr) + gas = ethutil.NewValue(gasStr) + gasPrice = ethutil.NewValue(gasPriceStr) + data []byte + ) + + if ethutil.IsHex(codeStr) { + data = ethutil.Hex2Bytes(codeStr[2:]) + } else { + data = ethutil.Hex2Bytes(codeStr) + } + + if ethutil.IsHex(toStr) { + to = ethutil.Hex2Bytes(toStr[2:]) + } else { + to = ethutil.Hex2Bytes(toStr) + } + + var keyPair *crypto.KeyPair + var err error + if ethutil.IsHex(key) { + keyPair, err = crypto.NewKeyPairFromSec([]byte(ethutil.Hex2Bytes(key[2:]))) + } else { + keyPair, err = crypto.NewKeyPairFromSec([]byte(ethutil.Hex2Bytes(key))) + } + + if err != nil { + return "", err + } + + tx, err := self.XEth.Transact(keyPair, to, value, gas, gasPrice, data) + if err != nil { + return "", err + } + if types.IsContractAddr(to) { + return ethutil.Bytes2Hex(core.AddressFromMessage(tx)), nil + } + + return ethutil.Bytes2Hex(tx.Hash()), nil +} + +func (self *JSXEth) PushTx(txStr string) (*JSReceipt, error) { + tx := types.NewTransactionFromBytes(ethutil.Hex2Bytes(txStr)) + err := self.obj.TxPool().Add(tx) + if err != nil { + return nil, err + } + + return NewJSReciept(core.MessageCreatesContract(tx), core.AddressFromMessage(tx), tx.Hash(), tx.From()), nil +} + +func (self *JSXEth) CompileMutan(code string) string { + data, err := self.XEth.CompileMutan(code) + if err != nil { + return err.Error() + } + + return ethutil.Bytes2Hex(data) +} + +func (self *JSXEth) FindInConfig(str string) string { + return ethutil.Bytes2Hex(self.World().Config().Get(str).Address()) +} + +func ToJSMessages(messages state.Messages) *ethutil.List { + var msgs []JSMessage + for _, m := range messages { + msgs = append(msgs, NewJSMessage(m)) + } + + return ethutil.NewList(msgs) +} diff --git a/xeth/js_types.go b/xeth/js_types.go new file mode 100644 index 000000000..62867d6a9 --- /dev/null +++ b/xeth/js_types.go @@ -0,0 +1,236 @@ +package xeth + +import ( + "fmt" + "strconv" + "strings" + + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/state" +) + +// Block interface exposed to QML +type JSBlock struct { + //Transactions string `json:"transactions"` + ref *types.Block + Size string `json:"size"` + Number int `json:"number"` + Hash string `json:"hash"` + Transactions *ethutil.List `json:"transactions"` + Uncles *ethutil.List `json:"uncles"` + Time int64 `json:"time"` + Coinbase string `json:"coinbase"` + Name string `json:"name"` + GasLimit string `json:"gasLimit"` + GasUsed string `json:"gasUsed"` + PrevHash string `json:"prevHash"` + Bloom string `json:"bloom"` + Raw string `json:"raw"` +} + +// Creates a new QML Block from a chain block +func NewJSBlock(block *types.Block) *JSBlock { + if block == nil { + return &JSBlock{} + } + + ptxs := make([]*JSTransaction, len(block.Transactions())) + for i, tx := range block.Transactions() { + ptxs[i] = NewJSTx(tx, block.State()) + } + txlist := ethutil.NewList(ptxs) + + puncles := make([]*JSBlock, len(block.Uncles)) + for i, uncle := range block.Uncles { + puncles[i] = NewJSBlock(uncle) + } + ulist := ethutil.NewList(puncles) + + return &JSBlock{ + ref: block, Size: block.Size().String(), + Number: int(block.Number.Uint64()), GasUsed: block.GasUsed.String(), + GasLimit: block.GasLimit.String(), Hash: ethutil.Bytes2Hex(block.Hash()), + Transactions: txlist, Uncles: ulist, + Time: block.Time, + Coinbase: ethutil.Bytes2Hex(block.Coinbase), + PrevHash: ethutil.Bytes2Hex(block.PrevHash), + Bloom: ethutil.Bytes2Hex(block.LogsBloom), + Raw: block.String(), + } +} + +func (self *JSBlock) ToString() string { + if self.ref != nil { + return self.ref.String() + } + + return "" +} + +func (self *JSBlock) GetTransaction(hash string) *JSTransaction { + tx := self.ref.GetTransaction(ethutil.Hex2Bytes(hash)) + if tx == nil { + return nil + } + + return NewJSTx(tx, self.ref.State()) +} + +type JSTransaction struct { + ref *types.Transaction + + Value string `json:"value"` + Gas string `json:"gas"` + GasPrice string `json:"gasPrice"` + Hash string `json:"hash"` + Address string `json:"address"` + Sender string `json:"sender"` + RawData string `json:"rawData"` + Data string `json:"data"` + Contract bool `json:"isContract"` + CreatesContract bool `json:"createsContract"` + Confirmations int `json:"confirmations"` +} + +func NewJSTx(tx *types.Transaction, state *state.StateDB) *JSTransaction { + hash := ethutil.Bytes2Hex(tx.Hash()) + receiver := ethutil.Bytes2Hex(tx.To()) + if receiver == "0000000000000000000000000000000000000000" { + receiver = ethutil.Bytes2Hex(core.AddressFromMessage(tx)) + } + sender := ethutil.Bytes2Hex(tx.Sender()) + createsContract := core.MessageCreatesContract(tx) + + var data string + if createsContract { + data = strings.Join(core.Disassemble(tx.Data()), "\n") + } else { + data = ethutil.Bytes2Hex(tx.Data()) + } + + return &JSTransaction{ref: tx, Hash: hash, Value: ethutil.CurrencyToString(tx.Value()), Address: receiver, Contract: createsContract, Gas: tx.Gas().String(), GasPrice: tx.GasPrice().String(), Data: data, Sender: sender, CreatesContract: createsContract, RawData: ethutil.Bytes2Hex(tx.Data())} +} + +func (self *JSTransaction) ToString() string { + return self.ref.String() +} + +type JSKey struct { + Address string `json:"address"` + PrivateKey string `json:"privateKey"` + PublicKey string `json:"publicKey"` +} + +func NewJSKey(key *crypto.KeyPair) *JSKey { + return &JSKey{ethutil.Bytes2Hex(key.Address()), ethutil.Bytes2Hex(key.PrivateKey), ethutil.Bytes2Hex(key.PublicKey)} +} + +type JSObject struct { + *Object +} + +func NewJSObject(object *Object) *JSObject { + return &JSObject{object} +} + +type PReceipt struct { + CreatedContract bool `json:"createdContract"` + Address string `json:"address"` + Hash string `json:"hash"` + Sender string `json:"sender"` +} + +func NewPReciept(contractCreation bool, creationAddress, hash, address []byte) *PReceipt { + return &PReceipt{ + contractCreation, + ethutil.Bytes2Hex(creationAddress), + ethutil.Bytes2Hex(hash), + ethutil.Bytes2Hex(address), + } +} + +// Peer interface exposed to QML + +type JSPeer struct { + ref *core.Peer + Inbound bool `json:"isInbound"` + LastSend int64 `json:"lastSend"` + LastPong int64 `json:"lastPong"` + Ip string `json:"ip"` + Port int `json:"port"` + Version string `json:"version"` + LastResponse string `json:"lastResponse"` + Latency string `json:"latency"` + Caps string `json:"caps"` +} + +func NewJSPeer(peer core.Peer) *JSPeer { + if peer == nil { + return nil + } + + var ip []string + for _, i := range peer.Host() { + ip = append(ip, strconv.Itoa(int(i))) + } + ipAddress := strings.Join(ip, ".") + + var caps []string + capsIt := peer.Caps().NewIterator() + for capsIt.Next() { + cap := capsIt.Value().Get(0).Str() + ver := capsIt.Value().Get(1).Uint() + caps = append(caps, fmt.Sprintf("%s/%d", cap, ver)) + } + + return &JSPeer{ref: &peer, Inbound: peer.Inbound(), LastSend: peer.LastSend().Unix(), LastPong: peer.LastPong(), Version: peer.Version(), Ip: ipAddress, Port: int(peer.Port()), Latency: peer.PingTime(), Caps: "[" + strings.Join(caps, ", ") + "]"} +} + +type JSReceipt struct { + CreatedContract bool `json:"createdContract"` + Address string `json:"address"` + Hash string `json:"hash"` + Sender string `json:"sender"` +} + +func NewJSReciept(contractCreation bool, creationAddress, hash, address []byte) *JSReceipt { + return &JSReceipt{ + contractCreation, + ethutil.Bytes2Hex(creationAddress), + ethutil.Bytes2Hex(hash), + ethutil.Bytes2Hex(address), + } +} + +type JSMessage struct { + To string `json:"to"` + From string `json:"from"` + Input string `json:"input"` + Output string `json:"output"` + Path int32 `json:"path"` + Origin string `json:"origin"` + Timestamp int32 `json:"timestamp"` + Coinbase string `json:"coinbase"` + Block string `json:"block"` + Number int32 `json:"number"` + Value string `json:"value"` +} + +func NewJSMessage(message *state.Message) JSMessage { + return JSMessage{ + To: ethutil.Bytes2Hex(message.To), + From: ethutil.Bytes2Hex(message.From), + Input: ethutil.Bytes2Hex(message.Input), + Output: ethutil.Bytes2Hex(message.Output), + Path: int32(message.Path), + Origin: ethutil.Bytes2Hex(message.Origin), + Timestamp: int32(message.Timestamp), + Coinbase: ethutil.Bytes2Hex(message.Origin), + Block: ethutil.Bytes2Hex(message.Block), + Number: int32(message.Number.Int64()), + Value: message.Value.String(), + } +} diff --git a/xeth/object.go b/xeth/object.go new file mode 100644 index 000000000..a4ac41e89 --- /dev/null +++ b/xeth/object.go @@ -0,0 +1,26 @@ +package xeth + +import ( + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/state" +) + +type Object struct { + *state.StateObject +} + +func (self *Object) StorageString(str string) *ethutil.Value { + if ethutil.IsHex(str) { + return self.Storage(ethutil.Hex2Bytes(str[2:])) + } else { + return self.Storage(ethutil.RightPadBytes([]byte(str), 32)) + } +} + +func (self *Object) StorageValue(addr *ethutil.Value) *ethutil.Value { + return self.Storage(addr.Bytes()) +} + +func (self *Object) Storage(addr []byte) *ethutil.Value { + return self.StateObject.GetStorage(ethutil.BigD(addr)) +} diff --git a/xeth/pipe.go b/xeth/pipe.go new file mode 100644 index 000000000..06820cc86 --- /dev/null +++ b/xeth/pipe.go @@ -0,0 +1,181 @@ +package xeth + +/* + * eXtended ETHereum + */ + +import ( + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/state" +) + +var pipelogger = logger.NewLogger("XETH") + +type VmVars struct { + State *state.StateDB +} + +type XEth struct { + obj core.EthManager + blockManager *core.BlockManager + chainManager *core.ChainManager + world *World + + Vm VmVars +} + +func New(obj core.EthManager) *XEth { + pipe := &XEth{ + obj: obj, + blockManager: obj.BlockManager(), + chainManager: obj.ChainManager(), + } + pipe.world = NewWorld(pipe) + + return pipe +} + +/* + * State / Account accessors + */ +func (self *XEth) Balance(addr []byte) *ethutil.Value { + return ethutil.NewValue(self.World().safeGet(addr).Balance) +} + +func (self *XEth) Nonce(addr []byte) uint64 { + return self.World().safeGet(addr).Nonce +} + +func (self *XEth) Block(hash []byte) *types.Block { + return self.chainManager.GetBlock(hash) +} + +func (self *XEth) Storage(addr, storageAddr []byte) *ethutil.Value { + return self.World().safeGet(addr).GetStorage(ethutil.BigD(storageAddr)) +} + +func (self *XEth) Exists(addr []byte) bool { + return self.World().Get(addr) != nil +} + +// Converts the given private key to an address +func (self *XEth) ToAddress(priv []byte) []byte { + pair, err := crypto.NewKeyPairFromSec(priv) + if err != nil { + return nil + } + + return pair.Address() +} + +/* + * Execution helpers + */ +func (self *XEth) Execute(addr []byte, data []byte, value, gas, price *ethutil.Value) ([]byte, error) { + return self.ExecuteObject(&Object{self.World().safeGet(addr)}, data, value, gas, price) +} + +func (self *XEth) ExecuteObject(object *Object, data []byte, value, gas, price *ethutil.Value) ([]byte, error) { + var ( + initiator = state.NewStateObject(self.obj.KeyManager().KeyPair().Address()) + block = self.chainManager.CurrentBlock() + ) + + self.Vm.State = self.World().State().Copy() + + vmenv := NewEnv(self.Vm.State, block, value.BigInt(), initiator.Address()) + return vmenv.Call(initiator, object.Address(), data, gas.BigInt(), price.BigInt(), value.BigInt()) +} + +/* + * Transactional methods + */ +func (self *XEth) TransactString(key *crypto.KeyPair, rec string, value, gas, price *ethutil.Value, data []byte) (*types.Transaction, error) { + // Check if an address is stored by this address + var hash []byte + addr := self.World().Config().Get("NameReg").StorageString(rec).Bytes() + if len(addr) > 0 { + hash = addr + } else if ethutil.IsHex(rec) { + hash = ethutil.Hex2Bytes(rec[2:]) + } else { + hash = ethutil.Hex2Bytes(rec) + } + + return self.Transact(key, hash, value, gas, price, data) +} + +func (self *XEth) Transact(key *crypto.KeyPair, to []byte, value, gas, price *ethutil.Value, data []byte) (*types.Transaction, error) { + var hash []byte + var contractCreation bool + if types.IsContractAddr(to) { + contractCreation = true + } else { + // Check if an address is stored by this address + addr := self.World().Config().Get("NameReg").Storage(to).Bytes() + if len(addr) > 0 { + hash = addr + } else { + hash = to + } + } + + var tx *types.Transaction + if contractCreation { + tx = types.NewContractCreationTx(value.BigInt(), gas.BigInt(), price.BigInt(), data) + } else { + tx = types.NewTransactionMessage(hash, value.BigInt(), gas.BigInt(), price.BigInt(), data) + } + + state := self.chainManager.TransState() + nonce := state.GetNonce(key.Address()) + + tx.SetNonce(nonce) + tx.Sign(key.PrivateKey) + + // Do some pre processing for our "pre" events and hooks + block := self.chainManager.NewBlock(key.Address()) + coinbase := state.GetStateObject(key.Address()) + coinbase.SetGasPool(block.GasLimit) + self.blockManager.ApplyTransactions(coinbase, state, block, types.Transactions{tx}, true) + + err := self.obj.TxPool().Add(tx) + if err != nil { + return nil, err + } + state.SetNonce(key.Address(), nonce+1) + + if contractCreation { + addr := core.AddressFromMessage(tx) + pipelogger.Infof("Contract addr %x\n", addr) + } + + return tx, nil +} + +func (self *XEth) PushTx(tx *types.Transaction) ([]byte, error) { + err := self.obj.TxPool().Add(tx) + if err != nil { + return nil, err + } + + if tx.To() == nil { + addr := core.AddressFromMessage(tx) + pipelogger.Infof("Contract addr %x\n", addr) + return addr, nil + } + return tx.Hash(), nil +} + +func (self *XEth) CompileMutan(code string) ([]byte, error) { + data, err := ethutil.Compile(code, false) + if err != nil { + return nil, err + } + + return data, nil +} diff --git a/xeth/vm_env.go b/xeth/vm_env.go new file mode 100644 index 000000000..7fb674a94 --- /dev/null +++ b/xeth/vm_env.go @@ -0,0 +1,65 @@ +package xeth + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/state" + "github.com/ethereum/go-ethereum/vm" +) + +type VMEnv struct { + state *state.StateDB + block *types.Block + value *big.Int + sender []byte + + depth int +} + +func NewEnv(state *state.StateDB, block *types.Block, value *big.Int, sender []byte) *VMEnv { + return &VMEnv{ + state: state, + block: block, + value: value, + sender: sender, + } +} + +func (self *VMEnv) Origin() []byte { return self.sender } +func (self *VMEnv) BlockNumber() *big.Int { return self.block.Number } +func (self *VMEnv) PrevHash() []byte { return self.block.PrevHash } +func (self *VMEnv) Coinbase() []byte { return self.block.Coinbase } +func (self *VMEnv) Time() int64 { return self.block.Time } +func (self *VMEnv) Difficulty() *big.Int { return self.block.Difficulty } +func (self *VMEnv) BlockHash() []byte { return self.block.Hash() } +func (self *VMEnv) Value() *big.Int { return self.value } +func (self *VMEnv) State() *state.StateDB { return self.state } +func (self *VMEnv) GasLimit() *big.Int { return self.block.GasLimit } +func (self *VMEnv) Depth() int { return self.depth } +func (self *VMEnv) SetDepth(i int) { self.depth = i } +func (self *VMEnv) AddLog(log state.Log) { + self.state.AddLog(log) +} +func (self *VMEnv) Transfer(from, to vm.Account, amount *big.Int) error { + return vm.Transfer(from, to, amount) +} + +func (self *VMEnv) vm(addr, data []byte, gas, price, value *big.Int) *core.Execution { + return core.NewExecution(self, addr, data, gas, price, value) +} + +func (self *VMEnv) Call(me vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) { + exe := self.vm(addr, data, gas, price, value) + return exe.Call(addr, me) +} +func (self *VMEnv) CallCode(me vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) { + exe := self.vm(me.Address(), data, gas, price, value) + return exe.Call(addr, me) +} + +func (self *VMEnv) Create(me vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error, vm.ClosureRef) { + exe := self.vm(addr, data, gas, price, value) + return exe.Create(me) +} diff --git a/xeth/world.go b/xeth/world.go new file mode 100644 index 000000000..956ef1e15 --- /dev/null +++ b/xeth/world.go @@ -0,0 +1,64 @@ +package xeth + +import ( + "container/list" + + "github.com/ethereum/go-ethereum/state" +) + +type World struct { + pipe *XEth + cfg *Config +} + +func NewWorld(pipe *XEth) *World { + world := &World{pipe, nil} + world.cfg = &Config{pipe} + + return world +} + +func (self *XEth) World() *World { + return self.world +} + +func (self *World) State() *state.StateDB { + return self.pipe.chainManager.State() +} + +func (self *World) Get(addr []byte) *Object { + return &Object{self.State().GetStateObject(addr)} +} + +func (self *World) SafeGet(addr []byte) *Object { + return &Object{self.safeGet(addr)} +} + +func (self *World) safeGet(addr []byte) *state.StateObject { + object := self.State().GetStateObject(addr) + if object == nil { + object = state.NewStateObject(addr) + } + + return object +} + +func (self *World) Coinbase() *state.StateObject { + return nil +} + +func (self *World) IsMining() bool { + return self.pipe.obj.IsMining() +} + +func (self *World) IsListening() bool { + return self.pipe.obj.IsListening() +} + +func (self *World) Peers() *list.List { + return self.pipe.obj.Peers() +} + +func (self *World) Config() *Config { + return self.cfg +} |