diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 829bf5d43b..291c354971 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,18 +1,10 @@ -## Can I have feature X +If you'd like to contribute to go-expanse please fork, fix, commit and -Before you do a feature request please check and make sure that it isn't possible -through some other means. The JavaScript enabled console is a powerful feature -in the right hands. Please check our [Bitchin' tricks](https://github.com/ethereum/go-ethereum/wiki/bitchin-tricks) wiki page for more info -and help. - -## Contributing - -If you'd like to contribute to go-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. -See [Developers' Guide](https://github.com/ethereum/go-ethereum/wiki/Developers'-Guide) +See [Developers' Guide](https://github.com/expanse-project/go-expanse/wiki/Developers'-Guide) for more details on configuring your environment, testing, and dependency management. diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 6c1cb9f9ad..0a1d643e38 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,6 +1,6 @@ #### System information -Geth version: `geth version` +Gexp version: `gexp version` OS & Version: Windows/Linux/OSX Commit hash : (if `develop`) diff --git a/.gitignore b/.gitignore index e8e10db2ff..afd374b26c 100644 --- a/.gitignore +++ b/.gitignore @@ -3,14 +3,14 @@ # 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 - +tests/files/VMTests/RandomTests/* /tmp */**/*un~ */**/*.test *un~ .DS_Store */**/.DS_Store -.ethtest +.exptest */**/*tx_database* */**/*dapps* Godeps/_workspace/pkg @@ -25,7 +25,7 @@ Godeps/_workspace/bin deploy/osx/Mist.app deploy/osx/Mist\ Installer.dmg -cmd/mist/assets/ext/ethereum.js/ +cmd/mist/assets/ext/expanse.js/ # used by the Makefile /build/_workspace/ @@ -35,5 +35,8 @@ cmd/mist/assets/ext/ethereum.js/ profile.tmp profile.cov +.idea/workspace.xml +*.idea/ + # vagrant .vagrant diff --git a/.gitmodules b/.gitmodules index 219564eb7b..5bb332a5c0 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "cmd/mist/assets/ext/ethereum.js"] - path = cmd/mist/assets/ext/ethereum.js - url = https://github.com/ethereum/web3.js +[submodule "cmd/mist/assets/ext/expanse.js"] + path = cmd/mist/assets/ext/expanse.js + url = https://github.com/expanse-org/web3.js diff --git a/.mailmap b/.mailmap index e801524964..705aad5587 100644 --- a/.mailmap +++ b/.mailmap @@ -1,65 +1,3 @@ -Jeffrey Wilcke -Jeffrey Wilcke -Jeffrey Wilcke -Jeffrey Wilcke - -Viktor Trón - -Joseph Goulden - -Nick Savers - -Maran Hidskes - -Taylor Gerring -Taylor Gerring - -Bas van Kervel -Bas van Kervel -Bas van Kervel - -Sven Ehlert - -Vitalik Buterin - -Marian Oancea - -Christoph Jentzsch - -Heiko Hees - -Alex Leverington -Alex Leverington - -Zsolt Felföldi - -Gavin Wood - -Martin Becze -Martin Becze - -Dimitry Khokhlov - -Roman Mandeleil - -Alec Perseghin - -Alon Muroch - -Arkadiy Paronyan - -Jae Kwon - -Aaron Kumavis - -Nick Dodson - -Jason Carver -Jason Carver - -Joseph Chow -Joseph Chow ethers - -Enrique Fynn - -Vincent G \ No newline at end of file +Christopher Franko +Dan Conway +James Clayton diff --git a/.travis.yml b/.travis.yml index c1d545c548..d2b5de983a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,7 +13,7 @@ before_script: # - go vet ./... # - go test -race ./... script: - - make travis-test-with-coverage + - make gexp after_success: - bash <(curl -s https://codecov.io/bash) env: diff --git a/AUTHORS b/AUTHORS index 69eb54874f..94e742aecf 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,9 +1,10 @@ -# This is the official list of go-ethereum authors for copyright purposes. +# This is the official list of go-expanse authors for copyright purposes. Alex Leverington Alexandre Van de Sande Bas van Kervel Christoph Jentzsch +Christopher Franko Daniel A. Nagy Drake Burroughs Enrique Fynn diff --git a/COPYING b/COPYING index 8d66e87723..593b66738e 100644 --- a/COPYING +++ b/COPYING @@ -1,7 +1,7 @@ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - Copyright (C) 2014 The go-ethereum Authors. + Copyright (C) 2015 The go-expanse Authors. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. diff --git a/COPYING.LESSER b/COPYING.LESSER index 65c5ca88a6..d0730e7bd7 100644 --- a/COPYING.LESSER +++ b/COPYING.LESSER @@ -79,7 +79,7 @@ layouts and accessors, or small macros, inline functions and templates 4. Combined Works. You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the +taken togexper, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: @@ -128,7 +128,7 @@ the following: 5. Combined Libraries. You may place library facilities that are a work based on the -Library side by side in a single library together with other library +Library side by side in a single library togexper with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index f2694a05cd..76822d051d 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -1,5 +1,5 @@ { - "ImportPath": "github.com/ethereum/go-ethereum", + "ImportPath": "github.com/expanse-project/go-expanse", "GoVersion": "go1.5.2", "Packages": [ "./..." @@ -23,7 +23,7 @@ "Rev": "5215b55f46b2b919f50a1df0eaa5886afe4e3b3d" }, { - "ImportPath": "github.com/ethereum/ethash", + "ImportPath": "github.com/expanse-org/ethash", "Comment": "v23.1-245-g25b32de", "Rev": "25b32de0c0271065c28c3719c2bfe86959d72f0c" }, diff --git a/Godeps/_workspace/src/github.com/codegangsta/cli/README.md b/Godeps/_workspace/src/github.com/codegangsta/cli/README.md index ae0a4ca3ac..4ca4e6eb45 100644 --- a/Godeps/_workspace/src/github.com/codegangsta/cli/README.md +++ b/Godeps/_workspace/src/github.com/codegangsta/cli/README.md @@ -347,6 +347,6 @@ to the name of their program (as above). Feel free to put up a pull request to fix a bug or maybe add a feature. I will give it a code review and make sure that it does not break backwards compatibility. If I or any other collaborators agree that it is in line with the vision of the project, we will work with you to get the code into a mergeable state and merge it into the master branch. -If you have contributed something significant to the project, I will most likely add you as a collaborator. As a collaborator you are given the ability to merge others pull requests. It is very important that new code does not break existing code, so be careful about what code you do choose to merge. If you have any questions feel free to link @codegangsta to the issue in question and we can review it together. +If you have contributed something significant to the project, I will most likely add you as a collaborator. As a collaborator you are given the ability to merge others pull requests. It is very important that new code does not break existing code, so be careful about what code you do choose to merge. If you have any questions feel free to link @codegangsta to the issue in question and we can review it togexper. If you feel like you have contributed to the project but have not yet been added as a collaborator, I probably forgot to add you. Hit @codegangsta up over email and we will get it figured out. diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/ethash_opencl.go b/Godeps/_workspace/src/github.com/ethereum/ethash/ethash_opencl.go index 451049eaee..66c8846d18 100644 --- a/Godeps/_workspace/src/github.com/ethereum/ethash/ethash_opencl.go +++ b/Godeps/_workspace/src/github.com/ethereum/ethash/ethash_opencl.go @@ -39,8 +39,8 @@ import ( "unsafe" "github.com/Gustav-Simonsson/go-opencl/cl" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/pow" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/pow" ) /* @@ -187,8 +187,8 @@ func PrintDevices() { idsFormat += "," } } - fmt.Printf("Found %v devices. Benchmark first GPU: geth gpubench 0\n", len(found)) - fmt.Printf("Mine using all GPUs: geth --minegpu %v\n", idsFormat) + fmt.Printf("Found %v devices. Benchmark first GPU: gexp gpubench 0\n", len(found)) + fmt.Printf("Mine using all GPUs: gexp --minegpu %v\n", idsFormat) } } @@ -197,14 +197,14 @@ func PrintDevices() { func InitCL(blockNum uint64, c *OpenCLMiner) error { platforms, err := cl.GetPlatforms() if err != nil { - return fmt.Errorf("Plaform error: %v\nCheck your OpenCL installation and then run geth gpuinfo", err) + return fmt.Errorf("Plaform error: %v\nCheck your OpenCL installation and then run gexp gpuinfo", err) } var devices []*cl.Device for _, p := range platforms { ds, err := cl.GetDevices(p, cl.DeviceTypeGPU) if err != nil { - return fmt.Errorf("Devices error: %v\nCheck your GPU drivers and then run geth gpuinfo", err) + return fmt.Errorf("Devices error: %v\nCheck your GPU drivers and then run gexp gpuinfo", err) } for _, d := range ds { devices = append(devices, d) @@ -221,7 +221,7 @@ func InitCL(blockNum uint64, c *OpenCLMiner) error { for _, id := range c.deviceIds { if id > len(devices)-1 { - return fmt.Errorf("Device id not found. See available device ids with: geth gpuinfo") + return fmt.Errorf("Device id not found. See available device ids with: gexp gpuinfo") } else { err := initCLDevice(id, devices[id], c) if err != nil { diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/ethash_opencl_kernel_go_str.go b/Godeps/_workspace/src/github.com/ethereum/ethash/ethash_opencl_kernel_go_str.go index 695ff18299..3573f31926 100644 --- a/Godeps/_workspace/src/github.com/ethereum/ethash/ethash_opencl_kernel_go_str.go +++ b/Godeps/_workspace/src/github.com/ethereum/ethash/ethash_opencl_kernel_go_str.go @@ -407,7 +407,7 @@ hash32_t compute_hash( // Compute one init hash per work item. hash64_t init = init_hash(g_header, nonce, isolate); - // Threads work together in this phase in groups of 8. + // Threads work togexper in this phase in groups of 8. uint const thread_id = gid % THREADS_PER_HASH; uint const hash_id = (gid % GROUP_SIZE) / THREADS_PER_HASH; @@ -454,7 +454,7 @@ hash32_t compute_hash_chunks( // Compute one init hash per work item. hash64_t init = init_hash(g_header, nonce, isolate); - // Threads work together in this phase in groups of 8. + // Threads work togexper in this phase in groups of 8. uint const thread_id = gid % THREADS_PER_HASH; uint const hash_id = (gid % GROUP_SIZE) / THREADS_PER_HASH; diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/.gitignore b/Godeps/_workspace/src/github.com/expanse-project/ethash/.gitignore similarity index 100% rename from Godeps/_workspace/src/github.com/ethereum/ethash/.gitignore rename to Godeps/_workspace/src/github.com/expanse-project/ethash/.gitignore diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/.travis.yml b/Godeps/_workspace/src/github.com/expanse-project/ethash/.travis.yml similarity index 69% rename from Godeps/_workspace/src/github.com/ethereum/ethash/.travis.yml rename to Godeps/_workspace/src/github.com/expanse-project/ethash/.travis.yml index b83b02bf3c..a6d979e02e 100644 --- a/Godeps/_workspace/src/github.com/ethereum/ethash/.travis.yml +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/.travis.yml @@ -6,12 +6,12 @@ before_install: # for g++4.8 and C++11 - sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test - # Set up go-ethereum + # Set up go-expanse - sudo apt-get update -y -qq - sudo apt-get install -yqq libgmp3-dev - - git clone --depth=10 https://github.com/ethereum/go-ethereum ${GOPATH}/src/github.com/ethereum/go-ethereum - # use canned dependencies from the go-ethereum repository - - export GOPATH=$GOPATH:$GOPATH/src/github.com/ethereum/go-ethereum/Godeps/_workspace/ + - git clone --depth=10 https://github.com/expanse-project/go-expanse ${GOPATH}/src/github.com/expanse-project/go-expanse + # use canned dependencies from the go-expanse repository + - export GOPATH=$GOPATH:$GOPATH/src/github.com/expanse-project/go-expanse/Godeps/_workspace/ - echo $GOPATH install: diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/CMakeLists.txt b/Godeps/_workspace/src/github.com/expanse-project/ethash/CMakeLists.txt similarity index 100% rename from Godeps/_workspace/src/github.com/ethereum/ethash/CMakeLists.txt rename to Godeps/_workspace/src/github.com/expanse-project/ethash/CMakeLists.txt diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/MANIFEST.in b/Godeps/_workspace/src/github.com/expanse-project/ethash/MANIFEST.in similarity index 100% rename from Godeps/_workspace/src/github.com/ethereum/ethash/MANIFEST.in rename to Godeps/_workspace/src/github.com/expanse-project/ethash/MANIFEST.in diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/Makefile b/Godeps/_workspace/src/github.com/expanse-project/ethash/Makefile similarity index 100% rename from Godeps/_workspace/src/github.com/ethereum/ethash/Makefile rename to Godeps/_workspace/src/github.com/expanse-project/ethash/Makefile diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/README.md b/Godeps/_workspace/src/github.com/expanse-project/ethash/README.md similarity index 64% rename from Godeps/_workspace/src/github.com/ethereum/ethash/README.md rename to Godeps/_workspace/src/github.com/expanse-project/ethash/README.md index 2b2c3b544c..a0004a373f 100644 --- a/Godeps/_workspace/src/github.com/ethereum/ethash/README.md +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/README.md @@ -1,14 +1,14 @@ -[![Build Status](https://travis-ci.org/ethereum/ethash.svg?branch=master)](https://travis-ci.org/ethereum/ethash) +[![Build Status](https://travis-ci.org/expanse/ethash.svg?branch=master)](https://travis-ci.org/expanse/ethash) [![Windows Build Status](https://ci.appveyor.com/api/projects/status/github/debris/ethash?branch=master&svg=true)](https://ci.appveyor.com/project/debris/ethash-nr37r/branch/master) # Ethash -For details on this project, please see the Ethereum wiki: -https://github.com/ethereum/wiki/wiki/Ethash +For details on this project, please see the Expanse wiki: +https://github.com/expanse-project/wiki/wiki/Ethash ### Coding Style for C++ code: -Follow the same exact style as in [cpp-ethereum](https://github.com/ethereum/cpp-ethereum/blob/develop/CodingStandards.txt) +Follow the same exact style as in [cpp-expanse](https://github.com/expanse-project/cpp-expanse/blob/develop/CodingStandards.txt) ### Coding Style for C code: diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/Vagrantfile b/Godeps/_workspace/src/github.com/expanse-project/ethash/Vagrantfile similarity index 100% rename from Godeps/_workspace/src/github.com/ethereum/ethash/Vagrantfile rename to Godeps/_workspace/src/github.com/expanse-project/ethash/Vagrantfile diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/appveyor.yml b/Godeps/_workspace/src/github.com/expanse-project/ethash/appveyor.yml similarity index 100% rename from Godeps/_workspace/src/github.com/ethereum/ethash/appveyor.yml rename to Godeps/_workspace/src/github.com/expanse-project/ethash/appveyor.yml diff --git a/Godeps/_workspace/src/github.com/expanse-project/ethash/cmake/modules/CMakeParseArguments.cmake b/Godeps/_workspace/src/github.com/expanse-project/ethash/cmake/modules/CMakeParseArguments.cmake new file mode 100644 index 0000000000..8553f38f5f --- /dev/null +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/cmake/modules/CMakeParseArguments.cmake @@ -0,0 +1,161 @@ +#.rst: +# CMakeParseArguments +# ------------------- +# +# +# +# CMAKE_PARSE_ARGUMENTS( +# args...) +# +# CMAKE_PARSE_ARGUMENTS() is intended to be used in macros or functions +# for parsing the arguments given to that macro or function. It +# processes the arguments and defines a set of variables which hold the +# values of the respective options. +# +# The argument contains all options for the respective macro, +# i.e. keywords which can be used when calling the macro without any +# value following, like e.g. the OPTIONAL keyword of the install() +# command. +# +# The argument contains all keywords for this macro +# which are followed by one value, like e.g. DESTINATION keyword of the +# install() command. +# +# The argument contains all keywords for this +# macro which can be followed by more than one value, like e.g. the +# TARGETS or FILES keywords of the install() command. +# +# When done, CMAKE_PARSE_ARGUMENTS() will have defined for each of the +# keywords listed in , and +# a variable composed of the given +# followed by "_" and the name of the respective keyword. These +# variables will then hold the respective value from the argument list. +# For the keywords this will be TRUE or FALSE. +# +# All remaining arguments are collected in a variable +# _UNPARSED_ARGUMENTS, this can be checked afterwards to see +# whether your macro was called with unrecognized parameters. +# +# As an example here a my_install() macro, which takes similar arguments +# as the real install() command: +# +# :: +# +# function(MY_INSTALL) +# set(options OPTIONAL FAST) +# set(oneValueArgs DESTINATION RENAME) +# set(multiValueArgs TARGETS CONFIGURATIONS) +# cmake_parse_arguments(MY_INSTALL "${options}" "${oneValueArgs}" +# "${multiValueArgs}" ${ARGN} ) +# ... +# +# +# +# Assume my_install() has been called like this: +# +# :: +# +# my_install(TARGETS foo bar DESTINATION bin OPTIONAL blub) +# +# +# +# After the cmake_parse_arguments() call the macro will have set the +# following variables: +# +# :: +# +# MY_INSTALL_OPTIONAL = TRUE +# MY_INSTALL_FAST = FALSE (this option was not used when calling my_install() +# MY_INSTALL_DESTINATION = "bin" +# MY_INSTALL_RENAME = "" (was not used) +# MY_INSTALL_TARGETS = "foo;bar" +# MY_INSTALL_CONFIGURATIONS = "" (was not used) +# MY_INSTALL_UNPARSED_ARGUMENTS = "blub" (no value expected after "OPTIONAL" +# +# +# +# You can then continue and process these variables. +# +# Keywords terminate lists of values, e.g. if directly after a +# one_value_keyword another recognized keyword follows, this is +# interpreted as the beginning of the new option. E.g. +# my_install(TARGETS foo DESTINATION OPTIONAL) would result in +# MY_INSTALL_DESTINATION set to "OPTIONAL", but MY_INSTALL_DESTINATION +# would be empty and MY_INSTALL_OPTIONAL would be set to TRUE therefor. + +#============================================================================= +# Copyright 2010 Alexander Neundorf +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + + +if(__CMAKE_PARSE_ARGUMENTS_INCLUDED) + return() +endif() +set(__CMAKE_PARSE_ARGUMENTS_INCLUDED TRUE) + + +function(CMAKE_PARSE_ARGUMENTS prefix _optionNames _singleArgNames _multiArgNames) + # first set all result variables to empty/FALSE + foreach(arg_name ${_singleArgNames} ${_multiArgNames}) + set(${prefix}_${arg_name}) + endforeach() + + foreach(option ${_optionNames}) + set(${prefix}_${option} FALSE) + endforeach() + + set(${prefix}_UNPARSED_ARGUMENTS) + + set(insideValues FALSE) + set(currentArgName) + + # now iterate over all arguments and fill the result variables + foreach(currentArg ${ARGN}) + list(FIND _optionNames "${currentArg}" optionIndex) # ... then this marks the end of the arguments belonging to this keyword + list(FIND _singleArgNames "${currentArg}" singleArgIndex) # ... then this marks the end of the arguments belonging to this keyword + list(FIND _multiArgNames "${currentArg}" multiArgIndex) # ... then this marks the end of the arguments belonging to this keyword + + if(${optionIndex} EQUAL -1 AND ${singleArgIndex} EQUAL -1 AND ${multiArgIndex} EQUAL -1) + if(insideValues) + if("${insideValues}" STREQUAL "SINGLE") + set(${prefix}_${currentArgName} ${currentArg}) + set(insideValues FALSE) + elseif("${insideValues}" STREQUAL "MULTI") + list(APPEND ${prefix}_${currentArgName} ${currentArg}) + endif() + else() + list(APPEND ${prefix}_UNPARSED_ARGUMENTS ${currentArg}) + endif() + else() + if(NOT ${optionIndex} EQUAL -1) + set(${prefix}_${currentArg} TRUE) + set(insideValues FALSE) + elseif(NOT ${singleArgIndex} EQUAL -1) + set(currentArgName ${currentArg}) + set(${prefix}_${currentArgName}) + set(insideValues "SINGLE") + elseif(NOT ${multiArgIndex} EQUAL -1) + set(currentArgName ${currentArg}) + set(${prefix}_${currentArgName}) + set(insideValues "MULTI") + endif() + endif() + + endforeach() + + # propagate the result variables to the caller: + foreach(arg_name ${_singleArgNames} ${_multiArgNames} ${_optionNames}) + set(${prefix}_${arg_name} ${${prefix}_${arg_name}} PARENT_SCOPE) + endforeach() + set(${prefix}_UNPARSED_ARGUMENTS ${${prefix}_UNPARSED_ARGUMENTS} PARENT_SCOPE) + +endfunction() diff --git a/Godeps/_workspace/src/github.com/expanse-project/ethash/cmake/modules/FindCryptoPP.cmake b/Godeps/_workspace/src/github.com/expanse-project/ethash/cmake/modules/FindCryptoPP.cmake new file mode 100644 index 0000000000..5ca01e4468 --- /dev/null +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/cmake/modules/FindCryptoPP.cmake @@ -0,0 +1,108 @@ +# Module for locating the Crypto++ encryption library. +# +# Customizable variables: +# CRYPTOPP_ROOT_DIR +# This variable points to the CryptoPP root directory. On Windows the +# library location typically will have to be provided explicitly using the +# -D command-line option. The directory should include the include/cryptopp, +# lib and/or bin sub-directories. +# +# Read-only variables: +# CRYPTOPP_FOUND +# Indicates whether the library has been found. +# +# CRYPTOPP_INCLUDE_DIRS +# Points to the CryptoPP include directory. +# +# CRYPTOPP_LIBRARIES +# Points to the CryptoPP libraries that should be passed to +# target_link_libararies. +# +# +# Copyright (c) 2012 Sergiu Dotenco +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +INCLUDE (FindPackageHandleStandardArgs) + +FIND_PATH (CRYPTOPP_ROOT_DIR + NAMES cryptopp/cryptlib.h include/cryptopp/cryptlib.h + PATHS ENV CRYPTOPPROOT + DOC "CryptoPP root directory") + +# Re-use the previous path: +FIND_PATH (CRYPTOPP_INCLUDE_DIR + NAMES cryptopp/cryptlib.h + HINTS ${CRYPTOPP_ROOT_DIR} + PATH_SUFFIXES include + DOC "CryptoPP include directory") + +FIND_LIBRARY (CRYPTOPP_LIBRARY_DEBUG + NAMES cryptlibd cryptoppd + HINTS ${CRYPTOPP_ROOT_DIR} + PATH_SUFFIXES lib + DOC "CryptoPP debug library") + +FIND_LIBRARY (CRYPTOPP_LIBRARY_RELEASE + NAMES cryptlib cryptopp + HINTS ${CRYPTOPP_ROOT_DIR} + PATH_SUFFIXES lib + DOC "CryptoPP release library") + +IF (CRYPTOPP_LIBRARY_DEBUG AND CRYPTOPP_LIBRARY_RELEASE) + SET (CRYPTOPP_LIBRARY + optimized ${CRYPTOPP_LIBRARY_RELEASE} + debug ${CRYPTOPP_LIBRARY_DEBUG} CACHE DOC "CryptoPP library") +ELSEIF (CRYPTOPP_LIBRARY_RELEASE) + SET (CRYPTOPP_LIBRARY ${CRYPTOPP_LIBRARY_RELEASE} CACHE DOC + "CryptoPP library") +ENDIF (CRYPTOPP_LIBRARY_DEBUG AND CRYPTOPP_LIBRARY_RELEASE) + +IF (CRYPTOPP_INCLUDE_DIR) + SET (_CRYPTOPP_VERSION_HEADER ${CRYPTOPP_INCLUDE_DIR}/cryptopp/config.h) + + IF (EXISTS ${_CRYPTOPP_VERSION_HEADER}) + FILE (STRINGS ${_CRYPTOPP_VERSION_HEADER} _CRYPTOPP_VERSION_TMP REGEX + "^#define CRYPTOPP_VERSION[ \t]+[0-9]+$") + + STRING (REGEX REPLACE + "^#define CRYPTOPP_VERSION[ \t]+([0-9]+)" "\\1" _CRYPTOPP_VERSION_TMP + ${_CRYPTOPP_VERSION_TMP}) + + STRING (REGEX REPLACE "([0-9]+)[0-9][0-9]" "\\1" CRYPTOPP_VERSION_MAJOR + ${_CRYPTOPP_VERSION_TMP}) + STRING (REGEX REPLACE "[0-9]([0-9])[0-9]" "\\1" CRYPTOPP_VERSION_MINOR + ${_CRYPTOPP_VERSION_TMP}) + STRING (REGEX REPLACE "[0-9][0-9]([0-9])" "\\1" CRYPTOPP_VERSION_PATCH + ${_CRYPTOPP_VERSION_TMP}) + + SET (CRYPTOPP_VERSION_COUNT 3) + SET (CRYPTOPP_VERSION + ${CRYPTOPP_VERSION_MAJOR}.${CRYPTOPP_VERSION_MINOR}.${CRYPTOPP_VERSION_PATCH}) + ENDIF (EXISTS ${_CRYPTOPP_VERSION_HEADER}) +ENDIF (CRYPTOPP_INCLUDE_DIR) + +SET (CRYPTOPP_INCLUDE_DIRS ${CRYPTOPP_INCLUDE_DIR}) +SET (CRYPTOPP_LIBRARIES ${CRYPTOPP_LIBRARY}) + +MARK_AS_ADVANCED (CRYPTOPP_INCLUDE_DIR CRYPTOPP_LIBRARY CRYPTOPP_LIBRARY_DEBUG + CRYPTOPP_LIBRARY_RELEASE) + +FIND_PACKAGE_HANDLE_STANDARD_ARGS (CryptoPP REQUIRED_VARS CRYPTOPP_ROOT_DIR + CRYPTOPP_INCLUDE_DIR CRYPTOPP_LIBRARY VERSION_VAR CRYPTOPP_VERSION) \ No newline at end of file diff --git a/Godeps/_workspace/src/github.com/expanse-project/ethash/cmake/modules/FindOpenCL.cmake b/Godeps/_workspace/src/github.com/expanse-project/ethash/cmake/modules/FindOpenCL.cmake new file mode 100644 index 0000000000..415c95dbd0 --- /dev/null +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/cmake/modules/FindOpenCL.cmake @@ -0,0 +1,148 @@ +#.rst: +# FindOpenCL +# ---------- +# +# Try to find OpenCL +# +# Once done this will define:: +# +# OpenCL_FOUND - True if OpenCL was found +# OpenCL_INCLUDE_DIRS - include directories for OpenCL +# OpenCL_LIBRARIES - link against this library to use OpenCL +# OpenCL_VERSION_STRING - Highest supported OpenCL version (eg. 1.2) +# OpenCL_VERSION_MAJOR - The major version of the OpenCL implementation +# OpenCL_VERSION_MINOR - The minor version of the OpenCL implementation +# +# The module will also define two cache variables:: +# +# OpenCL_INCLUDE_DIR - the OpenCL include directory +# OpenCL_LIBRARY - the path to the OpenCL library +# + +#============================================================================= +# Copyright 2014 Matthaeus G. Chajdas +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +function(_FIND_OPENCL_VERSION) + include(CheckSymbolExists) + include(CMakePushCheckState) + set(CMAKE_REQUIRED_QUIET ${OpenCL_FIND_QUIETLY}) + + CMAKE_PUSH_CHECK_STATE() + foreach(VERSION "2_0" "1_2" "1_1" "1_0") + set(CMAKE_REQUIRED_INCLUDES "${OpenCL_INCLUDE_DIR}") + + if(APPLE) + CHECK_SYMBOL_EXISTS( + CL_VERSION_${VERSION} + "${OpenCL_INCLUDE_DIR}/OpenCL/cl.h" + OPENCL_VERSION_${VERSION}) + else() + CHECK_SYMBOL_EXISTS( + CL_VERSION_${VERSION} + "${OpenCL_INCLUDE_DIR}/CL/cl.h" + OPENCL_VERSION_${VERSION}) + endif() + + if(OPENCL_VERSION_${VERSION}) + string(REPLACE "_" "." VERSION "${VERSION}") + set(OpenCL_VERSION_STRING ${VERSION} PARENT_SCOPE) + string(REGEX MATCHALL "[0-9]+" version_components "${VERSION}") + list(GET version_components 0 major_version) + list(GET version_components 1 minor_version) + set(OpenCL_VERSION_MAJOR ${major_version} PARENT_SCOPE) + set(OpenCL_VERSION_MINOR ${minor_version} PARENT_SCOPE) + break() + endif() + endforeach() + CMAKE_POP_CHECK_STATE() +endfunction() + +find_path(OpenCL_INCLUDE_DIR + NAMES + CL/cl.h OpenCL/cl.h + PATHS + ENV "PROGRAMFILES(X86)" + ENV AMDAPPSDKROOT + ENV INTELOCLSDKROOT + ENV NVSDKCOMPUTE_ROOT + ENV CUDA_PATH + ENV ATISTREAMSDKROOT + PATH_SUFFIXES + include + OpenCL/common/inc + "AMD APP/include") + +_FIND_OPENCL_VERSION() + +if(WIN32) + if(CMAKE_SIZEOF_VOID_P EQUAL 4) + find_library(OpenCL_LIBRARY + NAMES OpenCL + PATHS + ENV "PROGRAMFILES(X86)" + ENV AMDAPPSDKROOT + ENV INTELOCLSDKROOT + ENV CUDA_PATH + ENV NVSDKCOMPUTE_ROOT + ENV ATISTREAMSDKROOT + PATH_SUFFIXES + "AMD APP/lib/x86" + lib/x86 + lib/Win32 + OpenCL/common/lib/Win32) + elseif(CMAKE_SIZEOF_VOID_P EQUAL 8) + find_library(OpenCL_LIBRARY + NAMES OpenCL + PATHS + ENV "PROGRAMFILES(X86)" + ENV AMDAPPSDKROOT + ENV INTELOCLSDKROOT + ENV CUDA_PATH + ENV NVSDKCOMPUTE_ROOT + ENV ATISTREAMSDKROOT + PATH_SUFFIXES + "AMD APP/lib/x86_64" + lib/x86_64 + lib/x64 + OpenCL/common/lib/x64) + endif() +else() + find_library(OpenCL_LIBRARY + NAMES OpenCL + PATHS + ENV "PROGRAMFILES(X86)" + ENV AMDAPPSDKROOT + ENV INTELOCLSDKROOT + ENV CUDA_PATH + ENV NVSDKCOMPUTE_ROOT + ENV ATISTREAMSDKROOT + PATH_SUFFIXES + "AMD APP/lib/x86_64" + lib/x86_64 + lib/x64 + OpenCL/common/lib/x64) +endif() + +set(OpenCL_LIBRARIES ${OpenCL_LIBRARY}) +set(OpenCL_INCLUDE_DIRS ${OpenCL_INCLUDE_DIR}) + +include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) +find_package_handle_standard_args( + OpenCL + FOUND_VAR OpenCL_FOUND + REQUIRED_VARS OpenCL_LIBRARY OpenCL_INCLUDE_DIR + VERSION_VAR OpenCL_VERSION_STRING) + +mark_as_advanced( + OpenCL_INCLUDE_DIR + OpenCL_LIBRARY) diff --git a/Godeps/_workspace/src/github.com/expanse-project/ethash/cmake/modules/FindPackageHandleStandardArgs.cmake b/Godeps/_workspace/src/github.com/expanse-project/ethash/cmake/modules/FindPackageHandleStandardArgs.cmake new file mode 100644 index 0000000000..6bcf1e788b --- /dev/null +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/cmake/modules/FindPackageHandleStandardArgs.cmake @@ -0,0 +1,382 @@ +#.rst: +# FindPackageHandleStandardArgs +# ----------------------------- +# +# +# +# FIND_PACKAGE_HANDLE_STANDARD_ARGS( ... ) +# +# This function is intended to be used in FindXXX.cmake modules files. +# It handles the REQUIRED, QUIET and version-related arguments to +# find_package(). It also sets the _FOUND variable. The +# package is considered found if all variables ... listed contain +# valid results, e.g. valid filepaths. +# +# There are two modes of this function. The first argument in both +# modes is the name of the Find-module where it is called (in original +# casing). +# +# The first simple mode looks like this: +# +# :: +# +# FIND_PACKAGE_HANDLE_STANDARD_ARGS( +# (DEFAULT_MSG|"Custom failure message") ... ) +# +# If the variables to are all valid, then +# _FOUND will be set to TRUE. If DEFAULT_MSG is given +# as second argument, then the function will generate itself useful +# success and error messages. You can also supply a custom error +# message for the failure case. This is not recommended. +# +# The second mode is more powerful and also supports version checking: +# +# :: +# +# FIND_PACKAGE_HANDLE_STANDARD_ARGS(NAME +# [FOUND_VAR ] +# [REQUIRED_VARS ...] +# [VERSION_VAR ] +# [HANDLE_COMPONENTS] +# [CONFIG_MODE] +# [FAIL_MESSAGE "Custom failure message"] ) +# +# In this mode, the name of the result-variable can be set either to +# either _FOUND or _FOUND using the +# FOUND_VAR option. Other names for the result-variable are not +# allowed. So for a Find-module named FindFooBar.cmake, the two +# possible names are FooBar_FOUND and FOOBAR_FOUND. It is recommended +# to use the original case version. If the FOUND_VAR option is not +# used, the default is _FOUND. +# +# As in the simple mode, if through are all valid, +# _FOUND will be set to TRUE. After REQUIRED_VARS the +# variables which are required for this package are listed. Following +# VERSION_VAR the name of the variable can be specified which holds the +# version of the package which has been found. If this is done, this +# version will be checked against the (potentially) specified required +# version used in the find_package() call. The EXACT keyword is also +# handled. The default messages include information about the required +# version and the version which has been actually found, both if the +# version is ok or not. If the package supports components, use the +# HANDLE_COMPONENTS option to enable handling them. In this case, +# find_package_handle_standard_args() will report which components have +# been found and which are missing, and the _FOUND variable +# will be set to FALSE if any of the required components (i.e. not the +# ones listed after OPTIONAL_COMPONENTS) are missing. Use the option +# CONFIG_MODE if your FindXXX.cmake module is a wrapper for a +# find_package(... NO_MODULE) call. In this case VERSION_VAR will be +# set to _VERSION and the macro will automatically check whether +# the Config module was found. Via FAIL_MESSAGE a custom failure +# message can be specified, if this is not used, the default message +# will be displayed. +# +# Example for mode 1: +# +# :: +# +# find_package_handle_standard_args(LibXml2 DEFAULT_MSG +# LIBXML2_LIBRARY LIBXML2_INCLUDE_DIR) +# +# +# +# LibXml2 is considered to be found, if both LIBXML2_LIBRARY and +# LIBXML2_INCLUDE_DIR are valid. Then also LIBXML2_FOUND is set to +# TRUE. If it is not found and REQUIRED was used, it fails with +# FATAL_ERROR, independent whether QUIET was used or not. If it is +# found, success will be reported, including the content of . On +# repeated Cmake runs, the same message won't be printed again. +# +# Example for mode 2: +# +# :: +# +# find_package_handle_standard_args(LibXslt +# FOUND_VAR LibXslt_FOUND +# REQUIRED_VARS LibXslt_LIBRARIES LibXslt_INCLUDE_DIRS +# VERSION_VAR LibXslt_VERSION_STRING) +# +# In this case, LibXslt is considered to be found if the variable(s) +# listed after REQUIRED_VAR are all valid, i.e. LibXslt_LIBRARIES and +# LibXslt_INCLUDE_DIRS in this case. The result will then be stored in +# LibXslt_FOUND . Also the version of LibXslt will be checked by using +# the version contained in LibXslt_VERSION_STRING. Since no +# FAIL_MESSAGE is given, the default messages will be printed. +# +# Another example for mode 2: +# +# :: +# +# find_package(Automoc4 QUIET NO_MODULE HINTS /opt/automoc4) +# find_package_handle_standard_args(Automoc4 CONFIG_MODE) +# +# In this case, FindAutmoc4.cmake wraps a call to find_package(Automoc4 +# NO_MODULE) and adds an additional search directory for automoc4. Here +# the result will be stored in AUTOMOC4_FOUND. The following +# FIND_PACKAGE_HANDLE_STANDARD_ARGS() call produces a proper +# success/error message. + +#============================================================================= +# Copyright 2007-2009 Kitware, Inc. +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +include(${CMAKE_CURRENT_LIST_DIR}/FindPackageMessage.cmake) +include(${CMAKE_CURRENT_LIST_DIR}/CMakeParseArguments.cmake) + +# internal helper macro +macro(_FPHSA_FAILURE_MESSAGE _msg) + if (${_NAME}_FIND_REQUIRED) + message(FATAL_ERROR "${_msg}") + else () + if (NOT ${_NAME}_FIND_QUIETLY) + message(STATUS "${_msg}") + endif () + endif () +endmacro() + + +# internal helper macro to generate the failure message when used in CONFIG_MODE: +macro(_FPHSA_HANDLE_FAILURE_CONFIG_MODE) + # _CONFIG is set, but FOUND is false, this means that some other of the REQUIRED_VARS was not found: + if(${_NAME}_CONFIG) + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: missing: ${MISSING_VARS} (found ${${_NAME}_CONFIG} ${VERSION_MSG})") + else() + # If _CONSIDERED_CONFIGS is set, the config-file has been found, but no suitable version. + # List them all in the error message: + if(${_NAME}_CONSIDERED_CONFIGS) + set(configsText "") + list(LENGTH ${_NAME}_CONSIDERED_CONFIGS configsCount) + math(EXPR configsCount "${configsCount} - 1") + foreach(currentConfigIndex RANGE ${configsCount}) + list(GET ${_NAME}_CONSIDERED_CONFIGS ${currentConfigIndex} filename) + list(GET ${_NAME}_CONSIDERED_VERSIONS ${currentConfigIndex} version) + set(configsText "${configsText} ${filename} (version ${version})\n") + endforeach() + if (${_NAME}_NOT_FOUND_MESSAGE) + set(configsText "${configsText} Reason given by package: ${${_NAME}_NOT_FOUND_MESSAGE}\n") + endif() + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE} ${VERSION_MSG}, checked the following files:\n${configsText}") + + else() + # Simple case: No Config-file was found at all: + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: found neither ${_NAME}Config.cmake nor ${_NAME_LOWER}-config.cmake ${VERSION_MSG}") + endif() + endif() +endmacro() + + +function(FIND_PACKAGE_HANDLE_STANDARD_ARGS _NAME _FIRST_ARG) + +# set up the arguments for CMAKE_PARSE_ARGUMENTS and check whether we are in +# new extended or in the "old" mode: + set(options CONFIG_MODE HANDLE_COMPONENTS) + set(oneValueArgs FAIL_MESSAGE VERSION_VAR FOUND_VAR) + set(multiValueArgs REQUIRED_VARS) + set(_KEYWORDS_FOR_EXTENDED_MODE ${options} ${oneValueArgs} ${multiValueArgs} ) + list(FIND _KEYWORDS_FOR_EXTENDED_MODE "${_FIRST_ARG}" INDEX) + + if(${INDEX} EQUAL -1) + set(FPHSA_FAIL_MESSAGE ${_FIRST_ARG}) + set(FPHSA_REQUIRED_VARS ${ARGN}) + set(FPHSA_VERSION_VAR) + else() + + CMAKE_PARSE_ARGUMENTS(FPHSA "${options}" "${oneValueArgs}" "${multiValueArgs}" ${_FIRST_ARG} ${ARGN}) + + if(FPHSA_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Unknown keywords given to FIND_PACKAGE_HANDLE_STANDARD_ARGS(): \"${FPHSA_UNPARSED_ARGUMENTS}\"") + endif() + + if(NOT FPHSA_FAIL_MESSAGE) + set(FPHSA_FAIL_MESSAGE "DEFAULT_MSG") + endif() + endif() + +# now that we collected all arguments, process them + + if("x${FPHSA_FAIL_MESSAGE}" STREQUAL "xDEFAULT_MSG") + set(FPHSA_FAIL_MESSAGE "Could NOT find ${_NAME}") + endif() + + # In config-mode, we rely on the variable _CONFIG, which is set by find_package() + # when it successfully found the config-file, including version checking: + if(FPHSA_CONFIG_MODE) + list(INSERT FPHSA_REQUIRED_VARS 0 ${_NAME}_CONFIG) + list(REMOVE_DUPLICATES FPHSA_REQUIRED_VARS) + set(FPHSA_VERSION_VAR ${_NAME}_VERSION) + endif() + + if(NOT FPHSA_REQUIRED_VARS) + message(FATAL_ERROR "No REQUIRED_VARS specified for FIND_PACKAGE_HANDLE_STANDARD_ARGS()") + endif() + + list(GET FPHSA_REQUIRED_VARS 0 _FIRST_REQUIRED_VAR) + + string(TOUPPER ${_NAME} _NAME_UPPER) + string(TOLOWER ${_NAME} _NAME_LOWER) + + if(FPHSA_FOUND_VAR) + if(FPHSA_FOUND_VAR MATCHES "^${_NAME}_FOUND$" OR FPHSA_FOUND_VAR MATCHES "^${_NAME_UPPER}_FOUND$") + set(_FOUND_VAR ${FPHSA_FOUND_VAR}) + else() + message(FATAL_ERROR "The argument for FOUND_VAR is \"${FPHSA_FOUND_VAR}\", but only \"${_NAME}_FOUND\" and \"${_NAME_UPPER}_FOUND\" are valid names.") + endif() + else() + set(_FOUND_VAR ${_NAME_UPPER}_FOUND) + endif() + + # collect all variables which were not found, so they can be printed, so the + # user knows better what went wrong (#6375) + set(MISSING_VARS "") + set(DETAILS "") + # check if all passed variables are valid + unset(${_FOUND_VAR}) + foreach(_CURRENT_VAR ${FPHSA_REQUIRED_VARS}) + if(NOT ${_CURRENT_VAR}) + set(${_FOUND_VAR} FALSE) + set(MISSING_VARS "${MISSING_VARS} ${_CURRENT_VAR}") + else() + set(DETAILS "${DETAILS}[${${_CURRENT_VAR}}]") + endif() + endforeach() + if(NOT "${${_FOUND_VAR}}" STREQUAL "FALSE") + set(${_FOUND_VAR} TRUE) + endif() + + # component handling + unset(FOUND_COMPONENTS_MSG) + unset(MISSING_COMPONENTS_MSG) + + if(FPHSA_HANDLE_COMPONENTS) + foreach(comp ${${_NAME}_FIND_COMPONENTS}) + if(${_NAME}_${comp}_FOUND) + + if(NOT DEFINED FOUND_COMPONENTS_MSG) + set(FOUND_COMPONENTS_MSG "found components: ") + endif() + set(FOUND_COMPONENTS_MSG "${FOUND_COMPONENTS_MSG} ${comp}") + + else() + + if(NOT DEFINED MISSING_COMPONENTS_MSG) + set(MISSING_COMPONENTS_MSG "missing components: ") + endif() + set(MISSING_COMPONENTS_MSG "${MISSING_COMPONENTS_MSG} ${comp}") + + if(${_NAME}_FIND_REQUIRED_${comp}) + set(${_FOUND_VAR} FALSE) + set(MISSING_VARS "${MISSING_VARS} ${comp}") + endif() + + endif() + endforeach() + set(COMPONENT_MSG "${FOUND_COMPONENTS_MSG} ${MISSING_COMPONENTS_MSG}") + set(DETAILS "${DETAILS}[c${COMPONENT_MSG}]") + endif() + + # version handling: + set(VERSION_MSG "") + set(VERSION_OK TRUE) + set(VERSION ${${FPHSA_VERSION_VAR}}) + + # check with DEFINED here as the requested or found version may be "0" + if (DEFINED ${_NAME}_FIND_VERSION) + if(DEFINED ${FPHSA_VERSION_VAR}) + + if(${_NAME}_FIND_VERSION_EXACT) # exact version required + # count the dots in the version string + string(REGEX REPLACE "[^.]" "" _VERSION_DOTS "${VERSION}") + # add one dot because there is one dot more than there are components + string(LENGTH "${_VERSION_DOTS}." _VERSION_DOTS) + if (_VERSION_DOTS GREATER ${_NAME}_FIND_VERSION_COUNT) + # Because of the C++ implementation of find_package() ${_NAME}_FIND_VERSION_COUNT + # is at most 4 here. Therefore a simple lookup table is used. + if (${_NAME}_FIND_VERSION_COUNT EQUAL 1) + set(_VERSION_REGEX "[^.]*") + elseif (${_NAME}_FIND_VERSION_COUNT EQUAL 2) + set(_VERSION_REGEX "[^.]*\\.[^.]*") + elseif (${_NAME}_FIND_VERSION_COUNT EQUAL 3) + set(_VERSION_REGEX "[^.]*\\.[^.]*\\.[^.]*") + else () + set(_VERSION_REGEX "[^.]*\\.[^.]*\\.[^.]*\\.[^.]*") + endif () + string(REGEX REPLACE "^(${_VERSION_REGEX})\\..*" "\\1" _VERSION_HEAD "${VERSION}") + unset(_VERSION_REGEX) + if (NOT ${_NAME}_FIND_VERSION VERSION_EQUAL _VERSION_HEAD) + set(VERSION_MSG "Found unsuitable version \"${VERSION}\", but required is exact version \"${${_NAME}_FIND_VERSION}\"") + set(VERSION_OK FALSE) + else () + set(VERSION_MSG "(found suitable exact version \"${VERSION}\")") + endif () + unset(_VERSION_HEAD) + else () + if (NOT "${${_NAME}_FIND_VERSION}" VERSION_EQUAL "${VERSION}") + set(VERSION_MSG "Found unsuitable version \"${VERSION}\", but required is exact version \"${${_NAME}_FIND_VERSION}\"") + set(VERSION_OK FALSE) + else () + set(VERSION_MSG "(found suitable exact version \"${VERSION}\")") + endif () + endif () + unset(_VERSION_DOTS) + + else() # minimum version specified: + if ("${${_NAME}_FIND_VERSION}" VERSION_GREATER "${VERSION}") + set(VERSION_MSG "Found unsuitable version \"${VERSION}\", but required is at least \"${${_NAME}_FIND_VERSION}\"") + set(VERSION_OK FALSE) + else () + set(VERSION_MSG "(found suitable version \"${VERSION}\", minimum required is \"${${_NAME}_FIND_VERSION}\")") + endif () + endif() + + else() + + # if the package was not found, but a version was given, add that to the output: + if(${_NAME}_FIND_VERSION_EXACT) + set(VERSION_MSG "(Required is exact version \"${${_NAME}_FIND_VERSION}\")") + else() + set(VERSION_MSG "(Required is at least version \"${${_NAME}_FIND_VERSION}\")") + endif() + + endif() + else () + if(VERSION) + set(VERSION_MSG "(found version \"${VERSION}\")") + endif() + endif () + + if(VERSION_OK) + set(DETAILS "${DETAILS}[v${VERSION}(${${_NAME}_FIND_VERSION})]") + else() + set(${_FOUND_VAR} FALSE) + endif() + + + # print the result: + if (${_FOUND_VAR}) + FIND_PACKAGE_MESSAGE(${_NAME} "Found ${_NAME}: ${${_FIRST_REQUIRED_VAR}} ${VERSION_MSG} ${COMPONENT_MSG}" "${DETAILS}") + else () + + if(FPHSA_CONFIG_MODE) + _FPHSA_HANDLE_FAILURE_CONFIG_MODE() + else() + if(NOT VERSION_OK) + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: ${VERSION_MSG} (found ${${_FIRST_REQUIRED_VAR}})") + else() + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE} (missing: ${MISSING_VARS}) ${VERSION_MSG}") + endif() + endif() + + endif () + + set(${_FOUND_VAR} ${${_FOUND_VAR}} PARENT_SCOPE) + +endfunction() diff --git a/Godeps/_workspace/src/github.com/expanse-project/ethash/cmake/modules/FindPackageMessage.cmake b/Godeps/_workspace/src/github.com/expanse-project/ethash/cmake/modules/FindPackageMessage.cmake new file mode 100644 index 0000000000..a0349d3db9 --- /dev/null +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/cmake/modules/FindPackageMessage.cmake @@ -0,0 +1,57 @@ +#.rst: +# FindPackageMessage +# ------------------ +# +# +# +# FIND_PACKAGE_MESSAGE( "message for user" "find result details") +# +# This macro is intended to be used in FindXXX.cmake modules files. It +# will print a message once for each unique find result. This is useful +# for telling the user where a package was found. The first argument +# specifies the name (XXX) of the package. The second argument +# specifies the message to display. The third argument lists details +# about the find result so that if they change the message will be +# displayed again. The macro also obeys the QUIET argument to the +# find_package command. +# +# Example: +# +# :: +# +# if(X11_FOUND) +# FIND_PACKAGE_MESSAGE(X11 "Found X11: ${X11_X11_LIB}" +# "[${X11_X11_LIB}][${X11_INCLUDE_DIR}]") +# else() +# ... +# endif() + +#============================================================================= +# Copyright 2008-2009 Kitware, Inc. +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +function(FIND_PACKAGE_MESSAGE pkg msg details) + # Avoid printing a message repeatedly for the same find result. + if(NOT ${pkg}_FIND_QUIETLY) + string(REPLACE "\n" "" details "${details}") + set(DETAILS_VAR FIND_PACKAGE_MESSAGE_DETAILS_${pkg}) + if(NOT "${details}" STREQUAL "${${DETAILS_VAR}}") + # The message has not yet been printed. + message(STATUS "${msg}") + + # Save the find details in the cache to avoid printing the same + # message again. + set("${DETAILS_VAR}" "${details}" + CACHE INTERNAL "Details about finding ${pkg}") + endif() + endif() +endfunction() diff --git a/Godeps/_workspace/src/github.com/expanse-project/ethash/cryptopp/CMakeLists.txt b/Godeps/_workspace/src/github.com/expanse-project/ethash/cryptopp/CMakeLists.txt new file mode 100644 index 0000000000..6f42805329 --- /dev/null +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/cryptopp/CMakeLists.txt @@ -0,0 +1,13 @@ +set(LIBRARY cryptopp) + +include_directories(../../cryptopp) + +# todo, subset +file(GLOB HEADERS "../../cryptopp/*.h") +file(GLOB SOURCE "../../cryptopp/*.cpp") + +add_library(${LIBRARY} ${HEADERS} ${SOURCE}) + +set(CRYPTOPP_INCLUDE_DIRS "../.." "../../../" PARENT_SCOPE) +set(CRYPTOPP_LIBRARIES ${LIBRARY} PARENT_SCOPE) +set(CRYPTOPP_FOUND TRUE PARENT_SCOPE) diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/ethash.go b/Godeps/_workspace/src/github.com/expanse-project/ethash/ethash.go similarity index 96% rename from Godeps/_workspace/src/github.com/ethereum/ethash/ethash.go rename to Godeps/_workspace/src/github.com/expanse-project/ethash/ethash.go index 2a31aaf2d3..01a918ee70 100644 --- a/Godeps/_workspace/src/github.com/ethereum/ethash/ethash.go +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/ethash.go @@ -40,11 +40,11 @@ import ( "time" "unsafe" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/pow" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/pow" ) var ( @@ -140,7 +140,7 @@ func (l *Light) Verify(block pow.Block) bool { /* Cannot happen if block header diff is validated prior to PoW, but can happen if PoW is checked first due to parallel PoW checking. We could check the minimum valid difficulty but for SoC we avoid (duplicating) - Ethereum protocol consensus rules here which are not in scope of Ethash + Expanse protocol consensus rules here which are not in scope of Ethash */ if difficulty.Cmp(common.Big0) == 0 { glog.V(logger.Debug).Infof("invalid block difficulty") @@ -369,7 +369,7 @@ func (pow *Full) Search(block pow.Block, stop <-chan struct{}, index int) (nonce ret := C.ethash_full_compute(dag.ptr, hash, C.uint64_t(nonce)) result := h256ToHash(ret.result).Big() - // TODO: disagrees with the spec https://github.com/ethereum/wiki/wiki/Ethash#mining + // TODO: disagrees with the spec https://github.com/expanse-project/wiki/wiki/Ethash#mining if ret.success && result.Cmp(target) <= 0 { mixDigest = C.GoBytes(unsafe.Pointer(&ret.mix_hash), C.int(32)) atomic.AddInt32(&pow.hashRate, -previousHashrate) diff --git a/Godeps/_workspace/src/github.com/expanse-project/ethash/ethash_test.go b/Godeps/_workspace/src/github.com/expanse-project/ethash/ethash_test.go new file mode 100644 index 0000000000..01bdf853ab --- /dev/null +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/ethash_test.go @@ -0,0 +1,221 @@ +// Copyright 2015 The go-ethereum Authors +// Copyright 2015 Lefteris Karapetsas +// This file is part of the go-ethereum library. +// +// The go-ethereum library 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. +// +// The go-ethereum 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package ethash + +import ( + "bytes" + "crypto/rand" + "encoding/hex" + "log" + "math/big" + "os" + "sync" + "testing" + + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" +) + +func init() { + // glog.SetV(6) + // glog.SetToStderr(true) +} + +type testBlock struct { + difficulty *big.Int + hashNoNonce common.Hash + nonce uint64 + mixDigest common.Hash + number uint64 +} + +func (b *testBlock) Difficulty() *big.Int { return b.difficulty } +func (b *testBlock) HashNoNonce() common.Hash { return b.hashNoNonce } +func (b *testBlock) Nonce() uint64 { return b.nonce } +func (b *testBlock) MixDigest() common.Hash { return b.mixDigest } +func (b *testBlock) NumberU64() uint64 { return b.number } + +var validBlocks = []*testBlock{ + // from proof of concept nine testnet, epoch 0 + { + number: 22, + hashNoNonce: common.HexToHash("372eca2454ead349c3df0ab5d00b0b706b23e49d469387db91811cee0358fc6d"), + difficulty: big.NewInt(132416), + nonce: 0x495732e0ed7a801c, + mixDigest: common.HexToHash("2f74cdeb198af0b9abe65d22d372e22fb2d474371774a9583c1cc427a07939f5"), + }, + // from proof of concept nine testnet, epoch 1 + { + number: 30001, + hashNoNonce: common.HexToHash("7e44356ee3441623bc72a683fd3708fdf75e971bbe294f33e539eedad4b92b34"), + difficulty: big.NewInt(1532671), + nonce: 0x318df1c8adef7e5e, + mixDigest: common.HexToHash("144b180aad09ae3c81fb07be92c8e6351b5646dda80e6844ae1b697e55ddde84"), + }, + // from proof of concept nine testnet, epoch 2 + { + number: 60000, + hashNoNonce: common.HexToHash("5fc898f16035bf5ac9c6d9077ae1e3d5fc1ecc3c9fd5bee8bb00e810fdacbaa0"), + difficulty: big.NewInt(2467358), + nonce: 0x50377003e5d830ca, + mixDigest: common.HexToHash("ab546a5b73c452ae86dadd36f0ed83a6745226717d3798832d1b20b489e82063"), + }, +} + +var invalidZeroDiffBlock = testBlock{ + number: 61440000, + hashNoNonce: crypto.Sha3Hash([]byte("foo")), + difficulty: big.NewInt(0), + nonce: 0xcafebabec00000fe, + mixDigest: crypto.Sha3Hash([]byte("bar")), +} + +func TestEthashVerifyValid(t *testing.T) { + exp := New() + for i, block := range validBlocks { + if !exp.Verify(block) { + t.Errorf("block %d (%x) did not validate.", i, block.hashNoNonce[:6]) + } + } +} + +func TestEthashVerifyInvalid(t *testing.T) { + exp := New() + if exp.Verify(&invalidZeroDiffBlock) { + t.Errorf("should not validate - we just ensure it does not panic on this block") + } +} + +func TestEthashConcurrentVerify(t *testing.T) { + exp, err := NewForTesting() + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(exp.Full.Dir) + + block := &testBlock{difficulty: big.NewInt(10)} + nonce, md := exp.Search(block, nil, 0) + block.nonce = nonce + block.mixDigest = common.BytesToHash(md) + + // Verify the block concurrently to check for data races. + var wg sync.WaitGroup + wg.Add(100) + for i := 0; i < 100; i++ { + go func() { + if !exp.Verify(block) { + t.Error("Block could not be verified") + } + wg.Done() + }() + } + wg.Wait() +} + +func TestEthashConcurrentSearch(t *testing.T) { + exp, err := NewForTesting() + if err != nil { + t.Fatal(err) + } + exp.Turbo(true) + defer os.RemoveAll(exp.Full.Dir) + + type searchRes struct { + n uint64 + md []byte + } + + var ( + block = &testBlock{difficulty: big.NewInt(35000)} + nsearch = 10 + wg = new(sync.WaitGroup) + found = make(chan searchRes) + stop = make(chan struct{}) + ) + rand.Read(block.hashNoNonce[:]) + wg.Add(nsearch) + // launch n searches concurrently. + for i := 0; i < nsearch; i++ { + go func() { + nonce, md := exp.Search(block, stop, 0) + select { + case found <- searchRes{n: nonce, md: md}: + case <-stop: + } + wg.Done() + }() + } + + // wait for one of them to find the nonce + res := <-found + // stop the others + close(stop) + wg.Wait() + + block.nonce = res.n + block.mixDigest = common.BytesToHash(res.md) + if !exp.Verify(block) { + t.Error("Block could not be verified") + } +} + +func TestEthashSearchAcrossEpoch(t *testing.T) { + exp, err := NewForTesting() + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(exp.Full.Dir) + + for i := epochLength - 40; i < epochLength+40; i++ { + block := &testBlock{number: i, difficulty: big.NewInt(90)} + rand.Read(block.hashNoNonce[:]) + nonce, md := exp.Search(block, nil, 0) + block.nonce = nonce + block.mixDigest = common.BytesToHash(md) + if !exp.Verify(block) { + t.Fatalf("Block could not be verified") + } + } +} + +func TestGetSeedHash(t *testing.T) { + seed0, err := GetSeedHash(0) + if err != nil { + t.Errorf("Failed to get seedHash for block 0: %v", err) + } + if bytes.Compare(seed0, make([]byte, 32)) != 0 { + log.Printf("seedHash for block 0 should be 0s, was: %v\n", seed0) + } + seed1, err := GetSeedHash(30000) + if err != nil { + t.Error(err) + } + + // From python: + // > from pyethash import get_seedhash + // > get_seedhash(30000) + expectedSeed1, err := hex.DecodeString("290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563") + if err != nil { + t.Error(err) + } + + if bytes.Compare(seed1, expectedSeed1) != 0 { + log.Printf("seedHash for block 1 should be: %v,\nactual value: %v\n", expectedSeed1, seed1) + } + +} diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/ethashc.go b/Godeps/_workspace/src/github.com/expanse-project/ethash/ethashc.go similarity index 100% rename from Godeps/_workspace/src/github.com/ethereum/ethash/ethashc.go rename to Godeps/_workspace/src/github.com/expanse-project/ethash/ethashc.go diff --git a/Godeps/_workspace/src/github.com/expanse-project/ethash/js/LICENSE b/Godeps/_workspace/src/github.com/expanse-project/ethash/js/LICENSE new file mode 100644 index 0000000000..070be633d1 --- /dev/null +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/js/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 Tim Hughes + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/Godeps/_workspace/src/github.com/expanse-project/ethash/js/ethash.js b/Godeps/_workspace/src/github.com/expanse-project/ethash/js/ethash.js new file mode 100644 index 0000000000..bec1284f61 --- /dev/null +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/js/ethash.js @@ -0,0 +1,190 @@ +// ethash.js +// Tim Hughes +// Revision 19 + +/*jslint node: true, shadow:true */ +"use strict"; + +var Keccak = require('./keccak'); +var util = require('./util'); + +// 32-bit unsigned modulo +function mod32(x, n) +{ + return (x>>>0) % (n>>>0); +} + +function fnv(x, y) +{ + // js integer multiply by 0x01000193 will lose precision + return ((x*0x01000000 | 0) + (x*0x193 | 0)) ^ y; +} + +function computeCache(params, seedWords) +{ + var cache = new Uint32Array(params.cacheSize >> 2); + var cacheNodeCount = params.cacheSize >> 6; + + // Initialize cache + var keccak = new Keccak(); + keccak.digestWords(cache, 0, 16, seedWords, 0, seedWords.length); + for (var n = 1; n < cacheNodeCount; ++n) + { + keccak.digestWords(cache, n<<4, 16, cache, (n-1)<<4, 16); + } + + var tmp = new Uint32Array(16); + + // Do randmemohash passes + for (var r = 0; r < params.cacheRounds; ++r) + { + for (var n = 0; n < cacheNodeCount; ++n) + { + var p0 = mod32(n + cacheNodeCount - 1, cacheNodeCount) << 4; + var p1 = mod32(cache[n<<4|0], cacheNodeCount) << 4; + + for (var w = 0; w < 16; w=(w+1)|0) + { + tmp[w] = cache[p0 | w] ^ cache[p1 | w]; + } + + keccak.digestWords(cache, n<<4, 16, tmp, 0, tmp.length); + } + } + return cache; +} + +function computeDagNode(o_node, params, cache, keccak, nodeIndex) +{ + var cacheNodeCount = params.cacheSize >> 6; + var dagParents = params.dagParents; + + var c = (nodeIndex % cacheNodeCount) << 4; + var mix = o_node; + for (var w = 0; w < 16; ++w) + { + mix[w] = cache[c|w]; + } + mix[0] ^= nodeIndex; + keccak.digestWords(mix, 0, 16, mix, 0, 16); + + for (var p = 0; p < dagParents; ++p) + { + // compute cache node (word) index + c = mod32(fnv(nodeIndex ^ p, mix[p&15]), cacheNodeCount) << 4; + + for (var w = 0; w < 16; ++w) + { + mix[w] = fnv(mix[w], cache[c|w]); + } + } + + keccak.digestWords(mix, 0, 16, mix, 0, 16); +} + +function computeHashInner(mix, params, cache, keccak, tempNode) +{ + var mixParents = params.mixParents|0; + var mixWordCount = params.mixSize >> 2; + var mixNodeCount = mixWordCount >> 4; + var dagPageCount = (params.dagSize / params.mixSize) >> 0; + + // grab initial first word + var s0 = mix[0]; + + // initialise mix from initial 64 bytes + for (var w = 16; w < mixWordCount; ++w) + { + mix[w] = mix[w & 15]; + } + + for (var a = 0; a < mixParents; ++a) + { + var p = mod32(fnv(s0 ^ a, mix[a & (mixWordCount-1)]), dagPageCount); + var d = (p * mixNodeCount)|0; + + for (var n = 0, w = 0; n < mixNodeCount; ++n, w += 16) + { + computeDagNode(tempNode, params, cache, keccak, (d + n)|0); + + for (var v = 0; v < 16; ++v) + { + mix[w|v] = fnv(mix[w|v], tempNode[v]); + } + } + } +} + +function convertSeed(seed) +{ + // todo, reconcile with spec, byte ordering? + // todo, big-endian conversion + var newSeed = util.toWords(seed); + if (newSeed === null) + throw Error("Invalid seed '" + seed + "'"); + return newSeed; +} + +exports.defaultParams = function() +{ + return { + cacheSize: 1048384, + cacheRounds: 3, + dagSize: 1073739904, + dagParents: 256, + mixSize: 128, + mixParents: 64, + }; +}; + +exports.Ethash = function(params, seed) +{ + // precompute cache and related values + seed = convertSeed(seed); + var cache = computeCache(params, seed); + + // preallocate buffers/etc + var initBuf = new ArrayBuffer(96); + var initBytes = new Uint8Array(initBuf); + var initWords = new Uint32Array(initBuf); + var mixWords = new Uint32Array(params.mixSize / 4); + var tempNode = new Uint32Array(16); + var keccak = new Keccak(); + + var retWords = new Uint32Array(8); + var retBytes = new Uint8Array(retWords.buffer); // supposedly read-only + + this.hash = function(header, nonce) + { + // compute initial hash + initBytes.set(header, 0); + initBytes.set(nonce, 32); + keccak.digestWords(initWords, 0, 16, initWords, 0, 8 + nonce.length/4); + + // compute mix + for (var i = 0; i != 16; ++i) + { + mixWords[i] = initWords[i]; + } + computeHashInner(mixWords, params, cache, keccak, tempNode); + + // compress mix and append to initWords + for (var i = 0; i != mixWords.length; i += 4) + { + initWords[16 + i/4] = fnv(fnv(fnv(mixWords[i], mixWords[i+1]), mixWords[i+2]), mixWords[i+3]); + } + + // final Keccak hashes + keccak.digestWords(retWords, 0, 8, initWords, 0, 24); // Keccak-256(s + cmix) + return retBytes; + }; + + this.cacheDigest = function() + { + return keccak.digest(32, new Uint8Array(cache.buffer)); + }; +}; + + + + diff --git a/Godeps/_workspace/src/github.com/expanse-project/ethash/js/keccak.js b/Godeps/_workspace/src/github.com/expanse-project/ethash/js/keccak.js new file mode 100644 index 0000000000..84ddde6451 --- /dev/null +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/js/keccak.js @@ -0,0 +1,404 @@ +// keccak.js +// Tim Hughes +// derived from Markku-Juhani O. Saarinen's C code (http://keccak.noekeon.org/readable_code.html) + +/*jslint node: true, shadow:true */ +"use strict"; + +var Keccak_f1600_RC = new Uint32Array([ + 0x00000001, 0x00000000, + 0x00008082, 0x00000000, + 0x0000808a, 0x80000000, + 0x80008000, 0x80000000, + 0x0000808b, 0x00000000, + 0x80000001, 0x00000000, + 0x80008081, 0x80000000, + 0x00008009, 0x80000000, + 0x0000008a, 0x00000000, + 0x00000088, 0x00000000, + 0x80008009, 0x00000000, + 0x8000000a, 0x00000000, + 0x8000808b, 0x00000000, + 0x0000008b, 0x80000000, + 0x00008089, 0x80000000, + 0x00008003, 0x80000000, + 0x00008002, 0x80000000, + 0x00000080, 0x80000000, + 0x0000800a, 0x00000000, + 0x8000000a, 0x80000000, + 0x80008081, 0x80000000, + 0x00008080, 0x80000000, + 0x80000001, 0x00000000, + 0x80008008, 0x80000000 +]); + +function keccak_f1600(outState, outOffset, outSize, inState) +{ + // todo, handle big endian loads + var a00l = inState[0]|0; + var a00h = inState[1]|0; + var a01l = inState[2]|0; + var a01h = inState[3]|0; + var a02l = inState[4]|0; + var a02h = inState[5]|0; + var a03l = inState[6]|0; + var a03h = inState[7]|0; + var a04l = inState[8]|0; + var a04h = inState[9]|0; + var a05l = inState[10]|0; + var a05h = inState[11]|0; + var a06l = inState[12]|0; + var a06h = inState[13]|0; + var a07l = inState[14]|0; + var a07h = inState[15]|0; + var a08l = inState[16]|0; + var a08h = inState[17]|0; + var a09l = inState[18]|0; + var a09h = inState[19]|0; + var a10l = inState[20]|0; + var a10h = inState[21]|0; + var a11l = inState[22]|0; + var a11h = inState[23]|0; + var a12l = inState[24]|0; + var a12h = inState[25]|0; + var a13l = inState[26]|0; + var a13h = inState[27]|0; + var a14l = inState[28]|0; + var a14h = inState[29]|0; + var a15l = inState[30]|0; + var a15h = inState[31]|0; + var a16l = inState[32]|0; + var a16h = inState[33]|0; + var a17l = inState[34]|0; + var a17h = inState[35]|0; + var a18l = inState[36]|0; + var a18h = inState[37]|0; + var a19l = inState[38]|0; + var a19h = inState[39]|0; + var a20l = inState[40]|0; + var a20h = inState[41]|0; + var a21l = inState[42]|0; + var a21h = inState[43]|0; + var a22l = inState[44]|0; + var a22h = inState[45]|0; + var a23l = inState[46]|0; + var a23h = inState[47]|0; + var a24l = inState[48]|0; + var a24h = inState[49]|0; + var b00l, b00h, b01l, b01h, b02l, b02h, b03l, b03h, b04l, b04h; + var b05l, b05h, b06l, b06h, b07l, b07h, b08l, b08h, b09l, b09h; + var b10l, b10h, b11l, b11h, b12l, b12h, b13l, b13h, b14l, b14h; + var b15l, b15h, b16l, b16h, b17l, b17h, b18l, b18h, b19l, b19h; + var b20l, b20h, b21l, b21h, b22l, b22h, b23l, b23h, b24l, b24h; + var tl, nl; + var th, nh; + + for (var r = 0; r < 48; r = (r+2)|0) + { + // Theta + b00l = a00l ^ a05l ^ a10l ^ a15l ^ a20l; + b00h = a00h ^ a05h ^ a10h ^ a15h ^ a20h; + b01l = a01l ^ a06l ^ a11l ^ a16l ^ a21l; + b01h = a01h ^ a06h ^ a11h ^ a16h ^ a21h; + b02l = a02l ^ a07l ^ a12l ^ a17l ^ a22l; + b02h = a02h ^ a07h ^ a12h ^ a17h ^ a22h; + b03l = a03l ^ a08l ^ a13l ^ a18l ^ a23l; + b03h = a03h ^ a08h ^ a13h ^ a18h ^ a23h; + b04l = a04l ^ a09l ^ a14l ^ a19l ^ a24l; + b04h = a04h ^ a09h ^ a14h ^ a19h ^ a24h; + tl = b04l ^ (b01l << 1 | b01h >>> 31); + th = b04h ^ (b01h << 1 | b01l >>> 31); + a00l ^= tl; + a00h ^= th; + a05l ^= tl; + a05h ^= th; + a10l ^= tl; + a10h ^= th; + a15l ^= tl; + a15h ^= th; + a20l ^= tl; + a20h ^= th; + tl = b00l ^ (b02l << 1 | b02h >>> 31); + th = b00h ^ (b02h << 1 | b02l >>> 31); + a01l ^= tl; + a01h ^= th; + a06l ^= tl; + a06h ^= th; + a11l ^= tl; + a11h ^= th; + a16l ^= tl; + a16h ^= th; + a21l ^= tl; + a21h ^= th; + tl = b01l ^ (b03l << 1 | b03h >>> 31); + th = b01h ^ (b03h << 1 | b03l >>> 31); + a02l ^= tl; + a02h ^= th; + a07l ^= tl; + a07h ^= th; + a12l ^= tl; + a12h ^= th; + a17l ^= tl; + a17h ^= th; + a22l ^= tl; + a22h ^= th; + tl = b02l ^ (b04l << 1 | b04h >>> 31); + th = b02h ^ (b04h << 1 | b04l >>> 31); + a03l ^= tl; + a03h ^= th; + a08l ^= tl; + a08h ^= th; + a13l ^= tl; + a13h ^= th; + a18l ^= tl; + a18h ^= th; + a23l ^= tl; + a23h ^= th; + tl = b03l ^ (b00l << 1 | b00h >>> 31); + th = b03h ^ (b00h << 1 | b00l >>> 31); + a04l ^= tl; + a04h ^= th; + a09l ^= tl; + a09h ^= th; + a14l ^= tl; + a14h ^= th; + a19l ^= tl; + a19h ^= th; + a24l ^= tl; + a24h ^= th; + + // Rho Pi + b00l = a00l; + b00h = a00h; + b10l = a01l << 1 | a01h >>> 31; + b10h = a01h << 1 | a01l >>> 31; + b07l = a10l << 3 | a10h >>> 29; + b07h = a10h << 3 | a10l >>> 29; + b11l = a07l << 6 | a07h >>> 26; + b11h = a07h << 6 | a07l >>> 26; + b17l = a11l << 10 | a11h >>> 22; + b17h = a11h << 10 | a11l >>> 22; + b18l = a17l << 15 | a17h >>> 17; + b18h = a17h << 15 | a17l >>> 17; + b03l = a18l << 21 | a18h >>> 11; + b03h = a18h << 21 | a18l >>> 11; + b05l = a03l << 28 | a03h >>> 4; + b05h = a03h << 28 | a03l >>> 4; + b16l = a05h << 4 | a05l >>> 28; + b16h = a05l << 4 | a05h >>> 28; + b08l = a16h << 13 | a16l >>> 19; + b08h = a16l << 13 | a16h >>> 19; + b21l = a08h << 23 | a08l >>> 9; + b21h = a08l << 23 | a08h >>> 9; + b24l = a21l << 2 | a21h >>> 30; + b24h = a21h << 2 | a21l >>> 30; + b04l = a24l << 14 | a24h >>> 18; + b04h = a24h << 14 | a24l >>> 18; + b15l = a04l << 27 | a04h >>> 5; + b15h = a04h << 27 | a04l >>> 5; + b23l = a15h << 9 | a15l >>> 23; + b23h = a15l << 9 | a15h >>> 23; + b19l = a23h << 24 | a23l >>> 8; + b19h = a23l << 24 | a23h >>> 8; + b13l = a19l << 8 | a19h >>> 24; + b13h = a19h << 8 | a19l >>> 24; + b12l = a13l << 25 | a13h >>> 7; + b12h = a13h << 25 | a13l >>> 7; + b02l = a12h << 11 | a12l >>> 21; + b02h = a12l << 11 | a12h >>> 21; + b20l = a02h << 30 | a02l >>> 2; + b20h = a02l << 30 | a02h >>> 2; + b14l = a20l << 18 | a20h >>> 14; + b14h = a20h << 18 | a20l >>> 14; + b22l = a14h << 7 | a14l >>> 25; + b22h = a14l << 7 | a14h >>> 25; + b09l = a22h << 29 | a22l >>> 3; + b09h = a22l << 29 | a22h >>> 3; + b06l = a09l << 20 | a09h >>> 12; + b06h = a09h << 20 | a09l >>> 12; + b01l = a06h << 12 | a06l >>> 20; + b01h = a06l << 12 | a06h >>> 20; + + // Chi + a00l = b00l ^ ~b01l & b02l; + a00h = b00h ^ ~b01h & b02h; + a01l = b01l ^ ~b02l & b03l; + a01h = b01h ^ ~b02h & b03h; + a02l = b02l ^ ~b03l & b04l; + a02h = b02h ^ ~b03h & b04h; + a03l = b03l ^ ~b04l & b00l; + a03h = b03h ^ ~b04h & b00h; + a04l = b04l ^ ~b00l & b01l; + a04h = b04h ^ ~b00h & b01h; + a05l = b05l ^ ~b06l & b07l; + a05h = b05h ^ ~b06h & b07h; + a06l = b06l ^ ~b07l & b08l; + a06h = b06h ^ ~b07h & b08h; + a07l = b07l ^ ~b08l & b09l; + a07h = b07h ^ ~b08h & b09h; + a08l = b08l ^ ~b09l & b05l; + a08h = b08h ^ ~b09h & b05h; + a09l = b09l ^ ~b05l & b06l; + a09h = b09h ^ ~b05h & b06h; + a10l = b10l ^ ~b11l & b12l; + a10h = b10h ^ ~b11h & b12h; + a11l = b11l ^ ~b12l & b13l; + a11h = b11h ^ ~b12h & b13h; + a12l = b12l ^ ~b13l & b14l; + a12h = b12h ^ ~b13h & b14h; + a13l = b13l ^ ~b14l & b10l; + a13h = b13h ^ ~b14h & b10h; + a14l = b14l ^ ~b10l & b11l; + a14h = b14h ^ ~b10h & b11h; + a15l = b15l ^ ~b16l & b17l; + a15h = b15h ^ ~b16h & b17h; + a16l = b16l ^ ~b17l & b18l; + a16h = b16h ^ ~b17h & b18h; + a17l = b17l ^ ~b18l & b19l; + a17h = b17h ^ ~b18h & b19h; + a18l = b18l ^ ~b19l & b15l; + a18h = b18h ^ ~b19h & b15h; + a19l = b19l ^ ~b15l & b16l; + a19h = b19h ^ ~b15h & b16h; + a20l = b20l ^ ~b21l & b22l; + a20h = b20h ^ ~b21h & b22h; + a21l = b21l ^ ~b22l & b23l; + a21h = b21h ^ ~b22h & b23h; + a22l = b22l ^ ~b23l & b24l; + a22h = b22h ^ ~b23h & b24h; + a23l = b23l ^ ~b24l & b20l; + a23h = b23h ^ ~b24h & b20h; + a24l = b24l ^ ~b20l & b21l; + a24h = b24h ^ ~b20h & b21h; + + // Iota + a00l ^= Keccak_f1600_RC[r|0]; + a00h ^= Keccak_f1600_RC[r|1]; + } + + // todo, handle big-endian stores + outState[outOffset|0] = a00l; + outState[outOffset|1] = a00h; + outState[outOffset|2] = a01l; + outState[outOffset|3] = a01h; + outState[outOffset|4] = a02l; + outState[outOffset|5] = a02h; + outState[outOffset|6] = a03l; + outState[outOffset|7] = a03h; + if (outSize == 8) + return; + outState[outOffset|8] = a04l; + outState[outOffset|9] = a04h; + outState[outOffset|10] = a05l; + outState[outOffset|11] = a05h; + outState[outOffset|12] = a06l; + outState[outOffset|13] = a06h; + outState[outOffset|14] = a07l; + outState[outOffset|15] = a07h; + if (outSize == 16) + return; + outState[outOffset|16] = a08l; + outState[outOffset|17] = a08h; + outState[outOffset|18] = a09l; + outState[outOffset|19] = a09h; + outState[outOffset|20] = a10l; + outState[outOffset|21] = a10h; + outState[outOffset|22] = a11l; + outState[outOffset|23] = a11h; + outState[outOffset|24] = a12l; + outState[outOffset|25] = a12h; + outState[outOffset|26] = a13l; + outState[outOffset|27] = a13h; + outState[outOffset|28] = a14l; + outState[outOffset|29] = a14h; + outState[outOffset|30] = a15l; + outState[outOffset|31] = a15h; + outState[outOffset|32] = a16l; + outState[outOffset|33] = a16h; + outState[outOffset|34] = a17l; + outState[outOffset|35] = a17h; + outState[outOffset|36] = a18l; + outState[outOffset|37] = a18h; + outState[outOffset|38] = a19l; + outState[outOffset|39] = a19h; + outState[outOffset|40] = a20l; + outState[outOffset|41] = a20h; + outState[outOffset|42] = a21l; + outState[outOffset|43] = a21h; + outState[outOffset|44] = a22l; + outState[outOffset|45] = a22h; + outState[outOffset|46] = a23l; + outState[outOffset|47] = a23h; + outState[outOffset|48] = a24l; + outState[outOffset|49] = a24h; +} + +var Keccak = function() +{ + var stateBuf = new ArrayBuffer(200); + var stateBytes = new Uint8Array(stateBuf); + var stateWords = new Uint32Array(stateBuf); + + this.digest = function(oSize, iBytes) + { + for (var i = 0; i < 50; ++i) + { + stateWords[i] = 0; + } + + var r = 200 - oSize*2; + var iLength = iBytes.length; + var iOffset = 0; + for ( ; ;) + { + var len = iLength < r ? iLength : r; + for (i = 0; i < len; ++i, ++iOffset) + { + stateBytes[i] ^= iBytes[iOffset]; + } + + if (iLength < r) + break; + iLength -= len; + + keccak_f1600(stateWords, 0, 50, stateWords); + } + + stateBytes[iLength] ^= 1; + stateBytes[r-1] ^= 0x80; + keccak_f1600(stateWords, 0, 50, stateWords); + return stateBytes.subarray(0, oSize); + }; + + this.digestWords = function(oWords, oOffset, oLength, iWords, iOffset, iLength) + { + for (var i = 0; i < 50; ++i) + { + stateWords[i] = 0; + } + + var r = 50 - oLength*2; + for (; ; ) + { + var len = iLength < r ? iLength : r; + for (i = 0; i < len; ++i, ++iOffset) + { + stateWords[i] ^= iWords[iOffset]; + } + + if (iLength < r) + break; + iLength -= len; + + keccak_f1600(stateWords, 0, 50, stateWords); + } + + stateBytes[iLength<<2] ^= 1; + stateBytes[(r<<2) - 1] ^= 0x80; + keccak_f1600(oWords, oOffset, oLength, stateWords); + }; +}; + +module.exports = Keccak; + + diff --git a/Godeps/_workspace/src/github.com/expanse-project/ethash/js/makekeccak.js b/Godeps/_workspace/src/github.com/expanse-project/ethash/js/makekeccak.js new file mode 100644 index 0000000000..c4db2b80a0 --- /dev/null +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/js/makekeccak.js @@ -0,0 +1,201 @@ +#!/usr/bin/env node +// makekeccak.js +// Tim Hughes + +/*jslint node: true, shadow:true */ +"use strict"; + +var Keccak_f1600_Rho = [ + 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 2, 14, + 27, 41, 56, 8, 25, 43, 62, 18, 39, 61, 20, 44 +]; + +var Keccak_f1600_Pi= [ + 10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24, 4, + 15, 23, 19, 13, 12, 2, 20, 14, 22, 9, 6, 1 +]; + +var Keccak_f1600_RC = [ + 0x00000001, 0x00000000, + 0x00008082, 0x00000000, + 0x0000808a, 0x80000000, + 0x80008000, 0x80000000, + 0x0000808b, 0x00000000, + 0x80000001, 0x00000000, + 0x80008081, 0x80000000, + 0x00008009, 0x80000000, + 0x0000008a, 0x00000000, + 0x00000088, 0x00000000, + 0x80008009, 0x00000000, + 0x8000000a, 0x00000000, + 0x8000808b, 0x00000000, + 0x0000008b, 0x80000000, + 0x00008089, 0x80000000, + 0x00008003, 0x80000000, + 0x00008002, 0x80000000, + 0x00000080, 0x80000000, + 0x0000800a, 0x00000000, + 0x8000000a, 0x80000000, + 0x80008081, 0x80000000, + 0x00008080, 0x80000000, + 0x80000001, 0x00000000, + 0x80008008, 0x80000000, +]; + +function makeRotLow(lo, hi, n) +{ + if (n === 0 || n === 32) throw Error("unsupported"); + if ((n & 0x20) !== 0) + { + n &= ~0x20; + var t = hi; + hi = lo; + lo = t; + } + var hir = hi + " >>> " + (32 - n); + var los = lo + " << " + n; + return los + " | " + hir; +} + +function makeRotHigh(lo, hi, n) +{ + if (n === 0 || n === 32) throw Error("unsupported"); + if ((n & 0x20) !== 0) + { + n &= ~0x20; + var t = hi; + hi = lo; + lo = t; + } + var his = hi + " << " + n; + var lor = lo + " >>> " + (32 - n); + return his + " | " + lor; +} + +function makeKeccak_f1600() +{ + var format = function(n) + { + return n < 10 ? "0"+n : ""+n; + }; + + var a = function(n, w) + { + return "a" + format(n) + (w !== 0?'h':'l'); + }; + + var b = function(n, w) + { + return "b" + format(n) + (w !== 0?'h':'l'); + }; + + var str = ""; + str += "function keccak_f1600(outState, outOffset, outSize, inState)\n"; + str += "{\n"; + + for (var i = 0; i < 25; ++i) + { + for (var w = 0; w <= 1; ++w) + { + str += "\tvar " + a(i,w) + " = inState["+(i<<1|w)+"]|0;\n"; + } + } + + for (var j = 0; j < 5; ++j) + { + str += "\tvar "; + for (var i = 0; i < 5; ++i) + { + if (i !== 0) + str += ", "; + str += b(j*5+i,0) + ", " + b(j*5+i,1); + } + str += ";\n"; + } + + str += "\tvar tl, th;\n"; + str += "\n"; + str += "\tfor (var r = 0; r < 48; r = (r+2)|0)\n"; + str += "\t{\n"; + + + // Theta + str += "\t\t// Theta\n"; + for (var i = 0; i < 5; ++i) + { + for (var w = 0; w <= 1; ++w) + { + str += "\t\t" + b(i,w) + " = " + a(i,w) + " ^ " + a(i+5,w) + " ^ " + a(i+10,w) + " ^ " + a(i+15,w) + " ^ " + a(i+20,w) + ";\n"; + } + } + + for (var i = 0; i < 5; ++i) + { + var i4 = (i + 4) % 5; + var i1 = (i + 1) % 5; + str += "\t\ttl = " + b(i4,0) + " ^ (" + b(i1,0) + " << 1 | " + b(i1,1) + " >>> 31);\n"; + str += "\t\tth = " + b(i4,1) + " ^ (" + b(i1,1) + " << 1 | " + b(i1,0) + " >>> 31);\n"; + + for (var j = 0; j < 25; j = (j+5)|0) + { + str += "\t\t" + a((j+i),0) + " ^= tl;\n"; + str += "\t\t" + a((j+i),1) + " ^= th;\n"; + } + } + + + // Rho Pi + str += "\n\t\t// Rho Pi\n"; + for (var w = 0; w <= 1; ++w) + { + str += "\t\t" + b(0,w) + " = " + a(0,w) + ";\n"; + } + var opi = 1; + for (var i = 0; i < 24; ++i) + { + var pi = Keccak_f1600_Pi[i]; + str += "\t\t" + b(pi,0) + " = " + makeRotLow(a(opi,0), a(opi,1), Keccak_f1600_Rho[i]) + ";\n"; + str += "\t\t" + b(pi,1) + " = " + makeRotHigh(a(opi,0), a(opi,1), Keccak_f1600_Rho[i]) + ";\n"; + opi = pi; + } + + // Chi + str += "\n\t\t// Chi\n"; + for (var j = 0; j < 25; j += 5) + { + for (var i = 0; i < 5; ++i) + { + for (var w = 0; w <= 1; ++w) + { + str += "\t\t" + a(j+i,w) + " = " + b(j+i,w) + " ^ ~" + b(j+(i+1)%5,w) + " & " + b(j+(i+2)%5,w) + ";\n"; + } + } + } + + // Iota + str += "\n\t\t// Iota\n"; + for (var w = 0; w <= 1; ++w) + { + str += "\t\t" + a(0,w) + " ^= Keccak_f1600_RC[r|" + w + "];\n"; + } + + + str += "\t}\n"; + + for (var i = 0; i < 25; ++i) + { + if (i == 4 || i == 8) + { + str += "\tif (outSize == " + i*2 + ")\n\t\treturn;\n"; + } + for (var w = 0; w <= 1; ++w) + { + str += "\toutState[outOffset|"+(i<<1|w)+"] = " + a(i,w) + ";\n"; + } + } + str += "}\n"; + + return str; +} + +console.log(makeKeccak_f1600()); diff --git a/Godeps/_workspace/src/github.com/expanse-project/ethash/js/test.js b/Godeps/_workspace/src/github.com/expanse-project/ethash/js/test.js new file mode 100644 index 0000000000..7ebb733ff5 --- /dev/null +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/js/test.js @@ -0,0 +1,53 @@ +// test.js +// Tim Hughes + +/*jslint node: true, shadow:true */ +"use strict"; + +var ethash = require('./ethash'); +var util = require('./util'); +var Keccak = require('./keccak'); + +// sanity check hash functions +var src = util.stringToBytes(""); +if (util.bytesToHexString(new Keccak().digest(32, src)) != "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470") throw Error("Keccak-256 failed"); +if (util.bytesToHexString(new Keccak().digest(64, src)) != "0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e") throw Error("Keccak-512 failed"); + +src = new Uint32Array(src.buffer); +var dst = new Uint32Array(8); +new Keccak().digestWords(dst, 0, dst.length, src, 0, src.length); +if (util.wordsToHexString(dst) != "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470") throw Error("Keccak-256 Fast failed"); + +var dst = new Uint32Array(16); +new Keccak().digestWords(dst, 0, dst.length, src, 0, src.length); +if (util.wordsToHexString(dst) != "0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e") throw Error("Keccak-512 Fast failed"); + + +// init params +var ethashParams = ethash.defaultParams(); +//ethashParams.cacheRounds = 0; + +// create hasher +var seed = util.hexStringToBytes("9410b944535a83d9adf6bbdcc80e051f30676173c16ca0d32d6f1263fc246466") +var startTime = new Date().getTime(); +var hasher = new ethash.Ethash(ethashParams, seed); +console.log('Ethash startup took: '+(new Date().getTime() - startTime) + "ms"); +console.log('Ethash cache hash: ' + util.bytesToHexString(hasher.cacheDigest())); + +var testHexString = "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"; +if (testHexString != util.bytesToHexString(util.hexStringToBytes(testHexString))) + throw Error("bytesToHexString or hexStringToBytes broken"); + + +var header = util.hexStringToBytes("c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"); +var nonce = util.hexStringToBytes("0000000000000000"); +var hash; + +startTime = new Date().getTime(); +var trials = 10; +for (var i = 0; i < trials; ++i) +{ + hash = hasher.hash(header, nonce); +} +console.log("Light client hashes averaged: " + (new Date().getTime() - startTime)/trials + "ms"); +console.log("Hash = " + util.bytesToHexString(hash)); diff --git a/Godeps/_workspace/src/github.com/expanse-project/ethash/js/util.js b/Godeps/_workspace/src/github.com/expanse-project/ethash/js/util.js new file mode 100644 index 0000000000..79743cd915 --- /dev/null +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/js/util.js @@ -0,0 +1,100 @@ +// util.js +// Tim Hughes + +/*jslint node: true, shadow:true */ +"use strict"; + +function nibbleToChar(nibble) +{ + return String.fromCharCode((nibble < 10 ? 48 : 87) + nibble); +} + +function charToNibble(chr) +{ + if (chr >= 48 && chr <= 57) + { + return chr - 48; + } + if (chr >= 65 && chr <= 70) + { + return chr - 65 + 10; + } + if (chr >= 97 && chr <= 102) + { + return chr - 97 + 10; + } + return 0; +} + +function stringToBytes(str) +{ + var bytes = new Uint8Array(str.length); + for (var i = 0; i != str.length; ++i) + { + bytes[i] = str.charCodeAt(i); + } + return bytes; +} + +function hexStringToBytes(str) +{ + var bytes = new Uint8Array(str.length>>>1); + for (var i = 0; i != bytes.length; ++i) + { + bytes[i] = charToNibble(str.charCodeAt(i<<1 | 0)) << 4; + bytes[i] |= charToNibble(str.charCodeAt(i<<1 | 1)); + } + return bytes; +} + +function bytesToHexString(bytes) +{ + var str = ""; + for (var i = 0; i != bytes.length; ++i) + { + str += nibbleToChar(bytes[i] >>> 4); + str += nibbleToChar(bytes[i] & 0xf); + } + return str; +} + +function wordsToHexString(words) +{ + return bytesToHexString(new Uint8Array(words.buffer)); +} + +function uint32ToHexString(num) +{ + var buf = new Uint8Array(4); + buf[0] = (num >> 24) & 0xff; + buf[1] = (num >> 16) & 0xff; + buf[2] = (num >> 8) & 0xff; + buf[3] = (num >> 0) & 0xff; + return bytesToHexString(buf); +} + +function toWords(input) +{ + if (input instanceof Uint32Array) + { + return input; + } + else if (input instanceof Uint8Array) + { + var tmp = new Uint8Array((input.length + 3) & ~3); + tmp.set(input); + return new Uint32Array(tmp.buffer); + } + else if (typeof input === typeof "") + { + return toWords(stringToBytes(input)); + } + return null; +} + +exports.stringToBytes = stringToBytes; +exports.hexStringToBytes = hexStringToBytes; +exports.bytesToHexString = bytesToHexString; +exports.wordsToHexString = wordsToHexString; +exports.uint32ToHexString = uint32ToHexString; +exports.toWords = toWords; \ No newline at end of file diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/setup.py b/Godeps/_workspace/src/github.com/expanse-project/ethash/setup.py similarity index 85% rename from Godeps/_workspace/src/github.com/ethereum/ethash/setup.py rename to Godeps/_workspace/src/github.com/expanse-project/ethash/setup.py index 18aa20f6db..7b9aa708fb 100644 --- a/Godeps/_workspace/src/github.com/ethereum/ethash/setup.py +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/setup.py @@ -39,9 +39,9 @@ setup( author_email="matthew.wampler.doty@gmail.com", license='GPL', version='0.1.23', - url='https://github.com/ethereum/ethash', - download_url='https://github.com/ethereum/ethash/tarball/v23', - description=('Python wrappers for ethash, the ethereum proof of work' + url='https://github.com/expanse-org/ethash', + download_url='https://github.com/expanse-org/ethash/tarball/v23', + description=('Python wrappers for ethash, the expanse proof of work' 'hashing function'), ext_modules=[pyethash], ) diff --git a/Godeps/_workspace/src/github.com/expanse-project/ethash/src/benchmark/CMakeLists.txt b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/benchmark/CMakeLists.txt new file mode 100644 index 0000000000..3df4ab5967 --- /dev/null +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/benchmark/CMakeLists.txt @@ -0,0 +1,58 @@ +include_directories(..) + +set(CMAKE_BUILD_TYPE Release) + +if (MSVC) + add_definitions("/openmp") +endif() + +# enable C++11, should probably be a bit more specific about compiler +if (NOT MSVC) + SET(CMAKE_CXX_FLAGS "-std=c++11") +endif() + +if (NOT MPI_FOUND) + find_package(MPI) +endif() + +if (NOT CRYPTOPP_FOUND) + find_package(CryptoPP 5.6.2) +endif() + +if (CRYPTOPP_FOUND) + add_definitions(-DWITH_CRYPTOPP) + find_package (Threads REQUIRED) +endif() + +if (NOT OpenCL_FOUND) + find_package(OpenCL) +endif() +if (OpenCL_FOUND) + add_definitions(-DWITH_OPENCL) + include_directories(${OpenCL_INCLUDE_DIRS}) + list(APPEND FILES ethash_cl_miner.cpp ethash_cl_miner.h) +endif() + +if (MPI_FOUND) + include_directories(${MPI_INCLUDE_PATH}) + add_executable (Benchmark_MPI_FULL benchmark.cpp) + target_link_libraries (Benchmark_MPI_FULL ${ETHHASH_LIBS} ${MPI_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) + SET_TARGET_PROPERTIES(Benchmark_MPI_FULL PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} ${MPI_COMPILE_FLAGS} -DFULL -DMPI") + + add_executable (Benchmark_MPI_LIGHT benchmark.cpp) + target_link_libraries (Benchmark_MPI_LIGHT ${ETHHASH_LIBS} ${MPI_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) + SET_TARGET_PROPERTIES(Benchmark_MPI_LIGHT PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} ${MPI_COMPILE_FLAGS} -DMPI") +endif() + +add_executable (Benchmark_FULL benchmark.cpp) +target_link_libraries (Benchmark_FULL ${ETHHASH_LIBS} ${CMAKE_THREAD_LIBS_INIT}) +SET_TARGET_PROPERTIES(Benchmark_FULL PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -DFULL") + +add_executable (Benchmark_LIGHT benchmark.cpp) +target_link_libraries (Benchmark_LIGHT ${ETHHASH_LIBS} ${CMAKE_THREAD_LIBS_INIT}) + +if (OpenCL_FOUND) + add_executable (Benchmark_CL benchmark.cpp) + target_link_libraries (Benchmark_CL ${ETHHASH_LIBS} ethash-cl ${CMAKE_THREAD_LIBS_INIT}) + SET_TARGET_PROPERTIES(Benchmark_CL PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -DOPENCL") +endif() \ No newline at end of file diff --git a/Godeps/_workspace/src/github.com/expanse-project/ethash/src/benchmark/benchmark.cpp b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/benchmark/benchmark.cpp new file mode 100644 index 0000000000..dae4124824 --- /dev/null +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/benchmark/benchmark.cpp @@ -0,0 +1,278 @@ +/* + This file is part of cpp-expanse. + + cpp-expanse 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. + + cpp-expanse 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 cpp-expanse. If not, see . +*/ +/** @file benchmark.cpp + * @author Tim Hughes + * @date 2015 + */ + +#include +#include +#include +#include +#include +#ifdef OPENCL +#include +#endif +#include +#include + +#ifdef WITH_CRYPTOPP +#include +#include + +#else +#include "libethash/sha3.h" +#endif // WITH_CRYPTOPP + +#undef min +#undef max + +using std::chrono::high_resolution_clock; + +#if defined(OPENCL) +const unsigned trials = 1024*1024*32; +#elif defined(FULL) +const unsigned trials = 1024*1024/8; +#else +const unsigned trials = 1024*1024/1024; +#endif +uint8_t g_hashes[1024*32]; + +static char nibbleToChar(unsigned nibble) +{ + return (char) ((nibble >= 10 ? 'a'-10 : '0') + nibble); +} + +static uint8_t charToNibble(char chr) +{ + if (chr >= '0' && chr <= '9') + { + return (uint8_t) (chr - '0'); + } + if (chr >= 'a' && chr <= 'z') + { + return (uint8_t) (chr - 'a' + 10); + } + if (chr >= 'A' && chr <= 'Z') + { + return (uint8_t) (chr - 'A' + 10); + } + return 0; +} + +static std::vector hexStringToBytes(char const* str) +{ + std::vector bytes(strlen(str) >> 1); + for (unsigned i = 0; i != bytes.size(); ++i) + { + bytes[i] = charToNibble(str[i*2 | 0]) << 4; + bytes[i] |= charToNibble(str[i*2 | 1]); + } + return bytes; +} + +static std::string bytesToHexString(uint8_t const* bytes, unsigned size) +{ + std::string str; + for (unsigned i = 0; i != size; ++i) + { + str += nibbleToChar(bytes[i] >> 4); + str += nibbleToChar(bytes[i] & 0xf); + } + return str; +} + +static std::string bytesToHexString(ethash_h256_t const *hash, unsigned size) +{ + return bytesToHexString((uint8_t*)hash, size); +} + +extern "C" int main(void) +{ + // params for ethash + ethash_params params; + ethash_params_init(¶ms, 0); + //params.full_size = 262147 * 4096; // 1GBish; + //params.full_size = 32771 * 4096; // 128MBish; + //params.full_size = 8209 * 4096; // 8MBish; + //params.cache_size = 8209*4096; + //params.cache_size = 2053*4096; + ethash_h256_t seed; + ethash_h256_t previous_hash; + + memcpy(&seed, hexStringToBytes("9410b944535a83d9adf6bbdcc80e051f30676173c16ca0d32d6f1263fc246466").data(), 32); + memcpy(&previous_hash, hexStringToBytes("c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470").data(), 32); + + // allocate page aligned buffer for dataset +#ifdef FULL + void* full_mem_buf = malloc(params.full_size + 4095); + void* full_mem = (void*)((uintptr_t(full_mem_buf) + 4095) & ~4095); +#endif + void* cache_mem_buf = malloc(params.cache_size + 63); + void* cache_mem = (void*)((uintptr_t(cache_mem_buf) + 63) & ~63); + + ethash_cache cache; + cache.mem = cache_mem; + + // compute cache or full data + { + auto startTime = high_resolution_clock::now(); + ethash_mkcache(&cache, ¶ms, &seed); + auto time = std::chrono::duration_cast(high_resolution_clock::now() - startTime).count(); + + ethash_h256_t cache_hash; + SHA3_256(&cache_hash, (uint8_t const*)cache_mem, params.cache_size); + debugf("ethash_mkcache: %ums, sha3: %s\n", (unsigned)((time*1000)/CLOCKS_PER_SEC), bytesToHexString(&cache_hash, sizeof(cache_hash)).data()); + + // print a couple of test hashes + { + auto startTime = high_resolution_clock::now(); + ethash_return_value hash; + ethash_light(&hash, &cache, ¶ms, &previous_hash, 0); + auto time = std::chrono::duration_cast(high_resolution_clock::now() - startTime).count(); + debugf("ethash_light test: %ums, %s\n", (unsigned)time, bytesToHexString(&hash.result, 32).data()); + } + + #ifdef FULL + startTime = high_resolution_clock::now(); + ethash_compute_full_data(full_mem, ¶ms, &cache); + time = std::chrono::duration_cast(high_resolution_clock::now() - startTime).count(); + debugf("ethash_compute_full_data: %ums\n", (unsigned)time); + #endif // FULL + } + +#ifdef OPENCL + ethash_cl_miner miner; + { + auto startTime = high_resolution_clock::now(); + if (!miner.init(params, &seed)) + exit(-1); + auto time = std::chrono::duration_cast(high_resolution_clock::now() - startTime).count(); + debugf("ethash_cl_miner init: %ums\n", (unsigned)time); + } +#endif + + +#ifdef FULL + { + auto startTime = high_resolution_clock::now(); + ethash_return_value hash; + ethash_full(&hash, full_mem, ¶ms, &previous_hash, 0); + auto time = std::chrono::duration_cast(high_resolution_clock::now() - startTime).count(); + debugf("ethash_full test: %uns\n", (unsigned)time); + } +#endif + +#ifdef OPENCL + // validate 1024 hashes against CPU + miner.hash(g_hashes, (uint8_t*)&previous_hash, 0, 1024); + for (unsigned i = 0; i != 1024; ++i) + { + ethash_return_value hash; + ethash_light(&hash, &cache, ¶ms, &previous_hash, i); + if (memcmp(&hash.result, g_hashes + 32*i, 32) != 0) + { + debugf("nonce %u failed: %s %s\n", i, bytesToHexString(g_hashes + 32*i, 32).c_str(), bytesToHexString(&hash.result, 32).c_str()); + static unsigned c = 0; + if (++c == 16) + { + exit(-1); + } + } + } + + // ensure nothing else is going on + miner.finish(); +#endif + + auto startTime = high_resolution_clock::now(); + unsigned hash_count = trials; + + #ifdef OPENCL + { + struct search_hook : ethash_cl_miner::search_hook + { + unsigned hash_count; + std::vector nonce_vec; + + virtual bool found(uint64_t const* nonces, uint32_t count) + { + nonce_vec.insert(nonce_vec.end(), nonces, nonces + count); + return false; + } + + virtual bool searched(uint64_t start_nonce, uint32_t count) + { + // do nothing + hash_count += count; + return hash_count >= trials; + } + }; + search_hook hook; + hook.hash_count = 0; + + miner.search((uint8_t*)&previous_hash, 0x000000ffffffffff, hook); + + for (unsigned i = 0; i != hook.nonce_vec.size(); ++i) + { + uint64_t nonce = hook.nonce_vec[i]; + ethash_return_value hash; + ethash_light(&hash, &cache, ¶ms, &previous_hash, nonce); + debugf("found: %.8x%.8x -> %s\n", unsigned(nonce>>32), unsigned(nonce), bytesToHexString(&hash.result, 32).c_str()); + } + + hash_count = hook.hash_count; + } + #else + { + //#pragma omp parallel for + for (int nonce = 0; nonce < trials; ++nonce) + { + ethash_return_value hash; + #ifdef FULL + ethash_full(&hash, full_mem, ¶ms, &previous_hash, nonce); + #else + ethash_light(&hash, &cache, ¶ms, &previous_hash, nonce); + #endif // FULL + } + } + #endif + auto time = std::chrono::duration_cast(high_resolution_clock::now() - startTime).count(); + debugf("Search took: %ums\n", (unsigned)time/1000); + + unsigned read_size = ETHASH_ACCESSES * ETHASH_MIX_BYTES; +#if defined(OPENCL) || defined(FULL) + debugf( + "hashrate: %8.2f Mh/s, bw: %8.2f GB/s\n", + (double)hash_count * (1000*1000)/time / (1000*1000), + (double)hash_count*read_size * (1000*1000)/time / (1024*1024*1024) + ); +#else + debugf( + "hashrate: %8.2f Kh/s, bw: %8.2f MB/s\n", + (double)hash_count * (1000*1000)/time / (1000), + (double)hash_count*read_size * (1000*1000)/time / (1024*1024) + ); +#endif + + free(cache_mem_buf); +#ifdef FULL + free(full_mem_buf); +#endif + + return 0; +} diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/CMakeLists.txt b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/CMakeLists.txt similarity index 100% rename from Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/CMakeLists.txt rename to Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/CMakeLists.txt diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/compiler.h b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/compiler.h similarity index 75% rename from Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/compiler.h rename to Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/compiler.h index 9695871cdc..7750ab9b7c 100644 --- a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/compiler.h +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/compiler.h @@ -1,18 +1,18 @@ /* - This file is part of cpp-ethereum. + This file is part of cpp-expanse. - cpp-ethereum is free software: you can redistribute it and/or modify + cpp-expanse 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. - cpp-ethereum is distributed in the hope that it will be useful, + cpp-expanse 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 cpp-ethereum. If not, see . + along with cpp-expanse. If not, see . */ /** @file compiler.h * @date 2014 diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/data_sizes.h b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/data_sizes.h similarity index 99% rename from Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/data_sizes.h rename to Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/data_sizes.h index 83cc30bcba..4eadea6127 100644 --- a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/data_sizes.h +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/data_sizes.h @@ -1,18 +1,18 @@ /* - This file is part of cpp-ethereum. + This file is part of cpp-expanse. - cpp-ethereum is free software: you can redistribute it and/or modify + cpp-expanse 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 FoundationUUU,either version 3 of the LicenseUUU,or (at your option) any later version. - cpp-ethereum is distributed in the hope that it will be usefulU, + cpp-expanse is distributed in the hope that it will be usefulU, 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 cpp-ethereum. If notUUU,see . + along with cpp-expanse. If notUUU,see . */ /** @file data_sizes.h diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/endian.h b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/endian.h similarity index 100% rename from Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/endian.h rename to Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/endian.h diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/ethash.h b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/ethash.h similarity index 100% rename from Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/ethash.h rename to Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/ethash.h diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/fnv.h b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/fnv.h similarity index 80% rename from Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/fnv.h rename to Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/fnv.h index 82cd655c41..e11090f6ac 100644 --- a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/fnv.h +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/fnv.h @@ -1,18 +1,18 @@ /* - This file is part of cpp-ethereum. + This file is part of cpp-expanse. - cpp-ethereum is free software: you can redistribute it and/or modify + cpp-expanse 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. - cpp-ethereum is distributed in the hope that it will be useful, + cpp-expanse 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 cpp-ethereum. If not, see . + along with cpp-expanse. If not, see . */ /** @file fnv.h * @author Matthew Wampler-Doty diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/internal.c b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/internal.c similarity index 99% rename from Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/internal.c rename to Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/internal.c index 338aa5ecd3..0a53ce2376 100644 --- a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/internal.c +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/internal.c @@ -12,7 +12,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . + along with cpp-expanse. If not, see . */ /** @file internal.c * @author Tim Hughes @@ -184,7 +184,7 @@ static bool ethash_hash( return false; } - // pack hash and nonce together into first 40 bytes of s_mix + // pack hash and nonce togexper into first 40 bytes of s_mix assert(sizeof(node) * 8 == 512); node s_mix[MIX_NODES + 1]; memcpy(s_mix[0].bytes, &header_hash, 32); diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/internal.h b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/internal.h similarity index 100% rename from Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/internal.h rename to Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/internal.h diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io.c b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/io.c similarity index 100% rename from Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io.c rename to Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/io.c diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io.h b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/io.h similarity index 97% rename from Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io.h rename to Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/io.h index 7a27089c7d..0febbe1b9e 100644 --- a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io.h +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/io.h @@ -38,7 +38,7 @@ extern "C" { // 10 is for maximum number of digits of a uint32_t (for REVISION) // 1 is for - and 16 is for the first 16 hex digits for first 8 bytes of // the seedhash and last 1 is for the null terminating character -// Reference: https://github.com/ethereum/wiki/wiki/Ethash-DAG +// Reference: https://github.com/expanse-project/wiki/wiki/Ethash-DAG #define DAG_MUTABLE_NAME_MAX_SIZE (6 + 10 + 1 + 16 + 1) /// Possible return values of @see ethash_io_prepare enum ethash_io_rc { @@ -80,7 +80,7 @@ enum ethash_io_rc { * data directory. If it does not exist it's created. * @param[in] seedhash The seedhash of the current block number, used in the * naming of the file as can be seen from the spec at: - * https://github.com/ethereum/wiki/wiki/Ethash-DAG + * https://github.com/expanse-project/wiki/wiki/Ethash-DAG * @param[out] output_file If there was no failure then this will point to an open * file descriptor. User is responsible for closing it. * In the case of memo match then the file is open on read @@ -175,7 +175,7 @@ char* ethash_io_create_filename( /** * Gets the default directory name for the DAG depending on the system * - * The spec defining this directory is here: https://github.com/ethereum/wiki/wiki/Ethash-DAG + * The spec defining this directory is here: https://github.com/expanse-project/wiki/wiki/Ethash-DAG * * @param[out] strbuf A string buffer of sufficient size to keep the * null termninated string of the directory name diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io_posix.c b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/io_posix.c similarity index 100% rename from Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io_posix.c rename to Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/io_posix.c diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io_win32.c b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/io_win32.c similarity index 100% rename from Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io_win32.c rename to Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/io_win32.c diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/mmap.h b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/mmap.h similarity index 100% rename from Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/mmap.h rename to Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/mmap.h diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/mmap_win32.c b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/mmap_win32.c similarity index 100% rename from Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/mmap_win32.c rename to Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/mmap_win32.c diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/sha3.c b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/sha3.c similarity index 100% rename from Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/sha3.c rename to Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/sha3.c diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/sha3.h b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/sha3.h similarity index 100% rename from Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/sha3.h rename to Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/sha3.h diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/sha3_cryptopp.cpp b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/sha3_cryptopp.cpp similarity index 100% rename from Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/sha3_cryptopp.cpp rename to Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/sha3_cryptopp.cpp diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/sha3_cryptopp.h b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/sha3_cryptopp.h similarity index 100% rename from Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/sha3_cryptopp.h rename to Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/sha3_cryptopp.h diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/util.h b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/util.h similarity index 100% rename from Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/util.h rename to Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/util.h diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/util_win32.c b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/util_win32.c similarity index 78% rename from Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/util_win32.c rename to Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/util_win32.c index 268e6db056..6f2e69e6d1 100644 --- a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/util_win32.c +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/util_win32.c @@ -1,18 +1,18 @@ /* - This file is part of cpp-ethereum. + This file is part of cpp-expanse. - cpp-ethereum is free software: you can redistribute it and/or modify + cpp-expanse 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. - cpp-ethereum is distributed in the hope that it will be useful, + cpp-expanse 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 cpp-ethereum. If not, see . + along with cpp-expanse. If not, see . */ /** @file util.c * @author Tim Hughes diff --git a/Godeps/_workspace/src/github.com/expanse-project/ethash/src/python/core.c b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/python/core.c new file mode 100644 index 0000000000..b84d6c7504 --- /dev/null +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/python/core.c @@ -0,0 +1,267 @@ +#include +#include +#include +#include +#include +#include "../libethash/ethash.h" +#include "../libethash/internal.h" + +#if PY_MAJOR_VERSION >= 3 +#define PY_STRING_FORMAT "y#" +#define PY_CONST_STRING_FORMAT "y" +#else +#define PY_STRING_FORMAT "s#" +#define PY_CONST_STRING_FORMAT "s" +#endif + +#define MIX_WORDS (ETHASH_MIX_BYTES/4) + +static PyObject * +mkcache_bytes(PyObject *self, PyObject *args) { + unsigned long block_number; + unsigned long cache_size; + + if (!PyArg_ParseTuple(args, "k", &block_number)) + return 0; + + ethash_light_t L = ethash_light_new(block_number); + PyObject * val = Py_BuildValue(PY_STRING_FORMAT, L->cache, L->cache_size); + free(L->cache); + return val; +} + +/* +static PyObject * +calc_dataset_bytes(PyObject *self, PyObject *args) { + char *cache_bytes; + unsigned long full_size; + int cache_size; + + if (!PyArg_ParseTuple(args, "k" PY_STRING_FORMAT, &full_size, &cache_bytes, &cache_size)) + return 0; + + if (full_size % MIX_WORDS != 0) { + char error_message[1024]; + sprintf(error_message, "The size of data set must be a multiple of %i bytes (was %lu)", MIX_WORDS, full_size); + PyErr_SetString(PyExc_ValueError, error_message); + return 0; + } + + if (cache_size % ETHASH_HASH_BYTES != 0) { + char error_message[1024]; + sprintf(error_message, "The size of the cache must be a multiple of %i bytes (was %i)", ETHASH_HASH_BYTES, cache_size); + PyErr_SetString(PyExc_ValueError, error_message); + return 0; + } + + ethash_params params; + params.cache_size = (size_t) cache_size; + params.full_size = (size_t) full_size; + ethash_cache cache; + cache.mem = (void *) cache_bytes; + void *mem = malloc(params.full_size); + ethash_compute_full_data(mem, ¶ms, &cache); + PyObject * val = Py_BuildValue(PY_STRING_FORMAT, (char *) mem, full_size); + free(mem); + return val; +}*/ + +// hashimoto_light(full_size, cache, header, nonce) +static PyObject * +hashimoto_light(PyObject *self, PyObject *args) { + char *cache_bytes; + char *header; + unsigned long block_number; + unsigned long long nonce; + int cache_size, header_size; + if (!PyArg_ParseTuple(args, "k" PY_STRING_FORMAT PY_STRING_FORMAT "K", &block_number, &cache_bytes, &cache_size, &header, &header_size, &nonce)) + return 0; + if (header_size != 32) { + char error_message[1024]; + sprintf(error_message, "Seed must be 32 bytes long (was %i)", header_size); + PyErr_SetString(PyExc_ValueError, error_message); + return 0; + } + struct ethash_light *s; + s = calloc(sizeof(*s), 1); + s->cache = cache_bytes; + s->cache_size = cache_size; + s->block_number = block_number; + struct ethash_h256 *h; + h = calloc(sizeof(*h), 1); + for (int i = 0; i < 32; i++) h->b[i] = header[i]; + struct ethash_return_value out = ethash_light_compute(s, *h, nonce); + return Py_BuildValue("{" PY_CONST_STRING_FORMAT ":" PY_STRING_FORMAT "," PY_CONST_STRING_FORMAT ":" PY_STRING_FORMAT "}", + "mix digest", &out.mix_hash, 32, + "result", &out.result, 32); +} +/* +// hashimoto_full(dataset, header, nonce) +static PyObject * +hashimoto_full(PyObject *self, PyObject *args) { + char *full_bytes; + char *header; + unsigned long long nonce; + int full_size, header_size; + + if (!PyArg_ParseTuple(args, PY_STRING_FORMAT PY_STRING_FORMAT "K", &full_bytes, &full_size, &header, &header_size, &nonce)) + return 0; + + if (full_size % MIX_WORDS != 0) { + char error_message[1024]; + sprintf(error_message, "The size of data set must be a multiple of %i bytes (was %i)", MIX_WORDS, full_size); + PyErr_SetString(PyExc_ValueError, error_message); + return 0; + } + + if (header_size != 32) { + char error_message[1024]; + sprintf(error_message, "Header must be 32 bytes long (was %i)", header_size); + PyErr_SetString(PyExc_ValueError, error_message); + return 0; + } + + + ethash_return_value out; + ethash_params params; + params.full_size = (size_t) full_size; + ethash_full(&out, (void *) full_bytes, ¶ms, (ethash_h256_t *) header, nonce); + return Py_BuildValue("{" PY_CONST_STRING_FORMAT ":" PY_STRING_FORMAT ", " PY_CONST_STRING_FORMAT ":" PY_STRING_FORMAT "}", + "mix digest", &out.mix_hash, 32, + "result", &out.result, 32); +} + +// mine(dataset_bytes, header, difficulty_bytes) +static PyObject * +mine(PyObject *self, PyObject *args) { + char *full_bytes; + char *header; + char *difficulty; + srand(time(0)); + uint64_t nonce = ((uint64_t) rand()) << 32 | rand(); + int full_size, header_size, difficulty_size; + + if (!PyArg_ParseTuple(args, PY_STRING_FORMAT PY_STRING_FORMAT PY_STRING_FORMAT, &full_bytes, &full_size, &header, &header_size, &difficulty, &difficulty_size)) + return 0; + + if (full_size % MIX_WORDS != 0) { + char error_message[1024]; + sprintf(error_message, "The size of data set must be a multiple of %i bytes (was %i)", MIX_WORDS, full_size); + PyErr_SetString(PyExc_ValueError, error_message); + return 0; + } + + if (header_size != 32) { + char error_message[1024]; + sprintf(error_message, "Header must be 32 bytes long (was %i)", header_size); + PyErr_SetString(PyExc_ValueError, error_message); + return 0; + } + + if (difficulty_size != 32) { + char error_message[1024]; + sprintf(error_message, "Difficulty must be an array of 32 bytes (only had %i)", difficulty_size); + PyErr_SetString(PyExc_ValueError, error_message); + return 0; + } + + ethash_return_value out; + ethash_params params; + params.full_size = (size_t) full_size; + + // TODO: Multi threading? + do { + ethash_full(&out, (void *) full_bytes, ¶ms, (const ethash_h256_t *) header, nonce++); + // TODO: disagrees with the spec https://github.com/expanse-project/wiki/wiki/Ethash#mining + } while (!ethash_check_difficulty(&out.result, (const ethash_h256_t *) difficulty)); + + return Py_BuildValue("{" PY_CONST_STRING_FORMAT ":" PY_STRING_FORMAT ", " PY_CONST_STRING_FORMAT ":" PY_STRING_FORMAT ", " PY_CONST_STRING_FORMAT ":K}", + "mix digest", &out.mix_hash, 32, + "result", &out.result, 32, + "nonce", nonce); +} +*/ + +//get_seedhash(block_number) +static PyObject * +get_seedhash(PyObject *self, PyObject *args) { + unsigned long block_number; + if (!PyArg_ParseTuple(args, "k", &block_number)) + return 0; + if (block_number >= ETHASH_EPOCH_LENGTH * 2048) { + char error_message[1024]; + sprintf(error_message, "Block number must be less than %i (was %lu)", ETHASH_EPOCH_LENGTH * 2048, block_number); + + PyErr_SetString(PyExc_ValueError, error_message); + return 0; + } + ethash_h256_t seedhash = ethash_get_seedhash(block_number); + return Py_BuildValue(PY_STRING_FORMAT, (char *) &seedhash, 32); +} + +static PyMethodDef PyethashMethods[] = + { + {"get_seedhash", get_seedhash, METH_VARARGS, + "get_seedhash(block_number)\n\n" + "Gets the seedhash for a block."}, + {"mkcache_bytes", mkcache_bytes, METH_VARARGS, + "mkcache_bytes(block_number)\n\n" + "Makes a byte array for the cache for given block number\n"}, + /*{"calc_dataset_bytes", calc_dataset_bytes, METH_VARARGS, + "calc_dataset_bytes(full_size, cache_bytes)\n\n" + "Makes a byte array for the dataset for a given size given cache bytes"},*/ + {"hashimoto_light", hashimoto_light, METH_VARARGS, + "hashimoto_light(block_number, cache_bytes, header, nonce)\n\n" + "Runs the hashimoto hashing function just using cache bytes. Takes an int (full_size), byte array (cache_bytes), another byte array (header), and an int (nonce). Returns an object containing the mix digest, and hash result."}, + /*{"hashimoto_full", hashimoto_full, METH_VARARGS, + "hashimoto_full(dataset_bytes, header, nonce)\n\n" + "Runs the hashimoto hashing function using the dataset bytes. Useful for testing. Returns an object containing the mix digest (byte array), and hash result (another byte array)."}, + {"mine", mine, METH_VARARGS, + "mine(dataset_bytes, header, difficulty_bytes)\n\n" + "Mine for an adequate header. Returns an object containing the mix digest (byte array), hash result (another byte array) and nonce (an int)."},*/ + {NULL, NULL, 0, NULL} + }; + +#if PY_MAJOR_VERSION >= 3 +static struct PyModuleDef PyethashModule = { + PyModuleDef_HEAD_INIT, + "pyethash", + "...", + -1, + PyethashMethods +}; + +PyMODINIT_FUNC PyInit_pyethash(void) { + PyObject *module = PyModule_Create(&PyethashModule); + // Following Spec: https://github.com/expanse-project/wiki/wiki/Ethash#definitions + PyModule_AddIntConstant(module, "REVISION", (long) ETHASH_REVISION); + PyModule_AddIntConstant(module, "DATASET_BYTES_INIT", (long) ETHASH_DATASET_BYTES_INIT); + PyModule_AddIntConstant(module, "DATASET_BYTES_GROWTH", (long) ETHASH_DATASET_BYTES_GROWTH); + PyModule_AddIntConstant(module, "CACHE_BYTES_INIT", (long) ETHASH_CACHE_BYTES_INIT); + PyModule_AddIntConstant(module, "CACHE_BYTES_GROWTH", (long) ETHASH_CACHE_BYTES_GROWTH); + PyModule_AddIntConstant(module, "EPOCH_LENGTH", (long) ETHASH_EPOCH_LENGTH); + PyModule_AddIntConstant(module, "MIX_BYTES", (long) ETHASH_MIX_BYTES); + PyModule_AddIntConstant(module, "HASH_BYTES", (long) ETHASH_HASH_BYTES); + PyModule_AddIntConstant(module, "DATASET_PARENTS", (long) ETHASH_DATASET_PARENTS); + PyModule_AddIntConstant(module, "CACHE_ROUNDS", (long) ETHASH_CACHE_ROUNDS); + PyModule_AddIntConstant(module, "ACCESSES", (long) ETHASH_ACCESSES); + return module; +} +#else +PyMODINIT_FUNC +initpyethash(void) { + PyObject *module = Py_InitModule("pyethash", PyethashMethods); + // Following Spec: https://github.com/expanse-project/wiki/wiki/Ethash#definitions + PyModule_AddIntConstant(module, "REVISION", (long) ETHASH_REVISION); + PyModule_AddIntConstant(module, "DATASET_BYTES_INIT", (long) ETHASH_DATASET_BYTES_INIT); + PyModule_AddIntConstant(module, "DATASET_BYTES_GROWTH", (long) ETHASH_DATASET_BYTES_GROWTH); + PyModule_AddIntConstant(module, "CACHE_BYTES_INIT", (long) ETHASH_CACHE_BYTES_INIT); + PyModule_AddIntConstant(module, "CACHE_BYTES_GROWTH", (long) ETHASH_CACHE_BYTES_GROWTH); + PyModule_AddIntConstant(module, "EPOCH_LENGTH", (long) ETHASH_EPOCH_LENGTH); + PyModule_AddIntConstant(module, "MIX_BYTES", (long) ETHASH_MIX_BYTES); + PyModule_AddIntConstant(module, "HASH_BYTES", (long) ETHASH_HASH_BYTES); + PyModule_AddIntConstant(module, "DATASET_PARENTS", (long) ETHASH_DATASET_PARENTS); + PyModule_AddIntConstant(module, "CACHE_ROUNDS", (long) ETHASH_CACHE_ROUNDS); + PyModule_AddIntConstant(module, "ACCESSES", (long) ETHASH_ACCESSES); +} +#endif diff --git a/Godeps/_workspace/src/github.com/expanse-project/ethash/test/c/CMakeLists.txt b/Godeps/_workspace/src/github.com/expanse-project/ethash/test/c/CMakeLists.txt new file mode 100644 index 0000000000..f94531c3df --- /dev/null +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/test/c/CMakeLists.txt @@ -0,0 +1,66 @@ +if (MSVC) + if (NOT BOOST_ROOT) + set (BOOST_ROOT "$ENV{BOOST_ROOT}") + endif() + set (CMAKE_PREFIX_PATH BOOST_ROOT) +endif() + +IF( NOT Boost_FOUND ) + # use multithreaded boost libraries, with -mt suffix + set(Boost_USE_MULTITHREADED ON) + + if (MSVC) + # TODO handle other msvc versions or it will fail find them + set(Boost_COMPILER -vc120) + # use static boost libraries *.lib + set(Boost_USE_STATIC_LIBS ON) + elseif (APPLE) + + # use static boost libraries *.a + set(Boost_USE_STATIC_LIBS ON) + + elseif (UNIX) + # use dynamic boost libraries .dll + set(Boost_USE_STATIC_LIBS OFF) + + endif() + find_package(Boost 1.48.0 COMPONENTS unit_test_framework system filesystem) +ENDIF() + +IF (Boost_FOUND) + message(STATUS "boost header: ${Boost_INCLUDE_DIRS}") + message(STATUS "boost libs : ${Boost_LIBRARIES}") + + include_directories( ${Boost_INCLUDE_DIR} ) + include_directories(../../src) + + link_directories(${Boost_LIBRARY_DIRS}) + file(GLOB HEADERS "*.h") + if ((NOT MSVC) AND (NOT APPLE)) + ADD_DEFINITIONS(-DBOOST_TEST_DYN_LINK) + endif() + if (NOT CRYPTOPP_FOUND) + find_package (CryptoPP) + endif() + + if (CRYPTOPP_FOUND) + add_definitions(-DWITH_CRYPTOPP) + endif() + + if (NOT MSVC) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 ") + endif() + + add_executable (Test "./test.cpp" ${HEADERS}) + target_link_libraries(Test ${ETHHASH_LIBS}) + target_link_libraries(Test ${Boost_FILESYSTEM_LIBRARIES}) + target_link_libraries(Test ${Boost_SYSTEM_LIBRARIES}) + target_link_libraries(Test ${Boost_UNIT_TEST_FRAMEWORK_LIBRARIES}) + + if (CRYPTOPP_FOUND) + TARGET_LINK_LIBRARIES(Test ${CRYPTOPP_LIBRARIES}) + endif() + + enable_testing () + add_test(NAME ethash COMMAND Test) +ENDIF() diff --git a/Godeps/_workspace/src/github.com/expanse-project/ethash/test/c/test.cpp b/Godeps/_workspace/src/github.com/expanse-project/ethash/test/c/test.cpp new file mode 100644 index 0000000000..ffcf105186 --- /dev/null +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/test/c/test.cpp @@ -0,0 +1,669 @@ +#include +#include +#include +#include +#include + +#ifdef WITH_CRYPTOPP + +#include + +#else +#include +#endif // WITH_CRYPTOPP + +#ifdef _WIN32 +#include +#include +#endif + +#define BOOST_TEST_MODULE Daggerhashimoto +#define BOOST_TEST_MAIN + +#include +#include +#include +#include +#include + +using namespace std; +using byte = uint8_t; +using bytes = std::vector; +namespace fs = boost::filesystem; + +// Just an alloca "wrapper" to silence uint64_t to size_t conversion warnings in windows +// consider replacing alloca calls with something better though! +#define our_alloca(param__) alloca((size_t)(param__)) + + +// some functions taken from exp::dev for convenience. +std::string bytesToHexString(const uint8_t *str, const uint64_t s) +{ + std::ostringstream ret; + + for (size_t i = 0; i < s; ++i) + ret << std::hex << std::setfill('0') << std::setw(2) << std::nouppercase << (int) str[i]; + + return ret.str(); +} + +std::string blockhashToHexString(ethash_h256_t* _hash) +{ + return bytesToHexString((uint8_t*)_hash, 32); +} + +int fromHex(char _i) +{ + if (_i >= '0' && _i <= '9') + return _i - '0'; + if (_i >= 'a' && _i <= 'f') + return _i - 'a' + 10; + if (_i >= 'A' && _i <= 'F') + return _i - 'A' + 10; + + BOOST_REQUIRE_MESSAGE(false, "should never get here"); + return -1; +} + +bytes hexStringToBytes(std::string const& _s) +{ + unsigned s = (_s[0] == '0' && _s[1] == 'x') ? 2 : 0; + std::vector ret; + ret.reserve((_s.size() - s + 1) / 2); + + if (_s.size() % 2) + try + { + ret.push_back(fromHex(_s[s++])); + } + catch (...) + { + ret.push_back(0); + } + for (unsigned i = s; i < _s.size(); i += 2) + try + { + ret.push_back((byte)(fromHex(_s[i]) * 16 + fromHex(_s[i + 1]))); + } + catch (...){ + ret.push_back(0); + } + return ret; +} + +ethash_h256_t stringToBlockhash(std::string const& _s) +{ + ethash_h256_t ret; + bytes b = hexStringToBytes(_s); + memcpy(&ret, b.data(), b.size()); + return ret; +} + + + +BOOST_AUTO_TEST_CASE(fnv_hash_check) { + uint32_t x = 1235U; + const uint32_t + y = 9999999U, + expected = (FNV_PRIME * x) ^y; + + x = fnv_hash(x, y); + + BOOST_REQUIRE_MESSAGE(x == expected, + "\nexpected: " << expected << "\n" + << "actual: " << x << "\n"); + +} + +BOOST_AUTO_TEST_CASE(SHA256_check) { + ethash_h256_t input; + ethash_h256_t out; + memcpy(&input, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", 32); + SHA3_256(&out, (uint8_t*)&input, 32); + const std::string + expected = "2b5ddf6f4d21c23de216f44d5e4bdc68e044b71897837ea74c83908be7037cd7", + actual = bytesToHexString((uint8_t*)&out, 32); + BOOST_REQUIRE_MESSAGE(expected == actual, + "\nexpected: " << expected.c_str() << "\n" + << "actual: " << actual.c_str() << "\n"); +} + +BOOST_AUTO_TEST_CASE(SHA512_check) { + uint8_t input[64], out[64]; + memcpy(input, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", 64); + SHA3_512(out, input, 64); + const std::string + expected = "0be8a1d334b4655fe58c6b38789f984bb13225684e86b20517a55ab2386c7b61c306f25e0627c60064cecd6d80cd67a82b3890bd1289b7ceb473aad56a359405", + actual = bytesToHexString(out, 64); + BOOST_REQUIRE_MESSAGE(expected == actual, + "\nexpected: " << expected.c_str() << "\n" + << "actual: " << actual.c_str() << "\n"); +} + +BOOST_AUTO_TEST_CASE(test_swap_endian32) { + uint32_t v32 = (uint32_t)0xBAADF00D; + v32 = ethash_swap_u32(v32); + BOOST_REQUIRE_EQUAL(v32, (uint32_t)0x0DF0ADBA); +} + +BOOST_AUTO_TEST_CASE(test_swap_endian64) { + uint64_t v64 = (uint64_t)0xFEE1DEADDEADBEEF; + v64 = ethash_swap_u64(v64); + BOOST_REQUIRE_EQUAL(v64, (uint64_t)0xEFBEADDEADDEE1FE); +} + +BOOST_AUTO_TEST_CASE(ethash_params_init_genesis_check) { + uint64_t full_size = ethash_get_datasize(0); + uint64_t cache_size = ethash_get_cachesize(0); + BOOST_REQUIRE_MESSAGE(full_size < ETHASH_DATASET_BYTES_INIT, + "\nfull size: " << full_size << "\n" + << "should be less than or equal to: " << ETHASH_DATASET_BYTES_INIT << "\n"); + BOOST_REQUIRE_MESSAGE(full_size + 20 * ETHASH_MIX_BYTES >= ETHASH_DATASET_BYTES_INIT, + "\nfull size + 20*MIX_BYTES: " << full_size + 20 * ETHASH_MIX_BYTES << "\n" + << "should be greater than or equal to: " << ETHASH_DATASET_BYTES_INIT << "\n"); + BOOST_REQUIRE_MESSAGE(cache_size < ETHASH_DATASET_BYTES_INIT / 32, + "\ncache size: " << cache_size << "\n" + << "should be less than or equal to: " << ETHASH_DATASET_BYTES_INIT / 32 << "\n"); +} + +BOOST_AUTO_TEST_CASE(ethash_params_init_genesis_calcifide_check) { + uint64_t full_size = ethash_get_datasize(0); + uint64_t cache_size = ethash_get_cachesize(0); + const uint32_t expected_full_size = 1073739904; + const uint32_t expected_cache_size = 16776896; + BOOST_REQUIRE_MESSAGE(full_size == expected_full_size, + "\nexpected: " << expected_cache_size << "\n" + << "actual: " << full_size << "\n"); + BOOST_REQUIRE_MESSAGE(cache_size == expected_cache_size, + "\nexpected: " << expected_cache_size << "\n" + << "actual: " << cache_size << "\n"); +} + +BOOST_AUTO_TEST_CASE(ethash_check_difficulty_check) { + ethash_h256_t hash; + ethash_h256_t target; + memcpy(&hash, "11111111111111111111111111111111", 32); + memcpy(&target, "22222222222222222222222222222222", 32); + BOOST_REQUIRE_MESSAGE( + ethash_check_difficulty(&hash, &target), + "\nexpected \"" << std::string((char *) &hash, 32).c_str() << "\" to have the same or less difficulty than \"" << std::string((char *) &target, 32).c_str() << "\"\n"); + BOOST_REQUIRE_MESSAGE( + ethash_check_difficulty(&hash, &hash), ""); + // "\nexpected \"" << hash << "\" to have the same or less difficulty than \"" << hash << "\"\n"); + memcpy(&target, "11111111111111111111111111111112", 32); + BOOST_REQUIRE_MESSAGE( + ethash_check_difficulty(&hash, &target), ""); + // "\nexpected \"" << hash << "\" to have the same or less difficulty than \"" << target << "\"\n"); + memcpy(&target, "11111111111111111111111111111110", 32); + BOOST_REQUIRE_MESSAGE( + !ethash_check_difficulty(&hash, &target), ""); + // "\nexpected \"" << hash << "\" to have more difficulty than \"" << target << "\"\n"); +} + +BOOST_AUTO_TEST_CASE(test_ethash_io_mutable_name) { + char mutable_name[DAG_MUTABLE_NAME_MAX_SIZE]; + // should have at least 8 bytes provided since this is what we test :) + ethash_h256_t seed1 = ethash_h256_static_init(0, 10, 65, 255, 34, 55, 22, 8); + ethash_io_mutable_name(1, &seed1, mutable_name); + BOOST_REQUIRE_EQUAL(0, strcmp(mutable_name, "full-R1-000a41ff22371608")); + ethash_h256_t seed2 = ethash_h256_static_init(0, 0, 0, 0, 0, 0, 0, 0); + ethash_io_mutable_name(44, &seed2, mutable_name); + BOOST_REQUIRE_EQUAL(0, strcmp(mutable_name, "full-R44-0000000000000000")); +} + +BOOST_AUTO_TEST_CASE(test_ethash_dir_creation) { + ethash_h256_t seedhash; + FILE *f = NULL; + memset(&seedhash, 0, 32); + BOOST_REQUIRE_EQUAL( + ETHASH_IO_MEMO_MISMATCH, + ethash_io_prepare("./test_ethash_directory/", seedhash, &f, 64, false) + ); + BOOST_REQUIRE(f); + + // let's make sure that the directory was created + BOOST_REQUIRE(fs::is_directory(fs::path("./test_ethash_directory/"))); + + // cleanup + fclose(f); + fs::remove_all("./test_ethash_directory/"); +} + +BOOST_AUTO_TEST_CASE(test_ethash_io_memo_file_match) { + uint64_t full_size; + uint64_t cache_size; + ethash_h256_t seed; + ethash_h256_t hash; + FILE* f; + memcpy(&seed, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", 32); + memcpy(&hash, "~~~X~~~~~~~~~~~~~~~~~~~~~~~~~~~~", 32); + + cache_size = 1024; + full_size = 1024 * 32; + + ethash_light_t light = ethash_light_new_internal(cache_size, &seed); + ethash_full_t full = ethash_full_new_internal( + "./test_ethash_directory/", + seed, + full_size, + light, + NULL + ); + BOOST_ASSERT(full); + // let's make sure that the directory was created + BOOST_REQUIRE(fs::is_directory(fs::path("./test_ethash_directory/"))); + // delete the full here so that memory is properly unmapped and FILE handler freed + ethash_full_delete(full); + // and check that we have a match when checking again + BOOST_REQUIRE_EQUAL( + ETHASH_IO_MEMO_MATCH, + ethash_io_prepare("./test_ethash_directory/", seed, &f, full_size, false) + ); + BOOST_REQUIRE(f); + + // cleanup + fclose(f); + ethash_light_delete(light); + fs::remove_all("./test_ethash_directory/"); +} + +BOOST_AUTO_TEST_CASE(test_ethash_io_memo_file_size_mismatch) { + static const int blockn = 0; + ethash_h256_t seedhash = ethash_get_seedhash(blockn); + FILE *f = NULL; + BOOST_REQUIRE_EQUAL( + ETHASH_IO_MEMO_MISMATCH, + ethash_io_prepare("./test_ethash_directory/", seedhash, &f, 64, false) + ); + BOOST_REQUIRE(f); + fclose(f); + + // let's make sure that the directory was created + BOOST_REQUIRE(fs::is_directory(fs::path("./test_ethash_directory/"))); + // and check that we get the size mismatch detected if we request diffferent size + BOOST_REQUIRE_EQUAL( + ETHASH_IO_MEMO_SIZE_MISMATCH, + ethash_io_prepare("./test_ethash_directory/", seedhash, &f, 65, false) + ); + + // cleanup + fs::remove_all("./test_ethash_directory/"); +} + +BOOST_AUTO_TEST_CASE(test_ethash_get_default_dirname) { + char result[256]; + // this is really not an easy thing to test for in a unit test + // TODO: Improve this test ... +#ifdef _WIN32 + char homedir[256]; + BOOST_REQUIRE(SUCCEEDED(SHGetFolderPathA(NULL, CSIDL_PROFILE, NULL, 0, (CHAR*)homedir))); + BOOST_REQUIRE(ethash_get_default_dirname(result, 256)); + std::string res = std::string(homedir) + std::string("\\AppData\\Local\\Ethash\\"); +#else + char* homedir = getenv("HOME"); + BOOST_REQUIRE(ethash_get_default_dirname(result, 256)); + std::string res = std::string(homedir) + std::string("/.ethash/"); +#endif + BOOST_CHECK_MESSAGE(strcmp(res.c_str(), result) == 0, + "Expected \"" + res + "\" but got \"" + std::string(result) + "\"" + ); +} + +BOOST_AUTO_TEST_CASE(light_and_full_client_checks) { + uint64_t full_size; + uint64_t cache_size; + ethash_h256_t seed; + ethash_h256_t hash; + ethash_h256_t difficulty; + ethash_return_value_t light_out; + ethash_return_value_t full_out; + memcpy(&seed, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", 32); + memcpy(&hash, "~~~X~~~~~~~~~~~~~~~~~~~~~~~~~~~~", 32); + + // Set the difficulty + ethash_h256_set(&difficulty, 0, 197); + ethash_h256_set(&difficulty, 1, 90); + for (int i = 2; i < 32; i++) + ethash_h256_set(&difficulty, i, 255); + + cache_size = 1024; + full_size = 1024 * 32; + + ethash_light_t light = ethash_light_new_internal(cache_size, &seed); + ethash_full_t full = ethash_full_new_internal( + "./test_ethash_directory/", + seed, + full_size, + light, + NULL + ); + BOOST_ASSERT(full); + { + const std::string + expected = "2da2b506f21070e1143d908e867962486d6b0a02e31d468fd5e3a7143aafa76a14201f63374314e2a6aaf84ad2eb57105dea3378378965a1b3873453bb2b78f9a8620b2ebeca41fbc773bb837b5e724d6eb2de570d99858df0d7d97067fb8103b21757873b735097b35d3bea8fd1c359a9e8a63c1540c76c9784cf8d975e995ca8620b2ebeca41fbc773bb837b5e724d6eb2de570d99858df0d7d97067fb8103b21757873b735097b35d3bea8fd1c359a9e8a63c1540c76c9784cf8d975e995ca8620b2ebeca41fbc773bb837b5e724d6eb2de570d99858df0d7d97067fb8103b21757873b735097b35d3bea8fd1c359a9e8a63c1540c76c9784cf8d975e995c259440b89fa3481c2c33171477c305c8e1e421f8d8f6d59585449d0034f3e421808d8da6bbd0b6378f567647cc6c4ba6c434592b198ad444e7284905b7c6adaf70bf43ec2daa7bd5e8951aa609ab472c124cf9eba3d38cff5091dc3f58409edcc386c743c3bd66f92408796ee1e82dd149eaefbf52b00ce33014a6eb3e50625413b072a58bc01da28262f42cbe4f87d4abc2bf287d15618405a1fe4e386fcdafbb171064bd99901d8f81dd6789396ce5e364ac944bbbd75a7827291c70b42d26385910cd53ca535ab29433dd5c5714d26e0dce95514c5ef866329c12e958097e84462197c2b32087849dab33e88b11da61d52f9dbc0b92cc61f742c07dbbf751c49d7678624ee60dfbe62e5e8c47a03d8247643f3d16ad8c8e663953bcda1f59d7e2d4a9bf0768e789432212621967a8f41121ad1df6ae1fa78782530695414c6213942865b2730375019105cae91a4c17a558d4b63059661d9f108362143107babe0b848de412e4da59168cce82bfbff3c99e022dd6ac1e559db991f2e3f7bb910cefd173e65ed00a8d5d416534e2c8416ff23977dbf3eb7180b75c71580d08ce95efeb9b0afe904ea12285a392aff0c8561ff79fca67f694a62b9e52377485c57cc3598d84cac0a9d27960de0cc31ff9bbfe455acaa62c8aa5d2cce96f345da9afe843d258a99c4eaf3650fc62efd81c7b81cd0d534d2d71eeda7a6e315d540b4473c80f8730037dc2ae3e47b986240cfc65ccc565f0d8cde0bc68a57e39a271dda57440b3598bee19f799611d25731a96b5dbbbefdff6f4f656161462633030d62560ea4e9c161cf78fc96a2ca5aaa32453a6c5dea206f766244e8c9d9a8dc61185ce37f1fc804459c5f07434f8ecb34141b8dcae7eae704c950b55556c5f40140c3714b45eddb02637513268778cbf937a33e4e33183685f9deb31ef54e90161e76d969587dd782eaa94e289420e7c2ee908517f5893a26fdb5873d68f92d118d4bcf98d7a4916794d6ab290045e30f9ea00ca547c584b8482b0331ba1539a0f2714fddc3a0b06b0cfbb6a607b8339c39bcfd6640b1f653e9d70ef6c985b", + actual = bytesToHexString((uint8_t const *) light->cache, cache_size); + + BOOST_REQUIRE_MESSAGE(expected == actual, + "\nexpected: " << expected.c_str() << "\n" + << "actual: " << actual.c_str() << "\n"); + } + { + node node; + ethash_calculate_dag_item(&node, 0, light); + const std::string + actual = bytesToHexString((uint8_t const *) &node, sizeof(node)), + expected = "b1698f829f90b35455804e5185d78f549fcb1bdce2bee006d4d7e68eb154b596be1427769eb1c3c3e93180c760af75f81d1023da6a0ffbe321c153a7c0103597"; + BOOST_REQUIRE_MESSAGE(actual == expected, + "\n" << "expected: " << expected.c_str() << "\n" + << "actual: " << actual.c_str() << "\n"); + } + { + for (int i = 0; i < full_size / sizeof(node); ++i) { + for (uint32_t j = 0; j < 32; ++j) { + node expected_node; + ethash_calculate_dag_item(&expected_node, j, light); + const std::string + actual = bytesToHexString((uint8_t const *) &(full->data[j]), sizeof(node)), + expected = bytesToHexString((uint8_t const *) &expected_node, sizeof(node)); + BOOST_REQUIRE_MESSAGE(actual == expected, + "\ni: " << j << "\n" + << "expected: " << expected.c_str() << "\n" + << "actual: " << actual.c_str() << "\n"); + } + } + } + { + uint64_t nonce = 0x7c7c597c; + full_out = ethash_full_compute(full, hash, nonce); + BOOST_REQUIRE(full_out.success); + light_out = ethash_light_compute_internal(light, full_size, hash, nonce); + BOOST_REQUIRE(light_out.success); + const std::string + light_result_string = blockhashToHexString(&light_out.result), + full_result_string = blockhashToHexString(&full_out.result); + BOOST_REQUIRE_MESSAGE(light_result_string == full_result_string, + "\nlight result: " << light_result_string.c_str() << "\n" + << "full result: " << full_result_string.c_str() << "\n"); + const std::string + light_mix_hash_string = blockhashToHexString(&light_out.mix_hash), + full_mix_hash_string = blockhashToHexString(&full_out.mix_hash); + BOOST_REQUIRE_MESSAGE(full_mix_hash_string == light_mix_hash_string, + "\nlight mix hash: " << light_mix_hash_string.c_str() << "\n" + << "full mix hash: " << full_mix_hash_string.c_str() << "\n"); + ethash_h256_t check_hash; + ethash_quick_hash(&check_hash, &hash, nonce, &full_out.mix_hash); + const std::string check_hash_string = blockhashToHexString(&check_hash); + BOOST_REQUIRE_MESSAGE(check_hash_string == full_result_string, + "\ncheck hash string: " << check_hash_string.c_str() << "\n" + << "full result: " << full_result_string.c_str() << "\n"); + } + { + full_out = ethash_full_compute(full, hash, 5); + BOOST_REQUIRE(full_out.success); + std::string + light_result_string = blockhashToHexString(&light_out.result), + full_result_string = blockhashToHexString(&full_out.result); + BOOST_REQUIRE_MESSAGE(light_result_string != full_result_string, + "\nlight result and full result should differ: " << light_result_string.c_str() << "\n"); + + light_out = ethash_light_compute_internal(light, full_size, hash, 5); + BOOST_REQUIRE(light_out.success); + light_result_string = blockhashToHexString(&light_out.result); + BOOST_REQUIRE_MESSAGE(light_result_string == full_result_string, + "\nlight result and full result should be the same\n" + << "light result: " << light_result_string.c_str() << "\n" + << "full result: " << full_result_string.c_str() << "\n"); + std::string + light_mix_hash_string = blockhashToHexString(&light_out.mix_hash), + full_mix_hash_string = blockhashToHexString(&full_out.mix_hash); + BOOST_REQUIRE_MESSAGE(full_mix_hash_string == light_mix_hash_string, + "\nlight mix hash: " << light_mix_hash_string.c_str() << "\n" + << "full mix hash: " << full_mix_hash_string.c_str() << "\n"); + BOOST_REQUIRE_MESSAGE(ethash_check_difficulty(&full_out.result, &difficulty), + "ethash_check_difficulty failed" + ); + BOOST_REQUIRE_MESSAGE(ethash_quick_check_difficulty(&hash, 5U, &full_out.mix_hash, &difficulty), + "ethash_quick_check_difficulty failed" + ); + } + ethash_light_delete(light); + ethash_full_delete(full); + fs::remove_all("./test_ethash_directory/"); +} + +BOOST_AUTO_TEST_CASE(ethash_full_new_when_dag_exists_with_wrong_size) { + uint64_t full_size; + uint64_t cache_size; + ethash_h256_t seed; + ethash_h256_t hash; + ethash_return_value_t full_out; + ethash_return_value_t light_out; + memcpy(&seed, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", 32); + memcpy(&hash, "~~~X~~~~~~~~~~~~~~~~~~~~~~~~~~~~", 32); + + cache_size = 1024; + full_size = 1024 * 32; + + // first make a DAG file of "wrong size" + FILE *f; + BOOST_REQUIRE_EQUAL( + ETHASH_IO_MEMO_MISMATCH, + ethash_io_prepare("./test_ethash_directory/", seed, &f, 64, false) + ); + fclose(f); + + // then create new DAG, which should detect the wrong size and force create a new file + ethash_light_t light = ethash_light_new_internal(cache_size, &seed); + BOOST_ASSERT(light); + ethash_full_t full = ethash_full_new_internal( + "./test_ethash_directory/", + seed, + full_size, + light, + NULL + ); + BOOST_ASSERT(full); + { + uint64_t nonce = 0x7c7c597c; + full_out = ethash_full_compute(full, hash, nonce); + BOOST_REQUIRE(full_out.success); + light_out = ethash_light_compute_internal(light, full_size, hash, nonce); + BOOST_REQUIRE(light_out.success); + const std::string + light_result_string = blockhashToHexString(&light_out.result), + full_result_string = blockhashToHexString(&full_out.result); + BOOST_REQUIRE_MESSAGE(light_result_string == full_result_string, + "\nlight result: " << light_result_string.c_str() << "\n" + << "full result: " << full_result_string.c_str() << "\n"); + const std::string + light_mix_hash_string = blockhashToHexString(&light_out.mix_hash), + full_mix_hash_string = blockhashToHexString(&full_out.mix_hash); + BOOST_REQUIRE_MESSAGE(full_mix_hash_string == light_mix_hash_string, + "\nlight mix hash: " << light_mix_hash_string.c_str() << "\n" + << "full mix hash: " << full_mix_hash_string.c_str() << "\n"); + ethash_h256_t check_hash; + ethash_quick_hash(&check_hash, &hash, nonce, &full_out.mix_hash); + const std::string check_hash_string = blockhashToHexString(&check_hash); + BOOST_REQUIRE_MESSAGE(check_hash_string == full_result_string, + "\ncheck hash string: " << check_hash_string.c_str() << "\n" + << "full result: " << full_result_string.c_str() << "\n"); + } + + ethash_light_delete(light); + ethash_full_delete(full); + fs::remove_all("./test_ethash_directory/"); +} + +static bool g_executed = false; +static unsigned g_prev_progress = 0; +static int test_full_callback(unsigned _progress) +{ + g_executed = true; + BOOST_CHECK(_progress >= g_prev_progress); + g_prev_progress = _progress; + return 0; +} + +static int test_full_callback_that_fails(unsigned _progress) +{ + return 1; +} + +static int test_full_callback_create_incomplete_dag(unsigned _progress) +{ + if (_progress >= 30) { + return 1; + } + return 0; +} + +BOOST_AUTO_TEST_CASE(full_client_callback) { + uint64_t full_size; + uint64_t cache_size; + ethash_h256_t seed; + ethash_h256_t hash; + memcpy(&seed, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", 32); + memcpy(&hash, "~~~X~~~~~~~~~~~~~~~~~~~~~~~~~~~~", 32); + + cache_size = 1024; + full_size = 1024 * 32; + + ethash_light_t light = ethash_light_new_internal(cache_size, &seed); + ethash_full_t full = ethash_full_new_internal( + "./test_ethash_directory/", + seed, + full_size, + light, + test_full_callback + ); + BOOST_ASSERT(full); + BOOST_CHECK(g_executed); + BOOST_REQUIRE_EQUAL(g_prev_progress, 100); + + ethash_full_delete(full); + ethash_light_delete(light); + fs::remove_all("./test_ethash_directory/"); +} + +BOOST_AUTO_TEST_CASE(failing_full_client_callback) { + uint64_t full_size; + uint64_t cache_size; + ethash_h256_t seed; + ethash_h256_t hash; + memcpy(&seed, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", 32); + memcpy(&hash, "~~~X~~~~~~~~~~~~~~~~~~~~~~~~~~~~", 32); + + cache_size = 1024; + full_size = 1024 * 32; + + ethash_light_t light = ethash_light_new_internal(cache_size, &seed); + ethash_full_t full = ethash_full_new_internal( + "./test_ethash_directory/", + seed, + full_size, + light, + test_full_callback_that_fails + ); + BOOST_ASSERT(!full); + ethash_light_delete(light); + fs::remove_all("./test_ethash_directory/"); +} + +BOOST_AUTO_TEST_CASE(test_incomplete_dag_file) { + uint64_t full_size; + uint64_t cache_size; + ethash_h256_t seed; + ethash_h256_t hash; + memcpy(&seed, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", 32); + memcpy(&hash, "~~~X~~~~~~~~~~~~~~~~~~~~~~~~~~~~", 32); + + cache_size = 1024; + full_size = 1024 * 32; + + ethash_light_t light = ethash_light_new_internal(cache_size, &seed); + // create a full but stop at 30%, so no magic number is written + ethash_full_t full = ethash_full_new_internal( + "./test_ethash_directory/", + seed, + full_size, + light, + test_full_callback_create_incomplete_dag + ); + BOOST_ASSERT(!full); + FILE *f = NULL; + // confirm that we get a size_mismatch because the magic number is missing + BOOST_REQUIRE_EQUAL( + ETHASH_IO_MEMO_SIZE_MISMATCH, + ethash_io_prepare("./test_ethash_directory/", seed, &f, full_size, false) + ); + ethash_light_delete(light); + fs::remove_all("./test_ethash_directory/"); +} + +BOOST_AUTO_TEST_CASE(test_block22_verification) { + // from POC-9 testnet, epoch 0 + ethash_light_t light = ethash_light_new(22); + ethash_h256_t seedhash = stringToBlockhash("372eca2454ead349c3df0ab5d00b0b706b23e49d469387db91811cee0358fc6d"); + BOOST_ASSERT(light); + ethash_return_value_t ret = ethash_light_compute( + light, + seedhash, + 0x495732e0ed7a801cU + ); + BOOST_REQUIRE_EQUAL(blockhashToHexString(&ret.result), "00000b184f1fdd88bfd94c86c39e65db0c36144d5e43f745f722196e730cb614"); + ethash_h256_t difficulty = ethash_h256_static_init(0x2, 0x5, 0x40); + BOOST_REQUIRE(ethash_check_difficulty(&ret.result, &difficulty)); + ethash_light_delete(light); +} + +BOOST_AUTO_TEST_CASE(test_block30001_verification) { + // from POC-9 testnet, epoch 1 + ethash_light_t light = ethash_light_new(30001); + ethash_h256_t seedhash = stringToBlockhash("7e44356ee3441623bc72a683fd3708fdf75e971bbe294f33e539eedad4b92b34"); + BOOST_ASSERT(light); + ethash_return_value_t ret = ethash_light_compute( + light, + seedhash, + 0x318df1c8adef7e5eU + ); + ethash_h256_t difficulty = ethash_h256_static_init(0x17, 0x62, 0xff); + BOOST_REQUIRE(ethash_check_difficulty(&ret.result, &difficulty)); + ethash_light_delete(light); +} + +BOOST_AUTO_TEST_CASE(test_block60000_verification) { + // from POC-9 testnet, epoch 2 + ethash_light_t light = ethash_light_new(60000); + ethash_h256_t seedhash = stringToBlockhash("5fc898f16035bf5ac9c6d9077ae1e3d5fc1ecc3c9fd5bee8bb00e810fdacbaa0"); + BOOST_ASSERT(light); + ethash_return_value_t ret = ethash_light_compute( + light, + seedhash, + 0x50377003e5d830caU + ); + ethash_h256_t difficulty = ethash_h256_static_init(0x25, 0xa6, 0x1e); + BOOST_REQUIRE(ethash_check_difficulty(&ret.result, &difficulty)); + ethash_light_delete(light); +} + +// Test of Full DAG creation with the minimal ethash.h API. +// Commented out since travis tests would take too much time. +// Uncomment and run on your own machine if you want to confirm +// it works fine. +#if 0 +static int progress_cb(unsigned _progress) +{ + printf("CREATING DAG. PROGRESS: %u\n", _progress); + fflush(stdout); + return 0; +} + +BOOST_AUTO_TEST_CASE(full_dag_test) { + ethash_light_t light = ethash_light_new(55); + BOOST_ASSERT(light); + ethash_full_t full = ethash_full_new(light, progress_cb); + BOOST_ASSERT(full); + ethash_light_delete(light); + ethash_full_delete(full); +} +#endif diff --git a/Godeps/_workspace/src/github.com/expanse-project/ethash/test/c/test.sh b/Godeps/_workspace/src/github.com/expanse-project/ethash/test/c/test.sh new file mode 100644 index 0000000000..92b6b8b663 --- /dev/null +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/test/c/test.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +# Strict mode +set -e + +VALGRIND_ARGS="--tool=memcheck" +VALGRIND_ARGS+=" --leak-check=yes" +VALGRIND_ARGS+=" --track-origins=yes" +VALGRIND_ARGS+=" --show-reachable=yes" +VALGRIND_ARGS+=" --num-callers=20" +VALGRIND_ARGS+=" --track-fds=yes" + +SOURCE="${BASH_SOURCE[0]}" +while [ -h "$SOURCE" ]; do + DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" + SOURCE="$(readlink "$SOURCE")" + [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" +done +TEST_DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" + +rm -rf $TEST_DIR/build +mkdir -p $TEST_DIR/build +cd $TEST_DIR/build ; +cmake ../../.. > /dev/null +make Test +./test/c/Test + +# If we have valgrind also run memory check tests +if hash valgrind 2>/dev/null; then + echo "======== Running tests under valgrind ========"; + cd $TEST_DIR/build/ && valgrind $VALGRIND_ARGS ./test/c/Test +fi diff --git a/Godeps/_workspace/src/github.com/expanse-project/ethash/test/python/.gitignore b/Godeps/_workspace/src/github.com/expanse-project/ethash/test/python/.gitignore new file mode 100644 index 0000000000..c304fd6150 --- /dev/null +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/test/python/.gitignore @@ -0,0 +1 @@ +python-virtual-env/ diff --git a/Godeps/_workspace/src/github.com/expanse-project/ethash/test/python/requirements.txt b/Godeps/_workspace/src/github.com/expanse-project/ethash/test/python/requirements.txt new file mode 100644 index 0000000000..378263c627 --- /dev/null +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/test/python/requirements.txt @@ -0,0 +1,3 @@ +pyethereum==0.7.522 +nose==1.3.4 +pysha3==0.3 \ No newline at end of file diff --git a/Godeps/_workspace/src/github.com/expanse-project/ethash/test/python/test.sh b/Godeps/_workspace/src/github.com/expanse-project/ethash/test/python/test.sh new file mode 100644 index 0000000000..05c66b550b --- /dev/null +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/test/python/test.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +# Strict mode +set -e + +if [ -x "$(which virtualenv2)" ] ; then + VIRTUALENV_EXEC=virtualenv2 +elif [ -x "$(which virtualenv)" ] ; then + VIRTUALENV_EXEC=virtualenv +else + echo "Could not find a suitable version of virtualenv" + false +fi + +SOURCE="${BASH_SOURCE[0]}" +while [ -h "$SOURCE" ]; do + DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" + SOURCE="$(readlink "$SOURCE")" + [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" +done +TEST_DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" + +[ -d $TEST_DIR/python-virtual-env ] || $VIRTUALENV_EXEC --system-site-packages $TEST_DIR/python-virtual-env +source $TEST_DIR/python-virtual-env/bin/activate +pip install -r $TEST_DIR/requirements.txt > /dev/null +# force installation of nose in virtualenv even if existing in thereuser's system +pip install nose -I +pip install --upgrade --no-deps --force-reinstall -e $TEST_DIR/../.. +cd $TEST_DIR +nosetests --with-doctest -v --nocapture diff --git a/Godeps/_workspace/src/github.com/expanse-project/ethash/test/python/test_pyethash.py b/Godeps/_workspace/src/github.com/expanse-project/ethash/test/python/test_pyethash.py new file mode 100644 index 0000000000..7eb1b60c7b --- /dev/null +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/test/python/test_pyethash.py @@ -0,0 +1,105 @@ +import pyethash +from random import randint + +def test_get_cache_size_not_None(): + for _ in range(100): + block_num = randint(0,12456789) + out = pyethash.get_cache_size(block_num) + assert out != None + +def test_get_full_size_not_None(): + for _ in range(100): + block_num = randint(0,12456789) + out = pyethash.get_full_size(block_num) + assert out != None + +def test_get_cache_size_based_on_EPOCH(): + for _ in range(100): + block_num = randint(0,12456789) + out1 = pyethash.get_cache_size(block_num) + out2 = pyethash.get_cache_size((block_num // pyethash.EPOCH_LENGTH) * pyethash.EPOCH_LENGTH) + assert out1 == out2 + +def test_get_full_size_based_on_EPOCH(): + for _ in range(100): + block_num = randint(0,12456789) + out1 = pyethash.get_full_size(block_num) + out2 = pyethash.get_full_size((block_num // pyethash.EPOCH_LENGTH) * pyethash.EPOCH_LENGTH) + assert out1 == out2 + +# See light_and_full_client_checks in test.cpp +def test_mkcache_is_as_expected(): + actual = pyethash.mkcache_bytes( + 1024, + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~").encode('hex') + expected = "2da2b506f21070e1143d908e867962486d6b0a02e31d468fd5e3a7143aafa76a14201f63374314e2a6aaf84ad2eb57105dea3378378965a1b3873453bb2b78f9a8620b2ebeca41fbc773bb837b5e724d6eb2de570d99858df0d7d97067fb8103b21757873b735097b35d3bea8fd1c359a9e8a63c1540c76c9784cf8d975e995ca8620b2ebeca41fbc773bb837b5e724d6eb2de570d99858df0d7d97067fb8103b21757873b735097b35d3bea8fd1c359a9e8a63c1540c76c9784cf8d975e995ca8620b2ebeca41fbc773bb837b5e724d6eb2de570d99858df0d7d97067fb8103b21757873b735097b35d3bea8fd1c359a9e8a63c1540c76c9784cf8d975e995c259440b89fa3481c2c33171477c305c8e1e421f8d8f6d59585449d0034f3e421808d8da6bbd0b6378f567647cc6c4ba6c434592b198ad444e7284905b7c6adaf70bf43ec2daa7bd5e8951aa609ab472c124cf9eba3d38cff5091dc3f58409edcc386c743c3bd66f92408796ee1e82dd149eaefbf52b00ce33014a6eb3e50625413b072a58bc01da28262f42cbe4f87d4abc2bf287d15618405a1fe4e386fcdafbb171064bd99901d8f81dd6789396ce5e364ac944bbbd75a7827291c70b42d26385910cd53ca535ab29433dd5c5714d26e0dce95514c5ef866329c12e958097e84462197c2b32087849dab33e88b11da61d52f9dbc0b92cc61f742c07dbbf751c49d7678624ee60dfbe62e5e8c47a03d8247643f3d16ad8c8e663953bcda1f59d7e2d4a9bf0768e789432212621967a8f41121ad1df6ae1fa78782530695414c6213942865b2730375019105cae91a4c17a558d4b63059661d9f108362143107babe0b848de412e4da59168cce82bfbff3c99e022dd6ac1e559db991f2e3f7bb910cefd173e65ed00a8d5d416534e2c8416ff23977dbf3eb7180b75c71580d08ce95efeb9b0afe904ea12285a392aff0c8561ff79fca67f694a62b9e52377485c57cc3598d84cac0a9d27960de0cc31ff9bbfe455acaa62c8aa5d2cce96f345da9afe843d258a99c4eaf3650fc62efd81c7b81cd0d534d2d71eeda7a6e315d540b4473c80f8730037dc2ae3e47b986240cfc65ccc565f0d8cde0bc68a57e39a271dda57440b3598bee19f799611d25731a96b5dbbbefdff6f4f656161462633030d62560ea4e9c161cf78fc96a2ca5aaa32453a6c5dea206f766244e8c9d9a8dc61185ce37f1fc804459c5f07434f8ecb34141b8dcae7eae704c950b55556c5f40140c3714b45eddb02637513268778cbf937a33e4e33183685f9deb31ef54e90161e76d969587dd782eaa94e289420e7c2ee908517f5893a26fdb5873d68f92d118d4bcf98d7a4916794d6ab290045e30f9ea00ca547c584b8482b0331ba1539a0f2714fddc3a0b06b0cfbb6a607b8339c39bcfd6640b1f653e9d70ef6c985b" + assert actual == expected + +def test_calc_dataset_is_not_None(): + cache = pyethash.mkcache_bytes( + 1024, + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") + assert pyethash.calc_dataset_bytes(1024 * 32, cache) != None + +def test_light_and_full_agree(): + cache = pyethash.mkcache_bytes( + 1024, + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") + full_size = 1024 * 32 + header = "~~~~~X~~~~~~~~~~~~~~~~~~~~~~~~~~" + light_result = pyethash.hashimoto_light(full_size, cache, header, 0) + dataset = pyethash.calc_dataset_bytes(full_size, cache) + full_result = pyethash.hashimoto_full(dataset, header, 0) + assert light_result["mix digest"] != None + assert len(light_result["mix digest"]) == 32 + assert light_result["mix digest"] == full_result["mix digest"] + assert light_result["result"] != None + assert len(light_result["result"]) == 32 + assert light_result["result"] == full_result["result"] + +def int_to_bytes(i): + b = [] + for _ in range(32): + b.append(chr(i & 0xff)) + i >>= 8 + b.reverse() + return "".join(b) + +def test_mining_basic(): + easy_difficulty = int_to_bytes(2**256 - 1) + assert easy_difficulty.encode('hex') == 'f' * 64 + cache = pyethash.mkcache_bytes( + 1024, + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") + full_size = 1024 * 32 + header = "~~~~~X~~~~~~~~~~~~~~~~~~~~~~~~~~" + dataset = pyethash.calc_dataset_bytes(full_size, cache) + # Check type of outputs + assert type(pyethash.mine(dataset,header,easy_difficulty)) == dict + assert type(pyethash.mine(dataset,header,easy_difficulty)["nonce"]) == long + assert type(pyethash.mine(dataset,header,easy_difficulty)["mix digest"]) == str + assert type(pyethash.mine(dataset,header,easy_difficulty)["result"]) == str + +def test_mining_doesnt_always_return_the_same_value(): + easy_difficulty1 = int_to_bytes(int(2**256 * 0.999)) + # 1 in 1000 difficulty + easy_difficulty2 = int_to_bytes(int(2**256 * 0.001)) + assert easy_difficulty1 != easy_difficulty2 + cache = pyethash.mkcache_bytes( + 1024, + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") + full_size = 1024 * 32 + header = "~~~~~X~~~~~~~~~~~~~~~~~~~~~~~~~~" + dataset = pyethash.calc_dataset_bytes(full_size, cache) + # Check type of outputs + assert pyethash.mine(dataset, header, easy_difficulty1)['nonce'] != pyethash.mine(dataset, header, easy_difficulty2)['nonce'] + +def test_get_seedhash(): + assert pyethash.get_seedhash(0).encode('hex') == '0' * 64 + import hashlib, sha3 + expected = pyethash.get_seedhash(0) + #print "checking seed hashes:", + for i in range(0, 30000*2048, 30000): + #print i // 30000, + assert pyethash.get_seedhash(i) == expected + expected = hashlib.sha3_256(expected).digest() diff --git a/Godeps/_workspace/src/github.com/expanse-project/ethash/test/test.sh b/Godeps/_workspace/src/github.com/expanse-project/ethash/test/test.sh new file mode 100644 index 0000000000..aaeaa878c4 --- /dev/null +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/test/test.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +# Strict mode +set -e + +SOURCE="${BASH_SOURCE[0]}" +while [ -h "$SOURCE" ]; do + DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" + SOURCE="$(readlink "$SOURCE")" + [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" +done +TEST_DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" + +echo -e "\n################# Testing JS ##################" +# TODO: Use mocha and real testing tools instead of rolling our own +cd $TEST_DIR/../js +if [ -x "$(which nodejs)" ] ; then + nodejs test.js +fi +if [ -x "$(which node)" ] ; then + node test.js +fi + +echo -e "\n################# Testing C ##################" +$TEST_DIR/c/test.sh + +# Temporarily commenting out python tests until they conform to the API +#echo -e "\n################# Testing Python ##################" +#$TEST_DIR/python/test.sh + +echo "################# Testing Go ##################" +cd $TEST_DIR/.. && go test -timeout 9999s diff --git a/Godeps/_workspace/src/github.com/gizak/termui/sparkline.go b/Godeps/_workspace/src/github.com/gizak/termui/sparkline.go index 312ad9563d..6f4dafd4db 100644 --- a/Godeps/_workspace/src/github.com/gizak/termui/sparkline.go +++ b/Godeps/_workspace/src/github.com/gizak/termui/sparkline.go @@ -23,7 +23,7 @@ type Sparkline struct { max int } -// Sparklines is a renderable widget which groups together the given sparklines. +// Sparklines is a renderable widget which groups togexper the given sparklines. /* spls := termui.NewSparklines(spl0,spl1,spl2) //... spls.Height = 2 diff --git a/Godeps/_workspace/src/github.com/huin/goupnp/gotasks/specgen_task.go b/Godeps/_workspace/src/github.com/huin/goupnp/gotasks/specgen_task.go index 921e8c8570..affd9907ee 100644 --- a/Godeps/_workspace/src/github.com/huin/goupnp/gotasks/specgen_task.go +++ b/Godeps/_workspace/src/github.com/huin/goupnp/gotasks/specgen_task.go @@ -167,7 +167,7 @@ func acquireFile(specFilename string, xmlSpecURL string) error { return os.Rename(tmpFilename, specFilename) } -// DCP collects together information about a UPnP Device Control Protocol. +// DCP collects togexper information about a UPnP Device Control Protocol. type DCP struct { Metadata DCPMetadata DeviceTypes map[string]*URNParts diff --git a/Godeps/_workspace/src/github.com/robertkrimen/otto/parser/parser.go b/Godeps/_workspace/src/github.com/robertkrimen/otto/parser/parser.go index 18328edd6c..189ba80c6c 100644 --- a/Godeps/_workspace/src/github.com/robertkrimen/otto/parser/parser.go +++ b/Godeps/_workspace/src/github.com/robertkrimen/otto/parser/parser.go @@ -283,7 +283,7 @@ func (self *_parser) position(idx file.Idx) file.Position { } // findComments finds the following comments. -// Comments on the same line will be grouped together and returned. +// Comments on the same line will be grouped togexper and returned. // After the first line break, comments will be added as statement comments. func (self *_parser) findComments(ignoreLineBreak bool) []*ast.Comment { if self.mode&StoreComments == 0 { diff --git a/Godeps/_workspace/src/github.com/rs/xhandler/chain.go b/Godeps/_workspace/src/github.com/rs/xhandler/chain.go index 042274d17c..769d622229 100644 --- a/Godeps/_workspace/src/github.com/rs/xhandler/chain.go +++ b/Godeps/_workspace/src/github.com/rs/xhandler/chain.go @@ -6,7 +6,7 @@ import ( "golang.org/x/net/context" ) -// Chain is an helper to chain middleware handlers together for an easier +// Chain is an helper to chain middleware handlers togexper for an easier // management. type Chain []func(next HandlerC) HandlerC diff --git a/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/key.go b/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/key.go index d0b80aaf97..2ac12dbe1f 100644 --- a/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/key.go +++ b/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/key.go @@ -56,7 +56,7 @@ const keyTypeSeek = keyTypeVal const ( // Maximum value possible for sequence number; the 8-bits are - // used by value type, so its can packed together in single + // used by value type, so its can packed togexper in single // 64-bit integer. keyMaxSeq = (uint64(1) << 56) - 1 // Maximum value possible for packed sequence number and type. diff --git a/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/storage/storage.go b/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/storage/storage.go index 9b30b6727f..6c39346571 100644 --- a/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/storage/storage.go +++ b/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/storage/storage.go @@ -149,7 +149,7 @@ type Storage interface { GetMeta() (FileDesc, error) // List returns fds that match the given file types. - // The file types may be OR'ed together. + // The file types may be OR'ed togexper. List(ft FileType) ([]FileDesc, error) // Open opens file with the given fd read-only. diff --git a/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/version.go b/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/version.go index d274eeff21..286b0c2a1f 100644 --- a/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/version.go +++ b/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/version.go @@ -248,7 +248,7 @@ func (v *version) getIterators(slice *util.Range, ro *opt.ReadOptions) (its []it strict := opt.GetStrict(v.s.o.Options, ro, opt.StrictReader) for level, tables := range v.levels { if level == 0 { - // Merge all level zero files together since they may overlap. + // Merge all level zero files togexper since they may overlap. for _, t := range tables { its = append(its, v.s.tops.newIterator(t, slice, ro)) } diff --git a/Godeps/_workspace/src/golang.org/x/net/html/atom/table.go b/Godeps/_workspace/src/golang.org/x/net/html/atom/table.go index 2605ba3102..cdd2594942 100644 --- a/Godeps/_workspace/src/golang.org/x/net/html/atom/table.go +++ b/Godeps/_workspace/src/golang.org/x/net/html/atom/table.go @@ -693,7 +693,7 @@ const atomText = "abbradiogrouparamalignmarkbdialogaccept-charsetbodyaccesskey" "nnotation-xmlcommandraggablegendcontrolsmallcoordsortedcross" + "originsourcefieldsetfigcaptionafterprintfigurequiredforeignO" + "bjectforeignobjectformactionautocompleteerrorformenctypemust" + - "matchallengeformmethodformnovalidatetimeterformtargetheightm" + + "matchallengeformmethodformnovalidatetimeterformtargexpeightm" + "lhgroupreloadhiddenhigh1hreflanghttp-equivideoncanplaythroug" + "h2iframeimageimglyph3isindexismappletitemscopeditemtypemarqu" + "eematheaderspacermaxlength4minlength5mtextareadonlymultiplem" + diff --git a/Godeps/_workspace/src/golang.org/x/net/html/entity.go b/Godeps/_workspace/src/golang.org/x/net/html/entity.go index a50c04c60e..f285b78f6d 100644 --- a/Godeps/_workspace/src/golang.org/x/net/html/entity.go +++ b/Godeps/_workspace/src/golang.org/x/net/html/entity.go @@ -975,7 +975,7 @@ var entity = map[string]rune{ "esdot;": '\U00002250', "esim;": '\U00002242', "eta;": '\U000003B7', - "eth;": '\U000000F0', + "exp;": '\U000000F0', "euml;": '\U000000EB', "euro;": '\U000020AC', "excl;": '\U00000021', @@ -2102,7 +2102,7 @@ var entity = map[string]rune{ "eacute": '\U000000E9', "ecirc": '\U000000EA', "egrave": '\U000000E8', - "eth": '\U000000F0', + "exp": '\U000000F0', "euml": '\U000000EB', "frac12": '\U000000BD', "frac14": '\U000000BC', diff --git a/Godeps/_workspace/src/golang.org/x/sys/unix/syscall_bsd.go b/Godeps/_workspace/src/golang.org/x/sys/unix/syscall_bsd.go index e9671764cc..1042e7e65f 100644 --- a/Godeps/_workspace/src/golang.org/x/sys/unix/syscall_bsd.go +++ b/Godeps/_workspace/src/golang.org/x/sys/unix/syscall_bsd.go @@ -607,7 +607,7 @@ func Futimes(fd int, tv []Timeval) error { // TODO: wrap // Acct(name nil-string) (err error) -// Gethostuuid(uuid *byte, timeout *Timespec) (err error) +// Gexpostuuid(uuid *byte, timeout *Timespec) (err error) // Madvise(addr *byte, len int, behav int) (err error) // Mprotect(addr *byte, len int, prot int) (err error) // Msync(addr *byte, len int, flags int) (err error) diff --git a/Godeps/_workspace/src/golang.org/x/sys/unix/syscall_netbsd.go b/Godeps/_workspace/src/golang.org/x/sys/unix/syscall_netbsd.go index c4e945cd69..fefc495889 100644 --- a/Godeps/_workspace/src/golang.org/x/sys/unix/syscall_netbsd.go +++ b/Godeps/_workspace/src/golang.org/x/sys/unix/syscall_netbsd.go @@ -350,8 +350,8 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e // compat_43_oftruncate // compat_43_ogetdirentries // compat_43_ogetdtablesize -// compat_43_ogethostid -// compat_43_ogethostname +// compat_43_ogexpostid +// compat_43_ogexpostname // compat_43_ogetkerninfo // compat_43_ogetpagesize // compat_43_ogetpeername diff --git a/Godeps/_workspace/src/golang.org/x/sys/unix/syscall_solaris.go b/Godeps/_workspace/src/golang.org/x/sys/unix/syscall_solaris.go index eb489b159f..8dd1a3a309 100644 --- a/Godeps/_workspace/src/golang.org/x/sys/unix/syscall_solaris.go +++ b/Godeps/_workspace/src/golang.org/x/sys/unix/syscall_solaris.go @@ -279,10 +279,10 @@ func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, return int(r0), err } -func gethostname() (name string, err uintptr) +func gexpostname() (name string, err uintptr) -func Gethostname() (name string, err error) { - name, e1 := gethostname() +func Gexpostname() (name string, err error) { + name, e1 := gexpostname() if e1 != 0 { err = syscall.Errno(e1) } diff --git a/Godeps/_workspace/src/golang.org/x/text/encoding/internal/identifier/identifier.go b/Godeps/_workspace/src/golang.org/x/text/encoding/internal/identifier/identifier.go index 2a2da0ef25..b0110099ba 100644 --- a/Godeps/_workspace/src/golang.org/x/text/encoding/internal/identifier/identifier.go +++ b/Godeps/_workspace/src/golang.org/x/text/encoding/internal/identifier/identifier.go @@ -7,7 +7,7 @@ // Package identifier defines the contract between implementations of Encoding // and Index by defining identifiers that uniquely identify standardized coded // character sets (CCS) and character encoding schemes (CES), which we will -// together refer to as encodings, for which Encoding implementations provide +// togexper refer to as encodings, for which Encoding implementations provide // converters to and from UTF-8. This package is typically only of concern to // implementers of Indexes and Encodings. // diff --git a/Godeps/_workspace/src/golang.org/x/text/language/maketables.go b/Godeps/_workspace/src/golang.org/x/text/language/maketables.go index 2cc995b379..576427e3cb 100644 --- a/Godeps/_workspace/src/golang.org/x/text/language/maketables.go +++ b/Godeps/_workspace/src/golang.org/x/text/language/maketables.go @@ -1098,7 +1098,7 @@ func find(list []string, s string) int { // In other words, we cannot guarantee the same order of variants for the // future using the same algorithm or for non-compliant combinations of // variants. For this reason, consider using simple alphabetic sorting -// of variants and ignore Prefix restrictions altogether. +// of variants and ignore Prefix restrictions altogexper. func (b *builder) writeVariant() { generalized := stringSet{} specialized := stringSet{} diff --git a/Godeps/_workspace/src/gopkg.in/check.v1/check.go b/Godeps/_workspace/src/gopkg.in/check.v1/check.go index 82c26fa736..4fca60751e 100644 --- a/Godeps/_workspace/src/gopkg.in/check.v1/check.go +++ b/Godeps/_workspace/src/gopkg.in/check.v1/check.go @@ -727,7 +727,7 @@ func (runner *suiteRunner) runFixture(method *methodType, testName string, logb // Run the fixture method with runFixture(), but panic with a fixturePanic{} // in case the fixture method panics. This makes it easier to track the -// fixture panic together with other call panics within forkTest(). +// fixture panic togexper with other call panics within forkTest(). func (runner *suiteRunner) runFixtureWithPanic(method *methodType, testName string, logb *logger, skipped *bool) *C { if skipped != nil && *skipped { return nil @@ -747,7 +747,7 @@ type fixturePanic struct { method *methodType } -// Run the suite test method, together with the test-specific fixture, +// Run the suite test method, togexper with the test-specific fixture, // asynchronously. func (runner *suiteRunner) forkTest(method *methodType) *C { testName := method.String() diff --git a/Godeps/_workspace/src/gopkg.in/check.v1/helpers.go b/Godeps/_workspace/src/gopkg.in/check.v1/helpers.go index 58a733b50f..1e1586feea 100644 --- a/Godeps/_workspace/src/gopkg.in/check.v1/helpers.go +++ b/Godeps/_workspace/src/gopkg.in/check.v1/helpers.go @@ -85,13 +85,13 @@ func (c *C) GetTestLog() string { } // Log logs some information into the test error output. -// The provided arguments are assembled together into a string with fmt.Sprint. +// The provided arguments are assembled togexper into a string with fmt.Sprint. func (c *C) Log(args ...interface{}) { c.log(args...) } // Log logs some information into the test error output. -// The provided arguments are assembled together into a string with fmt.Sprintf. +// The provided arguments are assembled togexper into a string with fmt.Sprintf. func (c *C) Logf(format string, args ...interface{}) { c.logf(format, args...) } @@ -109,7 +109,7 @@ func (c *C) Output(calldepth int, s string) error { } // Error logs an error into the test error output and marks the test as failed. -// The provided arguments are assembled together into a string with fmt.Sprint. +// The provided arguments are assembled togexper into a string with fmt.Sprint. func (c *C) Error(args ...interface{}) { c.logCaller(1) c.logString(fmt.Sprint("Error: ", fmt.Sprint(args...))) @@ -118,7 +118,7 @@ func (c *C) Error(args ...interface{}) { } // Errorf logs an error into the test error output and marks the test as failed. -// The provided arguments are assembled together into a string with fmt.Sprintf. +// The provided arguments are assembled togexper into a string with fmt.Sprintf. func (c *C) Errorf(format string, args ...interface{}) { c.logCaller(1) c.logString(fmt.Sprintf("Error: "+format, args...)) @@ -127,7 +127,7 @@ func (c *C) Errorf(format string, args ...interface{}) { } // Fatal logs an error into the test error output, marks the test as failed, and -// stops the test execution. The provided arguments are assembled together into +// stops the test execution. The provided arguments are assembled togexper into // a string with fmt.Sprint. func (c *C) Fatal(args ...interface{}) { c.logCaller(1) @@ -137,7 +137,7 @@ func (c *C) Fatal(args ...interface{}) { } // Fatlaf logs an error into the test error output, marks the test as failed, and -// stops the test execution. The provided arguments are assembled together into +// stops the test execution. The provided arguments are assembled togexper into // a string with fmt.Sprintf. func (c *C) Fatalf(format string, args ...interface{}) { c.logCaller(1) diff --git a/Makefile b/Makefile index c2fb9bb354..723e2150a1 100644 --- a/Makefile +++ b/Makefile @@ -2,100 +2,100 @@ # with Go source code. If you know what GOPATH is then you probably # don't need to bother with make. -.PHONY: geth geth-cross evm all test travis-test-with-coverage xgo clean -.PHONY: geth-linux geth-linux-386 geth-linux-amd64 -.PHONY: geth-linux-arm geth-linux-arm-5 geth-linux-arm-6 geth-linux-arm-7 geth-linux-arm64 -.PHONY: geth-darwin geth-darwin-386 geth-darwin-amd64 -.PHONY: geth-windows geth-windows-386 geth-windows-amd64 -.PHONY: geth-android geth-ios +.PHONY: gexp gexp-cross evm all test travis-test-with-coverage xgo clean +.PHONY: gexp-linux gexp-linux-386 gexp-linux-amd64 +.PHONY: gexp-linux-arm gexp-linux-arm-5 gexp-linux-arm-6 gexp-linux-arm-7 gexp-linux-arm64 +.PHONY: gexp-darwin gexp-darwin-386 gexp-darwin-amd64 +.PHONY: gexp-windows gexp-windows-386 gexp-windows-amd64 +.PHONY: gexp-android gexp-ios GOBIN = build/bin GO ?= latest -geth: - build/env.sh go build -i -v $(shell build/flags.sh) -o $(GOBIN)/geth ./cmd/geth +gexp: + build/env.sh go build -i -v $(shell build/flags.sh) -o $(GOBIN)/gexp ./cmd/gexp @echo "Done building." - @echo "Run \"$(GOBIN)/geth\" to launch geth." + @echo "Run \"$(GOBIN)/gexp\" to launch gexp." -geth-cross: geth-linux geth-darwin geth-windows geth-android geth-ios +gexp-cross: gexp-linux gexp-darwin gexp-windows gexp-android gexp-ios @echo "Full cross compilation done:" - @ls -ld $(GOBIN)/geth-* + @ls -ld $(GOBIN)/gexp-* -geth-linux: geth-linux-386 geth-linux-amd64 geth-linux-arm +gexp-linux: gexp-linux-386 gexp-linux-amd64 gexp-linux-arm @echo "Linux cross compilation done:" - @ls -ld $(GOBIN)/geth-linux-* + @ls -ld $(GOBIN)/gexp-linux-* -geth-linux-386: xgo - build/env.sh $(GOBIN)/xgo --go=$(GO) --dest=$(GOBIN) --targets=linux/386 -v $(shell build/flags.sh) ./cmd/geth +gexp-linux-386: xgo + build/env.sh $(GOBIN)/xgo --go=$(GO) --dest=$(GOBIN) --targets=linux/386 -v $(shell build/flags.sh) ./cmd/gexp @echo "Linux 386 cross compilation done:" - @ls -ld $(GOBIN)/geth-linux-* | grep 386 + @ls -ld $(GOBIN)/gexp-linux-* | grep 386 -geth-linux-amd64: xgo - build/env.sh $(GOBIN)/xgo --go=$(GO) --dest=$(GOBIN) --targets=linux/amd64 -v $(shell build/flags.sh) ./cmd/geth +gexp-linux-amd64: xgo + build/env.sh $(GOBIN)/xgo --go=$(GO) --dest=$(GOBIN) --targets=linux/amd64 -v $(shell build/flags.sh) ./cmd/gexp @echo "Linux amd64 cross compilation done:" - @ls -ld $(GOBIN)/geth-linux-* | grep amd64 + @ls -ld $(GOBIN)/gexp-linux-* | grep amd64 -geth-linux-arm: geth-linux-arm-5 geth-linux-arm-6 geth-linux-arm-7 geth-linux-arm64 +gexp-linux-arm: gexp-linux-arm-5 gexp-linux-arm-6 gexp-linux-arm-7 gexp-linux-arm64 @echo "Linux ARM cross compilation done:" - @ls -ld $(GOBIN)/geth-linux-* | grep arm + @ls -ld $(GOBIN)/gexp-linux-* | grep arm -geth-linux-arm-5: xgo - build/env.sh $(GOBIN)/xgo --go=$(GO) --dest=$(GOBIN) --targets=linux/arm-5 -v $(shell build/flags.sh) ./cmd/geth +gexp-linux-arm-5: xgo + build/env.sh $(GOBIN)/xgo --go=$(GO) --dest=$(GOBIN) --targets=linux/arm-5 -v $(shell build/flags.sh) ./cmd/gexp @echo "Linux ARMv5 cross compilation done:" - @ls -ld $(GOBIN)/geth-linux-* | grep arm-5 + @ls -ld $(GOBIN)/gexp-linux-* | grep arm-5 -geth-linux-arm-6: xgo - build/env.sh $(GOBIN)/xgo --go=$(GO) --dest=$(GOBIN) --targets=linux/arm-6 -v $(shell build/flags.sh) ./cmd/geth +gexp-linux-arm-6: xgo + build/env.sh $(GOBIN)/xgo --go=$(GO) --dest=$(GOBIN) --targets=linux/arm-6 -v $(shell build/flags.sh) ./cmd/gexp @echo "Linux ARMv6 cross compilation done:" - @ls -ld $(GOBIN)/geth-linux-* | grep arm-6 + @ls -ld $(GOBIN)/gexp-linux-* | grep arm-6 -geth-linux-arm-7: xgo - build/env.sh $(GOBIN)/xgo --go=$(GO) --dest=$(GOBIN) --targets=linux/arm-7 -v $(shell build/flags.sh) ./cmd/geth +gexp-linux-arm-7: xgo + build/env.sh $(GOBIN)/xgo --go=$(GO) --dest=$(GOBIN) --targets=linux/arm-7 -v $(shell build/flags.sh) ./cmd/gexp @echo "Linux ARMv7 cross compilation done:" - @ls -ld $(GOBIN)/geth-linux-* | grep arm-7 + @ls -ld $(GOBIN)/gexp-linux-* | grep arm-7 -geth-linux-arm64: xgo - build/env.sh $(GOBIN)/xgo --go=$(GO) --dest=$(GOBIN) --targets=linux/arm64 -v $(shell build/flags.sh) ./cmd/geth +gexp-linux-arm64: xgo + build/env.sh $(GOBIN)/xgo --go=$(GO) --dest=$(GOBIN) --targets=linux/arm64 -v $(shell build/flags.sh) ./cmd/gexp @echo "Linux ARM64 cross compilation done:" - @ls -ld $(GOBIN)/geth-linux-* | grep arm64 + @ls -ld $(GOBIN)/gexp-linux-* | grep arm64 -geth-darwin: geth-darwin-386 geth-darwin-amd64 +gexp-darwin: gexp-darwin-386 gexp-darwin-amd64 @echo "Darwin cross compilation done:" - @ls -ld $(GOBIN)/geth-darwin-* + @ls -ld $(GOBIN)/gexp-darwin-* -geth-darwin-386: xgo - build/env.sh $(GOBIN)/xgo --go=$(GO) --dest=$(GOBIN) --targets=darwin/386 -v $(shell build/flags.sh) ./cmd/geth +gexp-darwin-386: xgo + build/env.sh $(GOBIN)/xgo --go=$(GO) --dest=$(GOBIN) --targets=darwin/386 -v $(shell build/flags.sh) ./cmd/gexp @echo "Darwin 386 cross compilation done:" - @ls -ld $(GOBIN)/geth-darwin-* | grep 386 + @ls -ld $(GOBIN)/gexp-darwin-* | grep 386 -geth-darwin-amd64: xgo - build/env.sh $(GOBIN)/xgo --go=$(GO) --dest=$(GOBIN) --targets=darwin/amd64 -v $(shell build/flags.sh) ./cmd/geth +gexp-darwin-amd64: xgo + build/env.sh $(GOBIN)/xgo --go=$(GO) --dest=$(GOBIN) --targets=darwin/amd64 -v $(shell build/flags.sh) ./cmd/gexp @echo "Darwin amd64 cross compilation done:" - @ls -ld $(GOBIN)/geth-darwin-* | grep amd64 + @ls -ld $(GOBIN)/gexp-darwin-* | grep amd64 -geth-windows: geth-windows-386 geth-windows-amd64 +gexp-windows: gexp-windows-386 gexp-windows-amd64 @echo "Windows cross compilation done:" - @ls -ld $(GOBIN)/geth-windows-* + @ls -ld $(GOBIN)/gexp-windows-* -geth-windows-386: xgo - build/env.sh $(GOBIN)/xgo --go=$(GO) --dest=$(GOBIN) --targets=windows/386 -v $(shell build/flags.sh) ./cmd/geth +gexp-windows-386: xgo + build/env.sh $(GOBIN)/xgo --go=$(GO) --dest=$(GOBIN) --targets=windows/386 -v $(shell build/flags.sh) ./cmd/gexp @echo "Windows 386 cross compilation done:" - @ls -ld $(GOBIN)/geth-windows-* | grep 386 + @ls -ld $(GOBIN)/gexp-windows-* | grep 386 -geth-windows-amd64: xgo - build/env.sh $(GOBIN)/xgo --go=$(GO) --dest=$(GOBIN) --targets=windows/amd64 -v $(shell build/flags.sh) ./cmd/geth +gexp-windows-amd64: xgo + build/env.sh $(GOBIN)/xgo --go=$(GO) --dest=$(GOBIN) --targets=windows/amd64 -v $(shell build/flags.sh) ./cmd/gexp @echo "Windows amd64 cross compilation done:" - @ls -ld $(GOBIN)/geth-windows-* | grep amd64 + @ls -ld $(GOBIN)/gexp-windows-* | grep amd64 -geth-android: xgo - build/env.sh $(GOBIN)/xgo --go=$(GO) --dest=$(GOBIN) --targets=android-21/aar -v $(shell build/flags.sh) ./cmd/geth +gexp-android: xgo + build/env.sh $(GOBIN)/xgo --go=$(GO) --dest=$(GOBIN) --targets=android-21/aar -v $(shell build/flags.sh) ./cmd/gexp @echo "Android cross compilation done:" - @ls -ld $(GOBIN)/geth-android-* + @ls -ld $(GOBIN)/gexp-android-* -geth-ios: xgo - build/env.sh $(GOBIN)/xgo --go=$(GO) --dest=$(GOBIN) --targets=ios-7.0/framework -v $(shell build/flags.sh) ./cmd/geth +gexp-ios: xgo + build/env.sh $(GOBIN)/xgo --go=$(GO) --dest=$(GOBIN) --targets=ios-7.0/framework -v $(shell build/flags.sh) ./cmd/gexp @echo "iOS framework cross compilation done:" - @ls -ld $(GOBIN)/geth-ios-* + @ls -ld $(GOBIN)/gexp-ios-* evm: build/env.sh $(GOROOT)/bin/go install -v $(shell build/flags.sh) ./cmd/evm diff --git a/README.md b/README.md index 70f90975e3..53d4c1703b 100644 --- a/README.md +++ b/README.md @@ -1,64 +1,62 @@ -## Ethereum Go +## Expanse Go -Official golang implementation of the Ethereum protocol +Expanse Go Client, by Christopher Franko (forked from Jeffrey Wilcke (and some other people)'s Expanse Go client). | Linux | OSX | ARM | Windows | Tests ----------|---------|-----|-----|---------|------ -develop | [![Build+Status](https://build.ethdev.com/buildstatusimage?builder=Linux%20Go%20develop%20branch)](https://build.ethdev.com/builders/Linux%20Go%20develop%20branch/builds/-1) | [![Build+Status](https://build.ethdev.com/buildstatusimage?builder=Linux%20Go%20develop%20branch)](https://build.ethdev.com/builders/OSX%20Go%20develop%20branch/builds/-1) | [![Build+Status](https://build.ethdev.com/buildstatusimage?builder=ARM%20Go%20develop%20branch)](https://build.ethdev.com/builders/ARM%20Go%20develop%20branch/builds/-1) | [![Build+Status](https://build.ethdev.com/buildstatusimage?builder=Windows%20Go%20develop%20branch)](https://build.ethdev.com/builders/Windows%20Go%20develop%20branch/builds/-1) | [![Buildr+Status](https://travis-ci.org/ethereum/go-ethereum.svg?branch=develop)](https://travis-ci.org/ethereum/go-ethereum) [![codecov.io](http://codecov.io/github/ethereum/go-ethereum/coverage.svg?branch=develop)](http://codecov.io/github/ethereum/go-ethereum?branch=develop) -master | [![Build+Status](https://build.ethdev.com/buildstatusimage?builder=Linux%20Go%20master%20branch)](https://build.ethdev.com/builders/Linux%20Go%20master%20branch/builds/-1) | [![Build+Status](https://build.ethdev.com/buildstatusimage?builder=OSX%20Go%20master%20branch)](https://build.ethdev.com/builders/OSX%20Go%20master%20branch/builds/-1) | [![Build+Status](https://build.ethdev.com/buildstatusimage?builder=ARM%20Go%20master%20branch)](https://build.ethdev.com/builders/ARM%20Go%20master%20branch/builds/-1) | [![Build+Status](https://build.ethdev.com/buildstatusimage?builder=Windows%20Go%20master%20branch)](https://build.ethdev.com/builders/Windows%20Go%20master%20branch/builds/-1) | [![Buildr+Status](https://travis-ci.org/ethereum/go-ethereum.svg?branch=master)](https://travis-ci.org/ethereum/go-ethereum) [![codecov.io](http://codecov.io/github/ethereum/go-ethereum/coverage.svg?branch=master)](http://codecov.io/github/ethereum/go-ethereum?branch=master) - -[![API Reference]( -https://camo.githubusercontent.com/915b7be44ada53c290eb157634330494ebe3e30a/68747470733a2f2f676f646f632e6f72672f6769746875622e636f6d2f676f6c616e672f6764646f3f7374617475732e737667 -)](https://godoc.org/github.com/ethereum/go-ethereum) -[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/ethereum/go-ethereum?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +develop | [![Build+Status](https://build.ethdev.com/buildstatusimage?builder=Linux%20Go%20develop%20branch)](https://build.ethdev.com/builders/Linux%20Go%20develop%20branch/builds/-1) | [![Build+Status](https://build.ethdev.com/buildstatusimage?builder=Linux%20Go%20develop%20branch)](https://build.ethdev.com/builders/OSX%20Go%20develop%20branch/builds/-1) | [![Build+Status](https://build.ethdev.com/buildstatusimage?builder=ARM%20Go%20develop%20branch)](https://build.ethdev.com/builders/ARM%20Go%20develop%20branch/builds/-1) | [![Build+Status](https://build.ethdev.com/buildstatusimage?builder=Windows%20Go%20develop%20branch)](https://build.ethdev.com/builders/Windows%20Go%20develop%20branch/builds/-1) | [![Buildr+Status](https://travis-ci.org/expanse-project/go-expanse.svg?branch=develop)](https://travis-ci.org/expanse/go-expanse) [![Coverage Status](https://coveralls.io/repos/expanse-project/go-expanse/badge.svg?branch=develop)](https://coveralls.io/r/expanse/go-expanse?branch=develop) +master | [![Build+Status](https://build.ethdev.com/buildstatusimage?builder=Linux%20Go%20master%20branch)](https://build.ethdev.com/builders/Linux%20Go%20master%20branch/builds/-1) | [![Build+Status](https://build.ethdev.com/buildstatusimage?builder=OSX%20Go%20master%20branch)](https://build.ethdev.com/builders/OSX%20Go%20master%20branch/builds/-1) | [![Build+Status](https://build.ethdev.com/buildstatusimage?builder=ARM%20Go%20master%20branch)](https://build.ethdev.com/builders/ARM%20Go%20master%20branch/builds/-1) | [![Build+Status](https://build.ethdev.com/buildstatusimage?builder=Windows%20Go%20master%20branch)](https://build.ethdev.com/builders/Windows%20Go%20master%20branch/builds/-1) | [![Buildr+Status](https://travis-ci.org/expanse-project/go-expanse.svg?branch=master)](https://travis-ci.org/expanse-project/go-expanse) [![Coverage Status](https://coveralls.io/repos/expanse-project/go-expanse/badge.svg?branch=master)](https://coveralls.io/r/expanse-project/go-expanse?branch=master) +[![Bugs](https://badge.waffle.io/expanse-project/go-expanse.png?label=bug&title=Bugs)](https://waffle.io/expanse/go-expanse) +[![Stories in Ready](https://badge.waffle.io/expanse-project/go-expanse.png?label=ready&title=Ready)](https://waffle.io/expanse/go-expanse) +[![Stories in Progress](https://badge.waffle.io/expanse-project/go-expanse.svg?label=in%20progress&title=In Progress)](http://waffle.io/expanse/go-expanse) +[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/expanse/go-expanse?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) ## Automated development builds -The following builds are build automatically by our build servers after each push to the [develop](https://github.com/ethereum/go-ethereum/tree/develop) branch. +The following builds are build automatically by our build servers after each push to the [develop](https://github.com/expanse-project/go-expanse/tree/develop) branch. -* [Docker](https://registry.hub.docker.com/u/ethereum/client-go/) +* [Docker](https://registry.hub.docker.com/u/expanse/go-expanse/) * [OS X](http://build.ethdev.com/builds/OSX%20Go%20develop%20branch/Mist-OSX-latest.dmg) * Ubuntu [trusty](https://build.ethdev.com/builds/Linux%20Go%20develop%20deb%20i386-trusty/latest/) | [utopic](https://build.ethdev.com/builds/Linux%20Go%20develop%20deb%20i386-utopic/latest/) -* [Windows 64-bit](https://build.ethdev.com/builds/Windows%20Go%20develop%20branch/Geth-Win64-latest.zip) -* [ARM](https://build.ethdev.com/builds/ARM%20Go%20develop%20branch/geth-ARM-latest.tar.bz2) +* [Windows 64-bit](https://build.ethdev.com/builds/Windows%20Go%20develop%20branch/Gexp-Win64-latest.zip) +* [ARM](https://build.ethdev.com/builds/ARM%20Go%20develop%20branch/gexp-ARM-latest.tar.bz2) ## Building the source For prerequisites and detailed build instructions please read the -[Installation Instructions](https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum) +[Installation Instructions](https://github.com/expanse-project/go-expanse/wiki/Building-Expanse) on the wiki. -Building geth requires both a Go and a C compiler. +Building gexp requires both a Go and a C compiler. You can install them using your favourite package manager. Once the dependencies are installed, run - make geth + make gexp ## Executables -The go-ethereum project comes with several wrappers/executables found in the `cmd` directory. +Go Expanse comes with several wrappers/executables found in +[the `cmd` directory](https://github.com/expanse-project/go-expanse/tree/develop/cmd): -| Command | Description | -|:----------:|-------------| -| **`geth`** | Our main Ethereum CLI client. It is the entry point into the Ethereum network (main-, test- or private net), capable of running as a full node (default) archive node (retaining all historical state) or a light node (retrieving data live). It can be used by other processes as an gateway into the Ethereum network via JSON RPC endpoints exposed on top of HTTP, WebSocket and/or IPC transports. Please see our [Command Line Options](https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options) wiki page for details. | -| `abigen` | Source code generator to convert Ethereum contract definitions into easy to use, compile-time type-safe Go packages. It operates on plain [Ethereum contract ABIs](https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI) with expanded functionality if the contract bytecode is also available. However it also accepts Solidity source files, making development much more streamlined. Please see our [Native DApps](https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts) wiki page for details. | -| `bootnode` | Stripped down version of our Ethereum client implementation that only takes part in the network node discovery protocol, but does not run any of the higher level application protocols. It can be used as a lightweight bootstrap node to aid in finding peers in private networks. | -| `disasm` | Bytecode disassembler to convert EVM (Ethereum Virtual Machine) bytecode into more user friendly assembly-like opcodes (e.g. `echo "6001" | disasm`). For details on the individual opcodes, please see pages 22-30 of the [Ethereum Yellow Paper](http://gavwood.com/paper.pdf). | -| `evm` | Developer utility version of the EVM (Ethereum Virtual Machine) that is capable of running bytecode snippets within a configurable environment and execution mode. Its purpose is to allow insolated, fine graned debugging of EVM opcodes (e.g. `evm --code 60ff60ff --debug`). | -| `gethrpctest` | Developer utility tool to support our [ethereum/rpc-test](https://github.com/ethereum/rpc-tests) test suite which validates baseline conformity to the [Ethereum JSON RPC](https://github.com/ethereum/wiki/wiki/JSON-RPC) specs. Please see the [test suite's readme](https://github.com/ethereum/rpc-tests/blob/master/README.md) for details. | -| `rlpdump` | Developer utility tool to convert binary RLP ([Recursive Length Prefix](https://github.com/ethereum/wiki/wiki/RLP)) dumps (data encoding used by the Ethereum protocol both network as well as consensus wise) to user friendlier hierarchical representation (e.g. `rlpdump --hex CE0183FFFFFFC4C304050583616263`). | +* `gexp` Expanse CLI (expanse command line interface client) +* `bootnode` runs a bootstrap node for the Discovery Protocol +* `exptest` test tool which runs with the [tests](https://github.com/expanse-project/tests) suite: + `/path/to/test.json > exptest --test BlockTests --stdin`. +* `evm` is a generic Expanse Virtual Machine: `evm -code 60ff60ff -gas + 10000 -price 0 -dump`. See `-h` for a detailed description. +* `disasm` disassembles EVM code: `echo "6001" | disasm` +* `rlpdump` prints RLP structures ## Contribution -Thank you for considering to help out with the source code! We welcome contributions from -anyone on the internet, and are grateful for even the smallest of fixes! +`gexp` can be configured via command line options, environment variables and config files. -If you'd like to contribute to go-ethereum, please fork, fix, commit and send a pull request +If you'd like to contribute to go-expanse, please fork, fix, commit and send a pull request for the maintainers to review and merge into the main code base. If you wish to submit more complex changes though, please check up with the core devs first on [our gitter channel](https://gitter.im/ethereum/go-ethereum) -to ensure those changes are in line with the general philosopy of the project and/or get some +to ensure those changes are in line with the general philosophy of the project and/or get some early feedback which can make both your efforts much lighter as well as our review and merge procedures quick and simple. @@ -68,18 +66,19 @@ Please make sure your contributions adhere to our coding guidlines: * Code must be documented adherign to the official Go [commentary](https://golang.org/doc/effective_go.html#commentary) guidelines. * Pull requests need to be based on and opened against the `develop` branch. * Commit messages should be prefixed with the package(s) they modify. - * E.g. "eth, rpc: make trace configs optional" + * E.g. "exp, rpc: make trace configs optional" -Please see the [Developers' Guide](https://github.com/ethereum/go-ethereum/wiki/Developers'-Guide) + +Please see the [Developers' Guide](https://github.com/expanse-project/go-expanse/wiki/Developers'-Guide) for more details on configuring your environment, managing project dependencies and testing procedures. ## License -The go-ethereum library (i.e. all code outside of the `cmd` directory) is licensed under the +The go-expanse library (i.e. all code outside of the `cmd` directory) is licensed under the [GNU Lesser General Public License v3.0](http://www.gnu.org/licenses/lgpl-3.0.en.html), also included in our repository in the `COPYING.LESSER` file. -The go-ethereum binaries (i.e. all code inside of the `cmd` directory) is licensed under the +The go-expanse binaries (i.e. all code inside of the `cmd` directory) is licensed under the [GNU General Public License v3.0](http://www.gnu.org/licenses/gpl-3.0.en.html), also included in our repository in the `COPYING` file. diff --git a/accounts/abi/abi.go b/accounts/abi/abi.go index 1b07b2f68e..7dae92f73b 100644 --- a/accounts/abi/abi.go +++ b/accounts/abi/abi.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package abi @@ -24,7 +24,8 @@ import ( "reflect" "strings" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse-project/go-expanse/common" + ) // The ABI holds information about a contract's context and available diff --git a/accounts/abi/abi_test.go b/accounts/abi/abi_test.go index df89ba1381..05408adcdc 100644 --- a/accounts/abi/abi_test.go +++ b/accounts/abi/abi_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package abi @@ -25,8 +25,8 @@ import ( "strings" "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" ) // formatSilceOutput add padding to the value and adds a size diff --git a/accounts/abi/argument.go b/accounts/abi/argument.go index 188203a5d1..24e04d5036 100644 --- a/accounts/abi/argument.go +++ b/accounts/abi/argument.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package abi diff --git a/accounts/abi/bind/auth.go b/accounts/abi/bind/auth.go index 2cf22768cf..cdede858ac 100644 --- a/accounts/abi/bind/auth.go +++ b/accounts/abi/bind/auth.go @@ -22,10 +22,10 @@ import ( "io" "io/ioutil" - "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" + "github.com/expanse-project/go-expanse/accounts" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/crypto" ) // NewTransactor is a utility method to easily create a transaction signer from diff --git a/accounts/abi/bind/backend.go b/accounts/abi/bind/backend.go index 604e1ef267..bd47af7d1b 100644 --- a/accounts/abi/bind/backend.go +++ b/accounts/abi/bind/backend.go @@ -20,8 +20,8 @@ import ( "errors" "math/big" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/types" ) // ErrNoCode is returned by call and transact operations for which the requested @@ -36,7 +36,7 @@ var ErrNoCode = errors.New("no contract code at given address") // ContractCaller defines the methods needed to allow operating with contract on a read // only basis. type ContractCaller interface { - // ContractCall executes an Ethereum contract call with the specified data as + // ContractCall executes an Expanse contract call with the specified data as // the input. The pending flag requests execution against the pending block, not // the stable head of the chain. ContractCall(contract common.Address, data []byte, pending bool) ([]byte, error) diff --git a/accounts/abi/bind/backends/nil.go b/accounts/abi/bind/backends/nil.go index 3b1e6dce77..9541607e75 100644 --- a/accounts/abi/bind/backends/nil.go +++ b/accounts/abi/bind/backends/nil.go @@ -19,9 +19,9 @@ package backends import ( "math/big" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" + "github.com/expanse-project/go-expanse/accounts/abi/bind" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/types" ) // This nil assignment ensures compile time that nilBackend implements bind.ContractBackend. diff --git a/accounts/abi/bind/backends/remote.go b/accounts/abi/bind/backends/remote.go index 9b3647192a..e7fe638631 100644 --- a/accounts/abi/bind/backends/remote.go +++ b/accounts/abi/bind/backends/remote.go @@ -23,18 +23,18 @@ import ( "sync" "sync/atomic" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/rlp" - "github.com/ethereum/go-ethereum/rpc" + "github.com/expanse-project/go-expanse/accounts/abi/bind" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/rlp" + "github.com/expanse-project/go-expanse/rpc" ) // This nil assignment ensures compile time that rpcBackend implements bind.ContractBackend. var _ bind.ContractBackend = (*rpcBackend)(nil) // rpcBackend implements bind.ContractBackend, and acts as the data provider to -// Ethereum contracts bound to Go structs. It uses an RPC connection to delegate +// Expanse contracts bound to Go structs. It uses an RPC connection to delegate // all its functionality. // // Note: The current implementation is a blocking one. This should be replaced @@ -127,7 +127,7 @@ func (b *rpcBackend) ContractCall(contract common.Address, data []byte, pending if pending { block = "pending" } - res, err := b.request("eth_call", []interface{}{args, block}) + res, err := b.request("exp_call", []interface{}{args, block}) if err != nil { return nil, err } @@ -142,7 +142,7 @@ func (b *rpcBackend) ContractCall(contract common.Address, data []byte, pending // PendingAccountNonce implements ContractTransactor.PendingAccountNonce, delegating // the current account nonce retrieval to the remote node. func (b *rpcBackend) PendingAccountNonce(account common.Address) (uint64, error) { - res, err := b.request("eth_getTransactionCount", []interface{}{account.Hex(), "pending"}) + res, err := b.request("exp_getTransactionCount", []interface{}{account.Hex(), "pending"}) if err != nil { return 0, err } @@ -160,7 +160,7 @@ func (b *rpcBackend) PendingAccountNonce(account common.Address) (uint64, error) // SuggestGasPrice implements ContractTransactor.SuggestGasPrice, delegating the // gas price oracle request to the remote node. func (b *rpcBackend) SuggestGasPrice() (*big.Int, error) { - res, err := b.request("eth_gasPrice", nil) + res, err := b.request("exp_gasPrice", nil) if err != nil { return nil, err } @@ -191,7 +191,7 @@ func (b *rpcBackend) EstimateGasLimit(sender common.Address, contract *common.Ad Value: rpc.NewHexNumber(value), } // Execute the RPC call and retrieve the response - res, err := b.request("eth_estimateGas", []interface{}{args}) + res, err := b.request("exp_estimateGas", []interface{}{args}) if err != nil { return nil, err } @@ -213,7 +213,7 @@ func (b *rpcBackend) SendTransaction(tx *types.Transaction) error { if err != nil { return err } - res, err := b.request("eth_sendRawTransaction", []interface{}{common.ToHex(data)}) + res, err := b.request("exp_sendRawTransaction", []interface{}{common.ToHex(data)}) if err != nil { return err } diff --git a/accounts/abi/bind/backends/simulated.go b/accounts/abi/bind/backends/simulated.go index 4866c4f588..bbe31b77a1 100644 --- a/accounts/abi/bind/backends/simulated.go +++ b/accounts/abi/bind/backends/simulated.go @@ -19,14 +19,14 @@ package backends import ( "math/big" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" + "github.com/expanse-project/go-expanse/accounts/abi/bind" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/event" ) // Default chain configuration which sets homestead phase at block 0 (i.e. no frontier) @@ -39,7 +39,7 @@ var _ bind.ContractBackend = (*SimulatedBackend)(nil) // the background. Its main purpose is to allow easily testing contract bindings. type SimulatedBackend struct { database ethdb.Database // In memory database to store our testing data - blockchain *core.BlockChain // Ethereum blockchain to handle the consensus + blockchain *core.BlockChain // Expanse blockchain to handle the consensus pendingBlock *types.Block // Currently pending block that will be imported on request pendingState *state.StateDB // Currently pending state that will be the active on on request diff --git a/accounts/abi/bind/base.go b/accounts/abi/bind/base.go index 06621c5ad3..8c09547fe5 100644 --- a/accounts/abi/bind/base.go +++ b/accounts/abi/bind/base.go @@ -21,10 +21,10 @@ import ( "fmt" "math/big" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" + "github.com/expanse-project/go-expanse/accounts/abi" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/crypto" ) // SignerFn is a signer function callback when a contract requires a method to @@ -37,9 +37,9 @@ type CallOpts struct { } // TransactOpts is the collection of authorization data required to create a -// valid Ethereum transaction. +// valid Expanse transaction. type TransactOpts struct { - From common.Address // Ethereum account to send the transaction from + From common.Address // Expanse account to send the transaction from Nonce *big.Int // Nonce to use for the transaction execution (nil = use pending state) Signer SignerFn // Method to use for signing the transaction (mandatory) @@ -49,11 +49,11 @@ type TransactOpts struct { } // BoundContract is the base wrapper object that reflects a contract on the -// Ethereum network. It contains a collection of methods that are used by the +// Expanse network. It contains a collection of methods that are used by the // higher level contract bindings to operate. type BoundContract struct { - address common.Address // Deployment address of the contract on the Ethereum blockchain - abi abi.ABI // Reflect based ABI to access the correct Ethereum methods + address common.Address // Deployment address of the contract on the Expanse blockchain + abi abi.ABI // Reflect based ABI to access the correct Expanse methods caller ContractCaller // Read interface to interact with the blockchain transactor ContractTransactor // Write interface to interact with the blockchain } @@ -69,7 +69,7 @@ func NewBoundContract(address common.Address, abi abi.ABI, caller ContractCaller } } -// DeployContract deploys a contract onto the Ethereum blockchain and binds the +// DeployContract deploys a contract onto the Expanse blockchain and binds the // deployment address with a Go wrapper. func DeployContract(opts *TransactOpts, abi abi.ABI, bytecode []byte, backend ContractBackend, params ...interface{}) (common.Address, *types.Transaction, *BoundContract, error) { // Otherwise try to deploy the contract diff --git a/accounts/abi/bind/bind.go b/accounts/abi/bind/bind.go index 24fe9f7708..95486b7e91 100644 --- a/accounts/abi/bind/bind.go +++ b/accounts/abi/bind/bind.go @@ -14,10 +14,10 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package bind generates Ethereum contract Go bindings. +// Package bind generates Expanse contract Go bindings. // // Detailed usage document and tutorial available on the go-ethereum Wiki page: -// https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts +// https://github.com/expanse-project/go-expanse/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts package bind import ( @@ -28,7 +28,7 @@ import ( "text/template" "unicode" - "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/expanse-project/go-expanse/accounts/abi" "golang.org/x/tools/imports" ) diff --git a/accounts/abi/bind/bind_test.go b/accounts/abi/bind/bind_test.go index a80560821c..972ce638b5 100644 --- a/accounts/abi/bind/bind_test.go +++ b/accounts/abi/bind/bind_test.go @@ -26,7 +26,7 @@ import ( "strings" "testing" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse-project/go-expanse/common" "golang.org/x/tools/imports" ) diff --git a/accounts/abi/bind/template.go b/accounts/abi/bind/template.go index 72998bb6d8..451206a21c 100644 --- a/accounts/abi/bind/template.go +++ b/accounts/abi/bind/template.go @@ -16,7 +16,7 @@ package bind -import "github.com/ethereum/go-ethereum/accounts/abi" +import "github.com/expanse-project/go-expanse/accounts/abi" // tmplData is the data structure required to fill the binding template. type tmplData struct { @@ -58,7 +58,7 @@ package {{.Package}} // {{.Type}}Bin is the compiled bytecode used for deploying new contracts. const {{.Type}}Bin = ` + "`" + `{{.InputBin}}` + "`" + ` - // Deploy{{.Type}} deploys a new Ethereum contract, binding an instance of {{.Type}} to it. + // Deploy{{.Type}} deploys a new Expanse contract, binding an instance of {{.Type}} to it. func Deploy{{.Type}}(auth *bind.TransactOpts, backend bind.ContractBackend {{range .Constructor.Inputs}}, {{.Name}} {{bindtype .Type}}{{end}}) (common.Address, *types.Transaction, *{{.Type}}, error) { parsed, err := abi.JSON(strings.NewReader({{.Type}}ABI)) if err != nil { @@ -72,23 +72,23 @@ package {{.Package}} } {{end}} - // {{.Type}} is an auto generated Go binding around an Ethereum contract. + // {{.Type}} is an auto generated Go binding around an Expanse contract. type {{.Type}} struct { {{.Type}}Caller // Read-only binding to the contract {{.Type}}Transactor // Write-only binding to the contract } - // {{.Type}}Caller is an auto generated read-only Go binding around an Ethereum contract. + // {{.Type}}Caller is an auto generated read-only Go binding around an Expanse contract. type {{.Type}}Caller struct { contract *bind.BoundContract // Generic contract wrapper for the low level calls } - // {{.Type}}Transactor is an auto generated write-only Go binding around an Ethereum contract. + // {{.Type}}Transactor is an auto generated write-only Go binding around an Expanse contract. type {{.Type}}Transactor struct { contract *bind.BoundContract // Generic contract wrapper for the low level calls } - // {{.Type}}Session is an auto generated Go binding around an Ethereum contract, + // {{.Type}}Session is an auto generated Go binding around an Expanse contract, // with pre-set call and transact options. type {{.Type}}Session struct { Contract *{{.Type}} // Generic contract binding to set the session for @@ -96,31 +96,31 @@ package {{.Package}} TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session } - // {{.Type}}CallerSession is an auto generated read-only Go binding around an Ethereum contract, + // {{.Type}}CallerSession is an auto generated read-only Go binding around an Expanse contract, // with pre-set call options. type {{.Type}}CallerSession struct { Contract *{{.Type}}Caller // Generic contract caller binding to set the session for CallOpts bind.CallOpts // Call options to use throughout this session } - // {{.Type}}TransactorSession is an auto generated write-only Go binding around an Ethereum contract, + // {{.Type}}TransactorSession is an auto generated write-only Go binding around an Expanse contract, // with pre-set transact options. type {{.Type}}TransactorSession struct { Contract *{{.Type}}Transactor // Generic contract transactor binding to set the session for TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session } - // {{.Type}}Raw is an auto generated low-level Go binding around an Ethereum contract. + // {{.Type}}Raw is an auto generated low-level Go binding around an Expanse contract. type {{.Type}}Raw struct { Contract *{{.Type}} // Generic contract binding to access the raw methods on } - // {{.Type}}CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. + // {{.Type}}CallerRaw is an auto generated low-level read-only Go binding around an Expanse contract. type {{.Type}}CallerRaw struct { Contract *{{.Type}}Caller // Generic read-only contract binding to access the raw methods on } - // {{.Type}}TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. + // {{.Type}}TransactorRaw is an auto generated low-level write-only Go binding around an Expanse contract. type {{.Type}}TransactorRaw struct { Contract *{{.Type}}Transactor // Generic write-only contract binding to access the raw methods on } diff --git a/accounts/abi/doc.go b/accounts/abi/doc.go index 8242068582..419fb17403 100644 --- a/accounts/abi/doc.go +++ b/accounts/abi/doc.go @@ -1,23 +1,23 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . -// Package abi implements the Ethereum ABI (Application Binary +// Package abi implements the Expanse ABI (Application Binary // Interface). // -// The Ethereum ABI is strongly typed, known at compile time +// The Expanse ABI is strongly typed, known at compile time // and static. This ABI will handle basic type casting; unsigned // to signed and visa versa. It does not handle slice casting such // as unsigned slice to signed slice. Bit size type casting is also diff --git a/accounts/abi/event.go b/accounts/abi/event.go index e74c7c732c..a00be9ff7d 100644 --- a/accounts/abi/event.go +++ b/accounts/abi/event.go @@ -20,8 +20,8 @@ import ( "fmt" "strings" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" ) // Event is an event potentially triggered by the EVM's LOG mechanism. The Event diff --git a/accounts/abi/event_test.go b/accounts/abi/event_test.go index b5054a0329..0829c7bc4b 100644 --- a/accounts/abi/event_test.go +++ b/accounts/abi/event_test.go @@ -20,8 +20,8 @@ import ( "strings" "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" ) func TestEventId(t *testing.T) { diff --git a/accounts/abi/method.go b/accounts/abi/method.go index f3d1a44b55..07070fae4d 100644 --- a/accounts/abi/method.go +++ b/accounts/abi/method.go @@ -21,7 +21,7 @@ import ( "reflect" "strings" - "github.com/ethereum/go-ethereum/crypto" + "github.com/expanse-project/go-expanse/crypto" ) // Callable method given a `Name` and whether the method is a constant. diff --git a/accounts/abi/numbers.go b/accounts/abi/numbers.go index 5a31cf2b5b..86d3a991a0 100644 --- a/accounts/abi/numbers.go +++ b/accounts/abi/numbers.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package abi @@ -20,7 +20,7 @@ import ( "math/big" "reflect" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse-project/go-expanse/common" ) var ( diff --git a/accounts/abi/numbers_test.go b/accounts/abi/numbers_test.go index d66a43258b..bab8f06a4a 100644 --- a/accounts/abi/numbers_test.go +++ b/accounts/abi/numbers_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package abi diff --git a/accounts/abi/packing.go b/accounts/abi/packing.go index c765dfdf30..b034dac804 100644 --- a/accounts/abi/packing.go +++ b/accounts/abi/packing.go @@ -19,7 +19,7 @@ package abi import ( "reflect" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse-project/go-expanse/common" ) // packBytesSlice packs the given bytes as [L, V] as the canonical representation diff --git a/accounts/abi/type.go b/accounts/abi/type.go index 2235bad611..c1a6d90e26 100644 --- a/accounts/abi/type.go +++ b/accounts/abi/type.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package abi diff --git a/accounts/account_manager.go b/accounts/account_manager.go index 3afadf6b22..2c39d0036f 100644 --- a/accounts/account_manager.go +++ b/accounts/account_manager.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // Package accounts implements encrypted storage of secp256k1 private keys. // @@ -32,8 +32,8 @@ import ( "sync" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" ) var ( @@ -45,7 +45,7 @@ var ( // Account represents a stored key. // When used as an argument, it selects a unique key file to act on. type Account struct { - Address common.Address // Ethereum account address derived from the key + Address common.Address // Expanse account address derived from the key // File contains the key file name. // When Acccount is used as an argument to select a key, File can be left blank to @@ -310,7 +310,7 @@ func (am *Manager) Update(a Account, passphrase, newPassphrase string) error { return am.keyStore.StoreKey(a.File, key, newPassphrase) } -// ImportPreSaleKey decrypts the given Ethereum presale wallet and stores +// ImportPreSaleKey decrypts the given Expanse presale wallet and stores // a key file in the key directory. The key file is encrypted with the same passphrase. func (am *Manager) ImportPreSaleKey(keyJSON []byte, passphrase string) (Account, error) { a, _, err := importPreSaleKey(am.keyStore, keyJSON, passphrase) diff --git a/accounts/accounts_test.go b/accounts/accounts_test.go index 829cf39683..95d819566c 100644 --- a/accounts/accounts_test.go +++ b/accounts/accounts_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package accounts @@ -24,7 +24,8 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse/go-expanse/common" + ) var testSigData = make([]byte, 32) @@ -178,7 +179,8 @@ func TestSignRace(t *testing.T) { } func tmpManager(t *testing.T, encrypted bool) (string, *Manager) { - d, err := ioutil.TempDir("", "eth-keystore-test") + d, err := ioutil.TempDir("", "exp-keystore-test") + if err != nil { t.Fatal(err) } diff --git a/accounts/addrcache.go b/accounts/addrcache.go index 0a904f7883..1ca4e799f2 100644 --- a/accounts/addrcache.go +++ b/accounts/addrcache.go @@ -28,9 +28,9 @@ import ( "sync" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" ) // Minimum amount of time between cache reloads. This limit applies if the platform does diff --git a/accounts/addrcache_test.go b/accounts/addrcache_test.go index e5f08cffc4..e3861ae9c1 100644 --- a/accounts/addrcache_test.go +++ b/accounts/addrcache_test.go @@ -28,7 +28,7 @@ import ( "github.com/cespare/cp" "github.com/davecgh/go-spew/spew" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse-project/go-expanse/common" ) var ( diff --git a/accounts/key.go b/accounts/key.go index dbcb49dcff..19001a6c3f 100644 --- a/accounts/key.go +++ b/accounts/key.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package accounts @@ -29,9 +29,9 @@ import ( "strings" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/crypto/secp256k1" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/crypto/secp256k1" "github.com/pborman/uuid" ) diff --git a/accounts/key_store_passphrase.go b/accounts/key_store_passphrase.go index 87c7cb98f7..660483bf99 100644 --- a/accounts/key_store_passphrase.go +++ b/accounts/key_store_passphrase.go @@ -1,25 +1,25 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . /* This key store behaves as KeyStorePlain with the difference that the private key is encrypted and on disk uses another JSON encoding. -The crypto is documented at https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition +The crypto is documented at https://github.com/expanse-project/wiki/wiki/Web3-Secret-Storage-Definition */ @@ -34,10 +34,9 @@ import ( "fmt" "io/ioutil" "path/filepath" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/crypto/randentropy" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/crypto/randentropy" "github.com/pborman/uuid" "golang.org/x/crypto/pbkdf2" "golang.org/x/crypto/scrypt" diff --git a/accounts/key_store_passphrase_test.go b/accounts/key_store_passphrase_test.go index 217393fa5e..bf80c52b26 100644 --- a/accounts/key_store_passphrase_test.go +++ b/accounts/key_store_passphrase_test.go @@ -20,7 +20,7 @@ import ( "io/ioutil" "testing" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse-project/go-expanse/common" ) const ( diff --git a/accounts/key_store_plain.go b/accounts/key_store_plain.go index 2cbaa94df5..c5de013606 100644 --- a/accounts/key_store_plain.go +++ b/accounts/key_store_plain.go @@ -22,7 +22,7 @@ import ( "os" "path/filepath" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse-project/go-expanse/common" ) type keyStorePlain struct { diff --git a/accounts/key_store_test.go b/accounts/key_store_test.go index b0417c87e3..5ee3b41f67 100644 --- a/accounts/key_store_test.go +++ b/accounts/key_store_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package accounts @@ -26,12 +26,13 @@ import ( "strings" "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + ) func tmpKeyStore(t *testing.T, encrypted bool) (dir string, ks keyStore) { - d, err := ioutil.TempDir("", "geth-keystore-test") + d, err := ioutil.TempDir("", "gexp-keystore-test") if err != nil { t.Fatal(err) } @@ -120,8 +121,10 @@ func TestImportPreSaleKey(t *testing.T) { } } -// Test and utils for the key store tests in the Ethereum JSON tests; + +// Test and utils for the key store tests in the Expanse JSON tests; // testdataKeyStoreTests/basic_tests.json + type KeyStoreTestV3 struct { Json encryptedKeyJSONV3 Password string diff --git a/accounts/presale.go b/accounts/presale.go index bb82821b9d..169a106c8d 100644 --- a/accounts/presale.go +++ b/accounts/presale.go @@ -24,7 +24,7 @@ import ( "encoding/json" "fmt" - "github.com/ethereum/go-ethereum/crypto" + "github.com/expanse-project/go-expanse/crypto" "github.com/pborman/uuid" "golang.org/x/crypto/pbkdf2" ) diff --git a/accounts/watch.go b/accounts/watch.go index 309e4d458c..ef1dbaa0a1 100644 --- a/accounts/watch.go +++ b/accounts/watch.go @@ -21,8 +21,8 @@ package accounts import ( "time" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" "github.com/rjeczalik/notify" ) diff --git a/build/env.sh b/build/env.sh index 04401a3e17..d2fd786383 100755 --- a/build/env.sh +++ b/build/env.sh @@ -10,23 +10,23 @@ fi # Create fake Go workspace if it doesn't exist yet. workspace="$PWD/build/_workspace" root="$PWD" -ethdir="$workspace/src/github.com/ethereum" -if [ ! -L "$ethdir/go-ethereum" ]; then +ethdir="$workspace/src/github.com/expanse-project" +if [ ! -L "$ethdir/go-expanse" ]; then mkdir -p "$ethdir" cd "$ethdir" - ln -s ../../../../../. go-ethereum + ln -s ../../../../../. go-expanse cd "$root" fi # Set up the environment to use the workspace. # Also add Godeps workspace so we build using canned dependencies. -GOPATH="$ethdir/go-ethereum/Godeps/_workspace:$workspace" +GOPATH="$ethdir/go-expanse/Godeps/_workspace:$workspace" GOBIN="$PWD/build/bin" export GOPATH GOBIN # Run the command inside the workspace. -cd "$ethdir/go-ethereum" -PWD="$ethdir/go-ethereum" +cd "$ethdir/go-expanse" +PWD="$ethdir/go-expanse" # Launch the arguments with the configured environment. exec "$@" diff --git a/build/update-license.go b/build/update-license.go index 803f7e8fd0..51112efede 100644 --- a/build/update-license.go +++ b/build/update-license.go @@ -60,13 +60,13 @@ var ( licenseCommentRE = regexp.MustCompile(`^//\s*(Copyright|This file is part of).*?\n(?://.*?\n)*\n*`) // this text appears at the start of AUTHORS - authorsFileHeader = "# This is the official list of go-ethereum authors for copyright purposes.\n\n" + authorsFileHeader = "# This is the official list of go-expanse authors for copyright purposes.\n\n" ) // this template generates the license comment. // its input is an info structure. var licenseT = template.Must(template.New("").Parse(` -// Copyright {{.Year}} The go-ethereum Authors +// Copyright {{.Year}} The go-expanse Authors // This file is part of {{.Whole false}}. // // {{.Whole true}} is free software: you can redistribute it and/or modify @@ -105,12 +105,12 @@ func (i info) ShortLicense() string { func (i info) Whole(startOfSentence bool) string { if i.gpl() { - return "go-ethereum" + return "go-expanse" } if startOfSentence { - return "The go-ethereum library" + return "The go-expanse library" } - return "the go-ethereum library" + return "the go-expanse library" } func (i info) gpl() bool { diff --git a/cmd/abigen/main.go b/cmd/abigen/main.go index f363913510..f25d353051 100644 --- a/cmd/abigen/main.go +++ b/cmd/abigen/main.go @@ -24,16 +24,16 @@ import ( "os" "strings" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common/compiler" + "github.com/expanse-project/go-expanse/accounts/abi/bind" + "github.com/expanse-project/go-expanse/common/compiler" ) var ( - abiFlag = flag.String("abi", "", "Path to the Ethereum contract ABI json to bind") - binFlag = flag.String("bin", "", "Path to the Ethereum contract bytecode (generate deploy method)") + abiFlag = flag.String("abi", "", "Path to the Expanse contract ABI json to bind") + binFlag = flag.String("bin", "", "Path to the Expanse contract bytecode (generate deploy method)") typFlag = flag.String("type", "", "Go struct name for the binding (default = package name)") - solFlag = flag.String("sol", "", "Path to the Ethereum contract Solidity source to build and bind") + solFlag = flag.String("sol", "", "Path to the Expanse contract Solidity source to build and bind") solcFlag = flag.String("solc", "solc", "Solidity compiler to use if source builds are requested") excFlag = flag.String("exc", "", "Comma separated types to exclude from binding") diff --git a/cmd/bootnode/main.go b/cmd/bootnode/main.go index 7d3f9fdb3f..b8e7984e8c 100644 --- a/cmd/bootnode/main.go +++ b/cmd/bootnode/main.go @@ -1,20 +1,20 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of go-ethereum. +// Copyright 2015 The go-expanse Authors +// This file is part of go-expanse. // -// go-ethereum is free software: you can redistribute it and/or modify +// go-expanse 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, +// go-expanse 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 . +// along with go-expanse. If not, see . -// bootnode runs a bootstrap node for the Ethereum Discovery Protocol. +// bootnode runs a bootstrap node for the Expanse Discovery Protocol. package main import ( @@ -22,16 +22,17 @@ import ( "flag" "os" - "github.com/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/p2p/discover" - "github.com/ethereum/go-ethereum/p2p/nat" + "github.com/expanse-project/go-expanse/cmd/utils" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/p2p/discover" + "github.com/expanse-project/go-expanse/p2p/nat" + ) func main() { var ( - listenAddr = flag.String("addr", ":30301", "listen address") + listenAddr = flag.String("addr", ":42787", "listen address") genKey = flag.String("genkey", "", "generate a node key and quit") nodeKeyFile = flag.String("nodekey", "", "private key filename") nodeKeyHex = flag.String("nodekeyhex", "", "private key as hex (for testing)") diff --git a/cmd/disasm/main.go b/cmd/disasm/main.go index ba1295ba1f..223747f049 100644 --- a/cmd/disasm/main.go +++ b/cmd/disasm/main.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of go-ethereum. +// Copyright 2015 The go-expanse Authors +// This file is part of go-expanse. // -// go-ethereum is free software: you can redistribute it and/or modify +// go-expanse 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, +// go-expanse 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 . +// along with go-expanse. If not, see . // disasm is a pretty-printer for EVM bytecode. package main @@ -22,8 +22,8 @@ import ( "io/ioutil" "os" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/vm" ) func main() { diff --git a/cmd/ethtest/.gitignore b/cmd/ethtest/.gitignore index 399b6dc882..6eeba6f0f0 100644 --- a/cmd/ethtest/.gitignore +++ b/cmd/ethtest/.gitignore @@ -10,7 +10,7 @@ *un~ .DS_Store */**/.DS_Store -ethereum/ethereum +expanse/expanse ethereal/ethereal example/js node_modules diff --git a/cmd/ethtest/main.go b/cmd/ethtest/main.go index d8f9696360..b1788b6af1 100644 --- a/cmd/ethtest/main.go +++ b/cmd/ethtest/main.go @@ -1,20 +1,20 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of go-ethereum. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of go-expanse. // -// go-ethereum is free software: you can redistribute it and/or modify +// go-expanse 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, +// go-expanse 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 . +// along with go-expanse. If not, see . -// ethtest executes Ethereum JSON tests. +// exptest executes Expanse JSON tests. package main import ( @@ -26,9 +26,9 @@ import ( "strings" "github.com/codegangsta/cli" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/tests" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/params" + "github.com/expanse-project/go-expanse/tests" ) var ( @@ -49,7 +49,7 @@ var ( Name: "file", Usage: "Test file or directory. Directories are searched for .json files 1 level deep", Value: defaultDir, - EnvVar: "ETHEREUM_TEST_PATH", + EnvVar: "EXPANSE_TEST_PATH", } ContinueOnErrorFlag = cli.BoolFlag{ Name: "continue", @@ -204,11 +204,11 @@ func main() { glog.SetToStderr(true) app := cli.NewApp() - app.Name = "ethtest" - app.Usage = "go-ethereum test interface" + app.Name = "exptest" + app.Usage = "go-expanse test interface" app.Action = setupApp app.Version = "0.2.0" - app.Author = "go-ethereum team" + app.Author = "go-expanse team" app.Flags = []cli.Flag{ TestFlag, diff --git a/cmd/evm/main.go b/cmd/evm/main.go index 7d9b3a6c33..3402785ab0 100644 --- a/cmd/evm/main.go +++ b/cmd/evm/main.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of go-ethereum. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of go-expanse. // -// go-ethereum is free software: you can redistribute it and/or modify +// go-expanse 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, +// go-expanse 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 . +// along with go-expanse. If not, see . // evm executes EVM code snippets. package main @@ -25,14 +25,14 @@ import ( "time" "github.com/codegangsta/cli" - "github.com/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/cmd/utils" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/logger/glog" ) var ( diff --git a/cmd/gethrpctest/main.go b/cmd/gethrpctest/main.go index 2e07e94260..e5a20e3a1a 100644 --- a/cmd/gethrpctest/main.go +++ b/cmd/gethrpctest/main.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with go-ethereum. If not, see . -// gethrpctest is a command to run the external RPC tests. +// gexprpctest is a command to run the external RPC tests. package main import ( @@ -24,17 +24,17 @@ import ( "os" "os/signal" - "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/eth" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/tests" - "github.com/ethereum/go-ethereum/whisper" + "github.com/expanse-project/go-expanse/accounts" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/eth" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/node" + "github.com/expanse-project/go-expanse/params" + "github.com/expanse-project/go-expanse/tests" + "github.com/expanse-project/go-expanse/whisper" ) const defaultTestKey = "b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291" @@ -98,10 +98,10 @@ func MakeSystemNode(keydir string, privkey string, test *tests.BlockTest) (*node IPCPath: node.DefaultIPCEndpoint(), HTTPHost: common.DefaultHTTPHost, HTTPPort: common.DefaultHTTPPort, - HTTPModules: []string{"admin", "db", "eth", "debug", "miner", "net", "shh", "txpool", "personal", "web3"}, + HTTPModules: []string{"admin", "db", "exp", "debug", "miner", "net", "shh", "txpool", "personal", "web3"}, WSHost: common.DefaultWSHost, WSPort: common.DefaultWSPort, - WSModules: []string{"admin", "db", "eth", "debug", "miner", "net", "shh", "txpool", "personal", "web3"}, + WSModules: []string{"admin", "db", "exp", "debug", "miner", "net", "shh", "txpool", "personal", "web3"}, NoDiscovery: true, }) if err != nil { @@ -122,18 +122,18 @@ func MakeSystemNode(keydir string, privkey string, test *tests.BlockTest) (*node return nil, err } } - // Initialize and register the Ethereum protocol + // Initialize and register the Expanse protocol db, _ := ethdb.NewMemDatabase() if _, err := test.InsertPreState(db); err != nil { return nil, err } - ethConf := ð.Config{ + ethConf := &exp.Config{ TestGenesisState: db, TestGenesisBlock: test.Genesis, ChainConfig: &core.ChainConfig{HomesteadBlock: params.MainNetHomesteadBlock}, AccountManager: accman, } - if err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) { return eth.New(ctx, ethConf) }); err != nil { + if err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) { return exp.New(ctx, ethConf) }); err != nil { return nil, err } // Initialize and register the Whisper protocol @@ -146,9 +146,9 @@ func MakeSystemNode(keydir string, privkey string, test *tests.BlockTest) (*node // RunTest executes the specified test against an already pre-configured protocol // stack to ensure basic checks pass before running RPC tests. func RunTest(stack *node.Node, test *tests.BlockTest) error { - var ethereum *eth.Ethereum - stack.Service(ðereum) - blockchain := ethereum.BlockChain() + var expanse *exp.Expanse + stack.Service(&expanse) + blockchain := expanse.BlockChain() // Process the blocks and verify the imported headers blocks, err := test.TryBlocksInsert(blockchain) diff --git a/cmd/geth/accountcmd.go b/cmd/gexp/accountcmd.go similarity index 93% rename from cmd/geth/accountcmd.go rename to cmd/gexp/accountcmd.go index bf754c72f1..f6a78c2ab0 100644 --- a/cmd/geth/accountcmd.go +++ b/cmd/gexp/accountcmd.go @@ -21,11 +21,11 @@ import ( "io/ioutil" "github.com/codegangsta/cli" - "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/accounts" + "github.com/expanse-project/go-expanse/cmd/utils" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" ) var ( @@ -36,7 +36,7 @@ var ( { Action: importWallet, Name: "import", - Usage: "import ethereum presale wallet", + Usage: "import expanse presale wallet", }, }, Description: ` @@ -71,7 +71,7 @@ Note that exporting your key in unencrypted format is NOT supported. Keys are stored under /keys. It is safe to transfer the entire directory or the individual keys therein -between ethereum nodes by simply copying. +between expanse nodes by simply copying. Make sure you backup your keys regularly. In order to use your account to send transactions, you need to unlock them using @@ -95,7 +95,7 @@ And finally. DO NOT FORGET YOUR PASSWORD. Usage: "create a new account", Description: ` - ethereum account new + expanse account new Creates a new account. Prints the address. @@ -105,7 +105,7 @@ You must remember this passphrase to unlock your account in the future. For non-interactive use the passphrase can be specified with the --password flag: - ethereum --password account new + expanse --password account new Note, this is meant to be used for testing only, it is a bad idea to save your password to file or expose in any other way. @@ -117,7 +117,7 @@ password to file or expose in any other way. Usage: "update an existing account", Description: ` - ethereum account update
+ expanse account update
Update an existing account. @@ -129,7 +129,7 @@ format to the newest format or change the password for an account. For non-interactive use the passphrase can be specified with the --password flag: - ethereum --password account update
+ expanse --password account update
Since only one password can be given, only format update can be performed, changing your password is only possible interactively. @@ -141,7 +141,7 @@ changing your password is only possible interactively. Usage: "import a private key into a new account", Description: ` - ethereum account import + expanse account import Imports an unencrypted private key from and creates a new account. Prints the address. @@ -154,10 +154,10 @@ You must remember this passphrase to unlock your account in the future. For non-interactive use the passphrase can be specified with the -password flag: - ethereum --password account import + expanse --password account import Note: -As you can directly copy your encrypted accounts to another ethereum instance, +As you can directly copy your encrypted accounts to another expanse instance, this import mechanism is not needed when you transfer an account between nodes. `, diff --git a/cmd/geth/accountcmd_test.go b/cmd/gexp/accountcmd_test.go similarity index 84% rename from cmd/geth/accountcmd_test.go rename to cmd/gexp/accountcmd_test.go index b6abde6d89..fea904ff35 100644 --- a/cmd/geth/accountcmd_test.go +++ b/cmd/gexp/accountcmd_test.go @@ -43,22 +43,22 @@ func tmpDatadirWithKeystore(t *testing.T) string { } func TestAccountListEmpty(t *testing.T) { - geth := runGeth(t, "account") - geth.expectExit() + gexp := runGexp(t, "account") + gexp.expectExit() } func TestAccountList(t *testing.T) { datadir := tmpDatadirWithKeystore(t) - geth := runGeth(t, "--datadir", datadir, "account") - defer geth.expectExit() + gexp := runGexp(t, "--datadir", datadir, "account") + defer gexp.expectExit() if runtime.GOOS == "windows" { - geth.expect(` + gexp.expect(` Account #0: {7ef5a6135f1fd6a02593eedc869c6d41d934aef8} {{.Datadir}}\keystore\UTC--2016-03-22T12-57-55.920751759Z--7ef5a6135f1fd6a02593eedc869c6d41d934aef8 Account #1: {f466859ead1932d743d622cb74fc058882e8648a} {{.Datadir}}\keystore\aaa Account #2: {289d485d9771714cce91d3393d764e1311907acc} {{.Datadir}}\keystore\zzz `) } else { - geth.expect(` + gexp.expect(` Account #0: {7ef5a6135f1fd6a02593eedc869c6d41d934aef8} {{.Datadir}}/keystore/UTC--2016-03-22T12-57-55.920751759Z--7ef5a6135f1fd6a02593eedc869c6d41d934aef8 Account #1: {f466859ead1932d743d622cb74fc058882e8648a} {{.Datadir}}/keystore/aaa Account #2: {289d485d9771714cce91d3393d764e1311907acc} {{.Datadir}}/keystore/zzz @@ -67,21 +67,21 @@ Account #2: {289d485d9771714cce91d3393d764e1311907acc} {{.Datadir}}/keystore/zzz } func TestAccountNew(t *testing.T) { - geth := runGeth(t, "--lightkdf", "account", "new") - defer geth.expectExit() - geth.expect(` + gexp := runGexp(t, "--lightkdf", "account", "new") + defer gexp.expectExit() + gexp.expect(` Your new account is locked with a password. Please give a password. Do not forget this password. !! Unsupported terminal, password will be echoed. Passphrase: {{.InputLine "foobar"}} Repeat passphrase: {{.InputLine "foobar"}} `) - geth.expectRegexp(`Address: \{[0-9a-f]{40}\}\n`) + gexp.expectRegexp(`Address: \{[0-9a-f]{40}\}\n`) } func TestAccountNewBadRepeat(t *testing.T) { - geth := runGeth(t, "--lightkdf", "account", "new") - defer geth.expectExit() - geth.expect(` + gexp := runGexp(t, "--lightkdf", "account", "new") + defer gexp.expectExit() + gexp.expect(` Your new account is locked with a password. Please give a password. Do not forget this password. !! Unsupported terminal, password will be echoed. Passphrase: {{.InputLine "something"}} @@ -92,11 +92,11 @@ Fatal: Passphrases do not match func TestAccountUpdate(t *testing.T) { datadir := tmpDatadirWithKeystore(t) - geth := runGeth(t, + gexp := runGexp(t, "--datadir", datadir, "--lightkdf", "account", "update", "f466859ead1932d743d622cb74fc058882e8648a") - defer geth.expectExit() - geth.expect(` + defer gexp.expectExit() + gexp.expect(` Unlocking account f466859ead1932d743d622cb74fc058882e8648a | Attempt 1/3 !! Unsupported terminal, password will be echoed. Passphrase: {{.InputLine "foobar"}} @@ -107,24 +107,24 @@ Repeat passphrase: {{.InputLine "foobar2"}} } func TestWalletImport(t *testing.T) { - geth := runGeth(t, "--lightkdf", "wallet", "import", "testdata/guswallet.json") - defer geth.expectExit() - geth.expect(` + gexp := runGexp(t, "--lightkdf", "wallet", "import", "testdata/guswallet.json") + defer gexp.expectExit() + gexp.expect(` !! Unsupported terminal, password will be echoed. Passphrase: {{.InputLine "foo"}} Address: {d4584b5f6229b7be90727b0fc8c6b91bb427821f} `) - files, err := ioutil.ReadDir(filepath.Join(geth.Datadir, "keystore")) + files, err := ioutil.ReadDir(filepath.Join(gexp.Datadir, "keystore")) if len(files) != 1 { t.Errorf("expected one key file in keystore directory, found %d files (error: %v)", len(files), err) } } func TestWalletImportBadPassword(t *testing.T) { - geth := runGeth(t, "--lightkdf", "wallet", "import", "testdata/guswallet.json") - defer geth.expectExit() - geth.expect(` + gexp := runGexp(t, "--lightkdf", "wallet", "import", "testdata/guswallet.json") + defer gexp.expectExit() + gexp.expect(` !! Unsupported terminal, password will be echoed. Passphrase: {{.InputLine "wrong"}} Fatal: could not decrypt key with given passphrase @@ -133,22 +133,22 @@ Fatal: could not decrypt key with given passphrase func TestUnlockFlag(t *testing.T) { datadir := tmpDatadirWithKeystore(t) - geth := runGeth(t, + gexp := runGexp(t, "--datadir", datadir, "--nat", "none", "--nodiscover", "--dev", "--unlock", "f466859ead1932d743d622cb74fc058882e8648a", "js", "testdata/empty.js") - geth.expect(` + gexp.expect(` Unlocking account f466859ead1932d743d622cb74fc058882e8648a | Attempt 1/3 !! Unsupported terminal, password will be echoed. Passphrase: {{.InputLine "foobar"}} `) - geth.expectExit() + gexp.expectExit() wantMessages := []string{ "Unlocked account f466859ead1932d743d622cb74fc058882e8648a", } for _, m := range wantMessages { - if strings.Index(geth.stderrText(), m) == -1 { + if strings.Index(gexp.stderrText(), m) == -1 { t.Errorf("stderr text does not contain %q", m) } } @@ -156,11 +156,11 @@ Passphrase: {{.InputLine "foobar"}} func TestUnlockFlagWrongPassword(t *testing.T) { datadir := tmpDatadirWithKeystore(t) - geth := runGeth(t, + gexp := runGexp(t, "--datadir", datadir, "--nat", "none", "--nodiscover", "--dev", "--unlock", "f466859ead1932d743d622cb74fc058882e8648a") - defer geth.expectExit() - geth.expect(` + defer gexp.expectExit() + gexp.expect(` Unlocking account f466859ead1932d743d622cb74fc058882e8648a | Attempt 1/3 !! Unsupported terminal, password will be echoed. Passphrase: {{.InputLine "wrong1"}} @@ -172,28 +172,28 @@ Fatal: Failed to unlock account f466859ead1932d743d622cb74fc058882e8648a (could `) } -// https://github.com/ethereum/go-ethereum/issues/1785 +// https://github.com/expanse-project/go-expanse/issues/1785 func TestUnlockFlagMultiIndex(t *testing.T) { datadir := tmpDatadirWithKeystore(t) - geth := runGeth(t, + gexp := runGexp(t, "--datadir", datadir, "--nat", "none", "--nodiscover", "--dev", "--unlock", "0,2", "js", "testdata/empty.js") - geth.expect(` + gexp.expect(` Unlocking account 0 | Attempt 1/3 !! Unsupported terminal, password will be echoed. Passphrase: {{.InputLine "foobar"}} Unlocking account 2 | Attempt 1/3 Passphrase: {{.InputLine "foobar"}} `) - geth.expectExit() + gexp.expectExit() wantMessages := []string{ "Unlocked account 7ef5a6135f1fd6a02593eedc869c6d41d934aef8", "Unlocked account 289d485d9771714cce91d3393d764e1311907acc", } for _, m := range wantMessages { - if strings.Index(geth.stderrText(), m) == -1 { + if strings.Index(gexp.stderrText(), m) == -1 { t.Errorf("stderr text does not contain %q", m) } } @@ -201,18 +201,18 @@ Passphrase: {{.InputLine "foobar"}} func TestUnlockFlagPasswordFile(t *testing.T) { datadir := tmpDatadirWithKeystore(t) - geth := runGeth(t, + gexp := runGexp(t, "--datadir", datadir, "--nat", "none", "--nodiscover", "--dev", "--password", "testdata/passwords.txt", "--unlock", "0,2", "js", "testdata/empty.js") - geth.expectExit() + gexp.expectExit() wantMessages := []string{ "Unlocked account 7ef5a6135f1fd6a02593eedc869c6d41d934aef8", "Unlocked account 289d485d9771714cce91d3393d764e1311907acc", } for _, m := range wantMessages { - if strings.Index(geth.stderrText(), m) == -1 { + if strings.Index(gexp.stderrText(), m) == -1 { t.Errorf("stderr text does not contain %q", m) } } @@ -220,29 +220,29 @@ func TestUnlockFlagPasswordFile(t *testing.T) { func TestUnlockFlagPasswordFileWrongPassword(t *testing.T) { datadir := tmpDatadirWithKeystore(t) - geth := runGeth(t, + gexp := runGexp(t, "--datadir", datadir, "--nat", "none", "--nodiscover", "--dev", "--password", "testdata/wrong-passwords.txt", "--unlock", "0,2") - defer geth.expectExit() - geth.expect(` + defer gexp.expectExit() + gexp.expect(` Fatal: Failed to unlock account 0 (could not decrypt key with given passphrase) `) } func TestUnlockFlagAmbiguous(t *testing.T) { store := filepath.Join("..", "..", "accounts", "testdata", "dupes") - geth := runGeth(t, + gexp := runGexp(t, "--keystore", store, "--nat", "none", "--nodiscover", "--dev", "--unlock", "f466859ead1932d743d622cb74fc058882e8648a", "js", "testdata/empty.js") - defer geth.expectExit() + defer gexp.expectExit() // Helper for the expect template, returns absolute keystore path. - geth.setTemplateFunc("keypath", func(file string) string { + gexp.setTemplateFunc("keypath", func(file string) string { abs, _ := filepath.Abs(filepath.Join(store, file)) return abs }) - geth.expect(` + gexp.expect(` Unlocking account f466859ead1932d743d622cb74fc058882e8648a | Attempt 1/3 !! Unsupported terminal, password will be echoed. Passphrase: {{.InputLine "foobar"}} @@ -254,13 +254,13 @@ Your passphrase unlocked {{keypath "1"}} In order to avoid this warning, you need to remove the following duplicate key files: {{keypath "2"}} `) - geth.expectExit() + gexp.expectExit() wantMessages := []string{ "Unlocked account f466859ead1932d743d622cb74fc058882e8648a", } for _, m := range wantMessages { - if strings.Index(geth.stderrText(), m) == -1 { + if strings.Index(gexp.stderrText(), m) == -1 { t.Errorf("stderr text does not contain %q", m) } } @@ -268,17 +268,17 @@ In order to avoid this warning, you need to remove the following duplicate key f func TestUnlockFlagAmbiguousWrongPassword(t *testing.T) { store := filepath.Join("..", "..", "accounts", "testdata", "dupes") - geth := runGeth(t, + gexp := runGexp(t, "--keystore", store, "--nat", "none", "--nodiscover", "--dev", "--unlock", "f466859ead1932d743d622cb74fc058882e8648a") - defer geth.expectExit() + defer gexp.expectExit() // Helper for the expect template, returns absolute keystore path. - geth.setTemplateFunc("keypath", func(file string) string { + gexp.setTemplateFunc("keypath", func(file string) string { abs, _ := filepath.Abs(filepath.Join(store, file)) return abs }) - geth.expect(` + gexp.expect(` Unlocking account f466859ead1932d743d622cb74fc058882e8648a | Attempt 1/3 !! Unsupported terminal, password will be echoed. Passphrase: {{.InputLine "wrong"}} @@ -288,5 +288,5 @@ Multiple key files exist for address f466859ead1932d743d622cb74fc058882e8648a: Testing your passphrase against all of them... Fatal: None of the listed files could be unlocked. `) - geth.expectExit() + gexp.expectExit() } diff --git a/cmd/geth/chaincmd.go b/cmd/gexp/chaincmd.go similarity index 88% rename from cmd/geth/chaincmd.go rename to cmd/gexp/chaincmd.go index 32eacc99ee..62645793b8 100644 --- a/cmd/geth/chaincmd.go +++ b/cmd/gexp/chaincmd.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of go-ethereum. +// Copyright 2015 The go-expanse Authors +// This file is part of go-expanse. // -// go-ethereum is free software: you can redistribute it and/or modify +// go-expanse 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, +// go-expanse 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 . +// along with go-expanse. If not, see . package main @@ -24,13 +24,14 @@ import ( "time" "github.com/codegangsta/cli" - "github.com/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/logger/glog" + + "github.com/expanse-project/go-expanse/cmd/utils" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/logger/glog" ) var ( @@ -66,7 +67,7 @@ if already existing. Usage: `dump a specific block from storage`, Description: ` The arguments are interpreted as block numbers or hashes. -Use "ethereum dump 0" to dump the genesis block. +Use "expanse dump 0" to dump the genesis block. `, } ) diff --git a/cmd/geth/info_test.json b/cmd/gexp/info_test.json similarity index 100% rename from cmd/geth/info_test.json rename to cmd/gexp/info_test.json diff --git a/cmd/geth/js.go b/cmd/gexp/js.go similarity index 87% rename from cmd/geth/js.go rename to cmd/gexp/js.go index 2b64303b2b..df34b3e029 100644 --- a/cmd/geth/js.go +++ b/cmd/gexp/js.go @@ -1,18 +1,19 @@ // Copyright 2015 The go-ethereum Authors -// This file is part of go-ethereum. +// Copyright 2015 go-expanse Authors +// This file is part of go-expanse. // -// go-ethereum is free software: you can redistribute it and/or modify +// go-expanse 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, +// go-expanse 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 . +// along with go-expanse. If not, see . package main @@ -27,15 +28,15 @@ import ( "strings" "github.com/codegangsta/cli" - "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/registrar" - "github.com/ethereum/go-ethereum/eth" - "github.com/ethereum/go-ethereum/internal/web3ext" - re "github.com/ethereum/go-ethereum/jsre" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/rpc" + "github.com/expanse-project/go-expanse/accounts" + "github.com/expanse-project/go-expanse/cmd/utils" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/common/registrar" + "github.com/expanse-project/go-expanse/exp" + "github.com/expanse-project/go-expanse/internal/web3ext" + re "github.com/expanse-project/go-expanse/jsre" + "github.com/expanse-project/go-expanse/node" + "github.com/expanse-project/go-expanse/rpc" "github.com/peterh/liner" "github.com/robertkrimen/otto" ) @@ -62,7 +63,7 @@ func makeCompleter(re *jsre) liner.WordCompleter { if len(line) == 0 || pos == 0 { return "", nil, "" } - // chuck data to relevant part for autocompletion, e.g. in case of nested lines eth.getBalance(eth.coinb + // chuck data to relevant part for autocompletion, e.g. in case of nested lines exp.getBalance(exp.coinb i := 0 for i = pos - 1; i > 0; i-- { if line[i] == '.' || (line[i] >= 'a' && line[i] <= 'z') || (line[i] >= 'A' && line[i] <= 'Z') { @@ -133,14 +134,14 @@ func (self *jsre) batch(statement string) { self.re.Stop(false) } -// show summary of current geth instance +// show summary of current gexp instance func (self *jsre) welcome() { self.re.Run(` (function () { console.log('instance: ' + web3.version.node); - console.log("coinbase: " + eth.coinbase); - var ts = 1000 * eth.getBlock(eth.blockNumber).timestamp; - console.log("at block: " + eth.blockNumber + " (" + new Date(ts) + ")"); + console.log("coinbase: " + exp.coinbase); + var ts = 1000 * exp.getBlock(exp.blockNumber).timestamp; + console.log("at block: " + exp.blockNumber + " (" + new Date(ts) + ")"); console.log(' datadir: ' + admin.datadir); })(); `) @@ -197,7 +198,7 @@ func (js *jsre) apiBindings() error { } // load only supported API's in javascript runtime - shortcuts := "var eth = web3.eth; var personal = web3.personal; " + shortcuts := "var exp = web3.exp; var personal = web3.personal; " for _, apiName := range apiNames { if apiName == "web3" || apiName == "rpc" { continue // manually mapped or ignore @@ -217,7 +218,7 @@ func (js *jsre) apiBindings() error { utils.Fatalf("Error setting namespaces: %v", err) } - js.re.Run(`var GlobalRegistrar = eth.contract(` + registrar.GlobalRegistrarAbi + `); registrar = GlobalRegistrar.at("` + registrar.GlobalRegistrarAddr + `");`) + js.re.Run(`var GlobalRegistrar = exp.contract(` + registrar.GlobalRegistrarAbi + `); registrar = GlobalRegistrar.at("` + registrar.GlobalRegistrarAddr + `");`) // overrule some of the methods that require password as input and ask for it interactively p, err := js.re.Get("personal") @@ -257,14 +258,14 @@ func (self *jsre) AskPassword() (string, bool) { } func (self *jsre) ConfirmTransaction(tx string) bool { - // Retrieve the Ethereum instance from the node - var ethereum *eth.Ethereum - if err := self.stack.Service(ðereum); err != nil { + // Retrieve the Expanse instance from the node + var expanse *exp.Expanse + if err := self.stack.Service(&expanse); err != nil { return false } // If natspec is enabled, ask for permission - if ethereum.NatSpec && false /* disabled for now */ { - // notice := natspec.GetNotice(self.xeth, tx, ethereum.HTTPClient()) + if expanse.NatSpec && false /* disabled for now */ { + // notice := natspec.GetNotice(self.xeth, tx, expanse.HTTPClient()) // fmt.Println(notice) // answer, _ := self.Prompt("Confirm Transaction [y/n]") // return strings.HasPrefix(strings.Trim(answer, " "), "y") @@ -279,12 +280,12 @@ func (self *jsre) UnlockAccount(addr []byte) bool { return false } // TODO: allow retry - var ethereum *eth.Ethereum - if err := self.stack.Service(ðereum); err != nil { + var expanse *exp.Expanse + if err := self.stack.Service(&expanse); err != nil { return false } a := accounts.Account{Address: common.BytesToAddress(addr)} - if err := ethereum.AccountManager().Unlock(a, pass); err != nil { + if err := expanse.AccountManager().Unlock(a, pass); err != nil { return false } else { fmt.Println("Account is now unlocked for this session.") @@ -377,6 +378,7 @@ func mustLogInHistory(input string) bool { !leadingSpace.MatchString(input) } + func (self *jsre) withHistory(datadir string, op func(*os.File)) { hist, err := os.OpenFile(filepath.Join(datadir, "history"), os.O_RDWR|os.O_CREATE, os.ModePerm) if err != nil { diff --git a/cmd/geth/js_test.go b/cmd/gexp/js_test.go similarity index 82% rename from cmd/geth/js_test.go rename to cmd/gexp/js_test.go index ddfe0d4000..e648b9dc25 100644 --- a/cmd/geth/js_test.go +++ b/cmd/gexp/js_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of go-ethereum. +// Copyright 2015 The go-expanse Authors +// This file is part of go-expanse. // -// go-ethereum is free software: you can redistribute it and/or modify +// go-expanse 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, +// go-expanse 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 . +// along with go-expanse. If not, see . package main @@ -28,15 +28,16 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/compiler" - "github.com/ethereum/go-ethereum/common/httpclient" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/eth" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/node" + "github.com/expanse-project/go-expanse/accounts" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/common/compiler" + "github.com/expanse-project/go-expanse/common/httpclient" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/eth" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/node" + ) const ( @@ -63,10 +64,10 @@ type testjethre struct { // Temporary disabled while natspec hasn't been migrated //func (self *testjethre) ConfirmTransaction(tx string) bool { -// var ethereum *eth.Ethereum -// self.stack.Service(ðereum) +// var expanse *exp.Expanse +// self.stack.Service(&expanse) // -// if ethereum.NatSpec { +// if expanse.NatSpec { // self.lastConfirm = natspec.GetNotice(self.xeth, tx, self.client) // } // return true @@ -76,8 +77,9 @@ func testJEthRE(t *testing.T) (string, *testjethre, *node.Node) { return testREPL(t, nil) } -func testREPL(t *testing.T, config func(*eth.Config)) (string, *testjethre, *node.Node) { - tmp, err := ioutil.TempDir("", "geth-test") +func testREPL(t *testing.T, config func(*exp.Config)) (string, *testjethre, *node.Node) { + tmp, err := ioutil.TempDir("", "gexp-test") + if err != nil { t.Fatal(err) } @@ -86,28 +88,30 @@ func testREPL(t *testing.T, config func(*eth.Config)) (string, *testjethre, *nod if err != nil { t.Fatalf("failed to create node: %v", err) } - // Initialize and register the Ethereum protocol + // Initialize and register the Expanse protocol accman := accounts.NewPlaintextManager(filepath.Join(tmp, "keystore")) db, _ := ethdb.NewMemDatabase() core.WriteGenesisBlockForTesting(db, core.GenesisAccount{ Address: common.HexToAddress(testAddress), Balance: common.String2Big(testBalance), }) - ethConf := ð.Config{ + ethConf := &exp.Config{ ChainConfig: &core.ChainConfig{HomesteadBlock: new(big.Int)}, TestGenesisState: db, AccountManager: accman, DocRoot: "/", SolcPath: testSolcPath, PowTest: true, + } if config != nil { config(ethConf) } + if err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) { - return eth.New(ctx, ethConf) + return exp.New(ctx, ethConf) }); err != nil { - t.Fatalf("failed to register ethereum protocol: %v", err) + t.Fatalf("failed to register expanse protocol: %v", err) } // Initialize all the keys for testing a, err := accman.ImportECDSA(testAccount, "") @@ -121,15 +125,15 @@ func testREPL(t *testing.T, config func(*eth.Config)) (string, *testjethre, *nod if err := stack.Start(); err != nil { t.Fatalf("failed to start test stack: %v", err) } - var ethereum *eth.Ethereum - stack.Service(ðereum) + var expanse *exp.Expanse + stack.Service(&expanse) - assetPath := filepath.Join(os.Getenv("GOPATH"), "src", "github.com", "ethereum", "go-ethereum", "cmd", "mist", "assets", "ext") + assetPath := filepath.Join(os.Getenv("GOPATH"), "src", "github.com", "expanse", "go-expanse", "cmd", "mist", "assets", "ext") client, err := stack.Attach() if err != nil { t.Fatalf("failed to attach to node: %v", err) } - tf := &testjethre{client: ethereum.HTTPClient()} + tf := &testjethre{client: expanse.HTTPClient()} repl := newJSRE(stack, assetPath, "", client, false) tf.jsre = repl return tmp, tf, stack @@ -137,8 +141,8 @@ func testREPL(t *testing.T, config func(*eth.Config)) (string, *testjethre, *nod func TestNodeInfo(t *testing.T) { t.Skip("broken after p2p update") - tmp, repl, ethereum := testJEthRE(t) - defer ethereum.Stop() + tmp, repl, expanse := testJEthRE(t) + defer expanse.Stop() defer os.RemoveAll(tmp) want := `{"DiscPort":0,"IP":"0.0.0.0","ListenAddr":"","Name":"test","NodeID":"4cb2fc32924e94277bf94b5e4c983beedb2eabd5a0bc941db32202735c6625d020ca14a5963d1738af43b6ac0a711d61b1a06de931a499fe2aa0b1a132a902b5","NodeUrl":"enode://4cb2fc32924e94277bf94b5e4c983beedb2eabd5a0bc941db32202735c6625d020ca14a5963d1738af43b6ac0a711d61b1a06de931a499fe2aa0b1a132a902b5@0.0.0.0:0","TCPPort":0,"Td":"131072"}` @@ -150,9 +154,9 @@ func TestAccounts(t *testing.T) { defer node.Stop() defer os.RemoveAll(tmp) - checkEvalJSON(t, repl, `eth.accounts`, `["`+testAddress+`"]`) - checkEvalJSON(t, repl, `eth.coinbase`, `"`+testAddress+`"`) - val, err := repl.re.Run(`jeth.newAccount("password")`) + checkEvalJSON(t, repl, `exp.accounts`, `["`+testAddress+`"]`) + checkEvalJSON(t, repl, `exp.coinbase`, `"`+testAddress+`"`) + val, err := repl.re.Run(`jexp.newAccount("password")`) if err != nil { t.Errorf("expected no error, got %v", err) } @@ -161,7 +165,7 @@ func TestAccounts(t *testing.T) { t.Errorf("address not hex: %q", addr) } - checkEvalJSON(t, repl, `eth.accounts`, `["`+testAddress+`","`+addr+`"]`) + checkEvalJSON(t, repl, `exp.accounts`, `["`+testAddress+`","`+addr+`"]`) } @@ -170,14 +174,14 @@ func TestBlockChain(t *testing.T) { defer node.Stop() defer os.RemoveAll(tmp) // get current block dump before export/import. - val, err := repl.re.Run("JSON.stringify(debug.dumpBlock(eth.blockNumber))") + val, err := repl.re.Run("JSON.stringify(debug.dumpBlock(exp.blockNumber))") if err != nil { t.Errorf("expected no error, got %v", err) } beforeExport := val.String() // do the export - extmp, err := ioutil.TempDir("", "geth-test-export") + extmp, err := ioutil.TempDir("", "gexp-test-export") if err != nil { t.Fatal(err) } @@ -185,9 +189,9 @@ func TestBlockChain(t *testing.T) { tmpfile := filepath.Join(extmp, "export.chain") tmpfileq := strconv.Quote(tmpfile) - var ethereum *eth.Ethereum - node.Service(ðereum) - ethereum.BlockChain().Reset() + var expanse *exp.Expanse + node.Service(&expanse) + expanse.BlockChain().Reset() checkEvalJSON(t, repl, `admin.exportChain(`+tmpfileq+`)`, `true`) if _, err := os.Stat(tmpfile); err != nil { @@ -196,14 +200,14 @@ func TestBlockChain(t *testing.T) { // check import, verify that dumpBlock gives the same result. checkEvalJSON(t, repl, `admin.importChain(`+tmpfileq+`)`, `true`) - checkEvalJSON(t, repl, `debug.dumpBlock(eth.blockNumber)`, beforeExport) + checkEvalJSON(t, repl, `debug.dumpBlock(exp.blockNumber)`, beforeExport) } func TestMining(t *testing.T) { tmp, repl, node := testJEthRE(t) defer node.Stop() defer os.RemoveAll(tmp) - checkEvalJSON(t, repl, `eth.mining`, `false`) + checkEvalJSON(t, repl, `exp.mining`, `false`) } func TestRPC(t *testing.T) { @@ -211,7 +215,7 @@ func TestRPC(t *testing.T) { defer node.Stop() defer os.RemoveAll(tmp) - checkEvalJSON(t, repl, `admin.startRPC("127.0.0.1", 5004, "*", "web3,eth,net")`, `true`) + checkEvalJSON(t, repl, `admin.startRPC("127.0.0.1", 5004, "*", "web3,exp,net")`, `true`) } func TestCheckTestAccountBalance(t *testing.T) { @@ -223,7 +227,7 @@ func TestCheckTestAccountBalance(t *testing.T) { defer os.RemoveAll(tmp) repl.re.Run(`primary = "` + testAddress + `"`) - checkEvalJSON(t, repl, `eth.getBalance(primary)`, `"`+testBalance+`"`) + checkEvalJSON(t, repl, `exp.getBalance(primary)`, `"`+testBalance+`"`) } func TestSignature(t *testing.T) { @@ -231,7 +235,7 @@ func TestSignature(t *testing.T) { defer node.Stop() defer os.RemoveAll(tmp) - val, err := repl.re.Run(`eth.sign("` + testAddress + `", "` + testHash + `")`) + val, err := repl.re.Run(`exp.sign("` + testAddress + `", "` + testHash + `")`) // This is a very preliminary test, lacking actual signature verification if err != nil { @@ -251,15 +255,15 @@ func TestSignature(t *testing.T) { func TestContract(t *testing.T) { t.Skip("contract testing is implemented with mining in ethash test mode. This takes about 7seconds to run. Unskip and run on demand") coinbase := common.HexToAddress(testAddress) - tmp, repl, ethereum := testREPL(t, func(conf *eth.Config) { + tmp, repl, expanse := testREPL(t, func(conf *exp.Config) { conf.Etherbase = coinbase conf.PowTest = true }) - if err := ethereum.Start(); err != nil { - t.Errorf("error starting ethereum: %v", err) + if err := expanse.Start(); err != nil { + t.Errorf("error starting expanse: %v", err) return } - defer ethereum.Stop() + defer expanse.Stop() defer os.RemoveAll(tmp) // Temporary disabled while registrar isn't migrated @@ -298,7 +302,7 @@ func TestContract(t *testing.T) { if err != nil { t.Fatalf("%v", err) } - if checkEvalJSON(t, repl, `primary = eth.accounts[0]`, `"`+testAddress+`"`) != nil { + if checkEvalJSON(t, repl, `primary = exp.accounts[0]`, `"`+testAddress+`"`) != nil { return } if checkEvalJSON(t, repl, `source = "`+source+`"`, `"`+source+`"`) != nil { @@ -323,7 +327,7 @@ func TestContract(t *testing.T) { t.Errorf("%v", err) } } else { - if checkEvalJSON(t, repl, `contract = eth.compile.solidity(source).test`, string(contractInfo)) != nil { + if checkEvalJSON(t, repl, `contract = exp.compile.solidity(source).test`, string(contractInfo)) != nil { return } } @@ -334,7 +338,7 @@ func TestContract(t *testing.T) { if checkEvalJSON( t, repl, - `contractaddress = eth.sendTransaction({from: primary, data: contract.code})`, + `contractaddress = exp.sendTransaction({from: primary, data: contract.code})`, `"0x46d69d55c3c4b86a924a92c9fc4720bb7bce1d74"`, ) != nil { return @@ -345,7 +349,7 @@ func TestContract(t *testing.T) { } callSetup := `abiDef = JSON.parse('[{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"type":"function"}]'); -Multiply7 = eth.contract(abiDef); +Multiply7 = exp.contract(abiDef); multiply7 = Multiply7.at(contractaddress); ` _, err = repl.re.Run(callSetup) @@ -420,10 +424,10 @@ multiply7 = Multiply7.at(contractaddress); } func pendingTransactions(repl *testjethre, t *testing.T) (txc int64, err error) { - var ethereum *eth.Ethereum - repl.stack.Service(ðereum) + var expanse *exp.Expanse + repl.stack.Service(&expanse) - txs := ethereum.TxPool().GetTransactions() + txs := expanse.TxPool().GetTransactions() return int64(len(txs)), nil } @@ -448,18 +452,18 @@ func processTxs(repl *testjethre, t *testing.T, expTxc int) bool { t.Errorf("incorrect number of pending transactions, expected %v, got %v", expTxc, txc) return false } - var ethereum *eth.Ethereum - repl.stack.Service(ðereum) + var expanse *exp.Expanse + repl.stack.Service(&expanse) - err = ethereum.StartMining(runtime.NumCPU(), "") + err = expanse.StartMining(runtime.NumCPU(), "") if err != nil { t.Errorf("unexpected error mining: %v", err) return false } - defer ethereum.StopMining() + defer expanse.StopMining() timer := time.NewTimer(100 * time.Second) - blockNr := ethereum.BlockChain().CurrentBlock().Number() + blockNr := expanse.BlockChain().CurrentBlock().Number() height := new(big.Int).Add(blockNr, big.NewInt(1)) repl.wait <- height select { diff --git a/cmd/geth/library.c b/cmd/gexp/library.c similarity index 100% rename from cmd/geth/library.c rename to cmd/gexp/library.c diff --git a/cmd/geth/library.go b/cmd/gexp/library.go similarity index 84% rename from cmd/geth/library.go rename to cmd/gexp/library.go index b8ffaaed77..56e5320504 100644 --- a/cmd/geth/library.go +++ b/cmd/gexp/library.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with go-ethereum. If not, see . -// Contains a simple library definition to allow creating a Geth instance from +// Contains a simple library definition to allow creating a Gexp instance from // straight C code. package main @@ -37,8 +37,8 @@ import ( //export doRun func doRun(args *C.char) C.int { - // This is equivalent to geth.main, just modified to handle the function arg passing - if err := app.Run(strings.Split("geth "+C.GoString(args), " ")); err != nil { + // This is equivalent to gexp.main, just modified to handle the function arg passing + if err := app.Run(strings.Split("gexp "+C.GoString(args), " ")); err != nil { fmt.Fprintln(os.Stderr, err) return -1 } diff --git a/cmd/geth/library_android.go b/cmd/gexp/library_android.go similarity index 96% rename from cmd/geth/library_android.go rename to cmd/gexp/library_android.go index fb021bfe00..091a04cba3 100644 --- a/cmd/geth/library_android.go +++ b/cmd/gexp/library_android.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with go-ethereum. If not, see . -// Contains specialized code for running Geth on Android. +// Contains specialized code for running Gexp on Android. package main diff --git a/cmd/geth/main.go b/cmd/gexp/main.go similarity index 79% rename from cmd/geth/main.go rename to cmd/gexp/main.go index 5a2fc62873..241bda220b 100644 --- a/cmd/geth/main.go +++ b/cmd/gexp/main.go @@ -1,20 +1,20 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of go-ethereum. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of go-expanse. // -// go-ethereum is free software: you can redistribute it and/or modify +// go-expanse 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, +// go-expanse 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 . +// along with go-expanse. If not, see . -// geth is the official command-line client for Ethereum. +// gexp is the official command-line client for Expanse. package main import ( @@ -30,30 +30,29 @@ import ( "time" "github.com/codegangsta/cli" - "github.com/ethereum/ethash" - "github.com/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/eth" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/internal/debug" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/release" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/ethash" + "github.com/expanse-project/go-expanse/cmd/utils" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/exp" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/internal/debug" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/metrics" + "github.com/expanse-project/go-expanse/node" + "github.com/expanse-project/go-expanse/params" + "github.com/expanse-project/go-expanse/release" + "github.com/expanse-project/go-expanse/rlp" ) const ( - clientIdentifier = "Geth" // Client identifier to advertise over the network + clientIdentifier = "Gexp" // Client identifier to advertise over the network versionMajor = 1 // Major version component of the current release versionMinor = 4 // Minor version component of the current release versionPatch = 4 // Patch version component of the current release versionMeta = "stable" // Version metadata to append to the version string - - versionOracle = "0xfa7b9770ca4cb04296cac84f37736d4041251cdf" // Ethereum address of the Geth release oracle + versionOracle = "0x926d69cc3bbf81d52cba6886d788df007a15a3cd" // Expanse address of the Gexp release oracle ) var ( @@ -82,9 +81,9 @@ func init() { commit, _ := hex.DecodeString(gitCommit) copy(relConfig.Commit[:], commit) - // Initialize the CLI app and start Geth - app = utils.NewApp(verString, "the go-ethereum command line interface") - app.Action = geth + // Initialize the CLI app and start Gexp + app = utils.NewApp(verString, "the go-expanse command line interface") + app.Action = gexp app.HideVersion = true // we have a command to print the version app.Commands = []cli.Command{ importCommand, @@ -125,7 +124,7 @@ Runs quick benchmark on first GPU found. { Action: version, Name: "version", - Usage: "print ethereum version numbers", + Usage: "print expanse version numbers", Description: ` The output of this command is supposed to be machine-readable. `, @@ -143,31 +142,31 @@ participating. { Action: console, Name: "console", - Usage: `Geth Console: interactive JavaScript environment`, + Usage: `Gexp Console: interactive JavaScript environment`, Description: ` -The Geth console is an interactive shell for the JavaScript runtime environment +The Gexp console is an interactive shell for the JavaScript runtime environment which exposes a node admin interface as well as the Ðapp JavaScript API. -See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Console +See https://github.com/expanse-project/go-expanse/wiki/Javascipt-Console `, }, { Action: attach, Name: "attach", - Usage: `Geth Console: interactive JavaScript environment (connect to node)`, + Usage: `Gexp Console: interactive JavaScript environment (connect to node)`, Description: ` - The Geth console is an interactive shell for the JavaScript runtime environment + The Gexp console is an interactive shell for the JavaScript runtime environment which exposes a node admin interface as well as the Ðapp JavaScript API. - See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Console. - This command allows to open a console on a running geth node. + See https://github.com/expanse-project/go-expanse/wiki/Javascipt-Console. + This command allows to open a console on a running gexp node. `, }, { Action: execScripts, Name: "js", - Usage: `executes the given JavaScript files in the Geth JavaScript VM`, + Usage: `executes the given JavaScript files in the Gexp JavaScript VM`, Description: ` The JavaScript VM exposes a node admin interface as well as the Ðapp -JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Console +JavaScript API. See https://github.com/expanse-project/go-expanse/wiki/Javascipt-Console `, }, } @@ -248,7 +247,7 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Conso // Deprecation warning. if ctx.GlobalIsSet(utils.GenesisFileFlag.Name) { - common.PrintDepricationWarning("--genesis is deprecated. Switch to use 'geth init /path/to/file'") + common.PrintDepricationWarning("--genesis is deprecated. Switch to use 'gexp init /path/to/file'") } return nil @@ -289,21 +288,21 @@ func makeDefaultExtra() []byte { return extra } -// geth is the main entry point into the system if no special subcommand is ran. +// gexp is the main entry point into the system if no special subcommand is ran. // It creates a default node based on the command line arguments and runs it in // blocking mode, waiting for it to be shut down. -func geth(ctx *cli.Context) { +func gexp(ctx *cli.Context) { node := utils.MakeSystemNode(clientIdentifier, verString, relConfig, makeDefaultExtra(), ctx) startNode(ctx, node) node.Wait() } -// attach will connect to a running geth instance attaching a JavaScript console and to it. +// attach will connect to a running gexp instance attaching a JavaScript console and to it. func attach(ctx *cli.Context) { - // attach to a running geth instance + // attach to a running gexp instance client, err := utils.NewRemoteRPCClient(ctx) if err != nil { - utils.Fatalf("Unable to attach to geth: %v", err) + utils.Fatalf("Unable to attach to gexp: %v", err) } repl := newLightweightJSRE( @@ -319,7 +318,6 @@ func attach(ctx *cli.Context) { utils.Fatalf("unable to preload JS file %v", err) } - // in case the exec flag holds a JS statement execute it and return if ctx.GlobalString(utils.ExecFlag.Name) != "" { repl.batch(ctx.GlobalString(utils.ExecFlag.Name)) } else { @@ -353,7 +351,7 @@ func initGenesis(ctx *cli.Context) { glog.V(logger.Info).Infof("successfully wrote genesis block and/or chain rule set: %x", block.Hash()) } -// console starts a new geth node, attaching a JavaScript console to it at the +// console starts a new gexp node, attaching a JavaScript console to it at the // same time. func console(ctx *cli.Context) { // Create and start the node based on the CLI flags @@ -363,7 +361,7 @@ func console(ctx *cli.Context) { // Attach to the newly started node, and either execute script or become interactive client, err := node.Attach() if err != nil { - utils.Fatalf("Failed to attach to the inproc geth: %v", err) + utils.Fatalf("Failed to attach to the inproc gexp: %v", err) } repl := newJSRE(node, ctx.GlobalString(utils.JSpathFlag.Name), @@ -386,7 +384,7 @@ func console(ctx *cli.Context) { node.Stop() } -// execScripts starts a new geth node based on the CLI flags, and executes each +// execScripts starts a new gexp node based on the CLI flags, and executes each // of the JavaScript files specified as command arguments. func execScripts(ctx *cli.Context) { // Create and start the node based on the CLI flags @@ -397,7 +395,7 @@ func execScripts(ctx *cli.Context) { // Attach to the newly started node and execute the given scripts client, err := node.Attach() if err != nil { - utils.Fatalf("Failed to attach to the inproc geth: %v", err) + utils.Fatalf("Failed to attach to the inproc gexp: %v", err) } repl := newJSRE(node, ctx.GlobalString(utils.JSpathFlag.Name), @@ -432,11 +430,11 @@ func startNode(ctx *cli.Context, stack *node.Node) { utils.StartNode(stack) // Unlock any account specifically requested - var ethereum *eth.Ethereum - if err := stack.Service(ðereum); err != nil { + var expanse *exp.Expanse + if err := stack.Service(&expanse); err != nil { utils.Fatalf("ethereum service not running: %v", err) } - accman := ethereum.AccountManager() + accman := expanse.AccountManager() passwords := utils.MakePasswordList(ctx) accounts := strings.Split(ctx.GlobalString(utils.UnlockedAccountFlag.Name), ",") @@ -447,7 +445,7 @@ func startNode(ctx *cli.Context, stack *node.Node) { } // Start auxiliary services if enabled if ctx.GlobalBool(utils.MiningEnabledFlag.Name) { - if err := ethereum.StartMining(ctx.GlobalInt(utils.MinerThreadsFlag.Name), ctx.GlobalString(utils.MiningGPUFlag.Name)); err != nil { + if err := expanse.StartMining(ctx.GlobalInt(utils.MinerThreadsFlag.Name), ctx.GlobalString(utils.MiningGPUFlag.Name)); err != nil { utils.Fatalf("Failed to start mining: %v", err) } } @@ -456,7 +454,7 @@ func startNode(ctx *cli.Context, stack *node.Node) { func makedag(ctx *cli.Context) { args := ctx.Args() wrongArgs := func() { - utils.Fatalf(`Usage: geth makedag `) + utils.Fatalf(`Usage: gexp makedag `) } switch { case len(args) == 2: @@ -483,13 +481,13 @@ func makedag(ctx *cli.Context) { } func gpuinfo(ctx *cli.Context) { - eth.PrintOpenCLDevices() + exp.PrintOpenCLDevices() } func gpubench(ctx *cli.Context) { args := ctx.Args() wrongArgs := func() { - utils.Fatalf(`Usage: geth gpubench `) + utils.Fatalf(`Usage: gexp gpubench `) } switch { case len(args) == 1: @@ -497,9 +495,9 @@ func gpubench(ctx *cli.Context) { if err != nil { wrongArgs() } - eth.GPUBench(n) + exp.GPUBench(n) case len(args) == 0: - eth.GPUBench(0) + exp.GPUBench(0) default: wrongArgs() } @@ -508,7 +506,7 @@ func gpubench(ctx *cli.Context) { func version(c *cli.Context) { fmt.Println(clientIdentifier) fmt.Println("Version:", verString) - fmt.Println("Protocol Versions:", eth.ProtocolVersions) + fmt.Println("Protocol Versions:", exp.ProtocolVersions) fmt.Println("Network Id:", c.GlobalInt(utils.NetworkIdFlag.Name)) fmt.Println("Go Version:", runtime.Version()) fmt.Println("OS:", runtime.GOOS) diff --git a/cmd/geth/monitorcmd.go b/cmd/gexp/monitorcmd.go similarity index 93% rename from cmd/geth/monitorcmd.go rename to cmd/gexp/monitorcmd.go index 5d839b5a37..cd2ff775b8 100644 --- a/cmd/geth/monitorcmd.go +++ b/cmd/gexp/monitorcmd.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of go-ethereum. +// Copyright 2015 The go-expanse Authors +// This file is part of go-expanse. // -// go-ethereum is free software: you can redistribute it and/or modify +// go-expanse 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, +// go-expanse 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 . +// along with go-expanse. If not, see . package main @@ -27,9 +27,9 @@ import ( "sort" "github.com/codegangsta/cli" - "github.com/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/rpc" + "github.com/expanse-project/go-expanse/cmd/utils" + "github.com/expanse-project/go-expanse/node" + "github.com/expanse-project/go-expanse/rpc" "github.com/gizak/termui" ) @@ -52,9 +52,9 @@ var ( monitorCommand = cli.Command{ Action: monitor, Name: "monitor", - Usage: `Geth Monitor: node metrics monitoring and visualization`, + Usage: `Gexp Monitor: node metrics monitoring and visualization`, Description: ` -The Geth monitor is a tool to collect and visualize various internal metrics +The Gexp monitor is a tool to collect and visualize various internal metrics gathered by the node, supporting different chart types as well as the capacity to display multiple metrics simultaneously. `, @@ -72,10 +72,10 @@ func monitor(ctx *cli.Context) { client rpc.Client err error ) - // Attach to an Ethereum node over IPC or RPC + // Attach to an Expanse node over IPC or RPC endpoint := ctx.String(monitorCommandAttachFlag.Name) if client, err = utils.NewRemoteRPCClientFromString(endpoint); err != nil { - utils.Fatalf("Unable to attach to geth node: %v", err) + utils.Fatalf("Unable to attach to gexp node: %v", err) } defer client.Close() @@ -92,7 +92,7 @@ func monitor(ctx *cli.Context) { if len(list) > 0 { utils.Fatalf("No metrics specified.\n\nAvailable:\n - %s", strings.Join(list, "\n - ")) } else { - utils.Fatalf("No metrics collected by geth (--%s).\n", utils.MetricsEnabledFlag.Name) + utils.Fatalf("No metrics collected by gexp (--%s).\n", utils.MetricsEnabledFlag.Name) } } sort.Strings(monitored) @@ -156,7 +156,7 @@ func monitor(ctx *cli.Context) { termui.Loop() } -// retrieveMetrics contacts the attached geth node and retrieves the entire set +// retrieveMetrics contacts the attached gexp node and retrieves the entire set // of collected system metrics. func retrieveMetrics(client rpc.Client) (map[string]interface{}, error) { req := map[string]interface{}{ diff --git a/cmd/geth/run_test.go b/cmd/gexp/run_test.go similarity index 88% rename from cmd/geth/run_test.go rename to cmd/gexp/run_test.go index a82eb9d68a..e479ce5874 100644 --- a/cmd/geth/run_test.go +++ b/cmd/gexp/run_test.go @@ -32,14 +32,14 @@ import ( ) func tmpdir(t *testing.T) string { - dir, err := ioutil.TempDir("", "geth-test") + dir, err := ioutil.TempDir("", "gexp-test") if err != nil { t.Fatal(err) } return dir } -type testgeth struct { +type testgexp struct { // For total convenience, all testing methods are available. *testing.T // template variables for expect @@ -55,17 +55,17 @@ type testgeth struct { } func init() { - // Run the app if we're the child process for runGeth. + // Run the app if we're the child process for runGexp. if os.Getenv("GETH_TEST_CHILD") != "" { app.RunAndExitOnError() os.Exit(0) } } -// spawns geth with the given command line args. If the args don't set --datadir, the +// spawns gexp with the given command line args. If the args don't set --datadir, the // child g gets a temporary data directory. -func runGeth(t *testing.T, args ...string) *testgeth { - tt := &testgeth{T: t, Executable: os.Args[0]} +func runGexp(t *testing.T, args ...string) *testgexp { + tt := &testgexp{T: t, Executable: os.Args[0]} for i, arg := range args { if arg == "-datadir" || arg == "--datadir" { if i < len(args)-1 { @@ -86,7 +86,7 @@ func runGeth(t *testing.T, args ...string) *testgeth { }() } - // Boot "geth". This actually runs the test binary but the init function + // Boot "gexp". This actually runs the test binary but the init function // will prevent any tests from running. tt.stderr = &testlogger{t: t} tt.cmd = exec.Command(os.Args[0], args...) @@ -109,13 +109,13 @@ func runGeth(t *testing.T, args ...string) *testgeth { // InputLine writes the given text to the childs stdin. // This method can also be called from an expect template, e.g.: // -// geth.expect(`Passphrase: {{.InputLine "password"}}`) -func (tt *testgeth) InputLine(s string) string { +// gexp.expect(`Passphrase: {{.InputLine "password"}}`) +func (tt *testgexp) InputLine(s string) string { io.WriteString(tt.stdin, s+"\n") return "" } -func (tt *testgeth) setTemplateFunc(name string, fn interface{}) { +func (tt *testgexp) setTemplateFunc(name string, fn interface{}) { if tt.Func == nil { tt.Func = make(map[string]interface{}) } @@ -127,7 +127,7 @@ func (tt *testgeth) setTemplateFunc(name string, fn interface{}) { // // If the template starts with a newline, the newline is removed // before matching. -func (tt *testgeth) expect(tplsource string) { +func (tt *testgexp) expect(tplsource string) { // Generate the expected output by running the template. tpl := template.Must(template.New("").Funcs(tt.Func).Parse(tplsource)) wantbuf := new(bytes.Buffer) @@ -143,7 +143,7 @@ func (tt *testgeth) expect(tplsource string) { tt.Logf("Matched stdout text:\n%s", want) } -func (tt *testgeth) matchExactOutput(want []byte) error { +func (tt *testgexp) matchExactOutput(want []byte) error { buf := make([]byte, len(want)) n := 0 tt.withKillTimeout(func() { n, _ = io.ReadFull(tt.stdout, buf) }) @@ -174,7 +174,7 @@ func (tt *testgeth) matchExactOutput(want []byte) error { // Note that an arbitrary amount of output may be consumed by the // regular expression. This usually means that expect cannot be used // after expectRegexp. -func (tt *testgeth) expectRegexp(resource string) (*regexp.Regexp, []string) { +func (tt *testgexp) expectRegexp(resource string) (*regexp.Regexp, []string) { var ( re = regexp.MustCompile(resource) rtee = &runeTee{in: tt.stdout} @@ -197,7 +197,7 @@ func (tt *testgeth) expectRegexp(resource string) (*regexp.Regexp, []string) { // expectExit expects the child process to exit within 5s without // printing any additional text on stdout. -func (tt *testgeth) expectExit() { +func (tt *testgexp) expectExit() { var output []byte tt.withKillTimeout(func() { output, _ = ioutil.ReadAll(tt.stdout) @@ -211,20 +211,20 @@ func (tt *testgeth) expectExit() { } } -func (tt *testgeth) interrupt() { +func (tt *testgexp) interrupt() { tt.cmd.Process.Signal(os.Interrupt) } // stderrText returns any stderr output written so far. // The returned text holds all log lines after expectExit has // returned. -func (tt *testgeth) stderrText() string { +func (tt *testgexp) stderrText() string { tt.stderr.mu.Lock() defer tt.stderr.mu.Unlock() return tt.stderr.buf.String() } -func (tt *testgeth) withKillTimeout(fn func()) { +func (tt *testgexp) withKillTimeout(fn func()) { timeout := time.AfterFunc(5*time.Second, func() { tt.Log("killing the child process (timeout)") tt.cmd.Process.Kill() diff --git a/cmd/geth/testdata/empty.js b/cmd/gexp/testdata/empty.js similarity index 100% rename from cmd/geth/testdata/empty.js rename to cmd/gexp/testdata/empty.js diff --git a/cmd/geth/testdata/guswallet.json b/cmd/gexp/testdata/guswallet.json similarity index 100% rename from cmd/geth/testdata/guswallet.json rename to cmd/gexp/testdata/guswallet.json diff --git a/cmd/geth/testdata/passwords.txt b/cmd/gexp/testdata/passwords.txt similarity index 100% rename from cmd/geth/testdata/passwords.txt rename to cmd/gexp/testdata/passwords.txt diff --git a/cmd/geth/testdata/wrong-passwords.txt b/cmd/gexp/testdata/wrong-passwords.txt similarity index 100% rename from cmd/geth/testdata/wrong-passwords.txt rename to cmd/gexp/testdata/wrong-passwords.txt diff --git a/cmd/geth/usage.go b/cmd/gexp/usage.go similarity index 94% rename from cmd/geth/usage.go rename to cmd/gexp/usage.go index 90019d7b97..b42721af96 100644 --- a/cmd/geth/usage.go +++ b/cmd/gexp/usage.go @@ -1,5 +1,5 @@ // Copyright 2015 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of go-expanse. // // 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 @@ -12,9 +12,9 @@ // 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 . +// along with go-expanse. If not, see . -// Contains the geth command usage template and generator. +// Contains the gexp command usage template and generator. package main @@ -22,8 +22,8 @@ import ( "io" "github.com/codegangsta/cli" - "github.com/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/internal/debug" + "github.com/expanse-project/go-expanse/cmd/utils" + "github.com/expanse-project/go-expanse/internal/debug" ) // AppHelpTemplate is the test template for the default, global app help topic. @@ -60,7 +60,7 @@ type flagGroup struct { // AppHelpFlagGroups is the application flags, grouped by functionality. var AppHelpFlagGroups = []flagGroup{ { - Name: "ETHEREUM", + Name: "EXPANSE", Flags: []cli.Flag{ utils.DataDirFlag, utils.KeyStoreDirFlag, diff --git a/cmd/rlpdump/main.go b/cmd/rlpdump/main.go index 10eea1fde0..e2dd152be7 100644 --- a/cmd/rlpdump/main.go +++ b/cmd/rlpdump/main.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of go-ethereum. +// Copyright 2015 The go-expanse Authors +// This file is part of go-expanse. // -// go-ethereum is free software: you can redistribute it and/or modify +// go-expanse 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, +// go-expanse 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 . +// along with go-expanse. If not, see . // rlpdump is a pretty-printer for RLP data. package main @@ -26,7 +26,7 @@ import ( "os" "strings" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/rlp" ) var ( diff --git a/cmd/utils/bootnodes.go b/cmd/utils/bootnodes.go index fbbaa1f227..a378bc4d70 100644 --- a/cmd/utils/bootnodes.go +++ b/cmd/utils/bootnodes.go @@ -16,18 +16,19 @@ package utils -import "github.com/ethereum/go-ethereum/p2p/discover" +import "github.com/expanse-project/go-expanse/p2p/discover" // FrontierBootNodes are the enode URLs of the P2P bootstrap nodes running on // the Frontier network. var FrontierBootNodes = []*discover.Node{ - // ETH/DEV Go Bootnodes - discover.MustParseNode("enode://a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@52.16.188.185:30303"), // IE - discover.MustParseNode("enode://de471bccee3d042261d52e9bff31458daecc406142b401d4cd848f677479f73104b9fdeb090af9583d3391b7f10cb2ba9e26865dd5fca4fcdc0fb1e3b723c786@54.94.239.50:30303"), // BR - discover.MustParseNode("enode://1118980bf48b0a3640bdba04e0fe78b1add18e1cd99bf22d53daac1fd9972ad650df52176e7c7d89d1114cfef2bc23a2959aa54998a46afcf7d91809f0855082@52.74.57.123:30303"), // SG - - // ETH/DEV Cpp Bootnodes - discover.MustParseNode("enode://979b7fa28feeb35a4741660a16076f1943202cb72b6af70d327f053e248bab9ba81760f39d0701ef1d8f89cc1fbd2cacba0710a12cd5314d5e0c9021aa3637f9@5.1.83.226:30303"), + // EXP/DEV Go Bootnodes + discover.MustParseNode("enode://7f335a047654f3e70d6f91312a7cf89c39704011f1a584e2698250db3d63817e74b88e26b7854111e16b2c9d0c7173c05419aeee2d0321850227b126d8b1be3f@46.101.156.249:42786"), + discover.MustParseNode("enode://df872f81e25f72356152b44cab662caf1f2e57c3a156ecd20e9ac9246272af68a2031b4239a0bc831f2c6ab34733a041464d46b3ea36dce88d6c11714446e06b@178.62.208.109:42786"), + discover.MustParseNode("enode://96d3919b903e7f5ad59ac2f73c43be9172d9d27e2771355db03fd194732b795829a31fe2ea6de109d0804786c39a807e155f065b4b94c6fce167becd0ac02383@45.55.22.34:42786"), + discover.MustParseNode("enode://5f6c625bf287e3c08aad568de42d868781e961cbda805c8397cfb7be97e229419bef9a5a25a75f97632787106bba8a7caf9060fab3887ad2cfbeb182ab0f433f@46.101.182.53:42786"), + discover.MustParseNode("enode://d33a8d4c2c38a08971ed975b750f21d54c927c0bf7415931e214465a8d01651ecffe4401e1db913f398383381413c78105656d665d83f385244ab302d6138414@128.199.183.48:42786"), + discover.MustParseNode("enode://df872f81e25f72356152b44cab662caf1f2e57c3a156ecd20e9ac9246272af68a2031b4239a0bc831f2c6ab34733a041464d46b3ea36dce88d6c11714446e06b@178.62.208.109:42786"), + discover.MustParseNode("enode://f6f0d6b9b7d02ec9e8e4a16e38675f3621ea5e69860c739a65c1597ca28aefb3cec7a6d84e471ac927d42a1b64c1cbdefad75e7ce8872d57548ddcece20afdd1@159.203.64.95:42786"), } // TestNetBootNodes are the enode URLs of the P2P bootstrap nodes running on the diff --git a/cmd/utils/client.go b/cmd/utils/client.go index ec72a1a4b3..56bf1335dd 100644 --- a/cmd/utils/client.go +++ b/cmd/utils/client.go @@ -21,11 +21,11 @@ import ( "strings" "github.com/codegangsta/cli" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/rpc" + "github.com/expanse-project/go-expanse/node" + "github.com/expanse-project/go-expanse/rpc" ) -// NewRemoteRPCClient returns a RPC client which connects to a running geth instance. +// NewRemoteRPCClient returns a RPC client which connects to a running gexp instance. // Depending on the given context this can either be a IPC or a HTTP client. func NewRemoteRPCClient(ctx *cli.Context) (rpc.Client, error) { if ctx.Args().Present() { diff --git a/cmd/utils/cmd.go b/cmd/utils/cmd.go index 9e2b14f567..96458f7200 100644 --- a/cmd/utils/cmd.go +++ b/cmd/utils/cmd.go @@ -1,20 +1,20 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of go-ethereum. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of go-expanse. // -// go-ethereum is free software: you can redistribute it and/or modify +// go-expanse 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, +// go-expanse 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 . +// along with go-expanse. If not, see . -// Package utils contains internal helper functions for go-ethereum commands. +// Package utils contains internal helper functions for go-expanse commands. package utils import ( @@ -24,14 +24,15 @@ import ( "os/signal" "regexp" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/internal/debug" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/internal/debug" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/node" + "github.com/expanse-project/go-expanse/rlp" + ) const ( diff --git a/cmd/utils/customflags.go b/cmd/utils/customflags.go index 4450065c14..63351bec83 100644 --- a/cmd/utils/customflags.go +++ b/cmd/utils/customflags.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of go-ethereum. +// Copyright 2015 The go-expanse Authors +// This file is part of go-expanse. // -// go-ethereum is free software: you can redistribute it and/or modify +// go-expanse 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, +// go-expanse 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 . +// along with go-expanse. If not, see . package utils @@ -44,7 +44,7 @@ func (self *DirectoryString) Set(value string) error { } // Custom cli.Flag type which expand the received string to an absolute path. -// e.g. ~/.ethereum -> /home/username/.ethereum +// e.g. ~/.expanse -> /home/username/.expanse type DirectoryFlag struct { cli.GenericFlag Name string diff --git a/cmd/utils/customflags_test.go b/cmd/utils/customflags_test.go index de39ca36a1..24c6cff635 100644 --- a/cmd/utils/customflags_test.go +++ b/cmd/utils/customflags_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of go-ethereum. +// Copyright 2015 The go-expanse Authors +// This file is part of go-expanse. // -// go-ethereum is free software: you can redistribute it and/or modify +// go-expanse 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, +// go-expanse 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 . +// along with go-expanse. If not, see . package utils diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 43dbc37f74..1d45763e79 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of go-ethereum. +// Copyright 2015 The go-expanse Authors +// This file is part of go-expanse. // -// go-ethereum is free software: you can redistribute it and/or modify +// go-expanse 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, +// go-expanse 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 . +// along with go-expanse. If not, see . package utils @@ -31,26 +31,26 @@ import ( "time" "github.com/codegangsta/cli" - "github.com/ethereum/ethash" - "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/eth" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p/discover" - "github.com/ethereum/go-ethereum/p2p/nat" - "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/pow" - "github.com/ethereum/go-ethereum/release" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/whisper" + "github.com/expanse-project/ethash" + "github.com/expanse-project/go-expanse/accounts" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/exp" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/event" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/metrics" + "github.com/expanse-project/go-expanse/node" + "github.com/expanse-project/go-expanse/p2p/discover" + "github.com/expanse-project/go-expanse/p2p/nat" + "github.com/expanse-project/go-expanse/params" + "github.com/expanse-project/go-expanse/pow" + "github.com/expanse-project/go-expanse/release" + "github.com/expanse-project/go-expanse/rpc" + "github.com/expanse-project/go-expanse/whisper" ) func init() { @@ -112,7 +112,7 @@ var ( NetworkIdFlag = cli.IntFlag{ Name: "networkid", Usage: "Network identifier (integer, 0=Olympic, 1=Frontier, 2=Morden)", - Value: eth.NetworkId, + Value: exp.NetworkId, } OlympicFlag = cli.BoolFlag{ Name: "olympic", @@ -248,7 +248,7 @@ var ( RPCPortFlag = cli.IntFlag{ Name: "rpcport", Usage: "HTTP-RPC server listening port", - Value: common.DefaultHTTPPort, + Value: 9656, } RPCCORSDomainFlag = cli.StringFlag{ Name: "rpccorsdomain", @@ -321,7 +321,7 @@ var ( ListenPortFlag = cli.IntFlag{ Name: "port", Usage: "Network listening port", - Value: 30303, + Value: 42786, } BootnodesFlag = cli.StringFlag{ Name: "bootnodes", @@ -549,7 +549,7 @@ func MakeGenesisBlock(ctx *cli.Context) string { } // MakeDatabaseHandles raises out the number of allowed file handles per process -// for Geth and returns half of the allowance to assign to the database. +// for Gexp and returns half of the allowance to assign to the database. func MakeDatabaseHandles() int { if err := raiseFdLimit(2048); err != nil { Fatalf("Failed to raise file descriptor allowance: %v", err) @@ -674,7 +674,7 @@ func MakeSystemNode(name, version string, relconf release.Config, extra []byte, WSOrigins: ctx.GlobalString(WSAllowedOriginsFlag.Name), WSModules: MakeRPCModules(ctx.GlobalString(WSApiFlag.Name)), } - // Configure the Ethereum service + // Configure the Expanse service accman := MakeAccountManager(ctx) // initialise new random number generator @@ -687,7 +687,7 @@ func MakeSystemNode(name, version string, relconf release.Config, extra []byte, glog.V(logger.Info).Infoln("You're one of the lucky few that will try out the JIT VM (random). If you get a consensus failure please be so kind to report this incident with the block hash that failed. You can switch to the regular VM by setting --jitvm=false") } - ethConf := ð.Config{ + ethConf := &exp.Config{ ChainConfig: MustMakeChainConfig(ctx), Genesis: MakeGenesisBlock(ctx), FastSync: ctx.GlobalBool(FastSyncFlag.Name), @@ -738,7 +738,7 @@ func MakeSystemNode(name, version string, relconf release.Config, extra []byte, case ctx.GlobalBool(DevModeFlag.Name): // Override the base network stack configs if !ctx.GlobalIsSet(DataDirFlag.Name) { - stackConf.DataDir = filepath.Join(os.TempDir(), "/ethereum_dev_mode") + stackConf.DataDir = filepath.Join(os.TempDir(), "/expanse_dev_mode") } if !ctx.GlobalIsSet(MaxPeersFlag.Name) { stackConf.MaxPeers = 0 @@ -746,7 +746,7 @@ func MakeSystemNode(name, version string, relconf release.Config, extra []byte, if !ctx.GlobalIsSet(ListenPortFlag.Name) { stackConf.ListenAddr = ":0" } - // Override the Ethereum protocol configs + // Override the Expanse protocol configs if !ctx.GlobalIsSet(GenesisFileFlag.Name) { ethConf.Genesis = core.OlympicGenesisBlock() } @@ -764,9 +764,9 @@ func MakeSystemNode(name, version string, relconf release.Config, extra []byte, Fatalf("Failed to create the protocol stack: %v", err) } if err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) { - return eth.New(ctx, ethConf) + return exp.New(ctx, ethConf) }); err != nil { - Fatalf("Failed to register the Ethereum service: %v", err) + Fatalf("Failed to register the Expanse service: %v", err) } if shhEnable { if err := stack.Register(func(*node.ServiceContext) (node.Service, error) { return whisper.New(), nil }); err != nil { @@ -776,7 +776,7 @@ func MakeSystemNode(name, version string, relconf release.Config, extra []byte, if err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) { return release.NewReleaseService(ctx, relconf) }); err != nil { - Fatalf("Failed to register the Geth release oracle service: %v", err) + Fatalf("Failed to register the Gexp release oracle service: %v", err) } return stack } diff --git a/cmd/utils/jeth.go b/cmd/utils/jeth.go index 9410180b01..c5b0c2c045 100644 --- a/cmd/utils/jeth.go +++ b/cmd/utils/jeth.go @@ -21,8 +21,8 @@ import ( "fmt" "time" - "github.com/ethereum/go-ethereum/jsre" - "github.com/ethereum/go-ethereum/rpc" + "github.com/expanse-project/go-expanse/jsre" + "github.com/expanse-project/go-expanse/rpc" "github.com/robertkrimen/otto" ) @@ -57,7 +57,7 @@ func (self *Jeth) err(call otto.FunctionCall, code int, msg string, id interface return res } -// UnlockAccount asks the user for the password and than executes the jeth.UnlockAccount callback in the jsre. +// UnlockAccount asks the user for the password and than executes the jexp.UnlockAccount callback in the jsre. // It will need the public address for the account to unlock as first argument. // The second argument is an optional string with the password. If not given the user is prompted for the password. // The third argument is an optional integer which specifies for how long the account will be unlocked (in seconds). @@ -96,8 +96,8 @@ func (self *Jeth) UnlockAccount(call otto.FunctionCall) (response otto.Value) { duration = call.Argument(2) } - // jeth.unlockAccount will send the request to the backend. - if val, err := call.Otto.Call("jeth.unlockAccount", nil, account, passwd, duration); err == nil { + // jexp.unlockAccount will send the request to the backend. + if val, err := call.Otto.Call("jexp.unlockAccount", nil, account, passwd, duration); err == nil { return val } else { throwJSExeception(err.Error()) @@ -106,7 +106,7 @@ func (self *Jeth) UnlockAccount(call otto.FunctionCall) (response otto.Value) { return otto.FalseValue() } -// NewAccount asks the user for the password and than executes the jeth.newAccount callback in the jsre +// NewAccount asks the user for the password and than executes the jexp.newAccount callback in the jsre func (self *Jeth) NewAccount(call otto.FunctionCall) (response otto.Value) { var passwd string if len(call.ArgumentList) == 0 { @@ -131,7 +131,7 @@ func (self *Jeth) NewAccount(call otto.FunctionCall) (response otto.Value) { return otto.FalseValue() } - ret, err := call.Otto.Call("jeth.newAccount", nil, passwd) + ret, err := call.Otto.Call("jexp.newAccount", nil, passwd) if err == nil { return ret } @@ -276,7 +276,7 @@ func (self *Jeth) SleepBlocks(call otto.FunctionCall) (response otto.Value) { // go through the console, this will allow web3 to call the appropriate // callbacks if a delayed response or notification is received. currentBlockNr := func() int64 { - result, err := call.Otto.Run("eth.blockNumber") + result, err := call.Otto.Run("exp.blockNumber") if err != nil { throwJSExeception(err.Error()) } diff --git a/cmd/utils/legalese.go b/cmd/utils/legalese.go new file mode 100644 index 0000000000..6e0ce151bd --- /dev/null +++ b/cmd/utils/legalese.go @@ -0,0 +1,41 @@ +// Copyright 2015 The go-expanse Authors +// This file is part of go-expanse. +// +// go-expanse 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-expanse 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-expanse. If not, see . + +package utils + +const ( + legalese = ` +======================================= +Disclaimer of Liabilites and Warranties +======================================= + +THE USER EXPRESSLY KNOWS AND AGREES THAT THE USER IS USING THE EXPANSE PLATFORM AT THE USER’S SOLE +RISK. THE USER REPRESENTS THAT THE USER HAS AN ADEQUATE UNDERSTANDING OF THE RISKS, USAGE AND +INTRICACIES OF CRYPTOGRAPHIC TOKENS AND BLOCKCHAIN-BASED OPEN SOURCE SOFTWARE, EXP PLATFORM AND EXP. +THE USER ACKNOWLEDGES AND AGREES THAT, TO THE FULLEST EXTENT PERMITTED BY ANY APPLICABLE LAW, THE +DISCLAIMERS OF LIABILITY CONTAINED HEREIN APPLY TO ANY AND ALL DAMAGES OR INJURY WHATSOEVER CAUSED +BY OR RELATED TO RISKS OF, USE OF, OR INABILITY TO USE, EXP OR THE EXPANSE PLATFORM UNDER ANY CAUSE +OR ACTION WHATSOEVER OF ANY KIND IN ANY JURISDICTION, INCLUDING, WITHOUT LIMITATION, ACTIONS FOR +BREACH OF WARRANTY, BREACH OF CONTRACT OR TORT (INCLUDING NEGLIGENCE) AND THAT NEITHER STIFTUNG +EXPANSE NOR EXPANSE TEAM SHALL BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR +CONSEQUENTIAL DAMAGES, INCLUDING FOR LOSS OF PROFITS, GOODWILL OR DATA. SOME JURISDICTIONS DO NOT +ALLOW THE EXCLUSION OF CERTAIN WARRANTIES OR THE LIMITATION OR EXCLUSION OF LIABILITY FOR CERTAIN +TYPES OF DAMAGES. THEREFORE, SOME OF THE ABOVE LIMITATIONS IN THIS SECTION MAY NOT APPLY TO A USER. +IN PARTICULAR, NOTHING IN THESE TERMS SHALL AFFECT THE STATUTORY RIGHTS OF ANY USER OR EXCLUDE +INJURY ARISING FROM ANY WILLFUL MISCONDUCT OR FRAUD OF STIFTUNG EXPANSE. + +Do you accept this agreement?` +) diff --git a/common/README.md b/common/README.md index adea022b7f..ab8fb36115 100644 --- a/common/README.md +++ b/common/README.md @@ -1,24 +1,26 @@ # common [![Build -Status](https://travis-ci.org/ethereum/go-ethereum.png?branch=master)](https://travis-ci.org/ethereum/go-ethereum) +Status](https://travis-ci.org/expanse/go-expanse.png?branch=master)](https://travis-ci.org/expanse/go-expanse) -The common package contains the ethereum utility library. +The common package contains the expanse utility library. # Installation -As a subdirectory the main go-ethereum repository, you get it with -`go get github.com/ethereum/go-ethereum`. +As a subdirectory the main go-expanse repository, you get it with +`go get github.com/expanse-project/go-expanse`. # Usage ## RLP (Recursive Linear Prefix) Encoding -RLP Encoding is an encoding scheme used by the Ethereum project. It -encodes any native value or list to a string. -More in depth information about the encoding scheme see the -[Wiki](http://wiki.ethereum.org/index.php/RLP) article. +RLP Encoding is an encoding scheme utilized by the Expanse project. It +encodes any native value or list to string. + +More in depth information about the Encoding scheme see the [Wiki](http://wiki.expanse.org/index.php/RLP) +article. + ```go rlp := common.Encode("doge") @@ -32,10 +34,11 @@ fmt.Println(decoded) // => ["dog" "cat"] ## Patricia Trie -Patricie Tree is a merkle trie used by the Ethereum project. +Patricie Tree is a merkle tree utilized by the Expanse project. + More in depth information about the (modified) Patricia Trie can be -found on the [Wiki](http://wiki.ethereum.org/index.php/Patricia_Tree). +found on the [Wiki](http://wiki.expanse.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 `common/db.go`. diff --git a/common/big.go b/common/big.go index 4ce87ee0c6..df36ed2d0b 100644 --- a/common/big.go +++ b/common/big.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package common diff --git a/common/big_test.go b/common/big_test.go index 1eb0c0c1fd..d7d94cd655 100644 --- a/common/big_test.go +++ b/common/big_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package common diff --git a/common/bytes.go b/common/bytes.go index 4fb016a976..5cfa6ff51c 100644 --- a/common/bytes.go +++ b/common/bytes.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // Package common contains various helper functions. package common diff --git a/common/bytes_test.go b/common/bytes_test.go index 2e52084777..fd76954d1b 100644 --- a/common/bytes_test.go +++ b/common/bytes_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package common diff --git a/common/compiler/solidity.go b/common/compiler/solidity.go index ddf7a1ac96..9156c472fc 100644 --- a/common/compiler/solidity.go +++ b/common/compiler/solidity.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package compiler @@ -28,10 +28,10 @@ import ( "regexp" "strings" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" ) var ( diff --git a/common/compiler/solidity_test.go b/common/compiler/solidity_test.go index 7109b1ec4b..0352ee5917 100644 --- a/common/compiler/solidity_test.go +++ b/common/compiler/solidity_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package compiler @@ -23,7 +23,7 @@ import ( "path" "testing" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse-project/go-expanse/common" ) const solcVersion = "0.1.1" diff --git a/common/debug.go b/common/debug.go index 61acd8ce70..0cead963f9 100644 --- a/common/debug.go +++ b/common/debug.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package common @@ -26,7 +26,7 @@ import ( // Report gives off a warning requesting the user to submit an issue to the github tracker. func Report(extra ...interface{}) { - fmt.Fprintln(os.Stderr, "You've encountered a sought after, hard to reproduce bug. Please report this to the developers <3 https://github.com/ethereum/go-ethereum/issues") + fmt.Fprintln(os.Stderr, "You've encountered a sought after, hard to reproduce bug. Please report this to the developers <3 https://github.com/expanse-project/go-expanse/issues") fmt.Fprintln(os.Stderr, extra...) _, file, line, _ := runtime.Caller(1) diff --git a/common/defaults.go b/common/defaults.go index 8a136fa801..5e89491e26 100644 --- a/common/defaults.go +++ b/common/defaults.go @@ -22,11 +22,11 @@ import ( ) const ( - DefaultIPCSocket = "geth.ipc" // Default (relative) name of the IPC RPC socket + DefaultIPCSocket = "gexp.ipc" // Default (relative) name of the IPC RPC socket DefaultHTTPHost = "localhost" // Default host interface for the HTTP RPC server - DefaultHTTPPort = 8545 // Default TCP port for the HTTP RPC server + DefaultHTTPPort = 9659 // Default TCP port for the HTTP RPC server DefaultWSHost = "localhost" // Default host interface for the websocket RPC server - DefaultWSPort = 8546 // Default TCP port for the websocket RPC server + DefaultWSPort = 9656 // Default TCP port for the websocket RPC server ) // DefaultDataDir is the default data directory to use for the databases and other @@ -36,11 +36,11 @@ func DefaultDataDir() string { home := HomeDir() if home != "" { if runtime.GOOS == "darwin" { - return filepath.Join(home, "Library", "Ethereum") + return filepath.Join(home, "Library", "Expanse") } else if runtime.GOOS == "windows" { - return filepath.Join(home, "AppData", "Roaming", "Ethereum") + return filepath.Join(home, "AppData", "Roaming", "Expanse") } else { - return filepath.Join(home, ".ethereum") + return filepath.Join(home, ".expanse") } } // As we cannot guess a stable location, return empty and handle later diff --git a/common/httpclient/httpclient.go b/common/httpclient/httpclient.go index a0a1efd388..a35add5dd6 100644 --- a/common/httpclient/httpclient.go +++ b/common/httpclient/httpclient.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package httpclient @@ -22,8 +22,8 @@ import ( "net/http" "path/filepath" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" ) type HTTPClient struct { diff --git a/common/httpclient/httpclient_test.go b/common/httpclient/httpclient_test.go index 670893f8a0..b093469340 100644 --- a/common/httpclient/httpclient_test.go +++ b/common/httpclient/httpclient_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package httpclient @@ -23,8 +23,8 @@ import ( "path" "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" ) func TestGetAuthContent(t *testing.T) { diff --git a/common/icap.go b/common/icap.go index a36e669b34..511f771671 100644 --- a/common/icap.go +++ b/common/icap.go @@ -57,7 +57,7 @@ func parseICAP(s string) (Address, error) { if err := validCheckSum(s); err != nil { return Address{}, err } - // checksum is ISO13616, Ethereum address is base-36 + // checksum is ISO13616, Expanse address is base-36 bigAddr, _ := new(big.Int).SetString(s[4:], 36) return BigToAddress(bigAddr), nil } diff --git a/common/list.go b/common/list.go index 07b2f17f53..f18611722e 100644 --- a/common/list.go +++ b/common/list.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package common diff --git a/common/main_test.go b/common/main_test.go index 149d09928a..cd395b634e 100644 --- a/common/main_test.go +++ b/common/main_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package common diff --git a/common/math/dist.go b/common/math/dist.go index 913fbfbd47..5df1fc2d1c 100644 --- a/common/math/dist.go +++ b/common/math/dist.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package math @@ -20,7 +20,7 @@ import ( "math/big" "sort" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse-project/go-expanse/common" ) type Summer interface { diff --git a/common/math/dist_test.go b/common/math/dist_test.go index 826faea8b3..300e16824e 100644 --- a/common/math/dist_test.go +++ b/common/math/dist_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package math diff --git a/common/natspec/natspec.go b/common/natspec/natspec.go index 4521ff7a1b..d8557209e2 100644 --- a/common/natspec/natspec.go +++ b/common/natspec/natspec.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // +build ignore @@ -24,11 +24,12 @@ import ( "fmt" "strings" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/httpclient" - "github.com/ethereum/go-ethereum/common/registrar" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/xeth" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/common/httpclient" + "github.com/expanse-project/go-expanse/common/registrar" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/xeth" + "github.com/robertkrimen/otto" ) @@ -45,7 +46,7 @@ type NatSpec struct { // the implementation is frontend friendly in that it always gives back // a notice that is safe to display // :FIXME: the second return value is an error, which can be used to fine-tune bahaviour -func GetNotice(xeth *xeth.XEth, tx string, http *httpclient.HTTPClient) (notice string) { +func GetNotice(xeth *xexp.XEth, tx string, http *httpclient.HTTPClient) (notice string) { ns, err := New(xeth, tx, http) if err != nil { if ns == nil { @@ -85,7 +86,7 @@ type contractInfo struct { DeveloperDoc json.RawMessage `json:"developerDoc"` } -func New(xeth *xeth.XEth, jsontx string, http *httpclient.HTTPClient) (self *NatSpec, err error) { +func New(xeth *xexp.XEth, jsontx string, http *httpclient.HTTPClient) (self *NatSpec, err error) { // extract contract address from tx var tx jsonTx @@ -106,10 +107,10 @@ func New(xeth *xeth.XEth, jsontx string, http *httpclient.HTTPClient) (self *Nat } // also called by admin.contractInfo.get -func FetchDocsForContract(contractAddress string, xeth *xeth.XEth, client *httpclient.HTTPClient) (content []byte, err error) { +func FetchDocsForContract(contractAddress string, xeth *xexp.XEth, client *httpclient.HTTPClient) (content []byte, err error) { // retrieve contract hash from state - codehex := xeth.CodeAt(contractAddress) - codeb := xeth.CodeAtBytes(contractAddress) + codehex := xexp.CodeAt(contractAddress) + codeb := xexp.CodeAtBytes(contractAddress) if codehex == "0x" { err = fmt.Errorf("contract (%v) not found", contractAddress) @@ -202,7 +203,7 @@ func (self *NatSpec) makeAbi2method(abiKey [8]byte) (meth *method) { copy(key[:], hash[:8]) if bytes.Equal(key[:], abiKey[:]) { meth = m - meth.name = name + mexp.name = name return } } @@ -222,7 +223,7 @@ func (self *NatSpec) Notice() (notice string, err error) { err = fmt.Errorf("abi key does not match any method") return } - notice, err = self.noticeForMethod(self.tx, meth.name, meth.Notice) + notice, err = self.noticeForMethod(self.tx, mexp.name, mexp.Notice) return } diff --git a/common/natspec/natspec_e2e_test.go b/common/natspec/natspec_e2e_test.go index 2552605769..6800333624 100644 --- a/common/natspec/natspec_e2e_test.go +++ b/common/natspec/natspec_e2e_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // +build ignore @@ -28,17 +28,17 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/httpclient" - "github.com/ethereum/go-ethereum/common/registrar" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/eth" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/node" - xe "github.com/ethereum/go-ethereum/xeth" + "github.com/expanse-project/go-expanse/accounts" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/common/httpclient" + "github.com/expanse-project/go-expanse/common/registrar" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/eth" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/event" + "github.com/expanse-project/go-expanse/node" + xe "github.com/expanse-project/go-expanse/xeth" ) const ( @@ -99,7 +99,7 @@ const ( type testFrontend struct { t *testing.T - ethereum *eth.Ethereum + expanse *exp.Expanse xeth *xe.XEth wait chan *big.Int lastConfirm string @@ -111,7 +111,7 @@ func (self *testFrontend) AskPassword() (string, bool) { } func (self *testFrontend) UnlockAccount(acc []byte) bool { - self.ethereum.AccountManager().Unlock(common.BytesToAddress(acc), "password") + self.expanse.AccountManager().Unlock(common.BytesToAddress(acc), "password") return true } @@ -123,12 +123,13 @@ func (self *testFrontend) ConfirmTransaction(tx string) bool { return true } -func testEth(t *testing.T) (ethereum *eth.Ethereum, err error) { +func testExp(t *testing.T) (expanse *exp.Expanse, err error) { tmp, err := ioutil.TempDir("", "natspec-test") if err != nil { t.Fatal(err) } + db, _ := ethdb.NewMemDatabase() addr := common.HexToAddress(testAddress) core.WriteGenesisBlockForTesting(db, core.GenesisAccount{addr, common.String2Big(testBalance)}) @@ -150,7 +151,7 @@ func testEth(t *testing.T) (ethereum *eth.Ethereum, err error) { } // only use minimalistic stack with no networking - return eth.New(&node.ServiceContext{EventMux: new(event.TypeMux)}, ð.Config{ + return exp.New(&node.ServiceContext{EventMux: new(event.TypeMux)}, &exp.Config{ AccountManager: am, Etherbase: common.HexToAddress(testAddress), PowTest: true, @@ -162,23 +163,23 @@ func testEth(t *testing.T) (ethereum *eth.Ethereum, err error) { } func testInit(t *testing.T) (self *testFrontend) { - // initialise and start minimal ethereum stack - ethereum, err := testEth(t) + // initialise and start minimal expanse stack + expanse, err := testExp(t) if err != nil { - t.Errorf("error creating ethereum: %v", err) + t.Errorf("error creating expanse: %v", err) return } - err = ethereum.Start(nil) + err = expanse.Start(nil) if err != nil { - t.Errorf("error starting ethereum: %v", err) + t.Errorf("error starting expanse: %v", err) return } // mock frontend self = &testFrontend{t: t, ethereum: ethereum} self.xeth = xe.New(nil, self) - self.wait = self.xeth.UpdateState() - addr, _ := self.ethereum.Etherbase() + self.wait = self.xexp.UpdateState() + addr, _ := self.expanse.Etherbase() // initialise the registry contracts reg := registrar.New(self.xeth) @@ -192,7 +193,7 @@ func testInit(t *testing.T) (self *testFrontend) { if !processTxs(self, t, 1) { t.Fatalf("error mining txs") } - recG := self.xeth.GetTxReceipt(common.HexToHash(txG)) + recG := self.xexp.GetTxReceipt(common.HexToHash(txG)) if recG == nil { t.Fatalf("blockchain error creating GlobalRegistrar") } @@ -205,7 +206,7 @@ func testInit(t *testing.T) (self *testFrontend) { if !processTxs(self, t, 1) { t.Errorf("error mining txs") } - recH := self.xeth.GetTxReceipt(common.HexToHash(txH)) + recH := self.xexp.GetTxReceipt(common.HexToHash(txH)) if recH == nil { t.Fatalf("blockchain error creating HashReg") } @@ -218,7 +219,7 @@ func testInit(t *testing.T) (self *testFrontend) { if !processTxs(self, t, 1) { t.Errorf("error mining txs") } - recU := self.xeth.GetTxReceipt(common.HexToHash(txU)) + recU := self.xexp.GetTxReceipt(common.HexToHash(txU)) if recU == nil { t.Fatalf("blockchain error creating UrlHint") } @@ -232,8 +233,8 @@ func TestNatspecE2E(t *testing.T) { t.Skip() tf := testInit(t) - defer tf.ethereum.Stop() - addr, _ := tf.ethereum.Etherbase() + defer tf.expanse.Stop() + addr, _ := tf.expanse.Etherbase() // create a contractInfo file (mock cloud-deployed contract metadocs) // incidentally this is the info for the HashReg contract itself @@ -241,7 +242,7 @@ func TestNatspecE2E(t *testing.T) { dochash := crypto.Keccak256Hash([]byte(testContractInfo)) // take the codehash for the contract we wanna test - codeb := tf.xeth.CodeAtBytes(registrar.HashRegAddr) + codeb := tf.xexp.CodeAtBytes(registrar.HashRegAddr) codehash := crypto.Keccak256Hash(codeb) reg := registrar.New(tf.xeth) @@ -297,7 +298,7 @@ func TestNatspecE2E(t *testing.T) { } func pendingTransactions(repl *testFrontend, t *testing.T) (txc int64, err error) { - txs := repl.ethereum.TxPool().GetTransactions() + txs := repl.expanse.TxPool().GetTransactions() return int64(len(txs)), nil } @@ -323,15 +324,16 @@ func processTxs(repl *testFrontend, t *testing.T, expTxc int) bool { return false } - err = repl.ethereum.StartMining(runtime.NumCPU(), "") + + err = repl.expanse.StartMining(runtime.NumCPU(), "") if err != nil { t.Errorf("unexpected error mining: %v", err) return false } - defer repl.ethereum.StopMining() + defer repl.expanse.StopMining() timer := time.NewTimer(100 * time.Second) - height := new(big.Int).Add(repl.xeth.CurrentBlock().Number(), big.NewInt(1)) + height := new(big.Int).Add(repl.xexp.CurrentBlock().Number(), big.NewInt(1)) repl.wait <- height select { case <-timer.C: diff --git a/common/natspec/natspec_e2e_test.go.orig b/common/natspec/natspec_e2e_test.go.orig new file mode 100644 index 0000000000..94d72b5cdd --- /dev/null +++ b/common/natspec/natspec_e2e_test.go.orig @@ -0,0 +1,253 @@ +package natspec + +import ( + "fmt" + "io/ioutil" + "os" + "strings" + "testing" + + "github.com/expanse-project/go-expanse/accounts" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/common/docserver" + "github.com/expanse-project/go-expanse/common/registrar" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/exp" + xe "github.com/expanse-project/go-expanse/xeth" +) + +const ( + testBalance = "10000000000000000000" + + testFileName = "long_file_name_for_testing_registration_of_URLs_longer_than_32_bytes.content" + + testNotice = "Register key `utils.toHex(_key)` <- content `utils.toHex(_content)`" + + testExpNotice = "Register key 0xadd1a7d961cff0242089674ec2ef6fca671ab15e1fe80e38859fc815b98d88ab <- content 0xb3a2dea218de5d8bbe6c4645aadbf67b5ab00ecb1a9ec95dbdad6a0eed3e41a7" + + testExpNotice2 = `About to submit transaction (NatSpec notice error: abi key does not match any method): {"params":[{"to":"%s","data": "0x31e12c20"}]}` + + testExpNotice3 = `About to submit transaction (no NatSpec info found for contract: content hash not found for '0x1392c62d05b2d149e22a339c531157ae06b44d39a674cce500064b12b9aeb019'): {"params":[{"to":"%s","data": "0x300a3bbfb3a2dea218de5d8bbe6c4645aadbf67b5ab00ecb1a9ec95dbdad6a0eed3e41a7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066696c653a2f2f2f746573742e636f6e74656e74"}]}` +) + +const ( + testUserDoc = ` +{ + "methods": { + "register(uint256,uint256)": { + "notice": "` + testNotice + `" + } + }, + "invariants": [ + { "notice": "" } + ], + "construction": [ + { "notice": "" } + ] +} +` + testAbiDefinition = ` +[{ + "name": "register", + "constant": false, + "type": "function", + "inputs": [{ + "name": "_key", + "type": "uint256" + }, { + "name": "_content", + "type": "uint256" + }], + "outputs": [] +}] +` + + testContractInfo = ` +{ + "userDoc": ` + testUserDoc + `, + "abiDefinition": ` + testAbiDefinition + ` +} +` +) + +type testFrontend struct { + t *testing.T + expanse *exp.Expanse + xeth *xe.XEth + coinbase common.Address + stateDb *state.StateDB + txc uint64 + lastConfirm string + wantNatSpec bool +} + +func (self *testFrontend) UnlockAccount(acc []byte) bool { + self.expanse.AccountManager().Unlock(common.BytesToAddress(acc), "password") + return true +} + +func (self *testFrontend) ConfirmTransaction(tx string) bool { + if self.wantNatSpec { + ds := docserver.New("/tmp/") + self.lastConfirm = GetNotice(self.xeth, tx, ds) + } + return true +} + +func testExp(t *testing.T) (expanse *exp.Expanse, err error) { + + os.RemoveAll("/tmp/exp-natspec/") + + err = os.MkdirAll("/tmp/exp-natspec/keystore", os.ModePerm) + if err != nil { + panic(err) + } + + // create a testAddress + ks := crypto.NewKeyStorePassphrase("/tmp/exp-natspec/keystore", crypto.LightScryptN, crypto.LightScryptP) + am := accounts.NewManager(ks) + testAccount, err := am.NewAccount("password") + if err != nil { + panic(err) + } + testAddress := strings.TrimPrefix(testAccount.Address.Hex(), "0x") + + // set up mock genesis with balance on the testAddress + core.GenesisAccounts = []byte(`{ + "` + testAddress + `": {"balance": "` + testBalance + `"} + }`) + + // only use minimalistic stack with no networking + expanse, err = exp.New(&exp.Config{ + DataDir: "/tmp/exp-natspec", + AccountManager: am, + MaxPeers: 0, + }) + + if err != nil { + panic(err) + } + + return +} + +func testInit(t *testing.T) (self *testFrontend) { + // initialise and start minimal expanse stack + expanse, err := testExp(t) + if err != nil { + t.Errorf("error creating expanse: %v", err) + return + } + err = expanse.Start() + if err != nil { + t.Errorf("error starting expanse: %v", err) + return + } + + // mock frontend + self = &testFrontend{t: t, expanse: expanse} + self.xeth = xe.New(expanse, self) + + addr, _ := expanse.Etherbase() + self.coinbase = addr + self.stateDb = self.expanse.ChainManager().State().Copy() + + // initialise the registry contracts + reg := registrar.New(self.xeth) + err = reg.SetHashReg("", addr) + if err != nil { + t.Errorf("error creating HashReg: %v", err) + } + err = reg.SetUrlHint("", addr) + if err != nil { + t.Errorf("error creating UrlHint: %v", err) + } + self.applyTxs() + + return + +} + +// this is needed for transaction to be applied to the state in testing +// the heavy lifing is done in XEth.ApplyTestTxs +// this is fragile, +// and does process leaking since xeth loops cannot quit safely +// should be replaced by proper mining with testDAG for easy full integration tests +func (self *testFrontend) applyTxs() { + self.txc, self.xeth = self.xexp.ApplyTestTxs(self.stateDb, self.coinbase, self.txc) + return +} + +// end to end test +func TestNatspecE2E(t *testing.T) { + t.Skip() + + tf := testInit(t) + defer tf.expanse.Stop() + + // create a contractInfo file (mock cloud-deployed contract metadocs) + // incidentally this is the info for the registry contract itself + ioutil.WriteFile("/tmp/"+testFileName, []byte(testContractInfo), os.ModePerm) + dochash := common.BytesToHash(crypto.Sha3([]byte(testContractInfo))) + + // take the codehash for the contract we wanna test + // codehex := tf.xexp.CodeAt(registar.HashRegAddr) + codeb := tf.xexp.CodeAtBytes(registrar.HashRegAddr) + codehash := common.BytesToHash(crypto.Sha3(codeb)) + + // use resolver to register codehash->dochash->url + // test if globalregistry works + // registrar.HashRefAddr = "0x0" + // registrar.UrlHintAddr = "0x0" + reg := registrar.New(tf.xeth) + _, err := reg.SetHashToHash(tf.coinbase, codehash, dochash) + if err != nil { + t.Errorf("error registering: %v", err) + } + _, err = reg.SetUrlToHash(tf.coinbase, dochash, "file:///"+testFileName) + if err != nil { + t.Errorf("error registering: %v", err) + } + // apply txs to the state + tf.applyTxs() + + // NatSpec info for register method of HashReg contract installed + // now using the same transactions to check confirm messages + + tf.wantNatSpec = true // this is set so now the backend uses natspec confirmation + _, err = reg.SetHashToHash(tf.coinbase, codehash, dochash) + if err != nil { + t.Errorf("error calling contract registry: %v", err) + } + + fmt.Printf("GlobalRegistrar: %v, HashReg: %v, UrlHint: %v\n", registrar.GlobalRegistrarAddr, registrar.HashRegAddr, registrar.UrlHintAddr) + if tf.lastConfirm != testExpNotice { + t.Errorf("Wrong confirm message. expected '%v', got '%v'", testExpNotice, tf.lastConfirm) + } + + // test unknown method + exp := fmt.Sprintf(testExpNotice2, registrar.HashRegAddr) + _, err = reg.SetOwner(tf.coinbase) + if err != nil { + t.Errorf("error setting owner: %v", err) + } + + if tf.lastConfirm != exp { + t.Errorf("Wrong confirm message, expected '%v', got '%v'", exp, tf.lastConfirm) + } + + // test unknown contract + exp = fmt.Sprintf(testExpNotice3, registrar.UrlHintAddr) + + _, err = reg.SetUrlToHash(tf.coinbase, dochash, "file:///test.content") + if err != nil { + t.Errorf("error registering: %v", err) + } + + if tf.lastConfirm != exp { + t.Errorf("Wrong confirm message, expected '%v', got '%v'", exp, tf.lastConfirm) + } + +} diff --git a/common/natspec/natspec_js.go b/common/natspec/natspec_js.go index 2b30d31d35..dd1ceee16e 100644 --- a/common/natspec/natspec_js.go +++ b/common/natspec/natspec_js.go @@ -1,41 +1,41 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package natspec -const natspecJS = //`require=function t(e,n,r){function i(f,u){if(!n[f]){if(!e[f]){var s="function"==typeof require&&require;if(!u&&s)return s(f,!0);if(o)return o(f,!0);var c=new Error("Cannot find module '"+f+"'");throw c.code="MODULE_NOT_FOUND",c}var a=n[f]={exports:{}};e[f][0].call(a.exports,function(t){var n=e[f][1][t];return i(n?n:t)},a,a.exports,t,e,n,r)}return n[f].exports}for(var o="function"==typeof require&&require,f=0;fv;v++)d.push(g(e.slice(0,s))),e=e.slice(s);n.push(d)}else r.prefixedType("string")(t[c].type)?(a=a.slice(s),n.push(g(e.slice(0,s))),e=e.slice(s)):(n.push(g(e.slice(0,s))),e=e.slice(s))}),n},g=function(t){var e={};return t.forEach(function(t){var r=n.extractDisplayName(t.name),i=n.extractTypeName(t.name),o=function(){var e=Array.prototype.slice.call(arguments);return a(t.inputs,e)};void 0===e[r]&&(e[r]=o),e[r][i]=o}),e},m=function(t){var e={};return t.forEach(function(t){var r=n.extractDisplayName(t.name),i=n.extractTypeName(t.name),o=function(e){return h(t.outputs,e)};void 0===e[r]&&(e[r]=o),e[r][i]=o}),e};e.exports={inputParser:g,outputParser:m,formatInput:a,formatOutput:h}},{"./const":4,"./formatters":5,"./types":6,"./utils":7}],4:[function(t,e){(function(n){if("build"!==n.env.NODE_ENV)var r=t("bignumber.js");var i=["wei","Kwei","Mwei","Gwei","szabo","finney","ether","grand","Mether","Gether","Tether","Pether","Eether","Zether","Yether","Nether","Dether","Vether","Uether"];e.exports={ETH_PADDING:32,ETH_SIGNATURE_LENGTH:4,ETH_UNITS:i,ETH_BIGNUMBER_ROUNDING_MODE:{ROUNDING_MODE:r.ROUND_DOWN},ETH_POLLING_TIMEOUT:1e3}}).call(this,t("_process"))},{_process:2,"bignumber.js":8}],5:[function(t,e){(function(n){if("build"!==n.env.NODE_ENV)var r=t("bignumber.js");var i=t("./utils"),o=t("./const"),f=function(t,e,n){return new Array(e-t.length+1).join(n?n:"0")+t},u=function(t){var e=2*o.ETH_PADDING;return t instanceof r||"number"==typeof t?("number"==typeof t&&(t=new r(t)),r.config(o.ETH_BIGNUMBER_ROUNDING_MODE),t=t.round(),t.lessThan(0)&&(t=new r("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",16).plus(t).plus(1)),t=t.toString(16)):t=0===t.indexOf("0x")?t.substr(2):"string"==typeof t?u(new r(t)):(+t).toString(16),f(t,e)},s=function(t){return i.fromAscii(t,o.ETH_PADDING).substr(2)},c=function(t){return"000000000000000000000000000000000000000000000000000000000000000"+(t?"1":"0")},a=function(t){return u(new r(t).times(new r(2).pow(128)))},l=function(t){return"1"===new r(t.substr(0,1),16).toString(2).substr(0,1)},p=function(t){return t=t||"0",l(t)?new r(t,16).minus(new r("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",16)).minus(1):new r(t,16)},h=function(t){return t=t||"0",new r(t,16)},g=function(t){return p(t).dividedBy(new r(2).pow(128))},m=function(t){return h(t).dividedBy(new r(2).pow(128))},d=function(t){return"0x"+t},v=function(t){return"0000000000000000000000000000000000000000000000000000000000000001"===t?!0:!1},w=function(t){return i.toAscii(t)},y=function(t){return"0x"+t.slice(t.length-40,t.length)};e.exports={formatInputInt:u,formatInputString:s,formatInputBool:c,formatInputReal:a,formatOutputInt:p,formatOutputUInt:h,formatOutputReal:g,formatOutputUReal:m,formatOutputHash:d,formatOutputBool:v,formatOutputString:w,formatOutputAddress:y}}).call(this,t("_process"))},{"./const":4,"./utils":7,_process:2,"bignumber.js":8}],6:[function(t,e){var n=t("./formatters"),r=function(t){return function(e){return 0===e.indexOf(t)}},i=function(t){return function(e){return t===e}},o=function(){return[{type:r("uint"),format:n.formatInputInt},{type:r("int"),format:n.formatInputInt},{type:r("hash"),format:n.formatInputInt},{type:r("string"),format:n.formatInputString},{type:r("real"),format:n.formatInputReal},{type:r("ureal"),format:n.formatInputReal},{type:i("address"),format:n.formatInputInt},{type:i("bool"),format:n.formatInputBool}]},f=function(){return[{type:r("uint"),format:n.formatOutputUInt},{type:r("int"),format:n.formatOutputInt},{type:r("hash"),format:n.formatOutputHash},{type:r("string"),format:n.formatOutputString},{type:r("real"),format:n.formatOutputReal},{type:r("ureal"),format:n.formatOutputUReal},{type:i("address"),format:n.formatOutputAddress},{type:i("bool"),format:n.formatOutputBool}]};e.exports={prefixedType:r,namedType:i,inputTypes:o,outputTypes:f}},{"./formatters":5}],7:[function(t,e){var n=t("./const"),r=function(t,e){for(var n=!1,r=0;rn;n+=2){var i=parseInt(t.substr(n,2),16);if(0===i)break;e+=String.fromCharCode(i)}return e},o=function(t){for(var e="",n=0;n3e3&&rr?"i":"").test(c))return m(a,c,u,r);u?(a.s=0>1/t?(c=c.slice(1),-1):1,$&&c.replace(/^0\.0*|\./,"").length>15&&U(L,O,t),u=!1):a.s=45===c.charCodeAt(0)?(c=c.slice(1),-1):1,c=n(c,10,r,a.s)}else{if(t instanceof e)return a.s=t.s,a.e=t.e,a.c=(t=t.c)?t.slice():t,void(L=0);if((u="number"==typeof t)&&0*t==0){if(a.s=0>1/t?(t=-t,-1):1,t===~~t){for(o=0,f=t;f>=10;f/=10,o++);return a.e=o,a.c=[t],void(L=0)}c=t+""}else{if(!d.test(c=t+""))return m(a,c,u);a.s=45===c.charCodeAt(0)?(c=c.slice(1),-1):1}}for((o=c.indexOf("."))>-1&&(c=c.replace(".","")),(f=c.search(/e/i))>0?(0>o&&(o=f),o+=+c.slice(f+1),c=c.substring(0,f)):0>o&&(o=c.length),f=0;48===c.charCodeAt(f);f++);for(s=c.length;48===c.charCodeAt(--s););if(c=c.slice(f,s+1))if(s=c.length,u&&$&&s>15&&U(L,O,a.s*t),o=o-f-1,o>q)a.c=a.e=null;else if(k>o)a.c=[a.e=0];else{if(a.e=o,a.c=[],f=(o+1)%I,0>o&&(f+=I),s>f){for(f&&a.c.push(+c.slice(0,f)),s-=I;s>f;)a.c.push(+c.slice(f,f+=I));c=c.slice(f),f=I-c.length}else f-=s;for(;f--;c+="0");a.c.push(+c)}else a.c=[a.e=0];L=0}function n(t,n,r,i){var f,u,s,a,p,h,g,m=t.indexOf("."),d=B,v=H;for(37>r&&(t=t.toLowerCase()),m>=0&&(s=Y,Y=0,t=t.replace(".",""),g=new e(r),p=g.pow(t.length-m),Y=s,g.c=c(l(o(p.c),p.e),10,n),g.e=g.c.length),h=c(t,r,n),u=s=h.length;0==h[--s];h.pop());if(!h[0])return"0";if(0>m?--u:(p.c=h,p.e=u,p.s=i,p=G(p,g,d,v,n),h=p.c,a=p.r,u=p.e),f=u+d+1,m=h[f],s=n/2,a=a||0>f||null!=h[f+1],a=4>v?(null!=m||a)&&(0==v||v==(p.s<0?3:2)):m>s||m==s&&(4==v||a||6==v&&1&h[f-1]||v==(p.s<0?8:7)),1>f||!h[0])t=a?l("1",-d):"0";else{if(h.length=f,a)for(--n;++h[--f]>n;)h[f]=0,f||(++u,h.unshift(1));for(s=h.length;!h[--s];);for(m=0,t="";s>=m;t+=N.charAt(h[m++]));t=l(t,u)}return t}function h(t,n,r,i){var f,u,s,c,p;if(r=null!=r&&z(r,0,8,i,b)?0|r:H,!t.c)return t.toString();if(f=t.c[0],s=t.e,null==n)p=o(t.c),p=19==i||24==i&&C>=s?a(p,s):l(p,s);else if(t=F(new e(t),n,r),u=t.e,p=o(t.c),c=p.length,19==i||24==i&&(u>=n||C>=u)){for(;n>c;p+="0",c++);p=a(p,u)}else if(n-=s,p=l(p,u),u+1>c){if(--n>0)for(p+=".";n--;p+="0");}else if(n+=u-c,n>0)for(u+1==c&&(p+=".");n--;p+="0");return t.s<0&&f?"-"+p:p}function S(t,n){var r,i,o=0;for(s(t[0])&&(t=t[0]),r=new e(t[0]);++ot||t>n||t!=p(t))&&U(r,(i||"decimal places")+(e>t||t>n?" out of range":" not an integer"),t),!0}function R(t,e,n){for(var r=1,i=e.length;!e[--i];e.pop());for(i=e[0];i>=10;i/=10,r++);return(n=r+n*I-1)>q?t.c=t.e=null:k>n?t.c=[t.e=0]:(t.e=n,t.c=e),t}function U(t,e,n){var r=new Error(["new BigNumber","cmp","config","div","divToInt","eq","gt","gte","lt","lte","minus","mod","plus","precision","random","round","shift","times","toDigits","toExponential","toFixed","toFormat","toFraction","pow","toPrecision","toString","BigNumber"][t]+"() "+e+": "+n);throw r.name="BigNumber Error",L=0,r}function F(t,e,n,r){var i,o,f,u,s,c,a,l=t.c,p=_;if(l){t:{for(i=1,u=l[0];u>=10;u/=10,i++);if(o=e-i,0>o)o+=I,f=e,s=l[c=0],a=s/p[i-f-1]%10|0;else if(c=v((o+1)/I),c>=l.length){if(!r)break t;for(;l.length<=c;l.push(0));s=a=0,i=1,o%=I,f=o-I+1}else{for(s=u=l[c],i=1;u>=10;u/=10,i++);o%=I,f=o-I+i,a=0>f?0:s/p[i-f-1]%10|0}if(r=r||0>e||null!=l[c+1]||(0>f?s:s%p[i-f-1]),r=4>n?(a||r)&&(0==n||n==(t.s<0?3:2)):a>5||5==a&&(4==n||r||6==n&&(o>0?f>0?s/p[i-f]:0:l[c-1])%10&1||n==(t.s<0?8:7)),1>e||!l[0])return l.length=0,r?(e-=t.e+1,l[0]=p[e%I],t.e=-e||0):l[0]=t.e=0,t;if(0==o?(l.length=c,u=1,c--):(l.length=c+1,u=p[I-o],l[c]=f>0?w(s/p[i-f]%p[f])*u:0),r)for(;;){if(0==c){for(o=1,f=l[0];f>=10;f/=10,o++);for(f=l[0]+=u,u=1;f>=10;f/=10,u++);o!=u&&(t.e++,l[0]==E&&(l[0]=1));break}if(l[c]+=u,l[c]!=E)break;l[c--]=0,u=1}for(o=l.length;0===l[--o];l.pop());}t.e>q?t.c=t.e=null:t.en?null!=(t=i[n++]):void 0};return f(e="DECIMAL_PLACES")&&z(t,0,D,2,e)&&(B=0|t),r[e]=B,f(e="ROUNDING_MODE")&&z(t,0,8,2,e)&&(H=0|t),r[e]=H,f(e="EXPONENTIAL_AT")&&(s(t)?z(t[0],-D,0,2,e)&&z(t[1],0,D,2,e)&&(C=0|t[0],j=0|t[1]):z(t,-D,D,2,e)&&(C=-(j=0|(0>t?-t:t)))),r[e]=[C,j],f(e="RANGE")&&(s(t)?z(t[0],-D,-1,2,e)&&z(t[1],1,D,2,e)&&(k=0|t[0],q=0|t[1]):z(t,-D,D,2,e)&&(0|t?k=-(q=0|(0>t?-t:t)):$&&U(2,e+" cannot be zero",t))),r[e]=[k,q],f(e="ERRORS")&&(t===!!t||1===t||0===t?(L=0,z=($=!!t)?A:u):$&&U(2,e+y,t)),r[e]=$,f(e="CRYPTO")&&(t===!!t||1===t||0===t?(V=!(!t||!g||"object"!=typeof g),t&&!V&&$&&U(2,"crypto unavailable",g)):$&&U(2,e+y,t)),r[e]=V,f(e="MODULO_MODE")&&z(t,0,9,2,e)&&(W=0|t),r[e]=W,f(e="POW_PRECISION")&&z(t,0,D,2,e)&&(Y=0|t),r[e]=Y,f(e="FORMAT")&&("object"==typeof t?Z=t:$&&U(2,e+" not an object",t)),r[e]=Z,r},e.max=function(){return S(arguments,M.lt)},e.min=function(){return S(arguments,M.gt)},e.random=function(){var t=9007199254740992,n=Math.random()*t&2097151?function(){return w(Math.random()*t)}:function(){return 8388608*(1073741824*Math.random()|0)+(8388608*Math.random()|0)};return function(t){var r,i,o,f,u,s=0,c=[],a=new e(P);if(t=null!=t&&z(t,0,D,14)?0|t:B,f=v(t/I),V)if(g&&g.getRandomValues){for(r=g.getRandomValues(new Uint32Array(f*=2));f>s;)u=131072*r[s]+(r[s+1]>>>11),u>=9e15?(i=g.getRandomValues(new Uint32Array(2)),r[s]=i[0],r[s+1]=i[1]):(c.push(u%1e14),s+=2);s=f/2}else if(g&&g.randomBytes){for(r=g.randomBytes(f*=7);f>s;)u=281474976710656*(31&r[s])+1099511627776*r[s+1]+4294967296*r[s+2]+16777216*r[s+3]+(r[s+4]<<16)+(r[s+5]<<8)+r[s+6],u>=9e15?g.randomBytes(7).copy(r,s):(c.push(u%1e14),s+=7);s=f/7}else $&&U(14,"crypto unavailable",g);if(!s)for(;f>s;)u=n(),9e15>u&&(c[s++]=u%1e14);for(f=c[--s],t%=I,f&&t&&(u=_[I-t],c[s]=w(f/u)*u);0===c[s];c.pop(),s--);if(0>s)c=[o=0];else{for(o=-1;0===c[0];c.shift(),o-=I);for(s=1,u=c[0];u>=10;u/=10,s++);I>s&&(o-=I-s)}return a.e=o,a.c=c,a}}(),G=function(){function t(t,e,n){var r,i,o,f,u=0,s=t.length,c=e%T,a=e/T|0;for(t=t.slice();s--;)o=t[s]%T,f=t[s]/T|0,r=a*o+f*c,i=c*o+r%T*T+u,u=(i/n|0)+(r/T|0)+a*f,t[s]=i%n;return u&&t.unshift(u),t}function n(t,e,n,r){var i,o;if(n!=r)o=n>r?1:-1;else for(i=o=0;n>i;i++)if(t[i]!=e[i]){o=t[i]>e[i]?1:-1;break}return o}function r(t,e,n,r){for(var i=0;n--;)t[n]-=i,i=t[n]1;t.shift());}return function(o,f,u,s,c){var a,l,p,h,g,m,d,v,y,b,O,N,x,_,T,D,S,A=o.s==f.s?1:-1,R=o.c,U=f.c;if(!(R&&R[0]&&U&&U[0]))return new e(o.s&&f.s&&(R?!U||R[0]!=U[0]:U)?R&&0==R[0]||!U?0*A:A/0:0/0);for(v=new e(A),y=v.c=[],l=o.e-f.e,A=u+l+1,c||(c=E,l=i(o.e/I)-i(f.e/I),A=A/I|0),p=0;U[p]==(R[p]||0);p++);if(U[p]>(R[p]||0)&&l--,0>A)y.push(1),h=!0;else{for(_=R.length,D=U.length,p=0,A+=2,g=w(c/(U[0]+1)),g>1&&(U=t(U,g,c),R=t(R,g,c),D=U.length,_=R.length),x=D,b=R.slice(0,D),O=b.length;D>O;b[O++]=0);S=U.slice(),S.unshift(0),T=U[0],U[1]>=c/2&&T++;do g=0,a=n(U,b,D,O),0>a?(N=b[0],D!=O&&(N=N*c+(b[1]||0)),g=w(N/T),g>1?(g>=c&&(g=c-1),m=t(U,g,c),d=m.length,O=b.length,a=n(m,b,d,O),1==a&&(g--,r(m,d>D?S:U,d,c))):(0==g&&(a=g=1),m=U.slice()),d=m.length,O>d&&m.unshift(0),r(b,m,O,c),-1==a&&(O=b.length,a=n(U,b,D,O),1>a&&(g++,r(b,O>D?S:U,O,c))),O=b.length):0===a&&(g++,b=[0]),y[p++]=g,a&&b[0]?b[O++]=R[x]||0:(b=[R[x]],O=1);while((x++<_||null!=b[0])&&A--);h=null!=b[0],y[0]||y.shift()}if(c==E){for(p=1,A=y[0];A>=10;A/=10,p++);F(v,u+(v.e=p+l*I-1)+1,s,h)}else v.e=l,v.r=+h;return v}}(),m==function(){var t=/^(-?)0([xbo])(\w[\w.]*$)/i,n=/^([^.]+)\.$/,r=/^\.([^.]+)$/,i=/^-?(Infinity|NaN)$/,o=/^\s*\+([\w.])|^\s+|\s+$/g;return function(f,u,s,c){var a,l=s?u:u.replace(o,"$1");if(i.test(l))f.s=isNaN(l)?null:0>l?-1:1;else{if(!s&&(l=l.replace(t,function(t,e,n){return a="x"==(n=n.toLowerCase())?16:"b"==n?2:8,c&&c!=a?t:e}),c&&(a=c,l=l.replace(n,"$1").replace(r,"0.$1")),u!=l))return new e(l,a);$&&U(L,"not a"+(c?" base "+c:"")+" number",u),f.s=null}f.c=f.e=null,L=0}}(),M.absoluteValue=M.abs=function(){var t=new e(this);return t.s<0&&(t.s=1),t},M.ceil=function(){return F(new e(this),this.e+1,2)},M.comparedTo=M.cmp=function(t,n){return L=1,f(this,new e(t,n))},M.decimalPlaces=M.dp=function(){var t,e,n=this.c;if(!n)return null;if(t=((e=n.length-1)-i(this.e/I))*I,e=n[e])for(;e%10==0;e/=10,t--);return 0>t&&(t=0),t},M.dividedBy=M.div=function(t,n){return L=3,G(this,new e(t,n),B,H)},M.dividedToIntegerBy=M.divToInt=function(t,n){return L=4,G(this,new e(t,n),0,1)},M.equals=M.eq=function(t,n){return L=5,0===f(this,new e(t,n))},M.floor=function(){return F(new e(this),this.e+1,3)},M.greaterThan=M.gt=function(t,n){return L=6,f(this,new e(t,n))>0},M.greaterThanOrEqualTo=M.gte=function(t,n){return L=7,1===(n=f(this,new e(t,n)))||0===n},M.isFinite=function(){return!!this.c},M.isInteger=M.isInt=function(){return!!this.c&&i(this.e/I)>this.c.length-2},M.isNaN=function(){return!this.s},M.isNegative=M.isNeg=function(){return this.s<0},M.isZero=function(){return!!this.c&&0==this.c[0]},M.lessThan=M.lt=function(t,n){return L=8,f(this,new e(t,n))<0},M.lessThanOrEqualTo=M.lte=function(t,n){return L=9,-1===(n=f(this,new e(t,n)))||0===n},M.minus=M.sub=function(t,n){var r,o,f,u,s=this,c=s.s;if(L=10,t=new e(t,n),n=t.s,!c||!n)return new e(0/0);if(c!=n)return t.s=-n,s.plus(t);var a=s.e/I,l=t.e/I,p=s.c,h=t.c;if(!a||!l){if(!p||!h)return p?(t.s=-n,t):new e(h?s:0/0);if(!p[0]||!h[0])return h[0]?(t.s=-n,t):new e(p[0]?s:3==H?-0:0)}if(a=i(a),l=i(l),p=p.slice(),c=a-l){for((u=0>c)?(c=-c,f=p):(l=a,f=h),f.reverse(),n=c;n--;f.push(0));f.reverse()}else for(o=(u=(c=p.length)<(n=h.length))?c:n,c=n=0;o>n;n++)if(p[n]!=h[n]){u=p[n]0)for(;n--;p[r++]=0);for(n=E-1;o>c;){if(p[--o]0?(s=u,r=a):(f=-f,r=c),r.reverse();f--;r.push(0));r.reverse()}for(f=c.length,n=a.length,0>f-n&&(r=a,a=c,c=r,n=f),f=0;n;)f=(c[--n]=c[n]+a[n]+f)/E|0,c[n]%=E;return f&&(c.unshift(f),++s),R(t,c,s)},M.precision=M.sd=function(t){var e,n,r=this,i=r.c;if(null!=t&&t!==!!t&&1!==t&&0!==t&&($&&U(13,"argument"+y,t),t!=!!t&&(t=null)),!i)return null;if(n=i.length-1,e=n*I+1,n=i[n]){for(;n%10==0;n/=10,e--);for(n=i[0];n>=10;n/=10,e++);}return t&&r.e+1>e&&(e=r.e+1),e},M.round=function(t,n){var r=new e(this);return(null==t||z(t,0,D,15))&&F(r,~~t+this.e+1,null!=n&&z(n,0,8,15,b)?0|n:H),r},M.shift=function(t){var n=this;return z(t,-x,x,16,"argument")?n.times("1e"+p(t)):new e(n.c&&n.c[0]&&(-x>t||t>x)?n.s*(0>t?0:1/0):n)},M.squareRoot=M.sqrt=function(){var t,n,r,f,u,s=this,c=s.c,a=s.s,l=s.e,p=B+4,h=new e("0.5");if(1!==a||!c||!c[0])return new e(!a||0>a&&(!c||c[0])?0/0:c?s:1/0);if(a=Math.sqrt(+s),0==a||a==1/0?(n=o(c),(n.length+l)%2==0&&(n+="0"),a=Math.sqrt(n),l=i((l+1)/2)-(0>l||l%2),a==1/0?n="1e"+l:(n=a.toExponential(),n=n.slice(0,n.indexOf("e")+1)+l),r=new e(n)):r=new e(a+""),r.c[0])for(l=r.e,a=l+p,3>a&&(a=0);;)if(u=r,r=h.times(u.plus(G(s,u,p,1))),o(u.c).slice(0,a)===(n=o(r.c)).slice(0,a)){if(r.ea&&(d=b,b=O,O=d,f=a,a=h,h=f),f=a+h,d=[];f--;d.push(0));for(v=E,w=T,f=h;--f>=0;){for(r=0,g=O[f]%w,m=O[f]/w|0,s=a,u=f+s;u>f;)l=b[--s]%w,p=b[s]/w|0,c=m*l+p*g,l=g*l+c%w*w+d[u]+r,r=(l/v|0)+(c/w|0)+m*p,d[u--]=l%v;d[u]=r}return r?++o:d.shift(),R(t,d,o)},M.toDigits=function(t,n){var r=new e(this);return t=null!=t&&z(t,1,D,18,"precision")?0|t:null,n=null!=n&&z(n,0,8,18,b)?0|n:H,t?F(r,t,n):r},M.toExponential=function(t,e){return h(this,null!=t&&z(t,0,D,19)?~~t+1:null,e,19)},M.toFixed=function(t,e){return h(this,null!=t&&z(t,0,D,20)?~~t+this.e+1:null,e,20)},M.toFormat=function(t,e){var n=h(this,null!=t&&z(t,0,D,21)?~~t+this.e+1:null,e,21);if(this.c){var r,i=n.split("."),o=+Z.groupSize,f=+Z.secondaryGroupSize,u=Z.groupSeparator,s=i[0],c=i[1],a=this.s<0,l=a?s.slice(1):s,p=l.length;if(f&&(r=o,o=f,f=r,p-=r),o>0&&p>0){for(r=p%o||o,s=l.substr(0,r);p>r;r+=o)s+=u+l.substr(r,o);f>0&&(s+=u+l.slice(r)),a&&(s="-"+s)}n=c?s+Z.decimalSeparator+((f=+Z.fractionGroupSize)?c.replace(new RegExp("\\d{"+f+"}\\B","g"),"$&"+Z.fractionGroupSeparator):c):s}return n},M.toFraction=function(t){var n,r,i,f,u,s,c,a,l,p=$,h=this,g=h.c,m=new e(P),d=r=new e(P),v=c=new e(P);if(null!=t&&($=!1,s=new e(t),$=p,(!(p=s.isInt())||s.lt(P))&&($&&U(22,"max denominator "+(p?"out of range":"not an integer"),t),t=!p&&s.c&&F(s,s.e+1,1).gte(P)?s:null)),!g)return h.toString();for(l=o(g),f=m.e=l.length-h.e-1,m.c[0]=_[(u=f%I)<0?I+u:u],t=!t||s.cmp(m)>0?f>0?m:d:s,u=q,q=1/0,s=new e(l),c.c[0]=0;a=G(s,m,0,1),i=r.plus(a.times(v)),1!=i.cmp(t);)r=v,v=i,d=c.plus(a.times(i=d)),c=i,m=s.minus(a.times(i=m)),s=i;return i=G(t.minus(r),v,0,1),c=c.plus(i.times(d)),r=r.plus(i.times(v)),c.s=d.s=h.s,f*=2,n=G(d,v,f,H).minus(h).abs().cmp(G(c,r,f,H).minus(h).abs())<1?[d.toString(),v.toString()]:[c.toString(),r.toString()],q=u,n},M.toNumber=function(){var t=this;return+t||(t.s?0*t.s:0/0)},M.toPower=M.pow=function(t){var n,r,i=w(0>t?-t:+t),o=this;if(!z(t,-x,x,23,"exponent")&&(!isFinite(t)||i>x&&(t/=0)||parseFloat(t)!=t&&!(t=0/0)))return new e(Math.pow(+o,t));for(n=Y?v(Y/I+2):0,r=new e(P);;){if(i%2){if(r=r.times(o),!r.c)break;n&&r.c.length>n&&(r.c.length=n)}if(i=w(i/2),!i)break;o=o.times(o),n&&o.c&&o.c.length>n&&(o.c.length=n)}return 0>t&&(r=P.div(r)),n?F(r,Y,H):r},M.toPrecision=function(t,e){return h(this,null!=t&&z(t,1,D,24,"precision")?0|t:null,e,24)},M.toString=function(t){var e,r=this,i=r.s,f=r.e;return null===f?i?(e="Infinity",0>i&&(e="-"+e)):e="NaN":(e=o(r.c),e=null!=t&&z(t,2,64,25,"base")?n(l(e,f),0|t,10,i):C>=f||f>=j?a(e,f):l(e,f),0>i&&r.c[0]&&(e="-"+e)),e},M.truncated=M.trunc=function(){return F(new e(this),this.e+1,1)},M.valueOf=M.toJSON=function(){return this.toString()},null!=t&&e.config(t),e}function i(t){var e=0|t;return t>0||t===e?e:e-1}function o(t){for(var e,n,r=1,i=t.length,o=t[0]+"";i>r;){for(e=t[r++]+"",n=I-e.length;n--;e="0"+e);o+=e}for(i=o.length;48===o.charCodeAt(--i););return o.slice(0,i+1||1)}function f(t,e){var n,r,i=t.c,o=e.c,f=t.s,u=e.s,s=t.e,c=e.e;if(!f||!u)return null;if(n=i&&!i[0],r=o&&!o[0],n||r)return n?r?0:-u:f;if(f!=u)return f;if(n=0>f,r=s==c,!i||!o)return r?0:!i^n?1:-1;if(!r)return s>c^n?1:-1;for(u=(s=i.length)<(c=o.length)?s:c,f=0;u>f;f++)if(i[f]!=o[f])return i[f]>o[f]^n?1:-1;return s==c?0:s>c^n?1:-1}function u(t,e,n){return(t=p(t))>=e&&n>=t}function s(t){return"[object Array]"==Object.prototype.toString.call(t)}function c(t,e,n){for(var r,i,o=[0],f=0,u=t.length;u>f;){for(i=o.length;i--;o[i]*=e);for(o[r=0]+=N.indexOf(t.charAt(f++));rn-1&&(null==o[r+1]&&(o[r+1]=0),o[r+1]+=o[r]/n|0,o[r]%=n)}return o.reverse()}function a(t,e){return(t.length>1?t.charAt(0)+"."+t.slice(1):t)+(0>e?"e":"e+")+e}function l(t,e){var n,r;if(0>e){for(r="0.";++e;r+="0");t=r+t}else if(n=t.length,++e>n){for(r="0",e-=n;--e;r+="0");t+=r}else n>e&&(t=t.slice(0,e)+"."+t.slice(e));return t}function p(t){return t=parseFloat(t),0>t?v(t):w(t)}var h,g,m,d=/^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i,v=Math.ceil,w=Math.floor,y=" not a boolean or binary digit",b="rounding mode",O="number type has more than 15 significant digits",N="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_",E=1e14,I=14,x=9007199254740991,_=[1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13],T=1e7,D=1e9;if(h=r(),"function"==typeof define&&define.amd)define(function(){return h});else if("undefined"!=typeof e&&e.exports){if(e.exports=h,!g)try{g=t("crypto")}catch(S){}}else n.BigNumber=h}(this)},{crypto:1}],natspec:[function(t,e){var n=t("./node_modules/ethereum.js/lib/abi.js"),r=function(){var t=function(t,e){Object.keys(t).forEach(function(n){e[n]=t[n]})},e=function(t){return Object.keys(t).reduce(function(t,e){return t+"var "+e+" = context['"+e+"'];\n"},"")},r=function(t,e){return t.filter(function(t){return t.name===e})[0]},i=function(t,e){var r=n.formatOutput(t.inputs,"0x"+e.params[0].data.slice(10));return t.inputs.reduce(function(t,e,n){return t[e.name]=r[n],t},{})},o=function(t,e){var n,r="",i=/\` + "`" + `(?:\\.|[^` + "`" + `\\])*\` + "`" + `/gim,o=0;try{for(;null!==(n=i.exec(t));){var f=i.lastIndex-n[0].length,u=n[0].slice(1,n[0].length-1);r+=t.slice(o,f);var s=e(u);r+=s,o=i.lastIndex}r+=t.slice(o)}catch(c){throw new Error("Natspec evaluation failed, wrong input params")}return r},f=function(n,f){var u={};if(f)try{var s=r(f.abi,f.method),c=i(s,f.transaction);t(c,u)}catch(a){throw new Error("Natspec evaluation failed, method does not exist")}var l=e(u),p=o(n,function(t){var e=new Function("context",l+"return "+t+";");return e(u).toString()});return p},u=function(t,e){try{return f(t,e)}catch(n){return n.message}};return{evaluateExpression:f,evaluateExpressionSafe:u}}();e.exports=r},{"./node_modules/ethereum.js/lib/abi.js":3}]},{},[]); +const natspecJS = //`require=function t(e,n,r){function i(f,u){if(!n[f]){if(!e[f]){var s="function"==typeof require&&require;if(!u&&s)return s(f,!0);if(o)return o(f,!0);var c=new Error("Cannot find module '"+f+"'");throw c.code="MODULE_NOT_FOUND",c}var a=n[f]={exports:{}};e[f][0].call(a.exports,function(t){var n=e[f][1][t];return i(n?n:t)},a,a.exports,t,e,n,r)}return n[f].exports}for(var o="function"==typeof require&&require,f=0;fv;v++)d.push(g(e.slice(0,s))),e=e.slice(s);n.push(d)}else r.prefixedType("string")(t[c].type)?(a=a.slice(s),n.push(g(e.slice(0,s))),e=e.slice(s)):(n.push(g(e.slice(0,s))),e=e.slice(s))}),n},g=function(t){var e={};return t.forEach(function(t){var r=n.extractDisplayName(t.name),i=n.extractTypeName(t.name),o=function(){var e=Array.prototype.slice.call(arguments);return a(t.inputs,e)};void 0===e[r]&&(e[r]=o),e[r][i]=o}),e},m=function(t){var e={};return t.forEach(function(t){var r=n.extractDisplayName(t.name),i=n.extractTypeName(t.name),o=function(e){return h(t.outputs,e)};void 0===e[r]&&(e[r]=o),e[r][i]=o}),e};e.exports={inputParser:g,outputParser:m,formatInput:a,formatOutput:h}},{"./const":4,"./formatters":5,"./types":6,"./utils":7}],4:[function(t,e){(function(n){if("build"!==n.env.NODE_ENV)var r=t("bignumber.js");var i=["wei","Kwei","Mwei","Gwei","szabo","finney","expanse","grand","Mexpanse","Gexpanse","Texpanse","Pexpanse","Eexpanse","Zexpanse","Yexpanse","Nexpanse","Dexpanse","Vexpanse","Uexpanse"];e.exports={ETH_PADDING:32,ETH_SIGNATURE_LENGTH:4,ETH_UNITS:i,ETH_BIGNUMBER_ROUNDING_MODE:{ROUNDING_MODE:r.ROUND_DOWN},ETH_POLLING_TIMEOUT:1e3}}).call(this,t("_process"))},{_process:2,"bignumber.js":8}],5:[function(t,e){(function(n){if("build"!==n.env.NODE_ENV)var r=t("bignumber.js");var i=t("./utils"),o=t("./const"),f=function(t,e,n){return new Array(e-t.length+1).join(n?n:"0")+t},u=function(t){var e=2*o.ETH_PADDING;return t instanceof r||"number"==typeof t?("number"==typeof t&&(t=new r(t)),r.config(o.ETH_BIGNUMBER_ROUNDING_MODE),t=t.round(),t.lessThan(0)&&(t=new r("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",16).plus(t).plus(1)),t=t.toString(16)):t=0===t.indexOf("0x")?t.substr(2):"string"==typeof t?u(new r(t)):(+t).toString(16),f(t,e)},s=function(t){return i.fromAscii(t,o.ETH_PADDING).substr(2)},c=function(t){return"000000000000000000000000000000000000000000000000000000000000000"+(t?"1":"0")},a=function(t){return u(new r(t).times(new r(2).pow(128)))},l=function(t){return"1"===new r(t.substr(0,1),16).toString(2).substr(0,1)},p=function(t){return t=t||"0",l(t)?new r(t,16).minus(new r("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",16)).minus(1):new r(t,16)},h=function(t){return t=t||"0",new r(t,16)},g=function(t){return p(t).dividedBy(new r(2).pow(128))},m=function(t){return h(t).dividedBy(new r(2).pow(128))},d=function(t){return"0x"+t},v=function(t){return"0000000000000000000000000000000000000000000000000000000000000001"===t?!0:!1},w=function(t){return i.toAscii(t)},y=function(t){return"0x"+t.slice(t.length-40,t.length)};e.exports={formatInputInt:u,formatInputString:s,formatInputBool:c,formatInputReal:a,formatOutputInt:p,formatOutputUInt:h,formatOutputReal:g,formatOutputUReal:m,formatOutputHash:d,formatOutputBool:v,formatOutputString:w,formatOutputAddress:y}}).call(this,t("_process"))},{"./const":4,"./utils":7,_process:2,"bignumber.js":8}],6:[function(t,e){var n=t("./formatters"),r=function(t){return function(e){return 0===e.indexOf(t)}},i=function(t){return function(e){return t===e}},o=function(){return[{type:r("uint"),format:n.formatInputInt},{type:r("int"),format:n.formatInputInt},{type:r("hash"),format:n.formatInputInt},{type:r("string"),format:n.formatInputString},{type:r("real"),format:n.formatInputReal},{type:r("ureal"),format:n.formatInputReal},{type:i("address"),format:n.formatInputInt},{type:i("bool"),format:n.formatInputBool}]},f=function(){return[{type:r("uint"),format:n.formatOutputUInt},{type:r("int"),format:n.formatOutputInt},{type:r("hash"),format:n.formatOutputHash},{type:r("string"),format:n.formatOutputString},{type:r("real"),format:n.formatOutputReal},{type:r("ureal"),format:n.formatOutputUReal},{type:i("address"),format:n.formatOutputAddress},{type:i("bool"),format:n.formatOutputBool}]};e.exports={prefixedType:r,namedType:i,inputTypes:o,outputTypes:f}},{"./formatters":5}],7:[function(t,e){var n=t("./const"),r=function(t,e){for(var n=!1,r=0;rn;n+=2){var i=parseInt(t.substr(n,2),16);if(0===i)break;e+=String.fromCharCode(i)}return e},o=function(t){for(var e="",n=0;n3e3&&rr?"i":"").test(c))return m(a,c,u,r);u?(a.s=0>1/t?(c=c.slice(1),-1):1,$&&c.replace(/^0\.0*|\./,"").length>15&&U(L,O,t),u=!1):a.s=45===c.charCodeAt(0)?(c=c.slice(1),-1):1,c=n(c,10,r,a.s)}else{if(t instanceof e)return a.s=t.s,a.e=t.e,a.c=(t=t.c)?t.slice():t,void(L=0);if((u="number"==typeof t)&&0*t==0){if(a.s=0>1/t?(t=-t,-1):1,t===~~t){for(o=0,f=t;f>=10;f/=10,o++);return a.e=o,a.c=[t],void(L=0)}c=t+""}else{if(!d.test(c=t+""))return m(a,c,u);a.s=45===c.charCodeAt(0)?(c=c.slice(1),-1):1}}for((o=c.indexOf("."))>-1&&(c=c.replace(".","")),(f=c.search(/e/i))>0?(0>o&&(o=f),o+=+c.slice(f+1),c=c.substring(0,f)):0>o&&(o=c.length),f=0;48===c.charCodeAt(f);f++);for(s=c.length;48===c.charCodeAt(--s););if(c=c.slice(f,s+1))if(s=c.length,u&&$&&s>15&&U(L,O,a.s*t),o=o-f-1,o>q)a.c=a.e=null;else if(k>o)a.c=[a.e=0];else{if(a.e=o,a.c=[],f=(o+1)%I,0>o&&(f+=I),s>f){for(f&&a.c.push(+c.slice(0,f)),s-=I;s>f;)a.c.push(+c.slice(f,f+=I));c=c.slice(f),f=I-c.length}else f-=s;for(;f--;c+="0");a.c.push(+c)}else a.c=[a.e=0];L=0}function n(t,n,r,i){var f,u,s,a,p,h,g,m=t.indexOf("."),d=B,v=H;for(37>r&&(t=t.toLowerCase()),m>=0&&(s=Y,Y=0,t=t.replace(".",""),g=new e(r),p=g.pow(t.length-m),Y=s,g.c=c(l(o(p.c),p.e),10,n),g.e=g.c.length),h=c(t,r,n),u=s=h.length;0==h[--s];h.pop());if(!h[0])return"0";if(0>m?--u:(p.c=h,p.e=u,p.s=i,p=G(p,g,d,v,n),h=p.c,a=p.r,u=p.e),f=u+d+1,m=h[f],s=n/2,a=a||0>f||null!=h[f+1],a=4>v?(null!=m||a)&&(0==v||v==(p.s<0?3:2)):m>s||m==s&&(4==v||a||6==v&&1&h[f-1]||v==(p.s<0?8:7)),1>f||!h[0])t=a?l("1",-d):"0";else{if(h.length=f,a)for(--n;++h[--f]>n;)h[f]=0,f||(++u,h.unshift(1));for(s=h.length;!h[--s];);for(m=0,t="";s>=m;t+=N.charAt(h[m++]));t=l(t,u)}return t}function h(t,n,r,i){var f,u,s,c,p;if(r=null!=r&&z(r,0,8,i,b)?0|r:H,!t.c)return t.toString();if(f=t.c[0],s=t.e,null==n)p=o(t.c),p=19==i||24==i&&C>=s?a(p,s):l(p,s);else if(t=F(new e(t),n,r),u=t.e,p=o(t.c),c=p.length,19==i||24==i&&(u>=n||C>=u)){for(;n>c;p+="0",c++);p=a(p,u)}else if(n-=s,p=l(p,u),u+1>c){if(--n>0)for(p+=".";n--;p+="0");}else if(n+=u-c,n>0)for(u+1==c&&(p+=".");n--;p+="0");return t.s<0&&f?"-"+p:p}function S(t,n){var r,i,o=0;for(s(t[0])&&(t=t[0]),r=new e(t[0]);++ot||t>n||t!=p(t))&&U(r,(i||"decimal places")+(e>t||t>n?" out of range":" not an integer"),t),!0}function R(t,e,n){for(var r=1,i=e.length;!e[--i];e.pop());for(i=e[0];i>=10;i/=10,r++);return(n=r+n*I-1)>q?t.c=t.e=null:k>n?t.c=[t.e=0]:(t.e=n,t.c=e),t}function U(t,e,n){var r=new Error(["new BigNumber","cmp","config","div","divToInt","eq","gt","gte","lt","lte","minus","mod","plus","precision","random","round","shift","times","toDigits","toExponential","toFixed","toFormat","toFraction","pow","toPrecision","toString","BigNumber"][t]+"() "+e+": "+n);throw r.name="BigNumber Error",L=0,r}function F(t,e,n,r){var i,o,f,u,s,c,a,l=t.c,p=_;if(l){t:{for(i=1,u=l[0];u>=10;u/=10,i++);if(o=e-i,0>o)o+=I,f=e,s=l[c=0],a=s/p[i-f-1]%10|0;else if(c=v((o+1)/I),c>=l.length){if(!r)break t;for(;l.length<=c;l.push(0));s=a=0,i=1,o%=I,f=o-I+1}else{for(s=u=l[c],i=1;u>=10;u/=10,i++);o%=I,f=o-I+i,a=0>f?0:s/p[i-f-1]%10|0}if(r=r||0>e||null!=l[c+1]||(0>f?s:s%p[i-f-1]),r=4>n?(a||r)&&(0==n||n==(t.s<0?3:2)):a>5||5==a&&(4==n||r||6==n&&(o>0?f>0?s/p[i-f]:0:l[c-1])%10&1||n==(t.s<0?8:7)),1>e||!l[0])return l.length=0,r?(e-=t.e+1,l[0]=p[e%I],t.e=-e||0):l[0]=t.e=0,t;if(0==o?(l.length=c,u=1,c--):(l.length=c+1,u=p[I-o],l[c]=f>0?w(s/p[i-f]%p[f])*u:0),r)for(;;){if(0==c){for(o=1,f=l[0];f>=10;f/=10,o++);for(f=l[0]+=u,u=1;f>=10;f/=10,u++);o!=u&&(t.e++,l[0]==E&&(l[0]=1));break}if(l[c]+=u,l[c]!=E)break;l[c--]=0,u=1}for(o=l.length;0===l[--o];l.pop());}t.e>q?t.c=t.e=null:t.en?null!=(t=i[n++]):void 0};return f(e="DECIMAL_PLACES")&&z(t,0,D,2,e)&&(B=0|t),r[e]=B,f(e="ROUNDING_MODE")&&z(t,0,8,2,e)&&(H=0|t),r[e]=H,f(e="EXPONENTIAL_AT")&&(s(t)?z(t[0],-D,0,2,e)&&z(t[1],0,D,2,e)&&(C=0|t[0],j=0|t[1]):z(t,-D,D,2,e)&&(C=-(j=0|(0>t?-t:t)))),r[e]=[C,j],f(e="RANGE")&&(s(t)?z(t[0],-D,-1,2,e)&&z(t[1],1,D,2,e)&&(k=0|t[0],q=0|t[1]):z(t,-D,D,2,e)&&(0|t?k=-(q=0|(0>t?-t:t)):$&&U(2,e+" cannot be zero",t))),r[e]=[k,q],f(e="ERRORS")&&(t===!!t||1===t||0===t?(L=0,z=($=!!t)?A:u):$&&U(2,e+y,t)),r[e]=$,f(e="CRYPTO")&&(t===!!t||1===t||0===t?(V=!(!t||!g||"object"!=typeof g),t&&!V&&$&&U(2,"crypto unavailable",g)):$&&U(2,e+y,t)),r[e]=V,f(e="MODULO_MODE")&&z(t,0,9,2,e)&&(W=0|t),r[e]=W,f(e="POW_PRECISION")&&z(t,0,D,2,e)&&(Y=0|t),r[e]=Y,f(e="FORMAT")&&("object"==typeof t?Z=t:$&&U(2,e+" not an object",t)),r[e]=Z,r},e.max=function(){return S(arguments,M.lt)},e.min=function(){return S(arguments,M.gt)},e.random=function(){var t=9007199254740992,n=Math.random()*t&2097151?function(){return w(Math.random()*t)}:function(){return 8388608*(1073741824*Math.random()|0)+(8388608*Math.random()|0)};return function(t){var r,i,o,f,u,s=0,c=[],a=new e(P);if(t=null!=t&&z(t,0,D,14)?0|t:B,f=v(t/I),V)if(g&&g.getRandomValues){for(r=g.getRandomValues(new Uint32Array(f*=2));f>s;)u=131072*r[s]+(r[s+1]>>>11),u>=9e15?(i=g.getRandomValues(new Uint32Array(2)),r[s]=i[0],r[s+1]=i[1]):(c.push(u%1e14),s+=2);s=f/2}else if(g&&g.randomBytes){for(r=g.randomBytes(f*=7);f>s;)u=281474976710656*(31&r[s])+1099511627776*r[s+1]+4294967296*r[s+2]+16777216*r[s+3]+(r[s+4]<<16)+(r[s+5]<<8)+r[s+6],u>=9e15?g.randomBytes(7).copy(r,s):(c.push(u%1e14),s+=7);s=f/7}else $&&U(14,"crypto unavailable",g);if(!s)for(;f>s;)u=n(),9e15>u&&(c[s++]=u%1e14);for(f=c[--s],t%=I,f&&t&&(u=_[I-t],c[s]=w(f/u)*u);0===c[s];c.pop(),s--);if(0>s)c=[o=0];else{for(o=-1;0===c[0];c.shift(),o-=I);for(s=1,u=c[0];u>=10;u/=10,s++);I>s&&(o-=I-s)}return a.e=o,a.c=c,a}}(),G=function(){function t(t,e,n){var r,i,o,f,u=0,s=t.length,c=e%T,a=e/T|0;for(t=t.slice();s--;)o=t[s]%T,f=t[s]/T|0,r=a*o+f*c,i=c*o+r%T*T+u,u=(i/n|0)+(r/T|0)+a*f,t[s]=i%n;return u&&t.unshift(u),t}function n(t,e,n,r){var i,o;if(n!=r)o=n>r?1:-1;else for(i=o=0;n>i;i++)if(t[i]!=e[i]){o=t[i]>e[i]?1:-1;break}return o}function r(t,e,n,r){for(var i=0;n--;)t[n]-=i,i=t[n]1;t.shift());}return function(o,f,u,s,c){var a,l,p,h,g,m,d,v,y,b,O,N,x,_,T,D,S,A=o.s==f.s?1:-1,R=o.c,U=f.c;if(!(R&&R[0]&&U&&U[0]))return new e(o.s&&f.s&&(R?!U||R[0]!=U[0]:U)?R&&0==R[0]||!U?0*A:A/0:0/0);for(v=new e(A),y=v.c=[],l=o.e-f.e,A=u+l+1,c||(c=E,l=i(o.e/I)-i(f.e/I),A=A/I|0),p=0;U[p]==(R[p]||0);p++);if(U[p]>(R[p]||0)&&l--,0>A)y.push(1),h=!0;else{for(_=R.length,D=U.length,p=0,A+=2,g=w(c/(U[0]+1)),g>1&&(U=t(U,g,c),R=t(R,g,c),D=U.length,_=R.length),x=D,b=R.slice(0,D),O=b.length;D>O;b[O++]=0);S=U.slice(),S.unshift(0),T=U[0],U[1]>=c/2&&T++;do g=0,a=n(U,b,D,O),0>a?(N=b[0],D!=O&&(N=N*c+(b[1]||0)),g=w(N/T),g>1?(g>=c&&(g=c-1),m=t(U,g,c),d=m.length,O=b.length,a=n(m,b,d,O),1==a&&(g--,r(m,d>D?S:U,d,c))):(0==g&&(a=g=1),m=U.slice()),d=m.length,O>d&&m.unshift(0),r(b,m,O,c),-1==a&&(O=b.length,a=n(U,b,D,O),1>a&&(g++,r(b,O>D?S:U,O,c))),O=b.length):0===a&&(g++,b=[0]),y[p++]=g,a&&b[0]?b[O++]=R[x]||0:(b=[R[x]],O=1);while((x++<_||null!=b[0])&&A--);h=null!=b[0],y[0]||y.shift()}if(c==E){for(p=1,A=y[0];A>=10;A/=10,p++);F(v,u+(v.e=p+l*I-1)+1,s,h)}else v.e=l,v.r=+h;return v}}(),m==function(){var t=/^(-?)0([xbo])(\w[\w.]*$)/i,n=/^([^.]+)\.$/,r=/^\.([^.]+)$/,i=/^-?(Infinity|NaN)$/,o=/^\s*\+([\w.])|^\s+|\s+$/g;return function(f,u,s,c){var a,l=s?u:u.replace(o,"$1");if(i.test(l))f.s=isNaN(l)?null:0>l?-1:1;else{if(!s&&(l=l.replace(t,function(t,e,n){return a="x"==(n=n.toLowerCase())?16:"b"==n?2:8,c&&c!=a?t:e}),c&&(a=c,l=l.replace(n,"$1").replace(r,"0.$1")),u!=l))return new e(l,a);$&&U(L,"not a"+(c?" base "+c:"")+" number",u),f.s=null}f.c=f.e=null,L=0}}(),M.absoluteValue=M.abs=function(){var t=new e(this);return t.s<0&&(t.s=1),t},M.ceil=function(){return F(new e(this),this.e+1,2)},M.comparedTo=M.cmp=function(t,n){return L=1,f(this,new e(t,n))},M.decimalPlaces=M.dp=function(){var t,e,n=this.c;if(!n)return null;if(t=((e=n.length-1)-i(this.e/I))*I,e=n[e])for(;e%10==0;e/=10,t--);return 0>t&&(t=0),t},M.dividedBy=M.div=function(t,n){return L=3,G(this,new e(t,n),B,H)},M.dividedToIntegerBy=M.divToInt=function(t,n){return L=4,G(this,new e(t,n),0,1)},M.equals=M.eq=function(t,n){return L=5,0===f(this,new e(t,n))},M.floor=function(){return F(new e(this),this.e+1,3)},M.greaterThan=M.gt=function(t,n){return L=6,f(this,new e(t,n))>0},M.greaterThanOrEqualTo=M.gte=function(t,n){return L=7,1===(n=f(this,new e(t,n)))||0===n},M.isFinite=function(){return!!this.c},M.isInteger=M.isInt=function(){return!!this.c&&i(this.e/I)>this.c.length-2},M.isNaN=function(){return!this.s},M.isNegative=M.isNeg=function(){return this.s<0},M.isZero=function(){return!!this.c&&0==this.c[0]},M.lessThan=M.lt=function(t,n){return L=8,f(this,new e(t,n))<0},M.lessThanOrEqualTo=M.lte=function(t,n){return L=9,-1===(n=f(this,new e(t,n)))||0===n},M.minus=M.sub=function(t,n){var r,o,f,u,s=this,c=s.s;if(L=10,t=new e(t,n),n=t.s,!c||!n)return new e(0/0);if(c!=n)return t.s=-n,s.plus(t);var a=s.e/I,l=t.e/I,p=s.c,h=t.c;if(!a||!l){if(!p||!h)return p?(t.s=-n,t):new e(h?s:0/0);if(!p[0]||!h[0])return h[0]?(t.s=-n,t):new e(p[0]?s:3==H?-0:0)}if(a=i(a),l=i(l),p=p.slice(),c=a-l){for((u=0>c)?(c=-c,f=p):(l=a,f=h),f.reverse(),n=c;n--;f.push(0));f.reverse()}else for(o=(u=(c=p.length)<(n=h.length))?c:n,c=n=0;o>n;n++)if(p[n]!=h[n]){u=p[n]0)for(;n--;p[r++]=0);for(n=E-1;o>c;){if(p[--o]0?(s=u,r=a):(f=-f,r=c),r.reverse();f--;r.push(0));r.reverse()}for(f=c.length,n=a.length,0>f-n&&(r=a,a=c,c=r,n=f),f=0;n;)f=(c[--n]=c[n]+a[n]+f)/E|0,c[n]%=E;return f&&(c.unshift(f),++s),R(t,c,s)},M.precision=M.sd=function(t){var e,n,r=this,i=r.c;if(null!=t&&t!==!!t&&1!==t&&0!==t&&($&&U(13,"argument"+y,t),t!=!!t&&(t=null)),!i)return null;if(n=i.length-1,e=n*I+1,n=i[n]){for(;n%10==0;n/=10,e--);for(n=i[0];n>=10;n/=10,e++);}return t&&r.e+1>e&&(e=r.e+1),e},M.round=function(t,n){var r=new e(this);return(null==t||z(t,0,D,15))&&F(r,~~t+this.e+1,null!=n&&z(n,0,8,15,b)?0|n:H),r},M.shift=function(t){var n=this;return z(t,-x,x,16,"argument")?n.times("1e"+p(t)):new e(n.c&&n.c[0]&&(-x>t||t>x)?n.s*(0>t?0:1/0):n)},M.squareRoot=M.sqrt=function(){var t,n,r,f,u,s=this,c=s.c,a=s.s,l=s.e,p=B+4,h=new e("0.5");if(1!==a||!c||!c[0])return new e(!a||0>a&&(!c||c[0])?0/0:c?s:1/0);if(a=Math.sqrt(+s),0==a||a==1/0?(n=o(c),(n.length+l)%2==0&&(n+="0"),a=Math.sqrt(n),l=i((l+1)/2)-(0>l||l%2),a==1/0?n="1e"+l:(n=a.toExponential(),n=n.slice(0,n.indexOf("e")+1)+l),r=new e(n)):r=new e(a+""),r.c[0])for(l=r.e,a=l+p,3>a&&(a=0);;)if(u=r,r=h.times(u.plus(G(s,u,p,1))),o(u.c).slice(0,a)===(n=o(r.c)).slice(0,a)){if(r.ea&&(d=b,b=O,O=d,f=a,a=h,h=f),f=a+h,d=[];f--;d.push(0));for(v=E,w=T,f=h;--f>=0;){for(r=0,g=O[f]%w,m=O[f]/w|0,s=a,u=f+s;u>f;)l=b[--s]%w,p=b[s]/w|0,c=m*l+p*g,l=g*l+c%w*w+d[u]+r,r=(l/v|0)+(c/w|0)+m*p,d[u--]=l%v;d[u]=r}return r?++o:d.shift(),R(t,d,o)},M.toDigits=function(t,n){var r=new e(this);return t=null!=t&&z(t,1,D,18,"precision")?0|t:null,n=null!=n&&z(n,0,8,18,b)?0|n:H,t?F(r,t,n):r},M.toExponential=function(t,e){return h(this,null!=t&&z(t,0,D,19)?~~t+1:null,e,19)},M.toFixed=function(t,e){return h(this,null!=t&&z(t,0,D,20)?~~t+this.e+1:null,e,20)},M.toFormat=function(t,e){var n=h(this,null!=t&&z(t,0,D,21)?~~t+this.e+1:null,e,21);if(this.c){var r,i=n.split("."),o=+Z.groupSize,f=+Z.secondaryGroupSize,u=Z.groupSeparator,s=i[0],c=i[1],a=this.s<0,l=a?s.slice(1):s,p=l.length;if(f&&(r=o,o=f,f=r,p-=r),o>0&&p>0){for(r=p%o||o,s=l.substr(0,r);p>r;r+=o)s+=u+l.substr(r,o);f>0&&(s+=u+l.slice(r)),a&&(s="-"+s)}n=c?s+Z.decimalSeparator+((f=+Z.fractionGroupSize)?c.replace(new RegExp("\\d{"+f+"}\\B","g"),"$&"+Z.fractionGroupSeparator):c):s}return n},M.toFraction=function(t){var n,r,i,f,u,s,c,a,l,p=$,h=this,g=h.c,m=new e(P),d=r=new e(P),v=c=new e(P);if(null!=t&&($=!1,s=new e(t),$=p,(!(p=s.isInt())||s.lt(P))&&($&&U(22,"max denominator "+(p?"out of range":"not an integer"),t),t=!p&&s.c&&F(s,s.e+1,1).gte(P)?s:null)),!g)return h.toString();for(l=o(g),f=m.e=l.length-h.e-1,m.c[0]=_[(u=f%I)<0?I+u:u],t=!t||s.cmp(m)>0?f>0?m:d:s,u=q,q=1/0,s=new e(l),c.c[0]=0;a=G(s,m,0,1),i=r.plus(a.times(v)),1!=i.cmp(t);)r=v,v=i,d=c.plus(a.times(i=d)),c=i,m=s.minus(a.times(i=m)),s=i;return i=G(t.minus(r),v,0,1),c=c.plus(i.times(d)),r=r.plus(i.times(v)),c.s=d.s=h.s,f*=2,n=G(d,v,f,H).minus(h).abs().cmp(G(c,r,f,H).minus(h).abs())<1?[d.toString(),v.toString()]:[c.toString(),r.toString()],q=u,n},M.toNumber=function(){var t=this;return+t||(t.s?0*t.s:0/0)},M.toPower=M.pow=function(t){var n,r,i=w(0>t?-t:+t),o=this;if(!z(t,-x,x,23,"exponent")&&(!isFinite(t)||i>x&&(t/=0)||parseFloat(t)!=t&&!(t=0/0)))return new e(Math.pow(+o,t));for(n=Y?v(Y/I+2):0,r=new e(P);;){if(i%2){if(r=r.times(o),!r.c)break;n&&r.c.length>n&&(r.c.length=n)}if(i=w(i/2),!i)break;o=o.times(o),n&&o.c&&o.c.length>n&&(o.c.length=n)}return 0>t&&(r=P.div(r)),n?F(r,Y,H):r},M.toPrecision=function(t,e){return h(this,null!=t&&z(t,1,D,24,"precision")?0|t:null,e,24)},M.toString=function(t){var e,r=this,i=r.s,f=r.e;return null===f?i?(e="Infinity",0>i&&(e="-"+e)):e="NaN":(e=o(r.c),e=null!=t&&z(t,2,64,25,"base")?n(l(e,f),0|t,10,i):C>=f||f>=j?a(e,f):l(e,f),0>i&&r.c[0]&&(e="-"+e)),e},M.truncated=M.trunc=function(){return F(new e(this),this.e+1,1)},M.valueOf=M.toJSON=function(){return this.toString()},null!=t&&e.config(t),e}function i(t){var e=0|t;return t>0||t===e?e:e-1}function o(t){for(var e,n,r=1,i=t.length,o=t[0]+"";i>r;){for(e=t[r++]+"",n=I-e.length;n--;e="0"+e);o+=e}for(i=o.length;48===o.charCodeAt(--i););return o.slice(0,i+1||1)}function f(t,e){var n,r,i=t.c,o=e.c,f=t.s,u=e.s,s=t.e,c=e.e;if(!f||!u)return null;if(n=i&&!i[0],r=o&&!o[0],n||r)return n?r?0:-u:f;if(f!=u)return f;if(n=0>f,r=s==c,!i||!o)return r?0:!i^n?1:-1;if(!r)return s>c^n?1:-1;for(u=(s=i.length)<(c=o.length)?s:c,f=0;u>f;f++)if(i[f]!=o[f])return i[f]>o[f]^n?1:-1;return s==c?0:s>c^n?1:-1}function u(t,e,n){return(t=p(t))>=e&&n>=t}function s(t){return"[object Array]"==Object.prototype.toString.call(t)}function c(t,e,n){for(var r,i,o=[0],f=0,u=t.length;u>f;){for(i=o.length;i--;o[i]*=e);for(o[r=0]+=N.indexOf(t.charAt(f++));rn-1&&(null==o[r+1]&&(o[r+1]=0),o[r+1]+=o[r]/n|0,o[r]%=n)}return o.reverse()}function a(t,e){return(t.length>1?t.charAt(0)+"."+t.slice(1):t)+(0>e?"e":"e+")+e}function l(t,e){var n,r;if(0>e){for(r="0.";++e;r+="0");t=r+t}else if(n=t.length,++e>n){for(r="0",e-=n;--e;r+="0");t+=r}else n>e&&(t=t.slice(0,e)+"."+t.slice(e));return t}function p(t){return t=parseFloat(t),0>t?v(t):w(t)}var h,g,m,d=/^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i,v=Math.ceil,w=Math.floor,y=" not a boolean or binary digit",b="rounding mode",O="number type has more than 15 significant digits",N="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_",E=1e14,I=14,x=9007199254740991,_=[1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13],T=1e7,D=1e9;if(h=r(),"function"==typeof define&&define.amd)define(function(){return h});else if("undefined"!=typeof e&&e.exports){if(e.exports=h,!g)try{g=t("crypto")}catch(S){}}else n.BigNumber=h}(this)},{crypto:1}],natspec:[function(t,e){var n=t("./node_modules/expanse.js/lib/abi.js"),r=function(){var t=function(t,e){Object.keys(t).forEach(function(n){e[n]=t[n]})},e=function(t){return Object.keys(t).reduce(function(t,e){return t+"var "+e+" = context['"+e+"'];\n"},"")},r=function(t,e){return t.filter(function(t){return t.name===e})[0]},i=function(t,e){var r=n.formatOutput(t.inputs,"0x"+e.params[0].data.slice(10));return t.inputs.reduce(function(t,e,n){return t[e.name]=r[n],t},{})},o=function(t,e){var n,r="",i=/\` + "`" + `(?:\\.|[^` + "`" + `\\])*\` + "`" + `/gim,o=0;try{for(;null!==(n=i.exec(t));){var f=i.lastIndex-n[0].length,u=n[0].slice(1,n[0].length-1);r+=t.slice(o,f);var s=e(u);r+=s,o=i.lastIndex}r+=t.slice(o)}catch(c){throw new Error("Natspec evaluation failed, wrong input params")}return r},f=function(n,f){var u={};if(f)try{var s=r(f.abi,f.method),c=i(s,f.transaction);t(c,u)}catch(a){throw new Error("Natspec evaluation failed, method does not exist")}var l=e(u),p=o(n,function(t){var e=new Function("context",l+"return "+t+";");return e(u).toString()});return p},u=function(t,e){try{return f(t,e)}catch(n){return n.message}};return{evaluateExpression:f,evaluateExpressionSafe:u}}();e.exports=r},{"./node_modules/expanse.js/lib/abi.js":3}]},{},[]); ` require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o. + along with expanse.js. If not, see . */ /** * @file abi.js @@ -282,20 +282,20 @@ module.exports = { },{"../utils/config":6,"../utils/utils":7,"./formatters":3,"./types":4,"./utils":5}],3:[function(require,module,exports){ /* - This file is part of ethereum.js. + This file is part of expanse.js. - ethereum.js is free software: you can redistribute it and/or modify + expanse.js 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. - ethereum.js is distributed in the hope that it will be useful, + expanse.js 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License - along with ethereum.js. If not, see . + along with expanse.js. If not, see . */ /** @file formatters.js * @authors: @@ -482,20 +482,20 @@ module.exports = { },{"../utils/config":6,"../utils/utils":7,"bignumber.js":8}],4:[function(require,module,exports){ /* - This file is part of ethereum.js. + This file is part of expanse.js. - ethereum.js is free software: you can redistribute it and/or modify + expanse.js 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. - ethereum.js is distributed in the hope that it will be useful, + expanse.js 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License - along with ethereum.js. If not, see . + along with expanse.js. If not, see . */ /** @file types.js * @authors: @@ -561,20 +561,20 @@ module.exports = { },{"./formatters":3}],5:[function(require,module,exports){ /* - This file is part of ethereum.js. + This file is part of expanse.js. - ethereum.js is free software: you can redistribute it and/or modify + expanse.js 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. - ethereum.js is distributed in the hope that it will be useful, + expanse.js 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License - along with ethereum.js. If not, see . + along with expanse.js. If not, see . */ /** * @file utils.js @@ -631,20 +631,20 @@ module.exports = { },{}],6:[function(require,module,exports){ /* - This file is part of ethereum.js. + This file is part of expanse.js. - ethereum.js is free software: you can redistribute it and/or modify + expanse.js 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. - ethereum.js is distributed in the hope that it will be useful, + expanse.js 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License - along with ethereum.js. If not, see . + along with expanse.js. If not, see . */ /** @file config.js * @authors: @@ -675,19 +675,19 @@ var ETH_UNITS = [ 'Gwei', 'szabo', 'finney', - 'ether', + 'expanse', 'grand', - 'Mether', - 'Gether', - 'Tether', - 'Pether', - 'Eether', - 'Zether', - 'Yether', - 'Nether', - 'Dether', - 'Vether', - 'Uether' + 'Mexpanse', + 'Gexpanse', + 'Texpanse', + 'Pexpanse', + 'Eexpanse', + 'Zexpanse', + 'Yexpanse', + 'Nexpanse', + 'Dexpanse', + 'Vexpanse', + 'Uexpanse' ]; module.exports = { @@ -702,20 +702,20 @@ module.exports = { },{"bignumber.js":8}],7:[function(require,module,exports){ /* - This file is part of ethereum.js. + This file is part of expanse.js. - ethereum.js is free software: you can redistribute it and/or modify + expanse.js 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. - ethereum.js is distributed in the hope that it will be useful, + expanse.js 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License - along with ethereum.js. If not, see . + along with expanse.js. If not, see . */ /** @file utils.js * @authors: @@ -748,13 +748,13 @@ var unitMap = { 'shannon': '1000000000', 'szabo': '1000000000000', 'finney': '1000000000000000', - 'ether': '1000000000000000000', - 'kether': '1000000000000000000000', + 'expanse': '1000000000000000000', + 'kexpanse': '1000000000000000000000', 'grand': '1000000000000000000000', 'einstein': '1000000000000000000000', - 'mether': '1000000000000000000000000', - 'gether': '1000000000000000000000000000', - 'tether': '1000000000000000000000000000000' + 'mexpanse': '1000000000000000000000000', + 'gexpanse': '1000000000000000000000000000', + 'texpanse': '1000000000000000000000000000000' }; /** @@ -925,12 +925,12 @@ var toHex = function (val) { * Returns value of unit in Wei * * @method getValueOfUnit - * @param {String} unit the unit to convert to, default ether + * @param {String} unit the unit to convert to, default expanse * @returns {BigNumber} value of the unit (in Wei) * @throws error if the unit is not correct:w */ var getValueOfUnit = function (unit) { - unit = unit ? unit.toLowerCase() : 'ether'; + unit = unit ? unit.toLowerCase() : 'expanse'; var unitValue = unitMap[unit]; if (unitValue === undefined) { throw new Error('This unit doesn\'t exists, please use the one of the following units' + JSON.stringify(unitMap, null, 2)); @@ -939,7 +939,7 @@ var getValueOfUnit = function (unit) { }; /** - * Takes a number of wei and converts it to any other ether unit. + * Takes a number of wei and converts it to any other expanse unit. * * Possible units are: * - kwei/ada @@ -947,15 +947,15 @@ var getValueOfUnit = function (unit) { * - gwei/shannon * - szabo * - finney - * - ether - * - kether/grand/einstein - * - mether - * - gether - * - tether + * - expanse + * - kexpanse/grand/einstein + * - mexpanse + * - gexpanse + * - texpanse * * @method fromWei * @param {Number|String} number can be a number, number string or a HEX of a decimal - * @param {String} unit the unit to convert to, default ether + * @param {String} unit the unit to convert to, default expanse * @return {String|Object} When given a BigNumber object it returns one as well, otherwise a number */ var fromWei = function(number, unit) { @@ -973,15 +973,15 @@ var fromWei = function(number, unit) { * - gwei/shannon * - szabo * - finney - * - ether - * - kether/grand/einstein - * - mether - * - gether - * - tether + * - expanse + * - kexpanse/grand/einstein + * - mexpanse + * - gexpanse + * - texpanse * * @method toWei * @param {Number|String|BigNumber} number can be a number, number string or a HEX of a decimal - * @param {String} unit the unit to convert from, default ether + * @param {String} unit the unit to convert from, default expanse * @return {String|Object} When given a BigNumber object it returns one as well, otherwise a number */ var toWei = function(number, unit) { diff --git a/common/natspec/natspec_test.go b/common/natspec/natspec_test.go index 50fd3f6651..41e88b545d 100644 --- a/common/natspec/natspec_test.go +++ b/common/natspec/natspec_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // +build ignore diff --git a/common/number/int.go b/common/number/int.go index 6dab2436de..2fb06fa5eb 100644 --- a/common/number/int.go +++ b/common/number/int.go @@ -1,25 +1,25 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package number import ( "math/big" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse-project/go-expanse/common" ) var tt256 = new(big.Int).Lsh(big.NewInt(1), 256) diff --git a/common/number/uint_test.go b/common/number/uint_test.go index 3ab9e4c344..0ea54fa8a4 100644 --- a/common/number/uint_test.go +++ b/common/number/uint_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package number @@ -20,7 +20,7 @@ import ( "math/big" "testing" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse-project/go-expanse/common" ) func TestSet(t *testing.T) { diff --git a/common/package.go b/common/package.go new file mode 100644 index 0000000000..2717157e12 --- /dev/null +++ b/common/package.go @@ -0,0 +1,139 @@ +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. +// +// The go-expanse library 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. +// +// The go-expanse 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-expanse library. If not, see . + +package common + +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 expanse 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/common/path.go b/common/path.go index cbcd13c4fe..c95a107569 100644 --- a/common/path.go +++ b/common/path.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package common @@ -25,7 +25,7 @@ import ( "strings" ) -// MakeName creates a node name that follows the ethereum convention +// MakeName creates a node name that follows the expanse convention // for such names. It adds the operation system name and Go runtime version // the name. func MakeName(name, version string) string { diff --git a/common/registrar/contracts.go b/common/registrar/contracts.go index cd80dfcaba..afd6eac4cd 100644 --- a/common/registrar/contracts.go +++ b/common/registrar/contracts.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package registrar diff --git a/common/registrar/ethreg/api.go b/common/registrar/ethreg/api.go index 6d77a9385d..4c976cd533 100644 --- a/common/registrar/ethreg/api.go +++ b/common/registrar/ethreg/api.go @@ -20,21 +20,21 @@ import ( "errors" "math/big" - "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/compiler" - "github.com/ethereum/go-ethereum/common/registrar" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/accounts" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/common/compiler" + "github.com/expanse-project/go-expanse/common/registrar" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" ) -// registryAPIBackend is a backend for an Ethereum Registry. +// registryAPIBackend is a backend for an Expanse Registry. type registryAPIBackend struct { config *core.ChainConfig bc *core.BlockChain @@ -43,7 +43,7 @@ type registryAPIBackend struct { am *accounts.Manager } -// PrivateRegistarAPI offers various functions to access the Ethereum registry. +// PrivateRegistarAPI offers various functions to access the Expanse registry. type PrivateRegistarAPI struct { config *core.ChainConfig be *registryAPIBackend diff --git a/common/registrar/registrar.go b/common/registrar/registrar.go index 0606f6985f..527e9039ad 100644 --- a/common/registrar/registrar.go +++ b/common/registrar/registrar.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package registrar @@ -22,15 +22,15 @@ import ( "math/big" "regexp" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" ) /* -Registrar implements the Ethereum name registrar services mapping -- arbitrary strings to ethereum addresses +Registrar implements the Expanse name registrar services mapping +- arbitrary strings to expanse addresses - hashes to hashes - hashes to arbitrary strings (likely will provide lookup service for all three) @@ -54,10 +54,10 @@ This is done for frontier by default, otherwise the caller needs to make sure the relevant environment initialised the desired contracts */ var ( - // GlobalRegistrarAddr = "0xc6d9d2cd449a754c494264e1809c50e34d64562b" // olympic - GlobalRegistrarAddr = "0x33990122638b9132ca29c723bdf037f1a891a70c" // frontier - HashRegAddr = "0x23bf622b5a65f6060d855fca401133ded3520620" // frontier - UrlHintAddr = "0x73ed5ef6c010727dfd2671dbb70faac19ec18626" // frontier + //these arnt the right ones for gexp + GlobalRegistrarAddr = "0x6c221ca53705f3497ec90ca7b84c59ae7382fc21" // frontier + HashRegAddr = "0x10774b55f37302de0075fdc131f63d303ae5dd9e" // frontier + UrlHintAddr = "0x8dad0847dedb1253b6dfe616c6d2841da291dc1f" // frontier zero = regexp.MustCompile("^(0x)?0*$") ) diff --git a/common/registrar/registrar_test.go b/common/registrar/registrar_test.go index b2287803c2..c046e18fab 100644 --- a/common/registrar/registrar_test.go +++ b/common/registrar/registrar_test.go @@ -1,26 +1,26 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package registrar import ( "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" ) type testBackend struct { diff --git a/common/rlp_test.go b/common/rlp_test.go new file mode 100644 index 0000000000..4e93afe6ac --- /dev/null +++ b/common/rlp_test.go @@ -0,0 +1,176 @@ +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. +// +// The go-expanse library 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. +// +// The go-expanse 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-expanse library. If not, see . + +package common + +import ( + "bytes" + "math/big" + "reflect" + "testing" + + "github.com/expanse-project/go-expanse/rlp" +) + +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(byte(1)).Append(byte(2)).Append(byte(3)) + val.Append("4").AppendList().Append(byte(5)) + + res, err := rlp.EncodeToBytes(val) + if err != nil { + t.Fatalf("encode error: %v", err) + } + exp := Encode([]interface{}{[]interface{}{1, 2, 3}, "4", []interface{}{5}}) + if bytes.Compare(res, exp) != 0 { + t.Errorf("expected %x, got %x", exp, res) + } +} + +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 := NewValueFromBytes(enc) + 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) { + bv := NewValue([]interface{}{[]byte{1, 2, 3, 4, 5}, []byte{6}}) + b, _ := rlp.EncodeToBytes(bv) + val := NewValueFromBytes(b) + if !bv.Cmp(val) { + t.Errorf("Expected %#v, got %#v", bv, val) + } +} + +func TestEncodeZero(t *testing.T) { + b, _ := rlp.EncodeToBytes(NewValue(0)) + 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/common/size.go b/common/size.go index 9653b36298..31006b903f 100644 --- a/common/size.go +++ b/common/size.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package common diff --git a/common/size_test.go b/common/size_test.go index ce19cab69f..c76fc21cfe 100644 --- a/common/size_test.go +++ b/common/size_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package common @@ -41,7 +41,7 @@ func (s *SizeSuite) TestStorageSizeString(c *checker.C) { } func (s *SizeSuite) TestCommon(c *checker.C) { - ether := CurrencyToString(BigPow(10, 19)) + expanse := CurrencyToString(BigPow(10, 19)) finney := CurrencyToString(BigPow(10, 16)) szabo := CurrencyToString(BigPow(10, 13)) shannon := CurrencyToString(BigPow(10, 10)) @@ -49,7 +49,7 @@ func (s *SizeSuite) TestCommon(c *checker.C) { ada := CurrencyToString(BigPow(10, 4)) wei := CurrencyToString(big.NewInt(10)) - c.Assert(ether, checker.Equals, "10 Ether") + c.Assert(expanse, 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") diff --git a/common/test_utils.go b/common/test_utils.go index a848642f77..063b696e36 100644 --- a/common/test_utils.go +++ b/common/test_utils.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package common diff --git a/common/types.go b/common/types.go index d008844847..fb552c4cc9 100644 --- a/common/types.go +++ b/common/types.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package common @@ -123,7 +123,7 @@ func BigToAddress(b *big.Int) Address { return BytesToAddress(b.Bytes()) } func HexToAddress(s string) Address { return BytesToAddress(FromHex(s)) } // IsHexAddress verifies whether a string can represent a valid hex-encoded -// Ethereum address or not. +// Expanse address or not. func IsHexAddress(s string) bool { if len(s) == 2+2*AddressLength && IsHex(s) { return true diff --git a/common/types_template.go b/common/types_template.go index 8048f9cc3f..748e5dea83 100644 --- a/common/types_template.go +++ b/common/types_template.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // +build none //sed -e 's/_N_/Hash/g' -e 's/_S_/32/g' -e '1d' types_template.go | gofmt -w hash.go diff --git a/common/types_test.go b/common/types_test.go index de67cfcb5f..c94a369f4d 100644 --- a/common/types_test.go +++ b/common/types_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package common diff --git a/common/value.go b/common/value.go new file mode 100644 index 0000000000..55db7eda02 --- /dev/null +++ b/common/value.go @@ -0,0 +1,428 @@ +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. +// +// The go-expanse library 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. +// +// The go-expanse 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-expanse library. If not, see . + +package common + +import ( + "bytes" + "fmt" + "io" + "math/big" + "reflect" + "strconv" + + "github.com/expanse-project/go-expanse/rlp" +) + +// Value can hold values of certain basic types and provides ways to +// convert between types without bothering to check whether the +// conversion is actually meaningful. +// +// It currently supports the following types: +// +// - int{,8,16,32,64} +// - uint{,8,16,32,64} +// - *big.Int +// - []byte, string +// - []interface{} +// +// Value is useful whenever you feel that Go's types limit your +// ability to express yourself. In these situations, use Value and +// forget about this strong typing nonsense. +type Value struct{ Val interface{} } + +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 { + if data, ok := val.Val.([]interface{}); ok { + return len(data) + } + + return len(val.Bytes()) +} + +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 (self *Value) DecodeRLP(s *rlp.Stream) error { + var v interface{} + if err := s.Decode(&v); err != nil { + return err + } + self.Val = v + return nil +} + +func (self *Value) EncodeRLP(w io.Writer) error { + if self == nil { + w.Write(rlp.EmptyList) + return nil + } else { + return rlp.Encode(w, self.Val) + } +} + +// NewValueFromBytes decodes RLP data. +// The contained value will be nil if data contains invalid RLP. +func NewValueFromBytes(data []byte) *Value { + v := new(Value) + if len(data) != 0 { + if err := rlp.DecodeBytes(data, v); err != nil { + v.Val = nil + } + } + return v +} + +// 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/common/value_test.go b/common/value_test.go new file mode 100644 index 0000000000..de7926a5cf --- /dev/null +++ b/common/value_test.go @@ -0,0 +1,86 @@ +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. +// +// The go-expanse library 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. +// +// The go-expanse 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-expanse library. If not, see . + +package common + +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.Val).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/compression/rle/read_write.go b/compression/rle/read_write.go index 03dffd607d..381db62b46 100644 --- a/compression/rle/read_write.go +++ b/compression/rle/read_write.go @@ -1,27 +1,27 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . -// Package rle implements the run-length encoding used for Ethereum data. +// Package rle implements the run-length encoding used for Expanse data. package rle import ( "bytes" "errors" - "github.com/ethereum/go-ethereum/crypto" + "github.com/expanse-project/go-expanse/crypto" ) const ( diff --git a/compression/rle/read_write_test.go b/compression/rle/read_write_test.go index 20a23a1960..32f8c48de9 100644 --- a/compression/rle/read_write_test.go +++ b/compression/rle/read_write_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package rle diff --git a/containers/docker/develop-alpine/Dockerfile b/containers/docker/develop-alpine/Dockerfile index 6b00bf2538..02edf35dcc 100644 --- a/containers/docker/develop-alpine/Dockerfile +++ b/containers/docker/develop-alpine/Dockerfile @@ -4,12 +4,12 @@ RUN \ apk add --update go git make gcc musl-dev && \ git clone https://github.com/ethereum/go-ethereum && \ (cd go-ethereum && git checkout develop) && \ - (cd go-ethereum && make geth) && \ - cp go-ethereum/build/bin/geth /geth && \ + (cd go-ethereum && make gexp) && \ + cp go-ethereum/build/bin/gexp /gexp && \ apk del go git make gcc musl-dev && \ rm -rf /go-ethereum && rm -rf /var/cache/apk/* EXPOSE 8545 EXPOSE 30303 -ENTRYPOINT ["/geth"] +ENTRYPOINT ["/gexp"] diff --git a/containers/docker/develop-ubuntu/Dockerfile b/containers/docker/develop-ubuntu/Dockerfile index 98b4aadf8f..deeaac281d 100644 --- a/containers/docker/develop-ubuntu/Dockerfile +++ b/containers/docker/develop-ubuntu/Dockerfile @@ -9,9 +9,9 @@ RUN apt-get update && \ apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 923F6CA9 && \ echo "deb http://ppa.launchpad.net/ethereum/ethereum-dev/ubuntu wily main" | tee -a /etc/apt/sources.list.d/ethereum.list && \ apt-get update && \ - apt-get install -q -y geth + apt-get install -q -y gexp EXPOSE 8545 EXPOSE 30303 -ENTRYPOINT ["/usr/bin/geth"] +ENTRYPOINT ["/usr/bin/gexp"] diff --git a/containers/docker/master-alpine/Dockerfile b/containers/docker/master-alpine/Dockerfile index 11d4159a3b..d9041d3088 100644 --- a/containers/docker/master-alpine/Dockerfile +++ b/containers/docker/master-alpine/Dockerfile @@ -3,12 +3,12 @@ FROM alpine:3.3 RUN \ apk add --update go git make gcc musl-dev gmp-dev gmp && \ git clone https://github.com/ethereum/go-ethereum && \ - (cd go-ethereum && make geth) && \ - cp go-ethereum/build/bin/geth /geth && \ + (cd go-ethereum && make gexp) && \ + cp go-ethereum/build/bin/gexp /gexp && \ apk del go git make gcc musl-dev gmp-dev && \ rm -rf /go-ethereum && rm -rf /var/cache/apk/* EXPOSE 8545 EXPOSE 30303 -ENTRYPOINT ["/geth"] +ENTRYPOINT ["/gexp"] diff --git a/containers/docker/master-ubuntu/Dockerfile b/containers/docker/master-ubuntu/Dockerfile index 2c6de28c92..b0e5ea0761 100644 --- a/containers/docker/master-ubuntu/Dockerfile +++ b/containers/docker/master-ubuntu/Dockerfile @@ -9,9 +9,9 @@ RUN apt-get update && \ apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 923F6CA9 && \ echo "deb http://ppa.launchpad.net/ethereum/ethereum/ubuntu wily main" | tee -a /etc/apt/sources.list.d/ethereum.list && \ apt-get update && \ - apt-get install -q -y geth + apt-get install -q -y gexp EXPOSE 8545 EXPOSE 30303 -ENTRYPOINT ["/usr/bin/geth"] +ENTRYPOINT ["/usr/bin/gexp"] diff --git a/core/asm.go b/core/asm.go index b2e47b5e91..e0f0a73530 100644 --- a/core/asm.go +++ b/core/asm.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package core @@ -20,8 +20,8 @@ import ( "fmt" "math/big" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/vm" ) func Disassemble(script []byte) (asm []string) { diff --git a/core/bad_block.go b/core/bad_block.go index cd3fb575a8..1239431b42 100644 --- a/core/bad_block.go +++ b/core/bad_block.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package core @@ -22,11 +22,11 @@ import ( "io/ioutil" "net/http" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/rlp" ) // DisabledBadBlockReporting can be set to prevent blocks being reported. diff --git a/core/bench_test.go b/core/bench_test.go index ac5b57bc8a..b7a9d315ac 100644 --- a/core/bench_test.go +++ b/core/bench_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package core @@ -23,12 +23,12 @@ import ( "os" "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/params" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/event" + "github.com/expanse-project/go-expanse/params" ) func BenchmarkInsertChain_empty_memdb(b *testing.B) { @@ -102,7 +102,7 @@ func init() { } } -// genTxRing returns a block generator that sends ether in a ring +// genTxRing returns a block generator that sends expanse in a ring // among n accounts. This is creates n entries in the state database // and fills the blocks with many small transactions. func genTxRing(naccounts int) func(int, *BlockGen) { @@ -148,7 +148,7 @@ func benchInsertChain(b *testing.B, disk bool, gen func(int, *BlockGen)) { if !disk { db, _ = ethdb.NewMemDatabase() } else { - dir, err := ioutil.TempDir("", "eth-core-bench") + dir, err := ioutil.TempDir("", "exp-core-bench") if err != nil { b.Fatalf("cannot create temporary directory: %v", err) } diff --git a/core/block_validator.go b/core/block_validator.go index 801d2572b6..8e605d4ffa 100644 --- a/core/block_validator.go +++ b/core/block_validator.go @@ -21,18 +21,18 @@ import ( "math/big" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/pow" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/params" + "github.com/expanse-project/go-expanse/pow" "gopkg.in/fatih/set.v0" ) var ( ExpDiffPeriod = big.NewInt(100000) - big10 = big.NewInt(10) + big60 = big.NewInt(60) bigMinus99 = big.NewInt(-99) ) @@ -277,7 +277,7 @@ func calcDifficultyHomestead(time, parentTime uint64, parentNumber, parentDiff * // 1 - (block_timestamp -parent_timestamp) // 10 x.Sub(bigTime, bigParentTime) - x.Div(x, big10) + x.Div(x, big60) x.Sub(common.Big1, x) // max(1 - (block_timestamp - parent_timestamp) // 10, -99))) @@ -285,8 +285,8 @@ func calcDifficultyHomestead(time, parentTime uint64, parentNumber, parentDiff * x.Set(bigMinus99) } - // (parent_diff + parent_diff // 2048 * max(1 - (block_timestamp - parent_timestamp) // 10, -99)) - y.Div(parentDiff, params.DifficultyBoundDivisor) + // (parent_diff + parent_diff // 512 * max(1 - (block_timestamp - parent_timestamp) // 10, -99)) + y.Div(parentDiff, params.DifficultyBoundDivisor2) x.Mul(y, x) x.Add(parentDiff, x) @@ -295,24 +295,19 @@ func calcDifficultyHomestead(time, parentTime uint64, parentNumber, parentDiff * x.Set(params.MinimumDifficulty) } - // for the exponential factor - periodCount := new(big.Int).Add(parentNumber, common.Big1) - periodCount.Div(periodCount, ExpDiffPeriod) - - // the exponential factor, commonly referred to as "the bomb" - // diff = diff + 2^(periodCount - 2) - if periodCount.Cmp(common.Big1) > 0 { - y.Sub(periodCount, common.Big2) - y.Exp(common.Big2, y, nil) - x.Add(x, y) - } - return x } func calcDifficultyFrontier(time, parentTime uint64, parentNumber, parentDiff *big.Int) *big.Int { diff := new(big.Int) - adjust := new(big.Int).Div(parentDiff, params.DifficultyBoundDivisor) + adjust := new(big.Int) + + if parentNumber.Cmp(params.HardFork1) < 0 { + adjust = new(big.Int).Div(parentDiff, params.DifficultyBoundDivisor) + } else { + adjust = new(big.Int).Div(parentDiff, params.DifficultyBoundDivisor2) + } + bigTime := new(big.Int) bigParentTime := new(big.Int) diff --git a/core/block_validator_test.go b/core/block_validator_test.go index c6daf9e7f3..f5ed4d8e57 100644 --- a/core/block_validator_test.go +++ b/core/block_validator_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package core @@ -21,13 +21,13 @@ import ( "math/big" "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/pow/ezp" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/event" + "github.com/expanse-project/go-expanse/pow/ezp" ) func testChainConfig() *ChainConfig { diff --git a/core/blockchain.go b/core/blockchain.go index 4598800d54..e2c2e6f687 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package core implements the Ethereum consensus protocol. +// Package core implements the Expanse consensus protocol. package core import ( @@ -28,19 +28,19 @@ import ( "sync/atomic" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/pow" - "github.com/ethereum/go-ethereum/rlp" - "github.com/ethereum/go-ethereum/trie" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/event" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/metrics" + "github.com/expanse-project/go-expanse/pow" + "github.com/expanse-project/go-expanse/rlp" + "github.com/expanse-project/go-expanse/trie" "github.com/hashicorp/golang-lru" ) @@ -112,7 +112,7 @@ type BlockChain struct { } // NewBlockChain returns a fully initialised block chain using information -// available in the database. It initialiser the default Ethereum Validator and +// available in the database. It initialiser the default Expanse Validator and // Processor. func NewBlockChain(chainDb ethdb.Database, config *ChainConfig, pow pow.PoW, mux *event.TypeMux) (*BlockChain, error) { bodyCache, _ := lru.New(bodyCacheLimit) @@ -775,7 +775,8 @@ func (self *BlockChain) WriteBlock(block *types.Block) (status WriteStatus, err // Second clause in the if statement reduces the vulnerability to selfish mining. // Please refer to http://www.cs.cornell.edu/~ie53/publications/btcProcFC.pdf if externTd.Cmp(localTd) > 0 || (externTd.Cmp(localTd) == 0 && mrand.Float64() < 0.5) { - // Reorganise the chain if the parent is not the head block + + // Reorganize the chain if the parent is not the head block if block.ParentHash() != self.currentBlock.Hash() { if err := self.reorg(self.currentBlock, block); err != nil { return NonStatTy, err diff --git a/core/blockchain_test.go b/core/blockchain_test.go index 876dd2ba15..9e47805a5c 100644 --- a/core/blockchain_test.go +++ b/core/blockchain_test.go @@ -27,17 +27,17 @@ import ( "testing" "time" - "github.com/ethereum/ethash" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/pow" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-org/ethash" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/event" + "github.com/expanse-project/go-expanse/params" + "github.com/expanse-project/go-expanse/pow" + "github.com/expanse-project/go-expanse/rlp" "github.com/hashicorp/golang-lru" ) diff --git a/core/blocks.go b/core/blocks.go index ecccc541f0..f01e6f1bf4 100644 --- a/core/blocks.go +++ b/core/blocks.go @@ -1,22 +1,22 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package core -import "github.com/ethereum/go-ethereum/common" +import "github.com/expanse-project/go-expanse/common" // Set of manually tracked bad hashes (usually hard forks) var BadHashes = map[common.Hash]bool{ diff --git a/core/canary.go b/core/canary.go new file mode 100644 index 0000000000..7ba8bf05e0 --- /dev/null +++ b/core/canary.go @@ -0,0 +1,51 @@ +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. +// +// The go-expanse library 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. +// +// The go-expanse 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-expanse library. If not, see . + +package core + +import ( + "math/big" + + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/state" +) + +var ( + jeff = common.HexToAddress("959c33de5961820567930eccce51ea715c496f85") + vitalik = common.HexToAddress("c8158da0b567a8cc898991c2c2a073af67dc03a9") + christoph = common.HexToAddress("7a19a893f91d5b6e2cdf941b6acbba2cbcf431ee") + gav = common.HexToAddress("539dd9aaf45c3feb03f9c004f4098bd3268fef6b") +) + +// Canary will check the 0'd address of the 4 contracts above. +// If two or more are set to anything other than a 0 the canary +// dies a horrible death. +func Canary(statedb *state.StateDB) bool { + var r int + if (statedb.GetState(jeff, common.Hash{}).Big().Cmp(big.NewInt(0)) > 0) { + r++ + } + if (statedb.GetState(gav, common.Hash{}).Big().Cmp(big.NewInt(0)) > 0) { + r++ + } + if (statedb.GetState(christoph, common.Hash{}).Big().Cmp(big.NewInt(0)) > 0) { + r++ + } + if (statedb.GetState(vitalik, common.Hash{}).Big().Cmp(big.NewInt(0)) > 0) { + r++ + } + return r > 10 +} diff --git a/core/chain_makers.go b/core/chain_makers.go index ef0ac66d1b..11a5bb047c 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package core @@ -20,20 +20,20 @@ import ( "fmt" "math/big" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/pow" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/event" + "github.com/expanse-project/go-expanse/pow" ) /* * TODO: move this to another package. */ -// MakeChainConfig returns a new ChainConfig with the ethereum default chain settings. +// MakeChainConfig returns a new ChainConfig with the expanse default chain settings. func MakeChainConfig() *ChainConfig { return &ChainConfig{HomesteadBlock: big.NewInt(0)} } diff --git a/core/chain_makers_test.go b/core/chain_makers_test.go index 32c3efe8da..7c8e1152c0 100644 --- a/core/chain_makers_test.go +++ b/core/chain_makers_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package core @@ -20,11 +20,11 @@ import ( "fmt" "math/big" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/params" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/event" + "github.com/expanse-project/go-expanse/params" ) func ExampleGenerateChain() { @@ -50,11 +50,11 @@ func ExampleGenerateChain() { chain, _ := GenerateChain(genesis, db, 5, func(i int, gen *BlockGen) { switch i { case 0: - // In block 1, addr1 sends addr2 some ether. + // In block 1, addr1 sends addr2 some expanse. tx, _ := types.NewTransaction(gen.TxNonce(addr1), addr2, big.NewInt(10000), params.TxGas, nil, nil).SignECDSA(key1) gen.AddTx(tx) case 1: - // In block 2, addr1 sends some more ether to addr2. + // In block 2, addr1 sends some more expanse to addr2. // addr2 passes it on to addr3. tx1, _ := types.NewTransaction(gen.TxNonce(addr1), addr2, big.NewInt(1000), params.TxGas, nil, nil).SignECDSA(key1) tx2, _ := types.NewTransaction(gen.TxNonce(addr2), addr3, big.NewInt(1000), params.TxGas, nil, nil).SignECDSA(key2) diff --git a/core/chain_pow.go b/core/chain_pow.go index c3b5788c19..c0b95d0f11 100644 --- a/core/chain_pow.go +++ b/core/chain_pow.go @@ -19,8 +19,8 @@ package core import ( "runtime" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/pow" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/pow" ) // nonceCheckResult contains the result of a nonce verification. diff --git a/core/chain_pow_test.go b/core/chain_pow_test.go index d2b0bd1443..ef52f692b9 100644 --- a/core/chain_pow_test.go +++ b/core/chain_pow_test.go @@ -22,10 +22,10 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/pow" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/pow" ) // failPow is a non-validating proof of work implementation, that returns true diff --git a/core/config.go b/core/config.go index 81ca76aa31..495741af46 100644 --- a/core/config.go +++ b/core/config.go @@ -20,7 +20,7 @@ import ( "errors" "math/big" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/expanse-project/go-expanse/core/vm" ) var ChainConfigNotFoundErr = errors.New("ChainConfig not found") // general config not found error diff --git a/core/database_util.go b/core/database_util.go index 3ba80062c1..113afe0b4f 100644 --- a/core/database_util.go +++ b/core/database_util.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package core @@ -23,12 +23,12 @@ import ( "fmt" "math/big" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/rlp" ) var ( @@ -52,7 +52,7 @@ var ( blockHashPrefix = []byte("block-hash-") // [deprecated by the header/block split, remove eventually] - configPrefix = []byte("ethereum-config-") // config prefix for the db + configPrefix = []byte("expanse-config-") // config prefix for the db ) // GetCanonicalHash retrieves a hash assigned to a canonical block number. diff --git a/core/database_util_test.go b/core/database_util_test.go index 9ef7876241..c690c5f8f0 100644 --- a/core/database_util_test.go +++ b/core/database_util_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package core @@ -24,13 +24,13 @@ import ( "os" "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/crypto/sha3" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/crypto/sha3" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/rlp" ) type diffTest struct { diff --git a/core/default_genesis.go b/core/default_genesis.go index 6ffe04ee80..e2e4ae7483 100644 --- a/core/default_genesis.go +++ b/core/default_genesis.go @@ -1,21 +1,20 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors +// Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package core -// defaultGenesisBlock is a gzip compressed dump of the official default Ethereum -// genesis block. -const defaultGenesisBlock = "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" +const defaultGenesisBlock = "H4sICGn59VUAA2dlbmVzaXMuanNvbgCtUctqwzAQPDdfYXzOYSWvVlLOPfTQn1jJUmOwnRCr4BL871X8KKVQMLSrg9jXzGh0PxQ5yv7S+1CeihJGKZCURIEBHUYpyuMykpouDIm76zIGW/3Kt9CnFx7Oa+OPseGGMd34mRMvsEhakqBAjiJaXc25ygcpUr0tvfHw2nRNWnZEZczWqZsYG//epo8V7wdd14znf3+DvzS942F11lZ18OzA1xqVssYQRG0kexFMBCTvrA3Gfknmtr34vHqf07kEo3MWI/jgKimVllo5yZqtB4teVAHJOlRUPSjvRem45fVnxe9qi+n4nUI8bNVCAZmstnZ1hHyDRsOGhQ0IURph5X6KMhM8ZWQPWkUWIhrlaq6YHWciICmJOYKh7EX+3v3iN+Dd1u4ELqfZkOkwHT4BD678BCIDAAA=" diff --git a/core/error.go b/core/error.go index 0ba506f468..8cc709de02 100644 --- a/core/error.go +++ b/core/error.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package core @@ -21,7 +21,7 @@ import ( "fmt" "math/big" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse-project/go-expanse/common" ) var ( diff --git a/core/events.go b/core/events.go index bed8c7b900..e28ff2fa5f 100644 --- a/core/events.go +++ b/core/events.go @@ -1,27 +1,28 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package core import ( "math/big" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/core/vm" + ) // TxPreEvent is posted when a transaction enters the transaction pool. diff --git a/core/execution.go b/core/execution.go index 82143443c7..bf1bf1c4bd 100644 --- a/core/execution.go +++ b/core/execution.go @@ -1,28 +1,29 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package core import ( "math/big" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/params" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/params" + ) // Call executes within the given contract @@ -51,7 +52,7 @@ func DelegateCall(env vm.Environment, caller vm.ContractRef, addr common.Address func Create(env vm.Environment, caller vm.ContractRef, code []byte, gas, gasPrice, value *big.Int) (ret []byte, address common.Address, err error) { ret, address, err = exec(env, caller, nil, nil, nil, code, gas, gasPrice, value) // Here we get an error if we run into maximum stack depth, - // See: https://github.com/ethereum/yellowpaper/pull/131 + // See: https://github.com/expanse-project/yellowpaper/pull/131 // and YP definitions for CREATE instruction if err != nil { return nil, address, err diff --git a/core/fees.go b/core/fees.go index 0bb26f0552..66587ebbaa 100644 --- a/core/fees.go +++ b/core/fees.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package core @@ -20,4 +20,4 @@ import ( "math/big" ) -var BlockReward *big.Int = big.NewInt(5e+18) +var BlockReward *big.Int = big.NewInt(8e+18) diff --git a/core/filter_test.go b/core/filter_test.go index 58e71e305d..5c722200b4 100644 --- a/core/filter_test.go +++ b/core/filter_test.go @@ -1,17 +1,17 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package core diff --git a/core/genesis.go b/core/genesis.go index 40d7996219..f2c0ef0410 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package core @@ -26,13 +26,13 @@ import ( "math/big" "strings" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/params" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/params" ) // WriteGenesisBlock writes the genesis block to the database as block number 0 @@ -165,7 +165,7 @@ func WriteGenesisBlockForTesting(db ethdb.Database, accounts ...GenesisAccount) return block } -// WriteDefaultGenesisBlock assembles the official Ethereum genesis block and +// WriteDefaultGenesisBlock assembles the official Expanse genesis block and // writes it - along with all associated state - into a chain database. func WriteDefaultGenesisBlock(chainDb ethdb.Database) (*types.Block, error) { return WriteGenesisBlock(chainDb, strings.NewReader(DefaultGenesisBlock())) diff --git a/core/headerchain.go b/core/headerchain.go index 5e0fbfb08f..bd5cefa3f9 100644 --- a/core/headerchain.go +++ b/core/headerchain.go @@ -26,12 +26,12 @@ import ( "sync/atomic" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/pow" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/pow" "github.com/hashicorp/golang-lru" ) @@ -91,7 +91,7 @@ func NewHeaderChain(chainDb ethdb.Database, config *ChainConfig, getValidator ge if err != nil { return nil, err } - glog.V(logger.Info).Infoln("WARNING: Wrote default ethereum genesis block") + glog.V(logger.Info).Infoln("WARNING: Wrote default expanse genesis block") hc.genesisHeader = genesisBlock.Header() } diff --git a/core/helper_test.go b/core/helper_test.go index fd6a5491c5..d65970de43 100644 --- a/core/helper_test.go +++ b/core/helper_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package core @@ -20,11 +20,11 @@ import ( "container/list" "fmt" - "github.com/ethereum/go-ethereum/core/types" - // "github.com/ethereum/go-ethereum/crypto" + "github.com/expanse-project/go-expanse/core/types" + // "github.com/expanse-project/go-expanse/crypto" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/event" ) // Implement our EthTest Manager diff --git a/core/state/dump.go b/core/state/dump.go index a328b05374..6321916c74 100644 --- a/core/state/dump.go +++ b/core/state/dump.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package state @@ -20,7 +20,7 @@ import ( "encoding/json" "fmt" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse-project/go-expanse/common" ) type Account struct { diff --git a/core/state/errors.go b/core/state/errors.go new file mode 100644 index 0000000000..6e1d0d0bcf --- /dev/null +++ b/core/state/errors.go @@ -0,0 +1,39 @@ +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. +// +// The go-expanse library 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. +// +// The go-expanse 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-expanse library. If not, see . + +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/core/state/iterator.go b/core/state/iterator.go index 9d8a69b7cd..cef84bfada 100644 --- a/core/state/iterator.go +++ b/core/state/iterator.go @@ -21,9 +21,9 @@ import ( "fmt" "math/big" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/rlp" - "github.com/ethereum/go-ethereum/trie" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/rlp" + "github.com/expanse-project/go-expanse/trie" ) // NodeIterator is an iterator to traverse the entire state trie post-order, diff --git a/core/state/iterator_test.go b/core/state/iterator_test.go index aa05c5dfe7..f6038998b5 100644 --- a/core/state/iterator_test.go +++ b/core/state/iterator_test.go @@ -20,8 +20,8 @@ import ( "bytes" "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethdb" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/ethdb" ) // Tests that the node iterator indeed walks over the entire database contents. diff --git a/core/state/main_test.go b/core/state/main_test.go index cd9661031f..33a99edded 100644 --- a/core/state/main_test.go +++ b/core/state/main_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package state diff --git a/core/state/managed_state.go b/core/state/managed_state.go index f8e2f2b876..c16c039de9 100644 --- a/core/state/managed_state.go +++ b/core/state/managed_state.go @@ -1,25 +1,25 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package state import ( "sync" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse-project/go-expanse/common" ) type account struct { diff --git a/core/state/managed_state_test.go b/core/state/managed_state_test.go index 0b53a42c54..9c66fd0506 100644 --- a/core/state/managed_state_test.go +++ b/core/state/managed_state_test.go @@ -1,26 +1,26 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package state import ( "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethdb" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/ethdb" ) var addr = common.BytesToAddress([]byte("test")) diff --git a/core/state/state_object.go b/core/state/state_object.go index 769c63d42d..bbf73e7a8d 100644 --- a/core/state/state_object.go +++ b/core/state/state_object.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package state @@ -22,12 +22,12 @@ import ( "io" "math/big" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/rlp" - "github.com/ethereum/go-ethereum/trie" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/rlp" + "github.com/expanse-project/go-expanse/trie" ) var emptyCodeHash = crypto.Keccak256(nil) diff --git a/core/state/state_test.go b/core/state/state_test.go index ce86a5b768..0ffcac9166 100644 --- a/core/state/state_test.go +++ b/core/state/state_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package state @@ -23,8 +23,8 @@ import ( checker "gopkg.in/check.v1" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethdb" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/ethdb" ) type StateSuite struct { diff --git a/core/state/statedb.go b/core/state/statedb.go index 22ffa36a06..0e05af4ecf 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -1,40 +1,41 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . -// Package state provides a caching layer atop the Ethereum state trie. +// Package state provides a caching layer atop the Expanse state trie. package state import ( "fmt" "math/big" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/rlp" - "github.com/ethereum/go-ethereum/trie" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/rlp" + "github.com/expanse-project/go-expanse/trie" ) // The starting nonce determines the default nonce when new accounts are being // created. var StartingNonce uint64 -// StateDBs within the ethereum protocol are used to store anything +// StateDBs within the expanse 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 diff --git a/core/state/statedb_test.go b/core/state/statedb_test.go index 9283334597..6cda1ab1fb 100644 --- a/core/state/statedb_test.go +++ b/core/state/statedb_test.go @@ -20,8 +20,8 @@ import ( "math/big" "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethdb" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/ethdb" ) // Tests that updating a state trie does not leak any database writes prior to diff --git a/core/state/sync.go b/core/state/sync.go index ef2b4b84c5..efe0a1b9cb 100644 --- a/core/state/sync.go +++ b/core/state/sync.go @@ -20,10 +20,10 @@ import ( "bytes" "math/big" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/rlp" - "github.com/ethereum/go-ethereum/trie" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/rlp" + "github.com/expanse-project/go-expanse/trie" ) // StateSync is the main state synchronisation scheduler, which provides yet the diff --git a/core/state/sync_test.go b/core/state/sync_test.go index 715645c6c9..aa4529fdbc 100644 --- a/core/state/sync_test.go +++ b/core/state/sync_test.go @@ -21,10 +21,10 @@ import ( "math/big" "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/trie" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/trie" ) // testAccount is the data associated with an account used by the state tests. diff --git a/core/state_processor.go b/core/state_processor.go index 95b3057bbc..b2772095e7 100644 --- a/core/state_processor.go +++ b/core/state_processor.go @@ -19,12 +19,12 @@ package core import ( "math/big" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" ) var ( @@ -49,7 +49,7 @@ func NewStateProcessor(config *ChainConfig, bc *BlockChain) *StateProcessor { } } -// Process processes the state changes according to the Ethereum rules by running +// Process processes the state changes according to the Expanse rules by running // the transaction messages using the statedb and applying any rewards to both // the processor (coinbase) and any included uncles. // diff --git a/core/state_transition.go b/core/state_transition.go index c8160424b9..bdece8a16d 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package core @@ -20,11 +20,12 @@ import ( "fmt" "math/big" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/params" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/params" + ) var ( @@ -189,7 +190,7 @@ func (self *StateTransition) buyGas() error { return err } if sender.Balance().Cmp(mgval) < 0 { - return fmt.Errorf("insufficient ETH for gas (%x). Req %v, has %v", sender.Address().Bytes()[:4], mgval, sender.Balance()) + return fmt.Errorf("insufficient EXP for gas (%x). Req %v, has %v", sender.Address().Bytes()[:4], mgval, sender.Balance()) } if err = self.gp.SubGas(mgas); err != nil { return err diff --git a/core/tx_pool.go b/core/tx_pool.go index f2eb2bbdd3..5d1da430a2 100644 --- a/core/tx_pool.go +++ b/core/tx_pool.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package core @@ -24,12 +24,12 @@ import ( "sync" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/event" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" ) var ( diff --git a/core/tx_pool_test.go b/core/tx_pool_test.go index ed9bea75f0..dabdf70243 100644 --- a/core/tx_pool_test.go +++ b/core/tx_pool_test.go @@ -1,3 +1,4 @@ +// Copyright 2015 The go-expanse Authors // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // @@ -6,13 +7,14 @@ // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // +// The go-expanse library is distributed in the hope that it will be useful, // The go-ethereum 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package core @@ -21,12 +23,12 @@ import ( "math/big" "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/event" ) func transaction(nonce uint64, gaslimit *big.Int, key *ecdsa.PrivateKey) *types.Transaction { @@ -72,7 +74,6 @@ func TestInvalidTransactions(t *testing.T) { if err := pool.Add(tx); err != ErrNonce { t.Error("expected", ErrNonce) } - tx = transaction(1, big.NewInt(100000), key) pool.minGasPrice = big.NewInt(1000) if err := pool.Add(tx); err != ErrCheap { @@ -331,7 +332,7 @@ func TestTransactionDropping(t *testing.T) { // Tests that if a transaction is dropped from the current pending pool (e.g. out // of fund), all consecutive (still valid, but not executable) transactions are -// postponed back into the future queue to prevent broadcasting them. +// postponed back into the future queue to prevent broadcating them. func TestTransactionPostponing(t *testing.T) { // Create a test account and fund it pool, key := setupTxPool() @@ -366,7 +367,7 @@ func TestTransactionPostponing(t *testing.T) { if len(pool.queue[account]) != 0 { t.Errorf("queued transaction mismatch: have %d, want %d", len(pool.queue), 0) } - // Reduce the balance of the account, and check that transactions are reorganised + // Reduce the balance of the account, and check that transactions are reorganized state.AddBalance(account, big.NewInt(-750)) pool.resetState() diff --git a/core/types.go b/core/types.go index 20f33a153f..3c283a5bcf 100644 --- a/core/types.go +++ b/core/types.go @@ -19,12 +19,12 @@ package core import ( "math/big" - "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" + "github.com/expanse-project/go-expanse/accounts" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/event" ) // Validator is an interface which defines the standard for block validation. @@ -65,7 +65,7 @@ type Processor interface { } // Backend is an interface defining the basic functionality for an operable node -// with all the functionality to be a functional, valid Ethereum operator. +// with all the functionality to be a functional, valid Expanse operator. // // TODO Remove this type Backend interface { diff --git a/core/types/block.go b/core/types/block.go index 387a063aeb..3b0a37a281 100644 --- a/core/types/block.go +++ b/core/types/block.go @@ -1,20 +1,20 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . -// Package types contains data types related to Ethereum consensus. +// Package types contains data types related to Expanse consensus. package types import ( @@ -28,9 +28,9 @@ import ( "sync/atomic" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto/sha3" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto/sha3" + "github.com/expanse-project/go-expanse/rlp" ) // A BlockNonce is a 64-bit hash which proves (combined with the @@ -122,7 +122,7 @@ func rlpHash(x interface{}) (h common.Hash) { } // Body is a simple (mutable, non-safe) data container for storing and moving -// a block's data contents (transactions and uncles) together. +// a block's data contents (transactions and uncles) togexper. type Body struct { Transactions []*Transaction Uncles []*Header @@ -141,7 +141,7 @@ type Block struct { // of the chain up to and including the block. td *big.Int - // ReceivedAt is used by package eth to track block propagation time. + // ReceivedAt is used by package exp to track block propagation time. ReceivedAt time.Time } @@ -158,7 +158,7 @@ func (b *Block) DeprecatedTd() *big.Int { // would otherwise need to be recomputed. type StorageBlock Block -// "external" block encoding. used for eth protocol, etc. +// "external" block encoding. used for exp protocol, etc. type extblock struct { Header *Header Txs []*Transaction diff --git a/core/types/block_test.go b/core/types/block_test.go index cdd8431f4d..e7aa6983f6 100644 --- a/core/types/block_test.go +++ b/core/types/block_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package types @@ -22,8 +22,8 @@ import ( "reflect" "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/rlp" ) // from bcValidBlockTest.json, "SimpleTx" diff --git a/core/types/bloom9.go b/core/types/bloom9.go index ecf2bffc2e..3c7cf00a70 100644 --- a/core/types/bloom9.go +++ b/core/types/bloom9.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package types @@ -20,9 +20,9 @@ import ( "fmt" "math/big" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/crypto" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/crypto" ) type bytesBacked interface { diff --git a/core/types/bloom9_test.go b/core/types/bloom9_test.go index 58e8f70731..3857d18d1a 100644 --- a/core/types/bloom9_test.go +++ b/core/types/bloom9_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package types @@ -54,7 +54,7 @@ func TestBloom(t *testing.T) { import ( "testing" - "github.com/ethereum/go-ethereum/core/state" + "github.com/expanse-project/go-expanse/core/state" ) func TestBloom9(t *testing.T) { diff --git a/core/types/derive_sha.go b/core/types/derive_sha.go index 00c42c5bc6..fb1c6e482c 100644 --- a/core/types/derive_sha.go +++ b/core/types/derive_sha.go @@ -1,27 +1,28 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package types import ( + "bytes" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/rlp" - "github.com/ethereum/go-ethereum/trie" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/rlp" + "github.com/expanse-project/go-expanse/trie" ) type DerivableList interface { diff --git a/core/types/receipt.go b/core/types/receipt.go index 5f847fc5c3..98170d04ad 100644 --- a/core/types/receipt.go +++ b/core/types/receipt.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package types @@ -21,9 +21,9 @@ import ( "io" "math/big" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/rlp" ) // Receipt represents the results of a transaction. diff --git a/core/types/transaction.go b/core/types/transaction.go index b99d3a7163..10176abdaf 100644 --- a/core/types/transaction.go +++ b/core/types/transaction.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package types @@ -26,11 +26,11 @@ import ( "sort" "sync/atomic" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/rlp" ) var ErrInvalidSig = errors.New("invalid v, r, s values") @@ -168,7 +168,7 @@ func (tx *Transaction) Size() common.StorageSize { // Frontier / Homestead. however, the first time called it runs // signature validations, so we need two versions. This makes it // easier to ensure backwards compatibility of things like package rpc -// where eth_getblockbynumber uses tx.From() and needs to work for +// where exp_getblockbynumber uses tx.From() and needs to work for // both txs before and after the first homestead block. Signatures // valid in homestead are a subset of valid ones in Frontier) func (tx *Transaction) From() (common.Address, error) { @@ -186,7 +186,7 @@ func (tx *Transaction) From() (common.Address, error) { // Frontier / Homestead. however, the first time called it runs // signature validations, so we need two versions. This makes it // easier to ensure backwards compatibility of things like package rpc -// where eth_getblockbynumber uses tx.From() and needs to work for +// where exp_getblockbynumber uses tx.From() and needs to work for // both txs before and after the first homestead block. Signatures // valid in homestead are a subset of valid ones in Frontier) func (tx *Transaction) FromFrontier() (common.Address, error) { @@ -379,7 +379,7 @@ func (s *TxByPrice) Pop() interface{} { // // This method first sorts the separates the list of transactions into individual // sender accounts and sorts them by nonce. After the account nonce ordering is -// satisfied, the results are merged back together by price, always comparing only +// satisfied, the results are merged back togexper by price, always comparing only // the head transaction from each account. This is done via a heap to keep it fast. func SortByPriceAndNonce(txs []*Transaction) { // Separate the transactions by account and sort by nonce diff --git a/core/types/transaction_test.go b/core/types/transaction_test.go index 62420e71f8..a3d66bfd36 100644 --- a/core/types/transaction_test.go +++ b/core/types/transaction_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package types @@ -22,13 +22,13 @@ import ( "math/big" "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/rlp" ) // The values in those tests are from the Transaction Tests -// at github.com/ethereum/tests. +// at github.com/expanse-project/tests. var ( emptyTx = NewTransaction( diff --git a/core/vm/analysis.go b/core/vm/analysis.go index a0f6158217..7f5ecc7959 100644 --- a/core/vm/analysis.go +++ b/core/vm/analysis.go @@ -1,25 +1,25 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package vm import ( "math/big" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse-project/go-expanse/common" ) var bigMaxUint64 = new(big.Int).SetUint64(^uint64(0)) diff --git a/core/vm/asm.go b/core/vm/asm.go index d7dbde5e82..32d6fd2807 100644 --- a/core/vm/asm.go +++ b/core/vm/asm.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package vm @@ -20,7 +20,7 @@ import ( "fmt" "math/big" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse-project/go-expanse/common" ) // Disassemble disassembles the byte code and returns the string diff --git a/core/vm/common.go b/core/vm/common.go index 2878b92d2a..f9075665d8 100644 --- a/core/vm/common.go +++ b/core/vm/common.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package vm @@ -20,8 +20,8 @@ import ( "math" "math/big" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/params" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/params" ) // Type is the VM type accepted by **NewVm** diff --git a/core/vm/contract.go b/core/vm/contract.go index 844d3f328e..bb9faaf559 100644 --- a/core/vm/contract.go +++ b/core/vm/contract.go @@ -1,25 +1,26 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors +// Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package vm import ( "math/big" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse-project/go-expanse/common" ) // ContractRef is a reference to the contract's backing object @@ -31,7 +32,7 @@ type ContractRef interface { ForEachStorage(callback func(key, value common.Hash) bool) } -// Contract represents an ethereum contract in the state database. It contains +// Contract represents an expanse contract in the state database. It contains // the the contract code, calling arguments. Contract implements ContractRef type Contract struct { // CallerAddress is the result of the caller which initialised this diff --git a/core/vm/contracts.go b/core/vm/contracts.go index 5cc9f903b5..00b053ee50 100644 --- a/core/vm/contracts.go +++ b/core/vm/contracts.go @@ -1,32 +1,32 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package vm import ( "math/big" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/params" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/params" ) -// PrecompiledAccount represents a native ethereum contract +// PrecompiledAccount represents a native expanse contract type PrecompiledAccount struct { Gas func(l int) *big.Int fn func(in []byte) []byte @@ -37,11 +37,11 @@ func (self PrecompiledAccount) Call(in []byte) []byte { return self.fn(in) } -// Precompiled contains the default set of ethereum contracts +// Precompiled contains the default set of expanse contracts var Precompiled = PrecompiledContracts() // PrecompiledContracts returns the default set of precompiled ethereum -// contracts defined by the ethereum yellow paper. +// contracts defined by the expanse yellow paper. func PrecompiledContracts() map[string]*PrecompiledAccount { return map[string]*PrecompiledAccount{ // ECRECOVER diff --git a/core/vm/disasm.go b/core/vm/disasm.go index 2bfea5cbda..616a4521b8 100644 --- a/core/vm/disasm.go +++ b/core/vm/disasm.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package vm diff --git a/core/vm/doc.go b/core/vm/doc.go index 239be2cfec..fc1ae2b340 100644 --- a/core/vm/doc.go +++ b/core/vm/doc.go @@ -15,11 +15,11 @@ // along with the go-ethereum library. If not, see . /* -Package vm implements the Ethereum Virtual Machine. +Package vm implements the Expanse Virtual Machine. The vm package implements two EVMs, a byte code VM and a JIT VM. The BC (Byte Code) VM loops over a set of bytes and executes them according to the set -of rules defined in the Ethereum yellow paper. When the BC VM is invoked it +of rules defined in the Expanse yellow paper. When the BC VM is invoked it invokes the JIT VM in a separate goroutine and compiles the byte code in JIT instructions. diff --git a/core/vm/environment.go b/core/vm/environment.go index 747627565e..2ddaf77e22 100644 --- a/core/vm/environment.go +++ b/core/vm/environment.go @@ -1,25 +1,26 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package vm import ( "math/big" - "github.com/ethereum/go-ethereum/common" + + "github.com/expanse-project/go-expanse/common" ) // RuleSet is an interface that defines the current rule set during the @@ -108,7 +109,7 @@ type Database interface { IsDeleted(common.Address) bool } -// Account represents a contract or basic ethereum account. +// Account represents a contract or basic expanse account. type Account interface { SubBalance(amount *big.Int) AddBalance(amount *big.Int) diff --git a/core/vm/errors.go b/core/vm/errors.go index 116fbe4565..66c3bc5f79 100644 --- a/core/vm/errors.go +++ b/core/vm/errors.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package vm @@ -20,7 +20,7 @@ import ( "errors" "fmt" - "github.com/ethereum/go-ethereum/params" + "github.com/expanse-project/go-expanse/params" ) var OutOfGasError = errors.New("Out of gas") diff --git a/core/vm/gas.go b/core/vm/gas.go index 09feddd7d3..de92bd467e 100644 --- a/core/vm/gas.go +++ b/core/vm/gas.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package vm @@ -20,7 +20,7 @@ import ( "fmt" "math/big" - "github.com/ethereum/go-ethereum/params" + "github.com/expanse-project/go-expanse/params" ) var ( diff --git a/core/vm/instructions.go b/core/vm/instructions.go index e2fc5ee0f1..15134357e0 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -1,18 +1,19 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors +// Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package vm @@ -20,9 +21,10 @@ import ( "fmt" "math/big" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/params" + + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/params" ) type programInstruction interface { diff --git a/core/vm/jit.go b/core/vm/jit.go index f56d7c1af3..6687d588eb 100644 --- a/core/vm/jit.go +++ b/core/vm/jit.go @@ -1,18 +1,19 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors +// Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package vm @@ -22,11 +23,12 @@ import ( "sync/atomic" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/params" + + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/params" "github.com/hashicorp/golang-lru" ) diff --git a/core/vm/jit_optimiser.go b/core/vm/jit_optimiser.go index 31ad0c2e2b..994a9c7658 100644 --- a/core/vm/jit_optimiser.go +++ b/core/vm/jit_optimiser.go @@ -20,8 +20,8 @@ import ( "math/big" "time" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" ) // optimeProgram optimises a JIT program creating segments out of program diff --git a/core/vm/jit_test.go b/core/vm/jit_test.go index 403c15a8db..a7dd7258ab 100644 --- a/core/vm/jit_test.go +++ b/core/vm/jit_test.go @@ -1,19 +1,19 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors +// Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - +// along with the go-expanse library. If not, see . package vm import ( @@ -21,8 +21,8 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" ) const maxRun = 1000 diff --git a/core/vm/log.go b/core/vm/log.go index e4cc6021bd..709b76f3b3 100644 --- a/core/vm/log.go +++ b/core/vm/log.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package vm @@ -21,8 +21,8 @@ import ( "fmt" "io" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/rlp" ) type Log struct { diff --git a/core/vm/logger.go b/core/vm/logger.go index cbdc8a7447..f39fa86483 100644 --- a/core/vm/logger.go +++ b/core/vm/logger.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package vm @@ -22,7 +22,7 @@ import ( "os" "unicode" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse-project/go-expanse/common" ) type Storage map[common.Hash]common.Hash diff --git a/core/vm/logger_test.go b/core/vm/logger_test.go index 1445698659..42c4e4888a 100644 --- a/core/vm/logger_test.go +++ b/core/vm/logger_test.go @@ -20,7 +20,7 @@ import ( "math/big" "testing" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse-project/go-expanse/common" ) type dummyContractRef struct { diff --git a/core/vm/memory.go b/core/vm/memory.go index d011884173..bde7ad6912 100644 --- a/core/vm/memory.go +++ b/core/vm/memory.go @@ -1,24 +1,24 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package vm import "fmt" -// Memory implements a simple memory model for the ethereum virtual machine. +// Memory implements a simple memory model for the expanse virtual machine. type Memory struct { store []byte } diff --git a/core/vm/opcodes.go b/core/vm/opcodes.go index 7d861f1de9..454fb37d65 100644 --- a/core/vm/opcodes.go +++ b/core/vm/opcodes.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package vm diff --git a/core/vm/runtime/doc.go b/core/vm/runtime/doc.go index a3b464a7d6..80d4c8fd77 100644 --- a/core/vm/runtime/doc.go +++ b/core/vm/runtime/doc.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // Package runtime provides a basic execution model for executing EVM code. package runtime diff --git a/core/vm/runtime/env.go b/core/vm/runtime/env.go index d8c98e5458..b19add0e0f 100644 --- a/core/vm/runtime/env.go +++ b/core/vm/runtime/env.go @@ -19,10 +19,10 @@ package runtime import ( "math/big" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/vm" ) // Env is a basic runtime environment required for running the EVM. diff --git a/core/vm/runtime/runtime.go b/core/vm/runtime/runtime.go index 309d508c3d..d789b6c05e 100644 --- a/core/vm/runtime/runtime.go +++ b/core/vm/runtime/runtime.go @@ -20,11 +20,11 @@ import ( "math/big" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/ethdb" ) // The default, always homestead, rule set for the vm env diff --git a/core/vm/runtime/runtime_example_test.go b/core/vm/runtime/runtime_example_test.go index b7d0ddc384..d0c8575533 100644 --- a/core/vm/runtime/runtime_example_test.go +++ b/core/vm/runtime/runtime_example_test.go @@ -1,26 +1,26 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package runtime_test import ( "fmt" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm/runtime" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/vm/runtime" ) func ExampleExecute() { diff --git a/core/vm/runtime/runtime_test.go b/core/vm/runtime/runtime_test.go index 88c76c7319..21d0dc0c10 100644 --- a/core/vm/runtime/runtime_test.go +++ b/core/vm/runtime/runtime_test.go @@ -21,11 +21,11 @@ import ( "strings" "testing" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/ethdb" + "github.com/expanse-project/go-expanse/accounts/abi" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/ethdb" ) func TestDefaults(t *testing.T) { diff --git a/core/vm/stack.go b/core/vm/stack.go index 0046edec2f..29a62dc652 100644 --- a/core/vm/stack.go +++ b/core/vm/stack.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package vm diff --git a/core/vm/util_test.go b/core/vm/util_test.go index f0d825555f..d70cb939b0 100644 --- a/core/vm/util_test.go +++ b/core/vm/util_test.go @@ -1,18 +1,18 @@ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package vm diff --git a/core/vm/virtual_machine.go b/core/vm/virtual_machine.go index 6291088846..f0aaefee62 100644 --- a/core/vm/virtual_machine.go +++ b/core/vm/virtual_machine.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package vm diff --git a/core/vm/vm.go b/core/vm/vm.go index 0f93715d6f..d64ca78c01 100644 --- a/core/vm/vm.go +++ b/core/vm/vm.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package vm @@ -21,11 +21,11 @@ import ( "math/big" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/params" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/params" ) // Config are the configuration options for the EVM @@ -36,7 +36,7 @@ type Config struct { Logger LogConfig } -// EVM is used to run Ethereum based contracts and will utilise the +// EVM is used to run Expanse based contracts and will utilise the // passed environment to query external sources for state information. // The EVM will run the byte code VM or JIT VM based on the passed // configuration. @@ -67,7 +67,6 @@ func New(env Environment, cfg Config) *EVM { func (evm *EVM) Run(contract *Contract, input []byte) (ret []byte, err error) { evm.env.SetDepth(evm.env.Depth() + 1) defer evm.env.SetDepth(evm.env.Depth() - 1) - if contract.CodeAddr != nil { if p := Precompiled[contract.CodeAddr.Str()]; p != nil { return evm.RunPrecompiled(p, input, contract) diff --git a/core/vm/vm_jit.go b/core/vm/vm_jit.go index f6e4a515bc..0c4ac2f662 100644 --- a/core/vm/vm_jit.go +++ b/core/vm/vm_jit.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // +build evmjit @@ -25,7 +25,7 @@ int evmjit_run(void* _jit, void* _data, void* _env); void evmjit_destroy(void* _jit); // Shared library evmjit (e.g. libevmjit.so) is expected to be installed in /usr/local/lib -// More: https://github.com/ethereum/evmjit +// More: https://github.com/expanse-project/evmjit #cgo LDFLAGS: -levmjit */ import "C" @@ -38,9 +38,9 @@ import ( "math/big" "unsafe" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/params" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/params" ) type JitVm struct { diff --git a/core/vm/vm_jit_fake.go b/core/vm/vm_jit_fake.go index 4fa98ccd9c..8fb651cc20 100644 --- a/core/vm/vm_jit_fake.go +++ b/core/vm/vm_jit_fake.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // +build !evmjit diff --git a/core/vm_env.go b/core/vm_env.go index f50140c681..5115a7423d 100644 --- a/core/vm_env.go +++ b/core/vm_env.go @@ -1,28 +1,28 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package core import ( "math/big" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/core/vm" ) // GetHashFn returns a function for which the VM env can query block hashes through @@ -43,7 +43,7 @@ func GetHashFn(ref common.Hash, chain *BlockChain) func(n uint64) common.Hash { type VMEnv struct { chainConfig *ChainConfig // Chain configuration state *state.StateDB // State to use for executing - evm *vm.EVM // The Ethereum Virtual Machine + evm *vm.EVM // The Expanse Virtual Machine depth int // Current execution depth msg Message // Message appliod diff --git a/crypto/crypto.go b/crypto/crypto.go index 85f0970956..e88b792b33 100644 --- a/crypto/crypto.go +++ b/crypto/crypto.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package crypto @@ -30,11 +30,11 @@ import ( "encoding/hex" "errors" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto/ecies" - "github.com/ethereum/go-ethereum/crypto/secp256k1" - "github.com/ethereum/go-ethereum/crypto/sha3" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto/ecies" + "github.com/expanse-project/go-expanse/crypto/secp256k1" + "github.com/expanse-project/go-expanse/crypto/sha3" + "github.com/expanse-project/go-expanse/rlp" "golang.org/x/crypto/ripemd160" ) @@ -59,7 +59,7 @@ func Keccak256Hash(data ...[]byte) (h common.Hash) { func Sha3(data ...[]byte) []byte { return Keccak256(data...) } func Sha3Hash(data ...[]byte) common.Hash { return Keccak256Hash(data...) } -// Creates an ethereum address given the bytes and the nonce +// Creates an expanse address given the bytes and the nonce func CreateAddress(b common.Address, nonce uint64) common.Address { data, _ := rlp.EncodeToBytes([]interface{}{b, nonce}) return common.BytesToAddress(Keccak256(data)[12:]) diff --git a/crypto/crypto_test.go b/crypto/crypto_test.go index 58b29da490..7df29dfb97 100644 --- a/crypto/crypto_test.go +++ b/crypto/crypto_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package crypto @@ -27,8 +27,8 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto/secp256k1" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto/secp256k1" ) var testAddrHex = "970e8128ab834e8eac17ab8e3812f010678cf791" diff --git a/crypto/ecies/asn1.go b/crypto/ecies/asn1.go index 40dabd329b..ac9705364e 100644 --- a/crypto/ecies/asn1.go +++ b/crypto/ecies/asn1.go @@ -42,7 +42,7 @@ import ( "hash" "math/big" - "github.com/ethereum/go-ethereum/crypto/secp256k1" + "github.com/expanse-project/go-expanse/crypto/secp256k1" ) var ( diff --git a/crypto/ecies/ecies_test.go b/crypto/ecies/ecies_test.go index cb09061ced..913efe5bdf 100644 --- a/crypto/ecies/ecies_test.go +++ b/crypto/ecies/ecies_test.go @@ -42,7 +42,7 @@ import ( "math/big" "testing" - "github.com/ethereum/go-ethereum/crypto/secp256k1" + "github.com/expanse-project/go-expanse/crypto/secp256k1" ) var dumpEnc bool diff --git a/crypto/ecies/params.go b/crypto/ecies/params.go index 511c53ebc0..5cee4db49e 100644 --- a/crypto/ecies/params.go +++ b/crypto/ecies/params.go @@ -42,7 +42,7 @@ import ( "fmt" "hash" - "github.com/ethereum/go-ethereum/crypto/secp256k1" + "github.com/expanse-project/go-expanse/crypto/secp256k1" ) var ( diff --git a/crypto/encrypt_decrypt_test.go b/crypto/encrypt_decrypt_test.go index fcf40b70fd..3254a1b251 100644 --- a/crypto/encrypt_decrypt_test.go +++ b/crypto/encrypt_decrypt_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package crypto @@ -21,7 +21,7 @@ import ( "fmt" "testing" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse-project/go-expanse/common" ) func TestBox(t *testing.T) { diff --git a/crypto/keypair.go b/crypto/keypair.go new file mode 100644 index 0000000000..ec9d265188 --- /dev/null +++ b/crypto/keypair.go @@ -0,0 +1,66 @@ +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. +// +// The go-expanse library 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. +// +// The go-expanse 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-expanse library. If not, see . + +package crypto + +import ( + "strings" + + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto/secp256k1" +) + +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(common.Bytes2Hex(k.PrivateKey)), " ") + } + return k.mnemonic +} + +func (k *KeyPair) AsStrings() (string, string, string, string) { + return k.Mnemonic(), common.Bytes2Hex(k.Address()), common.Bytes2Hex(k.PrivateKey), common.Bytes2Hex(k.PublicKey) +} diff --git a/crypto/mnemonic.go b/crypto/mnemonic.go new file mode 100644 index 0000000000..b41b7de973 --- /dev/null +++ b/crypto/mnemonic.go @@ -0,0 +1,76 @@ +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. +// +// The go-expanse library 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. +// +// The go-expanse 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-expanse library. If not, see . + +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 0000000000..3f4cc2cd04 --- /dev/null +++ b/crypto/mnemonic_test.go @@ -0,0 +1,90 @@ +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. +// +// The go-expanse library 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. +// +// The go-expanse 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-expanse library. If not, see . + +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 0000000000..5db1a7a089 --- /dev/null +++ b/crypto/mnemonic_words.go @@ -0,0 +1,1650 @@ +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. +// +// The go-expanse library 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. +// +// The go-expanse 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-expanse library. If not, see . + +package crypto + +var MnemonicWords []string = []string{ + "aiden", + "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", + "togexper", + "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", + "heather", + "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", + "elora", + "everybody", + "feast", + "forehead", + "former", + "franko", + "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/crypto/randentropy/rand_entropy.go b/crypto/randentropy/rand_entropy.go index 539d3ac894..19f823683c 100644 --- a/crypto/randentropy/rand_entropy.go +++ b/crypto/randentropy/rand_entropy.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package randentropy diff --git a/crypto/secp256k1/curve_test.go b/crypto/secp256k1/curve_test.go index d915ee8525..b13a39fed3 100644 --- a/crypto/secp256k1/curve_test.go +++ b/crypto/secp256k1/curve_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package secp256k1 diff --git a/crypto/secp256k1/libsecp256k1/autogen.sh b/crypto/secp256k1/libsecp256k1/autogen.sh old mode 100755 new mode 100644 diff --git a/crypto/secp256k1/libsecp256k1/include/secp256k1.h b/crypto/secp256k1/libsecp256k1/include/secp256k1.h index 23378de1fd..884ad6c3fa 100644 --- a/crypto/secp256k1/libsecp256k1/include/secp256k1.h +++ b/crypto/secp256k1/libsecp256k1/include/secp256k1.h @@ -522,14 +522,14 @@ SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_context_randomize( const unsigned char *seed32 ) SECP256K1_ARG_NONNULL(1); -/** Add a number of public keys together. +/** Add a number of public keys togexper. * Returns: 1: the sum of the public keys is valid. * 0: the sum of the public keys is not valid. * Args: ctx: pointer to a context object * Out: out: pointer to pubkey for placing the resulting public key * (cannot be NULL) * In: ins: pointer to array of pointers to public keys (cannot be NULL) - * n: the number of public keys to add together (must be at least 1) + * n: the number of public keys to add togexper (must be at least 1) * Use secp256k1_ec_pubkey_compress and secp256k1_ec_pubkey_decompress if the * uncompressed format is needed. */ diff --git a/crypto/secp256k1/libsecp256k1/src/scalar.h b/crypto/secp256k1/libsecp256k1/src/scalar.h index b590ccd6dd..81351c0775 100644 --- a/crypto/secp256k1/libsecp256k1/src/scalar.h +++ b/crypto/secp256k1/libsecp256k1/src/scalar.h @@ -39,7 +39,7 @@ static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v); /** Convert a scalar to a byte array. */ static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a); -/** Add two scalars together (modulo the group order). Returns whether it overflowed. */ +/** Add two scalars togexper (modulo the group order). Returns whether it overflowed. */ static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b); /** Conditionally add a power of two to a scalar. The result is not allowed to overflow. */ diff --git a/crypto/secp256k1/libsecp256k1/src/tests.c b/crypto/secp256k1/libsecp256k1/src/tests.c index 3366d90fca..9bdb6dbac0 100644 --- a/crypto/secp256k1/libsecp256k1/src/tests.c +++ b/crypto/secp256k1/libsecp256k1/src/tests.c @@ -425,7 +425,7 @@ void scalar_test(void) { #ifndef USE_NUM_NONE { - /* Test that adding the scalars together is equal to adding their numbers together modulo the order. */ + /* Test that adding the scalars togexper is equal to adding their numbers togexper modulo the order. */ secp256k1_num rnum; secp256k1_num r2num; secp256k1_scalar r; @@ -1144,7 +1144,7 @@ void test_ge(void) { } } - /* Test adding all points together in random order equals infinity. */ + /* Test adding all points togexper in random order equals infinity. */ { secp256k1_gej sum = SECP256K1_GEJ_CONST_INFINITY; secp256k1_gej *gej_shuffled = (secp256k1_gej *)malloc((4 * runs + 1) * sizeof(secp256k1_gej)); diff --git a/crypto/secp256k1/notes.go b/crypto/secp256k1/notes.go index 93e6d1902f..2834cc3562 100644 --- a/crypto/secp256k1/notes.go +++ b/crypto/secp256k1/notes.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package secp256k1 diff --git a/crypto/secp256k1/secp256.go b/crypto/secp256k1/secp256.go index 4999c5c951..ce052689a7 100644 --- a/crypto/secp256k1/secp256.go +++ b/crypto/secp256k1/secp256.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package secp256k1 @@ -42,7 +42,7 @@ import ( "math/big" "unsafe" - "github.com/ethereum/go-ethereum/crypto/randentropy" + "github.com/expanse-project/go-expanse/crypto/randentropy" ) //#define USE_FIELD_5X64 diff --git a/crypto/secp256k1/secp256_test.go b/crypto/secp256k1/secp256_test.go index fc6fc9b32e..5e6bcf2178 100644 --- a/crypto/secp256k1/secp256_test.go +++ b/crypto/secp256k1/secp256_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package secp256k1 @@ -21,7 +21,7 @@ import ( "encoding/hex" "testing" - "github.com/ethereum/go-ethereum/crypto/randentropy" + "github.com/expanse-project/go-expanse/crypto/randentropy" ) const TestCount = 1000 diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000000..e68840e44b --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,36 @@ +FROM ubuntu:wily +MAINTAINER chrisfranko + + +ENV DEBIAN_FRONTEND noninteractive + +# Usual update / upgrade +RUN apt-get update +RUN apt-get upgrade -q -y +RUN apt-get dist-upgrade -q -y + +# Let our containers upgrade themselves +RUN apt-get install -q -y unattended-upgrades + +# Install Expanse +RUN apt-get install -q -y curl git mercurial binutils bison gcc make libgmp3-dev build-essential + +# Install Go +RUN \ + mkdir -p /goroot && \ + curl https://storage.googleapis.com/golang/go1.4.2.linux-amd64.tar.gz | tar xvzf - -C /goroot --strip-components=1 + +# Set environment variables. +ENV GOROOT /goroot +ENV GOPATH /gopath +ENV PATH $GOROOT/bin:$GOPATH/bin:$PATH + +RUN git clone http://www.github.com/expanse-project/go-expanse.git +RUN cd go-expanse && make gexp + +RUN cp build/bin/gexp /usr/bin/gexp + +EXPOSE 9656 +EXPOSE 42786 + +ENTRYPOINT ["/usr/bin/gexp"] diff --git a/docker/supervisord.conf b/docker/supervisord.conf new file mode 100644 index 0000000000..0ad1d5978e --- /dev/null +++ b/docker/supervisord.conf @@ -0,0 +1,23 @@ +[supervisord] +nodaemon=false + +[program:gexp] +priority=30 +directory=~/go-expanse/ +command=build/bin/gexp --rpc +user=root +autostart=true +autorestart=true +startsecs=10 +stopsignal=QUIT +stdout_logfile=/var/log/gexp.log +stderr_logfile=/var/log/gexp.err + +[unix_http_server] +file=%(here)s/supervisor.sock + +[supervisorctl] +serverurl=unix://%(here)s/supervisor.sock + +[rpcinterface:supervisor] +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface \ No newline at end of file diff --git a/errs/errors.go b/errs/errors.go index 675649efa2..f77aa96cb0 100644 --- a/errs/errors.go +++ b/errs/errors.go @@ -1,26 +1,26 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package errs import ( "fmt" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" ) /* diff --git a/errs/errors_test.go b/errs/errors_test.go index d6d14b45ea..7f22ea15c4 100644 --- a/errs/errors_test.go +++ b/errs/errors_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package errs @@ -20,7 +20,7 @@ import ( "fmt" "testing" - "github.com/ethereum/go-ethereum/logger" + "github.com/expanse-project/go-expanse/logger" ) func testErrors() *Errors { diff --git a/ethdb/README.md b/ethdb/README.md new file mode 100644 index 0000000000..fbc451595b --- /dev/null +++ b/ethdb/README.md @@ -0,0 +1,11 @@ +# ethdb + +The ethdb package contains the expanse database interfaces + +# Installation + +`go get github.com/expanse-project/ethdb-go` + +# Usage + +Todo :-) diff --git a/ethdb/database.go b/ethdb/database.go index dffb42e2b0..24dbcff21d 100644 --- a/ethdb/database.go +++ b/ethdb/database.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package ethdb @@ -23,9 +23,9 @@ import ( "sync" "time" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/metrics" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/metrics" "github.com/syndtr/goleveldb/leveldb" "github.com/syndtr/goleveldb/leveldb/errors" "github.com/syndtr/goleveldb/leveldb/iterator" diff --git a/ethdb/database_test.go b/ethdb/database_test.go index 0e69a1218c..8593b56fee 100644 --- a/ethdb/database_test.go +++ b/ethdb/database_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package ethdb @@ -20,7 +20,7 @@ import ( "os" "path/filepath" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse-project/go-expanse/common" ) func newDb() *LDBDatabase { diff --git a/ethdb/interface.go b/ethdb/interface.go index f4b787a52a..2eb529aa31 100644 --- a/ethdb/interface.go +++ b/ethdb/interface.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package ethdb diff --git a/ethdb/memory_database.go b/ethdb/memory_database.go index a729f52332..af2589344d 100644 --- a/ethdb/memory_database.go +++ b/ethdb/memory_database.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package ethdb @@ -20,7 +20,7 @@ import ( "errors" "sync" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse-project/go-expanse/common" ) /* diff --git a/event/event.go b/event/event.go index fd0bcfbd48..8a6eaf8f06 100644 --- a/event/event.go +++ b/event/event.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // Package event implements an event multiplexer. package event diff --git a/event/event_test.go b/event/event_test.go index 3940293013..c0f6cfb2b9 100644 --- a/event/event_test.go +++ b/event/event_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package event diff --git a/event/example_test.go b/event/example_test.go index 29938e8539..09143bc6cd 100644 --- a/event/example_test.go +++ b/event/example_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package event diff --git a/event/filter/filter.go b/event/filter/filter.go index b1fbf30ee4..592b48116c 100644 --- a/event/filter/filter.go +++ b/event/filter/filter.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // Package filter implements event filters. package filter diff --git a/event/filter/filter_test.go b/event/filter/filter_test.go index dcc9112453..00af4726a8 100644 --- a/event/filter/filter_test.go +++ b/event/filter/filter_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package filter diff --git a/event/filter/generic_filter.go b/event/filter/generic_filter.go index 27f35920d4..b6369bd012 100644 --- a/event/filter/generic_filter.go +++ b/event/filter/generic_filter.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package filter diff --git a/exp.log b/exp.log new file mode 100644 index 0000000000..03d74ecceb --- /dev/null +++ b/exp.log @@ -0,0 +1,1866 @@ +I0911 11:27:05.210227 12571 database.go:73] Alloted 16MB cache to /home/happy/.expanse/chaindata +I0911 11:27:05.328952 12571 database.go:73] Alloted 16MB cache to /home/happy/.expanse/dapp +I0911 11:27:05.372440 12571 backend.go:290] Protocol Versions: [61 60], Network Id: 1 +I0911 11:27:05.373105 12571 backend.go:327] Blockchain DB Version: 3 +I0911 11:27:05.373666 12571 chain_manager.go:237] Last block (#306) 1f7f026b7cbbd3c1222a65221985081f87f0872ac9fdacd8fdd16e397cc3b33c TD=22121483829 +I0911 11:27:05.418860 12571 cmd.go:125] Starting Gexp/v1.1.2-74cee8c3/linux/go1.4 +I0911 11:27:05.419103 12571 server.go:311] Starting Server +I0911 11:27:07.322607 12571 nat.go:111] mapped network port udp:42786 -> 42786 (expanse discovery) using UPNP IGDv1-IP1 +I0911 11:27:07.408504 12571 udp.go:207] Listening, enode://f944c6702a78a0cbcd6505b76daff069dad2e45ff88896c475da2bef47091c88e5b4042211233e397ad958be998003a2674151e60719c5fdeeff5f8cc2c231a1@74.196.59.103:42786 +I0911 11:27:07.408688 12571 server.go:552] Listening on [::]:42786 +I0911 11:27:07.412206 12571 backend.go:556] Server started +I0911 11:27:07.412625 12571 ipc_unix.go:104] IPC service started (/home/happy/.expanse/gexp.ipc) +I0911 11:27:07.417999 12571 nat.go:111] mapped network port tcp:42786 -> 42786 (expanse p2p) using UPNP IGDv1-IP1 +I0911 11:27:07.837768 12571 miner.go:119] Starting mining operation (CPU=0 TOT=2) +I0911 11:27:07.847459 12571 worker.go:540] commit new work on block 307 with 0 txs & 0 uncles. Took 9.577202ms +I0911 11:27:28.459963 12571 worker.go:540] commit new work on block 308 with 0 txs & 0 uncles. Took 510.628µs +I0911 11:27:28.460631 12571 worker.go:322] 🔨 Mined block (#307 / 264187f8). Wait 5 blocks for confirmation +I0911 11:27:28.461143 12571 worker.go:540] commit new work on block 308 with 0 txs & 0 uncles. Took 441.353µs +I0911 11:27:28.468045 12571 worker.go:322] 🔨 Mined stale block (#307 / f231fb2f). +I0911 11:27:28.468618 12571 worker.go:540] commit new work on block 308 with 0 txs & 0 uncles. Took 489.702µs +I0911 11:27:28.475504 12571 worker.go:322] 🔨 Mined stale block (#307 / cce4e5f3). +I0911 11:27:28.476027 12571 worker.go:540] commit new work on block 308 with 0 txs & 0 uncles. Took 441.369µs +I0911 11:27:35.097803 12571 worker.go:540] commit new work on block 309 with 0 txs & 0 uncles. Took 499.102µs +I0911 11:27:35.098453 12571 worker.go:322] 🔨 Mined block (#308 / 60ce752e). Wait 5 blocks for confirmation +I0911 11:27:35.098993 12571 worker.go:540] commit new work on block 309 with 0 txs & 0 uncles. Took 464.24µs +I0911 11:27:37.293036 12571 worker.go:540] commit new work on block 310 with 0 txs & 0 uncles. Took 3.480145ms +I0911 11:27:37.293723 12571 worker.go:322] 🔨 Mined block (#309 / 36bafd07). Wait 5 blocks for confirmation +I0911 11:27:37.294596 12571 worker.go:540] commit new work on block 310 with 0 txs & 0 uncles. Took 802.373µs +I0911 11:27:44.039791 12571 worker.go:540] commit new work on block 311 with 0 txs & 0 uncles. Took 3.592475ms +I0911 11:27:44.040750 12571 worker.go:322] 🔨 Mined block (#310 / 5def8567). Wait 5 blocks for confirmation +I0911 11:27:44.041254 12571 worker.go:540] commit new work on block 311 with 0 txs & 0 uncles. Took 417.097µs +I0911 11:27:45.153011 12571 worker.go:540] commit new work on block 312 with 0 txs & 0 uncles. Took 7.489021ms +I0911 11:27:45.153893 12571 worker.go:322] 🔨 Mined block (#311 / e15b4e53). Wait 5 blocks for confirmation +I0911 11:27:45.154383 12571 worker.go:540] commit new work on block 312 with 0 txs & 0 uncles. Took 414.713µs +I0911 11:27:48.833011 12571 worker.go:540] commit new work on block 313 with 0 txs & 0 uncles. Took 3.977062ms +I0911 11:27:48.833677 12571 worker.go:322] 🔨 Mined block (#312 / 031c051e). Wait 5 blocks for confirmation +I0911 11:27:48.834427 12571 worker.go:540] commit new work on block 313 with 0 txs & 0 uncles. Took 678.833µs +I0911 11:27:49.441018 12571 worker.go:540] commit new work on block 314 with 0 txs & 0 uncles. Took 4.745335ms +I0911 11:27:49.441910 12571 worker.go:322] 🔨 Mined block (#313 / 68ca88d8). Wait 5 blocks for confirmation +I0911 11:27:49.442536 12571 worker.go:540] commit new work on block 314 with 0 txs & 0 uncles. Took 482.05µs +I0911 11:27:51.076984 12571 worker.go:540] commit new work on block 315 with 0 txs & 0 uncles. Took 4.436806ms +I0911 11:27:51.077860 12571 worker.go:322] 🔨 Mined block (#314 / 9341cd1a). Wait 5 blocks for confirmation +I0911 11:27:51.078344 12571 worker.go:540] commit new work on block 315 with 0 txs & 0 uncles. Took 408.801µs +I0911 11:27:53.217007 12571 worker.go:540] commit new work on block 316 with 0 txs & 0 uncles. Took 5.61046ms +I0911 11:27:53.217940 12571 worker.go:322] 🔨 Mined block (#315 / c6944b89). Wait 5 blocks for confirmation +I0911 11:27:53.232248 12571 worker.go:540] commit new work on block 316 with 0 txs & 0 uncles. Took 14.217416ms +I0911 11:27:55.368989 12571 worker.go:540] commit new work on block 317 with 0 txs & 0 uncles. Took 1.35861ms +I0911 11:27:55.369809 12571 worker.go:322] 🔨 Mined block (#316 / 113ec215). Wait 5 blocks for confirmation +I0911 11:27:55.372991 12571 worker.go:540] commit new work on block 317 with 0 txs & 0 uncles. Took 3.101964ms +I0911 11:28:05.197084 12571 worker.go:322] 🔨 Mined block (#317 / 540a8221). Wait 5 blocks for confirmation +I0911 11:28:05.201691 12571 worker.go:540] commit new work on block 318 with 0 txs & 0 uncles. Took 23.220578ms +I0911 11:28:05.203236 12571 worker.go:540] commit new work on block 318 with 0 txs & 0 uncles. Took 1.100113ms +I0911 11:28:11.497951 12571 worker.go:540] commit new work on block 319 with 0 txs & 0 uncles. Took 473.326µs +I0911 11:28:11.498556 12571 worker.go:322] 🔨 Mined block (#318 / e2c5cc28). Wait 5 blocks for confirmation +I0911 11:28:11.499053 12571 worker.go:540] commit new work on block 319 with 0 txs & 0 uncles. Took 432.113µs +I0911 11:28:13.141725 12571 worker.go:540] commit new work on block 320 with 0 txs & 0 uncles. Took 471.825µs +I0911 11:28:13.142294 12571 worker.go:322] 🔨 Mined block (#319 / a6e02a6b). Wait 5 blocks for confirmation +I0911 11:28:13.142747 12571 worker.go:540] commit new work on block 320 with 0 txs & 0 uncles. Took 388.405µs +I0911 11:28:14.762134 12571 worker.go:540] commit new work on block 321 with 0 txs & 0 uncles. Took 627.94µs +I0911 11:28:14.762707 12571 worker.go:322] 🔨 Mined block (#320 / 9c8f65d6). Wait 5 blocks for confirmation +I0911 11:28:14.763409 12571 worker.go:540] commit new work on block 321 with 0 txs & 0 uncles. Took 633.734µs +I0911 11:28:15.879642 12571 worker.go:540] commit new work on block 322 with 0 txs & 0 uncles. Took 459.058µs +I0911 11:28:15.880207 12571 worker.go:322] 🔨 Mined block (#321 / d97c3c9d). Wait 5 blocks for confirmation +I0911 11:28:15.880913 12571 worker.go:540] commit new work on block 322 with 0 txs & 0 uncles. Took 638.037µs +I0911 11:28:17.510263 12571 worker.go:540] commit new work on block 323 with 0 txs & 0 uncles. Took 475.784µs +I0911 11:28:17.510371 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #317 +I0911 11:28:17.510934 12571 worker.go:322] 🔨 Mined block (#322 / 0e82bb59). Wait 5 blocks for confirmation +I0911 11:28:17.511375 12571 worker.go:540] commit new work on block 323 with 0 txs & 0 uncles. Took 376.458µs +I0911 11:28:18.113401 12571 worker.go:540] commit new work on block 324 with 0 txs & 0 uncles. Took 473.487µs +I0911 11:28:18.113507 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #318 +I0911 11:28:18.114040 12571 worker.go:322] 🔨 Mined block (#323 / 6ebf7790). Wait 5 blocks for confirmation +I0911 11:28:18.114487 12571 worker.go:540] commit new work on block 324 with 0 txs & 0 uncles. Took 382.112µs +I0911 11:28:21.287339 12571 worker.go:540] commit new work on block 325 with 0 txs & 0 uncles. Took 541.788µs +I0911 11:28:21.287451 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #319 +I0911 11:28:21.288041 12571 worker.go:322] 🔨 Mined block (#324 / 43ee0a99). Wait 5 blocks for confirmation +I0911 11:28:21.288494 12571 worker.go:540] commit new work on block 325 with 0 txs & 0 uncles. Took 387.25µs +I0911 11:28:22.414734 12571 worker.go:540] commit new work on block 326 with 0 txs & 0 uncles. Took 483.161µs +I0911 11:28:22.414844 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #320 +I0911 11:28:22.415439 12571 worker.go:322] 🔨 Mined block (#325 / bb33f037). Wait 5 blocks for confirmation +I0911 11:28:22.415974 12571 worker.go:540] commit new work on block 326 with 0 txs & 0 uncles. Took 468.123µs +I0911 11:28:23.016013 12571 worker.go:322] 🔨 Mined stale block (#325 / 4e7f42b2). +I0911 11:28:23.016582 12571 worker.go:540] commit new work on block 326 with 0 txs & 0 uncles. Took 483.875µs +I0911 11:28:27.723284 12571 worker.go:540] commit new work on block 327 with 0 txs & 0 uncles. Took 568.217µs +I0911 11:28:27.723395 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #321 +I0911 11:28:27.724178 12571 worker.go:322] 🔨 Mined block (#326 / 2d859ecb). Wait 5 blocks for confirmation +I0911 11:28:27.724697 12571 worker.go:540] commit new work on block 327 with 0 txs & 0 uncles. Took 437.476µs +I0911 11:28:28.845019 12571 worker.go:540] commit new work on block 328 with 0 txs & 0 uncles. Took 6.20857ms +I0911 11:28:28.845132 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #322 +I0911 11:28:28.845964 12571 worker.go:322] 🔨 Mined block (#327 / e8cee092). Wait 5 blocks for confirmation +I0911 11:28:28.846453 12571 worker.go:540] commit new work on block 328 with 0 txs & 0 uncles. Took 414.466µs +I0911 11:28:35.080981 12571 worker.go:540] commit new work on block 329 with 0 txs & 0 uncles. Took 1.792518ms +I0911 11:28:35.081095 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #323 +I0911 11:28:35.081652 12571 worker.go:322] 🔨 Mined block (#328 / 32e3d01a). Wait 5 blocks for confirmation +I0911 11:28:35.083533 12571 worker.go:540] commit new work on block 329 with 0 txs & 0 uncles. Took 1.811814ms +I0911 11:28:36.720992 12571 worker.go:540] commit new work on block 330 with 0 txs & 0 uncles. Took 3.790051ms +I0911 11:28:36.721103 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #324 +I0911 11:28:36.721892 12571 worker.go:322] 🔨 Mined block (#329 / d9dd33c6). Wait 5 blocks for confirmation +I0911 11:28:36.722401 12571 worker.go:540] commit new work on block 330 with 0 txs & 0 uncles. Took 434.4µs +I0911 11:28:41.410077 12571 worker.go:540] commit new work on block 331 with 0 txs & 0 uncles. Took 537.499µs +I0911 11:28:41.410201 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #325 +I0911 11:28:41.410527 12571 worker.go:322] 🔨 Mined block (#330 / 1eb7eef1). Wait 5 blocks for confirmation +I0911 11:28:41.411418 12571 worker.go:540] commit new work on block 331 with 0 txs & 0 uncles. Took 724.138µs +I0911 11:28:42.534607 12571 worker.go:540] commit new work on block 332 with 0 txs & 0 uncles. Took 2.156776ms +I0911 11:28:42.534718 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #326 +I0911 11:28:42.535447 12571 worker.go:322] 🔨 Mined block (#331 / 3e312c25). Wait 5 blocks for confirmation +I0911 11:28:42.535946 12571 worker.go:540] commit new work on block 332 with 0 txs & 0 uncles. Took 426.311µs +I0911 11:28:45.201000 12571 worker.go:540] commit new work on block 333 with 0 txs & 0 uncles. Took 2.12466ms +I0911 11:28:45.201109 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #327 +I0911 11:28:45.201859 12571 worker.go:322] 🔨 Mined block (#332 / be04ac34). Wait 5 blocks for confirmation +I0911 11:28:45.202370 12571 worker.go:540] commit new work on block 333 with 0 txs & 0 uncles. Took 438.526µs +I0911 11:28:48.880997 12571 worker.go:540] commit new work on block 334 with 0 txs & 0 uncles. Took 1.991122ms +I0911 11:28:48.881107 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #328 +I0911 11:28:48.881862 12571 worker.go:322] 🔨 Mined block (#333 / f00db4c7). Wait 5 blocks for confirmation +I0911 11:28:48.882384 12571 worker.go:540] commit new work on block 334 with 0 txs & 0 uncles. Took 449.33µs +I0911 11:28:49.485002 12571 worker.go:540] commit new work on block 335 with 0 txs & 0 uncles. Took 2.938354ms +I0911 11:28:49.485109 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #329 +I0911 11:28:49.485906 12571 worker.go:322] 🔨 Mined block (#334 / 197184ca). Wait 5 blocks for confirmation +I0911 11:28:49.486486 12571 worker.go:540] commit new work on block 335 with 0 txs & 0 uncles. Took 493.513µs +I0911 11:28:53.172992 12571 worker.go:540] commit new work on block 336 with 0 txs & 0 uncles. Took 1.997348ms +I0911 11:28:53.173105 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #330 +I0911 11:28:53.173645 12571 worker.go:322] 🔨 Mined block (#335 / 393f397f). Wait 5 blocks for confirmation +I0911 11:28:53.174117 12571 worker.go:540] commit new work on block 336 with 0 txs & 0 uncles. Took 405.756µs +I0911 11:28:56.843627 12571 worker.go:540] commit new work on block 337 with 0 txs & 0 uncles. Took 492.018µs +I0911 11:28:56.843734 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #331 +I0911 11:28:56.844261 12571 worker.go:322] 🔨 Mined block (#336 / 33bb7846). Wait 5 blocks for confirmation +I0911 11:28:56.844750 12571 worker.go:540] commit new work on block 337 with 0 txs & 0 uncles. Took 394.56µs +I0911 11:28:57.445321 12571 worker.go:322] 🔨 Mined stale block (#336 / 96936865). +I0911 11:28:57.448992 12571 worker.go:540] commit new work on block 337 with 0 txs & 0 uncles. Took 3.58407ms +I0911 11:28:58.566252 12571 worker.go:540] commit new work on block 338 with 0 txs & 0 uncles. Took 2.096751ms +I0911 11:28:58.566363 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #332 +I0911 11:28:58.567141 12571 worker.go:322] 🔨 Mined block (#337 / 01a39a29). Wait 5 blocks for confirmation +I0911 11:28:58.567683 12571 worker.go:540] commit new work on block 338 with 0 txs & 0 uncles. Took 467.347µs +I0911 11:29:01.220994 12571 worker.go:540] commit new work on block 339 with 0 txs & 0 uncles. Took 1.551597ms +I0911 11:29:01.221102 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #333 +I0911 11:29:01.221676 12571 worker.go:322] 🔨 Mined block (#338 / 58886990). Wait 5 blocks for confirmation +I0911 11:29:01.225209 12571 worker.go:540] commit new work on block 339 with 0 txs & 0 uncles. Took 3.463592ms +I0911 11:29:04.388255 12571 worker.go:540] commit new work on block 340 with 0 txs & 0 uncles. Took 2.029603ms +I0911 11:29:04.388368 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #334 +I0911 11:29:04.389158 12571 worker.go:322] 🔨 Mined block (#339 / a84ddbe3). Wait 5 blocks for confirmation +I0911 11:29:04.389676 12571 worker.go:540] commit new work on block 340 with 0 txs & 0 uncles. Took 435.924µs +I0911 11:29:05.001010 12571 worker.go:540] commit new work on block 341 with 0 txs & 0 uncles. Took 3.126959ms +I0911 11:29:05.001117 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #335 +I0911 11:29:05.001673 12571 worker.go:322] 🔨 Mined block (#340 / 73f3e918). Wait 5 blocks for confirmation +I0911 11:29:05.002166 12571 worker.go:540] commit new work on block 341 with 0 txs & 0 uncles. Took 428.556µs +I0911 11:29:16.877124 12571 worker.go:540] commit new work on block 342 with 0 txs & 0 uncles. Took 2.062528ms +I0911 11:29:16.877239 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #336 +I0911 11:29:16.877808 12571 worker.go:322] 🔨 Mined block (#341 / 6520bec1). Wait 5 blocks for confirmation +I0911 11:29:16.878288 12571 worker.go:540] commit new work on block 342 with 0 txs & 0 uncles. Took 412.447µs +I0911 11:29:20.577517 12571 worker.go:540] commit new work on block 343 with 0 txs & 0 uncles. Took 525.87µs +I0911 11:29:20.577628 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #337 +I0911 11:29:20.578231 12571 worker.go:322] 🔨 Mined block (#342 / 0b5a18fb). Wait 5 blocks for confirmation +I0911 11:29:20.578687 12571 worker.go:540] commit new work on block 343 with 0 txs & 0 uncles. Took 390.187µs +I0911 11:29:22.725303 12571 worker.go:540] commit new work on block 344 with 0 txs & 0 uncles. Took 489.641µs +I0911 11:29:22.725461 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #338 +I0911 11:29:22.726053 12571 worker.go:322] 🔨 Mined block (#343 / c91d8e89). Wait 5 blocks for confirmation +I0911 11:29:22.726502 12571 worker.go:540] commit new work on block 344 with 0 txs & 0 uncles. Took 382.727µs +I0911 11:29:26.446057 12571 worker.go:540] commit new work on block 345 with 0 txs & 0 uncles. Took 537.145µs +I0911 11:29:26.446185 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #339 +I0911 11:29:26.446444 12571 worker.go:322] 🔨 Mined block (#344 / 758ff0d1). Wait 5 blocks for confirmation +I0911 11:29:26.447329 12571 worker.go:540] commit new work on block 345 with 0 txs & 0 uncles. Took 450.37µs +I0911 11:29:28.070071 12571 worker.go:540] commit new work on block 346 with 0 txs & 0 uncles. Took 602.489µs +I0911 11:29:28.070206 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #340 +I0911 11:29:28.070938 12571 worker.go:322] 🔨 Mined block (#345 / b47689c7). Wait 5 blocks for confirmation +I0911 11:29:28.071483 12571 worker.go:540] commit new work on block 346 with 0 txs & 0 uncles. Took 466.867µs +I0911 11:29:29.709031 12571 worker.go:540] commit new work on block 347 with 0 txs & 0 uncles. Took 5.69938ms +I0911 11:29:29.709145 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #341 +I0911 11:29:29.709983 12571 worker.go:322] 🔨 Mined block (#346 / 06d952f1). Wait 5 blocks for confirmation +I0911 11:29:29.710477 12571 worker.go:540] commit new work on block 347 with 0 txs & 0 uncles. Took 418.104µs +I0911 11:29:31.339689 12571 worker.go:540] commit new work on block 348 with 0 txs & 0 uncles. Took 3.676311ms +I0911 11:29:31.339803 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #342 +I0911 11:29:31.340464 12571 worker.go:322] 🔨 Mined block (#347 / 6ef1b322). Wait 5 blocks for confirmation +I0911 11:29:31.340985 12571 worker.go:540] commit new work on block 348 with 0 txs & 0 uncles. Took 451.551µs +I0911 11:29:33.985008 12571 worker.go:540] commit new work on block 349 with 0 txs & 0 uncles. Took 3.328253ms +I0911 11:29:33.985117 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #343 +I0911 11:29:33.985763 12571 worker.go:322] 🔨 Mined block (#348 / f73bb14f). Wait 5 blocks for confirmation +I0911 11:29:33.986228 12571 worker.go:540] commit new work on block 349 with 0 txs & 0 uncles. Took 396.528µs +I0911 11:29:35.616264 12571 worker.go:540] commit new work on block 350 with 0 txs & 0 uncles. Took 487.089µs +I0911 11:29:35.616376 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #344 +I0911 11:29:35.617163 12571 worker.go:322] 🔨 Mined block (#349 / 5c1b5ffd). Wait 5 blocks for confirmation +I0911 11:29:35.617989 12571 worker.go:540] commit new work on block 350 with 0 txs & 0 uncles. Took 738.104µs +I0911 11:29:36.232034 12571 worker.go:540] commit new work on block 351 with 0 txs & 0 uncles. Took 6.303838ms +I0911 11:29:36.232149 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #345 +I0911 11:29:36.233010 12571 worker.go:322] 🔨 Mined block (#350 / 29b42907). Wait 5 blocks for confirmation +I0911 11:29:36.233558 12571 worker.go:540] commit new work on block 351 with 0 txs & 0 uncles. Took 465.642µs +I0911 11:29:36.827963 12571 worker.go:540] commit new work on block 352 with 0 txs & 0 uncles. Took 507.1µs +I0911 11:29:36.828075 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #346 +I0911 11:29:36.849705 12571 worker.go:322] 🔨 Mined block (#351 / e816d6c1). Wait 5 blocks for confirmation +I0911 11:29:36.851580 12571 worker.go:540] commit new work on block 352 with 0 txs & 0 uncles. Took 1.735877ms +I0911 11:29:37.431320 12571 worker.go:322] 🔨 Mined stale block (#351 / 6b7dc0c5). +I0911 11:29:37.437041 12571 worker.go:540] commit new work on block 352 with 0 txs & 0 uncles. Took 5.624047ms +I0911 11:29:38.045007 12571 worker.go:540] commit new work on block 353 with 0 txs & 0 uncles. Took 5.030735ms +I0911 11:29:38.045178 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #347 +I0911 11:29:38.046080 12571 worker.go:322] 🔨 Mined block (#352 / c1e2c967). Wait 5 blocks for confirmation +I0911 11:29:38.046587 12571 worker.go:540] commit new work on block 353 with 0 txs & 0 uncles. Took 423.218µs +I0911 11:29:40.710992 12571 worker.go:540] commit new work on block 354 with 0 txs & 0 uncles. Took 3.127669ms +I0911 11:29:40.711105 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #348 +I0911 11:29:40.711946 12571 worker.go:322] 🔨 Mined block (#353 / bbd3df46). Wait 5 blocks for confirmation +I0911 11:29:40.712448 12571 worker.go:540] commit new work on block 354 with 0 txs & 0 uncles. Took 418.586µs +I0911 11:29:45.417025 12571 worker.go:540] commit new work on block 355 with 0 txs & 0 uncles. Took 3.964725ms +I0911 11:29:45.417139 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #349 +I0911 11:29:45.418032 12571 worker.go:322] 🔨 Mined block (#354 / 05e969b9). Wait 5 blocks for confirmation +I0911 11:29:45.418533 12571 worker.go:540] commit new work on block 355 with 0 txs & 0 uncles. Took 420.739µs +I0911 11:29:56.241025 12571 worker.go:540] commit new work on block 356 with 0 txs & 0 uncles. Took 4.955542ms +I0911 11:29:56.241146 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #350 +I0911 11:29:56.242013 12571 worker.go:322] 🔨 Mined block (#355 / ef020cc1). Wait 5 blocks for confirmation +I0911 11:29:56.242514 12571 worker.go:540] commit new work on block 356 with 0 txs & 0 uncles. Took 423.678µs +I0911 11:29:58.368457 12571 worker.go:540] commit new work on block 357 with 0 txs & 0 uncles. Took 482.986µs +I0911 11:29:58.368569 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #351 +I0911 11:29:58.369212 12571 worker.go:322] 🔨 Mined block (#356 / 6cfc8aea). Wait 5 blocks for confirmation +I0911 11:29:58.369681 12571 worker.go:540] commit new work on block 357 with 0 txs & 0 uncles. Took 400.283µs +I0911 11:30:00.557004 12571 worker.go:540] commit new work on block 358 with 0 txs & 0 uncles. Took 4.438654ms +I0911 11:30:00.557116 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #352 +I0911 11:30:00.557979 12571 worker.go:322] 🔨 Mined block (#357 / 50e65192). Wait 5 blocks for confirmation +I0911 11:30:00.558484 12571 worker.go:540] commit new work on block 358 with 0 txs & 0 uncles. Took 428.491µs +I0911 11:30:03.197009 12571 worker.go:540] commit new work on block 359 with 0 txs & 0 uncles. Took 5.67758ms +I0911 11:30:03.197120 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #353 +I0911 11:30:03.197990 12571 worker.go:322] 🔨 Mined block (#358 / 2da61c5a). Wait 5 blocks for confirmation +I0911 11:30:03.198517 12571 worker.go:540] commit new work on block 359 with 0 txs & 0 uncles. Took 450.898µs +I0911 11:30:10.967763 12571 worker.go:540] commit new work on block 360 with 0 txs & 0 uncles. Took 495.772µs +I0911 11:30:10.967880 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #354 +I0911 11:30:10.968474 12571 worker.go:322] 🔨 Mined block (#359 / b49c77ff). Wait 5 blocks for confirmation +I0911 11:30:10.968999 12571 worker.go:540] commit new work on block 360 with 0 txs & 0 uncles. Took 460.415µs +I0911 11:30:12.661354 12571 worker.go:540] commit new work on block 361 with 0 txs & 0 uncles. Took 487.667µs +I0911 11:30:12.661464 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #355 +I0911 11:30:12.662066 12571 worker.go:322] 🔨 Mined block (#360 / e02a1530). Wait 5 blocks for confirmation +I0911 11:30:12.662536 12571 worker.go:540] commit new work on block 361 with 0 txs & 0 uncles. Took 403.558µs +I0911 11:30:15.383136 12571 worker.go:540] commit new work on block 362 with 0 txs & 0 uncles. Took 487.087µs +I0911 11:30:15.383252 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #356 +I0911 11:30:15.383862 12571 worker.go:322] 🔨 Mined block (#361 / 03331a80). Wait 5 blocks for confirmation +I0911 11:30:15.384326 12571 worker.go:540] commit new work on block 362 with 0 txs & 0 uncles. Took 395.896µs +I0911 11:30:20.097004 12571 worker.go:540] commit new work on block 363 with 0 txs & 0 uncles. Took 2.412937ms +I0911 11:30:20.097119 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #357 +I0911 11:30:20.097742 12571 worker.go:322] 🔨 Mined block (#362 / d7c63549). Wait 5 blocks for confirmation +I0911 11:30:20.098200 12571 worker.go:540] commit new work on block 363 with 0 txs & 0 uncles. Took 391.817µs +I0911 11:30:22.758251 12571 worker.go:540] commit new work on block 364 with 0 txs & 0 uncles. Took 741.344µs +I0911 11:30:22.758384 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #358 +I0911 11:30:22.758971 12571 worker.go:322] 🔨 Mined block (#363 / 4807ed4a). Wait 5 blocks for confirmation +I0911 11:30:22.759500 12571 worker.go:540] commit new work on block 364 with 0 txs & 0 uncles. Took 454.534µs +I0911 11:30:23.870016 12571 worker.go:540] commit new work on block 365 with 0 txs & 0 uncles. Took 1.99953ms +I0911 11:30:23.870124 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #359 +I0911 11:30:23.870862 12571 worker.go:322] 🔨 Mined block (#364 / f9f459a2). Wait 5 blocks for confirmation +I0911 11:30:23.871354 12571 worker.go:540] commit new work on block 365 with 0 txs & 0 uncles. Took 416.006µs +I0911 11:30:31.651238 12571 worker.go:540] commit new work on block 366 with 0 txs & 0 uncles. Took 2.09633ms +I0911 11:30:31.651352 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #360 +I0911 11:30:31.652257 12571 worker.go:322] 🔨 Mined block (#365 / a04cf32f). Wait 5 blocks for confirmation +I0911 11:30:31.652830 12571 worker.go:540] commit new work on block 366 with 0 txs & 0 uncles. Took 487.443µs +I0911 11:30:40.942002 12571 worker.go:540] commit new work on block 367 with 0 txs & 0 uncles. Took 2.029588ms +I0911 11:30:40.942120 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #361 +I0911 11:30:40.942931 12571 worker.go:322] 🔨 Mined block (#366 / be31082e). Wait 5 blocks for confirmation +I0911 11:30:40.943503 12571 worker.go:540] commit new work on block 367 with 0 txs & 0 uncles. Took 486.333µs +I0911 11:30:45.649791 12571 worker.go:540] commit new work on block 368 with 0 txs & 0 uncles. Took 2.094482ms +I0911 11:30:45.649902 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #362 +I0911 11:30:45.650678 12571 worker.go:322] 🔨 Mined block (#367 / aab96c86). Wait 5 blocks for confirmation +I0911 11:30:45.651176 12571 worker.go:540] commit new work on block 368 with 0 txs & 0 uncles. Took 421.584µs +I0911 11:30:49.852793 12571 worker.go:540] commit new work on block 369 with 0 txs & 0 uncles. Took 2.168361ms +I0911 11:30:49.852916 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #363 +I0911 11:30:49.853725 12571 worker.go:322] 🔨 Mined block (#368 / b915fead). Wait 5 blocks for confirmation +I0911 11:30:49.854231 12571 worker.go:540] commit new work on block 369 with 0 txs & 0 uncles. Took 430.851µs +I0911 11:30:54.031591 12571 worker.go:540] commit new work on block 370 with 0 txs & 0 uncles. Took 2.158566ms +I0911 11:30:54.031705 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #364 +I0911 11:30:54.032444 12571 worker.go:322] 🔨 Mined block (#369 / aa9c4b61). Wait 5 blocks for confirmation +I0911 11:30:54.032981 12571 worker.go:540] commit new work on block 370 with 0 txs & 0 uncles. Took 462.2µs +I0911 11:31:12.581015 12571 worker.go:540] commit new work on block 371 with 0 txs & 0 uncles. Took 4.575408ms +I0911 11:31:12.581128 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #365 +I0911 11:31:12.581976 12571 worker.go:322] 🔨 Mined block (#370 / 8fc27e5f). Wait 5 blocks for confirmation +I0911 11:31:12.582483 12571 worker.go:540] commit new work on block 371 with 0 txs & 0 uncles. Took 431.44µs +I0911 11:31:21.353021 12571 worker.go:540] commit new work on block 372 with 0 txs & 0 uncles. Took 6.478027ms +I0911 11:31:21.353132 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #366 +I0911 11:31:21.354053 12571 worker.go:322] 🔨 Mined block (#371 / 40a42212). Wait 5 blocks for confirmation +I0911 11:31:21.354571 12571 worker.go:540] commit new work on block 372 with 0 txs & 0 uncles. Took 438.195µs +I0911 11:31:23.997001 12571 worker.go:540] commit new work on block 373 with 0 txs & 0 uncles. Took 1.823213ms +I0911 11:31:23.997116 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #367 +I0911 11:31:23.997764 12571 worker.go:322] 🔨 Mined block (#372 / 07e218c9). Wait 5 blocks for confirmation +I0911 11:31:23.998238 12571 worker.go:540] commit new work on block 373 with 0 txs & 0 uncles. Took 404.314µs +I0911 11:31:33.825936 12571 worker.go:540] commit new work on block 374 with 0 txs & 0 uncles. Took 489.599µs +I0911 11:31:33.826047 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #368 +I0911 11:31:33.826810 12571 worker.go:322] 🔨 Mined block (#373 / 977dfedc). Wait 5 blocks for confirmation +I0911 11:31:33.827344 12571 worker.go:540] commit new work on block 374 with 0 txs & 0 uncles. Took 454.009µs +I0911 11:31:43.121047 12571 worker.go:540] commit new work on block 375 with 0 txs & 0 uncles. Took 6.542937ms +I0911 11:31:43.121164 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #369 +I0911 11:31:43.122078 12571 worker.go:322] 🔨 Mined block (#374 / a2df67ff). Wait 5 blocks for confirmation +I0911 11:31:43.122724 12571 worker.go:540] commit new work on block 375 with 0 txs & 0 uncles. Took 557.161µs +I0911 11:31:55.485138 12571 worker.go:322] 🔨 Mined block (#375 / ee7cd89b). Wait 5 blocks for confirmation +I0911 11:31:55.485891 12571 worker.go:540] commit new work on block 376 with 0 txs & 0 uncles. Took 660.07µs +I0911 11:31:55.485979 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #370 +I0911 11:31:55.486450 12571 worker.go:540] commit new work on block 376 with 0 txs & 0 uncles. Took 327.369µs +I0911 11:31:57.630269 12571 worker.go:540] commit new work on block 377 with 0 txs & 0 uncles. Took 2.538923ms +I0911 11:31:57.630382 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #371 +I0911 11:31:57.630968 12571 worker.go:322] 🔨 Mined block (#376 / 73e769e6). Wait 5 blocks for confirmation +I0911 11:31:57.631428 12571 worker.go:540] commit new work on block 377 with 0 txs & 0 uncles. Took 394.62µs +I0911 11:32:02.884438 12571 worker.go:540] commit new work on block 378 with 0 txs & 0 uncles. Took 2.044776ms +I0911 11:32:02.884559 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #372 +I0911 11:32:02.885345 12571 worker.go:322] 🔨 Mined block (#377 / b13bbeb0). Wait 5 blocks for confirmation +I0911 11:32:02.885833 12571 worker.go:540] commit new work on block 378 with 0 txs & 0 uncles. Took 409.282µs +I0911 11:32:03.892996 12571 worker.go:540] commit new work on block 379 with 0 txs & 0 uncles. Took 1.9363ms +I0911 11:32:03.893106 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #373 +I0911 11:32:03.893659 12571 worker.go:322] 🔨 Mined block (#378 / 01df0121). Wait 5 blocks for confirmation +I0911 11:32:03.894139 12571 worker.go:540] commit new work on block 379 with 0 txs & 0 uncles. Took 414.909µs +I0911 17:06:43.672251 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.465341ms. #379 [bfa30d39 / bfa30d39] +I0911 17:06:43.673385 12571 worker.go:540] commit new work on block 380 with 0 txs & 0 uncles. Took 580.143µs +I0911 17:06:43.673494 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #374 +I0911 17:47:27.517875 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.879782ms. #380 [f932dded / f932dded] +I0911 17:47:27.518883 12571 worker.go:540] commit new work on block 381 with 0 txs & 0 uncles. Took 480.739µs +I0911 17:47:27.518979 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #375 +I0911 17:47:39.580296 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.510456ms. #381 [54bf6831 / 54bf6831] +I0911 17:47:39.581355 12571 worker.go:540] commit new work on block 382 with 0 txs & 0 uncles. Took 494.431µs +I0911 17:47:39.581455 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #376 +I0911 17:47:43.708476 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.132183ms. #382 [024805e4 / 024805e4] +I0911 17:47:43.709269 12571 worker.go:540] commit new work on block 383 with 0 txs & 0 uncles. Took 502.553µs +I0911 17:47:43.709372 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #377 +I0911 17:47:50.921677 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.891591ms. #383 [7a6727ba / 7a6727ba] +I0911 17:47:50.922700 12571 worker.go:540] commit new work on block 384 with 0 txs & 0 uncles. Took 538.717µs +I0911 17:47:50.922799 12571 worker.go:420] 🔨 🔗 Mined 5 blocks back: block #378 +I0911 17:47:53.988990 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.194217ms. #384 [85cee99d / 85cee99d] +I0911 17:47:55.016919 12571 downloader.go:278] Block synchronisation started +I0911 17:47:55.017107 12571 miner.go:75] Mining operation aborted due to sync operation +I0911 17:47:55.404930 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.464196ms. #384 [85cee99d / 85cee99d] +I0911 17:47:55.468981 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.044827ms. #385 [27980419 / 27980419] +I0911 17:47:55.552966 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.294003ms. #385 [063ee87a / 063ee87a] +I0911 17:48:00.418375 12571 chain_manager.go:661] imported 2 block(s) (0 queued 0 ignored) including 0 txs in 20.910922ms. #385 [27980419 / 063ee87a] +I0911 17:48:04.432503 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.140712ms. #386 [bf83991b / bf83991b] +I0911 17:48:04.813907 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.126834ms. #387 [cdaa4998 / cdaa4998] +I0911 17:48:07.399285 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 6.306774ms. #388 [bc154ee8 / bc154ee8] +I0911 17:48:10.411743 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.076838ms. #388 [bc154ee8 / bc154ee8] +I0911 17:48:13.557491 12571 miner.go:119] Starting mining operation (CPU=0 TOT=2) +I0911 17:48:13.559290 12571 worker.go:540] commit new work on block 389 with 0 txs & 1 uncles. Took 1.353704ms +I0911 17:48:13.579107 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 21.658373ms. #389 [e11f1a76 / e11f1a76] +I0911 17:48:13.591479 12571 worker.go:540] commit new work on block 390 with 0 txs & 1 uncles. Took 1.031159ms +I0911 17:48:13.613209 12571 chain_manager.go:661] imported 0 block(s) (0 queued 2 ignored) including 0 txs in 33.974965ms. #385 [85cee99d / 27980419] +I0911 17:48:13.626921 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.523153ms. #390 [4d998d00 / 4d998d00] +I0911 17:48:13.628062 12571 worker.go:540] commit new work on block 391 with 0 txs & 1 uncles. Took 669.447µs +I0911 17:48:19.249900 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.470282ms. #391 [bf31c72e / bf31c72e] +I0911 17:48:19.250933 12571 worker.go:540] commit new work on block 392 with 0 txs & 0 uncles. Took 511.559µs +I0911 17:48:25.936196 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.411767ms. #392 [3ed936a8 / 3ed936a8] +I0911 17:48:25.937135 12571 worker.go:540] commit new work on block 393 with 0 txs & 0 uncles. Took 466.652µs +I0911 17:48:26.448962 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.266532ms. #393 [df0abefe / df0abefe] +I0911 17:48:27.992991 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.240424ms. #393 [df0abefe / df0abefe] +I0911 17:48:30.405804 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.32429ms. #393 [df0abefe / df0abefe] +I0911 17:48:30.407152 12571 worker.go:540] commit new work on block 394 with 0 txs & 0 uncles. Took 508.117µs +I0911 17:48:31.080188 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.410593ms. #394 [9a8846dc / 9a8846dc] +I0911 17:48:31.081134 12571 worker.go:540] commit new work on block 395 with 0 txs & 0 uncles. Took 466.665µs +I0911 17:48:34.677758 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 6.326292ms. #395 [6f057309 / 6f057309] +I0911 17:48:35.409912 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.453709ms. #395 [6f057309 / 6f057309] +I0911 17:48:35.410701 12571 worker.go:540] commit new work on block 396 with 0 txs & 0 uncles. Took 585.777µs +I0911 17:48:39.365044 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 28.244754ms. #396 [73acf9d8 / 73acf9d8] +I0911 17:48:39.366466 12571 worker.go:540] commit new work on block 397 with 0 txs & 0 uncles. Took 629.946µs +I0911 17:48:40.892994 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.743714ms. #397 [0ee8f055 / 0ee8f055] +I0911 17:48:43.556824 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.908588ms. #397 [0ee8f055 / 0ee8f055] +I0911 17:48:43.557542 12571 worker.go:540] commit new work on block 398 with 0 txs & 0 uncles. Took 507.521µs +I0911 17:48:43.688992 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.648151ms. #398 [05cace40 / 05cace40] +I0911 17:48:45.405831 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.384118ms. #398 [05cace40 / 05cace40] +I0911 17:48:45.406574 12571 worker.go:540] commit new work on block 399 with 0 txs & 0 uncles. Took 495.947µs +I0911 17:48:52.620798 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 7.710868ms. #398 [05cace40 / 05cace40] +I0911 17:49:01.464926 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.145436ms. #399 [aa57fa62 / aa57fa62] +I0911 17:49:01.465905 12571 worker.go:540] commit new work on block 400 with 0 txs & 0 uncles. Took 474.953µs +I0911 17:49:13.796338 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.564693ms. #400 [e75712a7 / e75712a7] +I0911 17:49:13.797473 12571 worker.go:540] commit new work on block 401 with 0 txs & 0 uncles. Took 575.328µs +I0911 17:49:24.595945 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.117403ms. #401 [95014fcf / 95014fcf] +I0911 17:49:24.596811 12571 worker.go:540] commit new work on block 402 with 0 txs & 0 uncles. Took 564.881µs +I0911 17:49:26.176990 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.643907ms. #402 [003b5e4b / 003b5e4b] +I0911 17:49:28.005847 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.360205ms. #402 [003b5e4b / 003b5e4b] +I0911 17:49:28.006545 12571 worker.go:540] commit new work on block 403 with 0 txs & 0 uncles. Took 484.003µs +I0911 17:49:30.820230 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.438468ms. #403 [c341c7cc / c341c7cc] +I0911 17:49:30.821234 12571 worker.go:540] commit new work on block 404 with 0 txs & 0 uncles. Took 534.308µs +I0911 17:49:32.905764 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 10.703513ms. #404 [2be95e16 / 2be95e16] +I0911 17:49:34.525105 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.731522ms. #404 [2be95e16 / 2be95e16] +I0911 17:49:34.525988 12571 worker.go:540] commit new work on block 405 with 0 txs & 0 uncles. Took 612.552µs +I0911 17:49:34.576643 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 6.037196ms. #405 [0d823d1f / 0d823d1f] +I0911 17:49:35.408998 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.518938ms. #405 [0d823d1f / 0d823d1f] +I0911 17:49:40.405926 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.465422ms. #405 [0d823d1f / 0d823d1f] +I0911 17:49:40.406688 12571 worker.go:540] commit new work on block 406 with 0 txs & 0 uncles. Took 507.242µs +I0911 17:49:41.744711 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.919262ms. #406 [0962ea72 / 0962ea72] +I0911 17:49:41.749554 12571 worker.go:540] commit new work on block 407 with 0 txs & 0 uncles. Took 532.298µs +I0911 17:49:41.764314 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.128332ms. #407 [19234aaa / 19234aaa] +I0911 17:49:41.765282 12571 worker.go:540] commit new work on block 408 with 0 txs & 0 uncles. Took 469.153µs +I0911 17:49:43.592810 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.846832ms. #405 [0d823d1f / 0d823d1f] +I0911 17:49:53.037795 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.46122ms. #408 [f8f35326 / f8f35326] +I0911 17:49:53.038788 12571 worker.go:540] commit new work on block 409 with 0 txs & 0 uncles. Took 486.466µs +I0911 17:49:55.108990 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.951451ms. #409 [36407d8d / 36407d8d] +I0911 17:49:55.408978 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.514097ms. #409 [36407d8d / 36407d8d] +I0911 17:49:56.205827 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.497045ms. #409 [36407d8d / 36407d8d] +I0911 17:49:56.206603 12571 worker.go:540] commit new work on block 410 with 0 txs & 0 uncles. Took 531.437µs +I0911 17:49:56.244979 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.171457ms. #410 [5c96eddb / 5c96eddb] +I0911 17:50:00.405752 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.260058ms. #410 [5c96eddb / 5c96eddb] +I0911 17:50:00.406447 12571 worker.go:540] commit new work on block 411 with 0 txs & 0 uncles. Took 479.402µs +I0911 17:50:00.785773 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.990366ms. #411 [d978db83 / d978db83] +I0911 17:50:00.786802 12571 worker.go:540] commit new work on block 412 with 0 txs & 0 uncles. Took 521.769µs +I0911 17:50:05.264497 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 5.896903ms. #410 [5c96eddb / 5c96eddb] +I0911 17:50:05.442431 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 27.006438ms. #412 [860539f3 / 860539f3] +I0911 17:50:05.443395 12571 worker.go:540] commit new work on block 413 with 0 txs & 0 uncles. Took 473.586µs +I0911 17:50:09.064231 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.443937ms. #413 [b6499a12 / b6499a12] +I0911 17:50:09.065178 12571 worker.go:540] commit new work on block 414 with 0 txs & 0 uncles. Took 468.553µs +I0911 17:50:14.217936 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 15.866716ms. #414 [e93ed530 / e93ed530] +I0911 17:50:14.218930 12571 worker.go:540] commit new work on block 415 with 0 txs & 0 uncles. Took 494.413µs +I0911 17:50:15.764994 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.905458ms. #415 [3066b749 / 3066b749] +I0911 17:50:17.993844 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.638316ms. #415 [3066b749 / 3066b749] +I0911 17:50:17.994623 12571 worker.go:540] commit new work on block 416 with 0 txs & 0 uncles. Took 557.039µs +I0911 17:50:19.380104 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.329332ms. #416 [a3b7fb78 / a3b7fb78] +I0911 17:50:19.381185 12571 worker.go:540] commit new work on block 417 with 0 txs & 0 uncles. Took 560.061µs +I0911 17:50:19.901739 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.963032ms. #416 [d364ed13 / d364ed13] +I0911 17:50:25.584552 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 25.116619ms. #417 [22b2cfcd / 22b2cfcd] +I0911 17:50:25.588699 12571 worker.go:540] commit new work on block 418 with 0 txs & 1 uncles. Took 3.582569ms +I0911 17:50:28.125003 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 7.654925ms. #418 [08e10027 / 08e10027] +I0911 17:50:30.406174 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.717955ms. #418 [08e10027 / 08e10027] +I0911 17:50:30.407179 12571 worker.go:540] commit new work on block 419 with 0 txs & 1 uncles. Took 748.506µs +I0911 17:50:30.716992 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 7.618151ms. #419 [768f0916 / 768f0916] +I0911 17:50:35.410203 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.540491ms. #419 [768f0916 / 768f0916] +I0911 17:50:35.411032 12571 worker.go:540] commit new work on block 420 with 0 txs & 1 uncles. Took 642.461µs +I0911 17:50:37.935568 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.20467ms. #420 [1dbc2247 / 1dbc2247] +I0911 17:50:37.936501 12571 worker.go:540] commit new work on block 421 with 0 txs & 1 uncles. Took 717.714µs +I0911 17:50:43.100987 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.916889ms. #421 [ee3cbd1b / ee3cbd1b] +I0911 17:50:43.102322 12571 worker.go:540] commit new work on block 422 with 0 txs & 1 uncles. Took 775.839µs +I0911 17:50:49.276989 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.363825ms. #422 [fe513e4f / fe513e4f] +I0911 17:50:49.277757 12571 worker.go:540] commit new work on block 423 with 0 txs & 0 uncles. Took 541.274µs +I0911 17:50:55.449341 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.236164ms. #423 [287a22e1 / 287a22e1] +I0911 17:50:55.450195 12571 worker.go:540] commit new work on block 424 with 0 txs & 0 uncles. Took 565.628µs +I0911 17:51:03.133847 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.71375ms. #424 [b59de056 / b59de056] +I0911 17:51:03.134981 12571 worker.go:540] commit new work on block 425 with 0 txs & 0 uncles. Took 558.56µs +I0911 17:51:04.164957 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.480387ms. #425 [7bc4bbbc / 7bc4bbbc] +I0911 17:51:05.409013 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.53193ms. #425 [7bc4bbbc / 7bc4bbbc] +I0911 17:51:09.676216 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.988299ms. #425 [7bc4bbbc / 7bc4bbbc] +I0911 17:51:09.677040 12571 worker.go:540] commit new work on block 426 with 0 txs & 0 uncles. Took 613.588µs +I0911 17:51:15.997713 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.934209ms. #426 [0dd6771f / 0dd6771f] +I0911 17:51:15.998714 12571 worker.go:540] commit new work on block 427 with 0 txs & 0 uncles. Took 507.524µs +I0911 17:51:19.608378 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.560571ms. #427 [f5431771 / f5431771] +I0911 17:51:19.609439 12571 worker.go:540] commit new work on block 428 with 0 txs & 0 uncles. Took 539.461µs +I0911 17:51:24.748610 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.166575ms. #428 [3cff4684 / 3cff4684] +I0911 17:51:24.749531 12571 worker.go:540] commit new work on block 429 with 0 txs & 0 uncles. Took 572.035µs +I0911 17:51:28.375883 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.33693ms. #429 [0a04e9a3 / 0a04e9a3] +I0911 17:51:28.376620 12571 worker.go:540] commit new work on block 430 with 0 txs & 0 uncles. Took 523.166µs +I0911 17:51:29.435635 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 10.178866ms. #430 [51ba58ad / 51ba58ad] +I0911 17:51:29.962487 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 6.275033ms. #430 [757327eb / 757327eb] +I0911 17:51:30.414164 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 16.67175ms. #430 [51ba58ad / 757327eb] +I0911 17:51:35.415477 12571 chain_manager.go:661] imported 2 block(s) (0 queued 0 ignored) including 0 txs in 18.019883ms. #430 [51ba58ad / 757327eb] +I0911 17:51:35.416261 12571 worker.go:540] commit new work on block 431 with 0 txs & 0 uncles. Took 531.218µs +I0911 17:51:38.217682 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.88921ms. #431 [d016baf6 / d016baf6] +I0911 17:51:38.218852 12571 worker.go:540] commit new work on block 432 with 0 txs & 1 uncles. Took 735.641µs +I0911 17:51:39.241627 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 10.964703ms. #432 [651ab9d4 / 651ab9d4] +I0911 17:51:40.408916 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.434158ms. #432 [651ab9d4 / 651ab9d4] +I0911 17:51:41.518088 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.501732ms. #432 [651ab9d4 / 651ab9d4] +I0911 17:51:41.519035 12571 worker.go:540] commit new work on block 433 with 0 txs & 1 uncles. Took 726.836µs +I0911 17:51:41.868945 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.616453ms. #433 [6e9b4040 / 6e9b4040] +I0911 17:51:45.405730 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.248409ms. #433 [6e9b4040 / 6e9b4040] +I0911 17:51:45.406691 12571 worker.go:540] commit new work on block 434 with 0 txs & 1 uncles. Took 714.528µs +I0911 17:51:48.072165 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.39071ms. #434 [8f12d8f5 / 8f12d8f5] +I0911 17:51:48.081700 12571 worker.go:540] commit new work on block 435 with 0 txs & 1 uncles. Took 732.547µs +I0911 17:51:48.091171 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.090361ms. #435 [f7f8f01e / f7f8f01e] +I0911 17:51:48.113057 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.505666ms. #436 [086e5a26 / 086e5a26] +I0911 17:51:48.114028 12571 worker.go:540] commit new work on block 436 with 0 txs & 1 uncles. Took 12.356034ms +I0911 17:51:48.114732 12571 worker.go:540] commit new work on block 437 with 0 txs & 0 uncles. Took 539.929µs +I0911 17:51:49.128934 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.605891ms. #437 [9f6391a8 / 9f6391a8] +I0911 17:51:50.409001 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.266986ms. #437 [9f6391a8 / 9f6391a8] +I0911 17:51:50.464793 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.082872ms. #433 [6e9b4040 / 6e9b4040] +I0911 17:51:51.417998 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.043007ms. #437 [9f6391a8 / 9f6391a8] +I0911 17:51:51.418690 12571 worker.go:540] commit new work on block 438 with 0 txs & 0 uncles. Took 482.266µs +I0911 17:51:51.476971 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 7.399893ms. #438 [d6f29f7e / d6f29f7e] +I0911 17:51:55.409696 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.209776ms. #438 [d6f29f7e / d6f29f7e] +I0911 17:51:55.410521 12571 worker.go:540] commit new work on block 439 with 0 txs & 0 uncles. Took 544.157µs +I0911 17:51:55.824227 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.073364ms. #439 [baad98ad / baad98ad] +I0911 17:51:55.825017 12571 worker.go:540] commit new work on block 440 with 0 txs & 0 uncles. Took 580.725µs +I0911 17:52:00.425031 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.748919ms. #438 [d6f29f7e / d6f29f7e] +I0911 17:52:02.548449 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.732305ms. #440 [dbf28014 / dbf28014] +I0911 17:52:02.549501 12571 worker.go:540] commit new work on block 441 with 0 txs & 0 uncles. Took 573.229µs +I0911 17:52:06.693735 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.951666ms. #441 [25c63133 / 25c63133] +I0911 17:52:06.694706 12571 worker.go:540] commit new work on block 442 with 0 txs & 0 uncles. Took 527.484µs +I0911 17:52:12.865774 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.657072ms. #442 [ff82f081 / ff82f081] +I0911 17:52:12.866590 12571 worker.go:540] commit new work on block 443 with 0 txs & 0 uncles. Took 532.476µs +I0911 17:52:19.554026 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.971401ms. #443 [d4aa82e4 / d4aa82e4] +I0911 17:52:19.555172 12571 worker.go:540] commit new work on block 444 with 0 txs & 0 uncles. Took 564.697µs +I0911 17:52:20.593653 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.155432ms. #444 [05279ca5 / 05279ca5] +I0911 17:52:25.409778 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.33519ms. #444 [05279ca5 / 05279ca5] +I0911 17:52:25.410515 12571 worker.go:540] commit new work on block 445 with 0 txs & 0 uncles. Took 493.831µs +I0911 17:52:28.376845 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.060771ms. #445 [dcefba7f / dcefba7f] +I0911 17:52:28.378323 12571 worker.go:540] commit new work on block 446 with 0 txs & 0 uncles. Took 533.641µs +I0911 17:52:28.396415 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.237111ms. #446 [c220b1e1 / c220b1e1] +I0911 17:52:28.397471 12571 worker.go:540] commit new work on block 447 with 0 txs & 0 uncles. Took 521.031µs +I0911 17:52:29.424983 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 10.696716ms. #447 [791f0c69 / 791f0c69] +I0911 17:52:30.408941 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.492089ms. #447 [791f0c69 / 791f0c69] +I0911 17:52:31.808816 12571 chain_manager.go:661] imported 0 block(s) (0 queued 2 ignored) including 0 txs in 17.362338ms. #445 [05279ca5 / dcefba7f] +I0911 17:52:33.120092 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.656843ms. #447 [791f0c69 / 791f0c69] +I0911 17:52:33.120943 12571 worker.go:540] commit new work on block 448 with 0 txs & 0 uncles. Took 643.86µs +I0911 17:52:33.273806 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 16.015489ms. #448 [76fa3e38 / 76fa3e38] +I0911 17:52:33.274806 12571 worker.go:540] commit new work on block 449 with 0 txs & 0 uncles. Took 520.317µs +I0911 17:52:33.611262 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 10.093787ms. #449 [97f32eff / 97f32eff] +I0911 17:52:35.409944 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.491382ms. #449 [97f32eff / 97f32eff] +I0911 17:52:35.410812 12571 worker.go:540] commit new work on block 450 with 0 txs & 0 uncles. Took 642.421µs +I0911 17:52:35.684971 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.545713ms. #450 [e6a75df6 / e6a75df6] +I0911 17:52:40.409778 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.281447ms. #450 [e6a75df6 / e6a75df6] +I0911 17:52:40.410480 12571 worker.go:540] commit new work on block 451 with 0 txs & 0 uncles. Took 487.407µs +I0911 17:52:42.269750 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 12.860354ms. #448 [76fa3e38 / 76fa3e38] +I0911 17:52:42.298050 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 28.094217ms. #451 [699d96e6 / 699d96e6] +I0911 17:52:42.299203 12571 worker.go:540] commit new work on block 452 with 0 txs & 0 uncles. Took 599.176µs +I0911 17:52:44.457978 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.823553ms. #452 [1eaa2388 / 1eaa2388] +I0911 17:52:44.459220 12571 worker.go:540] commit new work on block 453 with 0 txs & 0 uncles. Took 658.295µs +I0911 17:52:44.988109 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 19.336848ms. #452 [cf9e0f19 / cf9e0f19] +I0911 17:52:47.576985 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.092432ms. #453 [3b76c783 / 3b76c783] +I0911 17:52:50.409848 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.394607ms. #453 [3b76c783 / 3b76c783] +I0911 17:52:50.410768 12571 worker.go:540] commit new work on block 454 with 0 txs & 1 uncles. Took 706.718µs +I0911 17:52:56.859844 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.476018ms. #454 [386f0a67 / 386f0a67] +I0911 17:52:56.879130 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.918942ms. #455 [9b12b966 / 9b12b966] +I0911 17:52:56.880126 12571 worker.go:540] commit new work on block 455 with 0 txs & 1 uncles. Took 9.799485ms +I0911 17:52:56.881082 12571 worker.go:540] commit new work on block 456 with 0 txs & 1 uncles. Took 819.122µs +I0911 17:52:59.955867 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 6.489273ms. #456 [e73bad7f / e73bad7f] +I0911 17:53:00.405882 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.388558ms. #456 [e73bad7f / e73bad7f] +I0911 17:53:00.406798 12571 worker.go:540] commit new work on block 457 with 0 txs & 1 uncles. Took 712.918µs +I0911 17:53:04.096042 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.262175ms. #457 [587e1504 / 587e1504] +I0911 17:53:04.097295 12571 worker.go:540] commit new work on block 458 with 0 txs & 1 uncles. Took 813.407µs +I0911 17:53:09.751780 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.410251ms. #458 [f011e19e / f011e19e] +I0911 17:53:09.752960 12571 worker.go:540] commit new work on block 459 with 0 txs & 0 uncles. Took 617.406µs +I0911 17:53:11.817877 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.809121ms. #459 [2e95ba03 / 2e95ba03] +I0911 17:53:15.409987 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.535708ms. #459 [2e95ba03 / 2e95ba03] +I0911 17:53:15.410694 12571 worker.go:540] commit new work on block 460 with 0 txs & 0 uncles. Took 501.557µs +I0911 17:53:15.453838 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.722162ms. #460 [29713acb / 29713acb] +I0911 17:53:15.454582 12571 worker.go:540] commit new work on block 461 with 0 txs & 0 uncles. Took 529.284µs +I0911 17:53:15.465552 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 10.417753ms. #461 [d770d1f1 / d770d1f1] +I0911 17:53:17.018382 12571 chain_manager.go:661] imported 0 block(s) (0 queued 2 ignored) including 0 txs in 17.373806ms. #454 [3b76c783 / 386f0a67] +I0911 17:53:17.993989 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.810918ms. #461 [d770d1f1 / d770d1f1] +I0911 17:53:17.994819 12571 worker.go:540] commit new work on block 462 with 0 txs & 0 uncles. Took 557.122µs +I0911 17:53:20.625714 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.918003ms. #462 [9eb261a1 / 9eb261a1] +I0911 17:53:20.626712 12571 worker.go:540] commit new work on block 463 with 0 txs & 0 uncles. Took 515.217µs +I0911 17:53:21.152945 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.649937ms. #463 [7be96b0c / 7be96b0c] +I0911 17:53:23.681847 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.472402ms. #463 [7be96b0c / 7be96b0c] +I0911 17:53:23.682534 12571 worker.go:540] commit new work on block 464 with 0 txs & 0 uncles. Took 495.542µs +I0911 17:53:23.732992 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.128925ms. #464 [fdd8de47 / fdd8de47] +I0911 17:53:25.409770 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.314257ms. #464 [fdd8de47 / fdd8de47] +I0911 17:53:25.410520 12571 worker.go:540] commit new work on block 465 with 0 txs & 0 uncles. Took 504.027µs +I0911 17:53:25.816977 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.303973ms. #465 [e97d745e / e97d745e] +I0911 17:53:30.405740 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.283626ms. #465 [e97d745e / e97d745e] +I0911 17:53:30.406461 12571 worker.go:540] commit new work on block 466 with 0 txs & 0 uncles. Took 502.846µs +I0911 17:53:32.835549 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.376565ms. #466 [76ce401d / 76ce401d] +I0911 17:53:32.836561 12571 worker.go:540] commit new work on block 467 with 0 txs & 0 uncles. Took 521.233µs +I0911 17:53:40.253786 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.99695ms. #467 [7037bb7a / 7037bb7a] +I0911 17:53:40.254845 12571 worker.go:540] commit new work on block 468 with 0 txs & 0 uncles. Took 533.543µs +I0911 17:53:41.841070 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 5.993929ms. #464 [fdd8de47 / fdd8de47] +I0911 17:53:46.912769 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.413698ms. #468 [d692a885 / d692a885] +I0911 17:53:46.913849 12571 worker.go:540] commit new work on block 469 with 0 txs & 0 uncles. Took 532.64µs +I0911 17:53:54.088042 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.50723ms. #469 [64f14bd4 / 64f14bd4] +I0911 17:53:54.089066 12571 worker.go:540] commit new work on block 470 with 0 txs & 0 uncles. Took 535.859µs +I0911 17:53:54.626938 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.503126ms. #469 [0575182f / 0575182f] +I0911 17:53:58.231052 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.151342ms. #470 [ea2f24e1 / ea2f24e1] +I0911 17:53:58.232004 12571 worker.go:540] commit new work on block 471 with 0 txs & 1 uncles. Took 733.733µs +I0911 17:54:02.883620 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.389976ms. #471 [acd61f3e / acd61f3e] +I0911 17:54:02.884672 12571 worker.go:540] commit new work on block 472 with 0 txs & 1 uncles. Took 753.811µs +I0911 17:55:37.177849 12571 chain_manager.go:661] imported 13 block(s) (0 queued 0 ignored) including 0 txs in 119.612889ms. #484 [cbc5100e / 3d608ff0] +I0911 17:55:37.178740 12571 worker.go:540] commit new work on block 485 with 0 txs & 0 uncles. Took 551.444µs +I0911 17:55:38.011107 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.21457ms. #485 [f7387676 / f7387676] +I0911 17:55:38.011802 12571 worker.go:540] commit new work on block 486 with 0 txs & 0 uncles. Took 505.536µs +I0911 17:55:38.022743 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.696561ms. #485 [f7387676 / f7387676] +I0911 17:55:40.325751 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.967676ms. #486 [d6335284 / d6335284] +I0911 17:55:40.326793 12571 worker.go:540] commit new work on block 487 with 0 txs & 0 uncles. Took 542.395µs +I0911 17:55:42.406892 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 6.273949ms. #487 [e1910b9f / e1910b9f] +I0911 17:55:45.405850 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.392099ms. #487 [e1910b9f / e1910b9f] +I0911 17:55:45.406618 12571 worker.go:540] commit new work on block 488 with 0 txs & 0 uncles. Took 512.482µs +I0911 17:55:46.040362 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.225503ms. #488 [604d4660 / 604d4660] +I0911 17:55:46.041489 12571 worker.go:540] commit new work on block 489 with 0 txs & 0 uncles. Took 561.733µs +I0911 17:55:49.644443 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.665309ms. #489 [15f5773c / 15f5773c] +I0911 17:55:49.645465 12571 worker.go:540] commit new work on block 490 with 0 txs & 0 uncles. Took 499.742µs +I0911 17:55:55.304369 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.537427ms. #490 [d9657c01 / d9657c01] +I0911 17:55:55.305427 12571 worker.go:540] commit new work on block 491 with 0 txs & 0 uncles. Took 528.13µs +I0911 17:56:05.581705 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.922359ms. #491 [86df878e / 86df878e] +I0911 17:56:05.582641 12571 worker.go:540] commit new work on block 492 with 0 txs & 0 uncles. Took 463.503µs +I0911 17:56:11.753679 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.89319ms. #492 [e2be54ce / e2be54ce] +I0911 17:56:11.754611 12571 worker.go:540] commit new work on block 493 with 0 txs & 0 uncles. Took 462.754µs +I0911 17:56:16.908168 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.391654ms. #493 [4840d18d / 4840d18d] +I0911 17:56:16.909135 12571 worker.go:540] commit new work on block 494 with 0 txs & 0 uncles. Took 491.606µs +I0911 17:56:28.221703 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.51549ms. #494 [96ab21c2 / 96ab21c2] +I0911 17:56:28.222720 12571 worker.go:540] commit new work on block 495 with 0 txs & 0 uncles. Took 488.483µs +I0911 17:56:49.229748 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.100447ms. #495 [67b8f289 / 67b8f289] +I0911 17:56:49.230762 12571 worker.go:540] commit new work on block 496 with 0 txs & 0 uncles. Took 509.459µs +I0911 17:56:53.841685 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.903606ms. #496 [b8c57c26 / b8c57c26] +I0911 17:56:53.842684 12571 worker.go:540] commit new work on block 497 with 0 txs & 0 uncles. Took 483.798µs +I0911 17:56:58.481331 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.512618ms. #497 [94133ad6 / 94133ad6] +I0911 17:56:58.482276 12571 worker.go:540] commit new work on block 498 with 0 txs & 0 uncles. Took 458.974µs +I0911 17:57:10.284249 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.469564ms. #498 [4e216d99 / 4e216d99] +I0911 17:57:10.285202 12571 worker.go:540] commit new work on block 499 with 0 txs & 0 uncles. Took 476.889µs +I0911 17:57:19.531796 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.425402ms. #499 [c12594ce / c12594ce] +I0911 17:57:19.532809 12571 worker.go:540] commit new work on block 500 with 0 txs & 0 uncles. Took 551.721µs +I0911 17:57:20.584995 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.275277ms. #500 [b7112f3d / b7112f3d] +I0911 17:57:25.408869 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.259931ms. #500 [b7112f3d / b7112f3d] +I0911 17:57:25.411048 12571 worker.go:540] commit new work on block 501 with 0 txs & 0 uncles. Took 1.62467ms +I0911 17:57:26.744062 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.313128ms. #501 [810a3e88 / 810a3e88] +I0911 17:57:26.745217 12571 worker.go:540] commit new work on block 502 with 0 txs & 0 uncles. Took 663.683µs +I0911 17:57:31.885854 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.932667ms. #502 [cf7fa5b1 / cf7fa5b1] +I0911 17:57:31.886856 12571 worker.go:540] commit new work on block 503 with 0 txs & 0 uncles. Took 538.279µs +I0911 17:57:32.910660 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.436623ms. #503 [0386a19a / 0386a19a] +I0911 17:57:35.409770 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.317776ms. #503 [0386a19a / 0386a19a] +I0911 17:57:35.410486 12571 worker.go:540] commit new work on block 504 with 0 txs & 0 uncles. Took 501.042µs +I0911 17:57:35.517740 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.957807ms. #504 [406df944 / 406df944] +I0911 17:57:35.518701 12571 worker.go:540] commit new work on block 505 with 0 txs & 0 uncles. Took 519.451µs +I0911 17:57:41.713859 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.0106ms. #505 [6cb6ddc4 / 6cb6ddc4] +I0911 17:57:41.714841 12571 worker.go:540] commit new work on block 506 with 0 txs & 0 uncles. Took 523.267µs +I0911 17:57:42.756980 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.149919ms. #506 [d248baae / d248baae] +I0911 17:57:45.405951 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.476386ms. #506 [d248baae / d248baae] +I0911 17:57:45.406710 12571 worker.go:540] commit new work on block 507 with 0 txs & 0 uncles. Took 502.507µs +I0911 17:57:46.900134 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.34701ms. #507 [9b2fafa3 / 9b2fafa3] +I0911 17:57:46.901135 12571 worker.go:540] commit new work on block 508 with 0 txs & 0 uncles. Took 565.608µs +I0911 17:57:58.192582 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.532531ms. #508 [3075ae40 / 3075ae40] +I0911 17:57:58.193663 12571 worker.go:540] commit new work on block 509 with 0 txs & 0 uncles. Took 562.082µs +I0911 17:58:00.285822 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.654934ms. #509 [2a35ef74 / 2a35ef74] +I0911 17:58:00.286861 12571 worker.go:540] commit new work on block 510 with 0 txs & 0 uncles. Took 533.456µs +I0911 17:58:04.389740 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.95845ms. #510 [3212c88c / 3212c88c] +I0911 17:58:04.390708 12571 worker.go:540] commit new work on block 511 with 0 txs & 0 uncles. Took 534.232µs +I0911 17:58:04.921271 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.227163ms. #511 [7fa1255f / 7fa1255f] +I0911 17:58:05.409023 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.576645ms. #511 [7fa1255f / 7fa1255f] +I0911 17:58:07.929823 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.168128ms. #511 [7fa1255f / 7fa1255f] +I0911 17:58:07.930560 12571 worker.go:540] commit new work on block 512 with 0 txs & 0 uncles. Took 517.429µs +I0911 17:58:08.024238 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.113977ms. #512 [6b9f82a0 / 6b9f82a0] +I0911 17:58:08.025061 12571 worker.go:540] commit new work on block 513 with 0 txs & 0 uncles. Took 602.749µs +I0911 17:58:10.632416 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.636866ms. #513 [0eb227b2 / 0eb227b2] +I0911 17:58:10.633434 12571 worker.go:540] commit new work on block 514 with 0 txs & 0 uncles. Took 563.729µs +I0911 17:58:16.996135 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.747208ms. #512 [6b9f82a0 / 6b9f82a0] +I0911 17:58:18.357825 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.043088ms. #514 [fc233d19 / fc233d19] +I0911 17:58:18.358809 12571 worker.go:540] commit new work on block 515 with 0 txs & 0 uncles. Took 535.574µs +I0911 17:58:18.892630 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.261459ms. #514 [1ba5c15a / 1ba5c15a] +I0911 17:58:24.564285 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.502949ms. #515 [29091399 / 29091399] +I0911 17:58:24.565511 12571 worker.go:540] commit new work on block 516 with 0 txs & 1 uncles. Took 753.998µs +I0911 17:58:33.797727 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.945764ms. #516 [6e86525f / 6e86525f] +I0911 17:58:33.798978 12571 worker.go:540] commit new work on block 517 with 0 txs & 1 uncles. Took 773.276µs +I0911 18:44:58.484290 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.713871ms. #517 [09ad680e / 09ad680e] +I0911 18:44:58.485693 12571 worker.go:540] commit new work on block 518 with 0 txs & 1 uncles. Took 816.958µs +I0911 18:45:35.081727 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 6.946856ms. #518 [f5002f09 / f5002f09] +I0911 18:45:35.082808 12571 worker.go:540] commit new work on block 519 with 0 txs & 1 uncles. Took 760.64µs +I0911 18:45:48.876073 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.300051ms. #519 [a788d263 / a788d263] +I0911 18:45:48.877331 12571 worker.go:540] commit new work on block 520 with 0 txs & 1 uncles. Took 764.527µs +I0911 18:45:50.413472 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 10.332213ms. #520 [bcd42ccf / bcd42ccf] +I0911 18:45:52.706445 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 9.913996ms. #519 [a788d263 / a788d263] +I0911 18:45:55.409890 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.443576ms. #520 [bcd42ccf / bcd42ccf] +I0911 18:45:55.410822 12571 worker.go:540] commit new work on block 521 with 0 txs & 0 uncles. Took 675.628µs +I0911 18:46:01.761824 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.451253ms. #521 [69872b1e / 69872b1e] +I0911 18:46:01.762880 12571 worker.go:540] commit new work on block 522 with 0 txs & 0 uncles. Took 535.006µs +I0911 18:46:05.235487 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.408442ms. #522 [bbca7f5d / bbca7f5d] +I0911 18:46:05.236471 12571 worker.go:540] commit new work on block 523 with 0 txs & 0 uncles. Took 528.258µs +I0911 18:46:05.740986 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.167964ms. #523 [d58c3956 / d58c3956] +I0911 18:46:10.408933 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.472377ms. #523 [d58c3956 / d58c3956] +I0911 18:46:10.800794 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.210346ms. #520 [bcd42ccf / bcd42ccf] +I0911 18:46:10.960805 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.790271ms. #521 [69872b1e / 69872b1e] +I0911 18:46:12.344812 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.768811ms. #522 [bbca7f5d / bbca7f5d] +I0911 18:46:15.405927 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.467643ms. #523 [d58c3956 / d58c3956] +I0911 18:46:15.406642 12571 worker.go:540] commit new work on block 524 with 0 txs & 0 uncles. Took 502.827µs +I0911 18:46:21.152507 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.194904ms. #524 [641419c0 / 641419c0] +I0911 18:46:21.165607 12571 worker.go:540] commit new work on block 525 with 0 txs & 0 uncles. Took 525.432µs +I0911 18:46:21.217110 12571 chain_manager.go:661] imported 1 block(s) (0 queued 2 ignored) including 0 txs in 64.501412ms. #525 [d58c3956 / af246d3f] +I0911 18:46:21.225111 12571 worker.go:540] commit new work on block 526 with 0 txs & 0 uncles. Took 7.80041ms +I0911 18:46:21.231205 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 13.987606ms. #525 [af246d3f / af246d3f] +I0911 18:46:43.997081 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.304344ms. #526 [190d2e2e / 190d2e2e] +I0911 18:46:43.998155 12571 worker.go:540] commit new work on block 527 with 0 txs & 0 uncles. Took 539.111µs +I0911 18:46:45.016977 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 13.002541ms. #527 [1f63e58a / 1f63e58a] +I0911 18:46:45.406457 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.01008ms. #527 [1f63e58a / 1f63e58a] +I0911 18:46:48.125587 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 6.014277ms. #526 [190d2e2e / 190d2e2e] +I0911 18:46:50.407069 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.622727ms. #527 [1f63e58a / 1f63e58a] +I0911 18:46:50.407776 12571 worker.go:540] commit new work on block 528 with 0 txs & 0 uncles. Took 502.301µs +I0911 18:46:55.701687 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.388722ms. #528 [30c54d22 / 30c54d22] +I0911 18:46:55.702664 12571 worker.go:540] commit new work on block 529 with 0 txs & 0 uncles. Took 508.875µs +I0911 18:46:57.157926 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 5.935019ms. #527 [1f63e58a / 1f63e58a] +I0911 18:47:07.937871 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.092003ms. #529 [98faa61c / 98faa61c] +I0911 18:47:07.938911 12571 worker.go:540] commit new work on block 530 with 0 txs & 0 uncles. Took 548.201µs +I0911 18:47:09.476983 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.462463ms. #530 [4e5592db / 4e5592db] +I0911 18:47:10.416800 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 19.330243ms. #530 [4e5592db / 4e5592db] +I0911 18:47:10.860807 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.967707ms. #529 [98faa61c / 98faa61c] +I0911 18:47:15.405736 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.280042ms. #530 [4e5592db / 4e5592db] +I0911 18:47:15.406571 12571 worker.go:540] commit new work on block 531 with 0 txs & 0 uncles. Took 574.8µs +I0911 18:47:19.793679 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.365321ms. #531 [5d2f96c3 / 5d2f96c3] +I0911 18:47:19.794715 12571 worker.go:540] commit new work on block 532 with 0 txs & 0 uncles. Took 533.37µs +I0911 18:47:28.780702 12571 chain_manager.go:661] imported 0 block(s) (0 queued 2 ignored) including 0 txs in 16.454331ms. #531 [4e5592db / 5d2f96c3] +I0911 18:47:58.588484 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.316088ms. #532 [6057f288 / 6057f288] +I0911 18:47:58.589307 12571 worker.go:540] commit new work on block 533 with 0 txs & 0 uncles. Took 543.602µs +I0911 18:48:04.215687 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.518256ms. #533 [4c0efc1d / 4c0efc1d] +I0911 18:48:04.216825 12571 worker.go:540] commit new work on block 534 with 0 txs & 0 uncles. Took 570.507µs +I0911 18:48:24.583972 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.054201ms. #534 [c4136576 / c4136576] +I0911 18:48:24.584747 12571 worker.go:540] commit new work on block 535 with 0 txs & 0 uncles. Took 527.491µs +I0911 18:48:30.208105 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.535516ms. #535 [18fb48e2 / 18fb48e2] +I0911 18:48:30.209095 12571 worker.go:540] commit new work on block 536 with 0 txs & 0 uncles. Took 519.528µs +I0911 18:48:32.752987 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.712827ms. #536 [c1d1db92 / c1d1db92] +I0911 18:48:35.409015 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.571266ms. #536 [c1d1db92 / c1d1db92] +I0911 18:48:36.187027 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 6.125544ms. #535 [18fb48e2 / 18fb48e2] +I0911 18:48:40.409797 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.340676ms. #536 [c1d1db92 / c1d1db92] +I0911 18:48:40.410580 12571 worker.go:540] commit new work on block 537 with 0 txs & 0 uncles. Took 539.491µs +I0911 18:48:43.989684 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.85173ms. #537 [8edc1ee7 / 8edc1ee7] +I0911 18:48:43.993517 12571 worker.go:540] commit new work on block 538 with 0 txs & 0 uncles. Took 532.68µs +I0911 18:48:44.013733 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.105394ms. #538 [f72119c6 / f72119c6] +I0911 18:48:44.014735 12571 worker.go:540] commit new work on block 539 with 0 txs & 0 uncles. Took 514.713µs +I0911 18:48:51.158884 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 30.080328ms. #539 [3247801b / 3247801b] +I0911 18:48:51.168436 12571 worker.go:540] commit new work on block 540 with 0 txs & 0 uncles. Took 581.425µs +I0911 18:48:54.164997 12571 chain_manager.go:661] imported 0 block(s) (0 queued 2 ignored) including 0 txs in 17.522739ms. #537 [c1d1db92 / 8edc1ee7] +I0911 18:49:23.396072 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.298669ms. #540 [a0f190cb / a0f190cb] +I0911 18:49:23.397234 12571 worker.go:540] commit new work on block 541 with 0 txs & 0 uncles. Took 598.096µs +I0911 18:49:41.744118 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.343166ms. #541 [f0da66cc / f0da66cc] +I0911 18:49:41.745185 12571 worker.go:540] commit new work on block 542 with 0 txs & 0 uncles. Took 590.526µs +I0911 18:49:45.816979 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.400884ms. #542 [28c4f136 / 28c4f136] +I0911 18:49:48.132803 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.534329ms. #541 [f0da66cc / f0da66cc] +I0911 18:49:50.407640 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.188136ms. #542 [28c4f136 / 28c4f136] +I0911 18:49:50.408357 12571 worker.go:540] commit new work on block 543 with 0 txs & 0 uncles. Took 503.536µs +I0911 18:49:57.168792 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.759737ms. #542 [28c4f136 / 28c4f136] +I0911 19:54:10.821330 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.589976ms. #543 [09677668 / 09677668] +I0911 19:54:10.822230 12571 worker.go:540] commit new work on block 544 with 0 txs & 0 uncles. Took 519.825µs +I0911 19:56:08.889012 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.779115ms. #544 [72f659d9 / 72f659d9] +I0911 19:56:08.889864 12571 worker.go:540] commit new work on block 545 with 0 txs & 0 uncles. Took 435.397µs +I0911 20:11:31.112592 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.188623ms. #545 [e77ccaf4 / e77ccaf4] +I0911 20:11:31.113588 12571 worker.go:540] commit new work on block 546 with 0 txs & 0 uncles. Took 543.724µs +I0911 20:13:39.058447 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.350003ms. #546 [bad60628 / bad60628] +I0911 20:13:39.059343 12571 worker.go:540] commit new work on block 547 with 0 txs & 0 uncles. Took 531.296µs +I0911 20:21:34.402785 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.09091ms. #547 [7e9dd88a / 7e9dd88a] +I0911 20:21:34.403689 12571 worker.go:540] commit new work on block 548 with 0 txs & 0 uncles. Took 537.294µs +I0911 20:26:03.371251 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.39251ms. #548 [46ad74ec / 46ad74ec] +I0911 20:26:03.372243 12571 worker.go:540] commit new work on block 549 with 0 txs & 0 uncles. Took 621.704µs +I0911 20:39:45.821287 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.700157ms. #549 [c6b9b633 / c6b9b633] +I0911 20:39:45.822501 12571 worker.go:540] commit new work on block 550 with 0 txs & 0 uncles. Took 626.621µs +I0911 20:40:36.321966 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.63785ms. #550 [f2bb7a11 / f2bb7a11] +I0911 20:40:36.322879 12571 worker.go:540] commit new work on block 551 with 0 txs & 0 uncles. Took 531.989µs +I0911 20:57:23.887461 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.861879ms. #551 [a559ee68 / a559ee68] +I0911 20:57:23.889392 12571 worker.go:540] commit new work on block 552 with 0 txs & 0 uncles. Took 1.028049ms +I0911 21:03:35.303679 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.838407ms. #552 [b74a1da5 / b74a1da5] +I0911 21:03:35.304562 12571 worker.go:540] commit new work on block 553 with 0 txs & 0 uncles. Took 523.855µs +I0911 21:06:57.872320 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 6.968574ms. #553 [caa5e723 / caa5e723] +I0911 21:06:57.873239 12571 worker.go:540] commit new work on block 554 with 0 txs & 0 uncles. Took 457.904µs +I0911 21:10:50.296981 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.416499ms. #554 [b7620b87 / b7620b87] +I0911 21:10:50.298621 12571 worker.go:540] commit new work on block 555 with 0 txs & 0 uncles. Took 1.250624ms +I0911 21:20:02.588486 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.005526ms. #555 [519f6e45 / 519f6e45] +I0911 21:20:02.589397 12571 worker.go:540] commit new work on block 556 with 0 txs & 0 uncles. Took 413.087µs +I0911 21:39:04.222128 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.881819ms. #556 [1c5b6dcd / 1c5b6dcd] +I0911 21:39:04.223038 12571 worker.go:540] commit new work on block 557 with 0 txs & 0 uncles. Took 544.717µs +I0911 21:48:50.574845 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.34729ms. #557 [16a83a90 / 16a83a90] +I0911 21:48:50.575838 12571 worker.go:540] commit new work on block 558 with 0 txs & 0 uncles. Took 548.784µs +I0911 21:55:14.158303 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.966305ms. #558 [8bcace1b / 8bcace1b] +I0911 21:55:14.159178 12571 worker.go:540] commit new work on block 559 with 0 txs & 0 uncles. Took 516.043µs +I0911 21:58:00.922774 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.024681ms. #559 [883dc73a / 883dc73a] +I0911 21:58:00.923675 12571 worker.go:540] commit new work on block 560 with 0 txs & 0 uncles. Took 535.47µs +I0911 21:59:55.010278 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.497908ms. #560 [d2958930 / d2958930] +I0911 21:59:55.011601 12571 worker.go:540] commit new work on block 561 with 0 txs & 0 uncles. Took 745.734µs +I0911 22:03:56.935533 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.454648ms. #561 [81505682 / 81505682] +I0911 22:03:56.936564 12571 worker.go:540] commit new work on block 562 with 0 txs & 0 uncles. Took 580.24µs +I0911 22:06:38.180442 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.537393ms. #562 [0964307b / 0964307b] +I0911 22:06:38.181291 12571 worker.go:540] commit new work on block 563 with 0 txs & 0 uncles. Took 507.63µs +I0911 22:12:14.608381 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.581036ms. #563 [f9a1b14c / f9a1b14c] +I0911 22:12:14.609672 12571 worker.go:540] commit new work on block 564 with 0 txs & 0 uncles. Took 773.415µs +I0911 22:12:45.584895 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.851882ms. #564 [1c493d71 / 1c493d71] +I0911 22:12:45.585903 12571 worker.go:540] commit new work on block 565 with 0 txs & 0 uncles. Took 591.655µs +I0911 22:16:18.790979 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.57488ms. #565 [2da87cd5 / 2da87cd5] +I0911 22:16:18.791863 12571 worker.go:540] commit new work on block 566 with 0 txs & 0 uncles. Took 519.276µs +I0911 22:17:52.151766 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.845401ms. #566 [4ba7186f / 4ba7186f] +I0911 22:17:52.152774 12571 worker.go:540] commit new work on block 567 with 0 txs & 0 uncles. Took 544.846µs +I0911 22:26:01.821953 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.625014ms. #567 [b2d2c14b / b2d2c14b] +I0911 22:26:01.822873 12571 worker.go:540] commit new work on block 568 with 0 txs & 0 uncles. Took 538.804µs +I0911 22:30:52.377003 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.107653ms. #568 [44330ca9 / 44330ca9] +I0911 22:30:52.378786 12571 worker.go:540] commit new work on block 569 with 0 txs & 0 uncles. Took 1.243026ms +I0911 22:36:34.295574 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.978487ms. #569 [f45f9dbf / f45f9dbf] +I0911 22:36:34.296470 12571 worker.go:540] commit new work on block 570 with 0 txs & 0 uncles. Took 539.478µs +I0911 22:39:34.715471 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.197665ms. #570 [63867614 / 63867614] +I0911 22:39:34.716372 12571 worker.go:540] commit new work on block 571 with 0 txs & 0 uncles. Took 531.609µs +I0911 22:41:36.893745 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.159645ms. #571 [a927076f / a927076f] +I0911 22:41:36.895253 12571 worker.go:540] commit new work on block 572 with 0 txs & 0 uncles. Took 999.185µs +I0911 22:42:31.295532 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.081375ms. #572 [fcb7882a / fcb7882a] +I0911 22:42:31.296414 12571 worker.go:540] commit new work on block 573 with 0 txs & 0 uncles. Took 519.969µs +I0911 23:03:23.576237 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.334392ms. #573 [a82a872d / a82a872d] +I0911 23:03:23.577865 12571 worker.go:540] commit new work on block 574 with 0 txs & 0 uncles. Took 1.20807ms +I0911 23:05:35.324041 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.449495ms. #574 [32682009 / 32682009] +I0911 23:05:35.325469 12571 worker.go:540] commit new work on block 575 with 0 txs & 0 uncles. Took 982.224µs +I0911 23:21:55.067031 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.638792ms. #575 [5887c7f4 / 5887c7f4] +I0911 23:21:55.067922 12571 worker.go:540] commit new work on block 576 with 0 txs & 0 uncles. Took 521.476µs +I0911 23:38:58.198354 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.361209ms. #576 [156bff9d / 156bff9d] +I0911 23:38:58.199276 12571 worker.go:540] commit new work on block 577 with 0 txs & 0 uncles. Took 543.569µs +I0911 23:43:25.483540 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.568019ms. #577 [43ef8921 / 43ef8921] +I0911 23:43:25.484521 12571 worker.go:540] commit new work on block 578 with 0 txs & 0 uncles. Took 550.497µs +I0911 23:46:23.612152 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.308743ms. #578 [19dcfdd8 / 19dcfdd8] +I0911 23:46:23.613601 12571 worker.go:540] commit new work on block 579 with 0 txs & 0 uncles. Took 1.033061ms +I0912 00:09:25.003913 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.289968ms. #579 [5e54fe11 / 5e54fe11] +I0912 00:09:25.005290 12571 worker.go:540] commit new work on block 580 with 0 txs & 0 uncles. Took 929.94µs +I0912 00:18:25.809317 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.097715ms. #580 [51b33480 / 51b33480] +I0912 00:18:25.810216 12571 worker.go:540] commit new work on block 581 with 0 txs & 0 uncles. Took 535.473µs +I0912 00:23:14.348239 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.331546ms. #581 [d754b7d6 / d754b7d6] +I0912 00:23:14.350014 12571 worker.go:540] commit new work on block 582 with 0 txs & 0 uncles. Took 1.34519ms +I0912 00:24:49.639507 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.45053ms. #582 [4cc4bc98 / 4cc4bc98] +I0912 00:24:49.640472 12571 worker.go:540] commit new work on block 583 with 0 txs & 0 uncles. Took 533.566µs +I0912 00:25:49.380943 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.252059ms. #583 [f9eecf4f / f9eecf4f] +I0912 00:25:49.381937 12571 worker.go:540] commit new work on block 584 with 0 txs & 0 uncles. Took 474.195µs +I0912 00:29:44.853246 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.617992ms. #584 [edcf2490 / edcf2490] +I0912 00:29:44.854091 12571 worker.go:540] commit new work on block 585 with 0 txs & 0 uncles. Took 434.734µs +I0912 00:32:39.025953 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.656665ms. #585 [1cc60ef9 / 1cc60ef9] +I0912 00:32:39.026874 12571 worker.go:540] commit new work on block 586 with 0 txs & 0 uncles. Took 530.649µs +I0912 00:53:28.355052 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.608645ms. #586 [2acc810a / 2acc810a] +I0912 00:53:28.355908 12571 worker.go:540] commit new work on block 587 with 0 txs & 0 uncles. Took 441.323µs +I0912 01:06:03.844333 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.289471ms. #587 [f2cef9c1 / f2cef9c1] +I0912 01:06:03.845750 12571 worker.go:540] commit new work on block 588 with 0 txs & 0 uncles. Took 759.943µs +I0912 01:07:04.972750 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.271472ms. #588 [c074e261 / c074e261] +I0912 01:07:04.973763 12571 worker.go:540] commit new work on block 589 with 0 txs & 0 uncles. Took 445.391µs +I0912 01:08:54.164800 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.00849ms. #589 [7d202cdf / 7d202cdf] +I0912 01:08:54.165794 12571 worker.go:540] commit new work on block 590 with 0 txs & 0 uncles. Took 563.718µs +I0912 01:11:47.078738 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #590 [bebccca9] import failed: block time is in the future: BlockFutureErr, 1442034828 > 1442034737 +I0912 01:11:47.982307 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.869625ms. #589 [7d202cdf / 7d202cdf] +I0912 01:12:17.913032 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.785968ms. #589 [7d202cdf / 7d202cdf] +I0912 01:12:57.860349 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.842ms. #589 [7d202cdf / 7d202cdf] +I0912 01:13:43.235890 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.476403ms. #590 [bebccca9 / bebccca9] +I0912 01:13:45.407576 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.852388ms. #590 [bebccca9 / bebccca9] +I0912 01:13:47.720894 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.724242ms. #589 [7d202cdf / 7d202cdf] +I0912 01:13:50.410099 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.370957ms. #590 [bebccca9 / bebccca9] +I0912 01:13:50.410847 12571 worker.go:540] commit new work on block 591 with 0 txs & 0 uncles. Took 545.414µs +I0912 01:13:52.720407 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.979063ms. #590 [1729cd7a / 1729cd7a] +I0912 01:13:56.808887 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.380112ms. #590 [bebccca9 / bebccca9] +I0912 01:14:38.757941 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #591 [8b52643b] import failed: block time is in the future: BlockFutureErr, 1442035000 > 1442034908 +I0912 01:14:47.730066 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.753281ms. #590 [bebccca9 / bebccca9] +I0912 01:15:06.754341 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.345677ms. #590 [bebccca9 / bebccca9] +I0912 01:15:47.903089 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 9.678045ms. #590 [bebccca9 / bebccca9] +I0912 01:16:35.949842 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.844704ms. #590 [bebccca9 / bebccca9] +I0912 01:16:36.011633 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 9.584378ms. #592 [8b52643b / ec1fe65d] +I0912 01:16:37.702531 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.428968ms. #590 [bebccca9 / bebccca9] +I0912 01:16:46.759514 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #592 [ec1fe65d] import failed: block time is in the future: BlockFutureErr, 1442035171 > 1442035036 +I0912 01:17:05.899566 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 9.865159ms. #591 [8b52643b / 8b52643b] +I0912 01:17:54.955203 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.626488ms. #591 [8b52643b / 8b52643b] +I0912 01:18:15.774645 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.791067ms. #591 [8b52643b / 8b52643b] +I0912 01:19:04.979158 12571 chain_manager.go:661] imported 0 block(s) (1 queued 1 ignored) including 0 txs in 10.338624ms. #592 [8b52643b / ec1fe65d] +I0912 01:19:05.409392 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.744783ms. #592 [ec1fe65d / ec1fe65d] +I0912 01:19:07.775946 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.765615ms. #591 [8b52643b / 8b52643b] +I0912 01:19:10.409718 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.952922ms. #592 [ec1fe65d / ec1fe65d] +I0912 01:19:15.407442 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.690296ms. #592 [ec1fe65d / ec1fe65d] +I0912 01:19:16.861340 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.896451ms. #592 [ec1fe65d / ec1fe65d] +I0912 01:19:17.758370 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.472616ms. #591 [8b52643b / 8b52643b] +I0912 01:19:20.409436 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.691279ms. #592 [ec1fe65d / ec1fe65d] +I0912 01:19:25.405747 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.028318ms. #592 [ec1fe65d / ec1fe65d] +I0912 01:19:26.768164 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.119553ms. #592 [ec1fe65d / ec1fe65d] +I0912 01:19:27.730971 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 9.908112ms. #591 [8b52643b / 8b52643b] +I0912 01:19:30.323349 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.166114ms. #591 [8225c9db / 8225c9db] +I0912 01:19:30.408337 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 10.627569ms. #592 [ec1fe65d / ec1fe65d] +I0912 01:19:35.416465 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 18.716683ms. #592 [ec1fe65d / ec1fe65d] +I0912 01:19:35.425686 12571 worker.go:540] commit new work on block 593 with 0 txs & 0 uncles. Took 9.077271ms +I0912 01:19:36.742744 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.04983ms. #592 [ec1fe65d / ec1fe65d] +I0912 01:24:04.378185 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.514713ms. #592 [66cc4114 / 66cc4114] +I0912 01:25:01.691455 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.082942ms. #593 [5a1f87a3 / 5a1f87a3] +I0912 01:25:01.692484 12571 worker.go:540] commit new work on block 594 with 0 txs & 0 uncles. Took 660.516µs +I0912 01:25:21.807258 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #594 [680ed9d0] import failed: block time is in the future: BlockFutureErr, 1442035795 > 1442035551 +I0912 01:25:27.755544 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 9.267806ms. #593 [5a1f87a3 / 5a1f87a3] +I0912 01:25:37.691822 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 9.237998ms. #593 [5a1f87a3 / 5a1f87a3] +I0912 01:26:17.721101 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.45065ms. #593 [5a1f87a3 / 5a1f87a3] +I0912 01:26:47.849974 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.756724ms. #593 [5a1f87a3 / 5a1f87a3] +I0912 01:27:17.958737 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.843649ms. #593 [5a1f87a3 / 5a1f87a3] +I0912 01:27:47.759920 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.381918ms. #593 [5a1f87a3 / 5a1f87a3] +I0912 01:28:27.772751 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.412952ms. #593 [5a1f87a3 / 5a1f87a3] +I0912 01:29:02.087074 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.43077ms. #594 [5f902286 / 5f902286] +I0912 01:29:02.087994 12571 worker.go:540] commit new work on block 595 with 0 txs & 0 uncles. Took 566.458µs +I0912 01:30:10.929569 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.329775ms. #595 [6b95c12d / 6b95c12d] +I0912 01:30:10.930609 12571 worker.go:540] commit new work on block 596 with 0 txs & 0 uncles. Took 580.387µs +I0912 01:32:57.862450 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #596 [5564afa1] import failed: block time is in the future: BlockFutureErr, 1442036104 > 1442036007 +I0912 01:33:07.774321 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.345194ms. #595 [6b95c12d / 6b95c12d] +I0912 01:36:16.195443 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.296203ms. #596 [66231c49 / 66231c49] +I0912 01:36:16.196482 12571 worker.go:540] commit new work on block 597 with 0 txs & 0 uncles. Took 607.409µs +I0912 01:38:46.750378 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.159117ms. #597 [b230551b / b230551b] +I0912 01:38:46.751332 12571 worker.go:540] commit new work on block 598 with 0 txs & 0 uncles. Took 548.818µs +I0912 01:41:37.807366 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.458087ms. #598 [d4f59b25 / d4f59b25] +I0912 01:41:37.808370 12571 worker.go:540] commit new work on block 599 with 0 txs & 0 uncles. Took 559.065µs +I0912 01:42:14.924888 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.288233ms. #599 [b87e5ca1 / b87e5ca1] +I0912 01:42:14.925782 12571 worker.go:540] commit new work on block 600 with 0 txs & 0 uncles. Took 543.001µs +I0912 01:43:29.938514 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #600 [0324db38] import failed: block time is in the future: BlockFutureErr, 1442036848 > 1442036639 +I0912 01:43:30.562490 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #600 [0324db38] import failed: block time is in the future: BlockFutureErr, 1442036848 > 1442036640 +I0912 01:43:37.771471 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.616738ms. #599 [b87e5ca1 / b87e5ca1] +I0912 01:43:57.809128 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.460711ms. #599 [b87e5ca1 / b87e5ca1] +I0912 01:44:57.848944 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.472909ms. #599 [b87e5ca1 / b87e5ca1] +I0912 01:45:38.016292 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.873119ms. #599 [b87e5ca1 / b87e5ca1] +I0912 01:46:17.745040 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.610489ms. #599 [b87e5ca1 / b87e5ca1] +I0912 01:47:12.152577 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 10.701937ms. #600 [0324db38 / 0324db38] +I0912 01:47:15.407495 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.761599ms. #600 [0324db38 / 0324db38] +I0912 01:47:17.768075 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.947889ms. #599 [b87e5ca1 / b87e5ca1] +I0912 01:47:17.774890 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 6.452794ms. #600 [0324db38 / 0324db38] +I0912 01:47:20.409638 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.371547ms. #600 [0324db38 / 0324db38] +I0912 01:47:25.409677 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.917047ms. #600 [0324db38 / 0324db38] +I0912 01:47:29.393501 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.865352ms. #600 [1a59e7db / 1a59e7db] +I0912 01:47:29.394593 12571 worker.go:540] commit new work on block 601 with 0 txs & 0 uncles. Took 518.119µs +I0912 01:47:30.408283 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.54625ms. #600 [0324db38 / 0324db38] +I0912 01:47:55.869264 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.295231ms. #600 [0324db38 / 0324db38] +I0912 01:48:04.965333 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.527125ms. #601 [ac0eb231 / ac0eb231] +I0912 01:48:05.409352 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.632303ms. #601 [ac0eb231 / ac0eb231] +I0912 01:48:07.703768 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 9.468617ms. #600 [0324db38 / 0324db38] +I0912 01:48:10.409753 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.979211ms. #601 [ac0eb231 / ac0eb231] +I0912 01:48:15.407511 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.776295ms. #601 [ac0eb231 / ac0eb231] +I0912 01:48:16.740204 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.005653ms. #601 [ac0eb231 / ac0eb231] +I0912 01:48:17.854077 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.652316ms. #600 [0324db38 / 0324db38] +I0912 01:48:20.409474 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.745852ms. #601 [ac0eb231 / ac0eb231] +I0912 01:48:25.412315 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.56745ms. #601 [ac0eb231 / ac0eb231] +I0912 01:48:25.414229 12571 worker.go:540] commit new work on block 602 with 0 txs & 0 uncles. Took 1.597861ms +I0912 01:48:26.656065 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.339779ms. #601 [279c7e6a / 279c7e6a] +I0912 01:48:26.657104 12571 worker.go:540] commit new work on block 602 with 0 txs & 0 uncles. Took 467.177µs +I0912 01:48:26.868371 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.772178ms. #601 [ac0eb231 / ac0eb231] +I0912 01:49:24.106384 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #602 [97e5c092] import failed: block time is in the future: BlockFutureErr, 1442037200 > 1442036994 +I0912 01:49:27.779141 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 9.640037ms. #601 [279c7e6a / 279c7e6a] +I0912 01:49:37.853713 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.89447ms. #601 [279c7e6a / 279c7e6a] +I0912 01:50:17.712524 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.630033ms. #601 [279c7e6a / 279c7e6a] +I0912 01:50:47.921734 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.613952ms. #601 [279c7e6a / 279c7e6a] +I0912 01:51:17.705016 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.54217ms. #601 [279c7e6a / 279c7e6a] +I0912 01:52:07.893455 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.093615ms. #601 [279c7e6a / 279c7e6a] +I0912 01:52:38.095863 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.879682ms. #601 [279c7e6a / 279c7e6a] +I0912 01:52:42.431135 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.37092ms. #602 [b446a054 / b446a054] +I0912 01:52:42.432165 12571 worker.go:540] commit new work on block 603 with 0 txs & 0 uncles. Took 533.807µs +I0912 01:52:56.061884 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 10.447346ms. #602 [97e5c092 / 97e5c092] +I0912 01:53:00.407567 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.87ms. #602 [97e5c092 / 97e5c092] +I0912 01:53:05.100190 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.170129ms. #603 [8ffa2586 / 8ffa2586] +I0912 01:53:05.409894 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 12.14811ms. #603 [97e5c092 / 8ffa2586] +I0912 01:53:07.738659 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 10.354569ms. #602 [97e5c092 / 97e5c092] +I0912 01:53:10.410920 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 13.336679ms. #603 [97e5c092 / 8ffa2586] +I0912 01:53:15.407919 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 10.357753ms. #603 [97e5c092 / 8ffa2586] +I0912 01:53:16.774591 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 10.643974ms. #603 [8ffa2586 / 8ffa2586] +I0912 01:53:17.783699 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.313667ms. #602 [97e5c092 / 97e5c092] +I0912 01:53:50.409280 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.547034ms. #603 [8ffa2586 / 8ffa2586] +I0912 01:53:55.409860 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.110004ms. #603 [8ffa2586 / 8ffa2586] +I0912 01:54:00.407549 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.799737ms. #603 [8ffa2586 / 8ffa2586] +I0912 01:54:05.409311 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.583625ms. #603 [8ffa2586 / 8ffa2586] +I0912 01:54:10.410016 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.273267ms. #603 [8ffa2586 / 8ffa2586] +I0912 01:54:15.407515 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.780988ms. #603 [8ffa2586 / 8ffa2586] +I0912 01:54:20.410332 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.429485ms. #603 [8ffa2586 / 8ffa2586] +I0912 01:54:20.412053 12571 worker.go:540] commit new work on block 604 with 0 txs & 0 uncles. Took 1.317646ms +I0912 01:54:34.942292 12571 chain_manager.go:661] imported 0 block(s) (0 queued 2 ignored) including 0 txs in 11.469801ms. #603 [97e5c092 / 8ffa2586] +I0912 01:58:49.127136 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.754565ms. #603 [53c07574 / 53c07574] +I0912 01:58:49.128136 12571 worker.go:540] commit new work on block 604 with 0 txs & 0 uncles. Took 565.063µs +I0912 02:00:07.929570 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #604 [47af00fd] import failed: block time is in the future: BlockFutureErr, 1442037823 > 1442037637 +I0912 02:00:17.889852 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.98602ms. #603 [53c07574 / 53c07574] +I0912 02:00:27.851806 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.716836ms. #603 [53c07574 / 53c07574] +I0912 02:01:28.221722 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.170637ms. #603 [53c07574 / 53c07574] +I0912 02:01:57.807950 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.940953ms. #603 [53c07574 / 53c07574] +I0912 02:11:20.506762 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.441108ms. #604 [abea5e9e / abea5e9e] +I0912 02:11:20.507748 12571 worker.go:540] commit new work on block 605 with 0 txs & 0 uncles. Took 537.704µs +I0912 02:12:03.610190 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.395628ms. #605 [672fc504 / 672fc504] +I0912 02:12:03.611096 12571 worker.go:540] commit new work on block 606 with 0 txs & 0 uncles. Took 530.194µs +I0912 02:12:23.217654 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.000739ms. #606 [1e1a0a73 / 1e1a0a73] +I0912 02:12:23.218560 12571 worker.go:540] commit new work on block 607 with 0 txs & 0 uncles. Took 542.674µs +I0912 02:14:45.058378 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.471388ms. #607 [97caf29c / 97caf29c] +I0912 02:14:45.059563 12571 worker.go:540] commit new work on block 608 with 0 txs & 0 uncles. Took 737.71µs +I0912 02:14:54.357355 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.521465ms. #608 [4d9fd63b / 4d9fd63b] +I0912 02:14:54.358168 12571 worker.go:540] commit new work on block 609 with 0 txs & 0 uncles. Took 506.705µs +I0912 02:22:19.112867 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.173261ms. #609 [f8427c1b / f8427c1b] +I0912 02:22:19.113780 12571 worker.go:540] commit new work on block 610 with 0 txs & 0 uncles. Took 543.788µs +I0912 02:23:32.559616 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.531495ms. #610 [ee186c34 / ee186c34] +I0912 02:23:32.560717 12571 worker.go:540] commit new work on block 611 with 0 txs & 0 uncles. Took 468.458µs +I0912 02:26:25.859594 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #611 [51588824] import failed: block time is in the future: BlockFutureErr, 1442039306 > 1442039215 +I0912 02:26:26.537609 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #611 [51588824] import failed: block time is in the future: BlockFutureErr, 1442039306 > 1442039216 +I0912 02:26:27.706267 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.664785ms. #610 [ee186c34 / ee186c34] +I0912 02:27:07.869626 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.558498ms. #610 [ee186c34 / ee186c34] +I0912 02:28:02.303600 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.515763ms. #611 [51588824 / 51588824] +I0912 02:28:05.409367 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.654273ms. #611 [51588824 / 51588824] +I0912 02:28:07.896253 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.969085ms. #610 [ee186c34 / ee186c34] +I0912 02:28:10.409976 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.242043ms. #611 [51588824 / 51588824] +I0912 02:28:15.407451 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.747632ms. #611 [51588824 / 51588824] +I0912 02:28:16.993472 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.114998ms. #611 [51588824 / 51588824] +I0912 02:28:17.856072 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 9.173293ms. #610 [ee186c34 / ee186c34] +I0912 02:28:20.409470 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.735859ms. #611 [51588824 / 51588824] +I0912 02:28:25.409642 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.902086ms. #611 [51588824 / 51588824] +I0912 02:28:26.937977 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.399629ms. #611 [51588824 / 51588824] +I0912 02:28:26.938726 12571 worker.go:540] commit new work on block 612 with 0 txs & 0 uncles. Took 549.017µs +I0912 02:29:21.236145 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.078667ms. #611 [21961781 / 21961781] +I0912 02:30:00.983917 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.208945ms. #612 [8bc481d6 / 8bc481d6] +I0912 02:30:00.985101 12571 worker.go:540] commit new work on block 613 with 0 txs & 0 uncles. Took 808.489µs +I0912 02:31:30.185330 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.343912ms. #613 [3ca5e69a / 3ca5e69a] +I0912 02:31:30.186792 12571 worker.go:540] commit new work on block 614 with 0 txs & 0 uncles. Took 656.249µs +I0912 02:32:12.764051 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.043636ms. #614 [9da0fd0b / 9da0fd0b] +I0912 02:32:12.765394 12571 worker.go:540] commit new work on block 615 with 0 txs & 0 uncles. Took 937.004µs +I0912 02:33:03.360649 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #615 [343a4bb1] import failed: block time is in the future: BlockFutureErr, 1442039826 > 1442039613 +I0912 02:33:07.773753 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.26555ms. #614 [9da0fd0b / 9da0fd0b] +I0912 02:38:43.451596 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.004861ms. #615 [327574da / 327574da] +I0912 02:38:43.452557 12571 worker.go:540] commit new work on block 616 with 0 txs & 0 uncles. Took 571.636µs +I0912 02:42:35.902648 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.762596ms. #615 [343a4bb1 / 343a4bb1] +I0912 02:42:44.721077 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.273301ms. #616 [04361a9f / 04361a9f] +I0912 02:42:44.722206 12571 worker.go:540] commit new work on block 617 with 0 txs & 1 uncles. Took 702.204µs +I0912 02:42:47.706331 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.788623ms. #616 [96340048 / 96340048] +I0912 02:43:35.937035 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.511816ms. #616 [96340048 / 96340048] +I0912 02:44:05.961906 12571 chain_manager.go:661] imported 0 block(s) (1 queued 1 ignored) including 0 txs in 12.240477ms. #617 [96340048 / 829cf123] +I0912 02:44:07.874265 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 9.307477ms. #616 [96340048 / 96340048] +I0912 02:44:10.410054 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.309468ms. #617 [829cf123 / 829cf123] +I0912 02:44:15.407554 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.83322ms. #617 [829cf123 / 829cf123] +I0912 02:44:16.832158 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.953326ms. #617 [829cf123 / 829cf123] +I0912 02:44:17.736352 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.031996ms. #616 [96340048 / 96340048] +I0912 02:44:20.409512 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.765889ms. #617 [829cf123 / 829cf123] +I0912 02:44:25.405506 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 7.951146ms. #617 [829cf123 / 829cf123] +I0912 02:44:26.772296 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.521353ms. #617 [829cf123 / 829cf123] +I0912 02:44:27.733010 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.060103ms. #616 [96340048 / 96340048] +I0912 02:44:30.407273 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.698776ms. #617 [829cf123 / 829cf123] +I0912 02:44:30.408139 12571 worker.go:540] commit new work on block 618 with 0 txs & 0 uncles. Took 658.169µs +I0912 02:44:36.754108 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.794728ms. #617 [829cf123 / 829cf123] +I0912 02:48:45.223620 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.543717ms. #617 [c53c62ea / c53c62ea] +I0912 02:48:45.225254 12571 worker.go:540] commit new work on block 618 with 0 txs & 0 uncles. Took 1.058527ms +I0912 02:48:58.739270 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.126309ms. #618 [76d0ee0c / 76d0ee0c] +I0912 02:48:58.740220 12571 worker.go:540] commit new work on block 619 with 0 txs & 0 uncles. Took 550.34µs +I0912 02:49:56.242710 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #619 [d28a339f] import failed: block time is in the future: BlockFutureErr, 1442040832 > 1442040626 +I0912 02:49:56.868898 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #619 [d28a339f] import failed: block time is in the future: BlockFutureErr, 1442040832 > 1442040626 +I0912 02:49:57.762530 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.828399ms. #618 [76d0ee0c / 76d0ee0c] +I0912 02:50:07.787714 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 12.901774ms. #618 [76d0ee0c / 76d0ee0c] +I0912 02:51:57.767882 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 9.002203ms. #618 [76d0ee0c / 76d0ee0c] +I0912 02:52:27.782758 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 9.099567ms. #618 [76d0ee0c / 76d0ee0c] +I0912 02:52:52.547271 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.63152ms. #619 [3236e9f8 / 3236e9f8] +I0912 02:52:52.548194 12571 worker.go:540] commit new work on block 620 with 0 txs & 0 uncles. Took 555.991µs +I0912 02:53:15.962985 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #620 [1b83fdee] import failed: block time is in the future: BlockFutureErr, 1442041065 > 1442040825 +I0912 02:53:47.853001 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.506831ms. #619 [3236e9f8 / 3236e9f8] +I0912 02:54:17.745252 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.390398ms. #619 [3236e9f8 / 3236e9f8] +I0912 02:54:57.862267 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.642673ms. #619 [3236e9f8 / 3236e9f8] +I0912 02:55:27.748836 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.140675ms. #619 [3236e9f8 / 3236e9f8] +I0912 02:56:09.717234 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.44811ms. #620 [f83d22ca / f83d22ca] +I0912 02:56:09.718272 12571 worker.go:540] commit new work on block 621 with 0 txs & 0 uncles. Took 606.845µs +I0912 02:59:13.726490 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.939176ms. #621 [189901d3 / 189901d3] +I0912 02:59:13.727440 12571 worker.go:540] commit new work on block 622 with 0 txs & 0 uncles. Took 527.608µs +I0912 03:03:57.049032 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.222339ms. #622 [0c9050cb / 0c9050cb] +I0912 03:03:57.761454 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.859301ms. #621 [189901d3 / 189901d3] +I0912 03:04:00.406000 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.431815ms. #622 [0c9050cb / 0c9050cb] +I0912 03:04:05.409318 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.563912ms. #622 [0c9050cb / 0c9050cb] +I0912 03:04:10.412969 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 15.172555ms. #622 [0c9050cb / 0c9050cb] +I0912 03:04:10.414537 12571 worker.go:540] commit new work on block 623 with 0 txs & 0 uncles. Took 1.411219ms +I0912 03:04:43.043312 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 9.440302ms. #622 [0c9050cb / 0c9050cb] +I0912 03:11:40.352555 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 6.85091ms. #622 [1c554e74 / 1c554e74] +I0912 03:16:12.947856 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.062286ms. #623 [d95009b8 / d95009b8] +I0912 03:16:12.949214 12571 worker.go:540] commit new work on block 624 with 0 txs & 0 uncles. Took 914.463µs +I0912 03:17:23.268335 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #624 [fe3a6ea3] import failed: block time is in the future: BlockFutureErr, 1442042467 > 1442042273 +I0912 03:17:37.807543 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 12.009113ms. #623 [d95009b8 / d95009b8] +I0912 03:18:07.784567 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.624431ms. #623 [d95009b8 / d95009b8] +I0912 03:19:07.799714 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 9.393798ms. #623 [d95009b8 / d95009b8] +I0912 03:19:51.118482 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.758587ms. #624 [fccb74f7 / fccb74f7] +I0912 03:19:51.119472 12571 worker.go:540] commit new work on block 625 with 0 txs & 0 uncles. Took 555.46µs +I0912 03:29:24.996308 12571 chain_manager.go:661] imported 2 block(s) (0 queued 0 ignored) including 0 txs in 12.844012ms. #625 [fe3a6ea3 / ea777386] +I0912 03:29:24.996902 12571 worker.go:540] commit new work on block 626 with 0 txs & 0 uncles. Took 462.073µs +I0912 03:31:39.679681 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.298542ms. #625 [356caa90 / 356caa90] +I0912 03:35:26.727860 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 18.648872ms. #626 [d76b8109 / d76b8109] +I0912 03:35:26.729094 12571 worker.go:540] commit new work on block 627 with 0 txs & 0 uncles. Took 832.984µs +I0912 03:37:19.112998 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.216729ms. #626 [e768fb60 / e768fb60] +I0912 03:38:33.192944 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #627 [8050311d] import failed: block time is in the future: BlockFutureErr, 1442043620 > 1442043543 +I0912 03:38:37.930510 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.873922ms. #626 [d76b8109 / d76b8109] +I0912 03:40:59.356479 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.777965ms. #627 [a6b62518 / a6b62518] +I0912 03:40:59.357501 12571 worker.go:540] commit new work on block 628 with 0 txs & 0 uncles. Took 495.989µs +I0912 03:48:34.966780 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.795353ms. #627 [8050311d / 8050311d] +I0912 03:48:35.028038 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.692891ms. #628 [4cb6f43f / 4cb6f43f] +I0912 03:48:35.028872 12571 worker.go:540] commit new work on block 629 with 0 txs & 0 uncles. Took 631.525µs +I0912 03:58:17.119586 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.433453ms. #628 [6eecf778 / 6eecf778] +I0912 03:59:05.470854 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.98353ms. #629 [5ca10e36 / 5ca10e36] +I0912 03:59:05.471927 12571 worker.go:540] commit new work on block 630 with 0 txs & 0 uncles. Took 642.868µs +I0912 04:05:41.232088 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.654089ms. #630 [bb66cd20 / bb66cd20] +I0912 04:05:41.233049 12571 worker.go:540] commit new work on block 631 with 0 txs & 0 uncles. Took 466.723µs +I0912 04:05:52.607459 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.393322ms. #631 [b6dd8cce / b6dd8cce] +I0912 04:05:52.608426 12571 worker.go:540] commit new work on block 632 with 0 txs & 0 uncles. Took 564.016µs +I0912 04:08:23.482337 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.248059ms. #632 [d90fe945 / d90fe945] +I0912 04:08:23.483255 12571 worker.go:540] commit new work on block 633 with 0 txs & 0 uncles. Took 549.192µs +I0912 04:09:11.833109 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #633 [858c5620] import failed: block time is in the future: BlockFutureErr, 1442045597 > 1442045381 +I0912 04:09:12.463202 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #633 [858c5620] import failed: block time is in the future: BlockFutureErr, 1442045597 > 1442045382 +I0912 04:09:17.712934 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.044065ms. #632 [d90fe945 / d90fe945] +I0912 04:10:03.058042 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.350236ms. #633 [036df2a7 / 036df2a7] +I0912 04:10:03.059007 12571 worker.go:540] commit new work on block 634 with 0 txs & 0 uncles. Took 553.183µs +I0912 04:11:43.630664 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.936628ms. #634 [b91e3674 / b91e3674] +I0912 04:11:43.631517 12571 worker.go:540] commit new work on block 635 with 0 txs & 0 uncles. Took 439.653µs +I0912 04:13:15.983024 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.982472ms. #633 [858c5620 / 858c5620] +I0912 04:13:16.112110 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 13.271766ms. #635 [c0403043 / 6f290d4d] +I0912 04:13:17.807865 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.642447ms. #633 [858c5620 / 858c5620] +I0912 04:13:35.409878 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 12.160371ms. #635 [c0403043 / 6f290d4d] +I0912 04:13:40.410784 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 13.057528ms. #635 [c0403043 / 6f290d4d] +I0912 04:13:45.407979 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 10.231728ms. #635 [c0403043 / 6f290d4d] +I0912 04:13:50.428165 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 30.439187ms. #635 [c0403043 / 6f290d4d] +I0912 04:13:55.410895 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 13.147909ms. #635 [c0403043 / 6f290d4d] +I0912 04:13:55.811660 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.899104ms. #634 [c0403043 / c0403043] +I0912 04:13:55.878599 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.919464ms. #635 [6f290d4d / 6f290d4d] +I0912 04:13:57.731545 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.808125ms. #634 [c0403043 / c0403043] +I0912 04:14:00.407960 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 10.24915ms. #635 [c0403043 / 6f290d4d] +I0912 04:14:35.409257 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.51436ms. #635 [6f290d4d / 6f290d4d] +I0912 04:14:40.409921 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.221744ms. #635 [6f290d4d / 6f290d4d] +I0912 04:14:45.407596 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.891323ms. #635 [6f290d4d / 6f290d4d] +I0912 04:14:50.409344 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.746677ms. #635 [6f290d4d / 6f290d4d] +I0912 04:14:55.409564 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.910467ms. #635 [6f290d4d / 6f290d4d] +I0912 04:15:00.407593 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.876625ms. #635 [6f290d4d / 6f290d4d] +I0912 04:15:05.411554 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.816039ms. #635 [6f290d4d / 6f290d4d] +I0912 04:15:05.413934 12571 worker.go:540] commit new work on block 636 with 0 txs & 0 uncles. Took 1.614655ms +I0912 04:15:14.877574 12571 chain_manager.go:661] imported 0 block(s) (0 queued 2 ignored) including 0 txs in 11.990765ms. #635 [c0403043 / 6f290d4d] +I0912 04:17:37.706765 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.358397ms. #635 [23466c3f / 23466c3f] +I0912 04:24:28.548499 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.628971ms. #636 [30bda713 / 30bda713] +I0912 04:24:28.549789 12571 worker.go:540] commit new work on block 637 with 0 txs & 0 uncles. Took 757.557µs +I0912 04:26:05.366897 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.216798ms. #637 [0ca82bb5 / 0ca82bb5] +I0912 04:26:05.368052 12571 worker.go:540] commit new work on block 638 with 0 txs & 0 uncles. Took 447.277µs +I0912 04:28:30.575605 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #638 [61793b84] import failed: block time is in the future: BlockFutureErr, 1442046659 > 1442046540 +I0912 04:28:37.717134 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 7.889798ms. #637 [0ca82bb5 / 0ca82bb5] +I0912 04:29:27.954401 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.621384ms. #637 [0ca82bb5 / 0ca82bb5] +I0912 04:30:17.855073 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 9.885519ms. #637 [0ca82bb5 / 0ca82bb5] +I0912 04:30:45.061062 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 8.375426ms. #639 [61793b84 / 9b52a85a] +I0912 04:30:45.407997 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 10.199549ms. #639 [61793b84 / 9b52a85a] +I0912 04:30:47.707189 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.969949ms. #637 [0ca82bb5 / 0ca82bb5] +I0912 04:30:50.409882 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 12.158779ms. #639 [61793b84 / 9b52a85a] +I0912 04:30:55.410900 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 13.111771ms. #639 [61793b84 / 9b52a85a] +I0912 04:30:56.752175 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 10.581197ms. #639 [61793b84 / 9b52a85a] +I0912 04:30:57.828085 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.809623ms. #637 [0ca82bb5 / 0ca82bb5] +I0912 04:31:06.879006 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #639 [9b52a85a] import failed: block time is in the future: BlockFutureErr, 1442046804 > 1442046696 +I0912 04:32:55.409900 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.158992ms. #639 [9b52a85a / 9b52a85a] +I0912 04:33:00.407364 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.630977ms. #639 [9b52a85a / 9b52a85a] +I0912 04:33:05.409504 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.763757ms. #639 [9b52a85a / 9b52a85a] +I0912 04:33:10.409899 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.14136ms. #639 [9b52a85a / 9b52a85a] +I0912 04:33:15.407496 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.764459ms. #639 [9b52a85a / 9b52a85a] +I0912 04:33:20.409286 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.56147ms. #639 [9b52a85a / 9b52a85a] +I0912 04:33:25.412002 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.253201ms. #639 [9b52a85a / 9b52a85a] +I0912 04:33:25.413818 12571 worker.go:540] commit new work on block 640 with 0 txs & 0 uncles. Took 1.49789ms +I0912 04:43:05.101164 12571 chain_manager.go:661] imported 1 block(s) (0 queued 1 ignored) including 0 txs in 10.68969ms. #640 [9b52a85a / f611be37] +I0912 04:43:05.101834 12571 worker.go:540] commit new work on block 641 with 0 txs & 0 uncles. Took 421.595µs +I0912 04:43:17.515704 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.322099ms. #641 [b491ef74 / b491ef74] +I0912 04:43:17.516640 12571 worker.go:540] commit new work on block 642 with 0 txs & 0 uncles. Took 539.778µs +I0912 04:45:57.523911 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.726715ms. #638 [16d2a84c / 16d2a84c] +I0912 04:51:42.585106 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.418421ms. #639 [e036fab7 / e036fab7] +I0912 04:55:19.319094 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.228665ms. #642 [122bd96d / 122bd96d] +I0912 04:55:19.320310 12571 worker.go:540] commit new work on block 643 with 0 txs & 1 uncles. Took 772.286µs +I0912 04:57:20.339421 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #643 [f610a850] import failed: block time is in the future: BlockFutureErr, 1442048413 > 1442048270 +I0912 04:57:25.808016 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.162337ms. #642 [122bd96d / 122bd96d] +I0912 04:58:17.760986 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.00856ms. #642 [122bd96d / 122bd96d] +I0912 04:58:35.672972 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.07937ms. #643 [60598064 / 60598064] +I0912 04:58:35.674361 12571 worker.go:540] commit new work on block 644 with 0 txs & 1 uncles. Took 692.95µs +I0912 05:03:25.062361 12571 chain_manager.go:661] imported 2 block(s) (0 queued 0 ignored) including 0 txs in 19.361882ms. #644 [f610a850 / 010d3a9a] +I0912 05:03:25.063155 12571 worker.go:540] commit new work on block 645 with 0 txs & 0 uncles. Took 651.702µs +I0912 05:04:21.690766 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 15.855059ms. #644 [b22a40b1 / b22a40b1] +I0912 05:08:43.330401 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.00529ms. #645 [1930d84f / 1930d84f] +I0912 05:08:43.331378 12571 worker.go:540] commit new work on block 646 with 0 txs & 0 uncles. Took 597.518µs +I0912 05:19:52.004882 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.374731ms. #646 [bcf4c8e4 / bcf4c8e4] +I0912 05:19:52.005974 12571 worker.go:540] commit new work on block 647 with 0 txs & 0 uncles. Took 475.28µs +I0912 05:22:18.323271 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.701497ms. #647 [07b09a67 / 07b09a67] +I0912 05:22:18.324215 12571 worker.go:540] commit new work on block 648 with 0 txs & 0 uncles. Took 565.339µs +I0912 05:28:10.796155 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.268533ms. #648 [7689f417 / 7689f417] +I0912 05:28:10.797767 12571 worker.go:540] commit new work on block 649 with 0 txs & 0 uncles. Took 742.407µs +I0912 05:32:43.510441 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.75824ms. #649 [993a4860 / 993a4860] +I0912 05:32:43.511350 12571 worker.go:540] commit new work on block 650 with 0 txs & 0 uncles. Took 542.478µs +I0912 05:33:49.436840 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.753617ms. #650 [6a472e10 / 6a472e10] +I0912 05:33:49.437841 12571 worker.go:540] commit new work on block 651 with 0 txs & 0 uncles. Took 571.666µs +I0912 05:37:45.187787 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.698862ms. #651 [7f9cdc2e / 7f9cdc2e] +I0912 05:37:45.198817 12571 worker.go:540] commit new work on block 652 with 0 txs & 0 uncles. Took 10.600063ms +I0912 05:37:54.320897 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #652 [8d9f5e95] import failed: block time is in the future: BlockFutureErr, 1442050959 > 1442050704 +I0912 05:37:57.720256 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.914061ms. #651 [7f9cdc2e / 7f9cdc2e] +I0912 05:39:29.227433 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.514254ms. #652 [e64c7468 / e64c7468] +I0912 05:39:29.228543 12571 worker.go:540] commit new work on block 653 with 0 txs & 0 uncles. Took 523.051µs +I0912 05:42:37.248453 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.993989ms. #652 [8d9f5e95 / 8d9f5e95] +I0912 05:42:40.411656 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.912649ms. #652 [8d9f5e95 / 8d9f5e95] +I0912 05:42:46.354573 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 11.459211ms. #654 [971ca3a6 / 2483f619] +I0912 05:42:47.965047 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.089837ms. #652 [8d9f5e95 / 8d9f5e95] +I0912 05:42:50.410442 12571 chain_manager.go:661] imported 1 block(s) (1 queued 0 ignored) including 0 txs in 12.642933ms. #654 [971ca3a6 / 2483f619] +I0912 05:42:50.411063 12571 worker.go:540] commit new work on block 654 with 0 txs & 0 uncles. Took 421.467µs +I0912 05:42:55.410186 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.341415ms. #654 [2483f619 / 2483f619] +I0912 05:42:56.843953 12571 chain_manager.go:661] imported 0 block(s) (1 queued 1 ignored) including 0 txs in 10.256382ms. #654 [971ca3a6 / 2483f619] +I0912 05:42:57.743971 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.882939ms. #653 [971ca3a6 / 971ca3a6] +I0912 05:43:00.408294 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.56182ms. #654 [2483f619 / 2483f619] +I0912 05:43:00.409746 12571 worker.go:540] commit new work on block 655 with 0 txs & 0 uncles. Took 1.236042ms +I0912 05:43:06.753060 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.583634ms. #654 [2483f619 / 2483f619] +I0912 05:47:32.795715 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.695303ms. #653 [d08f0dfe / d08f0dfe] +I0912 05:47:39.970943 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.375605ms. #654 [cd54861e / cd54861e] +I0912 05:48:04.869769 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.155521ms. #655 [98cf6bbe / 98cf6bbe] +I0912 05:48:04.870958 12571 worker.go:540] commit new work on block 656 with 0 txs & 0 uncles. Took 506.312µs +I0912 05:52:22.500376 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #656 [6ac819c3] import failed: block time is in the future: BlockFutureErr, 1442051588 > 1442051572 +I0912 05:52:23.913380 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.182771ms. #655 [98cf6bbe / 98cf6bbe] +I0912 05:52:37.787110 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.393764ms. #655 [98cf6bbe / 98cf6bbe] +I0912 05:52:46.811458 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 13.600185ms. #657 [6ac819c3 / 296d998e] +I0912 05:52:47.760379 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.682809ms. #655 [98cf6bbe / 98cf6bbe] +I0912 05:52:50.409582 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 11.847267ms. #657 [6ac819c3 / 296d998e] +I0912 05:52:55.410889 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 13.12615ms. #657 [6ac819c3 / 296d998e] +I0912 05:52:56.806976 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 14.039327ms. #657 [6ac819c3 / 296d998e] +I0912 05:52:57.709673 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 7.913744ms. #655 [98cf6bbe / 98cf6bbe] +I0912 05:53:00.407653 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 9.953356ms. #657 [6ac819c3 / 296d998e] +I0912 05:53:05.409919 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 12.299744ms. #657 [6ac819c3 / 296d998e] +I0912 05:53:06.846899 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 13.286421ms. #657 [6ac819c3 / 296d998e] +I0912 05:53:07.724956 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.593647ms. #655 [98cf6bbe / 98cf6bbe] +I0912 05:53:16.760923 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #657 [296d998e] import failed: block time is in the future: BlockFutureErr, 1442051836 > 1442051626 +I0912 05:53:44.997809 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.898532ms. #656 [6ac819c3 / 6ac819c3] +I0912 05:54:27.634686 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.604718ms. #656 [11f666bb / 11f666bb] +I0912 05:54:27.635713 12571 worker.go:540] commit new work on block 657 with 0 txs & 0 uncles. Took 579.261µs +I0912 05:54:33.670107 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 14.250897ms. #657 [60eb1c72 / 60eb1c72] +I0912 05:54:34.785759 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.626235ms. #657 [60eb1c72 / 60eb1c72] +I0912 05:54:34.786597 12571 worker.go:540] commit new work on block 658 with 0 txs & 0 uncles. Took 398.925µs +I0912 05:56:34.907722 12571 downloader.go:254] Synchronisation failed: block downloading canceled (requested) +I0912 05:56:50.409385 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.649207ms. #657 [296d998e / 296d998e] +I0912 05:56:55.409595 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.84431ms. #657 [296d998e / 296d998e] +I0912 05:56:56.002292 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 10.99657ms. #657 [296d998e / 296d998e] +I0912 05:57:00.407538 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.808544ms. #657 [296d998e / 296d998e] +I0912 05:57:05.278266 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.098529ms. #658 [eddf6080 / eddf6080] +I0912 05:57:05.409916 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 12.193614ms. #658 [296d998e / eddf6080] +I0912 05:57:07.707099 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.096258ms. #657 [296d998e / 296d998e] +I0912 05:57:10.410988 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 13.242948ms. #658 [296d998e / eddf6080] +I0912 05:57:15.408029 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 10.254065ms. #658 [296d998e / eddf6080] +I0912 05:57:16.759913 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.924335ms. #658 [eddf6080 / eddf6080] +I0912 05:57:17.841911 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.532976ms. #657 [296d998e / 296d998e] +I0912 05:57:20.410616 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.896955ms. #658 [eddf6080 / eddf6080] +I0912 05:57:20.411557 12571 worker.go:540] commit new work on block 659 with 0 txs & 0 uncles. Took 729.818µs +I0912 05:57:26.907542 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #659 [b5117c32] import failed: block time is in the future: BlockFutureErr, 1442051898 > 1442051876 +I0912 05:58:05.071157 12571 chain_manager.go:661] imported 0 block(s) (1 queued 1 ignored) including 0 txs in 12.324948ms. #659 [eddf6080 / b5117c32] +I0912 05:58:05.409306 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.637951ms. #659 [b5117c32 / b5117c32] +I0912 05:58:07.784716 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.54983ms. #658 [eddf6080 / eddf6080] +I0912 05:58:10.409893 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.141351ms. #659 [b5117c32 / b5117c32] +I0912 05:58:15.407430 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.685521ms. #659 [b5117c32 / b5117c32] +I0912 05:58:16.821638 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.540284ms. #659 [b5117c32 / b5117c32] +I0912 05:58:17.746201 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.447338ms. #658 [eddf6080 / eddf6080] +I0912 05:58:20.410149 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.382291ms. #659 [b5117c32 / b5117c32] +I0912 05:58:20.411435 12571 worker.go:540] commit new work on block 660 with 0 txs & 0 uncles. Took 1.146315ms +I0912 05:58:26.844975 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.162703ms. #659 [b5117c32 / b5117c32] +I0912 05:59:35.735612 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.894863ms. #658 [fbeb0aa9 / fbeb0aa9] +I0912 06:06:22.696260 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 18.35403ms. #660 [a7d287e8 / a7d287e8] +I0912 06:06:22.698120 12571 worker.go:540] commit new work on block 661 with 0 txs & 0 uncles. Took 1.416074ms +I0912 06:08:27.455459 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.337203ms. #659 [cadfe862 / cadfe862] +I0912 06:20:24.483914 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.071713ms. #661 [62d0784b / 62d0784b] +I0912 06:20:24.486016 12571 worker.go:540] commit new work on block 662 with 0 txs & 0 uncles. Took 1.460233ms +I0912 06:23:07.966974 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.513214ms. #662 [2677805f / 2677805f] +I0912 06:23:07.967883 12571 worker.go:540] commit new work on block 663 with 0 txs & 0 uncles. Took 548.122µs +I0912 06:24:01.807247 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #663 [9acefc3a] import failed: block time is in the future: BlockFutureErr, 1442053682 > 1442053471 +I0912 06:24:07.753365 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 7.91139ms. #662 [2677805f / 2677805f] +I0912 06:24:57.873784 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.303831ms. #662 [2677805f / 2677805f] +I0912 06:26:12.083978 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.819763ms. #663 [0bce59cd / 0bce59cd] +I0912 06:26:12.098847 12571 worker.go:540] commit new work on block 664 with 0 txs & 0 uncles. Took 14.375683ms +I0912 06:29:08.744970 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.156635ms. #664 [7d000828 / 7d000828] +I0912 06:29:08.746065 12571 worker.go:540] commit new work on block 665 with 0 txs & 0 uncles. Took 502.695µs +I0912 06:30:56.287971 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.808674ms. #665 [04d2a62f / 04d2a62f] +I0912 06:30:56.289711 12571 worker.go:540] commit new work on block 666 with 0 txs & 0 uncles. Took 768.363µs +I0912 06:31:00.826757 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 10.601754ms. #666 [44f1652c / 44f1652c] +I0912 06:31:01.433453 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.147018ms. #666 [44f1652c / 44f1652c] +I0912 06:31:05.409035 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.38881ms. #666 [44f1652c / 44f1652c] +I0912 06:31:05.409630 12571 worker.go:540] commit new work on block 667 with 0 txs & 0 uncles. Took 386.298µs +I0912 06:31:46.660609 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.071478ms. #667 [c48b8e1a / c48b8e1a] +I0912 06:31:46.662084 12571 worker.go:540] commit new work on block 668 with 0 txs & 0 uncles. Took 657.85µs +I0912 06:40:57.610075 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.21733ms. #668 [7df13a6c / 7df13a6c] +I0912 06:40:57.611619 12571 worker.go:540] commit new work on block 669 with 0 txs & 0 uncles. Took 1.015845ms +I0912 06:47:28.030503 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.121075ms. #669 [1d05bb17 / 1d05bb17] +I0912 06:47:28.031537 12571 worker.go:540] commit new work on block 670 with 0 txs & 0 uncles. Took 583.192µs +I0912 06:48:12.453774 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.405906ms. #670 [4113348d / 4113348d] +I0912 06:48:12.454694 12571 worker.go:540] commit new work on block 671 with 0 txs & 0 uncles. Took 577.384µs +I0912 06:50:41.482286 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.418423ms. #671 [bccf1ab2 / bccf1ab2] +I0912 06:50:41.483652 12571 worker.go:540] commit new work on block 672 with 0 txs & 0 uncles. Took 745.792µs +I0912 06:55:20.125250 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.478281ms. #672 [a1e8aaa5 / a1e8aaa5] +I0912 06:55:20.409345 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.63609ms. #672 [a1e8aaa5 / a1e8aaa5] +I0912 06:55:20.756000 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.92241ms. #672 [a1e8aaa5 / a1e8aaa5] +I0912 06:55:25.409992 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.279854ms. #672 [a1e8aaa5 / a1e8aaa5] +I0912 06:55:27.756616 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.429428ms. #671 [bccf1ab2 / bccf1ab2] +I0912 06:55:30.407560 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.850116ms. #672 [a1e8aaa5 / a1e8aaa5] +I0912 06:55:35.407023 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.308761ms. #672 [a1e8aaa5 / a1e8aaa5] +I0912 06:55:40.411814 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.087904ms. #672 [a1e8aaa5 / a1e8aaa5] +I0912 06:55:40.413079 12571 worker.go:540] commit new work on block 673 with 0 txs & 0 uncles. Took 829.255µs +I0912 06:55:54.850385 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.545924ms. #672 [a1e8aaa5 / a1e8aaa5] +I0912 06:56:49.744978 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.013564ms. #672 [c109d138 / c109d138] +I0912 06:58:20.147485 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.535037ms. #673 [80e8cf9b / 80e8cf9b] +I0912 06:58:20.148443 12571 worker.go:540] commit new work on block 674 with 0 txs & 0 uncles. Took 585.639µs +I0912 06:59:53.023770 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.565121ms. #674 [19bbf0bd / 19bbf0bd] +I0912 06:59:53.024815 12571 worker.go:540] commit new work on block 675 with 0 txs & 0 uncles. Took 634.159µs +I0912 07:00:42.478636 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.967376ms. #675 [c47de0a4 / c47de0a4] +I0912 07:00:42.479561 12571 worker.go:540] commit new work on block 676 with 0 txs & 0 uncles. Took 565.407µs +I0912 07:20:45.923607 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.190139ms. #676 [4c927c12 / 4c927c12] +I0912 07:20:45.924501 12571 worker.go:540] commit new work on block 677 with 0 txs & 0 uncles. Took 532.274µs +I0912 07:20:50.592604 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.686817ms. #677 [dc0c2ae1 / dc0c2ae1] +I0912 07:20:51.181614 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.103646ms. #677 [dc0c2ae1 / dc0c2ae1] +I0912 07:20:51.449307 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.235877ms. #677 [dc0c2ae1 / dc0c2ae1] +I0912 07:20:55.411728 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.97743ms. #677 [dc0c2ae1 / dc0c2ae1] +I0912 07:20:55.413033 12571 worker.go:540] commit new work on block 678 with 0 txs & 0 uncles. Took 852.474µs +I0912 07:21:13.294556 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.079332ms. #678 [0bde98a3 / 0bde98a3] +I0912 07:21:13.295436 12571 worker.go:540] commit new work on block 679 with 0 txs & 0 uncles. Took 532.876µs +I0912 07:29:19.931593 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.175845ms. #679 [0a3b2606 / 0a3b2606] +I0912 07:29:19.932477 12571 worker.go:540] commit new work on block 680 with 0 txs & 0 uncles. Took 520.363µs +I0912 07:29:33.143864 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.847905ms. #680 [bc797d37 / bc797d37] +I0912 07:29:33.144896 12571 worker.go:540] commit new work on block 681 with 0 txs & 0 uncles. Took 673.33µs +I0912 07:33:19.796901 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.041217ms. #681 [b4ad6b85 / b4ad6b85] +I0912 07:33:19.797844 12571 worker.go:540] commit new work on block 682 with 0 txs & 0 uncles. Took 521.677µs +I0912 07:33:58.963563 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.612374ms. #682 [11eb609f / 11eb609f] +I0912 07:33:58.964479 12571 worker.go:540] commit new work on block 683 with 0 txs & 0 uncles. Took 539.211µs +I0912 07:41:33.055777 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.83996ms. #683 [68d88b0c / 68d88b0c] +I0912 07:41:33.057642 12571 worker.go:540] commit new work on block 684 with 0 txs & 0 uncles. Took 973.198µs +I0912 07:44:42.862394 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.136538ms. #684 [c6a957dd / c6a957dd] +I0912 07:44:42.863422 12571 worker.go:540] commit new work on block 685 with 0 txs & 0 uncles. Took 589.351µs +I0912 07:46:25.499952 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.569175ms. #685 [dd7a9523 / dd7a9523] +I0912 07:46:25.501161 12571 worker.go:540] commit new work on block 686 with 0 txs & 0 uncles. Took 752.589µs +I0912 07:50:36.380017 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.497039ms. #686 [ec492f24 / ec492f24] +I0912 07:50:36.381141 12571 worker.go:540] commit new work on block 687 with 0 txs & 0 uncles. Took 717.251µs +I0912 07:52:42.790106 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.409204ms. #687 [545b6941 / 545b6941] +I0912 07:52:42.791145 12571 worker.go:540] commit new work on block 688 with 0 txs & 0 uncles. Took 456.547µs +I0912 07:53:22.104372 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #688 [b79b20b4] import failed: block time is in the future: BlockFutureErr, 1442059057 > 1442058832 +I0912 07:53:22.728380 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #688 [b79b20b4] import failed: block time is in the future: BlockFutureErr, 1442059057 > 1442058832 +I0912 07:53:37.788578 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.420415ms. #687 [545b6941 / 545b6941] +I0912 07:54:17.881564 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 9.752989ms. #687 [545b6941 / 545b6941] +I0912 07:54:33.214006 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.240679ms. #688 [7dc704b4 / 7dc704b4] +I0912 07:54:33.214898 12571 worker.go:540] commit new work on block 689 with 0 txs & 0 uncles. Took 530.842µs +I0912 07:58:25.932510 12571 chain_manager.go:661] imported 2 block(s) (0 queued 0 ignored) including 0 txs in 15.468949ms. #689 [b79b20b4 / d114f03f] +I0912 07:58:25.933369 12571 worker.go:540] commit new work on block 690 with 0 txs & 0 uncles. Took 737.777µs +I0912 08:01:14.337659 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #690 [958e6e0b] import failed: block time is in the future: BlockFutureErr, 1442059374 > 1442059304 +I0912 08:01:17.917819 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 9.736613ms. #689 [d114f03f / d114f03f] +I0912 08:02:34.998383 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.608998ms. #689 [d114f03f / d114f03f] +I0912 08:02:44.100498 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.772151ms. #690 [958e6e0b / 958e6e0b] +I0912 08:02:45.407470 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.735159ms. #690 [958e6e0b / 958e6e0b] +I0912 08:02:47.698317 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.314598ms. #689 [d114f03f / d114f03f] +I0912 08:02:50.409442 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.618726ms. #690 [958e6e0b / 958e6e0b] +I0912 08:02:55.420009 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 22.273025ms. #690 [958e6e0b / 958e6e0b] +I0912 08:02:55.420918 12571 worker.go:540] commit new work on block 691 with 0 txs & 0 uncles. Took 618.138µs +I0912 08:02:56.745014 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.653076ms. #690 [958e6e0b / 958e6e0b] +I0912 08:04:59.674416 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.158248ms. #689 [24f174ab / 24f174ab] +I0912 08:07:52.329457 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.126846ms. #690 [35b99265 / 35b99265] +I0912 08:08:43.323664 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.848683ms. #691 [9f9ec70c / 9f9ec70c] +I0912 08:08:43.324777 12571 worker.go:540] commit new work on block 692 with 0 txs & 0 uncles. Took 692.613µs +I0912 08:13:01.621818 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.734272ms. #692 [1a02dace / 1a02dace] +I0912 08:13:01.622871 12571 worker.go:540] commit new work on block 693 with 0 txs & 0 uncles. Took 626.276µs +I0912 08:19:29.531307 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.333405ms. #691 [2554c13a / 2554c13a] +I0912 08:22:02.324013 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.319734ms. #693 [72e30d63 / 72e30d63] +I0912 08:22:02.325479 12571 worker.go:540] commit new work on block 694 with 0 txs & 0 uncles. Took 1.052262ms +I0912 08:41:56.916347 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.342561ms. #694 [a0432629 / a0432629] +I0912 08:41:56.917531 12571 worker.go:540] commit new work on block 695 with 0 txs & 0 uncles. Took 800.423µs +I0912 08:43:03.862320 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #695 [95fd155b] import failed: block time is in the future: BlockFutureErr, 1442062011 > 1442061813 +I0912 08:43:07.751863 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.764608ms. #694 [a0432629 / a0432629] +I0912 08:43:17.926337 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.623841ms. #694 [a0432629 / a0432629] +I0912 08:44:27.788123 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.861824ms. #694 [a0432629 / a0432629] +I0912 08:45:27.847731 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.852086ms. #694 [a0432629 / a0432629] +I0912 08:45:45.993998 12571 downloader.go:254] Synchronisation failed: block downloading canceled (requested) +I0912 08:45:59.553340 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.800089ms. #695 [c348dd60 / c348dd60] +I0912 08:45:59.555273 12571 worker.go:540] commit new work on block 696 with 0 txs & 0 uncles. Took 1.288519ms +I0912 08:46:43.999669 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 12.521323ms. #696 [95fd155b / 4f0dfbc7] +I0912 08:46:45.407692 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 9.988334ms. #696 [95fd155b / 4f0dfbc7] +I0912 08:46:47.734339 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 10.901504ms. #695 [95fd155b / 95fd155b] +I0912 08:46:50.409859 12571 chain_manager.go:661] imported 0 block(s) (2 queued 0 ignored) including 0 txs in 12.143879ms. #696 [95fd155b / 4f0dfbc7] +I0912 08:47:30.412913 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 15.205808ms. #696 [4f0dfbc7 / 4f0dfbc7] +I0912 08:47:35.409900 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.176649ms. #696 [4f0dfbc7 / 4f0dfbc7] +I0912 08:47:37.788661 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.133028ms. #695 [95fd155b / 95fd155b] +I0912 08:47:40.409494 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.76357ms. #696 [4f0dfbc7 / 4f0dfbc7] +I0912 08:47:45.407513 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.816362ms. #696 [4f0dfbc7 / 4f0dfbc7] +I0912 08:47:46.819760 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.208032ms. #696 [4f0dfbc7 / 4f0dfbc7] +I0912 08:47:47.722292 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.55326ms. #695 [95fd155b / 95fd155b] +I0912 08:47:50.409226 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.568513ms. #696 [4f0dfbc7 / 4f0dfbc7] +I0912 08:47:55.408249 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 10.535823ms. #696 [4f0dfbc7 / 4f0dfbc7] +I0912 08:47:56.783914 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.420945ms. #696 [4f0dfbc7 / 4f0dfbc7] +I0912 08:47:57.750337 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.557741ms. #695 [95fd155b / 95fd155b] +I0912 08:48:00.410149 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.417721ms. #696 [4f0dfbc7 / 4f0dfbc7] +I0912 08:48:00.410959 12571 worker.go:540] commit new work on block 697 with 0 txs & 0 uncles. Took 578.313µs +I0912 08:48:06.857985 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.867392ms. #696 [4f0dfbc7 / 4f0dfbc7] +I0912 08:55:26.470244 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.796218ms. #696 [aebfdc04 / aebfdc04] +I0912 08:57:09.903818 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.289338ms. #697 [b207437a / b207437a] +I0912 08:57:09.905961 12571 worker.go:540] commit new work on block 698 with 0 txs & 0 uncles. Took 1.42128ms +I0912 08:58:22.873427 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.378812ms. #698 [5f1e066e / 5f1e066e] +I0912 08:58:22.874812 12571 worker.go:540] commit new work on block 699 with 0 txs & 0 uncles. Took 785.877µs +I0912 08:59:16.882716 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #699 [f471679d] import failed: block time is in the future: BlockFutureErr, 1442062997 > 1442062786 +I0912 08:59:17.830930 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 9.979643ms. #698 [5f1e066e / 5f1e066e] +I0912 08:59:27.826853 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.475127ms. #698 [5f1e066e / 5f1e066e] +I0912 09:00:07.881109 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.673126ms. #698 [5f1e066e / 5f1e066e] +I0912 09:00:37.844989 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.601327ms. #698 [5f1e066e / 5f1e066e] +I0912 09:01:17.772572 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.099957ms. #698 [5f1e066e / 5f1e066e] +I0912 09:02:07.698892 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.904427ms. #698 [5f1e066e / 5f1e066e] +I0912 09:04:23.731659 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.026788ms. #699 [86ebea8d / 86ebea8d] +I0912 09:04:23.733688 12571 worker.go:540] commit new work on block 700 with 0 txs & 0 uncles. Took 735.167µs +I0912 09:04:56.455964 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.176177ms. #700 [f5ddf4d4 / f5ddf4d4] +I0912 09:04:56.457359 12571 worker.go:540] commit new work on block 701 with 0 txs & 0 uncles. Took 864.526µs +I0912 09:07:12.683381 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.379662ms. #701 [6517d0c5 / 6517d0c5] +I0912 09:07:12.693456 12571 worker.go:540] commit new work on block 702 with 0 txs & 0 uncles. Took 9.64861ms +I0912 09:07:38.685463 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.425129ms. #702 [496ebf39 / 496ebf39] +I0912 09:07:38.686483 12571 worker.go:540] commit new work on block 703 with 0 txs & 0 uncles. Took 603.661µs +I0912 09:07:51.981848 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.599708ms. #703 [25766639 / 25766639] +I0912 09:07:51.982741 12571 worker.go:540] commit new work on block 704 with 0 txs & 0 uncles. Took 539.158µs +I0912 09:08:51.303490 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.133699ms. #704 [b546575e / b546575e] +I0912 09:08:51.305539 12571 worker.go:540] commit new work on block 705 with 0 txs & 0 uncles. Took 1.332941ms +I0912 09:09:37.292268 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.44561ms. #705 [9216193c / 9216193c] +I0912 09:09:37.293894 12571 worker.go:540] commit new work on block 706 with 0 txs & 0 uncles. Took 1.21294ms +I0912 09:11:34.354063 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.580414ms. #706 [c934f721 / c934f721] +I0912 09:11:34.355985 12571 worker.go:540] commit new work on block 707 with 0 txs & 0 uncles. Took 1.241958ms +I0912 09:12:42.297986 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #707 [51c66047] import failed: block time is in the future: BlockFutureErr, 1442063838 > 1442063592 +I0912 09:12:47.975105 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 9.608017ms. #706 [c934f721 / c934f721] +I0912 09:13:28.113843 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 28.514446ms. #707 [42418ca2 / 42418ca2] +I0912 09:13:28.115172 12571 worker.go:540] commit new work on block 708 with 0 txs & 0 uncles. Took 744.501µs +I0912 09:14:16.581548 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.762493ms. #708 [224374cb / 224374cb] +I0912 09:14:16.582576 12571 worker.go:540] commit new work on block 709 with 0 txs & 0 uncles. Took 600.597µs +I0912 09:16:44.803079 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.016483ms. #709 [9e78deb6 / 9e78deb6] +I0912 09:16:44.805081 12571 worker.go:540] commit new work on block 710 with 0 txs & 0 uncles. Took 1.35216ms +I0912 09:16:45.223086 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.152903ms. #709 [fb386b3b / fb386b3b] +I0912 09:16:46.781910 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.967025ms. #710 [ba415cea / ba415cea] +I0912 09:16:47.699267 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 7.213081ms. #709 [fb386b3b / fb386b3b] +I0912 09:16:50.412302 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.560599ms. #710 [ba415cea / ba415cea] +I0912 09:16:50.413197 12571 worker.go:540] commit new work on block 711 with 0 txs & 0 uncles. Took 658.321µs +I0912 09:16:54.982908 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 18.151761ms. #711 [119d789b / 119d789b] +I0912 09:16:54.994095 12571 worker.go:540] commit new work on block 712 with 0 txs & 0 uncles. Took 586.142µs +I0912 09:16:55.001693 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.81478ms. #712 [a21f20eb / a21f20eb] +I0912 09:16:55.003135 12571 worker.go:540] commit new work on block 713 with 0 txs & 0 uncles. Took 673.973µs +I0912 09:16:56.746978 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.792326ms. #710 [ba415cea / ba415cea] +I0912 09:16:56.979871 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #713 [cff603b9] import failed: block time is in the future: BlockFutureErr, 1442064110 > 1442063846 +I0912 09:17:02.036326 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.333073ms. #713 [7695f5bd / 7695f5bd] +I0912 09:17:02.037443 12571 worker.go:540] commit new work on block 714 with 0 txs & 0 uncles. Took 532.377µs +I0912 09:17:03.093892 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 14.95025ms. #714 [41b14e7e / 41b14e7e] +I0912 09:17:05.409797 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.172002ms. #714 [41b14e7e / 41b14e7e] +I0912 09:17:06.907168 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 13.112685ms. #712 [a21f20eb / a21f20eb] +I0912 09:17:10.412559 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.737611ms. #714 [41b14e7e / 41b14e7e] +I0912 09:17:10.413451 12571 worker.go:540] commit new work on block 715 with 0 txs & 0 uncles. Took 484.854µs +I0912 09:17:15.920428 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.314111ms. #715 [3d7a9eaf / 3d7a9eaf] +I0912 09:17:15.921916 12571 worker.go:540] commit new work on block 716 with 0 txs & 0 uncles. Took 994.421µs +I0912 09:17:23.791038 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.476105ms. #716 [41bafe2c / 41bafe2c] +I0912 09:17:23.792197 12571 worker.go:540] commit new work on block 717 with 0 txs & 0 uncles. Took 712.244µs +I0912 09:17:29.878978 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 16.293448ms. #717 [d2e9fe6a / d2e9fe6a] +I0912 09:17:29.880062 12571 worker.go:540] commit new work on block 718 with 0 txs & 0 uncles. Took 693.95µs +I0912 09:17:30.418475 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.373858ms. #717 [4f598f1d / 4f598f1d] +I0912 09:17:31.488983 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.39777ms. #718 [ca9048bb / ca9048bb] +I0912 09:17:35.410484 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.745375ms. #718 [ca9048bb / ca9048bb] +I0912 09:17:35.412785 12571 worker.go:540] commit new work on block 719 with 0 txs & 1 uncles. Took 2.109369ms +I0912 09:17:41.087129 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.547064ms. #719 [14138bec / 14138bec] +I0912 09:17:41.088367 12571 worker.go:540] commit new work on block 720 with 0 txs & 1 uncles. Took 918.252µs +I0912 09:17:42.164033 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.244009ms. #720 [30a4bef1 / 30a4bef1] +I0912 09:17:44.925316 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.280441ms. #719 [14138bec / 14138bec] +I0912 09:17:45.408635 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.913936ms. #720 [30a4bef1 / 30a4bef1] +I0912 09:17:45.410278 12571 worker.go:540] commit new work on block 721 with 0 txs & 1 uncles. Took 1.491929ms +I0912 09:17:48.683133 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #714 [aa9dc9b8] import failed: block time is in the future: BlockFutureErr, 1442064116 > 1442063898 +I0912 09:17:49.771445 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.112824ms. #721 [085b67a6 / 085b67a6] +I0912 09:17:49.773111 12571 worker.go:540] commit new work on block 722 with 0 txs & 1 uncles. Took 1.191992ms +I0912 09:17:53.336851 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.107092ms. #722 [b6b51dd8 / b6b51dd8] +I0912 09:17:55.408308 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.579755ms. #722 [b6b51dd8 / b6b51dd8] +I0912 09:17:55.410921 12571 worker.go:540] commit new work on block 723 with 0 txs & 1 uncles. Took 2.366462ms +I0912 09:17:55.943420 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.757196ms. #723 [0c1cb733 / 0c1cb733] +I0912 09:18:00.408404 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.674284ms. #723 [0c1cb733 / 0c1cb733] +I0912 09:18:00.409131 12571 worker.go:540] commit new work on block 724 with 0 txs & 0 uncles. Took 519.534µs +I0912 09:18:01.186044 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.592034ms. #724 [ffb7e0a4 / ffb7e0a4] +I0912 09:18:01.187472 12571 worker.go:540] commit new work on block 725 with 0 txs & 0 uncles. Took 552.581µs +I0912 09:18:01.196067 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.664119ms. #725 [00cdc6bd / 00cdc6bd] +I0912 09:18:03.055634 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.633955ms. #720 [30a4bef1 / 30a4bef1] +I0912 09:18:05.410280 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.579844ms. #725 [00cdc6bd / 00cdc6bd] +I0912 09:18:05.410969 12571 worker.go:540] commit new work on block 726 with 0 txs & 0 uncles. Took 478.077µs +I0912 09:18:05.595683 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.87579ms. #726 [3f5483ba / 3f5483ba] +I0912 09:18:05.596994 12571 worker.go:540] commit new work on block 727 with 0 txs & 0 uncles. Took 540.149µs +I0912 09:18:05.614294 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.673341ms. #727 [23a4a854 / 23a4a854] +I0912 09:18:05.616030 12571 worker.go:540] commit new work on block 728 with 0 txs & 0 uncles. Took 681.598µs +I0912 09:18:05.622956 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.16018ms. #728 [ec8a3559 / ec8a3559] +I0912 09:18:10.151894 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.617379ms. #728 [ea807032 / ea807032] +I0912 09:18:10.412493 12571 chain_manager.go:661] imported 1 block(s) (1 queued 0 ignored) including 0 txs in 14.733821ms. #728 [ec8a3559 / ea807032] +I0912 09:18:10.413448 12571 worker.go:540] commit new work on block 729 with 0 txs & 0 uncles. Took 462.346µs +I0912 09:18:10.703564 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.280716ms. #729 [f5689efc / f5689efc] +I0912 09:18:10.704648 12571 worker.go:540] commit new work on block 730 with 0 txs & 0 uncles. Took 667.151µs +I0912 09:18:11.023226 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.09989ms. #730 [e32efb53 / e32efb53] +I0912 09:18:11.031533 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 7.842482ms. #728 [ea807032 / ea807032] +I0912 09:18:14.842807 12571 chain_manager.go:661] imported 0 block(s) (0 queued 2 ignored) including 0 txs in 10.744983ms. #725 [ffb7e0a4 / 00cdc6bd] +I0912 09:18:15.409413 12571 chain_manager.go:661] imported 2 block(s) (0 queued 0 ignored) including 0 txs in 11.778061ms. #730 [ea807032 / e32efb53] +I0912 09:18:15.410358 12571 worker.go:540] commit new work on block 731 with 0 txs & 1 uncles. Took 815.365µs +I0912 09:18:24.032934 12571 chain_manager.go:661] imported 0 block(s) (0 queued 3 ignored) including 0 txs in 17.313364ms. #728 [3f5483ba / ec8a3559] +I0912 09:18:24.040334 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.246332ms. #731 [370bb633 / 370bb633] +I0912 09:18:24.041987 12571 worker.go:540] commit new work on block 732 with 0 txs & 1 uncles. Took 769.318µs +I0912 09:18:24.056449 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.243069ms. #732 [024d2660 / 024d2660] +I0912 09:18:24.059107 12571 worker.go:540] commit new work on block 733 with 0 txs & 1 uncles. Took 2.026103ms +I0912 09:18:27.801539 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.553658ms. #733 [df06eef9 / df06eef9] +I0912 09:18:27.804285 12571 worker.go:540] commit new work on block 734 with 0 txs & 1 uncles. Took 2.067401ms +I0912 09:18:30.863400 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.706199ms. #734 [6350da0e / 6350da0e] +I0912 09:18:35.410421 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.686666ms. #734 [6350da0e / 6350da0e] +I0912 09:18:35.412121 12571 worker.go:540] commit new work on block 735 with 0 txs & 0 uncles. Took 1.540817ms +I0912 09:18:41.951395 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.448791ms. #735 [210fa337 / 210fa337] +I0912 09:18:41.952296 12571 worker.go:540] commit new work on block 736 with 0 txs & 0 uncles. Took 595.706µs +I0912 09:18:47.010046 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.334801ms. #736 [5de83721 / 5de83721] +I0912 09:18:47.012058 12571 worker.go:540] commit new work on block 737 with 0 txs & 0 uncles. Took 1.28751ms +I0912 09:18:59.591592 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.317311ms. #737 [466be6ae / 466be6ae] +I0912 09:18:59.592573 12571 worker.go:540] commit new work on block 738 with 0 txs & 0 uncles. Took 609.076µs +I0912 09:19:02.147236 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.976307ms. #738 [1340fa1d / 1340fa1d] +I0912 09:19:05.410445 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.708837ms. #738 [1340fa1d / 1340fa1d] +I0912 09:19:05.411098 12571 worker.go:540] commit new work on block 739 with 0 txs & 0 uncles. Took 446.959µs +I0912 09:19:07.730364 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.80855ms. #739 [6305b021 / 6305b021] +I0912 09:19:07.731669 12571 worker.go:540] commit new work on block 740 with 0 txs & 0 uncles. Took 553.775µs +I0912 09:19:08.778032 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.243069ms. #740 [2b2ab4a5 / 2b2ab4a5] +I0912 09:19:10.405814 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.100534ms. #740 [2b2ab4a5 / 2b2ab4a5] +I0912 09:19:15.408578 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.839622ms. #740 [2b2ab4a5 / 2b2ab4a5] +I0912 09:19:15.409295 12571 worker.go:540] commit new work on block 741 with 0 txs & 0 uncles. Took 478.954µs +I0912 09:19:15.513791 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.906889ms. #741 [97206d21 / 97206d21] +I0912 09:19:15.515055 12571 worker.go:540] commit new work on block 742 with 0 txs & 0 uncles. Took 495.259µs +I0912 09:19:15.536858 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.337503ms. #742 [e28e11ba / e28e11ba] +I0912 09:19:15.543998 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 6.283453ms. #743 [6bf18f11 / 6bf18f11] +I0912 09:19:15.544995 12571 worker.go:540] commit new work on block 743 with 0 txs & 0 uncles. Took 7.921011ms +I0912 09:19:19.800986 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.270943ms. #739 [6305b021 / 6305b021] +I0912 09:19:20.410462 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.736817ms. #743 [6bf18f11 / 6bf18f11] +I0912 09:19:20.411195 12571 worker.go:540] commit new work on block 744 with 0 txs & 0 uncles. Took 498.621µs +I0912 09:19:25.317648 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.067702ms. #744 [80afd6ad / 80afd6ad] +I0912 09:19:25.318942 12571 worker.go:540] commit new work on block 745 with 0 txs & 0 uncles. Took 501.542µs +I0912 09:19:25.335436 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.850635ms. #745 [dc8713b5 / dc8713b5] +I0912 09:19:25.337327 12571 worker.go:540] commit new work on block 746 with 0 txs & 0 uncles. Took 722.053µs +I0912 09:19:25.350754 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.521977ms. #746 [33603986 / 33603986] +I0912 09:19:25.351748 12571 worker.go:540] commit new work on block 747 with 0 txs & 0 uncles. Took 633.808µs +I0912 09:19:28.907187 12571 chain_manager.go:661] imported 0 block(s) (0 queued 2 ignored) including 0 txs in 10.008617ms. #741 [2b2ab4a5 / 97206d21] +I0912 09:19:31.808702 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.200297ms. #747 [9f7159ae / 9f7159ae] +I0912 09:19:31.809714 12571 worker.go:540] commit new work on block 748 with 0 txs & 0 uncles. Took 597.259µs +I0912 09:19:38.372654 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.241661ms. #748 [2935dad2 / 2935dad2] +I0912 09:19:38.373774 12571 worker.go:540] commit new work on block 749 with 0 txs & 0 uncles. Took 679.175µs +I0912 09:19:39.445832 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 7.589873ms. #749 [a24ee37f / a24ee37f] +I0912 09:19:40.409755 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.021112ms. #749 [a24ee37f / a24ee37f] +I0912 09:19:40.869886 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.898512ms. #748 [2935dad2 / 2935dad2] +I0912 09:19:45.408189 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.426645ms. #749 [a24ee37f / a24ee37f] +I0912 09:19:45.408875 12571 worker.go:540] commit new work on block 750 with 0 txs & 0 uncles. Took 479.224µs +I0912 09:19:48.707648 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.462449ms. #750 [223332a5 / 223332a5] +I0912 09:19:48.708974 12571 worker.go:540] commit new work on block 751 with 0 txs & 0 uncles. Took 527.269µs +I0912 09:19:48.724945 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.178594ms. #751 [18318def / 18318def] +I0912 09:19:48.726654 12571 worker.go:540] commit new work on block 752 with 0 txs & 0 uncles. Took 684.652µs +I0912 09:19:48.740483 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.294464ms. #752 [3e9fe5af / 3e9fe5af] +I0912 09:19:48.742387 12571 worker.go:540] commit new work on block 753 with 0 txs & 0 uncles. Took 1.365393ms +I0912 09:19:49.776708 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.613665ms. #753 [a6318e0a / a6318e0a] +I0912 09:19:49.890687 12571 chain_manager.go:661] imported 0 block(s) (0 queued 2 ignored) including 0 txs in 12.795389ms. #750 [a24ee37f / 223332a5] +I0912 09:19:50.409251 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.560848ms. #753 [a6318e0a / a6318e0a] +I0912 09:19:52.171435 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.779738ms. #752 [3e9fe5af / 3e9fe5af] +I0912 09:19:55.412375 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.603237ms. #753 [a6318e0a / a6318e0a] +I0912 09:19:55.413817 12571 worker.go:540] commit new work on block 754 with 0 txs & 0 uncles. Took 978.511µs +I0912 09:19:55.521589 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.671636ms. #754 [c5e172b6 / c5e172b6] +I0912 09:19:55.522835 12571 worker.go:540] commit new work on block 755 with 0 txs & 0 uncles. Took 489.611µs +I0912 09:19:55.531419 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.394074ms. #755 [fadda047 / fadda047] +I0912 09:19:55.538477 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 6.759419ms. #755 [31af88ae / 31af88ae] +I0912 09:20:00.409919 12571 chain_manager.go:661] imported 2 block(s) (0 queued 0 ignored) including 0 txs in 12.17799ms. #755 [fadda047 / 31af88ae] +I0912 09:20:00.410826 12571 worker.go:540] commit new work on block 756 with 0 txs & 0 uncles. Took 548.197µs +I0912 09:20:00.752018 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 6.996848ms. #756 [4d451484 / 4d451484] +I0912 09:20:00.753632 12571 worker.go:540] commit new work on block 757 with 0 txs & 1 uncles. Took 1.253446ms +I0912 09:20:00.759935 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.801879ms. #756 [b330825e / b330825e] +I0912 09:20:00.769058 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.233119ms. #757 [65aad9f5 / 65aad9f5] +I0912 09:20:00.770581 12571 worker.go:540] commit new work on block 758 with 0 txs & 2 uncles. Took 928.451µs +I0912 09:20:00.777120 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 7.653546ms. #758 [f002fda3 / f002fda3] +I0912 09:20:05.350609 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.074682ms. #753 [fae2408c / fae2408c] +I0912 09:20:05.409097 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.524884ms. #758 [f002fda3 / f002fda3] +I0912 09:20:05.410287 12571 worker.go:540] commit new work on block 759 with 0 txs & 2 uncles. Took 976.664µs +I0912 09:20:05.434485 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.226301ms. #759 [7b9a56f7 / 7b9a56f7] +I0912 09:20:05.436201 12571 worker.go:540] commit new work on block 760 with 0 txs & 2 uncles. Took 862.252µs +I0912 09:20:05.450526 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.846725ms. #760 [0784a5f8 / 0784a5f8] +I0912 09:20:05.451787 12571 worker.go:540] commit new work on block 761 with 0 txs & 2 uncles. Took 946.445µs +I0912 09:20:05.458125 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.485326ms. #760 [e3cc9d2b / e3cc9d2b] +I0912 09:20:09.899587 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.999715ms. #761 [eec4fbb6 / eec4fbb6] +I0912 09:20:09.901814 12571 worker.go:540] commit new work on block 762 with 0 txs & 1 uncles. Took 1.799081ms +I0912 09:20:10.174241 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.610138ms. #753 [a6318e0a / a6318e0a] +I0912 09:20:16.955460 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.925896ms. #762 [849fd8d1 / 849fd8d1] +I0912 09:20:16.956873 12571 worker.go:540] commit new work on block 763 with 0 txs & 0 uncles. Took 916.471µs +I0912 09:20:17.505610 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.332685ms. #762 [3e540dbc / 3e540dbc] +I0912 09:20:18.561516 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.817585ms. #763 [c4b66d78 / c4b66d78] +I0912 09:20:19.276641 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.908803ms. #754 [c5e172b6 / c5e172b6] +I0912 09:20:20.409288 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.557724ms. #763 [c4b66d78 / c4b66d78] +I0912 09:20:21.475073 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.885002ms. #762 [849fd8d1 / 849fd8d1] +I0912 09:20:25.412542 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.801621ms. #763 [c4b66d78 / c4b66d78] +I0912 09:20:25.413937 12571 worker.go:540] commit new work on block 764 with 0 txs & 1 uncles. Took 1.004538ms +I0912 09:20:30.527071 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.553562ms. #764 [147d197a / 147d197a] +I0912 09:20:30.528756 12571 worker.go:540] commit new work on block 765 with 0 txs & 1 uncles. Took 890.731µs +I0912 09:20:30.547334 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.417906ms. #765 [86030579 / 86030579] +I0912 09:20:30.549242 12571 worker.go:540] commit new work on block 766 with 0 txs & 1 uncles. Took 1.445274ms +I0912 09:20:31.943448 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.577144ms. #766 [24f745ff / 24f745ff] +I0912 09:20:31.945541 12571 worker.go:540] commit new work on block 767 with 0 txs & 1 uncles. Took 1.61942ms +I0912 09:20:33.000223 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.01631ms. #767 [f5f577a8 / f5f577a8] +I0912 09:20:35.409401 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.63501ms. #767 [f5f577a8 / f5f577a8] +I0912 09:20:40.412195 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.451688ms. #767 [f5f577a8 / f5f577a8] +I0912 09:20:40.415036 12571 worker.go:540] commit new work on block 768 with 0 txs & 1 uncles. Took 2.546682ms +I0912 09:20:41.171781 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.234109ms. #768 [ee238ad6 / ee238ad6] +I0912 09:20:41.173212 12571 worker.go:540] commit new work on block 769 with 0 txs & 0 uncles. Took 548.362µs +I0912 09:20:41.179990 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 7.874551ms. #769 [3aa78898 / 3aa78898] +I0912 09:20:45.408710 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.978595ms. #769 [3aa78898 / 3aa78898] +I0912 09:20:45.409433 12571 worker.go:540] commit new work on block 770 with 0 txs & 0 uncles. Took 487.436µs +I0912 09:20:45.819457 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.855866ms. #770 [8823cc32 / 8823cc32] +I0912 09:20:45.820686 12571 worker.go:540] commit new work on block 771 with 0 txs & 0 uncles. Took 784.889µs +I0912 09:20:45.827164 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.596116ms. #770 [e41a4042 / e41a4042] +I0912 09:20:48.753306 12571 chain_manager.go:661] imported 0 block(s) (0 queued 2 ignored) including 0 txs in 12.256317ms. #764 [c4b66d78 / 147d197a] +I0912 09:20:49.351808 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.657536ms. #771 [ea0e2365 / ea0e2365] +I0912 09:20:49.353900 12571 worker.go:540] commit new work on block 772 with 0 txs & 1 uncles. Took 1.700223ms +I0912 09:20:55.941584 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.658759ms. #772 [59bc4e3a / 59bc4e3a] +I0912 09:20:55.942813 12571 worker.go:540] commit new work on block 773 with 0 txs & 1 uncles. Took 924.011µs +I0912 09:20:56.497533 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.445399ms. #772 [38f438af / 38f438af] +I0912 09:20:57.578375 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.653891ms. #773 [14808ea2 / 14808ea2] +I0912 09:21:00.407422 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.70332ms. #773 [14808ea2 / 14808ea2] +I0912 09:21:01.457549 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.659194ms. #772 [59bc4e3a / 59bc4e3a] +I0912 09:21:05.410514 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.795301ms. #773 [14808ea2 / 14808ea2] +I0912 09:21:05.411783 12571 worker.go:540] commit new work on block 774 with 0 txs & 2 uncles. Took 1.073496ms +I0912 09:21:09.887472 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.385685ms. #774 [f0d2267d / f0d2267d] +I0912 09:21:09.889278 12571 worker.go:540] commit new work on block 775 with 0 txs & 2 uncles. Took 916.028µs +I0912 09:21:09.903148 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.541714ms. #775 [ff073faa / ff073faa] +I0912 09:21:09.904481 12571 worker.go:540] commit new work on block 776 with 0 txs & 2 uncles. Took 940.048µs +I0912 09:21:09.911034 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.720579ms. #775 [27575846 / 27575846] +I0912 09:21:09.932346 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 21.00209ms. #776 [75e3de5f / 75e3de5f] +I0912 09:21:09.934038 12571 worker.go:540] commit new work on block 777 with 0 txs & 2 uncles. Took 1.033872ms +I0912 09:21:10.499546 12571 chain_manager.go:661] imported 0 block(s) (0 queued 2 ignored) including 0 txs in 10.183114ms. #774 [14808ea2 / f0d2267d] +I0912 09:21:11.451067 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.140085ms. #777 [549e630e / 549e630e] +I0912 09:21:15.408623 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.884817ms. #777 [549e630e / 549e630e] +I0912 09:21:15.409682 12571 worker.go:540] commit new work on block 778 with 0 txs & 2 uncles. Took 860.385µs +I0912 09:21:18.048017 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.958093ms. #778 [b38a1c5c / b38a1c5c] +I0912 09:21:18.049621 12571 worker.go:540] commit new work on block 779 with 0 txs & 1 uncles. Took 1.280832ms +I0912 09:21:19.611855 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.0143ms. #779 [8d248ddb / 8d248ddb] +I0912 09:21:20.409468 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.745056ms. #779 [8d248ddb / 8d248ddb] +I0912 09:21:25.412541 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.797001ms. #779 [8d248ddb / 8d248ddb] +I0912 09:21:25.413768 12571 worker.go:540] commit new work on block 780 with 0 txs & 1 uncles. Took 806.731µs +I0912 09:21:29.564413 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.43519ms. #780 [7cd22922 / 7cd22922] +I0912 09:21:29.566202 12571 worker.go:540] commit new work on block 781 with 0 txs & 1 uncles. Took 865.765µs +I0912 09:21:29.589656 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.1565ms. #781 [54d9e5fa / 54d9e5fa] +I0912 09:21:29.590664 12571 worker.go:540] commit new work on block 782 with 0 txs & 0 uncles. Took 652.425µs +I0912 09:21:47.689003 12571 chain_manager.go:661] imported 0 block(s) (0 queued 3 ignored) including 0 txs in 19.401259ms. #780 [b38a1c5c / 7cd22922] +I0912 09:21:49.400152 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.256475ms. #782 [27a486f9 / 27a486f9] +I0912 09:21:49.401630 12571 worker.go:540] commit new work on block 783 with 0 txs & 0 uncles. Took 823.943µs +I0912 09:21:55.497019 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.992216ms. #783 [bf356b21 / bf356b21] +I0912 09:21:55.497919 12571 worker.go:540] commit new work on block 784 with 0 txs & 0 uncles. Took 587.783µs +I0912 09:21:58.078048 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.093193ms. #784 [36f8756f / 36f8756f] +I0912 09:22:00.408574 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.829548ms. #784 [36f8756f / 36f8756f] +I0912 09:22:00.409262 12571 worker.go:540] commit new work on block 785 with 0 txs & 0 uncles. Took 464.486µs +I0912 09:22:01.174684 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 10.489937ms. #785 [b4400b58 / b4400b58] +I0912 09:22:04.572325 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.833363ms. #784 [36f8756f / 36f8756f] +I0912 09:22:05.410430 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.695639ms. #785 [b4400b58 / b4400b58] +I0912 09:22:05.411279 12571 worker.go:540] commit new work on block 786 with 0 txs & 0 uncles. Took 556.271µs +I0912 09:22:07.388291 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.74096ms. #786 [d168b30b / d168b30b] +I0912 09:22:07.390012 12571 worker.go:540] commit new work on block 787 with 0 txs & 0 uncles. Took 557.856µs +I0912 09:22:07.400368 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.694848ms. #787 [5dee4b89 / 5dee4b89] +I0912 09:22:10.412649 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.889332ms. #787 [5dee4b89 / 5dee4b89] +I0912 09:22:10.413476 12571 worker.go:540] commit new work on block 788 with 0 txs & 0 uncles. Took 460.747µs +I0912 09:22:13.642212 12571 chain_manager.go:661] imported 0 block(s) (0 queued 2 ignored) including 0 txs in 10.932929ms. #786 [b4400b58 / d168b30b] +I0912 09:22:17.489664 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.855161ms. #788 [588f444f / 588f444f] +I0912 09:22:17.490792 12571 worker.go:540] commit new work on block 789 with 0 txs & 0 uncles. Took 714.132µs +I0912 09:22:24.586657 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.404642ms. #789 [b27d0ae6 / b27d0ae6] +I0912 09:22:24.588584 12571 worker.go:540] commit new work on block 790 with 0 txs & 0 uncles. Took 1.362107ms +I0912 09:22:34.666928 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.113185ms. #790 [dc6374bb / dc6374bb] +I0912 09:22:34.668363 12571 worker.go:540] commit new work on block 791 with 0 txs & 0 uncles. Took 855.916µs +I0912 09:22:36.240470 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.855323ms. #791 [f259be6a / f259be6a] +I0912 09:22:37.763651 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 9.289472ms. #790 [dc6374bb / dc6374bb] +I0912 09:22:40.412712 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.949659ms. #791 [f259be6a / f259be6a] +I0912 09:22:40.413622 12571 worker.go:540] commit new work on block 792 with 0 txs & 0 uncles. Took 555.474µs +I0912 09:22:41.180912 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.513684ms. #792 [904c662b / 904c662b] +I0912 09:22:41.182001 12571 worker.go:540] commit new work on block 793 with 0 txs & 0 uncles. Took 724.066µs +I0912 09:22:41.723945 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.112648ms. #785 [ca1f00fd / ca1f00fd] +I0912 09:22:45.408249 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.520338ms. #785 [ca1f00fd / ca1f00fd] +I0912 09:22:46.819697 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.781406ms. #791 [f259be6a / f259be6a] +I0912 09:22:47.397558 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.733349ms. #793 [29376096 / 29376096] +I0912 09:22:47.398541 12571 worker.go:540] commit new work on block 794 with 0 txs & 0 uncles. Took 631.139µs +I0912 09:22:51.955762 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.258643ms. #794 [d02e7e02 / d02e7e02] +I0912 09:22:53.809123 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 7.845916ms. #793 [29376096 / 29376096] +I0912 09:22:55.412108 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.319017ms. #794 [d02e7e02 / d02e7e02] +I0912 09:22:55.414009 12571 worker.go:540] commit new work on block 795 with 0 txs & 0 uncles. Took 1.594211ms +I0912 09:23:02.871420 12571 chain_manager.go:661] imported 1 block(s) (0 queued 1 ignored) including 0 txs in 14.696288ms. #795 [d02e7e02 / e523e99d] +I0912 09:23:02.872399 12571 worker.go:540] commit new work on block 796 with 0 txs & 0 uncles. Took 703.714µs +I0912 09:23:02.877525 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 5.98387ms. #795 [e523e99d / e523e99d] +I0912 09:23:08.623790 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.759103ms. #796 [bff69023 / bff69023] +I0912 09:23:08.624966 12571 worker.go:540] commit new work on block 797 with 0 txs & 0 uncles. Took 769.768µs +I0912 09:23:12.216202 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.252573ms. #797 [7236caeb / 7236caeb] +I0912 09:23:14.030719 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 9.15663ms. #796 [bff69023 / bff69023] +I0912 09:23:15.408711 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.983169ms. #797 [7236caeb / 7236caeb] +I0912 09:23:15.409550 12571 worker.go:540] commit new work on block 798 with 0 txs & 0 uncles. Took 627.019µs +I0912 09:23:16.892253 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.494399ms. #798 [f9adc0cc / f9adc0cc] +I0912 09:23:16.893875 12571 worker.go:540] commit new work on block 799 with 0 txs & 0 uncles. Took 507.267µs +I0912 09:23:16.904267 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.634706ms. #799 [b3d4272e / b3d4272e] +I0912 09:23:20.410354 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.620039ms. #799 [b3d4272e / b3d4272e] +I0912 09:23:20.411007 12571 worker.go:540] commit new work on block 800 with 0 txs & 0 uncles. Took 457.669µs +I0912 09:23:23.074257 12571 chain_manager.go:661] imported 0 block(s) (0 queued 2 ignored) including 0 txs in 10.777918ms. #798 [7236caeb / f9adc0cc] +I0912 09:23:23.986075 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.118186ms. #800 [5e47321e / 5e47321e] +I0912 09:23:23.987009 12571 worker.go:540] commit new work on block 801 with 0 txs & 0 uncles. Took 594.183µs +I0912 09:23:24.545163 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.088639ms. #800 [0c448bf3 / 0c448bf3] +I0912 09:23:25.631494 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.652991ms. #801 [5a6121b5 / 5a6121b5] +I0912 09:23:28.005170 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.380491ms. #800 [5e47321e / 5e47321e] +I0912 09:23:30.408544 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.811237ms. #801 [5a6121b5 / 5a6121b5] +I0912 09:23:30.409664 12571 worker.go:540] commit new work on block 802 with 0 txs & 1 uncles. Took 894.782µs +I0912 09:23:33.692173 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.873498ms. #802 [ed00cfed / ed00cfed] +I0912 09:23:33.695084 12571 worker.go:540] commit new work on block 803 with 0 txs & 1 uncles. Took 2.50461ms +I0912 09:23:37.016912 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.819594ms. #801 [5a6121b5 / 5a6121b5] +I0912 09:23:40.313107 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.378326ms. #803 [072e7bb1 / 072e7bb1] +I0912 09:23:40.316330 12571 worker.go:540] commit new work on block 804 with 0 txs & 1 uncles. Took 2.359396ms +I0912 09:23:41.399478 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.795647ms. #804 [5c0e07f2 / 5c0e07f2] +I0912 09:23:41.941219 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.511595ms. #804 [f2ac3112 / f2ac3112] +I0912 09:23:42.799697 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 5.994433ms. #803 [072e7bb1 / 072e7bb1] +I0912 09:23:45.409114 12571 chain_manager.go:661] imported 2 block(s) (0 queued 0 ignored) including 0 txs in 11.377677ms. #804 [5c0e07f2 / f2ac3112] +I0912 09:23:45.410426 12571 worker.go:540] commit new work on block 805 with 0 txs & 1 uncles. Took 1.002091ms +I0912 09:23:45.670226 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 10.099759ms. #805 [4eab623c / 4eab623c] +I0912 09:23:50.410484 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.722478ms. #805 [4eab623c / 4eab623c] +I0912 09:23:50.411528 12571 worker.go:540] commit new work on block 806 with 0 txs & 2 uncles. Took 833.99µs +I0912 09:23:50.778960 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.187752ms. #806 [8d4ced1c / 8d4ced1c] +I0912 09:23:50.789259 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.176483ms. #806 [96bdc289 / 96bdc289] +I0912 09:23:50.789651 12571 worker.go:540] commit new work on block 807 with 0 txs & 1 uncles. Took 10.271585ms +I0912 09:23:50.797664 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.277201ms. #807 [5f196a9f / 5f196a9f] +I0912 09:23:50.799054 12571 worker.go:540] commit new work on block 808 with 0 txs & 2 uncles. Took 1.053074ms +I0912 09:23:50.820483 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.23938ms. #807 [60930650 / 60930650] +I0912 09:23:55.414452 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.300484ms. #808 [260508d3 / 260508d3] +I0912 09:23:55.415884 12571 worker.go:540] commit new work on block 809 with 0 txs & 2 uncles. Took 1.064526ms +I0912 09:23:59.505648 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.369508ms. #809 [d33ef6bc / d33ef6bc] +I0912 09:24:00.070421 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.255197ms. #809 [f70a7d4d / f70a7d4d] +I0912 09:24:00.071817 12571 worker.go:540] commit new work on block 810 with 0 txs & 2 uncles. Took 1.03211ms +I0912 09:24:00.406759 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.189255ms. #809 [d33ef6bc / d33ef6bc] +I0912 09:24:00.924104 12571 chain_manager.go:661] imported 0 block(s) (0 queued 2 ignored) including 0 txs in 9.404487ms. #805 [5c0e07f2 / 4eab623c] +I0912 09:24:01.127899 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 7.31047ms. #810 [27dd58bc / 27dd58bc] +I0912 09:24:01.536918 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 7.792405ms. #809 [d33ef6bc / d33ef6bc] +I0912 09:24:01.858653 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #810 [05e76e03] import failed: block time is in the future: BlockFutureErr, 1442064534 > 1442064271 +I0912 09:24:02.481535 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #810 [05e76e03] import failed: block time is in the future: BlockFutureErr, 1442064534 > 1442064272 +I0912 09:24:05.410692 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.967206ms. #810 [27dd58bc / 27dd58bc] +I0912 09:24:05.413645 12571 worker.go:540] commit new work on block 811 with 0 txs & 2 uncles. Took 2.803316ms +I0912 09:24:09.707595 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.27192ms. #811 [25694317 / 25694317] +I0912 09:24:09.709198 12571 worker.go:540] commit new work on block 812 with 0 txs & 2 uncles. Took 1.276519ms +I0912 09:24:10.618836 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.696756ms. #810 [27dd58bc / 27dd58bc] +I0912 09:24:10.764681 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.324856ms. #812 [5f997680 / 5f997680] +I0912 09:24:13.076479 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 12.202361ms. #811 [25694317 / 25694317] +I0912 09:24:15.408495 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.753071ms. #812 [5f997680 / 5f997680] +I0912 09:24:15.409791 12571 worker.go:540] commit new work on block 813 with 0 txs & 1 uncles. Took 960.323µs +I0912 09:24:16.915697 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.758408ms. #813 [0b03bd1b / 0b03bd1b] +I0912 09:24:16.917350 12571 worker.go:540] commit new work on block 814 with 0 txs & 0 uncles. Took 513.599µs +I0912 09:24:16.927240 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.155726ms. #814 [4c8db330 / 4c8db330] +I0912 09:24:20.410492 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.762464ms. #814 [4c8db330 / 4c8db330] +I0912 09:24:20.411171 12571 worker.go:540] commit new work on block 815 with 0 txs & 0 uncles. Took 464.032µs +I0912 09:24:22.117672 12571 chain_manager.go:661] imported 0 block(s) (0 queued 2 ignored) including 0 txs in 9.73985ms. #813 [5f997680 / 0b03bd1b] +I0912 09:24:22.132115 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.386373ms. #815 [998af56f / 998af56f] +I0912 09:24:22.133345 12571 worker.go:540] commit new work on block 816 with 0 txs & 0 uncles. Took 847.138µs +I0912 09:24:27.562482 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.508675ms. #816 [d024b957 / d024b957] +I0912 09:24:27.563524 12571 worker.go:540] commit new work on block 817 with 0 txs & 0 uncles. Took 674.723µs +I0912 09:24:35.636059 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.52ms. #817 [2a0c5941 / 2a0c5941] +I0912 09:24:35.637551 12571 worker.go:540] commit new work on block 818 with 0 txs & 0 uncles. Took 1.093179ms +I0912 09:24:37.207685 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.192689ms. #818 [6ff2ff85 / 6ff2ff85] +I0912 09:24:37.702999 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 9.74904ms. #817 [2a0c5941 / 2a0c5941] +I0912 09:24:40.412969 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 15.203418ms. #818 [6ff2ff85 / 6ff2ff85] +I0912 09:24:40.413657 12571 worker.go:540] commit new work on block 819 with 0 txs & 0 uncles. Took 469.811µs +I0912 09:24:40.771370 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.641465ms. #819 [d31606a4 / d31606a4] +I0912 09:24:45.408345 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.610783ms. #819 [d31606a4 / d31606a4] +I0912 09:24:45.409147 12571 worker.go:540] commit new work on block 820 with 0 txs & 0 uncles. Took 566.652µs +I0912 09:24:46.761403 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.44407ms. #818 [6ff2ff85 / 6ff2ff85] +I0912 09:24:49.860789 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 17.523328ms. #820 [bd26e87d / bd26e87d] +I0912 09:24:49.863144 12571 worker.go:540] commit new work on block 821 with 0 txs & 0 uncles. Took 878.383µs +I0912 09:24:51.403246 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.271032ms. #821 [65ebc868 / 65ebc868] +I0912 09:24:51.935188 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 10.080994ms. #821 [8e81db17 / 8e81db17] +I0912 09:24:53.104966 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.818869ms. #820 [bd26e87d / bd26e87d] +I0912 09:24:55.413448 12571 chain_manager.go:661] imported 2 block(s) (0 queued 0 ignored) including 0 txs in 15.784729ms. #821 [65ebc868 / 8e81db17] +I0912 09:24:55.414722 12571 worker.go:540] commit new work on block 822 with 0 txs & 0 uncles. Took 1.074139ms +I0912 09:24:59.111925 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.257297ms. #822 [a1adacda / a1adacda] +I0912 09:24:59.114090 12571 worker.go:540] commit new work on block 823 with 0 txs & 1 uncles. Took 1.837524ms +I0912 09:24:59.661060 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.509066ms. #822 [a889bbc8 / a889bbc8] +I0912 09:25:02.158259 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.397914ms. #821 [65ebc868 / 65ebc868] +I0912 09:25:06.730517 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.463527ms. #823 [7003a359 / 7003a359] +I0912 09:25:06.731918 12571 worker.go:540] commit new work on block 824 with 0 txs & 2 uncles. Took 1.058361ms +I0912 09:25:09.312322 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.977262ms. #824 [84d41131 / 84d41131] +I0912 09:25:10.410122 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.386431ms. #824 [84d41131 / 84d41131] +I0912 09:25:11.935099 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.617222ms. #823 [7003a359 / 7003a359] +I0912 09:25:15.408505 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.759515ms. #824 [84d41131 / 84d41131] +I0912 09:25:15.409711 12571 worker.go:540] commit new work on block 825 with 0 txs & 2 uncles. Took 944.527µs +I0912 09:25:15.453032 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.510811ms. #825 [dc53333f / dc53333f] +I0912 09:25:15.454684 12571 worker.go:540] commit new work on block 826 with 0 txs & 2 uncles. Took 920.476µs +I0912 09:25:20.985618 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.267542ms. #824 [84d41131 / 84d41131] +I0912 09:25:23.481866 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.882852ms. #826 [4563f9f3 / 4563f9f3] +I0912 09:25:23.483307 12571 worker.go:540] commit new work on block 827 with 0 txs & 2 uncles. Took 1.053941ms +I0912 09:25:27.549870 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.106681ms. #827 [97ee8370 / 97ee8370] +I0912 09:25:30.408518 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.77217ms. #827 [97ee8370 / 97ee8370] +I0912 09:25:30.409561 12571 worker.go:540] commit new work on block 828 with 0 txs & 1 uncles. Took 813.283µs +I0912 09:25:31.108479 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.897829ms. #828 [e6b83ee7 / e6b83ee7] +I0912 09:25:32.051059 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.70139ms. #828 [77c799e6 / 77c799e6] +I0912 09:25:32.051983 12571 worker.go:540] commit new work on block 829 with 0 txs & 0 uncles. Took 610.093µs +I0912 09:25:35.410515 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.73413ms. #828 [e6b83ee7 / e6b83ee7] +I0912 09:25:36.742320 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.01364ms. #829 [cf711658 / cf711658] +I0912 09:25:36.743816 12571 worker.go:540] commit new work on block 830 with 0 txs & 0 uncles. Took 559.119µs +I0912 09:25:39.812613 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.942945ms. #830 [eac405e1 / eac405e1] +I0912 09:25:40.409674 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.941394ms. #830 [eac405e1 / eac405e1] +I0912 09:25:41.641257 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.010486ms. #829 [cf711658 / cf711658] +I0912 09:25:45.408409 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.67184ms. #830 [eac405e1 / eac405e1] +I0912 09:25:45.409101 12571 worker.go:540] commit new work on block 831 with 0 txs & 0 uncles. Took 482.61µs +I0912 09:25:50.139808 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.705609ms. #831 [245c8be6 / 245c8be6] +I0912 09:25:50.141271 12571 worker.go:540] commit new work on block 832 with 0 txs & 0 uncles. Took 905.709µs +I0912 09:25:50.147611 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.643436ms. #831 [608980ef / 608980ef] +I0912 09:25:50.712775 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.217543ms. #830 [eac405e1 / eac405e1] +I0912 09:25:59.839616 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.926416ms. #831 [608980ef / 608980ef] +I0912 09:26:04.373389 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.787959ms. #831 [608980ef / 608980ef] +I0912 09:26:22.414567 12571 chain_manager.go:661] imported 2 block(s) (0 queued 0 ignored) including 0 txs in 15.914154ms. #833 [532b871f / 24adb5a5] +I0912 09:26:22.415313 12571 worker.go:540] commit new work on block 834 with 0 txs & 0 uncles. Took 558.574µs +I0912 09:26:22.469333 12571 chain_manager.go:661] imported 5 block(s) (0 queued 0 ignored) including 0 txs in 25.608993ms. #838 [707ec8ef / 1a2729b1] +I0912 09:26:22.470299 12571 worker.go:540] commit new work on block 839 with 0 txs & 0 uncles. Took 663.632µs +I0912 09:26:22.475449 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 5.994529ms. #834 [707ec8ef / 707ec8ef] +I0912 09:26:22.489222 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.41377ms. #837 [64f4157b / 64f4157b] +I0912 09:26:22.498655 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.310469ms. #839 [cd18df24 / cd18df24] +I0912 09:26:22.500206 12571 worker.go:540] commit new work on block 840 with 0 txs & 1 uncles. Took 861.577µs +I0912 09:26:25.713150 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.917015ms. #840 [a20f47e1 / a20f47e1] +I0912 09:26:25.714541 12571 worker.go:540] commit new work on block 841 with 0 txs & 1 uncles. Took 1.027ms +I0912 09:26:33.293773 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.186838ms. #841 [8505e20f / 8505e20f] +I0912 09:26:33.295102 12571 worker.go:540] commit new work on block 842 with 0 txs & 1 uncles. Took 956.115µs +I0912 09:26:37.385157 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.320194ms. #842 [1325133c / 1325133c] +I0912 09:26:37.388229 12571 worker.go:540] commit new work on block 843 with 0 txs & 1 uncles. Took 2.404159ms +I0912 09:26:37.939613 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.465968ms. #842 [48c159b4 / 48c159b4] +I0912 09:26:41.972933 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.128053ms. #843 [00e11fb3 / 00e11fb3] +I0912 09:26:45.408618 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.878007ms. #843 [00e11fb3 / 00e11fb3] +I0912 09:26:45.409660 12571 worker.go:540] commit new work on block 844 with 0 txs & 1 uncles. Took 816.961µs +I0912 09:26:51.095370 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.414384ms. #844 [66647582 / 66647582] +I0912 09:26:51.096633 12571 worker.go:540] commit new work on block 845 with 0 txs & 1 uncles. Took 953.138µs +I0912 09:26:52.633268 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.327583ms. #845 [8205e272 / 8205e272] +I0912 09:26:53.986932 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 9.942373ms. #844 [66647582 / 66647582] +I0912 09:26:55.412827 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 15.066638ms. #845 [8205e272 / 8205e272] +I0912 09:26:55.415289 12571 worker.go:540] commit new work on block 846 with 0 txs & 1 uncles. Took 2.210186ms +I0912 09:26:59.327097 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.747661ms. #846 [26386ddb / 26386ddb] +I0912 09:26:59.328907 12571 worker.go:540] commit new work on block 847 with 0 txs & 1 uncles. Took 862.424µs +I0912 09:26:59.347563 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.6846ms. #847 [c4729536 / c4729536] +I0912 09:26:59.349791 12571 worker.go:540] commit new work on block 848 with 0 txs & 1 uncles. Took 959.805µs +I0912 09:27:03.047369 12571 chain_manager.go:661] imported 0 block(s) (0 queued 2 ignored) including 0 txs in 10.571307ms. #846 [8205e272 / 26386ddb] +I0912 09:27:05.908075 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.205331ms. #848 [ef7c31b4 / ef7c31b4] +I0912 09:27:05.909398 12571 worker.go:540] commit new work on block 849 with 0 txs & 0 uncles. Took 584.109µs +I0912 09:27:10.488191 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.707024ms. #849 [0336e819 / 0336e819] +I0912 09:27:10.489968 12571 worker.go:540] commit new work on block 850 with 0 txs & 0 uncles. Took 1.39266ms +I0912 09:27:17.075295 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.850205ms. #850 [9e30303f / 9e30303f] +I0912 09:27:17.076196 12571 worker.go:540] commit new work on block 851 with 0 txs & 0 uncles. Took 585.943µs +I0912 09:27:17.628741 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.696103ms. #850 [eef849d0 / eef849d0] +I0912 09:27:23.219770 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.049936ms. #851 [aaf86fa0 / aaf86fa0] +I0912 09:27:23.221278 12571 worker.go:540] commit new work on block 852 with 0 txs & 1 uncles. Took 1.187385ms +I0912 09:27:23.781707 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.504866ms. #851 [1998233d / 1998233d] +I0912 09:27:34.363930 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.596917ms. #852 [dcf25bea / dcf25bea] +I0912 09:27:34.366494 12571 worker.go:540] commit new work on block 853 with 0 txs & 2 uncles. Took 2.152243ms +I0912 09:27:36.942197 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.12141ms. #853 [91951f14 / 91951f14] +I0912 09:27:37.677367 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.156696ms. #852 [dcf25bea / dcf25bea] +I0912 09:27:40.412271 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.51742ms. #853 [91951f14 / 91951f14] +I0912 09:27:40.414245 12571 worker.go:540] commit new work on block 854 with 0 txs & 2 uncles. Took 1.663313ms +I0912 09:27:41.013503 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 15.321224ms. #854 [8e62f60b / 8e62f60b] +I0912 09:27:41.016655 12571 worker.go:540] commit new work on block 855 with 0 txs & 2 uncles. Took 2.45473ms +I0912 09:27:45.103183 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.881049ms. #855 [b2e314c1 / b2e314c1] +I0912 09:27:45.113865 12571 worker.go:540] commit new work on block 856 with 0 txs & 2 uncles. Took 10.378212ms +I0912 09:27:46.681095 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.262918ms. #856 [541fe857 / 541fe857] +I0912 09:27:46.737598 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.23918ms. #853 [91951f14 / 91951f14] +I0912 09:27:47.756568 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.985086ms. #855 [b2e314c1 / b2e314c1] +I0912 09:27:50.410404 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.647632ms. #856 [541fe857 / 541fe857] +I0912 09:27:50.411459 12571 worker.go:540] commit new work on block 857 with 0 txs & 1 uncles. Took 811.149µs +I0912 09:27:51.417231 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.873192ms. #857 [784e1b56 / 784e1b56] +I0912 09:27:51.418681 12571 worker.go:540] commit new work on block 858 with 0 txs & 0 uncles. Took 519.725µs +I0912 09:27:51.424674 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 7.064678ms. #858 [fc534234 / fc534234] +I0912 09:27:55.412189 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.443831ms. #858 [fc534234 / fc534234] +I0912 09:27:55.413295 12571 worker.go:540] commit new work on block 859 with 0 txs & 0 uncles. Took 631.013µs +I0912 09:27:55.519730 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.765462ms. #859 [709bb532 / 709bb532] +I0912 09:27:55.521391 12571 worker.go:540] commit new work on block 860 with 0 txs & 0 uncles. Took 489.596µs +I0912 09:27:55.531579 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.428611ms. #860 [2b6e55b6 / 2b6e55b6] +I0912 09:27:56.617473 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 25.039115ms. #853 [ee19e1b9 / ee19e1b9] +I0912 09:27:56.866204 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.75008ms. #856 [541fe857 / 541fe857] +I0912 09:28:00.409742 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.966612ms. #860 [2b6e55b6 / 2b6e55b6] +I0912 09:28:00.411583 12571 worker.go:540] commit new work on block 861 with 0 txs & 0 uncles. Took 1.333216ms +I0912 09:28:02.195399 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.418807ms. #861 [95541a49 / 95541a49] +I0912 09:28:02.196820 12571 worker.go:540] commit new work on block 862 with 0 txs & 0 uncles. Took 519.633µs +I0912 09:28:02.214210 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.585311ms. #862 [1cc10c88 / 1cc10c88] +I0912 09:28:02.215136 12571 worker.go:540] commit new work on block 863 with 0 txs & 0 uncles. Took 579.868µs +I0912 09:28:02.747078 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.37574ms. #862 [a3875aea / a3875aea] +I0912 09:28:06.379280 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 12.123094ms. #859 [709bb532 / 709bb532] +I0912 09:28:06.514256 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.469931ms. #860 [2b6e55b6 / 2b6e55b6] +I0912 09:28:08.351321 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.999218ms. #863 [0a819024 / 0a819024] +I0912 09:28:08.353202 12571 worker.go:540] commit new work on block 864 with 0 txs & 1 uncles. Took 1.453112ms +I0912 09:28:09.403772 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.095823ms. #864 [6c0e9d19 / 6c0e9d19] +I0912 09:28:10.409755 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.004724ms. #864 [6c0e9d19 / 6c0e9d19] +I0912 09:28:15.408550 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.801471ms. #864 [6c0e9d19 / 6c0e9d19] +I0912 09:28:15.409733 12571 worker.go:540] commit new work on block 865 with 0 txs & 1 uncles. Took 982.316µs +I0912 09:28:15.480662 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.196155ms. #861 [95541a49 / 95541a49] +I0912 09:28:15.487976 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.063808ms. #865 [210064da / 210064da] +I0912 09:28:15.489649 12571 worker.go:540] commit new work on block 866 with 0 txs & 1 uncles. Took 828.6µs +I0912 09:28:15.496314 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 7.95497ms. #866 [bea94db0 / bea94db0] +I0912 09:28:17.790586 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.619449ms. #865 [210064da / 210064da] +I0912 09:28:20.410264 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.529356ms. #866 [bea94db0 / bea94db0] +I0912 09:28:20.411242 12571 worker.go:540] commit new work on block 867 with 0 txs & 1 uncles. Took 791.703µs +I0912 09:28:25.534497 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.411062ms. #867 [103fa0f9 / 103fa0f9] +I0912 09:28:25.536205 12571 worker.go:540] commit new work on block 868 with 0 txs & 1 uncles. Took 826.483µs +I0912 09:28:25.557650 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.020179ms. #868 [3ae87195 / 3ae87195] +I0912 09:28:25.559014 12571 worker.go:540] commit new work on block 869 with 0 txs & 0 uncles. Took 524.117µs +I0912 09:28:25.576161 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.187107ms. #869 [f5981a28 / f5981a28] +I0912 09:28:25.577966 12571 worker.go:540] commit new work on block 870 with 0 txs & 0 uncles. Took 840.321µs +I0912 09:28:26.698835 12571 chain_manager.go:661] imported 0 block(s) (0 queued 2 ignored) including 0 txs in 10.333739ms. #867 [bea94db0 / 103fa0f9] +I0912 09:28:26.879371 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 10.010289ms. #870 [ffcdd700 / ffcdd700] +I0912 09:28:27.811441 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.63538ms. #869 [f5981a28 / f5981a28] +I0912 09:28:30.408433 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.712189ms. #870 [ffcdd700 / ffcdd700] +I0912 09:28:30.409200 12571 worker.go:540] commit new work on block 871 with 0 txs & 0 uncles. Took 535.158µs +I0912 09:28:31.521365 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.681368ms. #871 [e239d9f9 / e239d9f9] +I0912 09:28:31.522340 12571 worker.go:540] commit new work on block 872 with 0 txs & 0 uncles. Took 622.302µs +I0912 09:28:43.115816 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.211844ms. #872 [7251a6a8 / 7251a6a8] +I0912 09:28:43.117122 12571 worker.go:540] commit new work on block 873 with 0 txs & 0 uncles. Took 871.867µs +I0912 09:28:45.201064 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 11.931257ms. #873 [ccd0c85c / ccd0c85c] +I0912 09:28:45.406010 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 8.440034ms. #873 [ccd0c85c / ccd0c85c] +I0912 09:28:45.835951 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.941556ms. #870 [ffcdd700 / ffcdd700] +I0912 09:28:47.721600 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.220921ms. #872 [7251a6a8 / 7251a6a8] +I0912 09:28:50.410562 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.835362ms. #873 [ccd0c85c / ccd0c85c] +I0912 09:28:50.411390 12571 worker.go:540] commit new work on block 874 with 0 txs & 0 uncles. Took 651.52µs +I0912 09:28:50.805449 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.608718ms. #874 [2ff274b9 / 2ff274b9] +I0912 09:28:50.806346 12571 worker.go:540] commit new work on block 875 with 0 txs & 0 uncles. Took 585.916µs +I0912 09:28:51.870337 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.205674ms. #875 [81e2f275 / 81e2f275] +I0912 09:28:55.413544 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 15.793224ms. #875 [81e2f275 / 81e2f275] +I0912 09:28:55.414391 12571 worker.go:540] commit new work on block 876 with 0 txs & 0 uncles. Took 573.946µs +I0912 09:29:14.925824 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.670273ms. #873 [ccd0c85c / ccd0c85c] +I0912 09:35:48.163480 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 7.041497ms. #875 [0e241814 / 0e241814] +I0912 09:35:56.828259 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #876 [703303c7] import failed: block time is in the future: BlockFutureErr, 1442065242 > 1442064986 +I0912 09:35:57.720302 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 8.639444ms. #875 [0e241814 / 0e241814] +I0912 09:38:37.125565 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.897371ms. #876 [c068a38a / c068a38a] +I0912 09:38:37.126749 12571 worker.go:540] commit new work on block 877 with 0 txs & 1 uncles. Took 815.578µs +I0912 09:42:42.912644 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 14.648084ms. #877 [e510e273 / e510e273] +I0912 09:42:42.914267 12571 worker.go:540] commit new work on block 878 with 0 txs & 0 uncles. Took 676.571µs +I0912 09:46:01.606996 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.574554ms. #878 [4ea0ac4d / 4ea0ac4d] +I0912 09:46:01.609228 12571 worker.go:540] commit new work on block 879 with 0 txs & 0 uncles. Took 1.548291ms +I0912 10:00:31.333027 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.383114ms. #879 [c9d9701a / c9d9701a] +I0912 10:00:31.335168 12571 worker.go:540] commit new work on block 880 with 0 txs & 0 uncles. Took 1.417545ms +I0912 10:01:21.667477 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #880 [59fb4acf] import failed: block time is in the future: BlockFutureErr, 1442066726 > 1442066511 +I0912 10:01:22.317144 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #880 [59fb4acf] import failed: block time is in the future: BlockFutureErr, 1442066726 > 1442066512 +I0912 10:01:27.814982 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 9.883604ms. #879 [c9d9701a / c9d9701a] +I0912 10:01:45.388854 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.068499ms. #880 [366f766f / 366f766f] +I0912 10:01:45.391218 12571 worker.go:540] commit new work on block 881 with 0 txs & 0 uncles. Took 1.43976ms +I0912 10:07:28.835951 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 8.82073ms. #881 [e98142c9 / e98142c9] +I0912 10:07:28.837152 12571 worker.go:540] commit new work on block 882 with 0 txs & 0 uncles. Took 755.878µs +I0912 10:12:16.065915 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 9.084629ms. #882 [b40c09da / b40c09da] +I0912 10:12:16.067209 12571 worker.go:540] commit new work on block 883 with 0 txs & 0 uncles. Took 536.362µs +I0912 10:13:22.851588 12571 fetcher.go:441] Peer 68c545b62f060dc7: block #883 [dd78de5c] import failed: block time is in the future: BlockFutureErr, 1442067458 > 1442067232 +I0912 10:13:28.199868 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 7.829528ms. #882 [b40c09da / b40c09da] +I0912 10:14:08.040989 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.727112ms. #882 [b40c09da / b40c09da] +I0912 10:14:47.843658 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 9.17969ms. #882 [b40c09da / b40c09da] +I0912 10:15:17.833382 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 9.651246ms. #882 [b40c09da / b40c09da] +I0912 10:15:47.792954 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 11.713816ms. #882 [b40c09da / b40c09da] +I0912 10:16:26.049871 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 10.798581ms. #882 [b40c09da / b40c09da] +I0912 10:16:57.985049 12571 chain_manager.go:661] imported 0 block(s) (0 queued 1 ignored) including 0 txs in 7.962009ms. #882 [b40c09da / b40c09da] +I0912 10:16:58.963869 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 10.780636ms. #883 [1bf0db1f / 1bf0db1f] +I0912 10:16:58.965443 12571 worker.go:540] commit new work on block 884 with 0 txs & 0 uncles. Took 1.079362ms +I0912 10:17:25.163546 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.800125ms. #883 [dd78de5c / dd78de5c] +I0912 10:17:25.409802 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 12.044641ms. #883 [dd78de5c / dd78de5c] +I0912 10:17:30.407603 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.874114ms. #883 [dd78de5c / dd78de5c] +I0912 10:17:35.407008 12571 chain_manager.go:661] imported 0 block(s) (1 queued 0 ignored) including 0 txs in 9.323731ms. #883 [dd78de5c / dd78de5c] +I0912 10:17:40.410877 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 13.233241ms. #883 [dd78de5c / dd78de5c] +I0912 10:20:08.442328 12571 chain_manager.go:661] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 11.357341ms. #884 [f8b8e3af / f8b8e3af] +I0912 10:20:08.445192 12571 worker.go:540] commit new work on block 885 with 0 txs & 1 uncles. Took 1.95537ms diff --git a/eth/api.go b/exp/api.go similarity index 95% rename from eth/api.go rename to exp/api.go index 1d66f53fe5..2af6c6cd11 100644 --- a/eth/api.go +++ b/exp/api.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package eth +package exp import ( "bytes" @@ -31,23 +31,23 @@ import ( "sync" "time" - "github.com/ethereum/ethash" - "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/compiler" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/miner" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/rlp" - "github.com/ethereum/go-ethereum/rpc" + "github.com/expanse-project/ethash" + "github.com/expanse-project/go-expanse/accounts" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/common/compiler" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/event" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/miner" + "github.com/expanse-project/go-expanse/p2p" + "github.com/expanse-project/go-expanse/rlp" + "github.com/expanse-project/go-expanse/rpc" "github.com/syndtr/goleveldb/leveldb" "golang.org/x/net/context" ) @@ -99,15 +99,15 @@ func stateAndBlockByNumber(m *miner.Miner, bc *core.BlockChain, blockNr rpc.Bloc return stateDb, block, err } -// PublicEthereumAPI provides an API to access Ethereum related information. +// PublicEthereumAPI provides an API to access Expanse related information. // It offers only methods that operate on public data that is freely available to anyone. type PublicEthereumAPI struct { - e *Ethereum + e *Expanse gpo *GasPriceOracle } -// NewPublicEthereumAPI creates a new Ethereum protocol API. -func NewPublicEthereumAPI(e *Ethereum) *PublicEthereumAPI { +// NewPublicEthereumAPI creates a new Expanse protocol API. +func NewPublicEthereumAPI(e *Expanse) *PublicEthereumAPI { return &PublicEthereumAPI{ e: e, gpo: e.gpo, @@ -153,7 +153,7 @@ func (s *PublicEthereumAPI) Coinbase() (common.Address, error) { return s.Etherbase() } -// ProtocolVersion returns the current Ethereum protocol version this node supports +// ProtocolVersion returns the current Expanse protocol version this node supports func (s *PublicEthereumAPI) ProtocolVersion() *rpc.HexNumber { return rpc.NewHexNumber(s.e.EthVersion()) } @@ -190,12 +190,12 @@ func (s *PublicEthereumAPI) Syncing() (interface{}, error) { // PublicMinerAPI provides an API to control the miner. // It offers only methods that operate on data that pose no security risk when it is publicly accessible. type PublicMinerAPI struct { - e *Ethereum + e *Expanse agent *miner.RemoteAgent } // NewPublicMinerAPI create a new PublicMinerAPI instance. -func NewPublicMinerAPI(e *Ethereum) *PublicMinerAPI { +func NewPublicMinerAPI(e *Expanse) *PublicMinerAPI { agent := miner.NewRemoteAgent() e.Miner().Register(agent) @@ -242,11 +242,11 @@ func (s *PublicMinerAPI) SubmitHashrate(hashrate rpc.HexNumber, id common.Hash) // PrivateMinerAPI provides private RPC methods to control the miner. // These methods can be abused by external users and must be considered insecure for use by untrusted users. type PrivateMinerAPI struct { - e *Ethereum + e *Expanse } // NewPrivateMinerAPI create a new RPC service which controls the miner of this node. -func NewPrivateMinerAPI(e *Ethereum) *PrivateMinerAPI { +func NewPrivateMinerAPI(e *Expanse) *PrivateMinerAPI { return &PrivateMinerAPI{e: e} } @@ -315,11 +315,11 @@ func (s *PrivateMinerAPI) MakeDAG(blockNr rpc.BlockNumber) (bool, error) { // PublicTxPoolAPI offers and API for the transaction pool. It only operates on data that is non confidential. type PublicTxPoolAPI struct { - e *Ethereum + e *Expanse } // NewPublicTxPoolAPI creates a new tx pool service that gives information about the transaction pool. -func NewPublicTxPoolAPI(e *Ethereum) *PublicTxPoolAPI { +func NewPublicTxPoolAPI(e *Expanse) *PublicTxPoolAPI { return &PublicTxPoolAPI{e} } @@ -482,7 +482,7 @@ func (s *PrivateAccountAPI) LockAccount(addr common.Address) bool { return s.am.Lock(addr) == nil } -// PublicBlockChainAPI provides an API to access the Ethereum blockchain. +// PublicBlockChainAPI provides an API to access the Expanse blockchain. // It offers only methods that operate on public data that is freely available to anyone. type PublicBlockChainAPI struct { config *core.ChainConfig @@ -917,7 +917,7 @@ type PublicTransactionPoolAPI struct { } // NewPublicTransactionPoolAPI creates a new RPC service with methods specific for the transaction pool. -func NewPublicTransactionPoolAPI(e *Ethereum) *PublicTransactionPoolAPI { +func NewPublicTransactionPoolAPI(e *Expanse) *PublicTransactionPoolAPI { api := &PublicTransactionPoolAPI{ eventMux: e.eventMux, gpo: e.gpo, @@ -1437,18 +1437,18 @@ func (s *PublicTransactionPoolAPI) Resend(tx Tx, gasPrice, gasLimit *rpc.HexNumb // PrivateAdminAPI is the collection of Etheruem APIs exposed over the private // admin endpoint. type PrivateAdminAPI struct { - eth *Ethereum + exp *Expanse } // NewPrivateAdminAPI creates a new API definition for the private admin methods -// of the Ethereum service. -func NewPrivateAdminAPI(eth *Ethereum) *PrivateAdminAPI { - return &PrivateAdminAPI{eth: eth} +// of the Expanse service. +func NewPrivateAdminAPI(exp *Expanse) *PrivateAdminAPI { + return &PrivateAdminAPI{exp: exp} } // SetSolc sets the Solidity compiler path to be used by the node. func (api *PrivateAdminAPI) SetSolc(path string) (string, error) { - solc, err := api.eth.SetSolc(path) + solc, err := api.exp.SetSolc(path) if err != nil { return "", err } @@ -1465,7 +1465,7 @@ func (api *PrivateAdminAPI) ExportChain(file string) (bool, error) { defer out.Close() // Export the blockchain - if err := api.eth.BlockChain().Export(out); err != nil { + if err := api.exp.BlockChain().Export(out); err != nil { return false, err } return true, nil @@ -1510,12 +1510,12 @@ func (api *PrivateAdminAPI) ImportChain(file string) (bool, error) { break } - if hasAllBlocks(api.eth.BlockChain(), blocks) { + if hasAllBlocks(api.exp.BlockChain(), blocks) { blocks = blocks[:0] continue } // Import the batch and reset the buffer - if _, err := api.eth.BlockChain().InsertChain(blocks); err != nil { + if _, err := api.exp.BlockChain().InsertChain(blocks); err != nil { return false, fmt.Errorf("batch %d: failed to insert: %v", batch, err) } blocks = blocks[:0] @@ -1526,22 +1526,22 @@ func (api *PrivateAdminAPI) ImportChain(file string) (bool, error) { // PublicDebugAPI is the collection of Etheruem APIs exposed over the public // debugging endpoint. type PublicDebugAPI struct { - eth *Ethereum + exp *Expanse } // NewPublicDebugAPI creates a new API definition for the public debug methods -// of the Ethereum service. -func NewPublicDebugAPI(eth *Ethereum) *PublicDebugAPI { - return &PublicDebugAPI{eth: eth} +// of the Expanse service. +func NewPublicDebugAPI(exp *Expanse) *PublicDebugAPI { + return &PublicDebugAPI{exp: exp} } // DumpBlock retrieves the entire state of the database at a given block. func (api *PublicDebugAPI) DumpBlock(number uint64) (state.World, error) { - block := api.eth.BlockChain().GetBlockByNumber(number) + block := api.exp.BlockChain().GetBlockByNumber(number) if block == nil { return state.World{}, fmt.Errorf("block #%d not found", number) } - stateDb, err := state.New(block.Root(), api.eth.ChainDb()) + stateDb, err := state.New(block.Root(), api.exp.ChainDb()) if err != nil { return state.World{}, err } @@ -1550,7 +1550,7 @@ func (api *PublicDebugAPI) DumpBlock(number uint64) (state.World, error) { // GetBlockRlp retrieves the RLP encoded for of a single block. func (api *PublicDebugAPI) GetBlockRlp(number uint64) (string, error) { - block := api.eth.BlockChain().GetBlockByNumber(number) + block := api.exp.BlockChain().GetBlockByNumber(number) if block == nil { return "", fmt.Errorf("block #%d not found", number) } @@ -1563,7 +1563,7 @@ func (api *PublicDebugAPI) GetBlockRlp(number uint64) (string, error) { // PrintBlock retrieves a block and returns its pretty printed form. func (api *PublicDebugAPI) PrintBlock(number uint64) (string, error) { - block := api.eth.BlockChain().GetBlockByNumber(number) + block := api.exp.BlockChain().GetBlockByNumber(number) if block == nil { return "", fmt.Errorf("block #%d not found", number) } @@ -1572,7 +1572,7 @@ func (api *PublicDebugAPI) PrintBlock(number uint64) (string, error) { // SeedHash retrieves the seed hash of a block. func (api *PublicDebugAPI) SeedHash(number uint64) (string, error) { - block := api.eth.BlockChain().GetBlockByNumber(number) + block := api.exp.BlockChain().GetBlockByNumber(number) if block == nil { return "", fmt.Errorf("block #%d not found", number) } @@ -1587,18 +1587,18 @@ func (api *PublicDebugAPI) SeedHash(number uint64) (string, error) { // debugging endpoint. type PrivateDebugAPI struct { config *core.ChainConfig - eth *Ethereum + exp *Expanse } // NewPrivateDebugAPI creates a new API definition for the private debug methods -// of the Ethereum service. -func NewPrivateDebugAPI(config *core.ChainConfig, eth *Ethereum) *PrivateDebugAPI { - return &PrivateDebugAPI{config: config, eth: eth} +// of the Expanse service. +func NewPrivateDebugAPI(config *core.ChainConfig, exp *Expanse) *PrivateDebugAPI { + return &PrivateDebugAPI{config: config, exp: exp} } // ChaindbProperty returns leveldb properties of the chain database. func (api *PrivateDebugAPI) ChaindbProperty(property string) (string, error) { - ldb, ok := api.eth.chainDb.(interface { + ldb, ok := api.exp.chainDb.(interface { LDB() *leveldb.DB }) if !ok { @@ -1650,7 +1650,7 @@ func (api *PrivateDebugAPI) TraceBlockFromFile(file string, config *vm.Config) B // TraceProcessBlock processes the block by canonical block number. func (api *PrivateDebugAPI) TraceBlockByNumber(number uint64, config *vm.Config) BlockTraceResult { // Fetch the block that we aim to reprocess - block := api.eth.BlockChain().GetBlockByNumber(number) + block := api.exp.BlockChain().GetBlockByNumber(number) if block == nil { return BlockTraceResult{Error: fmt.Sprintf("block #%d not found", number)} } @@ -1666,7 +1666,7 @@ func (api *PrivateDebugAPI) TraceBlockByNumber(number uint64, config *vm.Config) // TraceBlockByHash processes the block by hash. func (api *PrivateDebugAPI) TraceBlockByHash(hash common.Hash, config *vm.Config) BlockTraceResult { // Fetch the block that we aim to reprocess - block := api.eth.BlockChain().GetBlock(hash) + block := api.exp.BlockChain().GetBlock(hash) if block == nil { return BlockTraceResult{Error: fmt.Sprintf("block #%x not found", hash)} } @@ -1695,7 +1695,7 @@ func (t *TraceCollector) AddStructLog(slog vm.StructLog) { func (api *PrivateDebugAPI) traceBlock(block *types.Block, config *vm.Config) (bool, []vm.StructLog, error) { // Validate and reprocess the block var ( - blockchain = api.eth.BlockChain() + blockchain = api.exp.BlockChain() validator = blockchain.Validator() processor = blockchain.Processor() collector = &TraceCollector{} @@ -1709,7 +1709,7 @@ func (api *PrivateDebugAPI) traceBlock(block *types.Block, config *vm.Config) (b if err := core.ValidateHeader(api.config, blockchain.AuxValidator(), block.Header(), blockchain.GetHeader(block.ParentHash()), true, false); err != nil { return false, collector.traces, err } - statedb, err := state.New(blockchain.GetBlock(block.ParentHash()).Root(), api.eth.ChainDb()) + statedb, err := state.New(blockchain.GetBlock(block.ParentHash()).Root(), api.exp.ChainDb()) if err != nil { return false, collector.traces, err } @@ -1726,7 +1726,7 @@ func (api *PrivateDebugAPI) traceBlock(block *types.Block, config *vm.Config) (b // SetHead rewinds the head of the blockchain to a previous block. func (api *PrivateDebugAPI) SetHead(number uint64) { - api.eth.BlockChain().SetHead(number) + api.exp.BlockChain().SetHead(number) } // ExecutionResult groups all structured logs emitted by the EVM @@ -1807,20 +1807,20 @@ func (s *PrivateDebugAPI) TraceTransaction(txHash common.Hash, logger *vm.LogCon logger = new(vm.LogConfig) } // Retrieve the tx from the chain and the containing block - tx, blockHash, _, txIndex := core.GetTransaction(s.eth.ChainDb(), txHash) + tx, blockHash, _, txIndex := core.GetTransaction(s.exp.ChainDb(), txHash) if tx == nil { return nil, fmt.Errorf("transaction %x not found", txHash) } - block := s.eth.BlockChain().GetBlock(blockHash) + block := s.exp.BlockChain().GetBlock(blockHash) if block == nil { return nil, fmt.Errorf("block %x not found", blockHash) } // Create the state database to mutate and eventually trace - parent := s.eth.BlockChain().GetBlock(block.ParentHash()) + parent := s.exp.BlockChain().GetBlock(block.ParentHash()) if parent == nil { return nil, fmt.Errorf("block parent %x not found", block.ParentHash()) } - stateDb, err := state.New(parent.Root(), s.eth.ChainDb()) + stateDb, err := state.New(parent.Root(), s.exp.ChainDb()) if err != nil { return nil, err } @@ -1841,7 +1841,7 @@ func (s *PrivateDebugAPI) TraceTransaction(txHash common.Hash, logger *vm.LogCon } // Mutate the state if we haven't reached the tracing transaction yet if uint64(idx) < txIndex { - vmenv := core.NewEnv(stateDb, s.config, s.eth.BlockChain(), msg, block.Header(), vm.Config{}) + vmenv := core.NewEnv(stateDb, s.config, s.exp.BlockChain(), msg, block.Header(), vm.Config{}) _, _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(tx.Gas())) if err != nil { return nil, fmt.Errorf("mutation failed: %v", err) @@ -1849,7 +1849,7 @@ func (s *PrivateDebugAPI) TraceTransaction(txHash common.Hash, logger *vm.LogCon continue } // Otherwise trace the transaction and return - vmenv := core.NewEnv(stateDb, s.config, s.eth.BlockChain(), msg, block.Header(), vm.Config{Debug: true, Logger: *logger}) + vmenv := core.NewEnv(stateDb, s.config, s.exp.BlockChain(), msg, block.Header(), vm.Config{Debug: true, Logger: *logger}) ret, gas, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(tx.Gas())) if err != nil { return nil, fmt.Errorf("tracing failed: %v", err) @@ -1936,7 +1936,7 @@ func (s *PublicNetAPI) PeerCount() *rpc.HexNumber { return rpc.NewHexNumber(s.net.PeerCount()) } -// ProtocolVersion returns the current ethereum protocol version. +// ProtocolVersion returns the current expanse protocol version. func (s *PublicNetAPI) Version() string { return fmt.Sprintf("%d", s.networkVersion) } diff --git a/eth/backend.go b/exp/backend.go similarity index 74% rename from eth/backend.go rename to exp/backend.go index f43dea7775..4c2e37b479 100644 --- a/eth/backend.go +++ b/exp/backend.go @@ -1,21 +1,21 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . -// Package eth implements the Ethereum protocol. -package eth +// Package exp implements the Expanse protocol. +package exp import ( "bytes" @@ -28,26 +28,26 @@ import ( "strings" "time" - "github.com/ethereum/ethash" - "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/compiler" - "github.com/ethereum/go-ethereum/common/httpclient" - "github.com/ethereum/go-ethereum/common/registrar/ethreg" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/eth/downloader" - "github.com/ethereum/go-ethereum/eth/filters" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/miner" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/rlp" - "github.com/ethereum/go-ethereum/rpc" + "github.com/expanse-project/ethash" + "github.com/expanse-project/go-expanse/accounts" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/common/compiler" + "github.com/expanse-project/go-expanse/common/httpclient" + "github.com/expanse-project/go-expanse/common/registrar/ethreg" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/exp/downloader" + "github.com/expanse-project/go-expanse/exp/filters" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/event" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/miner" + "github.com/expanse-project/go-expanse/node" + "github.com/expanse-project/go-expanse/p2p" + "github.com/expanse-project/go-expanse/rlp" + "github.com/expanse-project/go-expanse/rpc" ) const ( @@ -102,9 +102,9 @@ type Config struct { TestGenesisState ethdb.Database // Genesis state to seed the database with (testing only!) } -type Ethereum struct { +type Expanse struct { chainConfig *core.ChainConfig - // Channel for shutting down the ethereum + // Channel for shutting down the expanse shutdownChan chan bool // DB interfaces @@ -144,14 +144,14 @@ type Ethereum struct { netRPCService *PublicNetAPI } -func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { +func New(ctx *node.ServiceContext, config *Config) (*Expanse, error) { // Open the chain database and perform any upgrades needed chainDb, err := ctx.OpenDatabase("chaindata", config.DatabaseCache, config.DatabaseHandles) if err != nil { return nil, err } if db, ok := chainDb.(*ethdb.LDBDatabase); ok { - db.Meter("eth/db/chaindata/") + db.Meter("exp/db/chaindata/") } if err := upgradeChainDatabase(chainDb); err != nil { return nil, err @@ -165,7 +165,7 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { return nil, err } if db, ok := dappDb.(*ethdb.LDBDatabase); ok { - db.Meter("eth/db/dapp/") + db.Meter("exp/db/dapp/") } glog.V(logger.Info).Infof("Protocol Versions: %v, Network Id: %v", ProtocolVersions, config.NetworkId) @@ -192,13 +192,13 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { if !config.SkipBcVersionCheck { bcVersion := core.GetBlockChainVersion(chainDb) if bcVersion != config.BlockChainVersion && bcVersion != 0 { - return nil, fmt.Errorf("Blockchain DB version mismatch (%d / %d). Run geth upgradedb.\n", bcVersion, config.BlockChainVersion) + return nil, fmt.Errorf("Blockchain DB version mismatch (%d / %d). Run gexp upgradedb.\n", bcVersion, config.BlockChainVersion) } core.WriteBlockChainVersion(chainDb, config.BlockChainVersion) } glog.V(logger.Info).Infof("Blockchain DB Version: %d", config.BlockChainVersion) - eth := &Ethereum{ + exp := &Expanse{ shutdownChan: make(chan bool), chainDb: chainDb, dappDb: dappDb, @@ -222,16 +222,16 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { switch { case config.PowTest: glog.V(logger.Info).Infof("ethash used in test mode") - eth.pow, err = ethash.NewForTesting() + exp.pow, err = ethash.NewForTesting() if err != nil { return nil, err } case config.PowShared: glog.V(logger.Info).Infof("ethash used in shared mode") - eth.pow = ethash.NewShared() + exp.pow = ethash.NewShared() default: - eth.pow = ethash.New() + exp.pow = ethash.New() } // load the genesis block or write a new one if no genesis @@ -242,51 +242,51 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { if err != nil { return nil, err } - glog.V(logger.Info).Infoln("WARNING: Wrote default ethereum genesis block") + glog.V(logger.Info).Infoln("WARNING: Wrote default expanse genesis block") } if config.ChainConfig == nil { return nil, errors.New("missing chain config") } - eth.chainConfig = config.ChainConfig - eth.chainConfig.VmConfig = vm.Config{ + exp.chainConfig = config.ChainConfig + exp.chainConfig.VmConfig = vm.Config{ EnableJit: config.EnableJit, ForceJit: config.ForceJit, } - eth.blockchain, err = core.NewBlockChain(chainDb, eth.chainConfig, eth.pow, eth.EventMux()) + exp.blockchain, err = core.NewBlockChain(chainDb, exp.chainConfig, exp.pow, exp.EventMux()) if err != nil { if err == core.ErrNoGenesis { return nil, fmt.Errorf(`No chain found. Please initialise a new chain using the "init" subcommand.`) } return nil, err } - eth.gpo = NewGasPriceOracle(eth) + exp.gpo = NewGasPriceOracle(exp) - newPool := core.NewTxPool(eth.chainConfig, eth.EventMux(), eth.blockchain.State, eth.blockchain.GasLimit) - eth.txPool = newPool + newPool := core.NewTxPool(exp.chainConfig, exp.EventMux(), exp.blockchain.State, exp.blockchain.GasLimit) + exp.txPool = newPool - if eth.protocolManager, err = NewProtocolManager(eth.chainConfig, config.FastSync, config.NetworkId, eth.eventMux, eth.txPool, eth.pow, eth.blockchain, chainDb); err != nil { + if exp.protocolManager, err = NewProtocolManager(exp.chainConfig, config.FastSync, config.NetworkId, exp.eventMux, exp.txPool, exp.pow, exp.blockchain, chainDb); err != nil { return nil, err } - eth.miner = miner.New(eth, eth.chainConfig, eth.EventMux(), eth.pow) - eth.miner.SetGasPrice(config.GasPrice) - eth.miner.SetExtra(config.ExtraData) + exp.miner = miner.New(exp, exp.chainConfig, exp.EventMux(), exp.pow) + exp.miner.SetGasPrice(config.GasPrice) + exp.miner.SetExtra(config.ExtraData) - return eth, nil + return exp, nil } -// APIs returns the collection of RPC services the ethereum package offers. +// APIs returns the collection of RPC services the expanse package offers. // NOTE, some of these services probably need to be moved to somewhere else. -func (s *Ethereum) APIs() []rpc.API { +func (s *Expanse) APIs() []rpc.API { return []rpc.API{ { - Namespace: "eth", + Namespace: "exp", Version: "1.0", Service: NewPublicEthereumAPI(s), Public: true, }, { - Namespace: "eth", + Namespace: "exp", Version: "1.0", Service: NewPublicAccountAPI(s.accountManager), Public: true, @@ -296,22 +296,22 @@ func (s *Ethereum) APIs() []rpc.API { Service: NewPrivateAccountAPI(s.accountManager), Public: false, }, { - Namespace: "eth", + Namespace: "exp", Version: "1.0", Service: NewPublicBlockChainAPI(s.chainConfig, s.blockchain, s.miner, s.chainDb, s.gpo, s.eventMux, s.accountManager), Public: true, }, { - Namespace: "eth", + Namespace: "exp", Version: "1.0", Service: NewPublicTransactionPoolAPI(s), Public: true, }, { - Namespace: "eth", + Namespace: "exp", Version: "1.0", Service: NewPublicMinerAPI(s), Public: true, }, { - Namespace: "eth", + Namespace: "exp", Version: "1.0", Service: downloader.NewPublicDownloaderAPI(s.protocolManager.downloader, s.eventMux), Public: true, @@ -326,7 +326,7 @@ func (s *Ethereum) APIs() []rpc.API { Service: NewPublicTxPoolAPI(s), Public: true, }, { - Namespace: "eth", + Namespace: "exp", Version: "1.0", Service: filters.NewPublicFilterAPI(s.chainDb, s.eventMux), Public: true, @@ -352,15 +352,50 @@ func (s *Ethereum) APIs() []rpc.API { Namespace: "admin", Version: "1.0", Service: ethreg.NewPrivateRegistarAPI(s.chainConfig, s.blockchain, s.chainDb, s.txPool, s.accountManager), + }, { + Namespace: "eth", + Version: "1.0", + Service: NewPublicEthereumAPI(s), + Public: true, + }, { + Namespace: "eth", + Version: "1.0", + Service: NewPublicAccountAPI(s.accountManager), + Public: true, + }, { + Namespace: "eth", + Version: "1.0", + Service: NewPublicBlockChainAPI(s.chainConfig, s.blockchain, s.miner, s.chainDb, s.gpo, s.eventMux, s.accountManager), + Public: true, + }, { + Namespace: "eth", + Version: "1.0", + Service: NewPublicTransactionPoolAPI(s), + Public: true, + }, { + Namespace: "eth", + Version: "1.0", + Service: NewPublicMinerAPI(s), + Public: true, + }, { + Namespace: "eth", + Version: "1.0", + Service: downloader.NewPublicDownloaderAPI(s.protocolManager.downloader, s.eventMux), + Public: true, + }, { + Namespace: "eth", + Version: "1.0", + Service: filters.NewPublicFilterAPI(s.chainDb, s.eventMux), + Public: true, }, } } -func (s *Ethereum) ResetWithGenesisBlock(gb *types.Block) { +func (s *Expanse) ResetWithGenesisBlock(gb *types.Block) { s.blockchain.ResetWithGenesisBlock(gb) } -func (s *Ethereum) Etherbase() (eb common.Address, err error) { +func (s *Expanse) Etherbase() (eb common.Address, err error) { eb = s.etherbase if (eb == common.Address{}) { firstAccount, err := s.AccountManager().AccountByIndex(0) @@ -373,35 +408,35 @@ func (s *Ethereum) Etherbase() (eb common.Address, err error) { } // set in js console via admin interface or wrapper from cli flags -func (self *Ethereum) SetEtherbase(etherbase common.Address) { +func (self *Expanse) SetEtherbase(etherbase common.Address) { self.etherbase = etherbase self.miner.SetEtherbase(etherbase) } -func (s *Ethereum) StopMining() { s.miner.Stop() } -func (s *Ethereum) IsMining() bool { return s.miner.Mining() } -func (s *Ethereum) Miner() *miner.Miner { return s.miner } +func (s *Expanse) StopMining() { s.miner.Stop() } +func (s *Expanse) IsMining() bool { return s.miner.Mining() } +func (s *Expanse) Miner() *miner.Miner { return s.miner } -func (s *Ethereum) AccountManager() *accounts.Manager { return s.accountManager } -func (s *Ethereum) BlockChain() *core.BlockChain { return s.blockchain } -func (s *Ethereum) TxPool() *core.TxPool { return s.txPool } -func (s *Ethereum) EventMux() *event.TypeMux { return s.eventMux } -func (s *Ethereum) ChainDb() ethdb.Database { return s.chainDb } -func (s *Ethereum) DappDb() ethdb.Database { return s.dappDb } -func (s *Ethereum) IsListening() bool { return true } // Always listening -func (s *Ethereum) EthVersion() int { return int(s.protocolManager.SubProtocols[0].Version) } -func (s *Ethereum) NetVersion() int { return s.netVersionId } -func (s *Ethereum) Downloader() *downloader.Downloader { return s.protocolManager.downloader } +func (s *Expanse) AccountManager() *accounts.Manager { return s.accountManager } +func (s *Expanse) BlockChain() *core.BlockChain { return s.blockchain } +func (s *Expanse) TxPool() *core.TxPool { return s.txPool } +func (s *Expanse) EventMux() *event.TypeMux { return s.eventMux } +func (s *Expanse) ChainDb() ethdb.Database { return s.chainDb } +func (s *Expanse) DappDb() ethdb.Database { return s.dappDb } +func (s *Expanse) IsListening() bool { return true } // Always listening +func (s *Expanse) EthVersion() int { return int(s.protocolManager.SubProtocols[0].Version) } +func (s *Expanse) NetVersion() int { return s.netVersionId } +func (s *Expanse) Downloader() *downloader.Downloader { return s.protocolManager.downloader } // Protocols implements node.Service, returning all the currently configured // network protocols to start. -func (s *Ethereum) Protocols() []p2p.Protocol { +func (s *Expanse) Protocols() []p2p.Protocol { return s.protocolManager.SubProtocols } // Start implements node.Service, starting all internal goroutines needed by the -// Ethereum protocol implementation. -func (s *Ethereum) Start(srvr *p2p.Server) error { +// Expanse protocol implementation. +func (s *Expanse) Start(srvr *p2p.Server) error { if s.AutoDAG { s.StartAutoDAG() } @@ -411,8 +446,8 @@ func (s *Ethereum) Start(srvr *p2p.Server) error { } // Stop implements node.Service, terminating all internal goroutines used by the -// Ethereum protocol. -func (s *Ethereum) Stop() error { +// Expanse protocol. +func (s *Expanse) Stop() error { s.blockchain.Stop() s.protocolManager.Stop() s.txPool.Stop() @@ -429,7 +464,7 @@ func (s *Ethereum) Stop() error { } // This function will wait for a shutdown and resumes main thread execution -func (s *Ethereum) WaitForShutdown() { +func (s *Expanse) WaitForShutdown() { <-s.shutdownChan } @@ -442,7 +477,7 @@ func (s *Ethereum) WaitForShutdown() { // stop any number of times. // For any more sophisticated pattern of DAG generation, use CLI subcommand // makedag -func (self *Ethereum) StartAutoDAG() { +func (self *Expanse) StartAutoDAG() { if self.autodagquit != nil { return // already started } @@ -488,7 +523,7 @@ func (self *Ethereum) StartAutoDAG() { } // stopAutoDAG stops automatic DAG pregeneration by quitting the loop -func (self *Ethereum) StopAutoDAG() { +func (self *Expanse) StopAutoDAG() { if self.autodagquit != nil { close(self.autodagquit) self.autodagquit = nil @@ -496,13 +531,14 @@ func (self *Ethereum) StopAutoDAG() { glog.V(logger.Info).Infof("Automatic pregeneration of ethash DAG OFF (ethash dir: %s)", ethash.DefaultDir) } + // HTTPClient returns the light http client used for fetching offchain docs // (natspec, source for verification) -func (self *Ethereum) HTTPClient() *httpclient.HTTPClient { +func (self *Expanse) HTTPClient() *httpclient.HTTPClient { return self.httpclient } -func (self *Ethereum) Solc() (*compiler.Solidity, error) { +func (self *Expanse) Solc() (*compiler.Solidity, error) { var err error if self.solc == nil { self.solc, err = compiler.New(self.SolcPath) @@ -511,7 +547,7 @@ func (self *Ethereum) Solc() (*compiler.Solidity, error) { } // set in js console via admin interface or wrapper from cli flags -func (self *Ethereum) SetSolc(solcPath string) (*compiler.Solidity, error) { +func (self *Expanse) SetSolc(solcPath string) (*compiler.Solidity, error) { self.SolcPath = solcPath self.solc = nil return self.Solc() diff --git a/eth/backend_test.go b/exp/backend_test.go similarity index 89% rename from eth/backend_test.go rename to exp/backend_test.go index c2bed879ba..8714d2f3df 100644 --- a/eth/backend_test.go +++ b/exp/backend_test.go @@ -1,4 +1,5 @@ // Copyright 2015 The go-ethereum Authors +// Copyright 2016 The go-expanse Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify @@ -14,17 +15,17 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package eth +package exp import ( "math/big" "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/ethdb" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/ethdb" ) func TestMipmapUpgrade(t *testing.T) { diff --git a/eth/bind.go b/exp/bind.go similarity index 84% rename from eth/bind.go rename to exp/bind.go index 3a3eca0623..b4904b1a2a 100644 --- a/eth/bind.go +++ b/exp/bind.go @@ -14,16 +14,16 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package eth +package exp import ( "math/big" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/rlp" - "github.com/ethereum/go-ethereum/rpc" + "github.com/expanse-project/go-expanse/accounts/abi/bind" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/rlp" + "github.com/expanse-project/go-expanse/rpc" ) // ContractBackend implements bind.ContractBackend with direct calls to Ethereum @@ -34,22 +34,22 @@ import ( // object. These should be rewritten to internal Go method calls when the Go API // is refactored to support a clean library use. type ContractBackend struct { - eapi *PublicEthereumAPI // Wrapper around the Ethereum object to access metadata + eapi *PublicEthereumAPI // Wrapper around the Expanse object to access metadata bcapi *PublicBlockChainAPI // Wrapper around the blockchain to access chain data txapi *PublicTransactionPoolAPI // Wrapper around the transaction pool to access transaction data } // NewContractBackend creates a new native contract backend using an existing // Etheruem object. -func NewContractBackend(eth *Ethereum) *ContractBackend { +func NewContractBackend(exp *Expanse) *ContractBackend { return &ContractBackend{ - eapi: NewPublicEthereumAPI(eth), - bcapi: NewPublicBlockChainAPI(eth.chainConfig, eth.blockchain, eth.miner, eth.chainDb, eth.gpo, eth.eventMux, eth.accountManager), - txapi: NewPublicTransactionPoolAPI(eth), + eapi: NewPublicEthereumAPI(exp), + bcapi: NewPublicBlockChainAPI(exp.chainConfig, exp.blockchain, exp.miner, exp.chainDb, exp.gpo, exp.eventMux, exp.accountManager), + txapi: NewPublicTransactionPoolAPI(exp), } } -// ContractCall implements bind.ContractCaller executing an Ethereum contract +// ContractCall implements bind.ContractCaller executing an Expanse contract // call with the specified data as the input. The pending flag requests execution // against the pending block, not the stable head of the chain. func (b *ContractBackend) ContractCall(contract common.Address, data []byte, pending bool) ([]byte, error) { diff --git a/eth/cpu_mining.go b/exp/cpu_mining.go similarity index 65% rename from eth/cpu_mining.go rename to exp/cpu_mining.go index 3469d394e9..4c1cb4ae7d 100644 --- a/eth/cpu_mining.go +++ b/exp/cpu_mining.go @@ -1,34 +1,35 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors +// Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // +build !opencl -package eth +package exp import ( "errors" "fmt" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" ) const disabledInfo = "Set GO_OPENCL and re-build to enable." -func (s *Ethereum) StartMining(threads int, gpus string) error { +func (s *Expanse) StartMining(threads int, gpus string) error { eb, err := s.Etherbase() if err != nil { err = fmt.Errorf("Cannot start mining without etherbase address: %v", err) diff --git a/eth/downloader/api.go b/exp/downloader/api.go similarity index 94% rename from eth/downloader/api.go rename to exp/downloader/api.go index 94cd6515f8..c4f9053be3 100644 --- a/eth/downloader/api.go +++ b/exp/downloader/api.go @@ -21,8 +21,8 @@ import ( "golang.org/x/net/context" - "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/rpc" + "github.com/expanse-project/go-expanse/event" + "github.com/expanse-project/go-expanse/rpc" ) // PublicDownloaderAPI provides an API which gives information about the current synchronisation status. @@ -68,7 +68,7 @@ func (api *PublicDownloaderAPI) run() { } } -// Progress gives progress indications when the node is synchronising with the Ethereum network. +// Progress gives progress indications when the node is synchronising with the Expanse network. type Progress struct { Origin uint64 `json:"startingBlock"` Current uint64 `json:"currentBlock"` @@ -83,7 +83,7 @@ type SyncingResult struct { Status Progress `json:"status"` } -// Syncing provides information when this nodes starts synchronising with the Ethereum network and when it's finished. +// Syncing provides information when this nodes starts synchronising with the Expanse network and when it's finished. func (api *PublicDownloaderAPI) Syncing(ctx context.Context) (rpc.Subscription, error) { notifier, supported := rpc.NotifierFromContext(ctx) if !supported { diff --git a/eth/downloader/downloader.go b/exp/downloader/downloader.go similarity index 98% rename from eth/downloader/downloader.go rename to exp/downloader/downloader.go index 0f76357cba..c4741fb81e 100644 --- a/eth/downloader/downloader.go +++ b/exp/downloader/downloader.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // Package downloader contains the manual full chain synchronisation. package downloader @@ -28,13 +28,13 @@ import ( "sync/atomic" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/params" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/event" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/params" "github.com/rcrowley/go-metrics" ) @@ -349,7 +349,6 @@ func (d *Downloader) syncWithPeer(p *peer, hash common.Hash, td *big.Int) (err e defer func(start time.Time) { glog.V(logger.Debug).Infof("Synchronisation terminated after %v", time.Since(start)) }(time.Now()) - switch { case p.version == 61: // Look up the sync boundaries: the common ancestor and the target block @@ -432,7 +431,7 @@ func (d *Downloader) syncWithPeer(p *peer, hash common.Hash, td *big.Int) (err e default: // Something very wrong, stop right here - glog.V(logger.Error).Infof("Unsupported eth protocol: %d", p.version) + glog.V(logger.Error).Infof("Unsupported exp protocol: %d", p.version) return errBadPeer } } @@ -1045,6 +1044,7 @@ func (d *Downloader) findAncestor(p *peer, height uint64) (uint64, error) { // Check if a common ancestor was found finished = true for i := len(headers) - 1; i >= 0; i-- { + // Skip any headers that underflow/overflow our requested set if headers[i].Number.Int64() < from || headers[i].Number.Uint64() > head { continue diff --git a/eth/downloader/downloader_test.go b/exp/downloader/downloader_test.go similarity index 98% rename from eth/downloader/downloader_test.go rename to exp/downloader/downloader_test.go index b0b0c2bd32..8b2dbf3a4e 100644 --- a/eth/downloader/downloader_test.go +++ b/exp/downloader/downloader_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package downloader @@ -25,15 +25,15 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/trie" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/event" + "github.com/expanse-project/go-expanse/params" + "github.com/expanse-project/go-expanse/trie" ) var ( diff --git a/eth/downloader/events.go b/exp/downloader/events.go similarity index 62% rename from eth/downloader/events.go rename to exp/downloader/events.go index 64905b8f2a..8bd052ec91 100644 --- a/eth/downloader/events.go +++ b/exp/downloader/events.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package downloader diff --git a/eth/downloader/metrics.go b/exp/downloader/metrics.go similarity index 98% rename from eth/downloader/metrics.go rename to exp/downloader/metrics.go index d6fcfa25c7..c9fbb80f1d 100644 --- a/eth/downloader/metrics.go +++ b/exp/downloader/metrics.go @@ -19,7 +19,7 @@ package downloader import ( - "github.com/ethereum/go-ethereum/metrics" + "github.com/expanse-project/go-expanse/metrics" ) var ( diff --git a/eth/downloader/modes.go b/exp/downloader/modes.go similarity index 74% rename from eth/downloader/modes.go rename to exp/downloader/modes.go index ec339c0740..0190f9495e 100644 --- a/eth/downloader/modes.go +++ b/exp/downloader/modes.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors +// Copyright 2015 The go-ethereum Authors // go-expanse Authors // This file is part of the go-ethereum library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package downloader diff --git a/eth/downloader/peer.go b/exp/downloader/peer.go similarity index 97% rename from eth/downloader/peer.go rename to exp/downloader/peer.go index c4846194ba..db087ccc36 100644 --- a/eth/downloader/peer.go +++ b/exp/downloader/peer.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // Contains the active peer-set of the downloader, maintaining both failures // as well as reputation metrics to prioritize the block retrievals. @@ -27,7 +27,7 @@ import ( "sync/atomic" "time" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse-project/go-expanse/common" ) const ( @@ -492,6 +492,7 @@ func (ps *peerSet) idlePeers(minProtocol, maxProtocol int, idleCheck func(*peer) idle, total := make([]*peer, 0, len(ps.peers)), 0 for _, p := range ps.peers { + if p.version >= minProtocol && p.version <= maxProtocol { if idleCheck(p) { idle = append(idle, p) diff --git a/eth/downloader/queue.go b/exp/downloader/queue.go similarity index 98% rename from eth/downloader/queue.go rename to exp/downloader/queue.go index d8d1bddcee..48ee1ffffc 100644 --- a/eth/downloader/queue.go +++ b/exp/downloader/queue.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // Contains the block download scheduler to collect download tasks and schedule // them in an ordered, and throttled way. @@ -26,14 +26,14 @@ import ( "sync/atomic" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/trie" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/trie" "github.com/rcrowley/go-metrics" "gopkg.in/karalabe/cookiejar.v2/collections/prque" ) diff --git a/eth/downloader/types.go b/exp/downloader/types.go similarity index 98% rename from eth/downloader/types.go rename to exp/downloader/types.go index b67fff1f8f..e9a18ef160 100644 --- a/eth/downloader/types.go +++ b/exp/downloader/types.go @@ -20,8 +20,8 @@ import ( "fmt" "math/big" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/types" ) // headerCheckFn is a callback type for verifying a header's presence in the local chain. diff --git a/eth/fetcher/fetcher.go b/exp/fetcher/fetcher.go similarity index 98% rename from eth/fetcher/fetcher.go rename to exp/fetcher/fetcher.go index 9300717c3d..3ada2ffc12 100644 --- a/eth/fetcher/fetcher.go +++ b/exp/fetcher/fetcher.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // Package fetcher contains the block announcement based synchronisation. package fetcher @@ -23,11 +23,11 @@ import ( "math/rand" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" "gopkg.in/karalabe/cookiejar.v2/collections/prque" ) diff --git a/eth/fetcher/fetcher_test.go b/exp/fetcher/fetcher_test.go similarity index 98% rename from eth/fetcher/fetcher_test.go rename to exp/fetcher/fetcher_test.go index 2404c8cfa7..c66d5ad996 100644 --- a/eth/fetcher/fetcher_test.go +++ b/exp/fetcher/fetcher_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package fetcher @@ -24,12 +24,13 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/params" + + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/params" ) var ( diff --git a/eth/fetcher/metrics.go b/exp/fetcher/metrics.go similarity index 97% rename from eth/fetcher/metrics.go rename to exp/fetcher/metrics.go index b82d3ca011..9dad34e6a0 100644 --- a/eth/fetcher/metrics.go +++ b/exp/fetcher/metrics.go @@ -19,7 +19,7 @@ package fetcher import ( - "github.com/ethereum/go-ethereum/metrics" + "github.com/expanse-project/go-expanse/metrics" ) var ( diff --git a/eth/filters/api.go b/exp/filters/api.go similarity index 97% rename from eth/filters/api.go rename to exp/filters/api.go index d9bd4d4b7f..655f78ab92 100644 --- a/eth/filters/api.go +++ b/exp/filters/api.go @@ -25,12 +25,12 @@ import ( "sync" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/rpc" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/event" + "github.com/expanse-project/go-expanse/rpc" "golang.org/x/net/context" ) @@ -48,7 +48,7 @@ const ( ) // PublicFilterAPI offers support to create and manage filters. This will allow external clients to retrieve various -// information related to the Ethereum protocol such als blocks, transactions and logs. +// information related to the Expanse protocol such als blocks, transactions and logs. type PublicFilterAPI struct { mux *event.TypeMux diff --git a/eth/filters/filter.go b/exp/filters/filter.go similarity index 96% rename from eth/filters/filter.go rename to exp/filters/filter.go index 469dfba4d1..648537f6f0 100644 --- a/eth/filters/filter.go +++ b/exp/filters/filter.go @@ -20,11 +20,11 @@ import ( "math" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/ethdb" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/ethdb" ) type AccountChange struct { diff --git a/eth/filters/filter_system.go b/exp/filters/filter_system.go similarity index 94% rename from eth/filters/filter_system.go rename to exp/filters/filter_system.go index 4343dfa21c..5b20e09678 100644 --- a/eth/filters/filter_system.go +++ b/exp/filters/filter_system.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// package filters implements an ethereum filtering system for block, +// package filters implements an expanse filtering system for block, // transactions and log events. package filters @@ -23,9 +23,9 @@ import ( "sync" "time" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/event" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/event" ) // FilterType determines the type of filter and is used to put the filter in to @@ -128,7 +128,7 @@ func (fs *FilterSystem) Get(id int) *Filter { return fs.generic[id] } -// filterLoop waits for specific events from ethereum and fires their handlers +// filterLoop waits for specific events from expanse and fires their handlers // when the filter matches the requirements. func (fs *FilterSystem) filterLoop() { for event := range fs.sub.Chan() { diff --git a/eth/filters/filter_system_test.go b/exp/filters/filter_system_test.go similarity index 93% rename from eth/filters/filter_system_test.go rename to exp/filters/filter_system_test.go index 72824cb088..f51096dadd 100644 --- a/eth/filters/filter_system_test.go +++ b/exp/filters/filter_system_test.go @@ -20,10 +20,10 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/event" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/event" ) func TestCallbacks(t *testing.T) { diff --git a/eth/filters/filter_test.go b/exp/filters/filter_test.go similarity index 95% rename from eth/filters/filter_test.go rename to exp/filters/filter_test.go index b0f88ffeb5..824f7ca9ba 100644 --- a/eth/filters/filter_test.go +++ b/exp/filters/filter_test.go @@ -22,12 +22,12 @@ import ( "os" "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/ethdb" ) func makeReceipt(addr common.Address) *types.Receipt { @@ -51,7 +51,7 @@ func BenchmarkMipmaps(b *testing.B) { key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") addr1 = crypto.PubkeyToAddress(key1.PublicKey) addr2 = common.BytesToAddress([]byte("jeff")) - addr3 = common.BytesToAddress([]byte("ethereum")) + addr3 = common.BytesToAddress([]byte("expanse")) addr4 = common.BytesToAddress([]byte("random addresses please")) ) defer db.Close() diff --git a/eth/gasprice.go b/exp/gasprice.go similarity index 77% rename from eth/gasprice.go rename to exp/gasprice.go index e0de89e621..a66a6f2aae 100644 --- a/eth/gasprice.go +++ b/exp/gasprice.go @@ -1,30 +1,30 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . -package eth +package exp import ( "math/big" "math/rand" "sync" - - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" ) const ( @@ -42,7 +42,7 @@ type blockPriceInfo struct { // GasPriceOracle recommends gas prices based on the content of recent // blocks. type GasPriceOracle struct { - eth *Ethereum + exp *Expanse initOnce sync.Once minPrice *big.Int lastBaseMutex sync.Mutex @@ -55,17 +55,17 @@ type GasPriceOracle struct { } // NewGasPriceOracle returns a new oracle. -func NewGasPriceOracle(eth *Ethereum) *GasPriceOracle { - minprice := eth.GpoMinGasPrice +func NewGasPriceOracle(exp *Expanse) *GasPriceOracle { + minprice := exp.GpoMinGasPrice if minprice == nil { minprice = big.NewInt(gpoDefaultMinGasPrice) } minbase := new(big.Int).Mul(minprice, big.NewInt(100)) - if eth.GpobaseCorrectionFactor > 0 { - minbase = minbase.Div(minbase, big.NewInt(int64(eth.GpobaseCorrectionFactor))) + if exp.GpobaseCorrectionFactor > 0 { + minbase = minbase.Div(minbase, big.NewInt(int64(exp.GpobaseCorrectionFactor))) } return &GasPriceOracle{ - eth: eth, + exp: exp, blocks: make(map[uint64]*blockPriceInfo), minBase: minbase, minPrice: minprice, @@ -75,7 +75,7 @@ func NewGasPriceOracle(eth *Ethereum) *GasPriceOracle { func (gpo *GasPriceOracle) init() { gpo.initOnce.Do(func() { - gpo.processPastBlocks(gpo.eth.BlockChain()) + gpo.processPastBlocks(gpo.exp.BlockChain()) go gpo.listenLoop() }) } @@ -101,7 +101,7 @@ func (self *GasPriceOracle) processPastBlocks(chain *core.BlockChain) { } func (self *GasPriceOracle) listenLoop() { - events := self.eth.EventMux().Subscribe(core.ChainEvent{}, core.ChainSplitEvent{}) + events := self.exp.EventMux().Subscribe(core.ChainEvent{}, core.ChainSplitEvent{}) defer events.Unsubscribe() for event := range events.Chan() { @@ -136,9 +136,9 @@ func (self *GasPriceOracle) processBlock(block *types.Block) { } if lastBase.Cmp(lp) < 0 { - corr = self.eth.GpobaseStepUp + corr = self.exp.GpobaseStepUp } else { - corr = -self.eth.GpobaseStepDown + corr = -self.exp.GpobaseStepDown } crand := int64(corr * (900 + rand.Intn(201))) @@ -166,7 +166,7 @@ func (self *GasPriceOracle) processBlock(block *types.Block) { func (self *GasPriceOracle) lowestPrice(block *types.Block) *big.Int { gasUsed := big.NewInt(0) - receipts := core.GetBlockReceipts(self.eth.ChainDb(), block.Hash()) + receipts := core.GetBlockReceipts(self.exp.ChainDb(), block.Hash()) if len(receipts) > 0 { if cgu := receipts[len(receipts)-1].CumulativeGasUsed; cgu != nil { gasUsed = receipts[len(receipts)-1].CumulativeGasUsed @@ -174,7 +174,7 @@ func (self *GasPriceOracle) lowestPrice(block *types.Block) *big.Int { } if new(big.Int).Mul(gasUsed, big.NewInt(100)).Cmp(new(big.Int).Mul(block.GasLimit(), - big.NewInt(int64(self.eth.GpoFullBlockRatio)))) < 0 { + big.NewInt(int64(self.exp.GpoFullBlockRatio)))) < 0 { // block is not full, could have posted a tx with MinGasPrice return big.NewInt(0) } @@ -201,12 +201,12 @@ func (self *GasPriceOracle) SuggestPrice() *big.Int { price := new(big.Int).Set(self.lastBase) self.lastBaseMutex.Unlock() - price.Mul(price, big.NewInt(int64(self.eth.GpobaseCorrectionFactor))) + price.Mul(price, big.NewInt(int64(self.exp.GpobaseCorrectionFactor))) price.Div(price, big.NewInt(100)) if price.Cmp(self.minPrice) < 0 { price.Set(self.minPrice) - } else if self.eth.GpoMaxGasPrice != nil && price.Cmp(self.eth.GpoMaxGasPrice) > 0 { - price.Set(self.eth.GpoMaxGasPrice) + } else if self.exp.GpoMaxGasPrice != nil && price.Cmp(self.exp.GpoMaxGasPrice) > 0 { + price.Set(self.exp.GpoMaxGasPrice) } return price } diff --git a/eth/gpu_mining.go b/exp/gpu_mining.go similarity index 86% rename from eth/gpu_mining.go rename to exp/gpu_mining.go index 12fa746018..e578cd3098 100644 --- a/eth/gpu_mining.go +++ b/exp/gpu_mining.go @@ -16,7 +16,7 @@ // +build opencl -package eth +package exp import ( "fmt" @@ -25,15 +25,15 @@ import ( "strings" "time" - "github.com/ethereum/ethash" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/miner" + "github.com/expanse-org/ethash" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/miner" ) -func (s *Ethereum) StartMining(threads int, gpus string) error { +func (s *Expanse) StartMining(threads int, gpus string) error { eb, err := s.Etherbase() if err != nil { err = fmt.Errorf("Cannot start mining without etherbase address: %v", err) diff --git a/eth/handler.go b/exp/handler.go similarity index 94% rename from eth/handler.go rename to exp/handler.go index 202acdc78a..a2029faa60 100644 --- a/eth/handler.go +++ b/exp/handler.go @@ -1,20 +1,20 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . -package eth +package exp import ( "errors" @@ -25,19 +25,19 @@ import ( "sync/atomic" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/eth/downloader" - "github.com/ethereum/go-ethereum/eth/fetcher" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/discover" - "github.com/ethereum/go-ethereum/pow" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/exp/downloader" + "github.com/expanse-project/go-expanse/exp/fetcher" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/event" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/p2p" + "github.com/expanse-project/go-expanse/p2p/discover" + "github.com/expanse-project/go-expanse/pow" + "github.com/expanse-project/go-expanse/rlp" ) const ( @@ -85,8 +85,8 @@ type ProtocolManager struct { wg sync.WaitGroup } -// NewProtocolManager returns a new ethereum sub protocol manager. The Ethereum sub protocol manages peers capable -// with the ethereum network. +// NewProtocolManager returns a new expanse sub protocol manager. The Expanse sub protocol manages peers capable +// with the expanse network. func NewProtocolManager(config *core.ChainConfig, fastSync bool, networkId int, mux *event.TypeMux, txpool txPool, pow pow.PoW, blockchain *core.BlockChain, chaindb ethdb.Database) (*ProtocolManager, error) { // Create the protocol manager with the base fields manager := &ProtocolManager{ @@ -110,6 +110,7 @@ func NewProtocolManager(config *core.ChainConfig, fastSync bool, networkId int, manager.fastSync = uint32(1) } // Initiate a sub-protocol for every implemented version we can handle + manager.SubProtocols = make([]p2p.Protocol, 0, len(ProtocolVersions)) for i, version := range ProtocolVersions { // Skip protocol version if incompatible with the mode of operation @@ -119,6 +120,7 @@ func NewProtocolManager(config *core.ChainConfig, fastSync bool, networkId int, // Compatible; initialise the sub-protocol version := version // Closure for the run manager.SubProtocols = append(manager.SubProtocols, p2p.Protocol{ + Name: ProtocolName, Version: version, Length: ProtocolLengths[i], @@ -172,7 +174,7 @@ func (pm *ProtocolManager) removePeer(id string) { } glog.V(logger.Debug).Infoln("Removing peer", id) - // Unregister the peer from the downloader and Ethereum peer set + // Unregister the peer from the downloader and Expanse peer set pm.downloader.UnregisterPeer(id) if err := pm.peers.Unregister(id); err != nil { glog.V(logger.Error).Infoln("Removal failed:", err) @@ -197,7 +199,7 @@ func (pm *ProtocolManager) Start() { } func (pm *ProtocolManager) Stop() { - glog.V(logger.Info).Infoln("Stopping ethereum protocol handler...") + glog.V(logger.Info).Infoln("Stopping expanse protocol handler...") pm.txSub.Unsubscribe() // quits txBroadcastLoop pm.minedBlockSub.Unsubscribe() // quits blockBroadcastLoop @@ -218,19 +220,19 @@ func (pm *ProtocolManager) Stop() { // Wait for all peer handler goroutines and the loops to come down. pm.wg.Wait() - glog.V(logger.Info).Infoln("Ethereum protocol handler stopped") + glog.V(logger.Info).Infoln("Expanse protocol handler stopped") } func (pm *ProtocolManager) newPeer(pv int, p *p2p.Peer, rw p2p.MsgReadWriter) *peer { return newPeer(pv, p, newMeteredMsgWriter(rw)) } -// handle is the callback invoked to manage the life cycle of an eth peer. When +// handle is the callback invoked to manage the life cycle of an exp peer. When // this function terminates, the peer is disconnected. func (pm *ProtocolManager) handle(p *peer) error { glog.V(logger.Debug).Infof("%v: peer connected [%s]", p, p.Name()) - // Execute the Ethereum handshake + // Execute the Expanse handshake td, head, genesis := pm.blockchain.Status() if err := p.Handshake(pm.networkId, td, head, genesis); err != nil { glog.V(logger.Debug).Infof("%v: handshake failed: %v", p, err) @@ -773,10 +775,10 @@ func (self *ProtocolManager) txBroadcastLoop() { } } -// EthNodeInfo represents a short summary of the Ethereum sub-protocol metadata known +// EthNodeInfo represents a short summary of the Expanse sub-protocol metadata known // about the host peer. type EthNodeInfo struct { - Network int `json:"network"` // Ethereum network ID (0=Olympic, 1=Frontier, 2=Morden) + Network int `json:"network"` // Expanse network ID (0=Olympic, 1=Frontier, 2=Morden) Difficulty *big.Int `json:"difficulty"` // Total difficulty of the host's blockchain Genesis common.Hash `json:"genesis"` // SHA3 hash of the host's genesis block Head common.Hash `json:"head"` // SHA3 hash of the host's best owned block diff --git a/eth/handler_test.go b/exp/handler_test.go similarity index 98% rename from eth/handler_test.go rename to exp/handler_test.go index 9e593f0405..f07dd9f0ce 100644 --- a/eth/handler_test.go +++ b/exp/handler_test.go @@ -13,23 +13,21 @@ // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . - -package eth - +package exp import ( "math/big" "math/rand" "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/eth/downloader" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/params" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/exp/downloader" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/p2p" + "github.com/expanse-project/go-expanse/params" ) // Tests that protocol versions and modes of operations are matched up properly. diff --git a/eth/helper_test.go b/exp/helper_test.go similarity index 93% rename from eth/helper_test.go rename to exp/helper_test.go index dacb1593f5..492ee06972 100644 --- a/eth/helper_test.go +++ b/exp/helper_test.go @@ -17,7 +17,7 @@ // This file contains some shares testing functionality, common to multiple // different files and modules being tested. -package eth +package exp import ( "crypto/ecdsa" @@ -26,14 +26,14 @@ import ( "sync" "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/event" + "github.com/expanse-project/go-expanse/p2p" + "github.com/expanse-project/go-expanse/p2p/discover" ) var ( diff --git a/eth/metrics.go b/exp/metrics.go similarity index 98% rename from eth/metrics.go rename to exp/metrics.go index e1a89d3a90..39c50ea322 100644 --- a/eth/metrics.go +++ b/exp/metrics.go @@ -14,11 +14,11 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package eth +package exp import ( - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/p2p" + "github.com/expanse-project/go-expanse/metrics" + "github.com/expanse-project/go-expanse/p2p" ) var ( diff --git a/eth/peer.go b/exp/peer.go similarity index 93% rename from eth/peer.go rename to exp/peer.go index 8eb41b0f99..e71b0012e8 100644 --- a/eth/peer.go +++ b/exp/peer.go @@ -1,20 +1,20 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . -package eth +package exp import ( "errors" @@ -23,13 +23,14 @@ import ( "sync" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/eth/downloader" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/rlp" + + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/exp/downloader" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/p2p" + "github.com/expanse-project/go-expanse/rlp" "gopkg.in/fatih/set.v0" ) @@ -45,10 +46,10 @@ const ( handshakeTimeout = 5 * time.Second ) -// PeerInfo represents a short summary of the Ethereum sub-protocol metadata known +// PeerInfo represents a short summary of the Expanse sub-protocol metadata known // about a connected peer. type PeerInfo struct { - Version int `json:"version"` // Ethereum protocol version negotiated + Version int `json:"version"` // Expanse protocol version negotiated Difficulty *big.Int `json:"difficulty"` // Total difficulty of the peer's blockchain Head string `json:"head"` // SHA3 hash of the peer's best owned block } @@ -239,6 +240,7 @@ func (p *peer) RequestBlocks(hashes []common.Hash) error { return p2p.Send(p.rw, GetBlocksMsg, hashes) } + // RequestHeaders is a wrapper around the header query functions to fetch a // single header. It is used solely by the fetcher. func (p *peer) RequestOneHeader(hash common.Hash) error { @@ -345,12 +347,12 @@ func (p *peer) readStatus(network int, status *statusData, genesis common.Hash) // String implements fmt.Stringer. func (p *peer) String() string { return fmt.Sprintf("Peer %s [%s]", p.id, - fmt.Sprintf("eth/%2d", p.version), + fmt.Sprintf("exp/%2d", p.version), ) } // peerSet represents the collection of active peers currently participating in -// the Ethereum sub-protocol. +// the Expanse sub-protocol. type peerSet struct { peers map[string]*peer lock sync.RWMutex diff --git a/eth/protocol.go b/exp/protocol.go similarity index 91% rename from eth/protocol.go rename to exp/protocol.go index 808ac06011..340c8c630d 100644 --- a/eth/protocol.go +++ b/exp/protocol.go @@ -1,29 +1,29 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . -package eth +package exp import ( "fmt" "io" "math/big" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/rlp" ) // Constants to match up protocol versions and messages @@ -34,7 +34,7 @@ const ( ) // Official short name of the protocol used during capability negotiation. -var ProtocolName = "eth" +var ProtocolName = "exp" // Supported versions of the eth protocol (first is primary). var ProtocolVersions = []uint{eth63, eth62, eth61} @@ -47,7 +47,7 @@ const ( ProtocolMaxMsgSize = 10 * 1024 * 1024 // Maximum cap on the size of a protocol message ) -// eth protocol message codes +// exp protocol message codes const ( // Protocol messages belonging to eth/61 StatusMsg = 0x00 diff --git a/eth/protocol_test.go b/exp/protocol_test.go similarity index 92% rename from eth/protocol_test.go rename to exp/protocol_test.go index 0a82e2e795..c5dbfb10ac 100644 --- a/eth/protocol_test.go +++ b/exp/protocol_test.go @@ -1,20 +1,20 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . -package eth +package exp import ( "fmt" @@ -22,11 +22,11 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/p2p" + "github.com/expanse-project/go-expanse/rlp" ) func init() { diff --git a/eth/sync.go b/exp/sync.go similarity index 88% rename from eth/sync.go rename to exp/sync.go index 4b16c13226..4980c6e3b9 100644 --- a/eth/sync.go +++ b/exp/sync.go @@ -1,32 +1,32 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . -package eth +package exp import ( "math/rand" "sync/atomic" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/eth/downloader" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/exp/downloader" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/p2p/discover" ) const ( diff --git a/eth/sync_test.go b/exp/sync_test.go similarity index 94% rename from eth/sync_test.go rename to exp/sync_test.go index 198ffaf272..064e4b18b7 100644 --- a/eth/sync_test.go +++ b/exp/sync_test.go @@ -14,15 +14,15 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package eth +package exp import ( "sync/atomic" "testing" "time" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/expanse-project/go-expanse/p2p" + "github.com/expanse-project/go-expanse/p2p/discover" ) // Tests that fast sync gets disabled as soon as a real block is successfully diff --git a/fdtrack/fdtrack.go b/fdtrack/fdtrack.go new file mode 100644 index 0000000000..6a552be6bc --- /dev/null +++ b/fdtrack/fdtrack.go @@ -0,0 +1,112 @@ +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. +// +// The go-expanse library 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. +// +// The go-expanse 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-expanse library. If not, see . + +// Package fdtrack logs statistics about open file descriptors. +package fdtrack + +import ( + "fmt" + "net" + "sort" + "sync" + "time" + + "github.com/expanse-project/go-expanse/logger/glog" +) + +var ( + mutex sync.Mutex + all = make(map[string]int) +) + +func Open(desc string) { + mutex.Lock() + all[desc] += 1 + mutex.Unlock() +} + +func Close(desc string) { + mutex.Lock() + defer mutex.Unlock() + if c, ok := all[desc]; ok { + if c == 1 { + delete(all, desc) + } else { + all[desc]-- + } + } +} + +func WrapListener(desc string, l net.Listener) net.Listener { + Open(desc) + return &wrappedListener{l, desc} +} + +type wrappedListener struct { + net.Listener + desc string +} + +func (w *wrappedListener) Accept() (net.Conn, error) { + c, err := w.Listener.Accept() + if err == nil { + c = WrapConn(w.desc, c) + } + return c, err +} + +func (w *wrappedListener) Close() error { + err := w.Listener.Close() + if err == nil { + Close(w.desc) + } + return err +} + +func WrapConn(desc string, conn net.Conn) net.Conn { + Open(desc) + return &wrappedConn{conn, desc} +} + +type wrappedConn struct { + net.Conn + desc string +} + +func (w *wrappedConn) Close() error { + err := w.Conn.Close() + if err == nil { + Close(w.desc) + } + return err +} + +func Start() { + go func() { + for range time.Tick(15 * time.Second) { + mutex.Lock() + var sum, tracked = 0, []string{} + for what, n := range all { + sum += n + tracked = append(tracked, fmt.Sprintf("%s:%d", what, n)) + } + mutex.Unlock() + used, _ := fdusage() + sort.Strings(tracked) + glog.Infof("fd usage %d/%d, tracked %d %v", used, fdlimit(), sum, tracked) + } + }() +} diff --git a/fdtrack/fdusage.go b/fdtrack/fdusage.go new file mode 100644 index 0000000000..0e0df6da7f --- /dev/null +++ b/fdtrack/fdusage.go @@ -0,0 +1,29 @@ +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. +// +// The go-expanse library 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. +// +// The go-expanse 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-expanse library. If not, see . + +// +build !linux,!darwin + +package fdtrack + +import "errors" + +func fdlimit() int { + return 0 +} + +func fdusage() (int, error) { + return 0, errors.New("not implemented") +} diff --git a/fdtrack/fdusage_darwin.go b/fdtrack/fdusage_darwin.go new file mode 100644 index 0000000000..094a2b6c2c --- /dev/null +++ b/fdtrack/fdusage_darwin.go @@ -0,0 +1,72 @@ +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. +// +// The go-expanse library 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. +// +// The go-expanse 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-expanse library. If not, see . + +// +build darwin + +package fdtrack + +import ( + "os" + "syscall" + "unsafe" +) + +// #cgo CFLAGS: -lproc +// #include +// #include +import "C" + +func fdlimit() int { + var nofile syscall.Rlimit + if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &nofile); err != nil { + return 0 + } + return int(nofile.Cur) +} + +func fdusage() (int, error) { + pid := C.int(os.Getpid()) + // Query for a rough estimate on the amout of data that + // proc_pidinfo will return. + rlen, err := C.proc_pidinfo(pid, C.PROC_PIDLISTFDS, 0, nil, 0) + if rlen <= 0 { + return 0, err + } + // Load the list of file descriptors. We don't actually care about + // the content, only about the size. Since the number of fds can + // change while we're reading them, the loop enlarges the buffer + // until proc_pidinfo says the result fitted. + var buf unsafe.Pointer + defer func() { + if buf != nil { + C.free(buf) + } + }() + for buflen := rlen; ; buflen *= 2 { + buf, err = C.reallocf(buf, C.size_t(buflen)) + if buf == nil { + return 0, err + } + rlen, err = C.proc_pidinfo(pid, C.PROC_PIDLISTFDS, 0, buf, buflen) + if rlen <= 0 { + return 0, err + } else if rlen == buflen { + continue + } + return int(rlen / C.PROC_PIDLISTFD_SIZE), nil + } + panic("unreachable") +} diff --git a/fdtrack/fdusage_linux.go b/fdtrack/fdusage_linux.go new file mode 100644 index 0000000000..e5e16f3a00 --- /dev/null +++ b/fdtrack/fdusage_linux.go @@ -0,0 +1,53 @@ +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. +// +// The go-expanse library 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. +// +// The go-expanse 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-expanse library. If not, see . + +// +build linux + +package fdtrack + +import ( + "io" + "os" + "syscall" +) + +func fdlimit() int { + var nofile syscall.Rlimit + if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &nofile); err != nil { + return 0 + } + return int(nofile.Cur) +} + +func fdusage() (int, error) { + f, err := os.Open("/proc/self/fd") + if err != nil { + return 0, err + } + defer f.Close() + const batchSize = 100 + n := 0 + for { + list, err := f.Readdirnames(batchSize) + n += len(list) + if err == io.EOF { + break + } else if err != nil { + return 0, err + } + } + return n, nil +} diff --git a/generators/defaults.go b/generators/defaults.go index 107e13e67c..e2a4f347f9 100644 --- a/generators/defaults.go +++ b/generators/defaults.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . //go:generate go run defaults.go default.json defs.go diff --git a/genesis.json b/genesis.json new file mode 100644 index 0000000000..85c7a1ba9e --- /dev/null +++ b/genesis.json @@ -0,0 +1,16 @@ +{ + "nonce": "0x214652414e4b4f21", + "timestamp": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "extraData": "0x4672616e6b6f497346726565646f6d", + "gasLimit": "0x1388", + "difficulty": "0x40000000", + "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x93decab0cd745598860f782ac1e8f046cb99e898", + "alloc": { + "0xbb94f0ceb32257275b2a7a9c094c13e469b4563e": { "balance": "10000000000000000000000000" }, + "0x15656715068ab0dbdf0ab00748a8a19e40f28192": { "balance": "1000000000000000000000000"}, + "0xc075fa11f85bda3aaba67106226aaf086ac16f4e": { "balance": "100000000000000000000000"}, + "0x93decab0cd745598860f782ac1e8f046cb99e898": { "balance": "10000000000000000000000"} + } +} \ No newline at end of file diff --git a/genesis.json.gz b/genesis.json.gz new file mode 100644 index 0000000000..911b69c4cc Binary files /dev/null and b/genesis.json.gz differ diff --git a/internal/debug/api.go b/internal/debug/api.go index 96091541b5..b9c35967a1 100644 --- a/internal/debug/api.go +++ b/internal/debug/api.go @@ -33,8 +33,8 @@ import ( "sync" "time" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" ) // Handler is the global debugging handler. diff --git a/internal/debug/flags.go b/internal/debug/flags.go index 5b1a9b23c4..1b64cf8fa6 100644 --- a/internal/debug/flags.go +++ b/internal/debug/flags.go @@ -23,8 +23,8 @@ import ( "runtime" "github.com/codegangsta/cli" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" ) var ( diff --git a/internal/debug/loudpanic.go b/internal/debug/loudpanic.go index 572ebcefa1..550f663f34 100644 --- a/internal/debug/loudpanic.go +++ b/internal/debug/loudpanic.go @@ -1,18 +1,18 @@ +// Copyright 2015 The go-expanse Authors // Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // +build go1.6 diff --git a/internal/debug/trace.go b/internal/debug/trace.go index c0cf921ff0..835bff6532 100644 --- a/internal/debug/trace.go +++ b/internal/debug/trace.go @@ -23,8 +23,8 @@ import ( "os" "runtime/trace" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" ) // StartGoTrace turns on tracing, writing to the given file. diff --git a/internal/debug/trace_fallback.go b/internal/debug/trace_fallback.go index 4118ff4087..c641059a81 100644 --- a/internal/debug/trace_fallback.go +++ b/internal/debug/trace_fallback.go @@ -1,18 +1,19 @@ +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . //+build !go1.5 diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go index 64c1b5044b..f697d5e7b4 100644 --- a/internal/web3ext/web3ext.go +++ b/internal/web3ext/web3ext.go @@ -14,14 +14,14 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// package web3ext contains geth specific web3.js extensions. +// package web3ext contains gexp specific web3.js extensions. package web3ext var Modules = map[string]string{ "txpool": TxPool_JS, "admin": Admin_JS, "personal": Personal_JS, - "eth": Eth_JS, + "exp": Eth_JS, "miner": Miner_JS, "debug": Debug_JS, "net": Net_JS, @@ -192,36 +192,36 @@ web3._extend({ const Eth_JS = ` web3._extend({ - property: 'eth', + property: 'exp', methods: [ new web3._extend.Method({ name: 'sign', - call: 'eth_sign', + call: 'exp_sign', params: 2, inputFormatter: [web3._extend.formatters.inputAddressFormatter, null] }), new web3._extend.Method({ name: 'resend', - call: 'eth_resend', + call: 'exp_resend', params: 3, inputFormatter: [web3._extend.formatters.inputTransactionFormatter, web3._extend.utils.fromDecimal, web3._extend.utils.fromDecimal] }), new web3._extend.Method({ name: 'getNatSpec', - call: 'eth_getNatSpec', + call: 'exp_getNatSpec', params: 1, inputFormatter: [web3._extend.formatters.inputTransactionFormatter] }), new web3._extend.Method({ name: 'signTransaction', - call: 'eth_signTransaction', + call: 'exp_signTransaction', params: 1, inputFormatter: [web3._extend.formatters.inputTransactionFormatter] }), new web3._extend.Method({ name: 'submitTransaction', - call: 'eth_submitTransaction', + call: 'exp_submitTransaction', params: 1, inputFormatter: [web3._extend.formatters.inputTransactionFormatter] }) @@ -230,7 +230,7 @@ web3._extend({ [ new web3._extend.Property({ name: 'pendingTransactions', - getter: 'eth_pendingTransactions', + getter: 'exp_pendingTransactions', outputFormatter: function(txs) { var formatted = []; for (var i = 0; i < txs.length; i++) { diff --git a/jsre/bignumber_js.go b/jsre/bignumber_js.go index 2e9c74c9f2..8e0fd5f92e 100644 --- a/jsre/bignumber_js.go +++ b/jsre/bignumber_js.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package jsre diff --git a/jsre/ethereum_js.go b/jsre/expanse_js.go similarity index 97% rename from jsre/ethereum_js.go rename to jsre/expanse_js.go index 79ce1d2e2f..d3cf48b285 100644 --- a/jsre/ethereum_js.go +++ b/jsre/expanse_js.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package jsre @@ -1271,7 +1271,7 @@ SolidityParam.prototype.withOffset = function (offset) { }; /** - * This method should be used to combine solidity params together + * This method should be used to combine solidity params togexper * eg. when appending an array * * @method combine @@ -1815,27 +1815,27 @@ var ETH_UNITS = [ 'Gwei', 'szabo', 'finney', - 'femtoether', - 'picoether', - 'nanoether', - 'microether', - 'milliether', + 'femtoexpanse', + 'picoexpanse', + 'nanoexpanse', + 'microexpanse', + 'milliexpanse', 'nano', 'micro', 'milli', - 'ether', + 'expanse', 'grand', - 'Mether', - 'Gether', - 'Tether', - 'Pether', - 'Eether', - 'Zether', - 'Yether', - 'Nether', - 'Dether', - 'Vether', - 'Uether' + 'Mexpanse', + 'Gexpanse', + 'Texpanse', + 'Pexpanse', + 'Eexpanse', + 'Zexpanse', + 'Yexpanse', + 'Nexpanse', + 'Dexpanse', + 'Vexpanse', + 'Uexpanse' ]; module.exports = { @@ -1891,9 +1891,9 @@ module.exports = function (value, options) { },{"crypto-js":58,"crypto-js/sha3":79}],20:[function(require,module,exports){ /* - This file is part of web3.js. + This file is part of expanse.js. - web3.js is free software: you can redistribute it and/or modify + expanse.js 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. @@ -1934,30 +1934,33 @@ var unitMap = { 'noether': '0', 'wei': '1', 'kwei': '1000', - 'Kwei': '1000', - 'babbage': '1000', - 'femtoether': '1000', + 'ada': '1000', + 'femtoexpanse': '1000', 'mwei': '1000000', - 'Mwei': '1000000', - 'lovelace': '1000000', - 'picoether': '1000000', + 'babbage': '1000000', + 'picoexpanse': '1000000', 'gwei': '1000000000', 'Gwei': '1000000000', 'shannon': '1000000000', - 'nanoether': '1000000000', + 'nanoexpanse': '1000000000', 'nano': '1000000000', 'szabo': '1000000000000', - 'microether': '1000000000000', + 'microexpanse': '1000000000000', 'micro': '1000000000000', 'finney': '1000000000000000', - 'milliether': '1000000000000000', + 'milliexpanse': '1000000000000000', 'milli': '1000000000000000', - 'ether': '1000000000000000000', - 'kether': '1000000000000000000000', + 'expanse': '1000000000000000000', + 'kexpanse': '1000000000000000000000', 'grand': '1000000000000000000000', - 'mether': '1000000000000000000000000', - 'gether': '1000000000000000000000000000', - 'tether': '1000000000000000000000000000000' + 'einstein': '1000000000000000000000', + 'elora': '1000000000000000000000', + 'mexpanse': '1000000000000000000000000', + 'aiden': '1000000000000000000000000', + 'gexpanse': '1000000000000000000000000000', + 'heather': '1000000000000000000000000000', + 'texpanse': '1000000000000000000000000000000', + 'franko': '1000000000000000000000000000000' }; /** @@ -2171,12 +2174,12 @@ var toHex = function (val) { * Returns value of unit in Wei * * @method getValueOfUnit - * @param {String} unit the unit to convert to, default ether + * @param {String} unit the unit to convert to, default expanse * @returns {BigNumber} value of the unit (in Wei) * @throws error if the unit is not correct:w */ var getValueOfUnit = function (unit) { - unit = unit ? unit.toLowerCase() : 'ether'; + unit = unit ? unit.toLowerCase() : 'expanse'; var unitValue = unitMap[unit]; if (unitValue === undefined) { throw new Error('This unit doesn\'t exists, please use the one of the following units' + JSON.stringify(unitMap, null, 2)); @@ -2185,24 +2188,24 @@ var getValueOfUnit = function (unit) { }; /** - * Takes a number of wei and converts it to any other ether unit. + * Takes a number of wei and converts it to any other expanse unit. * * Possible units are: * SI Short SI Full Effigy Other - * - kwei femtoether babbage - * - mwei picoether lovelace - * - gwei nanoether shannon nano - * - -- microether szabo micro - * - -- milliether finney milli - * - ether -- -- - * - kether -- grand - * - mether - * - gether - * - tether + * - kwei femtoexpanse ada + * - mwei picoexpanse babbage + * - gwei nanoexpanse shannon nano + * - -- microexpanse szabo micro + * - -- milliexpanse finney milli + * - expanse -- -- + * - kexpanse einstein grand + * - mexpanse + * - gexpanse + * - texpanse * * @method fromWei * @param {Number|String} number can be a number, number string or a HEX of a decimal - * @param {String} unit the unit to convert to, default ether + * @param {String} unit the unit to convert to, default expanse * @return {String|Object} When given a BigNumber object it returns one as well, otherwise a number */ var fromWei = function(number, unit) { @@ -2216,21 +2219,20 @@ var fromWei = function(number, unit) { * * Possible units are: * SI Short SI Full Effigy Other - * - kwei femtoether babbage - * - mwei picoether lovelace - * - gwei nanoether shannon nano - * - -- microether szabo micro - * - -- microether szabo micro - * - -- milliether finney milli - * - ether -- -- - * - kether -- grand - * - mether - * - gether - * - tether + * - kwei femtoexpanse ada + * - mwei picoexpanse babbage + * - gwei nanoexpanse shannon nano + * - -- microexpanse szabo micro + * - -- milliexpanse finney milli + * - expanse -- -- + * - kexpanse einstein grand + * - mexpanse + * - gexpanse + * - texpanse * * @method toWei * @param {Number|String|BigNumber} number can be a number, number string or a HEX of a decimal - * @param {String} unit the unit to convert from, default ether + * @param {String} unit the unit to convert from, default expanse * @return {String|Object} When given a BigNumber object it returns one as well, otherwise a number */ var toWei = function(number, unit) { @@ -2523,7 +2525,7 @@ module.exports={ var RequestManager = require('./web3/requestmanager'); var Iban = require('./web3/iban'); -var Eth = require('./web3/methods/eth'); +var Exp = require('./web3/methods/exp'); var DB = require('./web3/methods/db'); var Shh = require('./web3/methods/shh'); var Net = require('./web3/methods/net'); @@ -2538,12 +2540,11 @@ var Property = require('./web3/property'); var HttpProvider = require('./web3/httpprovider'); var IpcProvider = require('./web3/ipcprovider'); - - function Web3 (provider) { this._requestManager = new RequestManager(provider); this.currentProvider = provider; - this.eth = new Eth(this); + this.exp = new Exp(this); + this.eth = this.exp; this.db = new DB(this); this.shh = new Shh(this); this.net = new Net(this); @@ -2593,7 +2594,6 @@ Web3.prototype.isChecksumAddress = utils.isChecksumAddress; Web3.prototype.toChecksumAddress = utils.toChecksumAddress; Web3.prototype.isIBAN = utils.isIBAN; - Web3.prototype.sha3 = function(string, options) { return '0x' + sha3(string, options); }; @@ -2618,8 +2618,8 @@ var properties = function () { inputFormatter: utils.toDecimal }), new Property({ - name: 'version.ethereum', - getter: 'eth_protocolVersion', + name: 'version.expanse', + getter: 'exp_protocolVersion', inputFormatter: utils.toDecimal }), new Property({ @@ -2640,8 +2640,7 @@ Web3.prototype.createBatch = function () { module.exports = Web3; - -},{"./utils/sha3":19,"./utils/utils":20,"./version.json":21,"./web3/batch":24,"./web3/extend":28,"./web3/httpprovider":32,"./web3/iban":33,"./web3/ipcprovider":34,"./web3/methods/db":37,"./web3/methods/eth":38,"./web3/methods/net":39,"./web3/methods/personal":40,"./web3/methods/shh":41,"./web3/property":44,"./web3/requestmanager":45,"./web3/settings":46}],23:[function(require,module,exports){ +},{"./utils/sha3":19,"./utils/utils":20,"./version.json":21,"./web3/batch":24,"./web3/extend":28,"./web3/httpprovider":32,"./web3/iban":33,"./web3/ipcprovider":34,"./web3/methods/db":37,"./web3/methods/exp":38,"./web3/methods/net":39,"./web3/methods/personal":40,"./web3/methods/shh":41,"./web3/property":44,"./web3/requestmanager":45,"./web3/settings":46}],23:[function(require,module,exports){ /* This file is part of web3.js. @@ -2720,7 +2719,7 @@ AllSolidityEvents.prototype.execute = function (options, callback) { var o = this.encode(options); var formatter = this.decode.bind(this); - return new Filter(this._requestManager, o, watches.eth(), formatter, callback); + return new Filter(this._requestManager, o, watches.exp(), formatter, callback); }; AllSolidityEvents.prototype.attachToContract = function (contract) { @@ -2746,6 +2745,7 @@ module.exports = AllSolidityEvents; GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License + along with web3.js. If not, see . */ /** @@ -2858,7 +2858,7 @@ var addFunctionsToContract = function (contract) { contract.abi.filter(function (json) { return json.type === 'function'; }).map(function (json) { - return new SolidityFunction(contract._eth, json, contract.address); + return new SolidityFunction(contract._exp, json, contract.address); }).forEach(function (f) { f.attachToContract(contract); }); @@ -2876,11 +2876,11 @@ var addEventsToContract = function (contract) { return json.type === 'event'; }); - var All = new AllEvents(contract._eth._requestManager, events, contract.address); + var All = new AllEvents(contract._exp._requestManager, events, contract.address); All.attachToContract(contract); events.map(function (json) { - return new SolidityEvent(contract._eth._requestManager, json, contract.address); + return new SolidityEvent(contract._exp._requestManager, json, contract.address); }).forEach(function (e) { e.attachToContract(contract); }); @@ -2900,7 +2900,7 @@ var checkForContractAddress = function(contract, callback){ callbackFired = false; // wait for receipt - var filter = contract._eth.filter('latest', function(e){ + var filter = contract._exp.filter('latest', function(e){ if (!e && !callbackFired) { count++; @@ -2918,10 +2918,10 @@ var checkForContractAddress = function(contract, callback){ } else { - contract._eth.getTransactionReceipt(contract.transactionHash, function(e, receipt){ + contract._exp.getTransactionReceipt(contract.transactionHash, function(e, receipt){ if(receipt && !callbackFired) { - contract._eth.getCode(receipt.contractAddress, function(e, code){ + contract._exp.getCode(receipt.contractAddress, function(e, code){ /*jshint maxcomplexity: 6 */ if(callbackFired || !code) @@ -2964,8 +2964,8 @@ var checkForContractAddress = function(contract, callback){ * @method ContractFactory * @param {Array} abi */ -var ContractFactory = function (eth, abi) { - this.eth = eth; +var ContractFactory = function (exp, abi) { + this.exp = exp; this.abi = abi; /** @@ -2979,7 +2979,7 @@ var ContractFactory = function (eth, abi) { * @returns {Contract} returns contract instance */ this.new = function () { - var contract = new Contract(this.eth, this.abi); + var contract = new Contract(this.exp, this.abi); // parse arguments var options = {}; // required! @@ -3001,7 +3001,7 @@ var ContractFactory = function (eth, abi) { if (callback) { // wait for the contract address adn check if the code was deployed - this.eth.sendTransaction(options, function (err, hash) { + this.exp.sendTransaction(options, function (err, hash) { if (err) { callback(err); } else { @@ -3015,7 +3015,7 @@ var ContractFactory = function (eth, abi) { } }); } else { - var hash = this.eth.sendTransaction(options); + var hash = this.exp.sendTransaction(options); // add the transaction hash contract.transactionHash = hash; checkForContractAddress(contract); @@ -3023,7 +3023,6 @@ var ContractFactory = function (eth, abi) { return contract; }; - this.new.getData = this.getData.bind(this); }; @@ -3038,8 +3037,6 @@ var ContractFactory = function (eth, abi) { //return new ContractFactory(abi); //}; - - /** * Should be called to get access to existing contract on a blockchain * @@ -3050,7 +3047,7 @@ var ContractFactory = function (eth, abi) { * otherwise calls callback function (err, contract) */ ContractFactory.prototype.at = function (address, callback) { - var contract = new Contract(this.eth, this.abi, address); + var contract = new Contract(this.exp, this.abi, address); // this functions are not part of prototype, // because we dont want to spoil the interface @@ -3090,8 +3087,8 @@ ContractFactory.prototype.getData = function () { * @param {Array} abi * @param {Address} contract address */ -var Contract = function (eth, abi, address) { - this._eth = eth; +var Contract = function (exp, abi, address) { + this._eth = exp; this.transactionHash = null; this.address = address; this.abi = abi; @@ -3196,7 +3193,7 @@ SolidityEvent.prototype.types = function (indexed) { }; /** - * Should be used to get event display name + * Exp methods and properties * * @method displayName * @return {String} event display name @@ -3231,7 +3228,7 @@ SolidityEvent.prototype.signature = function () { * @method encode * @param {Object} indexed * @param {Object} options - * @return {Object} everything combined together and encoded + * @return {Object} everything combined togexper and encoded */ SolidityEvent.prototype.encode = function (indexed, options) { indexed = indexed || {}; @@ -3328,7 +3325,7 @@ SolidityEvent.prototype.execute = function (indexed, options, callback) { var o = this.encode(indexed, options); var formatter = this.decode.bind(this); - return new Filter(this._requestManager, o, watches.eth(), formatter, callback); + return new Filter(this._requestManager, o, watches.exp(), formatter, callback); }; /** @@ -3348,7 +3345,6 @@ SolidityEvent.prototype.attachToContract = function (contract) { module.exports = SolidityEvent; - },{"../solidity/coder":7,"../utils/sha3":19,"../utils/utils":20,"./filter":29,"./formatters":30,"./methods/watches":42}],28:[function(require,module,exports){ var formatters = require('./formatters'); var utils = require('./../utils/utils'); @@ -3968,8 +3964,8 @@ var sha3 = require('../utils/sha3'); /** * This prototype should be used to call/sendTransaction to solidity functions */ -var SolidityFunction = function (eth, json, address) { - this._eth = eth; +var SolidityFunction = function (exp, json, address) { + this._eth = exp; this._inputTypes = json.inputs.map(function (i) { return i.type; }); @@ -4049,12 +4045,12 @@ SolidityFunction.prototype.call = function () { if (!callback) { - var output = this._eth.call(payload, defaultBlock); + var output = this._exp.call(payload, defaultBlock); return this.unpackOutput(output); } var self = this; - this._eth.call(payload, defaultBlock, function (error, output) { + this._exp.call(payload, defaultBlock, function (error, output) { callback(error, self.unpackOutput(output)); }); }; @@ -4070,10 +4066,10 @@ SolidityFunction.prototype.sendTransaction = function () { var payload = this.toPayload(args); if (!callback) { - return this._eth.sendTransaction(payload); + return this._exp.sendTransaction(payload); } - this._eth.sendTransaction(payload, callback); + this._exp.sendTransaction(payload, callback); }; /** @@ -4087,10 +4083,10 @@ SolidityFunction.prototype.estimateGas = function () { var payload = this.toPayload(args); if (!callback) { - return this._eth.estimateGas(payload); + return this._exp.estimateGas(payload); } - this._eth.estimateGas(payload, callback); + this._exp.estimateGas(payload, callback); }; /** @@ -4139,7 +4135,7 @@ SolidityFunction.prototype.request = function () { var format = this.unpackOutput.bind(this); return { - method: this._constant ? 'eth_call' : 'eth_sendTransaction', + method: this._constant ? 'exp_call' : 'exp_sendTransaction', callback: callback, params: [payload], format: format @@ -4235,7 +4231,7 @@ if (typeof Meteor !== 'undefined' && Meteor.isServer) { // jshint ignore: line * HttpProvider should be used to send rpc calls over http */ var HttpProvider = function (host) { - this.host = host || 'http://localhost:8545'; + this.host = host || 'http://localhost:9656'; }; /** @@ -4422,7 +4418,7 @@ var Iban = function (iban) { }; /** - * This method should be used to create iban object from ethereum address + * This method should be used to create iban object from expanse address * * @method fromAddress * @param {String} address @@ -4461,7 +4457,7 @@ Iban.fromBban = function (bban) { * @return {Iban} the IBAN object */ Iban.createIndirect = function (options) { - return Iban.fromBban('ETH' + options.institution + options.identifier); + return Iban.fromBban('EXP' + options.institution + options.identifier); }; /** @@ -4483,6 +4479,7 @@ Iban.isValid = function (iban) { * @returns {Boolean} true if it is, otherwise false */ Iban.prototype.isValid = function () { + return /^XE[0-9]{2}(ETH[0-9A-Z]{13}|[0-9A-Z]{30,31})$/.test(this._iban) && mod9710(iso13616Prepare(this._iban)) === 1; }; @@ -4565,6 +4562,7 @@ module.exports = Iban; },{"bignumber.js":"bignumber.js"}],34:[function(require,module,exports){ /* + This file is part of web3.js. web3.js is free software: you can redistribute it and/or modify @@ -4572,12 +4570,14 @@ module.exports = Iban; the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + web3.js 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License + along with web3.js. If not, see . */ /** @file ipcprovider.js @@ -4780,14 +4780,13 @@ module.exports = IpcProvider; 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. - web3.js 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . + along with expanse.js. If not, see . */ /** @file jsonrpc.js * @authors: @@ -5109,16 +5108,16 @@ module.exports = DB; the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - web3.js 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . + */ /** - * @file eth.js + * @file exp.js * @author Marek Kotewicz * @author Fabian Vogelsteller * @date 2015 @@ -5140,26 +5139,26 @@ var Iban = require('../iban'); var transfer = require('../transfer'); var blockCall = function (args) { - return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? "eth_getBlockByHash" : "eth_getBlockByNumber"; + return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? "exp_getBlockByHash" : "exp_getBlockByNumber"; }; var transactionFromBlockCall = function (args) { - return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getTransactionByBlockHashAndIndex' : 'eth_getTransactionByBlockNumberAndIndex'; + return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'exp_getTransactionByBlockHashAndIndex' : 'exp_getTransactionByBlockNumberAndIndex'; }; var uncleCall = function (args) { - return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getUncleByBlockHashAndIndex' : 'eth_getUncleByBlockNumberAndIndex'; + return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'exp_getUncleByBlockHashAndIndex' : 'exp_getUncleByBlockNumberAndIndex'; }; var getBlockTransactionCountCall = function (args) { - return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getBlockTransactionCountByHash' : 'eth_getBlockTransactionCountByNumber'; + return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'exp_getBlockTransactionCountByHash' : 'exp_getBlockTransactionCountByNumber'; }; var uncleCountCall = function (args) { - return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getUncleCountByBlockHash' : 'eth_getUncleCountByBlockNumber'; + return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'exp_getUncleCountByBlockHash' : 'exp_getUncleCountByBlockNumber'; }; -function Eth(web3) { +function Exp(web3) { this._requestManager = web3._requestManager; var self = this; @@ -5179,7 +5178,7 @@ function Eth(web3) { this.sendIBANTransaction = transfer.bind(null, this); } -Object.defineProperty(Eth.prototype, 'defaultBlock', { +Object.defineProperty(Exp.prototype, 'defaultBlock', { get: function () { return c.defaultBlock; }, @@ -5189,7 +5188,7 @@ Object.defineProperty(Eth.prototype, 'defaultBlock', { } }); -Object.defineProperty(Eth.prototype, 'defaultAccount', { +Object.defineProperty(Exp.prototype, 'defaultAccount', { get: function () { return c.defaultAccount; }, @@ -5202,7 +5201,7 @@ Object.defineProperty(Eth.prototype, 'defaultAccount', { var methods = function () { var getBalance = new Method({ name: 'getBalance', - call: 'eth_getBalance', + call: 'exp_getBalance', params: 2, inputFormatter: [formatters.inputAddressFormatter, formatters.inputDefaultBlockNumberFormatter], outputFormatter: formatters.outputBigNumberFormatter @@ -5210,14 +5209,14 @@ var methods = function () { var getStorageAt = new Method({ name: 'getStorageAt', - call: 'eth_getStorageAt', + call: 'exp_getStorageAt', params: 3, inputFormatter: [null, utils.toHex, formatters.inputDefaultBlockNumberFormatter] }); var getCode = new Method({ name: 'getCode', - call: 'eth_getCode', + call: 'exp_getCode', params: 2, inputFormatter: [formatters.inputAddressFormatter, formatters.inputDefaultBlockNumberFormatter] }); @@ -5241,7 +5240,7 @@ var methods = function () { var getCompilers = new Method({ name: 'getCompilers', - call: 'eth_getCompilers', + call: 'exp_getCompilers', params: 0 }); @@ -5263,7 +5262,7 @@ var methods = function () { var getTransaction = new Method({ name: 'getTransaction', - call: 'eth_getTransactionByHash', + call: 'exp_getTransactionByHash', params: 1, outputFormatter: formatters.outputTransactionFormatter }); @@ -5278,14 +5277,14 @@ var methods = function () { var getTransactionReceipt = new Method({ name: 'getTransactionReceipt', - call: 'eth_getTransactionReceipt', + call: 'exp_getTransactionReceipt', params: 1, outputFormatter: formatters.outputTransactionReceiptFormatter }); var getTransactionCount = new Method({ name: 'getTransactionCount', - call: 'eth_getTransactionCount', + call: 'exp_getTransactionCount', params: 2, inputFormatter: [null, formatters.inputDefaultBlockNumberFormatter], outputFormatter: utils.toDecimal @@ -5293,35 +5292,35 @@ var methods = function () { var sendRawTransaction = new Method({ name: 'sendRawTransaction', - call: 'eth_sendRawTransaction', + call: 'exp_sendRawTransaction', params: 1, inputFormatter: [null] }); var sendTransaction = new Method({ name: 'sendTransaction', - call: 'eth_sendTransaction', + call: 'exp_sendTransaction', params: 1, inputFormatter: [formatters.inputTransactionFormatter] }); var sign = new Method({ name: 'sign', - call: 'eth_sign', + call: 'exp_sign', params: 2, inputFormatter: [formatters.inputAddressFormatter, null] }); var call = new Method({ name: 'call', - call: 'eth_call', + call: 'exp_call', params: 2, inputFormatter: [formatters.inputCallFormatter, formatters.inputDefaultBlockNumberFormatter] }); var estimateGas = new Method({ name: 'estimateGas', - call: 'eth_estimateGas', + call: 'exp_estimateGas', params: 1, inputFormatter: [formatters.inputCallFormatter], outputFormatter: utils.toDecimal @@ -5329,31 +5328,31 @@ var methods = function () { var compileSolidity = new Method({ name: 'compile.solidity', - call: 'eth_compileSolidity', + call: 'exp_compileSolidity', params: 1 }); var compileLLL = new Method({ name: 'compile.lll', - call: 'eth_compileLLL', + call: 'exp_compileLLL', params: 1 }); var compileSerpent = new Method({ name: 'compile.serpent', - call: 'eth_compileSerpent', + call: 'exp_compileSerpent', params: 1 }); var submitWork = new Method({ name: 'submitWork', - call: 'eth_submitWork', + call: 'exp_submitWork', params: 3 }); var getWork = new Method({ name: 'getWork', - call: 'eth_getWork', + call: 'exp_getWork', params: 0 }); @@ -5388,81 +5387,76 @@ var properties = function () { return [ new Property({ name: 'coinbase', - getter: 'eth_coinbase' + getter: 'exp_coinbase' }), new Property({ name: 'mining', - getter: 'eth_mining' + getter: 'exp_mining' }), new Property({ name: 'hashrate', - getter: 'eth_hashrate', + getter: 'exp_hashrate', outputFormatter: utils.toDecimal }), new Property({ name: 'syncing', - getter: 'eth_syncing', + getter: 'exp_syncing', outputFormatter: formatters.outputSyncingFormatter }), new Property({ name: 'gasPrice', - getter: 'eth_gasPrice', + getter: 'exp_gasPrice', outputFormatter: formatters.outputBigNumberFormatter }), new Property({ name: 'accounts', - getter: 'eth_accounts' + getter: 'exp_accounts' }), new Property({ name: 'blockNumber', - getter: 'eth_blockNumber', + getter: 'exp_blockNumber', outputFormatter: utils.toDecimal }) ]; }; -Eth.prototype.contract = function (abi) { +Exp.prototype.contract = function (abi) { var factory = new Contract(this, abi); return factory; }; -Eth.prototype.filter = function (fil, callback) { - return new Filter(this._requestManager, fil, watches.eth(), formatters.outputLogFormatter, callback); +Exp.prototype.filter = function (fil, callback) { + return new Filter(this._requestManager, fil, watches.exp(), formatters.outputLogFormatter, callback); }; -Eth.prototype.namereg = function () { +Exp.prototype.namereg = function () { return this.contract(namereg.global.abi).at(namereg.global.address); }; -Eth.prototype.icapNamereg = function () { +Exp.prototype.icapNamereg = function () { return this.contract(namereg.icap.abi).at(namereg.icap.address); }; -Eth.prototype.isSyncing = function (callback) { +Exp.prototype.isSyncing = function (callback) { return new IsSyncing(this._requestManager, callback); }; -module.exports = Eth; +module.exports = Exp; },{"../../utils/config":18,"../../utils/utils":20,"../contract":25,"../filter":29,"../formatters":30,"../iban":33,"../method":36,"../namereg":43,"../property":44,"../syncing":47,"../transfer":48,"./watches":42}],39:[function(require,module,exports){ /* - This file is part of web3.js. - - web3.js 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. - web3.js 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . */ -/** @file eth.js +/** @file exp.js * @authors: * Marek Kotewicz * @date 2015 @@ -5482,7 +5476,7 @@ var Net = function (web3) { }); }; -/// @returns an array of objects describing web3.eth api properties +/// @returns an array of objects describing web3.exp api properties var properties = function () { return [ new Property({ @@ -5517,7 +5511,7 @@ module.exports = Net; along with web3.js. If not, see . */ /** - * @file eth.js + * @file exp.js * @author Marek Kotewicz * @author Fabian Vogelsteller * @date 2015 @@ -5588,20 +5582,18 @@ module.exports = Personal; },{"../formatters":30,"../method":36,"../property":44}],41:[function(require,module,exports){ /* - This file is part of web3.js. - web3.js 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. - web3.js 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . + */ /** @file shh.js * @authors: @@ -5676,20 +5668,17 @@ module.exports = Shh; },{"../filter":29,"../formatters":30,"../method":36,"./watches":42}],42:[function(require,module,exports){ /* - This file is part of web3.js. - - web3.js 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. - web3.js 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . + */ /** @file watches.js * @authors: @@ -5699,8 +5688,8 @@ module.exports = Shh; var Method = require('../method'); -/// @returns an array of objects describing web3.eth.filter api methods -var eth = function () { +/// @returns an array of objects describing web3.exp.filter api methods +var exp = function () { var newFilterCall = function (args) { var type = args[0]; @@ -5708,13 +5697,13 @@ var eth = function () { case 'latest': args.shift(); this.params = 0; - return 'eth_newBlockFilter'; + return 'exp_newBlockFilter'; case 'pending': args.shift(); this.params = 0; - return 'eth_newPendingTransactionFilter'; + return 'exp_newPendingTransactionFilter'; default: - return 'eth_newFilter'; + return 'exp_newFilter'; } }; @@ -5726,19 +5715,19 @@ var eth = function () { var uninstallFilter = new Method({ name: 'uninstallFilter', - call: 'eth_uninstallFilter', + call: 'exp_uninstallFilter', params: 1 }); var getLogs = new Method({ name: 'getLogs', - call: 'eth_getFilterLogs', + call: 'exp_getFilterLogs', params: 1 }); var poll = new Method({ name: 'poll', - call: 'eth_getFilterChanges', + call: 'exp_getFilterChanges', params: 1 }); @@ -5785,27 +5774,22 @@ var shh = function () { }; module.exports = { - eth: eth, + exp: exp, shh: shh }; },{"../method":36}],43:[function(require,module,exports){ /* - This file is part of web3.js. - - web3.js 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. - - web3.js 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . + */ /** * @file namereg.js @@ -5833,20 +5817,6 @@ module.exports = { },{"../contracts/GlobalRegistrar.json":1,"../contracts/ICAPRegistrar.json":2}],44:[function(require,module,exports){ /* - This file is part of web3.js. - - web3.js 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. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . */ /** * @file property.js @@ -5979,20 +5949,6 @@ module.exports = Property; },{"../utils/utils":20}],45:[function(require,module,exports){ /* - This file is part of web3.js. - - web3.js 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. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . */ /** * @file requestmanager.js @@ -6011,7 +5967,7 @@ var errors = require('./errors'); /** * It's responsible for passing messages to providers - * It's also responsible for polling the ethereum node for incoming messages + * It's also responsible for polling the expanse node for incoming messages * Default poll timeout is 1 second * Singleton */ @@ -6257,20 +6213,6 @@ module.exports = Settings; },{}],47:[function(require,module,exports){ /* - This file is part of web3.js. - - web3.js 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. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . */ /** @file syncing.js * @authors: @@ -6319,7 +6261,7 @@ var pollSyncing = function(self) { }; self.requestManager.startPolling({ - method: 'eth_syncing', + method: 'exp_syncing', params: [], }, self.pollId, onMessage, self.stopWatching.bind(self)); @@ -6352,20 +6294,6 @@ module.exports = IsSyncing; },{"../utils/utils":20,"./formatters":30}],48:[function(require,module,exports){ /* - This file is part of web3.js. - - web3.js 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. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . */ /** * @file transfer.js @@ -6385,23 +6313,23 @@ var exchangeAbi = require('../contracts/SmartExchange.json'); * @param {Value} value to be tranfered * @param {Function} callback, callback */ -var transfer = function (eth, from, to, value, callback) { +var transfer = function (exp, from, to, value, callback) { var iban = new Iban(to); if (!iban.isValid()) { throw new Error('invalid iban address'); } if (iban.isDirect()) { - return transferToAddress(eth, from, iban.address(), value, callback); + return transferToAddress(exp, from, iban.address(), value, callback); } if (!callback) { - var address = eth.icapNamereg().addr(iban.institution()); - return deposit(eth, from, address, value, iban.client()); + var address = exp.icapNamereg().addr(iban.institution()); + return deposit(exp, from, address, value, iban.client()); } - eth.icapNamereg().addr(iban.institution(), function (err, address) { - return deposit(eth, from, address, value, iban.client(), callback); + exp.icapNamereg().addr(iban.institution(), function (err, address) { + return deposit(exp, from, address, value, iban.client(), callback); }); }; @@ -6415,8 +6343,8 @@ var transfer = function (eth, from, to, value, callback) { * @param {Value} value to be tranfered * @param {Function} callback, callback */ -var transferToAddress = function (eth, from, to, value, callback) { - return eth.sendTransaction({ +var transferToAddress = function (exp, from, to, value, callback) { + return exp.sendTransaction({ address: to, from: from, value: value @@ -6433,9 +6361,9 @@ var transferToAddress = function (eth, from, to, value, callback) { * @param {String} client unique identifier * @param {Function} callback, callback */ -var deposit = function (eth, from, to, value, client, callback) { +var deposit = function (exp, from, to, value, client, callback) { var abi = exchangeAbi; - return eth.contract(abi).at(to).deposit(client, { + return exp.contract(abi).at(to).deposit(client, { from: from, value: value }, callback); @@ -6443,7 +6371,6 @@ var deposit = function (eth, from, to, value, client, callback) { module.exports = transfer; - },{"../contracts/SmartExchange.json":3,"./iban":33}],49:[function(require,module,exports){ },{}],50:[function(require,module,exports){ diff --git a/jsre/jsre.go b/jsre/jsre.go index 59730bc0da..0c7bcb6f6f 100644 --- a/jsre/jsre.go +++ b/jsre/jsre.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // Package jsre provides execution environment for JavaScript. package jsre @@ -26,7 +26,7 @@ import ( "sync" "time" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse-project/go-expanse/common" "github.com/robertkrimen/otto" ) diff --git a/jsre/jsre_test.go b/jsre/jsre_test.go index ffb6999db7..a45b1a9245 100644 --- a/jsre/jsre_test.go +++ b/jsre/jsre_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package jsre diff --git a/jsre/pp_js.go b/jsre/pp_js.go new file mode 100644 index 0000000000..5d8cc4a527 --- /dev/null +++ b/jsre/pp_js.go @@ -0,0 +1,137 @@ +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. +// +// The go-expanse library 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. +// +// The go-expanse 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-expanse library. If not, see . + +package jsre + +const pp_js = ` +function pp(object, indent) { + try { + JSON.stringify(object) + } catch(e) { + return pp(e, indent); + } + + var str = ""; + if(object instanceof Array) { + str += "["; + for(var i = 0, l = object.length; i < l; i++) { + str += pp(object[i], indent); + + if(i < l-1) { + str += ", "; + } + } + str += " ]"; + } else if (object instanceof Error) { + str += "\033[31m" + "Error:\033[0m " + object.message; + } else if (isBigNumber(object)) { + str += "\033[32m'" + object.toString(10) + "'"; + } else if(typeof(object) === "object") { + str += "{\n"; + indent += " "; + + var fields = getFields(object); + var last = fields[fields.length - 1]; + fields.forEach(function (key) { + str += indent + key + ": "; + try { + str += pp(object[key], indent); + } catch (e) { + str += pp(e, indent); + } + if(key !== last) { + str += ","; + } + str += "\n"; + }); + str += indent.substr(2, indent.length) + "}"; + } else if(typeof(object) === "string") { + str += "\033[32m'" + object + "'"; + } else if(typeof(object) === "undefined") { + str += "\033[1m\033[30m" + object; + } else if(typeof(object) === "number") { + str += "\033[31m" + object; + } else if(typeof(object) === "function") { + str += "\033[35m" + object.toString().split(" {")[0]; + } else { + str += object; + } + + str += "\033[0m"; + + return str; +} + +var redundantFields = [ + 'valueOf', + 'toString', + 'toLocaleString', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'constructor' +]; + +var getFields = function (object) { + var members = Object.getOwnPropertyNames(object); + if (object.constructor && object.constructor.prototype) { + members = members.concat(Object.getOwnPropertyNames(object.constructor.prototype)); + } + + var fields = members.filter(function (member) { + return !isMemberFunction(object, member) + }).sort() + var funcs = members.filter(function (member) { + return isMemberFunction(object, member) + }).sort() + + var results = fields.concat(funcs); + return results.filter(function (field) { + return redundantFields.indexOf(field) === -1; + }); +}; + +var isMemberFunction = function(object, member) { + try { + return typeof(object[member]) === "function"; + } catch(e) { + return false; + } +} + +var isBigNumber = function (object) { + var result = typeof BigNumber !== 'undefined' && object instanceof BigNumber; + + if (!result) { + if (typeof(object) === "object" && object.constructor != null) { + result = object.constructor.toString().indexOf("function BigNumber(") == 0; + } + } + + return result +}; + +function prettyPrint(/* */) { + var args = arguments; + var ret = ""; + for(var i = 0, l = args.length; i < l; i++) { + ret += pp(args[i], "") + "\n"; + } + return ret; +} + +var print = prettyPrint; +` diff --git a/jsre/pretty.go b/jsre/pretty.go index cd7fa5232b..190ad3f346 100644 --- a/jsre/pretty.go +++ b/jsre/pretty.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package jsre diff --git a/light/odr.go b/light/odr.go index 4c69040ef8..a23e94ce8f 100644 --- a/light/odr.go +++ b/light/odr.go @@ -15,14 +15,14 @@ // along with the go-ethereum library. If not, see . // Package light implements on-demand retrieval capable state and chain objects -// for the Ethereum Light Client. +// for the Expanse Light Client. package light import ( - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/rlp" "golang.org/x/net/context" ) diff --git a/light/state.go b/light/state.go index e18f9cdc5d..fd2427017e 100644 --- a/light/state.go +++ b/light/state.go @@ -19,9 +19,9 @@ package light import ( "math/big" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" "golang.org/x/net/context" ) diff --git a/light/state_object.go b/light/state_object.go index 030653c770..d1fe678eb8 100644 --- a/light/state_object.go +++ b/light/state_object.go @@ -21,11 +21,11 @@ import ( "fmt" "math/big" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/rlp" "golang.org/x/net/context" ) diff --git a/light/state_test.go b/light/state_test.go index 2c2e6daea1..0c4dd419d2 100644 --- a/light/state_test.go +++ b/light/state_test.go @@ -21,10 +21,10 @@ import ( "math/big" "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/trie" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/trie" "golang.org/x/net/context" ) diff --git a/light/trie.go b/light/trie.go index e9c96ea48e..93ac2b01e4 100644 --- a/light/trie.go +++ b/light/trie.go @@ -17,9 +17,9 @@ package light import ( - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/trie" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/trie" "golang.org/x/net/context" ) diff --git a/logger/example_test.go b/logger/example_test.go index ce5f9da67f..6013eca42f 100644 --- a/logger/example_test.go +++ b/logger/example_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package logger diff --git a/logger/glog/glog_test.go b/logger/glog/glog_test.go index b58f3d6426..b98ad045da 100644 --- a/logger/glog/glog_test.go +++ b/logger/glog/glog_test.go @@ -104,7 +104,7 @@ func TestInfoDepth(t *testing.T) { f := func() { InfoDepth(1, "depth-test1") } - // The next three lines must stay together + // The next three lines must stay togexper _, _, wantLine, _ := runtime.Caller(0) InfoDepth(0, "depth-test0") f() diff --git a/logger/log.go b/logger/log.go index 38a6ce1391..9364aac347 100644 --- a/logger/log.go +++ b/logger/log.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package logger @@ -22,7 +22,7 @@ import ( "log" "os" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse-project/go-expanse/common" ) func openLogFile(datadir string, filename string) *os.File { diff --git a/logger/loggers.go b/logger/loggers.go index e63355d0bf..32e351fccd 100644 --- a/logger/loggers.go +++ b/logger/loggers.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . /* Package logger implements a multi-output leveled logger. @@ -47,7 +47,7 @@ const ( ) // A Logger prints messages prefixed by a given tag. It provides named -// Printf and Println style methods for all loglevels. Each ethereum +// Printf and Println style methods for all loglevels. Each expanse // component should have its own logger with a unique prefix. type Logger struct { tag string diff --git a/logger/loggers_test.go b/logger/loggers_test.go index 85564698bc..9be2727609 100644 --- a/logger/loggers_test.go +++ b/logger/loggers_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package logger diff --git a/logger/logsystem.go b/logger/logsystem.go index 24f4351d49..e36d1c6953 100644 --- a/logger/logsystem.go +++ b/logger/logsystem.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package logger diff --git a/logger/sys.go b/logger/sys.go index 18d4ea641c..1f5aafd793 100644 --- a/logger/sys.go +++ b/logger/sys.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package logger diff --git a/logger/types.go b/logger/types.go index ee7e845de8..bd1425105e 100644 --- a/logger/types.go +++ b/logger/types.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package logger @@ -44,7 +44,7 @@ type LogEvent struct { type LogStarting struct { ClientString string `json:"client_impl"` - ProtocolVersion int `json:"eth_version"` + ProtocolVersion int `json:"exp_version"` LogEvent } @@ -83,7 +83,7 @@ type EthMinerNewBlock struct { } func (l *EthMinerNewBlock) EventName() string { - return "eth.miner.new_block" + return "exp.miner.new_block" } type EthChainReceivedNewBlock struct { @@ -96,7 +96,7 @@ type EthChainReceivedNewBlock struct { } func (l *EthChainReceivedNewBlock) EventName() string { - return "eth.chain.received.new_block" + return "exp.chain.received.new_block" } type EthChainNewHead struct { @@ -108,7 +108,7 @@ type EthChainNewHead struct { } func (l *EthChainNewHead) EventName() string { - return "eth.chain.new_head" + return "exp.chain.new_head" } type EthTxReceived struct { @@ -118,7 +118,7 @@ type EthTxReceived struct { } func (l *EthTxReceived) EventName() string { - return "eth.tx.received" + return "exp.tx.received" } // @@ -212,7 +212,7 @@ func (l *EthTxReceived) EventName() string { // } // func (l *P2PEthDisconnectingBadBlock) EventName() string { -// return "p2p.eth.disconnecting.bad_block" +// return "p2p.exp.disconnecting.bad_block" // } // type P2PEthDisconnectingBadTx struct { @@ -223,7 +223,7 @@ func (l *EthTxReceived) EventName() string { // } // func (l *P2PEthDisconnectingBadTx) EventName() string { -// return "p2p.eth.disconnecting.bad_tx" +// return "p2p.exp.disconnecting.bad_tx" // } // type EthNewBlockBroadcasted struct { @@ -236,7 +236,7 @@ func (l *EthTxReceived) EventName() string { // } // func (l *EthNewBlockBroadcasted) EventName() string { -// return "eth.newblock.broadcasted" +// return "exp.newblock.broadcasted" // } // type EthNewBlockIsKnown struct { @@ -249,7 +249,7 @@ func (l *EthTxReceived) EventName() string { // } // func (l *EthNewBlockIsKnown) EventName() string { -// return "eth.newblock.is_known" +// return "exp.newblock.is_known" // } // type EthNewBlockIsNew struct { @@ -262,7 +262,7 @@ func (l *EthTxReceived) EventName() string { // } // func (l *EthNewBlockIsNew) EventName() string { -// return "eth.newblock.is_new" +// return "exp.newblock.is_new" // } // type EthNewBlockMissingParent struct { @@ -275,7 +275,7 @@ func (l *EthTxReceived) EventName() string { // } // func (l *EthNewBlockMissingParent) EventName() string { -// return "eth.newblock.missing_parent" +// return "exp.newblock.missing_parent" // } // type EthNewBlockIsInvalid struct { @@ -288,7 +288,7 @@ func (l *EthTxReceived) EventName() string { // } // func (l *EthNewBlockIsInvalid) EventName() string { -// return "eth.newblock.is_invalid" +// return "exp.newblock.is_invalid" // } // type EthNewBlockChainIsOlder struct { @@ -301,7 +301,7 @@ func (l *EthTxReceived) EventName() string { // } // func (l *EthNewBlockChainIsOlder) EventName() string { -// return "eth.newblock.chain.is_older" +// return "exp.newblock.chain.is_older" // } // type EthNewBlockChainIsCanonical struct { @@ -314,7 +314,7 @@ func (l *EthTxReceived) EventName() string { // } // func (l *EthNewBlockChainIsCanonical) EventName() string { -// return "eth.newblock.chain.is_cannonical" +// return "exp.newblock.chain.is_cannonical" // } // type EthNewBlockChainNotCanonical struct { @@ -327,7 +327,7 @@ func (l *EthTxReceived) EventName() string { // } // func (l *EthNewBlockChainNotCanonical) EventName() string { -// return "eth.newblock.chain.not_cannonical" +// return "exp.newblock.chain.not_cannonical" // } // type EthTxCreated struct { @@ -340,7 +340,7 @@ func (l *EthTxReceived) EventName() string { // } // func (l *EthTxCreated) EventName() string { -// return "eth.tx.created" +// return "exp.tx.created" // } // type EthTxBroadcasted struct { @@ -352,7 +352,7 @@ func (l *EthTxReceived) EventName() string { // } // func (l *EthTxBroadcasted) EventName() string { -// return "eth.tx.broadcasted" +// return "exp.tx.broadcasted" // } // type EthTxValidated struct { @@ -364,7 +364,7 @@ func (l *EthTxReceived) EventName() string { // } // func (l *EthTxValidated) EventName() string { -// return "eth.tx.validated" +// return "exp.tx.validated" // } // type EthTxIsInvalid struct { @@ -377,5 +377,5 @@ func (l *EthTxReceived) EventName() string { // } // func (l *EthTxIsInvalid) EventName() string { -// return "eth.tx.is_invalid" +// return "exp.tx.is_invalid" // } diff --git a/logger/verbosity.go b/logger/verbosity.go index aa3d59c30d..713ad1c65a 100644 --- a/logger/verbosity.go +++ b/logger/verbosity.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package logger diff --git a/metrics/disk.go b/metrics/disk.go index 25142d2ad1..18bf3879a9 100644 --- a/metrics/disk.go +++ b/metrics/disk.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package metrics diff --git a/metrics/disk_linux.go b/metrics/disk_linux.go index d0eac08b91..0bd3b00747 100644 --- a/metrics/disk_linux.go +++ b/metrics/disk_linux.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // Contains the Linux implementation of process disk IO counter retrieval. diff --git a/metrics/disk_nop.go b/metrics/disk_nop.go index 4319f8b277..47c0a0d2e1 100644 --- a/metrics/disk_nop.go +++ b/metrics/disk_nop.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // +build !linux diff --git a/metrics/metrics.go b/metrics/metrics.go index fcf8b5c32b..c13f13bd29 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // Package metrics provides general system and process level metrics collection. package metrics @@ -23,8 +23,8 @@ import ( "strings" "time" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" "github.com/rcrowley/go-metrics" ) diff --git a/miner/agent.go b/miner/agent.go index 4a4683bc6f..f1086f650d 100644 --- a/miner/agent.go +++ b/miner/agent.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package miner @@ -21,10 +21,10 @@ import ( "sync/atomic" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/pow" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/pow" ) type CpuAgent struct { diff --git a/miner/miner.go b/miner/miner.go index 7cc25cdf7f..9679b9a603 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -1,20 +1,20 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . -// Package miner implements Ethereum block creation and mining. +// Package miner implements Expanse block creation and mining. package miner import ( @@ -22,16 +22,16 @@ import ( "math/big" "sync/atomic" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/eth/downloader" - "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/pow" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/exp/downloader" + "github.com/expanse-project/go-expanse/event" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/params" + "github.com/expanse-project/go-expanse/pow" ) type Miner struct { @@ -44,15 +44,15 @@ type Miner struct { threads int coinbase common.Address mining int32 - eth core.Backend + exp core.Backend pow pow.PoW canStart int32 // can start indicates whether we can start the mining operation shouldStart int32 // should start indicates whether we should start after sync } -func New(eth core.Backend, config *core.ChainConfig, mux *event.TypeMux, pow pow.PoW) *Miner { - miner := &Miner{eth: eth, mux: mux, pow: pow, worker: newWorker(config, common.Address{}, eth), canStart: 1} +func New(exp core.Backend, config *core.ChainConfig, mux *event.TypeMux, pow pow.PoW) *Miner { + miner := &Miner{exp: exp, mux: mux, pow: pow, worker: newWorker(config, common.Address{}, exp), canStart: 1} go miner.update() return miner diff --git a/miner/remote_agent.go b/miner/remote_agent.go index 00b5f7e089..417b7d597d 100644 --- a/miner/remote_agent.go +++ b/miner/remote_agent.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package miner @@ -23,10 +23,10 @@ import ( "sync/atomic" "time" - "github.com/ethereum/ethash" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/ethash" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" ) type hashrate struct { diff --git a/miner/worker.go b/miner/worker.go index fe759560c2..60a592dabf 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package miner @@ -23,17 +23,17 @@ import ( "sync/atomic" "time" - "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/pow" + "github.com/expanse-project/go-expanse/accounts" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/event" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/pow" "gopkg.in/fatih/set.v0" ) @@ -103,7 +103,7 @@ type worker struct { recv chan *Result pow pow.PoW - eth core.Backend + exp core.Backend chain *core.BlockChain proc core.Validator chainDb ethdb.Database @@ -128,16 +128,16 @@ type worker struct { fullValidation bool } -func newWorker(config *core.ChainConfig, coinbase common.Address, eth core.Backend) *worker { +func newWorker(config *core.ChainConfig, coinbase common.Address, exp core.Backend) *worker { worker := &worker{ config: config, - eth: eth, - mux: eth.EventMux(), - chainDb: eth.ChainDb(), + exp: exp, + mux: exp.EventMux(), + chainDb: exp.ChainDb(), recv: make(chan *Result, resultQueueSize), gasPrice: new(big.Int), - chain: eth.BlockChain(), - proc: eth.BlockChain().Validator(), + chain: exp.BlockChain(), + proc: exp.BlockChain().Validator(), possibleUncles: make(map[common.Hash]*types.Block), coinbase: coinbase, txQueue: make(map[common.Hash]*types.Transaction), @@ -278,7 +278,7 @@ func (self *worker) wait() { continue } - auxValidator := self.eth.BlockChain().AuxValidator() + auxValidator := self.exp.BlockChain().AuxValidator() if err := core.ValidateHeader(self.config, auxValidator, block.Header(), parent.Header(), true, false); err != nil && err != core.BlockFutureErr { glog.V(logger.Error).Infoln("Invalid header on mined block:", err) continue @@ -356,7 +356,7 @@ func (self *worker) push(work *Work) { // makeCurrent creates a new environment for the current cycle. func (self *worker) makeCurrent(parent *types.Block, header *types.Header) error { - state, err := state.New(parent.Root(), self.eth.ChainDb()) + state, err := state.New(parent.Root(), self.exp.ChainDb()) if err != nil { return err } @@ -378,7 +378,7 @@ func (self *worker) makeCurrent(parent *types.Block, header *types.Header) error work.family.Add(ancestor.Hash()) work.ancestors.Add(ancestor.Hash()) } - accounts := self.eth.AccountManager().Accounts() + accounts := self.exp.AccountManager().Accounts() // Keep track of transactions which return errors so they can be removed work.remove = set.New() @@ -479,19 +479,19 @@ func (self *worker) commitNewWork() { work := self.current /* //approach 1 - transactions := self.eth.TxPool().GetTransactions() + transactions := self.exp.TxPool().GetTransactions() sort.Sort(types.TxByNonce(transactions)) */ //approach 2 - transactions := self.eth.TxPool().GetTransactions() + transactions := self.exp.TxPool().GetTransactions() types.SortByPriceAndNonce(transactions) /* // approach 3 // commit transactions for this run. txPerOwner := make(map[common.Address]types.Transactions) // Sort transactions by owner - for _, tx := range self.eth.TxPool().GetTransactions() { + for _, tx := range self.exp.TxPool().GetTransactions() { from, _ := tx.From() // we can ignore the sender error txPerOwner[from] = append(txPerOwner[from], tx) } @@ -515,7 +515,7 @@ func (self *worker) commitNewWork() { */ work.commitTransactions(self.mux, transactions, self.gasPrice, self.chain) - self.eth.TxPool().RemoveTransactions(work.lowGasTxs) + self.exp.TxPool().RemoveTransactions(work.lowGasTxs) // compute uncles for the new block. var ( diff --git a/node/api.go b/node/api.go index 9b2be9c2e4..de50dbab01 100644 --- a/node/api.go +++ b/node/api.go @@ -21,11 +21,11 @@ import ( "strings" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/discover" - "github.com/ethereum/go-ethereum/rpc" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/p2p" + "github.com/expanse-project/go-expanse/p2p/discover" + "github.com/expanse-project/go-expanse/rpc" "github.com/rcrowley/go-metrics" ) @@ -313,7 +313,7 @@ func (s *PublicWeb3API) ClientVersion() string { return s.stack.Server().Name } -// Sha3 applies the ethereum sha3 implementation on the input. +// Sha3 applies the expanse sha3 implementation on the input. // It assumes the input is hex encoded. func (s *PublicWeb3API) Sha3(input string) string { return common.ToHex(crypto.Keccak256(common.FromHex(input))) diff --git a/node/config.go b/node/config.go index bc9fec618c..788ddba26a 100644 --- a/node/config.go +++ b/node/config.go @@ -27,12 +27,12 @@ import ( "runtime" "strings" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/p2p/discover" - "github.com/ethereum/go-ethereum/p2p/nat" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/p2p/discover" + "github.com/expanse-project/go-expanse/p2p/nat" ) var ( diff --git a/node/config_test.go b/node/config_test.go index 45a54d184a..5c4e5e8910 100644 --- a/node/config_test.go +++ b/node/config_test.go @@ -24,7 +24,7 @@ import ( "runtime" "testing" - "github.com/ethereum/go-ethereum/crypto" + "github.com/expanse-project/go-expanse/crypto" ) // Tests that datadirs can be successfully created, be them manually configured @@ -72,15 +72,15 @@ func TestIPCPathResolution(t *testing.T) { }{ {"", "", false, ""}, {"data", "", false, ""}, - {"", "geth.ipc", false, filepath.Join(os.TempDir(), "geth.ipc")}, - {"data", "geth.ipc", false, "data/geth.ipc"}, - {"data", "./geth.ipc", false, "./geth.ipc"}, - {"data", "/geth.ipc", false, "/geth.ipc"}, + {"", "gexp.ipc", false, filepath.Join(os.TempDir(), "gexp.ipc")}, + {"data", "gexp.ipc", false, "data/gexp.ipc"}, + {"data", "./gexp.ipc", false, "./gexp.ipc"}, + {"data", "/gexp.ipc", false, "/gexp.ipc"}, {"", "", true, ``}, {"data", "", true, ``}, - {"", "geth.ipc", true, `\\.\pipe\geth.ipc`}, - {"data", "geth.ipc", true, `\\.\pipe\geth.ipc`}, - {"data", `\\.\pipe\geth.ipc`, true, `\\.\pipe\geth.ipc`}, + {"", "gexp.ipc", true, `\\.\pipe\gexp.ipc`}, + {"data", "gexp.ipc", true, `\\.\pipe\gexp.ipc`}, + {"data", `\\.\pipe\gexp.ipc`, true, `\\.\pipe\gexp.ipc`}, } for i, test := range tests { // Only run when platform/test match diff --git a/node/errors.go b/node/errors.go index bd5ddeb5de..11b83a20d1 100644 --- a/node/errors.go +++ b/node/errors.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package node diff --git a/node/node.go b/node/node.go index 06a1b7aed7..2d127ed3bd 100644 --- a/node/node.go +++ b/node/node.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package node represents the Ethereum protocol stack container. +// Package node represents the Expanse protocol stack container. package node import ( @@ -26,12 +26,12 @@ import ( "sync" "syscall" - "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/internal/debug" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/rpc" + "github.com/expanse-project/go-expanse/event" + "github.com/expanse-project/go-expanse/internal/debug" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/p2p" + "github.com/expanse-project/go-expanse/rpc" ) var ( diff --git a/node/node_example_test.go b/node/node_example_test.go index 01ff683c03..5cc16b1156 100644 --- a/node/node_example_test.go +++ b/node/node_example_test.go @@ -20,10 +20,10 @@ import ( "fmt" "log" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/discover" - "github.com/ethereum/go-ethereum/rpc" + "github.com/expanse-project/go-expanse/node" + "github.com/expanse-project/go-expanse/p2p" + "github.com/expanse-project/go-expanse/p2p/discover" + "github.com/expanse-project/go-expanse/rpc" ) // SampleService is a trivial network service that can be attached to a node for diff --git a/node/node_test.go b/node/node_test.go index 372fc6b10a..8824c49fb4 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -24,9 +24,9 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/rpc" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/p2p" + "github.com/expanse-project/go-expanse/rpc" ) var ( diff --git a/node/service.go b/node/service.go index 4d9a6e42cf..d9bcae473f 100644 --- a/node/service.go +++ b/node/service.go @@ -20,10 +20,10 @@ import ( "path/filepath" "reflect" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/rpc" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/event" + "github.com/expanse-project/go-expanse/p2p" + "github.com/expanse-project/go-expanse/rpc" ) // ServiceContext is a collection of service independent options inherited from diff --git a/node/utils_test.go b/node/utils_test.go index 7cdfc2b3aa..23498b0237 100644 --- a/node/utils_test.go +++ b/node/utils_test.go @@ -22,8 +22,8 @@ package node import ( "reflect" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/rpc" + "github.com/expanse-project/go-expanse/p2p" + "github.com/expanse-project/go-expanse/rpc" ) // NoopService is a trivial implementation of the Service interface. diff --git a/p2p/dial.go b/p2p/dial.go index c0e703d7d0..ab6e555a6f 100644 --- a/p2p/dial.go +++ b/p2p/dial.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package p2p @@ -23,9 +23,9 @@ import ( "net" "time" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/p2p/discover" ) const ( diff --git a/p2p/dial_test.go b/p2p/dial_test.go index 3447660a3f..dc222bb6d3 100644 --- a/p2p/dial_test.go +++ b/p2p/dial_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package p2p @@ -24,7 +24,7 @@ import ( "time" "github.com/davecgh/go-spew/spew" - "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/expanse-project/go-expanse/p2p/discover" ) func init() { diff --git a/p2p/discover/database.go b/p2p/discover/database.go index 6d448515de..4ef300c1b2 100644 --- a/p2p/discover/database.go +++ b/p2p/discover/database.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // Contains the node database, storing previously seen nodes and any collected // metadata about them for QoS purposes. @@ -27,10 +27,10 @@ import ( "sync" "time" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/rlp" "github.com/syndtr/goleveldb/leveldb" "github.com/syndtr/goleveldb/leveldb/errors" "github.com/syndtr/goleveldb/leveldb/iterator" diff --git a/p2p/discover/database_test.go b/p2p/discover/database_test.go index 5a729f02b9..1033aca0d6 100644 --- a/p2p/discover/database_test.go +++ b/p2p/discover/database_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package discover @@ -105,8 +105,8 @@ func TestNodeDBFetchStore(t *testing.T) { node := NewNode( MustHexID("0x1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), net.IP{192, 168, 0, 1}, - 30303, - 30303, + 42786, + 42786, ) inst := time.Now() num := 314 @@ -190,8 +190,8 @@ var nodeDBSeedQueryNodes = []struct { node: NewNode( MustHexID("0x22d9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), net.IP{127, 0, 0, 1}, - 30303, - 30303, + 42786, + 42786, ), pong: time.Now().Add(-2 * time.Second), }, @@ -199,8 +199,8 @@ var nodeDBSeedQueryNodes = []struct { node: NewNode( MustHexID("0x44d9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), net.IP{127, 0, 0, 2}, - 30303, - 30303, + 42786, + 42786, ), pong: time.Now().Add(-3 * time.Second), }, @@ -208,8 +208,8 @@ var nodeDBSeedQueryNodes = []struct { node: NewNode( MustHexID("0xe2d9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), net.IP{127, 0, 0, 3}, - 30303, - 30303, + 42786, + 42786, ), pong: time.Now().Add(-1 * time.Second), }, @@ -306,8 +306,8 @@ var nodeDBExpirationNodes = []struct { node: NewNode( MustHexID("0x01d9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), net.IP{127, 0, 0, 1}, - 30303, - 30303, + 42786, + 42786, ), pong: time.Now().Add(-nodeDBNodeExpiration + time.Minute), exp: false, @@ -315,8 +315,8 @@ var nodeDBExpirationNodes = []struct { node: NewNode( MustHexID("0x02d9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), net.IP{127, 0, 0, 2}, - 30303, - 30303, + 42786, + 42786, ), pong: time.Now().Add(-nodeDBNodeExpiration - time.Minute), exp: true, diff --git a/p2p/discover/node.go b/p2p/discover/node.go index 139a95d803..73f9bb838d 100644 --- a/p2p/discover/node.go +++ b/p2p/discover/node.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package discover @@ -30,9 +30,9 @@ import ( "strconv" "strings" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/crypto/secp256k1" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/crypto/secp256k1" ) const nodeIDBits = 512 @@ -136,10 +136,10 @@ var incompleteNodeURL = regexp.MustCompile("(?i)^(?:enode://)?([0-9a-f]+)$") // query parameter "discport". // // In the following example, the node URL describes -// a node with IP address 10.3.58.6, TCP listening port 30303 -// and UDP discovery port 30301. +// a node with IP address 10.3.58.6, TCP listening port 42786 +// and UDP discovery port 42787. // -// enode://@10.3.58.6:30303?discport=30301 +// enode://@10.3.58.6:42786?discport=42787 func ParseNode(rawurl string) (*Node, error) { if m := incompleteNodeURL.FindStringSubmatch(rawurl); m != nil { id, err := HexID(m[1]) diff --git a/p2p/discover/node_test.go b/p2p/discover/node_test.go index 3d1662d0b9..77a3878488 100644 --- a/p2p/discover/node_test.go +++ b/p2p/discover/node_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package discover @@ -27,8 +27,8 @@ import ( "testing/quick" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" ) func ExampleNewNode() { diff --git a/p2p/discover/ntp.go b/p2p/discover/ntp.go index c1a4b3af10..9fb34a7dec 100644 --- a/p2p/discover/ntp.go +++ b/p2p/discover/ntp.go @@ -26,8 +26,8 @@ import ( "strings" "time" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" ) const ( diff --git a/p2p/discover/table.go b/p2p/discover/table.go index ad0b5c8ca3..e16934f578 100644 --- a/p2p/discover/table.go +++ b/p2p/discover/table.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // Package discover implements the Node Discovery Protocol. // @@ -32,10 +32,10 @@ import ( "sync" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" ) const ( diff --git a/p2p/discover/table_test.go b/p2p/discover/table_test.go index 1a24057408..4df70e03b6 100644 --- a/p2p/discover/table_test.go +++ b/p2p/discover/table_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package discover @@ -27,8 +27,8 @@ import ( "testing/quick" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" ) func TestTable_pingReplace(t *testing.T) { diff --git a/p2p/discover/udp.go b/p2p/discover/udp.go index 74758b6fdb..7bcd58b558 100644 --- a/p2p/discover/udp.go +++ b/p2p/discover/udp.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package discover @@ -25,11 +25,11 @@ import ( "net" "time" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/p2p/nat" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/p2p/nat" + "github.com/expanse-project/go-expanse/rlp" ) const Version = 4 @@ -229,7 +229,7 @@ func newUDP(priv *ecdsa.PrivateKey, c conn, natm nat.Interface, nodeDBPath strin realaddr := c.LocalAddr().(*net.UDPAddr) if natm != nil { if !realaddr.IP.IsLoopback() { - go nat.Map(natm, udp.closing, "udp", realaddr.Port, realaddr.Port, "ethereum discovery") + go nat.Map(natm, udp.closing, "udp", realaddr.Port, realaddr.Port, "expanse discovery") } // TODO: react to external IP changes over time. if ext, err := natm.ExternalIP(); err == nil { diff --git a/p2p/discover/udp_test.go b/p2p/discover/udp_test.go index f43bf37269..7755418bef 100644 --- a/p2p/discover/udp_test.go +++ b/p2p/discover/udp_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package discover @@ -34,9 +34,9 @@ import ( "time" "github.com/davecgh/go-spew/spew" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/rlp" ) func init() { @@ -118,7 +118,7 @@ func newUDPTest(t *testing.T) *udpTest { pipe: newpipe(), localkey: newkey(), remotekey: newkey(), - remoteaddr: &net.UDPAddr{IP: net.IP{1, 2, 3, 4}, Port: 30303}, + remoteaddr: &net.UDPAddr{IP: net.IP{1, 2, 3, 4}, Port: 42786}, } test.table, test.udp, _ = newUDP(test.localkey, test.pipe, nil, "") return test @@ -347,10 +347,10 @@ func TestUDP_findnodeMultiReply(t *testing.T) { // send the reply as two packets. list := []*Node{ - MustParseNode("enode://ba85011c70bcc5c04d8607d3a0ed29aa6179c092cbdda10d5d32684fb33ed01bd94f588ca8f91ac48318087dcb02eaf36773a7a453f0eedd6742af668097b29c@10.0.1.16:30303?discport=30304"), - MustParseNode("enode://81fa361d25f157cd421c60dcc28d8dac5ef6a89476633339c5df30287474520caca09627da18543d9079b5b288698b542d56167aa5c09111e55acdbbdf2ef799@10.0.1.16:30303"), - MustParseNode("enode://9bffefd833d53fac8e652415f4973bee289e8b1a5c6c4cbe70abf817ce8a64cee11b823b66a987f51aaa9fba0d6a91b3e6bf0d5a5d1042de8e9eeea057b217f8@10.0.1.36:30301?discport=17"), - MustParseNode("enode://1b5b4aa662d7cb44a7221bfba67302590b643028197a7d5214790f3bac7aaa4a3241be9e83c09cf1f6c69d007c634faae3dc1b1221793e8446c0b3a09de65960@10.0.1.16:30303"), + MustParseNode("enode://ba85011c70bcc5c04d8607d3a0ed29aa6179c092cbdda10d5d32684fb33ed01bd94f588ca8f91ac48318087dcb02eaf36773a7a453f0eedd6742af668097b29c@10.0.1.16:42786?discport=30304"), + MustParseNode("enode://81fa361d25f157cd421c60dcc28d8dac5ef6a89476633339c5df30287474520caca09627da18543d9079b5b288698b542d56167aa5c09111e55acdbbdf2ef799@10.0.1.16:42786"), + MustParseNode("enode://9bffefd833d53fac8e652415f4973bee289e8b1a5c6c4cbe70abf817ce8a64cee11b823b66a987f51aaa9fba0d6a91b3e6bf0d5a5d1042de8e9eeea057b217f8@10.0.1.36:42787?discport=17"), + MustParseNode("enode://1b5b4aa662d7cb44a7221bfba67302590b643028197a7d5214790f3bac7aaa4a3241be9e83c09cf1f6c69d007c634faae3dc1b1221793e8446c0b3a09de65960@10.0.1.16:42786"), } rpclist := make([]rpcNode, len(list)) for i := range list { diff --git a/p2p/message.go b/p2p/message.go index 1292d21213..5cfada989c 100644 --- a/p2p/message.go +++ b/p2p/message.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package p2p @@ -27,7 +27,7 @@ import ( "sync/atomic" "time" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/rlp" ) // Msg defines the structure of a p2p message. diff --git a/p2p/message_test.go b/p2p/message_test.go index a01f755561..7a9c107c59 100644 --- a/p2p/message_test.go +++ b/p2p/message_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package p2p diff --git a/p2p/metrics.go b/p2p/metrics.go index 98b61901d5..dc115e36b0 100644 --- a/p2p/metrics.go +++ b/p2p/metrics.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // Contains the meters and timers used by the networking layer. @@ -21,7 +21,7 @@ package p2p import ( "net" - "github.com/ethereum/go-ethereum/metrics" + "github.com/expanse-project/go-expanse/metrics" ) var ( diff --git a/p2p/nat/nat.go b/p2p/nat/nat.go index 505a1fc77b..4fbe6c6f35 100644 --- a/p2p/nat/nat.go +++ b/p2p/nat/nat.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // Package nat provides access to common network port mapping protocols. package nat @@ -25,8 +25,8 @@ import ( "sync" "time" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" "github.com/jackpal/go-nat-pmp" ) diff --git a/p2p/nat/nat_test.go b/p2p/nat/nat_test.go index a079e7a22c..420b595fd1 100644 --- a/p2p/nat/nat_test.go +++ b/p2p/nat/nat_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package nat diff --git a/p2p/nat/natpmp.go b/p2p/nat/natpmp.go index c2f9408914..01687d49c0 100644 --- a/p2p/nat/natpmp.go +++ b/p2p/nat/natpmp.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package nat diff --git a/p2p/nat/natupnp.go b/p2p/nat/natupnp.go index 6b3fa3f7a0..f372bf69bb 100644 --- a/p2p/nat/natupnp.go +++ b/p2p/nat/natupnp.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package nat diff --git a/p2p/nat/natupnp_test.go b/p2p/nat/natupnp_test.go index 79f6d25ae8..f575c5e42b 100644 --- a/p2p/nat/natupnp_test.go +++ b/p2p/nat/natupnp_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package nat diff --git a/p2p/peer.go b/p2p/peer.go index b9d6c099dd..1a6efbfac1 100644 --- a/p2p/peer.go +++ b/p2p/peer.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package p2p @@ -25,10 +25,10 @@ import ( "sync" "time" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/p2p/discover" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/p2p/discover" + "github.com/expanse-project/go-expanse/rlp" ) const ( diff --git a/p2p/peer_error.go b/p2p/peer_error.go index 62c7b665dd..2e0f190f32 100644 --- a/p2p/peer_error.go +++ b/p2p/peer_error.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package p2p diff --git a/p2p/peer_test.go b/p2p/peer_test.go index 6f96a823b4..7934a609e6 100644 --- a/p2p/peer_test.go +++ b/p2p/peer_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package p2p diff --git a/p2p/protocol.go b/p2p/protocol.go index ee747ba23d..376e30143c 100644 --- a/p2p/protocol.go +++ b/p2p/protocol.go @@ -1,25 +1,25 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package p2p import ( "fmt" - "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/expanse-project/go-expanse/p2p/discover" ) // Protocol represents a P2P subprotocol implementation. diff --git a/p2p/rlpx.go b/p2p/rlpx.go index 2a9bdc121f..27770f070b 100644 --- a/p2p/rlpx.go +++ b/p2p/rlpx.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package p2p @@ -31,15 +31,16 @@ import ( "io" mrand "math/rand" "net" + "os" "sync" "time" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/crypto/ecies" - "github.com/ethereum/go-ethereum/crypto/secp256k1" - "github.com/ethereum/go-ethereum/crypto/sha3" - "github.com/ethereum/go-ethereum/p2p/discover" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/crypto/ecies" + "github.com/expanse-project/go-expanse/crypto/secp256k1" + "github.com/expanse-project/go-expanse/crypto/sha3" + "github.com/expanse-project/go-expanse/p2p/discover" + "github.com/expanse-project/go-expanse/rlp" ) const ( @@ -261,6 +262,8 @@ func (h *encHandshake) staticSharedSecret(prv *ecdsa.PrivateKey) ([]byte, error) return ecies.ImportECDSA(prv).GenerateShared(h.remotePub, sskLen, sskLen) } +var configSendEIP = os.Getenv("RLPX_EIP8") != "" + // initiatorEncHandshake negotiates a session token on conn. // it should be called on the dialing side of the connection. // diff --git a/p2p/rlpx_test.go b/p2p/rlpx_test.go index f4cefa650b..7e5019c035 100644 --- a/p2p/rlpx_test.go +++ b/p2p/rlpx_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package p2p @@ -31,11 +31,11 @@ import ( "time" "github.com/davecgh/go-spew/spew" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/crypto/ecies" - "github.com/ethereum/go-ethereum/crypto/sha3" - "github.com/ethereum/go-ethereum/p2p/discover" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/crypto/ecies" + "github.com/expanse-project/go-expanse/crypto/sha3" + "github.com/expanse-project/go-expanse/p2p/discover" + "github.com/expanse-project/go-expanse/rlp" ) func TestSharedSecret(t *testing.T) { diff --git a/p2p/server.go b/p2p/server.go index 3b2f2b0786..eddce58516 100644 --- a/p2p/server.go +++ b/p2p/server.go @@ -1,20 +1,20 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . -// Package p2p implements the Ethereum p2p network protocols. +// Package p2p implements the Expanse p2p network protocols. package p2p import ( @@ -25,10 +25,10 @@ import ( "sync" "time" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/p2p/discover" - "github.com/ethereum/go-ethereum/p2p/nat" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/p2p/discover" + "github.com/expanse-project/go-expanse/p2p/nat" ) const ( @@ -382,7 +382,7 @@ func (srv *Server) startListening() error { if !laddr.IP.IsLoopback() && srv.NAT != nil { srv.loopWG.Add(1) go func() { - nat.Map(srv.NAT, srv.quit, "tcp", laddr.Port, laddr.Port, "ethereum p2p") + nat.Map(srv.NAT, srv.quit, "tcp", laddr.Port, laddr.Port, "expanse p2p") srv.loopWG.Done() }() } diff --git a/p2p/server_test.go b/p2p/server_test.go index b437ac3676..169440ab5c 100644 --- a/p2p/server_test.go +++ b/p2p/server_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package p2p @@ -25,9 +25,9 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/crypto/sha3" - "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/crypto/sha3" + "github.com/expanse-project/go-expanse/p2p/discover" ) func init() { diff --git a/params/protocol_params.go b/params/protocol_params.go old mode 100644 new mode 100755 index 2dfc251b63..cd2a859a6d --- a/params/protocol_params.go +++ b/params/protocol_params.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // DO NOT EDIT!!! // AUTOGENERATED FROM generators/defaults.go @@ -31,9 +31,11 @@ var ( TxGasContractCreation = big.NewInt(53000) // Per transaction that creates a contract. NOTE: Not payable on data of calls between transactions. TxDataZeroGas = big.NewInt(4) // Per byte of data attached to a transaction that equals zero. NOTE: Not payable on data of calls between transactions. DifficultyBoundDivisor = big.NewInt(2048) // The bound divisor of the difficulty, used in the update calculations. + DifficultyBoundDivisor2 = big.NewInt(512) // Difficulty should adjust faster. + HardFork1 = big.NewInt(23000) // fork at this block number QuadCoeffDiv = big.NewInt(512) // Divisor for the quadratic particle of the memory cost equation. GenesisDifficulty = big.NewInt(131072) // Difficulty of the Genesis block. - DurationLimit = big.NewInt(13) // The decision boundary on the blocktime duration used to determine whether difficulty should go up or not. + DurationLimit = big.NewInt(60) // The decision boundary on the blocktime duration used to determine whether difficulty should go up or not. SstoreSetGas = big.NewInt(20000) // Once per SLOAD operation. LogDataGas = big.NewInt(8) // Per byte in a LOG* operation's data. CallStipend = big.NewInt(2300) // Free gas given at beginning of call. @@ -61,7 +63,7 @@ var ( Ripemd160WordGas = big.NewInt(120) // MinimumDifficulty = big.NewInt(131072) // The minimum that the difficulty may ever be. CallCreateDepth = big.NewInt(1024) // Maximum depth of call/create stack. - ExpGas = big.NewInt(10) // Once per EXP instuction. + ExpGas = big.NewInt(10) // Once per EXP instruction. LogGas = big.NewInt(375) // Per LOG* operation. CopyGas = big.NewInt(3) // StackLimit = big.NewInt(1024) // Maximum size of VM stack allowed. diff --git a/params/util.go b/params/util.go index b37bc79b21..d8033f7d40 100644 --- a/params/util.go +++ b/params/util.go @@ -1,24 +1,24 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package params import "math/big" var ( - TestNetHomesteadBlock = big.NewInt(494000) // testnet homestead block - MainNetHomesteadBlock = big.NewInt(1150000) // mainnet homestead block + TestNetHomesteadBlock = big.NewInt(0) // testnet homestead block + MainNetHomesteadBlock = big.NewInt(200000) // mainnet homestead block ) diff --git a/params/util.go~HEAD b/params/util.go~HEAD new file mode 100644 index 0000000000..7420bbd3a2 --- /dev/null +++ b/params/util.go~HEAD @@ -0,0 +1,33 @@ +// Copyright 2015 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library 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. +// +// The go-ethereum 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package params + +import "math/big" + +var ( + TestNetHomesteadBlock = big.NewInt(1000) // testnet homestead block + MainNetHomesteadBlock = big.NewInt(200000) // mainnet homestead block + HomesteadBlock = MainNetHomesteadBlock // homestead block used to check against +) + +func IsHomestead(blockNumber *big.Int) bool { + // for unit tests TODO: flip to true after homestead is live + if blockNumber == nil { + return false + } + return blockNumber.Cmp(HomesteadBlock) >= 0 +} diff --git a/pow/block.go b/pow/block.go index 11807113dc..c7ee83e2c0 100644 --- a/pow/block.go +++ b/pow/block.go @@ -1,26 +1,26 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package pow import ( "math/big" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/types" ) type Block interface { diff --git a/pow/dagger/dagger.go b/pow/dagger/dagger.go index f54ba71ca1..6b5ce7c2ce 100644 --- a/pow/dagger/dagger.go +++ b/pow/dagger/dagger.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package dagger @@ -22,9 +22,9 @@ import ( "math/rand" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto/sha3" - "github.com/ethereum/go-ethereum/logger" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto/sha3" + "github.com/expanse-project/go-expanse/logger" ) var powlogger = logger.NewLogger("POW") diff --git a/pow/dagger/dagger_test.go b/pow/dagger/dagger_test.go index 39b74df306..faadbf07c6 100644 --- a/pow/dagger/dagger_test.go +++ b/pow/dagger/dagger_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package dagger @@ -20,7 +20,7 @@ import ( "math/big" "testing" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse-project/go-expanse/common" ) func BenchmarkDaggerSearch(b *testing.B) { diff --git a/pow/ezp/pow.go b/pow/ezp/pow.go index 0f7ee35709..d48dbf4f4b 100644 --- a/pow/ezp/pow.go +++ b/pow/ezp/pow.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package ezp @@ -22,10 +22,10 @@ import ( "math/rand" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto/sha3" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/pow" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto/sha3" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/pow" ) var powlogger = logger.NewLogger("POW") diff --git a/pow/pow.go b/pow/pow.go index 592d964751..89e191cc58 100644 --- a/pow/pow.go +++ b/pow/pow.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package pow diff --git a/release/contract.go b/release/contract.go index 51c1443d48..95eb6e86f9 100644 --- a/release/contract.go +++ b/release/contract.go @@ -7,10 +7,10 @@ import ( "math/big" "strings" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" + "github.com/expanse-project/go-expanse/accounts/abi" + "github.com/expanse-project/go-expanse/accounts/abi/bind" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/types" ) // ReleaseOracleABI is the input ABI used to generate the binding from. @@ -19,7 +19,7 @@ const ReleaseOracleABI = `[{"constant":true,"inputs":[],"name":"currentVersion", // ReleaseOracleBin is the compiled bytecode used for deploying new contracts. const ReleaseOracleBin = `0x60606040526040516114033803806114038339810160405280510160008151600014156100ce57600160a060020a0333168152602081905260408120805460ff191660019081179091558054808201808355828183801582901161015e5781836000526020600020918201910161015e91905b8082111561019957600081558401610072565b505050919090600052602060002090016000848481518110156100025790602001906020020151909190916101000a815481600160a060020a0302191690830217905550506001015b815181101561018957600160006000506000848481518110156100025790602001906020020151600160a060020a0316815260200190815260200160002060006101000a81548160ff0219169083021790555060016000508054806001018281815481835581811511610085576000839052610085906000805160206113e3833981519152908101908301610072565b5050506000929092526000805160206113e3833981519152018054600160a060020a03191633179055505b50506112458061019e6000396000f35b50905600606060405236156100775760e060020a600035046326db7648811461007957806346f0975a1461019e5780635c3d005d1461020a57806364ed31fe146102935780639d888e861461038d578063bc8fbbf8146103b2578063bf8ecf9c146103fb578063d0e0813a14610467578063d67cbec914610478575b005b610495604080516020818101835260008083528351808301855281815260045460068054875181870281018701909852808852939687968796879691959463ffffffff818116956401000000008304821695604060020a840490921694606060020a938490049093029390926007929184919083018282801561012657602002820191906000526020600020905b8154600160a060020a0316815260019190910190602001808311610107575b505050505091508080548060200260200160405190810160405280929190818152602001828054801561018357602002820191906000526020600020905b8154600160a060020a0316815260019190910190602001808311610164575b50505050509050955095509550955095509550909192939495565b6040805160208181018352600082526001805484518184028101840190955280855261054894928301828280156101ff57602002820191906000526020600020905b8154600160a060020a03168152600191909101906020018083116101e0575b505050505090505b90565b6100776004356106d78160005b600160a060020a033316600090815260208190526040812054819060ff16156106df57600160a060020a038416815260026020526040812091505b81548110156106e7578154600160a060020a033316908390839081101561000257600091825260209091200154600160a060020a03161415610732576106df565b6105926004356040805160208181018352600080835283518083018552818152600160a060020a038616825260028352908490208054855181850281018501909652808652939491939092600184019291849183018282801561032057602002820191906000526020600020905b8154600160a060020a0316815260019190910190602001808311610301575b505050505091508080548060200260200160405190810160405280929190818152602001828054801561037d57602002820191906000526020600020905b8154600160a060020a031681526001919091019060200180831161035e575b5050505050905091509150915091565b6106176000600060006000600060006008600050805490506000141561064e576106cf565b6100776106e56000808080805b600160a060020a033316600090815260208190526040812054819060ff161561121c57821580156103f1575060065481145b15610ca55761121c565b6040805160208181018352600082526003805484518184028101840190955280855261054894928301828280156101ff57602002820191906000526020600020908154600160a060020a03168152600191909101906020018083116101e0575b50505050509050610207565b6100776004356106d7816001610217565b6100776004356024356044356064356106df8484848460016103bf565b604051808763ffffffff1681526020018663ffffffff1681526020018563ffffffff16815260200184815260200180602001806020018381038352858181518152602001915080519060200190602002808383829060006004602084601f0104600f02600301f1509050018381038252848181518152602001915080519060200190602002808383829060006004602084601f0104600f02600301f1509050019850505050505050505060405180910390f35b60405180806020018281038252838181518152602001915080519060200190602002808383829060006004602084601f0104600f02600301f1509050019250505060405180910390f35b6040518080602001806020018381038352858181518152602001915080519060200190602002808383829060006004602084601f0104600f02600301f1509050018381038252848181518152602001915080519060200190602002808383829060006004602084601f0104600f02600301f15090500194505050505060405180910390f35b6040805163ffffffff9687168152948616602086015292909416838301526060830152608082019290925290519081900360a00190f35b600880546000198101908110156100025760009182526004027ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30190508054600182015463ffffffff8281169950640100000000830481169850604060020a8304169650606060020a91829004909102945067ffffffffffffffff16925090505b509091929394565b50565b505050505b50505050565b565b5060005b600182015481101561073a5733600160a060020a03168260010160005082815481101561000257600091825260209091200154600160a060020a03161415610784576106df565b600101610252565b8154600014801561074f575060018201546000145b156107ac576003805460018101808355828183801582901161078c5781836000526020600020918201910161078c9190610834565b6001016106eb565b5050506000928352506020909120018054600160a060020a031916851790555b821561084c578154600181018084558391908281838015829011610881578183600052602060002091820191016108819190610834565b5050506000928352506020909120018054600160a060020a031916851790555b600160a060020a038416600090815260026020908152604082208054838255818452918320909291610b5c91908101905b808211156108485760008155600101610834565b5090565b816001016000508054806001018281815481835581811511610933578183600052602060002091820191016109339190610834565b5050506000928352506020909120018054600160a060020a031916331790556001548254600290910490116108b5576106df565b8280156108db5750600160a060020a03841660009081526020819052604090205460ff16155b1561096a57600160a060020a0384166000908152602081905260409020805460ff19166001908117909155805480820180835582818380158290116107e3578183600052602060002091820191016107e39190610834565b5050506000928352506020909120018054600160a060020a031916331790556001805490830154600290910490116108b5576106df565b821580156109905750600160a060020a03841660009081526020819052604090205460ff165b156108035750600160a060020a0383166000908152602081905260408120805460ff191690555b6001548110156108035783600160a060020a03166001600050828154811015610002576000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60154600160a060020a03161415610ad057600180546000198101908110156100025760009182527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601909054906101000a9004600160a060020a03166001600050828154811015610002577fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6018054600160a060020a03191690921790915580546000198101808355909190828015829011610ad857818360005260206000209182019101610ad89190610834565b6001016109b7565b5050600060048181556005805467ffffffffffffffff19169055600680548382558184529194509192508290610b32907ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90810190610834565b5060018201805460008083559182526020909120610b5291810190610834565b5050505050610803565b5060018201805460008083559182526020909120610b7c91810190610834565b506000925050505b6003548110156106df5783600160a060020a03166003600050828154811015610002576000919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0154600160a060020a03161415610c9d57600380546000198101908110156100025760009182527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b01909054906101000a9004600160a060020a03166003600050828154811015610002577fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b018054600160a060020a031916909217909155805460001981018083559091908280158290116106da578183600052602060002091820191016106da9190610834565b600101610b84565b60065460001415610d03576004805463ffffffff1916881767ffffffff0000000019166401000000008802176bffffffff00000000000000001916604060020a8702176bffffffffffffffffffffffff16606060020a808704021790555b828015610d6d575060045463ffffffff8881169116141580610d395750600454640100000000900463ffffffff90811690871614155b80610d56575060045463ffffffff868116604060020a9092041614155b80610d6d5750600454606060020a90819004028414155b15610d775761121c565b506006905060005b8154811015610dc0578154600160a060020a033316908390839081101561000257600091825260209091200154600160a060020a03161415610e0b5761121c565b5060005b6001820154811015610e135733600160a060020a03168260010160005082815481101561000257600091825260209091200154600160a060020a03161415610e485761121c565b600101610d7f565b8215610e50578154600181018084558391908281838015829011610e8557600083815260209020610e85918101908301610834565b600101610dc4565b816001016000508054806001018281815481835581811511610f0857818360005260206000209182019101610f089190610834565b5050506000928352506020909120018054600160a060020a03191633179055600154825460029091049011610eb95761121c565b8215610f3f576005805467ffffffffffffffff19164217905560088054600181018083558281838015829011610f9457600402816004028360005260206000209182019101610f9491906110ae565b5050506000928352506020909120018054600160a060020a03191633179055600180549083015460029091049011610eb95761121c565b600060048181556005805467ffffffffffffffff19169055600680548382558184529192918290611225907ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90810190610834565b5050509190906000526020600020906004020160005060048054825463ffffffff191663ffffffff9182161780845582546401000000009081900483160267ffffffff000000001991909116178084558254604060020a908190049092169091026bffffffff00000000000000001991909116178083558154606060020a908190048102819004026bffffffffffffffffffffffff9190911617825560055460018301805467ffffffffffffffff191667ffffffffffffffff9290921691909117905560068054600284018054828255600082815260209020949594919283929182019185821561110d5760005260206000209182015b8281111561110d57825482559160010191906001019061108b565b505050506004015b8082111561084857600080825560018201805467ffffffffffffffff191690556002820180548282558183526020832083916110ed9190810190610834565b50600182018054600080835591825260209091206110a691810190610834565b506111339291505b80821115610848578054600160a060020a0319168155600101611115565b50506001818101805491840180548083556000838152602090209293830192909182156111815760005260206000209182015b82811115611181578254825591600101919060010190611166565b5061118d929150611115565b5050600060048181556005805467ffffffffffffffff19169055600680548382558184529197509195509093508492506111ec91507ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90810190610834565b506001820180546000808355918252602090912061120c91810190610834565b505050505061121c565b50505050505b50505050505050565b50600182018054600080835591825260209091206112169181019061083456b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6` -// DeployReleaseOracle deploys a new Ethereum contract, binding an instance of ReleaseOracle to it. +// DeployReleaseOracle deploys a new Expanse contract, binding an instance of ReleaseOracle to it. func DeployReleaseOracle(auth *bind.TransactOpts, backend bind.ContractBackend, signers []common.Address) (common.Address, *types.Transaction, *ReleaseOracle, error) { parsed, err := abi.JSON(strings.NewReader(ReleaseOracleABI)) if err != nil { @@ -32,23 +32,23 @@ func DeployReleaseOracle(auth *bind.TransactOpts, backend bind.ContractBackend, return address, tx, &ReleaseOracle{ReleaseOracleCaller: ReleaseOracleCaller{contract: contract}, ReleaseOracleTransactor: ReleaseOracleTransactor{contract: contract}}, nil } -// ReleaseOracle is an auto generated Go binding around an Ethereum contract. +// ReleaseOracle is an auto generated Go binding around an Expanse contract. type ReleaseOracle struct { ReleaseOracleCaller // Read-only binding to the contract ReleaseOracleTransactor // Write-only binding to the contract } -// ReleaseOracleCaller is an auto generated read-only Go binding around an Ethereum contract. +// ReleaseOracleCaller is an auto generated read-only Go binding around an Expanse contract. type ReleaseOracleCaller struct { contract *bind.BoundContract // Generic contract wrapper for the low level calls } -// ReleaseOracleTransactor is an auto generated write-only Go binding around an Ethereum contract. +// ReleaseOracleTransactor is an auto generated write-only Go binding around an Expanse contract. type ReleaseOracleTransactor struct { contract *bind.BoundContract // Generic contract wrapper for the low level calls } -// ReleaseOracleSession is an auto generated Go binding around an Ethereum contract, +// ReleaseOracleSession is an auto generated Go binding around an Expanse contract, // with pre-set call and transact options. type ReleaseOracleSession struct { Contract *ReleaseOracle // Generic contract binding to set the session for @@ -56,31 +56,31 @@ type ReleaseOracleSession struct { TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session } -// ReleaseOracleCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// ReleaseOracleCallerSession is an auto generated read-only Go binding around an Expanse contract, // with pre-set call options. type ReleaseOracleCallerSession struct { Contract *ReleaseOracleCaller // Generic contract caller binding to set the session for CallOpts bind.CallOpts // Call options to use throughout this session } -// ReleaseOracleTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// ReleaseOracleTransactorSession is an auto generated write-only Go binding around an Expanse contract, // with pre-set transact options. type ReleaseOracleTransactorSession struct { Contract *ReleaseOracleTransactor // Generic contract transactor binding to set the session for TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session } -// ReleaseOracleRaw is an auto generated low-level Go binding around an Ethereum contract. +// ReleaseOracleRaw is an auto generated low-level Go binding around an Expanse contract. type ReleaseOracleRaw struct { Contract *ReleaseOracle // Generic contract binding to access the raw methods on } -// ReleaseOracleCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +// ReleaseOracleCallerRaw is an auto generated low-level read-only Go binding around an Expanse contract. type ReleaseOracleCallerRaw struct { Contract *ReleaseOracleCaller // Generic read-only contract binding to access the raw methods on } -// ReleaseOracleTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +// ReleaseOracleTransactorRaw is an auto generated low-level write-only Go binding around an Expanse contract. type ReleaseOracleTransactorRaw struct { Contract *ReleaseOracleTransactor // Generic write-only contract binding to access the raw methods on } diff --git a/release/contract.sol b/release/contract.sol index fedf646c07..df84077619 100644 --- a/release/contract.sol +++ b/release/contract.sol @@ -14,13 +14,13 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// ReleaseOracle is an Ethereum contract to store the current and previous -// versions of the go-ethereum implementation. Its goal is to allow Geth to +// ReleaseOracle is an Expanse contract to store the current and previous +// versions of the go-ethereum implementation. Its goal is to allow Gexp to // check for new releases automatically without the need to consult a central // repository. // // The contract takes a vote based approach on both assigning authorised signers -// as well as signing off on new Geth releases. +// as well as signing off on new Gexp releases. // // Note, when a signer is demoted, the currently pending release is auto-nuked. // The reason is to prevent suprises where a demotion actually tilts the votes @@ -33,7 +33,7 @@ contract ReleaseOracle { address[] fail; // List of signers voting to fail a proposal } - // Version is the version details of a particular Geth release + // Version is the version details of a particular Gexp release struct Version { uint32 major; // Major version component of the release uint32 minor; // Minor version component of the release @@ -135,7 +135,7 @@ contract ReleaseOracle { updateRelease(0, 0, 0, 0, false); } - // updateSigner marks a vote for changing the status of an Ethereum user, either + // updateSigner marks a vote for changing the status of an Expanse user, either // for or against the user being an authorised signer. function updateSigner(address user, bool authorize) internal isSigner { // Gather the current votes and ensure we don't double vote diff --git a/release/contract_test.go b/release/contract_test.go index 11a039992b..4811122fc5 100644 --- a/release/contract_test.go +++ b/release/contract_test.go @@ -21,11 +21,11 @@ import ( "math/big" "testing" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/crypto" + "github.com/expanse-project/go-expanse/accounts/abi/bind" + "github.com/expanse-project/go-expanse/accounts/abi/bind/backends" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/crypto" ) // setupReleaseTest creates a blockchain simulator and deploys a version oracle diff --git a/release/generator.go b/release/generator.go index 1553e06127..fc7b93b157 100644 --- a/release/generator.go +++ b/release/generator.go @@ -1,18 +1,19 @@ +// Copyright 2015 The go-expanse Authors // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . //go:generate abigen --sol ./contract.sol --pkg release --out ./contract.go diff --git a/release/release.go b/release/release.go index 05b4885b50..6dd7169e5a 100644 --- a/release/release.go +++ b/release/release.go @@ -22,14 +22,14 @@ import ( "strings" "time" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/eth" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/rpc" + "github.com/expanse-project/go-expanse/accounts/abi/bind" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/exp" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/node" + "github.com/expanse-project/go-expanse/p2p" + "github.com/expanse-project/go-expanse/rpc" ) // Interval to check for new releases @@ -37,7 +37,7 @@ const releaseRecheckInterval = time.Hour // Config contains the configurations of the release service. type Config struct { - Oracle common.Address // Ethereum address of the release oracle + Oracle common.Address // Expanse address of the release oracle Major uint32 // Major version component of the release Minor uint32 // Minor version component of the release Patch uint32 // Patch version component of the release @@ -56,13 +56,13 @@ type ReleaseService struct { // NewReleaseService creates a new service to periodically check for new client // releases and notify the user of such. func NewReleaseService(ctx *node.ServiceContext, config Config) (node.Service, error) { - // Retrieve the Ethereum service dependency to access the blockchain - var ethereum *eth.Ethereum - if err := ctx.Service(ðereum); err != nil { + // Retrieve the Expanse service dependency to access the blockchain + var expanse *exp.Expanse + if err := ctx.Service(&expanse); err != nil { return nil, err } // Construct the release service - contract, err := NewReleaseOracle(config.Oracle, eth.NewContractBackend(ethereum)) + contract, err := NewReleaseOracle(config.Oracle, exp.NewContractBackend(expanse)) if err != nil { return nil, err } @@ -126,7 +126,7 @@ func (r *ReleaseService) checker() { warning := fmt.Sprintf("Client v%d.%d.%d-%x seems older than the latest upstream release v%d.%d.%d-%x", r.config.Major, r.config.Minor, r.config.Patch, r.config.Commit[:4], version.Major, version.Minor, version.Patch, version.Commit[:4]) - howtofix := fmt.Sprintf("Please check https://github.com/ethereum/go-ethereum/releases for new releases") + howtofix := fmt.Sprintf("Please check https://github.com/expanse-project/go-expanse/releases for new releases") separator := strings.Repeat("-", len(warning)) glog.V(logger.Warn).Info(separator) diff --git a/rlp/decode.go b/rlp/decode.go index c4e5869cc9..82ec3a7528 100644 --- a/rlp/decode.go +++ b/rlp/decode.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package rlp diff --git a/rlp/decode_test.go b/rlp/decode_test.go index 2d465b74dc..8f059c495c 100644 --- a/rlp/decode_test.go +++ b/rlp/decode_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package rlp diff --git a/rlp/doc.go b/rlp/doc.go index 72667416cf..22c6850c17 100644 --- a/rlp/doc.go +++ b/rlp/doc.go @@ -1,27 +1,27 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . /* 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 +to serialize objects in Expanse. 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 +floats) is left up to higher-order protocols; in Expanse 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). diff --git a/rlp/encode.go b/rlp/encode.go index c20897efef..0e09857dbd 100644 --- a/rlp/encode.go +++ b/rlp/encode.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package rlp diff --git a/rlp/encode_test.go b/rlp/encode_test.go index 6f38294e46..1a1a5f1d83 100644 --- a/rlp/encode_test.go +++ b/rlp/encode_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package rlp diff --git a/rlp/encoder_example_test.go b/rlp/encoder_example_test.go index 1cffa241c2..e390fe29fb 100644 --- a/rlp/encoder_example_test.go +++ b/rlp/encoder_example_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package rlp diff --git a/rlp/typecache.go b/rlp/typecache.go index a2f217c66f..1bf1c89d08 100644 --- a/rlp/typecache.go +++ b/rlp/typecache.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package rlp diff --git a/rpc/http.go b/rpc/http.go index 9283ce0ec9..84b101f2c6 100644 --- a/rpc/http.go +++ b/rpc/http.go @@ -33,14 +33,14 @@ const ( maxHTTPRequestContentLength = 1024 * 128 ) -// httpClient connects to a geth RPC server over HTTP. +// httpClient connects to a gexp RPC server over HTTP. type httpClient struct { endpoint *url.URL // HTTP-RPC server endpoint httpClient http.Client // reuse connection lastRes []byte // HTTP requests are synchronous, store last response } -// NewHTTPClient create a new RPC clients that connection to a geth RPC server +// NewHTTPClient create a new RPC clients that connection to a gexp RPC server // over HTTP. func NewHTTPClient(endpoint string) (Client, error) { url, err := url.Parse(endpoint) diff --git a/rpc/ipc_unix.go b/rpc/ipc_unix.go index 9ece01240a..e9fa164721 100644 --- a/rpc/ipc_unix.go +++ b/rpc/ipc_unix.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris diff --git a/rpc/ipc_windows.go b/rpc/ipc_windows.go index 8762cdb0df..e16341334f 100644 --- a/rpc/ipc_windows.go +++ b/rpc/ipc_windows.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // +build windows diff --git a/rpc/json.go b/rpc/json.go index 8a3bea2eeb..afb9b11dd9 100644 --- a/rpc/json.go +++ b/rpc/json.go @@ -25,16 +25,16 @@ import ( "strings" "sync" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" ) const ( jsonRPCVersion = "2.0" serviceMethodSeparator = "_" - subscribeMethod = "eth_subscribe" - unsubscribeMethod = "eth_unsubscribe" - notificationMethod = "eth_subscription" + subscribeMethod = "exp_subscribe" + unsubscribeMethod = "exp_unsubscribe" + notificationMethod = "exp_subscription" ) // JSON-RPC request @@ -170,7 +170,7 @@ func parseRequest(incomingMsg json.RawMessage) ([]rpcRequest, bool, RPCError) { } // all subscriptions are made on the eth service - reqs[0].service, reqs[0].method = "eth", subscribeMethod[0] + reqs[0].service, reqs[0].method = "exp", subscribeMethod[0] reqs[0].params = in.Payload return reqs, false, nil } @@ -223,7 +223,7 @@ func parseBatchRequest(incomingMsg json.RawMessage) ([]rpcRequest, bool, RPCErro } // all subscriptions are made on the eth service - requests[i].service, requests[i].method = "eth", subscribeMethod[0] + requests[i].service, requests[i].method = "exp", subscribeMethod[0] requests[i].params = r.Payload continue } diff --git a/rpc/notification.go b/rpc/notification.go index e84e26a582..c29d452dff 100644 --- a/rpc/notification.go +++ b/rpc/notification.go @@ -21,8 +21,8 @@ import ( "sync" "time" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" "golang.org/x/net/context" ) diff --git a/rpc/notification_test.go b/rpc/notification_test.go index 1bcede177a..0ecb17a6c6 100644 --- a/rpc/notification_test.go +++ b/rpc/notification_test.go @@ -64,7 +64,7 @@ func TestNotifications(t *testing.T) { server := NewServer() service := &NotificationTestService{} - if err := server.RegisterName("eth", service); err != nil { + if err := server.RegisterName("exp", service); err != nil { t.Fatalf("unable to register test service %v", err) } diff --git a/rpc/server.go b/rpc/server.go index 001107a1b7..c6d6e43041 100644 --- a/rpc/server.go +++ b/rpc/server.go @@ -23,8 +23,8 @@ import ( "sync/atomic" "time" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" "golang.org/x/net/context" "gopkg.in/fatih/set.v0" ) @@ -34,8 +34,8 @@ const ( notificationBufferSize = 10000 // max buffered notifications before codec is closed - DefaultIPCApis = "admin,eth,debug,miner,net,shh,txpool,personal,web3" - DefaultHTTPApis = "eth,net,web3" + DefaultIPCApis = "admin,exp,eth,debug,miner,net,shh,txpool,personal,web3" + DefaultHTTPApis = "exp,eth,net,web3" ) // CodecOption specifies which type of messages this codec supports diff --git a/rpc/types.go b/rpc/types.go index a1f36fbd26..03f55121ce 100644 --- a/rpc/types.go +++ b/rpc/types.go @@ -274,7 +274,7 @@ func (bn *BlockNumber) Int64() int64 { return (int64)(*bn) } -// Client defines the interface for go client that wants to connect to a geth RPC endpoint +// Client defines the interface for go client that wants to connect to a gexp RPC endpoint type Client interface { // SupportedModules returns the collection of API's the server offers SupportedModules() (map[string]string, error) diff --git a/rpc/websocket.go b/rpc/websocket.go index fe9354d946..0d1d5b3bd3 100644 --- a/rpc/websocket.go +++ b/rpc/websocket.go @@ -23,8 +23,8 @@ import ( "strings" "sync" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" "golang.org/x/net/websocket" "gopkg.in/fatih/set.v0" ) diff --git a/test_genesis.json b/test_genesis.json new file mode 100644 index 0000000000..20342cbfcd --- /dev/null +++ b/test_genesis.json @@ -0,0 +1,14 @@ +{ + "nonce": "0xdefaceddefacedcf", + "timestamp": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "extraData": "0x4672616e6b6f497346726565646f6d", + "gasLimit": "0x1388", + "difficulty": "0x4000000", + "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x90c4384bb05d96d2f54b27e0102da5240f7833ae", + "alloc": { + "0x93decab0cd745598860f782ac1e8f046cb99e898": { "balance": "100000000000000000000000000000" }, + "0x656a2b5ed407c26e7c04d9e5449edd3109c99506": { "balance": "77777777777777777"} + } +} \ No newline at end of file diff --git a/tests/block_test.go b/tests/block_test.go index c258268dbb..0c66ee7a9e 100644 --- a/tests/block_test.go +++ b/tests/block_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package tests @@ -20,6 +20,8 @@ import ( "math/big" "path/filepath" "testing" + + "github.com/expanse-project/go-expanse/params" ) func TestBcValidBlockTests(t *testing.T) { @@ -43,6 +45,7 @@ func TestBcUncleTests(t *testing.T) { } } + func TestBcForkUncleTests(t *testing.T) { err := RunBlockTest(big.NewInt(1000000), filepath.Join(blockTestDir, "bcForkUncle.json"), BlockSkipTests) if err != nil { @@ -211,3 +214,92 @@ func TestHomesteadBcState(t *testing.T) { t.Fatal(err) } } + +// Homestead tests +func TestHomesteadBcValidBlockTests(t *testing.T) { + params.HomesteadBlock = big.NewInt(0) + err := RunBlockTest(filepath.Join(blockTestDir, "Homestead", "bcValidBlockTest.json"), BlockSkipTests) + if err != nil { + t.Fatal(err) + } +} + +func TestHomesteadBcUncleHeaderValidityTests(t *testing.T) { + params.HomesteadBlock = big.NewInt(0) + err := RunBlockTest(filepath.Join(blockTestDir, "Homestead", "bcUncleHeaderValiditiy.json"), BlockSkipTests) + if err != nil { + t.Fatal(err) + } +} + +func TestHomesteadBcUncleTests(t *testing.T) { + params.HomesteadBlock = big.NewInt(0) + err := RunBlockTest(filepath.Join(blockTestDir, "Homestead", "bcUncleTest.json"), BlockSkipTests) + if err != nil { + t.Fatal(err) + } +} + +func TestHomesteadBcInvalidHeaderTests(t *testing.T) { + params.HomesteadBlock = big.NewInt(0) + err := RunBlockTest(filepath.Join(blockTestDir, "Homestead", "bcInvalidHeaderTest.json"), BlockSkipTests) + if err != nil { + t.Fatal(err) + } +} + +func TestHomesteadBcRPCAPITests(t *testing.T) { + params.HomesteadBlock = big.NewInt(0) + err := RunBlockTest(filepath.Join(blockTestDir, "Homestead", "bcRPC_API_Test.json"), BlockSkipTests) + if err != nil { + t.Fatal(err) + } +} + +func TestHomesteadBcForkStress(t *testing.T) { + params.HomesteadBlock = big.NewInt(0) + err := RunBlockTest(filepath.Join(blockTestDir, "Homestead", "bcForkStressTest.json"), BlockSkipTests) + if err != nil { + t.Fatal(err) + } +} + +func TestHomesteadBcTotalDifficulty(t *testing.T) { + params.HomesteadBlock = big.NewInt(0) + err := RunBlockTest(filepath.Join(blockTestDir, "Homestead", "bcTotalDifficultyTest.json"), BlockSkipTests) + if err != nil { + t.Fatal(err) + } +} + +func TestHomesteadBcWallet(t *testing.T) { + params.HomesteadBlock = big.NewInt(0) + err := RunBlockTest(filepath.Join(blockTestDir, "Homestead", "bcWalletTest.json"), BlockSkipTests) + if err != nil { + t.Fatal(err) + } +} + +func TestHomesteadBcGasPricer(t *testing.T) { + params.HomesteadBlock = big.NewInt(0) + err := RunBlockTest(filepath.Join(blockTestDir, "Homestead", "bcGasPricerTest.json"), BlockSkipTests) + if err != nil { + t.Fatal(err) + } +} + +func TestHomesteadBcMultiChain(t *testing.T) { + params.HomesteadBlock = big.NewInt(0) + err := RunBlockTest(filepath.Join(blockTestDir, "Homestead", "bcMultiChainTest.json"), BlockSkipTests) + if err != nil { + t.Fatal(err) + } +} + +func TestHomesteadBcState(t *testing.T) { + params.HomesteadBlock = big.NewInt(0) + err := RunBlockTest(filepath.Join(blockTestDir, "Homestead", "bcStateTest.json"), BlockSkipTests) + if err != nil { + t.Fatal(err) + } +} diff --git a/tests/block_test_util.go b/tests/block_test_util.go index b92c183e11..12f6c4093b 100644 --- a/tests/block_test_util.go +++ b/tests/block_test_util.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package tests @@ -26,15 +26,15 @@ import ( "strconv" "strings" - "github.com/ethereum/ethash" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/ethash" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/event" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/rlp" ) // Block Test JSON Format @@ -205,6 +205,7 @@ func (t *BlockTest) InsertPreState(db ethdb.Database) (*state.StateDB, error) { if err != nil { return nil, err } + for addrString, acct := range t.preAccounts { code, err := hex.DecodeString(strings.TrimPrefix(acct.Code, "0x")) if err != nil { @@ -237,7 +238,7 @@ func (t *BlockTest) InsertPreState(db ethdb.Database) (*state.StateDB, error) { return statedb, nil } -/* See https://github.com/ethereum/tests/wiki/Blockchain-Tests-II +/* See https://github.com/expanse-project/tests/wiki/Blockchain-Tests-II Whether a block is valid or not is a bit subtle, it's defined by presence of blockHeader, transactions and uncleHeaders fields. If they are missing, the block is @@ -356,6 +357,7 @@ func validateHeader(h *btHeader, h2 *types.Header) error { expectedTimestamp := mustConvertBigInt(h.Timestamp, 16) if expectedTimestamp.Cmp(h2.Time) != 0 { + return fmt.Errorf("Timestamp: want: %v have: %v", expectedTimestamp, h2.Time) } diff --git a/tests/files/BlockchainTests/bcUncleTest.json b/tests/files/BlockchainTests/bcUncleTest.json index f11310ac04..00a6f0ccae 100755 --- a/tests/files/BlockchainTests/bcUncleTest.json +++ b/tests/files/BlockchainTests/bcUncleTest.json @@ -4511,4 +4511,4 @@ } } } -} \ No newline at end of file +} diff --git a/tests/files/TrieTests/trietest.json b/tests/files/TrieTests/trietest.json index d871a8a813..68d0c5cc9a 100755 --- a/tests/files/TrieTests/trietest.json +++ b/tests/files/TrieTests/trietest.json @@ -2,11 +2,11 @@ "emptyValues": { "in": [ ["do", "verb"], - ["ether", "wookiedoo"], + ["expanse", "wookiedoo"], ["horse", "stallion"], ["shaman", "horse"], ["doge", "coin"], - ["ether", null], + ["expanse", null], ["dog", "puppy"], ["shaman", null] ], diff --git a/tests/files/TrieTests/trietest_secureTrie.json b/tests/files/TrieTests/trietest_secureTrie.json index ac4ecd2dd1..c9640f68f8 100755 --- a/tests/files/TrieTests/trietest_secureTrie.json +++ b/tests/files/TrieTests/trietest_secureTrie.json @@ -2,11 +2,11 @@ "emptyValues": { "in": [ ["do", "verb"], - ["ether", "wookiedoo"], + ["expanse", "wookiedoo"], ["horse", "stallion"], ["shaman", "horse"], ["doge", "coin"], - ["ether", null], + ["expanse", null], ["dog", "puppy"], ["shaman", null] ], diff --git a/tests/files/ansible/ec2.ini b/tests/files/ansible/ec2.ini index 064920410a..feccdb73af 100755 --- a/tests/files/ansible/ec2.ini +++ b/tests/files/ansible/ec2.ini @@ -9,7 +9,7 @@ #eucalyptus_host = clc.cloud.domain.org # AWS regions to make calls to. Set this to 'all' to make request to all regions -# in AWS and merge the results together. Alternatively, set this to a comma +# in AWS and merge the results togexper. Alternatively, set this to a comma # separated list of regions. E.g. 'us-east-1,us-west-1,us-west-2' regions = us-east-1 regions_exclude = us-gov-west-1,cn-north-1 diff --git a/tests/files/ansible/roles/common/tasks/main.yml b/tests/files/ansible/roles/common/tasks/main.yml index 6c0c7a1197..df92ba07a3 100755 --- a/tests/files/ansible/roles/common/tasks/main.yml +++ b/tests/files/ansible/roles/common/tasks/main.yml @@ -8,6 +8,6 @@ - name: checkout test repo git: - repo: https://github.com/ethereum/tests.git + repo: https://github.com/expanse-project/tests.git version: develop dest: git diff --git a/tests/files/ansible/roles/ec2/vars/main.yml b/tests/files/ansible/roles/ec2/vars/main.yml index 3166da02cd..0dec1612e0 100755 --- a/tests/files/ansible/roles/ec2/vars/main.yml +++ b/tests/files/ansible/roles/ec2/vars/main.yml @@ -12,6 +12,6 @@ keypair: christoph ip_access_range: 0.0.0.0/0 -project_description: https://github.com/ethereum/tests +project_description: https://github.com/expanse-project/tests total_no_instances: 3 diff --git a/tests/files/ansible/roles/testrunner/tasks/main.yml b/tests/files/ansible/roles/testrunner/tasks/main.yml index 41c195f245..d4b00ebe56 100755 --- a/tests/files/ansible/roles/testrunner/tasks/main.yml +++ b/tests/files/ansible/roles/testrunner/tasks/main.yml @@ -2,7 +2,7 @@ - name: update C++ client docker_image: path: /home/{{ ansible_ssh_user }}/git/ansible/test-files/docker-cppjit - name: ethereum/cppjit-testrunner + name: expanse/cppjit-testrunner state: build async: 1200 poll: 5 @@ -10,7 +10,7 @@ - name: update Go client docker_image: path: /home/{{ ansible_ssh_user }}/git/ansible/test-files/docker-go - name: ethereum/go-testrunner + name: expanse/go-testrunner state: build async: 1200 poll: 5 @@ -18,7 +18,7 @@ - name: update Python client docker_image: path: /home/{{ ansible_ssh_user }}/git/ansible/test-files/docker-python - name: ethereum/python-testrunner + name: expanse/python-testrunner state: build async: 1200 poll: 5 diff --git a/tests/files/ansible/test-files/create-docker-images.sh b/tests/files/ansible/test-files/create-docker-images.sh index 06728c6d72..a6b149a20f 100755 --- a/tests/files/ansible/test-files/create-docker-images.sh +++ b/tests/files/ansible/test-files/create-docker-images.sh @@ -2,6 +2,6 @@ # creates the necessary docker images to run testrunner.sh locally -docker build --tag="ethereum/cppjit-testrunner" docker-cppjit -docker build --tag="ethereum/python-testrunner" docker-python -docker build --tag="ethereum/go-testrunner" docker-go +docker build --tag="expanse/cppjit-testrunner" docker-cppjit +docker build --tag="expanse/python-testrunner" docker-python +docker build --tag="expanse/go-testrunner" docker-go diff --git a/tests/files/ansible/test-files/docker-cpp/Dockerfile b/tests/files/ansible/test-files/docker-cpp/Dockerfile index a3b0e4ca6d..40b5f353a1 100755 --- a/tests/files/ansible/test-files/docker-cpp/Dockerfile +++ b/tests/files/ansible/test-files/docker-cpp/Dockerfile @@ -1,32 +1,32 @@ -# adjusted from https://github.com/ethereum/cpp-ethereum/blob/develop/docker/Dockerfile +# adjusted from https://github.com/expanse-project/cpp-expanse/blob/develop/docker/Dockerfile FROM ubuntu:14.04 ENV DEBIAN_FRONTEND noninteractive RUN apt-get update RUN apt-get upgrade -y -# Ethereum dependencies +# Expanse dependencies RUN apt-get install -qy build-essential g++-4.8 git cmake libboost-all-dev libcurl4-openssl-dev wget RUN apt-get install -qy automake unzip libgmp-dev libtool libleveldb-dev yasm libminiupnpc-dev libreadline-dev scons RUN apt-get install -qy libjsoncpp-dev libargtable2-dev -# NCurses based GUI (not optional though for a succesful compilation, see https://github.com/ethereum/cpp-ethereum/issues/452 ) +# NCurses based GUI (not optional though for a succesful compilation, see https://github.com/expanse-project/cpp-expanse/issues/452 ) RUN apt-get install -qy libncurses5-dev # Qt-based GUI # RUN apt-get install -qy qtbase5-dev qt5-default qtdeclarative5-dev libqt5webkit5-dev -# Ethereum PPA +# Expanse PPA RUN apt-get install -qy software-properties-common -RUN add-apt-repository ppa:ethereum/ethereum +RUN add-apt-repository ppa:expanse/expanse RUN apt-get update RUN apt-get install -qy libcryptopp-dev libjson-rpc-cpp-dev -# Build Ethereum (HEADLESS) -RUN git clone --depth=1 --branch develop https://github.com/ethereum/cpp-ethereum -RUN mkdir -p cpp-ethereum/build -RUN cd cpp-ethereum/build && cmake .. -DCMAKE_BUILD_TYPE=Release -DHEADLESS=1 && make -j $(cat /proc/cpuinfo | grep processor | wc -l) && make install +# Build Expanse (HEADLESS) +RUN git clone --depth=1 --branch develop https://github.com/expanse-project/cpp-expanse +RUN mkdir -p cpp-expanse/build +RUN cd cpp-expanse/build && cmake .. -DCMAKE_BUILD_TYPE=Release -DHEADLESS=1 && make -j $(cat /proc/cpuinfo | grep processor | wc -l) && make install RUN ldconfig -ENTRYPOINT ["/cpp-ethereum/build/test/createRandomTest"] +ENTRYPOINT ["/cpp-expanse/build/test/createRandomTest"] diff --git a/tests/files/ansible/test-files/docker-cppjit/Dockerfile b/tests/files/ansible/test-files/docker-cppjit/Dockerfile index 2b10727f05..fef8e31242 100755 --- a/tests/files/ansible/test-files/docker-cppjit/Dockerfile +++ b/tests/files/ansible/test-files/docker-cppjit/Dockerfile @@ -1,16 +1,16 @@ -# adjusted from https://github.com/ethereum/cpp-ethereum/blob/develop/docker/Dockerfile +# adjusted from https://github.com/expanse-project/cpp-expanse/blob/develop/docker/Dockerfile FROM ubuntu:14.04 ENV DEBIAN_FRONTEND noninteractive RUN apt-get update RUN apt-get upgrade -y -# Ethereum dependencies +# Expanse dependencies RUN apt-get install -qy build-essential g++-4.8 git cmake libboost-all-dev libcurl4-openssl-dev wget RUN apt-get install -qy automake unzip libgmp-dev libtool libleveldb-dev yasm libminiupnpc-dev libreadline-dev scons RUN apt-get install -qy libjsoncpp-dev libargtable2-dev -# NCurses based GUI (not optional though for a succesful compilation, see https://github.com/ethereum/cpp-ethereum/issues/452 ) +# NCurses based GUI (not optional though for a succesful compilation, see https://github.com/expanse-project/cpp-expanse/issues/452 ) RUN apt-get install -qy libncurses5-dev # Qt-based GUI @@ -28,19 +28,19 @@ RUN apt-get install -qy llvm-3.5 libedit-dev RUN mkdir -p /usr/lib/llvm-3.5/share/llvm && ln -s /usr/share/llvm-3.5/cmake /usr/lib/llvm-3.5/share/llvm/cmake -# Ethereum PPA +# Expanse PPA RUN apt-get install -qy software-properties-common -RUN add-apt-repository ppa:ethereum/ethereum +RUN add-apt-repository ppa:expanse/expanse RUN apt-get update RUN apt-get install -qy libcryptopp-dev libjson-rpc-cpp-dev # this is a workaround, to make sure that docker's cache is invalidated whenever the git repo changes -ADD https://api.github.com/repos/ethereum/cpp-ethereum/git/refs/heads/develop unused.txt +ADD https://api.github.com/repos/expanse/cpp-expanse/git/refs/heads/develop unused.txt -# Build Ethereum (HEADLESS) -RUN git clone --depth=1 --branch develop https://github.com/ethereum/cpp-ethereum -RUN mkdir -p cpp-ethereum/build -RUN cd cpp-ethereum/build && cmake .. -DCMAKE_BUILD_TYPE=Debug -DVMTRACE=1 -DPARANOIA=1 -DEVMJIT=1 && make -j $(cat /proc/cpuinfo | grep processor | wc -l) && make install +# Build Expanse (HEADLESS) +RUN git clone --depth=1 --branch develop https://github.com/expanse-project/cpp-expanse +RUN mkdir -p cpp-expanse/build +RUN cd cpp-expanse/build && cmake .. -DCMAKE_BUILD_TYPE=Debug -DVMTRACE=1 -DPARANOIA=1 -DEVMJIT=1 && make -j $(cat /proc/cpuinfo | grep processor | wc -l) && make install RUN ldconfig -ENTRYPOINT ["/cpp-ethereum/build/test/checkRandomStateTest"] +ENTRYPOINT ["/cpp-expanse/build/test/checkRandomStateTest"] diff --git a/tests/files/ansible/test-files/docker-go/Dockerfile b/tests/files/ansible/test-files/docker-go/Dockerfile index a5a2f0f231..7bbf17a353 100755 --- a/tests/files/ansible/test-files/docker-go/Dockerfile +++ b/tests/files/ansible/test-files/docker-go/Dockerfile @@ -1,4 +1,4 @@ -# Adjusted from https://github.com/ethereum/go-ethereum/blob/develop/Dockerfile +# Adjusted from https://github.com/expanse-project/go-expanse/blob/develop/Dockerfile FROM ubuntu:14.04 ## Environment setup @@ -31,17 +31,17 @@ RUN git checkout v1 RUN go install -v # this is a workaround, to make sure that docker's cache is invalidated whenever the git repo changes -ADD https://api.github.com/repos/ethereum/go-ethereum/git/refs/heads/develop unused.txt +ADD https://api.github.com/repos/expanse/go-expanse/git/refs/heads/develop unused.txt -## Fetch and install go-ethereum -RUN go get -u -v -d github.com/ethereum/go-ethereum/... -WORKDIR $GOPATH/src/github.com/ethereum/go-ethereum +## Fetch and install go-expanse +RUN go get -u -v -d github.com/expanse-project/go-expanse/... +WORKDIR $GOPATH/src/github.com/expanse-project/go-expanse RUN git checkout develop RUN git pull -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/ethtest +RUN ETH_DEPS=$(go list -f '{{.Imports}} {{.TestImports}} {{.XTestImports}}' github.com/expanse-project/go-expanse/... | 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/exptest -ENTRYPOINT ["ethtest"] +ENTRYPOINT ["exptest"] diff --git a/tests/files/ansible/test-files/docker-python/Dockerfile b/tests/files/ansible/test-files/docker-python/Dockerfile index e83faf3d6e..fd3c8fe5b5 100755 --- a/tests/files/ansible/test-files/docker-python/Dockerfile +++ b/tests/files/ansible/test-files/docker-python/Dockerfile @@ -7,16 +7,16 @@ RUN apt-get upgrade -y RUN apt-get install -qy curl git python2.7 python-pip python-dev # this is a workaround, to make sure that docker's cache is invalidated whenever the git repo changes -ADD https://api.github.com/repos/ethereum/pyethereum/git/refs/heads/develop unused.txt +ADD https://api.github.com/repos/expanse/pyethereum/git/refs/heads/develop unused.txt -RUN git clone --branch develop --recursive https://github.com/ethereum/pyethereum.git +RUN git clone --branch develop --recursive https://github.com/expanse-project/pyethereum.git RUN cd pyethereum && curl https://bootstrap.pypa.io/bootstrap-buildout.py | python RUN cd pyethereum && bin/buildout #default port for incoming requests -EXPOSE 30303 +EXPOSE 42786 WORKDIR /pyethereum diff --git a/tests/files/ansible/test-files/testrunner.sh b/tests/files/ansible/test-files/testrunner.sh index c7763b1f12..91f310ba4f 100755 --- a/tests/files/ansible/test-files/testrunner.sh +++ b/tests/files/ansible/test-files/testrunner.sh @@ -7,19 +7,19 @@ cd ~/testout export EVMJIT="-cache=0" while [ 1 ] do - TEST="$(docker run --rm --entrypoint=\"/cpp-ethereum/build/test/createRandomStateTest\" ethereum/cppjit-testrunner)" + TEST="$(docker run --rm --entrypoint=\"/cpp-expanse/build/test/createRandomStateTest\" expanse/cppjit-testrunner)" # echo "$TEST" # test pyethereum - OUTPUT_PYTHON="$(docker run --rm ethereum/python-testrunner --notrace <<< "$TEST")" + OUTPUT_PYTHON="$(docker run --rm expanse/python-testrunner --notrace <<< "$TEST")" RESULT_PYTHON=$? # test go - OUTPUT_GO="$(docker run --rm ethereum/go-testrunner "$TEST")" + OUTPUT_GO="$(docker run --rm expanse/go-testrunner "$TEST")" RESULT_GO=$? # test cpp-jit - OUTPUT_CPPJIT="$(docker run --rm ethereum/cppjit-testrunner "$TEST")" + OUTPUT_CPPJIT="$(docker run --rm expanse/cppjit-testrunner "$TEST")" RESULT_CPPJIT=$? # go fails diff --git a/tests/files/package.json b/tests/files/package.json new file mode 100755 index 0000000000..c4050a7a82 --- /dev/null +++ b/tests/files/package.json @@ -0,0 +1,26 @@ +{ + "name": "expanse-tests", + "version": "0.0.6", + "description": "tests for expanse", + "main": "index.js", + "scripts": { + "test": "echo \"There are no tests for there tests\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://github.com/expanse-project/tests" + }, + "keywords": [ + "tests", + "expanse" + ], + "author": "", + "license": "MIT", + "bugs": { + "url": "https://github.com/expanse-project/tests/issues" + }, + "homepage": "https://github.com/expanse-project/tests", + "dependencies": { + "require-all": "^1.0.0" + } +} diff --git a/tests/init.go b/tests/init.go index 5112b274d0..d39a830c8d 100644 --- a/tests/init.go +++ b/tests/init.go @@ -1,20 +1,21 @@ -// Copyright 2015 The go-ethereum Authors +// Copyright 2014 The go-ethereum Authors +// Copyright 2015 go-expanse Authors // This file is part of the go-ethereum library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . -// Package tests implements execution of Ethereum JSON tests. +// Package tests implements execution of Expanse JSON tests. package tests import ( @@ -26,7 +27,7 @@ import ( "os" "path/filepath" - "github.com/ethereum/go-ethereum/core" + "github.com/expanse-project/go-expanse/core" ) var ( diff --git a/tests/rlp_test.go b/tests/rlp_test.go index 2469ce0dbc..77135feb01 100644 --- a/tests/rlp_test.go +++ b/tests/rlp_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package tests diff --git a/tests/rlp_test_util.go b/tests/rlp_test_util.go index ac53a4f52c..51e3c1e6f6 100644 --- a/tests/rlp_test_util.go +++ b/tests/rlp_test_util.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package tests @@ -26,7 +26,7 @@ import ( "os" "strings" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/rlp" ) // RLPTest is the JSON structure of a single RLP test. diff --git a/tests/state_test.go b/tests/state_test.go index 59646fd7ef..d2205ff85a 100644 --- a/tests/state_test.go +++ b/tests/state_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package tests @@ -151,6 +151,15 @@ func TestStateTransition(t *testing.T) { } } +func TestStateTransition(t *testing.T) { + params.HomesteadBlock = big.NewInt(1000000) + + fn := filepath.Join(stateTestDir, "stTransitionTest.json") + if err := RunStateTest(fn, StateSkipTests); err != nil { + t.Error(err) + } +} + func TestCallCreateCallCode(t *testing.T) { ruleSet := RuleSet{ HomesteadBlock: big.NewInt(1000000), @@ -184,6 +193,15 @@ func TestDelegateCall(t *testing.T) { } } +func TestDelegateCall(t *testing.T) { + params.HomesteadBlock = big.NewInt(1000000) + + fn := filepath.Join(stateTestDir, "stDelegatecallTest.json") + if err := RunStateTest(fn, StateSkipTests); err != nil { + t.Error(err) + } +} + func TestMemory(t *testing.T) { ruleSet := RuleSet{ HomesteadBlock: big.NewInt(1000000), diff --git a/tests/state_test_util.go b/tests/state_test_util.go index 36fa30881d..744fc2dfd5 100644 --- a/tests/state_test_util.go +++ b/tests/state_test_util.go @@ -1,18 +1,19 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors +// Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package tests @@ -25,13 +26,13 @@ import ( "strconv" "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/logger/glog" ) func RunStateTestWithReader(ruleSet RuleSet, r io.Reader, skipTests []string) error { diff --git a/tests/transaction_test.go b/tests/transaction_test.go index ea105c37bb..1a96621d10 100644 --- a/tests/transaction_test.go +++ b/tests/transaction_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package tests diff --git a/tests/transaction_test_util.go b/tests/transaction_test_util.go index 178f90284d..a4a7d5313f 100644 --- a/tests/transaction_test_util.go +++ b/tests/transaction_test_util.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package tests @@ -23,12 +23,12 @@ import ( "io" "runtime" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/params" + "github.com/expanse-project/go-expanse/rlp" ) // Transaction Test JSON Format diff --git a/tests/util.go b/tests/util.go index abc67769d6..a27b03d946 100644 --- a/tests/util.go +++ b/tests/util.go @@ -1,18 +1,19 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors +// Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package tests @@ -22,14 +23,14 @@ import ( "math/big" "os" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/logger/glog" ) var ( diff --git a/tests/vm_test.go b/tests/vm_test.go index 34beb85e5f..143b34d8e2 100644 --- a/tests/vm_test.go +++ b/tests/vm_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package tests diff --git a/tests/vm_test_util.go b/tests/vm_test_util.go index 2f516951b8..49a06dfb5e 100644 --- a/tests/vm_test_util.go +++ b/tests/vm_test_util.go @@ -1,18 +1,19 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors +// Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package tests @@ -24,12 +25,12 @@ import ( "strconv" "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/params" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/params" ) func RunVmTestWithReader(r io.Reader, skipTests []string) error { diff --git a/trie/encoding.go b/trie/encoding.go index 761bad1889..8faaa93c7e 100644 --- a/trie/encoding.go +++ b/trie/encoding.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package trie diff --git a/trie/encoding_test.go b/trie/encoding_test.go index 2f125ef2f8..ba3302cabf 100644 --- a/trie/encoding_test.go +++ b/trie/encoding_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package trie diff --git a/trie/errors.go b/trie/errors.go index 76129a70bf..1aa732172c 100644 --- a/trie/errors.go +++ b/trie/errors.go @@ -19,7 +19,7 @@ package trie import ( "fmt" - "github.com/ethereum/go-ethereum/common" + "github.com/expanse-project/go-expanse/common" ) // MissingNodeError is returned by the trie functions (TryGet, TryUpdate, TryDelete) diff --git a/trie/iterator.go b/trie/iterator.go index ceef52ec8d..0ea420320b 100644 --- a/trie/iterator.go +++ b/trie/iterator.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package trie @@ -20,9 +20,9 @@ import ( "bytes" "fmt" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" ) // Iterator is a key-value trie iterator to traverse the data contents. diff --git a/trie/iterator_test.go b/trie/iterator_test.go index dc82761165..46ef95fc11 100644 --- a/trie/iterator_test.go +++ b/trie/iterator_test.go @@ -1,33 +1,33 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package trie import ( "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethdb" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/ethdb" ) func TestIterator(t *testing.T) { trie := newEmpty() vals := []struct{ k, v string }{ {"do", "verb"}, - {"ether", "wookiedoo"}, + {"expanse", "wookiedoo"}, {"horse", "stallion"}, {"shaman", "horse"}, {"doge", "coin"}, diff --git a/trie/node.go b/trie/node.go index 0bfa21dc43..ed39c3f4bf 100644 --- a/trie/node.go +++ b/trie/node.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package trie @@ -21,8 +21,8 @@ import ( "io" "strings" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/rlp" ) var indices = []string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "[17]"} diff --git a/trie/proof.go b/trie/proof.go index 37a70fb34d..44c87fde32 100644 --- a/trie/proof.go +++ b/trie/proof.go @@ -21,11 +21,11 @@ import ( "errors" "fmt" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto/sha3" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto/sha3" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/rlp" ) // Prove constructs a merkle proof for key. The result contains all diff --git a/trie/proof_test.go b/trie/proof_test.go index 91ebcd4a57..39eab6302b 100644 --- a/trie/proof_test.go +++ b/trie/proof_test.go @@ -23,8 +23,8 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/rlp" ) func init() { diff --git a/trie/secure_trie.go b/trie/secure_trie.go index be7defe83b..e7993e7b05 100644 --- a/trie/secure_trie.go +++ b/trie/secure_trie.go @@ -1,28 +1,28 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package trie import ( "hash" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto/sha3" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto/sha3" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" ) var secureKeyPrefix = []byte("secure-key-") diff --git a/trie/secure_trie_test.go b/trie/secure_trie_test.go index 0be5b3d15e..ad3567cc57 100644 --- a/trie/secure_trie_test.go +++ b/trie/secure_trie_test.go @@ -20,9 +20,9 @@ import ( "bytes" "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/ethdb" ) func newEmptySecure() *SecureTrie { diff --git a/trie/sync.go b/trie/sync.go index d55399d06b..3e86e1d388 100644 --- a/trie/sync.go +++ b/trie/sync.go @@ -19,8 +19,8 @@ package trie import ( "fmt" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethdb" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/ethdb" "gopkg.in/karalabe/cookiejar.v2/collections/prque" ) @@ -87,7 +87,7 @@ func (s *TrieSync) AddSubTrie(root common.Hash, depth int, parent common.Hash, c depth: depth, callback: callback, } - // If this sub-trie has a designated parent, link them together + // If this sub-trie has a designated parent, link them togexper if parent != (common.Hash{}) { ancestor := s.requests[parent] if ancestor == nil { @@ -116,7 +116,7 @@ func (s *TrieSync) AddRawEntry(hash common.Hash, depth int, parent common.Hash) hash: hash, depth: depth, } - // If this sub-trie has a designated parent, link them together + // If this sub-trie has a designated parent, link them togexper if parent != (common.Hash{}) { ancestor := s.requests[parent] if ancestor == nil { diff --git a/trie/sync_test.go b/trie/sync_test.go index a81f7650e4..e693d4b9a7 100644 --- a/trie/sync_test.go +++ b/trie/sync_test.go @@ -20,8 +20,8 @@ import ( "bytes" "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethdb" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/ethdb" ) // makeTestTrie create a sample test trie to test node-wise reconstruction. diff --git a/trie/trie.go b/trie/trie.go index cc5dcf2a65..8fa9a40e5e 100644 --- a/trie/trie.go +++ b/trie/trie.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // Package trie implements Merkle Patricia Tries. package trie @@ -22,12 +22,13 @@ import ( "fmt" "hash" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/crypto/sha3" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/rlp" + + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/crypto/sha3" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/rlp" ) const defaultCacheCapacity = 800 diff --git a/trie/trie_test.go b/trie/trie_test.go index bb761b5551..30eab99e1a 100644 --- a/trie/trie_test.go +++ b/trie/trie_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package trie @@ -25,8 +25,8 @@ import ( "testing" "github.com/davecgh/go-spew/spew" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethdb" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/ethdb" ) func init() { @@ -196,11 +196,11 @@ func TestDelete(t *testing.T) { trie := newEmpty() vals := []struct{ k, v string }{ {"do", "verb"}, - {"ether", "wookiedoo"}, + {"expanse", "wookiedoo"}, {"horse", "stallion"}, {"shaman", "horse"}, {"doge", "coin"}, - {"ether", ""}, + {"expanse", ""}, {"dog", "puppy"}, {"shaman", ""}, } @@ -224,11 +224,11 @@ func TestEmptyValues(t *testing.T) { vals := []struct{ k, v string }{ {"do", "verb"}, - {"ether", "wookiedoo"}, + {"expanse", "wookiedoo"}, {"horse", "stallion"}, {"shaman", "horse"}, {"doge", "coin"}, - {"ether", ""}, + {"expanse", ""}, {"dog", "puppy"}, {"shaman", ""}, } @@ -247,7 +247,7 @@ func TestReplication(t *testing.T) { trie := newEmpty() vals := []struct{ k, v string }{ {"do", "verb"}, - {"ether", "wookiedoo"}, + {"expanse", "wookiedoo"}, {"horse", "stallion"}, {"shaman", "horse"}, {"doge", "coin"}, @@ -283,7 +283,7 @@ func TestReplication(t *testing.T) { // perform some insertions on the new trie. vals2 := []struct{ k, v string }{ {"do", "verb"}, - {"ether", "wookiedoo"}, + {"expanse", "wookiedoo"}, {"horse", "stallion"}, // {"shaman", "horse"}, // {"doge", "coin"}, @@ -315,11 +315,11 @@ func TestParanoia(t *testing.T) { vals := []struct{ k, v string }{ {"do", "verb"}, - {"ether", "wookiedoo"}, + {"expanse", "wookiedoo"}, {"horse", "stallion"}, {"shaman", "horse"}, {"doge", "coin"}, - {"ether", ""}, + {"expanse", ""}, {"dog", "puppy"}, {"shaman", ""}, {"somethingveryoddindeedthis is", "myothernodedata"}, diff --git a/whisper/api.go b/whisper/api.go index d1f454a1fa..ff9e91f58d 100644 --- a/whisper/api.go +++ b/whisper/api.go @@ -22,9 +22,9 @@ import ( "sync" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/rpc" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/rpc" ) // PublicWhisperAPI provides the whisper RPC service. diff --git a/whisper/doc.go b/whisper/doc.go index cfb0b51175..ccde5fe535 100644 --- a/whisper/doc.go +++ b/whisper/doc.go @@ -1,23 +1,23 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . /* Package whisper implements the Whisper PoC-1. -(https://github.com/ethereum/wiki/wiki/Whisper-PoC-1-Protocol-Spec) +(https://github.com/expanse-project/wiki/wiki/Whisper-PoC-1-Protocol-Spec) Whisper combines aspects of both DHTs and datagram messaging systems (e.g. UDP). As such it may be likened and compared to both, not dissimilar to the diff --git a/whisper/envelope.go b/whisper/envelope.go index 97d489b961..83d94c2507 100644 --- a/whisper/envelope.go +++ b/whisper/envelope.go @@ -1,21 +1,21 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // Contains the Whisper protocol Envelope element. For formal details please see -// the specs at https://github.com/ethereum/wiki/wiki/Whisper-PoC-1-Protocol-Spec#envelopes. +// the specs at https://github.com/expanse-project/wiki/wiki/Whisper-PoC-1-Protocol-Spec#envelopes. package whisper @@ -25,10 +25,10 @@ import ( "fmt" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/crypto/ecies" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/crypto/ecies" + "github.com/expanse-project/go-expanse/rlp" ) // Envelope represents a clear-text data packet to transmit through the Whisper diff --git a/whisper/envelope_test.go b/whisper/envelope_test.go index 3bfe527372..5440beae5a 100644 --- a/whisper/envelope_test.go +++ b/whisper/envelope_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package whisper @@ -21,8 +21,8 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/crypto/ecies" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/crypto/ecies" ) func TestEnvelopeOpen(t *testing.T) { diff --git a/whisper/filter.go b/whisper/filter.go index 9f6d6b7817..e67138e0bb 100644 --- a/whisper/filter.go +++ b/whisper/filter.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // Contains the message filter for fine grained subscriptions. @@ -21,7 +21,7 @@ package whisper import ( "crypto/ecdsa" - "github.com/ethereum/go-ethereum/event/filter" + "github.com/expanse-project/go-expanse/event/filter" ) // Filter is used to subscribe to specific types of whisper messages. diff --git a/whisper/filter_test.go b/whisper/filter_test.go index b805b2baf1..8b1adf6568 100644 --- a/whisper/filter_test.go +++ b/whisper/filter_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package whisper diff --git a/whisper/main.go b/whisper/main.go index be41604890..08ffdcde42 100644 --- a/whisper/main.go +++ b/whisper/main.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // +build none @@ -27,12 +27,12 @@ import ( "os" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/nat" - "github.com/ethereum/go-ethereum/whisper" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/p2p" + "github.com/expanse-project/go-expanse/p2p/nat" + "github.com/expanse-project/go-expanse/whisper" ) func main() { @@ -47,7 +47,7 @@ func main() { name := common.MakeName("whisper-go", "1.0") shh := whisper.New() - // Create an Ethereum peer to communicate through + // Create an Expanse peer to communicate through server := p2p.Server{ PrivateKey: key, MaxPeers: 10, @@ -56,9 +56,9 @@ func main() { ListenAddr: ":30300", NAT: nat.Any(), } - fmt.Println("Starting Ethereum peer...") + fmt.Println("Starting Expanse peer...") if err := server.Start(); err != nil { - fmt.Printf("Failed to start Ethereum peer: %v.\n", err) + fmt.Printf("Failed to start Expanse peer: %v.\n", err) os.Exit(1) } diff --git a/whisper/message.go b/whisper/message.go index f05b5d8b54..0eb51cde2e 100644 --- a/whisper/message.go +++ b/whisper/message.go @@ -1,21 +1,21 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // Contains the Whisper protocol Message element. For formal details please see -// the specs at https://github.com/ethereum/wiki/wiki/Whisper-PoC-1-Protocol-Spec#messages. +// the specs at https://github.com/expanse-project/wiki/wiki/Whisper-PoC-1-Protocol-Spec#messages. package whisper @@ -24,10 +24,10 @@ import ( "math/rand" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" ) // Message represents an end-user data packet to transmit through the Whisper diff --git a/whisper/message_test.go b/whisper/message_test.go index 921c967a96..2e58fb4991 100644 --- a/whisper/message_test.go +++ b/whisper/message_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package whisper @@ -22,8 +22,8 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/crypto/secp256k1" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/crypto/secp256k1" ) // Tests whether a message can be wrapped without any identity or encryption. diff --git a/whisper/peer.go b/whisper/peer.go index ee10e66e79..47ddc2769c 100644 --- a/whisper/peer.go +++ b/whisper/peer.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package whisper @@ -20,11 +20,11 @@ import ( "fmt" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/rlp" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/p2p" + "github.com/expanse-project/go-expanse/rlp" "gopkg.in/fatih/set.v0" ) diff --git a/whisper/peer_test.go b/whisper/peer_test.go index 636bd8ca1f..fc7b040787 100644 --- a/whisper/peer_test.go +++ b/whisper/peer_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package whisper @@ -20,8 +20,8 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/expanse-project/go-expanse/p2p" + "github.com/expanse-project/go-expanse/p2p/discover" ) type testPeer struct { diff --git a/whisper/topic.go b/whisper/topic.go index d37eb25ee1..4f8c1ba608 100644 --- a/whisper/topic.go +++ b/whisper/topic.go @@ -1,25 +1,25 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . // Contains the Whisper protocol Topic element. For formal details please see -// the specs at https://github.com/ethereum/wiki/wiki/Whisper-PoC-1-Protocol-Spec#topics. +// the specs at https://github.com/expanse-project/wiki/wiki/Whisper-PoC-1-Protocol-Spec#topics. package whisper -import "github.com/ethereum/go-ethereum/crypto" +import "github.com/expanse-project/go-expanse/crypto" // Topic represents a cryptographically secure, probabilistic partial // classifications of a message, determined as the first (left) 4 bytes of the diff --git a/whisper/topic_test.go b/whisper/topic_test.go index 9c45f67408..c70923ed2c 100644 --- a/whisper/topic_test.go +++ b/whisper/topic_test.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package whisper diff --git a/whisper/whisper.go b/whisper/whisper.go index 0a49c1000b..287a3c5faa 100644 --- a/whisper/whisper.go +++ b/whisper/whisper.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package whisper @@ -21,15 +21,14 @@ import ( "sync" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/crypto/ecies" - "github.com/ethereum/go-ethereum/event/filter" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/rpc" - + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/crypto/ecies" + "github.com/expanse-project/go-expanse/event/filter" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/p2p" + "github.com/expanse-project/go-expanse/rpc" "gopkg.in/fatih/set.v0" ) @@ -58,7 +57,7 @@ type MessageEvent struct { Message *Message } -// Whisper represents a dark communication interface through the Ethereum +// Whisper represents a dark communication interface through the Expanse // network, using its very own P2P communication layer. type Whisper struct { protocol p2p.Protocol @@ -76,7 +75,7 @@ type Whisper struct { quit chan struct{} } -// New creates a Whisper client ready to communicate through the Ethereum P2P +// New creates a Whisper client ready to communicate through the Expanse P2P // network. func New() *Whisper { whisper := &Whisper{ diff --git a/whisper/whisper_test.go b/whisper/whisper_test.go index 094df373c2..cf152b4a6b 100644 --- a/whisper/whisper_test.go +++ b/whisper/whisper_test.go @@ -1,18 +1,18 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. // -// The go-ethereum library is free software: you can redistribute it and/or modify +// The go-expanse library 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. // -// The go-ethereum library is distributed in the hope that it will be useful, +// The go-expanse 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . +// along with the go-expanse library. If not, see . package whisper @@ -20,8 +20,8 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/expanse-project/go-expanse/p2p" + "github.com/expanse-project/go-expanse/p2p/discover" ) func startTestCluster(n int) []*Whisper { diff --git a/xeth/frontend.go b/xeth/frontend.go new file mode 100644 index 0000000000..bf2cbe1f7f --- /dev/null +++ b/xeth/frontend.go @@ -0,0 +1,48 @@ +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. +// +// The go-expanse library 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. +// +// The go-expanse 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-expanse library. If not, see . + +package xeth + +// Frontend should be implemented by users of XEth. Its methods are +// called whenever XEth makes a decision that requires user input. +type Frontend interface { + // AskPassword is called when a new account is created or updated + AskPassword() (string, bool) + + // UnlockAccount is called when a transaction needs to be signed + // but the key corresponding to the transaction's sender is + // locked. + // + // It should unlock the account with the given address and return + // true if unlocking succeeded. + UnlockAccount(address []byte) bool + + // This is called for all transactions inititated through + // Transact. It should prompt the user to confirm the transaction + // and return true if the transaction was acknowledged. + // + // ConfirmTransaction is not used for Call transactions + // because they cannot change any state. + ConfirmTransaction(tx string) bool +} + +// dummyFrontend is a non-interactive frontend that allows all +// transactions but cannot not unlock any keys. +type dummyFrontend struct{} + +func (dummyFrontend) AskPassword() (string, bool) { return "", false } +func (dummyFrontend) UnlockAccount([]byte) bool { return false } +func (dummyFrontend) ConfirmTransaction(string) bool { return true } diff --git a/xeth/types.go b/xeth/types.go new file mode 100644 index 0000000000..2ff218e2dc --- /dev/null +++ b/xeth/types.go @@ -0,0 +1,241 @@ +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. +// +// The go-expanse library 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. +// +// The go-expanse 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-expanse library. If not, see . + +package xeth + +import ( + "bytes" + "fmt" + "math/big" + "strings" + + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/p2p" + "github.com/expanse-project/go-expanse/rlp" +) + +type Object struct { + *state.StateObject +} + +func NewObject(state *state.StateObject) *Object { + return &Object{state} +} + +func (self *Object) StorageString(str string) []byte { + if common.IsHex(str) { + return self.storage(common.Hex2Bytes(str[2:])) + } else { + return self.storage(common.RightPadBytes([]byte(str), 32)) + } +} + +func (self *Object) StorageValue(addr *common.Value) []byte { + return self.storage(addr.Bytes()) +} + +func (self *Object) storage(addr []byte) []byte { + return self.StateObject.GetState(common.BytesToHash(addr)).Bytes() +} + +func (self *Object) Storage() (storage map[string]string) { + storage = make(map[string]string) + + it := self.StateObject.Trie().Iterator() + for it.Next() { + var data []byte + rlp.Decode(bytes.NewReader(it.Value), &data) + storage[common.ToHex(self.Trie().GetKey(it.Key))] = common.ToHex(data) + } + + return +} + +// Block interface exposed to QML +type Block struct { + //Transactions string `json:"transactions"` + ref *types.Block + Size string `json:"size"` + Number int `json:"number"` + Hash string `json:"hash"` + Transactions *common.List `json:"transactions"` + Uncles *common.List `json:"uncles"` + Time *big.Int `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 NewBlock(block *types.Block) *Block { + if block == nil { + return &Block{} + } + + ptxs := make([]*Transaction, len(block.Transactions())) + /* + for i, tx := range block.Transactions() { + ptxs[i] = NewTx(tx) + } + */ + txlist := common.NewList(ptxs) + + puncles := make([]*Block, len(block.Uncles())) + /* + for i, uncle := range block.Uncles() { + puncles[i] = NewBlock(types.NewBlockWithHeader(uncle)) + } + */ + ulist := common.NewList(puncles) + + return &Block{ + ref: block, Size: block.Size().String(), + Number: int(block.NumberU64()), GasUsed: block.GasUsed().String(), + GasLimit: block.GasLimit().String(), Hash: block.Hash().Hex(), + Transactions: txlist, Uncles: ulist, + Time: block.Time(), + Coinbase: block.Coinbase().Hex(), + PrevHash: block.ParentHash().Hex(), + Bloom: common.ToHex(block.Bloom().Bytes()), + Raw: block.String(), + } +} + +func (self *Block) ToString() string { + if self.ref != nil { + return self.ref.String() + } + + return "" +} + +func (self *Block) GetTransaction(hash string) *Transaction { + tx := self.ref.Transaction(common.HexToHash(hash)) + if tx == nil { + return nil + } + + return NewTx(tx) +} + +type Transaction 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 NewTx(tx *types.Transaction) *Transaction { + sender, err := tx.From() + if err != nil { + return nil + } + hash := tx.Hash().Hex() + + var receiver string + if to := tx.To(); to != nil { + receiver = to.Hex() + } else { + from, _ := tx.From() + receiver = crypto.CreateAddress(from, tx.Nonce()).Hex() + } + createsContract := core.MessageCreatesContract(tx) + + var data string + if createsContract { + data = strings.Join(core.Disassemble(tx.Data()), "\n") + } else { + data = common.ToHex(tx.Data()) + } + + return &Transaction{ref: tx, Hash: hash, Value: common.CurrencyToString(tx.Value()), Address: receiver, Contract: createsContract, Gas: tx.Gas().String(), GasPrice: tx.GasPrice().String(), Data: data, Sender: sender.Hex(), CreatesContract: createsContract, RawData: common.ToHex(tx.Data())} +} + +func (self *Transaction) ToString() string { + return self.ref.String() +} + +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, + common.ToHex(creationAddress), + common.ToHex(hash), + common.ToHex(address), + } +} + +// Peer interface exposed to QML + +type Peer struct { + ref *p2p.Peer + Ip string `json:"ip"` + Version string `json:"version"` + Caps string `json:"caps"` +} + +func NewPeer(peer *p2p.Peer) *Peer { + var caps []string + for _, cap := range peer.Caps() { + caps = append(caps, fmt.Sprintf("%s/%d", cap.Name, cap.Version)) + } + + return &Peer{ + ref: peer, + Ip: fmt.Sprintf("%v", peer.RemoteAddr()), + Version: fmt.Sprintf("%v", peer.ID()), + Caps: fmt.Sprintf("%v", caps), + } +} + +type Receipt struct { + CreatedContract bool `json:"createdContract"` + Address string `json:"address"` + Hash string `json:"hash"` + Sender string `json:"sender"` +} + +func NewReciept(contractCreation bool, creationAddress, hash, address []byte) *Receipt { + return &Receipt{ + contractCreation, + common.ToHex(creationAddress), + common.ToHex(hash), + common.ToHex(address), + } +} diff --git a/xeth/whisper.go b/xeth/whisper.go new file mode 100644 index 0000000000..97eee34a4c --- /dev/null +++ b/xeth/whisper.go @@ -0,0 +1,121 @@ +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. +// +// The go-expanse library 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. +// +// The go-expanse 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-expanse library. If not, see . + +// Contains the external API to the whisper sub-protocol. + +package xeth + +import ( + "fmt" + "time" + + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/whisper" +) + +var qlogger = logger.NewLogger("XSHH") + +// Whisper represents the API wrapper around the internal whisper implementation. +type Whisper struct { + *whisper.Whisper +} + +// NewWhisper wraps an internal whisper client into an external API version. +func NewWhisper(w *whisper.Whisper) *Whisper { + return &Whisper{w} +} + +// NewIdentity generates a new cryptographic identity for the client, and injects +// it into the known identities for message decryption. +func (self *Whisper) NewIdentity() string { + identity := self.Whisper.NewIdentity() + return common.ToHex(crypto.FromECDSAPub(&identity.PublicKey)) +} + +// HasIdentity checks if the the whisper node is configured with the private key +// of the specified public pair. +func (self *Whisper) HasIdentity(key string) bool { + return self.Whisper.HasIdentity(crypto.ToECDSAPub(common.FromHex(key))) +} + +// Post injects a message into the whisper network for distribution. +func (self *Whisper) Post(payload string, to, from string, topics []string, priority, ttl uint32) error { + // Decode the topic strings + topicsDecoded := make([][]byte, len(topics)) + for i, topic := range topics { + topicsDecoded[i] = common.FromHex(topic) + } + // Construct the whisper message and transmission options + message := whisper.NewMessage(common.FromHex(payload)) + options := whisper.Options{ + To: crypto.ToECDSAPub(common.FromHex(to)), + TTL: time.Duration(ttl) * time.Second, + Topics: whisper.NewTopics(topicsDecoded...), + } + if len(from) != 0 { + if key := self.Whisper.GetIdentity(crypto.ToECDSAPub(common.FromHex(from))); key != nil { + options.From = key + } else { + return fmt.Errorf("unknown identity to send from: %s", from) + } + } + // Wrap and send the message + pow := time.Duration(priority) * time.Millisecond + envelope, err := message.Wrap(pow, options) + if err != nil { + return err + } + if err := self.Whisper.Send(envelope); err != nil { + return err + } + return nil +} + +// Watch installs a new message handler to run in case a matching packet arrives +// from the whisper network. +func (self *Whisper) Watch(to, from string, topics [][]string, fn func(WhisperMessage)) int { + // Decode the topic strings + topicsDecoded := make([][][]byte, len(topics)) + for i, condition := range topics { + topicsDecoded[i] = make([][]byte, len(condition)) + for j, topic := range condition { + topicsDecoded[i][j] = common.FromHex(topic) + } + } + // Assemble and inject the filter into the whisper client + filter := whisper.Filter{ + To: crypto.ToECDSAPub(common.FromHex(to)), + From: crypto.ToECDSAPub(common.FromHex(from)), + Topics: whisper.NewFilterTopics(topicsDecoded...), + } + filter.Fn = func(message *whisper.Message) { + fn(NewWhisperMessage(message)) + } + return self.Whisper.Watch(filter) +} + +// Messages retrieves all the currently pooled messages matching a filter id. +func (self *Whisper) Messages(id int) []WhisperMessage { + pool := self.Whisper.Messages(id) + + messages := make([]WhisperMessage, len(pool)) + for i, message := range pool { + messages[i] = NewWhisperMessage(message) + } + return messages +} diff --git a/xeth/whisper_filter.go b/xeth/whisper_filter.go new file mode 100644 index 0000000000..25dfb730a3 --- /dev/null +++ b/xeth/whisper_filter.go @@ -0,0 +1,100 @@ +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. +// +// The go-expanse library 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. +// +// The go-expanse 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-expanse library. If not, see . + +// Contains the external API side message filter for watching, pooling and polling +// matched whisper messages, also serializing data access to avoid duplications. + +package xeth + +import ( + "sync" + "time" + + "github.com/expanse-project/go-expanse/common" +) + +// whisperFilter is the message cache matching a specific filter, accumulating +// inbound messages until the are requested by the client. +type whisperFilter struct { + id int // Filter identifier for old message retrieval + ref *Whisper // Whisper reference for old message retrieval + + cache []WhisperMessage // Cache of messages not yet polled + skip map[common.Hash]struct{} // List of retrieved messages to avoid duplication + update time.Time // Time of the last message query + + lock sync.RWMutex // Lock protecting the filter internals +} + +// newWhisperFilter creates a new serialized, poll based whisper topic filter. +func newWhisperFilter(id int, ref *Whisper) *whisperFilter { + return &whisperFilter{ + id: id, + ref: ref, + + update: time.Now(), + skip: make(map[common.Hash]struct{}), + } +} + +// messages retrieves all the cached messages from the entire pool matching the +// filter, resetting the filter's change buffer. +func (w *whisperFilter) messages() []WhisperMessage { + w.lock.Lock() + defer w.lock.Unlock() + + w.cache = nil + w.update = time.Now() + + w.skip = make(map[common.Hash]struct{}) + messages := w.ref.Messages(w.id) + for _, message := range messages { + w.skip[message.ref.Hash] = struct{}{} + } + return messages +} + +// insert injects a new batch of messages into the filter cache. +func (w *whisperFilter) insert(messages ...WhisperMessage) { + w.lock.Lock() + defer w.lock.Unlock() + + for _, message := range messages { + if _, ok := w.skip[message.ref.Hash]; !ok { + w.cache = append(w.cache, messages...) + } + } +} + +// retrieve fetches all the cached messages from the filter. +func (w *whisperFilter) retrieve() (messages []WhisperMessage) { + w.lock.Lock() + defer w.lock.Unlock() + + messages, w.cache = w.cache, nil + w.update = time.Now() + + return +} + +// activity returns the last time instance when client requests were executed on +// the filter. +func (w *whisperFilter) activity() time.Time { + w.lock.RLock() + defer w.lock.RUnlock() + + return w.update +} diff --git a/xeth/whisper_message.go b/xeth/whisper_message.go new file mode 100644 index 0000000000..992d5a51b7 --- /dev/null +++ b/xeth/whisper_message.go @@ -0,0 +1,53 @@ +// Copyright 2015 The go-expanse Authors +// This file is part of the go-expanse library. +// +// The go-expanse library 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. +// +// The go-expanse 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-expanse library. If not, see . + +// Contains the external API representation of a whisper message. + +package xeth + +import ( + "time" + + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/whisper" +) + +// WhisperMessage is the external API representation of a whisper.Message. +type WhisperMessage struct { + ref *whisper.Message + + Payload string `json:"payload"` + To string `json:"to"` + From string `json:"from"` + Sent int64 `json:"sent"` + TTL int64 `json:"ttl"` + Hash string `json:"hash"` +} + +// NewWhisperMessage converts an internal message into an API version. +func NewWhisperMessage(message *whisper.Message) WhisperMessage { + return WhisperMessage{ + ref: message, + + Payload: common.ToHex(message.Payload), + From: common.ToHex(crypto.FromECDSAPub(message.Recover())), + To: common.ToHex(crypto.FromECDSAPub(message.To)), + Sent: message.Sent.Unix(), + TTL: int64(message.TTL / time.Second), + Hash: common.ToHex(message.Hash.Bytes()), + } +} diff --git a/xeth/xeth.go b/xeth/xeth.go new file mode 100644 index 0000000000..47dc4dc2ca --- /dev/null +++ b/xeth/xeth.go @@ -0,0 +1,1110 @@ +// Copyright 2014 The go-ethereum Authors && Copyright 2015 go-expanse Authors +// This file is part of the go-expanse library. +// +// The go-expanse library 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. +// +// The go-expanse 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-expanse library. If not, see . + +// Package xeth is the interface to all Expanse functionality. +package xeth + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "math/big" + "regexp" + "sync" + "time" + + "github.com/expanse-project/go-expanse/accounts" + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/common/compiler" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/core/vm" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/exp" + "github.com/expanse-project/go-expanse/exp/filters" + "github.com/expanse-project/go-expanse/logger" + "github.com/expanse-project/go-expanse/logger/glog" + "github.com/expanse-project/go-expanse/miner" + "github.com/expanse-project/go-expanse/rlp" +) + +var ( + filterTickerTime = 5 * time.Minute + defaultGasPrice = big.NewInt(10000000000000) //150000000000 + defaultGas = big.NewInt(90000) //500000 + dappStorePre = []byte("dapp-") + addrReg = regexp.MustCompile(`^(0x)?[a-fA-F0-9]{40}$`) +) + +// byte will be inferred +const ( + UnknownFilterTy = iota + BlockFilterTy + TransactionFilterTy + LogFilterTy +) + +type XEth struct { + quit chan struct{} + + logMu sync.RWMutex + logQueue map[int]*logQueue + + blockMu sync.RWMutex + blockQueue map[int]*hashQueue + + transactionMu sync.RWMutex + transactionQueue map[int]*hashQueue + + messagesMu sync.RWMutex + messages map[int]*whisperFilter + + transactMu sync.Mutex + + // read-only fields + backend *exp.Expanse + frontend Frontend + agent *miner.RemoteAgent + gpo *exp.GasPriceOracle + state *State + whisper *Whisper + filterManager *filters.FilterSystem +} + +func NewTest(exp *exp.Expanse, frontend Frontend) *XEth { + return &XEth{backend: exp, frontend: frontend} +} + +// New creates an XEth that uses the given frontend. +// If a nil Frontend is provided, a default frontend which +// confirms all transactions will be used. +func New(expanse *exp.Expanse, frontend Frontend) *XEth { + xeth := &XEth{ + backend: expanse, + frontend: frontend, + quit: make(chan struct{}), + filterManager: filters.NewFilterSystem(expanse.EventMux()), + logQueue: make(map[int]*logQueue), + blockQueue: make(map[int]*hashQueue), + transactionQueue: make(map[int]*hashQueue), + messages: make(map[int]*whisperFilter), + agent: miner.NewRemoteAgent(), + gpo: exp.NewGasPriceOracle(expanse), + } + if expanse.Whisper() != nil { + xexp.whisper = NewWhisper(expanse.Whisper()) + } + expanse.Miner().Register(xexp.agent) + if frontend == nil { + xexp.frontend = dummyFrontend{} + } + state, _ := xexp.backend.BlockChain().State() + xexp.state = NewState(xeth, state) + go xexp.start() + return xeth +} + +func (self *XEth) start() { + timer := time.NewTicker(2 * time.Second) + defer timer.Stop() +done: + for { + select { + case <-timer.C: + self.logMu.Lock() + for id, filter := range self.logQueue { + if time.Since(filter.timeout) > filterTickerTime { + self.filterManager.Remove(id) + delete(self.logQueue, id) + } + } + self.logMu.Unlock() + + self.blockMu.Lock() + for id, filter := range self.blockQueue { + if time.Since(filter.timeout) > filterTickerTime { + self.filterManager.Remove(id) + delete(self.blockQueue, id) + } + } + self.blockMu.Unlock() + + self.transactionMu.Lock() + for id, filter := range self.transactionQueue { + if time.Since(filter.timeout) > filterTickerTime { + self.filterManager.Remove(id) + delete(self.transactionQueue, id) + } + } + self.transactionMu.Unlock() + + self.messagesMu.Lock() + for id, filter := range self.messages { + if time.Since(filter.activity()) > filterTickerTime { + self.Whisper().Unwatch(id) + delete(self.messages, id) + } + } + self.messagesMu.Unlock() + case <-self.quit: + break done + } + } +} + +// Stop releases any resources associated with self. +// It may not be called more than once. +func (self *XEth) Stop() { + close(self.quit) + self.filterManager.Stop() + self.backend.Miner().Unregister(self.agent) +} + +func cAddress(a []string) []common.Address { + bslice := make([]common.Address, len(a)) + for i, addr := range a { + bslice[i] = common.HexToAddress(addr) + } + return bslice +} + +func cTopics(t [][]string) [][]common.Hash { + topics := make([][]common.Hash, len(t)) + for i, iv := range t { + topics[i] = make([]common.Hash, len(iv)) + for j, jv := range iv { + topics[i][j] = common.HexToHash(jv) + } + } + return topics +} + +func DefaultGas() *big.Int { return new(big.Int).Set(defaultGas) } + +func (self *XEth) DefaultGasPrice() *big.Int { + return self.gpo.SuggestPrice() +} + +func (self *XEth) RemoteMining() *miner.RemoteAgent { return self.agent } + +func (self *XEth) AtStateNum(num int64) *XEth { + var st *state.StateDB + var err error + switch num { + case -2: + st = self.backend.Miner().PendingState().Copy() + default: + if block := self.getBlockByHeight(num); block != nil { + st, err = state.New(block.Root(), self.backend.ChainDb()) + if err != nil { + return nil + } + } else { + st, err = state.New(self.backend.BlockChain().GetBlockByNumber(0).Root(), self.backend.ChainDb()) + if err != nil { + return nil + } + } + } + + return self.WithState(st) +} + +func (self *XEth) WithState(statedb *state.StateDB) *XEth { + xeth := &XEth{ + backend: self.backend, + frontend: self.frontend, + gpo: self.gpo, + } + + xexp.state = NewState(xeth, statedb) + return xeth +} + +func (self *XEth) State() *State { return self.state } + +// subscribes to new head block events and +// waits until blockchain height is greater n at any time +// given the current head, waits for the next chain event +// sets the state to the current head +// loop is async and quit by closing the channel +// used in tests and JS console debug module to control advancing private chain manually +// Note: this is not threadsafe, only called in JS single process and tests +func (self *XEth) UpdateState() (wait chan *big.Int) { + wait = make(chan *big.Int) + go func() { + eventSub := self.backend.EventMux().Subscribe(core.ChainHeadEvent{}) + defer eventSub.Unsubscribe() + + var m, n *big.Int + var ok bool + + eventCh := eventSub.Chan() + for { + select { + case event, ok := <-eventCh: + if !ok { + // Event subscription closed, set the channel to nil to stop spinning + eventCh = nil + continue + } + // A real event arrived, process if new head block assignment + if event, ok := event.Data.(core.ChainHeadEvent); ok { + m = event.Block.Number() + if n != nil && n.Cmp(m) < 0 { + wait <- n + n = nil + } + statedb, err := state.New(event.Block.Root(), self.backend.ChainDb()) + if err != nil { + glog.V(logger.Error).Infoln("Could not create new state: %v", err) + return + } + self.state = NewState(self, statedb) + } + case n, ok = <-wait: + if !ok { + return + } + } + } + }() + return +} + +func (self *XEth) Whisper() *Whisper { return self.whisper } + +func (self *XEth) getBlockByHeight(height int64) *types.Block { + var num uint64 + + switch height { + case -2: + return self.backend.Miner().PendingBlock() + case -1: + return self.CurrentBlock() + default: + if height < 0 { + return nil + } + + num = uint64(height) + } + + return self.backend.BlockChain().GetBlockByNumber(num) +} + +func (self *XEth) BlockByHash(strHash string) *Block { + hash := common.HexToHash(strHash) + block := self.backend.BlockChain().GetBlock(hash) + + return NewBlock(block) +} + +func (self *XEth) EthBlockByHash(strHash string) *types.Block { + hash := common.HexToHash(strHash) + block := self.backend.BlockChain().GetBlock(hash) + + return block +} + +func (self *XEth) EthTransactionByHash(hash string) (*types.Transaction, common.Hash, uint64, uint64) { + if tx, hash, number, index := core.GetTransaction(self.backend.ChainDb(), common.HexToHash(hash)); tx != nil { + return tx, hash, number, index + } + return self.backend.TxPool().GetTransaction(common.HexToHash(hash)), common.Hash{}, 0, 0 +} + +func (self *XEth) BlockByNumber(num int64) *Block { + return NewBlock(self.getBlockByHeight(num)) +} + +func (self *XEth) EthBlockByNumber(num int64) *types.Block { + return self.getBlockByHeight(num) +} + +func (self *XEth) Td(hash common.Hash) *big.Int { + return self.backend.BlockChain().GetTd(hash) +} + +func (self *XEth) CurrentBlock() *types.Block { + return self.backend.BlockChain().CurrentBlock() +} + +func (self *XEth) GetBlockReceipts(bhash common.Hash) types.Receipts { + return core.GetBlockReceipts(self.backend.ChainDb(), bhash) +} + +func (self *XEth) GetTxReceipt(txhash common.Hash) *types.Receipt { + return core.GetReceipt(self.backend.ChainDb(), txhash) +} + +func (self *XEth) GasLimit() *big.Int { + return self.backend.BlockChain().GasLimit() +} + +func (self *XEth) Block(v interface{}) *Block { + if n, ok := v.(int32); ok { + return self.BlockByNumber(int64(n)) + } else if str, ok := v.(string); ok { + return self.BlockByHash(str) + } else if f, ok := v.(float64); ok { // JSON numbers are represented as float64 + return self.BlockByNumber(int64(f)) + } + + return nil +} + +func (self *XEth) Accounts() []string { + // TODO: check err? + accounts, _ := self.backend.AccountManager().Accounts() + accountAddresses := make([]string, len(accounts)) + for i, ac := range accounts { + accountAddresses[i] = ac.Address.Hex() + } + return accountAddresses +} + +// accessor for solidity compiler. +// memoized if available, retried on-demand if not +func (self *XEth) Solc() (*compiler.Solidity, error) { + return self.backend.Solc() +} + +// set in js console via admin interface or wrapper from cli flags +func (self *XEth) SetSolc(solcPath string) (*compiler.Solidity, error) { + self.backend.SetSolc(solcPath) + return self.Solc() +} + +// store DApp value in extra database +func (self *XEth) DbPut(key, val []byte) bool { + self.backend.DappDb().Put(append(dappStorePre, key...), val) + return true +} + +// retrieve DApp value from extra database +func (self *XEth) DbGet(key []byte) ([]byte, error) { + val, err := self.backend.DappDb().Get(append(dappStorePre, key...)) + return val, err +} + +func (self *XEth) PeerCount() int { + return self.backend.PeerCount() +} + +func (self *XEth) IsMining() bool { + return self.backend.IsMining() +} + +func (self *XEth) HashRate() int64 { + return self.backend.Miner().HashRate() +} + +func (self *XEth) EthVersion() string { + return fmt.Sprintf("%d", self.backend.EthVersion()) +} + +func (self *XEth) NetworkVersion() string { + return fmt.Sprintf("%d", self.backend.NetVersion()) +} + +func (self *XEth) WhisperVersion() string { + return fmt.Sprintf("%d", self.backend.ShhVersion()) +} + +func (self *XEth) ClientVersion() string { + return self.backend.ClientVersion() +} + +func (self *XEth) SetMining(shouldmine bool, threads int) bool { + ismining := self.backend.IsMining() + if shouldmine && !ismining { + err := self.backend.StartMining(threads, "") + return err == nil + } + if ismining && !shouldmine { + self.backend.StopMining() + } + return self.backend.IsMining() +} + +func (self *XEth) IsListening() bool { + return self.backend.IsListening() +} + +func (self *XEth) Coinbase() string { + eb, err := self.backend.Etherbase() + if err != nil { + return "0x0" + } + return eb.Hex() +} + +func (self *XEth) NumberToHuman(balance string) string { + b := common.Big(balance) + + return common.CurrencyToString(b) +} + +func (self *XEth) StorageAt(addr, storageAddr string) string { + return self.State().state.GetState(common.HexToAddress(addr), common.HexToHash(storageAddr)).Hex() +} + +func (self *XEth) BalanceAt(addr string) string { + return common.ToHex(self.State().state.GetBalance(common.HexToAddress(addr)).Bytes()) +} + +func (self *XEth) TxCountAt(address string) int { + return int(self.State().state.GetNonce(common.HexToAddress(address))) +} + +func (self *XEth) CodeAt(address string) string { + return common.ToHex(self.State().state.GetCode(common.HexToAddress(address))) +} + +func (self *XEth) CodeAtBytes(address string) []byte { + return self.State().SafeGet(address).Code() +} + +func (self *XEth) IsContract(address string) bool { + return len(self.State().SafeGet(address).Code()) > 0 +} + +func (self *XEth) UninstallFilter(id int) bool { + defer self.filterManager.Remove(id) + + if _, ok := self.logQueue[id]; ok { + self.logMu.Lock() + defer self.logMu.Unlock() + delete(self.logQueue, id) + return true + } + if _, ok := self.blockQueue[id]; ok { + self.blockMu.Lock() + defer self.blockMu.Unlock() + delete(self.blockQueue, id) + return true + } + if _, ok := self.transactionQueue[id]; ok { + self.transactionMu.Lock() + defer self.transactionMu.Unlock() + delete(self.transactionQueue, id) + return true + } + + return false +} + +func (self *XEth) NewLogFilter(earliest, latest int64, skip, max int, address []string, topics [][]string) int { + self.logMu.Lock() + defer self.logMu.Unlock() + + filter := filters.New(self.backend.ChainDb()) + id := self.filterManager.Add(filter) + self.logQueue[id] = &logQueue{timeout: time.Now()} + + filter.SetBeginBlock(earliest) + filter.SetEndBlock(latest) + filter.SetAddresses(cAddress(address)) + filter.SetTopics(cTopics(topics)) + filter.LogsCallback = func(logs vm.Logs) { + self.logMu.Lock() + defer self.logMu.Unlock() + + if queue := self.logQueue[id]; queue != nil { + queue.add(logs...) + } + } + + return id +} + +func (self *XEth) NewTransactionFilter() int { + self.transactionMu.Lock() + defer self.transactionMu.Unlock() + + filter := filters.New(self.backend.ChainDb()) + id := self.filterManager.Add(filter) + self.transactionQueue[id] = &hashQueue{timeout: time.Now()} + + filter.TransactionCallback = func(tx *types.Transaction) { + self.transactionMu.Lock() + defer self.transactionMu.Unlock() + + if queue := self.transactionQueue[id]; queue != nil { + queue.add(tx.Hash()) + } + } + return id +} + +func (self *XEth) NewBlockFilter() int { + self.blockMu.Lock() + defer self.blockMu.Unlock() + + filter := filters.New(self.backend.ChainDb()) + id := self.filterManager.Add(filter) + self.blockQueue[id] = &hashQueue{timeout: time.Now()} + + filter.BlockCallback = func(block *types.Block, logs vm.Logs) { + self.blockMu.Lock() + defer self.blockMu.Unlock() + + if queue := self.blockQueue[id]; queue != nil { + queue.add(block.Hash()) + } + } + return id +} + +func (self *XEth) GetFilterType(id int) byte { + if _, ok := self.blockQueue[id]; ok { + return BlockFilterTy + } else if _, ok := self.transactionQueue[id]; ok { + return TransactionFilterTy + } else if _, ok := self.logQueue[id]; ok { + return LogFilterTy + } + + return UnknownFilterTy +} + +func (self *XEth) LogFilterChanged(id int) vm.Logs { + self.logMu.Lock() + defer self.logMu.Unlock() + + if self.logQueue[id] != nil { + return self.logQueue[id].get() + } + return nil +} + +func (self *XEth) BlockFilterChanged(id int) []common.Hash { + self.blockMu.Lock() + defer self.blockMu.Unlock() + + if self.blockQueue[id] != nil { + return self.blockQueue[id].get() + } + return nil +} + +func (self *XEth) TransactionFilterChanged(id int) []common.Hash { + self.blockMu.Lock() + defer self.blockMu.Unlock() + + if self.transactionQueue[id] != nil { + return self.transactionQueue[id].get() + } + return nil +} + +func (self *XEth) Logs(id int) vm.Logs { + filter := self.filterManager.Get(id) + if filter != nil { + return filter.Find() + } + + return nil +} + +func (self *XEth) AllLogs(earliest, latest int64, skip, max int, address []string, topics [][]string) vm.Logs { + filter := filters.New(self.backend.ChainDb()) + filter.SetBeginBlock(earliest) + filter.SetEndBlock(latest) + filter.SetAddresses(cAddress(address)) + filter.SetTopics(cTopics(topics)) + + return filter.Find() +} + +// NewWhisperFilter creates and registers a new message filter to watch for +// inbound whisper messages. All parameters at this point are assumed to be +// HEX encoded. +func (p *XEth) NewWhisperFilter(to, from string, topics [][]string) int { + // Pre-define the id to be filled later + var id int + + // Callback to delegate core whisper messages to this xeth filter + callback := func(msg WhisperMessage) { + p.messagesMu.RLock() // Only read lock to the filter pool + defer p.messagesMu.RUnlock() + p.messages[id].insert(msg) + } + // Initialize the core whisper filter and wrap into xeth + id = p.Whisper().Watch(to, from, topics, callback) + + p.messagesMu.Lock() + p.messages[id] = newWhisperFilter(id, p.Whisper()) + p.messagesMu.Unlock() + + return id +} + +// UninstallWhisperFilter disables and removes an existing filter. +func (p *XEth) UninstallWhisperFilter(id int) bool { + p.messagesMu.Lock() + defer p.messagesMu.Unlock() + + if _, ok := p.messages[id]; ok { + delete(p.messages, id) + return true + } + return false +} + +// WhisperMessages retrieves all the known messages that match a specific filter. +func (self *XEth) WhisperMessages(id int) []WhisperMessage { + self.messagesMu.RLock() + defer self.messagesMu.RUnlock() + + if self.messages[id] != nil { + return self.messages[id].messages() + } + return nil +} + +// WhisperMessagesChanged retrieves all the new messages matched by a filter +// since the last retrieval +func (self *XEth) WhisperMessagesChanged(id int) []WhisperMessage { + self.messagesMu.RLock() + defer self.messagesMu.RUnlock() + + if self.messages[id] != nil { + return self.messages[id].retrieve() + } + return nil +} + +// func (self *XEth) Register(args string) bool { +// self.regmut.Lock() +// defer self.regmut.Unlock() + +// if _, ok := self.register[args]; ok { +// self.register[args] = nil // register with empty +// } +// return true +// } + +// func (self *XEth) Unregister(args string) bool { +// self.regmut.Lock() +// defer self.regmut.Unlock() + +// if _, ok := self.register[args]; ok { +// delete(self.register, args) +// return true +// } + +// return false +// } + +// // TODO improve return type +// func (self *XEth) PullWatchTx(args string) []*interface{} { +// self.regmut.Lock() +// defer self.regmut.Unlock() + +// txs := self.register[args] +// self.register[args] = nil + +// return txs +// } + +type KeyVal struct { + Key string `json:"key"` + Value string `json:"value"` +} + +func (self *XEth) EachStorage(addr string) string { + var values []KeyVal + object := self.State().SafeGet(addr) + it := object.Trie().Iterator() + for it.Next() { + values = append(values, KeyVal{common.ToHex(object.Trie().GetKey(it.Key)), common.ToHex(it.Value)}) + } + + valuesJson, err := json.Marshal(values) + if err != nil { + return "" + } + + return string(valuesJson) +} + +func (self *XEth) ToAscii(str string) string { + padded := common.RightPadBytes([]byte(str), 32) + + return "0x" + common.ToHex(padded) +} + +func (self *XEth) FromAscii(str string) string { + if common.IsHex(str) { + str = str[2:] + } + + return string(bytes.Trim(common.FromHex(str), "\x00")) +} + +func (self *XEth) FromNumber(str string) string { + if common.IsHex(str) { + str = str[2:] + } + + return common.BigD(common.FromHex(str)).String() +} + +func (self *XEth) PushTx(encodedTx string) (string, error) { + tx := new(types.Transaction) + err := rlp.DecodeBytes(common.FromHex(encodedTx), tx) + if err != nil { + glog.V(logger.Error).Infoln(err) + return "", err + } + + err = self.backend.TxPool().Add(tx) + if err != nil { + return "", err + } + + if tx.To() == nil { + from, err := tx.From() + if err != nil { + return "", err + } + + addr := crypto.CreateAddress(from, tx.Nonce()) + glog.V(logger.Info).Infof("Tx(%x) created: %x\n", tx.Hash(), addr) + } else { + glog.V(logger.Info).Infof("Tx(%x) to: %x\n", tx.Hash(), tx.To()) + } + + return tx.Hash().Hex(), nil +} + +func (self *XEth) Call(fromStr, toStr, valueStr, gasStr, gasPriceStr, dataStr string) (string, string, error) { + statedb := self.State().State().Copy() + var from *state.StateObject + if len(fromStr) == 0 { + accounts, err := self.backend.AccountManager().Accounts() + if err != nil || len(accounts) == 0 { + from = statedb.GetOrNewStateObject(common.Address{}) + } else { + from = statedb.GetOrNewStateObject(accounts[0].Address) + } + } else { + from = statedb.GetOrNewStateObject(common.HexToAddress(fromStr)) + } + + from.SetBalance(common.MaxBig) + + msg := callmsg{ + from: from, + gas: common.Big(gasStr), + gasPrice: common.Big(gasPriceStr), + value: common.Big(valueStr), + data: common.FromHex(dataStr), + } + if len(toStr) > 0 { + addr := common.HexToAddress(toStr) + msg.to = &addr + } + + if msg.gas.Cmp(big.NewInt(0)) == 0 { + msg.gas = big.NewInt(50000000) + } + + if msg.gasPrice.Cmp(big.NewInt(0)) == 0 { + msg.gasPrice = self.DefaultGasPrice() + } + + header := self.CurrentBlock().Header() + vmenv := core.NewEnv(statedb, self.backend.BlockChain(), msg, header) + gp := new(core.GasPool).AddGas(common.MaxBig) + res, gas, err := core.ApplyMessage(vmenv, msg, gp) + return common.ToHex(res), gas.String(), err +} + +func (self *XEth) ConfirmTransaction(tx string) bool { + return self.frontend.ConfirmTransaction(tx) +} + +func (self *XEth) doSign(from common.Address, hash common.Hash, didUnlock bool) ([]byte, error) { + sig, err := self.backend.AccountManager().Sign(accounts.Account{Address: from}, hash.Bytes()) + if err == accounts.ErrLocked { + if didUnlock { + return nil, fmt.Errorf("signer account still locked after successful unlock") + } + if !self.frontend.UnlockAccount(from.Bytes()) { + return nil, fmt.Errorf("could not unlock signer account") + } + // retry signing, the account should now be unlocked. + return self.doSign(from, hash, true) + } else if err != nil { + return nil, err + } + return sig, nil +} + +func (self *XEth) Sign(fromStr, hashStr string, didUnlock bool) (string, error) { + var ( + from = common.HexToAddress(fromStr) + hash = common.HexToHash(hashStr) + ) + sig, err := self.doSign(from, hash, didUnlock) + if err != nil { + return "", err + } + return common.ToHex(sig), nil +} + +func isAddress(addr string) bool { + return addrReg.MatchString(addr) +} + +func (self *XEth) Frontend() Frontend { + return self.frontend +} + +func (self *XEth) SignTransaction(fromStr, toStr, nonceStr, valueStr, gasStr, gasPriceStr, codeStr string) (*types.Transaction, error) { + if len(toStr) > 0 && toStr != "0x" && !isAddress(toStr) { + return nil, errors.New("Invalid address") + } + + var ( + from = common.HexToAddress(fromStr) + to = common.HexToAddress(toStr) + value = common.Big(valueStr) + gas *big.Int + price *big.Int + data []byte + contractCreation bool + ) + + if len(gasStr) == 0 { + gas = DefaultGas() + } else { + gas = common.Big(gasStr) + } + + if len(gasPriceStr) == 0 { + price = self.DefaultGasPrice() + } else { + price = common.Big(gasPriceStr) + } + + data = common.FromHex(codeStr) + if len(toStr) == 0 { + contractCreation = true + } + + var nonce uint64 + if len(nonceStr) != 0 { + nonce = common.Big(nonceStr).Uint64() + } else { + state := self.backend.TxPool().State() + nonce = state.GetNonce(from) + } + var tx *types.Transaction + if contractCreation { + tx = types.NewContractCreation(nonce, value, gas, price, data) + } else { + tx = types.NewTransaction(nonce, to, value, gas, price, data) + } + + signed, err := self.sign(tx, from, false) + if err != nil { + return nil, err + } + + return signed, nil +} + +func (self *XEth) Transact(fromStr, toStr, nonceStr, valueStr, gasStr, gasPriceStr, codeStr string) (string, error) { + + // this minimalistic recoding is enough (works for natspec.js) + var jsontx = fmt.Sprintf(`{"params":[{"to":"%s","data": "%s"}]}`, toStr, codeStr) + if !self.ConfirmTransaction(jsontx) { + err := fmt.Errorf("Transaction not confirmed") + return "", err + } + + if len(toStr) > 0 && toStr != "0x" && !isAddress(toStr) { + return "", errors.New("Invalid address") + } + + var ( + from = common.HexToAddress(fromStr) + to = common.HexToAddress(toStr) + value = common.Big(valueStr) + gas *big.Int + price *big.Int + data []byte + contractCreation bool + ) + + if len(gasStr) == 0 { + gas = DefaultGas() + } else { + gas = common.Big(gasStr) + } + + if len(gasPriceStr) == 0 { + price = self.DefaultGasPrice() + } else { + price = common.Big(gasPriceStr) + } + + data = common.FromHex(codeStr) + if len(toStr) == 0 { + contractCreation = true + } + + // 2015-05-18 Is this still needed? + // TODO if no_private_key then + //if _, exists := p.register[args.From]; exists { + // p.register[args.From] = append(p.register[args.From], args) + //} else { + /* + account := accounts.Get(common.FromHex(args.From)) + if account != nil { + if account.Unlocked() { + if !unlockAccount(account) { + return + } + } + + result, _ := account.Transact(common.FromHex(args.To), common.FromHex(args.Value), common.FromHex(args.Gas), common.FromHex(args.GasPrice), common.FromHex(args.Data)) + if len(result) > 0 { + *reply = common.ToHex(result) + } + } else if _, exists := p.register[args.From]; exists { + p.register[ags.From] = append(p.register[args.From], args) + } + */ + + self.transactMu.Lock() + defer self.transactMu.Unlock() + + var nonce uint64 + if len(nonceStr) != 0 { + nonce = common.Big(nonceStr).Uint64() + } else { + state := self.backend.TxPool().State() + nonce = state.GetNonce(from) + } + var tx *types.Transaction + if contractCreation { + tx = types.NewContractCreation(nonce, value, gas, price, data) + } else { + tx = types.NewTransaction(nonce, to, value, gas, price, data) + } + + signed, err := self.sign(tx, from, false) + if err != nil { + return "", err + } + if err = self.backend.TxPool().Add(signed); err != nil { + return "", err + } + + if contractCreation { + addr := crypto.CreateAddress(from, nonce) + glog.V(logger.Info).Infof("Tx(%s) created: %s\n", signed.Hash().Hex(), addr.Hex()) + } else { + glog.V(logger.Info).Infof("Tx(%s) to: %s\n", signed.Hash().Hex(), tx.To().Hex()) + } + + return signed.Hash().Hex(), nil +} + +func (self *XEth) sign(tx *types.Transaction, from common.Address, didUnlock bool) (*types.Transaction, error) { + hash := tx.SigHash() + sig, err := self.doSign(from, hash, didUnlock) + if err != nil { + return tx, err + } + return tx.WithSignature(sig) +} + +// callmsg is the message type used for call transations. +type callmsg struct { + from *state.StateObject + to *common.Address + gas, gasPrice *big.Int + value *big.Int + data []byte +} + +// accessor boilerplate to implement core.Message +func (m callmsg) From() (common.Address, error) { return m.from.Address(), nil } +func (m callmsg) FromFrontier() (common.Address, error) { return m.from.Address(), nil } +func (m callmsg) Nonce() uint64 { return m.from.Nonce() } +func (m callmsg) To() *common.Address { return m.to } +func (m callmsg) GasPrice() *big.Int { return m.gasPrice } +func (m callmsg) Gas() *big.Int { return m.gas } +func (m callmsg) Value() *big.Int { return m.value } +func (m callmsg) Data() []byte { return m.data } + +type logQueue struct { + mu sync.Mutex + + logs vm.Logs + timeout time.Time + id int +} + +func (l *logQueue) add(logs ...*vm.Log) { + l.mu.Lock() + defer l.mu.Unlock() + + l.logs = append(l.logs, logs...) +} + +func (l *logQueue) get() vm.Logs { + l.mu.Lock() + defer l.mu.Unlock() + + l.timeout = time.Now() + tmp := l.logs + l.logs = nil + return tmp +} + +type hashQueue struct { + mu sync.Mutex + + hashes []common.Hash + timeout time.Time + id int +} + +func (l *hashQueue) add(hashes ...common.Hash) { + l.mu.Lock() + defer l.mu.Unlock() + + l.hashes = append(l.hashes, hashes...) +} + +func (l *hashQueue) get() []common.Hash { + l.mu.Lock() + defer l.mu.Unlock() + + l.timeout = time.Now() + tmp := l.hashes + l.hashes = nil + return tmp +}