aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Godeps/Godeps.json4
-rw-r--r--Godeps/_workspace/src/github.com/ethereum/ethash/CMakeLists.txt7
-rw-r--r--Godeps/_workspace/src/github.com/ethereum/ethash/ethash.go6
-rw-r--r--Godeps/_workspace/src/github.com/ethereum/ethash/ethash_test.go28
-rw-r--r--Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash-cl/CMakeLists.txt47
-rw-r--r--Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash-cl/bin2h.cmake86
-rw-r--r--Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash-cl/cl.hpp12906
-rw-r--r--Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash-cl/ethash_cl_miner.cpp384
-rw-r--r--Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash-cl/ethash_cl_miner.h57
-rw-r--r--Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash-cl/ethash_cl_miner_kernel.cl460
-rw-r--r--Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/endian.h3
-rw-r--r--Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/internal.c13
-rw-r--r--Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io.c21
-rw-r--r--Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io.h17
-rw-r--r--Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io_posix.c9
-rw-r--r--Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io_win32.c4
-rw-r--r--Godeps/_workspace/src/github.com/ethereum/ethash/test/c/test.cpp9
-rw-r--r--cmd/console/js.go25
-rw-r--r--cmd/console/main.go11
-rw-r--r--cmd/geth/main.go8
-rw-r--r--cmd/utils/flags.go98
-rw-r--r--common/types.go15
-rw-r--r--core/block_processor.go137
-rw-r--r--core/block_processor_test.go8
-rw-r--r--core/chain_manager.go12
-rw-r--r--core/state/dump.go6
-rw-r--r--core/state/state_object.go78
-rw-r--r--core/state/state_test.go23
-rw-r--r--core/state/statedb.go46
-rw-r--r--core/state_transition.go8
-rw-r--r--core/transaction_pool.go56
-rw-r--r--core/vm/vm.go17
-rw-r--r--eth/backend.go61
-rw-r--r--eth/downloader/downloader.go281
-rw-r--r--eth/downloader/downloader_test.go734
-rw-r--r--eth/downloader/peer.go2
-rw-r--r--eth/downloader/queue.go2
-rw-r--r--eth/downloader/queue_test.go30
-rw-r--r--eth/fetcher/fetcher.go368
-rw-r--r--eth/fetcher/fetcher_test.go397
-rw-r--r--eth/gasprice.go181
-rw-r--r--eth/handler.go227
-rw-r--r--eth/protocol_test.go4
-rw-r--r--eth/sync.go228
-rw-r--r--miner/miner.go2
-rw-r--r--miner/worker.go7
-rw-r--r--p2p/peer.go87
-rw-r--r--p2p/peer_test.go2
-rw-r--r--rpc/api.go2
-rw-r--r--rpc/api/eth.go11
-rw-r--r--rpc/api/eth_args.go8
-rw-r--r--tests/block_test_util.go2
-rw-r--r--tests/files/BlockTests/bcInvalidHeaderTest.json310
-rw-r--r--tests/files/BlockTests/bcUncleHeaderValiditiy.json850
-rw-r--r--tests/files/StateTests/RandomTests/st201506091836GO.json71
-rw-r--r--tests/files/StateTests/RandomTests/st201506092032GO.json71
-rw-r--r--tests/files/StateTests/RandomTests/st201506101359JS.json71
-rw-r--r--tests/files/StateTests/RandomTests/st201506101754PYTHON.json71
-rw-r--r--tests/files/StateTests/stPrecompiledContractsTransaction.json1556
-rw-r--r--tests/files/VMTests/RandomTests/vm201506052232CPPJIT.json31
-rw-r--r--tests/files/VMTests/RandomTests/vm201506052232PYTHON.json46
-rw-r--r--tests/files/VMTests/RandomTests/vm201506060003CPPJIT.json31
-rw-r--r--tests/files/VMTests/RandomTests/vm201506060003PYTHON.json46
-rw-r--r--tests/files/VMTests/RandomTests/vm201506060013CPPJIT.json31
-rw-r--r--tests/files/VMTests/RandomTests/vm201506060035CPPJIT.json31
-rw-r--r--tests/files/VMTests/RandomTests/vm201506060035PYTHON.json47
-rw-r--r--tests/files/VMTests/RandomTests/vm201506060134CPPJIT.json31
-rw-r--r--tests/files/VMTests/RandomTests/vm201506060134PYTHON.json47
-rw-r--r--tests/vm/gh_test.go10
-rw-r--r--xeth/types.go8
-rw-r--r--xeth/xeth.go31
71 files changed, 4824 insertions, 15811 deletions
diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json
index 4cbc73def..0607990a8 100644
--- a/Godeps/Godeps.json
+++ b/Godeps/Godeps.json
@@ -21,8 +21,8 @@
},
{
"ImportPath": "github.com/ethereum/ethash",
- "Comment": "v23.1-206-gf0e6321",
- "Rev": "f0e63218b721dc2f696920a92d5de1f6364e9bf7"
+ "Comment": "v23.1-222-g173b8ff",
+ "Rev": "173b8ff953610c13710061e83b95b50c73d7ea50"
},
{
"ImportPath": "github.com/howeyc/fsnotify",
diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/CMakeLists.txt b/Godeps/_workspace/src/github.com/ethereum/ethash/CMakeLists.txt
index ea8c1849a..807c43e96 100644
--- a/Godeps/_workspace/src/github.com/ethereum/ethash/CMakeLists.txt
+++ b/Godeps/_workspace/src/github.com/ethereum/ethash/CMakeLists.txt
@@ -9,13 +9,6 @@ if (WIN32 AND WANT_CRYPTOPP)
endif()
add_subdirectory(src/libethash)
-# bin2h.cmake doesn't work
-if (NOT OpenCL_FOUND)
- find_package(OpenCL)
-endif()
-if (OpenCL_FOUND)
- add_subdirectory(src/libethash-cl)
-endif()
add_subdirectory(src/benchmark EXCLUDE_FROM_ALL)
add_subdirectory(test/c)
diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/ethash.go b/Godeps/_workspace/src/github.com/ethereum/ethash/ethash.go
index ce450d461..73c5bf664 100644
--- a/Godeps/_workspace/src/github.com/ethereum/ethash/ethash.go
+++ b/Godeps/_workspace/src/github.com/ethereum/ethash/ethash.go
@@ -119,6 +119,12 @@ func (l *Light) Verify(block pow.Block) bool {
if !ret.success {
return false
}
+
+ // avoid mixdigest malleability as it's not included in a block's "hashNononce"
+ if block.MixDigest() != h256ToHash(ret.mix_hash) {
+ return false
+ }
+
// Make sure cache is live until after the C call.
// This is important because a GC might happen and execute
// the finalizer before the call completes.
diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/ethash_test.go b/Godeps/_workspace/src/github.com/ethereum/ethash/ethash_test.go
index 42be77b94..e6833e343 100644
--- a/Godeps/_workspace/src/github.com/ethereum/ethash/ethash_test.go
+++ b/Godeps/_workspace/src/github.com/ethereum/ethash/ethash_test.go
@@ -39,6 +39,7 @@ var validBlocks = []*testBlock{
hashNoNonce: common.HexToHash("372eca2454ead349c3df0ab5d00b0b706b23e49d469387db91811cee0358fc6d"),
difficulty: big.NewInt(132416),
nonce: 0x495732e0ed7a801c,
+ mixDigest: common.HexToHash("2f74cdeb198af0b9abe65d22d372e22fb2d474371774a9583c1cc427a07939f5"),
},
// from proof of concept nine testnet, epoch 1
{
@@ -46,6 +47,7 @@ var validBlocks = []*testBlock{
hashNoNonce: common.HexToHash("7e44356ee3441623bc72a683fd3708fdf75e971bbe294f33e539eedad4b92b34"),
difficulty: big.NewInt(1532671),
nonce: 0x318df1c8adef7e5e,
+ mixDigest: common.HexToHash("144b180aad09ae3c81fb07be92c8e6351b5646dda80e6844ae1b697e55ddde84"),
},
// from proof of concept nine testnet, epoch 2
{
@@ -53,6 +55,7 @@ var validBlocks = []*testBlock{
hashNoNonce: common.HexToHash("5fc898f16035bf5ac9c6d9077ae1e3d5fc1ecc3c9fd5bee8bb00e810fdacbaa0"),
difficulty: big.NewInt(2467358),
nonce: 0x50377003e5d830ca,
+ mixDigest: common.HexToHash("ab546a5b73c452ae86dadd36f0ed83a6745226717d3798832d1b20b489e82063"),
},
}
@@ -73,8 +76,9 @@ func TestEthashConcurrentVerify(t *testing.T) {
defer os.RemoveAll(eth.Full.Dir)
block := &testBlock{difficulty: big.NewInt(10)}
- nonce, _ := eth.Search(block, nil)
+ nonce, md := eth.Search(block, nil)
block.nonce = nonce
+ block.mixDigest = common.BytesToHash(md)
// Verify the block concurrently to check for data races.
var wg sync.WaitGroup
@@ -98,21 +102,26 @@ func TestEthashConcurrentSearch(t *testing.T) {
eth.Turbo(true)
defer os.RemoveAll(eth.Full.Dir)
- // launch n searches concurrently.
+ type searchRes struct {
+ n uint64
+ md []byte
+ }
+
var (
block = &testBlock{difficulty: big.NewInt(35000)}
nsearch = 10
wg = new(sync.WaitGroup)
- found = make(chan uint64)
+ 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, _ := eth.Search(block, stop)
+ nonce, md := eth.Search(block, stop)
select {
- case found <- nonce:
+ case found <- searchRes{n: nonce, md: md}:
case <-stop:
}
wg.Done()
@@ -120,12 +129,14 @@ func TestEthashConcurrentSearch(t *testing.T) {
}
// wait for one of them to find the nonce
- nonce := <-found
+ res := <-found
// stop the others
close(stop)
wg.Wait()
- if block.nonce = nonce; !eth.Verify(block) {
+ block.nonce = res.n
+ block.mixDigest = common.BytesToHash(res.md)
+ if !eth.Verify(block) {
t.Error("Block could not be verified")
}
}
@@ -140,8 +151,9 @@ func TestEthashSearchAcrossEpoch(t *testing.T) {
for i := epochLength - 40; i < epochLength+40; i++ {
block := &testBlock{number: i, difficulty: big.NewInt(90)}
rand.Read(block.hashNoNonce[:])
- nonce, _ := eth.Search(block, nil)
+ nonce, md := eth.Search(block, nil)
block.nonce = nonce
+ block.mixDigest = common.BytesToHash(md)
if !eth.Verify(block) {
t.Fatalf("Block could not be verified")
}
diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash-cl/CMakeLists.txt b/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash-cl/CMakeLists.txt
deleted file mode 100644
index 3cfe1644d..000000000
--- a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash-cl/CMakeLists.txt
+++ /dev/null
@@ -1,47 +0,0 @@
-cmake_minimum_required(VERSION 2.8)
-
-set(LIBRARY ethash-cl)
-set(CMAKE_BUILD_TYPE Release)
-
-include(bin2h.cmake)
-bin2h(SOURCE_FILE ethash_cl_miner_kernel.cl
- VARIABLE_NAME ethash_cl_miner_kernel
- HEADER_FILE ${CMAKE_CURRENT_BINARY_DIR}/ethash_cl_miner_kernel.h)
-
-if (NOT MSVC)
- # Initialize CXXFLAGS for c++11
- set(CMAKE_CXX_FLAGS "-Wall -std=c++11")
- set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
- set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG")
- set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
- set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
-
- # Compiler-specific C++11 activation.
- if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
- execute_process(
- COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
- if (NOT (GCC_VERSION VERSION_GREATER 4.7 OR GCC_VERSION VERSION_EQUAL 4.7))
- message(FATAL_ERROR "${PROJECT_NAME} requires g++ 4.7 or greater.")
- endif ()
- elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
- else ()
- message(FATAL_ERROR "Your C++ compiler does not support C++11.")
- endif ()
-endif()
-
-set(OpenCL_FOUND TRUE)
-set(OpenCL_INCLUDE_DIRS /usr/include/CL)
-set(OpenCL_LIBRARIES -lOpenCL)
-
-if (NOT OpenCL_FOUND)
- find_package(OpenCL)
-endif()
-
-if (OpenCL_FOUND)
- set(CMAKE_CXX_FLAGS "-std=c++11 -Wall -Wno-unknown-pragmas -Wextra -Werror -pedantic -fPIC ${CMAKE_CXX_FLAGS}")
- include_directories(${OpenCL_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR})
- include_directories(..)
- add_library(${LIBRARY} ethash_cl_miner.cpp ethash_cl_miner.h cl.hpp)
- TARGET_LINK_LIBRARIES(${LIBRARY} ${OpenCL_LIBRARIES} ethash)
-endif()
diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash-cl/bin2h.cmake b/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash-cl/bin2h.cmake
deleted file mode 100644
index 90ca9cc5b..000000000
--- a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash-cl/bin2h.cmake
+++ /dev/null
@@ -1,86 +0,0 @@
-# https://gist.github.com/sivachandran/3a0de157dccef822a230
-include(CMakeParseArguments)
-
-# Function to wrap a given string into multiple lines at the given column position.
-# Parameters:
-# VARIABLE - The name of the CMake variable holding the string.
-# AT_COLUMN - The column position at which string will be wrapped.
-function(WRAP_STRING)
- set(oneValueArgs VARIABLE AT_COLUMN)
- cmake_parse_arguments(WRAP_STRING "${options}" "${oneValueArgs}" "" ${ARGN})
-
- string(LENGTH ${${WRAP_STRING_VARIABLE}} stringLength)
- math(EXPR offset "0")
-
- while(stringLength GREATER 0)
-
- if(stringLength GREATER ${WRAP_STRING_AT_COLUMN})
- math(EXPR length "${WRAP_STRING_AT_COLUMN}")
- else()
- math(EXPR length "${stringLength}")
- endif()
-
- string(SUBSTRING ${${WRAP_STRING_VARIABLE}} ${offset} ${length} line)
- set(lines "${lines}\n${line}")
-
- math(EXPR stringLength "${stringLength} - ${length}")
- math(EXPR offset "${offset} + ${length}")
- endwhile()
-
- set(${WRAP_STRING_VARIABLE} "${lines}" PARENT_SCOPE)
-endfunction()
-
-# Function to embed contents of a file as byte array in C/C++ header file(.h). The header file
-# will contain a byte array and integer variable holding the size of the array.
-# Parameters
-# SOURCE_FILE - The path of source file whose contents will be embedded in the header file.
-# VARIABLE_NAME - The name of the variable for the byte array. The string "_SIZE" will be append
-# to this name and will be used a variable name for size variable.
-# HEADER_FILE - The path of header file.
-# APPEND - If specified appends to the header file instead of overwriting it
-# NULL_TERMINATE - If specified a null byte(zero) will be append to the byte array. This will be
-# useful if the source file is a text file and we want to use the file contents
-# as string. But the size variable holds size of the byte array without this
-# null byte.
-# Usage:
-# bin2h(SOURCE_FILE "Logo.png" HEADER_FILE "Logo.h" VARIABLE_NAME "LOGO_PNG")
-function(BIN2H)
- set(options APPEND NULL_TERMINATE)
- set(oneValueArgs SOURCE_FILE VARIABLE_NAME HEADER_FILE)
- cmake_parse_arguments(BIN2H "${options}" "${oneValueArgs}" "" ${ARGN})
-
- # reads source file contents as hex string
- file(READ ${BIN2H_SOURCE_FILE} hexString HEX)
- string(LENGTH ${hexString} hexStringLength)
-
- # appends null byte if asked
- if(BIN2H_NULL_TERMINATE)
- set(hexString "${hexString}00")
- endif()
-
- # wraps the hex string into multiple lines at column 32(i.e. 16 bytes per line)
- wrap_string(VARIABLE hexString AT_COLUMN 32)
- math(EXPR arraySize "${hexStringLength} / 2")
-
- # adds '0x' prefix and comma suffix before and after every byte respectively
- string(REGEX REPLACE "([0-9a-f][0-9a-f])" "0x\\1, " arrayValues ${hexString})
- # removes trailing comma
- string(REGEX REPLACE ", $" "" arrayValues ${arrayValues})
-
- # converts the variable name into proper C identifier
- IF (${CMAKE_VERSION} GREATER 2.8.10) # fix for legacy cmake
- string(MAKE_C_IDENTIFIER "${BIN2H_VARIABLE_NAME}" BIN2H_VARIABLE_NAME)
- ENDIF()
- string(TOUPPER "${BIN2H_VARIABLE_NAME}" BIN2H_VARIABLE_NAME)
-
- # declares byte array and the length variables
- set(arrayDefinition "const unsigned char ${BIN2H_VARIABLE_NAME}[] = { ${arrayValues} };")
- set(arraySizeDefinition "const size_t ${BIN2H_VARIABLE_NAME}_SIZE = ${arraySize};")
-
- set(declarations "${arrayDefinition}\n\n${arraySizeDefinition}\n\n")
- if(BIN2H_APPEND)
- file(APPEND ${BIN2H_HEADER_FILE} "${declarations}")
- else()
- file(WRITE ${BIN2H_HEADER_FILE} "${declarations}")
- endif()
-endfunction()
diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash-cl/cl.hpp b/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash-cl/cl.hpp
deleted file mode 100644
index 5c9be5c5e..000000000
--- a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash-cl/cl.hpp
+++ /dev/null
@@ -1,12906 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008-2015 The Khronos Group Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and/or associated documentation files (the
- * "Materials"), to deal in the Materials without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Materials, and to
- * permit persons to whom the Materials are 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 Materials.
- *
- * THE MATERIALS ARE 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
- * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
- ******************************************************************************/
-
-/*! \file
- *
- * \brief C++ bindings for OpenCL 1.0 (rev 48), OpenCL 1.1 (rev 33) and
- * OpenCL 1.2 (rev 15)
- * \author Benedict R. Gaster, Laurent Morichetti and Lee Howes
- *
- * Additions and fixes from:
- * Brian Cole, March 3rd 2010 and April 2012
- * Matt Gruenke, April 2012.
- * Bruce Merry, February 2013.
- * Tom Deakin and Simon McIntosh-Smith, July 2013
- *
- * \version 1.2.7
- * \date January 2015
- *
- * Optional extension support
- *
- * cl
- * cl_ext_device_fission
- * #define USE_CL_DEVICE_FISSION
- */
-
-/*! \mainpage
- * \section intro Introduction
- * For many large applications C++ is the language of choice and so it seems
- * reasonable to define C++ bindings for OpenCL.
- *
- *
- * The interface is contained with a single C++ header file \em cl.hpp and all
- * definitions are contained within the namespace \em cl. There is no additional
- * requirement to include \em cl.h and to use either the C++ or original C
- * bindings it is enough to simply include \em cl.hpp.
- *
- * The bindings themselves are lightweight and correspond closely to the
- * underlying C API. Using the C++ bindings introduces no additional execution
- * overhead.
- *
- * For detail documentation on the bindings see:
- *
- * The OpenCL C++ Wrapper API 1.2 (revision 09)
- * http://www.khronos.org/registry/cl/specs/opencl-cplusplus-1.2.pdf
- *
- * \section example Example
- *
- * The following example shows a general use case for the C++
- * bindings, including support for the optional exception feature and
- * also the supplied vector and string classes, see following sections for
- * decriptions of these features.
- *
- * \code
- * #define __CL_ENABLE_EXCEPTIONS
- *
- * #if defined(__APPLE__) || defined(__MACOSX)
- * #include <OpenCL/cl.hpp>
- * #else
- * #include <CL/cl.hpp>
- * #endif
- * #include <cstdio>
- * #include <cstdlib>
- * #include <iostream>
- *
- * const char * helloStr = "__kernel void "
- * "hello(void) "
- * "{ "
- * " "
- * "} ";
- *
- * int
- * main(void)
- * {
- * cl_int err = CL_SUCCESS;
- * try {
- *
- * std::vector<cl::Platform> platforms;
- * cl::Platform::get(&platforms);
- * if (platforms.size() == 0) {
- * std::cout << "Platform size 0\n";
- * return -1;
- * }
- *
- * cl_context_properties properties[] =
- * { CL_CONTEXT_PLATFORM, (cl_context_properties)(platforms[0])(), 0};
- * cl::Context context(CL_DEVICE_TYPE_CPU, properties);
- *
- * std::vector<cl::Device> devices = context.getInfo<CL_CONTEXT_DEVICES>();
- *
- * cl::Program::Sources source(1,
- * std::make_pair(helloStr,strlen(helloStr)));
- * cl::Program program_ = cl::Program(context, source);
- * program_.build(devices);
- *
- * cl::Kernel kernel(program_, "hello", &err);
- *
- * cl::Event event;
- * cl::CommandQueue queue(context, devices[0], 0, &err);
- * queue.enqueueNDRangeKernel(
- * kernel,
- * cl::NullRange,
- * cl::NDRange(4,4),
- * cl::NullRange,
- * NULL,
- * &event);
- *
- * event.wait();
- * }
- * catch (cl::Error err) {
- * std::cerr
- * << "ERROR: "
- * << err.what()
- * << "("
- * << err.err()
- * << ")"
- * << std::endl;
- * }
- *
- * return EXIT_SUCCESS;
- * }
- *
- * \endcode
- *
- */
-#ifndef CL_HPP_
-#define CL_HPP_
-
-#ifdef _WIN32
-
-#include <malloc.h>
-
-#if defined(USE_DX_INTEROP)
-#include <CL/cl_d3d10.h>
-#include <CL/cl_dx9_media_sharing.h>
-#endif
-#endif // _WIN32
-
-#if defined(_MSC_VER)
-#include <intrin.h>
-#endif // _MSC_VER
-
-//
-#if defined(USE_CL_DEVICE_FISSION)
-#include <CL/cl_ext.h>
-#endif
-
-#if defined(__APPLE__) || defined(__MACOSX)
-#include <OpenCL/opencl.h>
-#else
-#include <CL/opencl.h>
-#endif // !__APPLE__
-
-#if (_MSC_VER >= 1700) || (__cplusplus >= 201103L)
-#define CL_HPP_RVALUE_REFERENCES_SUPPORTED
-#define CL_HPP_CPP11_ATOMICS_SUPPORTED
-#include <atomic>
-#endif
-
-#if (__cplusplus >= 201103L)
-#define CL_HPP_NOEXCEPT noexcept
-#else
-#define CL_HPP_NOEXCEPT
-#endif
-
-
-// To avoid accidentally taking ownership of core OpenCL types
-// such as cl_kernel constructors are made explicit
-// under OpenCL 1.2
-#if defined(CL_VERSION_1_2) && !defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
-#define __CL_EXPLICIT_CONSTRUCTORS explicit
-#else // #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
-#define __CL_EXPLICIT_CONSTRUCTORS
-#endif // #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
-
-// Define deprecated prefixes and suffixes to ensure compilation
-// in case they are not pre-defined
-#if !defined(CL_EXT_PREFIX__VERSION_1_1_DEPRECATED)
-#define CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
-#endif // #if !defined(CL_EXT_PREFIX__VERSION_1_1_DEPRECATED)
-#if !defined(CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED)
-#define CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
-#endif // #if !defined(CL_EXT_PREFIX__VERSION_1_1_DEPRECATED)
-
-#if !defined(CL_CALLBACK)
-#define CL_CALLBACK
-#endif //CL_CALLBACK
-
-#include <utility>
-#include <limits>
-#include <iterator>
-
-#if defined(__CL_ENABLE_EXCEPTIONS)
-#include <exception>
-#endif // #if defined(__CL_ENABLE_EXCEPTIONS)
-
-#if !defined(__NO_STD_VECTOR)
-#include <vector>
-#endif
-
-#if !defined(__NO_STD_STRING)
-#include <string>
-#endif
-
-#if defined(__ANDROID__) || defined(linux) || defined(__APPLE__) || defined(__MACOSX)
-#include <alloca.h>
-#endif // linux
-
-#include <cstring>
-
-
-/*! \namespace cl
- *
- * \brief The OpenCL C++ bindings are defined within this namespace.
- *
- */
-namespace cl {
-
-class Memory;
-
-/**
- * Deprecated APIs for 1.2
- */
-#if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))
-#define __INIT_CL_EXT_FCN_PTR(name) \
- if(!pfn_##name) { \
- pfn_##name = (PFN_##name) \
- clGetExtensionFunctionAddress(#name); \
- if(!pfn_##name) { \
- } \
- }
-#endif // #if defined(CL_VERSION_1_1)
-
-#if defined(CL_VERSION_1_2)
-#define __INIT_CL_EXT_FCN_PTR_PLATFORM(platform, name) \
- if(!pfn_##name) { \
- pfn_##name = (PFN_##name) \
- clGetExtensionFunctionAddressForPlatform(platform, #name); \
- if(!pfn_##name) { \
- } \
- }
-#endif // #if defined(CL_VERSION_1_1)
-
-class Program;
-class Device;
-class Context;
-class CommandQueue;
-class Memory;
-class Buffer;
-
-#if defined(__CL_ENABLE_EXCEPTIONS)
-/*! \brief Exception class
- *
- * This may be thrown by API functions when __CL_ENABLE_EXCEPTIONS is defined.
- */
-class Error : public std::exception
-{
-private:
- cl_int err_;
- const char * errStr_;
-public:
- /*! \brief Create a new CL error exception for a given error code
- * and corresponding message.
- *
- * \param err error code value.
- *
- * \param errStr a descriptive string that must remain in scope until
- * handling of the exception has concluded. If set, it
- * will be returned by what().
- */
- Error(cl_int err, const char * errStr = NULL) : err_(err), errStr_(errStr)
- {}
-
- ~Error() throw() {}
-
- /*! \brief Get error string associated with exception
- *
- * \return A memory pointer to the error message string.
- */
- virtual const char * what() const throw ()
- {
- if (errStr_ == NULL) {
- return "empty";
- }
- else {
- return errStr_;
- }
- }
-
- /*! \brief Get error code associated with exception
- *
- * \return The error code.
- */
- cl_int err(void) const { return err_; }
-};
-
-#define __ERR_STR(x) #x
-#else
-#define __ERR_STR(x) NULL
-#endif // __CL_ENABLE_EXCEPTIONS
-
-
-namespace detail
-{
-#if defined(__CL_ENABLE_EXCEPTIONS)
-static inline cl_int errHandler (
- cl_int err,
- const char * errStr = NULL)
-{
- if (err != CL_SUCCESS) {
- throw Error(err, errStr);
- }
- return err;
-}
-#else
-static inline cl_int errHandler (cl_int err, const char * errStr = NULL)
-{
- (void) errStr; // suppress unused variable warning
- return err;
-}
-#endif // __CL_ENABLE_EXCEPTIONS
-}
-
-
-
-//! \cond DOXYGEN_DETAIL
-#if !defined(__CL_USER_OVERRIDE_ERROR_STRINGS)
-#define __GET_DEVICE_INFO_ERR __ERR_STR(clGetDeviceInfo)
-#define __GET_PLATFORM_INFO_ERR __ERR_STR(clGetPlatformInfo)
-#define __GET_DEVICE_IDS_ERR __ERR_STR(clGetDeviceIDs)
-#define __GET_PLATFORM_IDS_ERR __ERR_STR(clGetPlatformIDs)
-#define __GET_CONTEXT_INFO_ERR __ERR_STR(clGetContextInfo)
-#define __GET_EVENT_INFO_ERR __ERR_STR(clGetEventInfo)
-#define __GET_EVENT_PROFILE_INFO_ERR __ERR_STR(clGetEventProfileInfo)
-#define __GET_MEM_OBJECT_INFO_ERR __ERR_STR(clGetMemObjectInfo)
-#define __GET_IMAGE_INFO_ERR __ERR_STR(clGetImageInfo)
-#define __GET_SAMPLER_INFO_ERR __ERR_STR(clGetSamplerInfo)
-#define __GET_KERNEL_INFO_ERR __ERR_STR(clGetKernelInfo)
-#if defined(CL_VERSION_1_2)
-#define __GET_KERNEL_ARG_INFO_ERR __ERR_STR(clGetKernelArgInfo)
-#endif // #if defined(CL_VERSION_1_2)
-#define __GET_KERNEL_WORK_GROUP_INFO_ERR __ERR_STR(clGetKernelWorkGroupInfo)
-#define __GET_PROGRAM_INFO_ERR __ERR_STR(clGetProgramInfo)
-#define __GET_PROGRAM_BUILD_INFO_ERR __ERR_STR(clGetProgramBuildInfo)
-#define __GET_COMMAND_QUEUE_INFO_ERR __ERR_STR(clGetCommandQueueInfo)
-
-#define __CREATE_CONTEXT_ERR __ERR_STR(clCreateContext)
-#define __CREATE_CONTEXT_FROM_TYPE_ERR __ERR_STR(clCreateContextFromType)
-#define __GET_SUPPORTED_IMAGE_FORMATS_ERR __ERR_STR(clGetSupportedImageFormats)
-
-#define __CREATE_BUFFER_ERR __ERR_STR(clCreateBuffer)
-#define __COPY_ERR __ERR_STR(cl::copy)
-#define __CREATE_SUBBUFFER_ERR __ERR_STR(clCreateSubBuffer)
-#define __CREATE_GL_BUFFER_ERR __ERR_STR(clCreateFromGLBuffer)
-#define __CREATE_GL_RENDER_BUFFER_ERR __ERR_STR(clCreateFromGLBuffer)
-#define __GET_GL_OBJECT_INFO_ERR __ERR_STR(clGetGLObjectInfo)
-#if defined(CL_VERSION_1_2)
-#define __CREATE_IMAGE_ERR __ERR_STR(clCreateImage)
-#define __CREATE_GL_TEXTURE_ERR __ERR_STR(clCreateFromGLTexture)
-#define __IMAGE_DIMENSION_ERR __ERR_STR(Incorrect image dimensions)
-#endif // #if defined(CL_VERSION_1_2)
-#define __CREATE_SAMPLER_ERR __ERR_STR(clCreateSampler)
-#define __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR __ERR_STR(clSetMemObjectDestructorCallback)
-
-#define __CREATE_USER_EVENT_ERR __ERR_STR(clCreateUserEvent)
-#define __SET_USER_EVENT_STATUS_ERR __ERR_STR(clSetUserEventStatus)
-#define __SET_EVENT_CALLBACK_ERR __ERR_STR(clSetEventCallback)
-#define __WAIT_FOR_EVENTS_ERR __ERR_STR(clWaitForEvents)
-
-#define __CREATE_KERNEL_ERR __ERR_STR(clCreateKernel)
-#define __SET_KERNEL_ARGS_ERR __ERR_STR(clSetKernelArg)
-#define __CREATE_PROGRAM_WITH_SOURCE_ERR __ERR_STR(clCreateProgramWithSource)
-#define __CREATE_PROGRAM_WITH_BINARY_ERR __ERR_STR(clCreateProgramWithBinary)
-#if defined(CL_VERSION_1_2)
-#define __CREATE_PROGRAM_WITH_BUILT_IN_KERNELS_ERR __ERR_STR(clCreateProgramWithBuiltInKernels)
-#endif // #if defined(CL_VERSION_1_2)
-#define __BUILD_PROGRAM_ERR __ERR_STR(clBuildProgram)
-#if defined(CL_VERSION_1_2)
-#define __COMPILE_PROGRAM_ERR __ERR_STR(clCompileProgram)
-#define __LINK_PROGRAM_ERR __ERR_STR(clLinkProgram)
-#endif // #if defined(CL_VERSION_1_2)
-#define __CREATE_KERNELS_IN_PROGRAM_ERR __ERR_STR(clCreateKernelsInProgram)
-
-#define __CREATE_COMMAND_QUEUE_ERR __ERR_STR(clCreateCommandQueue)
-#define __SET_COMMAND_QUEUE_PROPERTY_ERR __ERR_STR(clSetCommandQueueProperty)
-#define __ENQUEUE_READ_BUFFER_ERR __ERR_STR(clEnqueueReadBuffer)
-#define __ENQUEUE_READ_BUFFER_RECT_ERR __ERR_STR(clEnqueueReadBufferRect)
-#define __ENQUEUE_WRITE_BUFFER_ERR __ERR_STR(clEnqueueWriteBuffer)
-#define __ENQUEUE_WRITE_BUFFER_RECT_ERR __ERR_STR(clEnqueueWriteBufferRect)
-#define __ENQEUE_COPY_BUFFER_ERR __ERR_STR(clEnqueueCopyBuffer)
-#define __ENQEUE_COPY_BUFFER_RECT_ERR __ERR_STR(clEnqueueCopyBufferRect)
-#define __ENQUEUE_FILL_BUFFER_ERR __ERR_STR(clEnqueueFillBuffer)
-#define __ENQUEUE_READ_IMAGE_ERR __ERR_STR(clEnqueueReadImage)
-#define __ENQUEUE_WRITE_IMAGE_ERR __ERR_STR(clEnqueueWriteImage)
-#define __ENQUEUE_COPY_IMAGE_ERR __ERR_STR(clEnqueueCopyImage)
-#define __ENQUEUE_FILL_IMAGE_ERR __ERR_STR(clEnqueueFillImage)
-#define __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR __ERR_STR(clEnqueueCopyImageToBuffer)
-#define __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR __ERR_STR(clEnqueueCopyBufferToImage)
-#define __ENQUEUE_MAP_BUFFER_ERR __ERR_STR(clEnqueueMapBuffer)
-#define __ENQUEUE_MAP_IMAGE_ERR __ERR_STR(clEnqueueMapImage)
-#define __ENQUEUE_UNMAP_MEM_OBJECT_ERR __ERR_STR(clEnqueueUnMapMemObject)
-#define __ENQUEUE_NDRANGE_KERNEL_ERR __ERR_STR(clEnqueueNDRangeKernel)
-#define __ENQUEUE_TASK_ERR __ERR_STR(clEnqueueTask)
-#define __ENQUEUE_NATIVE_KERNEL __ERR_STR(clEnqueueNativeKernel)
-#if defined(CL_VERSION_1_2)
-#define __ENQUEUE_MIGRATE_MEM_OBJECTS_ERR __ERR_STR(clEnqueueMigrateMemObjects)
-#endif // #if defined(CL_VERSION_1_2)
-
-#define __ENQUEUE_ACQUIRE_GL_ERR __ERR_STR(clEnqueueAcquireGLObjects)
-#define __ENQUEUE_RELEASE_GL_ERR __ERR_STR(clEnqueueReleaseGLObjects)
-
-
-#define __RETAIN_ERR __ERR_STR(Retain Object)
-#define __RELEASE_ERR __ERR_STR(Release Object)
-#define __FLUSH_ERR __ERR_STR(clFlush)
-#define __FINISH_ERR __ERR_STR(clFinish)
-#define __VECTOR_CAPACITY_ERR __ERR_STR(Vector capacity error)
-
-/**
- * CL 1.2 version that uses device fission.
- */
-#if defined(CL_VERSION_1_2)
-#define __CREATE_SUB_DEVICES __ERR_STR(clCreateSubDevices)
-#else
-#define __CREATE_SUB_DEVICES __ERR_STR(clCreateSubDevicesEXT)
-#endif // #if defined(CL_VERSION_1_2)
-
-/**
- * Deprecated APIs for 1.2
- */
-#if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))
-#define __ENQUEUE_MARKER_ERR __ERR_STR(clEnqueueMarker)
-#define __ENQUEUE_WAIT_FOR_EVENTS_ERR __ERR_STR(clEnqueueWaitForEvents)
-#define __ENQUEUE_BARRIER_ERR __ERR_STR(clEnqueueBarrier)
-#define __UNLOAD_COMPILER_ERR __ERR_STR(clUnloadCompiler)
-#define __CREATE_GL_TEXTURE_2D_ERR __ERR_STR(clCreateFromGLTexture2D)
-#define __CREATE_GL_TEXTURE_3D_ERR __ERR_STR(clCreateFromGLTexture3D)
-#define __CREATE_IMAGE2D_ERR __ERR_STR(clCreateImage2D)
-#define __CREATE_IMAGE3D_ERR __ERR_STR(clCreateImage3D)
-#endif // #if defined(CL_VERSION_1_1)
-
-#endif // __CL_USER_OVERRIDE_ERROR_STRINGS
-//! \endcond
-
-/**
- * CL 1.2 marker and barrier commands
- */
-#if defined(CL_VERSION_1_2)
-#define __ENQUEUE_MARKER_WAIT_LIST_ERR __ERR_STR(clEnqueueMarkerWithWaitList)
-#define __ENQUEUE_BARRIER_WAIT_LIST_ERR __ERR_STR(clEnqueueBarrierWithWaitList)
-#endif // #if defined(CL_VERSION_1_2)
-
-#if !defined(__USE_DEV_STRING) && !defined(__NO_STD_STRING)
-typedef std::string STRING_CLASS;
-#elif !defined(__USE_DEV_STRING)
-
-/*! \class string
- * \brief Simple string class, that provides a limited subset of std::string
- * functionality but avoids many of the issues that come with that class.
-
- * \note Deprecated. Please use std::string as default or
- * re-define the string class to match the std::string
- * interface by defining STRING_CLASS
- */
-class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED string CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
-{
-private:
- ::size_t size_;
- char * str_;
-public:
- //! \brief Constructs an empty string, allocating no memory.
- string(void) : size_(0), str_(NULL)
- {
- }
-
- /*! \brief Constructs a string populated from an arbitrary value of
- * specified size.
- *
- * An extra '\0' is added, in case none was contained in str.
- *
- * \param str the initial value of the string instance. Note that '\0'
- * characters receive no special treatment. If NULL,
- * the string is left empty, with a size of 0.
- *
- * \param size the number of characters to copy from str.
- */
- string(const char * str, ::size_t size) :
- size_(size),
- str_(NULL)
- {
- if( size > 0 ) {
- str_ = new char[size_+1];
- if (str_ != NULL) {
- memcpy(str_, str, size_ * sizeof(char));
- str_[size_] = '\0';
- }
- else {
- size_ = 0;
- }
- }
- }
-
- /*! \brief Constructs a string populated from a null-terminated value.
- *
- * \param str the null-terminated initial value of the string instance.
- * If NULL, the string is left empty, with a size of 0.
- */
- string(const char * str) :
- size_(0),
- str_(NULL)
- {
- if( str ) {
- size_= ::strlen(str);
- }
- if( size_ > 0 ) {
- str_ = new char[size_ + 1];
- if (str_ != NULL) {
- memcpy(str_, str, (size_ + 1) * sizeof(char));
- }
- }
- }
-
- void resize( ::size_t n )
- {
- if( size_ == n ) {
- return;
- }
- if (n == 0) {
- if( str_ ) {
- delete [] str_;
- }
- str_ = NULL;
- size_ = 0;
- }
- else {
- char *newString = new char[n + 1];
- ::size_t copySize = n;
- if( size_ < n ) {
- copySize = size_;
- }
- size_ = n;
-
- if(str_) {
- memcpy(newString, str_, (copySize + 1) * sizeof(char));
- }
- if( copySize < size_ ) {
- memset(newString + copySize, 0, size_ - copySize);
- }
- newString[size_] = '\0';
-
- delete [] str_;
- str_ = newString;
- }
- }
-
- const char& operator[] ( ::size_t pos ) const
- {
- return str_[pos];
- }
-
- char& operator[] ( ::size_t pos )
- {
- return str_[pos];
- }
-
- /*! \brief Copies the value of another string to this one.
- *
- * \param rhs the string to copy.
- *
- * \returns a reference to the modified instance.
- */
- string& operator=(const string& rhs)
- {
- if (this == &rhs) {
- return *this;
- }
-
- if( str_ != NULL ) {
- delete [] str_;
- str_ = NULL;
- size_ = 0;
- }
-
- if (rhs.size_ == 0 || rhs.str_ == NULL) {
- str_ = NULL;
- size_ = 0;
- }
- else {
- str_ = new char[rhs.size_ + 1];
- size_ = rhs.size_;
-
- if (str_ != NULL) {
- memcpy(str_, rhs.str_, (size_ + 1) * sizeof(char));
- }
- else {
- size_ = 0;
- }
- }
-
- return *this;
- }
-
- /*! \brief Constructs a string by copying the value of another instance.
- *
- * \param rhs the string to copy.
- */
- string(const string& rhs) :
- size_(0),
- str_(NULL)
- {
- *this = rhs;
- }
-
- //! \brief Destructor - frees memory used to hold the current value.
- ~string()
- {
- delete[] str_;
- str_ = NULL;
- }
-
- //! \brief Queries the length of the string, excluding any added '\0's.
- ::size_t size(void) const { return size_; }
-
- //! \brief Queries the length of the string, excluding any added '\0's.
- ::size_t length(void) const { return size(); }
-
- /*! \brief Returns a pointer to the private copy held by this instance,
- * or "" if empty/unset.
- */
- const char * c_str(void) const { return (str_) ? str_ : "";}
-};
-typedef cl::string STRING_CLASS;
-#endif // #elif !defined(__USE_DEV_STRING)
-
-#if !defined(__USE_DEV_VECTOR) && !defined(__NO_STD_VECTOR)
-#define VECTOR_CLASS std::vector
-#elif !defined(__USE_DEV_VECTOR)
-#define VECTOR_CLASS cl::vector
-
-#if !defined(__MAX_DEFAULT_VECTOR_SIZE)
-#define __MAX_DEFAULT_VECTOR_SIZE 10
-#endif
-
-/*! \class vector
- * \brief Fixed sized vector implementation that mirroring
- *
- * \note Deprecated. Please use std::vector as default or
- * re-define the vector class to match the std::vector
- * interface by defining VECTOR_CLASS
-
- * \note Not recommended for use with custom objects as
- * current implementation will construct N elements
- *
- * std::vector functionality.
- * \brief Fixed sized vector compatible with std::vector.
- *
- * \note
- * This differs from std::vector<> not just in memory allocation,
- * but also in terms of when members are constructed, destroyed,
- * and assigned instead of being copy constructed.
- *
- * \param T type of element contained in the vector.
- *
- * \param N maximum size of the vector.
- */
-template <typename T, unsigned int N = __MAX_DEFAULT_VECTOR_SIZE>
-class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED vector
-{
-private:
- T data_[N];
- unsigned int size_;
-
-public:
- //! \brief Constructs an empty vector with no memory allocated.
- vector() :
- size_(static_cast<unsigned int>(0))
- {}
-
- //! \brief Deallocates the vector's memory and destroys all of its elements.
- ~vector()
- {
- clear();
- }
-
- //! \brief Returns the number of elements currently contained.
- unsigned int size(void) const
- {
- return size_;
- }
-
- /*! \brief Empties the vector of all elements.
- * \note
- * This does not deallocate memory but will invoke destructors
- * on contained elements.
- */
- void clear()
- {
- while(!empty()) {
- pop_back();
- }
- }
-
- /*! \brief Appends an element after the last valid element.
- * Calling this on a vector that has reached capacity will throw an
- * exception if exceptions are enabled.
- */
- void push_back (const T& x)
- {
- if (size() < N) {
- new (&data_[size_]) T(x);
- size_++;
- } else {
- detail::errHandler(CL_MEM_OBJECT_ALLOCATION_FAILURE, __VECTOR_CAPACITY_ERR);
- }
- }
-
- /*! \brief Removes the last valid element from the vector.
- * Calling this on an empty vector will throw an exception
- * if exceptions are enabled.
- */
- void pop_back(void)
- {
- if (size_ != 0) {
- --size_;
- data_[size_].~T();
- } else {
- detail::errHandler(CL_MEM_OBJECT_ALLOCATION_FAILURE, __VECTOR_CAPACITY_ERR);
- }
- }
-
- /*! \brief Constructs with a value copied from another.
- *
- * \param vec the vector to copy.
- */
- vector(const vector<T, N>& vec) :
- size_(vec.size_)
- {
- if (size_ != 0) {
- assign(vec.begin(), vec.end());
- }
- }
-
- /*! \brief Constructs with a specified number of initial elements.
- *
- * \param size number of initial elements.
- *
- * \param val value of initial elements.
- */
- vector(unsigned int size, const T& val = T()) :
- size_(0)
- {
- for (unsigned int i = 0; i < size; i++) {
- push_back(val);
- }
- }
-
- /*! \brief Overwrites the current content with that copied from another
- * instance.
- *
- * \param rhs vector to copy.
- *
- * \returns a reference to this.
- */
- vector<T, N>& operator=(const vector<T, N>& rhs)
- {
- if (this == &rhs) {
- return *this;
- }
-
- if (rhs.size_ != 0) {
- assign(rhs.begin(), rhs.end());
- } else {
- clear();
- }
-
- return *this;
- }
-
- /*! \brief Tests equality against another instance.
- *
- * \param vec the vector against which to compare.
- */
- bool operator==(vector<T,N> &vec)
- {
- if (size() != vec.size()) {
- return false;
- }
-
- for( unsigned int i = 0; i < size(); ++i ) {
- if( operator[](i) != vec[i] ) {
- return false;
- }
- }
- return true;
- }
-
- //! \brief Conversion operator to T*.
- operator T* () { return data_; }
-
- //! \brief Conversion operator to const T*.
- operator const T* () const { return data_; }
-
- //! \brief Tests whether this instance has any elements.
- bool empty (void) const
- {
- return size_==0;
- }
-
- //! \brief Returns the maximum number of elements this instance can hold.
- unsigned int max_size (void) const
- {
- return N;
- }
-
- //! \brief Returns the maximum number of elements this instance can hold.
- unsigned int capacity () const
- {
- return N;
- }
-
- //! \brief Resizes the vector to the given size
- void resize(unsigned int newSize, T fill = T())
- {
- if (newSize > N)
- {
- detail::errHandler(CL_MEM_OBJECT_ALLOCATION_FAILURE, __VECTOR_CAPACITY_ERR);
- }
- else
- {
- while (size_ < newSize)
- {
- new (&data_[size_]) T(fill);
- size_++;
- }
- while (size_ > newSize)
- {
- --size_;
- data_[size_].~T();
- }
- }
- }
-
- /*! \brief Returns a reference to a given element.
- *
- * \param index which element to access. *
- * \note
- * The caller is responsible for ensuring index is >= 0 and < size().
- */
- T& operator[](int index)
- {
- return data_[index];
- }
-
- /*! \brief Returns a const reference to a given element.
- *
- * \param index which element to access.
- *
- * \note
- * The caller is responsible for ensuring index is >= 0 and < size().
- */
- const T& operator[](int index) const
- {
- return data_[index];
- }
-
- /*! \brief Assigns elements of the vector based on a source iterator range.
- *
- * \param start Beginning iterator of source range
- * \param end Enditerator of source range
- *
- * \note
- * Will throw an exception if exceptions are enabled and size exceeded.
- */
- template<class I>
- void assign(I start, I end)
- {
- clear();
- while(start != end) {
- push_back(*start);
- start++;
- }
- }
-
- /*! \class iterator
- * \brief Const iterator class for vectors
- */
- class iterator
- {
- private:
- const vector<T,N> *vec_;
- int index_;
-
- /**
- * Internal iterator constructor to capture reference
- * to the vector it iterates over rather than taking
- * the vector by copy.
- */
- iterator (const vector<T,N> &vec, int index) :
- vec_(&vec)
- {
- if( !vec.empty() ) {
- index_ = index;
- } else {
- index_ = -1;
- }
- }
-
- public:
- iterator(void) :
- index_(-1),
- vec_(NULL)
- {
- }
-
- iterator(const iterator& rhs) :
- vec_(rhs.vec_),
- index_(rhs.index_)
- {
- }
-
- ~iterator(void) {}
-
- static iterator begin(const cl::vector<T,N> &vec)
- {
- iterator i(vec, 0);
-
- return i;
- }
-
- static iterator end(const cl::vector<T,N> &vec)
- {
- iterator i(vec, vec.size());
-
- return i;
- }
-
- bool operator==(iterator i)
- {
- return ((vec_ == i.vec_) &&
- (index_ == i.index_));
- }
-
- bool operator!=(iterator i)
- {
- return (!(*this==i));
- }
-
- iterator& operator++()
- {
- ++index_;
- return *this;
- }
-
- iterator operator++(int)
- {
- iterator retVal(*this);
- ++index_;
- return retVal;
- }
-
- iterator& operator--()
- {
- --index_;
- return *this;
- }
-
- iterator operator--(int)
- {
- iterator retVal(*this);
- --index_;
- return retVal;
- }
-
- const T& operator *() const
- {
- return (*vec_)[index_];
- }
- };
-
- iterator begin(void)
- {
- return iterator::begin(*this);
- }
-
- iterator begin(void) const
- {
- return iterator::begin(*this);
- }
-
- iterator end(void)
- {
- return iterator::end(*this);
- }
-
- iterator end(void) const
- {
- return iterator::end(*this);
- }
-
- T& front(void)
- {
- return data_[0];
- }
-
- T& back(void)
- {
- return data_[size_];
- }
-
- const T& front(void) const
- {
- return data_[0];
- }
-
- const T& back(void) const
- {
- return data_[size_-1];
- }
-} CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;
-#endif // #if !defined(__USE_DEV_VECTOR) && !defined(__NO_STD_VECTOR)
-
-
-
-
-
-namespace detail {
-#define __DEFAULT_NOT_INITIALIZED 1
-#define __DEFAULT_BEING_INITIALIZED 2
-#define __DEFAULT_INITIALIZED 4
-
- /*
- * Compare and exchange primitives are needed for handling of defaults
- */
-
-#ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
- inline int compare_exchange(std::atomic<int> * dest, int exchange, int comparand)
-#else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
- inline int compare_exchange(volatile int * dest, int exchange, int comparand)
-#endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
- {
-#ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
- std::atomic_compare_exchange_strong(dest, &comparand, exchange);
- return comparand;
-#elif _MSC_VER
- return (int)(_InterlockedCompareExchange(
- (volatile long*)dest,
- (long)exchange,
- (long)comparand));
-#else // !_MSC_VER && !CL_HPP_CPP11_ATOMICS_SUPPORTED
- return (__sync_val_compare_and_swap(
- dest,
- comparand,
- exchange));
-#endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
- }
-
- inline void fence() {
-#ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
- std::atomic_thread_fence(std::memory_order_seq_cst);
-#elif _MSC_VER // !CL_HPP_CPP11_ATOMICS_SUPPORTED
- _ReadWriteBarrier();
-#else // !_MSC_VER && !CL_HPP_CPP11_ATOMICS_SUPPORTED
- __sync_synchronize();
-#endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
- }
-} // namespace detail
-
-
-/*! \brief class used to interface between C++ and
- * OpenCL C calls that require arrays of size_t values, whose
- * size is known statically.
- */
-template <int N>
-class size_t
-{
-private:
- ::size_t data_[N];
-
-public:
- //! \brief Initialize size_t to all 0s
- size_t()
- {
- for( int i = 0; i < N; ++i ) {
- data_[i] = 0;
- }
- }
-
- ::size_t& operator[](int index)
- {
- return data_[index];
- }
-
- const ::size_t& operator[](int index) const
- {
- return data_[index];
- }
-
- //! \brief Conversion operator to T*.
- operator ::size_t* () { return data_; }
-
- //! \brief Conversion operator to const T*.
- operator const ::size_t* () const { return data_; }
-};
-
-namespace detail {
-
-// Generic getInfoHelper. The final parameter is used to guide overload
-// resolution: the actual parameter passed is an int, which makes this
-// a worse conversion sequence than a specialization that declares the
-// parameter as an int.
-template<typename Functor, typename T>
-inline cl_int getInfoHelper(Functor f, cl_uint name, T* param, long)
-{
- return f(name, sizeof(T), param, NULL);
-}
-
-// Specialized getInfoHelper for VECTOR_CLASS params
-template <typename Func, typename T>
-inline cl_int getInfoHelper(Func f, cl_uint name, VECTOR_CLASS<T>* param, long)
-{
- ::size_t required;
- cl_int err = f(name, 0, NULL, &required);
- if (err != CL_SUCCESS) {
- return err;
- }
-
- T* value = (T*) alloca(required);
- err = f(name, required, value, NULL);
- if (err != CL_SUCCESS) {
- return err;
- }
-
- param->assign(&value[0], &value[required/sizeof(T)]);
- return CL_SUCCESS;
-}
-
-/* Specialization for reference-counted types. This depends on the
- * existence of Wrapper<T>::cl_type, and none of the other types having the
- * cl_type member. Note that simplify specifying the parameter as Wrapper<T>
- * does not work, because when using a derived type (e.g. Context) the generic
- * template will provide a better match.
- */
-template <typename Func, typename T>
-inline cl_int getInfoHelper(Func f, cl_uint name, VECTOR_CLASS<T>* param, int, typename T::cl_type = 0)
-{
- ::size_t required;
- cl_int err = f(name, 0, NULL, &required);
- if (err != CL_SUCCESS) {
- return err;
- }
-
- typename T::cl_type * value = (typename T::cl_type *) alloca(required);
- err = f(name, required, value, NULL);
- if (err != CL_SUCCESS) {
- return err;
- }
-
- ::size_t elements = required / sizeof(typename T::cl_type);
- param->assign(&value[0], &value[elements]);
- for (::size_t i = 0; i < elements; i++)
- {
- if (value[i] != NULL)
- {
- err = (*param)[i].retain();
- if (err != CL_SUCCESS) {
- return err;
- }
- }
- }
- return CL_SUCCESS;
-}
-
-// Specialized for getInfo<CL_PROGRAM_BINARIES>
-template <typename Func>
-inline cl_int getInfoHelper(Func f, cl_uint name, VECTOR_CLASS<char *>* param, int)
-{
- cl_int err = f(name, param->size() * sizeof(char *), &(*param)[0], NULL);
-
- if (err != CL_SUCCESS) {
- return err;
- }
-
- return CL_SUCCESS;
-}
-
-// Specialized GetInfoHelper for STRING_CLASS params
-template <typename Func>
-inline cl_int getInfoHelper(Func f, cl_uint name, STRING_CLASS* param, long)
-{
- ::size_t required;
- cl_int err = f(name, 0, NULL, &required);
- if (err != CL_SUCCESS) {
- return err;
- }
-
- // std::string has a constant data member
- // a char vector does not
- VECTOR_CLASS<char> value(required);
- err = f(name, required, value.data(), NULL);
- if (err != CL_SUCCESS) {
- return err;
- }
- if (param) {
- param->assign(value.begin(), value.end());
- }
- return CL_SUCCESS;
-}
-
-// Specialized GetInfoHelper for cl::size_t params
-template <typename Func, ::size_t N>
-inline cl_int getInfoHelper(Func f, cl_uint name, size_t<N>* param, long)
-{
- ::size_t required;
- cl_int err = f(name, 0, NULL, &required);
- if (err != CL_SUCCESS) {
- return err;
- }
-
- ::size_t* value = (::size_t*) alloca(required);
- err = f(name, required, value, NULL);
- if (err != CL_SUCCESS) {
- return err;
- }
-
- for(int i = 0; i < N; ++i) {
- (*param)[i] = value[i];
- }
-
- return CL_SUCCESS;
-}
-
-template<typename T> struct ReferenceHandler;
-
-/* Specialization for reference-counted types. This depends on the
- * existence of Wrapper<T>::cl_type, and none of the other types having the
- * cl_type member. Note that simplify specifying the parameter as Wrapper<T>
- * does not work, because when using a derived type (e.g. Context) the generic
- * template will provide a better match.
- */
-template<typename Func, typename T>
-inline cl_int getInfoHelper(Func f, cl_uint name, T* param, int, typename T::cl_type = 0)
-{
- typename T::cl_type value;
- cl_int err = f(name, sizeof(value), &value, NULL);
- if (err != CL_SUCCESS) {
- return err;
- }
- *param = value;
- if (value != NULL)
- {
- err = param->retain();
- if (err != CL_SUCCESS) {
- return err;
- }
- }
- return CL_SUCCESS;
-}
-
-#define __PARAM_NAME_INFO_1_0(F) \
- F(cl_platform_info, CL_PLATFORM_PROFILE, STRING_CLASS) \
- F(cl_platform_info, CL_PLATFORM_VERSION, STRING_CLASS) \
- F(cl_platform_info, CL_PLATFORM_NAME, STRING_CLASS) \
- F(cl_platform_info, CL_PLATFORM_VENDOR, STRING_CLASS) \
- F(cl_platform_info, CL_PLATFORM_EXTENSIONS, STRING_CLASS) \
- \
- F(cl_device_info, CL_DEVICE_TYPE, cl_device_type) \
- F(cl_device_info, CL_DEVICE_VENDOR_ID, cl_uint) \
- F(cl_device_info, CL_DEVICE_MAX_COMPUTE_UNITS, cl_uint) \
- F(cl_device_info, CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS, cl_uint) \
- F(cl_device_info, CL_DEVICE_MAX_WORK_GROUP_SIZE, ::size_t) \
- F(cl_device_info, CL_DEVICE_MAX_WORK_ITEM_SIZES, VECTOR_CLASS< ::size_t>) \
- F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR, cl_uint) \
- F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT, cl_uint) \
- F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT, cl_uint) \
- F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG, cl_uint) \
- F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT, cl_uint) \
- F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE, cl_uint) \
- F(cl_device_info, CL_DEVICE_MAX_CLOCK_FREQUENCY, cl_uint) \
- F(cl_device_info, CL_DEVICE_ADDRESS_BITS, cl_uint) \
- F(cl_device_info, CL_DEVICE_MAX_READ_IMAGE_ARGS, cl_uint) \
- F(cl_device_info, CL_DEVICE_MAX_WRITE_IMAGE_ARGS, cl_uint) \
- F(cl_device_info, CL_DEVICE_MAX_MEM_ALLOC_SIZE, cl_ulong) \
- F(cl_device_info, CL_DEVICE_IMAGE2D_MAX_WIDTH, ::size_t) \
- F(cl_device_info, CL_DEVICE_IMAGE2D_MAX_HEIGHT, ::size_t) \
- F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_WIDTH, ::size_t) \
- F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_HEIGHT, ::size_t) \
- F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_DEPTH, ::size_t) \
- F(cl_device_info, CL_DEVICE_IMAGE_SUPPORT, cl_bool) \
- F(cl_device_info, CL_DEVICE_MAX_PARAMETER_SIZE, ::size_t) \
- F(cl_device_info, CL_DEVICE_MAX_SAMPLERS, cl_uint) \
- F(cl_device_info, CL_DEVICE_MEM_BASE_ADDR_ALIGN, cl_uint) \
- F(cl_device_info, CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE, cl_uint) \
- F(cl_device_info, CL_DEVICE_SINGLE_FP_CONFIG, cl_device_fp_config) \
- F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHE_TYPE, cl_device_mem_cache_type) \
- F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE, cl_uint)\
- F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHE_SIZE, cl_ulong) \
- F(cl_device_info, CL_DEVICE_GLOBAL_MEM_SIZE, cl_ulong) \
- F(cl_device_info, CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE, cl_ulong) \
- F(cl_device_info, CL_DEVICE_MAX_CONSTANT_ARGS, cl_uint) \
- F(cl_device_info, CL_DEVICE_LOCAL_MEM_TYPE, cl_device_local_mem_type) \
- F(cl_device_info, CL_DEVICE_LOCAL_MEM_SIZE, cl_ulong) \
- F(cl_device_info, CL_DEVICE_ERROR_CORRECTION_SUPPORT, cl_bool) \
- F(cl_device_info, CL_DEVICE_PROFILING_TIMER_RESOLUTION, ::size_t) \
- F(cl_device_info, CL_DEVICE_ENDIAN_LITTLE, cl_bool) \
- F(cl_device_info, CL_DEVICE_AVAILABLE, cl_bool) \
- F(cl_device_info, CL_DEVICE_COMPILER_AVAILABLE, cl_bool) \
- F(cl_device_info, CL_DEVICE_EXECUTION_CAPABILITIES, cl_device_exec_capabilities) \
- F(cl_device_info, CL_DEVICE_QUEUE_PROPERTIES, cl_command_queue_properties) \
- F(cl_device_info, CL_DEVICE_PLATFORM, cl_platform_id) \
- F(cl_device_info, CL_DEVICE_NAME, STRING_CLASS) \
- F(cl_device_info, CL_DEVICE_VENDOR, STRING_CLASS) \
- F(cl_device_info, CL_DRIVER_VERSION, STRING_CLASS) \
- F(cl_device_info, CL_DEVICE_PROFILE, STRING_CLASS) \
- F(cl_device_info, CL_DEVICE_VERSION, STRING_CLASS) \
- F(cl_device_info, CL_DEVICE_EXTENSIONS, STRING_CLASS) \
- \
- F(cl_context_info, CL_CONTEXT_REFERENCE_COUNT, cl_uint) \
- F(cl_context_info, CL_CONTEXT_DEVICES, VECTOR_CLASS<Device>) \
- F(cl_context_info, CL_CONTEXT_PROPERTIES, VECTOR_CLASS<cl_context_properties>) \
- \
- F(cl_event_info, CL_EVENT_COMMAND_QUEUE, cl::CommandQueue) \
- F(cl_event_info, CL_EVENT_COMMAND_TYPE, cl_command_type) \
- F(cl_event_info, CL_EVENT_REFERENCE_COUNT, cl_uint) \
- F(cl_event_info, CL_EVENT_COMMAND_EXECUTION_STATUS, cl_int) \
- \
- F(cl_profiling_info, CL_PROFILING_COMMAND_QUEUED, cl_ulong) \
- F(cl_profiling_info, CL_PROFILING_COMMAND_SUBMIT, cl_ulong) \
- F(cl_profiling_info, CL_PROFILING_COMMAND_START, cl_ulong) \
- F(cl_profiling_info, CL_PROFILING_COMMAND_END, cl_ulong) \
- \
- F(cl_mem_info, CL_MEM_TYPE, cl_mem_object_type) \
- F(cl_mem_info, CL_MEM_FLAGS, cl_mem_flags) \
- F(cl_mem_info, CL_MEM_SIZE, ::size_t) \
- F(cl_mem_info, CL_MEM_HOST_PTR, void*) \
- F(cl_mem_info, CL_MEM_MAP_COUNT, cl_uint) \
- F(cl_mem_info, CL_MEM_REFERENCE_COUNT, cl_uint) \
- F(cl_mem_info, CL_MEM_CONTEXT, cl::Context) \
- \
- F(cl_image_info, CL_IMAGE_FORMAT, cl_image_format) \
- F(cl_image_info, CL_IMAGE_ELEMENT_SIZE, ::size_t) \
- F(cl_image_info, CL_IMAGE_ROW_PITCH, ::size_t) \
- F(cl_image_info, CL_IMAGE_SLICE_PITCH, ::size_t) \
- F(cl_image_info, CL_IMAGE_WIDTH, ::size_t) \
- F(cl_image_info, CL_IMAGE_HEIGHT, ::size_t) \
- F(cl_image_info, CL_IMAGE_DEPTH, ::size_t) \
- \
- F(cl_sampler_info, CL_SAMPLER_REFERENCE_COUNT, cl_uint) \
- F(cl_sampler_info, CL_SAMPLER_CONTEXT, cl::Context) \
- F(cl_sampler_info, CL_SAMPLER_NORMALIZED_COORDS, cl_addressing_mode) \
- F(cl_sampler_info, CL_SAMPLER_ADDRESSING_MODE, cl_filter_mode) \
- F(cl_sampler_info, CL_SAMPLER_FILTER_MODE, cl_bool) \
- \
- F(cl_program_info, CL_PROGRAM_REFERENCE_COUNT, cl_uint) \
- F(cl_program_info, CL_PROGRAM_CONTEXT, cl::Context) \
- F(cl_program_info, CL_PROGRAM_NUM_DEVICES, cl_uint) \
- F(cl_program_info, CL_PROGRAM_DEVICES, VECTOR_CLASS<Device>) \
- F(cl_program_info, CL_PROGRAM_SOURCE, STRING_CLASS) \
- F(cl_program_info, CL_PROGRAM_BINARY_SIZES, VECTOR_CLASS< ::size_t>) \
- F(cl_program_info, CL_PROGRAM_BINARIES, VECTOR_CLASS<char *>) \
- \
- F(cl_program_build_info, CL_PROGRAM_BUILD_STATUS, cl_build_status) \
- F(cl_program_build_info, CL_PROGRAM_BUILD_OPTIONS, STRING_CLASS) \
- F(cl_program_build_info, CL_PROGRAM_BUILD_LOG, STRING_CLASS) \
- \
- F(cl_kernel_info, CL_KERNEL_FUNCTION_NAME, STRING_CLASS) \
- F(cl_kernel_info, CL_KERNEL_NUM_ARGS, cl_uint) \
- F(cl_kernel_info, CL_KERNEL_REFERENCE_COUNT, cl_uint) \
- F(cl_kernel_info, CL_KERNEL_CONTEXT, cl::Context) \
- F(cl_kernel_info, CL_KERNEL_PROGRAM, cl::Program) \
- \
- F(cl_kernel_work_group_info, CL_KERNEL_WORK_GROUP_SIZE, ::size_t) \
- F(cl_kernel_work_group_info, CL_KERNEL_COMPILE_WORK_GROUP_SIZE, cl::size_t<3>) \
- F(cl_kernel_work_group_info, CL_KERNEL_LOCAL_MEM_SIZE, cl_ulong) \
- \
- F(cl_command_queue_info, CL_QUEUE_CONTEXT, cl::Context) \
- F(cl_command_queue_info, CL_QUEUE_DEVICE, cl::Device) \
- F(cl_command_queue_info, CL_QUEUE_REFERENCE_COUNT, cl_uint) \
- F(cl_command_queue_info, CL_QUEUE_PROPERTIES, cl_command_queue_properties)
-
-#if defined(CL_VERSION_1_1)
-#define __PARAM_NAME_INFO_1_1(F) \
- F(cl_context_info, CL_CONTEXT_NUM_DEVICES, cl_uint)\
- F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF, cl_uint) \
- F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR, cl_uint) \
- F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT, cl_uint) \
- F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_INT, cl_uint) \
- F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG, cl_uint) \
- F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT, cl_uint) \
- F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE, cl_uint) \
- F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF, cl_uint) \
- F(cl_device_info, CL_DEVICE_DOUBLE_FP_CONFIG, cl_device_fp_config) \
- F(cl_device_info, CL_DEVICE_HALF_FP_CONFIG, cl_device_fp_config) \
- F(cl_device_info, CL_DEVICE_HOST_UNIFIED_MEMORY, cl_bool) \
- F(cl_device_info, CL_DEVICE_OPENCL_C_VERSION, STRING_CLASS) \
- \
- F(cl_mem_info, CL_MEM_ASSOCIATED_MEMOBJECT, cl::Memory) \
- F(cl_mem_info, CL_MEM_OFFSET, ::size_t) \
- \
- F(cl_kernel_work_group_info, CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE, ::size_t) \
- F(cl_kernel_work_group_info, CL_KERNEL_PRIVATE_MEM_SIZE, cl_ulong) \
- \
- F(cl_event_info, CL_EVENT_CONTEXT, cl::Context)
-#endif // CL_VERSION_1_1
-
-
-#if defined(CL_VERSION_1_2)
-#define __PARAM_NAME_INFO_1_2(F) \
- F(cl_image_info, CL_IMAGE_BUFFER, cl::Buffer) \
- \
- F(cl_program_info, CL_PROGRAM_NUM_KERNELS, ::size_t) \
- F(cl_program_info, CL_PROGRAM_KERNEL_NAMES, STRING_CLASS) \
- \
- F(cl_program_build_info, CL_PROGRAM_BINARY_TYPE, cl_program_binary_type) \
- \
- F(cl_kernel_info, CL_KERNEL_ATTRIBUTES, STRING_CLASS) \
- \
- F(cl_kernel_arg_info, CL_KERNEL_ARG_ADDRESS_QUALIFIER, cl_kernel_arg_address_qualifier) \
- F(cl_kernel_arg_info, CL_KERNEL_ARG_ACCESS_QUALIFIER, cl_kernel_arg_access_qualifier) \
- F(cl_kernel_arg_info, CL_KERNEL_ARG_TYPE_NAME, STRING_CLASS) \
- F(cl_kernel_arg_info, CL_KERNEL_ARG_NAME, STRING_CLASS) \
- \
- F(cl_device_info, CL_DEVICE_PARENT_DEVICE, cl_device_id) \
- F(cl_device_info, CL_DEVICE_PARTITION_PROPERTIES, VECTOR_CLASS<cl_device_partition_property>) \
- F(cl_device_info, CL_DEVICE_PARTITION_TYPE, VECTOR_CLASS<cl_device_partition_property>) \
- F(cl_device_info, CL_DEVICE_REFERENCE_COUNT, cl_uint) \
- F(cl_device_info, CL_DEVICE_PREFERRED_INTEROP_USER_SYNC, ::size_t) \
- F(cl_device_info, CL_DEVICE_PARTITION_AFFINITY_DOMAIN, cl_device_affinity_domain) \
- F(cl_device_info, CL_DEVICE_BUILT_IN_KERNELS, STRING_CLASS)
-#endif // #if defined(CL_VERSION_1_2)
-
-#if defined(USE_CL_DEVICE_FISSION)
-#define __PARAM_NAME_DEVICE_FISSION(F) \
- F(cl_device_info, CL_DEVICE_PARENT_DEVICE_EXT, cl_device_id) \
- F(cl_device_info, CL_DEVICE_PARTITION_TYPES_EXT, VECTOR_CLASS<cl_device_partition_property_ext>) \
- F(cl_device_info, CL_DEVICE_AFFINITY_DOMAINS_EXT, VECTOR_CLASS<cl_device_partition_property_ext>) \
- F(cl_device_info, CL_DEVICE_REFERENCE_COUNT_EXT , cl_uint) \
- F(cl_device_info, CL_DEVICE_PARTITION_STYLE_EXT, VECTOR_CLASS<cl_device_partition_property_ext>)
-#endif // USE_CL_DEVICE_FISSION
-
-template <typename enum_type, cl_int Name>
-struct param_traits {};
-
-#define __CL_DECLARE_PARAM_TRAITS(token, param_name, T) \
-struct token; \
-template<> \
-struct param_traits<detail:: token,param_name> \
-{ \
- enum { value = param_name }; \
- typedef T param_type; \
-};
-
-__PARAM_NAME_INFO_1_0(__CL_DECLARE_PARAM_TRAITS)
-#if defined(CL_VERSION_1_1)
-__PARAM_NAME_INFO_1_1(__CL_DECLARE_PARAM_TRAITS)
-#endif // CL_VERSION_1_1
-#if defined(CL_VERSION_1_2)
-__PARAM_NAME_INFO_1_2(__CL_DECLARE_PARAM_TRAITS)
-#endif // CL_VERSION_1_1
-
-#if defined(USE_CL_DEVICE_FISSION)
-__PARAM_NAME_DEVICE_FISSION(__CL_DECLARE_PARAM_TRAITS);
-#endif // USE_CL_DEVICE_FISSION
-
-#ifdef CL_PLATFORM_ICD_SUFFIX_KHR
-__CL_DECLARE_PARAM_TRAITS(cl_platform_info, CL_PLATFORM_ICD_SUFFIX_KHR, STRING_CLASS)
-#endif
-
-#ifdef CL_DEVICE_PROFILING_TIMER_OFFSET_AMD
-__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_PROFILING_TIMER_OFFSET_AMD, cl_ulong)
-#endif
-
-#ifdef CL_DEVICE_GLOBAL_FREE_MEMORY_AMD
-__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_FREE_MEMORY_AMD, VECTOR_CLASS< ::size_t>)
-#endif
-#ifdef CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD
-__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD, cl_uint)
-#endif
-#ifdef CL_DEVICE_SIMD_WIDTH_AMD
-__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_SIMD_WIDTH_AMD, cl_uint)
-#endif
-#ifdef CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD
-__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD, cl_uint)
-#endif
-#ifdef CL_DEVICE_WAVEFRONT_WIDTH_AMD
-__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_WAVEFRONT_WIDTH_AMD, cl_uint)
-#endif
-#ifdef CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD
-__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD, cl_uint)
-#endif
-#ifdef CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD
-__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD, cl_uint)
-#endif
-#ifdef CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD
-__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD, cl_uint)
-#endif
-#ifdef CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD
-__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD, cl_uint)
-#endif
-#ifdef CL_DEVICE_LOCAL_MEM_BANKS_AMD
-__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_LOCAL_MEM_BANKS_AMD, cl_uint)
-#endif
-
-#ifdef CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV
-__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV, cl_uint)
-#endif
-#ifdef CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV
-__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV, cl_uint)
-#endif
-#ifdef CL_DEVICE_REGISTERS_PER_BLOCK_NV
-__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_REGISTERS_PER_BLOCK_NV, cl_uint)
-#endif
-#ifdef CL_DEVICE_WARP_SIZE_NV
-__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_WARP_SIZE_NV, cl_uint)
-#endif
-#ifdef CL_DEVICE_GPU_OVERLAP_NV
-__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GPU_OVERLAP_NV, cl_bool)
-#endif
-#ifdef CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV
-__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV, cl_bool)
-#endif
-#ifdef CL_DEVICE_INTEGRATED_MEMORY_NV
-__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_INTEGRATED_MEMORY_NV, cl_bool)
-#endif
-
-// Convenience functions
-
-template <typename Func, typename T>
-inline cl_int
-getInfo(Func f, cl_uint name, T* param)
-{
- return getInfoHelper(f, name, param, 0);
-}
-
-template <typename Func, typename Arg0>
-struct GetInfoFunctor0
-{
- Func f_; const Arg0& arg0_;
- cl_int operator ()(
- cl_uint param, ::size_t size, void* value, ::size_t* size_ret)
- { return f_(arg0_, param, size, value, size_ret); }
-};
-
-template <typename Func, typename Arg0, typename Arg1>
-struct GetInfoFunctor1
-{
- Func f_; const Arg0& arg0_; const Arg1& arg1_;
- cl_int operator ()(
- cl_uint param, ::size_t size, void* value, ::size_t* size_ret)
- { return f_(arg0_, arg1_, param, size, value, size_ret); }
-};
-
-template <typename Func, typename Arg0, typename T>
-inline cl_int
-getInfo(Func f, const Arg0& arg0, cl_uint name, T* param)
-{
- GetInfoFunctor0<Func, Arg0> f0 = { f, arg0 };
- return getInfoHelper(f0, name, param, 0);
-}
-
-template <typename Func, typename Arg0, typename Arg1, typename T>
-inline cl_int
-getInfo(Func f, const Arg0& arg0, const Arg1& arg1, cl_uint name, T* param)
-{
- GetInfoFunctor1<Func, Arg0, Arg1> f0 = { f, arg0, arg1 };
- return getInfoHelper(f0, name, param, 0);
-}
-
-template<typename T>
-struct ReferenceHandler
-{ };
-
-#if defined(CL_VERSION_1_2)
-/**
- * OpenCL 1.2 devices do have retain/release.
- */
-template <>
-struct ReferenceHandler<cl_device_id>
-{
- /**
- * Retain the device.
- * \param device A valid device created using createSubDevices
- * \return
- * CL_SUCCESS if the function executed successfully.
- * CL_INVALID_DEVICE if device was not a valid subdevice
- * CL_OUT_OF_RESOURCES
- * CL_OUT_OF_HOST_MEMORY
- */
- static cl_int retain(cl_device_id device)
- { return ::clRetainDevice(device); }
- /**
- * Retain the device.
- * \param device A valid device created using createSubDevices
- * \return
- * CL_SUCCESS if the function executed successfully.
- * CL_INVALID_DEVICE if device was not a valid subdevice
- * CL_OUT_OF_RESOURCES
- * CL_OUT_OF_HOST_MEMORY
- */
- static cl_int release(cl_device_id device)
- { return ::clReleaseDevice(device); }
-};
-#else // #if defined(CL_VERSION_1_2)
-/**
- * OpenCL 1.1 devices do not have retain/release.
- */
-template <>
-struct ReferenceHandler<cl_device_id>
-{
- // cl_device_id does not have retain().
- static cl_int retain(cl_device_id)
- { return CL_SUCCESS; }
- // cl_device_id does not have release().
- static cl_int release(cl_device_id)
- { return CL_SUCCESS; }
-};
-#endif // #if defined(CL_VERSION_1_2)
-
-template <>
-struct ReferenceHandler<cl_platform_id>
-{
- // cl_platform_id does not have retain().
- static cl_int retain(cl_platform_id)
- { return CL_SUCCESS; }
- // cl_platform_id does not have release().
- static cl_int release(cl_platform_id)
- { return CL_SUCCESS; }
-};
-
-template <>
-struct ReferenceHandler<cl_context>
-{
- static cl_int retain(cl_context context)
- { return ::clRetainContext(context); }
- static cl_int release(cl_context context)
- { return ::clReleaseContext(context); }
-};
-
-template <>
-struct ReferenceHandler<cl_command_queue>
-{
- static cl_int retain(cl_command_queue queue)
- { return ::clRetainCommandQueue(queue); }
- static cl_int release(cl_command_queue queue)
- { return ::clReleaseCommandQueue(queue); }
-};
-
-template <>
-struct ReferenceHandler<cl_mem>
-{
- static cl_int retain(cl_mem memory)
- { return ::clRetainMemObject(memory); }
- static cl_int release(cl_mem memory)
- { return ::clReleaseMemObject(memory); }
-};
-
-template <>
-struct ReferenceHandler<cl_sampler>
-{
- static cl_int retain(cl_sampler sampler)
- { return ::clRetainSampler(sampler); }
- static cl_int release(cl_sampler sampler)
- { return ::clReleaseSampler(sampler); }
-};
-
-template <>
-struct ReferenceHandler<cl_program>
-{
- static cl_int retain(cl_program program)
- { return ::clRetainProgram(program); }
- static cl_int release(cl_program program)
- { return ::clReleaseProgram(program); }
-};
-
-template <>
-struct ReferenceHandler<cl_kernel>
-{
- static cl_int retain(cl_kernel kernel)
- { return ::clRetainKernel(kernel); }
- static cl_int release(cl_kernel kernel)
- { return ::clReleaseKernel(kernel); }
-};
-
-template <>
-struct ReferenceHandler<cl_event>
-{
- static cl_int retain(cl_event event)
- { return ::clRetainEvent(event); }
- static cl_int release(cl_event event)
- { return ::clReleaseEvent(event); }
-};
-
-
-// Extracts version number with major in the upper 16 bits, minor in the lower 16
-static cl_uint getVersion(const char *versionInfo)
-{
- int highVersion = 0;
- int lowVersion = 0;
- int index = 7;
- while(versionInfo[index] != '.' ) {
- highVersion *= 10;
- highVersion += versionInfo[index]-'0';
- ++index;
- }
- ++index;
- while(versionInfo[index] != ' ' && versionInfo[index] != '\0') {
- lowVersion *= 10;
- lowVersion += versionInfo[index]-'0';
- ++index;
- }
- return (highVersion << 16) | lowVersion;
-}
-
-static cl_uint getPlatformVersion(cl_platform_id platform)
-{
- ::size_t size = 0;
- clGetPlatformInfo(platform, CL_PLATFORM_VERSION, 0, NULL, &size);
- char *versionInfo = (char *) alloca(size);
- clGetPlatformInfo(platform, CL_PLATFORM_VERSION, size, &versionInfo[0], &size);
- return getVersion(versionInfo);
-}
-
-static cl_uint getDevicePlatformVersion(cl_device_id device)
-{
- cl_platform_id platform;
- clGetDeviceInfo(device, CL_DEVICE_PLATFORM, sizeof(platform), &platform, NULL);
- return getPlatformVersion(platform);
-}
-
-#if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
-static cl_uint getContextPlatformVersion(cl_context context)
-{
- // The platform cannot be queried directly, so we first have to grab a
- // device and obtain its context
- ::size_t size = 0;
- clGetContextInfo(context, CL_CONTEXT_DEVICES, 0, NULL, &size);
- if (size == 0)
- return 0;
- cl_device_id *devices = (cl_device_id *) alloca(size);
- clGetContextInfo(context, CL_CONTEXT_DEVICES, size, devices, NULL);
- return getDevicePlatformVersion(devices[0]);
-}
-#endif // #if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
-
-template <typename T>
-class Wrapper
-{
-public:
- typedef T cl_type;
-
-protected:
- cl_type object_;
-
-public:
- Wrapper() : object_(NULL) { }
-
- Wrapper(const cl_type &obj) : object_(obj) { }
-
- ~Wrapper()
- {
- if (object_ != NULL) { release(); }
- }
-
- Wrapper(const Wrapper<cl_type>& rhs)
- {
- object_ = rhs.object_;
- if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); }
- }
-
-#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
- Wrapper(Wrapper<cl_type>&& rhs) CL_HPP_NOEXCEPT
- {
- object_ = rhs.object_;
- rhs.object_ = NULL;
- }
-#endif
-
- Wrapper<cl_type>& operator = (const Wrapper<cl_type>& rhs)
- {
- if (this != &rhs) {
- if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
- object_ = rhs.object_;
- if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); }
- }
- return *this;
- }
-
-#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
- Wrapper<cl_type>& operator = (Wrapper<cl_type>&& rhs)
- {
- if (this != &rhs) {
- if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
- object_ = rhs.object_;
- rhs.object_ = NULL;
- }
- return *this;
- }
-#endif
-
- Wrapper<cl_type>& operator = (const cl_type &rhs)
- {
- if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
- object_ = rhs;
- return *this;
- }
-
- cl_type operator ()() const { return object_; }
-
- cl_type& operator ()() { return object_; }
-
-protected:
- template<typename Func, typename U>
- friend inline cl_int getInfoHelper(Func, cl_uint, U*, int, typename U::cl_type);
-
- cl_int retain() const
- {
- return ReferenceHandler<cl_type>::retain(object_);
- }
-
- cl_int release() const
- {
- return ReferenceHandler<cl_type>::release(object_);
- }
-};
-
-template <>
-class Wrapper<cl_device_id>
-{
-public:
- typedef cl_device_id cl_type;
-
-protected:
- cl_type object_;
- bool referenceCountable_;
-
- static bool isReferenceCountable(cl_device_id device)
- {
- bool retVal = false;
- if (device != NULL) {
- int version = getDevicePlatformVersion(device);
- if(version > ((1 << 16) + 1)) {
- retVal = true;
- }
- }
- return retVal;
- }
-
-public:
- Wrapper() : object_(NULL), referenceCountable_(false)
- {
- }
-
- Wrapper(const cl_type &obj) : object_(obj), referenceCountable_(false)
- {
- referenceCountable_ = isReferenceCountable(obj);
- }
-
- ~Wrapper()
- {
- if (object_ != NULL) { release(); }
- }
-
- Wrapper(const Wrapper<cl_type>& rhs)
- {
- object_ = rhs.object_;
- referenceCountable_ = isReferenceCountable(object_);
- if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); }
- }
-
-#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
- Wrapper(Wrapper<cl_type>&& rhs) CL_HPP_NOEXCEPT
- {
- object_ = rhs.object_;
- referenceCountable_ = rhs.referenceCountable_;
- rhs.object_ = NULL;
- rhs.referenceCountable_ = false;
- }
-#endif
-
- Wrapper<cl_type>& operator = (const Wrapper<cl_type>& rhs)
- {
- if (this != &rhs) {
- if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
- object_ = rhs.object_;
- referenceCountable_ = rhs.referenceCountable_;
- if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); }
- }
- return *this;
- }
-
-#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
- Wrapper<cl_type>& operator = (Wrapper<cl_type>&& rhs)
- {
- if (this != &rhs) {
- if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
- object_ = rhs.object_;
- referenceCountable_ = rhs.referenceCountable_;
- rhs.object_ = NULL;
- rhs.referenceCountable_ = false;
- }
- return *this;
- }
-#endif
-
- Wrapper<cl_type>& operator = (const cl_type &rhs)
- {
- if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
- object_ = rhs;
- referenceCountable_ = isReferenceCountable(object_);
- return *this;
- }
-
- cl_type operator ()() const { return object_; }
-
- cl_type& operator ()() { return object_; }
-
-protected:
- template<typename Func, typename U>
- friend inline cl_int getInfoHelper(Func, cl_uint, U*, int, typename U::cl_type);
-
- template<typename Func, typename U>
- friend inline cl_int getInfoHelper(Func, cl_uint, VECTOR_CLASS<U>*, int, typename U::cl_type);
-
- cl_int retain() const
- {
- if( referenceCountable_ ) {
- return ReferenceHandler<cl_type>::retain(object_);
- }
- else {
- return CL_SUCCESS;
- }
- }
-
- cl_int release() const
- {
- if( referenceCountable_ ) {
- return ReferenceHandler<cl_type>::release(object_);
- }
- else {
- return CL_SUCCESS;
- }
- }
-};
-
-} // namespace detail
-//! \endcond
-
-/*! \stuct ImageFormat
- * \brief Adds constructors and member functions for cl_image_format.
- *
- * \see cl_image_format
- */
-struct ImageFormat : public cl_image_format
-{
- //! \brief Default constructor - performs no initialization.
- ImageFormat(){}
-
- //! \brief Initializing constructor.
- ImageFormat(cl_channel_order order, cl_channel_type type)
- {
- image_channel_order = order;
- image_channel_data_type = type;
- }
-
- //! \brief Assignment operator.
- ImageFormat& operator = (const ImageFormat& rhs)
- {
- if (this != &rhs) {
- this->image_channel_data_type = rhs.image_channel_data_type;
- this->image_channel_order = rhs.image_channel_order;
- }
- return *this;
- }
-};
-
-/*! \brief Class interface for cl_device_id.
- *
- * \note Copies of these objects are inexpensive, since they don't 'own'
- * any underlying resources or data structures.
- *
- * \see cl_device_id
- */
-class Device : public detail::Wrapper<cl_device_id>
-{
-public:
- //! \brief Default constructor - initializes to NULL.
- Device() : detail::Wrapper<cl_type>() { }
-
- /*! \brief Constructor from cl_device_id.
- *
- * This simply copies the device ID value, which is an inexpensive operation.
- */
- __CL_EXPLICIT_CONSTRUCTORS Device(const cl_device_id &device) : detail::Wrapper<cl_type>(device) { }
-
- /*! \brief Returns the first device on the default context.
- *
- * \see Context::getDefault()
- */
- static Device getDefault(cl_int * err = NULL);
-
- /*! \brief Assignment operator from cl_device_id.
- *
- * This simply copies the device ID value, which is an inexpensive operation.
- */
- Device& operator = (const cl_device_id& rhs)
- {
- detail::Wrapper<cl_type>::operator=(rhs);
- return *this;
- }
-
- /*! \brief Copy constructor to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Device(const Device& dev) : detail::Wrapper<cl_type>(dev) {}
-
- /*! \brief Copy assignment to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Device& operator = (const Device &dev)
- {
- detail::Wrapper<cl_type>::operator=(dev);
- return *this;
- }
-
-#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
- /*! \brief Move constructor to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Device(Device&& dev) CL_HPP_NOEXCEPT : detail::Wrapper<cl_type>(std::move(dev)) {}
-
- /*! \brief Move assignment to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Device& operator = (Device &&dev)
- {
- detail::Wrapper<cl_type>::operator=(std::move(dev));
- return *this;
- }
-#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
-
- //! \brief Wrapper for clGetDeviceInfo().
- template <typename T>
- cl_int getInfo(cl_device_info name, T* param) const
- {
- return detail::errHandler(
- detail::getInfo(&::clGetDeviceInfo, object_, name, param),
- __GET_DEVICE_INFO_ERR);
- }
-
- //! \brief Wrapper for clGetDeviceInfo() that returns by value.
- template <cl_int name> typename
- detail::param_traits<detail::cl_device_info, name>::param_type
- getInfo(cl_int* err = NULL) const
- {
- typename detail::param_traits<
- detail::cl_device_info, name>::param_type param;
- cl_int result = getInfo(name, &param);
- if (err != NULL) {
- *err = result;
- }
- return param;
- }
-
- /**
- * CL 1.2 version
- */
-#if defined(CL_VERSION_1_2)
- //! \brief Wrapper for clCreateSubDevicesEXT().
- cl_int createSubDevices(
- const cl_device_partition_property * properties,
- VECTOR_CLASS<Device>* devices)
- {
- cl_uint n = 0;
- cl_int err = clCreateSubDevices(object_, properties, 0, NULL, &n);
- if (err != CL_SUCCESS) {
- return detail::errHandler(err, __CREATE_SUB_DEVICES);
- }
-
- cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id));
- err = clCreateSubDevices(object_, properties, n, ids, NULL);
- if (err != CL_SUCCESS) {
- return detail::errHandler(err, __CREATE_SUB_DEVICES);
- }
-
- devices->assign(&ids[0], &ids[n]);
- return CL_SUCCESS;
- }
-#endif // #if defined(CL_VERSION_1_2)
-
-/**
- * CL 1.1 version that uses device fission.
- */
-#if defined(CL_VERSION_1_1)
-#if defined(USE_CL_DEVICE_FISSION)
- cl_int createSubDevices(
- const cl_device_partition_property_ext * properties,
- VECTOR_CLASS<Device>* devices)
- {
- typedef CL_API_ENTRY cl_int
- ( CL_API_CALL * PFN_clCreateSubDevicesEXT)(
- cl_device_id /*in_device*/,
- const cl_device_partition_property_ext * /* properties */,
- cl_uint /*num_entries*/,
- cl_device_id * /*out_devices*/,
- cl_uint * /*num_devices*/ ) CL_EXT_SUFFIX__VERSION_1_1;
-
- static PFN_clCreateSubDevicesEXT pfn_clCreateSubDevicesEXT = NULL;
- __INIT_CL_EXT_FCN_PTR(clCreateSubDevicesEXT);
-
- cl_uint n = 0;
- cl_int err = pfn_clCreateSubDevicesEXT(object_, properties, 0, NULL, &n);
- if (err != CL_SUCCESS) {
- return detail::errHandler(err, __CREATE_SUB_DEVICES);
- }
-
- cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id));
- err = pfn_clCreateSubDevicesEXT(object_, properties, n, ids, NULL);
- if (err != CL_SUCCESS) {
- return detail::errHandler(err, __CREATE_SUB_DEVICES);
- }
-
- devices->assign(&ids[0], &ids[n]);
- return CL_SUCCESS;
- }
-#endif // #if defined(USE_CL_DEVICE_FISSION)
-#endif // #if defined(CL_VERSION_1_1)
-};
-
-/*! \brief Class interface for cl_platform_id.
- *
- * \note Copies of these objects are inexpensive, since they don't 'own'
- * any underlying resources or data structures.
- *
- * \see cl_platform_id
- */
-class Platform : public detail::Wrapper<cl_platform_id>
-{
-public:
- //! \brief Default constructor - initializes to NULL.
- Platform() : detail::Wrapper<cl_type>() { }
-
- /*! \brief Constructor from cl_platform_id.
- *
- * This simply copies the platform ID value, which is an inexpensive operation.
- */
- __CL_EXPLICIT_CONSTRUCTORS Platform(const cl_platform_id &platform) : detail::Wrapper<cl_type>(platform) { }
-
- /*! \brief Assignment operator from cl_platform_id.
- *
- * This simply copies the platform ID value, which is an inexpensive operation.
- */
- Platform& operator = (const cl_platform_id& rhs)
- {
- detail::Wrapper<cl_type>::operator=(rhs);
- return *this;
- }
-
- //! \brief Wrapper for clGetPlatformInfo().
- cl_int getInfo(cl_platform_info name, STRING_CLASS* param) const
- {
- return detail::errHandler(
- detail::getInfo(&::clGetPlatformInfo, object_, name, param),
- __GET_PLATFORM_INFO_ERR);
- }
-
- //! \brief Wrapper for clGetPlatformInfo() that returns by value.
- template <cl_int name> typename
- detail::param_traits<detail::cl_platform_info, name>::param_type
- getInfo(cl_int* err = NULL) const
- {
- typename detail::param_traits<
- detail::cl_platform_info, name>::param_type param;
- cl_int result = getInfo(name, &param);
- if (err != NULL) {
- *err = result;
- }
- return param;
- }
-
- /*! \brief Gets a list of devices for this platform.
- *
- * Wraps clGetDeviceIDs().
- */
- cl_int getDevices(
- cl_device_type type,
- VECTOR_CLASS<Device>* devices) const
- {
- cl_uint n = 0;
- if( devices == NULL ) {
- return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_DEVICE_IDS_ERR);
- }
- cl_int err = ::clGetDeviceIDs(object_, type, 0, NULL, &n);
- if (err != CL_SUCCESS) {
- return detail::errHandler(err, __GET_DEVICE_IDS_ERR);
- }
-
- cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id));
- err = ::clGetDeviceIDs(object_, type, n, ids, NULL);
- if (err != CL_SUCCESS) {
- return detail::errHandler(err, __GET_DEVICE_IDS_ERR);
- }
-
- devices->assign(&ids[0], &ids[n]);
- return CL_SUCCESS;
- }
-
-#if defined(USE_DX_INTEROP)
- /*! \brief Get the list of available D3D10 devices.
- *
- * \param d3d_device_source.
- *
- * \param d3d_object.
- *
- * \param d3d_device_set.
- *
- * \param devices returns a vector of OpenCL D3D10 devices found. The cl::Device
- * values returned in devices can be used to identify a specific OpenCL
- * device. If \a devices argument is NULL, this argument is ignored.
- *
- * \return One of the following values:
- * - CL_SUCCESS if the function is executed successfully.
- *
- * The application can query specific capabilities of the OpenCL device(s)
- * returned by cl::getDevices. This can be used by the application to
- * determine which device(s) to use.
- *
- * \note In the case that exceptions are enabled and a return value
- * other than CL_SUCCESS is generated, then cl::Error exception is
- * generated.
- */
- cl_int getDevices(
- cl_d3d10_device_source_khr d3d_device_source,
- void * d3d_object,
- cl_d3d10_device_set_khr d3d_device_set,
- VECTOR_CLASS<Device>* devices) const
- {
- typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clGetDeviceIDsFromD3D10KHR)(
- cl_platform_id platform,
- cl_d3d10_device_source_khr d3d_device_source,
- void * d3d_object,
- cl_d3d10_device_set_khr d3d_device_set,
- cl_uint num_entries,
- cl_device_id * devices,
- cl_uint* num_devices);
-
- if( devices == NULL ) {
- return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_DEVICE_IDS_ERR);
- }
-
- static PFN_clGetDeviceIDsFromD3D10KHR pfn_clGetDeviceIDsFromD3D10KHR = NULL;
- __INIT_CL_EXT_FCN_PTR_PLATFORM(object_, clGetDeviceIDsFromD3D10KHR);
-
- cl_uint n = 0;
- cl_int err = pfn_clGetDeviceIDsFromD3D10KHR(
- object_,
- d3d_device_source,
- d3d_object,
- d3d_device_set,
- 0,
- NULL,
- &n);
- if (err != CL_SUCCESS) {
- return detail::errHandler(err, __GET_DEVICE_IDS_ERR);
- }
-
- cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id));
- err = pfn_clGetDeviceIDsFromD3D10KHR(
- object_,
- d3d_device_source,
- d3d_object,
- d3d_device_set,
- n,
- ids,
- NULL);
- if (err != CL_SUCCESS) {
- return detail::errHandler(err, __GET_DEVICE_IDS_ERR);
- }
-
- devices->assign(&ids[0], &ids[n]);
- return CL_SUCCESS;
- }
-#endif
-
- /*! \brief Gets a list of available platforms.
- *
- * Wraps clGetPlatformIDs().
- */
- static cl_int get(
- VECTOR_CLASS<Platform>* platforms)
- {
- cl_uint n = 0;
-
- if( platforms == NULL ) {
- return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_PLATFORM_IDS_ERR);
- }
-
- cl_int err = ::clGetPlatformIDs(0, NULL, &n);
- if (err != CL_SUCCESS) {
- return detail::errHandler(err, __GET_PLATFORM_IDS_ERR);
- }
-
- cl_platform_id* ids = (cl_platform_id*) alloca(
- n * sizeof(cl_platform_id));
- err = ::clGetPlatformIDs(n, ids, NULL);
- if (err != CL_SUCCESS) {
- return detail::errHandler(err, __GET_PLATFORM_IDS_ERR);
- }
-
- platforms->assign(&ids[0], &ids[n]);
- return CL_SUCCESS;
- }
-
- /*! \brief Gets the first available platform.
- *
- * Wraps clGetPlatformIDs(), returning the first result.
- */
- static cl_int get(
- Platform * platform)
- {
- cl_uint n = 0;
-
- if( platform == NULL ) {
- return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_PLATFORM_IDS_ERR);
- }
-
- cl_int err = ::clGetPlatformIDs(0, NULL, &n);
- if (err != CL_SUCCESS) {
- return detail::errHandler(err, __GET_PLATFORM_IDS_ERR);
- }
-
- cl_platform_id* ids = (cl_platform_id*) alloca(
- n * sizeof(cl_platform_id));
- err = ::clGetPlatformIDs(n, ids, NULL);
- if (err != CL_SUCCESS) {
- return detail::errHandler(err, __GET_PLATFORM_IDS_ERR);
- }
-
- *platform = ids[0];
- return CL_SUCCESS;
- }
-
- /*! \brief Gets the first available platform, returning it by value.
- *
- * Wraps clGetPlatformIDs(), returning the first result.
- */
- static Platform get(
- cl_int * errResult = NULL)
- {
- Platform platform;
- cl_uint n = 0;
- cl_int err = ::clGetPlatformIDs(0, NULL, &n);
- if (err != CL_SUCCESS) {
- detail::errHandler(err, __GET_PLATFORM_IDS_ERR);
- if (errResult != NULL) {
- *errResult = err;
- }
- return Platform();
- }
-
- cl_platform_id* ids = (cl_platform_id*) alloca(
- n * sizeof(cl_platform_id));
- err = ::clGetPlatformIDs(n, ids, NULL);
-
- if (err != CL_SUCCESS) {
- detail::errHandler(err, __GET_PLATFORM_IDS_ERR);
- if (errResult != NULL) {
- *errResult = err;
- }
- return Platform();
- }
-
-
- return Platform(ids[0]);
- }
-
- static Platform getDefault(
- cl_int *errResult = NULL )
- {
- return get(errResult);
- }
-
-
-#if defined(CL_VERSION_1_2)
- //! \brief Wrapper for clUnloadCompiler().
- cl_int
- unloadCompiler()
- {
- return ::clUnloadPlatformCompiler(object_);
- }
-#endif // #if defined(CL_VERSION_1_2)
-}; // class Platform
-
-/**
- * Deprecated APIs for 1.2
- */
-#if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))
-/**
- * Unload the OpenCL compiler.
- * \note Deprecated for OpenCL 1.2. Use Platform::unloadCompiler instead.
- */
-inline CL_EXT_PREFIX__VERSION_1_1_DEPRECATED cl_int
-UnloadCompiler() CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;
-inline cl_int
-UnloadCompiler()
-{
- return ::clUnloadCompiler();
-}
-#endif // #if defined(CL_VERSION_1_1)
-
-/*! \brief Class interface for cl_context.
- *
- * \note Copies of these objects are shallow, meaning that the copy will refer
- * to the same underlying cl_context as the original. For details, see
- * clRetainContext() and clReleaseContext().
- *
- * \see cl_context
- */
-class Context
- : public detail::Wrapper<cl_context>
-{
-private:
-
-#ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
- static std::atomic<int> default_initialized_;
-#else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
- static volatile int default_initialized_;
-#endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
- static Context default_;
- static volatile cl_int default_error_;
-public:
- /*! \brief Constructs a context including a list of specified devices.
- *
- * Wraps clCreateContext().
- */
- Context(
- const VECTOR_CLASS<Device>& devices,
- cl_context_properties* properties = NULL,
- void (CL_CALLBACK * notifyFptr)(
- const char *,
- const void *,
- ::size_t,
- void *) = NULL,
- void* data = NULL,
- cl_int* err = NULL)
- {
- cl_int error;
-
- ::size_t numDevices = devices.size();
- cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id));
- for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) {
- deviceIDs[deviceIndex] = (devices[deviceIndex])();
- }
-
- object_ = ::clCreateContext(
- properties, (cl_uint) numDevices,
- deviceIDs,
- notifyFptr, data, &error);
-
- detail::errHandler(error, __CREATE_CONTEXT_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-
- Context(
- const Device& device,
- cl_context_properties* properties = NULL,
- void (CL_CALLBACK * notifyFptr)(
- const char *,
- const void *,
- ::size_t,
- void *) = NULL,
- void* data = NULL,
- cl_int* err = NULL)
- {
- cl_int error;
-
- cl_device_id deviceID = device();
-
- object_ = ::clCreateContext(
- properties, 1,
- &deviceID,
- notifyFptr, data, &error);
-
- detail::errHandler(error, __CREATE_CONTEXT_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-
- /*! \brief Constructs a context including all or a subset of devices of a specified type.
- *
- * Wraps clCreateContextFromType().
- */
- Context(
- cl_device_type type,
- cl_context_properties* properties = NULL,
- void (CL_CALLBACK * notifyFptr)(
- const char *,
- const void *,
- ::size_t,
- void *) = NULL,
- void* data = NULL,
- cl_int* err = NULL)
- {
- cl_int error;
-
-#if !defined(__APPLE__) && !defined(__MACOS)
- cl_context_properties prop[4] = {CL_CONTEXT_PLATFORM, 0, 0, 0 };
-
- if (properties == NULL) {
- // Get a valid platform ID as we cannot send in a blank one
- VECTOR_CLASS<Platform> platforms;
- error = Platform::get(&platforms);
- if (error != CL_SUCCESS) {
- detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR);
- if (err != NULL) {
- *err = error;
- }
- return;
- }
-
- // Check the platforms we found for a device of our specified type
- cl_context_properties platform_id = 0;
- for (unsigned int i = 0; i < platforms.size(); i++) {
-
- VECTOR_CLASS<Device> devices;
-
-#if defined(__CL_ENABLE_EXCEPTIONS)
- try {
-#endif
-
- error = platforms[i].getDevices(type, &devices);
-
-#if defined(__CL_ENABLE_EXCEPTIONS)
- } catch (Error) {}
- // Catch if exceptions are enabled as we don't want to exit if first platform has no devices of type
- // We do error checking next anyway, and can throw there if needed
-#endif
-
- // Only squash CL_SUCCESS and CL_DEVICE_NOT_FOUND
- if (error != CL_SUCCESS && error != CL_DEVICE_NOT_FOUND) {
- detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-
- if (devices.size() > 0) {
- platform_id = (cl_context_properties)platforms[i]();
- break;
- }
- }
-
- if (platform_id == 0) {
- detail::errHandler(CL_DEVICE_NOT_FOUND, __CREATE_CONTEXT_FROM_TYPE_ERR);
- if (err != NULL) {
- *err = CL_DEVICE_NOT_FOUND;
- }
- return;
- }
-
- prop[1] = platform_id;
- properties = &prop[0];
- }
-#endif
- object_ = ::clCreateContextFromType(
- properties, type, notifyFptr, data, &error);
-
- detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-
- /*! \brief Copy constructor to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Context(const Context& ctx) : detail::Wrapper<cl_type>(ctx) {}
-
- /*! \brief Copy assignment to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Context& operator = (const Context &ctx)
- {
- detail::Wrapper<cl_type>::operator=(ctx);
- return *this;
- }
-
-#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
- /*! \brief Move constructor to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Context(Context&& ctx) CL_HPP_NOEXCEPT : detail::Wrapper<cl_type>(std::move(ctx)) {}
-
- /*! \brief Move assignment to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Context& operator = (Context &&ctx)
- {
- detail::Wrapper<cl_type>::operator=(std::move(ctx));
- return *this;
- }
-#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
-
- /*! \brief Returns a singleton context including all devices of CL_DEVICE_TYPE_DEFAULT.
- *
- * \note All calls to this function return the same cl_context as the first.
- */
- static Context getDefault(cl_int * err = NULL)
- {
- int state = detail::compare_exchange(
- &default_initialized_,
- __DEFAULT_BEING_INITIALIZED, __DEFAULT_NOT_INITIALIZED);
-
- if (state & __DEFAULT_INITIALIZED) {
- if (err != NULL) {
- *err = default_error_;
- }
- return default_;
- }
-
- if (state & __DEFAULT_BEING_INITIALIZED) {
- // Assume writes will propagate eventually...
- while(default_initialized_ != __DEFAULT_INITIALIZED) {
- detail::fence();
- }
-
- if (err != NULL) {
- *err = default_error_;
- }
- return default_;
- }
-
- cl_int error;
- default_ = Context(
- CL_DEVICE_TYPE_DEFAULT,
- NULL,
- NULL,
- NULL,
- &error);
-
- detail::fence();
-
- default_error_ = error;
- // Assume writes will propagate eventually...
- default_initialized_ = __DEFAULT_INITIALIZED;
-
- detail::fence();
-
- if (err != NULL) {
- *err = default_error_;
- }
- return default_;
-
- }
-
- //! \brief Default constructor - initializes to NULL.
- Context() : detail::Wrapper<cl_type>() { }
-
- /*! \brief Constructor from cl_context - takes ownership.
- *
- * This effectively transfers ownership of a refcount on the cl_context
- * into the new Context object.
- */
- __CL_EXPLICIT_CONSTRUCTORS Context(const cl_context& context) : detail::Wrapper<cl_type>(context) { }
-
- /*! \brief Assignment operator from cl_context - takes ownership.
- *
- * This effectively transfers ownership of a refcount on the rhs and calls
- * clReleaseContext() on the value previously held by this instance.
- */
- Context& operator = (const cl_context& rhs)
- {
- detail::Wrapper<cl_type>::operator=(rhs);
- return *this;
- }
-
- //! \brief Wrapper for clGetContextInfo().
- template <typename T>
- cl_int getInfo(cl_context_info name, T* param) const
- {
- return detail::errHandler(
- detail::getInfo(&::clGetContextInfo, object_, name, param),
- __GET_CONTEXT_INFO_ERR);
- }
-
- //! \brief Wrapper for clGetContextInfo() that returns by value.
- template <cl_int name> typename
- detail::param_traits<detail::cl_context_info, name>::param_type
- getInfo(cl_int* err = NULL) const
- {
- typename detail::param_traits<
- detail::cl_context_info, name>::param_type param;
- cl_int result = getInfo(name, &param);
- if (err != NULL) {
- *err = result;
- }
- return param;
- }
-
- /*! \brief Gets a list of supported image formats.
- *
- * Wraps clGetSupportedImageFormats().
- */
- cl_int getSupportedImageFormats(
- cl_mem_flags flags,
- cl_mem_object_type type,
- VECTOR_CLASS<ImageFormat>* formats) const
- {
- cl_uint numEntries;
- cl_int err = ::clGetSupportedImageFormats(
- object_,
- flags,
- type,
- 0,
- NULL,
- &numEntries);
- if (err != CL_SUCCESS) {
- return detail::errHandler(err, __GET_SUPPORTED_IMAGE_FORMATS_ERR);
- }
-
- ImageFormat* value = (ImageFormat*)
- alloca(numEntries * sizeof(ImageFormat));
- err = ::clGetSupportedImageFormats(
- object_,
- flags,
- type,
- numEntries,
- (cl_image_format*) value,
- NULL);
- if (err != CL_SUCCESS) {
- return detail::errHandler(err, __GET_SUPPORTED_IMAGE_FORMATS_ERR);
- }
-
- formats->assign(&value[0], &value[numEntries]);
- return CL_SUCCESS;
- }
-};
-
-inline Device Device::getDefault(cl_int * err)
-{
- cl_int error;
- Device device;
-
- Context context = Context::getDefault(&error);
- detail::errHandler(error, __CREATE_CONTEXT_ERR);
-
- if (error != CL_SUCCESS) {
- if (err != NULL) {
- *err = error;
- }
- }
- else {
- device = context.getInfo<CL_CONTEXT_DEVICES>()[0];
- if (err != NULL) {
- *err = CL_SUCCESS;
- }
- }
-
- return device;
-}
-
-
-#ifdef _WIN32
-#ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
-__declspec(selectany) std::atomic<int> Context::default_initialized_;
-#else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
-__declspec(selectany) volatile int Context::default_initialized_ = __DEFAULT_NOT_INITIALIZED;
-#endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
-__declspec(selectany) Context Context::default_;
-__declspec(selectany) volatile cl_int Context::default_error_ = CL_SUCCESS;
-#else // !_WIN32
-#ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
-__attribute__((weak)) std::atomic<int> Context::default_initialized_;
-#else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
-__attribute__((weak)) volatile int Context::default_initialized_ = __DEFAULT_NOT_INITIALIZED;
-#endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
-__attribute__((weak)) Context Context::default_;
-__attribute__((weak)) volatile cl_int Context::default_error_ = CL_SUCCESS;
-#endif // !_WIN32
-
-/*! \brief Class interface for cl_event.
- *
- * \note Copies of these objects are shallow, meaning that the copy will refer
- * to the same underlying cl_event as the original. For details, see
- * clRetainEvent() and clReleaseEvent().
- *
- * \see cl_event
- */
-class Event : public detail::Wrapper<cl_event>
-{
-public:
- //! \brief Default constructor - initializes to NULL.
- Event() : detail::Wrapper<cl_type>() { }
-
- /*! \brief Constructor from cl_event - takes ownership.
- *
- * This effectively transfers ownership of a refcount on the cl_event
- * into the new Event object.
- */
- __CL_EXPLICIT_CONSTRUCTORS Event(const cl_event& event) : detail::Wrapper<cl_type>(event) { }
-
- /*! \brief Assignment operator from cl_event - takes ownership.
- *
- * This effectively transfers ownership of a refcount on the rhs and calls
- * clReleaseEvent() on the value previously held by this instance.
- */
- Event& operator = (const cl_event& rhs)
- {
- detail::Wrapper<cl_type>::operator=(rhs);
- return *this;
- }
-
- //! \brief Wrapper for clGetEventInfo().
- template <typename T>
- cl_int getInfo(cl_event_info name, T* param) const
- {
- return detail::errHandler(
- detail::getInfo(&::clGetEventInfo, object_, name, param),
- __GET_EVENT_INFO_ERR);
- }
-
- //! \brief Wrapper for clGetEventInfo() that returns by value.
- template <cl_int name> typename
- detail::param_traits<detail::cl_event_info, name>::param_type
- getInfo(cl_int* err = NULL) const
- {
- typename detail::param_traits<
- detail::cl_event_info, name>::param_type param;
- cl_int result = getInfo(name, &param);
- if (err != NULL) {
- *err = result;
- }
- return param;
- }
-
- //! \brief Wrapper for clGetEventProfilingInfo().
- template <typename T>
- cl_int getProfilingInfo(cl_profiling_info name, T* param) const
- {
- return detail::errHandler(detail::getInfo(
- &::clGetEventProfilingInfo, object_, name, param),
- __GET_EVENT_PROFILE_INFO_ERR);
- }
-
- //! \brief Wrapper for clGetEventProfilingInfo() that returns by value.
- template <cl_int name> typename
- detail::param_traits<detail::cl_profiling_info, name>::param_type
- getProfilingInfo(cl_int* err = NULL) const
- {
- typename detail::param_traits<
- detail::cl_profiling_info, name>::param_type param;
- cl_int result = getProfilingInfo(name, &param);
- if (err != NULL) {
- *err = result;
- }
- return param;
- }
-
- /*! \brief Blocks the calling thread until this event completes.
- *
- * Wraps clWaitForEvents().
- */
- cl_int wait() const
- {
- return detail::errHandler(
- ::clWaitForEvents(1, &object_),
- __WAIT_FOR_EVENTS_ERR);
- }
-
-#if defined(CL_VERSION_1_1)
- /*! \brief Registers a user callback function for a specific command execution status.
- *
- * Wraps clSetEventCallback().
- */
- cl_int setCallback(
- cl_int type,
- void (CL_CALLBACK * pfn_notify)(cl_event, cl_int, void *),
- void * user_data = NULL)
- {
- return detail::errHandler(
- ::clSetEventCallback(
- object_,
- type,
- pfn_notify,
- user_data),
- __SET_EVENT_CALLBACK_ERR);
- }
-#endif
-
- /*! \brief Blocks the calling thread until every event specified is complete.
- *
- * Wraps clWaitForEvents().
- */
- static cl_int
- waitForEvents(const VECTOR_CLASS<Event>& events)
- {
- return detail::errHandler(
- ::clWaitForEvents(
- (cl_uint) events.size(), (events.size() > 0) ? (cl_event*)&events.front() : NULL),
- __WAIT_FOR_EVENTS_ERR);
- }
-};
-
-#if defined(CL_VERSION_1_1)
-/*! \brief Class interface for user events (a subset of cl_event's).
- *
- * See Event for details about copy semantics, etc.
- */
-class UserEvent : public Event
-{
-public:
- /*! \brief Constructs a user event on a given context.
- *
- * Wraps clCreateUserEvent().
- */
- UserEvent(
- const Context& context,
- cl_int * err = NULL)
- {
- cl_int error;
- object_ = ::clCreateUserEvent(
- context(),
- &error);
-
- detail::errHandler(error, __CREATE_USER_EVENT_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-
- //! \brief Default constructor - initializes to NULL.
- UserEvent() : Event() { }
-
- /*! \brief Sets the execution status of a user event object.
- *
- * Wraps clSetUserEventStatus().
- */
- cl_int setStatus(cl_int status)
- {
- return detail::errHandler(
- ::clSetUserEventStatus(object_,status),
- __SET_USER_EVENT_STATUS_ERR);
- }
-};
-#endif
-
-/*! \brief Blocks the calling thread until every event specified is complete.
- *
- * Wraps clWaitForEvents().
- */
-inline static cl_int
-WaitForEvents(const VECTOR_CLASS<Event>& events)
-{
- return detail::errHandler(
- ::clWaitForEvents(
- (cl_uint) events.size(), (events.size() > 0) ? (cl_event*)&events.front() : NULL),
- __WAIT_FOR_EVENTS_ERR);
-}
-
-/*! \brief Class interface for cl_mem.
- *
- * \note Copies of these objects are shallow, meaning that the copy will refer
- * to the same underlying cl_mem as the original. For details, see
- * clRetainMemObject() and clReleaseMemObject().
- *
- * \see cl_mem
- */
-class Memory : public detail::Wrapper<cl_mem>
-{
-public:
- //! \brief Default constructor - initializes to NULL.
- Memory() : detail::Wrapper<cl_type>() { }
-
- /*! \brief Constructor from cl_mem - takes ownership.
- *
- * This effectively transfers ownership of a refcount on the cl_mem
- * into the new Memory object.
- */
- __CL_EXPLICIT_CONSTRUCTORS Memory(const cl_mem& memory) : detail::Wrapper<cl_type>(memory) { }
-
- /*! \brief Assignment operator from cl_mem - takes ownership.
- *
- * This effectively transfers ownership of a refcount on the rhs and calls
- * clReleaseMemObject() on the value previously held by this instance.
- */
- Memory& operator = (const cl_mem& rhs)
- {
- detail::Wrapper<cl_type>::operator=(rhs);
- return *this;
- }
-
- /*! \brief Copy constructor to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Memory(const Memory& mem) : detail::Wrapper<cl_type>(mem) {}
-
- /*! \brief Copy assignment to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Memory& operator = (const Memory &mem)
- {
- detail::Wrapper<cl_type>::operator=(mem);
- return *this;
- }
-
-#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
- /*! \brief Move constructor to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Memory(Memory&& mem) CL_HPP_NOEXCEPT : detail::Wrapper<cl_type>(std::move(mem)) {}
-
- /*! \brief Move assignment to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Memory& operator = (Memory &&mem)
- {
- detail::Wrapper<cl_type>::operator=(std::move(mem));
- return *this;
- }
-#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
-
- //! \brief Wrapper for clGetMemObjectInfo().
- template <typename T>
- cl_int getInfo(cl_mem_info name, T* param) const
- {
- return detail::errHandler(
- detail::getInfo(&::clGetMemObjectInfo, object_, name, param),
- __GET_MEM_OBJECT_INFO_ERR);
- }
-
- //! \brief Wrapper for clGetMemObjectInfo() that returns by value.
- template <cl_int name> typename
- detail::param_traits<detail::cl_mem_info, name>::param_type
- getInfo(cl_int* err = NULL) const
- {
- typename detail::param_traits<
- detail::cl_mem_info, name>::param_type param;
- cl_int result = getInfo(name, &param);
- if (err != NULL) {
- *err = result;
- }
- return param;
- }
-
-#if defined(CL_VERSION_1_1)
- /*! \brief Registers a callback function to be called when the memory object
- * is no longer needed.
- *
- * Wraps clSetMemObjectDestructorCallback().
- *
- * Repeated calls to this function, for a given cl_mem value, will append
- * to the list of functions called (in reverse order) when memory object's
- * resources are freed and the memory object is deleted.
- *
- * \note
- * The registered callbacks are associated with the underlying cl_mem
- * value - not the Memory class instance.
- */
- cl_int setDestructorCallback(
- void (CL_CALLBACK * pfn_notify)(cl_mem, void *),
- void * user_data = NULL)
- {
- return detail::errHandler(
- ::clSetMemObjectDestructorCallback(
- object_,
- pfn_notify,
- user_data),
- __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR);
- }
-#endif
-
-};
-
-// Pre-declare copy functions
-class Buffer;
-template< typename IteratorType >
-cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer );
-template< typename IteratorType >
-cl_int copy( const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator );
-template< typename IteratorType >
-cl_int copy( const CommandQueue &queue, IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer );
-template< typename IteratorType >
-cl_int copy( const CommandQueue &queue, const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator );
-
-
-/*! \brief Class interface for Buffer Memory Objects.
- *
- * See Memory for details about copy semantics, etc.
- *
- * \see Memory
- */
-class Buffer : public Memory
-{
-public:
-
- /*! \brief Constructs a Buffer in a specified context.
- *
- * Wraps clCreateBuffer().
- *
- * \param host_ptr Storage to be used if the CL_MEM_USE_HOST_PTR flag was
- * specified. Note alignment & exclusivity requirements.
- */
- Buffer(
- const Context& context,
- cl_mem_flags flags,
- ::size_t size,
- void* host_ptr = NULL,
- cl_int* err = NULL)
- {
- cl_int error;
- object_ = ::clCreateBuffer(context(), flags, size, host_ptr, &error);
-
- detail::errHandler(error, __CREATE_BUFFER_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-
- /*! \brief Constructs a Buffer in the default context.
- *
- * Wraps clCreateBuffer().
- *
- * \param host_ptr Storage to be used if the CL_MEM_USE_HOST_PTR flag was
- * specified. Note alignment & exclusivity requirements.
- *
- * \see Context::getDefault()
- */
- Buffer(
- cl_mem_flags flags,
- ::size_t size,
- void* host_ptr = NULL,
- cl_int* err = NULL)
- {
- cl_int error;
-
- Context context = Context::getDefault(err);
-
- object_ = ::clCreateBuffer(context(), flags, size, host_ptr, &error);
-
- detail::errHandler(error, __CREATE_BUFFER_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-
- /*!
- * \brief Construct a Buffer from a host container via iterators.
- * IteratorType must be random access.
- * If useHostPtr is specified iterators must represent contiguous data.
- */
- template< typename IteratorType >
- Buffer(
- IteratorType startIterator,
- IteratorType endIterator,
- bool readOnly,
- bool useHostPtr = false,
- cl_int* err = NULL)
- {
- typedef typename std::iterator_traits<IteratorType>::value_type DataType;
- cl_int error;
-
- cl_mem_flags flags = 0;
- if( readOnly ) {
- flags |= CL_MEM_READ_ONLY;
- }
- else {
- flags |= CL_MEM_READ_WRITE;
- }
- if( useHostPtr ) {
- flags |= CL_MEM_USE_HOST_PTR;
- }
-
- ::size_t size = sizeof(DataType)*(endIterator - startIterator);
-
- Context context = Context::getDefault(err);
-
- if( useHostPtr ) {
- object_ = ::clCreateBuffer(context(), flags, size, static_cast<DataType*>(&*startIterator), &error);
- } else {
- object_ = ::clCreateBuffer(context(), flags, size, 0, &error);
- }
-
- detail::errHandler(error, __CREATE_BUFFER_ERR);
- if (err != NULL) {
- *err = error;
- }
-
- if( !useHostPtr ) {
- error = cl::copy(startIterator, endIterator, *this);
- detail::errHandler(error, __CREATE_BUFFER_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
- }
-
- /*!
- * \brief Construct a Buffer from a host container via iterators using a specified context.
- * IteratorType must be random access.
- * If useHostPtr is specified iterators must represent contiguous data.
- */
- template< typename IteratorType >
- Buffer(const Context &context, IteratorType startIterator, IteratorType endIterator,
- bool readOnly, bool useHostPtr = false, cl_int* err = NULL);
-
- /*!
- * \brief Construct a Buffer from a host container via iterators using a specified queue.
- * If useHostPtr is specified iterators must represent contiguous data.
- */
- template< typename IteratorType >
- Buffer(const CommandQueue &queue, IteratorType startIterator, IteratorType endIterator,
- bool readOnly, bool useHostPtr = false, cl_int* err = NULL);
-
- //! \brief Default constructor - initializes to NULL.
- Buffer() : Memory() { }
-
- /*! \brief Constructor from cl_mem - takes ownership.
- *
- * See Memory for further details.
- */
- __CL_EXPLICIT_CONSTRUCTORS Buffer(const cl_mem& buffer) : Memory(buffer) { }
-
- /*! \brief Assignment from cl_mem - performs shallow copy.
- *
- * See Memory for further details.
- */
- Buffer& operator = (const cl_mem& rhs)
- {
- Memory::operator=(rhs);
- return *this;
- }
-
- /*! \brief Copy constructor to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Buffer(const Buffer& buf) : Memory(buf) {}
-
- /*! \brief Copy assignment to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Buffer& operator = (const Buffer &buf)
- {
- Memory::operator=(buf);
- return *this;
- }
-
-#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
- /*! \brief Move constructor to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Buffer(Buffer&& buf) CL_HPP_NOEXCEPT : Memory(std::move(buf)) {}
-
- /*! \brief Move assignment to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Buffer& operator = (Buffer &&buf)
- {
- Memory::operator=(std::move(buf));
- return *this;
- }
-#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
-
-#if defined(CL_VERSION_1_1)
- /*! \brief Creates a new buffer object from this.
- *
- * Wraps clCreateSubBuffer().
- */
- Buffer createSubBuffer(
- cl_mem_flags flags,
- cl_buffer_create_type buffer_create_type,
- const void * buffer_create_info,
- cl_int * err = NULL)
- {
- Buffer result;
- cl_int error;
- result.object_ = ::clCreateSubBuffer(
- object_,
- flags,
- buffer_create_type,
- buffer_create_info,
- &error);
-
- detail::errHandler(error, __CREATE_SUBBUFFER_ERR);
- if (err != NULL) {
- *err = error;
- }
-
- return result;
- }
-#endif
-};
-
-#if defined (USE_DX_INTEROP)
-/*! \brief Class interface for creating OpenCL buffers from ID3D10Buffer's.
- *
- * This is provided to facilitate interoperability with Direct3D.
- *
- * See Memory for details about copy semantics, etc.
- *
- * \see Memory
- */
-class BufferD3D10 : public Buffer
-{
-public:
- typedef CL_API_ENTRY cl_mem (CL_API_CALL *PFN_clCreateFromD3D10BufferKHR)(
- cl_context context, cl_mem_flags flags, ID3D10Buffer* buffer,
- cl_int* errcode_ret);
-
- /*! \brief Constructs a BufferD3D10, in a specified context, from a
- * given ID3D10Buffer.
- *
- * Wraps clCreateFromD3D10BufferKHR().
- */
- BufferD3D10(
- const Context& context,
- cl_mem_flags flags,
- ID3D10Buffer* bufobj,
- cl_int * err = NULL)
- {
- static PFN_clCreateFromD3D10BufferKHR pfn_clCreateFromD3D10BufferKHR = NULL;
-
-#if defined(CL_VERSION_1_2)
- vector<cl_context_properties> props = context.getInfo<CL_CONTEXT_PROPERTIES>();
- cl_platform platform = -1;
- for( int i = 0; i < props.size(); ++i ) {
- if( props[i] == CL_CONTEXT_PLATFORM ) {
- platform = props[i+1];
- }
- }
- __INIT_CL_EXT_FCN_PTR_PLATFORM(platform, clCreateFromD3D10BufferKHR);
-#endif
-#if defined(CL_VERSION_1_1)
- __INIT_CL_EXT_FCN_PTR(clCreateFromD3D10BufferKHR);
-#endif
-
- cl_int error;
- object_ = pfn_clCreateFromD3D10BufferKHR(
- context(),
- flags,
- bufobj,
- &error);
-
- detail::errHandler(error, __CREATE_GL_BUFFER_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-
- //! \brief Default constructor - initializes to NULL.
- BufferD3D10() : Buffer() { }
-
- /*! \brief Constructor from cl_mem - takes ownership.
- *
- * See Memory for further details.
- */
- __CL_EXPLICIT_CONSTRUCTORS BufferD3D10(const cl_mem& buffer) : Buffer(buffer) { }
-
- /*! \brief Assignment from cl_mem - performs shallow copy.
- *
- * See Memory for further details.
- */
- BufferD3D10& operator = (const cl_mem& rhs)
- {
- Buffer::operator=(rhs);
- return *this;
- }
-
- /*! \brief Copy constructor to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- BufferD3D10(const BufferD3D10& buf) : Buffer(buf) {}
-
- /*! \brief Copy assignment to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- BufferD3D10& operator = (const BufferD3D10 &buf)
- {
- Buffer::operator=(buf);
- return *this;
- }
-
-#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
- /*! \brief Move constructor to forward move to the superclass correctly.
- * Required for MSVC.
- */
- BufferD3D10(BufferD3D10&& buf) CL_HPP_NOEXCEPT : Buffer(std::move(buf)) {}
-
- /*! \brief Move assignment to forward move to the superclass correctly.
- * Required for MSVC.
- */
- BufferD3D10& operator = (BufferD3D10 &&buf)
- {
- Buffer::operator=(std::move(buf));
- return *this;
- }
-#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
-};
-#endif
-
-/*! \brief Class interface for GL Buffer Memory Objects.
- *
- * This is provided to facilitate interoperability with OpenGL.
- *
- * See Memory for details about copy semantics, etc.
- *
- * \see Memory
- */
-class BufferGL : public Buffer
-{
-public:
- /*! \brief Constructs a BufferGL in a specified context, from a given
- * GL buffer.
- *
- * Wraps clCreateFromGLBuffer().
- */
- BufferGL(
- const Context& context,
- cl_mem_flags flags,
- cl_GLuint bufobj,
- cl_int * err = NULL)
- {
- cl_int error;
- object_ = ::clCreateFromGLBuffer(
- context(),
- flags,
- bufobj,
- &error);
-
- detail::errHandler(error, __CREATE_GL_BUFFER_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-
- //! \brief Default constructor - initializes to NULL.
- BufferGL() : Buffer() { }
-
- /*! \brief Constructor from cl_mem - takes ownership.
- *
- * See Memory for further details.
- */
- __CL_EXPLICIT_CONSTRUCTORS BufferGL(const cl_mem& buffer) : Buffer(buffer) { }
-
- /*! \brief Assignment from cl_mem - performs shallow copy.
- *
- * See Memory for further details.
- */
- BufferGL& operator = (const cl_mem& rhs)
- {
- Buffer::operator=(rhs);
- return *this;
- }
-
- /*! \brief Copy constructor to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- BufferGL(const BufferGL& buf) : Buffer(buf) {}
-
- /*! \brief Copy assignment to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- BufferGL& operator = (const BufferGL &buf)
- {
- Buffer::operator=(buf);
- return *this;
- }
-
-#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
- /*! \brief Move constructor to forward move to the superclass correctly.
- * Required for MSVC.
- */
- BufferGL(BufferGL&& buf) CL_HPP_NOEXCEPT : Buffer(std::move(buf)) {}
-
- /*! \brief Move assignment to forward move to the superclass correctly.
- * Required for MSVC.
- */
- BufferGL& operator = (BufferGL &&buf)
- {
- Buffer::operator=(std::move(buf));
- return *this;
- }
-#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
-
- //! \brief Wrapper for clGetGLObjectInfo().
- cl_int getObjectInfo(
- cl_gl_object_type *type,
- cl_GLuint * gl_object_name)
- {
- return detail::errHandler(
- ::clGetGLObjectInfo(object_,type,gl_object_name),
- __GET_GL_OBJECT_INFO_ERR);
- }
-};
-
-/*! \brief C++ base class for Image Memory objects.
- *
- * See Memory for details about copy semantics, etc.
- *
- * \see Memory
- */
-class Image : public Memory
-{
-protected:
- //! \brief Default constructor - initializes to NULL.
- Image() : Memory() { }
-
- /*! \brief Constructor from cl_mem - takes ownership.
- *
- * See Memory for further details.
- */
- __CL_EXPLICIT_CONSTRUCTORS Image(const cl_mem& image) : Memory(image) { }
-
- /*! \brief Assignment from cl_mem - performs shallow copy.
- *
- * See Memory for further details.
- */
- Image& operator = (const cl_mem& rhs)
- {
- Memory::operator=(rhs);
- return *this;
- }
-
- /*! \brief Copy constructor to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Image(const Image& img) : Memory(img) {}
-
- /*! \brief Copy assignment to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Image& operator = (const Image &img)
- {
- Memory::operator=(img);
- return *this;
- }
-
-#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
- /*! \brief Move constructor to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Image(Image&& img) CL_HPP_NOEXCEPT : Memory(std::move(img)) {}
-
- /*! \brief Move assignment to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Image& operator = (Image &&img)
- {
- Memory::operator=(std::move(img));
- return *this;
- }
-#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
-
-public:
- //! \brief Wrapper for clGetImageInfo().
- template <typename T>
- cl_int getImageInfo(cl_image_info name, T* param) const
- {
- return detail::errHandler(
- detail::getInfo(&::clGetImageInfo, object_, name, param),
- __GET_IMAGE_INFO_ERR);
- }
-
- //! \brief Wrapper for clGetImageInfo() that returns by value.
- template <cl_int name> typename
- detail::param_traits<detail::cl_image_info, name>::param_type
- getImageInfo(cl_int* err = NULL) const
- {
- typename detail::param_traits<
- detail::cl_image_info, name>::param_type param;
- cl_int result = getImageInfo(name, &param);
- if (err != NULL) {
- *err = result;
- }
- return param;
- }
-};
-
-#if defined(CL_VERSION_1_2)
-/*! \brief Class interface for 1D Image Memory objects.
- *
- * See Memory for details about copy semantics, etc.
- *
- * \see Memory
- */
-class Image1D : public Image
-{
-public:
- /*! \brief Constructs a 1D Image in a specified context.
- *
- * Wraps clCreateImage().
- */
- Image1D(
- const Context& context,
- cl_mem_flags flags,
- ImageFormat format,
- ::size_t width,
- void* host_ptr = NULL,
- cl_int* err = NULL)
- {
- cl_int error;
- cl_image_desc desc =
- {
- CL_MEM_OBJECT_IMAGE1D,
- width,
- 0, 0, 0, 0, 0, 0, 0, 0
- };
- object_ = ::clCreateImage(
- context(),
- flags,
- &format,
- &desc,
- host_ptr,
- &error);
-
- detail::errHandler(error, __CREATE_IMAGE_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-
- //! \brief Default constructor - initializes to NULL.
- Image1D() { }
-
- /*! \brief Constructor from cl_mem - takes ownership.
- *
- * See Memory for further details.
- */
- __CL_EXPLICIT_CONSTRUCTORS Image1D(const cl_mem& image1D) : Image(image1D) { }
-
- /*! \brief Assignment from cl_mem - performs shallow copy.
- *
- * See Memory for further details.
- */
- Image1D& operator = (const cl_mem& rhs)
- {
- Image::operator=(rhs);
- return *this;
- }
-
- /*! \brief Copy constructor to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Image1D(const Image1D& img) : Image(img) {}
-
- /*! \brief Copy assignment to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Image1D& operator = (const Image1D &img)
- {
- Image::operator=(img);
- return *this;
- }
-
-#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
- /*! \brief Move constructor to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Image1D(Image1D&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {}
-
- /*! \brief Move assignment to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Image1D& operator = (Image1D &&img)
- {
- Image::operator=(std::move(img));
- return *this;
- }
-#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
-};
-
-/*! \class Image1DBuffer
- * \brief Image interface for 1D buffer images.
- */
-class Image1DBuffer : public Image
-{
-public:
- Image1DBuffer(
- const Context& context,
- cl_mem_flags flags,
- ImageFormat format,
- ::size_t width,
- const Buffer &buffer,
- cl_int* err = NULL)
- {
- cl_int error;
- cl_image_desc desc =
- {
- CL_MEM_OBJECT_IMAGE1D_BUFFER,
- width,
- 0, 0, 0, 0, 0, 0, 0,
- buffer()
- };
- object_ = ::clCreateImage(
- context(),
- flags,
- &format,
- &desc,
- NULL,
- &error);
-
- detail::errHandler(error, __CREATE_IMAGE_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-
- Image1DBuffer() { }
-
- __CL_EXPLICIT_CONSTRUCTORS Image1DBuffer(const cl_mem& image1D) : Image(image1D) { }
-
- Image1DBuffer& operator = (const cl_mem& rhs)
- {
- Image::operator=(rhs);
- return *this;
- }
-
- /*! \brief Copy constructor to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Image1DBuffer(const Image1DBuffer& img) : Image(img) {}
-
- /*! \brief Copy assignment to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Image1DBuffer& operator = (const Image1DBuffer &img)
- {
- Image::operator=(img);
- return *this;
- }
-
-#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
- /*! \brief Move constructor to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Image1DBuffer(Image1DBuffer&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {}
-
- /*! \brief Move assignment to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Image1DBuffer& operator = (Image1DBuffer &&img)
- {
- Image::operator=(std::move(img));
- return *this;
- }
-#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
-};
-
-/*! \class Image1DArray
- * \brief Image interface for arrays of 1D images.
- */
-class Image1DArray : public Image
-{
-public:
- Image1DArray(
- const Context& context,
- cl_mem_flags flags,
- ImageFormat format,
- ::size_t arraySize,
- ::size_t width,
- ::size_t rowPitch,
- void* host_ptr = NULL,
- cl_int* err = NULL)
- {
- cl_int error;
- cl_image_desc desc =
- {
- CL_MEM_OBJECT_IMAGE1D_ARRAY,
- width,
- 0, 0, // height, depth (unused)
- arraySize,
- rowPitch,
- 0, 0, 0, 0
- };
- object_ = ::clCreateImage(
- context(),
- flags,
- &format,
- &desc,
- host_ptr,
- &error);
-
- detail::errHandler(error, __CREATE_IMAGE_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-
- Image1DArray() { }
-
- __CL_EXPLICIT_CONSTRUCTORS Image1DArray(const cl_mem& imageArray) : Image(imageArray) { }
-
- Image1DArray& operator = (const cl_mem& rhs)
- {
- Image::operator=(rhs);
- return *this;
- }
-
- /*! \brief Copy constructor to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Image1DArray(const Image1DArray& img) : Image(img) {}
-
- /*! \brief Copy assignment to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Image1DArray& operator = (const Image1DArray &img)
- {
- Image::operator=(img);
- return *this;
- }
-
-#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
- /*! \brief Move constructor to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Image1DArray(Image1DArray&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {}
-
- /*! \brief Move assignment to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Image1DArray& operator = (Image1DArray &&img)
- {
- Image::operator=(std::move(img));
- return *this;
- }
-#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
-};
-#endif // #if defined(CL_VERSION_1_2)
-
-
-/*! \brief Class interface for 2D Image Memory objects.
- *
- * See Memory for details about copy semantics, etc.
- *
- * \see Memory
- */
-class Image2D : public Image
-{
-public:
- /*! \brief Constructs a 1D Image in a specified context.
- *
- * Wraps clCreateImage().
- */
- Image2D(
- const Context& context,
- cl_mem_flags flags,
- ImageFormat format,
- ::size_t width,
- ::size_t height,
- ::size_t row_pitch = 0,
- void* host_ptr = NULL,
- cl_int* err = NULL)
- {
- cl_int error;
- bool useCreateImage;
-
-#if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
- // Run-time decision based on the actual platform
- {
- cl_uint version = detail::getContextPlatformVersion(context());
- useCreateImage = (version >= 0x10002); // OpenCL 1.2 or above
- }
-#elif defined(CL_VERSION_1_2)
- useCreateImage = true;
-#else
- useCreateImage = false;
-#endif
-
-#if defined(CL_VERSION_1_2)
- if (useCreateImage)
- {
- cl_image_desc desc =
- {
- CL_MEM_OBJECT_IMAGE2D,
- width,
- height,
- 0, 0, // depth, array size (unused)
- row_pitch,
- 0, 0, 0, 0
- };
- object_ = ::clCreateImage(
- context(),
- flags,
- &format,
- &desc,
- host_ptr,
- &error);
-
- detail::errHandler(error, __CREATE_IMAGE_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-#endif // #if defined(CL_VERSION_1_2)
-#if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
- if (!useCreateImage)
- {
- object_ = ::clCreateImage2D(
- context(), flags,&format, width, height, row_pitch, host_ptr, &error);
-
- detail::errHandler(error, __CREATE_IMAGE2D_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-#endif // #if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
- }
-
- //! \brief Default constructor - initializes to NULL.
- Image2D() { }
-
- /*! \brief Constructor from cl_mem - takes ownership.
- *
- * See Memory for further details.
- */
- __CL_EXPLICIT_CONSTRUCTORS Image2D(const cl_mem& image2D) : Image(image2D) { }
-
- /*! \brief Assignment from cl_mem - performs shallow copy.
- *
- * See Memory for further details.
- */
- Image2D& operator = (const cl_mem& rhs)
- {
- Image::operator=(rhs);
- return *this;
- }
-
- /*! \brief Copy constructor to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Image2D(const Image2D& img) : Image(img) {}
-
- /*! \brief Copy assignment to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Image2D& operator = (const Image2D &img)
- {
- Image::operator=(img);
- return *this;
- }
-
-#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
- /*! \brief Move constructor to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Image2D(Image2D&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {}
-
- /*! \brief Move assignment to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Image2D& operator = (Image2D &&img)
- {
- Image::operator=(std::move(img));
- return *this;
- }
-#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
-};
-
-
-#if !defined(CL_VERSION_1_2)
-/*! \brief Class interface for GL 2D Image Memory objects.
- *
- * This is provided to facilitate interoperability with OpenGL.
- *
- * See Memory for details about copy semantics, etc.
- *
- * \see Memory
- * \note Deprecated for OpenCL 1.2. Please use ImageGL instead.
- */
-class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED Image2DGL CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED : public Image2D
-{
-public:
- /*! \brief Constructs an Image2DGL in a specified context, from a given
- * GL Texture.
- *
- * Wraps clCreateFromGLTexture2D().
- */
- Image2DGL(
- const Context& context,
- cl_mem_flags flags,
- cl_GLenum target,
- cl_GLint miplevel,
- cl_GLuint texobj,
- cl_int * err = NULL)
- {
- cl_int error;
- object_ = ::clCreateFromGLTexture2D(
- context(),
- flags,
- target,
- miplevel,
- texobj,
- &error);
-
- detail::errHandler(error, __CREATE_GL_TEXTURE_2D_ERR);
- if (err != NULL) {
- *err = error;
- }
-
- }
-
- //! \brief Default constructor - initializes to NULL.
- Image2DGL() : Image2D() { }
-
- /*! \brief Constructor from cl_mem - takes ownership.
- *
- * See Memory for further details.
- */
- __CL_EXPLICIT_CONSTRUCTORS Image2DGL(const cl_mem& image) : Image2D(image) { }
-
- /*! \brief Assignment from cl_mem - performs shallow copy.
- *
- * See Memory for further details.
- */
- Image2DGL& operator = (const cl_mem& rhs)
- {
- Image2D::operator=(rhs);
- return *this;
- }
-
- /*! \brief Copy constructor to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Image2DGL(const Image2DGL& img) : Image2D(img) {}
-
- /*! \brief Copy assignment to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Image2DGL& operator = (const Image2DGL &img)
- {
- Image2D::operator=(img);
- return *this;
- }
-
-#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
- /*! \brief Move constructor to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Image2DGL(Image2DGL&& img) CL_HPP_NOEXCEPT : Image2D(std::move(img)) {}
-
- /*! \brief Move assignment to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Image2DGL& operator = (Image2DGL &&img)
- {
- Image2D::operator=(std::move(img));
- return *this;
- }
-#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
-};
-#endif // #if !defined(CL_VERSION_1_2)
-
-#if defined(CL_VERSION_1_2)
-/*! \class Image2DArray
- * \brief Image interface for arrays of 2D images.
- */
-class Image2DArray : public Image
-{
-public:
- Image2DArray(
- const Context& context,
- cl_mem_flags flags,
- ImageFormat format,
- ::size_t arraySize,
- ::size_t width,
- ::size_t height,
- ::size_t rowPitch,
- ::size_t slicePitch,
- void* host_ptr = NULL,
- cl_int* err = NULL)
- {
- cl_int error;
- cl_image_desc desc =
- {
- CL_MEM_OBJECT_IMAGE2D_ARRAY,
- width,
- height,
- 0, // depth (unused)
- arraySize,
- rowPitch,
- slicePitch,
- 0, 0, 0
- };
- object_ = ::clCreateImage(
- context(),
- flags,
- &format,
- &desc,
- host_ptr,
- &error);
-
- detail::errHandler(error, __CREATE_IMAGE_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-
- Image2DArray() { }
-
- __CL_EXPLICIT_CONSTRUCTORS Image2DArray(const cl_mem& imageArray) : Image(imageArray) { }
-
- Image2DArray& operator = (const cl_mem& rhs)
- {
- Image::operator=(rhs);
- return *this;
- }
-
- /*! \brief Copy constructor to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Image2DArray(const Image2DArray& img) : Image(img) {}
-
- /*! \brief Copy assignment to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Image2DArray& operator = (const Image2DArray &img)
- {
- Image::operator=(img);
- return *this;
- }
-
-#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
- /*! \brief Move constructor to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Image2DArray(Image2DArray&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {}
-
- /*! \brief Move assignment to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Image2DArray& operator = (Image2DArray &&img)
- {
- Image::operator=(std::move(img));
- return *this;
- }
-#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
-};
-#endif // #if defined(CL_VERSION_1_2)
-
-/*! \brief Class interface for 3D Image Memory objects.
- *
- * See Memory for details about copy semantics, etc.
- *
- * \see Memory
- */
-class Image3D : public Image
-{
-public:
- /*! \brief Constructs a 3D Image in a specified context.
- *
- * Wraps clCreateImage().
- */
- Image3D(
- const Context& context,
- cl_mem_flags flags,
- ImageFormat format,
- ::size_t width,
- ::size_t height,
- ::size_t depth,
- ::size_t row_pitch = 0,
- ::size_t slice_pitch = 0,
- void* host_ptr = NULL,
- cl_int* err = NULL)
- {
- cl_int error;
- bool useCreateImage;
-
-#if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
- // Run-time decision based on the actual platform
- {
- cl_uint version = detail::getContextPlatformVersion(context());
- useCreateImage = (version >= 0x10002); // OpenCL 1.2 or above
- }
-#elif defined(CL_VERSION_1_2)
- useCreateImage = true;
-#else
- useCreateImage = false;
-#endif
-
-#if defined(CL_VERSION_1_2)
- if (useCreateImage)
- {
- cl_image_desc desc =
- {
- CL_MEM_OBJECT_IMAGE3D,
- width,
- height,
- depth,
- 0, // array size (unused)
- row_pitch,
- slice_pitch,
- 0, 0, 0
- };
- object_ = ::clCreateImage(
- context(),
- flags,
- &format,
- &desc,
- host_ptr,
- &error);
-
- detail::errHandler(error, __CREATE_IMAGE_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-#endif // #if defined(CL_VERSION_1_2)
-#if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
- if (!useCreateImage)
- {
- object_ = ::clCreateImage3D(
- context(), flags, &format, width, height, depth, row_pitch,
- slice_pitch, host_ptr, &error);
-
- detail::errHandler(error, __CREATE_IMAGE3D_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-#endif // #if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
- }
-
- //! \brief Default constructor - initializes to NULL.
- Image3D() : Image() { }
-
- /*! \brief Constructor from cl_mem - takes ownership.
- *
- * See Memory for further details.
- */
- __CL_EXPLICIT_CONSTRUCTORS Image3D(const cl_mem& image3D) : Image(image3D) { }
-
- /*! \brief Assignment from cl_mem - performs shallow copy.
- *
- * See Memory for further details.
- */
- Image3D& operator = (const cl_mem& rhs)
- {
- Image::operator=(rhs);
- return *this;
- }
-
- /*! \brief Copy constructor to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Image3D(const Image3D& img) : Image(img) {}
-
- /*! \brief Copy assignment to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Image3D& operator = (const Image3D &img)
- {
- Image::operator=(img);
- return *this;
- }
-
-#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
- /*! \brief Move constructor to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Image3D(Image3D&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {}
-
- /*! \brief Move assignment to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Image3D& operator = (Image3D &&img)
- {
- Image::operator=(std::move(img));
- return *this;
- }
-#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
-};
-
-#if !defined(CL_VERSION_1_2)
-/*! \brief Class interface for GL 3D Image Memory objects.
- *
- * This is provided to facilitate interoperability with OpenGL.
- *
- * See Memory for details about copy semantics, etc.
- *
- * \see Memory
- */
-class Image3DGL : public Image3D
-{
-public:
- /*! \brief Constructs an Image3DGL in a specified context, from a given
- * GL Texture.
- *
- * Wraps clCreateFromGLTexture3D().
- */
- Image3DGL(
- const Context& context,
- cl_mem_flags flags,
- cl_GLenum target,
- cl_GLint miplevel,
- cl_GLuint texobj,
- cl_int * err = NULL)
- {
- cl_int error;
- object_ = ::clCreateFromGLTexture3D(
- context(),
- flags,
- target,
- miplevel,
- texobj,
- &error);
-
- detail::errHandler(error, __CREATE_GL_TEXTURE_3D_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-
- //! \brief Default constructor - initializes to NULL.
- Image3DGL() : Image3D() { }
-
- /*! \brief Constructor from cl_mem - takes ownership.
- *
- * See Memory for further details.
- */
- __CL_EXPLICIT_CONSTRUCTORS Image3DGL(const cl_mem& image) : Image3D(image) { }
-
- /*! \brief Assignment from cl_mem - performs shallow copy.
- *
- * See Memory for further details.
- */
- Image3DGL& operator = (const cl_mem& rhs)
- {
- Image3D::operator=(rhs);
- return *this;
- }
-
- /*! \brief Copy constructor to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Image3DGL(const Image3DGL& img) : Image3D(img) {}
-
- /*! \brief Copy assignment to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Image3DGL& operator = (const Image3DGL &img)
- {
- Image3D::operator=(img);
- return *this;
- }
-
-#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
- /*! \brief Move constructor to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Image3DGL(Image3DGL&& img) CL_HPP_NOEXCEPT : Image3D(std::move(img)) {}
-
- /*! \brief Move assignment to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Image3DGL& operator = (Image3DGL &&img)
- {
- Image3D::operator=(std::move(img));
- return *this;
- }
-#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
-};
-#endif // #if !defined(CL_VERSION_1_2)
-
-#if defined(CL_VERSION_1_2)
-/*! \class ImageGL
- * \brief general image interface for GL interop.
- * We abstract the 2D and 3D GL images into a single instance here
- * that wraps all GL sourced images on the grounds that setup information
- * was performed by OpenCL anyway.
- */
-class ImageGL : public Image
-{
-public:
- ImageGL(
- const Context& context,
- cl_mem_flags flags,
- cl_GLenum target,
- cl_GLint miplevel,
- cl_GLuint texobj,
- cl_int * err = NULL)
- {
- cl_int error;
- object_ = ::clCreateFromGLTexture(
- context(),
- flags,
- target,
- miplevel,
- texobj,
- &error);
-
- detail::errHandler(error, __CREATE_GL_TEXTURE_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-
- ImageGL() : Image() { }
-
- __CL_EXPLICIT_CONSTRUCTORS ImageGL(const cl_mem& image) : Image(image) { }
-
- ImageGL& operator = (const cl_mem& rhs)
- {
- Image::operator=(rhs);
- return *this;
- }
-
- /*! \brief Copy constructor to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- ImageGL(const ImageGL& img) : Image(img) {}
-
- /*! \brief Copy assignment to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- ImageGL& operator = (const ImageGL &img)
- {
- Image::operator=(img);
- return *this;
- }
-
-#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
- /*! \brief Move constructor to forward move to the superclass correctly.
- * Required for MSVC.
- */
- ImageGL(ImageGL&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {}
-
- /*! \brief Move assignment to forward move to the superclass correctly.
- * Required for MSVC.
- */
- ImageGL& operator = (ImageGL &&img)
- {
- Image::operator=(std::move(img));
- return *this;
- }
-#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
-};
-#endif // #if defined(CL_VERSION_1_2)
-
-/*! \brief Class interface for GL Render Buffer Memory Objects.
-*
-* This is provided to facilitate interoperability with OpenGL.
-*
-* See Memory for details about copy semantics, etc.
-*
-* \see Memory
-*/
-class BufferRenderGL :
-#if defined(CL_VERSION_1_2)
- public ImageGL
-#else // #if defined(CL_VERSION_1_2)
- public Image2DGL
-#endif //#if defined(CL_VERSION_1_2)
-{
-public:
- /*! \brief Constructs a BufferRenderGL in a specified context, from a given
- * GL Renderbuffer.
- *
- * Wraps clCreateFromGLRenderbuffer().
- */
- BufferRenderGL(
- const Context& context,
- cl_mem_flags flags,
- cl_GLuint bufobj,
- cl_int * err = NULL)
- {
- cl_int error;
- object_ = ::clCreateFromGLRenderbuffer(
- context(),
- flags,
- bufobj,
- &error);
-
- detail::errHandler(error, __CREATE_GL_RENDER_BUFFER_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-
- //! \brief Default constructor - initializes to NULL.
-#if defined(CL_VERSION_1_2)
- BufferRenderGL() : ImageGL() {};
-#else // #if defined(CL_VERSION_1_2)
- BufferRenderGL() : Image2DGL() {};
-#endif //#if defined(CL_VERSION_1_2)
-
- /*! \brief Constructor from cl_mem - takes ownership.
- *
- * See Memory for further details.
- */
-#if defined(CL_VERSION_1_2)
- __CL_EXPLICIT_CONSTRUCTORS BufferRenderGL(const cl_mem& buffer) : ImageGL(buffer) { }
-#else // #if defined(CL_VERSION_1_2)
- __CL_EXPLICIT_CONSTRUCTORS BufferRenderGL(const cl_mem& buffer) : Image2DGL(buffer) { }
-#endif //#if defined(CL_VERSION_1_2)
-
-
- /*! \brief Assignment from cl_mem - performs shallow copy.
- *
- * See Memory for further details.
- */
- BufferRenderGL& operator = (const cl_mem& rhs)
- {
-#if defined(CL_VERSION_1_2)
- ImageGL::operator=(rhs);
-#else // #if defined(CL_VERSION_1_2)
- Image2DGL::operator=(rhs);
-#endif //#if defined(CL_VERSION_1_2)
-
- return *this;
- }
-
- /*! \brief Copy constructor to forward copy to the superclass correctly.
- * Required for MSVC.
- */
-#if defined(CL_VERSION_1_2)
- BufferRenderGL(const BufferRenderGL& buf) : ImageGL(buf) {}
-#else // #if defined(CL_VERSION_1_2)
- BufferRenderGL(const BufferRenderGL& buf) : Image2DGL(buf) {}
-#endif //#if defined(CL_VERSION_1_2)
-
- /*! \brief Copy assignment to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- BufferRenderGL& operator = (const BufferRenderGL &rhs)
- {
-#if defined(CL_VERSION_1_2)
- ImageGL::operator=(rhs);
-#else // #if defined(CL_VERSION_1_2)
- Image2DGL::operator=(rhs);
-#endif //#if defined(CL_VERSION_1_2)
- return *this;
- }
-
-#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
- /*! \brief Move constructor to forward move to the superclass correctly.
- * Required for MSVC.
- */
-#if defined(CL_VERSION_1_2)
- BufferRenderGL(BufferRenderGL&& buf) CL_HPP_NOEXCEPT : ImageGL(std::move(buf)) {}
-#else // #if defined(CL_VERSION_1_2)
- BufferRenderGL(BufferRenderGL&& buf) CL_HPP_NOEXCEPT : Image2DGL(std::move(buf)) {}
-#endif //#if defined(CL_VERSION_1_2)
-
-
- /*! \brief Move assignment to forward move to the superclass correctly.
- * Required for MSVC.
- */
- BufferRenderGL& operator = (BufferRenderGL &&buf)
- {
-#if defined(CL_VERSION_1_2)
- ImageGL::operator=(std::move(buf));
-#else // #if defined(CL_VERSION_1_2)
- Image2DGL::operator=(std::move(buf));
-#endif //#if defined(CL_VERSION_1_2)
-
- return *this;
- }
-#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
-
- //! \brief Wrapper for clGetGLObjectInfo().
- cl_int getObjectInfo(
- cl_gl_object_type *type,
- cl_GLuint * gl_object_name)
- {
- return detail::errHandler(
- ::clGetGLObjectInfo(object_, type, gl_object_name),
- __GET_GL_OBJECT_INFO_ERR);
- }
-};
-
-/*! \brief Class interface for cl_sampler.
- *
- * \note Copies of these objects are shallow, meaning that the copy will refer
- * to the same underlying cl_sampler as the original. For details, see
- * clRetainSampler() and clReleaseSampler().
- *
- * \see cl_sampler
- */
-class Sampler : public detail::Wrapper<cl_sampler>
-{
-public:
- //! \brief Default constructor - initializes to NULL.
- Sampler() { }
-
- /*! \brief Constructs a Sampler in a specified context.
- *
- * Wraps clCreateSampler().
- */
- Sampler(
- const Context& context,
- cl_bool normalized_coords,
- cl_addressing_mode addressing_mode,
- cl_filter_mode filter_mode,
- cl_int* err = NULL)
- {
- cl_int error;
- object_ = ::clCreateSampler(
- context(),
- normalized_coords,
- addressing_mode,
- filter_mode,
- &error);
-
- detail::errHandler(error, __CREATE_SAMPLER_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-
- /*! \brief Constructor from cl_sampler - takes ownership.
- *
- * This effectively transfers ownership of a refcount on the cl_sampler
- * into the new Sampler object.
- */
- __CL_EXPLICIT_CONSTRUCTORS Sampler(const cl_sampler& sampler) : detail::Wrapper<cl_type>(sampler) { }
-
- /*! \brief Assignment operator from cl_sampler - takes ownership.
- *
- * This effectively transfers ownership of a refcount on the rhs and calls
- * clReleaseSampler() on the value previously held by this instance.
- */
- Sampler& operator = (const cl_sampler& rhs)
- {
- detail::Wrapper<cl_type>::operator=(rhs);
- return *this;
- }
-
- /*! \brief Copy constructor to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Sampler(const Sampler& sam) : detail::Wrapper<cl_type>(sam) {}
-
- /*! \brief Copy assignment to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Sampler& operator = (const Sampler &sam)
- {
- detail::Wrapper<cl_type>::operator=(sam);
- return *this;
- }
-
-#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
- /*! \brief Move constructor to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Sampler(Sampler&& sam) CL_HPP_NOEXCEPT : detail::Wrapper<cl_type>(std::move(sam)) {}
-
- /*! \brief Move assignment to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Sampler& operator = (Sampler &&sam)
- {
- detail::Wrapper<cl_type>::operator=(std::move(sam));
- return *this;
- }
-#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
-
- //! \brief Wrapper for clGetSamplerInfo().
- template <typename T>
- cl_int getInfo(cl_sampler_info name, T* param) const
- {
- return detail::errHandler(
- detail::getInfo(&::clGetSamplerInfo, object_, name, param),
- __GET_SAMPLER_INFO_ERR);
- }
-
- //! \brief Wrapper for clGetSamplerInfo() that returns by value.
- template <cl_int name> typename
- detail::param_traits<detail::cl_sampler_info, name>::param_type
- getInfo(cl_int* err = NULL) const
- {
- typename detail::param_traits<
- detail::cl_sampler_info, name>::param_type param;
- cl_int result = getInfo(name, &param);
- if (err != NULL) {
- *err = result;
- }
- return param;
- }
-};
-
-class Program;
-class CommandQueue;
-class Kernel;
-
-//! \brief Class interface for specifying NDRange values.
-class NDRange
-{
-private:
- size_t<3> sizes_;
- cl_uint dimensions_;
-
-public:
- //! \brief Default constructor - resulting range has zero dimensions.
- NDRange()
- : dimensions_(0)
- { }
-
- //! \brief Constructs one-dimensional range.
- NDRange(::size_t size0)
- : dimensions_(1)
- {
- sizes_[0] = size0;
- }
-
- //! \brief Constructs two-dimensional range.
- NDRange(::size_t size0, ::size_t size1)
- : dimensions_(2)
- {
- sizes_[0] = size0;
- sizes_[1] = size1;
- }
-
- //! \brief Constructs three-dimensional range.
- NDRange(::size_t size0, ::size_t size1, ::size_t size2)
- : dimensions_(3)
- {
- sizes_[0] = size0;
- sizes_[1] = size1;
- sizes_[2] = size2;
- }
-
- /*! \brief Conversion operator to const ::size_t *.
- *
- * \returns a pointer to the size of the first dimension.
- */
- operator const ::size_t*() const {
- return (const ::size_t*) sizes_;
- }
-
- //! \brief Queries the number of dimensions in the range.
- ::size_t dimensions() const { return dimensions_; }
-};
-
-//! \brief A zero-dimensional range.
-static const NDRange NullRange;
-
-//! \brief Local address wrapper for use with Kernel::setArg
-struct LocalSpaceArg
-{
- ::size_t size_;
-};
-
-namespace detail {
-
-template <typename T>
-struct KernelArgumentHandler
-{
- static ::size_t size(const T&) { return sizeof(T); }
- static const T* ptr(const T& value) { return &value; }
-};
-
-template <>
-struct KernelArgumentHandler<LocalSpaceArg>
-{
- static ::size_t size(const LocalSpaceArg& value) { return value.size_; }
- static const void* ptr(const LocalSpaceArg&) { return NULL; }
-};
-
-}
-//! \endcond
-
-/*! __local
- * \brief Helper function for generating LocalSpaceArg objects.
- * Deprecated. Replaced with Local.
- */
-inline CL_EXT_PREFIX__VERSION_1_1_DEPRECATED LocalSpaceArg
-__local(::size_t size) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;
-inline LocalSpaceArg
-__local(::size_t size)
-{
- LocalSpaceArg ret = { size };
- return ret;
-}
-
-/*! Local
- * \brief Helper function for generating LocalSpaceArg objects.
- */
-inline LocalSpaceArg
-Local(::size_t size)
-{
- LocalSpaceArg ret = { size };
- return ret;
-}
-
-//class KernelFunctor;
-
-/*! \brief Class interface for cl_kernel.
- *
- * \note Copies of these objects are shallow, meaning that the copy will refer
- * to the same underlying cl_kernel as the original. For details, see
- * clRetainKernel() and clReleaseKernel().
- *
- * \see cl_kernel
- */
-class Kernel : public detail::Wrapper<cl_kernel>
-{
-public:
- inline Kernel(const Program& program, const char* name, cl_int* err = NULL);
-
- //! \brief Default constructor - initializes to NULL.
- Kernel() { }
-
- /*! \brief Constructor from cl_kernel - takes ownership.
- *
- * This effectively transfers ownership of a refcount on the cl_kernel
- * into the new Kernel object.
- */
- __CL_EXPLICIT_CONSTRUCTORS Kernel(const cl_kernel& kernel) : detail::Wrapper<cl_type>(kernel) { }
-
- /*! \brief Assignment operator from cl_kernel - takes ownership.
- *
- * This effectively transfers ownership of a refcount on the rhs and calls
- * clReleaseKernel() on the value previously held by this instance.
- */
- Kernel& operator = (const cl_kernel& rhs)
- {
- detail::Wrapper<cl_type>::operator=(rhs);
- return *this;
- }
-
- /*! \brief Copy constructor to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Kernel(const Kernel& kernel) : detail::Wrapper<cl_type>(kernel) {}
-
- /*! \brief Copy assignment to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Kernel& operator = (const Kernel &kernel)
- {
- detail::Wrapper<cl_type>::operator=(kernel);
- return *this;
- }
-
-#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
- /*! \brief Move constructor to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Kernel(Kernel&& kernel) CL_HPP_NOEXCEPT : detail::Wrapper<cl_type>(std::move(kernel)) {}
-
- /*! \brief Move assignment to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Kernel& operator = (Kernel &&kernel)
- {
- detail::Wrapper<cl_type>::operator=(std::move(kernel));
- return *this;
- }
-#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
-
- template <typename T>
- cl_int getInfo(cl_kernel_info name, T* param) const
- {
- return detail::errHandler(
- detail::getInfo(&::clGetKernelInfo, object_, name, param),
- __GET_KERNEL_INFO_ERR);
- }
-
- template <cl_int name> typename
- detail::param_traits<detail::cl_kernel_info, name>::param_type
- getInfo(cl_int* err = NULL) const
- {
- typename detail::param_traits<
- detail::cl_kernel_info, name>::param_type param;
- cl_int result = getInfo(name, &param);
- if (err != NULL) {
- *err = result;
- }
- return param;
- }
-
-#if defined(CL_VERSION_1_2)
- template <typename T>
- cl_int getArgInfo(cl_uint argIndex, cl_kernel_arg_info name, T* param) const
- {
- return detail::errHandler(
- detail::getInfo(&::clGetKernelArgInfo, object_, argIndex, name, param),
- __GET_KERNEL_ARG_INFO_ERR);
- }
-
- template <cl_int name> typename
- detail::param_traits<detail::cl_kernel_arg_info, name>::param_type
- getArgInfo(cl_uint argIndex, cl_int* err = NULL) const
- {
- typename detail::param_traits<
- detail::cl_kernel_arg_info, name>::param_type param;
- cl_int result = getArgInfo(argIndex, name, &param);
- if (err != NULL) {
- *err = result;
- }
- return param;
- }
-#endif // #if defined(CL_VERSION_1_2)
-
- template <typename T>
- cl_int getWorkGroupInfo(
- const Device& device, cl_kernel_work_group_info name, T* param) const
- {
- return detail::errHandler(
- detail::getInfo(
- &::clGetKernelWorkGroupInfo, object_, device(), name, param),
- __GET_KERNEL_WORK_GROUP_INFO_ERR);
- }
-
- template <cl_int name> typename
- detail::param_traits<detail::cl_kernel_work_group_info, name>::param_type
- getWorkGroupInfo(const Device& device, cl_int* err = NULL) const
- {
- typename detail::param_traits<
- detail::cl_kernel_work_group_info, name>::param_type param;
- cl_int result = getWorkGroupInfo(device, name, &param);
- if (err != NULL) {
- *err = result;
- }
- return param;
- }
-
- template <typename T>
- cl_int setArg(cl_uint index, const T &value)
- {
- return detail::errHandler(
- ::clSetKernelArg(
- object_,
- index,
- detail::KernelArgumentHandler<T>::size(value),
- detail::KernelArgumentHandler<T>::ptr(value)),
- __SET_KERNEL_ARGS_ERR);
- }
-
- cl_int setArg(cl_uint index, ::size_t size, const void* argPtr)
- {
- return detail::errHandler(
- ::clSetKernelArg(object_, index, size, argPtr),
- __SET_KERNEL_ARGS_ERR);
- }
-};
-
-/*! \class Program
- * \brief Program interface that implements cl_program.
- */
-class Program : public detail::Wrapper<cl_program>
-{
-public:
- typedef VECTOR_CLASS<std::pair<const void*, ::size_t> > Binaries;
- typedef VECTOR_CLASS<std::pair<const char*, ::size_t> > Sources;
-
- Program(
- const STRING_CLASS& source,
- bool build = false,
- cl_int* err = NULL)
- {
- cl_int error;
-
- const char * strings = source.c_str();
- const ::size_t length = source.size();
-
- Context context = Context::getDefault(err);
-
- object_ = ::clCreateProgramWithSource(
- context(), (cl_uint)1, &strings, &length, &error);
-
- detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR);
-
- if (error == CL_SUCCESS && build) {
-
- error = ::clBuildProgram(
- object_,
- 0,
- NULL,
- "",
- NULL,
- NULL);
-
- detail::errHandler(error, __BUILD_PROGRAM_ERR);
- }
-
- if (err != NULL) {
- *err = error;
- }
- }
-
- Program(
- const Context& context,
- const STRING_CLASS& source,
- bool build = false,
- cl_int* err = NULL)
- {
- cl_int error;
-
- const char * strings = source.c_str();
- const ::size_t length = source.size();
-
- object_ = ::clCreateProgramWithSource(
- context(), (cl_uint)1, &strings, &length, &error);
-
- detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR);
-
- if (error == CL_SUCCESS && build) {
-
- error = ::clBuildProgram(
- object_,
- 0,
- NULL,
- "",
- NULL,
- NULL);
-
- detail::errHandler(error, __BUILD_PROGRAM_ERR);
- }
-
- if (err != NULL) {
- *err = error;
- }
- }
-
- Program(
- const Context& context,
- const Sources& sources,
- cl_int* err = NULL)
- {
- cl_int error;
-
- const ::size_t n = (::size_t)sources.size();
- ::size_t* lengths = (::size_t*) alloca(n * sizeof(::size_t));
- const char** strings = (const char**) alloca(n * sizeof(const char*));
-
- for (::size_t i = 0; i < n; ++i) {
- strings[i] = sources[(int)i].first;
- lengths[i] = sources[(int)i].second;
- }
-
- object_ = ::clCreateProgramWithSource(
- context(), (cl_uint)n, strings, lengths, &error);
-
- detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-
- /**
- * Construct a program object from a list of devices and a per-device list of binaries.
- * \param context A valid OpenCL context in which to construct the program.
- * \param devices A vector of OpenCL device objects for which the program will be created.
- * \param binaries A vector of pairs of a pointer to a binary object and its length.
- * \param binaryStatus An optional vector that on completion will be resized to
- * match the size of binaries and filled with values to specify if each binary
- * was successfully loaded.
- * Set to CL_SUCCESS if the binary was successfully loaded.
- * Set to CL_INVALID_VALUE if the length is 0 or the binary pointer is NULL.
- * Set to CL_INVALID_BINARY if the binary provided is not valid for the matching device.
- * \param err if non-NULL will be set to CL_SUCCESS on successful operation or one of the following errors:
- * CL_INVALID_CONTEXT if context is not a valid context.
- * CL_INVALID_VALUE if the length of devices is zero; or if the length of binaries does not match the length of devices;
- * or if any entry in binaries is NULL or has length 0.
- * CL_INVALID_DEVICE if OpenCL devices listed in devices are not in the list of devices associated with context.
- * CL_INVALID_BINARY if an invalid program binary was encountered for any device. binaryStatus will return specific status for each device.
- * CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required by the OpenCL implementation on the host.
- */
- Program(
- const Context& context,
- const VECTOR_CLASS<Device>& devices,
- const Binaries& binaries,
- VECTOR_CLASS<cl_int>* binaryStatus = NULL,
- cl_int* err = NULL)
- {
- cl_int error;
-
- const ::size_t numDevices = devices.size();
-
- // Catch size mismatch early and return
- if(binaries.size() != numDevices) {
- error = CL_INVALID_VALUE;
- detail::errHandler(error, __CREATE_PROGRAM_WITH_BINARY_ERR);
- if (err != NULL) {
- *err = error;
- }
- return;
- }
-
- ::size_t* lengths = (::size_t*) alloca(numDevices * sizeof(::size_t));
- const unsigned char** images = (const unsigned char**) alloca(numDevices * sizeof(const unsigned char**));
-
- for (::size_t i = 0; i < numDevices; ++i) {
- images[i] = (const unsigned char*)binaries[i].first;
- lengths[i] = binaries[(int)i].second;
- }
-
- cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id));
- for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) {
- deviceIDs[deviceIndex] = (devices[deviceIndex])();
- }
-
- if(binaryStatus) {
- binaryStatus->resize(numDevices);
- }
-
- object_ = ::clCreateProgramWithBinary(
- context(), (cl_uint) devices.size(),
- deviceIDs,
- lengths, images, (binaryStatus != NULL && numDevices > 0)
- ? &binaryStatus->front()
- : NULL, &error);
-
- detail::errHandler(error, __CREATE_PROGRAM_WITH_BINARY_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-
-
-#if defined(CL_VERSION_1_2)
- /**
- * Create program using builtin kernels.
- * \param kernelNames Semi-colon separated list of builtin kernel names
- */
- Program(
- const Context& context,
- const VECTOR_CLASS<Device>& devices,
- const STRING_CLASS& kernelNames,
- cl_int* err = NULL)
- {
- cl_int error;
-
-
- ::size_t numDevices = devices.size();
- cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id));
- for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) {
- deviceIDs[deviceIndex] = (devices[deviceIndex])();
- }
-
- object_ = ::clCreateProgramWithBuiltInKernels(
- context(),
- (cl_uint) devices.size(),
- deviceIDs,
- kernelNames.c_str(),
- &error);
-
- detail::errHandler(error, __CREATE_PROGRAM_WITH_BUILT_IN_KERNELS_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-#endif // #if defined(CL_VERSION_1_2)
-
- Program() { }
-
- __CL_EXPLICIT_CONSTRUCTORS Program(const cl_program& program) : detail::Wrapper<cl_type>(program) { }
-
- Program& operator = (const cl_program& rhs)
- {
- detail::Wrapper<cl_type>::operator=(rhs);
- return *this;
- }
-
- /*! \brief Copy constructor to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Program(const Program& program) : detail::Wrapper<cl_type>(program) {}
-
- /*! \brief Copy assignment to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- Program& operator = (const Program &program)
- {
- detail::Wrapper<cl_type>::operator=(program);
- return *this;
- }
-
-#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
- /*! \brief Move constructor to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Program(Program&& program) CL_HPP_NOEXCEPT : detail::Wrapper<cl_type>(std::move(program)) {}
-
- /*! \brief Move assignment to forward move to the superclass correctly.
- * Required for MSVC.
- */
- Program& operator = (Program &&program)
- {
- detail::Wrapper<cl_type>::operator=(std::move(program));
- return *this;
- }
-#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
-
- cl_int build(
- const VECTOR_CLASS<Device>& devices,
- const char* options = NULL,
- void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,
- void* data = NULL) const
- {
- ::size_t numDevices = devices.size();
- cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id));
- for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) {
- deviceIDs[deviceIndex] = (devices[deviceIndex])();
- }
-
- return detail::errHandler(
- ::clBuildProgram(
- object_,
- (cl_uint)
- devices.size(),
- deviceIDs,
- options,
- notifyFptr,
- data),
- __BUILD_PROGRAM_ERR);
- }
-
- cl_int build(
- const char* options = NULL,
- void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,
- void* data = NULL) const
- {
- return detail::errHandler(
- ::clBuildProgram(
- object_,
- 0,
- NULL,
- options,
- notifyFptr,
- data),
- __BUILD_PROGRAM_ERR);
- }
-
-#if defined(CL_VERSION_1_2)
- cl_int compile(
- const char* options = NULL,
- void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,
- void* data = NULL) const
- {
- return detail::errHandler(
- ::clCompileProgram(
- object_,
- 0,
- NULL,
- options,
- 0,
- NULL,
- NULL,
- notifyFptr,
- data),
- __COMPILE_PROGRAM_ERR);
- }
-#endif
-
- template <typename T>
- cl_int getInfo(cl_program_info name, T* param) const
- {
- return detail::errHandler(
- detail::getInfo(&::clGetProgramInfo, object_, name, param),
- __GET_PROGRAM_INFO_ERR);
- }
-
- template <cl_int name> typename
- detail::param_traits<detail::cl_program_info, name>::param_type
- getInfo(cl_int* err = NULL) const
- {
- typename detail::param_traits<
- detail::cl_program_info, name>::param_type param;
- cl_int result = getInfo(name, &param);
- if (err != NULL) {
- *err = result;
- }
- return param;
- }
-
- template <typename T>
- cl_int getBuildInfo(
- const Device& device, cl_program_build_info name, T* param) const
- {
- return detail::errHandler(
- detail::getInfo(
- &::clGetProgramBuildInfo, object_, device(), name, param),
- __GET_PROGRAM_BUILD_INFO_ERR);
- }
-
- template <cl_int name> typename
- detail::param_traits<detail::cl_program_build_info, name>::param_type
- getBuildInfo(const Device& device, cl_int* err = NULL) const
- {
- typename detail::param_traits<
- detail::cl_program_build_info, name>::param_type param;
- cl_int result = getBuildInfo(device, name, &param);
- if (err != NULL) {
- *err = result;
- }
- return param;
- }
-
- cl_int createKernels(VECTOR_CLASS<Kernel>* kernels)
- {
- cl_uint numKernels;
- cl_int err = ::clCreateKernelsInProgram(object_, 0, NULL, &numKernels);
- if (err != CL_SUCCESS) {
- return detail::errHandler(err, __CREATE_KERNELS_IN_PROGRAM_ERR);
- }
-
- Kernel* value = (Kernel*) alloca(numKernels * sizeof(Kernel));
- err = ::clCreateKernelsInProgram(
- object_, numKernels, (cl_kernel*) value, NULL);
- if (err != CL_SUCCESS) {
- return detail::errHandler(err, __CREATE_KERNELS_IN_PROGRAM_ERR);
- }
-
- kernels->assign(&value[0], &value[numKernels]);
- return CL_SUCCESS;
- }
-};
-
-#if defined(CL_VERSION_1_2)
-inline Program linkProgram(
- Program input1,
- Program input2,
- const char* options = NULL,
- void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,
- void* data = NULL,
- cl_int* err = NULL)
-{
- cl_int error_local = CL_SUCCESS;
-
- cl_program programs[2] = { input1(), input2() };
-
- Context ctx = input1.getInfo<CL_PROGRAM_CONTEXT>(&error_local);
- if(error_local!=CL_SUCCESS) {
- detail::errHandler(error_local, __LINK_PROGRAM_ERR);
- }
-
- cl_program prog = ::clLinkProgram(
- ctx(),
- 0,
- NULL,
- options,
- 2,
- programs,
- notifyFptr,
- data,
- &error_local);
-
- detail::errHandler(error_local,__COMPILE_PROGRAM_ERR);
- if (err != NULL) {
- *err = error_local;
- }
-
- return Program(prog);
-}
-
-inline Program linkProgram(
- VECTOR_CLASS<Program> inputPrograms,
- const char* options = NULL,
- void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,
- void* data = NULL,
- cl_int* err = NULL)
-{
- cl_int error_local = CL_SUCCESS;
-
- cl_program * programs = (cl_program*) alloca(inputPrograms.size() * sizeof(cl_program));
-
- if (programs != NULL) {
- for (unsigned int i = 0; i < inputPrograms.size(); i++) {
- programs[i] = inputPrograms[i]();
- }
- }
-
- Context ctx;
- if(inputPrograms.size() > 0) {
- ctx = inputPrograms[0].getInfo<CL_PROGRAM_CONTEXT>(&error_local);
- if(error_local!=CL_SUCCESS) {
- detail::errHandler(error_local, __LINK_PROGRAM_ERR);
- }
- }
- cl_program prog = ::clLinkProgram(
- ctx(),
- 0,
- NULL,
- options,
- (cl_uint)inputPrograms.size(),
- programs,
- notifyFptr,
- data,
- &error_local);
-
- detail::errHandler(error_local,__COMPILE_PROGRAM_ERR);
- if (err != NULL) {
- *err = error_local;
- }
-
- return Program(prog);
-}
-#endif
-
-template<>
-inline VECTOR_CLASS<char *> cl::Program::getInfo<CL_PROGRAM_BINARIES>(cl_int* err) const
-{
- VECTOR_CLASS< ::size_t> sizes = getInfo<CL_PROGRAM_BINARY_SIZES>();
- VECTOR_CLASS<char *> binaries;
- for (VECTOR_CLASS< ::size_t>::iterator s = sizes.begin(); s != sizes.end(); ++s)
- {
- char *ptr = NULL;
- if (*s != 0)
- ptr = new char[*s];
- binaries.push_back(ptr);
- }
-
- cl_int result = getInfo(CL_PROGRAM_BINARIES, &binaries);
- if (err != NULL) {
- *err = result;
- }
- return binaries;
-}
-
-inline Kernel::Kernel(const Program& program, const char* name, cl_int* err)
-{
- cl_int error;
-
- object_ = ::clCreateKernel(program(), name, &error);
- detail::errHandler(error, __CREATE_KERNEL_ERR);
-
- if (err != NULL) {
- *err = error;
- }
-
-}
-
-/*! \class CommandQueue
- * \brief CommandQueue interface for cl_command_queue.
- */
-class CommandQueue : public detail::Wrapper<cl_command_queue>
-{
-private:
-#ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
- static std::atomic<int> default_initialized_;
-#else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
- static volatile int default_initialized_;
-#endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
- static CommandQueue default_;
- static volatile cl_int default_error_;
-public:
- CommandQueue(
- cl_command_queue_properties properties,
- cl_int* err = NULL)
- {
- cl_int error;
-
- Context context = Context::getDefault(&error);
- detail::errHandler(error, __CREATE_CONTEXT_ERR);
-
- if (error != CL_SUCCESS) {
- if (err != NULL) {
- *err = error;
- }
- }
- else {
- Device device = context.getInfo<CL_CONTEXT_DEVICES>()[0];
-
- object_ = ::clCreateCommandQueue(
- context(), device(), properties, &error);
-
- detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
- }
- /*!
- * \brief Constructs a CommandQueue for an implementation defined device in the given context
- */
- explicit CommandQueue(
- const Context& context,
- cl_command_queue_properties properties = 0,
- cl_int* err = NULL)
- {
- cl_int error;
- VECTOR_CLASS<cl::Device> devices;
- error = context.getInfo(CL_CONTEXT_DEVICES, &devices);
-
- detail::errHandler(error, __CREATE_CONTEXT_ERR);
-
- if (error != CL_SUCCESS)
- {
- if (err != NULL) {
- *err = error;
- }
- return;
- }
-
- object_ = ::clCreateCommandQueue(context(), devices[0](), properties, &error);
-
- detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
-
- if (err != NULL) {
- *err = error;
- }
-
- }
-
- CommandQueue(
- const Context& context,
- const Device& device,
- cl_command_queue_properties properties = 0,
- cl_int* err = NULL)
- {
- cl_int error;
- object_ = ::clCreateCommandQueue(
- context(), device(), properties, &error);
-
- detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-
- /*! \brief Copy constructor to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- CommandQueue(const CommandQueue& queue) : detail::Wrapper<cl_type>(queue) {}
-
- /*! \brief Copy assignment to forward copy to the superclass correctly.
- * Required for MSVC.
- */
- CommandQueue& operator = (const CommandQueue &queue)
- {
- detail::Wrapper<cl_type>::operator=(queue);
- return *this;
- }
-
-#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
- /*! \brief Move constructor to forward move to the superclass correctly.
- * Required for MSVC.
- */
- CommandQueue(CommandQueue&& queue) CL_HPP_NOEXCEPT : detail::Wrapper<cl_type>(std::move(queue)) {}
-
- /*! \brief Move assignment to forward move to the superclass correctly.
- * Required for MSVC.
- */
- CommandQueue& operator = (CommandQueue &&queue)
- {
- detail::Wrapper<cl_type>::operator=(std::move(queue));
- return *this;
- }
-#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
-
- static CommandQueue getDefault(cl_int * err = NULL)
- {
- int state = detail::compare_exchange(
- &default_initialized_,
- __DEFAULT_BEING_INITIALIZED, __DEFAULT_NOT_INITIALIZED);
-
- if (state & __DEFAULT_INITIALIZED) {
- if (err != NULL) {
- *err = default_error_;
- }
- return default_;
- }
-
- if (state & __DEFAULT_BEING_INITIALIZED) {
- // Assume writes will propagate eventually...
- while(default_initialized_ != __DEFAULT_INITIALIZED) {
- detail::fence();
- }
-
- if (err != NULL) {
- *err = default_error_;
- }
- return default_;
- }
-
- cl_int error;
-
- Context context = Context::getDefault(&error);
- detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
-
- if (error != CL_SUCCESS) {
- if (err != NULL) {
- *err = error;
- }
- }
- else {
- Device device = context.getInfo<CL_CONTEXT_DEVICES>()[0];
-
- default_ = CommandQueue(context, device, 0, &error);
-
- detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-
- detail::fence();
-
- default_error_ = error;
- // Assume writes will propagate eventually...
- default_initialized_ = __DEFAULT_INITIALIZED;
-
- detail::fence();
-
- if (err != NULL) {
- *err = default_error_;
- }
- return default_;
-
- }
-
- CommandQueue() { }
-
- __CL_EXPLICIT_CONSTRUCTORS CommandQueue(const cl_command_queue& commandQueue) : detail::Wrapper<cl_type>(commandQueue) { }
-
- CommandQueue& operator = (const cl_command_queue& rhs)
- {
- detail::Wrapper<cl_type>::operator=(rhs);
- return *this;
- }
-
- template <typename T>
- cl_int getInfo(cl_command_queue_info name, T* param) const
- {
- return detail::errHandler(
- detail::getInfo(
- &::clGetCommandQueueInfo, object_, name, param),
- __GET_COMMAND_QUEUE_INFO_ERR);
- }
-
- template <cl_int name> typename
- detail::param_traits<detail::cl_command_queue_info, name>::param_type
- getInfo(cl_int* err = NULL) const
- {
- typename detail::param_traits<
- detail::cl_command_queue_info, name>::param_type param;
- cl_int result = getInfo(name, &param);
- if (err != NULL) {
- *err = result;
- }
- return param;
- }
-
- cl_int enqueueReadBuffer(
- const Buffer& buffer,
- cl_bool blocking,
- ::size_t offset,
- ::size_t size,
- void* ptr,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL) const
- {
- cl_event tmp;
- cl_int err = detail::errHandler(
- ::clEnqueueReadBuffer(
- object_, buffer(), blocking, offset, size,
- ptr,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL),
- __ENQUEUE_READ_BUFFER_ERR);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
- }
-
- cl_int enqueueWriteBuffer(
- const Buffer& buffer,
- cl_bool blocking,
- ::size_t offset,
- ::size_t size,
- const void* ptr,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL) const
- {
- cl_event tmp;
- cl_int err = detail::errHandler(
- ::clEnqueueWriteBuffer(
- object_, buffer(), blocking, offset, size,
- ptr,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL),
- __ENQUEUE_WRITE_BUFFER_ERR);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
- }
-
- cl_int enqueueCopyBuffer(
- const Buffer& src,
- const Buffer& dst,
- ::size_t src_offset,
- ::size_t dst_offset,
- ::size_t size,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL) const
- {
- cl_event tmp;
- cl_int err = detail::errHandler(
- ::clEnqueueCopyBuffer(
- object_, src(), dst(), src_offset, dst_offset, size,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL),
- __ENQEUE_COPY_BUFFER_ERR);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
- }
-
- cl_int enqueueReadBufferRect(
- const Buffer& buffer,
- cl_bool blocking,
- const size_t<3>& buffer_offset,
- const size_t<3>& host_offset,
- const size_t<3>& region,
- ::size_t buffer_row_pitch,
- ::size_t buffer_slice_pitch,
- ::size_t host_row_pitch,
- ::size_t host_slice_pitch,
- void *ptr,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL) const
- {
- cl_event tmp;
- cl_int err = detail::errHandler(
- ::clEnqueueReadBufferRect(
- object_,
- buffer(),
- blocking,
- (const ::size_t *)buffer_offset,
- (const ::size_t *)host_offset,
- (const ::size_t *)region,
- buffer_row_pitch,
- buffer_slice_pitch,
- host_row_pitch,
- host_slice_pitch,
- ptr,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL),
- __ENQUEUE_READ_BUFFER_RECT_ERR);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
- }
-
- cl_int enqueueWriteBufferRect(
- const Buffer& buffer,
- cl_bool blocking,
- const size_t<3>& buffer_offset,
- const size_t<3>& host_offset,
- const size_t<3>& region,
- ::size_t buffer_row_pitch,
- ::size_t buffer_slice_pitch,
- ::size_t host_row_pitch,
- ::size_t host_slice_pitch,
- void *ptr,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL) const
- {
- cl_event tmp;
- cl_int err = detail::errHandler(
- ::clEnqueueWriteBufferRect(
- object_,
- buffer(),
- blocking,
- (const ::size_t *)buffer_offset,
- (const ::size_t *)host_offset,
- (const ::size_t *)region,
- buffer_row_pitch,
- buffer_slice_pitch,
- host_row_pitch,
- host_slice_pitch,
- ptr,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL),
- __ENQUEUE_WRITE_BUFFER_RECT_ERR);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
- }
-
- cl_int enqueueCopyBufferRect(
- const Buffer& src,
- const Buffer& dst,
- const size_t<3>& src_origin,
- const size_t<3>& dst_origin,
- const size_t<3>& region,
- ::size_t src_row_pitch,
- ::size_t src_slice_pitch,
- ::size_t dst_row_pitch,
- ::size_t dst_slice_pitch,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL) const
- {
- cl_event tmp;
- cl_int err = detail::errHandler(
- ::clEnqueueCopyBufferRect(
- object_,
- src(),
- dst(),
- (const ::size_t *)src_origin,
- (const ::size_t *)dst_origin,
- (const ::size_t *)region,
- src_row_pitch,
- src_slice_pitch,
- dst_row_pitch,
- dst_slice_pitch,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL),
- __ENQEUE_COPY_BUFFER_RECT_ERR);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
- }
-
-#if defined(CL_VERSION_1_2)
- /**
- * Enqueue a command to fill a buffer object with a pattern
- * of a given size. The pattern is specified a as vector.
- * \tparam PatternType The datatype of the pattern field.
- * The pattern type must be an accepted OpenCL data type.
- */
- template<typename PatternType>
- cl_int enqueueFillBuffer(
- const Buffer& buffer,
- PatternType pattern,
- ::size_t offset,
- ::size_t size,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL) const
- {
- cl_event tmp;
- cl_int err = detail::errHandler(
- ::clEnqueueFillBuffer(
- object_,
- buffer(),
- static_cast<void*>(&pattern),
- sizeof(PatternType),
- offset,
- size,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL),
- __ENQUEUE_FILL_BUFFER_ERR);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
- }
-#endif // #if defined(CL_VERSION_1_2)
-
- cl_int enqueueReadImage(
- const Image& image,
- cl_bool blocking,
- const size_t<3>& origin,
- const size_t<3>& region,
- ::size_t row_pitch,
- ::size_t slice_pitch,
- void* ptr,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL) const
- {
- cl_event tmp;
- cl_int err = detail::errHandler(
- ::clEnqueueReadImage(
- object_, image(), blocking, (const ::size_t *) origin,
- (const ::size_t *) region, row_pitch, slice_pitch, ptr,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL),
- __ENQUEUE_READ_IMAGE_ERR);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
- }
-
- cl_int enqueueWriteImage(
- const Image& image,
- cl_bool blocking,
- const size_t<3>& origin,
- const size_t<3>& region,
- ::size_t row_pitch,
- ::size_t slice_pitch,
- void* ptr,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL) const
- {
- cl_event tmp;
- cl_int err = detail::errHandler(
- ::clEnqueueWriteImage(
- object_, image(), blocking, (const ::size_t *) origin,
- (const ::size_t *) region, row_pitch, slice_pitch, ptr,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL),
- __ENQUEUE_WRITE_IMAGE_ERR);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
- }
-
- cl_int enqueueCopyImage(
- const Image& src,
- const Image& dst,
- const size_t<3>& src_origin,
- const size_t<3>& dst_origin,
- const size_t<3>& region,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL) const
- {
- cl_event tmp;
- cl_int err = detail::errHandler(
- ::clEnqueueCopyImage(
- object_, src(), dst(), (const ::size_t *) src_origin,
- (const ::size_t *)dst_origin, (const ::size_t *) region,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL),
- __ENQUEUE_COPY_IMAGE_ERR);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
- }
-
-#if defined(CL_VERSION_1_2)
- /**
- * Enqueue a command to fill an image object with a specified color.
- * \param fillColor is the color to use to fill the image.
- * This is a four component RGBA floating-point color value if
- * the image channel data type is not an unnormalized signed or
- * unsigned data type.
- */
- cl_int enqueueFillImage(
- const Image& image,
- cl_float4 fillColor,
- const size_t<3>& origin,
- const size_t<3>& region,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL) const
- {
- cl_event tmp;
- cl_int err = detail::errHandler(
- ::clEnqueueFillImage(
- object_,
- image(),
- static_cast<void*>(&fillColor),
- (const ::size_t *) origin,
- (const ::size_t *) region,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL),
- __ENQUEUE_FILL_IMAGE_ERR);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
- }
-
- /**
- * Enqueue a command to fill an image object with a specified color.
- * \param fillColor is the color to use to fill the image.
- * This is a four component RGBA signed integer color value if
- * the image channel data type is an unnormalized signed integer
- * type.
- */
- cl_int enqueueFillImage(
- const Image& image,
- cl_int4 fillColor,
- const size_t<3>& origin,
- const size_t<3>& region,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL) const
- {
- cl_event tmp;
- cl_int err = detail::errHandler(
- ::clEnqueueFillImage(
- object_,
- image(),
- static_cast<void*>(&fillColor),
- (const ::size_t *) origin,
- (const ::size_t *) region,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL),
- __ENQUEUE_FILL_IMAGE_ERR);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
- }
-
- /**
- * Enqueue a command to fill an image object with a specified color.
- * \param fillColor is the color to use to fill the image.
- * This is a four component RGBA unsigned integer color value if
- * the image channel data type is an unnormalized unsigned integer
- * type.
- */
- cl_int enqueueFillImage(
- const Image& image,
- cl_uint4 fillColor,
- const size_t<3>& origin,
- const size_t<3>& region,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL) const
- {
- cl_event tmp;
- cl_int err = detail::errHandler(
- ::clEnqueueFillImage(
- object_,
- image(),
- static_cast<void*>(&fillColor),
- (const ::size_t *) origin,
- (const ::size_t *) region,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL),
- __ENQUEUE_FILL_IMAGE_ERR);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
- }
-#endif // #if defined(CL_VERSION_1_2)
-
- cl_int enqueueCopyImageToBuffer(
- const Image& src,
- const Buffer& dst,
- const size_t<3>& src_origin,
- const size_t<3>& region,
- ::size_t dst_offset,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL) const
- {
- cl_event tmp;
- cl_int err = detail::errHandler(
- ::clEnqueueCopyImageToBuffer(
- object_, src(), dst(), (const ::size_t *) src_origin,
- (const ::size_t *) region, dst_offset,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL),
- __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
- }
-
- cl_int enqueueCopyBufferToImage(
- const Buffer& src,
- const Image& dst,
- ::size_t src_offset,
- const size_t<3>& dst_origin,
- const size_t<3>& region,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL) const
- {
- cl_event tmp;
- cl_int err = detail::errHandler(
- ::clEnqueueCopyBufferToImage(
- object_, src(), dst(), src_offset,
- (const ::size_t *) dst_origin, (const ::size_t *) region,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL),
- __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
- }
-
- void* enqueueMapBuffer(
- const Buffer& buffer,
- cl_bool blocking,
- cl_map_flags flags,
- ::size_t offset,
- ::size_t size,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL,
- cl_int* err = NULL) const
- {
- cl_event tmp;
- cl_int error;
- void * result = ::clEnqueueMapBuffer(
- object_, buffer(), blocking, flags, offset, size,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL,
- &error);
-
- detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);
- if (err != NULL) {
- *err = error;
- }
- if (event != NULL && error == CL_SUCCESS)
- *event = tmp;
-
- return result;
- }
-
- void* enqueueMapImage(
- const Image& buffer,
- cl_bool blocking,
- cl_map_flags flags,
- const size_t<3>& origin,
- const size_t<3>& region,
- ::size_t * row_pitch,
- ::size_t * slice_pitch,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL,
- cl_int* err = NULL) const
- {
- cl_event tmp;
- cl_int error;
- void * result = ::clEnqueueMapImage(
- object_, buffer(), blocking, flags,
- (const ::size_t *) origin, (const ::size_t *) region,
- row_pitch, slice_pitch,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL,
- &error);
-
- detail::errHandler(error, __ENQUEUE_MAP_IMAGE_ERR);
- if (err != NULL) {
- *err = error;
- }
- if (event != NULL && error == CL_SUCCESS)
- *event = tmp;
- return result;
- }
-
- cl_int enqueueUnmapMemObject(
- const Memory& memory,
- void* mapped_ptr,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL) const
- {
- cl_event tmp;
- cl_int err = detail::errHandler(
- ::clEnqueueUnmapMemObject(
- object_, memory(), mapped_ptr,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL),
- __ENQUEUE_UNMAP_MEM_OBJECT_ERR);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
- }
-
-#if defined(CL_VERSION_1_2)
- /**
- * Enqueues a marker command which waits for either a list of events to complete,
- * or all previously enqueued commands to complete.
- *
- * Enqueues a marker command which waits for either a list of events to complete,
- * or if the list is empty it waits for all commands previously enqueued in command_queue
- * to complete before it completes. This command returns an event which can be waited on,
- * i.e. this event can be waited on to insure that all events either in the event_wait_list
- * or all previously enqueued commands, queued before this command to command_queue,
- * have completed.
- */
- cl_int enqueueMarkerWithWaitList(
- const VECTOR_CLASS<Event> *events = 0,
- Event *event = 0)
- {
- cl_event tmp;
- cl_int err = detail::errHandler(
- ::clEnqueueMarkerWithWaitList(
- object_,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL),
- __ENQUEUE_MARKER_WAIT_LIST_ERR);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
- }
-
- /**
- * A synchronization point that enqueues a barrier operation.
- *
- * Enqueues a barrier command which waits for either a list of events to complete,
- * or if the list is empty it waits for all commands previously enqueued in command_queue
- * to complete before it completes. This command blocks command execution, that is, any
- * following commands enqueued after it do not execute until it completes. This command
- * returns an event which can be waited on, i.e. this event can be waited on to insure that
- * all events either in the event_wait_list or all previously enqueued commands, queued
- * before this command to command_queue, have completed.
- */
- cl_int enqueueBarrierWithWaitList(
- const VECTOR_CLASS<Event> *events = 0,
- Event *event = 0)
- {
- cl_event tmp;
- cl_int err = detail::errHandler(
- ::clEnqueueBarrierWithWaitList(
- object_,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL),
- __ENQUEUE_BARRIER_WAIT_LIST_ERR);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
- }
-
- /**
- * Enqueues a command to indicate with which device a set of memory objects
- * should be associated.
- */
- cl_int enqueueMigrateMemObjects(
- const VECTOR_CLASS<Memory> &memObjects,
- cl_mem_migration_flags flags,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL
- )
- {
- cl_event tmp;
-
- cl_mem* localMemObjects = static_cast<cl_mem*>(alloca(memObjects.size() * sizeof(cl_mem)));
- for( int i = 0; i < (int)memObjects.size(); ++i ) {
- localMemObjects[i] = memObjects[i]();
- }
-
-
- cl_int err = detail::errHandler(
- ::clEnqueueMigrateMemObjects(
- object_,
- (cl_uint)memObjects.size(),
- static_cast<const cl_mem*>(localMemObjects),
- flags,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL),
- __ENQUEUE_UNMAP_MEM_OBJECT_ERR);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
- }
-#endif // #if defined(CL_VERSION_1_2)
-
- cl_int enqueueNDRangeKernel(
- const Kernel& kernel,
- const NDRange& offset,
- const NDRange& global,
- const NDRange& local = NullRange,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL) const
- {
- cl_event tmp;
- cl_int err = detail::errHandler(
- ::clEnqueueNDRangeKernel(
- object_, kernel(), (cl_uint) global.dimensions(),
- offset.dimensions() != 0 ? (const ::size_t*) offset : NULL,
- (const ::size_t*) global,
- local.dimensions() != 0 ? (const ::size_t*) local : NULL,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL),
- __ENQUEUE_NDRANGE_KERNEL_ERR);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
- }
-
- cl_int enqueueTask(
- const Kernel& kernel,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL) const
- {
- cl_event tmp;
- cl_int err = detail::errHandler(
- ::clEnqueueTask(
- object_, kernel(),
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL),
- __ENQUEUE_TASK_ERR);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
- }
-
- cl_int enqueueNativeKernel(
- void (CL_CALLBACK *userFptr)(void *),
- std::pair<void*, ::size_t> args,
- const VECTOR_CLASS<Memory>* mem_objects = NULL,
- const VECTOR_CLASS<const void*>* mem_locs = NULL,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL) const
- {
- cl_mem * mems = (mem_objects != NULL && mem_objects->size() > 0)
- ? (cl_mem*) alloca(mem_objects->size() * sizeof(cl_mem))
- : NULL;
-
- if (mems != NULL) {
- for (unsigned int i = 0; i < mem_objects->size(); i++) {
- mems[i] = ((*mem_objects)[i])();
- }
- }
-
- cl_event tmp;
- cl_int err = detail::errHandler(
- ::clEnqueueNativeKernel(
- object_, userFptr, args.first, args.second,
- (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
- mems,
- (mem_locs != NULL && mem_locs->size() > 0) ? (const void **) &mem_locs->front() : NULL,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL),
- __ENQUEUE_NATIVE_KERNEL);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
- }
-
-/**
- * Deprecated APIs for 1.2
- */
-#if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))
- CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
- cl_int enqueueMarker(Event* event = NULL) const CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
- {
- cl_event tmp;
- cl_int err = detail::errHandler(
- ::clEnqueueMarker(
- object_,
- (event != NULL) ? &tmp : NULL),
- __ENQUEUE_MARKER_ERR);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
- }
-
- CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
- cl_int enqueueWaitForEvents(const VECTOR_CLASS<Event>& events) const CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
- {
- return detail::errHandler(
- ::clEnqueueWaitForEvents(
- object_,
- (cl_uint) events.size(),
- events.size() > 0 ? (const cl_event*) &events.front() : NULL),
- __ENQUEUE_WAIT_FOR_EVENTS_ERR);
- }
-#endif // #if defined(CL_VERSION_1_1)
-
- cl_int enqueueAcquireGLObjects(
- const VECTOR_CLASS<Memory>* mem_objects = NULL,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL) const
- {
- cl_event tmp;
- cl_int err = detail::errHandler(
- ::clEnqueueAcquireGLObjects(
- object_,
- (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
- (mem_objects != NULL && mem_objects->size() > 0) ? (const cl_mem *) &mem_objects->front(): NULL,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL),
- __ENQUEUE_ACQUIRE_GL_ERR);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
- }
-
- cl_int enqueueReleaseGLObjects(
- const VECTOR_CLASS<Memory>* mem_objects = NULL,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL) const
- {
- cl_event tmp;
- cl_int err = detail::errHandler(
- ::clEnqueueReleaseGLObjects(
- object_,
- (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
- (mem_objects != NULL && mem_objects->size() > 0) ? (const cl_mem *) &mem_objects->front(): NULL,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL),
- __ENQUEUE_RELEASE_GL_ERR);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
- }
-
-#if defined (USE_DX_INTEROP)
-typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueAcquireD3D10ObjectsKHR)(
- cl_command_queue command_queue, cl_uint num_objects,
- const cl_mem* mem_objects, cl_uint num_events_in_wait_list,
- const cl_event* event_wait_list, cl_event* event);
-typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueReleaseD3D10ObjectsKHR)(
- cl_command_queue command_queue, cl_uint num_objects,
- const cl_mem* mem_objects, cl_uint num_events_in_wait_list,
- const cl_event* event_wait_list, cl_event* event);
-
- cl_int enqueueAcquireD3D10Objects(
- const VECTOR_CLASS<Memory>* mem_objects = NULL,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL) const
- {
- static PFN_clEnqueueAcquireD3D10ObjectsKHR pfn_clEnqueueAcquireD3D10ObjectsKHR = NULL;
-#if defined(CL_VERSION_1_2)
- cl_context context = getInfo<CL_QUEUE_CONTEXT>();
- cl::Device device(getInfo<CL_QUEUE_DEVICE>());
- cl_platform_id platform = device.getInfo<CL_DEVICE_PLATFORM>();
- __INIT_CL_EXT_FCN_PTR_PLATFORM(platform, clEnqueueAcquireD3D10ObjectsKHR);
-#endif
-#if defined(CL_VERSION_1_1)
- __INIT_CL_EXT_FCN_PTR(clEnqueueAcquireD3D10ObjectsKHR);
-#endif
-
- cl_event tmp;
- cl_int err = detail::errHandler(
- pfn_clEnqueueAcquireD3D10ObjectsKHR(
- object_,
- (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
- (mem_objects != NULL && mem_objects->size() > 0) ? (const cl_mem *) &mem_objects->front(): NULL,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL),
- __ENQUEUE_ACQUIRE_GL_ERR);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
- }
-
- cl_int enqueueReleaseD3D10Objects(
- const VECTOR_CLASS<Memory>* mem_objects = NULL,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL) const
- {
- static PFN_clEnqueueReleaseD3D10ObjectsKHR pfn_clEnqueueReleaseD3D10ObjectsKHR = NULL;
-#if defined(CL_VERSION_1_2)
- cl_context context = getInfo<CL_QUEUE_CONTEXT>();
- cl::Device device(getInfo<CL_QUEUE_DEVICE>());
- cl_platform_id platform = device.getInfo<CL_DEVICE_PLATFORM>();
- __INIT_CL_EXT_FCN_PTR_PLATFORM(platform, clEnqueueReleaseD3D10ObjectsKHR);
-#endif // #if defined(CL_VERSION_1_2)
-#if defined(CL_VERSION_1_1)
- __INIT_CL_EXT_FCN_PTR(clEnqueueReleaseD3D10ObjectsKHR);
-#endif // #if defined(CL_VERSION_1_1)
-
- cl_event tmp;
- cl_int err = detail::errHandler(
- pfn_clEnqueueReleaseD3D10ObjectsKHR(
- object_,
- (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
- (mem_objects != NULL && mem_objects->size() > 0) ? (const cl_mem *) &mem_objects->front(): NULL,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL),
- __ENQUEUE_RELEASE_GL_ERR);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
- }
-#endif
-
-/**
- * Deprecated APIs for 1.2
- */
-#if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))
- CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
- cl_int enqueueBarrier() const CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
- {
- return detail::errHandler(
- ::clEnqueueBarrier(object_),
- __ENQUEUE_BARRIER_ERR);
- }
-#endif // #if defined(CL_VERSION_1_1)
-
- cl_int flush() const
- {
- return detail::errHandler(::clFlush(object_), __FLUSH_ERR);
- }
-
- cl_int finish() const
- {
- return detail::errHandler(::clFinish(object_), __FINISH_ERR);
- }
-};
-
-#ifdef _WIN32
-#ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
-__declspec(selectany) std::atomic<int> CommandQueue::default_initialized_;
-#else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
-__declspec(selectany) volatile int CommandQueue::default_initialized_ = __DEFAULT_NOT_INITIALIZED;
-#endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
-__declspec(selectany) CommandQueue CommandQueue::default_;
-__declspec(selectany) volatile cl_int CommandQueue::default_error_ = CL_SUCCESS;
-#else // !_WIN32
-#ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
-__attribute__((weak)) std::atomic<int> CommandQueue::default_initialized_;
-#else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
-__attribute__((weak)) volatile int CommandQueue::default_initialized_ = __DEFAULT_NOT_INITIALIZED;
-#endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
-__attribute__((weak)) CommandQueue CommandQueue::default_;
-__attribute__((weak)) volatile cl_int CommandQueue::default_error_ = CL_SUCCESS;
-#endif // !_WIN32
-
-template< typename IteratorType >
-Buffer::Buffer(
- const Context &context,
- IteratorType startIterator,
- IteratorType endIterator,
- bool readOnly,
- bool useHostPtr,
- cl_int* err)
-{
- typedef typename std::iterator_traits<IteratorType>::value_type DataType;
- cl_int error;
-
- cl_mem_flags flags = 0;
- if( readOnly ) {
- flags |= CL_MEM_READ_ONLY;
- }
- else {
- flags |= CL_MEM_READ_WRITE;
- }
- if( useHostPtr ) {
- flags |= CL_MEM_USE_HOST_PTR;
- }
-
- ::size_t size = sizeof(DataType)*(endIterator - startIterator);
-
- if( useHostPtr ) {
- object_ = ::clCreateBuffer(context(), flags, size, static_cast<DataType*>(&*startIterator), &error);
- } else {
- object_ = ::clCreateBuffer(context(), flags, size, 0, &error);
- }
-
- detail::errHandler(error, __CREATE_BUFFER_ERR);
- if (err != NULL) {
- *err = error;
- }
-
- if( !useHostPtr ) {
- CommandQueue queue(context, 0, &error);
- detail::errHandler(error, __CREATE_BUFFER_ERR);
- if (err != NULL) {
- *err = error;
- }
-
- error = cl::copy(queue, startIterator, endIterator, *this);
- detail::errHandler(error, __CREATE_BUFFER_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-}
-
-template< typename IteratorType >
-Buffer::Buffer(
- const CommandQueue &queue,
- IteratorType startIterator,
- IteratorType endIterator,
- bool readOnly,
- bool useHostPtr,
- cl_int* err)
-{
- typedef typename std::iterator_traits<IteratorType>::value_type DataType;
- cl_int error;
-
- cl_mem_flags flags = 0;
- if (readOnly) {
- flags |= CL_MEM_READ_ONLY;
- }
- else {
- flags |= CL_MEM_READ_WRITE;
- }
- if (useHostPtr) {
- flags |= CL_MEM_USE_HOST_PTR;
- }
-
- ::size_t size = sizeof(DataType)*(endIterator - startIterator);
-
- Context context = queue.getInfo<CL_QUEUE_CONTEXT>();
-
- if (useHostPtr) {
- object_ = ::clCreateBuffer(context(), flags, size, static_cast<DataType*>(&*startIterator), &error);
- }
- else {
- object_ = ::clCreateBuffer(context(), flags, size, 0, &error);
- }
-
- detail::errHandler(error, __CREATE_BUFFER_ERR);
- if (err != NULL) {
- *err = error;
- }
-
- if (!useHostPtr) {
- error = cl::copy(queue, startIterator, endIterator, *this);
- detail::errHandler(error, __CREATE_BUFFER_ERR);
- if (err != NULL) {
- *err = error;
- }
- }
-}
-
-inline cl_int enqueueReadBuffer(
- const Buffer& buffer,
- cl_bool blocking,
- ::size_t offset,
- ::size_t size,
- void* ptr,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL)
-{
- cl_int error;
- CommandQueue queue = CommandQueue::getDefault(&error);
-
- if (error != CL_SUCCESS) {
- return error;
- }
-
- return queue.enqueueReadBuffer(buffer, blocking, offset, size, ptr, events, event);
-}
-
-inline cl_int enqueueWriteBuffer(
- const Buffer& buffer,
- cl_bool blocking,
- ::size_t offset,
- ::size_t size,
- const void* ptr,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL)
-{
- cl_int error;
- CommandQueue queue = CommandQueue::getDefault(&error);
-
- if (error != CL_SUCCESS) {
- return error;
- }
-
- return queue.enqueueWriteBuffer(buffer, blocking, offset, size, ptr, events, event);
-}
-
-inline void* enqueueMapBuffer(
- const Buffer& buffer,
- cl_bool blocking,
- cl_map_flags flags,
- ::size_t offset,
- ::size_t size,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL,
- cl_int* err = NULL)
-{
- cl_int error;
- CommandQueue queue = CommandQueue::getDefault(&error);
- detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);
- if (err != NULL) {
- *err = error;
- }
-
- void * result = ::clEnqueueMapBuffer(
- queue(), buffer(), blocking, flags, offset, size,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (cl_event*) event,
- &error);
-
- detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);
- if (err != NULL) {
- *err = error;
- }
- return result;
-}
-
-inline cl_int enqueueUnmapMemObject(
- const Memory& memory,
- void* mapped_ptr,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL)
-{
- cl_int error;
- CommandQueue queue = CommandQueue::getDefault(&error);
- detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);
- if (error != CL_SUCCESS) {
- return error;
- }
-
- cl_event tmp;
- cl_int err = detail::errHandler(
- ::clEnqueueUnmapMemObject(
- queue(), memory(), mapped_ptr,
- (events != NULL) ? (cl_uint) events->size() : 0,
- (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
- (event != NULL) ? &tmp : NULL),
- __ENQUEUE_UNMAP_MEM_OBJECT_ERR);
-
- if (event != NULL && err == CL_SUCCESS)
- *event = tmp;
-
- return err;
-}
-
-inline cl_int enqueueCopyBuffer(
- const Buffer& src,
- const Buffer& dst,
- ::size_t src_offset,
- ::size_t dst_offset,
- ::size_t size,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL)
-{
- cl_int error;
- CommandQueue queue = CommandQueue::getDefault(&error);
-
- if (error != CL_SUCCESS) {
- return error;
- }
-
- return queue.enqueueCopyBuffer(src, dst, src_offset, dst_offset, size, events, event);
-}
-
-/**
- * Blocking copy operation between iterators and a buffer.
- * Host to Device.
- * Uses default command queue.
- */
-template< typename IteratorType >
-inline cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer )
-{
- cl_int error;
- CommandQueue queue = CommandQueue::getDefault(&error);
- if (error != CL_SUCCESS)
- return error;
-
- return cl::copy(queue, startIterator, endIterator, buffer);
-}
-
-/**
- * Blocking copy operation between iterators and a buffer.
- * Device to Host.
- * Uses default command queue.
- */
-template< typename IteratorType >
-inline cl_int copy( const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator )
-{
- cl_int error;
- CommandQueue queue = CommandQueue::getDefault(&error);
- if (error != CL_SUCCESS)
- return error;
-
- return cl::copy(queue, buffer, startIterator, endIterator);
-}
-
-/**
- * Blocking copy operation between iterators and a buffer.
- * Host to Device.
- * Uses specified queue.
- */
-template< typename IteratorType >
-inline cl_int copy( const CommandQueue &queue, IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer )
-{
- typedef typename std::iterator_traits<IteratorType>::value_type DataType;
- cl_int error;
-
- ::size_t length = endIterator-startIterator;
- ::size_t byteLength = length*sizeof(DataType);
-
- DataType *pointer =
- static_cast<DataType*>(queue.enqueueMapBuffer(buffer, CL_TRUE, CL_MAP_WRITE, 0, byteLength, 0, 0, &error));
- // if exceptions enabled, enqueueMapBuffer will throw
- if( error != CL_SUCCESS ) {
- return error;
- }
-#if defined(_MSC_VER)
- std::copy(
- startIterator,
- endIterator,
- stdext::checked_array_iterator<DataType*>(
- pointer, length));
-#else
- std::copy(startIterator, endIterator, pointer);
-#endif
- Event endEvent;
- error = queue.enqueueUnmapMemObject(buffer, pointer, 0, &endEvent);
- // if exceptions enabled, enqueueUnmapMemObject will throw
- if( error != CL_SUCCESS ) {
- return error;
- }
- endEvent.wait();
- return CL_SUCCESS;
-}
-
-/**
- * Blocking copy operation between iterators and a buffer.
- * Device to Host.
- * Uses specified queue.
- */
-template< typename IteratorType >
-inline cl_int copy( const CommandQueue &queue, const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator )
-{
- typedef typename std::iterator_traits<IteratorType>::value_type DataType;
- cl_int error;
-
- ::size_t length = endIterator-startIterator;
- ::size_t byteLength = length*sizeof(DataType);
-
- DataType *pointer =
- static_cast<DataType*>(queue.enqueueMapBuffer(buffer, CL_TRUE, CL_MAP_READ, 0, byteLength, 0, 0, &error));
- // if exceptions enabled, enqueueMapBuffer will throw
- if( error != CL_SUCCESS ) {
- return error;
- }
- std::copy(pointer, pointer + length, startIterator);
- Event endEvent;
- error = queue.enqueueUnmapMemObject(buffer, pointer, 0, &endEvent);
- // if exceptions enabled, enqueueUnmapMemObject will throw
- if( error != CL_SUCCESS ) {
- return error;
- }
- endEvent.wait();
- return CL_SUCCESS;
-}
-
-#if defined(CL_VERSION_1_1)
-inline cl_int enqueueReadBufferRect(
- const Buffer& buffer,
- cl_bool blocking,
- const size_t<3>& buffer_offset,
- const size_t<3>& host_offset,
- const size_t<3>& region,
- ::size_t buffer_row_pitch,
- ::size_t buffer_slice_pitch,
- ::size_t host_row_pitch,
- ::size_t host_slice_pitch,
- void *ptr,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL)
-{
- cl_int error;
- CommandQueue queue = CommandQueue::getDefault(&error);
-
- if (error != CL_SUCCESS) {
- return error;
- }
-
- return queue.enqueueReadBufferRect(
- buffer,
- blocking,
- buffer_offset,
- host_offset,
- region,
- buffer_row_pitch,
- buffer_slice_pitch,
- host_row_pitch,
- host_slice_pitch,
- ptr,
- events,
- event);
-}
-
-inline cl_int enqueueWriteBufferRect(
- const Buffer& buffer,
- cl_bool blocking,
- const size_t<3>& buffer_offset,
- const size_t<3>& host_offset,
- const size_t<3>& region,
- ::size_t buffer_row_pitch,
- ::size_t buffer_slice_pitch,
- ::size_t host_row_pitch,
- ::size_t host_slice_pitch,
- void *ptr,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL)
-{
- cl_int error;
- CommandQueue queue = CommandQueue::getDefault(&error);
-
- if (error != CL_SUCCESS) {
- return error;
- }
-
- return queue.enqueueWriteBufferRect(
- buffer,
- blocking,
- buffer_offset,
- host_offset,
- region,
- buffer_row_pitch,
- buffer_slice_pitch,
- host_row_pitch,
- host_slice_pitch,
- ptr,
- events,
- event);
-}
-
-inline cl_int enqueueCopyBufferRect(
- const Buffer& src,
- const Buffer& dst,
- const size_t<3>& src_origin,
- const size_t<3>& dst_origin,
- const size_t<3>& region,
- ::size_t src_row_pitch,
- ::size_t src_slice_pitch,
- ::size_t dst_row_pitch,
- ::size_t dst_slice_pitch,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL)
-{
- cl_int error;
- CommandQueue queue = CommandQueue::getDefault(&error);
-
- if (error != CL_SUCCESS) {
- return error;
- }
-
- return queue.enqueueCopyBufferRect(
- src,
- dst,
- src_origin,
- dst_origin,
- region,
- src_row_pitch,
- src_slice_pitch,
- dst_row_pitch,
- dst_slice_pitch,
- events,
- event);
-}
-#endif
-
-inline cl_int enqueueReadImage(
- const Image& image,
- cl_bool blocking,
- const size_t<3>& origin,
- const size_t<3>& region,
- ::size_t row_pitch,
- ::size_t slice_pitch,
- void* ptr,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL)
-{
- cl_int error;
- CommandQueue queue = CommandQueue::getDefault(&error);
-
- if (error != CL_SUCCESS) {
- return error;
- }
-
- return queue.enqueueReadImage(
- image,
- blocking,
- origin,
- region,
- row_pitch,
- slice_pitch,
- ptr,
- events,
- event);
-}
-
-inline cl_int enqueueWriteImage(
- const Image& image,
- cl_bool blocking,
- const size_t<3>& origin,
- const size_t<3>& region,
- ::size_t row_pitch,
- ::size_t slice_pitch,
- void* ptr,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL)
-{
- cl_int error;
- CommandQueue queue = CommandQueue::getDefault(&error);
-
- if (error != CL_SUCCESS) {
- return error;
- }
-
- return queue.enqueueWriteImage(
- image,
- blocking,
- origin,
- region,
- row_pitch,
- slice_pitch,
- ptr,
- events,
- event);
-}
-
-inline cl_int enqueueCopyImage(
- const Image& src,
- const Image& dst,
- const size_t<3>& src_origin,
- const size_t<3>& dst_origin,
- const size_t<3>& region,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL)
-{
- cl_int error;
- CommandQueue queue = CommandQueue::getDefault(&error);
-
- if (error != CL_SUCCESS) {
- return error;
- }
-
- return queue.enqueueCopyImage(
- src,
- dst,
- src_origin,
- dst_origin,
- region,
- events,
- event);
-}
-
-inline cl_int enqueueCopyImageToBuffer(
- const Image& src,
- const Buffer& dst,
- const size_t<3>& src_origin,
- const size_t<3>& region,
- ::size_t dst_offset,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL)
-{
- cl_int error;
- CommandQueue queue = CommandQueue::getDefault(&error);
-
- if (error != CL_SUCCESS) {
- return error;
- }
-
- return queue.enqueueCopyImageToBuffer(
- src,
- dst,
- src_origin,
- region,
- dst_offset,
- events,
- event);
-}
-
-inline cl_int enqueueCopyBufferToImage(
- const Buffer& src,
- const Image& dst,
- ::size_t src_offset,
- const size_t<3>& dst_origin,
- const size_t<3>& region,
- const VECTOR_CLASS<Event>* events = NULL,
- Event* event = NULL)
-{
- cl_int error;
- CommandQueue queue = CommandQueue::getDefault(&error);
-
- if (error != CL_SUCCESS) {
- return error;
- }
-
- return queue.enqueueCopyBufferToImage(
- src,
- dst,
- src_offset,
- dst_origin,
- region,
- events,
- event);
-}
-
-
-inline cl_int flush(void)
-{
- cl_int error;
- CommandQueue queue = CommandQueue::getDefault(&error);
-
- if (error != CL_SUCCESS) {
- return error;
- }
-
- return queue.flush();
-}
-
-inline cl_int finish(void)
-{
- cl_int error;
- CommandQueue queue = CommandQueue::getDefault(&error);
-
- if (error != CL_SUCCESS) {
- return error;
- }
-
-
- return queue.finish();
-}
-
-// Kernel Functor support
-// New interface as of September 2011
-// Requires the C++11 std::tr1::function (note do not support TR1)
-// Visual Studio 2010 and GCC 4.2
-
-struct EnqueueArgs
-{
- CommandQueue queue_;
- const NDRange offset_;
- const NDRange global_;
- const NDRange local_;
- VECTOR_CLASS<Event> events_;
-
- EnqueueArgs(NDRange global) :
- queue_(CommandQueue::getDefault()),
- offset_(NullRange),
- global_(global),
- local_(NullRange)
- {
-
- }
-
- EnqueueArgs(NDRange global, NDRange local) :
- queue_(CommandQueue::getDefault()),
- offset_(NullRange),
- global_(global),
- local_(local)
- {
-
- }
-
- EnqueueArgs(NDRange offset, NDRange global, NDRange local) :
- queue_(CommandQueue::getDefault()),
- offset_(offset),
- global_(global),
- local_(local)
- {
-
- }
-
- EnqueueArgs(Event e, NDRange global) :
- queue_(CommandQueue::getDefault()),
- offset_(NullRange),
- global_(global),
- local_(NullRange)
- {
- events_.push_back(e);
- }
-
- EnqueueArgs(Event e, NDRange global, NDRange local) :
- queue_(CommandQueue::getDefault()),
- offset_(NullRange),
- global_(global),
- local_(local)
- {
- events_.push_back(e);
- }
-
- EnqueueArgs(Event e, NDRange offset, NDRange global, NDRange local) :
- queue_(CommandQueue::getDefault()),
- offset_(offset),
- global_(global),
- local_(local)
- {
- events_.push_back(e);
- }
-
- EnqueueArgs(const VECTOR_CLASS<Event> &events, NDRange global) :
- queue_(CommandQueue::getDefault()),
- offset_(NullRange),
- global_(global),
- local_(NullRange),
- events_(events)
- {
-
- }
-
- EnqueueArgs(const VECTOR_CLASS<Event> &events, NDRange global, NDRange local) :
- queue_(CommandQueue::getDefault()),
- offset_(NullRange),
- global_(global),
- local_(local),
- events_(events)
- {
-
- }
-
- EnqueueArgs(const VECTOR_CLASS<Event> &events, NDRange offset, NDRange global, NDRange local) :
- queue_(CommandQueue::getDefault()),
- offset_(offset),
- global_(global),
- local_(local),
- events_(events)
- {
-
- }
-
- EnqueueArgs(CommandQueue &queue, NDRange global) :
- queue_(queue),
- offset_(NullRange),
- global_(global),
- local_(NullRange)
- {
-
- }
-
- EnqueueArgs(CommandQueue &queue, NDRange global, NDRange local) :
- queue_(queue),
- offset_(NullRange),
- global_(global),
- local_(local)
- {
-
- }
-
- EnqueueArgs(CommandQueue &queue, NDRange offset, NDRange global, NDRange local) :
- queue_(queue),
- offset_(offset),
- global_(global),
- local_(local)
- {
-
- }
-
- EnqueueArgs(CommandQueue &queue, Event e, NDRange global) :
- queue_(queue),
- offset_(NullRange),
- global_(global),
- local_(NullRange)
- {
- events_.push_back(e);
- }
-
- EnqueueArgs(CommandQueue &queue, Event e, NDRange global, NDRange local) :
- queue_(queue),
- offset_(NullRange),
- global_(global),
- local_(local)
- {
- events_.push_back(e);
- }
-
- EnqueueArgs(CommandQueue &queue, Event e, NDRange offset, NDRange global, NDRange local) :
- queue_(queue),
- offset_(offset),
- global_(global),
- local_(local)
- {
- events_.push_back(e);
- }
-
- EnqueueArgs(CommandQueue &queue, const VECTOR_CLASS<Event> &events, NDRange global) :
- queue_(queue),
- offset_(NullRange),
- global_(global),
- local_(NullRange),
- events_(events)
- {
-
- }
-
- EnqueueArgs(CommandQueue &queue, const VECTOR_CLASS<Event> &events, NDRange global, NDRange local) :
- queue_(queue),
- offset_(NullRange),
- global_(global),
- local_(local),
- events_(events)
- {
-
- }
-
- EnqueueArgs(CommandQueue &queue, const VECTOR_CLASS<Event> &events, NDRange offset, NDRange global, NDRange local) :
- queue_(queue),
- offset_(offset),
- global_(global),
- local_(local),
- events_(events)
- {
-
- }
-};
-
-namespace detail {
-
-class NullType {};
-
-template<int index, typename T0>
-struct SetArg
-{
- static void set (Kernel kernel, T0 arg)
- {
- kernel.setArg(index, arg);
- }
-};
-
-template<int index>
-struct SetArg<index, NullType>
-{
- static void set (Kernel, NullType)
- {
- }
-};
-
-template <
- typename T0, typename T1, typename T2, typename T3,
- typename T4, typename T5, typename T6, typename T7,
- typename T8, typename T9, typename T10, typename T11,
- typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19,
- typename T20, typename T21, typename T22, typename T23,
- typename T24, typename T25, typename T26, typename T27,
- typename T28, typename T29, typename T30, typename T31
->
-class KernelFunctorGlobal
-{
-private:
- Kernel kernel_;
-
-public:
- KernelFunctorGlobal(
- Kernel kernel) :
- kernel_(kernel)
- {}
-
- KernelFunctorGlobal(
- const Program& program,
- const STRING_CLASS name,
- cl_int * err = NULL) :
- kernel_(program, name.c_str(), err)
- {}
-
- Event operator() (
- const EnqueueArgs& args,
- T0 t0,
- T1 t1 = NullType(),
- T2 t2 = NullType(),
- T3 t3 = NullType(),
- T4 t4 = NullType(),
- T5 t5 = NullType(),
- T6 t6 = NullType(),
- T7 t7 = NullType(),
- T8 t8 = NullType(),
- T9 t9 = NullType(),
- T10 t10 = NullType(),
- T11 t11 = NullType(),
- T12 t12 = NullType(),
- T13 t13 = NullType(),
- T14 t14 = NullType(),
- T15 t15 = NullType(),
- T16 t16 = NullType(),
- T17 t17 = NullType(),
- T18 t18 = NullType(),
- T19 t19 = NullType(),
- T20 t20 = NullType(),
- T21 t21 = NullType(),
- T22 t22 = NullType(),
- T23 t23 = NullType(),
- T24 t24 = NullType(),
- T25 t25 = NullType(),
- T26 t26 = NullType(),
- T27 t27 = NullType(),
- T28 t28 = NullType(),
- T29 t29 = NullType(),
- T30 t30 = NullType(),
- T31 t31 = NullType()
- )
- {
- Event event;
- SetArg<0, T0>::set(kernel_, t0);
- SetArg<1, T1>::set(kernel_, t1);
- SetArg<2, T2>::set(kernel_, t2);
- SetArg<3, T3>::set(kernel_, t3);
- SetArg<4, T4>::set(kernel_, t4);
- SetArg<5, T5>::set(kernel_, t5);
- SetArg<6, T6>::set(kernel_, t6);
- SetArg<7, T7>::set(kernel_, t7);
- SetArg<8, T8>::set(kernel_, t8);
- SetArg<9, T9>::set(kernel_, t9);
- SetArg<10, T10>::set(kernel_, t10);
- SetArg<11, T11>::set(kernel_, t11);
- SetArg<12, T12>::set(kernel_, t12);
- SetArg<13, T13>::set(kernel_, t13);
- SetArg<14, T14>::set(kernel_, t14);
- SetArg<15, T15>::set(kernel_, t15);
- SetArg<16, T16>::set(kernel_, t16);
- SetArg<17, T17>::set(kernel_, t17);
- SetArg<18, T18>::set(kernel_, t18);
- SetArg<19, T19>::set(kernel_, t19);
- SetArg<20, T20>::set(kernel_, t20);
- SetArg<21, T21>::set(kernel_, t21);
- SetArg<22, T22>::set(kernel_, t22);
- SetArg<23, T23>::set(kernel_, t23);
- SetArg<24, T24>::set(kernel_, t24);
- SetArg<25, T25>::set(kernel_, t25);
- SetArg<26, T26>::set(kernel_, t26);
- SetArg<27, T27>::set(kernel_, t27);
- SetArg<28, T28>::set(kernel_, t28);
- SetArg<29, T29>::set(kernel_, t29);
- SetArg<30, T30>::set(kernel_, t30);
- SetArg<31, T31>::set(kernel_, t31);
-
- args.queue_.enqueueNDRangeKernel(
- kernel_,
- args.offset_,
- args.global_,
- args.local_,
- &args.events_,
- &event);
-
- return event;
- }
-
-};
-
-//------------------------------------------------------------------------------------------------------
-
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5,
- typename T6,
- typename T7,
- typename T8,
- typename T9,
- typename T10,
- typename T11,
- typename T12,
- typename T13,
- typename T14,
- typename T15,
- typename T16,
- typename T17,
- typename T18,
- typename T19,
- typename T20,
- typename T21,
- typename T22,
- typename T23,
- typename T24,
- typename T25,
- typename T26,
- typename T27,
- typename T28,
- typename T29,
- typename T30,
- typename T31>
-struct functionImplementation_
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- T23,
- T24,
- T25,
- T26,
- T27,
- T28,
- T29,
- T30,
- T31> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 32))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- T23,
- T24,
- T25,
- T26,
- T27,
- T28,
- T29,
- T30,
- T31);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4,
- T5 arg5,
- T6 arg6,
- T7 arg7,
- T8 arg8,
- T9 arg9,
- T10 arg10,
- T11 arg11,
- T12 arg12,
- T13 arg13,
- T14 arg14,
- T15 arg15,
- T16 arg16,
- T17 arg17,
- T18 arg18,
- T19 arg19,
- T20 arg20,
- T21 arg21,
- T22 arg22,
- T23 arg23,
- T24 arg24,
- T25 arg25,
- T26 arg26,
- T27 arg27,
- T28 arg28,
- T29 arg29,
- T30 arg30,
- T31 arg31)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5,
- arg6,
- arg7,
- arg8,
- arg9,
- arg10,
- arg11,
- arg12,
- arg13,
- arg14,
- arg15,
- arg16,
- arg17,
- arg18,
- arg19,
- arg20,
- arg21,
- arg22,
- arg23,
- arg24,
- arg25,
- arg26,
- arg27,
- arg28,
- arg29,
- arg30,
- arg31);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5,
- typename T6,
- typename T7,
- typename T8,
- typename T9,
- typename T10,
- typename T11,
- typename T12,
- typename T13,
- typename T14,
- typename T15,
- typename T16,
- typename T17,
- typename T18,
- typename T19,
- typename T20,
- typename T21,
- typename T22,
- typename T23,
- typename T24,
- typename T25,
- typename T26,
- typename T27,
- typename T28,
- typename T29,
- typename T30>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- T23,
- T24,
- T25,
- T26,
- T27,
- T28,
- T29,
- T30,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- T23,
- T24,
- T25,
- T26,
- T27,
- T28,
- T29,
- T30,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 31))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- T23,
- T24,
- T25,
- T26,
- T27,
- T28,
- T29,
- T30);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4,
- T5 arg5,
- T6 arg6,
- T7 arg7,
- T8 arg8,
- T9 arg9,
- T10 arg10,
- T11 arg11,
- T12 arg12,
- T13 arg13,
- T14 arg14,
- T15 arg15,
- T16 arg16,
- T17 arg17,
- T18 arg18,
- T19 arg19,
- T20 arg20,
- T21 arg21,
- T22 arg22,
- T23 arg23,
- T24 arg24,
- T25 arg25,
- T26 arg26,
- T27 arg27,
- T28 arg28,
- T29 arg29,
- T30 arg30)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5,
- arg6,
- arg7,
- arg8,
- arg9,
- arg10,
- arg11,
- arg12,
- arg13,
- arg14,
- arg15,
- arg16,
- arg17,
- arg18,
- arg19,
- arg20,
- arg21,
- arg22,
- arg23,
- arg24,
- arg25,
- arg26,
- arg27,
- arg28,
- arg29,
- arg30);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5,
- typename T6,
- typename T7,
- typename T8,
- typename T9,
- typename T10,
- typename T11,
- typename T12,
- typename T13,
- typename T14,
- typename T15,
- typename T16,
- typename T17,
- typename T18,
- typename T19,
- typename T20,
- typename T21,
- typename T22,
- typename T23,
- typename T24,
- typename T25,
- typename T26,
- typename T27,
- typename T28,
- typename T29>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- T23,
- T24,
- T25,
- T26,
- T27,
- T28,
- T29,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- T23,
- T24,
- T25,
- T26,
- T27,
- T28,
- T29,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 30))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- T23,
- T24,
- T25,
- T26,
- T27,
- T28,
- T29);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4,
- T5 arg5,
- T6 arg6,
- T7 arg7,
- T8 arg8,
- T9 arg9,
- T10 arg10,
- T11 arg11,
- T12 arg12,
- T13 arg13,
- T14 arg14,
- T15 arg15,
- T16 arg16,
- T17 arg17,
- T18 arg18,
- T19 arg19,
- T20 arg20,
- T21 arg21,
- T22 arg22,
- T23 arg23,
- T24 arg24,
- T25 arg25,
- T26 arg26,
- T27 arg27,
- T28 arg28,
- T29 arg29)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5,
- arg6,
- arg7,
- arg8,
- arg9,
- arg10,
- arg11,
- arg12,
- arg13,
- arg14,
- arg15,
- arg16,
- arg17,
- arg18,
- arg19,
- arg20,
- arg21,
- arg22,
- arg23,
- arg24,
- arg25,
- arg26,
- arg27,
- arg28,
- arg29);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5,
- typename T6,
- typename T7,
- typename T8,
- typename T9,
- typename T10,
- typename T11,
- typename T12,
- typename T13,
- typename T14,
- typename T15,
- typename T16,
- typename T17,
- typename T18,
- typename T19,
- typename T20,
- typename T21,
- typename T22,
- typename T23,
- typename T24,
- typename T25,
- typename T26,
- typename T27,
- typename T28>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- T23,
- T24,
- T25,
- T26,
- T27,
- T28,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- T23,
- T24,
- T25,
- T26,
- T27,
- T28,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 29))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- T23,
- T24,
- T25,
- T26,
- T27,
- T28);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4,
- T5 arg5,
- T6 arg6,
- T7 arg7,
- T8 arg8,
- T9 arg9,
- T10 arg10,
- T11 arg11,
- T12 arg12,
- T13 arg13,
- T14 arg14,
- T15 arg15,
- T16 arg16,
- T17 arg17,
- T18 arg18,
- T19 arg19,
- T20 arg20,
- T21 arg21,
- T22 arg22,
- T23 arg23,
- T24 arg24,
- T25 arg25,
- T26 arg26,
- T27 arg27,
- T28 arg28)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5,
- arg6,
- arg7,
- arg8,
- arg9,
- arg10,
- arg11,
- arg12,
- arg13,
- arg14,
- arg15,
- arg16,
- arg17,
- arg18,
- arg19,
- arg20,
- arg21,
- arg22,
- arg23,
- arg24,
- arg25,
- arg26,
- arg27,
- arg28);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5,
- typename T6,
- typename T7,
- typename T8,
- typename T9,
- typename T10,
- typename T11,
- typename T12,
- typename T13,
- typename T14,
- typename T15,
- typename T16,
- typename T17,
- typename T18,
- typename T19,
- typename T20,
- typename T21,
- typename T22,
- typename T23,
- typename T24,
- typename T25,
- typename T26,
- typename T27>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- T23,
- T24,
- T25,
- T26,
- T27,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- T23,
- T24,
- T25,
- T26,
- T27,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 28))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- T23,
- T24,
- T25,
- T26,
- T27);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4,
- T5 arg5,
- T6 arg6,
- T7 arg7,
- T8 arg8,
- T9 arg9,
- T10 arg10,
- T11 arg11,
- T12 arg12,
- T13 arg13,
- T14 arg14,
- T15 arg15,
- T16 arg16,
- T17 arg17,
- T18 arg18,
- T19 arg19,
- T20 arg20,
- T21 arg21,
- T22 arg22,
- T23 arg23,
- T24 arg24,
- T25 arg25,
- T26 arg26,
- T27 arg27)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5,
- arg6,
- arg7,
- arg8,
- arg9,
- arg10,
- arg11,
- arg12,
- arg13,
- arg14,
- arg15,
- arg16,
- arg17,
- arg18,
- arg19,
- arg20,
- arg21,
- arg22,
- arg23,
- arg24,
- arg25,
- arg26,
- arg27);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5,
- typename T6,
- typename T7,
- typename T8,
- typename T9,
- typename T10,
- typename T11,
- typename T12,
- typename T13,
- typename T14,
- typename T15,
- typename T16,
- typename T17,
- typename T18,
- typename T19,
- typename T20,
- typename T21,
- typename T22,
- typename T23,
- typename T24,
- typename T25,
- typename T26>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- T23,
- T24,
- T25,
- T26,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- T23,
- T24,
- T25,
- T26,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 27))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- T23,
- T24,
- T25,
- T26);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4,
- T5 arg5,
- T6 arg6,
- T7 arg7,
- T8 arg8,
- T9 arg9,
- T10 arg10,
- T11 arg11,
- T12 arg12,
- T13 arg13,
- T14 arg14,
- T15 arg15,
- T16 arg16,
- T17 arg17,
- T18 arg18,
- T19 arg19,
- T20 arg20,
- T21 arg21,
- T22 arg22,
- T23 arg23,
- T24 arg24,
- T25 arg25,
- T26 arg26)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5,
- arg6,
- arg7,
- arg8,
- arg9,
- arg10,
- arg11,
- arg12,
- arg13,
- arg14,
- arg15,
- arg16,
- arg17,
- arg18,
- arg19,
- arg20,
- arg21,
- arg22,
- arg23,
- arg24,
- arg25,
- arg26);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5,
- typename T6,
- typename T7,
- typename T8,
- typename T9,
- typename T10,
- typename T11,
- typename T12,
- typename T13,
- typename T14,
- typename T15,
- typename T16,
- typename T17,
- typename T18,
- typename T19,
- typename T20,
- typename T21,
- typename T22,
- typename T23,
- typename T24,
- typename T25>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- T23,
- T24,
- T25,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- T23,
- T24,
- T25,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 26))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- T23,
- T24,
- T25);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4,
- T5 arg5,
- T6 arg6,
- T7 arg7,
- T8 arg8,
- T9 arg9,
- T10 arg10,
- T11 arg11,
- T12 arg12,
- T13 arg13,
- T14 arg14,
- T15 arg15,
- T16 arg16,
- T17 arg17,
- T18 arg18,
- T19 arg19,
- T20 arg20,
- T21 arg21,
- T22 arg22,
- T23 arg23,
- T24 arg24,
- T25 arg25)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5,
- arg6,
- arg7,
- arg8,
- arg9,
- arg10,
- arg11,
- arg12,
- arg13,
- arg14,
- arg15,
- arg16,
- arg17,
- arg18,
- arg19,
- arg20,
- arg21,
- arg22,
- arg23,
- arg24,
- arg25);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5,
- typename T6,
- typename T7,
- typename T8,
- typename T9,
- typename T10,
- typename T11,
- typename T12,
- typename T13,
- typename T14,
- typename T15,
- typename T16,
- typename T17,
- typename T18,
- typename T19,
- typename T20,
- typename T21,
- typename T22,
- typename T23,
- typename T24>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- T23,
- T24,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- T23,
- T24,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 25))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- T23,
- T24);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4,
- T5 arg5,
- T6 arg6,
- T7 arg7,
- T8 arg8,
- T9 arg9,
- T10 arg10,
- T11 arg11,
- T12 arg12,
- T13 arg13,
- T14 arg14,
- T15 arg15,
- T16 arg16,
- T17 arg17,
- T18 arg18,
- T19 arg19,
- T20 arg20,
- T21 arg21,
- T22 arg22,
- T23 arg23,
- T24 arg24)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5,
- arg6,
- arg7,
- arg8,
- arg9,
- arg10,
- arg11,
- arg12,
- arg13,
- arg14,
- arg15,
- arg16,
- arg17,
- arg18,
- arg19,
- arg20,
- arg21,
- arg22,
- arg23,
- arg24);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5,
- typename T6,
- typename T7,
- typename T8,
- typename T9,
- typename T10,
- typename T11,
- typename T12,
- typename T13,
- typename T14,
- typename T15,
- typename T16,
- typename T17,
- typename T18,
- typename T19,
- typename T20,
- typename T21,
- typename T22,
- typename T23>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- T23,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- T23,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 24))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- T23);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4,
- T5 arg5,
- T6 arg6,
- T7 arg7,
- T8 arg8,
- T9 arg9,
- T10 arg10,
- T11 arg11,
- T12 arg12,
- T13 arg13,
- T14 arg14,
- T15 arg15,
- T16 arg16,
- T17 arg17,
- T18 arg18,
- T19 arg19,
- T20 arg20,
- T21 arg21,
- T22 arg22,
- T23 arg23)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5,
- arg6,
- arg7,
- arg8,
- arg9,
- arg10,
- arg11,
- arg12,
- arg13,
- arg14,
- arg15,
- arg16,
- arg17,
- arg18,
- arg19,
- arg20,
- arg21,
- arg22,
- arg23);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5,
- typename T6,
- typename T7,
- typename T8,
- typename T9,
- typename T10,
- typename T11,
- typename T12,
- typename T13,
- typename T14,
- typename T15,
- typename T16,
- typename T17,
- typename T18,
- typename T19,
- typename T20,
- typename T21,
- typename T22>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 23))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- T22);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4,
- T5 arg5,
- T6 arg6,
- T7 arg7,
- T8 arg8,
- T9 arg9,
- T10 arg10,
- T11 arg11,
- T12 arg12,
- T13 arg13,
- T14 arg14,
- T15 arg15,
- T16 arg16,
- T17 arg17,
- T18 arg18,
- T19 arg19,
- T20 arg20,
- T21 arg21,
- T22 arg22)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5,
- arg6,
- arg7,
- arg8,
- arg9,
- arg10,
- arg11,
- arg12,
- arg13,
- arg14,
- arg15,
- arg16,
- arg17,
- arg18,
- arg19,
- arg20,
- arg21,
- arg22);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5,
- typename T6,
- typename T7,
- typename T8,
- typename T9,
- typename T10,
- typename T11,
- typename T12,
- typename T13,
- typename T14,
- typename T15,
- typename T16,
- typename T17,
- typename T18,
- typename T19,
- typename T20,
- typename T21>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 22))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- T21);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4,
- T5 arg5,
- T6 arg6,
- T7 arg7,
- T8 arg8,
- T9 arg9,
- T10 arg10,
- T11 arg11,
- T12 arg12,
- T13 arg13,
- T14 arg14,
- T15 arg15,
- T16 arg16,
- T17 arg17,
- T18 arg18,
- T19 arg19,
- T20 arg20,
- T21 arg21)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5,
- arg6,
- arg7,
- arg8,
- arg9,
- arg10,
- arg11,
- arg12,
- arg13,
- arg14,
- arg15,
- arg16,
- arg17,
- arg18,
- arg19,
- arg20,
- arg21);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5,
- typename T6,
- typename T7,
- typename T8,
- typename T9,
- typename T10,
- typename T11,
- typename T12,
- typename T13,
- typename T14,
- typename T15,
- typename T16,
- typename T17,
- typename T18,
- typename T19,
- typename T20>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 21))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- T20);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4,
- T5 arg5,
- T6 arg6,
- T7 arg7,
- T8 arg8,
- T9 arg9,
- T10 arg10,
- T11 arg11,
- T12 arg12,
- T13 arg13,
- T14 arg14,
- T15 arg15,
- T16 arg16,
- T17 arg17,
- T18 arg18,
- T19 arg19,
- T20 arg20)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5,
- arg6,
- arg7,
- arg8,
- arg9,
- arg10,
- arg11,
- arg12,
- arg13,
- arg14,
- arg15,
- arg16,
- arg17,
- arg18,
- arg19,
- arg20);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5,
- typename T6,
- typename T7,
- typename T8,
- typename T9,
- typename T10,
- typename T11,
- typename T12,
- typename T13,
- typename T14,
- typename T15,
- typename T16,
- typename T17,
- typename T18,
- typename T19>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 20))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- T19);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4,
- T5 arg5,
- T6 arg6,
- T7 arg7,
- T8 arg8,
- T9 arg9,
- T10 arg10,
- T11 arg11,
- T12 arg12,
- T13 arg13,
- T14 arg14,
- T15 arg15,
- T16 arg16,
- T17 arg17,
- T18 arg18,
- T19 arg19)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5,
- arg6,
- arg7,
- arg8,
- arg9,
- arg10,
- arg11,
- arg12,
- arg13,
- arg14,
- arg15,
- arg16,
- arg17,
- arg18,
- arg19);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5,
- typename T6,
- typename T7,
- typename T8,
- typename T9,
- typename T10,
- typename T11,
- typename T12,
- typename T13,
- typename T14,
- typename T15,
- typename T16,
- typename T17,
- typename T18>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 19))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- T18);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4,
- T5 arg5,
- T6 arg6,
- T7 arg7,
- T8 arg8,
- T9 arg9,
- T10 arg10,
- T11 arg11,
- T12 arg12,
- T13 arg13,
- T14 arg14,
- T15 arg15,
- T16 arg16,
- T17 arg17,
- T18 arg18)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5,
- arg6,
- arg7,
- arg8,
- arg9,
- arg10,
- arg11,
- arg12,
- arg13,
- arg14,
- arg15,
- arg16,
- arg17,
- arg18);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5,
- typename T6,
- typename T7,
- typename T8,
- typename T9,
- typename T10,
- typename T11,
- typename T12,
- typename T13,
- typename T14,
- typename T15,
- typename T16,
- typename T17>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 18))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- T17);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4,
- T5 arg5,
- T6 arg6,
- T7 arg7,
- T8 arg8,
- T9 arg9,
- T10 arg10,
- T11 arg11,
- T12 arg12,
- T13 arg13,
- T14 arg14,
- T15 arg15,
- T16 arg16,
- T17 arg17)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5,
- arg6,
- arg7,
- arg8,
- arg9,
- arg10,
- arg11,
- arg12,
- arg13,
- arg14,
- arg15,
- arg16,
- arg17);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5,
- typename T6,
- typename T7,
- typename T8,
- typename T9,
- typename T10,
- typename T11,
- typename T12,
- typename T13,
- typename T14,
- typename T15,
- typename T16>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 17))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- T16);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4,
- T5 arg5,
- T6 arg6,
- T7 arg7,
- T8 arg8,
- T9 arg9,
- T10 arg10,
- T11 arg11,
- T12 arg12,
- T13 arg13,
- T14 arg14,
- T15 arg15,
- T16 arg16)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5,
- arg6,
- arg7,
- arg8,
- arg9,
- arg10,
- arg11,
- arg12,
- arg13,
- arg14,
- arg15,
- arg16);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5,
- typename T6,
- typename T7,
- typename T8,
- typename T9,
- typename T10,
- typename T11,
- typename T12,
- typename T13,
- typename T14,
- typename T15>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 16))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- T15);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4,
- T5 arg5,
- T6 arg6,
- T7 arg7,
- T8 arg8,
- T9 arg9,
- T10 arg10,
- T11 arg11,
- T12 arg12,
- T13 arg13,
- T14 arg14,
- T15 arg15)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5,
- arg6,
- arg7,
- arg8,
- arg9,
- arg10,
- arg11,
- arg12,
- arg13,
- arg14,
- arg15);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5,
- typename T6,
- typename T7,
- typename T8,
- typename T9,
- typename T10,
- typename T11,
- typename T12,
- typename T13,
- typename T14>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 15))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- T14);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4,
- T5 arg5,
- T6 arg6,
- T7 arg7,
- T8 arg8,
- T9 arg9,
- T10 arg10,
- T11 arg11,
- T12 arg12,
- T13 arg13,
- T14 arg14)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5,
- arg6,
- arg7,
- arg8,
- arg9,
- arg10,
- arg11,
- arg12,
- arg13,
- arg14);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5,
- typename T6,
- typename T7,
- typename T8,
- typename T9,
- typename T10,
- typename T11,
- typename T12,
- typename T13>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 14))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- T13);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4,
- T5 arg5,
- T6 arg6,
- T7 arg7,
- T8 arg8,
- T9 arg9,
- T10 arg10,
- T11 arg11,
- T12 arg12,
- T13 arg13)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5,
- arg6,
- arg7,
- arg8,
- arg9,
- arg10,
- arg11,
- arg12,
- arg13);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5,
- typename T6,
- typename T7,
- typename T8,
- typename T9,
- typename T10,
- typename T11,
- typename T12>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 13))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- T12);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4,
- T5 arg5,
- T6 arg6,
- T7 arg7,
- T8 arg8,
- T9 arg9,
- T10 arg10,
- T11 arg11,
- T12 arg12)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5,
- arg6,
- arg7,
- arg8,
- arg9,
- arg10,
- arg11,
- arg12);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5,
- typename T6,
- typename T7,
- typename T8,
- typename T9,
- typename T10,
- typename T11>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 12))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- T11);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4,
- T5 arg5,
- T6 arg6,
- T7 arg7,
- T8 arg8,
- T9 arg9,
- T10 arg10,
- T11 arg11)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5,
- arg6,
- arg7,
- arg8,
- arg9,
- arg10,
- arg11);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5,
- typename T6,
- typename T7,
- typename T8,
- typename T9,
- typename T10>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 11))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- T10);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4,
- T5 arg5,
- T6 arg6,
- T7 arg7,
- T8 arg8,
- T9 arg9,
- T10 arg10)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5,
- arg6,
- arg7,
- arg8,
- arg9,
- arg10);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5,
- typename T6,
- typename T7,
- typename T8,
- typename T9>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 10))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- T9);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4,
- T5 arg5,
- T6 arg6,
- T7 arg7,
- T8 arg8,
- T9 arg9)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5,
- arg6,
- arg7,
- arg8,
- arg9);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5,
- typename T6,
- typename T7,
- typename T8>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 9))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- T8);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4,
- T5 arg5,
- T6 arg6,
- T7 arg7,
- T8 arg8)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5,
- arg6,
- arg7,
- arg8);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5,
- typename T6,
- typename T7>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 8))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- T7);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4,
- T5 arg5,
- T6 arg6,
- T7 arg7)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5,
- arg6,
- arg7);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5,
- typename T6>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 7))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- T6);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4,
- T5 arg5,
- T6 arg6)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5,
- arg6);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- T5,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 6))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4,
- T5);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4,
- T5 arg5)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3,
- typename T4>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- T4,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- T4,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 5))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3,
- T4);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3,
- T4 arg4)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2,
- typename T3>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- T3,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- T3,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 4))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2,
- T3);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2,
- T3 arg3)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2,
- arg3);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1,
- typename T2>
-struct functionImplementation_
-< T0,
- T1,
- T2,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- T2,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 3))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1,
- T2);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1,
- T2 arg2)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1,
- arg2);
- }
-
-
-};
-
-template<
- typename T0,
- typename T1>
-struct functionImplementation_
-< T0,
- T1,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- T1,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 2))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0,
- T1);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0,
- T1 arg1)
- {
- return functor_(
- enqueueArgs,
- arg0,
- arg1);
- }
-
-
-};
-
-template<
- typename T0>
-struct functionImplementation_
-< T0,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType>
-{
- typedef detail::KernelFunctorGlobal<
- T0,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType,
- NullType> FunctorType;
-
- FunctorType functor_;
-
- functionImplementation_(const FunctorType &functor) :
- functor_(functor)
- {
-
- #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 1))
- // Fail variadic expansion for dev11
- static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
- #endif
-
- }
-
- //! \brief Return type of the functor
- typedef Event result_type;
-
- //! \brief Function signature of kernel functor with no event dependency.
- typedef Event type_(
- const EnqueueArgs&,
- T0);
-
- Event operator()(
- const EnqueueArgs& enqueueArgs,
- T0 arg0)
- {
- return functor_(
- enqueueArgs,
- arg0);
- }
-
-
-};
-
-
-
-
-
-} // namespace detail
-
-//----------------------------------------------------------------------------------------------
-
-template <
- typename T0, typename T1 = detail::NullType, typename T2 = detail::NullType,
- typename T3 = detail::NullType, typename T4 = detail::NullType,
- typename T5 = detail::NullType, typename T6 = detail::NullType,
- typename T7 = detail::NullType, typename T8 = detail::NullType,
- typename T9 = detail::NullType, typename T10 = detail::NullType,
- typename T11 = detail::NullType, typename T12 = detail::NullType,
- typename T13 = detail::NullType, typename T14 = detail::NullType,
- typename T15 = detail::NullType, typename T16 = detail::NullType,
- typename T17 = detail::NullType, typename T18 = detail::NullType,
- typename T19 = detail::NullType, typename T20 = detail::NullType,
- typename T21 = detail::NullType, typename T22 = detail::NullType,
- typename T23 = detail::NullType, typename T24 = detail::NullType,
- typename T25 = detail::NullType, typename T26 = detail::NullType,
- typename T27 = detail::NullType, typename T28 = detail::NullType,
- typename T29 = detail::NullType, typename T30 = detail::NullType,
- typename T31 = detail::NullType
->
-struct make_kernel :
- public detail::functionImplementation_<
- T0, T1, T2, T3,
- T4, T5, T6, T7,
- T8, T9, T10, T11,
- T12, T13, T14, T15,
- T16, T17, T18, T19,
- T20, T21, T22, T23,
- T24, T25, T26, T27,
- T28, T29, T30, T31
- >
-{
-public:
- typedef detail::KernelFunctorGlobal<
- T0, T1, T2, T3,
- T4, T5, T6, T7,
- T8, T9, T10, T11,
- T12, T13, T14, T15,
- T16, T17, T18, T19,
- T20, T21, T22, T23,
- T24, T25, T26, T27,
- T28, T29, T30, T31
- > FunctorType;
-
- make_kernel(
- const Program& program,
- const STRING_CLASS name,
- cl_int * err = NULL) :
- detail::functionImplementation_<
- T0, T1, T2, T3,
- T4, T5, T6, T7,
- T8, T9, T10, T11,
- T12, T13, T14, T15,
- T16, T17, T18, T19,
- T20, T21, T22, T23,
- T24, T25, T26, T27,
- T28, T29, T30, T31
- >(
- FunctorType(program, name, err))
- {}
-
- make_kernel(
- const Kernel kernel) :
- detail::functionImplementation_<
- T0, T1, T2, T3,
- T4, T5, T6, T7,
- T8, T9, T10, T11,
- T12, T13, T14, T15,
- T16, T17, T18, T19,
- T20, T21, T22, T23,
- T24, T25, T26, T27,
- T28, T29, T30, T31
- >(
- FunctorType(kernel))
- {}
-};
-
-
-//----------------------------------------------------------------------------------------------------------------------
-
-#undef __ERR_STR
-#if !defined(__CL_USER_OVERRIDE_ERROR_STRINGS)
-#undef __GET_DEVICE_INFO_ERR
-#undef __GET_PLATFORM_INFO_ERR
-#undef __GET_DEVICE_IDS_ERR
-#undef __GET_CONTEXT_INFO_ERR
-#undef __GET_EVENT_INFO_ERR
-#undef __GET_EVENT_PROFILE_INFO_ERR
-#undef __GET_MEM_OBJECT_INFO_ERR
-#undef __GET_IMAGE_INFO_ERR
-#undef __GET_SAMPLER_INFO_ERR
-#undef __GET_KERNEL_INFO_ERR
-#undef __GET_KERNEL_ARG_INFO_ERR
-#undef __GET_KERNEL_WORK_GROUP_INFO_ERR
-#undef __GET_PROGRAM_INFO_ERR
-#undef __GET_PROGRAM_BUILD_INFO_ERR
-#undef __GET_COMMAND_QUEUE_INFO_ERR
-
-#undef __CREATE_CONTEXT_ERR
-#undef __CREATE_CONTEXT_FROM_TYPE_ERR
-#undef __GET_SUPPORTED_IMAGE_FORMATS_ERR
-
-#undef __CREATE_BUFFER_ERR
-#undef __CREATE_SUBBUFFER_ERR
-#undef __CREATE_IMAGE2D_ERR
-#undef __CREATE_IMAGE3D_ERR
-#undef __CREATE_SAMPLER_ERR
-#undef __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR
-
-#undef __CREATE_USER_EVENT_ERR
-#undef __SET_USER_EVENT_STATUS_ERR
-#undef __SET_EVENT_CALLBACK_ERR
-#undef __SET_PRINTF_CALLBACK_ERR
-
-#undef __WAIT_FOR_EVENTS_ERR
-
-#undef __CREATE_KERNEL_ERR
-#undef __SET_KERNEL_ARGS_ERR
-#undef __CREATE_PROGRAM_WITH_SOURCE_ERR
-#undef __CREATE_PROGRAM_WITH_BINARY_ERR
-#undef __CREATE_PROGRAM_WITH_BUILT_IN_KERNELS_ERR
-#undef __BUILD_PROGRAM_ERR
-#undef __CREATE_KERNELS_IN_PROGRAM_ERR
-
-#undef __CREATE_COMMAND_QUEUE_ERR
-#undef __SET_COMMAND_QUEUE_PROPERTY_ERR
-#undef __ENQUEUE_READ_BUFFER_ERR
-#undef __ENQUEUE_WRITE_BUFFER_ERR
-#undef __ENQUEUE_READ_BUFFER_RECT_ERR
-#undef __ENQUEUE_WRITE_BUFFER_RECT_ERR
-#undef __ENQEUE_COPY_BUFFER_ERR
-#undef __ENQEUE_COPY_BUFFER_RECT_ERR
-#undef __ENQUEUE_READ_IMAGE_ERR
-#undef __ENQUEUE_WRITE_IMAGE_ERR
-#undef __ENQUEUE_COPY_IMAGE_ERR
-#undef __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR
-#undef __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR
-#undef __ENQUEUE_MAP_BUFFER_ERR
-#undef __ENQUEUE_MAP_IMAGE_ERR
-#undef __ENQUEUE_UNMAP_MEM_OBJECT_ERR
-#undef __ENQUEUE_NDRANGE_KERNEL_ERR
-#undef __ENQUEUE_TASK_ERR
-#undef __ENQUEUE_NATIVE_KERNEL
-
-#undef __CL_EXPLICIT_CONSTRUCTORS
-
-#undef __UNLOAD_COMPILER_ERR
-#endif //__CL_USER_OVERRIDE_ERROR_STRINGS
-
-#undef __CL_FUNCTION_TYPE
-
-// Extensions
-/**
- * Deprecated APIs for 1.2
- */
-#if defined(CL_VERSION_1_1)
-#undef __INIT_CL_EXT_FCN_PTR
-#endif // #if defined(CL_VERSION_1_1)
-#undef __CREATE_SUB_DEVICES
-
-#if defined(USE_CL_DEVICE_FISSION)
-#undef __PARAM_NAME_DEVICE_FISSION
-#endif // USE_CL_DEVICE_FISSION
-
-#undef __DEFAULT_NOT_INITIALIZED
-#undef __DEFAULT_BEING_INITIALIZED
-#undef __DEFAULT_INITIALIZED
-
-#undef CL_HPP_RVALUE_REFERENCES_SUPPORTED
-#undef CL_HPP_NOEXCEPT
-
-} // namespace cl
-
-#endif // CL_HPP_
diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash-cl/ethash_cl_miner.cpp b/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash-cl/ethash_cl_miner.cpp
deleted file mode 100644
index 65f15d7ca..000000000
--- a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash-cl/ethash_cl_miner.cpp
+++ /dev/null
@@ -1,384 +0,0 @@
-/*
- This file is part of c-ethash.
-
- c-ethash 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.
-
- c-ethash is distributed in the hope that 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 <http://www.gnu.org/licenses/>.
-*/
-/** @file ethash_cl_miner.cpp
-* @author Tim Hughes <tim@twistedfury.com>
-* @date 2015
-*/
-
-
-#define _CRT_SECURE_NO_WARNINGS
-
-#include <cstdio>
-#include <cstdlib>
-#include <iostream>
-#include <assert.h>
-#include <queue>
-#include <vector>
-#include <libethash/util.h>
-#include <libethash/ethash.h>
-#include <libethash/internal.h>
-#include "ethash_cl_miner.h"
-#include "ethash_cl_miner_kernel.h"
-
-#define ETHASH_BYTES 32
-
-// workaround lame platforms
-#if !CL_VERSION_1_2
-#define CL_MAP_WRITE_INVALIDATE_REGION CL_MAP_WRITE
-#define CL_MEM_HOST_READ_ONLY 0
-#endif
-
-#undef min
-#undef max
-
-using namespace std;
-
-static void add_definition(std::string& source, char const* id, unsigned value)
-{
- char buf[256];
- sprintf(buf, "#define %s %uu\n", id, value);
- source.insert(source.begin(), buf, buf + strlen(buf));
-}
-
-ethash_cl_miner::search_hook::~search_hook() {}
-
-ethash_cl_miner::ethash_cl_miner()
-: m_opencl_1_1()
-{
-}
-
-std::string ethash_cl_miner::platform_info(unsigned _platformId, unsigned _deviceId)
-{
- std::vector<cl::Platform> platforms;
- cl::Platform::get(&platforms);
- if (platforms.empty())
- {
- cout << "No OpenCL platforms found." << endl;
- return std::string();
- }
-
- // get GPU device of the selected platform
- std::vector<cl::Device> devices;
- unsigned platform_num = std::min<unsigned>(_platformId, platforms.size() - 1);
- platforms[platform_num].getDevices(CL_DEVICE_TYPE_ALL, &devices);
- if (devices.empty())
- {
- cout << "No OpenCL devices found." << endl;
- return std::string();
- }
-
- // use selected default device
- unsigned device_num = std::min<unsigned>(_deviceId, devices.size() - 1);
- cl::Device& device = devices[device_num];
- std::string device_version = device.getInfo<CL_DEVICE_VERSION>();
-
- return "{ \"platform\": \"" + platforms[platform_num].getInfo<CL_PLATFORM_NAME>() + "\", \"device\": \"" + device.getInfo<CL_DEVICE_NAME>() + "\", \"version\": \"" + device_version + "\" }";
-}
-
-unsigned ethash_cl_miner::get_num_devices(unsigned _platformId)
-{
- std::vector<cl::Platform> platforms;
- cl::Platform::get(&platforms);
- if (platforms.empty())
- {
- cout << "No OpenCL platforms found." << endl;
- return 0;
- }
-
- std::vector<cl::Device> devices;
- unsigned platform_num = std::min<unsigned>(_platformId, platforms.size() - 1);
- platforms[platform_num].getDevices(CL_DEVICE_TYPE_ALL, &devices);
- if (devices.empty())
- {
- cout << "No OpenCL devices found." << endl;
- return 0;
- }
- return devices.size();
-}
-
-void ethash_cl_miner::finish()
-{
- if (m_queue())
- m_queue.finish();
-}
-
-bool ethash_cl_miner::init(uint64_t block_number, std::function<void(void*)> _fillDAG, unsigned workgroup_size, unsigned _platformId, unsigned _deviceId)
-{
- // store params
- m_fullSize = ethash_get_datasize(block_number);
-
- // get all platforms
- std::vector<cl::Platform> platforms;
- cl::Platform::get(&platforms);
- if (platforms.empty())
- {
- cout << "No OpenCL platforms found." << endl;
- return false;
- }
-
- // use selected platform
- _platformId = std::min<unsigned>(_platformId, platforms.size() - 1);
-
- cout << "Using platform: " << platforms[_platformId].getInfo<CL_PLATFORM_NAME>().c_str() << endl;
-
- // get GPU device of the default platform
- std::vector<cl::Device> devices;
- platforms[_platformId].getDevices(CL_DEVICE_TYPE_ALL, &devices);
- if (devices.empty())
- {
- cout << "No OpenCL devices found." << endl;
- return false;
- }
-
- // use selected device
- cl::Device& device = devices[std::min<unsigned>(_deviceId, devices.size() - 1)];
- std::string device_version = device.getInfo<CL_DEVICE_VERSION>();
- cout << "Using device: " << device.getInfo<CL_DEVICE_NAME>().c_str() << "(" << device_version.c_str() << ")" << endl;
-
- if (strncmp("OpenCL 1.0", device_version.c_str(), 10) == 0)
- {
- cout << "OpenCL 1.0 is not supported." << endl;
- return false;
- }
- if (strncmp("OpenCL 1.1", device_version.c_str(), 10) == 0)
- m_opencl_1_1 = true;
-
- // create context
- m_context = cl::Context(std::vector<cl::Device>(&device, &device + 1));
- m_queue = cl::CommandQueue(m_context, device);
-
- // use requested workgroup size, but we require multiple of 8
- m_workgroup_size = ((workgroup_size + 7) / 8) * 8;
-
- // patch source code
- std::string code(ETHASH_CL_MINER_KERNEL, ETHASH_CL_MINER_KERNEL + ETHASH_CL_MINER_KERNEL_SIZE);
- add_definition(code, "GROUP_SIZE", m_workgroup_size);
- add_definition(code, "DAG_SIZE", (unsigned)(m_fullSize / ETHASH_MIX_BYTES));
- add_definition(code, "ACCESSES", ETHASH_ACCESSES);
- add_definition(code, "MAX_OUTPUTS", c_max_search_results);
- //debugf("%s", code.c_str());
-
- // create miner OpenCL program
- cl::Program::Sources sources;
- sources.push_back({code.c_str(), code.size()});
-
- cl::Program program(m_context, sources);
- try
- {
- program.build({device});
- }
- catch (cl::Error err)
- {
- cout << program.getBuildInfo<CL_PROGRAM_BUILD_LOG>(device).c_str();
- return false;
- }
- m_hash_kernel = cl::Kernel(program, "ethash_hash");
- m_search_kernel = cl::Kernel(program, "ethash_search");
-
- // create buffer for dag
- m_dag = cl::Buffer(m_context, CL_MEM_READ_ONLY, m_fullSize);
-
- // create buffer for header
- m_header = cl::Buffer(m_context, CL_MEM_READ_ONLY, 32);
-
- // compute dag on CPU
- {
- // if this throws then it's because we probably need to subdivide the dag uploads for compatibility
- void* dag_ptr = m_queue.enqueueMapBuffer(m_dag, true, m_opencl_1_1 ? CL_MAP_WRITE : CL_MAP_WRITE_INVALIDATE_REGION, 0, m_fullSize);
- // memcpying 1GB: horrible... really. horrible. but necessary since we can't mmap *and* gpumap.
- _fillDAG(dag_ptr);
- m_queue.enqueueUnmapMemObject(m_dag, dag_ptr);
- }
-
- // create mining buffers
- for (unsigned i = 0; i != c_num_buffers; ++i)
- {
- m_hash_buf[i] = cl::Buffer(m_context, CL_MEM_WRITE_ONLY | (!m_opencl_1_1 ? CL_MEM_HOST_READ_ONLY : 0), 32*c_hash_batch_size);
- m_search_buf[i] = cl::Buffer(m_context, CL_MEM_WRITE_ONLY, (c_max_search_results + 1) * sizeof(uint32_t));
- }
- return true;
-}
-
-void ethash_cl_miner::hash(uint8_t* ret, uint8_t const* header, uint64_t nonce, unsigned count)
-{
- struct pending_batch
- {
- unsigned base;
- unsigned count;
- unsigned buf;
- };
- std::queue<pending_batch> pending;
-
- // update header constant buffer
- m_queue.enqueueWriteBuffer(m_header, true, 0, 32, header);
-
- /*
- __kernel void ethash_combined_hash(
- __global hash32_t* g_hashes,
- __constant hash32_t const* g_header,
- __global hash128_t const* g_dag,
- ulong start_nonce,
- uint isolate
- )
- */
- m_hash_kernel.setArg(1, m_header);
- m_hash_kernel.setArg(2, m_dag);
- m_hash_kernel.setArg(3, nonce);
- m_hash_kernel.setArg(4, ~0u); // have to pass this to stop the compile unrolling the loop
-
- unsigned buf = 0;
- for (unsigned i = 0; i < count || !pending.empty(); )
- {
- // how many this batch
- if (i < count)
- {
- unsigned const this_count = std::min<unsigned>(count - i, c_hash_batch_size);
- unsigned const batch_count = std::max<unsigned>(this_count, m_workgroup_size);
-
- // supply output hash buffer to kernel
- m_hash_kernel.setArg(0, m_hash_buf[buf]);
-
- // execute it!
- m_queue.enqueueNDRangeKernel(
- m_hash_kernel,
- cl::NullRange,
- cl::NDRange(batch_count),
- cl::NDRange(m_workgroup_size)
- );
- m_queue.flush();
-
- pending.push({i, this_count, buf});
- i += this_count;
- buf = (buf + 1) % c_num_buffers;
- }
-
- // read results
- if (i == count || pending.size() == c_num_buffers)
- {
- pending_batch const& batch = pending.front();
-
- // could use pinned host pointer instead, but this path isn't that important.
- uint8_t* hashes = (uint8_t*)m_queue.enqueueMapBuffer(m_hash_buf[batch.buf], true, CL_MAP_READ, 0, batch.count * ETHASH_BYTES);
- memcpy(ret + batch.base*ETHASH_BYTES, hashes, batch.count*ETHASH_BYTES);
- m_queue.enqueueUnmapMemObject(m_hash_buf[batch.buf], hashes);
-
- pending.pop();
- }
- }
-}
-
-
-void ethash_cl_miner::search(uint8_t const* header, uint64_t target, search_hook& hook)
-{
- struct pending_batch
- {
- uint64_t start_nonce;
- unsigned buf;
- };
- std::queue<pending_batch> pending;
-
- static uint32_t const c_zero = 0;
-
- // update header constant buffer
- m_queue.enqueueWriteBuffer(m_header, false, 0, 32, header);
- for (unsigned i = 0; i != c_num_buffers; ++i)
- {
- m_queue.enqueueWriteBuffer(m_search_buf[i], false, 0, 4, &c_zero);
- }
-
-#if CL_VERSION_1_2 && 0
- cl::Event pre_return_event;
- if (!m_opencl_1_1)
- {
- m_queue.enqueueBarrierWithWaitList(NULL, &pre_return_event);
- }
- else
-#endif
- {
- m_queue.finish();
- }
-
- /*
- __kernel void ethash_combined_search(
- __global hash32_t* g_hashes, // 0
- __constant hash32_t const* g_header, // 1
- __global hash128_t const* g_dag, // 2
- ulong start_nonce, // 3
- ulong target, // 4
- uint isolate // 5
- )
- */
- m_search_kernel.setArg(1, m_header);
- m_search_kernel.setArg(2, m_dag);
-
- // pass these to stop the compiler unrolling the loops
- m_search_kernel.setArg(4, target);
- m_search_kernel.setArg(5, ~0u);
-
-
- unsigned buf = 0;
- for (uint64_t start_nonce = 0; ; start_nonce += c_search_batch_size)
- {
- // supply output buffer to kernel
- m_search_kernel.setArg(0, m_search_buf[buf]);
- m_search_kernel.setArg(3, start_nonce);
-
- // execute it!
- m_queue.enqueueNDRangeKernel(m_search_kernel, cl::NullRange, c_search_batch_size, m_workgroup_size);
-
- pending.push({start_nonce, buf});
- buf = (buf + 1) % c_num_buffers;
-
- // read results
- if (pending.size() == c_num_buffers)
- {
- pending_batch const& batch = pending.front();
-
- // could use pinned host pointer instead
- uint32_t* results = (uint32_t*)m_queue.enqueueMapBuffer(m_search_buf[batch.buf], true, CL_MAP_READ, 0, (1+c_max_search_results) * sizeof(uint32_t));
- unsigned num_found = std::min<unsigned>(results[0], c_max_search_results);
-
- uint64_t nonces[c_max_search_results];
- for (unsigned i = 0; i != num_found; ++i)
- {
- nonces[i] = batch.start_nonce + results[i+1];
- }
-
- m_queue.enqueueUnmapMemObject(m_search_buf[batch.buf], results);
-
- bool exit = num_found && hook.found(nonces, num_found);
- exit |= hook.searched(batch.start_nonce, c_search_batch_size); // always report searched before exit
- if (exit)
- break;
-
- // reset search buffer if we're still going
- if (num_found)
- m_queue.enqueueWriteBuffer(m_search_buf[batch.buf], true, 0, 4, &c_zero);
-
- pending.pop();
- }
- }
-
- // not safe to return until this is ready
-#if CL_VERSION_1_2 && 0
- if (!m_opencl_1_1)
- {
- pre_return_event.wait();
- }
-#endif
-}
-
diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash-cl/ethash_cl_miner.h b/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash-cl/ethash_cl_miner.h
deleted file mode 100644
index 23868b2c7..000000000
--- a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash-cl/ethash_cl_miner.h
+++ /dev/null
@@ -1,57 +0,0 @@
-#pragma once
-
-#define __CL_ENABLE_EXCEPTIONS
-#define CL_USE_DEPRECATED_OPENCL_2_0_APIS
-
-#if defined(__clang__)
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wunused-parameter"
-#include "cl.hpp"
-#pragma clang diagnostic pop
-#else
-#include "cl.hpp"
-#endif
-
-#include <time.h>
-#include <functional>
-#include <libethash/ethash.h>
-
-class ethash_cl_miner
-{
-public:
- struct search_hook
- {
- virtual ~search_hook(); // always a virtual destructor for a class with virtuals.
-
- // reports progress, return true to abort
- virtual bool found(uint64_t const* nonces, uint32_t count) = 0;
- virtual bool searched(uint64_t start_nonce, uint32_t count) = 0;
- };
-
-public:
- ethash_cl_miner();
-
- bool init(uint64_t block_number, std::function<void(void*)> _fillDAG, unsigned workgroup_size = 64, unsigned _platformId = 0, unsigned _deviceId = 0);
- static std::string platform_info(unsigned _platformId = 0, unsigned _deviceId = 0);
- static unsigned get_num_devices(unsigned _platformId = 0);
-
-
- void finish();
- void hash(uint8_t* ret, uint8_t const* header, uint64_t nonce, unsigned count);
- void search(uint8_t const* header, uint64_t target, search_hook& hook);
-
-private:
- enum { c_max_search_results = 63, c_num_buffers = 2, c_hash_batch_size = 1024, c_search_batch_size = 1024*256 };
-
- uint64_t m_fullSize;
- cl::Context m_context;
- cl::CommandQueue m_queue;
- cl::Kernel m_hash_kernel;
- cl::Kernel m_search_kernel;
- cl::Buffer m_dag;
- cl::Buffer m_header;
- cl::Buffer m_hash_buf[c_num_buffers];
- cl::Buffer m_search_buf[c_num_buffers];
- unsigned m_workgroup_size;
- bool m_opencl_1_1;
-};
diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash-cl/ethash_cl_miner_kernel.cl b/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash-cl/ethash_cl_miner_kernel.cl
deleted file mode 100644
index 3c8b9dc92..000000000
--- a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash-cl/ethash_cl_miner_kernel.cl
+++ /dev/null
@@ -1,460 +0,0 @@
-// author Tim Hughes <tim@twistedfury.com>
-// Tested on Radeon HD 7850
-// Hashrate: 15940347 hashes/s
-// Bandwidth: 124533 MB/s
-// search kernel should fit in <= 84 VGPRS (3 wavefronts)
-
-#define THREADS_PER_HASH (128 / 16)
-#define HASHES_PER_LOOP (GROUP_SIZE / THREADS_PER_HASH)
-
-#define FNV_PRIME 0x01000193
-
-__constant uint2 const Keccak_f1600_RC[24] = {
- (uint2)(0x00000001, 0x00000000),
- (uint2)(0x00008082, 0x00000000),
- (uint2)(0x0000808a, 0x80000000),
- (uint2)(0x80008000, 0x80000000),
- (uint2)(0x0000808b, 0x00000000),
- (uint2)(0x80000001, 0x00000000),
- (uint2)(0x80008081, 0x80000000),
- (uint2)(0x00008009, 0x80000000),
- (uint2)(0x0000008a, 0x00000000),
- (uint2)(0x00000088, 0x00000000),
- (uint2)(0x80008009, 0x00000000),
- (uint2)(0x8000000a, 0x00000000),
- (uint2)(0x8000808b, 0x00000000),
- (uint2)(0x0000008b, 0x80000000),
- (uint2)(0x00008089, 0x80000000),
- (uint2)(0x00008003, 0x80000000),
- (uint2)(0x00008002, 0x80000000),
- (uint2)(0x00000080, 0x80000000),
- (uint2)(0x0000800a, 0x00000000),
- (uint2)(0x8000000a, 0x80000000),
- (uint2)(0x80008081, 0x80000000),
- (uint2)(0x00008080, 0x80000000),
- (uint2)(0x80000001, 0x00000000),
- (uint2)(0x80008008, 0x80000000),
-};
-
-void keccak_f1600_round(uint2* a, uint r, uint out_size)
-{
- #if !__ENDIAN_LITTLE__
- for (uint i = 0; i != 25; ++i)
- a[i] = a[i].yx;
- #endif
-
- uint2 b[25];
- uint2 t;
-
- // Theta
- b[0] = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20];
- b[1] = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21];
- b[2] = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22];
- b[3] = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23];
- b[4] = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24];
- t = b[4] ^ (uint2)(b[1].x << 1 | b[1].y >> 31, b[1].y << 1 | b[1].x >> 31);
- a[0] ^= t;
- a[5] ^= t;
- a[10] ^= t;
- a[15] ^= t;
- a[20] ^= t;
- t = b[0] ^ (uint2)(b[2].x << 1 | b[2].y >> 31, b[2].y << 1 | b[2].x >> 31);
- a[1] ^= t;
- a[6] ^= t;
- a[11] ^= t;
- a[16] ^= t;
- a[21] ^= t;
- t = b[1] ^ (uint2)(b[3].x << 1 | b[3].y >> 31, b[3].y << 1 | b[3].x >> 31);
- a[2] ^= t;
- a[7] ^= t;
- a[12] ^= t;
- a[17] ^= t;
- a[22] ^= t;
- t = b[2] ^ (uint2)(b[4].x << 1 | b[4].y >> 31, b[4].y << 1 | b[4].x >> 31);
- a[3] ^= t;
- a[8] ^= t;
- a[13] ^= t;
- a[18] ^= t;
- a[23] ^= t;
- t = b[3] ^ (uint2)(b[0].x << 1 | b[0].y >> 31, b[0].y << 1 | b[0].x >> 31);
- a[4] ^= t;
- a[9] ^= t;
- a[14] ^= t;
- a[19] ^= t;
- a[24] ^= t;
-
- // Rho Pi
- b[0] = a[0];
- b[10] = (uint2)(a[1].x << 1 | a[1].y >> 31, a[1].y << 1 | a[1].x >> 31);
- b[7] = (uint2)(a[10].x << 3 | a[10].y >> 29, a[10].y << 3 | a[10].x >> 29);
- b[11] = (uint2)(a[7].x << 6 | a[7].y >> 26, a[7].y << 6 | a[7].x >> 26);
- b[17] = (uint2)(a[11].x << 10 | a[11].y >> 22, a[11].y << 10 | a[11].x >> 22);
- b[18] = (uint2)(a[17].x << 15 | a[17].y >> 17, a[17].y << 15 | a[17].x >> 17);
- b[3] = (uint2)(a[18].x << 21 | a[18].y >> 11, a[18].y << 21 | a[18].x >> 11);
- b[5] = (uint2)(a[3].x << 28 | a[3].y >> 4, a[3].y << 28 | a[3].x >> 4);
- b[16] = (uint2)(a[5].y << 4 | a[5].x >> 28, a[5].x << 4 | a[5].y >> 28);
- b[8] = (uint2)(a[16].y << 13 | a[16].x >> 19, a[16].x << 13 | a[16].y >> 19);
- b[21] = (uint2)(a[8].y << 23 | a[8].x >> 9, a[8].x << 23 | a[8].y >> 9);
- b[24] = (uint2)(a[21].x << 2 | a[21].y >> 30, a[21].y << 2 | a[21].x >> 30);
- b[4] = (uint2)(a[24].x << 14 | a[24].y >> 18, a[24].y << 14 | a[24].x >> 18);
- b[15] = (uint2)(a[4].x << 27 | a[4].y >> 5, a[4].y << 27 | a[4].x >> 5);
- b[23] = (uint2)(a[15].y << 9 | a[15].x >> 23, a[15].x << 9 | a[15].y >> 23);
- b[19] = (uint2)(a[23].y << 24 | a[23].x >> 8, a[23].x << 24 | a[23].y >> 8);
- b[13] = (uint2)(a[19].x << 8 | a[19].y >> 24, a[19].y << 8 | a[19].x >> 24);
- b[12] = (uint2)(a[13].x << 25 | a[13].y >> 7, a[13].y << 25 | a[13].x >> 7);
- b[2] = (uint2)(a[12].y << 11 | a[12].x >> 21, a[12].x << 11 | a[12].y >> 21);
- b[20] = (uint2)(a[2].y << 30 | a[2].x >> 2, a[2].x << 30 | a[2].y >> 2);
- b[14] = (uint2)(a[20].x << 18 | a[20].y >> 14, a[20].y << 18 | a[20].x >> 14);
- b[22] = (uint2)(a[14].y << 7 | a[14].x >> 25, a[14].x << 7 | a[14].y >> 25);
- b[9] = (uint2)(a[22].y << 29 | a[22].x >> 3, a[22].x << 29 | a[22].y >> 3);
- b[6] = (uint2)(a[9].x << 20 | a[9].y >> 12, a[9].y << 20 | a[9].x >> 12);
- b[1] = (uint2)(a[6].y << 12 | a[6].x >> 20, a[6].x << 12 | a[6].y >> 20);
-
- // Chi
- a[0] = bitselect(b[0] ^ b[2], b[0], b[1]);
- a[1] = bitselect(b[1] ^ b[3], b[1], b[2]);
- a[2] = bitselect(b[2] ^ b[4], b[2], b[3]);
- a[3] = bitselect(b[3] ^ b[0], b[3], b[4]);
- if (out_size >= 4)
- {
- a[4] = bitselect(b[4] ^ b[1], b[4], b[0]);
- a[5] = bitselect(b[5] ^ b[7], b[5], b[6]);
- a[6] = bitselect(b[6] ^ b[8], b[6], b[7]);
- a[7] = bitselect(b[7] ^ b[9], b[7], b[8]);
- a[8] = bitselect(b[8] ^ b[5], b[8], b[9]);
- if (out_size >= 8)
- {
- a[9] = bitselect(b[9] ^ b[6], b[9], b[5]);
- a[10] = bitselect(b[10] ^ b[12], b[10], b[11]);
- a[11] = bitselect(b[11] ^ b[13], b[11], b[12]);
- a[12] = bitselect(b[12] ^ b[14], b[12], b[13]);
- a[13] = bitselect(b[13] ^ b[10], b[13], b[14]);
- a[14] = bitselect(b[14] ^ b[11], b[14], b[10]);
- a[15] = bitselect(b[15] ^ b[17], b[15], b[16]);
- a[16] = bitselect(b[16] ^ b[18], b[16], b[17]);
- a[17] = bitselect(b[17] ^ b[19], b[17], b[18]);
- a[18] = bitselect(b[18] ^ b[15], b[18], b[19]);
- a[19] = bitselect(b[19] ^ b[16], b[19], b[15]);
- a[20] = bitselect(b[20] ^ b[22], b[20], b[21]);
- a[21] = bitselect(b[21] ^ b[23], b[21], b[22]);
- a[22] = bitselect(b[22] ^ b[24], b[22], b[23]);
- a[23] = bitselect(b[23] ^ b[20], b[23], b[24]);
- a[24] = bitselect(b[24] ^ b[21], b[24], b[20]);
- }
- }
-
- // Iota
- a[0] ^= Keccak_f1600_RC[r];
-
- #if !__ENDIAN_LITTLE__
- for (uint i = 0; i != 25; ++i)
- a[i] = a[i].yx;
- #endif
-}
-
-void keccak_f1600_no_absorb(ulong* a, uint in_size, uint out_size, uint isolate)
-{
- for (uint i = in_size; i != 25; ++i)
- {
- a[i] = 0;
- }
-#if __ENDIAN_LITTLE__
- a[in_size] ^= 0x0000000000000001;
- a[24-out_size*2] ^= 0x8000000000000000;
-#else
- a[in_size] ^= 0x0100000000000000;
- a[24-out_size*2] ^= 0x0000000000000080;
-#endif
-
- // Originally I unrolled the first and last rounds to interface
- // better with surrounding code, however I haven't done this
- // without causing the AMD compiler to blow up the VGPR usage.
- uint r = 0;
- do
- {
- // This dynamic branch stops the AMD compiler unrolling the loop
- // and additionally saves about 33% of the VGPRs, enough to gain another
- // wavefront. Ideally we'd get 4 in flight, but 3 is the best I can
- // massage out of the compiler. It doesn't really seem to matter how
- // much we try and help the compiler save VGPRs because it seems to throw
- // that information away, hence the implementation of keccak here
- // doesn't bother.
- if (isolate)
- {
- keccak_f1600_round((uint2*)a, r++, 25);
- }
- }
- while (r < 23);
-
- // final round optimised for digest size
- keccak_f1600_round((uint2*)a, r++, out_size);
-}
-
-#define copy(dst, src, count) for (uint i = 0; i != count; ++i) { (dst)[i] = (src)[i]; }
-
-#define countof(x) (sizeof(x) / sizeof(x[0]))
-
-uint fnv(uint x, uint y)
-{
- return x * FNV_PRIME ^ y;
-}
-
-uint4 fnv4(uint4 x, uint4 y)
-{
- return x * FNV_PRIME ^ y;
-}
-
-uint fnv_reduce(uint4 v)
-{
- return fnv(fnv(fnv(v.x, v.y), v.z), v.w);
-}
-
-typedef union
-{
- ulong ulongs[32 / sizeof(ulong)];
- uint uints[32 / sizeof(uint)];
-} hash32_t;
-
-typedef union
-{
- ulong ulongs[64 / sizeof(ulong)];
- uint4 uint4s[64 / sizeof(uint4)];
-} hash64_t;
-
-typedef union
-{
- uint uints[128 / sizeof(uint)];
- uint4 uint4s[128 / sizeof(uint4)];
-} hash128_t;
-
-hash64_t init_hash(__constant hash32_t const* header, ulong nonce, uint isolate)
-{
- hash64_t init;
- uint const init_size = countof(init.ulongs);
- uint const hash_size = countof(header->ulongs);
-
- // sha3_512(header .. nonce)
- ulong state[25];
- copy(state, header->ulongs, hash_size);
- state[hash_size] = nonce;
- keccak_f1600_no_absorb(state, hash_size + 1, init_size, isolate);
-
- copy(init.ulongs, state, init_size);
- return init;
-}
-
-uint inner_loop(uint4 init, uint thread_id, __local uint* share, __global hash128_t const* g_dag, uint isolate)
-{
- uint4 mix = init;
-
- // share init0
- if (thread_id == 0)
- *share = mix.x;
- barrier(CLK_LOCAL_MEM_FENCE);
- uint init0 = *share;
-
- uint a = 0;
- do
- {
- bool update_share = thread_id == (a/4) % THREADS_PER_HASH;
-
- #pragma unroll
- for (uint i = 0; i != 4; ++i)
- {
- if (update_share)
- {
- uint m[4] = { mix.x, mix.y, mix.z, mix.w };
- *share = fnv(init0 ^ (a+i), m[i]) % DAG_SIZE;
- }
- barrier(CLK_LOCAL_MEM_FENCE);
-
- mix = fnv4(mix, g_dag[*share].uint4s[thread_id]);
- }
- }
- while ((a += 4) != (ACCESSES & isolate));
-
- return fnv_reduce(mix);
-}
-
-hash32_t final_hash(hash64_t const* init, hash32_t const* mix, uint isolate)
-{
- ulong state[25];
-
- hash32_t hash;
- uint const hash_size = countof(hash.ulongs);
- uint const init_size = countof(init->ulongs);
- uint const mix_size = countof(mix->ulongs);
-
- // keccak_256(keccak_512(header..nonce) .. mix);
- copy(state, init->ulongs, init_size);
- copy(state + init_size, mix->ulongs, mix_size);
- keccak_f1600_no_absorb(state, init_size+mix_size, hash_size, isolate);
-
- // copy out
- copy(hash.ulongs, state, hash_size);
- return hash;
-}
-
-hash32_t compute_hash_simple(
- __constant hash32_t const* g_header,
- __global hash128_t const* g_dag,
- ulong nonce,
- uint isolate
- )
-{
- hash64_t init = init_hash(g_header, nonce, isolate);
-
- hash128_t mix;
- for (uint i = 0; i != countof(mix.uint4s); ++i)
- {
- mix.uint4s[i] = init.uint4s[i % countof(init.uint4s)];
- }
-
- uint mix_val = mix.uints[0];
- uint init0 = mix.uints[0];
- uint a = 0;
- do
- {
- uint pi = fnv(init0 ^ a, mix_val) % DAG_SIZE;
- uint n = (a+1) % countof(mix.uints);
-
- #pragma unroll
- for (uint i = 0; i != countof(mix.uints); ++i)
- {
- mix.uints[i] = fnv(mix.uints[i], g_dag[pi].uints[i]);
- mix_val = i == n ? mix.uints[i] : mix_val;
- }
- }
- while (++a != (ACCESSES & isolate));
-
- // reduce to output
- hash32_t fnv_mix;
- for (uint i = 0; i != countof(fnv_mix.uints); ++i)
- {
- fnv_mix.uints[i] = fnv_reduce(mix.uint4s[i]);
- }
-
- return final_hash(&init, &fnv_mix, isolate);
-}
-
-typedef union
-{
- struct
- {
- hash64_t init;
- uint pad; // avoid lds bank conflicts
- };
- hash32_t mix;
-} compute_hash_share;
-
-hash32_t compute_hash(
- __local compute_hash_share* share,
- __constant hash32_t const* g_header,
- __global hash128_t const* g_dag,
- ulong nonce,
- uint isolate
- )
-{
- uint const gid = get_global_id(0);
-
- // 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.
- uint const thread_id = gid % THREADS_PER_HASH;
- uint const hash_id = (gid % GROUP_SIZE) / THREADS_PER_HASH;
-
- hash32_t mix;
- uint i = 0;
- do
- {
- // share init with other threads
- if (i == thread_id)
- share[hash_id].init = init;
- barrier(CLK_LOCAL_MEM_FENCE);
-
- uint4 thread_init = share[hash_id].init.uint4s[thread_id % (64 / sizeof(uint4))];
- barrier(CLK_LOCAL_MEM_FENCE);
-
- uint thread_mix = inner_loop(thread_init, thread_id, share[hash_id].mix.uints, g_dag, isolate);
-
- share[hash_id].mix.uints[thread_id] = thread_mix;
- barrier(CLK_LOCAL_MEM_FENCE);
-
- if (i == thread_id)
- mix = share[hash_id].mix;
- barrier(CLK_LOCAL_MEM_FENCE);
- }
- while (++i != (THREADS_PER_HASH & isolate));
-
- return final_hash(&init, &mix, isolate);
-}
-
-__attribute__((reqd_work_group_size(GROUP_SIZE, 1, 1)))
-__kernel void ethash_hash_simple(
- __global hash32_t* g_hashes,
- __constant hash32_t const* g_header,
- __global hash128_t const* g_dag,
- ulong start_nonce,
- uint isolate
- )
-{
- uint const gid = get_global_id(0);
- g_hashes[gid] = compute_hash_simple(g_header, g_dag, start_nonce + gid, isolate);
-}
-
-__attribute__((reqd_work_group_size(GROUP_SIZE, 1, 1)))
-__kernel void ethash_search_simple(
- __global volatile uint* restrict g_output,
- __constant hash32_t const* g_header,
- __global hash128_t const* g_dag,
- ulong start_nonce,
- ulong target,
- uint isolate
- )
-{
- uint const gid = get_global_id(0);
- hash32_t hash = compute_hash_simple(g_header, g_dag, start_nonce + gid, isolate);
- if (as_ulong(as_uchar8(hash.ulongs[0]).s76543210) < target)
- {
- uint slot = min(MAX_OUTPUTS, atomic_inc(&g_output[0]) + 1);
- g_output[slot] = gid;
- }
-}
-
-__attribute__((reqd_work_group_size(GROUP_SIZE, 1, 1)))
-__kernel void ethash_hash(
- __global hash32_t* g_hashes,
- __constant hash32_t const* g_header,
- __global hash128_t const* g_dag,
- ulong start_nonce,
- uint isolate
- )
-{
- __local compute_hash_share share[HASHES_PER_LOOP];
-
- uint const gid = get_global_id(0);
- g_hashes[gid] = compute_hash(share, g_header, g_dag, start_nonce + gid, isolate);
-}
-
-__attribute__((reqd_work_group_size(GROUP_SIZE, 1, 1)))
-__kernel void ethash_search(
- __global volatile uint* restrict g_output,
- __constant hash32_t const* g_header,
- __global hash128_t const* g_dag,
- ulong start_nonce,
- ulong target,
- uint isolate
- )
-{
- __local compute_hash_share share[HASHES_PER_LOOP];
-
- uint const gid = get_global_id(0);
- hash32_t hash = compute_hash(share, g_header, g_dag, start_nonce + gid, isolate);
-
- if (as_ulong(as_uchar8(hash.ulongs[0]).s76543210) < target)
- {
- uint slot = min(MAX_OUTPUTS, atomic_inc(&g_output[0]) + 1);
- g_output[slot] = gid;
- }
-}
diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/endian.h b/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/endian.h
index 0ee402d9a..6ca6cc036 100644
--- a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/endian.h
+++ b/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/endian.h
@@ -32,6 +32,9 @@
#include <libkern/OSByteOrder.h>
#define ethash_swap_u32(input_) OSSwapInt32(input_)
#define ethash_swap_u64(input_) OSSwapInt64(input_)
+#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__)
+#define ethash_swap_u32(input_) bswap32(input_)
+#define ethash_swap_u64(input_) bswap64(input_)
#else // posix
#include <byteswap.h>
#define ethash_swap_u32(input_) __bswap_32(input_)
diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/internal.c b/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/internal.c
index e881e0c7b..b28a59e43 100644
--- a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/internal.c
+++ b/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/internal.c
@@ -364,6 +364,7 @@ static bool ethash_mmap(struct ethash_full* ret, FILE* f)
{
int fd;
char* mmapped_data;
+ errno = 0;
ret->file = f;
if ((fd = ethash_fileno(ret->file)) == -1) {
return false;
@@ -400,38 +401,48 @@ ethash_full_t ethash_full_new_internal(
ret->file_size = (size_t)full_size;
switch (ethash_io_prepare(dirname, seed_hash, &f, (size_t)full_size, false)) {
case ETHASH_IO_FAIL:
+ // ethash_io_prepare will do all ETHASH_CRITICAL() logging in fail case
goto fail_free_full;
case ETHASH_IO_MEMO_MATCH:
if (!ethash_mmap(ret, f)) {
+ ETHASH_CRITICAL("mmap failure()");
goto fail_close_file;
}
return ret;
case ETHASH_IO_MEMO_SIZE_MISMATCH:
// if a DAG of same filename but unexpected size is found, silently force new file creation
if (ethash_io_prepare(dirname, seed_hash, &f, (size_t)full_size, true) != ETHASH_IO_MEMO_MISMATCH) {
+ ETHASH_CRITICAL("Could not recreate DAG file after finding existing DAG with unexpected size.");
goto fail_free_full;
}
// fallthrough to the mismatch case here, DO NOT go through match
case ETHASH_IO_MEMO_MISMATCH:
if (!ethash_mmap(ret, f)) {
+ ETHASH_CRITICAL("mmap failure()");
goto fail_close_file;
}
break;
}
if (!ethash_compute_full_data(ret->data, full_size, light, callback)) {
+ ETHASH_CRITICAL("Failure at computing DAG data.");
goto fail_free_full_data;
}
// after the DAG has been filled then we finalize it by writting the magic number at the beginning
if (fseek(f, 0, SEEK_SET) != 0) {
+ ETHASH_CRITICAL("Could not seek to DAG file start to write magic number.");
goto fail_free_full_data;
}
uint64_t const magic_num = ETHASH_DAG_MAGIC_NUM;
if (fwrite(&magic_num, ETHASH_DAG_MAGIC_NUM_SIZE, 1, f) != 1) {
+ ETHASH_CRITICAL("Could not write magic number to DAG's beginning.");
+ goto fail_free_full_data;
+ }
+ if (fflush(f) != 0) {// make sure the magic number IS there
+ ETHASH_CRITICAL("Could not flush memory mapped data to DAG file. Insufficient space?");
goto fail_free_full_data;
}
- fflush(f); // make sure the magic number IS there
return ret;
fail_free_full_data:
diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io.c b/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io.c
index 5b4e7da2b..f4db477c2 100644
--- a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io.c
+++ b/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io.c
@@ -21,6 +21,7 @@
#include "io.h"
#include <string.h>
#include <stdio.h>
+#include <errno.h>
enum ethash_io_rc ethash_io_prepare(
char const* dirname,
@@ -32,15 +33,19 @@ enum ethash_io_rc ethash_io_prepare(
{
char mutable_name[DAG_MUTABLE_NAME_MAX_SIZE];
enum ethash_io_rc ret = ETHASH_IO_FAIL;
+ // reset errno before io calls
+ errno = 0;
// assert directory exists
if (!ethash_mkdir(dirname)) {
+ ETHASH_CRITICAL("Could not create the ethash directory");
goto end;
}
ethash_io_mutable_name(ETHASH_REVISION, &seedhash, mutable_name);
char* tmpfile = ethash_io_create_filename(dirname, mutable_name, strlen(mutable_name));
if (!tmpfile) {
+ ETHASH_CRITICAL("Could not create the full DAG pathname");
goto end;
}
@@ -52,6 +57,7 @@ enum ethash_io_rc ethash_io_prepare(
size_t found_size;
if (!ethash_file_size(f, &found_size)) {
fclose(f);
+ ETHASH_CRITICAL("Could not query size of DAG file: \"%s\"", tmpfile);
goto free_memo;
}
if (file_size != found_size - ETHASH_DAG_MAGIC_NUM_SIZE) {
@@ -64,6 +70,7 @@ enum ethash_io_rc ethash_io_prepare(
if (fread(&magic_num, ETHASH_DAG_MAGIC_NUM_SIZE, 1, f) != 1) {
// I/O error
fclose(f);
+ ETHASH_CRITICAL("Could not read from DAG file: \"%s\"", tmpfile);
ret = ETHASH_IO_MEMO_SIZE_MISMATCH;
goto free_memo;
}
@@ -80,15 +87,25 @@ enum ethash_io_rc ethash_io_prepare(
// file does not exist, will need to be created
f = ethash_fopen(tmpfile, "wb+");
if (!f) {
+ ETHASH_CRITICAL("Could not create DAG file: \"%s\"", tmpfile);
goto free_memo;
}
// make sure it's of the proper size
if (fseek(f, (long int)(file_size + ETHASH_DAG_MAGIC_NUM_SIZE - 1), SEEK_SET) != 0) {
fclose(f);
+ ETHASH_CRITICAL("Could not seek to the end of DAG file: \"%s\". Insufficient space?", tmpfile);
+ goto free_memo;
+ }
+ if (fputc('\n', f) == EOF) {
+ fclose(f);
+ ETHASH_CRITICAL("Could not write in the end of DAG file: \"%s\". Insufficient space?", tmpfile);
+ goto free_memo;
+ }
+ if (fflush(f) != 0) {
+ fclose(f);
+ ETHASH_CRITICAL("Could not flush at end of DAG file: \"%s\". Insufficient space?", tmpfile);
goto free_memo;
}
- fputc('\n', f);
- fflush(f);
ret = ETHASH_IO_MEMO_MISMATCH;
goto set_file;
diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io.h b/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io.h
index 05aa5ed37..7a27089c7 100644
--- a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io.h
+++ b/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io.h
@@ -55,6 +55,23 @@ enum ethash_io_rc {
#endif
/**
+ * Logs a critical error in important parts of ethash. Should mostly help
+ * figure out what kind of problem (I/O, memory e.t.c.) causes a NULL
+ * ethash_full_t
+ */
+#ifdef ETHASH_PRINT_CRITICAL_OUTPUT
+#define ETHASH_CRITICAL(...) \
+ do \
+ { \
+ printf("ETHASH CRITICAL ERROR: "__VA_ARGS__); \
+ printf("\n"); \
+ fflush(stdout); \
+ } while (0)
+#else
+#define ETHASH_CRITICAL(...)
+#endif
+
+/**
* Prepares io for ethash
*
* Create the DAG directory and the DAG file if they don't exist.
diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io_posix.c b/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io_posix.c
index 7f03d5482..c9a17d845 100644
--- a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io_posix.c
+++ b/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io_posix.c
@@ -26,6 +26,8 @@
#include <libgen.h>
#include <stdio.h>
#include <unistd.h>
+#include <stdlib.h>
+#include <pwd.h>
FILE* ethash_fopen(char const* file_name, char const* mode)
{
@@ -89,6 +91,13 @@ bool ethash_get_default_dirname(char* strbuf, size_t buffsize)
static const char dir_suffix[] = ".ethash/";
strbuf[0] = '\0';
char* home_dir = getenv("HOME");
+ if (!home_dir || strlen(home_dir) == 0)
+ {
+ struct passwd* pwd = getpwuid(getuid());
+ if (pwd)
+ home_dir = pwd->pw_dir;
+ }
+
size_t len = strlen(home_dir);
if (!ethash_strncat(strbuf, buffsize, home_dir, len)) {
return false;
diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io_win32.c b/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io_win32.c
index 2e6c8deb8..34f1aaa77 100644
--- a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io_win32.c
+++ b/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/io_win32.c
@@ -87,9 +87,9 @@ bool ethash_file_size(FILE* f, size_t* ret_size)
bool ethash_get_default_dirname(char* strbuf, size_t buffsize)
{
- static const char dir_suffix[] = "Appdata\\Ethash\\";
+ static const char dir_suffix[] = "Ethash\\";
strbuf[0] = '\0';
- if (!SUCCEEDED(SHGetFolderPathW(NULL, CSIDL_PROFILE, NULL, 0, (WCHAR*)strbuf))) {
+ if (!SUCCEEDED(SHGetFolderPathA(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, (CHAR*)strbuf))) {
return false;
}
if (!ethash_strncat(strbuf, buffsize, "\\", 1)) {
diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/test/c/test.cpp b/Godeps/_workspace/src/github.com/ethereum/ethash/test/c/test.cpp
index 1933e03e3..44e0c385b 100644
--- a/Godeps/_workspace/src/github.com/ethereum/ethash/test/c/test.cpp
+++ b/Godeps/_workspace/src/github.com/ethereum/ethash/test/c/test.cpp
@@ -292,12 +292,13 @@ BOOST_AUTO_TEST_CASE(test_ethash_io_memo_file_size_mismatch) {
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, so yeah it does look ugly
+ // 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(SHGetFolderPathW(NULL, CSIDL_PROFILE, NULL, 0, (WCHAR*)homedir)));
+ 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\\Ethash\\");
+ std::string res = std::string(homedir) + std::string("\\AppData\\Local\\Ethash\\");
#else
char* homedir = getenv("HOME");
BOOST_REQUIRE(ethash_get_default_dirname(result, 256));
@@ -305,7 +306,7 @@ BOOST_AUTO_TEST_CASE(test_ethash_get_default_dirname) {
#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) {
diff --git a/cmd/console/js.go b/cmd/console/js.go
index a5fdaacc2..15ea9bedd 100644
--- a/cmd/console/js.go
+++ b/cmd/console/js.go
@@ -30,6 +30,7 @@ import (
"sort"
+ "github.com/codegangsta/cli"
"github.com/ethereum/go-ethereum/cmd/utils"
"github.com/ethereum/go-ethereum/common/docserver"
re "github.com/ethereum/go-ethereum/jsre"
@@ -329,7 +330,29 @@ func (self *jsre) welcome(ipcpath string) {
}
}
-func (self *jsre) interactive() {
+func (self *jsre) batch(args cli.Args) {
+ statement := strings.Join(args, " ")
+ val, err := self.re.Run(statement)
+
+ if err != nil {
+ fmt.Printf("error: %v", err)
+ } else if val.IsDefined() && val.IsObject() {
+ obj, _ := self.re.Get("ret_result")
+ fmt.Printf("%v", obj)
+ } else if val.IsDefined() {
+ fmt.Printf("%v", val)
+ }
+
+ if self.atexit != nil {
+ self.atexit()
+ }
+
+ self.re.Stop(false)
+}
+
+func (self *jsre) interactive(ipcpath string) {
+ self.welcome(ipcpath)
+
// Read input lines.
prompt := make(chan string)
inputln := make(chan string)
diff --git a/cmd/console/main.go b/cmd/console/main.go
index e8dd412ba..00a9ca9c4 100644
--- a/cmd/console/main.go
+++ b/cmd/console/main.go
@@ -40,7 +40,7 @@ const (
var (
gitCommit string // set via linker flag
nodeNameVersion string
- app = utils.NewApp(Version, "the ether console")
+ app = utils.NewApp(Version, "the geth console")
)
func init() {
@@ -93,8 +93,11 @@ func main() {
func run(ctx *cli.Context) {
jspath := ctx.GlobalString(utils.JSpathFlag.Name)
ipcpath := utils.IpcSocketPath(ctx)
-
repl := newJSRE(jspath, ipcpath)
- repl.welcome(ipcpath)
- repl.interactive()
+
+ if ctx.Args().Present() {
+ repl.batch(ctx.Args())
+ } else {
+ repl.interactive(ipcpath)
+ }
}
diff --git a/cmd/geth/main.go b/cmd/geth/main.go
index 0f2438cfd..89aae43e5 100644
--- a/cmd/geth/main.go
+++ b/cmd/geth/main.go
@@ -44,7 +44,7 @@ import (
const (
ClientIdentifier = "Geth"
- Version = "0.9.29"
+ Version = "0.9.31"
)
var (
@@ -256,6 +256,12 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Conso
utils.PProfEanbledFlag,
utils.PProfPortFlag,
utils.SolcPathFlag,
+ utils.GpoMinGasPriceFlag,
+ utils.GpoMaxGasPriceFlag,
+ utils.GpoFullBlockRatioFlag,
+ utils.GpobaseStepDownFlag,
+ utils.GpobaseStepUpFlag,
+ utils.GpobaseCorrectionFactorFlag,
}
app.Before = func(ctx *cli.Context) error {
utils.SetupLogger(ctx)
diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go
index ec29598fb..696dbd142 100644
--- a/cmd/utils/flags.go
+++ b/cmd/utils/flags.go
@@ -23,10 +23,10 @@ import (
"github.com/ethereum/go-ethereum/logger/glog"
"github.com/ethereum/go-ethereum/p2p/nat"
"github.com/ethereum/go-ethereum/rpc"
- "github.com/ethereum/go-ethereum/xeth"
"github.com/ethereum/go-ethereum/rpc/api"
- "github.com/ethereum/go-ethereum/rpc/comms"
"github.com/ethereum/go-ethereum/rpc/codec"
+ "github.com/ethereum/go-ethereum/rpc/comms"
+ "github.com/ethereum/go-ethereum/xeth"
)
func init() {
@@ -132,7 +132,7 @@ var (
GasPriceFlag = cli.StringFlag{
Name: "gasprice",
Usage: "Sets the minimal gasprice when mining transactions",
- Value: new(big.Int).Mul(big.NewInt(10), common.Szabo).String(),
+ Value: new(big.Int).Mul(big.NewInt(1), common.Szabo).String(),
}
UnlockedAccountFlag = cli.StringFlag{
@@ -276,6 +276,36 @@ var (
Usage: "solidity compiler to be used",
Value: "solc",
}
+ GpoMinGasPriceFlag = cli.StringFlag{
+ Name: "gpomin",
+ Usage: "Minimum suggested gas price",
+ Value: new(big.Int).Mul(big.NewInt(1), common.Szabo).String(),
+ }
+ GpoMaxGasPriceFlag = cli.StringFlag{
+ Name: "gpomax",
+ Usage: "Maximum suggested gas price",
+ Value: new(big.Int).Mul(big.NewInt(100), common.Szabo).String(),
+ }
+ GpoFullBlockRatioFlag = cli.IntFlag{
+ Name: "gpofull",
+ Usage: "Full block threshold for gas price calculation (%)",
+ Value: 80,
+ }
+ GpobaseStepDownFlag = cli.IntFlag{
+ Name: "gpobasedown",
+ Usage: "Suggested gas price base step down ratio (1/1000)",
+ Value: 10,
+ }
+ GpobaseStepUpFlag = cli.IntFlag{
+ Name: "gpobaseup",
+ Usage: "Suggested gas price base step up ratio (1/1000)",
+ Value: 100,
+ }
+ GpobaseCorrectionFactorFlag = cli.IntFlag{
+ Name: "gpobasecf",
+ Usage: "Suggested gas price base correction factor (%)",
+ Value: 110,
+ }
)
// MakeNAT creates a port mapper from set command line flags.
@@ -313,33 +343,39 @@ func MakeEthConfig(clientID, version string, ctx *cli.Context) *eth.Config {
clientID += "/" + customName
}
return &eth.Config{
- Name: common.MakeName(clientID, version),
- DataDir: ctx.GlobalString(DataDirFlag.Name),
- ProtocolVersion: ctx.GlobalInt(ProtocolVersionFlag.Name),
- GenesisNonce: ctx.GlobalInt(GenesisNonceFlag.Name),
- BlockChainVersion: ctx.GlobalInt(BlockchainVersionFlag.Name),
- SkipBcVersionCheck: false,
- NetworkId: ctx.GlobalInt(NetworkIdFlag.Name),
- LogFile: ctx.GlobalString(LogFileFlag.Name),
- Verbosity: ctx.GlobalInt(VerbosityFlag.Name),
- LogJSON: ctx.GlobalString(LogJSONFlag.Name),
- Etherbase: ctx.GlobalString(EtherbaseFlag.Name),
- MinerThreads: ctx.GlobalInt(MinerThreadsFlag.Name),
- AccountManager: MakeAccountManager(ctx),
- VmDebug: ctx.GlobalBool(VMDebugFlag.Name),
- MaxPeers: ctx.GlobalInt(MaxPeersFlag.Name),
- MaxPendingPeers: ctx.GlobalInt(MaxPendingPeersFlag.Name),
- Port: ctx.GlobalString(ListenPortFlag.Name),
- NAT: MakeNAT(ctx),
- NatSpec: ctx.GlobalBool(NatspecEnabledFlag.Name),
- Discovery: !ctx.GlobalBool(NoDiscoverFlag.Name),
- NodeKey: MakeNodeKey(ctx),
- Shh: ctx.GlobalBool(WhisperEnabledFlag.Name),
- Dial: true,
- BootNodes: ctx.GlobalString(BootnodesFlag.Name),
- GasPrice: common.String2Big(ctx.GlobalString(GasPriceFlag.Name)),
- SolcPath: ctx.GlobalString(SolcPathFlag.Name),
- AutoDAG: ctx.GlobalBool(AutoDAGFlag.Name) || ctx.GlobalBool(MiningEnabledFlag.Name),
+ Name: common.MakeName(clientID, version),
+ DataDir: ctx.GlobalString(DataDirFlag.Name),
+ ProtocolVersion: ctx.GlobalInt(ProtocolVersionFlag.Name),
+ GenesisNonce: ctx.GlobalInt(GenesisNonceFlag.Name),
+ BlockChainVersion: ctx.GlobalInt(BlockchainVersionFlag.Name),
+ SkipBcVersionCheck: false,
+ NetworkId: ctx.GlobalInt(NetworkIdFlag.Name),
+ LogFile: ctx.GlobalString(LogFileFlag.Name),
+ Verbosity: ctx.GlobalInt(VerbosityFlag.Name),
+ LogJSON: ctx.GlobalString(LogJSONFlag.Name),
+ Etherbase: ctx.GlobalString(EtherbaseFlag.Name),
+ MinerThreads: ctx.GlobalInt(MinerThreadsFlag.Name),
+ AccountManager: MakeAccountManager(ctx),
+ VmDebug: ctx.GlobalBool(VMDebugFlag.Name),
+ MaxPeers: ctx.GlobalInt(MaxPeersFlag.Name),
+ MaxPendingPeers: ctx.GlobalInt(MaxPendingPeersFlag.Name),
+ Port: ctx.GlobalString(ListenPortFlag.Name),
+ NAT: MakeNAT(ctx),
+ NatSpec: ctx.GlobalBool(NatspecEnabledFlag.Name),
+ Discovery: !ctx.GlobalBool(NoDiscoverFlag.Name),
+ NodeKey: MakeNodeKey(ctx),
+ Shh: ctx.GlobalBool(WhisperEnabledFlag.Name),
+ Dial: true,
+ BootNodes: ctx.GlobalString(BootnodesFlag.Name),
+ GasPrice: common.String2Big(ctx.GlobalString(GasPriceFlag.Name)),
+ GpoMinGasPrice: common.String2Big(ctx.GlobalString(GpoMinGasPriceFlag.Name)),
+ GpoMaxGasPrice: common.String2Big(ctx.GlobalString(GpoMaxGasPriceFlag.Name)),
+ GpoFullBlockRatio: ctx.GlobalInt(GpoFullBlockRatioFlag.Name),
+ GpobaseStepDown: ctx.GlobalInt(GpobaseStepDownFlag.Name),
+ GpobaseStepUp: ctx.GlobalInt(GpobaseStepUpFlag.Name),
+ GpobaseCorrectionFactor: ctx.GlobalInt(GpobaseCorrectionFactorFlag.Name),
+ SolcPath: ctx.GlobalString(SolcPathFlag.Name),
+ AutoDAG: ctx.GlobalBool(AutoDAGFlag.Name) || ctx.GlobalBool(MiningEnabledFlag.Name),
}
}
@@ -396,7 +432,7 @@ func IpcSocketPath(ctx *cli.Context) (ipcpath string) {
if ctx.GlobalString(IPCPathFlag.Name) != common.DefaultIpcPath() {
ipcpath = ctx.GlobalString(IPCPathFlag.Name)
} else if ctx.GlobalString(DataDirFlag.Name) != "" &&
- ctx.GlobalString(DataDirFlag.Name) != common.DefaultDataDir() {
+ ctx.GlobalString(DataDirFlag.Name) != common.DefaultDataDir() {
ipcpath = filepath.Join(ctx.GlobalString(DataDirFlag.Name), "geth.ipc")
}
}
diff --git a/common/types.go b/common/types.go
index 183d48fb3..e41112a77 100644
--- a/common/types.go
+++ b/common/types.go
@@ -1,6 +1,7 @@
package common
import (
+ "fmt"
"math/big"
"math/rand"
"reflect"
@@ -61,6 +62,10 @@ func (h Hash) Generate(rand *rand.Rand, size int) reflect.Value {
return reflect.ValueOf(h)
}
+func EmptyHash(h Hash) bool {
+ return h == Hash{}
+}
+
/////////// Address
func BytesToAddress(b []byte) Address {
var a Address
@@ -95,3 +100,13 @@ func (a *Address) Set(other Address) {
a[i] = v
}
}
+
+// PP Pretty Prints a byte slice in the following format:
+// hex(value[:4])...(hex[len(value)-4:])
+func PP(value []byte) string {
+ if len(value) <= 8 {
+ return Bytes2Hex(value)
+ }
+
+ return fmt.Sprintf("%x...%x", value[:4], value[len(value)-4])
+}
diff --git a/core/block_processor.go b/core/block_processor.go
index 54378b2b9..c78d419ce 100644
--- a/core/block_processor.go
+++ b/core/block_processor.go
@@ -185,7 +185,7 @@ func (sm *BlockProcessor) processWithParent(block, parent *types.Block) (logs st
state := state.New(parent.Root(), sm.db)
// Block validation
- if err = sm.ValidateHeader(block.Header(), parent.Header(), false); err != nil {
+ if err = ValidateHeader(sm.Pow, block.Header(), parent.Header(), false); err != nil {
return
}
@@ -246,12 +246,6 @@ func (sm *BlockProcessor) processWithParent(block, parent *types.Block) (logs st
return
}
- // store the receipts
- err = putReceipts(sm.extraDb, block.Hash(), receipts)
- if err != nil {
- return nil, err
- }
-
// Sync the current block's state to the database
state.Sync()
@@ -260,68 +254,10 @@ func (sm *BlockProcessor) processWithParent(block, parent *types.Block) (logs st
putTx(sm.extraDb, tx, block, uint64(i))
}
- return state.Logs(), nil
-}
-
-// See YP section 4.3.4. "Block Header Validity"
-// Validates a block. Returns an error if the block is invalid.
-func (sm *BlockProcessor) ValidateHeader(block, parent *types.Header, checkPow bool) error {
- if big.NewInt(int64(len(block.Extra))).Cmp(params.MaximumExtraDataSize) == 1 {
- return fmt.Errorf("Block extra data too long (%d)", len(block.Extra))
- }
-
- expd := CalcDifficulty(block, parent)
- if expd.Cmp(block.Difficulty) != 0 {
- return fmt.Errorf("Difficulty check failed for block %v, %v", block.Difficulty, expd)
- }
-
- a := new(big.Int).Sub(block.GasLimit, parent.GasLimit)
- a.Abs(a)
- b := new(big.Int).Div(parent.GasLimit, params.GasLimitBoundDivisor)
- if !(a.Cmp(b) < 0) || (block.GasLimit.Cmp(params.MinGasLimit) == -1) {
- return fmt.Errorf("GasLimit check failed for block %v (%v > %v)", block.GasLimit, a, b)
- }
-
- if int64(block.Time) > time.Now().Unix() {
- return BlockFutureErr
- }
-
- if new(big.Int).Sub(block.Number, parent.Number).Cmp(big.NewInt(1)) != 0 {
- return BlockNumberErr
- }
-
- if block.Time <= parent.Time {
- return BlockEqualTSErr //ValidationError("Block timestamp equal or less than previous block (%v - %v)", block.Time, parent.Time)
- }
-
- if checkPow {
- // Verify the nonce of the block. Return an error if it's not valid
- if !sm.Pow.Verify(types.NewBlockWithHeader(block)) {
- return ValidationError("Block's nonce is invalid (= %x)", block.Nonce)
- }
- }
-
- return nil
-}
-
-func AccumulateRewards(statedb *state.StateDB, block *types.Block) {
- reward := new(big.Int).Set(BlockReward)
-
- for _, uncle := range block.Uncles() {
- num := new(big.Int).Add(big.NewInt(8), uncle.Number)
- num.Sub(num, block.Number())
-
- r := new(big.Int)
- r.Mul(BlockReward, num)
- r.Div(r, big.NewInt(8))
-
- statedb.AddBalance(uncle.Coinbase, r)
-
- reward.Add(reward, new(big.Int).Div(BlockReward, big.NewInt(32)))
- }
+ // store the receipts
+ putReceipts(sm.extraDb, block.Hash(), receipts)
- // Get the account associated with the coinbase
- statedb.AddBalance(block.Header().Coinbase, reward)
+ return state.Logs(), nil
}
func (sm *BlockProcessor) VerifyUncles(statedb *state.StateDB, block, parent *types.Block) error {
@@ -361,7 +297,7 @@ func (sm *BlockProcessor) VerifyUncles(statedb *state.StateDB, block, parent *ty
return UncleError("uncle[%d](%x)'s parent is not ancestor (%x)", i, hash[:4], uncle.ParentHash[0:4])
}
- if err := sm.ValidateHeader(uncle, ancestorHeaders[uncle.ParentHash], true); err != nil {
+ if err := ValidateHeader(sm.Pow, uncle, ancestorHeaders[uncle.ParentHash], true); err != nil {
return ValidationError(fmt.Sprintf("uncle[%d](%x) header invalid: %v", i, hash[:4], err))
}
}
@@ -398,12 +334,75 @@ func (sm *BlockProcessor) GetLogs(block *types.Block) (logs state.Logs, err erro
return state.Logs(), nil
}
+// See YP section 4.3.4. "Block Header Validity"
+// Validates a block. Returns an error if the block is invalid.
+func ValidateHeader(pow pow.PoW, block, parent *types.Header, checkPow bool) error {
+ if big.NewInt(int64(len(block.Extra))).Cmp(params.MaximumExtraDataSize) == 1 {
+ return fmt.Errorf("Block extra data too long (%d)", len(block.Extra))
+ }
+
+ expd := CalcDifficulty(block, parent)
+ if expd.Cmp(block.Difficulty) != 0 {
+ return fmt.Errorf("Difficulty check failed for block %v, %v", block.Difficulty, expd)
+ }
+
+ a := new(big.Int).Sub(block.GasLimit, parent.GasLimit)
+ a.Abs(a)
+ b := new(big.Int).Div(parent.GasLimit, params.GasLimitBoundDivisor)
+ if !(a.Cmp(b) < 0) || (block.GasLimit.Cmp(params.MinGasLimit) == -1) {
+ return fmt.Errorf("GasLimit check failed for block %v (%v > %v)", block.GasLimit, a, b)
+ }
+
+ if int64(block.Time) > time.Now().Unix() {
+ return BlockFutureErr
+ }
+
+ if new(big.Int).Sub(block.Number, parent.Number).Cmp(big.NewInt(1)) != 0 {
+ return BlockNumberErr
+ }
+
+ if block.Time <= parent.Time {
+ return BlockEqualTSErr //ValidationError("Block timestamp equal or less than previous block (%v - %v)", block.Time, parent.Time)
+ }
+
+ if checkPow {
+ // Verify the nonce of the block. Return an error if it's not valid
+ if !pow.Verify(types.NewBlockWithHeader(block)) {
+ return ValidationError("Block's nonce is invalid (= %x)", block.Nonce)
+ }
+ }
+
+ return nil
+}
+
+func AccumulateRewards(statedb *state.StateDB, block *types.Block) {
+ reward := new(big.Int).Set(BlockReward)
+
+ for _, uncle := range block.Uncles() {
+ num := new(big.Int).Add(big.NewInt(8), uncle.Number)
+ num.Sub(num, block.Number())
+
+ r := new(big.Int)
+ r.Mul(BlockReward, num)
+ r.Div(r, big.NewInt(8))
+
+ statedb.AddBalance(uncle.Coinbase, r)
+
+ reward.Add(reward, new(big.Int).Div(BlockReward, big.NewInt(32)))
+ }
+
+ // Get the account associated with the coinbase
+ statedb.AddBalance(block.Header().Coinbase, reward)
+}
+
func getBlockReceipts(db common.Database, bhash common.Hash) (receipts types.Receipts, err error) {
var rdata []byte
rdata, err = db.Get(append(receiptsPre, bhash[:]...))
if err == nil {
err = rlp.DecodeBytes(rdata, &receipts)
+ } else {
+ glog.V(logger.Detail).Infof("getBlockReceipts error %v\n", err)
}
return
}
diff --git a/core/block_processor_test.go b/core/block_processor_test.go
index 97b80038d..e38c815ef 100644
--- a/core/block_processor_test.go
+++ b/core/block_processor_test.go
@@ -26,18 +26,20 @@ func proc() (*BlockProcessor, *ChainManager) {
}
func TestNumber(t *testing.T) {
- bp, chain := proc()
+ _, chain := proc()
block1 := chain.NewBlock(common.Address{})
block1.Header().Number = big.NewInt(3)
block1.Header().Time--
- err := bp.ValidateHeader(block1.Header(), chain.Genesis().Header(), false)
+ pow := ezp.New()
+
+ err := ValidateHeader(pow, block1.Header(), chain.Genesis().Header(), false)
if err != BlockNumberErr {
t.Errorf("expected block number error %v", err)
}
block1 = chain.NewBlock(common.Address{})
- err = bp.ValidateHeader(block1.Header(), chain.Genesis().Header(), false)
+ err = ValidateHeader(pow, block1.Header(), chain.Genesis().Header(), false)
if err == BlockNumberErr {
t.Errorf("didn't expect block number error")
}
diff --git a/core/chain_manager.go b/core/chain_manager.go
index e56d82cce..c3b7273c2 100644
--- a/core/chain_manager.go
+++ b/core/chain_manager.go
@@ -5,7 +5,6 @@ import (
"fmt"
"io"
"math/big"
- "os"
"runtime"
"sync"
"sync/atomic"
@@ -235,15 +234,8 @@ func (bc *ChainManager) setLastState() {
if block != nil {
bc.currentBlock = block
bc.lastBlockHash = block.Hash()
- } else { // TODO CLEAN THIS UP TMP CODE
- block = bc.GetBlockByNumber(400000)
- if block == nil {
- fmt.Println("Fatal. LastBlock not found. Report this issue")
- os.Exit(1)
- }
- bc.currentBlock = block
- bc.lastBlockHash = block.Hash()
- bc.insert(block)
+ } else {
+ glog.Fatalf("Fatal. LastBlock not found. Please run removedb and resync")
}
} else {
bc.Reset()
diff --git a/core/state/dump.go b/core/state/dump.go
index 70ea21691..f6f2f9029 100644
--- a/core/state/dump.go
+++ b/core/state/dump.go
@@ -34,7 +34,7 @@ func (self *StateDB) RawDump() World {
account := Account{Balance: stateObject.balance.String(), Nonce: stateObject.nonce, Root: common.Bytes2Hex(stateObject.Root()), CodeHash: common.Bytes2Hex(stateObject.codeHash)}
account.Storage = make(map[string]string)
- storageIt := stateObject.State.trie.Iterator()
+ storageIt := stateObject.trie.Iterator()
for storageIt.Next() {
account.Storage[common.Bytes2Hex(self.trie.GetKey(storageIt.Key))] = common.Bytes2Hex(storageIt.Value)
}
@@ -54,8 +54,8 @@ func (self *StateDB) Dump() []byte {
// Debug stuff
func (self *StateObject) CreateOutputForDiff() {
- fmt.Printf("%x %x %x %x\n", self.Address(), self.State.Root(), self.balance.Bytes(), self.nonce)
- it := self.State.trie.Iterator()
+ fmt.Printf("%x %x %x %x\n", self.Address(), self.Root(), self.balance.Bytes(), self.nonce)
+ it := self.trie.Iterator()
for it.Next() {
fmt.Printf("%x %x\n", it.Key, it.Value)
}
diff --git a/core/state/state_object.go b/core/state/state_object.go
index 6d2455d79..2e4fe3269 100644
--- a/core/state/state_object.go
+++ b/core/state/state_object.go
@@ -19,11 +19,11 @@ func (self Code) String() string {
return string(self) //strings.Join(Disassemble(self), " ")
}
-type Storage map[string]*common.Value
+type Storage map[string]common.Hash
func (self Storage) String() (str string) {
for key, value := range self {
- str += fmt.Sprintf("%X : %X\n", key, value.Bytes())
+ str += fmt.Sprintf("%X : %X\n", key, value)
}
return
@@ -32,7 +32,6 @@ func (self Storage) String() (str string) {
func (self Storage) Copy() Storage {
cpy := make(Storage)
for key, value := range self {
- // XXX Do we need a 'value' copy or is this sufficient?
cpy[key] = value
}
@@ -41,9 +40,8 @@ func (self Storage) Copy() Storage {
type StateObject struct {
// State database for storing state changes
- db common.Database
- // The state object
- State *StateDB
+ db common.Database
+ trie *trie.SecureTrie
// Address belonging to this account
address common.Address
@@ -76,7 +74,6 @@ type StateObject struct {
func (self *StateObject) Reset() {
self.storage = make(Storage)
- self.State.Reset()
}
func NewStateObject(address common.Address, db common.Database) *StateObject {
@@ -84,7 +81,7 @@ func NewStateObject(address common.Address, db common.Database) *StateObject {
//address := common.ToAddress(addr)
object := &StateObject{db: db, address: address, balance: new(big.Int), gasPool: new(big.Int), dirty: true}
- object.State = New(common.Hash{}, db) //New(trie.New(common.Config.Db, ""))
+ object.trie = trie.NewSecure((common.Hash{}).Bytes(), db)
object.storage = make(Storage)
object.gasPool = new(big.Int)
object.prepaid = new(big.Int)
@@ -111,8 +108,8 @@ func NewStateObjectFromBytes(address common.Address, data []byte, db common.Data
object.nonce = extobject.Nonce
object.balance = extobject.Balance
object.codeHash = extobject.CodeHash
- object.State = New(extobject.Root, db)
- object.storage = make(map[string]*common.Value)
+ object.trie = trie.NewSecure(extobject.Root[:], db)
+ object.storage = make(map[string]common.Hash)
object.gasPool = new(big.Int)
object.prepaid = new(big.Int)
object.code, _ = db.Get(extobject.CodeHash)
@@ -129,35 +126,31 @@ func (self *StateObject) MarkForDeletion() {
}
}
-func (c *StateObject) getAddr(addr common.Hash) *common.Value {
- return common.NewValueFromBytes([]byte(c.State.trie.Get(addr[:])))
+func (c *StateObject) getAddr(addr common.Hash) common.Hash {
+ var ret []byte
+ rlp.DecodeBytes(c.trie.Get(addr[:]), &ret)
+ return common.BytesToHash(ret)
}
-func (c *StateObject) setAddr(addr []byte, value interface{}) {
- c.State.trie.Update(addr, common.Encode(value))
-}
-
-func (self *StateObject) GetStorage(key *big.Int) *common.Value {
- fmt.Printf("%v: get %v %v", self.address.Hex(), key)
- return self.GetState(common.BytesToHash(key.Bytes()))
-}
-
-func (self *StateObject) SetStorage(key *big.Int, value *common.Value) {
- fmt.Printf("%v: set %v -> %v", self.address.Hex(), key, value)
- self.SetState(common.BytesToHash(key.Bytes()), value)
+func (c *StateObject) setAddr(addr []byte, value common.Hash) {
+ v, err := rlp.EncodeToBytes(bytes.TrimLeft(value[:], "\x00"))
+ if err != nil {
+ // if RLPing failed we better panic and not fail silently. This would be considered a consensus issue
+ panic(err)
+ }
+ c.trie.Update(addr, v)
}
func (self *StateObject) Storage() Storage {
return self.storage
}
-func (self *StateObject) GetState(key common.Hash) *common.Value {
+func (self *StateObject) GetState(key common.Hash) common.Hash {
strkey := key.Str()
- value := self.storage[strkey]
- if value == nil {
+ value, exists := self.storage[strkey]
+ if !exists {
value = self.getAddr(key)
-
- if !value.IsNil() {
+ if (value != common.Hash{}) {
self.storage[strkey] = value
}
}
@@ -165,15 +158,16 @@ func (self *StateObject) GetState(key common.Hash) *common.Value {
return value
}
-func (self *StateObject) SetState(k common.Hash, value *common.Value) {
- self.storage[k.Str()] = value.Copy()
+func (self *StateObject) SetState(k, value common.Hash) {
+ self.storage[k.Str()] = value
self.dirty = true
}
-func (self *StateObject) Sync() {
+// Update updates the current cached storage to the trie
+func (self *StateObject) Update() {
for key, value := range self.storage {
- if value.Len() == 0 {
- self.State.trie.Delete([]byte(key))
+ if (value == common.Hash{}) {
+ self.trie.Delete([]byte(key))
continue
}
@@ -266,9 +260,7 @@ func (self *StateObject) Copy() *StateObject {
stateObject.balance.Set(self.balance)
stateObject.codeHash = common.CopyBytes(self.codeHash)
stateObject.nonce = self.nonce
- if self.State != nil {
- stateObject.State = self.State.Copy()
- }
+ stateObject.trie = self.trie
stateObject.code = common.CopyBytes(self.code)
stateObject.initCode = common.CopyBytes(self.initCode)
stateObject.storage = self.storage.Copy()
@@ -306,11 +298,11 @@ func (c *StateObject) Init() Code {
}
func (self *StateObject) Trie() *trie.SecureTrie {
- return self.State.trie
+ return self.trie
}
func (self *StateObject) Root() []byte {
- return self.Trie().Root()
+ return self.trie.Root()
}
func (self *StateObject) Code() []byte {
@@ -342,10 +334,10 @@ func (self *StateObject) EachStorage(cb func(key, value []byte)) {
cb([]byte(h), v.Bytes())
}
- it := self.State.trie.Iterator()
+ it := self.trie.Iterator()
for it.Next() {
// ignore cached values
- key := self.State.trie.GetKey(it.Key)
+ key := self.trie.GetKey(it.Key)
if _, ok := self.storage[string(key)]; !ok {
cb(key, it.Value)
}
@@ -369,8 +361,8 @@ func (c *StateObject) RlpDecode(data []byte) {
decoder := common.NewValueFromBytes(data)
c.nonce = decoder.Get(0).Uint()
c.balance = decoder.Get(1).BigInt()
- c.State = New(common.BytesToHash(decoder.Get(2).Bytes()), c.db) //New(trie.New(common.Config.Db, decoder.Get(2).Interface()))
- c.storage = make(map[string]*common.Value)
+ c.trie = trie.NewSecure(decoder.Get(2).Bytes(), c.db)
+ c.storage = make(map[string]common.Hash)
c.gasPool = new(big.Int)
c.codeHash = decoder.Get(3).Bytes()
diff --git a/core/state/state_test.go b/core/state/state_test.go
index 09a65de54..00e133dab 100644
--- a/core/state/state_test.go
+++ b/core/state/state_test.go
@@ -70,37 +70,34 @@ func TestNull(t *testing.T) {
address := common.HexToAddress("0x823140710bf13990e4500136726d8b55")
state.CreateAccount(address)
//value := common.FromHex("0x823140710bf13990e4500136726d8b55")
- value := make([]byte, 16)
+ var value common.Hash
state.SetState(address, common.Hash{}, value)
state.Update()
state.Sync()
value = state.GetState(address, common.Hash{})
+ if !common.EmptyHash(value) {
+ t.Errorf("expected empty hash. got %x", value)
+ }
}
func (s *StateSuite) TestSnapshot(c *checker.C) {
stateobjaddr := toAddr([]byte("aa"))
- storageaddr := common.Big("0")
- data1 := common.NewValue(42)
- data2 := common.NewValue(43)
+ var storageaddr common.Hash
+ data1 := common.BytesToHash([]byte{42})
+ data2 := common.BytesToHash([]byte{43})
- // get state object
- stateObject := s.state.GetOrNewStateObject(stateobjaddr)
// set inital state object value
- stateObject.SetStorage(storageaddr, data1)
+ s.state.SetState(stateobjaddr, storageaddr, data1)
// get snapshot of current state
snapshot := s.state.Copy()
- // get state object. is this strictly necessary?
- stateObject = s.state.GetStateObject(stateobjaddr)
// set new state object value
- stateObject.SetStorage(storageaddr, data2)
+ s.state.SetState(stateobjaddr, storageaddr, data2)
// restore snapshot
s.state.Set(snapshot)
- // get state object
- stateObject = s.state.GetStateObject(stateobjaddr)
// get state storage value
- res := stateObject.GetStorage(storageaddr)
+ res := s.state.GetState(stateobjaddr, storageaddr)
c.Assert(data1, checker.DeepEquals, res)
}
diff --git a/core/state/statedb.go b/core/state/statedb.go
index b3050515b..f6f63f329 100644
--- a/core/state/statedb.go
+++ b/core/state/statedb.go
@@ -21,7 +21,7 @@ type StateDB struct {
stateObjects map[string]*StateObject
- refund map[string]*big.Int
+ refund *big.Int
thash, bhash common.Hash
txIndex int
@@ -31,7 +31,7 @@ type StateDB struct {
// Create a new state from a given trie
func New(root common.Hash, db common.Database) *StateDB {
trie := trie.NewSecure(root[:], db)
- return &StateDB{db: db, trie: trie, stateObjects: make(map[string]*StateObject), refund: make(map[string]*big.Int), logs: make(map[common.Hash]Logs)}
+ return &StateDB{db: db, trie: trie, stateObjects: make(map[string]*StateObject), refund: new(big.Int), logs: make(map[common.Hash]Logs)}
}
func (self *StateDB) PrintRoot() {
@@ -63,12 +63,8 @@ func (self *StateDB) Logs() Logs {
return logs
}
-func (self *StateDB) Refund(address common.Address, gas *big.Int) {
- addr := address.Str()
- if self.refund[addr] == nil {
- self.refund[addr] = new(big.Int)
- }
- self.refund[addr].Add(self.refund[addr], gas)
+func (self *StateDB) Refund(gas *big.Int) {
+ self.refund.Add(self.refund, gas)
}
/*
@@ -107,13 +103,13 @@ func (self *StateDB) GetCode(addr common.Address) []byte {
return nil
}
-func (self *StateDB) GetState(a common.Address, b common.Hash) []byte {
+func (self *StateDB) GetState(a common.Address, b common.Hash) common.Hash {
stateObject := self.GetStateObject(a)
if stateObject != nil {
- return stateObject.GetState(b).Bytes()
+ return stateObject.GetState(b)
}
- return nil
+ return common.Hash{}
}
func (self *StateDB) IsDeleted(addr common.Address) bool {
@@ -149,10 +145,10 @@ func (self *StateDB) SetCode(addr common.Address, code []byte) {
}
}
-func (self *StateDB) SetState(addr common.Address, key common.Hash, value interface{}) {
+func (self *StateDB) SetState(addr common.Address, key common.Hash, value common.Hash) {
stateObject := self.GetOrNewStateObject(addr)
if stateObject != nil {
- stateObject.SetState(key, common.NewValue(value))
+ stateObject.SetState(key, value)
}
}
@@ -263,14 +259,12 @@ func (s *StateDB) Cmp(other *StateDB) bool {
func (self *StateDB) Copy() *StateDB {
state := New(common.Hash{}, self.db)
- state.trie = self.trie.Copy()
+ state.trie = self.trie
for k, stateObject := range self.stateObjects {
state.stateObjects[k] = stateObject.Copy()
}
- for addr, refund := range self.refund {
- state.refund[addr] = new(big.Int).Set(refund)
- }
+ state.refund.Set(self.refund)
for hash, logs := range self.logs {
state.logs[hash] = make(Logs, len(logs))
@@ -302,10 +296,6 @@ func (s *StateDB) Reset() {
// Reset all nested states
for _, stateObject := range s.stateObjects {
- if stateObject.State == nil {
- continue
- }
-
stateObject.Reset()
}
@@ -316,11 +306,7 @@ func (s *StateDB) Reset() {
func (s *StateDB) Sync() {
// Sync all nested states
for _, stateObject := range s.stateObjects {
- if stateObject.State == nil {
- continue
- }
-
- stateObject.State.Sync()
+ stateObject.trie.Commit()
}
s.trie.Commit()
@@ -330,22 +316,22 @@ func (s *StateDB) Sync() {
func (self *StateDB) Empty() {
self.stateObjects = make(map[string]*StateObject)
- self.refund = make(map[string]*big.Int)
+ self.refund = new(big.Int)
}
-func (self *StateDB) Refunds() map[string]*big.Int {
+func (self *StateDB) Refunds() *big.Int {
return self.refund
}
func (self *StateDB) Update() {
- self.refund = make(map[string]*big.Int)
+ self.refund = new(big.Int)
for _, stateObject := range self.stateObjects {
if stateObject.dirty {
if stateObject.remove {
self.DeleteStateObject(stateObject)
} else {
- stateObject.Sync()
+ stateObject.Update()
self.UpdateStateObject(stateObject)
}
diff --git a/core/state_transition.go b/core/state_transition.go
index fedea8021..4a8d92375 100644
--- a/core/state_transition.go
+++ b/core/state_transition.go
@@ -241,11 +241,9 @@ func (self *StateTransition) refundGas() {
sender.AddBalance(remaining)
uhalf := new(big.Int).Div(self.gasUsed(), common.Big2)
- for addr, ref := range self.state.Refunds() {
- refund := common.BigMin(uhalf, ref)
- self.gas.Add(self.gas, refund)
- self.state.AddBalance(common.StringToAddress(addr), refund.Mul(refund, self.msg.GasPrice()))
- }
+ refund := common.BigMin(uhalf, self.state.Refunds())
+ self.gas.Add(self.gas, refund)
+ self.state.AddBalance(sender.Address(), refund.Mul(refund, self.msg.GasPrice()))
coinbase.RefundGas(self.gas, self.msg.GasPrice())
}
diff --git a/core/transaction_pool.go b/core/transaction_pool.go
index 4a0594228..5ebe3576b 100644
--- a/core/transaction_pool.go
+++ b/core/transaction_pool.go
@@ -19,6 +19,7 @@ var (
// Transaction Pool Errors
ErrInvalidSender = errors.New("Invalid sender")
ErrNonce = errors.New("Nonce too low")
+ ErrCheap = errors.New("Gas price too low for acceptance")
ErrBalance = errors.New("Insufficient balance")
ErrNonExistentAccount = errors.New("Account does not exist or account balance too low")
ErrInsufficientFunds = errors.New("Insufficient funds for gas * price + value")
@@ -27,6 +28,10 @@ var (
ErrNegativeValue = errors.New("Negative value")
)
+const (
+ maxQueued = 200 // max limit of queued txs per address
+)
+
type stateFn func() *state.StateDB
// TxPool contains all currently known transactions. Transactions
@@ -41,6 +46,7 @@ type TxPool struct {
currentState stateFn // The state function which will allow us to do some pre checkes
pendingState *state.ManagedState
gasLimit func() *big.Int // The current gas limit function callback
+ minGasPrice *big.Int
eventMux *event.TypeMux
events event.Subscription
@@ -57,8 +63,9 @@ func NewTxPool(eventMux *event.TypeMux, currentStateFn stateFn, gasLimitFn func(
eventMux: eventMux,
currentState: currentStateFn,
gasLimit: gasLimitFn,
+ minGasPrice: new(big.Int),
pendingState: state.ManageState(currentStateFn()),
- events: eventMux.Subscribe(ChainEvent{}),
+ events: eventMux.Subscribe(ChainEvent{}, GasPriceChanged{}),
}
go pool.eventLoop()
@@ -69,10 +76,15 @@ func (pool *TxPool) eventLoop() {
// Track chain events. When a chain events occurs (new chain canon block)
// we need to know the new state. The new state will help us determine
// the nonces in the managed state
- for _ = range pool.events.Chan() {
+ for ev := range pool.events.Chan() {
pool.mu.Lock()
- pool.resetState()
+ switch ev := ev.(type) {
+ case ChainEvent:
+ pool.resetState()
+ case GasPriceChanged:
+ pool.minGasPrice = ev.Price
+ }
pool.mu.Unlock()
}
@@ -93,7 +105,9 @@ func (pool *TxPool) resetState() {
if addr, err := tx.From(); err == nil {
// Set the nonce. Transaction nonce can never be lower
// than the state nonce; validatePool took care of that.
- pool.pendingState.SetNonce(addr, tx.Nonce())
+ if pool.pendingState.GetNonce(addr) < tx.Nonce() {
+ pool.pendingState.SetNonce(addr, tx.Nonce())
+ }
}
}
@@ -124,6 +138,11 @@ func (pool *TxPool) validateTx(tx *types.Transaction) error {
err error
)
+ // Drop transactions under our own minimal accepted gas price
+ if pool.minGasPrice.Cmp(tx.GasPrice()) > 0 {
+ return ErrCheap
+ }
+
// Validate the transaction sender and it's sig. Throw
// if the from fields is invalid.
if from, err = tx.From(); err != nil {
@@ -136,6 +155,11 @@ func (pool *TxPool) validateTx(tx *types.Transaction) error {
return ErrNonExistentAccount
}
+ // Last but not least check for nonce errors
+ if pool.currentState().GetNonce(from) > tx.Nonce() {
+ return ErrNonce
+ }
+
// Check the transaction doesn't exceed the current
// block limit gas.
if pool.gasLimit().Cmp(tx.GasLimit) < 0 {
@@ -162,12 +186,6 @@ func (pool *TxPool) validateTx(tx *types.Transaction) error {
return ErrIntrinsicGas
}
- // Last but not least check for nonce errors (intensive
- // operation, saved for last)
- if pool.currentState().GetNonce(from) > tx.Nonce() {
- return ErrNonce
- }
-
return nil
}
@@ -335,7 +353,16 @@ func (pool *TxPool) checkQueue() {
// Find the next consecutive nonce range starting at the
// current account nonce.
sort.Sort(addq)
- for _, e := range addq {
+ for i, e := range addq {
+ // start deleting the transactions from the queue if they exceed the limit
+ if i > maxQueued {
+ if glog.V(logger.Debug) {
+ glog.Infof("Queued tx limit exceeded for %s. Tx %s removed\n", common.PP(address[:]), common.PP(e.hash[:]))
+ }
+ delete(pool.queue[address], e.hash)
+ continue
+ }
+
if e.AccountNonce > guessedNonce {
break
}
@@ -368,10 +395,13 @@ func (pool *TxPool) removeTx(hash common.Hash) {
// validatePool removes invalid and processed transactions from the main pool.
func (pool *TxPool) validatePool() {
+ state := pool.currentState()
for hash, tx := range pool.pending {
- if err := pool.validateTx(tx); err != nil {
+ from, _ := tx.From() // err already checked
+ // perform light nonce validation
+ if state.GetNonce(from) > tx.Nonce() {
if glog.V(logger.Core) {
- glog.Infof("removed tx (%x) from pool: %v\n", hash[:4], err)
+ glog.Infof("removed tx (%x) from pool: low tx nonce\n", hash[:4])
}
delete(pool.pending, hash)
}
diff --git a/core/vm/vm.go b/core/vm/vm.go
index c5ad761f6..9e092300d 100644
--- a/core/vm/vm.go
+++ b/core/vm/vm.go
@@ -506,14 +506,14 @@ func (self *Vm) Run(context *Context, input []byte) (ret []byte, err error) {
case SLOAD:
loc := common.BigToHash(stack.pop())
- val := common.Bytes2Big(statedb.GetState(context.Address(), loc))
+ val := statedb.GetState(context.Address(), loc).Big()
stack.push(val)
case SSTORE:
loc := common.BigToHash(stack.pop())
val := stack.pop()
- statedb.SetState(context.Address(), loc, val)
+ statedb.SetState(context.Address(), loc, common.BigToHash(val))
case JUMP:
if err := jump(pc, stack.pop()); err != nil {
@@ -686,11 +686,16 @@ func (self *Vm) calculateGasAndSize(context *Context, caller ContextRef, op OpCo
var g *big.Int
y, x := stack.data[stack.len()-2], stack.data[stack.len()-1]
val := statedb.GetState(context.Address(), common.BigToHash(x))
- if len(val) == 0 && len(y.Bytes()) > 0 {
+
+ // This checks for 3 scenario's and calculates gas accordingly
+ // 1. From a zero-value address to a non-zero value (NEW VALUE)
+ // 2. From a non-zero value address to a zero-value address (DELETE)
+ // 3. From a nen-zero to a non-zero (CHANGE)
+ if common.EmptyHash(val) && !common.EmptyHash(common.BigToHash(y)) {
// 0 => non 0
g = params.SstoreSetGas
- } else if len(val) > 0 && len(y.Bytes()) == 0 {
- statedb.Refund(self.env.Origin(), params.SstoreRefundGas)
+ } else if !common.EmptyHash(val) && common.EmptyHash(common.BigToHash(y)) {
+ statedb.Refund(params.SstoreRefundGas)
g = params.SstoreClearGas
} else {
@@ -700,7 +705,7 @@ func (self *Vm) calculateGasAndSize(context *Context, caller ContextRef, op OpCo
gas.Set(g)
case SUICIDE:
if !statedb.IsDeleted(context.Address()) {
- statedb.Refund(self.env.Origin(), params.SuicideRefundGas)
+ statedb.Refund(params.SuicideRefundGas)
}
case MLOAD:
newMemSize = calcMemSize(stack.peek(), u256(32))
diff --git a/eth/backend.go b/eth/backend.go
index d2ec0cc62..37fe66abf 100644
--- a/eth/backend.go
+++ b/eth/backend.go
@@ -93,6 +93,13 @@ type Config struct {
AccountManager *accounts.Manager
SolcPath string
+ GpoMinGasPrice *big.Int
+ GpoMaxGasPrice *big.Int
+ GpoFullBlockRatio int
+ GpobaseStepDown int
+ GpobaseStepUp int
+ GpobaseCorrectionFactor int
+
// NewDB is used to create databases.
// If nil, the default is to create leveldb databases on disk.
NewDB func(path string) (common.Database, error)
@@ -193,10 +200,16 @@ type Ethereum struct {
whisper *whisper.Whisper
pow *ethash.Ethash
protocolManager *ProtocolManager
- downloader *downloader.Downloader
SolcPath string
solc *compiler.Solidity
+ GpoMinGasPrice *big.Int
+ GpoMaxGasPrice *big.Int
+ GpoFullBlockRatio int
+ GpobaseStepDown int
+ GpobaseStepUp int
+ GpobaseCorrectionFactor int
+
net *p2p.Server
eventMux *event.TypeMux
miner *miner.Miner
@@ -266,22 +279,28 @@ func New(config *Config) (*Ethereum, error) {
glog.V(logger.Info).Infof("Blockchain DB Version: %d", config.BlockChainVersion)
eth := &Ethereum{
- shutdownChan: make(chan bool),
- databasesClosed: make(chan bool),
- blockDb: blockDb,
- stateDb: stateDb,
- extraDb: extraDb,
- eventMux: &event.TypeMux{},
- accountManager: config.AccountManager,
- DataDir: config.DataDir,
- etherbase: common.HexToAddress(config.Etherbase),
- clientVersion: config.Name, // TODO should separate from Name
- ethVersionId: config.ProtocolVersion,
- netVersionId: config.NetworkId,
- NatSpec: config.NatSpec,
- MinerThreads: config.MinerThreads,
- SolcPath: config.SolcPath,
- AutoDAG: config.AutoDAG,
+ shutdownChan: make(chan bool),
+ databasesClosed: make(chan bool),
+ blockDb: blockDb,
+ stateDb: stateDb,
+ extraDb: extraDb,
+ eventMux: &event.TypeMux{},
+ accountManager: config.AccountManager,
+ DataDir: config.DataDir,
+ etherbase: common.HexToAddress(config.Etherbase),
+ clientVersion: config.Name, // TODO should separate from Name
+ ethVersionId: config.ProtocolVersion,
+ netVersionId: config.NetworkId,
+ NatSpec: config.NatSpec,
+ MinerThreads: config.MinerThreads,
+ SolcPath: config.SolcPath,
+ AutoDAG: config.AutoDAG,
+ GpoMinGasPrice: config.GpoMinGasPrice,
+ GpoMaxGasPrice: config.GpoMaxGasPrice,
+ GpoFullBlockRatio: config.GpoFullBlockRatio,
+ GpobaseStepDown: config.GpobaseStepDown,
+ GpobaseStepUp: config.GpobaseStepUp,
+ GpobaseCorrectionFactor: config.GpobaseCorrectionFactor,
}
eth.pow = ethash.New()
@@ -290,14 +309,14 @@ func New(config *Config) (*Ethereum, error) {
if err != nil {
return nil, err
}
- eth.downloader = downloader.New(eth.EventMux(), eth.chainManager.HasBlock, eth.chainManager.GetBlock)
eth.txPool = core.NewTxPool(eth.EventMux(), eth.chainManager.State, eth.chainManager.GasLimit)
+
eth.blockProcessor = core.NewBlockProcessor(stateDb, extraDb, eth.pow, eth.chainManager, eth.EventMux())
eth.chainManager.SetProcessor(eth.blockProcessor)
+ eth.protocolManager = NewProtocolManager(config.ProtocolVersion, config.NetworkId, eth.eventMux, eth.txPool, eth.pow, eth.chainManager)
+
eth.miner = miner.New(eth, eth.EventMux(), eth.pow)
eth.miner.SetGasPrice(config.GasPrice)
-
- eth.protocolManager = NewProtocolManager(config.ProtocolVersion, config.NetworkId, eth.eventMux, eth.txPool, eth.chainManager, eth.downloader)
if config.Shh {
eth.whisper = whisper.New()
eth.shhVersionId = int(eth.whisper.Version())
@@ -447,7 +466,7 @@ func (s *Ethereum) ClientVersion() string { return s.clientVersio
func (s *Ethereum) EthVersion() int { return s.ethVersionId }
func (s *Ethereum) NetVersion() int { return s.netVersionId }
func (s *Ethereum) ShhVersion() int { return s.shhVersionId }
-func (s *Ethereum) Downloader() *downloader.Downloader { return s.downloader }
+func (s *Ethereum) Downloader() *downloader.Downloader { return s.protocolManager.downloader }
// Start the ethereum
func (s *Ethereum) Start() error {
diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go
index f0a515d12..39976aae1 100644
--- a/eth/downloader/downloader.go
+++ b/eth/downloader/downloader.go
@@ -1,8 +1,10 @@
+// Package downloader contains the manual full chain synchronisation.
package downloader
import (
"bytes"
"errors"
+ "math"
"math/rand"
"sync"
"sync/atomic"
@@ -28,32 +30,39 @@ var (
crossCheckCycle = time.Second // Period after which to check for expired cross checks
maxBannedHashes = 4096 // Number of bannable hashes before phasing old ones out
+ maxBlockProcess = 256 // Number of blocks to import at once into the chain
)
var (
- errLowTd = errors.New("peers TD is too low")
- ErrBusy = errors.New("busy")
+ errBusy = errors.New("busy")
errUnknownPeer = errors.New("peer is unknown or unhealthy")
- ErrBadPeer = errors.New("action from bad peer ignored")
- ErrStallingPeer = errors.New("peer is stalling")
+ errBadPeer = errors.New("action from bad peer ignored")
+ errStallingPeer = errors.New("peer is stalling")
errBannedHead = errors.New("peer head hash already banned")
errNoPeers = errors.New("no peers to keep download active")
- ErrPendingQueue = errors.New("pending items in queue")
- ErrTimeout = errors.New("timeout")
- ErrEmptyHashSet = errors.New("empty hash set by peer")
+ errPendingQueue = errors.New("pending items in queue")
+ errTimeout = errors.New("timeout")
+ errEmptyHashSet = errors.New("empty hash set by peer")
errPeersUnavailable = errors.New("no peers available or all peers tried for block download process")
errAlreadyInPool = errors.New("hash already in pool")
- ErrInvalidChain = errors.New("retrieved hash chain is invalid")
- ErrCrossCheckFailed = errors.New("block cross-check failed")
- errCancelHashFetch = errors.New("hash fetching cancelled (requested)")
- errCancelBlockFetch = errors.New("block downloading cancelled (requested)")
+ errInvalidChain = errors.New("retrieved hash chain is invalid")
+ errCrossCheckFailed = errors.New("block cross-check failed")
+ errCancelHashFetch = errors.New("hash fetching canceled (requested)")
+ errCancelBlockFetch = errors.New("block downloading canceled (requested)")
errNoSyncActive = errors.New("no sync active")
)
+// hashCheckFn is a callback type for verifying a hash's presence in the local chain.
type hashCheckFn func(common.Hash) bool
-type getBlockFn func(common.Hash) *types.Block
+
+// blockRetrievalFn is a callback type for retrieving a block from the local chain.
+type blockRetrievalFn func(common.Hash) *types.Block
+
+// chainInsertFn is a callback type to insert a batch of blocks into the local chain.
type chainInsertFn func(types.Blocks) (int, error)
-type hashIterFn func() (common.Hash, error)
+
+// peerDropFn is a callback type for dropping a peer detected as malicious.
+type peerDropFn func(id string)
type blockPack struct {
peerId string
@@ -78,6 +87,8 @@ type Downloader struct {
checks map[common.Hash]*crossCheck // Pending cross checks to verify a hash chain
banned *set.Set // Set of hashes we've received and banned
+ interrupt int32 // Atomic boolean to signal termination
+
// Statistics
importStart time.Time // Instance when the last blocks were taken from the cache
importQueue []*Block // Previously taken blocks to check import progress
@@ -85,12 +96,16 @@ type Downloader struct {
importLock sync.Mutex
// Callbacks
- hasBlock hashCheckFn
- getBlock getBlockFn
+ hasBlock hashCheckFn // Checks if a block is present in the chain
+ getBlock blockRetrievalFn // Retrieves a block from the chain
+ insertChain chainInsertFn // Injects a batch of blocks into the chain
+ dropPeer peerDropFn // Drops a peer for misbehaving
// Status
- synchronising int32
- notified int32
+ synchroniseMock func(id string, hash common.Hash) error // Replacement for synchronise during testing
+ synchronising int32
+ processing int32
+ notified int32
// Channels
newPeerCh chan *peer
@@ -107,17 +122,20 @@ type Block struct {
OriginPeer string
}
-func New(mux *event.TypeMux, hasBlock hashCheckFn, getBlock getBlockFn) *Downloader {
+// New creates a new downloader to fetch hashes and blocks from remote peers.
+func New(mux *event.TypeMux, hasBlock hashCheckFn, getBlock blockRetrievalFn, insertChain chainInsertFn, dropPeer peerDropFn) *Downloader {
// Create the base downloader
downloader := &Downloader{
- mux: mux,
- queue: newQueue(),
- peers: newPeerSet(),
- hasBlock: hasBlock,
- getBlock: getBlock,
- newPeerCh: make(chan *peer, 1),
- hashCh: make(chan hashPack, 1),
- blockCh: make(chan blockPack, 1),
+ mux: mux,
+ queue: newQueue(),
+ peers: newPeerSet(),
+ hasBlock: hasBlock,
+ getBlock: getBlock,
+ insertChain: insertChain,
+ dropPeer: dropPeer,
+ newPeerCh: make(chan *peer, 1),
+ hashCh: make(chan hashPack, 1),
+ blockCh: make(chan blockPack, 1),
}
// Inject all the known bad hashes
downloader.banned = set.New()
@@ -150,7 +168,7 @@ func (d *Downloader) Stats() (pending int, cached int, importing int, estimate t
return
}
-// Synchronising returns the state of the downloader
+// Synchronising returns whether the downloader is currently retrieving blocks.
func (d *Downloader) Synchronising() bool {
return atomic.LoadInt32(&d.synchronising) > 0
}
@@ -183,61 +201,74 @@ func (d *Downloader) UnregisterPeer(id string) error {
return nil
}
-// Synchronise will select the peer and use it for synchronising. If an empty string is given
+// Synchronise tries to sync up our local block chain with a remote peer, both
+// adding various sanity checks as well as wrapping it with various log entries.
+func (d *Downloader) Synchronise(id string, head common.Hash) {
+ glog.V(logger.Detail).Infof("Attempting synchronisation: %v, 0x%x", id, head)
+
+ switch err := d.synchronise(id, head); err {
+ case nil:
+ glog.V(logger.Detail).Infof("Synchronisation completed")
+
+ case errBusy:
+ glog.V(logger.Detail).Infof("Synchronisation already in progress")
+
+ case errTimeout, errBadPeer, errStallingPeer, errBannedHead, errEmptyHashSet, errPeersUnavailable, errInvalidChain, errCrossCheckFailed:
+ glog.V(logger.Debug).Infof("Removing peer %v: %v", id, err)
+ d.dropPeer(id)
+
+ case errPendingQueue:
+ glog.V(logger.Debug).Infoln("Synchronisation aborted:", err)
+
+ default:
+ glog.V(logger.Warn).Infof("Synchronisation failed: %v", err)
+ }
+}
+
+// synchronise will select the peer and use it for synchronising. If an empty string is given
// it will use the best peer possible and synchronize if it's TD is higher than our own. If any of the
// checks fail an error will be returned. This method is synchronous
-func (d *Downloader) Synchronise(id string, hash common.Hash) error {
+func (d *Downloader) synchronise(id string, hash common.Hash) error {
+ // Mock out the synchonisation if testing
+ if d.synchroniseMock != nil {
+ return d.synchroniseMock(id, hash)
+ }
// Make sure only one goroutine is ever allowed past this point at once
if !atomic.CompareAndSwapInt32(&d.synchronising, 0, 1) {
- return ErrBusy
+ return errBusy
}
defer atomic.StoreInt32(&d.synchronising, 0)
// If the head hash is banned, terminate immediately
if d.banned.Has(hash) {
- return ErrInvalidChain
+ return errBannedHead
}
// Post a user notification of the sync (only once per session)
if atomic.CompareAndSwapInt32(&d.notified, 0, 1) {
glog.V(logger.Info).Infoln("Block synchronisation started")
}
-
- // Create cancel channel for aborting mid-flight
- d.cancelLock.Lock()
- d.cancelCh = make(chan struct{})
- d.cancelLock.Unlock()
-
// Abort if the queue still contains some leftover data
if _, cached := d.queue.Size(); cached > 0 && d.queue.GetHeadBlock() != nil {
- return ErrPendingQueue
+ return errPendingQueue
}
// Reset the queue and peer set to clean any internal leftover state
d.queue.Reset()
d.peers.Reset()
d.checks = make(map[common.Hash]*crossCheck)
+ // Create cancel channel for aborting mid-flight
+ d.cancelLock.Lock()
+ d.cancelCh = make(chan struct{})
+ d.cancelLock.Unlock()
+
// Retrieve the origin peer and initiate the downloading process
p := d.peers.Peer(id)
if p == nil {
return errUnknownPeer
}
-
return d.syncWithPeer(p, hash)
}
-// TakeBlocks takes blocks from the queue and yields them to the caller.
-func (d *Downloader) TakeBlocks() []*Block {
- blocks := d.queue.TakeBlocks()
- if len(blocks) > 0 {
- d.importLock.Lock()
- d.importStart = time.Now()
- d.importQueue = blocks
- d.importDone = 0
- d.importLock.Unlock()
- }
- return blocks
-}
-
// Has checks if the downloader knows about a particular hash, meaning that its
// either already downloaded of pending retrieval.
func (d *Downloader) Has(hash common.Hash) bool {
@@ -251,7 +282,7 @@ func (d *Downloader) syncWithPeer(p *peer, hash common.Hash) (err error) {
defer func() {
// reset on error
if err != nil {
- d.Cancel()
+ d.cancel()
d.mux.Post(FailedEvent{err})
} else {
d.mux.Post(DoneEvent{})
@@ -270,36 +301,34 @@ func (d *Downloader) syncWithPeer(p *peer, hash common.Hash) (err error) {
return nil
}
-// Cancel cancels all of the operations and resets the queue. It returns true
+// cancel cancels all of the operations and resets the queue. It returns true
// if the cancel operation was completed.
-func (d *Downloader) Cancel() bool {
- // If we're not syncing just return.
- hs, bs := d.queue.Size()
- if atomic.LoadInt32(&d.synchronising) == 0 && hs == 0 && bs == 0 {
- return false
- }
+func (d *Downloader) cancel() {
// Close the current cancel channel
d.cancelLock.Lock()
- select {
- case <-d.cancelCh:
- // Channel was already closed
- default:
- close(d.cancelCh)
+ if d.cancelCh != nil {
+ select {
+ case <-d.cancelCh:
+ // Channel was already closed
+ default:
+ close(d.cancelCh)
+ }
}
d.cancelLock.Unlock()
- // Reset the queue and import statistics
+ // Reset the queue
d.queue.Reset()
+}
- d.importLock.Lock()
- d.importQueue = nil
- d.importDone = 0
- d.importLock.Unlock()
-
- return true
+// Terminate interrupts the downloader, canceling all pending operations.
+func (d *Downloader) Terminate() {
+ atomic.StoreInt32(&d.interrupt, 1)
+ d.cancel()
}
-// XXX Make synchronous
+// fetchHahes starts retrieving hashes backwards from a specific peer and hash,
+// up until it finds a common ancestor. If the source peer times out, alternative
+// ones are tried for continuation.
func (d *Downloader) fetchHashes(p *peer, h common.Hash) error {
var (
start = time.Now()
@@ -317,7 +346,7 @@ func (d *Downloader) fetchHashes(p *peer, h common.Hash) error {
<-timeout.C // timeout channel should be initially empty.
getHashes := func(from common.Hash) {
- active.getHashes(from)
+ go active.getHashes(from)
timeout.Reset(hashTTL)
}
@@ -342,7 +371,7 @@ func (d *Downloader) fetchHashes(p *peer, h common.Hash) error {
// Make sure the peer actually gave something valid
if len(hashPack.hashes) == 0 {
glog.V(logger.Debug).Infof("Peer (%s) responded with empty hash set", active.id)
- return ErrEmptyHashSet
+ return errEmptyHashSet
}
for index, hash := range hashPack.hashes {
if d.banned.Has(hash) {
@@ -352,7 +381,7 @@ func (d *Downloader) fetchHashes(p *peer, h common.Hash) error {
if err := d.banBlocks(active.id, hash); err != nil {
glog.V(logger.Debug).Infof("Failed to ban batch of blocks: %v", err)
}
- return ErrInvalidChain
+ return errInvalidChain
}
}
// Determine if we're done fetching hashes (queue up all pending), and continue if not done
@@ -369,12 +398,12 @@ func (d *Downloader) fetchHashes(p *peer, h common.Hash) error {
inserts := d.queue.Insert(hashPack.hashes)
if len(inserts) == 0 && !done {
glog.V(logger.Debug).Infof("Peer (%s) responded with stale hashes", active.id)
- return ErrBadPeer
+ return errBadPeer
}
if !done {
// Check that the peer is not stalling the sync
if len(inserts) < MinHashFetch {
- return ErrStallingPeer
+ return errStallingPeer
}
// Try and fetch a random block to verify the hash batch
// Skip the last hash as the cross check races with the next hash fetch
@@ -386,9 +415,9 @@ func (d *Downloader) fetchHashes(p *peer, h common.Hash) error {
expire: time.Now().Add(blockSoftTTL),
parent: parent,
}
- active.getBlocks([]common.Hash{origin})
+ go active.getBlocks([]common.Hash{origin})
- // Also fetch a fresh
+ // Also fetch a fresh batch of hashes
getHashes(head)
continue
}
@@ -408,7 +437,7 @@ func (d *Downloader) fetchHashes(p *peer, h common.Hash) error {
block := blockPack.blocks[0]
if check, ok := d.checks[block.Hash()]; ok {
if block.ParentHash() != check.parent {
- return ErrCrossCheckFailed
+ return errCrossCheckFailed
}
delete(d.checks, block.Hash())
}
@@ -418,7 +447,7 @@ func (d *Downloader) fetchHashes(p *peer, h common.Hash) error {
for hash, check := range d.checks {
if time.Now().After(check.expire) {
glog.V(logger.Debug).Infof("Cross check timeout for %x", hash)
- return ErrCrossCheckFailed
+ return errCrossCheckFailed
}
}
@@ -438,7 +467,7 @@ func (d *Downloader) fetchHashes(p *peer, h common.Hash) error {
// if all peers have been tried, abort the process entirely or if the hash is
// the zero hash.
if p == nil || (head == common.Hash{}) {
- return ErrTimeout
+ return errTimeout
}
// set p to the active peer. this will invalidate any hashes that may be returned
// by our previous (delayed) peer.
@@ -495,12 +524,13 @@ out:
glog.V(logger.Detail).Infof("%s: no blocks delivered", peer)
break
}
- // All was successful, promote the peer
+ // All was successful, promote the peer and potentially start processing
peer.Promote()
peer.SetIdle()
glog.V(logger.Detail).Infof("%s: delivered %d blocks", peer, len(blockPack.blocks))
+ go d.process()
- case ErrInvalidChain:
+ case errInvalidChain:
// The hash chain is invalid (blocks are not ordered properly), abort
return err
@@ -524,6 +554,7 @@ out:
peer.Demote()
peer.SetIdle()
glog.V(logger.Detail).Infof("%s: delivery partially failed: %v", peer, err)
+ go d.process()
}
}
@@ -617,7 +648,7 @@ func (d *Downloader) banBlocks(peerId string, head common.Hash) error {
return errCancelBlockFetch
case <-timeout:
- return ErrTimeout
+ return errTimeout
case <-d.hashCh:
// Out of bounds hashes received, ignore them
@@ -674,6 +705,84 @@ func (d *Downloader) banBlocks(peerId string, head common.Hash) error {
}
}
+// process takes blocks from the queue and tries to import them into the chain.
+//
+// The algorithmic flow is as follows:
+// - The `processing` flag is swapped to 1 to ensure singleton access
+// - The current `cancel` channel is retrieved to detect sync abortions
+// - Blocks are iteratively taken from the cache and inserted into the chain
+// - When the cache becomes empty, insertion stops
+// - The `processing` flag is swapped back to 0
+// - A post-exit check is made whether new blocks became available
+// - This step is important: it handles a potential race condition between
+// checking for no more work, and releasing the processing "mutex". In
+// between these state changes, a block may have arrived, but a processing
+// attempt denied, so we need to re-enter to ensure the block isn't left
+// to idle in the cache.
+func (d *Downloader) process() {
+ // Make sure only one goroutine is ever allowed to process blocks at once
+ if !atomic.CompareAndSwapInt32(&d.processing, 0, 1) {
+ return
+ }
+ // If the processor just exited, but there are freshly pending items, try to
+ // reenter. This is needed because the goroutine spinned up for processing
+ // the fresh blocks might have been rejected entry to to this present thread
+ // not yet releasing the `processing` state.
+ defer func() {
+ if atomic.LoadInt32(&d.interrupt) == 0 && d.queue.GetHeadBlock() != nil {
+ d.process()
+ }
+ }()
+ // Release the lock upon exit (note, before checking for reentry!), and set
+ // the import statistics to zero.
+ defer func() {
+ d.importLock.Lock()
+ d.importQueue = nil
+ d.importDone = 0
+ d.importLock.Unlock()
+
+ atomic.StoreInt32(&d.processing, 0)
+ }()
+ // Repeat the processing as long as there are blocks to import
+ for {
+ // Fetch the next batch of blocks
+ blocks := d.queue.TakeBlocks()
+ if len(blocks) == 0 {
+ return
+ }
+ // Reset the import statistics
+ d.importLock.Lock()
+ d.importStart = time.Now()
+ d.importQueue = blocks
+ d.importDone = 0
+ d.importLock.Unlock()
+
+ // Actually import the blocks
+ glog.V(logger.Debug).Infof("Inserting chain with %d blocks (#%v - #%v)\n", len(blocks), blocks[0].RawBlock.Number(), blocks[len(blocks)-1].RawBlock.Number())
+ for len(blocks) != 0 {
+ // Check for any termination requests
+ if atomic.LoadInt32(&d.interrupt) == 1 {
+ return
+ }
+ // Retrieve the first batch of blocks to insert
+ max := int(math.Min(float64(len(blocks)), float64(maxBlockProcess)))
+ raw := make(types.Blocks, 0, max)
+ for _, block := range blocks[:max] {
+ raw = append(raw, block.RawBlock)
+ }
+ // Try to inset the blocks, drop the originating peer if there's an error
+ index, err := d.insertChain(raw)
+ if err != nil {
+ glog.V(logger.Debug).Infof("Block #%d import failed: %v", raw[index].NumberU64(), err)
+ d.dropPeer(blocks[index].OriginPeer)
+ d.cancel()
+ return
+ }
+ blocks = blocks[max:]
+ }
+ }
+}
+
// DeliverBlocks injects a new batch of blocks received from a remote node.
// This is usually invoked through the BlocksMsg by the protocol handler.
func (d *Downloader) DeliverBlocks(id string, blocks []*types.Block) error {
diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go
index 5f10fb41f..4fc4e1434 100644
--- a/eth/downloader/downloader_test.go
+++ b/eth/downloader/downloader_test.go
@@ -2,7 +2,10 @@ package downloader
import (
"encoding/binary"
+ "errors"
+ "fmt"
"math/big"
+ "sync/atomic"
"testing"
"time"
@@ -13,21 +16,29 @@ import (
)
var (
- knownHash = common.Hash{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
- unknownHash = common.Hash{9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}
- bannedHash = common.Hash{5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}
+ knownHash = common.Hash{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
+ unknownHash = common.Hash{2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}
+ bannedHash = common.Hash{3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}
+
+ genesis = createBlock(1, common.Hash{}, knownHash)
)
-func createHashes(start, amount int) (hashes []common.Hash) {
+// idCounter is used by the createHashes method the generate deterministic but unique hashes
+var idCounter = int64(2) // #1 is the genesis block
+
+// createHashes generates a batch of hashes rooted at a specific point in the chain.
+func createHashes(amount int, root common.Hash) (hashes []common.Hash) {
hashes = make([]common.Hash, amount+1)
- hashes[len(hashes)-1] = knownHash
+ hashes[len(hashes)-1] = root
- for i := range hashes[:len(hashes)-1] {
- binary.BigEndian.PutUint64(hashes[i][:8], uint64(start+i+2))
+ for i := 0; i < len(hashes)-1; i++ {
+ binary.BigEndian.PutUint64(hashes[i][:8], uint64(idCounter))
+ idCounter++
}
return
}
+// createBlock assembles a new block at the given chain height.
func createBlock(i int, parent, hash common.Hash) *types.Block {
header := &types.Header{Number: big.NewInt(int64(i))}
block := types.NewBlockWithHeader(header)
@@ -36,6 +47,13 @@ func createBlock(i int, parent, hash common.Hash) *types.Block {
return block
}
+// copyBlock makes a deep copy of a block suitable for local modifications.
+func copyBlock(block *types.Block) *types.Block {
+ return createBlock(int(block.Number().Int64()), block.ParentHeaderHash, block.HeaderHash)
+}
+
+// createBlocksFromHashes assembles a collection of blocks, each having a correct
+// place in the given hash chain.
func createBlocksFromHashes(hashes []common.Hash) map[common.Hash]*types.Block {
blocks := make(map[common.Hash]*types.Block)
for i := 0; i < len(hashes); i++ {
@@ -48,184 +66,174 @@ func createBlocksFromHashes(hashes []common.Hash) map[common.Hash]*types.Block {
return blocks
}
+// downloadTester is a test simulator for mocking out local block chain.
type downloadTester struct {
downloader *Downloader
- hashes []common.Hash // Chain of hashes simulating
- blocks map[common.Hash]*types.Block // Blocks associated with the hashes
- chain []common.Hash // Block-chain being constructed
+ ownHashes []common.Hash // Hash chain belonging to the tester
+ ownBlocks map[common.Hash]*types.Block // Blocks belonging to the tester
+ peerHashes map[string][]common.Hash // Hash chain belonging to different test peers
+ peerBlocks map[string]map[common.Hash]*types.Block // Blocks belonging to different test peers
maxHashFetch int // Overrides the maximum number of retrieved hashes
-
- t *testing.T
- done chan bool
- activePeerId string
}
-func newTester(t *testing.T, hashes []common.Hash, blocks map[common.Hash]*types.Block) *downloadTester {
+// newTester creates a new downloader test mocker.
+func newTester() *downloadTester {
tester := &downloadTester{
- t: t,
+ ownHashes: []common.Hash{knownHash},
+ ownBlocks: map[common.Hash]*types.Block{knownHash: genesis},
+ peerHashes: make(map[string][]common.Hash),
+ peerBlocks: make(map[string]map[common.Hash]*types.Block),
+ }
+ tester.downloader = New(new(event.TypeMux), tester.hasBlock, tester.getBlock, tester.insertChain, tester.dropPeer)
- hashes: hashes,
- blocks: blocks,
- chain: []common.Hash{knownHash},
+ return tester
+}
- done: make(chan bool),
+// sync starts synchronizing with a remote peer, blocking until it completes.
+func (dl *downloadTester) sync(id string) error {
+ err := dl.downloader.synchronise(id, dl.peerHashes[id][0])
+ for atomic.LoadInt32(&dl.downloader.processing) == 1 {
+ time.Sleep(time.Millisecond)
}
- var mux event.TypeMux
- downloader := New(&mux, tester.hasBlock, tester.getBlock)
- tester.downloader = downloader
+ return err
+}
- return tester
+// hasBlock checks if a block is pres ent in the testers canonical chain.
+func (dl *downloadTester) hasBlock(hash common.Hash) bool {
+ return dl.getBlock(hash) != nil
}
-// sync is a simple wrapper around the downloader to start synchronisation and
-// block until it returns
-func (dl *downloadTester) sync(peerId string, head common.Hash) error {
- dl.activePeerId = peerId
- return dl.downloader.Synchronise(peerId, head)
+// getBlock retrieves a block from the testers canonical chain.
+func (dl *downloadTester) getBlock(hash common.Hash) *types.Block {
+ return dl.ownBlocks[hash]
}
-// syncTake is starts synchronising with a remote peer, but concurrently it also
-// starts fetching blocks that the downloader retrieved. IT blocks until both go
-// routines terminate.
-func (dl *downloadTester) syncTake(peerId string, head common.Hash) ([]*Block, error) {
- // Start a block collector to take blocks as they become available
- done := make(chan struct{})
- took := []*Block{}
- go func() {
- for running := true; running; {
- select {
- case <-done:
- running = false
- default:
- time.Sleep(time.Millisecond)
- }
- // Take a batch of blocks and accumulate
- took = append(took, dl.downloader.TakeBlocks()...)
+// insertChain injects a new batch of blocks into the simulated chain.
+func (dl *downloadTester) insertChain(blocks types.Blocks) (int, error) {
+ for i, block := range blocks {
+ if _, ok := dl.ownBlocks[block.ParentHash()]; !ok {
+ return i, errors.New("unknown parent")
}
- done <- struct{}{}
- }()
- // Start the downloading, sync the taker and return
- err := dl.sync(peerId, head)
-
- done <- struct{}{}
- <-done
+ dl.ownHashes = append(dl.ownHashes, block.Hash())
+ dl.ownBlocks[block.Hash()] = block
+ }
+ return len(blocks), nil
+}
- return took, err
+// newPeer registers a new block download source into the downloader.
+func (dl *downloadTester) newPeer(id string, hashes []common.Hash, blocks map[common.Hash]*types.Block) error {
+ return dl.newSlowPeer(id, hashes, blocks, 0)
}
-func (dl *downloadTester) hasBlock(hash common.Hash) bool {
- for _, h := range dl.chain {
- if h == hash {
- return true
+// newSlowPeer registers a new block download source into the downloader, with a
+// specific delay time on processing the network packets sent to it, simulating
+// potentially slow network IO.
+func (dl *downloadTester) newSlowPeer(id string, hashes []common.Hash, blocks map[common.Hash]*types.Block, delay time.Duration) error {
+ err := dl.downloader.RegisterPeer(id, hashes[0], dl.peerGetHashesFn(id, delay), dl.peerGetBlocksFn(id, delay))
+ if err == nil {
+ // Assign the owned hashes and blocks to the peer (deep copy)
+ dl.peerHashes[id] = make([]common.Hash, len(hashes))
+ copy(dl.peerHashes[id], hashes)
+
+ dl.peerBlocks[id] = make(map[common.Hash]*types.Block)
+ for hash, block := range blocks {
+ dl.peerBlocks[id][hash] = copyBlock(block)
}
}
- return false
+ return err
}
-func (dl *downloadTester) getBlock(hash common.Hash) *types.Block {
- return dl.blocks[knownHash]
-}
-
-// getHashes retrieves a batch of hashes for reconstructing the chain.
-func (dl *downloadTester) getHashes(head common.Hash) error {
- limit := MaxHashFetch
- if dl.maxHashFetch > 0 {
- limit = dl.maxHashFetch
- }
- // Gather the next batch of hashes
- hashes := make([]common.Hash, 0, limit)
- for i, hash := range dl.hashes {
- if hash == head {
- i++
- for len(hashes) < cap(hashes) && i < len(dl.hashes) {
- hashes = append(hashes, dl.hashes[i])
+// dropPeer simulates a hard peer removal from the connection pool.
+func (dl *downloadTester) dropPeer(id string) {
+ delete(dl.peerHashes, id)
+ delete(dl.peerBlocks, id)
+
+ dl.downloader.UnregisterPeer(id)
+}
+
+// peerGetBlocksFn constructs a getHashes function associated with a particular
+// peer in the download tester. The returned function can be used to retrieve
+// batches of hashes from the particularly requested peer.
+func (dl *downloadTester) peerGetHashesFn(id string, delay time.Duration) func(head common.Hash) error {
+ return func(head common.Hash) error {
+ time.Sleep(delay)
+
+ limit := MaxHashFetch
+ if dl.maxHashFetch > 0 {
+ limit = dl.maxHashFetch
+ }
+ // Gather the next batch of hashes
+ hashes := dl.peerHashes[id]
+ result := make([]common.Hash, 0, limit)
+ for i, hash := range hashes {
+ if hash == head {
i++
+ for len(result) < cap(result) && i < len(hashes) {
+ result = append(result, hashes[i])
+ i++
+ }
+ break
}
- break
}
+ // Delay delivery a bit to allow attacks to unfold
+ go func() {
+ time.Sleep(time.Millisecond)
+ dl.downloader.DeliverHashes(id, result)
+ }()
+ return nil
}
- // Delay delivery a bit to allow attacks to unfold
- id := dl.activePeerId
- go func() {
- time.Sleep(time.Millisecond)
- dl.downloader.DeliverHashes(id, hashes)
- }()
- return nil
}
-func (dl *downloadTester) getBlocks(id string) func([]common.Hash) error {
+// peerGetBlocksFn constructs a getBlocks function associated with a particular
+// peer in the download tester. The returned function can be used to retrieve
+// batches of blocks from the particularly requested peer.
+func (dl *downloadTester) peerGetBlocksFn(id string, delay time.Duration) func([]common.Hash) error {
return func(hashes []common.Hash) error {
- blocks := make([]*types.Block, 0, len(hashes))
+ time.Sleep(delay)
+
+ blocks := dl.peerBlocks[id]
+ result := make([]*types.Block, 0, len(hashes))
for _, hash := range hashes {
- if block, ok := dl.blocks[hash]; ok {
- blocks = append(blocks, block)
+ if block, ok := blocks[hash]; ok {
+ result = append(result, block)
}
}
- go dl.downloader.DeliverBlocks(id, blocks)
+ go dl.downloader.DeliverBlocks(id, result)
return nil
}
}
-// newPeer registers a new block download source into the syncer.
-func (dl *downloadTester) newPeer(id string, td *big.Int, hash common.Hash) error {
- return dl.downloader.RegisterPeer(id, hash, dl.getHashes, dl.getBlocks(id))
-}
-
// Tests that simple synchronization, without throttling from a good peer works.
func TestSynchronisation(t *testing.T) {
// Create a small enough block chain to download and the tester
targetBlocks := blockCacheLimit - 15
- hashes := createHashes(0, targetBlocks)
+ hashes := createHashes(targetBlocks, knownHash)
blocks := createBlocksFromHashes(hashes)
- tester := newTester(t, hashes, blocks)
- tester.newPeer("peer", big.NewInt(10000), hashes[0])
+ tester := newTester()
+ tester.newPeer("peer", hashes, blocks)
// Synchronise with the peer and make sure all blocks were retrieved
- if err := tester.sync("peer", hashes[0]); err != nil {
- t.Fatalf("failed to synchronise blocks: %v", err)
- }
- if queued := len(tester.downloader.queue.blockPool); queued != targetBlocks {
- t.Fatalf("synchronised block mismatch: have %v, want %v", queued, targetBlocks)
- }
-}
-
-// Tests that the synchronized blocks can be correctly retrieved.
-func TestBlockTaking(t *testing.T) {
- // Create a small enough block chain to download and the tester
- targetBlocks := blockCacheLimit - 15
- hashes := createHashes(0, targetBlocks)
- blocks := createBlocksFromHashes(hashes)
-
- tester := newTester(t, hashes, blocks)
- tester.newPeer("peer", big.NewInt(10000), hashes[0])
-
- // Synchronise with the peer and test block retrieval
- if err := tester.sync("peer", hashes[0]); err != nil {
+ if err := tester.sync("peer"); err != nil {
t.Fatalf("failed to synchronise blocks: %v", err)
}
- if took := tester.downloader.TakeBlocks(); len(took) != targetBlocks {
- t.Fatalf("took block mismatch: have %v, want %v", len(took), targetBlocks)
+ if imported := len(tester.ownBlocks); imported != targetBlocks+1 {
+ t.Fatalf("synchronised block mismatch: have %v, want %v", imported, targetBlocks+1)
}
}
// Tests that an inactive downloader will not accept incoming hashes and blocks.
func TestInactiveDownloader(t *testing.T) {
- // Create a small enough block chain to download and the tester
- targetBlocks := blockCacheLimit - 15
- hashes := createHashes(0, targetBlocks)
- blocks := createBlocksFromHashSet(createHashSet(hashes))
-
- tester := newTester(t, nil, nil)
+ tester := newTester()
// Check that neither hashes nor blocks are accepted
- if err := tester.downloader.DeliverHashes("bad peer", hashes); err != errNoSyncActive {
+ if err := tester.downloader.DeliverHashes("bad peer", []common.Hash{}); err != errNoSyncActive {
t.Errorf("error mismatch: have %v, want %v", err, errNoSyncActive)
}
- if err := tester.downloader.DeliverBlocks("bad peer", blocks); err != errNoSyncActive {
+ if err := tester.downloader.DeliverBlocks("bad peer", []*types.Block{}); err != errNoSyncActive {
t.Errorf("error mismatch: have %v, want %v", err, errNoSyncActive)
}
}
@@ -234,27 +242,27 @@ func TestInactiveDownloader(t *testing.T) {
func TestCancel(t *testing.T) {
// Create a small enough block chain to download and the tester
targetBlocks := blockCacheLimit - 15
- hashes := createHashes(0, targetBlocks)
+ hashes := createHashes(targetBlocks, knownHash)
blocks := createBlocksFromHashes(hashes)
- tester := newTester(t, hashes, blocks)
- tester.newPeer("peer", big.NewInt(10000), hashes[0])
+ tester := newTester()
+ tester.newPeer("peer", hashes, blocks)
+ // Make sure canceling works with a pristine downloader
+ tester.downloader.cancel()
+ hashCount, blockCount := tester.downloader.queue.Size()
+ if hashCount > 0 || blockCount > 0 {
+ t.Errorf("block or hash count mismatch: %d hashes, %d blocks, want 0", hashCount, blockCount)
+ }
// Synchronise with the peer, but cancel afterwards
- if err := tester.sync("peer", hashes[0]); err != nil {
+ if err := tester.sync("peer"); err != nil {
t.Fatalf("failed to synchronise blocks: %v", err)
}
- if !tester.downloader.Cancel() {
- t.Fatalf("cancel operation failed")
- }
- // Make sure the queue reports empty and no blocks can be taken
- hashCount, blockCount := tester.downloader.queue.Size()
+ tester.downloader.cancel()
+ hashCount, blockCount = tester.downloader.queue.Size()
if hashCount > 0 || blockCount > 0 {
t.Errorf("block or hash count mismatch: %d hashes, %d blocks, want 0", hashCount, blockCount)
}
- if took := tester.downloader.TakeBlocks(); len(took) != 0 {
- t.Errorf("taken blocks mismatch: have %d, want %d", len(took), 0)
- }
}
// Tests that if a large batch of blocks are being downloaded, it is throttled
@@ -262,98 +270,167 @@ func TestCancel(t *testing.T) {
func TestThrottling(t *testing.T) {
// Create a long block chain to download and the tester
targetBlocks := 8 * blockCacheLimit
- hashes := createHashes(0, targetBlocks)
+ hashes := createHashes(targetBlocks, knownHash)
blocks := createBlocksFromHashes(hashes)
- tester := newTester(t, hashes, blocks)
- tester.newPeer("peer", big.NewInt(10000), hashes[0])
+ tester := newTester()
+ tester.newPeer("peer", hashes, blocks)
+ // Wrap the importer to allow stepping
+ done := make(chan int)
+ tester.downloader.insertChain = func(blocks types.Blocks) (int, error) {
+ n, err := tester.insertChain(blocks)
+ done <- n
+ return n, err
+ }
// Start a synchronisation concurrently
errc := make(chan error)
go func() {
- errc <- tester.sync("peer", hashes[0])
+ errc <- tester.sync("peer")
}()
// Iteratively take some blocks, always checking the retrieval count
- for total := 0; total < targetBlocks; {
- // Wait a bit for sync to complete
+ for len(tester.ownBlocks) < targetBlocks+1 {
+ // Wait a bit for sync to throttle itself
+ var cached int
for start := time.Now(); time.Since(start) < 3*time.Second; {
time.Sleep(25 * time.Millisecond)
- if len(tester.downloader.queue.blockPool) == blockCacheLimit {
+
+ cached = len(tester.downloader.queue.blockPool)
+ if cached == blockCacheLimit || len(tester.ownBlocks)+cached == targetBlocks+1 {
break
}
}
- // Fetch the next batch of blocks
- took := tester.downloader.TakeBlocks()
- if len(took) != blockCacheLimit {
- t.Fatalf("block count mismatch: have %v, want %v", len(took), blockCacheLimit)
+ // Make sure we filled up the cache, then exhaust it
+ time.Sleep(25 * time.Millisecond) // give it a chance to screw up
+ if cached != blockCacheLimit && len(tester.ownBlocks)+cached < targetBlocks+1 {
+ t.Fatalf("block count mismatch: have %v, want %v", cached, blockCacheLimit)
}
- total += len(took)
- if total > targetBlocks {
- t.Fatalf("target block count mismatch: have %v, want %v", total, targetBlocks)
+ <-done // finish previous blocking import
+ for cached > maxBlockProcess {
+ cached -= <-done
}
+ time.Sleep(25 * time.Millisecond) // yield to the insertion
+ }
+ <-done // finish the last blocking import
+
+ // Check that we haven't pulled more blocks than available
+ if len(tester.ownBlocks) > targetBlocks+1 {
+ t.Fatalf("target block count mismatch: have %v, want %v", len(tester.ownBlocks), targetBlocks+1)
}
if err := <-errc; err != nil {
t.Fatalf("block synchronization failed: %v", err)
}
}
+// Tests that synchronisation from multiple peers works as intended (multi thread sanity test).
+func TestMultiSynchronisation(t *testing.T) {
+ // Create various peers with various parts of the chain
+ targetPeers := 16
+ targetBlocks := targetPeers*blockCacheLimit - 15
+
+ hashes := createHashes(targetBlocks, knownHash)
+ blocks := createBlocksFromHashes(hashes)
+
+ tester := newTester()
+ for i := 0; i < targetPeers; i++ {
+ id := fmt.Sprintf("peer #%d", i)
+ tester.newPeer(id, hashes[i*blockCacheLimit:], blocks)
+ }
+ // Synchronise with the middle peer and make sure half of the blocks were retrieved
+ id := fmt.Sprintf("peer #%d", targetPeers/2)
+ if err := tester.sync(id); err != nil {
+ t.Fatalf("failed to synchronise blocks: %v", err)
+ }
+ if imported := len(tester.ownBlocks); imported != len(tester.peerHashes[id]) {
+ t.Fatalf("synchronised block mismatch: have %v, want %v", imported, len(tester.peerHashes[id]))
+ }
+ // Synchronise with the best peer and make sure everything is retrieved
+ if err := tester.sync("peer #0"); err != nil {
+ t.Fatalf("failed to synchronise blocks: %v", err)
+ }
+ if imported := len(tester.ownBlocks); imported != targetBlocks+1 {
+ t.Fatalf("synchronised block mismatch: have %v, want %v", imported, targetBlocks+1)
+ }
+}
+
+// Tests that synchronising with a peer who's very slow at network IO does not
+// stall the other peers in the system.
+func TestSlowSynchronisation(t *testing.T) {
+ tester := newTester()
+
+ // Create a batch of blocks, with a slow and a full speed peer
+ targetCycles := 2
+ targetBlocks := targetCycles*blockCacheLimit - 15
+ targetIODelay := time.Second
+
+ hashes := createHashes(targetBlocks, knownHash)
+ blocks := createBlocksFromHashes(hashes)
+
+ tester.newSlowPeer("fast", hashes, blocks, 0)
+ tester.newSlowPeer("slow", hashes, blocks, targetIODelay)
+
+ // Try to sync with the peers (pull hashes from fast)
+ start := time.Now()
+ if err := tester.sync("fast"); err != nil {
+ t.Fatalf("failed to synchronise blocks: %v", err)
+ }
+ if imported := len(tester.ownBlocks); imported != targetBlocks+1 {
+ t.Fatalf("synchronised block mismatch: have %v, want %v", imported, targetBlocks+1)
+ }
+ // Check that the slow peer got hit at most once per block-cache-size import
+ limit := time.Duration(targetCycles+1) * targetIODelay
+ if delay := time.Since(start); delay >= limit {
+ t.Fatalf("synchronisation exceeded delay limit: have %v, want %v", delay, limit)
+ }
+}
+
// Tests that if a peer returns an invalid chain with a block pointing to a non-
// existing parent, it is correctly detected and handled.
func TestNonExistingParentAttack(t *testing.T) {
+ tester := newTester()
+
// Forge a single-link chain with a forged header
- hashes := createHashes(0, 1)
+ hashes := createHashes(1, knownHash)
blocks := createBlocksFromHashes(hashes)
+ tester.newPeer("valid", hashes, blocks)
- forged := blocks[hashes[0]]
- forged.ParentHeaderHash = unknownHash
+ hashes = createHashes(1, knownHash)
+ blocks = createBlocksFromHashes(hashes)
+ blocks[hashes[0]].ParentHeaderHash = unknownHash
+ tester.newPeer("attack", hashes, blocks)
// Try and sync with the malicious node and check that it fails
- tester := newTester(t, hashes, blocks)
- tester.newPeer("attack", big.NewInt(10000), hashes[0])
- if err := tester.sync("attack", hashes[0]); err != nil {
- t.Fatalf("failed to synchronise blocks: %v", err)
+ if err := tester.sync("attack"); err == nil {
+ t.Fatalf("block synchronization succeeded")
}
- bs := tester.downloader.TakeBlocks()
- if len(bs) != 1 {
- t.Fatalf("retrieved block mismatch: have %v, want %v", len(bs), 1)
+ if tester.hasBlock(hashes[0]) {
+ t.Fatalf("tester accepted unknown-parent block: %v", blocks[hashes[0]])
}
- if tester.hasBlock(bs[0].RawBlock.ParentHash()) {
- t.Fatalf("tester knows about the unknown hash")
- }
- tester.downloader.Cancel()
-
- // Reconstruct a valid chain, and try to synchronize with it
- forged.ParentHeaderHash = knownHash
- tester.newPeer("valid", big.NewInt(20000), hashes[0])
- if err := tester.sync("valid", hashes[0]); err != nil {
+ // Try to synchronize with the valid chain and make sure it succeeds
+ if err := tester.sync("valid"); err != nil {
t.Fatalf("failed to synchronise blocks: %v", err)
}
- bs = tester.downloader.TakeBlocks()
- if len(bs) != 1 {
- t.Fatalf("retrieved block mismatch: have %v, want %v", len(bs), 1)
- }
- if !tester.hasBlock(bs[0].RawBlock.ParentHash()) {
- t.Fatalf("tester doesn't know about the origin hash")
+ if !tester.hasBlock(tester.peerHashes["valid"][0]) {
+ t.Fatalf("tester didn't accept known-parent block: %v", tester.peerBlocks["valid"][hashes[0]])
}
}
// Tests that if a malicious peers keeps sending us repeating hashes, we don't
// loop indefinitely.
-func TestRepeatingHashAttack(t *testing.T) {
+func TestRepeatingHashAttack(t *testing.T) { // TODO: Is this thing valid??
+ tester := newTester()
+
// Create a valid chain, but drop the last link
- hashes := createHashes(0, blockCacheLimit)
+ hashes := createHashes(blockCacheLimit, knownHash)
blocks := createBlocksFromHashes(hashes)
- forged := hashes[:len(hashes)-1]
+ tester.newPeer("valid", hashes, blocks)
+ tester.newPeer("attack", hashes[:len(hashes)-1], blocks)
// Try and sync with the malicious node
- tester := newTester(t, forged, blocks)
- tester.newPeer("attack", big.NewInt(10000), forged[0])
-
errc := make(chan error)
go func() {
- errc <- tester.sync("attack", hashes[0])
+ errc <- tester.sync("attack")
}()
-
// Make sure that syncing returns and does so with a failure
select {
case <-time.After(time.Second):
@@ -364,9 +441,7 @@ func TestRepeatingHashAttack(t *testing.T) {
}
}
// Ensure that a valid chain can still pass sync
- tester.hashes = hashes
- tester.newPeer("valid", big.NewInt(20000), hashes[0])
- if err := tester.sync("valid", hashes[0]); err != nil {
+ if err := tester.sync("valid"); err != nil {
t.Fatalf("failed to synchronise blocks: %v", err)
}
}
@@ -374,23 +449,22 @@ func TestRepeatingHashAttack(t *testing.T) {
// Tests that if a malicious peers returns a non-existent block hash, it should
// eventually time out and the sync reattempted.
func TestNonExistingBlockAttack(t *testing.T) {
+ tester := newTester()
+
// Create a valid chain, but forge the last link
- hashes := createHashes(0, blockCacheLimit)
+ hashes := createHashes(blockCacheLimit, knownHash)
blocks := createBlocksFromHashes(hashes)
- origin := hashes[len(hashes)/2]
+ tester.newPeer("valid", hashes, blocks)
hashes[len(hashes)/2] = unknownHash
+ tester.newPeer("attack", hashes, blocks)
// Try and sync with the malicious node and check that it fails
- tester := newTester(t, hashes, blocks)
- tester.newPeer("attack", big.NewInt(10000), hashes[0])
- if err := tester.sync("attack", hashes[0]); err != errPeersUnavailable {
+ if err := tester.sync("attack"); err != errPeersUnavailable {
t.Fatalf("synchronisation error mismatch: have %v, want %v", err, errPeersUnavailable)
}
// Ensure that a valid chain can still pass sync
- hashes[len(hashes)/2] = origin
- tester.newPeer("valid", big.NewInt(20000), hashes[0])
- if err := tester.sync("valid", hashes[0]); err != nil {
+ if err := tester.sync("valid"); err != nil {
t.Fatalf("failed to synchronise blocks: %v", err)
}
}
@@ -398,30 +472,28 @@ func TestNonExistingBlockAttack(t *testing.T) {
// Tests that if a malicious peer is returning hashes in a weird order, that the
// sync throttler doesn't choke on them waiting for the valid blocks.
func TestInvalidHashOrderAttack(t *testing.T) {
+ tester := newTester()
+
// Create a valid long chain, but reverse some hashes within
- hashes := createHashes(0, 4*blockCacheLimit)
+ hashes := createHashes(4*blockCacheLimit, knownHash)
blocks := createBlocksFromHashes(hashes)
+ tester.newPeer("valid", hashes, blocks)
chunk1 := make([]common.Hash, blockCacheLimit)
chunk2 := make([]common.Hash, blockCacheLimit)
copy(chunk1, hashes[blockCacheLimit:2*blockCacheLimit])
copy(chunk2, hashes[2*blockCacheLimit:3*blockCacheLimit])
- reverse := make([]common.Hash, len(hashes))
- copy(reverse, hashes)
- copy(reverse[2*blockCacheLimit:], chunk1)
- copy(reverse[blockCacheLimit:], chunk2)
+ copy(hashes[2*blockCacheLimit:], chunk1)
+ copy(hashes[blockCacheLimit:], chunk2)
+ tester.newPeer("attack", hashes, blocks)
// Try and sync with the malicious node and check that it fails
- tester := newTester(t, reverse, blocks)
- tester.newPeer("attack", big.NewInt(10000), reverse[0])
- if _, err := tester.syncTake("attack", reverse[0]); err != ErrInvalidChain {
- t.Fatalf("synchronisation error mismatch: have %v, want %v", err, ErrInvalidChain)
+ if err := tester.sync("attack"); err != errInvalidChain {
+ t.Fatalf("synchronisation error mismatch: have %v, want %v", err, errInvalidChain)
}
// Ensure that a valid chain can still pass sync
- tester.hashes = hashes
- tester.newPeer("valid", big.NewInt(20000), hashes[0])
- if _, err := tester.syncTake("valid", hashes[0]); err != nil {
+ if err := tester.sync("valid"); err != nil {
t.Fatalf("failed to synchronise blocks: %v", err)
}
}
@@ -429,17 +501,24 @@ func TestInvalidHashOrderAttack(t *testing.T) {
// Tests that if a malicious peer makes up a random hash chain and tries to push
// indefinitely, it actually gets caught with it.
func TestMadeupHashChainAttack(t *testing.T) {
+ tester := newTester()
blockSoftTTL = 100 * time.Millisecond
crossCheckCycle = 25 * time.Millisecond
// Create a long chain of hashes without backing blocks
- hashes := createHashes(0, 1024*blockCacheLimit)
+ hashes := createHashes(4*blockCacheLimit, knownHash)
+ blocks := createBlocksFromHashes(hashes)
+
+ tester.newPeer("valid", hashes, blocks)
+ tester.newPeer("attack", createHashes(1024*blockCacheLimit, knownHash), nil)
// Try and sync with the malicious node and check that it fails
- tester := newTester(t, hashes, nil)
- tester.newPeer("attack", big.NewInt(10000), hashes[0])
- if _, err := tester.syncTake("attack", hashes[0]); err != ErrCrossCheckFailed {
- t.Fatalf("synchronisation error mismatch: have %v, want %v", err, ErrCrossCheckFailed)
+ if err := tester.sync("attack"); err != errCrossCheckFailed {
+ t.Fatalf("synchronisation error mismatch: have %v, want %v", err, errCrossCheckFailed)
+ }
+ // Ensure that a valid chain can still pass sync
+ if err := tester.sync("valid"); err != nil {
+ t.Fatalf("failed to synchronise blocks: %v", err)
}
}
@@ -449,14 +528,14 @@ func TestMadeupHashChainAttack(t *testing.T) {
// one by one prevents reliable block/parent verification.
func TestMadeupHashChainDrippingAttack(t *testing.T) {
// Create a random chain of hashes to drip
- hashes := createHashes(0, 16*blockCacheLimit)
- tester := newTester(t, hashes, nil)
+ hashes := createHashes(16*blockCacheLimit, knownHash)
+ tester := newTester()
// Try and sync with the attacker, one hash at a time
tester.maxHashFetch = 1
- tester.newPeer("attack", big.NewInt(10000), hashes[0])
- if _, err := tester.syncTake("attack", hashes[0]); err != ErrStallingPeer {
- t.Fatalf("synchronisation error mismatch: have %v, want %v", err, ErrStallingPeer)
+ tester.newPeer("attack", hashes, nil)
+ if err := tester.sync("attack"); err != errStallingPeer {
+ t.Fatalf("synchronisation error mismatch: have %v, want %v", err, errStallingPeer)
}
}
@@ -470,7 +549,7 @@ func TestMadeupBlockChainAttack(t *testing.T) {
crossCheckCycle = 25 * time.Millisecond
// Create a long chain of blocks and simulate an invalid chain by dropping every second
- hashes := createHashes(0, 16*blockCacheLimit)
+ hashes := createHashes(16*blockCacheLimit, knownHash)
blocks := createBlocksFromHashes(hashes)
gapped := make([]common.Hash, len(hashes)/2)
@@ -478,18 +557,17 @@ func TestMadeupBlockChainAttack(t *testing.T) {
gapped[i] = hashes[2*i]
}
// Try and sync with the malicious node and check that it fails
- tester := newTester(t, gapped, blocks)
- tester.newPeer("attack", big.NewInt(10000), gapped[0])
- if _, err := tester.syncTake("attack", gapped[0]); err != ErrCrossCheckFailed {
- t.Fatalf("synchronisation error mismatch: have %v, want %v", err, ErrCrossCheckFailed)
+ tester := newTester()
+ tester.newPeer("attack", gapped, blocks)
+ if err := tester.sync("attack"); err != errCrossCheckFailed {
+ t.Fatalf("synchronisation error mismatch: have %v, want %v", err, errCrossCheckFailed)
}
// Ensure that a valid chain can still pass sync
blockSoftTTL = defaultBlockTTL
crossCheckCycle = defaultCrossCheckCycle
- tester.hashes = hashes
- tester.newPeer("valid", big.NewInt(20000), hashes[0])
- if _, err := tester.syncTake("valid", hashes[0]); err != nil {
+ tester.newPeer("valid", hashes, blocks)
+ if err := tester.sync("valid"); err != nil {
t.Fatalf("failed to synchronise blocks: %v", err)
}
}
@@ -498,6 +576,8 @@ func TestMadeupBlockChainAttack(t *testing.T) {
// attacker make up a valid hashes for random blocks, but also forges the block
// parents to point to existing hashes.
func TestMadeupParentBlockChainAttack(t *testing.T) {
+ tester := newTester()
+
defaultBlockTTL := blockSoftTTL
defaultCrossCheckCycle := crossCheckCycle
@@ -505,25 +585,24 @@ func TestMadeupParentBlockChainAttack(t *testing.T) {
crossCheckCycle = 25 * time.Millisecond
// Create a long chain of blocks and simulate an invalid chain by dropping every second
- hashes := createHashes(0, 16*blockCacheLimit)
+ hashes := createHashes(16*blockCacheLimit, knownHash)
blocks := createBlocksFromHashes(hashes)
- forges := createBlocksFromHashes(hashes)
- for hash, block := range forges {
- block.ParentHeaderHash = hash // Simulate pointing to already known hash
+ tester.newPeer("valid", hashes, blocks)
+
+ for _, block := range blocks {
+ block.ParentHeaderHash = knownHash // Simulate pointing to already known hash
}
+ tester.newPeer("attack", hashes, blocks)
+
// Try and sync with the malicious node and check that it fails
- tester := newTester(t, hashes, forges)
- tester.newPeer("attack", big.NewInt(10000), hashes[0])
- if _, err := tester.syncTake("attack", hashes[0]); err != ErrCrossCheckFailed {
- t.Fatalf("synchronisation error mismatch: have %v, want %v", err, ErrCrossCheckFailed)
+ if err := tester.sync("attack"); err != errCrossCheckFailed {
+ t.Fatalf("synchronisation error mismatch: have %v, want %v", err, errCrossCheckFailed)
}
// Ensure that a valid chain can still pass sync
blockSoftTTL = defaultBlockTTL
crossCheckCycle = defaultCrossCheckCycle
- tester.blocks = blocks
- tester.newPeer("valid", big.NewInt(20000), hashes[0])
- if _, err := tester.syncTake("valid", hashes[0]); err != nil {
+ if err := tester.sync("valid"); err != nil {
t.Fatalf("failed to synchronise blocks: %v", err)
}
}
@@ -532,68 +611,81 @@ func TestMadeupParentBlockChainAttack(t *testing.T) {
// the downloader, it will not keep refetching the same chain indefinitely, but
// gradually block pieces of it, until it's head is also blocked.
func TestBannedChainStarvationAttack(t *testing.T) {
- // Construct a valid chain, but ban one of the hashes in it
- hashes := createHashes(0, 8*blockCacheLimit)
- hashes[len(hashes)/2+23] = bannedHash // weird index to have non multiple of ban chunk size
+ // Create the tester and ban the selected hash
+ tester := newTester()
+ tester.downloader.banned.Add(bannedHash)
+ // Construct a valid chain, for it and ban the fork
+ hashes := createHashes(8*blockCacheLimit, knownHash)
blocks := createBlocksFromHashes(hashes)
+ tester.newPeer("valid", hashes, blocks)
- // Create the tester and ban the selected hash
- tester := newTester(t, hashes, blocks)
- tester.downloader.banned.Add(bannedHash)
+ fork := len(hashes)/2 - 23
+ hashes = append(createHashes(4*blockCacheLimit, bannedHash), hashes[fork:]...)
+ blocks = createBlocksFromHashes(hashes)
+ tester.newPeer("attack", hashes, blocks)
// Iteratively try to sync, and verify that the banned hash list grows until
// the head of the invalid chain is blocked too.
- tester.newPeer("attack", big.NewInt(10000), hashes[0])
for banned := tester.downloader.banned.Size(); ; {
// Try to sync with the attacker, check hash chain failure
- if _, err := tester.syncTake("attack", hashes[0]); err != ErrInvalidChain {
- t.Fatalf("synchronisation error mismatch: have %v, want %v", err, ErrInvalidChain)
+ if err := tester.sync("attack"); err != errInvalidChain {
+ if tester.downloader.banned.Has(hashes[0]) && err == errBannedHead {
+ break
+ }
+ t.Fatalf("synchronisation error mismatch: have %v, want %v", err, errInvalidChain)
}
// Check that the ban list grew with at least 1 new item, or all banned
bans := tester.downloader.banned.Size()
if bans < banned+1 {
- if tester.downloader.banned.Has(hashes[0]) {
- break
- }
t.Fatalf("ban count mismatch: have %v, want %v+", bans, banned+1)
}
banned = bans
}
// Check that after banning an entire chain, bad peers get dropped
- if err := tester.newPeer("new attacker", big.NewInt(10000), hashes[0]); err != errBannedHead {
+ if err := tester.newPeer("new attacker", hashes, blocks); err != errBannedHead {
t.Fatalf("peer registration mismatch: have %v, want %v", err, errBannedHead)
}
- if peer := tester.downloader.peers.Peer("net attacker"); peer != nil {
+ if peer := tester.downloader.peers.Peer("new attacker"); peer != nil {
t.Fatalf("banned attacker registered: %v", peer)
}
+ // Ensure that a valid chain can still pass sync
+ if err := tester.sync("valid"); err != nil {
+ t.Fatalf("failed to synchronise blocks: %v", err)
+ }
}
// Tests that if a peer sends excessively many/large invalid chains that are
// gradually banned, it will have an upper limit on the consumed memory and also
// the origin bad hashes will not be evacuated.
func TestBannedChainMemoryExhaustionAttack(t *testing.T) {
+ // Create the tester and ban the selected hash
+ tester := newTester()
+ tester.downloader.banned.Add(bannedHash)
+
// Reduce the test size a bit
+ defaultMaxBlockFetch := MaxBlockFetch
+ defaultMaxBannedHashes := maxBannedHashes
+
MaxBlockFetch = 4
maxBannedHashes = 256
// Construct a banned chain with more chunks than the ban limit
- hashes := createHashes(0, maxBannedHashes*MaxBlockFetch)
- hashes[len(hashes)-1] = bannedHash // weird index to have non multiple of ban chunk size
-
+ hashes := createHashes(8*blockCacheLimit, knownHash)
blocks := createBlocksFromHashes(hashes)
+ tester.newPeer("valid", hashes, blocks)
- // Create the tester and ban the selected hash
- tester := newTester(t, hashes, blocks)
- tester.downloader.banned.Add(bannedHash)
+ fork := len(hashes)/2 - 23
+ hashes = append(createHashes(maxBannedHashes*MaxBlockFetch, bannedHash), hashes[fork:]...)
+ blocks = createBlocksFromHashes(hashes)
+ tester.newPeer("attack", hashes, blocks)
// Iteratively try to sync, and verify that the banned hash list grows until
// the head of the invalid chain is blocked too.
- tester.newPeer("attack", big.NewInt(10000), hashes[0])
for {
// Try to sync with the attacker, check hash chain failure
- if _, err := tester.syncTake("attack", hashes[0]); err != ErrInvalidChain {
- t.Fatalf("synchronisation error mismatch: have %v, want %v", err, ErrInvalidChain)
+ if err := tester.sync("attack"); err != errInvalidChain {
+ t.Fatalf("synchronisation error mismatch: have %v, want %v", err, errInvalidChain)
}
// Short circuit if the entire chain was banned
if tester.downloader.banned.Has(hashes[0]) {
@@ -609,4 +701,124 @@ func TestBannedChainMemoryExhaustionAttack(t *testing.T) {
}
}
}
+ // Ensure that a valid chain can still pass sync
+ MaxBlockFetch = defaultMaxBlockFetch
+ maxBannedHashes = defaultMaxBannedHashes
+
+ if err := tester.sync("valid"); err != nil {
+ t.Fatalf("failed to synchronise blocks: %v", err)
+ }
+}
+
+// Tests a corner case (potential attack) where a peer delivers both good as well
+// as unrequested blocks to a hash request. This may trigger a different code
+// path than the fully correct or fully invalid delivery, potentially causing
+// internal state problems
+//
+// No, don't delete this test, it actually did happen!
+func TestOverlappingDeliveryAttack(t *testing.T) {
+ // Create an arbitrary batch of blocks ( < cache-size not to block)
+ targetBlocks := blockCacheLimit - 23
+ hashes := createHashes(targetBlocks, knownHash)
+ blocks := createBlocksFromHashes(hashes)
+
+ // Register an attacker that always returns non-requested blocks too
+ tester := newTester()
+ tester.newPeer("attack", hashes, blocks)
+
+ rawGetBlocks := tester.downloader.peers.Peer("attack").getBlocks
+ tester.downloader.peers.Peer("attack").getBlocks = func(request []common.Hash) error {
+ // Add a non requested hash the screw the delivery (genesis should be fine)
+ return rawGetBlocks(append(request, hashes[0]))
+ }
+ // Test that synchronisation can complete, check for import success
+ if err := tester.sync("attack"); err != nil {
+ t.Fatalf("failed to synchronise blocks: %v", err)
+ }
+ start := time.Now()
+ for len(tester.ownHashes) != len(hashes) && time.Since(start) < time.Second {
+ time.Sleep(50 * time.Millisecond)
+ }
+ if len(tester.ownHashes) != len(hashes) {
+ t.Fatalf("chain length mismatch: have %v, want %v", len(tester.ownHashes), len(hashes))
+ }
+}
+
+// Tests that misbehaving peers are disconnected, whilst behaving ones are not.
+func TestHashAttackerDropping(t *testing.T) {
+ // Define the disconnection requirement for individual hash fetch errors
+ tests := []struct {
+ result error
+ drop bool
+ }{
+ {nil, false}, // Sync succeeded, all is well
+ {errBusy, false}, // Sync is already in progress, no problem
+ {errUnknownPeer, false}, // Peer is unknown, was already dropped, don't double drop
+ {errBadPeer, true}, // Peer was deemed bad for some reason, drop it
+ {errStallingPeer, true}, // Peer was detected to be stalling, drop it
+ {errBannedHead, true}, // Peer's head hash is a known bad hash, drop it
+ {errNoPeers, false}, // No peers to download from, soft race, no issue
+ {errPendingQueue, false}, // There are blocks still cached, wait to exhaust, no issue
+ {errTimeout, true}, // No hashes received in due time, drop the peer
+ {errEmptyHashSet, true}, // No hashes were returned as a response, drop as it's a dead end
+ {errPeersUnavailable, true}, // Nobody had the advertised blocks, drop the advertiser
+ {errInvalidChain, true}, // Hash chain was detected as invalid, definitely drop
+ {errCrossCheckFailed, true}, // Hash-origin failed to pass a block cross check, drop
+ {errCancelHashFetch, false}, // Synchronisation was canceled, origin may be innocent, don't drop
+ {errCancelBlockFetch, false}, // Synchronisation was canceled, origin may be innocent, don't drop
+ }
+ // Run the tests and check disconnection status
+ tester := newTester()
+ for i, tt := range tests {
+ // Register a new peer and ensure it's presence
+ id := fmt.Sprintf("test %d", i)
+ if err := tester.newPeer(id, []common.Hash{knownHash}, nil); err != nil {
+ t.Fatalf("test %d: failed to register new peer: %v", i, err)
+ }
+ if _, ok := tester.peerHashes[id]; !ok {
+ t.Fatalf("test %d: registered peer not found", i)
+ }
+ // Simulate a synchronisation and check the required result
+ tester.downloader.synchroniseMock = func(string, common.Hash) error { return tt.result }
+
+ tester.downloader.Synchronise(id, knownHash)
+ if _, ok := tester.peerHashes[id]; !ok != tt.drop {
+ t.Errorf("test %d: peer drop mismatch for %v: have %v, want %v", i, tt.result, !ok, tt.drop)
+ }
+ }
+}
+
+// Tests that feeding bad blocks will result in a peer drop.
+func TestBlockAttackerDropping(t *testing.T) {
+ // Define the disconnection requirement for individual block import errors
+ tests := []struct {
+ failure bool
+ drop bool
+ }{{true, true}, {false, false}}
+
+ // Run the tests and check disconnection status
+ tester := newTester()
+ for i, tt := range tests {
+ // Register a new peer and ensure it's presence
+ id := fmt.Sprintf("test %d", i)
+ if err := tester.newPeer(id, []common.Hash{common.Hash{}}, nil); err != nil {
+ t.Fatalf("test %d: failed to register new peer: %v", i, err)
+ }
+ if _, ok := tester.peerHashes[id]; !ok {
+ t.Fatalf("test %d: registered peer not found", i)
+ }
+ // Assemble a good or bad block, depending of the test
+ raw := createBlock(1, knownHash, common.Hash{})
+ if tt.failure {
+ raw = createBlock(1, unknownHash, common.Hash{})
+ }
+ block := &Block{OriginPeer: id, RawBlock: raw}
+
+ // Simulate block processing and check the result
+ tester.downloader.queue.blockCache[0] = block
+ tester.downloader.process()
+ if _, ok := tester.peerHashes[id]; !ok != tt.drop {
+ t.Errorf("test %d: peer drop mismatch for %v: have %v, want %v", i, tt.failure, !ok, tt.drop)
+ }
+ }
}
diff --git a/eth/downloader/peer.go b/eth/downloader/peer.go
index 9614a6951..f36e133e4 100644
--- a/eth/downloader/peer.go
+++ b/eth/downloader/peer.go
@@ -74,7 +74,7 @@ func (p *peer) Fetch(request *fetchRequest) error {
for hash, _ := range request.Hashes {
hashes = append(hashes, hash)
}
- p.getBlocks(hashes)
+ go p.getBlocks(hashes)
return nil
}
diff --git a/eth/downloader/queue.go b/eth/downloader/queue.go
index 7abbd42fd..903f043eb 100644
--- a/eth/downloader/queue.go
+++ b/eth/downloader/queue.go
@@ -320,7 +320,7 @@ func (q *queue) Deliver(id string, blocks []*types.Block) (err error) {
// If a requested block falls out of the range, the hash chain is invalid
index := int(block.NumberU64()) - q.blockOffset
if index >= len(q.blockCache) || index < 0 {
- return ErrInvalidChain
+ return errInvalidChain
}
// Otherwise merge the block and mark the hash block
q.blockCache[index] = &Block{
diff --git a/eth/downloader/queue_test.go b/eth/downloader/queue_test.go
deleted file mode 100644
index ee6141f71..000000000
--- a/eth/downloader/queue_test.go
+++ /dev/null
@@ -1,30 +0,0 @@
-package downloader
-
-import (
- "github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/core/types"
- "gopkg.in/fatih/set.v0"
-)
-
-func createHashSet(hashes []common.Hash) *set.Set {
- hset := set.New()
-
- for _, hash := range hashes {
- hset.Add(hash)
- }
-
- return hset
-}
-
-func createBlocksFromHashSet(hashes *set.Set) []*types.Block {
- blocks := make([]*types.Block, hashes.Size())
-
- var i int
- hashes.Each(func(v interface{}) bool {
- blocks[i] = createBlock(i, common.Hash{}, v.(common.Hash))
- i++
- return true
- })
-
- return blocks
-}
diff --git a/eth/fetcher/fetcher.go b/eth/fetcher/fetcher.go
new file mode 100644
index 000000000..98170cf79
--- /dev/null
+++ b/eth/fetcher/fetcher.go
@@ -0,0 +1,368 @@
+// Package fetcher contains the block announcement based synchonisation.
+package fetcher
+
+import (
+ "errors"
+ "math/rand"
+ "time"
+
+ "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"
+ "gopkg.in/karalabe/cookiejar.v2/collections/prque"
+)
+
+const (
+ arriveTimeout = 500 * time.Millisecond // Time allowance before an announced block is explicitly requested
+ fetchTimeout = 5 * time.Second // Maximum alloted time to return an explicitly requested block
+ maxUncleDist = 7 // Maximum allowed backward distance from the chain head
+ maxQueueDist = 256 // Maximum allowed distance from the chain head to queue
+)
+
+var (
+ errTerminated = errors.New("terminated")
+)
+
+// blockRetrievalFn is a callback type for retrieving a block from the local chain.
+type blockRetrievalFn func(common.Hash) *types.Block
+
+// blockRequesterFn is a callback type for sending a block retrieval request.
+type blockRequesterFn func([]common.Hash) error
+
+// blockValidatorFn is a callback type to verify a block's header for fast propagation.
+type blockValidatorFn func(block *types.Block, parent *types.Block) error
+
+// blockBroadcasterFn is a callback type for broadcasting a block to connected peers.
+type blockBroadcasterFn func(block *types.Block, propagate bool)
+
+// chainHeightFn is a callback type to retrieve the current chain height.
+type chainHeightFn func() uint64
+
+// chainInsertFn is a callback type to insert a batch of blocks into the local chain.
+type chainInsertFn func(types.Blocks) (int, error)
+
+// peerDropFn is a callback type for dropping a peer detected as malicious.
+type peerDropFn func(id string)
+
+// announce is the hash notification of the availability of a new block in the
+// network.
+type announce struct {
+ hash common.Hash // Hash of the block being announced
+ time time.Time // Timestamp of the announcement
+
+ origin string // Identifier of the peer originating the notification
+ fetch blockRequesterFn // Fetcher function to retrieve
+}
+
+// inject represents a schedules import operation.
+type inject struct {
+ origin string
+ block *types.Block
+}
+
+// Fetcher is responsible for accumulating block announcements from various peers
+// and scheduling them for retrieval.
+type Fetcher struct {
+ // Various event channels
+ notify chan *announce
+ inject chan *inject
+ filter chan chan []*types.Block
+ done chan common.Hash
+ quit chan struct{}
+
+ // Announce states
+ announced map[common.Hash][]*announce // Announced blocks, scheduled for fetching
+ fetching map[common.Hash]*announce // Announced blocks, currently fetching
+
+ // Block cache
+ queue *prque.Prque // Queue containing the import operations (block number sorted)
+ queued map[common.Hash]struct{} // Presence set of already queued blocks (to dedup imports)
+
+ // Callbacks
+ getBlock blockRetrievalFn // Retrieves a block from the local chain
+ validateBlock blockValidatorFn // Checks if a block's headers have a valid proof of work
+ broadcastBlock blockBroadcasterFn // Broadcasts a block to connected peers
+ chainHeight chainHeightFn // Retrieves the current chain's height
+ insertChain chainInsertFn // Injects a batch of blocks into the chain
+ dropPeer peerDropFn // Drops a peer for misbehaving
+}
+
+// New creates a block fetcher to retrieve blocks based on hash announcements.
+func New(getBlock blockRetrievalFn, validateBlock blockValidatorFn, broadcastBlock blockBroadcasterFn, chainHeight chainHeightFn, insertChain chainInsertFn, dropPeer peerDropFn) *Fetcher {
+ return &Fetcher{
+ notify: make(chan *announce),
+ inject: make(chan *inject),
+ filter: make(chan chan []*types.Block),
+ done: make(chan common.Hash),
+ quit: make(chan struct{}),
+ announced: make(map[common.Hash][]*announce),
+ fetching: make(map[common.Hash]*announce),
+ queue: prque.New(),
+ queued: make(map[common.Hash]struct{}),
+ getBlock: getBlock,
+ validateBlock: validateBlock,
+ broadcastBlock: broadcastBlock,
+ chainHeight: chainHeight,
+ insertChain: insertChain,
+ dropPeer: dropPeer,
+ }
+}
+
+// Start boots up the announcement based synchoniser, accepting and processing
+// hash notifications and block fetches until termination requested.
+func (f *Fetcher) Start() {
+ go f.loop()
+}
+
+// Stop terminates the announcement based synchroniser, canceling all pending
+// operations.
+func (f *Fetcher) Stop() {
+ close(f.quit)
+}
+
+// Notify announces the fetcher of the potential availability of a new block in
+// the network.
+func (f *Fetcher) Notify(peer string, hash common.Hash, time time.Time, fetcher blockRequesterFn) error {
+ block := &announce{
+ hash: hash,
+ time: time,
+ origin: peer,
+ fetch: fetcher,
+ }
+ select {
+ case f.notify <- block:
+ return nil
+ case <-f.quit:
+ return errTerminated
+ }
+}
+
+// Enqueue tries to fill gaps the the fetcher's future import queue.
+func (f *Fetcher) Enqueue(peer string, block *types.Block) error {
+ op := &inject{
+ origin: peer,
+ block: block,
+ }
+ select {
+ case f.inject <- op:
+ return nil
+ case <-f.quit:
+ return errTerminated
+ }
+}
+
+// Filter extracts all the blocks that were explicitly requested by the fetcher,
+// returning those that should be handled differently.
+func (f *Fetcher) Filter(blocks types.Blocks) types.Blocks {
+ // Send the filter channel to the fetcher
+ filter := make(chan []*types.Block)
+
+ select {
+ case f.filter <- filter:
+ case <-f.quit:
+ return nil
+ }
+ // Request the filtering of the block list
+ select {
+ case filter <- blocks:
+ case <-f.quit:
+ return nil
+ }
+ // Retrieve the blocks remaining after filtering
+ select {
+ case blocks := <-filter:
+ return blocks
+ case <-f.quit:
+ return nil
+ }
+}
+
+// Loop is the main fetcher loop, checking and processing various notification
+// events.
+func (f *Fetcher) loop() {
+ // Iterate the block fetching until a quit is requested
+ fetch := time.NewTimer(0)
+ for {
+ // Clean up any expired block fetches
+ for hash, announce := range f.fetching {
+ if time.Since(announce.time) > fetchTimeout {
+ delete(f.announced, hash)
+ delete(f.fetching, hash)
+ }
+ }
+ // Import any queued blocks that could potentially fit
+ height := f.chainHeight()
+ for !f.queue.Empty() {
+ op := f.queue.PopItem().(*inject)
+ number := op.block.NumberU64()
+
+ // If too high up the chain or phase, continue later
+ if number > height+1 {
+ f.queue.Push(op, -float32(op.block.NumberU64()))
+ break
+ }
+ // Otherwise if fresh and still unknown, try and import
+ if number+maxUncleDist < height || f.getBlock(op.block.Hash()) != nil {
+ continue
+ }
+ f.insert(op.origin, op.block)
+ }
+ // Wait for an outside event to occur
+ select {
+ case <-f.quit:
+ // Fetcher terminating, abort all operations
+ return
+
+ case notification := <-f.notify:
+ // A block was announced, schedule if it's not yet downloading
+ if _, ok := f.fetching[notification.hash]; ok {
+ break
+ }
+ f.announced[notification.hash] = append(f.announced[notification.hash], notification)
+ if len(f.announced) == 1 {
+ f.reschedule(fetch)
+ }
+
+ case op := <-f.inject:
+ // A direct block insertion was requested, try and fill any pending gaps
+ f.enqueue(op.origin, op.block)
+
+ case hash := <-f.done:
+ // A pending import finished, remove all traces of the notification
+ delete(f.announced, hash)
+ delete(f.fetching, hash)
+ delete(f.queued, hash)
+
+ case <-fetch.C:
+ // At least one block's timer ran out, check for needing retrieval
+ request := make(map[string][]common.Hash)
+
+ for hash, announces := range f.announced {
+ if time.Since(announces[0].time) > arriveTimeout {
+ announce := announces[rand.Intn(len(announces))]
+ if f.getBlock(hash) == nil {
+ request[announce.origin] = append(request[announce.origin], hash)
+ f.fetching[hash] = announce
+ }
+ delete(f.announced, hash)
+ }
+ }
+ // Send out all block requests
+ for _, hashes := range request {
+ go f.fetching[hashes[0]].fetch(hashes)
+ }
+ // Schedule the next fetch if blocks are still pending
+ f.reschedule(fetch)
+
+ case filter := <-f.filter:
+ // Blocks arrived, extract any explicit fetches, return all else
+ var blocks types.Blocks
+ select {
+ case blocks = <-filter:
+ case <-f.quit:
+ return
+ }
+
+ explicit, download := []*types.Block{}, []*types.Block{}
+ for _, block := range blocks {
+ hash := block.Hash()
+
+ // Filter explicitly requested blocks from hash announcements
+ if _, ok := f.fetching[hash]; ok {
+ // Discard if already imported by other means
+ if f.getBlock(hash) == nil {
+ explicit = append(explicit, block)
+ } else {
+ delete(f.fetching, hash)
+ }
+ } else {
+ download = append(download, block)
+ }
+ }
+
+ select {
+ case filter <- download:
+ case <-f.quit:
+ return
+ }
+ // Schedule the retrieved blocks for ordered import
+ for _, block := range explicit {
+ if announce := f.fetching[block.Hash()]; announce != nil {
+ f.enqueue(announce.origin, block)
+ }
+ }
+ }
+ }
+}
+
+// reschedule resets the specified fetch timer to the next announce timeout.
+func (f *Fetcher) reschedule(fetch *time.Timer) {
+ // Short circuit if no blocks are announced
+ if len(f.announced) == 0 {
+ return
+ }
+ // Otherwise find the earliest expiring announcement
+ earliest := time.Now()
+ for _, announces := range f.announced {
+ if earliest.After(announces[0].time) {
+ earliest = announces[0].time
+ }
+ }
+ fetch.Reset(arriveTimeout - time.Since(earliest))
+}
+
+// enqueue schedules a new future import operation, if the block to be imported
+// has not yet been seen.
+func (f *Fetcher) enqueue(peer string, block *types.Block) {
+ hash := block.Hash()
+
+ // Discard any past or too distant blocks
+ if dist := int64(block.NumberU64()) - int64(f.chainHeight()); dist < -maxUncleDist || dist > maxQueueDist {
+ glog.V(logger.Detail).Infof("Peer %s: discarded block #%d [%x], distance %d", peer, block.NumberU64(), hash.Bytes()[:4], dist)
+ return
+ }
+ // Schedule the block for future importing
+ if _, ok := f.queued[hash]; !ok {
+ f.queued[hash] = struct{}{}
+ f.queue.Push(&inject{origin: peer, block: block}, -float32(block.NumberU64()))
+
+ if glog.V(logger.Debug) {
+ glog.Infof("Peer %s: queued block #%d [%x], total %v", peer, block.NumberU64(), hash.Bytes()[:4], f.queue.Size())
+ }
+ }
+}
+
+// insert spawns a new goroutine to run a block insertion into the chain. If the
+// block's number is at the same height as the current import phase, if updates
+// the phase states accordingly.
+func (f *Fetcher) insert(peer string, block *types.Block) {
+ hash := block.Hash()
+
+ // Run the import on a new thread
+ glog.V(logger.Debug).Infof("Peer %s: importing block #%d [%x]", peer, block.NumberU64(), hash[:4])
+ go func() {
+ defer func() { f.done <- hash }()
+
+ // If the parent's unknown, abort insertion
+ parent := f.getBlock(block.ParentHash())
+ if parent == nil {
+ return
+ }
+ // Quickly validate the header and propagate the block if it passes
+ if err := f.validateBlock(block, parent); err != nil {
+ glog.V(logger.Debug).Infof("Peer %s: block #%d [%x] verification failed: %v", peer, block.NumberU64(), hash[:4], err)
+ f.dropPeer(peer)
+ return
+ }
+ go f.broadcastBlock(block, true)
+
+ // Run the actual import and log any issues
+ if _, err := f.insertChain(types.Blocks{block}); err != nil {
+ glog.V(logger.Warn).Infof("Peer %s: block #%d [%x] import failed: %v", peer, block.NumberU64(), hash[:4], err)
+ return
+ }
+ // If import succeeded, broadcast the block
+ go f.broadcastBlock(block, false)
+ }()
+}
diff --git a/eth/fetcher/fetcher_test.go b/eth/fetcher/fetcher_test.go
new file mode 100644
index 000000000..0d069ac65
--- /dev/null
+++ b/eth/fetcher/fetcher_test.go
@@ -0,0 +1,397 @@
+package fetcher
+
+import (
+ "encoding/binary"
+ "errors"
+ "math/big"
+ "sync"
+ "sync/atomic"
+ "testing"
+ "time"
+
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core/types"
+)
+
+var (
+ knownHash = common.Hash{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
+ unknownHash = common.Hash{2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}
+ bannedHash = common.Hash{3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}
+
+ genesis = createBlock(1, common.Hash{}, knownHash)
+)
+
+// idCounter is used by the createHashes method the generate deterministic but unique hashes
+var idCounter = int64(2) // #1 is the genesis block
+
+// createHashes generates a batch of hashes rooted at a specific point in the chain.
+func createHashes(amount int, root common.Hash) (hashes []common.Hash) {
+ hashes = make([]common.Hash, amount+1)
+ hashes[len(hashes)-1] = root
+
+ for i := 0; i < len(hashes)-1; i++ {
+ binary.BigEndian.PutUint64(hashes[i][:8], uint64(idCounter))
+ idCounter++
+ }
+ return
+}
+
+// createBlock assembles a new block at the given chain height.
+func createBlock(i int, parent, hash common.Hash) *types.Block {
+ header := &types.Header{Number: big.NewInt(int64(i))}
+ block := types.NewBlockWithHeader(header)
+ block.HeaderHash = hash
+ block.ParentHeaderHash = parent
+ return block
+}
+
+// copyBlock makes a deep copy of a block suitable for local modifications.
+func copyBlock(block *types.Block) *types.Block {
+ return createBlock(int(block.Number().Int64()), block.ParentHeaderHash, block.HeaderHash)
+}
+
+// createBlocksFromHashes assembles a collection of blocks, each having a correct
+// place in the given hash chain.
+func createBlocksFromHashes(hashes []common.Hash) map[common.Hash]*types.Block {
+ blocks := make(map[common.Hash]*types.Block)
+ for i := 0; i < len(hashes); i++ {
+ parent := knownHash
+ if i < len(hashes)-1 {
+ parent = hashes[i+1]
+ }
+ blocks[hashes[i]] = createBlock(len(hashes)-i, parent, hashes[i])
+ }
+ return blocks
+}
+
+// fetcherTester is a test simulator for mocking out local block chain.
+type fetcherTester struct {
+ fetcher *Fetcher
+
+ hashes []common.Hash // Hash chain belonging to the tester
+ blocks map[common.Hash]*types.Block // Blocks belonging to the tester
+
+ lock sync.RWMutex
+}
+
+// newTester creates a new fetcher test mocker.
+func newTester() *fetcherTester {
+ tester := &fetcherTester{
+ hashes: []common.Hash{knownHash},
+ blocks: map[common.Hash]*types.Block{knownHash: genesis},
+ }
+ tester.fetcher = New(tester.getBlock, tester.verifyBlock, tester.broadcastBlock, tester.chainHeight, tester.insertChain, tester.dropPeer)
+ tester.fetcher.Start()
+
+ return tester
+}
+
+// getBlock retrieves a block from the tester's block chain.
+func (f *fetcherTester) getBlock(hash common.Hash) *types.Block {
+ f.lock.RLock()
+ defer f.lock.RUnlock()
+
+ return f.blocks[hash]
+}
+
+// verifyBlock is a nop placeholder for the block header verification.
+func (f *fetcherTester) verifyBlock(block *types.Block, parent *types.Block) error {
+ return nil
+}
+
+// broadcastBlock is a nop placeholder for the block broadcasting.
+func (f *fetcherTester) broadcastBlock(block *types.Block, propagate bool) {
+}
+
+// chainHeight retrieves the current height (block number) of the chain.
+func (f *fetcherTester) chainHeight() uint64 {
+ f.lock.RLock()
+ defer f.lock.RUnlock()
+
+ return f.blocks[f.hashes[len(f.hashes)-1]].NumberU64()
+}
+
+// insertChain injects a new blocks into the simulated chain.
+func (f *fetcherTester) insertChain(blocks types.Blocks) (int, error) {
+ f.lock.Lock()
+ defer f.lock.Unlock()
+
+ for i, block := range blocks {
+ // Make sure the parent in known
+ if _, ok := f.blocks[block.ParentHash()]; !ok {
+ return i, errors.New("unknown parent")
+ }
+ // Discard any new blocks if the same height already exists
+ if block.NumberU64() <= f.blocks[f.hashes[len(f.hashes)-1]].NumberU64() {
+ return i, nil
+ }
+ // Otherwise build our current chain
+ f.hashes = append(f.hashes, block.Hash())
+ f.blocks[block.Hash()] = block
+ }
+ return 0, nil
+}
+
+// dropPeer is a nop placeholder for the peer removal.
+func (f *fetcherTester) dropPeer(peer string) {
+}
+
+// peerFetcher retrieves a fetcher associated with a simulated peer.
+func (f *fetcherTester) makeFetcher(blocks map[common.Hash]*types.Block) blockRequesterFn {
+ // Copy all the blocks to ensure they are not tampered with
+ closure := make(map[common.Hash]*types.Block)
+ for hash, block := range blocks {
+ closure[hash] = copyBlock(block)
+ }
+ // Create a function that returns blocks from the closure
+ return func(hashes []common.Hash) error {
+ // Gather the blocks to return
+ blocks := make([]*types.Block, 0, len(hashes))
+ for _, hash := range hashes {
+ if block, ok := closure[hash]; ok {
+ blocks = append(blocks, block)
+ }
+ }
+ // Return on a new thread
+ go f.fetcher.Filter(blocks)
+
+ return nil
+ }
+}
+
+// Tests that a fetcher accepts block announcements and initiates retrievals for
+// them, successfully importing into the local chain.
+func TestSequentialAnnouncements(t *testing.T) {
+ // Create a chain of blocks to import
+ targetBlocks := 24
+ hashes := createHashes(targetBlocks, knownHash)
+ blocks := createBlocksFromHashes(hashes)
+
+ tester := newTester()
+ fetcher := tester.makeFetcher(blocks)
+
+ // Iteratively announce blocks until all are imported
+ for i := len(hashes) - 1; i >= 0; i-- {
+ tester.fetcher.Notify("valid", hashes[i], time.Now().Add(-arriveTimeout), fetcher)
+ time.Sleep(50 * time.Millisecond)
+ }
+ if imported := len(tester.blocks); imported != targetBlocks+1 {
+ t.Fatalf("synchronised block mismatch: have %v, want %v", imported, targetBlocks+1)
+ }
+}
+
+// Tests that if blocks are announced by multiple peers (or even the same buggy
+// peer), they will only get downloaded at most once.
+func TestConcurrentAnnouncements(t *testing.T) {
+ // Create a chain of blocks to import
+ targetBlocks := 24
+ hashes := createHashes(targetBlocks, knownHash)
+ blocks := createBlocksFromHashes(hashes)
+
+ // Assemble a tester with a built in counter for the requests
+ tester := newTester()
+ fetcher := tester.makeFetcher(blocks)
+
+ counter := uint32(0)
+ wrapper := func(hashes []common.Hash) error {
+ atomic.AddUint32(&counter, uint32(len(hashes)))
+ return fetcher(hashes)
+ }
+ // Iteratively announce blocks until all are imported
+ for i := len(hashes) - 1; i >= 0; i-- {
+ tester.fetcher.Notify("first", hashes[i], time.Now().Add(-arriveTimeout), wrapper)
+ tester.fetcher.Notify("second", hashes[i], time.Now().Add(-arriveTimeout+time.Millisecond), wrapper)
+ tester.fetcher.Notify("second", hashes[i], time.Now().Add(-arriveTimeout-time.Millisecond), wrapper)
+
+ time.Sleep(50 * time.Millisecond)
+ }
+ if imported := len(tester.blocks); imported != targetBlocks+1 {
+ t.Fatalf("synchronised block mismatch: have %v, want %v", imported, targetBlocks+1)
+ }
+ // Make sure no blocks were retrieved twice
+ if int(counter) != targetBlocks {
+ t.Fatalf("retrieval count mismatch: have %v, want %v", counter, targetBlocks)
+ }
+}
+
+// Tests that announcements arriving while a previous is being fetched still
+// results in a valid import.
+func TestOverlappingAnnouncements(t *testing.T) {
+ // Create a chain of blocks to import
+ targetBlocks := 24
+ hashes := createHashes(targetBlocks, knownHash)
+ blocks := createBlocksFromHashes(hashes)
+
+ tester := newTester()
+ fetcher := tester.makeFetcher(blocks)
+
+ // Iteratively announce blocks, but overlap them continuously
+ delay, overlap := 50*time.Millisecond, time.Duration(5)
+ for i := len(hashes) - 1; i >= 0; i-- {
+ tester.fetcher.Notify("valid", hashes[i], time.Now().Add(-arriveTimeout+overlap*delay), fetcher)
+ time.Sleep(delay)
+ }
+ time.Sleep(overlap * delay)
+
+ if imported := len(tester.blocks); imported != targetBlocks+1 {
+ t.Fatalf("synchronised block mismatch: have %v, want %v", imported, targetBlocks+1)
+ }
+}
+
+// Tests that announces already being retrieved will not be duplicated.
+func TestPendingDeduplication(t *testing.T) {
+ // Create a hash and corresponding block
+ hashes := createHashes(1, knownHash)
+ blocks := createBlocksFromHashes(hashes)
+
+ // Assemble a tester with a built in counter and delayed fetcher
+ tester := newTester()
+ fetcher := tester.makeFetcher(blocks)
+
+ delay := 50 * time.Millisecond
+ counter := uint32(0)
+ wrapper := func(hashes []common.Hash) error {
+ atomic.AddUint32(&counter, uint32(len(hashes)))
+
+ // Simulate a long running fetch
+ go func() {
+ time.Sleep(delay)
+ fetcher(hashes)
+ }()
+ return nil
+ }
+ // Announce the same block many times until it's fetched (wait for any pending ops)
+ for tester.getBlock(hashes[0]) == nil {
+ tester.fetcher.Notify("repeater", hashes[0], time.Now().Add(-arriveTimeout), wrapper)
+ time.Sleep(time.Millisecond)
+ }
+ time.Sleep(delay)
+
+ // Check that all blocks were imported and none fetched twice
+ if imported := len(tester.blocks); imported != 2 {
+ t.Fatalf("synchronised block mismatch: have %v, want %v", imported, 2)
+ }
+ if int(counter) != 1 {
+ t.Fatalf("retrieval count mismatch: have %v, want %v", counter, 1)
+ }
+}
+
+// Tests that announcements retrieved in a random order are cached and eventually
+// imported when all the gaps are filled in.
+func TestRandomArrivalImport(t *testing.T) {
+ // Create a chain of blocks to import, and choose one to delay
+ targetBlocks := 24
+ hashes := createHashes(targetBlocks, knownHash)
+ blocks := createBlocksFromHashes(hashes)
+ skip := targetBlocks / 2
+
+ tester := newTester()
+ fetcher := tester.makeFetcher(blocks)
+
+ // Iteratively announce blocks, skipping one entry
+ for i := len(hashes) - 1; i >= 0; i-- {
+ if i != skip {
+ tester.fetcher.Notify("valid", hashes[i], time.Now().Add(-arriveTimeout), fetcher)
+ time.Sleep(50 * time.Millisecond)
+ }
+ }
+ // Finally announce the skipped entry and check full import
+ tester.fetcher.Notify("valid", hashes[skip], time.Now().Add(-arriveTimeout), fetcher)
+ time.Sleep(50 * time.Millisecond)
+
+ if imported := len(tester.blocks); imported != targetBlocks+1 {
+ t.Fatalf("synchronised block mismatch: have %v, want %v", imported, targetBlocks+1)
+ }
+}
+
+// Tests that direct block enqueues (due to block propagation vs. hash announce)
+// are correctly schedule, filling and import queue gaps.
+func TestQueueGapFill(t *testing.T) {
+ // Create a chain of blocks to import, and choose one to not announce at all
+ targetBlocks := 24
+ hashes := createHashes(targetBlocks, knownHash)
+ blocks := createBlocksFromHashes(hashes)
+ skip := targetBlocks / 2
+
+ tester := newTester()
+ fetcher := tester.makeFetcher(blocks)
+
+ // Iteratively announce blocks, skipping one entry
+ for i := len(hashes) - 1; i >= 0; i-- {
+ if i != skip {
+ tester.fetcher.Notify("valid", hashes[i], time.Now().Add(-arriveTimeout), fetcher)
+ time.Sleep(50 * time.Millisecond)
+ }
+ }
+ // Fill the missing block directly as if propagated
+ tester.fetcher.Enqueue("valid", blocks[hashes[skip]])
+ time.Sleep(50 * time.Millisecond)
+
+ if imported := len(tester.blocks); imported != targetBlocks+1 {
+ t.Fatalf("synchronised block mismatch: have %v, want %v", imported, targetBlocks+1)
+ }
+}
+
+// Tests that blocks arriving from various sources (multiple propagations, hash
+// announces, etc) do not get scheduled for import multiple times.
+func TestImportDeduplication(t *testing.T) {
+ // Create two blocks to import (one for duplication, the other for stalling)
+ hashes := createHashes(2, knownHash)
+ blocks := createBlocksFromHashes(hashes)
+
+ // Create the tester and wrap the importer with a counter
+ tester := newTester()
+ fetcher := tester.makeFetcher(blocks)
+
+ counter := uint32(0)
+ tester.fetcher.insertChain = func(blocks types.Blocks) (int, error) {
+ atomic.AddUint32(&counter, uint32(len(blocks)))
+ return tester.insertChain(blocks)
+ }
+ // Announce the duplicating block, wait for retrieval, and also propagate directly
+ tester.fetcher.Notify("valid", hashes[0], time.Now().Add(-arriveTimeout), fetcher)
+ time.Sleep(50 * time.Millisecond)
+
+ tester.fetcher.Enqueue("valid", blocks[hashes[0]])
+ tester.fetcher.Enqueue("valid", blocks[hashes[0]])
+ tester.fetcher.Enqueue("valid", blocks[hashes[0]])
+
+ // Fill the missing block directly as if propagated, and check import uniqueness
+ tester.fetcher.Enqueue("valid", blocks[hashes[1]])
+ time.Sleep(50 * time.Millisecond)
+
+ if imported := len(tester.blocks); imported != 3 {
+ t.Fatalf("synchronised block mismatch: have %v, want %v", imported, 3)
+ }
+ if counter != 2 {
+ t.Fatalf("import invocation count mismatch: have %v, want %v", counter, 2)
+ }
+}
+
+// Tests that blocks with numbers much lower or higher than out current head get
+// discarded no prevent wasting resources on useless blocks from faulty peers.
+func TestDistantDiscarding(t *testing.T) {
+ // Create a long chain to import
+ hashes := createHashes(3*maxQueueDist, knownHash)
+ blocks := createBlocksFromHashes(hashes)
+
+ head := hashes[len(hashes)/2]
+
+ // Create a tester and simulate a head block being the middle of the above chain
+ tester := newTester()
+ tester.hashes = []common.Hash{head}
+ tester.blocks = map[common.Hash]*types.Block{head: blocks[head]}
+
+ // Ensure that a block with a lower number than the threshold is discarded
+ tester.fetcher.Enqueue("lower", blocks[hashes[0]])
+ time.Sleep(10 * time.Millisecond)
+ if !tester.fetcher.queue.Empty() {
+ t.Fatalf("fetcher queued stale block")
+ }
+ // Ensure that a block with a higher number than the threshold is discarded
+ tester.fetcher.Enqueue("higher", blocks[hashes[len(hashes)-1]])
+ time.Sleep(10 * time.Millisecond)
+ if !tester.fetcher.queue.Empty() {
+ t.Fatalf("fetcher queued future block")
+ }
+}
diff --git a/eth/gasprice.go b/eth/gasprice.go
new file mode 100644
index 000000000..cd5293691
--- /dev/null
+++ b/eth/gasprice.go
@@ -0,0 +1,181 @@
+package eth
+
+import (
+ "math/big"
+ "math/rand"
+ "sync"
+
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/event"
+ "github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/logger/glog"
+)
+
+const gpoProcessPastBlocks = 100
+
+type blockPriceInfo struct {
+ baseGasPrice *big.Int
+}
+
+type GasPriceOracle struct {
+ eth *Ethereum
+ chain *core.ChainManager
+ pool *core.TxPool
+ events event.Subscription
+ blocks map[uint64]*blockPriceInfo
+ firstProcessed, lastProcessed uint64
+ lastBaseMutex sync.Mutex
+ lastBase *big.Int
+}
+
+func NewGasPriceOracle(eth *Ethereum) (self *GasPriceOracle) {
+ self = &GasPriceOracle{}
+ self.blocks = make(map[uint64]*blockPriceInfo)
+ self.eth = eth
+ self.chain = eth.chainManager
+ self.pool = eth.txPool
+ self.events = eth.EventMux().Subscribe(
+ core.ChainEvent{},
+ core.ChainSplitEvent{},
+ core.TxPreEvent{},
+ core.TxPostEvent{},
+ )
+ self.processPastBlocks()
+ go self.listenLoop()
+ return
+}
+
+func (self *GasPriceOracle) processPastBlocks() {
+ last := self.chain.CurrentBlock().NumberU64()
+ first := uint64(0)
+ if last > gpoProcessPastBlocks {
+ first = last - gpoProcessPastBlocks
+ }
+ self.firstProcessed = first
+ for i := first; i <= last; i++ {
+ self.processBlock(self.chain.GetBlockByNumber(i))
+ }
+
+}
+
+func (self *GasPriceOracle) listenLoop() {
+ for {
+ ev, isopen := <-self.events.Chan()
+ if !isopen {
+ break
+ }
+ switch ev := ev.(type) {
+ case core.ChainEvent:
+ self.processBlock(ev.Block)
+ case core.ChainSplitEvent:
+ self.processBlock(ev.Block)
+ case core.TxPreEvent:
+ case core.TxPostEvent:
+ }
+ }
+ self.events.Unsubscribe()
+}
+
+func (self *GasPriceOracle) processBlock(block *types.Block) {
+ i := block.NumberU64()
+ if i > self.lastProcessed {
+ self.lastProcessed = i
+ }
+
+ lastBase := self.eth.GpoMinGasPrice
+ bpl := self.blocks[i-1]
+ if bpl != nil {
+ lastBase = bpl.baseGasPrice
+ }
+ if lastBase == nil {
+ return
+ }
+
+ var corr int
+ lp := self.lowestPrice(block)
+ if lp == nil {
+ return
+ }
+
+ if lastBase.Cmp(lp) < 0 {
+ corr = self.eth.GpobaseStepUp
+ } else {
+ corr = -self.eth.GpobaseStepDown
+ }
+
+ crand := int64(corr * (900 + rand.Intn(201)))
+ newBase := new(big.Int).Mul(lastBase, big.NewInt(1000000+crand))
+ newBase.Div(newBase, big.NewInt(1000000))
+
+ bpi := self.blocks[i]
+ if bpi == nil {
+ bpi = &blockPriceInfo{}
+ self.blocks[i] = bpi
+ }
+ bpi.baseGasPrice = newBase
+ self.lastBaseMutex.Lock()
+ self.lastBase = newBase
+ self.lastBaseMutex.Unlock()
+
+ glog.V(logger.Detail).Infof("Processed block #%v, base price is %v\n", block.NumberU64(), newBase.Int64())
+}
+
+// returns the lowers possible price with which a tx was or could have been included
+func (self *GasPriceOracle) lowestPrice(block *types.Block) *big.Int {
+ gasUsed := new(big.Int)
+ recepits, err := self.eth.BlockProcessor().GetBlockReceipts(block.Hash())
+ if err != nil {
+ return self.eth.GpoMinGasPrice
+ }
+
+ if len(recepits) > 0 {
+ gasUsed = recepits[len(recepits)-1].CumulativeGasUsed
+ }
+
+ if new(big.Int).Mul(gasUsed, big.NewInt(100)).Cmp(new(big.Int).Mul(block.Header().GasLimit,
+ big.NewInt(int64(self.eth.GpoFullBlockRatio)))) < 0 {
+ // block is not full, could have posted a tx with MinGasPrice
+ return self.eth.GpoMinGasPrice
+ }
+
+ if len(block.Transactions()) < 1 {
+ return self.eth.GpoMinGasPrice
+ }
+
+ // block is full, find smallest gasPrice
+ minPrice := block.Transactions()[0].GasPrice()
+ for i := 1; i < len(block.Transactions()); i++ {
+ price := block.Transactions()[i].GasPrice()
+ if price.Cmp(minPrice) < 0 {
+ minPrice = price
+ }
+ }
+ return minPrice
+}
+
+func (self *GasPriceOracle) SuggestPrice() *big.Int {
+ self.lastBaseMutex.Lock()
+ base := self.lastBase
+ self.lastBaseMutex.Unlock()
+
+ if base == nil {
+ base = self.eth.GpoMinGasPrice
+ }
+ if base == nil {
+ return big.NewInt(10000000000000) // apparently MinGasPrice is not initialized during some tests
+ }
+
+ baseCorr := new(big.Int).Mul(base, big.NewInt(int64(self.eth.GpobaseCorrectionFactor)))
+ baseCorr.Div(baseCorr, big.NewInt(100))
+
+ if baseCorr.Cmp(self.eth.GpoMinGasPrice) < 0 {
+ return self.eth.GpoMinGasPrice
+ }
+
+ if baseCorr.Cmp(self.eth.GpoMaxGasPrice) > 0 {
+ return self.eth.GpoMaxGasPrice
+ }
+
+ return baseCorr
+}
diff --git a/eth/handler.go b/eth/handler.go
index f002727f3..a5986b779 100644
--- a/eth/handler.go
+++ b/eth/handler.go
@@ -3,14 +3,15 @@ package eth
import (
"fmt"
"math"
- "math/big"
"sync"
"time"
+ "github.com/ethereum/go-ethereum/pow"
"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/event"
"github.com/ethereum/go-ethereum/logger"
"github.com/ethereum/go-ethereum/logger/glog"
@@ -45,6 +46,7 @@ type ProtocolManager struct {
txpool txPool
chainman *core.ChainManager
downloader *downloader.Downloader
+ fetcher *fetcher.Fetcher
peers *peerSet
SubProtocol p2p.Protocol
@@ -54,11 +56,9 @@ type ProtocolManager struct {
minedBlockSub event.Subscription
// channels for fetcher, syncer, txsyncLoop
- newPeerCh chan *peer
- newHashCh chan []*blockAnnounce
- newBlockCh chan chan []*types.Block
- txsyncCh chan *txsync
- quitSync chan struct{}
+ newPeerCh chan *peer
+ txsyncCh chan *txsync
+ quitSync chan struct{}
// wait group is used for graceful shutdowns during downloading
// and processing
@@ -68,18 +68,16 @@ type ProtocolManager struct {
// NewProtocolManager returns a new ethereum sub protocol manager. The Ethereum sub protocol manages peers capable
// with the ethereum network.
-func NewProtocolManager(protocolVersion, networkId int, mux *event.TypeMux, txpool txPool, chainman *core.ChainManager, downloader *downloader.Downloader) *ProtocolManager {
+func NewProtocolManager(protocolVersion, networkId int, mux *event.TypeMux, txpool txPool, pow pow.PoW, chainman *core.ChainManager) *ProtocolManager {
+ // Create the protocol manager and initialize peer handlers
manager := &ProtocolManager{
- eventMux: mux,
- txpool: txpool,
- chainman: chainman,
- downloader: downloader,
- peers: newPeerSet(),
- newPeerCh: make(chan *peer, 1),
- newHashCh: make(chan []*blockAnnounce, 1),
- newBlockCh: make(chan chan []*types.Block),
- txsyncCh: make(chan *txsync),
- quitSync: make(chan struct{}),
+ eventMux: mux,
+ txpool: txpool,
+ chainman: chainman,
+ peers: newPeerSet(),
+ newPeerCh: make(chan *peer, 1),
+ txsyncCh: make(chan *txsync),
+ quitSync: make(chan struct{}),
}
manager.SubProtocol = p2p.Protocol{
Name: "eth",
@@ -87,12 +85,20 @@ func NewProtocolManager(protocolVersion, networkId int, mux *event.TypeMux, txpo
Length: ProtocolLength,
Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error {
peer := manager.newPeer(protocolVersion, networkId, p, rw)
-
manager.newPeerCh <- peer
-
return manager.handle(peer)
},
}
+ // Construct the different synchronisation mechanisms
+ manager.downloader = downloader.New(manager.eventMux, manager.chainman.HasBlock, manager.chainman.GetBlock, manager.chainman.InsertChain, manager.removePeer)
+
+ validator := func(block *types.Block, parent *types.Block) error {
+ return core.ValidateHeader(pow, block.Header(), parent.Header(), true)
+ }
+ heighter := func() uint64 {
+ return manager.chainman.CurrentBlock().NumberU64()
+ }
+ manager.fetcher = fetcher.New(manager.chainman.GetBlock, validator, manager.BroadcastBlock, heighter, manager.chainman.InsertChain, manager.removePeer)
return manager
}
@@ -126,7 +132,6 @@ func (pm *ProtocolManager) Start() {
// start sync handlers
go pm.syncer()
- go pm.fetcher()
go pm.txsyncLoop()
}
@@ -185,7 +190,7 @@ func (pm *ProtocolManager) handle(p *peer) error {
return nil
}
-func (self *ProtocolManager) handleMsg(p *peer) error {
+func (pm *ProtocolManager) handleMsg(p *peer) error {
msg, err := p.rw.ReadMsg()
if err != nil {
return err
@@ -215,7 +220,7 @@ func (self *ProtocolManager) handleMsg(p *peer) error {
RemoteId: p.ID().String(),
})
}
- self.txpool.AddTransactions(txs)
+ pm.txpool.AddTransactions(txs)
case GetBlockHashesMsg:
var request getBlockHashesMsgData
@@ -227,7 +232,7 @@ func (self *ProtocolManager) handleMsg(p *peer) error {
request.Amount = uint64(downloader.MaxHashFetch)
}
- hashes := self.chainman.GetBlockHashesFromHash(request.Hash, request.Amount)
+ hashes := pm.chainman.GetBlockHashesFromHash(request.Hash, request.Amount)
if glog.V(logger.Debug) {
if len(hashes) == 0 {
@@ -245,40 +250,50 @@ func (self *ProtocolManager) handleMsg(p *peer) error {
if err := msgStream.Decode(&hashes); err != nil {
break
}
- err := self.downloader.DeliverHashes(p.id, hashes)
+ err := pm.downloader.DeliverHashes(p.id, hashes)
if err != nil {
glog.V(logger.Debug).Infoln(err)
}
case GetBlocksMsg:
- var blocks []*types.Block
-
+ // Decode the retrieval message
msgStream := rlp.NewStream(msg.Payload, uint64(msg.Size))
if _, err := msgStream.List(); err != nil {
return err
}
+ // Gather blocks until the fetch or network limits is reached
var (
- i int
- totalsize common.StorageSize
+ hash common.Hash
+ bytes common.StorageSize
+ hashes []common.Hash
+ blocks []*types.Block
)
for {
- i++
- var hash common.Hash
err := msgStream.Decode(&hash)
if err == rlp.EOL {
break
} else if err != nil {
return errResp(ErrDecode, "msg %v: %v", msg, err)
}
+ hashes = append(hashes, hash)
- block := self.chainman.GetBlock(hash)
- if block != nil {
+ // Retrieve the requested block, stopping if enough was found
+ if block := pm.chainman.GetBlock(hash); block != nil {
blocks = append(blocks, block)
- totalsize += block.Size()
+ bytes += block.Size()
+ if len(blocks) >= downloader.MaxBlockFetch || bytes > maxBlockRespSize {
+ break
+ }
}
- if i == downloader.MaxBlockFetch || totalsize > maxBlockRespSize {
- break
+ }
+ if glog.V(logger.Detail) && len(blocks) == 0 && len(hashes) > 0 {
+ list := "["
+ for _, hash := range hashes {
+ list += fmt.Sprintf("%x, ", hash[:4])
}
+ list = list[:len(list)-2] + "]"
+
+ glog.Infof("Peer %s: no blocks found for requested hashes %s", p.id, list)
}
return p.sendBlocks(blocks)
@@ -291,20 +306,13 @@ func (self *ProtocolManager) handleMsg(p *peer) error {
glog.V(logger.Detail).Infoln("Decode error", err)
blocks = nil
}
- // Filter out any explicitly requested blocks (cascading select to get blocking back to peer)
- filter := make(chan []*types.Block)
- select {
- case <-self.quitSync:
- case self.newBlockCh <- filter:
- select {
- case <-self.quitSync:
- case filter <- blocks:
- select {
- case <-self.quitSync:
- case blocks := <-filter:
- self.downloader.DeliverBlocks(p.id, blocks)
- }
- }
+ // Update the receive timestamp of each block
+ for i:=0; i<len(blocks); i++ {
+ blocks[i].ReceivedAt = msg.ReceivedAt
+ }
+ // Filter out any explicitly requested blocks, deliver the rest to the downloader
+ if blocks := pm.fetcher.Filter(blocks); len(blocks) > 0 {
+ pm.downloader.DeliverBlocks(p.id, blocks)
}
case NewBlockHashesMsg:
@@ -323,26 +331,16 @@ func (self *ProtocolManager) handleMsg(p *peer) error {
// Schedule all the unknown hashes for retrieval
unknown := make([]common.Hash, 0, len(hashes))
for _, hash := range hashes {
- if !self.chainman.HasBlock(hash) {
+ if !pm.chainman.HasBlock(hash) {
unknown = append(unknown, hash)
}
}
- announces := make([]*blockAnnounce, len(unknown))
- for i, hash := range unknown {
- announces[i] = &blockAnnounce{
- hash: hash,
- peer: p,
- time: time.Now(),
- }
- }
- if len(announces) > 0 {
- select {
- case self.newHashCh <- announces:
- case <-self.quitSync:
- }
+ for _, hash := range unknown {
+ pm.fetcher.Notify(p.id, hash, time.Now(), p.requestBlocks)
}
case NewBlockMsg:
+ // Retrieve and decode the propagated block
var request newBlockMsgData
if err := msg.Decode(&request); err != nil {
return errResp(ErrDecode, "%v: %v", msg, err)
@@ -352,9 +350,24 @@ func (self *ProtocolManager) handleMsg(p *peer) error {
}
request.Block.ReceivedAt = msg.ReceivedAt
- if err := self.importBlock(p, request.Block, request.TD); err != nil {
- return err
- }
+ // Mark the block's arrival for whatever reason
+ _, chainHead, _ := pm.chainman.Status()
+ jsonlogger.LogJson(&logger.EthChainReceivedNewBlock{
+ BlockHash: request.Block.Hash().Hex(),
+ BlockNumber: request.Block.Number(),
+ ChainHeadHash: chainHead.Hex(),
+ BlockPrevHash: request.Block.ParentHash().Hex(),
+ RemoteId: p.ID().String(),
+ })
+ // Mark the peer as owning the block and schedule it for import
+ p.blockHashes.Add(request.Block.Hash())
+ p.SetHead(request.Block.Hash())
+
+ pm.fetcher.Enqueue(p.id, request.Block)
+
+ // TODO: Schedule a sync to cover potential gaps (this needs proto update)
+ p.SetTd(request.TD)
+ go pm.synchronise(p)
default:
return errResp(ErrInvalidMsgCode, "%v", msg.Code)
@@ -362,76 +375,27 @@ func (self *ProtocolManager) handleMsg(p *peer) error {
return nil
}
-// importBlocks injects a new block retrieved from the given peer into the chain
-// manager.
-func (pm *ProtocolManager) importBlock(p *peer, block *types.Block, td *big.Int) error {
+// BroadcastBlock will either propagate a block to a subset of it's peers, or
+// will only announce it's availability (depending what's requested).
+func (pm *ProtocolManager) BroadcastBlock(block *types.Block, propagate bool) {
hash := block.Hash()
+ peers := pm.peers.PeersWithoutBlock(hash)
- // Mark the block as present at the remote node (don't duplicate already held data)
- p.blockHashes.Add(hash)
- p.SetHead(hash)
- if td != nil {
- p.SetTd(td)
+ // If propagation is requested, send to a subset of the peer
+ if propagate {
+ transfer := peers[:int(math.Sqrt(float64(len(peers))))]
+ for _, peer := range transfer {
+ peer.sendNewBlock(block)
+ }
+ glog.V(logger.Detail).Infof("propagated block %x to %d peers in %v", hash[:4], len(transfer), time.Since(block.ReceivedAt))
}
- // Log the block's arrival
- _, chainHead, _ := pm.chainman.Status()
- jsonlogger.LogJson(&logger.EthChainReceivedNewBlock{
- BlockHash: hash.Hex(),
- BlockNumber: block.Number(),
- ChainHeadHash: chainHead.Hex(),
- BlockPrevHash: block.ParentHash().Hex(),
- RemoteId: p.ID().String(),
- })
- // If the block's already known or its difficulty is lower than ours, drop
+ // Otherwise if the block is indeed in out own chain, announce it
if pm.chainman.HasBlock(hash) {
- p.SetTd(pm.chainman.GetBlock(hash).Td) // update the peer's TD to the real value
- return nil
- }
- if td != nil && pm.chainman.Td().Cmp(td) > 0 && new(big.Int).Add(block.Number(), big.NewInt(7)).Cmp(pm.chainman.CurrentBlock().Number()) < 0 {
- glog.V(logger.Debug).Infof("[%s] dropped block %v due to low TD %v\n", p.id, block.Number(), td)
- return nil
- }
- // Attempt to insert the newly received block and propagate to our peers
- if pm.chainman.HasBlock(block.ParentHash()) {
- if _, err := pm.chainman.InsertChain(types.Blocks{block}); err != nil {
- glog.V(logger.Error).Infoln("removed peer (", p.id, ") due to block error", err)
- return err
- }
- if td != nil && block.Td.Cmp(td) != 0 {
- err := fmt.Errorf("invalid TD on block(%v) from peer(%s): block.td=%v, request.td=%v", block.Number(), p.id, block.Td, td)
- glog.V(logger.Error).Infoln(err)
- return err
+ for _, peer := range peers {
+ peer.sendNewBlockHashes([]common.Hash{hash})
}
- pm.BroadcastBlock(hash, block)
- return nil
- }
- // Parent of the block is unknown, try to sync with this peer if it seems to be good
- if td != nil {
- go pm.synchronise(p)
- }
- return nil
-}
-
-// BroadcastBlock will propagate the block to a subset of its connected peers,
-// only notifying the rest of the block's appearance.
-func (pm *ProtocolManager) BroadcastBlock(hash common.Hash, block *types.Block) {
- // Retrieve all the target peers and split between full broadcast or only notification
- peers := pm.peers.PeersWithoutBlock(hash)
- split := int(math.Sqrt(float64(len(peers))))
-
- transfer := peers[:split]
- notify := peers[split:]
-
- // Send out the data transfers and the notifications
- for _, peer := range notify {
- peer.sendNewBlockHashes([]common.Hash{hash})
- }
- glog.V(logger.Detail).Infoln("broadcast hash to", len(notify), "peers.")
-
- for _, peer := range transfer {
- peer.sendNewBlock(block)
+ glog.V(logger.Detail).Infof("announced block %x to %d peers in %v", hash[:4], len(peers), time.Since(block.ReceivedAt))
}
- glog.V(logger.Detail).Infoln("broadcast block to", len(transfer), "peers. Total processing time:", time.Since(block.ReceivedAt))
}
// BroadcastTx will propagate the block to its connected peers. It will sort
@@ -453,7 +417,8 @@ func (self *ProtocolManager) minedBroadcastLoop() {
for obj := range self.minedBlockSub.Chan() {
switch ev := obj.(type) {
case core.NewMinedBlockEvent:
- self.BroadcastBlock(ev.Block.Hash(), ev.Block)
+ self.BroadcastBlock(ev.Block, false)
+ self.BroadcastBlock(ev.Block, true)
}
}
}
diff --git a/eth/protocol_test.go b/eth/protocol_test.go
index bbea9fc11..6e0eef59c 100644
--- a/eth/protocol_test.go
+++ b/eth/protocol_test.go
@@ -11,7 +11,6 @@ import (
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
- "github.com/ethereum/go-ethereum/eth/downloader"
"github.com/ethereum/go-ethereum/ethdb"
"github.com/ethereum/go-ethereum/event"
"github.com/ethereum/go-ethereum/p2p"
@@ -168,8 +167,7 @@ func newProtocolManagerForTesting(txAdded chan<- []*types.Transaction) *Protocol
db, _ = ethdb.NewMemDatabase()
chain, _ = core.NewChainManager(core.GenesisBlock(0, db), db, db, core.FakePow{}, em)
txpool = &fakeTxPool{added: txAdded}
- dl = downloader.New(em, chain.HasBlock, chain.GetBlock)
- pm = NewProtocolManager(ProtocolVersion, 0, em, txpool, chain, dl)
+ pm = NewProtocolManager(ProtocolVersion, 0, em, txpool, core.FakePow{}, chain)
)
pm.Start()
return pm
diff --git a/eth/sync.go b/eth/sync.go
index 8fee21d7b..82abb725f 100644
--- a/eth/sync.go
+++ b/eth/sync.go
@@ -1,27 +1,19 @@
package eth
import (
- "math"
"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"
)
const (
- forceSyncCycle = 10 * time.Second // Time interval to force syncs, even if few peers are available
- blockProcCycle = 500 * time.Millisecond // Time interval to check for new blocks to process
- notifyCheckCycle = 100 * time.Millisecond // Time interval to allow hash notifies to fulfill before hard fetching
- notifyArriveTimeout = 500 * time.Millisecond // Time allowance before an announced block is explicitly requested
- notifyFetchTimeout = 5 * time.Second // Maximum alloted time to return an explicitly requested block
- minDesiredPeerCount = 5 // Amount of peers desired to start syncing
- blockProcAmount = 256
+ forceSyncCycle = 10 * time.Second // Time interval to force syncs, even if few peers are available
+ minDesiredPeerCount = 5 // Amount of peers desired to start syncing
// This is the target size for the packs of transactions sent by txsyncLoop.
// A pack can get larger than this if a single transactions exceeds this size.
@@ -124,141 +116,16 @@ func (pm *ProtocolManager) txsyncLoop() {
}
}
-// fetcher is responsible for collecting hash notifications, and periodically
-// checking all unknown ones and individually fetching them.
-func (pm *ProtocolManager) fetcher() {
- announces := make(map[common.Hash][]*blockAnnounce)
- request := make(map[*peer][]common.Hash)
- pending := make(map[common.Hash]*blockAnnounce)
- cycle := time.Tick(notifyCheckCycle)
- done := make(chan common.Hash)
-
- // Iterate the block fetching until a quit is requested
- for {
- select {
- case notifications := <-pm.newHashCh:
- // A batch of hashes the notified, schedule them for retrieval
- glog.V(logger.Debug).Infof("Scheduling %d hash announcements from %s", len(notifications), notifications[0].peer.id)
- for _, announce := range notifications {
- // Skip if it's already pending fetch
- if _, ok := pending[announce.hash]; ok {
- continue
- }
- // Otherwise queue up the peer as a potential source
- announces[announce.hash] = append(announces[announce.hash], announce)
- }
-
- case hash := <-done:
- // A pending import finished, remove all traces
- delete(pending, hash)
-
- case <-cycle:
- // Clean up any expired block fetches
- for hash, announce := range pending {
- if time.Since(announce.time) > notifyFetchTimeout {
- delete(pending, hash)
- }
- }
- // Check if any notified blocks failed to arrive
- for hash, all := range announces {
- if time.Since(all[0].time) > notifyArriveTimeout {
- announce := all[rand.Intn(len(all))]
- if !pm.chainman.HasBlock(hash) {
- request[announce.peer] = append(request[announce.peer], hash)
- pending[hash] = announce
- }
- delete(announces, hash)
- }
- }
- if len(request) == 0 {
- break
- }
- // Send out all block requests
- for peer, hashes := range request {
- glog.V(logger.Debug).Infof("Explicitly fetching %d blocks from %s", len(hashes), peer.id)
- peer.requestBlocks(hashes)
- }
- request = make(map[*peer][]common.Hash)
-
- case filter := <-pm.newBlockCh:
- // Blocks arrived, extract any explicit fetches, return all else
- var blocks types.Blocks
- select {
- case blocks = <-filter:
- case <-pm.quitSync:
- return
- }
-
- explicit, download := []*types.Block{}, []*types.Block{}
- for _, block := range blocks {
- hash := block.Hash()
-
- // Filter explicitly requested blocks from hash announcements
- if _, ok := pending[hash]; ok {
- // Discard if already imported by other means
- if !pm.chainman.HasBlock(hash) {
- explicit = append(explicit, block)
- } else {
- delete(pending, hash)
- }
- } else {
- download = append(download, block)
- }
- }
-
- select {
- case filter <- download:
- case <-pm.quitSync:
- return
- }
- // Create a closure with the retrieved blocks and origin peers
- peers := make([]*peer, 0, len(explicit))
- blocks = make([]*types.Block, 0, len(explicit))
- for _, block := range explicit {
- hash := block.Hash()
- if announce := pending[hash]; announce != nil {
- // Drop the block if it surely cannot fit
- if pm.chainman.HasBlock(hash) || !pm.chainman.HasBlock(block.ParentHash()) {
- delete(pending, hash)
- continue
- }
- // Otherwise accumulate for import
- peers = append(peers, announce.peer)
- blocks = append(blocks, block)
- }
- }
- // If any explicit fetches were replied to, import them
- if count := len(blocks); count > 0 {
- glog.V(logger.Debug).Infof("Importing %d explicitly fetched blocks", len(blocks))
- go func() {
- // Make sure all hashes are cleaned up
- for _, block := range blocks {
- hash := block.Hash()
- defer func() { done <- hash }()
- }
- // Try and actually import the blocks
- for i := 0; i < len(blocks); i++ {
- if err := pm.importBlock(peers[i], blocks[i], nil); err != nil {
- glog.V(logger.Detail).Infof("Failed to import explicitly fetched block: %v", err)
- return
- }
- }
- }()
- }
-
- case <-pm.quitSync:
- return
- }
- }
-}
-
// syncer is responsible for periodically synchronising with the network, both
-// downloading hashes and blocks as well as retrieving cached ones.
+// downloading hashes and blocks as well as handling the announcement handler.
func (pm *ProtocolManager) syncer() {
- forceSync := time.Tick(forceSyncCycle)
- blockProc := time.Tick(blockProcCycle)
- blockProcPend := int32(0)
+ // Start and ensure cleanup of sync mechanisms
+ pm.fetcher.Start()
+ defer pm.fetcher.Stop()
+ defer pm.downloader.Terminate()
+ // Wait for different events to fire synchronisation operations
+ forceSync := time.Tick(forceSyncCycle)
for {
select {
case <-pm.newPeerCh:
@@ -272,57 +139,13 @@ func (pm *ProtocolManager) syncer() {
// Force a sync even if not enough peers are present
go pm.synchronise(pm.peers.BestPeer())
- case <-blockProc:
- // Try to pull some blocks from the downloaded
- if atomic.CompareAndSwapInt32(&blockProcPend, 0, 1) {
- go func() {
- pm.processBlocks()
- atomic.StoreInt32(&blockProcPend, 0)
- }()
- }
-
case <-pm.quitSync:
return
}
}
}
-// processBlocks retrieves downloaded blocks from the download cache and tries
-// to construct the local block chain with it. Note, since the block retrieval
-// order matters, access to this function *must* be synchronized/serialized.
-func (pm *ProtocolManager) processBlocks() error {
- pm.wg.Add(1)
- defer pm.wg.Done()
-
- // Short circuit if no blocks are available for insertion
- blocks := pm.downloader.TakeBlocks()
- if len(blocks) == 0 {
- return nil
- }
- glog.V(logger.Debug).Infof("Inserting chain with %d blocks (#%v - #%v)\n", len(blocks), blocks[0].RawBlock.Number(), blocks[len(blocks)-1].RawBlock.Number())
-
- for len(blocks) != 0 && !pm.quit {
- // Retrieve the first batch of blocks to insert
- max := int(math.Min(float64(len(blocks)), float64(blockProcAmount)))
- raw := make(types.Blocks, 0, max)
- for _, block := range blocks[:max] {
- raw = append(raw, block.RawBlock)
- }
- // Try to inset the blocks, drop the originating peer if there's an error
- index, err := pm.chainman.InsertChain(raw)
- if err != nil {
- glog.V(logger.Debug).Infoln("Downloaded block import failed:", err)
- pm.removePeer(blocks[index].OriginPeer)
- pm.downloader.Cancel()
- return err
- }
- blocks = blocks[max:]
- }
- return nil
-}
-
-// synchronise tries to sync up our local block chain with a remote peer, both
-// adding various sanity checks as well as wrapping it with various log entries.
+// synchronise tries to sync up our local block chain with a remote peer.
func (pm *ProtocolManager) synchronise(peer *peer) {
// Short circuit if no peers are available
if peer == nil {
@@ -332,33 +155,6 @@ func (pm *ProtocolManager) synchronise(peer *peer) {
if peer.Td().Cmp(pm.chainman.Td()) <= 0 {
return
}
- // FIXME if we have the hash in our chain and the TD of the peer is
- // much higher than ours, something is wrong with us or the peer.
- // Check if the hash is on our own chain
- head := peer.Head()
- if pm.chainman.HasBlock(head) {
- glog.V(logger.Debug).Infoln("Synchronisation canceled: head already known")
- return
- }
- // Get the hashes from the peer (synchronously)
- glog.V(logger.Detail).Infof("Attempting synchronisation: %v, 0x%x", peer.id, head)
-
- err := pm.downloader.Synchronise(peer.id, head)
- switch err {
- case nil:
- glog.V(logger.Detail).Infof("Synchronisation completed")
-
- case downloader.ErrBusy:
- glog.V(logger.Detail).Infof("Synchronisation already in progress")
-
- case downloader.ErrTimeout, downloader.ErrBadPeer, downloader.ErrEmptyHashSet, downloader.ErrInvalidChain, downloader.ErrCrossCheckFailed:
- glog.V(logger.Debug).Infof("Removing peer %v: %v", peer.id, err)
- pm.removePeer(peer.id)
-
- case downloader.ErrPendingQueue:
- glog.V(logger.Debug).Infoln("Synchronisation aborted:", err)
-
- default:
- glog.V(logger.Warn).Infof("Synchronisation failed: %v", err)
- }
+ // Otherwise try to sync with the downloader
+ pm.downloader.Synchronise(peer.id, peer.Head())
}
diff --git a/miner/miner.go b/miner/miner.go
index 20ca81648..7f73f3ee8 100644
--- a/miner/miner.go
+++ b/miner/miner.go
@@ -77,7 +77,7 @@ func (m *Miner) SetGasPrice(price *big.Int) {
return
}
- m.worker.gasPrice = price
+ m.worker.setGasPrice(price)
}
func (self *Miner) Start(coinbase common.Address, threads int) {
diff --git a/miner/worker.go b/miner/worker.go
index bd4bc0e3c..d339507ca 100644
--- a/miner/worker.go
+++ b/miner/worker.go
@@ -6,6 +6,7 @@ import (
"sort"
"sync"
"sync/atomic"
+ "time"
"github.com/ethereum/go-ethereum/accounts"
"github.com/ethereum/go-ethereum/common"
@@ -374,6 +375,8 @@ func (self *worker) commitNewWork() {
self.currentMu.Lock()
defer self.currentMu.Unlock()
+ tstart := time.Now()
+
previous := self.current
self.makeCurrent()
current := self.current
@@ -409,7 +412,7 @@ func (self *worker) commitNewWork() {
// We only care about logging if we're actually mining
if atomic.LoadInt32(&self.mining) == 1 {
- glog.V(logger.Info).Infof("commit new work on block %v with %d txs & %d uncles\n", current.block.Number(), current.tcount, len(uncles))
+ glog.V(logger.Info).Infof("commit new work on block %v with %d txs & %d uncles. Took %v\n", current.block.Number(), current.tcount, len(uncles), time.Since(tstart))
self.logLocalMinedBlocks(previous)
}
@@ -437,7 +440,6 @@ func (self *worker) commitUncle(uncle *types.Header) error {
// Error not unique
return core.UncleError("Uncle not unique")
}
- self.current.uncles.Add(uncle.Hash())
if !self.current.ancestors.Has(uncle.ParentHash) {
return core.UncleError(fmt.Sprintf("Uncle's parent unknown (%x)", uncle.ParentHash[0:4]))
@@ -446,6 +448,7 @@ func (self *worker) commitUncle(uncle *types.Header) error {
if self.current.family.Has(uncle.Hash()) {
return core.UncleError(fmt.Sprintf("Uncle already in family (%x)", uncle.Hash()))
}
+ self.current.uncles.Add(uncle.Hash())
return nil
}
diff --git a/p2p/peer.go b/p2p/peer.go
index cbe5ccc84..40466cf84 100644
--- a/p2p/peer.go
+++ b/p2p/peer.go
@@ -115,41 +115,60 @@ func newPeer(conn *conn, protocols []Protocol) *Peer {
}
func (p *Peer) run() DiscReason {
- readErr := make(chan error, 1)
+ var (
+ writeStart = make(chan struct{}, 1)
+ writeErr = make(chan error, 1)
+ readErr = make(chan error, 1)
+ reason DiscReason
+ requested bool
+ )
p.wg.Add(2)
go p.readLoop(readErr)
go p.pingLoop()
- p.startProtocols()
+ // Start all protocol handlers.
+ writeStart <- struct{}{}
+ p.startProtocols(writeStart, writeErr)
// Wait for an error or disconnect.
- var (
- reason DiscReason
- requested bool
- )
- select {
- case err := <-readErr:
- if r, ok := err.(DiscReason); ok {
- reason = r
- } else {
- // Note: We rely on protocols to abort if there is a write
- // error. It might be more robust to handle them here as well.
- glog.V(logger.Detail).Infof("%v: Read error: %v\n", p, err)
- reason = DiscNetworkError
+loop:
+ for {
+ select {
+ case err := <-writeErr:
+ // A write finished. Allow the next write to start if
+ // there was no error.
+ if err != nil {
+ glog.V(logger.Detail).Infof("%v: write error: %v\n", p, err)
+ reason = DiscNetworkError
+ break loop
+ }
+ writeStart <- struct{}{}
+ case err := <-readErr:
+ if r, ok := err.(DiscReason); ok {
+ glog.V(logger.Debug).Infof("%v: remote requested disconnect: %v\n", p, r)
+ requested = true
+ reason = r
+ } else {
+ glog.V(logger.Detail).Infof("%v: read error: %v\n", p, err)
+ reason = DiscNetworkError
+ }
+ break loop
+ case err := <-p.protoErr:
+ reason = discReasonForError(err)
+ glog.V(logger.Debug).Infof("%v: protocol error: %v (%v)\n", p, err, reason)
+ break loop
+ case reason = <-p.disc:
+ glog.V(logger.Debug).Infof("%v: locally requested disconnect: %v\n", p, reason)
+ break loop
}
- case err := <-p.protoErr:
- reason = discReasonForError(err)
- case reason = <-p.disc:
- requested = true
}
+
close(p.closed)
p.rw.close(reason)
p.wg.Wait()
-
if requested {
reason = DiscRequested
}
- glog.V(logger.Debug).Infof("%v: Disconnected: %v\n", p, reason)
return reason
}
@@ -196,7 +215,6 @@ func (p *Peer) handle(msg Msg) error {
// This is the last message. We don't need to discard or
// check errors because, the connection will be closed after it.
rlp.Decode(msg.Payload, &reason)
- glog.V(logger.Debug).Infof("%v: Disconnect Requested: %v\n", p, reason[0])
return reason[0]
case msg.Code < baseProtocolLength:
// ignore other base protocol messages
@@ -247,11 +265,13 @@ outer:
return result
}
-func (p *Peer) startProtocols() {
+func (p *Peer) startProtocols(writeStart <-chan struct{}, writeErr chan<- error) {
p.wg.Add(len(p.running))
for _, proto := range p.running {
proto := proto
proto.closed = p.closed
+ proto.wstart = writeStart
+ proto.werr = writeErr
glog.V(logger.Detail).Infof("%v: Starting protocol %s/%d\n", p, proto.Name, proto.Version)
go func() {
err := proto.Run(p, proto)
@@ -280,18 +300,31 @@ func (p *Peer) getProto(code uint64) (*protoRW, error) {
type protoRW struct {
Protocol
- in chan Msg
- closed <-chan struct{}
+ in chan Msg // receices read messages
+ closed <-chan struct{} // receives when peer is shutting down
+ wstart <-chan struct{} // receives when write may start
+ werr chan<- error // for write results
offset uint64
w MsgWriter
}
-func (rw *protoRW) WriteMsg(msg Msg) error {
+func (rw *protoRW) WriteMsg(msg Msg) (err error) {
if msg.Code >= rw.Length {
return newPeerError(errInvalidMsgCode, "not handled")
}
msg.Code += rw.offset
- return rw.w.WriteMsg(msg)
+ select {
+ case <-rw.wstart:
+ err = rw.w.WriteMsg(msg)
+ // Report write status back to Peer.run. It will initiate
+ // shutdown if the error is non-nil and unblock the next write
+ // otherwise. The calling protocol code should exit for errors
+ // as well but we don't want to rely on that.
+ rw.werr <- err
+ case <-rw.closed:
+ err = fmt.Errorf("shutting down")
+ }
+ return err
}
func (rw *protoRW) ReadMsg() (Msg, error) {
diff --git a/p2p/peer_test.go b/p2p/peer_test.go
index 7b772e198..575d0ff79 100644
--- a/p2p/peer_test.go
+++ b/p2p/peer_test.go
@@ -121,7 +121,7 @@ func TestPeerDisconnect(t *testing.T) {
}
select {
case reason := <-disc:
- if reason != DiscQuitting {
+ if reason != DiscRequested {
t.Errorf("run returned wrong reason: got %v, want %v", reason, DiscRequested)
}
case <-time.After(500 * time.Millisecond):
diff --git a/rpc/api.go b/rpc/api.go
index e825accfd..a344a8294 100644
--- a/rpc/api.go
+++ b/rpc/api.go
@@ -59,7 +59,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
case "eth_mining":
*reply = api.xeth().IsMining()
case "eth_gasPrice":
- v := xeth.DefaultGasPrice()
+ v := api.xeth().DefaultGasPrice()
*reply = newHexNum(v.Bytes())
case "eth_accounts":
*reply = api.xeth().Accounts()
diff --git a/rpc/api/eth.go b/rpc/api/eth.go
index e1e7381f5..cb678922b 100644
--- a/rpc/api/eth.go
+++ b/rpc/api/eth.go
@@ -140,7 +140,7 @@ func (self *ethApi) IsMining(req *shared.Request) (interface{}, error) {
}
func (self *ethApi) GasPrice(req *shared.Request) (interface{}, error) {
- return newHexNum(xeth.DefaultGasPrice().Bytes()), nil
+ return newHexNum(self.xeth.DefaultGasPrice().Bytes()), nil
}
func (self *ethApi) GetStorage(req *shared.Request) (interface{}, error) {
@@ -274,7 +274,14 @@ func (self *ethApi) SendTransaction(req *shared.Request) (interface{}, error) {
nonce = args.Nonce.String()
}
- v, err := self.xeth.Transact(args.From, args.To, nonce, args.Value.String(), args.Gas.String(), args.GasPrice.String(), args.Data)
+ var gas, price string
+ if args.Gas != nil {
+ gas = args.Gas.String()
+ }
+ if args.GasPrice != nil {
+ price = args.GasPrice.String()
+ }
+ v, err := self.xeth.Transact(args.From, args.To, nonce, args.Value.String(), gas, price, args.Data)
if err != nil {
return nil, err
}
diff --git a/rpc/api/eth_args.go b/rpc/api/eth_args.go
index 70fb18289..54eb7201d 100644
--- a/rpc/api/eth_args.go
+++ b/rpc/api/eth_args.go
@@ -362,9 +362,7 @@ func (args *NewTxArgs) UnmarshalJSON(b []byte) (err error) {
args.Value = num
num = nil
- if ext.Gas == nil {
- num = big.NewInt(0)
- } else {
+ if ext.Gas != nil {
if num, err = numString(ext.Gas); err != nil {
return err
}
@@ -372,9 +370,7 @@ func (args *NewTxArgs) UnmarshalJSON(b []byte) (err error) {
args.Gas = num
num = nil
- if ext.GasPrice == nil {
- num = big.NewInt(0)
- } else {
+ if ext.GasPrice != nil {
if num, err = numString(ext.GasPrice); err != nil {
return err
}
diff --git a/tests/block_test_util.go b/tests/block_test_util.go
index ae2ae4033..200fcbd59 100644
--- a/tests/block_test_util.go
+++ b/tests/block_test_util.go
@@ -124,7 +124,7 @@ func (t *BlockTest) InsertPreState(ethereum *eth.Ethereum) (*state.StateDB, erro
obj.SetBalance(balance)
obj.SetNonce(nonce)
for k, v := range acct.Storage {
- statedb.SetState(common.HexToAddress(addrString), common.HexToHash(k), common.FromHex(v))
+ statedb.SetState(common.HexToAddress(addrString), common.HexToHash(k), common.HexToHash(v))
}
}
// sync objects to trie
diff --git a/tests/files/BlockTests/bcInvalidHeaderTest.json b/tests/files/BlockTests/bcInvalidHeaderTest.json
index a5c16b803..e74840d47 100644
--- a/tests/files/BlockTests/bcInvalidHeaderTest.json
+++ b/tests/files/BlockTests/bcInvalidHeaderTest.json
@@ -2,7 +2,7 @@
"DifferentExtraData1025" : {
"blocks" : [
{
- "rlp" : "0xf90665f905fca0c6d177167d978c66a02083c59d7e04f00bf068140e178f0eb744d4e64c4ac28da01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa0704eb309526a1478e1eec2dff7015b2bd31731fa6c985f6316fea4bc57e89535a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b845571777fb904010101020304050607080910111213141516171819202122232410000000000000000000200000000000000000003000000000000000000040000000000000000000500000000000000000006000000000000000000070000000000000000000800000000000000000009000000000000000000010000000000000000000100000000000000000002000000000000000000030000000000000000000400000000000000000005000000000000000000060000000000000000000700000000000000000008000000000000000000090000000000000000000100000000000000000001000000000000000000020000000000000000000300000000000000000004000000000000000000050000000000000000000600000000000000000007000000000000000000080000000000000000000900000000000000000001000000000000000000010000000000000000000200000000000000000003000000000000000000040000000000000000000500000000000000000006000000000000000000070000000000000000000800000000000000000009000000000000000000010000000000000000000100000000000000000002000000000000000000030000000000000000000400000000000000000005000000000000000000060000000000000000000700000000000000000008000000000000000000090000000000000000000100000000000000000001000000000000000000020000000000000000000300000000000000000004000000000000000000050000000000000000000600000000000000000007000000000000000000080000000000000000000900000000000000000001000000000000000000010000000000000000000200000000000000000003000000000000000000040000000000000000000500000000000000000006000000000000000000070000000000000000000800000000000000000009000000000000000000010000000000000000000100000000000000000002000000000000000000030000000000000000000400000000000000000005000000000000000000060000000000000000000700000000000000000008000000000000000000090000000000000000000100000000000000000001000000000000000000020000000000000000000300000000000000000004000000000000000000050000000000000000000600000000000000000007000000000000000000080000000000000000000900000000000000000001000000000000000000010000000000000000000200000000000000000003000000000000000000040000000000000000000500000000000000000006000000000000000000070000000000000000000800000000000000000009000000000000000000010000000000000000000a0b26aa271af67dbbce21140251d07d1a1e7a6cce51b427e2e6033cf80d1f6d33e88d92cd1710471a9a0f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca00bb090ec0e32468558690bb11b677a881d2079f345716c587df2c55a9760e55ea0143d4a093577bae50dd48fb2b006c0636fe03cbe65f7df75a2ffbac73b4fd04ec0"
+ "rlp" : "0xf90665f905fca0801e9dfc2d12f33d8372ee4192bb02e65f4af5a870745aed2910a6ab4e115cd2a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa0bd320f0acf90f5a246c237637f11ef21b05d76fdd9f647f9c3267bb34a743de7a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b84557ff4c0b904010101020304050607080910111213141516171819202122232410000000000000000000200000000000000000003000000000000000000040000000000000000000500000000000000000006000000000000000000070000000000000000000800000000000000000009000000000000000000010000000000000000000100000000000000000002000000000000000000030000000000000000000400000000000000000005000000000000000000060000000000000000000700000000000000000008000000000000000000090000000000000000000100000000000000000001000000000000000000020000000000000000000300000000000000000004000000000000000000050000000000000000000600000000000000000007000000000000000000080000000000000000000900000000000000000001000000000000000000010000000000000000000200000000000000000003000000000000000000040000000000000000000500000000000000000006000000000000000000070000000000000000000800000000000000000009000000000000000000010000000000000000000100000000000000000002000000000000000000030000000000000000000400000000000000000005000000000000000000060000000000000000000700000000000000000008000000000000000000090000000000000000000100000000000000000001000000000000000000020000000000000000000300000000000000000004000000000000000000050000000000000000000600000000000000000007000000000000000000080000000000000000000900000000000000000001000000000000000000010000000000000000000200000000000000000003000000000000000000040000000000000000000500000000000000000006000000000000000000070000000000000000000800000000000000000009000000000000000000010000000000000000000100000000000000000002000000000000000000030000000000000000000400000000000000000005000000000000000000060000000000000000000700000000000000000008000000000000000000090000000000000000000100000000000000000001000000000000000000020000000000000000000300000000000000000004000000000000000000050000000000000000000600000000000000000007000000000000000000080000000000000000000900000000000000000001000000000000000000010000000000000000000200000000000000000003000000000000000000040000000000000000000500000000000000000006000000000000000000070000000000000000000800000000000000000009000000000000000000010000000000000000000a0da2d90bff4f835b72117284c8eb34446b9121dba6d14006b2766a579f5f003858869b0977b1699157df863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca042756f995aaedcbb380ecbf42e8b38249c8918ba0b0950ee997570a390f111b4a0f731d1b73239601cd56f1b1d0c6e13343e029f89737e3fcecbf0b12a85f5f62dc0"
}
],
"genesisBlockHeader" : {
@@ -12,9 +12,9 @@
"extraData" : "0x42",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x00",
- "hash" : "c6d177167d978c66a02083c59d7e04f00bf068140e178f0eb744d4e64c4ac28d",
- "mixHash" : "720adb221d6e68020cba806fc84a42bae4fcea4022266864ace1df198f661063",
- "nonce" : "9197d35dd2f8f78b",
+ "hash" : "801e9dfc2d12f33d8372ee4192bb02e65f4af5a870745aed2910a6ab4e115cd2",
+ "mixHash" : "ca735c79245c5304ec6d8a6b02db4c6c7993b49a9f782efd6210034a42beb8c1",
+ "nonce" : "2ae839b01a3709f9",
"number" : "0x00",
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
@@ -23,8 +23,8 @@
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0720adb221d6e68020cba806fc84a42bae4fcea4022266864ace1df198f661063889197d35dd2f8f78bc0c0",
- "lastblockhash" : "c6d177167d978c66a02083c59d7e04f00bf068140e178f0eb744d4e64c4ac28d",
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0ca735c79245c5304ec6d8a6b02db4c6c7993b49a9f782efd6210034a42beb8c1882ae839b01a3709f9c0c0",
+ "lastblockhash" : "801e9dfc2d12f33d8372ee4192bb02e65f4af5a870745aed2910a6ab4e115cd2",
"postState" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "0x64",
@@ -61,7 +61,7 @@
"GasLimitIsZero" : {
"blocks" : [
{
- "rlp" : "0xf9025ef901f6a0767ebbfe066c1b5e0da78be7b7f2e432ebddfbeabfeb264b820244ee317927f5a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa0ff6c12f6bda0cb5d19ee77ba7feafe35c64635ced9c6af60022724054b4258fca05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b901000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000004000000000000000000000000000000000000000000000000000000083020000018082560b845571778180a0d000a09ce995335977209ed74b1af291e1d7b4b9fa52596a4e502b60d0d3936488bef9414aec541abdf862f860800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801b9fb196993b5b7db21765295cdc2463d908159e7de2882e05c799b55b89c2f634a05769ff65182b0bb2a80b6417b1fe35d8e4bd2b9b27d32a6917f1d6862e66285dc0"
+ "rlp" : "0xf9025ff901f6a0294fb6f9125c5926ab028dac7c344ee39ade18aee1a188c817c391f1897a2655a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa0c93866bffee7bcec3910a365091aff84edd9e8a621a121898a4901c9c146e538a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b901000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000004000000000000000000000000000000000000000000000000000000083020000018082560b84557ff4c380a0a5782206a67c90a7fa20b54ab6afb246956bef23482a39c8eac9abe90b1103b4883cd9dcee62bb1ed9f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0a4043e901d565fe6f80663e0a7b109d7d3c5d41d1ad0c584713a592adab2ef8fa04dde69b415e3bd757aca11b3ff9b62fbd0139b6b1168d23d832622ce68053bfcc0"
}
],
"genesisBlockHeader" : {
@@ -71,9 +71,9 @@
"extraData" : "0x42",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x00",
- "hash" : "767ebbfe066c1b5e0da78be7b7f2e432ebddfbeabfeb264b820244ee317927f5",
- "mixHash" : "55c5b5c0d878ec90ba09c902e5f0223e559814c70c2bf7bdff04e45162471451",
- "nonce" : "557b8dcca44e77c1",
+ "hash" : "294fb6f9125c5926ab028dac7c344ee39ade18aee1a188c817c391f1897a2655",
+ "mixHash" : "a9d33ca61587dc9d28c0860a4f5d6a78c82e29b2207c570a886a6668a2f16c88",
+ "nonce" : "d475b1cdd15c16cd",
"number" : "0x00",
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
@@ -82,8 +82,8 @@
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a055c5b5c0d878ec90ba09c902e5f0223e559814c70c2bf7bdff04e4516247145188557b8dcca44e77c1c0c0",
- "lastblockhash" : "767ebbfe066c1b5e0da78be7b7f2e432ebddfbeabfeb264b820244ee317927f5",
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0a9d33ca61587dc9d28c0860a4f5d6a78c82e29b2207c570a886a6668a2f16c8888d475b1cdd15c16cdc0c0",
+ "lastblockhash" : "294fb6f9125c5926ab028dac7c344ee39ade18aee1a188c817c391f1897a2655",
"postState" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "0x64",
@@ -120,7 +120,7 @@
"log1_wrongBlockNumber" : {
"blocks" : [
{
- "rlp" : "0xf90262f901f9a095684697c91a94d4c4448bd3578754f6eefb60b5b672e04deda174eddcf959eaa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa024046d212ac9d0954067b296e42683ab90c9c13a46cc2ee49b83290b94f74eeba05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000002832fefd882560b845571778580a0e8953d67e22f0fce7bbbef25de1bf0c8433959c39521c944000f1a71b086c62488c9f1168b6501724ef863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca03076226629e809e10cf8444a7b7ff7d1ae2e0dd5a4030946308952b9c5bfcbb0a07a61d4688f6285c6f9b80dd2b1847da230e1a22b97b339816a20ded78046838fc0"
+ "rlp" : "0xf90262f901f9a0620e681cb4df774ab54c0232376b909199e24b42ff5c84507fe8b08ff43b09e2a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa0dd1cea4016b2072a0c5f4e3c7d734fc8607d223db9a96b6a3e0d490334e29af9a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000002832fefd882560b84557ff4c680a0b8f5d358696f4f8f6dc7b305b235ef1f19cbf1900c6edfa060e99279419055bb88a587b355bfe6e26ff863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca07b27f8b769a18c5e45961c6f058c68317703391b92b490e12dcade6a8b7bcb63a0c13691e75e2fdc8a7bf12cab717d8a735201e6cde67c879bea240005d930026fc0"
}
],
"genesisBlockHeader" : {
@@ -130,9 +130,9 @@
"extraData" : "0x42",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x00",
- "hash" : "95684697c91a94d4c4448bd3578754f6eefb60b5b672e04deda174eddcf959ea",
- "mixHash" : "293420f1dc7c9c7af40b76858aead8cfb1ab26548c5692119cc2dd74b4ae0223",
- "nonce" : "c0d18019a7a381ad",
+ "hash" : "620e681cb4df774ab54c0232376b909199e24b42ff5c84507fe8b08ff43b09e2",
+ "mixHash" : "86f621add0bb4a000fb726f614f83287fbe63e9584195d87ad7b245a8b756a72",
+ "nonce" : "b80c084b56a750fa",
"number" : "0x00",
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
@@ -141,8 +141,8 @@
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0293420f1dc7c9c7af40b76858aead8cfb1ab26548c5692119cc2dd74b4ae022388c0d18019a7a381adc0c0",
- "lastblockhash" : "95684697c91a94d4c4448bd3578754f6eefb60b5b672e04deda174eddcf959ea",
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a086f621add0bb4a000fb726f614f83287fbe63e9584195d87ad7b245a8b756a7288b80c084b56a750fac0c0",
+ "lastblockhash" : "620e681cb4df774ab54c0232376b909199e24b42ff5c84507fe8b08ff43b09e2",
"postState" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "0x64",
@@ -179,7 +179,7 @@
"log1_wrongBloom" : {
"blocks" : [
{
- "rlp" : "0xf90262f901f9a05b65ba0dde01c352aca92e1fc66c16b7575bd923d5c01737e6f1db85bf08af77a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa017b5c1f224727a466f14f80fbd641a3a27a97928413fe3d886d6f015d7490c4da05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd882560b845571778780a0542dec5c23c3eaded951cd55626458319e7e23efbde919516c6a1e514f3d260188c46503f09b58ca3af863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca04191594d0073963078907fc1bc226e390892582c1f84fcdffc651c7b9ffda3e9a0df1406ecc4b41ff030b25ed852ca47cd53f9ced3fcfe1c8103406dc679e9da2cc0"
+ "rlp" : "0xf90262f901f9a061816f6181fedda93826656e70683c8bfbb3acd4b00964bc65b4835c7f1ae41da01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa098535fe3c1eb69c7d218780e728f89d3b3e2c76d20953c1242e4bca37a778360a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd882560b84557ff4ca80a0b41717f2daecff0cd492e10d411be5214dc30b7b1fd99e69e39002d552802c75880bbc6ced3ce651a9f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba08d0c6e6b1db2f976c0167887f418dfaaa317fb3268dbef25a56c67d6b8aca7b3a02775f6b29f3057b451b069b09281e79591e247f88d068d202e5ce5364217dda1c0"
}
],
"genesisBlockHeader" : {
@@ -189,9 +189,9 @@
"extraData" : "0x42",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x00",
- "hash" : "5b65ba0dde01c352aca92e1fc66c16b7575bd923d5c01737e6f1db85bf08af77",
- "mixHash" : "6333422cd270aa72999c0edc1b749cbed8458be7d9789cb42b3584ffdbb6ea9f",
- "nonce" : "7afd54fabcc98bb0",
+ "hash" : "61816f6181fedda93826656e70683c8bfbb3acd4b00964bc65b4835c7f1ae41d",
+ "mixHash" : "fd7c4c44729ca29af51db4c3cefaabd8ae09899ae8c7a77413e941062fb90792",
+ "nonce" : "5633654b840d2d49",
"number" : "0x00",
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
@@ -200,8 +200,8 @@
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a06333422cd270aa72999c0edc1b749cbed8458be7d9789cb42b3584ffdbb6ea9f887afd54fabcc98bb0c0c0",
- "lastblockhash" : "5b65ba0dde01c352aca92e1fc66c16b7575bd923d5c01737e6f1db85bf08af77",
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0fd7c4c44729ca29af51db4c3cefaabd8ae09899ae8c7a77413e941062fb90792885633654b840d2d49c0c0",
+ "lastblockhash" : "61816f6181fedda93826656e70683c8bfbb3acd4b00964bc65b4835c7f1ae41d",
"postState" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "0x64",
@@ -238,7 +238,7 @@
"wrongCoinbase" : {
"blocks" : [
{
- "rlp" : "0xf90262f901f9a0e1dc5c4eef8b9bca44074c3317bc212c9dcffb138e83a6fad3f5260cdd59092da01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347949888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa07438243bc5c79aa4a3f605db9c133c0e356d072e3ac6fba4aa96e11424ca73b0a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b845571778c80a0bb5b4e9db25ef43eebd1cf786ed0f5c9197d35d3fb923648061ce4981f70f5d788aecd18084b367266f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca01c1c6a510fa61e0ae8608e9ac0feebb44394d6aae913a5844de3e15a730ef9a3a027f1e4099b593d5add6629ae5772a73d3220705e270295b1f8e0eb69326582d3c0"
+ "rlp" : "0xf90262f901f9a0203d78c55325b7d2b33def1e65799b3e8a697bd2d38be07912d89c521d0a831ba01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347949888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa0ee1f71f8612a1a0dc36d8c318576c4d5dca3f67c1a1111e06874a7187a75e273a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b84557ff4cc80a02871566a90428b72b54900bbed49a3b42bcc5f6ff4bc135d63550ad3638b110488ceb940b576899ec8f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0c39dfc246695c6d84a7c59b5bee73c249507d1ce8c35b1473bf70366225a8212a038bf288841a713102009c8d4ff66bf8e5463c503e3995b21366e1cd078eef248c0"
}
],
"genesisBlockHeader" : {
@@ -248,9 +248,9 @@
"extraData" : "0x42",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x00",
- "hash" : "e1dc5c4eef8b9bca44074c3317bc212c9dcffb138e83a6fad3f5260cdd59092d",
- "mixHash" : "159026361f12572817e93416afc95417755152b0ad07a2ce7ce75d115bd27226",
- "nonce" : "6b69b9df6635df44",
+ "hash" : "203d78c55325b7d2b33def1e65799b3e8a697bd2d38be07912d89c521d0a831b",
+ "mixHash" : "1bc0f803c19f1a996cbed7db7cd04bc061de6a1078dd25fbdadbf2eb051f518a",
+ "nonce" : "18c615f04cd1a057",
"number" : "0x00",
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
@@ -259,8 +259,8 @@
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0159026361f12572817e93416afc95417755152b0ad07a2ce7ce75d115bd27226886b69b9df6635df44c0c0",
- "lastblockhash" : "e1dc5c4eef8b9bca44074c3317bc212c9dcffb138e83a6fad3f5260cdd59092d",
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a01bc0f803c19f1a996cbed7db7cd04bc061de6a1078dd25fbdadbf2eb051f518a8818c615f04cd1a057c0c0",
+ "lastblockhash" : "203d78c55325b7d2b33def1e65799b3e8a697bd2d38be07912d89c521d0a831b",
"postState" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "0x64",
@@ -297,7 +297,7 @@
"wrongDifficulty" : {
"blocks" : [
{
- "rlp" : "0xf90261f901f8a028c23861416beea344ac67e6cf5b36b0c25d1710b0651fb8000117b69206a337a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa04571453a1786ae7fa055cd12ee147dca558e3939bcaa2c1fb35033013e8006d2a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b901000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000004000000000000000000000000000000000000000000000000000000082271001832fefd882560b845571778e80a08157ea9f3de2da0da0a2e5b7ee45fa225e44af726148ac08c5d923b4f6adecdf88368177e797490361f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0f48035b21e50a7331b958aec69a0c70c2fa44e250dd013d9bd58eb3f2714ddd0a04bd907fdd7d28d0664ece8d15cc27414ce47db5b8d3a4e4ccf71ef4298c61608c0"
+ "rlp" : "0xf90261f901f8a0e26518455a4d9989da691c2ace65c758795e586c24f085a55c3d81c14e142a7ca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa0a3367304ab7d594d34e0983ee5152d44c77a9018d38ef582c33f3b3beca3505ea05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b901000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000004000000000000000000000000000000000000000000000000000000082271001832fefd882560b84557ff4cf80a0e73f7cc84d40e67259477ba9bf046e746bc83c7d9d648533ab249c2f8247313288ef74b1391e6bea87f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca0094bd4e29d134267f5d5f040601a8520225990a22c69aad1a27fe45861fcaf96a0afe5fc4870e4b6e5d82dd3e4939291097d858c1223314e05eda817169641483fc0"
}
],
"genesisBlockHeader" : {
@@ -307,9 +307,9 @@
"extraData" : "0x42",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x00",
- "hash" : "28c23861416beea344ac67e6cf5b36b0c25d1710b0651fb8000117b69206a337",
- "mixHash" : "d8b1d7496cc566ed583f7548463d8f83cf39c67645ba29fbaaea55de1b3b5a7e",
- "nonce" : "81417c4cd48b2824",
+ "hash" : "e26518455a4d9989da691c2ace65c758795e586c24f085a55c3d81c14e142a7c",
+ "mixHash" : "39a07d831e0d27a8b433d2cefba7992a4bc10d1b8cc44d9dde945c7cddb2f170",
+ "nonce" : "d2fbfc19d43f1e0f",
"number" : "0x00",
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
@@ -318,8 +318,8 @@
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0d8b1d7496cc566ed583f7548463d8f83cf39c67645ba29fbaaea55de1b3b5a7e8881417c4cd48b2824c0c0",
- "lastblockhash" : "28c23861416beea344ac67e6cf5b36b0c25d1710b0651fb8000117b69206a337",
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a039a07d831e0d27a8b433d2cefba7992a4bc10d1b8cc44d9dde945c7cddb2f17088d2fbfc19d43f1e0fc0c0",
+ "lastblockhash" : "e26518455a4d9989da691c2ace65c758795e586c24f085a55c3d81c14e142a7c",
"postState" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "0x64",
@@ -356,7 +356,7 @@
"wrongGasLimit" : {
"blocks" : [
{
- "rlp" : "0xf90262f901f9a0ab0bc3b824e00781e2b5157de39911a65536441e4a1fd1f3e15df3f4029c6bbba01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa04c312949d2300f715fe47dc30e92764eb164bdaaf965ec7480244ad46ed4f588a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001830186a082560b845571779280a0b6fe955b66651246a165a9c9aa3657db741b89e3c8b443dec43ba6cbfbb643ef88de116b29b785b0a7f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0427ff068b8facebce0ecbd6e9125ccb6ee5f9ccce186dbf7c0e23777a5c93942a07b1b218a7bc14cde41b07aefc80e521f262a01b742f24d8a6fd62215b4e455a9c0"
+ "rlp" : "0xf90262f901f9a0cc1c0a26f21579ac40bbc494604824fc473b6faa3fd3d68edd433fa8f70c932da01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa093a856cb300c99471e166d0b11d4a22450987b4bac8c35338c233cedcc67be1da05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001830186a082560b84557ff4d280a053b148958caa66dee6417a154c348297614883976b8c16f03cf5b268b0e893e8888106219c66e62361f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba082e54b7f7d5671d0ee93138b0300f0e807bd115ce3bd1bc99e21925f7bd96e0ba0d0217b852d89ae38d5681c6975ec492f69e4c411c6046a8668f044db2864483ac0"
}
],
"genesisBlockHeader" : {
@@ -366,9 +366,9 @@
"extraData" : "0x42",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x00",
- "hash" : "ab0bc3b824e00781e2b5157de39911a65536441e4a1fd1f3e15df3f4029c6bbb",
- "mixHash" : "4e7e88d99e1c60d632b7f77370a3d97751798b83c7dd6afbabed984685cc2b10",
- "nonce" : "8eaab15f19039717",
+ "hash" : "cc1c0a26f21579ac40bbc494604824fc473b6faa3fd3d68edd433fa8f70c932d",
+ "mixHash" : "b033eeba6bf1a9d293f067d0d395e1893d2cc788992182bb14bea5f220c7be5a",
+ "nonce" : "5246583fa42e6da0",
"number" : "0x00",
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
@@ -377,8 +377,8 @@
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a04e7e88d99e1c60d632b7f77370a3d97751798b83c7dd6afbabed984685cc2b10888eaab15f19039717c0c0",
- "lastblockhash" : "ab0bc3b824e00781e2b5157de39911a65536441e4a1fd1f3e15df3f4029c6bbb",
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0b033eeba6bf1a9d293f067d0d395e1893d2cc788992182bb14bea5f220c7be5a885246583fa42e6da0c0c0",
+ "lastblockhash" : "cc1c0a26f21579ac40bbc494604824fc473b6faa3fd3d68edd433fa8f70c932d",
"postState" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "0x64",
@@ -415,7 +415,7 @@
"wrongGasUsed" : {
"blocks" : [
{
- "rlp" : "0xf90260f901f7a056c737fb93a2ef921f1f215431fcfc642c253bbcea162264cfc726c2659d8847a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa0fe2082bd92c7a0fd597d14068178619fdd8fca14b85d31964f025bb92105d91ea05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd880845571779680a0b0c7c644ab33b7104683be72f84a830620bfffdeade55bdabe77691c3c73a3d48884777344d9b3c42bf863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca098600c061936e1a90b0ea43d54a816d6d7e4bd27c3a64a5f7395ee1390d44d26a0c66a6018f3e65282096a37ece5e462d7790804bc9a626eb30f3caf3fdde61be5c0"
+ "rlp" : "0xf90260f901f7a0dd8be3fc6598a9c6c9c210a994b2e4e28c75e4f4fca5fe8cf657cd06d9002085a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa00a9b78ba07eed41fbc66630ed6b4d01e96231a4a130c4bbb39f272368dc79642a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd88084557ff4d580a0b237b0476170afbcde1e949c44c60176dc86a77df0b3ac7a19227e3afe798502884e1ce1bf32090576f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca0f5ec14a149f51a6507fab88f921df3c51417d98feabfbaacfa3bb39ec75d0ccfa00255304a957f4779c19cc5700b0bd44d80436e52327f97cb9f3b9340942317b7c0"
}
],
"genesisBlockHeader" : {
@@ -425,9 +425,9 @@
"extraData" : "0x42",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x00",
- "hash" : "56c737fb93a2ef921f1f215431fcfc642c253bbcea162264cfc726c2659d8847",
- "mixHash" : "62c2a16e600f769646d8d14884b16c35d2b8209809460e78124040685cf9490a",
- "nonce" : "e2ba1769d3c2f42b",
+ "hash" : "dd8be3fc6598a9c6c9c210a994b2e4e28c75e4f4fca5fe8cf657cd06d9002085",
+ "mixHash" : "4417af0859b6d2e10793172a151ad1e6a03f34cbd7c2f2cfbb863426925702a7",
+ "nonce" : "44f1d62f7b9b0a78",
"number" : "0x00",
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
@@ -436,8 +436,126 @@
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a062c2a16e600f769646d8d14884b16c35d2b8209809460e78124040685cf9490a88e2ba1769d3c2f42bc0c0",
- "lastblockhash" : "56c737fb93a2ef921f1f215431fcfc642c253bbcea162264cfc726c2659d8847",
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a04417af0859b6d2e10793172a151ad1e6a03f34cbd7c2f2cfbb863426925702a78844f1d62f7b9b0a78c0c0",
+ "lastblockhash" : "dd8be3fc6598a9c6c9c210a994b2e4e28c75e4f4fca5fe8cf657cd06d9002085",
+ "postState" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "0x64",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600052600060206000a1",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x174876e800",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "0x64",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600052600060206000a1",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x174876e800",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "wrongMixHash" : {
+ "blocks" : [
+ {
+ "rlp" : "0xf90262f901f9a034071a807d83f8e634082378e3c236b5d790c5bb3f6f5e81b857067eb0a8679fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa0b7d4d7f8d724567a6837e3872f014100704c2848ad2b1d2a3e0d410b35c81280a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b84557ff4d880a0bad81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421889626a46727781363f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba06d7dc3c29c4473543b574413536b608d7afa4c96bbfbbf033473a088e6662ff8a07be035d2fa3e7a2b0c8ac6dea2f53dcde4ebc9020f008057bb90c044e6cfb895c0"
+ }
+ ],
+ "genesisBlockHeader" : {
+ "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1",
+ "difficulty" : "0x020000",
+ "extraData" : "0x42",
+ "gasLimit" : "0x2fefd8",
+ "gasUsed" : "0x00",
+ "hash" : "34071a807d83f8e634082378e3c236b5d790c5bb3f6f5e81b857067eb0a8679f",
+ "mixHash" : "c7f735b359771b6bf60f2aa2e3a32398e9ee3632b1764ea4d825cc3fc2472610",
+ "nonce" : "68e84fc7fccee640",
+ "number" : "0x00",
+ "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
+ "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "stateRoot" : "b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056",
+ "timestamp" : "0x54c98c81",
+ "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
+ },
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0c7f735b359771b6bf60f2aa2e3a32398e9ee3632b1764ea4d825cc3fc24726108868e84fc7fccee640c0c0",
+ "lastblockhash" : "34071a807d83f8e634082378e3c236b5d790c5bb3f6f5e81b857067eb0a8679f",
+ "postState" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "0x64",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600052600060206000a1",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x174876e800",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "0x64",
+ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600052600060206000a1",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x174876e800",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "wrongNonce" : {
+ "blocks" : [
+ {
+ "rlp" : "0xf90262f901f9a09f8661c236c947e990a8ec6a36826a04116a3b8b538580fb11b4c24c002414aea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa0c0bd2a6e974187ddf5947f6da175d1ba181571fe404596b18566719b1d1f1a10a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b84557ff4db80a0d606f0a099a1665471070b58a59e8c010bc0f5e4cdc21bb7a3fd8e019e04ba3e880102030405060708f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca0e0ac29311ef444214c39a01dda74283660281755b080f736525ead2a44ef43d2a00601b2fd9fde08b0642a0ea65648ede9f90b4d038e8297849cb9546b78d3cd78c0"
+ }
+ ],
+ "genesisBlockHeader" : {
+ "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1",
+ "difficulty" : "0x020000",
+ "extraData" : "0x42",
+ "gasLimit" : "0x2fefd8",
+ "gasUsed" : "0x00",
+ "hash" : "9f8661c236c947e990a8ec6a36826a04116a3b8b538580fb11b4c24c002414ae",
+ "mixHash" : "7bba8aacca3f5f41b164a5fe9be14d4423482a8db61567be534fba8487c4542b",
+ "nonce" : "f9e12735eac5c35e",
+ "number" : "0x00",
+ "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
+ "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "stateRoot" : "b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056",
+ "timestamp" : "0x54c98c81",
+ "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
+ },
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a07bba8aacca3f5f41b164a5fe9be14d4423482a8db61567be534fba8487c4542b88f9e12735eac5c35ec0c0",
+ "lastblockhash" : "9f8661c236c947e990a8ec6a36826a04116a3b8b538580fb11b4c24c002414ae",
"postState" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "0x64",
@@ -474,7 +592,7 @@
"wrongNumber" : {
"blocks" : [
{
- "rlp" : "0xf90262f901f9a0bd5affba6e8314914d1c80e449fc86bb32422655191a539295e561bb95859b7fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa0d0f521c3d2b1500b19006e0a35f77b0a9b2fd84322d3c379de013e36b2b70db9a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000080832fefd882560b845571779980a06bddf76856f614acfd4e0314e0d99e511a453c1685e3acfec644ca9b6310e41688517671c8a2609713f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca0c966be9864575e52010fe2af467e2d5cf6e4a199136a23eab0ee85d47846bbd3a0c7ec181ac50f5ec53fa0b4f41026c856574bbe2098d9d90317a250697d971753c0"
+ "rlp" : "0xf90262f901f9a0355330178117d2d83a04982501753442e9cb04e037f7df1f9eca29ddea6666baa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa02209b441926c515a6da60653f83b71e448236e1ae5240847b2e316b725521649a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000080832fefd882560b84557ff4dd80a086286d028f067a84fd47ad22b04492dda6ee99fb1e0f84b60e9e12b3b2fd55ec88831fba7fec7ee0d4f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca0f6e994176cfd1896f4cbf8bf15afa87b3471aa18c5d2fa0ed27a4c5b32ccef49a0d41553c633e2857252a873728f1260c6dfb6c034eb3e16cee7eec2432351d4f8c0"
}
],
"genesisBlockHeader" : {
@@ -484,9 +602,9 @@
"extraData" : "0x42",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x00",
- "hash" : "bd5affba6e8314914d1c80e449fc86bb32422655191a539295e561bb95859b7f",
- "mixHash" : "cd387b50c1b42183ed83d32782f8c5fa049952eff9c706c208bf7b0db67cc2c4",
- "nonce" : "262f976bd596e80e",
+ "hash" : "355330178117d2d83a04982501753442e9cb04e037f7df1f9eca29ddea6666ba",
+ "mixHash" : "7acac5570c7e5c6b105b8c16a3072a5bf79e2dabddda3b732ea1aee2c5ddec63",
+ "nonce" : "3129a41a4c150512",
"number" : "0x00",
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
@@ -495,8 +613,8 @@
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0cd387b50c1b42183ed83d32782f8c5fa049952eff9c706c208bf7b0db67cc2c488262f976bd596e80ec0c0",
- "lastblockhash" : "bd5affba6e8314914d1c80e449fc86bb32422655191a539295e561bb95859b7f",
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a07acac5570c7e5c6b105b8c16a3072a5bf79e2dabddda3b732ea1aee2c5ddec63883129a41a4c150512c0c0",
+ "lastblockhash" : "355330178117d2d83a04982501753442e9cb04e037f7df1f9eca29ddea6666ba",
"postState" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "0x64",
@@ -533,7 +651,7 @@
"wrongParentHash" : {
"blocks" : [
{
- "rlp" : "0xf90262f901f9a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa0c306ba1a9980da1ce475e972af092937a21033ca5204fadf35a54ea02d996ae6a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b845571779c80a03fb009c625b10c16916e44b0fb0d968f6e95344b4f0618eb67dbc61494d9a7498868f7b521330a24cef863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca07c5c6dfe08c78cd076b9ccd93ba735334fcb8b1c4de1de5eacb1c26687e93f48a0cdc9570b510928cb1b83464ac1cd2faa4657d40514626c655a87fda968033a09c0"
+ "rlp" : "0xf90262f901f9a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa0e9cfddb76c058b94c8617f5aec0e88b4ab114245e268a33b1a70decfb68bb9f5a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b84557ff4e080a07fbef8b98816e481ae842f068d73295123a84bf5f836faa4968233552542fef688c22ccbe4f4fd97d4f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0df47648ebbd41ebb39b9b82a2cfa6221f86848d3cc9325719eedea1cb5e3236ea0a70f89fb9954ae52f9a9823a28c5973fedd07dca3728585524f7ddf36c4a2699c0"
}
],
"genesisBlockHeader" : {
@@ -543,9 +661,9 @@
"extraData" : "0x42",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x00",
- "hash" : "e37478e7d70a1c30ee11af597c1c9a333dbd7bb4cd66c9c1bcb26c3b68b67e09",
- "mixHash" : "538d7430220da84452852f2f1073b03737f15abb1ccffc54a3d9f68324fab47c",
- "nonce" : "d359e87c1400ce8d",
+ "hash" : "19ba95521795315095932fdbcdfd6252f5be122ed9e11a4bdc76ff37d9e01126",
+ "mixHash" : "da98a6b8dff33e89dc016b90c713bb001a50654a90fbf004929b85a629e0ec98",
+ "nonce" : "df4c80f3d5a91dad",
"number" : "0x00",
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
@@ -554,8 +672,8 @@
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0538d7430220da84452852f2f1073b03737f15abb1ccffc54a3d9f68324fab47c88d359e87c1400ce8dc0c0",
- "lastblockhash" : "e37478e7d70a1c30ee11af597c1c9a333dbd7bb4cd66c9c1bcb26c3b68b67e09",
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0da98a6b8dff33e89dc016b90c713bb001a50654a90fbf004929b85a629e0ec9888df4c80f3d5a91dadc0c0",
+ "lastblockhash" : "19ba95521795315095932fdbcdfd6252f5be122ed9e11a4bdc76ff37d9e01126",
"postState" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "0x64",
@@ -592,7 +710,7 @@
"wrongParentHash2" : {
"blocks" : [
{
- "rlp" : "0xf90262f901f9a06151889c8f14ab46e32ee0b1894bc276416385d068a1ade000d0dadef9b08b18a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa071d88e6e06291f18f96be0cc281a56e74e86f18c9e629fbc8e71a0cd1c3f1270a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b84557177a080a026e252aa11d17b9f7013bac91f4af3a13cacda951288cf230f5ccb94eb3e67f1884730e9f33c34acc5f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba09f77959c844c8df3ee3203c103c7619fb767f8afd2815abcb03e569e9f61cfc5a0a6aecb59b767433a351b0513298a0a005c210f50cba4016fedb52ddb0143aecac0"
+ "rlp" : "0xf90262f901f9a06151889c8f14ab46e32ee0b1894bc276416385d068a1ade000d0dadef9b08b18a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa08447f44931420a82dc813998fc980608ba69b6e989d8e067ed54f4e4d1b00516a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b84557ff4e480a0a96d9d00cb83d9a3eaa10269ac9e3297f9af79ebe15b02033bd6c1f6a237836c88f99d1d09396a9c18f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0a830793b992f6725dda16af6d2a3e7c8b5b6d39bd15cf15fa13ed68caa5d8db1a04fb1a8166dba1eb68377ded6cc8f416762401ca12c7bda444356e320a2fbbd3fc0"
}
],
"genesisBlockHeader" : {
@@ -602,9 +720,9 @@
"extraData" : "0x42",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x00",
- "hash" : "4e3b39e51bcdd22e59994d247ba6b77df7aa7e9e08594371e34dfbf1dcfce134",
- "mixHash" : "0d087968734c2f1ac05a44e617d327e9e029756f7601b5ab8418ecc84a2892ac",
- "nonce" : "777e523a58296f05",
+ "hash" : "5272d5baa3babce753a5f092b5c3634743ab41d6f40de3fb867b044cdfa50a4c",
+ "mixHash" : "4ff65189a4cb2b2f799783a0551050eb4797e0e6260eae53676780be9939d97f",
+ "nonce" : "fcb284742b76ee35",
"number" : "0x00",
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
@@ -613,8 +731,8 @@
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a00d087968734c2f1ac05a44e617d327e9e029756f7601b5ab8418ecc84a2892ac88777e523a58296f05c0c0",
- "lastblockhash" : "4e3b39e51bcdd22e59994d247ba6b77df7aa7e9e08594371e34dfbf1dcfce134",
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a04ff65189a4cb2b2f799783a0551050eb4797e0e6260eae53676780be9939d97f88fcb284742b76ee35c0c0",
+ "lastblockhash" : "5272d5baa3babce753a5f092b5c3634743ab41d6f40de3fb867b044cdfa50a4c",
"postState" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "0x64",
@@ -651,7 +769,7 @@
"wrongReceiptTrie" : {
"blocks" : [
{
- "rlp" : "0xf90262f901f9a0e7c72d4a61a09444f2d2943d8d082e8cdac1435b71028353e6ff844873ccec30a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa029b33e4a7d8727adea58fc785f731c639a53bf13ed35b54cd6f93c633d3c699aa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b84557177a480a09f34c56d65ace260a8eb94312f02d64b21cdc48eac53c500a1cd249b930aa247887c276c1c1c5a635ef863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca05126c2ad77f95f072ea6a3cf9af36ba4141dd58c69cfef35ce083ba25494f6bda0e72a2d2bf4c9229e94a65c53c8e57dcc65252010056516dd95753f3b10d4d881c0"
+ "rlp" : "0xf90262f901f9a06605eef6ead056d45d2b56c83703faad6172fb0081e486f9f249949fe7d5e953a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa035c5334d1e4423d1373bdcfece52dc1dbe7b74d0deff46c3384f212150b50282a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b84557ff4e880a06026e2cfa76464cd9f33e8f3a29181323530cd68243ba848725d11e81af0b63b8892b0b0478ae521f9f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca0ce136fc0dd98a87f038919adff9146a56f47dee178e08fec457fd5e8ffedeb96a0877183fd1b9c22c05a7d48efac8d14f4d7826a32f0f1c917bcb995df201f21c2c0"
}
],
"genesisBlockHeader" : {
@@ -661,9 +779,9 @@
"extraData" : "0x42",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x00",
- "hash" : "e7c72d4a61a09444f2d2943d8d082e8cdac1435b71028353e6ff844873ccec30",
- "mixHash" : "94b663897de987d5a5ceba67796d1df9c7e5f5145cd2342ad87b6d065ecde894",
- "nonce" : "3abefb0f334e3acb",
+ "hash" : "6605eef6ead056d45d2b56c83703faad6172fb0081e486f9f249949fe7d5e953",
+ "mixHash" : "b3fdfcbef5c525dbb62f57a184a555b0c58d97c77e09268598d8c4c60d2ea77d",
+ "nonce" : "7858c0f32c2ed54f",
"number" : "0x00",
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
@@ -672,8 +790,8 @@
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a094b663897de987d5a5ceba67796d1df9c7e5f5145cd2342ad87b6d065ecde894883abefb0f334e3acbc0c0",
- "lastblockhash" : "e7c72d4a61a09444f2d2943d8d082e8cdac1435b71028353e6ff844873ccec30",
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0b3fdfcbef5c525dbb62f57a184a555b0c58d97c77e09268598d8c4c60d2ea77d887858c0f32c2ed54fc0c0",
+ "lastblockhash" : "6605eef6ead056d45d2b56c83703faad6172fb0081e486f9f249949fe7d5e953",
"postState" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "0x64",
@@ -710,7 +828,7 @@
"wrongStateRoot" : {
"blocks" : [
{
- "rlp" : "0xf90262f901f9a0776fad25ff482621c89ec92445f9d94f66a3b85acd96ef10d4fdc57ec3cf5fa9a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0f99eb1626cfa6db435c0836235942d7ccaa935f1ae247d3f1c21e495685f903aa0fb69849347ef970d17cc5f13c41e54557a35c7047bd67a845d0c6021fea45b3fa05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b84557177a680a0e3da7eeb0673c29f6d834aba69806398d489385acdc2f3ba8ac684ffd508defa8854cac331df56361cf863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0a8a9158d5959148d489d6a0b3d6d83cfa81d61e7e3fcb1198ed083cb52842215a081aa6240b34ed33abbb2c2b91ca948a2ee2b8e01a9ceb9803839afdcbdeb79a1c0"
+ "rlp" : "0xf90262f901f9a0edcba92aa67f033d719c6d1b619c6a53df9a572219b9e553e4949e5e11e42be7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0f99eb1626cfa6db435c0836235942d7ccaa935f1ae247d3f1c21e495685f903aa00220feb94650793c6e5b5c82da3bc726257b8578952f2007f5a43a221cf644dda05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b84557ff4eb80a03655fc3d30ce560424d4276b783df42363da9127557f80b452f0057e0093303e882db7f68a9bac0f8df863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca0172577eb4010360f0104a92844e03b56ac437157135ca3e22a5ed6326e0ecfc9a01e27afa553dd478cf4881a671e8da268c9cb5dfa00cdc25539a14268cc069527c0"
}
],
"genesisBlockHeader" : {
@@ -720,9 +838,9 @@
"extraData" : "0x42",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x00",
- "hash" : "776fad25ff482621c89ec92445f9d94f66a3b85acd96ef10d4fdc57ec3cf5fa9",
- "mixHash" : "385b4bffb7b533ac510736f7350778086b629cfe89be11bdc07362e5b55029a5",
- "nonce" : "065d56d415c6aa32",
+ "hash" : "edcba92aa67f033d719c6d1b619c6a53df9a572219b9e553e4949e5e11e42be7",
+ "mixHash" : "88af4ef320f4e007fe1eb3b683fdf9adbf38c98e8d4e350bed853e2bb63552bd",
+ "nonce" : "7bf2e2bf22b302c9",
"number" : "0x00",
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
@@ -731,8 +849,8 @@
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0385b4bffb7b533ac510736f7350778086b629cfe89be11bdc07362e5b55029a588065d56d415c6aa32c0c0",
- "lastblockhash" : "776fad25ff482621c89ec92445f9d94f66a3b85acd96ef10d4fdc57ec3cf5fa9",
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a088af4ef320f4e007fe1eb3b683fdf9adbf38c98e8d4e350bed853e2bb63552bd887bf2e2bf22b302c9c0c0",
+ "lastblockhash" : "edcba92aa67f033d719c6d1b619c6a53df9a572219b9e553e4949e5e11e42be7",
"postState" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "0x64",
@@ -769,7 +887,7 @@
"wrongTimestamp" : {
"blocks" : [
{
- "rlp" : "0xf90262f901f9a004e093f74ca345acfa7f9937543ad2decb4e7f9af0c95727c8b5a06f9406a8faa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa06bfe92fe8e2d747dff04a01ddd66d2672351ca67988e9f2dc30fa780cd9f05c8a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b8454c98c8080a03d3e7303d9a0a35f6dc8daf18e87882355d151c94ccd567dc35a1fae5acec2d588e84459defbe3e7b6f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca0cafe9452e7a37396339d2093b6b6efe0f69857acc7e9804a7c7c8df5107d6237a0baa18322cd05d89e3111ef81f4ab79912aeae93a5a1740eb2e3a5602ba7598f5c0"
+ "rlp" : "0xf90262f901f9a0325d37a5c37719331172d7d393211fa6f768c27cd6caf54134d0f821769404aaa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa0c33dadd6c3c8060f83d1f94e481b0940ea2bdea2dc32d773205bcc6083856f43a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b8454c98c8080a0fc1df352eae9084145df1a657decd03ef7fd842798f4ef3ac9090c2faf0095f28858d51dbe68417246f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca021a1e6616055d70e7d5e47789985356469bc6027c5515c9ed758ce80b6874d17a0d270a747a2c1fdb4b6bbd4b7465db93a72cb13068e196a04c7b4660ae5625175c0"
}
],
"genesisBlockHeader" : {
@@ -779,9 +897,9 @@
"extraData" : "0x42",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x00",
- "hash" : "04e093f74ca345acfa7f9937543ad2decb4e7f9af0c95727c8b5a06f9406a8fa",
- "mixHash" : "cbda32a16e5af050a76cc260b0d40d6fe147059cccc4436873d834d84f92aa0b",
- "nonce" : "81e5d0975917faec",
+ "hash" : "325d37a5c37719331172d7d393211fa6f768c27cd6caf54134d0f821769404aa",
+ "mixHash" : "136c26720914f9bd3a463d9b77845cd9e87072f741a7816c20fcde7f0788765d",
+ "nonce" : "58912a71e2613c86",
"number" : "0x00",
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
@@ -790,8 +908,8 @@
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0cbda32a16e5af050a76cc260b0d40d6fe147059cccc4436873d834d84f92aa0b8881e5d0975917faecc0c0",
- "lastblockhash" : "04e093f74ca345acfa7f9937543ad2decb4e7f9af0c95727c8b5a06f9406a8fa",
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0136c26720914f9bd3a463d9b77845cd9e87072f741a7816c20fcde7f0788765d8858912a71e2613c86c0c0",
+ "lastblockhash" : "325d37a5c37719331172d7d393211fa6f768c27cd6caf54134d0f821769404aa",
"postState" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "0x64",
@@ -828,7 +946,7 @@
"wrongTransactionsTrie" : {
"blocks" : [
{
- "rlp" : "0xf90262f901f9a00da149d94bb1a3296507424cf46cc722151c628beaf5417cbd9b20ce168d541aa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa055e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b84557177ac80a0c1f8ef3218bb72ee11cabcac7bb745caa29ce7391cdb67fc45fef396c9670bdc881237dbd2888df697f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0bf73e0d0dcda9773a898d2122d09f9e608274f8ba724a1987d2f606be4169809a02ab7dde281bf138f1dfda161100d731c725ea8f73e6158105e034135a91655d9c0"
+ "rlp" : "0xf90262f901f9a06a3767b6a08363f58f77cfa98fc68a70279cecc75e1961967851b9cdd04210c9a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa055e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b84557ff4f280a0bf84dfbf14c6f38086a79c92c5544cb40793646234a78ac75e30430f436743a788faf2ad3f0d068414f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba042bf238a8911d8c3606b17b889a5eb28cd9615b92a3786f2ec9923dc8a583982a073fe353a68edd8e3ef69b6bbfcd7c2e4aa5ac4cd30799359022e992a0b05a33fc0"
}
],
"genesisBlockHeader" : {
@@ -838,9 +956,9 @@
"extraData" : "0x42",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x00",
- "hash" : "0da149d94bb1a3296507424cf46cc722151c628beaf5417cbd9b20ce168d541a",
- "mixHash" : "fa8c8b1330f0d305db969d083e94a23cf9691372ce535c63d10881922285af8c",
- "nonce" : "2cebdf39cdcf6511",
+ "hash" : "6a3767b6a08363f58f77cfa98fc68a70279cecc75e1961967851b9cdd04210c9",
+ "mixHash" : "12f8ecbe70493ad82c374c2790718cb4cbe715811e368b59e5571194aeab640e",
+ "nonce" : "43ede73455d20c96",
"number" : "0x00",
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
@@ -849,8 +967,8 @@
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0fa8c8b1330f0d305db969d083e94a23cf9691372ce535c63d10881922285af8c882cebdf39cdcf6511c0c0",
- "lastblockhash" : "0da149d94bb1a3296507424cf46cc722151c628beaf5417cbd9b20ce168d541a",
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a012f8ecbe70493ad82c374c2790718cb4cbe715811e368b59e5571194aeab640e8843ede73455d20c96c0c0",
+ "lastblockhash" : "6a3767b6a08363f58f77cfa98fc68a70279cecc75e1961967851b9cdd04210c9",
"postState" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "0x64",
@@ -887,7 +1005,7 @@
"wrongUncleHash" : {
"blocks" : [
{
- "rlp" : "0xf90262f901f9a075c1d09b246fc5325caf2ac5f1674cdae7866f575ac531ad1dc01ea66821133ba00dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa0c8cd1d94a37eeba942bca1c417b8ef95c7fbbf4a3cdb7c72ebb590eba462cd14a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b84557177af80a02a52ae694a0f2e08c0e5df95a64b5523ccfbffe234a8b045d674c0c09bb3df418874791692338348d6f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca05cd0036147259815d89511154d5912e968def824434d36e46745b7d80ad9a604a05e3165d52ec8e2a7099f4c21830b8f25a99d8c3579f3b6c645f5e9c2c885569ec0"
+ "rlp" : "0xf90262f901f9a02fdc5ea2e08e8ae80a0aed1efc05125f25e5f109f3c6d0e2e71e663c20efd382a00dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa06923d4c8153b65641c6d4474e419e2ee39805bf80f7e898428f8a7db312505a5a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b84557ff4f680a07e8315ad74c3e73b3a0e0ca1b34d33d244c27fa3863a76f131bea4f561fee93a888358852fea734303f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0195aff059a6627625b77818df5cd44a4aa84c21a2afcc60fd92531ac00860503a0f1fa453ebdacb26ebfcc302a5fc3fa9e4fec0646dfbfe4e45fad937a868fd76dc0"
}
],
"genesisBlockHeader" : {
@@ -897,9 +1015,9 @@
"extraData" : "0x42",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x00",
- "hash" : "75c1d09b246fc5325caf2ac5f1674cdae7866f575ac531ad1dc01ea66821133b",
- "mixHash" : "9ec415d83e4b8f85bb80f25c77183b70bc73de7831e01062858b74524c0c9fc7",
- "nonce" : "48fe540a3bd532ac",
+ "hash" : "2fdc5ea2e08e8ae80a0aed1efc05125f25e5f109f3c6d0e2e71e663c20efd382",
+ "mixHash" : "caebfc33a6b7811665aefadc1104c5d32aec2a1637a468c157c6de7ffcec13c9",
+ "nonce" : "9eddc636c8cb7c86",
"number" : "0x00",
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
@@ -908,8 +1026,8 @@
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a09ec415d83e4b8f85bb80f25c77183b70bc73de7831e01062858b74524c0c9fc78848fe540a3bd532acc0c0",
- "lastblockhash" : "75c1d09b246fc5325caf2ac5f1674cdae7866f575ac531ad1dc01ea66821133b",
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0caebfc33a6b7811665aefadc1104c5d32aec2a1637a468c157c6de7ffcec13c9889eddc636c8cb7c86c0c0",
+ "lastblockhash" : "2fdc5ea2e08e8ae80a0aed1efc05125f25e5f109f3c6d0e2e71e663c20efd382",
"postState" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "0x64",
diff --git a/tests/files/BlockTests/bcUncleHeaderValiditiy.json b/tests/files/BlockTests/bcUncleHeaderValiditiy.json
index 608e345da..cb57d05ed 100644
--- a/tests/files/BlockTests/bcUncleHeaderValiditiy.json
+++ b/tests/files/BlockTests/bcUncleHeaderValiditiy.json
@@ -9,28 +9,28 @@
"extraData" : "0x",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x5208",
- "hash" : "faf88420835b29e20e9819a6160ebb73a155a8cd547f2a3013a67d7056f54f42",
- "mixHash" : "913f9c34fef9165288351a349c7d4542678f4c158caf20918c5e86ae9d6dea72",
- "nonce" : "15a314625ff5ddec",
+ "hash" : "4b10a7c3fbff1e908ef9bc0c44f41583e9e59f887e60cdd65ef0e5385dc6fab4",
+ "mixHash" : "ad1fd8a02a3102a925afb719d3e73b0f6683230bf09719b920fa69d2bef411a1",
+ "nonce" : "a76764550b0f5f55",
"number" : "0x01",
- "parentHash" : "bd2977fef3e5f70ef767e4df71b9a0528e578ea162a86873e4fa6d17bc28c230",
+ "parentHash" : "611bb4eefd9d9f09a33df2c63059c637d7dd7b2e93391de1edbc546ff31cc75e",
"receiptTrie" : "e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313",
"stateRoot" : "2c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70",
- "timestamp" : "0x55550164",
- "transactionsTrie" : "ba41bee508f4dbb16fe8919f9370bd035ee907495f8395bb8bbffbd6bd68eb24",
+ "timestamp" : "0x557fea12",
+ "transactionsTrie" : "131ddef1489989143823976a5923c98a222f5ebf04ed7b24c4ce31f6fff6b138",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "rlp" : "0xf90261f901f9a0bd2977fef3e5f70ef767e4df71b9a0528e578ea162a86873e4fa6d17bc28c230a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a0ba41bee508f4dbb16fe8919f9370bd035ee907495f8395bb8bbffbd6bd68eb24a0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd8825208845555016480a0913f9c34fef9165288351a349c7d4542678f4c158caf20918c5e86ae9d6dea728815a314625ff5ddecf862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba0c669f7163ea9c2d3a9d41ba992a946f661d3e36ad8a8642ddeaa203d8b1eb704a0fe988533aa4a852f17b7fd3050b2aa7b3d6bc82886a9d182c56e0bc42a5438eec0",
+ "rlp" : "0xf90261f901f9a0611bb4eefd9d9f09a33df2c63059c637d7dd7b2e93391de1edbc546ff31cc75ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a0131ddef1489989143823976a5923c98a222f5ebf04ed7b24c4ce31f6fff6b138a0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd882520884557fea1280a0ad1fd8a02a3102a925afb719d3e73b0f6683230bf09719b920fa69d2bef411a188a76764550b0f5f55f862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca083e3f79d08cb5930fe40e6d5eb31c6f339363529cdbbf10cbfe5dc786b86ea21a077f3cef0ff992b0fb4e405e054c2077e6af1a4108f08fd2c9ad9e68cd40aaa65c0",
"transactions" : [
{
"data" : "0x",
"gasLimit" : "0x04cb2f",
"gasPrice" : "0x01",
"nonce" : "0x00",
- "r" : "0xc669f7163ea9c2d3a9d41ba992a946f661d3e36ad8a8642ddeaa203d8b1eb704",
- "s" : "0xfe988533aa4a852f17b7fd3050b2aa7b3d6bc82886a9d182c56e0bc42a5438ee",
+ "r" : "0x83e3f79d08cb5930fe40e6d5eb31c6f339363529cdbbf10cbfe5dc786b86ea21",
+ "s" : "0x77f3cef0ff992b0fb4e405e054c2077e6af1a4108f08fd2c9ad9e68cd40aaa65",
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
- "v" : "0x1b",
+ "v" : "0x1c",
"value" : "0x0a"
}
],
@@ -45,28 +45,28 @@
"extraData" : "0x",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x5208",
- "hash" : "b999e4d623696a156ad6a57c0e99b8f106029fce21efabbf05fd3b71a7346ff4",
- "mixHash" : "0fc08cfb5f0253f7262a5a39c04cc12f232a8eb45f931a75ecd7e5a3e6b65341",
- "nonce" : "dc28f00060ef7592",
+ "hash" : "e1cbc5496b4f812419efa4ee0608a3b13ceb9f37d86b33d5ffa37318614f61c7",
+ "mixHash" : "fdf8d895953f84ed3fc4c300a2a31340065ba2ed61854b9e3a459e0dd7d4a6ca",
+ "nonce" : "9caac7aaa86927cd",
"number" : "0x02",
- "parentHash" : "faf88420835b29e20e9819a6160ebb73a155a8cd547f2a3013a67d7056f54f42",
+ "parentHash" : "4b10a7c3fbff1e908ef9bc0c44f41583e9e59f887e60cdd65ef0e5385dc6fab4",
"receiptTrie" : "5a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27",
"stateRoot" : "a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fe",
- "timestamp" : "0x55550167",
- "transactionsTrie" : "70f8efcebdd7ec387bb024964af2df2af53717a7440cf47554d0964657dfe412",
+ "timestamp" : "0x557fea14",
+ "transactionsTrie" : "2661fd12fa821f1d2f563eec4a93346278d288dbc417851b8791b604ac74cc4a",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "rlp" : "0xf90261f901f9a0faf88420835b29e20e9819a6160ebb73a155a8cd547f2a3013a67d7056f54f42a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fea070f8efcebdd7ec387bb024964af2df2af53717a7440cf47554d0964657dfe412a05a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd8825208845555016780a00fc08cfb5f0253f7262a5a39c04cc12f232a8eb45f931a75ecd7e5a3e6b6534188dc28f00060ef7592f862f86001018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca00ca044ba50a108425a8829a0d2becb39bceee8a80da5b636abe340287e5e3c7ba032c91afcbea4aa08a75291b758104aeb711d512ee591da727ffca22fa2e352f2c0",
+ "rlp" : "0xf90261f901f9a04b10a7c3fbff1e908ef9bc0c44f41583e9e59f887e60cdd65ef0e5385dc6fab4a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fea02661fd12fa821f1d2f563eec4a93346278d288dbc417851b8791b604ac74cc4aa05a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd882520884557fea1480a0fdf8d895953f84ed3fc4c300a2a31340065ba2ed61854b9e3a459e0dd7d4a6ca889caac7aaa86927cdf862f86001018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba0c9c1ddf464d43b6019c409f3436cefa9b2edcae2a422e3b97e40cd7449d3a790a0810abdd17eac3ca0ee9222ada03f2331058519138e56c7fcb3b58c4df9517704c0",
"transactions" : [
{
"data" : "0x",
"gasLimit" : "0x04cb2f",
"gasPrice" : "0x01",
"nonce" : "0x01",
- "r" : "0x0ca044ba50a108425a8829a0d2becb39bceee8a80da5b636abe340287e5e3c7b",
- "s" : "0x32c91afcbea4aa08a75291b758104aeb711d512ee591da727ffca22fa2e352f2",
+ "r" : "0xc9c1ddf464d43b6019c409f3436cefa9b2edcae2a422e3b97e40cd7449d3a790",
+ "s" : "0x810abdd17eac3ca0ee9222ada03f2331058519138e56c7fcb3b58c4df9517704",
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
- "v" : "0x1c",
+ "v" : "0x1b",
"value" : "0x0a"
}
],
@@ -81,28 +81,28 @@
"extraData" : "0x",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x5208",
- "hash" : "a6eb3d409a9d4fcdc8d2d75ab33fb3c023e2ceec4d8936e7fd107a6dbe28470a",
- "mixHash" : "35a82c47abc98ea114bc354d68707da8edbfb31b959b69536304c34d22bea5b7",
- "nonce" : "3ac923c23e1593ef",
+ "hash" : "d968d2d34979c3c993744608d48e80fc21248628811fd4c7e652e06e42a077fc",
+ "mixHash" : "da9bfc38cde54aa134b22590f2072aba128a9e6dcdd4db2546f3b02581ba9ee7",
+ "nonce" : "5600908c687c23bf",
"number" : "0x03",
- "parentHash" : "b999e4d623696a156ad6a57c0e99b8f106029fce21efabbf05fd3b71a7346ff4",
+ "parentHash" : "e1cbc5496b4f812419efa4ee0608a3b13ceb9f37d86b33d5ffa37318614f61c7",
"receiptTrie" : "2b67f7a4806df8b7971f6e30027ac45ec69215a689a1d701da979d78d57c6f78",
"stateRoot" : "a7150e152ba824446120f65ec8788e2baa7afbf0bb878bbaafe0631fc60860b2",
- "timestamp" : "0x5555016a",
- "transactionsTrie" : "c9b0f949595f5f18d7626193148e062870da82d82d2ab4e4de2ac5b2dde70754",
- "uncleHash" : "94b1f7e669a6b833eabfee173a66665a127c0ac03c6e3cbd85df8845c198b022"
+ "timestamp" : "0x557fea15",
+ "transactionsTrie" : "6f25bf8357a3c2a25ba928aa4ca5eafc4f2a8abd823959b534eb8c7d4e2af836",
+ "uncleHash" : "19228fe88e3d00b4ee6e0d8dd215f6a744ef32138879b65d3fcf20d335939e50"
},
- "rlp" : "0xf9045df901f9a0b999e4d623696a156ad6a57c0e99b8f106029fce21efabbf05fd3b71a7346ff4a094b1f7e669a6b833eabfee173a66665a127c0ac03c6e3cbd85df8845c198b022948888f1f195afa192cfee860698584c030f4c9db1a0a7150e152ba824446120f65ec8788e2baa7afbf0bb878bbaafe0631fc60860b2a0c9b0f949595f5f18d7626193148e062870da82d82d2ab4e4de2ac5b2dde70754a02b67f7a4806df8b7971f6e30027ac45ec69215a689a1d701da979d78d57c6f78b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302008003832fefd8825208845555016a80a035a82c47abc98ea114bc354d68707da8edbfb31b959b69536304c34d22bea5b7883ac923c23e1593eff862f86002018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba08013f62730adcd70e98b07e02d4cb9186f1b5800979547330c22b365f6c7d9d3a0e01282d81b8dd8b41703e31a522b153b2d72f784a676e573854652618028c2aff901faf901f7a0faf88420835b29e20e9819a6160ebb73a155a8cd547f2a3013a67d7056f54f42a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794acde5374fce5edbc8e2a8697c15331677e6ebf0ba02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd880845555016a80a0c45261dd899c6f7554bbbbd6f07464e681fcb587ed2fe29ad8c017d682abaac588f416b4f8415127d2",
+ "rlp" : "0xf9045df901f9a0e1cbc5496b4f812419efa4ee0608a3b13ceb9f37d86b33d5ffa37318614f61c7a019228fe88e3d00b4ee6e0d8dd215f6a744ef32138879b65d3fcf20d335939e50948888f1f195afa192cfee860698584c030f4c9db1a0a7150e152ba824446120f65ec8788e2baa7afbf0bb878bbaafe0631fc60860b2a06f25bf8357a3c2a25ba928aa4ca5eafc4f2a8abd823959b534eb8c7d4e2af836a02b67f7a4806df8b7971f6e30027ac45ec69215a689a1d701da979d78d57c6f78b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302008003832fefd882520884557fea1580a0da9bfc38cde54aa134b22590f2072aba128a9e6dcdd4db2546f3b02581ba9ee7885600908c687c23bff862f86002018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca00c08596a78fa940274ffdc4aab5e6feab9cf6cefabe6f4da3b332763a2d9d896a0f6e8aded667702e9803599611dd38accc9e2c06b81125cc589c674623374a8d5f901faf901f7a04b10a7c3fbff1e908ef9bc0c44f41583e9e59f887e60cdd65ef0e5385dc6fab4a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794acde5374fce5edbc8e2a8697c15331677e6ebf0ba02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd88084557fea1580a01024bb277fbd84527b4d31c5768e6a332393f20f9a23c748cc49aece3b5d6118880e5e2ee702d1315a",
"transactions" : [
{
"data" : "0x",
"gasLimit" : "0x04cb2f",
"gasPrice" : "0x01",
"nonce" : "0x02",
- "r" : "0x8013f62730adcd70e98b07e02d4cb9186f1b5800979547330c22b365f6c7d9d3",
- "s" : "0xe01282d81b8dd8b41703e31a522b153b2d72f784a676e573854652618028c2af",
+ "r" : "0x0c08596a78fa940274ffdc4aab5e6feab9cf6cefabe6f4da3b332763a2d9d896",
+ "s" : "0xf6e8aded667702e9803599611dd38accc9e2c06b81125cc589c674623374a8d5",
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
- "v" : "0x1b",
+ "v" : "0x1c",
"value" : "0x0a"
}
],
@@ -114,14 +114,14 @@
"extraData" : "0x",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x00",
- "hash" : "f1ec67402905204c9cf1c1afcc8911d432c986d89437b7c611c440ca6f62608c",
- "mixHash" : "c45261dd899c6f7554bbbbd6f07464e681fcb587ed2fe29ad8c017d682abaac5",
- "nonce" : "f416b4f8415127d2",
+ "hash" : "37fb5b24f8cb5cce6652304ba1ad4c8aa7235ce02bac0184567f8bb03ac73aa1",
+ "mixHash" : "1024bb277fbd84527b4d31c5768e6a332393f20f9a23c748cc49aece3b5d6118",
+ "nonce" : "0e5e2ee702d1315a",
"number" : "0x02",
- "parentHash" : "faf88420835b29e20e9819a6160ebb73a155a8cd547f2a3013a67d7056f54f42",
+ "parentHash" : "4b10a7c3fbff1e908ef9bc0c44f41583e9e59f887e60cdd65ef0e5385dc6fab4",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"stateRoot" : "2c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70",
- "timestamp" : "0x5555016a",
+ "timestamp" : "0x557fea15",
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
}
@@ -135,9 +135,9 @@
"extraData" : "0x42",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x00",
- "hash" : "bd2977fef3e5f70ef767e4df71b9a0528e578ea162a86873e4fa6d17bc28c230",
- "mixHash" : "7008f402b62e9f5c37612906f238ea2a6ea5957666aff170b0a6be8468e0f541",
- "nonce" : "3a162adb0dd64d96",
+ "hash" : "611bb4eefd9d9f09a33df2c63059c637d7dd7b2e93391de1edbc546ff31cc75e",
+ "mixHash" : "970689d77fb975396a9f030259f2134e42d9125f75693f7a990a27f74c8d8b3b",
+ "nonce" : "b7fd58d68844cc3f",
"number" : "0x00",
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
@@ -146,8 +146,8 @@
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a07008f402b62e9f5c37612906f238ea2a6ea5957666aff170b0a6be8468e0f541883a162adb0dd64d96c0c0",
- "lastblockhash" : "a6eb3d409a9d4fcdc8d2d75ab33fb3c023e2ceec4d8936e7fd107a6dbe28470a",
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0970689d77fb975396a9f030259f2134e42d9125f75693f7a990a27f74c8d8b3b88b7fd58d68844cc3fc0c0",
+ "lastblockhash" : "d968d2d34979c3c993744608d48e80fc21248628811fd4c7e652e06e42a077fc",
"postState" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "0x1e",
@@ -198,28 +198,28 @@
"extraData" : "0x",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x5208",
- "hash" : "48969515fd4d604d9a52bcd2a409645d82349e8357b2afc390dd54fcf1fd6b05",
- "mixHash" : "eebc9aeb85dedb95afe9a30eb24fa8f8944f2e6e747bfbd44021520f4f46ca2e",
- "nonce" : "5b9132df0cbcf3af",
+ "hash" : "f6cde068d90ac7249393e1df15a5782845fcc4f98cc494d7cdbe8bb0277ac93f",
+ "mixHash" : "85bb14195bb2557c3cd71172447cc55a0546a3809d701df563dbb310fe639a23",
+ "nonce" : "9d56cf657fdb9dcb",
"number" : "0x01",
- "parentHash" : "90d08b283a218fbf47741eb81e8407e73ad81165c461c5feb4982db4e1af33f2",
+ "parentHash" : "c983e3a988acd69a643b4229ff8ffab4990cf48a502b7ff925c2ac3f71f4b1b2",
"receiptTrie" : "e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313",
"stateRoot" : "2c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70",
- "timestamp" : "0x5555016d",
- "transactionsTrie" : "9ea12f7f18ee6192c1adbbadaaea431f6c6d153973095ad32cfbc27d4299b920",
+ "timestamp" : "0x557fea1a",
+ "transactionsTrie" : "bed128895f83effdcb26c69c7f7ef7a8334f1bd310f134c12ee6f7be088cc196",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "rlp" : "0xf90261f901f9a090d08b283a218fbf47741eb81e8407e73ad81165c461c5feb4982db4e1af33f2a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a09ea12f7f18ee6192c1adbbadaaea431f6c6d153973095ad32cfbc27d4299b920a0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd8825208845555016d80a0eebc9aeb85dedb95afe9a30eb24fa8f8944f2e6e747bfbd44021520f4f46ca2e885b9132df0cbcf3aff862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca0381218916f2aff52f3c433b0f43cc14001d6d4e43b5d2fa1bc614d152abf8b56a053d07600981741f58170925e25899f028e0f2bbf37289e916747a9ddd04c6d50c0",
+ "rlp" : "0xf90261f901f9a0c983e3a988acd69a643b4229ff8ffab4990cf48a502b7ff925c2ac3f71f4b1b2a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a0bed128895f83effdcb26c69c7f7ef7a8334f1bd310f134c12ee6f7be088cc196a0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd882520884557fea1a80a085bb14195bb2557c3cd71172447cc55a0546a3809d701df563dbb310fe639a23889d56cf657fdb9dcbf862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba0aebb457be8703f8c7d67db77ac57e9aebf2a82bef4c2abe4183a8e72e70e327ba0c27e3b68f57b97bb71c2eb066290db9c8edb04369c97011d588c95c5aa4c09d2c0",
"transactions" : [
{
"data" : "0x",
"gasLimit" : "0x04cb2f",
"gasPrice" : "0x01",
"nonce" : "0x00",
- "r" : "0x381218916f2aff52f3c433b0f43cc14001d6d4e43b5d2fa1bc614d152abf8b56",
- "s" : "0x53d07600981741f58170925e25899f028e0f2bbf37289e916747a9ddd04c6d50",
+ "r" : "0xaebb457be8703f8c7d67db77ac57e9aebf2a82bef4c2abe4183a8e72e70e327b",
+ "s" : "0xc27e3b68f57b97bb71c2eb066290db9c8edb04369c97011d588c95c5aa4c09d2",
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
- "v" : "0x1c",
+ "v" : "0x1b",
"value" : "0x0a"
}
],
@@ -234,26 +234,26 @@
"extraData" : "0x",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x5208",
- "hash" : "06e12b02ccc5dccd4b4266008a1bcab0c9f40bb35a7788b2c48783b3c95bd014",
- "mixHash" : "f873e110fe8a1e94e7aca44402ee0c84206b996c89cbbfa65f65da7dac2067a5",
- "nonce" : "2d4ab2a10a099747",
+ "hash" : "4055efe3689bf3f83cbbbf7dbf825188a3698ca70239b4c9a2fc3009b5eb8296",
+ "mixHash" : "5412c2d1713374d5546f94103c647497d2623607c71aeebc710ebb8671b3366b",
+ "nonce" : "a5b7a5aa559a2a87",
"number" : "0x02",
- "parentHash" : "48969515fd4d604d9a52bcd2a409645d82349e8357b2afc390dd54fcf1fd6b05",
+ "parentHash" : "f6cde068d90ac7249393e1df15a5782845fcc4f98cc494d7cdbe8bb0277ac93f",
"receiptTrie" : "5a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27",
"stateRoot" : "a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fe",
- "timestamp" : "0x5555016f",
- "transactionsTrie" : "30293f3165a4af49c84bba02651c40fa96aa051f0fc576e127f2b0aeae42598e",
+ "timestamp" : "0x557fea1b",
+ "transactionsTrie" : "21d7c9bb42cecbc4e0fbc0b86a907e27d5301ba313cc5eac35c6db3e44340ab8",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "rlp" : "0xf90261f901f9a048969515fd4d604d9a52bcd2a409645d82349e8357b2afc390dd54fcf1fd6b05a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fea030293f3165a4af49c84bba02651c40fa96aa051f0fc576e127f2b0aeae42598ea05a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd8825208845555016f80a0f873e110fe8a1e94e7aca44402ee0c84206b996c89cbbfa65f65da7dac2067a5882d4ab2a10a099747f862f86001018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba067fed55c7e608d37f39566ec37facc775d83792fb535378d4d9c988edb2e31d2a049176000ba20cd0d68bf11d32ab40fa4b647e0e1da476c35afd216e2e069b13cc0",
+ "rlp" : "0xf90261f901f9a0f6cde068d90ac7249393e1df15a5782845fcc4f98cc494d7cdbe8bb0277ac93fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fea021d7c9bb42cecbc4e0fbc0b86a907e27d5301ba313cc5eac35c6db3e44340ab8a05a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd882520884557fea1b80a05412c2d1713374d5546f94103c647497d2623607c71aeebc710ebb8671b3366b88a5b7a5aa559a2a87f862f86001018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba0106991745143be1ec27a9c9450ac5307b5557964dd1a0ff1273fdd0fa426968fa0a1f592b1ba4bde12e09e33a76fe87971c3b4ce5ccf1f6fae4513aa31c1698cc2c0",
"transactions" : [
{
"data" : "0x",
"gasLimit" : "0x04cb2f",
"gasPrice" : "0x01",
"nonce" : "0x01",
- "r" : "0x67fed55c7e608d37f39566ec37facc775d83792fb535378d4d9c988edb2e31d2",
- "s" : "0x49176000ba20cd0d68bf11d32ab40fa4b647e0e1da476c35afd216e2e069b13c",
+ "r" : "0x106991745143be1ec27a9c9450ac5307b5557964dd1a0ff1273fdd0fa426968f",
+ "s" : "0xa1f592b1ba4bde12e09e33a76fe87971c3b4ce5ccf1f6fae4513aa31c1698cc2",
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
"v" : "0x1b",
"value" : "0x0a"
@@ -263,7 +263,7 @@
]
},
{
- "rlp" : "0xf9045df901f9a006e12b02ccc5dccd4b4266008a1bcab0c9f40bb35a7788b2c48783b3c95bd014a0c660f7cbb8f6a2c6398e1e45ef7909a8ccad6e8e818d9f8e7336dea2b3bd2635948888f1f195afa192cfee860698584c030f4c9db1a0d40c133a2d06637484d95e89dd676d06f93ea4dcced745aa67613eeb33948f39a02dc00df6f2a20d546ff18a6b6ae0a7ddae435fb8424faafa5bab88c652d9816fa02b67f7a4806df8b7971f6e30027ac45ec69215a689a1d701da979d78d57c6f78b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302008003832fefd8825208845555017280a0a5e5cb8a60a338a0ae4a07a4bbcf1d9511bea3022829ac13e61da5bd21c541838891de71c04eab1c42f862f86002018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca055a4b88a8f468c2144a1a7849ce40aa3cda2778bf9b60b874fe76c20839521e6a08a791f81d3dcac2ac1216ab97f86de81f43fba1d57c757a83e722d69adf9c9bbf901faf901f7a048969515fd4d604d9a52bcd2a409645d82349e8357b2afc390dd54fcf1fd6b05a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794acde5374fce5edbc8e2a8697c15331677e6ebf0ba02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000102832fefd880845555017280a04b0163a2018fe94981bf974e89d9928a66a6698a6e1ba4e2a35d6be20a5c8b4f88e758c8e3e1d55d0a"
+ "rlp" : "0xf9045df901f9a04055efe3689bf3f83cbbbf7dbf825188a3698ca70239b4c9a2fc3009b5eb8296a0b19aa35dc941d28c67ea07bd08e55a2bcdc3a4c115e1ab26ce5660fb26600012948888f1f195afa192cfee860698584c030f4c9db1a0d40c133a2d06637484d95e89dd676d06f93ea4dcced745aa67613eeb33948f39a047e40e1257339bbbde4a7044a6be79fddc7c2a10bbc0eb78a9f1cfddea59bd42a02b67f7a4806df8b7971f6e30027ac45ec69215a689a1d701da979d78d57c6f78b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302008003832fefd882520884557fea1d80a03d895978d27b77e8884b47a21dbd7ad3575e907c458a1ac784f47892174ba5a588533e297fada35f0af862f86002018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba0c042baeec3abd55e810b401706ba48e58a3b08599e2b0edc6a330fa774debed0a0ab7886e593e1585b7f93a3782157ae52129fe18862feabf12d35fa0869f0f00ef901faf901f7a0f6cde068d90ac7249393e1df15a5782845fcc4f98cc494d7cdbe8bb0277ac93fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794acde5374fce5edbc8e2a8697c15331677e6ebf0ba02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000102832fefd88084557fea1d80a0ee35a97e5c5b6699d18eb9d08a0a46fea96f498724ab9e5deed47d2d19d39eb9887656acd926144286"
}
],
"genesisBlockHeader" : {
@@ -273,9 +273,9 @@
"extraData" : "0x42",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x00",
- "hash" : "90d08b283a218fbf47741eb81e8407e73ad81165c461c5feb4982db4e1af33f2",
- "mixHash" : "2e498b5cade393f581d9fb0daa6d990598f598307112e6b3a3eccb8cee8304eb",
- "nonce" : "a1002e453c4b6083",
+ "hash" : "c983e3a988acd69a643b4229ff8ffab4990cf48a502b7ff925c2ac3f71f4b1b2",
+ "mixHash" : "c86af0cd547c9f8bc16b3bebdd9e3ebfc86954603651776231e8e79b4459f33c",
+ "nonce" : "cece7d13e2fe59e4",
"number" : "0x00",
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
@@ -284,8 +284,8 @@
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a02e498b5cade393f581d9fb0daa6d990598f598307112e6b3a3eccb8cee8304eb88a1002e453c4b6083c0c0",
- "lastblockhash" : "06e12b02ccc5dccd4b4266008a1bcab0c9f40bb35a7788b2c48783b3c95bd014",
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0c86af0cd547c9f8bc16b3bebdd9e3ebfc86954603651776231e8e79b4459f33c88cece7d13e2fe59e4c0c0",
+ "lastblockhash" : "4055efe3689bf3f83cbbbf7dbf825188a3698ca70239b4c9a2fc3009b5eb8296",
"postState" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "0x14",
@@ -329,26 +329,26 @@
"extraData" : "0x",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x5208",
- "hash" : "8d16d8500f12a8dfd3793a3ebd29e164dc0ac5eca393404de7439f242c9d0991",
- "mixHash" : "9ec901a7cdb1ff500d754e253f83dc71294e72d333187d540343ea81269f7f90",
- "nonce" : "eb728226ff3a3c13",
+ "hash" : "fefae693e783163eaf6facb8fc3dbacfde6585b3ebb1b443fb3f757677069794",
+ "mixHash" : "0f0f2d7c8db01dd0bbbbbd047aba83ab98112aaa9cdf86d43f33efea35f1502b",
+ "nonce" : "d6ffc45d6e745e83",
"number" : "0x01",
- "parentHash" : "055c5d9a9c8465ab099a64bf8bb393a8d3bd1abdd14cd2749b155115ca80a1db",
+ "parentHash" : "2acd9bb0743dc559c897b8613eda723fd895e3abb15fb3eb6a6d305b36a63954",
"receiptTrie" : "e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313",
"stateRoot" : "2c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70",
- "timestamp" : "0x55550176",
- "transactionsTrie" : "583bf55bf693d83e95b4e9593bf4c1f2a402365536c338ea030aac4137c285eb",
+ "timestamp" : "0x557fea20",
+ "transactionsTrie" : "a251e1fdb141137994329ecdadb6799660093bcef3b0d4caf2af4bce7226f339",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "rlp" : "0xf90260f901f9a0055c5d9a9c8465ab099a64bf8bb393a8d3bd1abdd14cd2749b155115ca80a1dba01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a0583bf55bf693d83e95b4e9593bf4c1f2a402365536c338ea030aac4137c285eba0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd8825208845555017680a09ec901a7cdb1ff500d754e253f83dc71294e72d333187d540343ea81269f7f9088eb728226ff3a3c13f861f85f80018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca0e864c73df821c9babefca008f6e4851a2c6f5c637d4d010e8003b8b473f6351d9f03d2c622fd99387243d323a3e88bbc1a1f9583f3a1543ea8e7e4f567ad45bcc0",
+ "rlp" : "0xf90261f901f9a02acd9bb0743dc559c897b8613eda723fd895e3abb15fb3eb6a6d305b36a63954a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a0a251e1fdb141137994329ecdadb6799660093bcef3b0d4caf2af4bce7226f339a0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd882520884557fea2080a00f0f2d7c8db01dd0bbbbbd047aba83ab98112aaa9cdf86d43f33efea35f1502b88d6ffc45d6e745e83f862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca05053dfee8de087ef8b6c37b2e39090885bf63c8ca35f48c9edd678118e0f9df7a092caa685f1d97fd7ee4ae8b2c40797e087de7d6da821e4977024e23f71b991bdc0",
"transactions" : [
{
"data" : "0x",
"gasLimit" : "0x04cb2f",
"gasPrice" : "0x01",
"nonce" : "0x00",
- "r" : "0xe864c73df821c9babefca008f6e4851a2c6f5c637d4d010e8003b8b473f6351d",
- "s" : "0x03d2c622fd99387243d323a3e88bbc1a1f9583f3a1543ea8e7e4f567ad45bc",
+ "r" : "0x5053dfee8de087ef8b6c37b2e39090885bf63c8ca35f48c9edd678118e0f9df7",
+ "s" : "0x92caa685f1d97fd7ee4ae8b2c40797e087de7d6da821e4977024e23f71b991bd",
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
"v" : "0x1c",
"value" : "0x0a"
@@ -365,28 +365,28 @@
"extraData" : "0x",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x5208",
- "hash" : "53894eee2d3ffa6d27a6e7d1a5d41a044047009bda1855cac67cf667f5b8c8b2",
- "mixHash" : "fd0397fbb0db49ed91b792e4ab780a6716d570788e49e41158391f81c9c8703c",
- "nonce" : "237437077cca191c",
+ "hash" : "d7d8747dc16a3b37b58f2f8f5e63b4ba338339f286c049148eb1f5d5542b359c",
+ "mixHash" : "0f80342c244441aae61898f9bf4e6b50aa5aa021c35b90197e7259b65d0d3f2a",
+ "nonce" : "9959cfe967b6250c",
"number" : "0x02",
- "parentHash" : "8d16d8500f12a8dfd3793a3ebd29e164dc0ac5eca393404de7439f242c9d0991",
+ "parentHash" : "fefae693e783163eaf6facb8fc3dbacfde6585b3ebb1b443fb3f757677069794",
"receiptTrie" : "5a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27",
"stateRoot" : "a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fe",
- "timestamp" : "0x55550179",
- "transactionsTrie" : "4bd04db776d5aab61443a7d2de4100b5adda3eb72ed1c97dc5ef896141f7f663",
+ "timestamp" : "0x557fea23",
+ "transactionsTrie" : "8f614e76ed346b8096afd61f08e559d3f4f00445658566ddcce80d19bc3154e6",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "rlp" : "0xf90261f901f9a08d16d8500f12a8dfd3793a3ebd29e164dc0ac5eca393404de7439f242c9d0991a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fea04bd04db776d5aab61443a7d2de4100b5adda3eb72ed1c97dc5ef896141f7f663a05a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd8825208845555017980a0fd0397fbb0db49ed91b792e4ab780a6716d570788e49e41158391f81c9c8703c88237437077cca191cf862f86001018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca021a0e58298790c43d83e66d1cecbda17cdeec6bfe78d00d51bac8a6cc49ee36ea0fb0a3b2e2226aaac6c07b2a9a8f2e83ee1dfd934251985a6d993d72b00d52c5ec0",
+ "rlp" : "0xf90261f901f9a0fefae693e783163eaf6facb8fc3dbacfde6585b3ebb1b443fb3f757677069794a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fea08f614e76ed346b8096afd61f08e559d3f4f00445658566ddcce80d19bc3154e6a05a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd882520884557fea2380a00f80342c244441aae61898f9bf4e6b50aa5aa021c35b90197e7259b65d0d3f2a889959cfe967b6250cf862f86001018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba00b56ebf6c62bfe049e18b1ea4b03f7411b162ddbe5cb8235d97a18d27c25f679a003b0e88c0e4edcee2eb9894685ef98c3769ca43d2506ab6c34659cf662a7bdd3c0",
"transactions" : [
{
"data" : "0x",
"gasLimit" : "0x04cb2f",
"gasPrice" : "0x01",
"nonce" : "0x01",
- "r" : "0x21a0e58298790c43d83e66d1cecbda17cdeec6bfe78d00d51bac8a6cc49ee36e",
- "s" : "0xfb0a3b2e2226aaac6c07b2a9a8f2e83ee1dfd934251985a6d993d72b00d52c5e",
+ "r" : "0x0b56ebf6c62bfe049e18b1ea4b03f7411b162ddbe5cb8235d97a18d27c25f679",
+ "s" : "0x03b0e88c0e4edcee2eb9894685ef98c3769ca43d2506ab6c34659cf662a7bdd3",
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
- "v" : "0x1c",
+ "v" : "0x1b",
"value" : "0x0a"
}
],
@@ -394,7 +394,7 @@
]
},
{
- "rlp" : "0xf9045df901f9a053894eee2d3ffa6d27a6e7d1a5d41a044047009bda1855cac67cf667f5b8c8b2a0638b44e1dd59c7ea7f6ec6dc2f36ced3395306c0e5e926413fd8c7527adeabad948888f1f195afa192cfee860698584c030f4c9db1a0d40c133a2d06637484d95e89dd676d06f93ea4dcced745aa67613eeb33948f39a090e4f4346323b80f7506c37ae03a90b61294d9ea43ae3cc93a9dbe8ae20c797da02b67f7a4806df8b7971f6e30027ac45ec69215a689a1d701da979d78d57c6f78b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302008003832fefd8825208845555017c80a0c5821acb4fadf3a9e726fa6c389a120b276ef6e416a327784bfde9a227e8e5c48878618a14506e4173f862f86002018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba08ee856d60282b5e466b094661627be2df1d4eb4495b8cd12cf0e5dea864bf4f0a0c8b3416752b94914c16456e70ff745262cada5a7dd0c4cd8cc5e55d5277204c5f901faf901f7a08d16d8500f12a8dfd3793a3ebd29e164dc0ac5eca393404de7439f242c9d0991a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794acde5374fce5edbc8e2a8697c15331677e6ebf0ba02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008301ffff02832fefd880845555017c80a089ffafddb6d913fd5a2916d7000cd165bf3663781840688b2737cc5daa4c9da888d078106bdfd5cd43"
+ "rlp" : "0xf9045df901f9a0d7d8747dc16a3b37b58f2f8f5e63b4ba338339f286c049148eb1f5d5542b359ca021757cc95d7e0e2a26f3650d2e5cf84c961fccc588fa10e28619e563d1545aec948888f1f195afa192cfee860698584c030f4c9db1a0d40c133a2d06637484d95e89dd676d06f93ea4dcced745aa67613eeb33948f39a00372a6314a85e52beca61b6fe6dd538d966b724f12a131f45b6b9eace7baeb9fa02b67f7a4806df8b7971f6e30027ac45ec69215a689a1d701da979d78d57c6f78b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302008003832fefd882520884557fea2680a0de9d181195d07b0c88641992b8461a31143e9e813061c16e1c6aa7424277efb288ba6915200769c997f862f86002018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca03adf0c2db892c2d7f748691e5a920d8976aec11c300a24cccd178d0e69a15c28a0dd7d71b780fc5eb8f4d7fff06206db6cf944c43070c373fb14c4113480594d6af901faf901f7a0fefae693e783163eaf6facb8fc3dbacfde6585b3ebb1b443fb3f757677069794a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794acde5374fce5edbc8e2a8697c15331677e6ebf0ba02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008301ffff02832fefd88084557fea2680a020eb2bc5cf105d975f3355caf8bc549d0554c2b5c23c03ed69fc8d88694db0c588429eb2c19392709f"
}
],
"genesisBlockHeader" : {
@@ -404,9 +404,9 @@
"extraData" : "0x42",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x00",
- "hash" : "055c5d9a9c8465ab099a64bf8bb393a8d3bd1abdd14cd2749b155115ca80a1db",
- "mixHash" : "bceefded1246bf0c0bd93484f6d67cb77717935c7af8576988a2000bfab9a407",
- "nonce" : "e791bce41cc7b793",
+ "hash" : "2acd9bb0743dc559c897b8613eda723fd895e3abb15fb3eb6a6d305b36a63954",
+ "mixHash" : "18f5ac7d90121919f0eec6c1bb284481a4e0a0401a2133fca06e0f01db259615",
+ "nonce" : "729d21785bf56efa",
"number" : "0x00",
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
@@ -415,8 +415,8 @@
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0bceefded1246bf0c0bd93484f6d67cb77717935c7af8576988a2000bfab9a40788e791bce41cc7b793c0c0",
- "lastblockhash" : "53894eee2d3ffa6d27a6e7d1a5d41a044047009bda1855cac67cf667f5b8c8b2",
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a018f5ac7d90121919f0eec6c1bb284481a4e0a0401a2133fca06e0f01db25961588729d21785bf56efac0c0",
+ "lastblockhash" : "d7d8747dc16a3b37b58f2f8f5e63b4ba338339f286c049148eb1f5d5542b359c",
"postState" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "0x14",
@@ -460,28 +460,28 @@
"extraData" : "0x",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x5208",
- "hash" : "3a07c31b431b92668bceb0f65f5567e500fd2f96a73b4d444d3f3a8d593aa67f",
- "mixHash" : "be69c6ef60b63801e47cb973edb4b8e861cd94dfce9f8f2d82b7e39e0e1e1b5a",
- "nonce" : "b847ced9affb2d12",
+ "hash" : "74bb7a98cb2aa3a285c75d2b476c127f5cf9bac00f0a60a3432129884b6375f3",
+ "mixHash" : "a4a51d2ebc8286df2bc2e412e53d847f65a238bc1fc4faac3c153115acda2b02",
+ "nonce" : "1510fe6e53a69ef1",
"number" : "0x01",
- "parentHash" : "f029709eb89ec010fe61f07a54925f1d1772030c2af0359842be07429dc4bc2a",
+ "parentHash" : "42a3279d65af8f7d15fd370048c5035c600286e4623afe988435f9bb35a8a762",
"receiptTrie" : "e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313",
"stateRoot" : "2c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70",
- "timestamp" : "0x5555017f",
- "transactionsTrie" : "d15ff8eac215a3a96220081ad3d6baaab76f652daaef3c4c4478afe1e674c59c",
+ "timestamp" : "0x557fea2a",
+ "transactionsTrie" : "b733dd575da3bcd610e089ee5b8be0917cf5d1a2c35427dad6549877d5a2c903",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "rlp" : "0xf90261f901f9a0f029709eb89ec010fe61f07a54925f1d1772030c2af0359842be07429dc4bc2aa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a0d15ff8eac215a3a96220081ad3d6baaab76f652daaef3c4c4478afe1e674c59ca0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303863001832fefd8825208845555017f80a0be69c6ef60b63801e47cb973edb4b8e861cd94dfce9f8f2d82b7e39e0e1e1b5a88b847ced9affb2d12f862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca0bd2c211918a746a2033e972150238e344f42e7b411813c85e265e4ef4a48c2c2a06ce56e51fcc8181e1a98ef1608c63a989e9496cdda0103f01eb0c7a8049a9b19c0",
+ "rlp" : "0xf90261f901f9a042a3279d65af8f7d15fd370048c5035c600286e4623afe988435f9bb35a8a762a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a0b733dd575da3bcd610e089ee5b8be0917cf5d1a2c35427dad6549877d5a2c903a0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303863001832fefd882520884557fea2a80a0a4a51d2ebc8286df2bc2e412e53d847f65a238bc1fc4faac3c153115acda2b02881510fe6e53a69ef1f862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba02f6fdd979ab4f7c6bb010fad075de570e79b7eb97bb0ae725c8d2109b435a260a0d6f226c5afe7dd5ec23fbc5e1c1b9e0e2ae66ce5e9a243f0fe5a6ed8f4636df7c0",
"transactions" : [
{
"data" : "0x",
"gasLimit" : "0x04cb2f",
"gasPrice" : "0x01",
"nonce" : "0x00",
- "r" : "0xbd2c211918a746a2033e972150238e344f42e7b411813c85e265e4ef4a48c2c2",
- "s" : "0x6ce56e51fcc8181e1a98ef1608c63a989e9496cdda0103f01eb0c7a8049a9b19",
+ "r" : "0x2f6fdd979ab4f7c6bb010fad075de570e79b7eb97bb0ae725c8d2109b435a260",
+ "s" : "0xd6f226c5afe7dd5ec23fbc5e1c1b9e0e2ae66ce5e9a243f0fe5a6ed8f4636df7",
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
- "v" : "0x1c",
+ "v" : "0x1b",
"value" : "0x0a"
}
],
@@ -496,28 +496,28 @@
"extraData" : "0x",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x5208",
- "hash" : "8619878aefd8f5f3bb38df752c8fcd836ee80d2f62205cad7da52121787ae192",
- "mixHash" : "f4190b88a5613bf1a9ca5dd90afac26f8356bff6724c44df63860ce2f3b2bdba",
- "nonce" : "23958da3e4d38dc6",
+ "hash" : "da6acbbea03d49b7a39b5a08c462575e3b092d5baa6779c0dc79aa2cb6f801c0",
+ "mixHash" : "4d54bb1289489308f788add836c400dd9f3e89d8f70784ec28adac946dd62bb3",
+ "nonce" : "52ad73b8296927a1",
"number" : "0x02",
- "parentHash" : "3a07c31b431b92668bceb0f65f5567e500fd2f96a73b4d444d3f3a8d593aa67f",
+ "parentHash" : "74bb7a98cb2aa3a285c75d2b476c127f5cf9bac00f0a60a3432129884b6375f3",
"receiptTrie" : "5a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27",
"stateRoot" : "a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fe",
- "timestamp" : "0x55550184",
- "transactionsTrie" : "49f105b74255212e17ecac59b8ae9daf9ee85e5f5237025a5feed88ef1442d95",
+ "timestamp" : "0x557fea2e",
+ "transactionsTrie" : "f06292dff80d0a85ddf962b552c22a2b8f44285690abc942075d6b3550971f63",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "rlp" : "0xf90261f901f9a03a07c31b431b92668bceb0f65f5567e500fd2f96a73b4d444d3f3a8d593aa67fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fea049f105b74255212e17ecac59b8ae9daf9ee85e5f5237025a5feed88ef1442d95a05a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a002832fefd8825208845555018480a0f4190b88a5613bf1a9ca5dd90afac26f8356bff6724c44df63860ce2f3b2bdba8823958da3e4d38dc6f862f86001018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba050073eee69655032876ec7820e02509e7410700b4f40cad13efcee4e518cbb23a0b739b571077206ab47af7298784fa2a9dacc4bc68ef61c395d004547ab32cfc3c0",
+ "rlp" : "0xf90261f901f9a074bb7a98cb2aa3a285c75d2b476c127f5cf9bac00f0a60a3432129884b6375f3a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fea0f06292dff80d0a85ddf962b552c22a2b8f44285690abc942075d6b3550971f63a05a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a002832fefd882520884557fea2e80a04d54bb1289489308f788add836c400dd9f3e89d8f70784ec28adac946dd62bb38852ad73b8296927a1f862f86001018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca0a854e41b3c28fdf2a4aa78dd653f9f9a1d2ada74afdae29ff89583940fdcefdba0670cf5fd2a73674d8a9dfc5e0882859406ee998195c0e86088ae08aa387ed58dc0",
"transactions" : [
{
"data" : "0x",
"gasLimit" : "0x04cb2f",
"gasPrice" : "0x01",
"nonce" : "0x01",
- "r" : "0x50073eee69655032876ec7820e02509e7410700b4f40cad13efcee4e518cbb23",
- "s" : "0xb739b571077206ab47af7298784fa2a9dacc4bc68ef61c395d004547ab32cfc3",
+ "r" : "0xa854e41b3c28fdf2a4aa78dd653f9f9a1d2ada74afdae29ff89583940fdcefdb",
+ "s" : "0x670cf5fd2a73674d8a9dfc5e0882859406ee998195c0e86088ae08aa387ed58d",
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
- "v" : "0x1b",
+ "v" : "0x1c",
"value" : "0x0a"
}
],
@@ -525,7 +525,7 @@
]
},
{
- "rlp" : "0xf9045df901f9a08619878aefd8f5f3bb38df752c8fcd836ee80d2f62205cad7da52121787ae192a09fffb969a29c70ddd46da55eea08f7b07453cdeb8e83862cbf860f26e6b93467948888f1f195afa192cfee860698584c030f4c9db1a0d40c133a2d06637484d95e89dd676d06f93ea4dcced745aa67613eeb33948f39a0961557d89e3ac76c77ef8eacece1fd2ddaeb38d9693bdd06c5fe566cd8856e51a02b67f7a4806df8b7971f6e30027ac45ec69215a689a1d701da979d78d57c6f78b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303871003832fefd8825208845555018980a055c14437a1c2e76c15448cdcc13cb0c290a3a03097be581da7e741e4e6424507886f188037cb659d84f862f86002018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba01d354753350459414574425456d5f421d58d55b8f3bdb427fd58302d4ff17232a07979b8dc9049b364aca1d13becc783c207325b4cb02623e53d3e72d3f55ef311f901faf901f7a03a07c31b431b92668bceb0f65f5567e500fd2f96a73b4d444d3f3a8d593aa67fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794acde5374fce5edbc8e2a8697c15331677e6ebf0ba02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830385bf02832fefd880845555018980a03926a75d208055d5ce218c84586aadaa977c11d08846f90e6a1d276c1a0e3e67884eb19a13e9e640a8"
+ "rlp" : "0xf9045df901f9a0da6acbbea03d49b7a39b5a08c462575e3b092d5baa6779c0dc79aa2cb6f801c0a0ee0832479fb8481013db5226cb2229626b9e18999ac6a71d16e73af3ecbb56e2948888f1f195afa192cfee860698584c030f4c9db1a0d40c133a2d06637484d95e89dd676d06f93ea4dcced745aa67613eeb33948f39a072835939cff5ef70169f91f2d23f1a140ef0958a55b1f98293c97c85071cc20ca02b67f7a4806df8b7971f6e30027ac45ec69215a689a1d701da979d78d57c6f78b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303871003832fefd882520884557fea3080a0b9b6f7a4454b874125904bc198c36aea2587a1177358299c7c3c7f8adb2b630488fd248f691ab0472df862f86002018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca04c2ef9f6f53ea3aeb60ae031fac41113e9bb7aaf492eeaf06c01594f40eaa414a04e298f0249c5afcb66909ce5b1f1ece3f2b2108e2f59f21e22ed55ab5ef97466f901faf901f7a074bb7a98cb2aa3a285c75d2b476c127f5cf9bac00f0a60a3432129884b6375f3a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794acde5374fce5edbc8e2a8697c15331677e6ebf0ba02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830385bf02832fefd88084557fea3080a01b4948c6c7375a4c48652b5e3b7d7ca0ce24653a42082bd453b68a4d9d6785658897be20ead7dbacba"
}
],
"genesisBlockHeader" : {
@@ -535,9 +535,9 @@
"extraData" : "0x42",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x00",
- "hash" : "f029709eb89ec010fe61f07a54925f1d1772030c2af0359842be07429dc4bc2a",
- "mixHash" : "01a3421ac34cf63bb508749996c3f1067392591041e2ca2548a1c4cd637e68b3",
- "nonce" : "fd96d67e24298e0d",
+ "hash" : "42a3279d65af8f7d15fd370048c5035c600286e4623afe988435f9bb35a8a762",
+ "mixHash" : "848ed43f722b7cd58f7564a40dcf6a0760c0068cbaa40ce815a69d60e1d7e7fe",
+ "nonce" : "79732f45e8c80f83",
"number" : "0x00",
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
@@ -546,8 +546,8 @@
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a080832fefd8808454c98c8142a001a3421ac34cf63bb508749996c3f1067392591041e2ca2548a1c4cd637e68b388fd96d67e24298e0dc0c0",
- "lastblockhash" : "8619878aefd8f5f3bb38df752c8fcd836ee80d2f62205cad7da52121787ae192",
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a080832fefd8808454c98c8142a0848ed43f722b7cd58f7564a40dcf6a0760c0068cbaa40ce815a69d60e1d7e7fe8879732f45e8c80f83c0c0",
+ "lastblockhash" : "da6acbbea03d49b7a39b5a08c462575e3b092d5baa6779c0dc79aa2cb6f801c0",
"postState" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "0x14",
@@ -591,26 +591,26 @@
"extraData" : "0x",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x5208",
- "hash" : "cf323a783b3fe34c132d7f24677361a3607e4e2fc250b1e7219657f0ea8ac3d3",
- "mixHash" : "06611f525418504b266994532bfe2aa772deeb996a68025fbc84f703789917f5",
- "nonce" : "6df4f8d8986744ff",
+ "hash" : "4cda6d5ea90d0e1522f9652ae0676384fcd7b1dd943dc2998722d9d42ac43e06",
+ "mixHash" : "536eaa9d9deac48d737b314041765e36fb37eab7705a92f6de6e32389241a4ac",
+ "nonce" : "5069aadb6b0170e6",
"number" : "0x01",
- "parentHash" : "3ab50f686522706a1b2891189bcc68a1f0c1d6d7a39534c875bd6217fe6111f8",
+ "parentHash" : "d1b2eaca11a6f6e85b9d773217aa822ba4bac8940851a808d766d38567c24b20",
"receiptTrie" : "e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313",
"stateRoot" : "2c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70",
- "timestamp" : "0x5555018e",
- "transactionsTrie" : "e2e5d2d40df98b30088e0351ac4f8d8e696309ff349ac14ad6920990866a3068",
+ "timestamp" : "0x557fea35",
+ "transactionsTrie" : "2351d1017ac82d42c2f380e36cc6ca7682434856e91e7c02751cd9a30fa44c2e",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "rlp" : "0xf90261f901f9a03ab50f686522706a1b2891189bcc68a1f0c1d6d7a39534c875bd6217fe6111f8a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a0e2e5d2d40df98b30088e0351ac4f8d8e696309ff349ac14ad6920990866a3068a0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303863001832fefd8825208845555018e80a006611f525418504b266994532bfe2aa772deeb996a68025fbc84f703789917f5886df4f8d8986744fff862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba0989f4f53bd8e59e1596c6b1fa61b514fb3de633cadf02f4fb34a50180f3dad08a0e138376bf165ed29cd0ae86c220e5ab39419b7018392a3b82eaef4b0c47c9762c0",
+ "rlp" : "0xf90261f901f9a0d1b2eaca11a6f6e85b9d773217aa822ba4bac8940851a808d766d38567c24b20a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a02351d1017ac82d42c2f380e36cc6ca7682434856e91e7c02751cd9a30fa44c2ea0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303863001832fefd882520884557fea3580a0536eaa9d9deac48d737b314041765e36fb37eab7705a92f6de6e32389241a4ac885069aadb6b0170e6f862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba0c77df764ec05ae298c7165bdf9fc5c7e4af3536b03dc7892f4e0231883e12f54a0c627814fc59c39816c6e93440d13d56296b59b58f8bf69a961faedef6e1d3639c0",
"transactions" : [
{
"data" : "0x",
"gasLimit" : "0x04cb2f",
"gasPrice" : "0x01",
"nonce" : "0x00",
- "r" : "0x989f4f53bd8e59e1596c6b1fa61b514fb3de633cadf02f4fb34a50180f3dad08",
- "s" : "0xe138376bf165ed29cd0ae86c220e5ab39419b7018392a3b82eaef4b0c47c9762",
+ "r" : "0xc77df764ec05ae298c7165bdf9fc5c7e4af3536b03dc7892f4e0231883e12f54",
+ "s" : "0xc627814fc59c39816c6e93440d13d56296b59b58f8bf69a961faedef6e1d3639",
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
"v" : "0x1b",
"value" : "0x0a"
@@ -627,28 +627,28 @@
"extraData" : "0x",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x5208",
- "hash" : "7d7bf8f2f1d132e3824ce7e0b9fc949b0852e97eba4accb3b3463225e13b1272",
- "mixHash" : "e4abf3ad6f22f2dda205ab2664455615e7d890bc34d7daf69aaaad1db315a028",
- "nonce" : "5fe990f304e6951f",
+ "hash" : "7d1d2aefdb088fdde2613f09c4566bbe71ab52e42b8ef781cc09b8acab2cae5c",
+ "mixHash" : "59c54a8f997182b9a061ca93587d51fb15d40c010fe8c85161969f41ec7cac44",
+ "nonce" : "f086a0edb895354b",
"number" : "0x02",
- "parentHash" : "cf323a783b3fe34c132d7f24677361a3607e4e2fc250b1e7219657f0ea8ac3d3",
+ "parentHash" : "4cda6d5ea90d0e1522f9652ae0676384fcd7b1dd943dc2998722d9d42ac43e06",
"receiptTrie" : "5a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27",
"stateRoot" : "a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fe",
- "timestamp" : "0x55550191",
- "transactionsTrie" : "484692674cff0bead4998d371d7c8f8b6b6f59f5ddb91b69af4b31be7b086f80",
+ "timestamp" : "0x557fea37",
+ "transactionsTrie" : "5b8eb45f5507df294b7a59d12b627bcbe6cd54023a915d45ddfdbd8610bfe7aa",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "rlp" : "0xf90261f901f9a0cf323a783b3fe34c132d7f24677361a3607e4e2fc250b1e7219657f0ea8ac3d3a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fea0484692674cff0bead4998d371d7c8f8b6b6f59f5ddb91b69af4b31be7b086f80a05a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a002832fefd8825208845555019180a0e4abf3ad6f22f2dda205ab2664455615e7d890bc34d7daf69aaaad1db315a028885fe990f304e6951ff862f86001018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca028e5f56214ed9715cb1920cdcccc5da7c7daf38caecd21d9d0afd0ec4cd54496a0d29269981fb045b927bf90336afbc0eb2f320e7ab0599cc806dabc2974119caec0",
+ "rlp" : "0xf90261f901f9a04cda6d5ea90d0e1522f9652ae0676384fcd7b1dd943dc2998722d9d42ac43e06a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fea05b8eb45f5507df294b7a59d12b627bcbe6cd54023a915d45ddfdbd8610bfe7aaa05a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a002832fefd882520884557fea3780a059c54a8f997182b9a061ca93587d51fb15d40c010fe8c85161969f41ec7cac4488f086a0edb895354bf862f86001018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba026be035eda9f6dcfd81ae76e92db8dc418c28abff2bb96eb88e265a0f1efef72a041ca3928663107624e51e094d744958cd1a159eb29ae2955ef93889c6fb13acbc0",
"transactions" : [
{
"data" : "0x",
"gasLimit" : "0x04cb2f",
"gasPrice" : "0x01",
"nonce" : "0x01",
- "r" : "0x28e5f56214ed9715cb1920cdcccc5da7c7daf38caecd21d9d0afd0ec4cd54496",
- "s" : "0xd29269981fb045b927bf90336afbc0eb2f320e7ab0599cc806dabc2974119cae",
+ "r" : "0x26be035eda9f6dcfd81ae76e92db8dc418c28abff2bb96eb88e265a0f1efef72",
+ "s" : "0x41ca3928663107624e51e094d744958cd1a159eb29ae2955ef93889c6fb13acb",
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
- "v" : "0x1c",
+ "v" : "0x1b",
"value" : "0x0a"
}
],
@@ -663,26 +663,26 @@
"extraData" : "0x",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x5208",
- "hash" : "7785a240ca1a6b956214518e2ed68e194ac0228e84adb8ed6e888082e49acd1e",
- "mixHash" : "e71085ee4b6a0791043cda699d60be0b53f1cd58a66676b33a94499151d00c75",
- "nonce" : "3e6e7cc272ac573a",
+ "hash" : "190e7baace3947b1c5786e4ce143451b4e339f77085ea4fe9a45e7f3c4cfa7b1",
+ "mixHash" : "9aa86ae7a684161ddc5112d1616a07129f43b0585252efdbc419c6accdd41ae9",
+ "nonce" : "215b7ac12fc51862",
"number" : "0x03",
- "parentHash" : "7d7bf8f2f1d132e3824ce7e0b9fc949b0852e97eba4accb3b3463225e13b1272",
+ "parentHash" : "7d1d2aefdb088fdde2613f09c4566bbe71ab52e42b8ef781cc09b8acab2cae5c",
"receiptTrie" : "2b67f7a4806df8b7971f6e30027ac45ec69215a689a1d701da979d78d57c6f78",
"stateRoot" : "a7150e152ba824446120f65ec8788e2baa7afbf0bb878bbaafe0631fc60860b2",
- "timestamp" : "0x55550193",
- "transactionsTrie" : "7b571f35f17f728cf91e64cce3b662a30296f2214ce82a085a10903d108f3909",
- "uncleHash" : "325e355c820ff6f4c56b11bf8d356e14f7100f5853f797f53b89a8a6b9e6adcd"
+ "timestamp" : "0x557fea3a",
+ "transactionsTrie" : "26615a960522fde5db004d80af29788199b6d22355a879a9d98854ee140119fb",
+ "uncleHash" : "18dba1a4bfce045b462a8dd0afc76da97822814b1fd2e0d6f3c2e495a519c890"
},
- "rlp" : "0xf9045df901f9a07d7bf8f2f1d132e3824ce7e0b9fc949b0852e97eba4accb3b3463225e13b1272a0325e355c820ff6f4c56b11bf8d356e14f7100f5853f797f53b89a8a6b9e6adcd948888f1f195afa192cfee860698584c030f4c9db1a0a7150e152ba824446120f65ec8788e2baa7afbf0bb878bbaafe0631fc60860b2a07b571f35f17f728cf91e64cce3b662a30296f2214ce82a085a10903d108f3909a02b67f7a4806df8b7971f6e30027ac45ec69215a689a1d701da979d78d57c6f78b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303871003832fefd8825208845555019380a0e71085ee4b6a0791043cda699d60be0b53f1cd58a66676b33a94499151d00c75883e6e7cc272ac573af862f86002018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba0e1e6d4a72aa2d3cee4f18202c854da9753e5edeba688edeecd3b2bc40da38154a0c3a33ea1365d4a4924a9fa286c8798d0ec39ed2f545b7a462bf27422011dffbef901faf901f7a0cf323a783b3fe34c132d7f24677361a3607e4e2fc250b1e7219657f0ea8ac3d3a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794acde5374fce5edbc8e2a8697c15331677e6ebf0ba02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a002832fefd980845555019380a06959fe650d3412c2ca7b1dc1a6cac2f50caf8b4f349319c9647577203cc22b4688da5cdbe124a57ec1",
+ "rlp" : "0xf9045df901f9a07d1d2aefdb088fdde2613f09c4566bbe71ab52e42b8ef781cc09b8acab2cae5ca018dba1a4bfce045b462a8dd0afc76da97822814b1fd2e0d6f3c2e495a519c890948888f1f195afa192cfee860698584c030f4c9db1a0a7150e152ba824446120f65ec8788e2baa7afbf0bb878bbaafe0631fc60860b2a026615a960522fde5db004d80af29788199b6d22355a879a9d98854ee140119fba02b67f7a4806df8b7971f6e30027ac45ec69215a689a1d701da979d78d57c6f78b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303871003832fefd882520884557fea3a80a09aa86ae7a684161ddc5112d1616a07129f43b0585252efdbc419c6accdd41ae988215b7ac12fc51862f862f86002018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba041331e7f2f2c78c7372a643791b3273794346dbfbd66cf76846fbffa75c8001ea04ec74fd7351555330778783039ed84ec0f216ddd9fa9eba90a0474c3e466e57ff901faf901f7a04cda6d5ea90d0e1522f9652ae0676384fcd7b1dd943dc2998722d9d42ac43e06a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794acde5374fce5edbc8e2a8697c15331677e6ebf0ba02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a002832fefd98084557fea3a80a080f3b70ced14d0e9ddf2264a94e847df8fbb6ad42574b75bb37c08f89f9913c588c0e11419b693f4c0",
"transactions" : [
{
"data" : "0x",
"gasLimit" : "0x04cb2f",
"gasPrice" : "0x01",
"nonce" : "0x02",
- "r" : "0xe1e6d4a72aa2d3cee4f18202c854da9753e5edeba688edeecd3b2bc40da38154",
- "s" : "0xc3a33ea1365d4a4924a9fa286c8798d0ec39ed2f545b7a462bf27422011dffbe",
+ "r" : "0x41331e7f2f2c78c7372a643791b3273794346dbfbd66cf76846fbffa75c8001e",
+ "s" : "0x4ec74fd7351555330778783039ed84ec0f216ddd9fa9eba90a0474c3e466e57f",
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
"v" : "0x1b",
"value" : "0x0a"
@@ -696,14 +696,14 @@
"extraData" : "0x",
"gasLimit" : "0x2fefd9",
"gasUsed" : "0x00",
- "hash" : "562cfb8cc5e76b6f84ff6027bb51d38c36382db73ce1eaf440fc037449809e3d",
- "mixHash" : "6959fe650d3412c2ca7b1dc1a6cac2f50caf8b4f349319c9647577203cc22b46",
- "nonce" : "da5cdbe124a57ec1",
+ "hash" : "1a25cb07a52901454f2792d6e09f1669141bb9a05f3691eabc9bcaaed97bbf35",
+ "mixHash" : "80f3b70ced14d0e9ddf2264a94e847df8fbb6ad42574b75bb37c08f89f9913c5",
+ "nonce" : "c0e11419b693f4c0",
"number" : "0x02",
- "parentHash" : "cf323a783b3fe34c132d7f24677361a3607e4e2fc250b1e7219657f0ea8ac3d3",
+ "parentHash" : "4cda6d5ea90d0e1522f9652ae0676384fcd7b1dd943dc2998722d9d42ac43e06",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"stateRoot" : "2c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70",
- "timestamp" : "0x55550193",
+ "timestamp" : "0x557fea3a",
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
}
@@ -717,9 +717,9 @@
"extraData" : "0x42",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x00",
- "hash" : "3ab50f686522706a1b2891189bcc68a1f0c1d6d7a39534c875bd6217fe6111f8",
- "mixHash" : "297b6abffe46ada1e1dc8a6229851857b1a1865c1d2ca2c6d5cb26aa2aa545c0",
- "nonce" : "e3dbb40d35f00ab0",
+ "hash" : "d1b2eaca11a6f6e85b9d773217aa822ba4bac8940851a808d766d38567c24b20",
+ "mixHash" : "4f85b187392fa2c50235cbb4ac21969ef94ec0eced913ff28df8b27faa5d665c",
+ "nonce" : "ee1091b109d8b8c9",
"number" : "0x00",
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
@@ -728,8 +728,8 @@
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a080832fefd8808454c98c8142a0297b6abffe46ada1e1dc8a6229851857b1a1865c1d2ca2c6d5cb26aa2aa545c088e3dbb40d35f00ab0c0c0",
- "lastblockhash" : "7785a240ca1a6b956214518e2ed68e194ac0228e84adb8ed6e888082e49acd1e",
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a080832fefd8808454c98c8142a04f85b187392fa2c50235cbb4ac21969ef94ec0eced913ff28df8b27faa5d665c88ee1091b109d8b8c9c0c0",
+ "lastblockhash" : "190e7baace3947b1c5786e4ce143451b4e339f77085ea4fe9a45e7f3c4cfa7b1",
"postState" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "0x1e",
@@ -780,28 +780,28 @@
"extraData" : "0x",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x5208",
- "hash" : "7fc58c7227d9ad4cd3f8de017a93e3a9018a8e71cb251945b54466c19a15d868",
- "mixHash" : "5dd7203323bc8e695ce959699aea0770ccbd839befa2aa46415ee3499078b3bb",
- "nonce" : "3b693c4a65f982a4",
+ "hash" : "631e8d1ac1f21f008fa48decf940b853527a18a6a3ba3c01c982312e9218695f",
+ "mixHash" : "14fa07dd095f21dfa27969ca6f4e9f6402863d5b5f11e8c3d2079cf36317981b",
+ "nonce" : "e39ba598870ebad5",
"number" : "0x01",
- "parentHash" : "14d040a99b6cb025d543c6c89f1e61e80538fc6e34499096516af9fd9fc94723",
+ "parentHash" : "b98a1b2d7b53794f4a4c2f400c7e9812236bbe3c56db8719b110285394aadfc2",
"receiptTrie" : "e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313",
"stateRoot" : "2c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70",
- "timestamp" : "0x55550199",
- "transactionsTrie" : "1c6b6c321cfaeed08b2fb4e7dbe7d6bc622586e47b3d877996809921d0ed81d1",
+ "timestamp" : "0x557fea3e",
+ "transactionsTrie" : "10a1bd33be5e93c1120bc3bb8e6b278737d0c1543ed07ee3acce3d64f965bd8d",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "rlp" : "0xf90261f901f9a014d040a99b6cb025d543c6c89f1e61e80538fc6e34499096516af9fd9fc94723a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a01c6b6c321cfaeed08b2fb4e7dbe7d6bc622586e47b3d877996809921d0ed81d1a0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303863001832fefd8825208845555019980a05dd7203323bc8e695ce959699aea0770ccbd839befa2aa46415ee3499078b3bb883b693c4a65f982a4f862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba091bb9f31e7ddb36cd6f7772cf909a9c84229f482d3d851204c357b3fef6a07f9a0337bcf61cc0aab74498bdcfece1d345c85458f7b6a616fa0dff33fce8a704240c0",
+ "rlp" : "0xf90261f901f9a0b98a1b2d7b53794f4a4c2f400c7e9812236bbe3c56db8719b110285394aadfc2a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a010a1bd33be5e93c1120bc3bb8e6b278737d0c1543ed07ee3acce3d64f965bd8da0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303863001832fefd882520884557fea3e80a014fa07dd095f21dfa27969ca6f4e9f6402863d5b5f11e8c3d2079cf36317981b88e39ba598870ebad5f862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca0cccab1681ef0b8a8f654ac319b2a41316a0fe10120b61e2c097257bfb1181e71a04831b0f41d75f08549468d213d4ba7f02bb30f64ef88caeacbbe9af4e6483edbc0",
"transactions" : [
{
"data" : "0x",
"gasLimit" : "0x04cb2f",
"gasPrice" : "0x01",
"nonce" : "0x00",
- "r" : "0x91bb9f31e7ddb36cd6f7772cf909a9c84229f482d3d851204c357b3fef6a07f9",
- "s" : "0x337bcf61cc0aab74498bdcfece1d345c85458f7b6a616fa0dff33fce8a704240",
+ "r" : "0xcccab1681ef0b8a8f654ac319b2a41316a0fe10120b61e2c097257bfb1181e71",
+ "s" : "0x4831b0f41d75f08549468d213d4ba7f02bb30f64ef88caeacbbe9af4e6483edb",
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
- "v" : "0x1b",
+ "v" : "0x1c",
"value" : "0x0a"
}
],
@@ -816,26 +816,26 @@
"extraData" : "0x",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x5208",
- "hash" : "13172534ea6a9fa1e9416df01f7583a365857fe1804c5684ae2fb751d13c90a8",
- "mixHash" : "d9813fa1c2d51e1ecd3c61411c162f2dee9cd90834e36e6e27ab5e86b46e2869",
- "nonce" : "9663fc44a97f1328",
+ "hash" : "279dd0a522f74e930182901c9c448c67896b009d5478cb09182f0d7923102cda",
+ "mixHash" : "754b8c6c206ad44f61646baf1c823719da1ccfdb14fe388e88cbbb821014c27f",
+ "nonce" : "5e6c5517dabd4d91",
"number" : "0x02",
- "parentHash" : "7fc58c7227d9ad4cd3f8de017a93e3a9018a8e71cb251945b54466c19a15d868",
+ "parentHash" : "631e8d1ac1f21f008fa48decf940b853527a18a6a3ba3c01c982312e9218695f",
"receiptTrie" : "5a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27",
"stateRoot" : "a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fe",
- "timestamp" : "0x5555019d",
- "transactionsTrie" : "dbc11390747af31405ffafb3631fe9ee43b6d4a5103e50392f7a640c858adcf9",
+ "timestamp" : "0x557fea41",
+ "transactionsTrie" : "98a3fa5f71b2230d4d02c0a97dd399efafcb90a901877e7ce31f7e80b3872b37",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "rlp" : "0xf90261f901f9a07fc58c7227d9ad4cd3f8de017a93e3a9018a8e71cb251945b54466c19a15d868a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fea0dbc11390747af31405ffafb3631fe9ee43b6d4a5103e50392f7a640c858adcf9a05a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a002832fefd8825208845555019d80a0d9813fa1c2d51e1ecd3c61411c162f2dee9cd90834e36e6e27ab5e86b46e2869889663fc44a97f1328f862f86001018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba08ca44fd9f339ddb0c596ec0f23d74793029357e1dbb832cf9ab151fbc17e10faa044850eb49de6dcd15c35c9c2fe7799d30d6492d4deb45c1f824ac5232fbf826ac0",
+ "rlp" : "0xf90261f901f9a0631e8d1ac1f21f008fa48decf940b853527a18a6a3ba3c01c982312e9218695fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fea098a3fa5f71b2230d4d02c0a97dd399efafcb90a901877e7ce31f7e80b3872b37a05a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a002832fefd882520884557fea4180a0754b8c6c206ad44f61646baf1c823719da1ccfdb14fe388e88cbbb821014c27f885e6c5517dabd4d91f862f86001018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba0c3417cba9e622b8f7fdb5c311223404fac7fb996d5a6253c8cf07a08ec96f9e1a02ffe46053f80edaf2d1233f382bb1cfc9b5234a525803886cb74f879d438d20ec0",
"transactions" : [
{
"data" : "0x",
"gasLimit" : "0x04cb2f",
"gasPrice" : "0x01",
"nonce" : "0x01",
- "r" : "0x8ca44fd9f339ddb0c596ec0f23d74793029357e1dbb832cf9ab151fbc17e10fa",
- "s" : "0x44850eb49de6dcd15c35c9c2fe7799d30d6492d4deb45c1f824ac5232fbf826a",
+ "r" : "0xc3417cba9e622b8f7fdb5c311223404fac7fb996d5a6253c8cf07a08ec96f9e1",
+ "s" : "0x2ffe46053f80edaf2d1233f382bb1cfc9b5234a525803886cb74f879d438d20e",
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
"v" : "0x1b",
"value" : "0x0a"
@@ -852,26 +852,26 @@
"extraData" : "0x",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x5208",
- "hash" : "446832a213aa1af12baef490b5a3344c400d6a2e196b7e4dbe8f7026c0e91e86",
- "mixHash" : "6446c9eaf571d019f34704c2b48872dfcabe159022f004206ef86c506957f0f6",
- "nonce" : "b848eb983073c49a",
+ "hash" : "05cb7f185b7b2250b5c2eb39077bf8f6b8df752ecd14e728177950ae5852221f",
+ "mixHash" : "cf5d2d875578aedf2dedd2fbebd406d0c587d3a05cc1ab51f75bd83602335892",
+ "nonce" : "9756214ef565cb82",
"number" : "0x03",
- "parentHash" : "13172534ea6a9fa1e9416df01f7583a365857fe1804c5684ae2fb751d13c90a8",
+ "parentHash" : "279dd0a522f74e930182901c9c448c67896b009d5478cb09182f0d7923102cda",
"receiptTrie" : "2b67f7a4806df8b7971f6e30027ac45ec69215a689a1d701da979d78d57c6f78",
"stateRoot" : "a7150e152ba824446120f65ec8788e2baa7afbf0bb878bbaafe0631fc60860b2",
- "timestamp" : "0x5555019e",
- "transactionsTrie" : "d7402cf1671e587f7ddf5aea9b4558283e6fb8d5c8fa28e94972cb1c5a3a52a5",
- "uncleHash" : "7730f689fb363374263e82aea0de5470fcda07098ccdfb58e0699f3649bb8d53"
+ "timestamp" : "0x557fea43",
+ "transactionsTrie" : "bc94a38729725d880d54d2159f7630b3ae74484d8c771afc9814d0421cb7642f",
+ "uncleHash" : "157404f6ae5760e3d73c801b92ba1bf9a9e5f8de2be16bb954e342c24260d538"
},
- "rlp" : "0xf9045df901f9a013172534ea6a9fa1e9416df01f7583a365857fe1804c5684ae2fb751d13c90a8a07730f689fb363374263e82aea0de5470fcda07098ccdfb58e0699f3649bb8d53948888f1f195afa192cfee860698584c030f4c9db1a0a7150e152ba824446120f65ec8788e2baa7afbf0bb878bbaafe0631fc60860b2a0d7402cf1671e587f7ddf5aea9b4558283e6fb8d5c8fa28e94972cb1c5a3a52a5a02b67f7a4806df8b7971f6e30027ac45ec69215a689a1d701da979d78d57c6f78b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303871003832fefd8825208845555019e80a06446c9eaf571d019f34704c2b48872dfcabe159022f004206ef86c506957f0f688b848eb983073c49af862f86002018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba033ea5525314bc6547359d1c83ea4a0203c419d6697831450835d6b520b223ecba025dc3e78ae4093fa580ff61558c153dab93ba0cc2d4c75e32aee313c14481a37f901faf901f7a07fc58c7227d9ad4cd3f8de017a93e3a9018a8e71cb251945b54466c19a15d868a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794acde5374fce5edbc8e2a8697c15331677e6ebf0ba02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a002832fefd780845555019e80a0491f0b640ed25995c5e44dcc04de01bda2d4781360172276760fc9daf099d886881a3670228de5f62d",
+ "rlp" : "0xf9045df901f9a0279dd0a522f74e930182901c9c448c67896b009d5478cb09182f0d7923102cdaa0157404f6ae5760e3d73c801b92ba1bf9a9e5f8de2be16bb954e342c24260d538948888f1f195afa192cfee860698584c030f4c9db1a0a7150e152ba824446120f65ec8788e2baa7afbf0bb878bbaafe0631fc60860b2a0bc94a38729725d880d54d2159f7630b3ae74484d8c771afc9814d0421cb7642fa02b67f7a4806df8b7971f6e30027ac45ec69215a689a1d701da979d78d57c6f78b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303871003832fefd882520884557fea4380a0cf5d2d875578aedf2dedd2fbebd406d0c587d3a05cc1ab51f75bd83602335892889756214ef565cb82f862f86002018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba0085c3d1d22a610e0466b8e591fcf6d5ed2f67c9ab7a838d3843d86acbcbcb725a060065afe628ba4878b1796c74fdda234cd32ccfa2b3105715dcdd7435f612da2f901faf901f7a0631e8d1ac1f21f008fa48decf940b853527a18a6a3ba3c01c982312e9218695fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794acde5374fce5edbc8e2a8697c15331677e6ebf0ba02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a002832fefd78084557fea4380a0baab05997ba90b30a4f5fa573fa0facf3a925e252ce9095557984b9099f5a675886ac9226b21ed4ff6",
"transactions" : [
{
"data" : "0x",
"gasLimit" : "0x04cb2f",
"gasPrice" : "0x01",
"nonce" : "0x02",
- "r" : "0x33ea5525314bc6547359d1c83ea4a0203c419d6697831450835d6b520b223ecb",
- "s" : "0x25dc3e78ae4093fa580ff61558c153dab93ba0cc2d4c75e32aee313c14481a37",
+ "r" : "0x085c3d1d22a610e0466b8e591fcf6d5ed2f67c9ab7a838d3843d86acbcbcb725",
+ "s" : "0x60065afe628ba4878b1796c74fdda234cd32ccfa2b3105715dcdd7435f612da2",
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
"v" : "0x1b",
"value" : "0x0a"
@@ -885,14 +885,14 @@
"extraData" : "0x",
"gasLimit" : "0x2fefd7",
"gasUsed" : "0x00",
- "hash" : "3cd2fe746e16910b70a3174f3b594c348d41b8a567029ceaa09e5d3fa7eb715f",
- "mixHash" : "491f0b640ed25995c5e44dcc04de01bda2d4781360172276760fc9daf099d886",
- "nonce" : "1a3670228de5f62d",
+ "hash" : "40228b954d98b01aa588c6291adcc46ee37171050a99e1faede3c1dcfd794c09",
+ "mixHash" : "baab05997ba90b30a4f5fa573fa0facf3a925e252ce9095557984b9099f5a675",
+ "nonce" : "6ac9226b21ed4ff6",
"number" : "0x02",
- "parentHash" : "7fc58c7227d9ad4cd3f8de017a93e3a9018a8e71cb251945b54466c19a15d868",
+ "parentHash" : "631e8d1ac1f21f008fa48decf940b853527a18a6a3ba3c01c982312e9218695f",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"stateRoot" : "2c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70",
- "timestamp" : "0x5555019e",
+ "timestamp" : "0x557fea43",
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
}
@@ -906,9 +906,9 @@
"extraData" : "0x42",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x00",
- "hash" : "14d040a99b6cb025d543c6c89f1e61e80538fc6e34499096516af9fd9fc94723",
- "mixHash" : "cc10690e934042e418715ba196972be8a245c0a55c9207da7036fc14e26d91c7",
- "nonce" : "17870d004d687fdf",
+ "hash" : "b98a1b2d7b53794f4a4c2f400c7e9812236bbe3c56db8719b110285394aadfc2",
+ "mixHash" : "b11086f57c0dbf2c3a9402d1053f988c38de8afff550eef811cc7296cd065e71",
+ "nonce" : "96373f1fc2c9cbe7",
"number" : "0x00",
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
@@ -917,8 +917,8 @@
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a080832fefd8808454c98c8142a0cc10690e934042e418715ba196972be8a245c0a55c9207da7036fc14e26d91c78817870d004d687fdfc0c0",
- "lastblockhash" : "446832a213aa1af12baef490b5a3344c400d6a2e196b7e4dbe8f7026c0e91e86",
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a080832fefd8808454c98c8142a0b11086f57c0dbf2c3a9402d1053f988c38de8afff550eef811cc7296cd065e718896373f1fc2c9cbe7c0c0",
+ "lastblockhash" : "05cb7f185b7b2250b5c2eb39077bf8f6b8df752ecd14e728177950ae5852221f",
"postState" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "0x1e",
@@ -959,7 +959,7 @@
}
}
},
- "timestampTooHigh" : {
+ "nonceWrong" : {
"blocks" : [
{
"blockHeader" : {
@@ -969,26 +969,26 @@
"extraData" : "0x",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x5208",
- "hash" : "4bf604ea8f6773747a7ba30df257064b2d7a37a68305ed6c5d28fab0bf5ca9af",
- "mixHash" : "71b1f8e0c21a46865aa65e3101957b2b41536c4eb74c5da8ab2864c8fa558067",
- "nonce" : "76a898fc2016c17a",
+ "hash" : "212fa2f874ad9bce6a1d45eb8c923a639b6fe20676f7b274622650b6b98f5b2f",
+ "mixHash" : "df1fcc2f231cedebdf0b34dd233385fa5cacbabd0d8577c500729de9d053fd96",
+ "nonce" : "d3145311199b6d87",
"number" : "0x01",
- "parentHash" : "8271939ad95d33fea21504b3876c7fb06d60e8a50d60b6d71000f3ebfaf037f1",
+ "parentHash" : "75182b6534c8c6609a2fac84e56915bc0f5157751c78282c302b526113f06fb6",
"receiptTrie" : "e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313",
"stateRoot" : "2c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70",
- "timestamp" : "0x555501a2",
- "transactionsTrie" : "f5bb5a75e477b36b82eaa7b7a8bcc4e19c93c8010535ca8b87c0dab671d6e6bd",
+ "timestamp" : "0x557fea48",
+ "transactionsTrie" : "19720ee77660138e67c53de4cbcbc13b8e63c8061d55b8de1d5168f6765ead05",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "rlp" : "0xf90261f901f9a08271939ad95d33fea21504b3876c7fb06d60e8a50d60b6d71000f3ebfaf037f1a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a0f5bb5a75e477b36b82eaa7b7a8bcc4e19c93c8010535ca8b87c0dab671d6e6bda0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303863001832fefd882520884555501a280a071b1f8e0c21a46865aa65e3101957b2b41536c4eb74c5da8ab2864c8fa5580678876a898fc2016c17af862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba07edbbbacdad2c583f4f961eb57b4a7cc19b64e17cc00250413bda4c564e60a24a0def83a0853368d836592f7382063eae6a1545ff1568408b28681804fc8de5797c0",
+ "rlp" : "0xf90261f901f9a075182b6534c8c6609a2fac84e56915bc0f5157751c78282c302b526113f06fb6a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a019720ee77660138e67c53de4cbcbc13b8e63c8061d55b8de1d5168f6765ead05a0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303863001832fefd882520884557fea4880a0df1fcc2f231cedebdf0b34dd233385fa5cacbabd0d8577c500729de9d053fd9688d3145311199b6d87f862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba0cbadbeff9ab100bb999fb7db1ff46d59edddacef74923433c7d1fe4921e0b97ba0071756ee82880d1939cde6c48b74a55f93006c4834b1835e72bef3e399878e6bc0",
"transactions" : [
{
"data" : "0x",
"gasLimit" : "0x04cb2f",
"gasPrice" : "0x01",
"nonce" : "0x00",
- "r" : "0x7edbbbacdad2c583f4f961eb57b4a7cc19b64e17cc00250413bda4c564e60a24",
- "s" : "0xdef83a0853368d836592f7382063eae6a1545ff1568408b28681804fc8de5797",
+ "r" : "0xcbadbeff9ab100bb999fb7db1ff46d59edddacef74923433c7d1fe4921e0b97b",
+ "s" : "0x071756ee82880d1939cde6c48b74a55f93006c4834b1835e72bef3e399878e6b",
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
"v" : "0x1b",
"value" : "0x0a"
@@ -1005,26 +1005,26 @@
"extraData" : "0x",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x5208",
- "hash" : "c3ea81d7ed58c7ed44bea7ab32ab1f0b7bbbcf38dfde0a2cb900d17dba8642e0",
- "mixHash" : "bbeaacfde4374a22e9bc55d46ebb817487d66de16823e9d85f2cdd9c1057ff7e",
- "nonce" : "7c162b3ff32a6516",
+ "hash" : "6cd7b78a9d70e9ab6e5e3c7cff6c5486aa476940988988998a253c6789a0af35",
+ "mixHash" : "14e6c9fdeba9446350189a9286ac29cdd0aeb63a5f136f07de5182567a07914f",
+ "nonce" : "bcc3dcfc2dfa12d8",
"number" : "0x02",
- "parentHash" : "4bf604ea8f6773747a7ba30df257064b2d7a37a68305ed6c5d28fab0bf5ca9af",
+ "parentHash" : "212fa2f874ad9bce6a1d45eb8c923a639b6fe20676f7b274622650b6b98f5b2f",
"receiptTrie" : "5a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27",
"stateRoot" : "a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fe",
- "timestamp" : "0x555501a6",
- "transactionsTrie" : "cd1c608d996954c091273c979158b5a596b650d4ac44f7f02d82411a5cd67a04",
+ "timestamp" : "0x557fea4b",
+ "transactionsTrie" : "831c039a91633d70b0ba29dc1243db0566c90e73862a87d9b073ebe80f2f95b8",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "rlp" : "0xf90261f901f9a04bf604ea8f6773747a7ba30df257064b2d7a37a68305ed6c5d28fab0bf5ca9afa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fea0cd1c608d996954c091273c979158b5a596b650d4ac44f7f02d82411a5cd67a04a05a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a002832fefd882520884555501a680a0bbeaacfde4374a22e9bc55d46ebb817487d66de16823e9d85f2cdd9c1057ff7e887c162b3ff32a6516f862f86001018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca025d6bf17253ce9ba787d07d7827ff9740f0fbfa6c0d2da533c89f1bd91c2e032a0f55cca6fbbc9ae892bd1ed8b0394aedfcd18e81443d8de4077ad66a4d42f3e34c0",
+ "rlp" : "0xf90261f901f9a0212fa2f874ad9bce6a1d45eb8c923a639b6fe20676f7b274622650b6b98f5b2fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fea0831c039a91633d70b0ba29dc1243db0566c90e73862a87d9b073ebe80f2f95b8a05a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a002832fefd882520884557fea4b80a014e6c9fdeba9446350189a9286ac29cdd0aeb63a5f136f07de5182567a07914f88bcc3dcfc2dfa12d8f862f86001018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca040d89a551344f0d19b0f618e614455b08582cf71068b411e408e9d085cb83023a005dc87a52badc568d2d042d497a555387bbbd81ef81930c39baf2cf8ee6d5fafc0",
"transactions" : [
{
"data" : "0x",
"gasLimit" : "0x04cb2f",
"gasPrice" : "0x01",
"nonce" : "0x01",
- "r" : "0x25d6bf17253ce9ba787d07d7827ff9740f0fbfa6c0d2da533c89f1bd91c2e032",
- "s" : "0xf55cca6fbbc9ae892bd1ed8b0394aedfcd18e81443d8de4077ad66a4d42f3e34",
+ "r" : "0x40d89a551344f0d19b0f618e614455b08582cf71068b411e408e9d085cb83023",
+ "s" : "0x05dc87a52badc568d2d042d497a555387bbbd81ef81930c39baf2cf8ee6d5faf",
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
"v" : "0x1c",
"value" : "0x0a"
@@ -1034,7 +1034,138 @@
]
},
{
- "rlp" : "0xf9045df901f9a0c3ea81d7ed58c7ed44bea7ab32ab1f0b7bbbcf38dfde0a2cb900d17dba8642e0a0486fe1b671ec67a08b66ff57193f3b1b9193eedd27f8ae666aafb617389e9113948888f1f195afa192cfee860698584c030f4c9db1a0d40c133a2d06637484d95e89dd676d06f93ea4dcced745aa67613eeb33948f39a0655c8522d5fbb4019a875c6984e3e8a6d7a2c882cc3702f762b6856d1e5e71b1a02b67f7a4806df8b7971f6e30027ac45ec69215a689a1d701da979d78d57c6f78b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303871003832fefd882520884555501aa80a0e97aa998a60d838207c75678d5888c84036dbc5bb8b11089984e90557a3718cf880808efde58f25da0f862f86002018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca0c9fd6abd955a11e418c248f1f15aeb2b82ba8ecdc87e7a074f16da7d9bc4b486a07204dbc8de94586368253abfa097140f1be2831e913a2705ff09e7f16297a14bf901faf901f7a04bf604ea8f6773747a7ba30df257064b2d7a37a68305ed6c5d28fab0bf5ca9afa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794acde5374fce5edbc8e2a8697c15331677e6ebf0ba02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830385c002832fefd880845b18d39e80a04ef1db3283064515b120f89e531ec1b61836d768321c1e93116da3c3269f685388eb07dad141bf0902"
+ "rlp" : "0xf9045df901f9a06cd7b78a9d70e9ab6e5e3c7cff6c5486aa476940988988998a253c6789a0af35a058557918866c827d5c8585a1aad7cdcc649b1f649a216886ae3f41ce73f2b064948888f1f195afa192cfee860698584c030f4c9db1a0a7150e152ba824446120f65ec8788e2baa7afbf0bb878bbaafe0631fc60860b2a0d6eec79e306f143482b3b0f70abee962b57671b126bad9ffbf398b48d8857a4ca02b67f7a4806df8b7971f6e30027ac45ec69215a689a1d701da979d78d57c6f78b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303871003832fefd882520884557fea4c80a0df24c29a76f5dccd7d6c3a1a33bcd966761243ad5dc08fd66049dac408a4b82d8886d1d260e4a98f96f862f86002018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba02d8e7dcb7db173f17adff3561859fc3a71bc4d08e14996b62bd472e0e114bbe6a020572f2bc55aa7ace094e161bf7633bb316ee2ccee558213e00956698d11d313f901faf901f7a0212fa2f874ad9bce6a1d45eb8c923a639b6fe20676f7b274622650b6b98f5b2fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794acde5374fce5edbc8e2a8697c15331677e6ebf0ba02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a002832fefd88084557fea4c80a044c53f8e2de38550928942cfd90aa5472ab49ec82bba95c3477ecc0e7900f9e688bad524c1790fa83b"
+ }
+ ],
+ "genesisBlockHeader" : {
+ "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1",
+ "difficulty" : "0x0386a0",
+ "extraData" : "0x42",
+ "gasLimit" : "0x2fefd8",
+ "gasUsed" : "0x00",
+ "hash" : "75182b6534c8c6609a2fac84e56915bc0f5157751c78282c302b526113f06fb6",
+ "mixHash" : "006cccd756e7b81c5428749c724d691307ab76704bc807144ea5b811e6b25cf5",
+ "nonce" : "0bb9cfb8f3adfcbb",
+ "number" : "0x00",
+ "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
+ "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "stateRoot" : "7dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1",
+ "timestamp" : "0x54c98c81",
+ "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
+ },
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a080832fefd8808454c98c8142a0006cccd756e7b81c5428749c724d691307ab76704bc807144ea5b811e6b25cf5880bb9cfb8f3adfcbbc0c0",
+ "lastblockhash" : "6cd7b78a9d70e9ab6e5e3c7cff6c5486aa476940988988998a253c6789a0af35",
+ "postState" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "0x14",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "8888f1f195afa192cfee860698584c030f4c9db1" : {
+ "balance" : "0x29a2241af62ca410",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x09184e71fbdc",
+ "code" : "0x",
+ "nonce" : "0x02",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x09184e72a000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "timestampTooHigh" : {
+ "blocks" : [
+ {
+ "blockHeader" : {
+ "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1",
+ "difficulty" : "0x038630",
+ "extraData" : "0x",
+ "gasLimit" : "0x2fefd8",
+ "gasUsed" : "0x5208",
+ "hash" : "372aa804dc737dfd950d63046d91c3c078aee0d833cfbfd2797244ad58146a54",
+ "mixHash" : "ee47da70ceb1f70c8aa05de0a98694e5ebc161c7cc6ac162e54c388b65093976",
+ "nonce" : "7fe5a73cf8e1f854",
+ "number" : "0x01",
+ "parentHash" : "f20d712bce4fb7a223b801adb1548142cc14a583f7a413e1933e2f62f71c5739",
+ "receiptTrie" : "e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313",
+ "stateRoot" : "2c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70",
+ "timestamp" : "0x557fea52",
+ "transactionsTrie" : "9e1194678d4be7f82e88c271d96308bc2810a0d9f15449ced9e6da0062fcc160",
+ "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
+ },
+ "rlp" : "0xf90261f901f9a0f20d712bce4fb7a223b801adb1548142cc14a583f7a413e1933e2f62f71c5739a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a09e1194678d4be7f82e88c271d96308bc2810a0d9f15449ced9e6da0062fcc160a0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303863001832fefd882520884557fea5280a0ee47da70ceb1f70c8aa05de0a98694e5ebc161c7cc6ac162e54c388b65093976887fe5a73cf8e1f854f862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba0550f070ef1e03e2368118c15bc8deb64e0a2e3a880e063c7aeaa6406ec9b81bca08fa22fe68c02e7f09b45106af5cb361fdb028bc34bfea28f335e09632dffdf27c0",
+ "transactions" : [
+ {
+ "data" : "0x",
+ "gasLimit" : "0x04cb2f",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "r" : "0x550f070ef1e03e2368118c15bc8deb64e0a2e3a880e063c7aeaa6406ec9b81bc",
+ "s" : "0x8fa22fe68c02e7f09b45106af5cb361fdb028bc34bfea28f335e09632dffdf27",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "v" : "0x1b",
+ "value" : "0x0a"
+ }
+ ],
+ "uncleHeaders" : [
+ ]
+ },
+ {
+ "blockHeader" : {
+ "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1",
+ "difficulty" : "0x0386a0",
+ "extraData" : "0x",
+ "gasLimit" : "0x2fefd8",
+ "gasUsed" : "0x5208",
+ "hash" : "65df3af12c9f8d77dcfb6032f3b32f4cefeef497ad477c2c7fd2549cf2b128c1",
+ "mixHash" : "16e51d971cc0c5246970816f7113b05fa85a93d7713d95f0d3ab1b322a613720",
+ "nonce" : "063df4ff49506cbc",
+ "number" : "0x02",
+ "parentHash" : "372aa804dc737dfd950d63046d91c3c078aee0d833cfbfd2797244ad58146a54",
+ "receiptTrie" : "5a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27",
+ "stateRoot" : "a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fe",
+ "timestamp" : "0x557fea53",
+ "transactionsTrie" : "ad3a813000c55c0b33148c797b8bdce8ba5fb1aac80a2c66e2f250ca1e51461e",
+ "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
+ },
+ "rlp" : "0xf90261f901f9a0372aa804dc737dfd950d63046d91c3c078aee0d833cfbfd2797244ad58146a54a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fea0ad3a813000c55c0b33148c797b8bdce8ba5fb1aac80a2c66e2f250ca1e51461ea05a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a002832fefd882520884557fea5380a016e51d971cc0c5246970816f7113b05fa85a93d7713d95f0d3ab1b322a61372088063df4ff49506cbcf862f86001018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba02564ca2019d20fc2c99501f3c6bf94dd78ebe96d215c8e1d01ddbf34a4d8cedfa0df6a67c928d7c703eb2b83068bb1551d1665b0673f234aa434ef9656a068b2e8c0",
+ "transactions" : [
+ {
+ "data" : "0x",
+ "gasLimit" : "0x04cb2f",
+ "gasPrice" : "0x01",
+ "nonce" : "0x01",
+ "r" : "0x2564ca2019d20fc2c99501f3c6bf94dd78ebe96d215c8e1d01ddbf34a4d8cedf",
+ "s" : "0xdf6a67c928d7c703eb2b83068bb1551d1665b0673f234aa434ef9656a068b2e8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "v" : "0x1b",
+ "value" : "0x0a"
+ }
+ ],
+ "uncleHeaders" : [
+ ]
+ },
+ {
+ "rlp" : "0xf9045df901f9a065df3af12c9f8d77dcfb6032f3b32f4cefeef497ad477c2c7fd2549cf2b128c1a007359f368ed2ee408fd25814c4b618d9daf706e7fe8066d38578c620b31ce558948888f1f195afa192cfee860698584c030f4c9db1a0d40c133a2d06637484d95e89dd676d06f93ea4dcced745aa67613eeb33948f39a044b9f02f33677c410fcc4f392a3f3667d12d1de92e4700cb59d887e08b74da8ba02b67f7a4806df8b7971f6e30027ac45ec69215a689a1d701da979d78d57c6f78b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303871003832fefd882520884557fea5580a00a4079ff6fd68e3b3a5e2d28665691f3bb1f5e286420267f05eb64551b69d733881fe0dd388a30c9bdf862f86002018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba09462f1139967c0cfebd8d74ce4e04211fcf9c2080ea4ec8b192074ed2b38290ca0d60d6748c8a284c7048d5f71658b40f62d8cec762661f5363fcb4ad56a775501f901faf901f7a0372aa804dc737dfd950d63046d91c3c078aee0d833cfbfd2797244ad58146a54a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794acde5374fce5edbc8e2a8697c15331677e6ebf0ba02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830385c002832fefd880845b18d39e80a08a0fbf35a5fc532b479ae80eda70bec69c615f2463b3e6c2ee0cdeb0f1c567d488a56e5d9bf1c830a2"
}
],
"genesisBlockHeader" : {
@@ -1044,9 +1175,9 @@
"extraData" : "0x42",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x00",
- "hash" : "8271939ad95d33fea21504b3876c7fb06d60e8a50d60b6d71000f3ebfaf037f1",
- "mixHash" : "102804dc290abd07a4fe1fa4934e61edbc5e02c9a8c2a9de836519b5cf0cfa85",
- "nonce" : "532135000aafb9a4",
+ "hash" : "f20d712bce4fb7a223b801adb1548142cc14a583f7a413e1933e2f62f71c5739",
+ "mixHash" : "55e9d50d181eaaac9d1a49af692aa41636c7eb17fc5cc61b68567d0194ae4e74",
+ "nonce" : "a34f6030fd86054a",
"number" : "0x00",
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
@@ -1055,8 +1186,8 @@
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a080832fefd8808454c98c8142a0102804dc290abd07a4fe1fa4934e61edbc5e02c9a8c2a9de836519b5cf0cfa8588532135000aafb9a4c0c0",
- "lastblockhash" : "c3ea81d7ed58c7ed44bea7ab32ab1f0b7bbbcf38dfde0a2cb900d17dba8642e0",
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a080832fefd8808454c98c8142a055e9d50d181eaaac9d1a49af692aa41636c7eb17fc5cc61b68567d0194ae4e7488a34f6030fd86054ac0c0",
+ "lastblockhash" : "65df3af12c9f8d77dcfb6032f3b32f4cefeef497ad477c2c7fd2549cf2b128c1",
"postState" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "0x14",
@@ -1100,28 +1231,28 @@
"extraData" : "0x",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x5208",
- "hash" : "a28de9ec2cee57445a93d498091565bba1d0e2eea6b5a2c2ae435fced7b40269",
- "mixHash" : "2ac81886b15428cfb920d9aa8bc733344c99e082e7ade8df49f84ed8d1bbaf45",
- "nonce" : "689f850d0cf6d442",
+ "hash" : "5ed68bb67a4ef1c931e84e62f855b3cab02fc8b9023779b8149016d03e9bdacc",
+ "mixHash" : "3178ff7dbd7fb028ad21c65373d2391521e1642fdc3220024e46c002ab3ee604",
+ "nonce" : "151a514c5c57d93f",
"number" : "0x01",
- "parentHash" : "f77be32aac97a01fff3fdccc7cd65444333724155938dd3baa159b7a9cd67477",
+ "parentHash" : "6d0ae8cd327b41291551d7048eb918ca5dc394d28d25402c495faab44e73971e",
"receiptTrie" : "e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313",
"stateRoot" : "2c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70",
- "timestamp" : "0x555501b2",
- "transactionsTrie" : "25dea3bbd68ef636a982325a703fa22791b12e115ce911666fcf071ec0830334",
+ "timestamp" : "0x557fea5a",
+ "transactionsTrie" : "9ef061028b23d18b1a879b43bf46c709bc9fd170eaa35a153a0cafb076bbabe9",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "rlp" : "0xf90261f901f9a0f77be32aac97a01fff3fdccc7cd65444333724155938dd3baa159b7a9cd67477a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a025dea3bbd68ef636a982325a703fa22791b12e115ce911666fcf071ec0830334a0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303863001832fefd882520884555501b280a02ac81886b15428cfb920d9aa8bc733344c99e082e7ade8df49f84ed8d1bbaf4588689f850d0cf6d442f862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca08394687a7ae8d5f56ec40f18bcff00a2ec07a6de0ee48f9e666e7219c5e65103a0061c979d857689dca24b07c4663b8eed3a3391c03d69949b1a1d1f5c0dd94d11c0",
+ "rlp" : "0xf90261f901f9a06d0ae8cd327b41291551d7048eb918ca5dc394d28d25402c495faab44e73971ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a09ef061028b23d18b1a879b43bf46c709bc9fd170eaa35a153a0cafb076bbabe9a0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303863001832fefd882520884557fea5a80a03178ff7dbd7fb028ad21c65373d2391521e1642fdc3220024e46c002ab3ee60488151a514c5c57d93ff862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba096c723cb3d61f269fc2e06d4bf63d142e7b82d082f645baae9d753fe08d501c9a09af0b24a490ad680ea82222d32cd516f69b232f7d2e265fbc4d60c43bad9ef83c0",
"transactions" : [
{
"data" : "0x",
"gasLimit" : "0x04cb2f",
"gasPrice" : "0x01",
"nonce" : "0x00",
- "r" : "0x8394687a7ae8d5f56ec40f18bcff00a2ec07a6de0ee48f9e666e7219c5e65103",
- "s" : "0x061c979d857689dca24b07c4663b8eed3a3391c03d69949b1a1d1f5c0dd94d11",
+ "r" : "0x96c723cb3d61f269fc2e06d4bf63d142e7b82d082f645baae9d753fe08d501c9",
+ "s" : "0x9af0b24a490ad680ea82222d32cd516f69b232f7d2e265fbc4d60c43bad9ef83",
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
- "v" : "0x1c",
+ "v" : "0x1b",
"value" : "0x0a"
}
],
@@ -1136,26 +1267,121 @@
"extraData" : "0x",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x5208",
- "hash" : "4300af02ac3d852277bc047654bc15e754e9d537cfc0558b2a832d2868a6ece5",
- "mixHash" : "60bde277e998331df9a427e8676c51efecf6ed19f1355838a38bf57ac6dee43b",
- "nonce" : "d69a59020e02e04d",
+ "hash" : "3f0c95de871aee5c19d760ce7d2b9c128a1c30a09339e942a47326b21f6acb2b",
+ "mixHash" : "5116c123a7361290685fef2a7e405227747edb791133b95ec1245d0bad71aadf",
+ "nonce" : "4a5f84c3405aff0e",
"number" : "0x02",
- "parentHash" : "a28de9ec2cee57445a93d498091565bba1d0e2eea6b5a2c2ae435fced7b40269",
+ "parentHash" : "5ed68bb67a4ef1c931e84e62f855b3cab02fc8b9023779b8149016d03e9bdacc",
"receiptTrie" : "5a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27",
"stateRoot" : "a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fe",
- "timestamp" : "0x555501b4",
- "transactionsTrie" : "07b152f2328b919fd42afdb2162fe34b95dfaced2546f8ebd05142279924d688",
+ "timestamp" : "0x557fea5d",
+ "transactionsTrie" : "bd4ff120afac4ed3d8ee3eaf3f594aab23055cea9b2593b0ae15219249cfcc40",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "rlp" : "0xf90261f901f9a0a28de9ec2cee57445a93d498091565bba1d0e2eea6b5a2c2ae435fced7b40269a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fea007b152f2328b919fd42afdb2162fe34b95dfaced2546f8ebd05142279924d688a05a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a002832fefd882520884555501b480a060bde277e998331df9a427e8676c51efecf6ed19f1355838a38bf57ac6dee43b88d69a59020e02e04df862f86001018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca085e0e179c762f6fbf8cb38898ecacb7067faa567d285cfc0d43abcc575e7c8fda0902b3f160af1f9f8b699cd10d75d916d90b59efc58a0fc650f36320ceadf01d0c0",
+ "rlp" : "0xf90261f901f9a05ed68bb67a4ef1c931e84e62f855b3cab02fc8b9023779b8149016d03e9bdacca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fea0bd4ff120afac4ed3d8ee3eaf3f594aab23055cea9b2593b0ae15219249cfcc40a05a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a002832fefd882520884557fea5d80a05116c123a7361290685fef2a7e405227747edb791133b95ec1245d0bad71aadf884a5f84c3405aff0ef862f86001018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba0a24b1797a2a2a816786f5bc5f3709a6474eea09cba5374d7c80a3ea4e79fe537a0563bf77bdc856af050c91dc2cc19a75f6092ffeb1340112d34770aa9d5ea39d2c0",
"transactions" : [
{
"data" : "0x",
"gasLimit" : "0x04cb2f",
"gasPrice" : "0x01",
"nonce" : "0x01",
- "r" : "0x85e0e179c762f6fbf8cb38898ecacb7067faa567d285cfc0d43abcc575e7c8fd",
- "s" : "0x902b3f160af1f9f8b699cd10d75d916d90b59efc58a0fc650f36320ceadf01d0",
+ "r" : "0xa24b1797a2a2a816786f5bc5f3709a6474eea09cba5374d7c80a3ea4e79fe537",
+ "s" : "0x563bf77bdc856af050c91dc2cc19a75f6092ffeb1340112d34770aa9d5ea39d2",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "v" : "0x1b",
+ "value" : "0x0a"
+ }
+ ],
+ "uncleHeaders" : [
+ ]
+ },
+ {
+ "rlp" : "0xf9045df901f9a03f0c95de871aee5c19d760ce7d2b9c128a1c30a09339e942a47326b21f6acb2ba034b415b05618e8c0827940dce6470c7f62fcb64a1d17e965f33709a81eef3621948888f1f195afa192cfee860698584c030f4c9db1a0d40c133a2d06637484d95e89dd676d06f93ea4dcced745aa67613eeb33948f39a0dabd2a041c64cb26a3ffc9856aeca497c543a01b4b7628ba8d465b36d0abd127a02b67f7a4806df8b7971f6e30027ac45ec69215a689a1d701da979d78d57c6f78b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303871003832fefd882520884557fea5e80a0ce284b413af3e7b6c4439192aad3e36e17ee3b175ead1f9f890a98928ebc7b7388c8683853adde69b6f862f86002018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca0c48096f3bf864a4116ea7953f6ad8a73e922ae9442d4552d1d1909ce0351bec6a0cd347472b7452a12ade89a203005d21d73895323fafbd83155adccfb7c2523b5f901faf901f7a05ed68bb67a4ef1c931e84e62f855b3cab02fc8b9023779b8149016d03e9bdacca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794acde5374fce5edbc8e2a8697c15331677e6ebf0ba02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a002832fefd880845522f29e80a0758827df1e60170448687d3f34bf7e0054529039cbf08359b83300da1976ea348805b8e5b210f3f11f"
+ }
+ ],
+ "genesisBlockHeader" : {
+ "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1",
+ "difficulty" : "0x0386a0",
+ "extraData" : "0x42",
+ "gasLimit" : "0x2fefd8",
+ "gasUsed" : "0x00",
+ "hash" : "6d0ae8cd327b41291551d7048eb918ca5dc394d28d25402c495faab44e73971e",
+ "mixHash" : "9b97fa62eab10576ecf678e6109f69e3c5826dfb2b355f82cba65b7317958144",
+ "nonce" : "a38a1b2440fa1705",
+ "number" : "0x00",
+ "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
+ "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "stateRoot" : "7dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1",
+ "timestamp" : "0x54c98c81",
+ "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
+ },
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a080832fefd8808454c98c8142a09b97fa62eab10576ecf678e6109f69e3c5826dfb2b355f82cba65b731795814488a38a1b2440fa1705c0c0",
+ "lastblockhash" : "3f0c95de871aee5c19d760ce7d2b9c128a1c30a09339e942a47326b21f6acb2b",
+ "postState" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "0x14",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "8888f1f195afa192cfee860698584c030f4c9db1" : {
+ "balance" : "0x29a2241af62ca410",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x09184e71fbdc",
+ "code" : "0x",
+ "nonce" : "0x02",
+ "storage" : {
+ }
+ }
+ },
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x09184e72a000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ }
+ },
+ "wrongMixHash" : {
+ "blocks" : [
+ {
+ "blockHeader" : {
+ "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1",
+ "difficulty" : "0x038630",
+ "extraData" : "0x",
+ "gasLimit" : "0x2fefd8",
+ "gasUsed" : "0x5208",
+ "hash" : "02d9e686db27a43745ec82cddecf0d49857698ca6f0c80b871a993cce9b76f4d",
+ "mixHash" : "8360e4f85dc1b051b6448c22d62345d090b753e3bfd46c107c8f95b8864e214e",
+ "nonce" : "c50c06f5f136a787",
+ "number" : "0x01",
+ "parentHash" : "71b90167bfc9d16c075fc6dfc40477f8eeb680a4d6eb25b4c7c0db8b6b2a8fab",
+ "receiptTrie" : "e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313",
+ "stateRoot" : "2c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70",
+ "timestamp" : "0x557fea62",
+ "transactionsTrie" : "4e0d7ae9283245265ece2999cde6d479e579194154103b35a648b6be0ad2be66",
+ "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
+ },
+ "rlp" : "0xf90261f901f9a071b90167bfc9d16c075fc6dfc40477f8eeb680a4d6eb25b4c7c0db8b6b2a8faba01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a04e0d7ae9283245265ece2999cde6d479e579194154103b35a648b6be0ad2be66a0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303863001832fefd882520884557fea6280a08360e4f85dc1b051b6448c22d62345d090b753e3bfd46c107c8f95b8864e214e88c50c06f5f136a787f862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca04f4960f2eb3bec7396b4b0db840383f62a22c6d2dad175688a23972ff2a9c9eda0c6dbcf7dc70547e2942875d0236c7a1bace28306e3e846deecdce97b5839aca0c0",
+ "transactions" : [
+ {
+ "data" : "0x",
+ "gasLimit" : "0x04cb2f",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "r" : "0x4f4960f2eb3bec7396b4b0db840383f62a22c6d2dad175688a23972ff2a9c9ed",
+ "s" : "0xc6dbcf7dc70547e2942875d0236c7a1bace28306e3e846deecdce97b5839aca0",
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
"v" : "0x1c",
"value" : "0x0a"
@@ -1165,7 +1391,43 @@
]
},
{
- "rlp" : "0xf9045df901f9a04300af02ac3d852277bc047654bc15e754e9d537cfc0558b2a832d2868a6ece5a080eb05ca81d53d0a328b94c24cc0b463ade527abbf4444837e8d6abc3e403f71948888f1f195afa192cfee860698584c030f4c9db1a0d40c133a2d06637484d95e89dd676d06f93ea4dcced745aa67613eeb33948f39a0935e29e234760ca6f3510bc01127fe0102b92221037a8b7db3b7acf33f7e4223a02b67f7a4806df8b7971f6e30027ac45ec69215a689a1d701da979d78d57c6f78b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303871003832fefd882520884555501b780a018282abb51a8806c03bb6ceafc0222e61393e11c1cecf05e99f10d4538913ada88334e676a7bd005eff862f86002018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca09b08366c1662bdf0cb1d4ff1b30460bf5bc5d6d0ae74a87e7321f76a4ef390daa03380020abb297972832a4759b96fa768a36f9eed6db0e3d8c62180ebd11bd931f901faf901f7a0a28de9ec2cee57445a93d498091565bba1d0e2eea6b5a2c2ae435fced7b40269a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794acde5374fce5edbc8e2a8697c15331677e6ebf0ba02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a002832fefd880845522f29e80a06471e8b724464619ad82444551558f944c172559f5116b70ba637405bc2ca8838897b0cfa8ce158dc4"
+ "blockHeader" : {
+ "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1",
+ "difficulty" : "0x0386a0",
+ "extraData" : "0x",
+ "gasLimit" : "0x2fefd8",
+ "gasUsed" : "0x5208",
+ "hash" : "a2f9cca853c5cdce8a970689dd09501e2d852d3759b57047461646e0c0ef89aa",
+ "mixHash" : "cf6be3ef50326186217079637d7026ca9c4c616693ebf9b2cca226e08e0e19db",
+ "nonce" : "93926ab2aae46d22",
+ "number" : "0x02",
+ "parentHash" : "02d9e686db27a43745ec82cddecf0d49857698ca6f0c80b871a993cce9b76f4d",
+ "receiptTrie" : "5a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27",
+ "stateRoot" : "a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fe",
+ "timestamp" : "0x557fea65",
+ "transactionsTrie" : "3a6b24f697df43db09029e425ce1495f64deb4195757991784189c240d6824a2",
+ "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
+ },
+ "rlp" : "0xf90261f901f9a002d9e686db27a43745ec82cddecf0d49857698ca6f0c80b871a993cce9b76f4da01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fea03a6b24f697df43db09029e425ce1495f64deb4195757991784189c240d6824a2a05a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a002832fefd882520884557fea6580a0cf6be3ef50326186217079637d7026ca9c4c616693ebf9b2cca226e08e0e19db8893926ab2aae46d22f862f86001018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba0cd272b71866a035bd6e6c58d0a92b141044516651c4d228c303cb9344f24cf4ea0e1bed38e900826a8f15f1421cb0ccfbb06fef4b2c682f78bfd86a66d02f1ecdcc0",
+ "transactions" : [
+ {
+ "data" : "0x",
+ "gasLimit" : "0x04cb2f",
+ "gasPrice" : "0x01",
+ "nonce" : "0x01",
+ "r" : "0xcd272b71866a035bd6e6c58d0a92b141044516651c4d228c303cb9344f24cf4e",
+ "s" : "0xe1bed38e900826a8f15f1421cb0ccfbb06fef4b2c682f78bfd86a66d02f1ecdc",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "v" : "0x1b",
+ "value" : "0x0a"
+ }
+ ],
+ "uncleHeaders" : [
+ ]
+ },
+ {
+ "rlp" : "0xf9045df901f9a0a2f9cca853c5cdce8a970689dd09501e2d852d3759b57047461646e0c0ef89aaa017924b6f02f496b00c042b2dc7079f73202a68cd30c4e222916518dc1b092763948888f1f195afa192cfee860698584c030f4c9db1a0a7150e152ba824446120f65ec8788e2baa7afbf0bb878bbaafe0631fc60860b2a002e755bb33543510419ffb9add7b41f7b52e749a821bf937b687c0734ceaa629a02b67f7a4806df8b7971f6e30027ac45ec69215a689a1d701da979d78d57c6f78b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303871003832fefd882520884557fea6780a0d6e363b10728c129e2a364e403b09aa7fe4db7f0a416460c9628277e1c5f28ad889b648bc9633f922bf862f86002018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba01f74aa243794ae7ccddbe91de5410439e777280d240adcdf8a1d76cf37160269a03ee5b498762af09eebcc0ae9d7ef72fde94ae4bd1e43c7cc9b2db4e7f2e589e5f901faf901f7a002d9e686db27a43745ec82cddecf0d49857698ca6f0c80b871a993cce9b76f4da01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794acde5374fce5edbc8e2a8697c15331677e6ebf0ba02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a002832fefd88084557fea6780a0bad7f905d29ed0fca99d65d0adcce698dee97cf72a13c7cd8d7a7826b8eee77088d91faa232969d7d4"
}
],
"genesisBlockHeader" : {
@@ -1175,9 +1437,9 @@
"extraData" : "0x42",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x00",
- "hash" : "f77be32aac97a01fff3fdccc7cd65444333724155938dd3baa159b7a9cd67477",
- "mixHash" : "79e16b568eb5c3b4dc2c462d22f193b608bebc327913efb47ccc53f695ad12ba",
- "nonce" : "7d3701a83ff41152",
+ "hash" : "71b90167bfc9d16c075fc6dfc40477f8eeb680a4d6eb25b4c7c0db8b6b2a8fab",
+ "mixHash" : "b4e9995fd23587b0fbd67b3a1892905bca478e8500e87ec6a06194177c1c80ec",
+ "nonce" : "4db8f04459632f83",
"number" : "0x00",
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
@@ -1186,8 +1448,8 @@
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a080832fefd8808454c98c8142a079e16b568eb5c3b4dc2c462d22f193b608bebc327913efb47ccc53f695ad12ba887d3701a83ff41152c0c0",
- "lastblockhash" : "4300af02ac3d852277bc047654bc15e754e9d537cfc0558b2a832d2868a6ece5",
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a080832fefd8808454c98c8142a0b4e9995fd23587b0fbd67b3a1892905bca478e8500e87ec6a06194177c1c80ec884db8f04459632f83c0c0",
+ "lastblockhash" : "a2f9cca853c5cdce8a970689dd09501e2d852d3759b57047461646e0c0ef89aa",
"postState" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "0x14",
@@ -1231,28 +1493,28 @@
"extraData" : "0x",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x5208",
- "hash" : "65a5bd411cb91fbba0a66e991572f697b521f680581eb8b7fb468923726c17b5",
- "mixHash" : "162c7eb61d287400ca7c7f998a57bd35c14ec3df0e7a640ccef624a9ba2a19f8",
- "nonce" : "18e2107e278fdba2",
+ "hash" : "8faf0e2b1867fce79993022a9b8920a6ac3e3bfeaa106e7eb5be141c17b83374",
+ "mixHash" : "c8b19bf080b204c22e97bbc28497cdc25fa967b9d228e7e7b265ca84e4cc7b13",
+ "nonce" : "352344368651a04d",
"number" : "0x01",
- "parentHash" : "a8d18377bd5079cd5d77799f49908aac13df486600ffc61041e1b6c6ab255fd9",
+ "parentHash" : "00118efb7d86eb9c9bc864fbc27a550862a611ddd2e7e60a9b07897b0c7a0f57",
"receiptTrie" : "e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313",
"stateRoot" : "2c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70",
- "timestamp" : "0x555501ba",
- "transactionsTrie" : "839b667f1878d51a82b62e478fd680b8dc0a8610f8889a0a4a54d0c6be970428",
+ "timestamp" : "0x557fea6d",
+ "transactionsTrie" : "2c931278d9eebd11426b5bd688ee11b2d02517e22d7c7d1a8df52ab5dd9860fb",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "rlp" : "0xf90261f901f9a0a8d18377bd5079cd5d77799f49908aac13df486600ffc61041e1b6c6ab255fd9a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a0839b667f1878d51a82b62e478fd680b8dc0a8610f8889a0a4a54d0c6be970428a0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303863001832fefd882520884555501ba80a0162c7eb61d287400ca7c7f998a57bd35c14ec3df0e7a640ccef624a9ba2a19f88818e2107e278fdba2f862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba006edf1b8d80154f4ed7005733a41d02f4fd5a070b5bf650c547cc433f9c6308da0a763708477fc0fd2934b354c3068f1a4efaf89842408bba8f5a7af887038c6ebc0",
+ "rlp" : "0xf90261f901f9a000118efb7d86eb9c9bc864fbc27a550862a611ddd2e7e60a9b07897b0c7a0f57a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a02c931278d9eebd11426b5bd688ee11b2d02517e22d7c7d1a8df52ab5dd9860fba0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303863001832fefd882520884557fea6d80a0c8b19bf080b204c22e97bbc28497cdc25fa967b9d228e7e7b265ca84e4cc7b1388352344368651a04df862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca06b48eb9dc847d025755debc7e322b750e17284677adca57f318807c6d3f1a5cda05da9d67cb68ee0ffbd863fad5603cbd5e6ba794b5590fc5f99432773e4d40ab8c0",
"transactions" : [
{
"data" : "0x",
"gasLimit" : "0x04cb2f",
"gasPrice" : "0x01",
"nonce" : "0x00",
- "r" : "0x06edf1b8d80154f4ed7005733a41d02f4fd5a070b5bf650c547cc433f9c6308d",
- "s" : "0xa763708477fc0fd2934b354c3068f1a4efaf89842408bba8f5a7af887038c6eb",
+ "r" : "0x6b48eb9dc847d025755debc7e322b750e17284677adca57f318807c6d3f1a5cd",
+ "s" : "0x5da9d67cb68ee0ffbd863fad5603cbd5e6ba794b5590fc5f99432773e4d40ab8",
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
- "v" : "0x1b",
+ "v" : "0x1c",
"value" : "0x0a"
}
],
@@ -1267,26 +1529,26 @@
"extraData" : "0x",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x5208",
- "hash" : "30209b168cb065b8308085fff406619f66ed6a7fe396c21d6127408166670137",
- "mixHash" : "e18c5a5ae2736c820b0542e2f089b50a403026603a414df6807261a8cd93c329",
- "nonce" : "85a75ddcce3c977b",
+ "hash" : "8eb51203ab5f754d4ce1a2d6befde40fb1b746e2f75fd845b270057674d23a15",
+ "mixHash" : "2dde7a14309a9d40527a455031aa41cc06a7da71dfecaa03ea419283542ace0e",
+ "nonce" : "6282ff55a76c00ef",
"number" : "0x02",
- "parentHash" : "65a5bd411cb91fbba0a66e991572f697b521f680581eb8b7fb468923726c17b5",
+ "parentHash" : "8faf0e2b1867fce79993022a9b8920a6ac3e3bfeaa106e7eb5be141c17b83374",
"receiptTrie" : "5a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27",
"stateRoot" : "a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fe",
- "timestamp" : "0x555501bb",
- "transactionsTrie" : "01bc98b099140e332cf91cf012cd177325e962c321794dc31f4d7c6ded1b0e54",
+ "timestamp" : "0x557fea71",
+ "transactionsTrie" : "df453ad06a15fceeb85d297b44f4064c6fd328b02c731ae52e5fea103f291956",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "rlp" : "0xf90261f901f9a065a5bd411cb91fbba0a66e991572f697b521f680581eb8b7fb468923726c17b5a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fea001bc98b099140e332cf91cf012cd177325e962c321794dc31f4d7c6ded1b0e54a05a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a002832fefd882520884555501bb80a0e18c5a5ae2736c820b0542e2f089b50a403026603a414df6807261a8cd93c3298885a75ddcce3c977bf862f86001018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca08b83729611ea92e329aeeebd24d2e687aed05c0a9135ce1bf27105bff66ad727a0b6ca0533385a8f71cb82d03d5f48e7c4c721fcb60fe3f7955e8c858a819f8729c0",
+ "rlp" : "0xf90261f901f9a08faf0e2b1867fce79993022a9b8920a6ac3e3bfeaa106e7eb5be141c17b83374a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fea0df453ad06a15fceeb85d297b44f4064c6fd328b02c731ae52e5fea103f291956a05a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a002832fefd882520884557fea7180a02dde7a14309a9d40527a455031aa41cc06a7da71dfecaa03ea419283542ace0e886282ff55a76c00eff862f86001018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca0c42442b48fdffdce00c186551e3b9f4f7226e228aadff88e3dcf1c216c6c9ee5a0c6e4cb9909b61ca3a83f671e0e06d71e104bd68e14ccceca8bfb5d1b437487d5c0",
"transactions" : [
{
"data" : "0x",
"gasLimit" : "0x04cb2f",
"gasPrice" : "0x01",
"nonce" : "0x01",
- "r" : "0x8b83729611ea92e329aeeebd24d2e687aed05c0a9135ce1bf27105bff66ad727",
- "s" : "0xb6ca0533385a8f71cb82d03d5f48e7c4c721fcb60fe3f7955e8c858a819f8729",
+ "r" : "0xc42442b48fdffdce00c186551e3b9f4f7226e228aadff88e3dcf1c216c6c9ee5",
+ "s" : "0xc6e4cb9909b61ca3a83f671e0e06d71e104bd68e14ccceca8bfb5d1b437487d5",
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
"v" : "0x1c",
"value" : "0x0a"
@@ -1296,7 +1558,7 @@
]
},
{
- "rlp" : "0xf9045df901f9a030209b168cb065b8308085fff406619f66ed6a7fe396c21d6127408166670137a0f8d908638f9b383634a06aa13e6c314dc2ab938e1ee204fb4d57c9a3bd5c789b948888f1f195afa192cfee860698584c030f4c9db1a0d40c133a2d06637484d95e89dd676d06f93ea4dcced745aa67613eeb33948f39a07df3368894be37dd03c77a6990245c2ca99acb18ddfba04c70685bd2094535aea02b67f7a4806df8b7971f6e30027ac45ec69215a689a1d701da979d78d57c6f78b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303863003832fefd882520884555501c380a02499b49865f98dfb583f7d2c0cd18212c5b8426edec79fc17d8ce2ed691cc2c3888de0d58f7a702347f862f86002018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca01ace5e0282dd710ecba232b275770151d89733471b0553eeb041383f6d148e57a087647b9175529d10a9c39331a825f42818a5da2c7ad0f1638d146fa87bec0403f901faf901f7a0bad4fc6b5d99ee03c4aab1592640f6f9dcbc850668d75d631aee34989b938faea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794acde5374fce5edbc8e2a8697c15331677e6ebf0ba02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830385c002832fefd88084555501c380a0bd470062a12f64e4568fd66007c1ad9c637fe9cf6658b7aef658cba2366f943a88c9933282bb5b53a9"
+ "rlp" : "0xf9045df901f9a08eb51203ab5f754d4ce1a2d6befde40fb1b746e2f75fd845b270057674d23a15a082c42500f3b3503ac8486963d51c29e095ad0d1f11138fd9b5c17c4f2f60289f948888f1f195afa192cfee860698584c030f4c9db1a0d40c133a2d06637484d95e89dd676d06f93ea4dcced745aa67613eeb33948f39a0e8f446c19c15888677a10a11dc22e224bcc51def3da7bd1e0860e971ecb50d76a02b67f7a4806df8b7971f6e30027ac45ec69215a689a1d701da979d78d57c6f78b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303871003832fefd882520884557fea7380a0fe66fe9e5fd0bd177e1f6569d2286b62c942ace050ca851b63db372e8cf40e52887eee7495d814d176f862f86002018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba0ac1c8b909110b78bd392d68e27c28eb08d62a577895dc8ec95f1d811cc8ea76fa0f4c48675c706996d60986670e49ecdaf03c7ab3f0bae4192c2f4253b51aa2f1bf901faf901f7a0bad4fc6b5d99ee03c4aab1592640f6f9dcbc850668d75d631aee34989b938faea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794acde5374fce5edbc8e2a8697c15331677e6ebf0ba02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a002832fefd88084557fea7380a06c4478abebb4617e295f2d6e8cc181795cbdb0a6d10b86e0e6f67ffe877b809088404368fb1e7ac701"
}
],
"genesisBlockHeader" : {
@@ -1306,9 +1568,9 @@
"extraData" : "0x42",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x00",
- "hash" : "a8d18377bd5079cd5d77799f49908aac13df486600ffc61041e1b6c6ab255fd9",
- "mixHash" : "9c2b1ce7e46934a4817f17cbb12da7186111d1ccd398f724fc0a4578b4264f97",
- "nonce" : "8b5c8cf6880f6f61",
+ "hash" : "00118efb7d86eb9c9bc864fbc27a550862a611ddd2e7e60a9b07897b0c7a0f57",
+ "mixHash" : "e7745f10dc1ec697fd4cb9e251b5e2f460b5bf69054035df668048b52bd5ede9",
+ "nonce" : "54593786268ad10e",
"number" : "0x00",
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
@@ -1317,8 +1579,8 @@
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a080832fefd8808454c98c8142a09c2b1ce7e46934a4817f17cbb12da7186111d1ccd398f724fc0a4578b4264f97888b5c8cf6880f6f61c0c0",
- "lastblockhash" : "30209b168cb065b8308085fff406619f66ed6a7fe396c21d6127408166670137",
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a080832fefd8808454c98c8142a0e7745f10dc1ec697fd4cb9e251b5e2f460b5bf69054035df668048b52bd5ede98854593786268ad10ec0c0",
+ "lastblockhash" : "8eb51203ab5f754d4ce1a2d6befde40fb1b746e2f75fd845b270057674d23a15",
"postState" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "0x14",
@@ -1362,26 +1624,26 @@
"extraData" : "0x",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x5208",
- "hash" : "f0004afde39bb63a1b4eaedf1fdbb1ea17816f15e7effd1fccf8314dbc4551e5",
- "mixHash" : "3cca9f1725215ef3e686abe8c326733fcb4b4a02820e838c466a01595f086ccf",
- "nonce" : "bb487559914f650e",
+ "hash" : "28cf61a48732e39a06b8d7bf490311e22a730629017adc9673459c2b222bdb07",
+ "mixHash" : "f1d6290d0674b697b3b0ff7917359680090466fc933370c5a355a1971c2e4b4f",
+ "nonce" : "5efec6c1c33db629",
"number" : "0x01",
- "parentHash" : "969a4dd022782b1fd2441a918b20bdc645d8ffc7c741bf609accb599e9e26819",
+ "parentHash" : "db025097c3cbe28c509c9a5dcfd48528896eeaa964d40d19eaa8b4dc409f972e",
"receiptTrie" : "e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313",
"stateRoot" : "2c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70",
- "timestamp" : "0x555501c9",
- "transactionsTrie" : "d1d3898ad7be4f1fa66a444daa2679e77f520d28b6595aa1e3e5423b23ac8f34",
+ "timestamp" : "0x557fea79",
+ "transactionsTrie" : "2791538787065e703899678093da7a5e83b28b7517e29b112d1e0d2b9efc0df7",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "rlp" : "0xf90261f901f9a0969a4dd022782b1fd2441a918b20bdc645d8ffc7c741bf609accb599e9e26819a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a0d1d3898ad7be4f1fa66a444daa2679e77f520d28b6595aa1e3e5423b23ac8f34a0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303863001832fefd882520884555501c980a03cca9f1725215ef3e686abe8c326733fcb4b4a02820e838c466a01595f086ccf88bb487559914f650ef862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba037b569f32914b00ddec1c5b75f61ab15974e2464e639895331381c83aa86852ca074017993bf80fcab95fdf1b1944270fc399d7cc6b0497749e386cd07d537bffec0",
+ "rlp" : "0xf90261f901f9a0db025097c3cbe28c509c9a5dcfd48528896eeaa964d40d19eaa8b4dc409f972ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a02c15e8b5cb6cf880faa558c76c02a591e181ef2c4450ad92e53ae6c21093dc70a02791538787065e703899678093da7a5e83b28b7517e29b112d1e0d2b9efc0df7a0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303863001832fefd882520884557fea7980a0f1d6290d0674b697b3b0ff7917359680090466fc933370c5a355a1971c2e4b4f885efec6c1c33db629f862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba0d1608da5bb394713c42bf02d3436a041e59a3d4bb84bbb3bca0781eef4aecd52a05ea0845d6bae22664156e826643a386fcb3d074263078680faee9edbe5adececc0",
"transactions" : [
{
"data" : "0x",
"gasLimit" : "0x04cb2f",
"gasPrice" : "0x01",
"nonce" : "0x00",
- "r" : "0x37b569f32914b00ddec1c5b75f61ab15974e2464e639895331381c83aa86852c",
- "s" : "0x74017993bf80fcab95fdf1b1944270fc399d7cc6b0497749e386cd07d537bffe",
+ "r" : "0xd1608da5bb394713c42bf02d3436a041e59a3d4bb84bbb3bca0781eef4aecd52",
+ "s" : "0x5ea0845d6bae22664156e826643a386fcb3d074263078680faee9edbe5adecec",
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
"v" : "0x1b",
"value" : "0x0a"
@@ -1398,26 +1660,26 @@
"extraData" : "0x",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x5208",
- "hash" : "d5fd1ba8d7af892338be88064ec75972e28d2647249c266a3b2b038a2808e000",
- "mixHash" : "7ae3d64ab9dbc3f4792636b54fa65a34d3b2ff3ad28e0bc2acb93205ed5d4c9b",
- "nonce" : "24ad364d9b12f9b9",
+ "hash" : "59203337fbc8d4aa04fb7e35b7b3a8160fa205eec4ed2091756b0fcc699c1309",
+ "mixHash" : "416357f0a146268e21e8eb0de633bb983019559f70acaa138038fcf36d7d0c8a",
+ "nonce" : "727ea0bb163ff761",
"number" : "0x02",
- "parentHash" : "f0004afde39bb63a1b4eaedf1fdbb1ea17816f15e7effd1fccf8314dbc4551e5",
+ "parentHash" : "28cf61a48732e39a06b8d7bf490311e22a730629017adc9673459c2b222bdb07",
"receiptTrie" : "5a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27",
"stateRoot" : "a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fe",
- "timestamp" : "0x555501cb",
- "transactionsTrie" : "da997da975cc5d473589038159555334aa0618d10e9ebebaa0a3b32e61ecc04e",
+ "timestamp" : "0x557fea7b",
+ "transactionsTrie" : "eb8a58d8199150a8f64e5c0b90ba1936d6b23f510affdc3d1705c81f7ad3e605",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "rlp" : "0xf90261f901f9a0f0004afde39bb63a1b4eaedf1fdbb1ea17816f15e7effd1fccf8314dbc4551e5a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fea0da997da975cc5d473589038159555334aa0618d10e9ebebaa0a3b32e61ecc04ea05a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a002832fefd882520884555501cb80a07ae3d64ab9dbc3f4792636b54fa65a34d3b2ff3ad28e0bc2acb93205ed5d4c9b8824ad364d9b12f9b9f862f86001018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca003aa5d0e3c3671630fe5111ce0f3fbad36a3a1cde4b0e35f0e8ee937274bb867a0fdecb9c68f5068b54eca124affb391f93bff7ceaea0c4c77fdae1155057ed203c0",
+ "rlp" : "0xf90261f901f9a028cf61a48732e39a06b8d7bf490311e22a730629017adc9673459c2b222bdb07a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0a2a5e3d96e902272adb58e90c364f7b92684c539e0ded77356cf33d966f917fea0eb8a58d8199150a8f64e5c0b90ba1936d6b23f510affdc3d1705c81f7ad3e605a05a750181d80a2b69fac54c1b2f7a37ebc4666ea5320e25db6603b90958686b27b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a002832fefd882520884557fea7b80a0416357f0a146268e21e8eb0de633bb983019559f70acaa138038fcf36d7d0c8a88727ea0bb163ff761f862f86001018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca03ed1e4baa795244ac64b0b768b91d320bfc3ed138e457622438102b43c0c8bd9a0bcfdafad441cd967a06e534b8f6cbd0bd31407e853484f9195874fc94885628dc0",
"transactions" : [
{
"data" : "0x",
"gasLimit" : "0x04cb2f",
"gasPrice" : "0x01",
"nonce" : "0x01",
- "r" : "0x03aa5d0e3c3671630fe5111ce0f3fbad36a3a1cde4b0e35f0e8ee937274bb867",
- "s" : "0xfdecb9c68f5068b54eca124affb391f93bff7ceaea0c4c77fdae1155057ed203",
+ "r" : "0x3ed1e4baa795244ac64b0b768b91d320bfc3ed138e457622438102b43c0c8bd9",
+ "s" : "0xbcfdafad441cd967a06e534b8f6cbd0bd31407e853484f9195874fc94885628d",
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
"v" : "0x1c",
"value" : "0x0a"
@@ -1427,7 +1689,7 @@
]
},
{
- "rlp" : "0xf9045df901f9a0d5fd1ba8d7af892338be88064ec75972e28d2647249c266a3b2b038a2808e000a08a81e616498e5d3bb2558ba4c786569201033d9cb554c35b0ae4e0b98f1f77ce948888f1f195afa192cfee860698584c030f4c9db1a0d40c133a2d06637484d95e89dd676d06f93ea4dcced745aa67613eeb33948f39a01c464a3f5ca4dac55775a0ea3ac86c85c2cb6e120936dbbd38162184ae67b6dda02b67f7a4806df8b7971f6e30027ac45ec69215a689a1d701da979d78d57c6f78b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303871003832fefd882520884555501cd80a0f57ac239d1a4233d61897b493ee8886f8ee9ae08cae6ceef4b00f7cb3f0c08a688488d82e383223b92f862f86002018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca03cb16b681c4078f1310953384c5f7d61b66c74068951ea3dd96a2342bc31784ba017c9fa10b5a8e87dfa3c69096a0cb1b7ee71445dff20d7f9db6ae1e8aed48c67f901faf901f7a0f0004afde39bb63a1b4eaedf1fdbb1ea17816f15e7effd1fccf8314dbc4551e5a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794acde5374fce5edbc8e2a8697c15331677e6ebf0ba0bad40b30d613c35dad43e3693329e1b1ee6350f989cf46a288025a1cbfdab9cda056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a002832fefd88084555501cd80a0649ba4273484110720fa67e65845166006e4eedfb105f24ef5a642d58c7dbc4d8871408da66c0a3ded"
+ "rlp" : "0xf9045df901f9a059203337fbc8d4aa04fb7e35b7b3a8160fa205eec4ed2091756b0fcc699c1309a0e081abd582ad35a31068cab36707730393e1918b55a4ed30cc1d31ac5e339965948888f1f195afa192cfee860698584c030f4c9db1a0d40c133a2d06637484d95e89dd676d06f93ea4dcced745aa67613eeb33948f39a0481632b12f8b565aac7880f0ce1bf61ea5a3a95c6942509692a41aab8bf5c1f6a02b67f7a4806df8b7971f6e30027ac45ec69215a689a1d701da979d78d57c6f78b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008303871003832fefd882520884557fea7f80a0e6e50cf7400653b83616cc1fa23bd4afba50ff69efbdb7b94e142cbf0c8dfc3588084054eedce23c7bf862f86002018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca0624d57cfeb71257fb693a705697f42112da63afe8f0c7159357288c34f4faa1aa02e8ff3a1b0fe05d0ddcda2f7a00979ecaa0dfd3da2f64e7d9c6c34221583abbaf901faf901f7a028cf61a48732e39a06b8d7bf490311e22a730629017adc9673459c2b222bdb07a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794acde5374fce5edbc8e2a8697c15331677e6ebf0ba0bad40b30d613c35dad43e3693329e1b1ee6350f989cf46a288025a1cbfdab9cda056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a002832fefd88084557fea7f80a0fae4284379e1a50046c2c30d0979ae83d02a5d70609ecfbfd3167d9b195e8f768889ec0677ae63da0b"
}
],
"genesisBlockHeader" : {
@@ -1437,9 +1699,9 @@
"extraData" : "0x42",
"gasLimit" : "0x2fefd8",
"gasUsed" : "0x00",
- "hash" : "969a4dd022782b1fd2441a918b20bdc645d8ffc7c741bf609accb599e9e26819",
- "mixHash" : "7c30d9260124abeb81c0a575481bde08d92e4087b840e86dc2742e5835d2e46c",
- "nonce" : "9e8de1149ac18cd7",
+ "hash" : "db025097c3cbe28c509c9a5dcfd48528896eeaa964d40d19eaa8b4dc409f972e",
+ "mixHash" : "2ba6a79d4cb8c6e573f0a25ba8af0691914322978670c4ef5c7216bc286c8afc",
+ "nonce" : "7983221ee55bb09e",
"number" : "0x00",
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
@@ -1448,8 +1710,8 @@
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
},
- "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a080832fefd8808454c98c8142a07c30d9260124abeb81c0a575481bde08d92e4087b840e86dc2742e5835d2e46c889e8de1149ac18cd7c0c0",
- "lastblockhash" : "d5fd1ba8d7af892338be88064ec75972e28d2647249c266a3b2b038a2808e000",
+ "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830386a080832fefd8808454c98c8142a02ba6a79d4cb8c6e573f0a25ba8af0691914322978670c4ef5c7216bc286c8afc887983221ee55bb09ec0c0",
+ "lastblockhash" : "59203337fbc8d4aa04fb7e35b7b3a8160fa205eec4ed2091756b0fcc699c1309",
"postState" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "0x14",
diff --git a/tests/files/StateTests/RandomTests/st201506091836GO.json b/tests/files/StateTests/RandomTests/st201506091836GO.json
new file mode 100644
index 000000000..05a421ad3
--- /dev/null
+++ b/tests/files/StateTests/RandomTests/st201506091836GO.json
@@ -0,0 +1,71 @@
+{
+ "randomStatetest" : {
+ "env" : {
+ "currentCoinbase" : "a7f7c8ef9bbbcfb0f7e81c1fd46bb732fba60592",
+ "currentDifficulty" : "0x4b7a57082929690e",
+ "currentGasLimit" : "0x0b3be1fc",
+ "currentNumber" : "0x7ee23b32",
+ "currentTimestamp" : "0x588de6ec",
+ "previousHash" : "f3907ec3d962d22b61d2618054c8252a7fe67b65f652a7b8fcc55cfe905a1caa"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "0x33498455",
+ "code" : "0x64d552603c577e9a3805d8c55157a82b7660ef2a049cfbf79c15fa8e3261f121d213590fa3917d7d442a5e8734af2aaa4c859b452eed7860c2f7e051580427b6c3cc6d7fee617a0d64ef63e192256de5d2ea2689decfd971c7478effb06aa9e792747ce0492abde8c2f270e93d5ed0b213fed7ae59294537d4864c0e68bbe30ec5d1e6b854027862cfcbea15e8367dfaa080ee0da2b0d2ca892f5a764354370466ccddd03115ec8a7ad2e6c62c29425a45ec842fb74c369fb15a42e4b4e48b3eb70be2a0847469987980e6eaa539365a491d2366334f78f03acb177809e7525add39a234d3d2ef1cf8544a52389411ef846d3cd7f36d0d1db7f414860020171f07598cfb620e15a9681c843d60aee9fb8a4e7e37713afbf6ef9d1667513975c76f26ac35ce209b1e0a3bb7c19821368931537b4095ea42b32baf1ba596b9af5cce961ae705f8c9c5465e349633529871f64351169e7fe48ccbb866952fabbfcf40df723c564e109dbd4c9c15ee9ad625e96a5765f6f56ee0601677961da7ebad5f583f6eb6da7c8348425fe784f532f288963ccdbf9de3ac3ebc38b75a806b40e51b895c662d0bcab255a04b723f1e500517d17eb720e02f445cb046bd0fe7d2759438c79aa2dfcaef1cf57e4eb9c832f7ef449a9c32f673728f4b0dccdfa8fb1d447e2f681076ac51a98f76600a66b4692ca7e1e9c89f64cdf879cb0c625514977ebca28f2ec8bb3a092bd0c30849558fe16a4b7070cb05aec329c0286c26fff57795ce4ac7601160ea2d6656c8f2a554b43e263cc3a60e9fd0a26c0a5f7202f02888a731e84ab326610c77771f85025eb8c552943d2da5de48786015f5b8b5921d26c1e277d5a4cda5f1f77ec5f3a83e6ed6821ff025370e2fad05a0f364f58f3705c8761904d63e0f2e5bdbe2b0b1ddf82bb441c547634e8c1864737333e845ffa373c102303f727bfa14f4c445711f6f9695c36f3627df02a1fe2d7eca55faed6984000ab2a99545148bbe7369a47367bc24256acd6a3a22d5fb32434b1998297ae6b2edf08b72dc4598aa600e16707699a84e55ef611ea0e6da482f6c6e9d05d54bbb4ad06cd62622e469fbcd3e637a8f0d2ac9149b7076cce991cb5d4b4de1229e3decbcf46a3c7e46aa1fdc218d936e56f55b5a38bbd798361040e1badb1ab06adc38a723badfa07a95f78553de4df879855274a1904a31276d7938818021e69d8f5b9279478808a236deefd761df6bc151fded80bbe4ba725e7db7b9fc507f0b8121a009384c7bc4443747bd1ac9dc7682b32bec0937c7fb27ba3926acd0d67b41ba6c951788f1bb1b1168229d15cafdc63209c95df646566024013d766a01d6b8051c357243c9f464f423a2ae8efa4f9efd95777099eac9b0825d18018a5afcb6cecd9ab9a9655ae262db08a271d8adedbc3e7eb6acfd2d576ec297c09c4bd47a80dacd2b123e4e4e6232ef6d70acb10f2f44a62bbcef65a72576506ea119b051880b515f4414920badcd6f726c04e821516f6123c9c52f29e19bfe0fb10fab76536535cc0e01115c83369d4083db2d669654c2fe8c00e37bd78f663a2ce2425d2ce358e213d6c601208bb644fa656678de7633147fbd152c2ae682dec269245f07ba3c79f4e6e1978d40f42a494d44eba128b9d0228d637900cbab73455423156417fae331d26494d1ed4d06ecf206736f04292d5470d5091c48a80ba737372c35729c829af30db3625785ba0b3cfc4240d002276760f2770ead609b52db934a53063ec1c05488188fb37ce61059909b6c975c0e9401ef3b71b6d0ddae39867f3f0878bd172851a98a233fcafae289fc634c36c8b3064926d92deda3d8c5074d6a56daa511e7e693aab3d4347cebdd5b63238acdeedc3d8eb8f69ea18cb429ee8f09c26845507ba28eba916c74fd62cd9e587a8f013122d93579b6b7da091527251a4b70051be4f0f96f61e5dc4ab713c473174c7e2ebb463615b03c4787b74e8c204975399439fa553838f186ae028a47f3ccd46c5fcc46c11a36219f3ba1d34def7bee989fa61e60a2abd3652df9f8e5a1b53d9608e3bb04f5e852333d9c7d761836ef5761178bd07fde9a0ded16e1659a6c80281c259ce42e3fdbe23664ce783b58d595",
+ "nonce" : "0xe9",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "0x4ea91708",
+ "code" : "0x36",
+ "nonce" : "0x59",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x24d289465fa51769",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "5a9d4e3d21fb0dee07e0b52772b46dff8b513f0d4fba4765c43096a97e8b088f",
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "0x33498455",
+ "code" : "0x64d552603c577e9a3805d8c55157a82b7660ef2a049cfbf79c15fa8e3261f121d213590fa3917d7d442a5e8734af2aaa4c859b452eed7860c2f7e051580427b6c3cc6d7fee617a0d64ef63e192256de5d2ea2689decfd971c7478effb06aa9e792747ce0492abde8c2f270e93d5ed0b213fed7ae59294537d4864c0e68bbe30ec5d1e6b854027862cfcbea15e8367dfaa080ee0da2b0d2ca892f5a764354370466ccddd03115ec8a7ad2e6c62c29425a45ec842fb74c369fb15a42e4b4e48b3eb70be2a0847469987980e6eaa539365a491d2366334f78f03acb177809e7525add39a234d3d2ef1cf8544a52389411ef846d3cd7f36d0d1db7f414860020171f07598cfb620e15a9681c843d60aee9fb8a4e7e37713afbf6ef9d1667513975c76f26ac35ce209b1e0a3bb7c19821368931537b4095ea42b32baf1ba596b9af5cce961ae705f8c9c5465e349633529871f64351169e7fe48ccbb866952fabbfcf40df723c564e109dbd4c9c15ee9ad625e96a5765f6f56ee0601677961da7ebad5f583f6eb6da7c8348425fe784f532f288963ccdbf9de3ac3ebc38b75a806b40e51b895c662d0bcab255a04b723f1e500517d17eb720e02f445cb046bd0fe7d2759438c79aa2dfcaef1cf57e4eb9c832f7ef449a9c32f673728f4b0dccdfa8fb1d447e2f681076ac51a98f76600a66b4692ca7e1e9c89f64cdf879cb0c625514977ebca28f2ec8bb3a092bd0c30849558fe16a4b7070cb05aec329c0286c26fff57795ce4ac7601160ea2d6656c8f2a554b43e263cc3a60e9fd0a26c0a5f7202f02888a731e84ab326610c77771f85025eb8c552943d2da5de48786015f5b8b5921d26c1e277d5a4cda5f1f77ec5f3a83e6ed6821ff025370e2fad05a0f364f58f3705c8761904d63e0f2e5bdbe2b0b1ddf82bb441c547634e8c1864737333e845ffa373c102303f727bfa14f4c445711f6f9695c36f3627df02a1fe2d7eca55faed6984000ab2a99545148bbe7369a47367bc24256acd6a3a22d5fb32434b1998297ae6b2edf08b72dc4598aa600e16707699a84e55ef611ea0e6da482f6c6e9d05d54bbb4ad06cd62622e469fbcd3e637a8f0d2ac9149b7076cce991cb5d4b4de1229e3decbcf46a3c7e46aa1fdc218d936e56f55b5a38bbd798361040e1badb1ab06adc38a723badfa07a95f78553de4df879855274a1904a31276d7938818021e69d8f5b9279478808a236deefd761df6bc151fded80bbe4ba725e7db7b9fc507f0b8121a009384c7bc4443747bd1ac9dc7682b32bec0937c7fb27ba3926acd0d67b41ba6c951788f1bb1b1168229d15cafdc63209c95df646566024013d766a01d6b8051c357243c9f464f423a2ae8efa4f9efd95777099eac9b0825d18018a5afcb6cecd9ab9a9655ae262db08a271d8adedbc3e7eb6acfd2d576ec297c09c4bd47a80dacd2b123e4e4e6232ef6d70acb10f2f44a62bbcef65a72576506ea119b051880b515f4414920badcd6f726c04e821516f6123c9c52f29e19bfe0fb10fab76536535cc0e01115c83369d4083db2d669654c2fe8c00e37bd78f663a2ce2425d2ce358e213d6c601208bb644fa656678de7633147fbd152c2ae682dec269245f07ba3c79f4e6e1978d40f42a494d44eba128b9d0228d637900cbab73455423156417fae331d26494d1ed4d06ecf206736f04292d5470d5091c48a80ba737372c35729c829af30db3625785ba0b3cfc4240d002276760f2770ead609b52db934a53063ec1c05488188fb37ce61059909b6c975c0e9401ef3b71b6d0ddae39867f3f0878bd172851a98a233fcafae289fc634c36c8b3064926d92deda3d8c5074d6a56daa511e7e693aab3d4347cebdd5b63238acdeedc3d8eb8f69ea18cb429ee8f09c26845507ba28eba916c74fd62cd9e587a8f013122d93579b6b7da091527251a4b70051be4f0f96f61e5dc4ab713c473174c7e2ebb463615b03c4787b74e8c204975399439fa553838f186ae028a47f3ccd46c5fcc46c11a36219f3ba1d34def7bee989fa61e60a2abd3652df9f8e5a1b53d9608e3bb04f5e852333d9c7d761836ef5761178bd07fde9a0ded16e1659a6c80281c259ce42e3fdbe23664ce783b58d595",
+ "nonce" : "0xe9",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "0x4ea91708",
+ "code" : "0x36",
+ "nonce" : "0x59",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x24d289465fa51769",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "0x73151af76abac2a99afe60eff5cfd8f68daf1b35e0608a690494ef4b1d043bf90e00916acf5f0332c3ef3aa972eba960aa557dc165d1a3c726953fc637fe643a60543de4159f3bc09673cd054235ddb44769fa2d6edb61b6e71feff2662043418ac9d2337bce1df4b842fbf8f07395b44bb506e8955d22a12176e2fb8e25bc546d77a6f5049a09f3126c915f14979d8c7c0cf88425567c6b8a6865b78e6d76208a641cb0d0651a758d9afdd5e36b2dcf740a8a1e2b19ebb0bc8ad6ac032577f3b5d483e40d0c9a40aaf32cebc478c0962e1ac5f6c648f47665f0850054ab4caab6eca1a24242087387c96452ad72e76a42a175db6c69a2d8cbcd70759249b040a797894765385557e947875851cfe9734edc8b613cbb6bf40b41b762fa3bcbc6b59ecc66971fef9e8ed16d691702b224f0e2f8ad12577a943401f57334d3207b884a40ed472960f03e4cab61c98268b5a73b6372ab45a7a4",
+ "gasLimit" : "0x738409f3",
+ "gasPrice" : "0x1d",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "0x7f3e3a6ac8834e68"
+ }
+ }
+}
diff --git a/tests/files/StateTests/RandomTests/st201506092032GO.json b/tests/files/StateTests/RandomTests/st201506092032GO.json
new file mode 100644
index 000000000..5a354f71e
--- /dev/null
+++ b/tests/files/StateTests/RandomTests/st201506092032GO.json
@@ -0,0 +1,71 @@
+{
+ "randomStatetest" : {
+ "env" : {
+ "currentCoinbase" : "6d6e40885310545835a5b582dbc23ef026404bda",
+ "currentDifficulty" : "0x266dbce6",
+ "currentGasLimit" : "0x2b7fe66d",
+ "currentNumber" : "0x635fe35ae78fc1dc",
+ "currentTimestamp" : "0x775b1d0c",
+ "previousHash" : "a8228e05d900b890136bcc55628b479e172795042a90e18b673189b5f3a672fc"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "0x070a217c02c8f2d4",
+ "code" : "0x6f823a02877cef7c1afb60663009def564608c557bad2ae05769b991313726edbfa0881d9cc955b0f5154751da315696ea7ce130184b64f2507582c502d450349ff24fb8aeb2a46146687b666bd7bd0364946cb720c76d483f5afea0049251fd9793c4b0376afbb4ebcdc42fdd42edcd4b619cec787638009cea26a1abe570e3186ab790b7dc7db36e4cda2570b0847adf6e39579c7c43a4ac976cd507d493cdfaebe09936078e31c71c4665d34a4b816b8004",
+ "nonce" : "0x75",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "0x9740421ff0ff3ae3",
+ "code" : "0x",
+ "nonce" : "0x1d",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0xc1142f2b8e8eb058",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "f95be1e4c7788641348454fd9ff7b21956f61a979e8d7f8e55cec444c5931e8c",
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "0x070a217c02c8f2d4",
+ "code" : "0x6f823a02877cef7c1afb60663009def564608c557bad2ae05769b991313726edbfa0881d9cc955b0f5154751da315696ea7ce130184b64f2507582c502d450349ff24fb8aeb2a46146687b666bd7bd0364946cb720c76d483f5afea0049251fd9793c4b0376afbb4ebcdc42fdd42edcd4b619cec787638009cea26a1abe570e3186ab790b7dc7db36e4cda2570b0847adf6e39579c7c43a4ac976cd507d493cdfaebe09936078e31c71c4665d34a4b816b8004",
+ "nonce" : "0x75",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "0x9740421ff0ff3ae3",
+ "code" : "0x",
+ "nonce" : "0x1d",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0xc1142f2b8e8eb058",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "0x64dd3e4e84676723342c1dfaf9af4ef3",
+ "gasLimit" : "0x4b75fb87",
+ "gasPrice" : "0x1c",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "0x6d1dd024"
+ }
+ }
+}
diff --git a/tests/files/StateTests/RandomTests/st201506101359JS.json b/tests/files/StateTests/RandomTests/st201506101359JS.json
new file mode 100644
index 000000000..58b2456e7
--- /dev/null
+++ b/tests/files/StateTests/RandomTests/st201506101359JS.json
@@ -0,0 +1,71 @@
+{
+ "randomStatetest" : {
+ "env" : {
+ "currentCoinbase" : "945304eb96065b2a98b57a48a06ae28d285a71b5",
+ "currentDifficulty" : "0x051d6a3cd647",
+ "currentGasLimit" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "0x00",
+ "code" : "0x7f000000000000000000000000945304eb96065b2a98b57a48a06ae28d285a71b57f00000000000000000000000000000000000000000000000000000000000000017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000945304eb96065b2a98b57a48a06ae28d285a71b5457f00000000000000000000000100000000000000000000000000000000000000007f000000000000000000000000945304eb96065b2a98b57a48a06ae28d285a71b57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff441a35803a0ba46699913755",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "0x52614e74",
+ "code" : "0x6000355415600957005b60203560003555",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b35502b1ba",
+ "code" : "0x",
+ "nonce" : "0x01",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "341d35dcd68e14ed391c23300e89fb48d60096e473e4e8b84589df12381e8d0e",
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "0x00",
+ "code" : "0x7f000000000000000000000000945304eb96065b2a98b57a48a06ae28d285a71b57f00000000000000000000000000000000000000000000000000000000000000017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000945304eb96065b2a98b57a48a06ae28d285a71b5457f00000000000000000000000100000000000000000000000000000000000000007f000000000000000000000000945304eb96065b2a98b57a48a06ae28d285a71b57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff441a35803a0ba46699913755",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
+ "balance" : "0x2e",
+ "code" : "0x6000355415600957005b60203560003555",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "0x7f000000000000000000000000945304eb96065b2a98b57a48a06ae28d285a71b57f00000000000000000000000000000000000000000000000000000000000000017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000945304eb96065b2a98b57a48a06ae28d285a71b5457f00000000000000000000000100000000000000000000000000000000000000007f000000000000000000000000945304eb96065b2a98b57a48a06ae28d285a71b57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff441a35803a0ba466999137",
+ "gasLimit" : "0x52614e46",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "0x377df0d4"
+ }
+ }
+}
diff --git a/tests/files/StateTests/RandomTests/st201506101754PYTHON.json b/tests/files/StateTests/RandomTests/st201506101754PYTHON.json
deleted file mode 100644
index 011393c16..000000000
--- a/tests/files/StateTests/RandomTests/st201506101754PYTHON.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
- "randomStatetest" : {
- "env" : {
- "currentCoinbase" : "278a2477986e084e246f05773a2b5eacdb5dfc",
- "currentDifficulty" : "0x4dd564b3cdda8bc3",
- "currentGasLimit" : "0xa944edbd45fcf58f",
- "currentNumber" : "0x1af631a7",
- "currentTimestamp" : "0x7e5eac84",
- "previousHash" : "a8bb55191478f88b4b7d9c24296b85e00bcc3c10f421f74f22796c3b803e9cc5"
- },
- "logs" : [
- ],
- "out" : "0x",
- "post" : {
- "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
- "balance" : "0x181b2eb1",
- "code" : "0x795be1b1880ba0d1ff0b50d115c416fb7ac36fc9d2bea9f9e7212f75048cdab5287d75095451ab1623b6739fc0b8ca326281557c68443e5185640a16e727e1156afd6dde85dfe895f090e713f5c281b37862dfa4720b60f87ef7cbadac8540d09aed76138387554911aadac3a5a8ebdf110a8fbaf47cab627cb65114dda0080882a9bbbf030996a6bfcce67b166c10f4ae8744f4c25364bedb62f5dc62dbcf737fb65c90032ac39f5bb9a7cc2514e0d24576223d88eb1da8f2b4d662e5a15a20917589492203838bb3da4b917ca7f4db012c632664718f646a961415e56ddd89e36658376506465fec9e7d7c65884f506eb9a9385b971a7aa53f041eded63eee1ba5dfc91027a2b61c7b248926f5d5039d4c105223f40d2d2206e87ffd20ec11f679aad21087997432d0d35f8b338cbc888a01fbaa553e3e3da7bb2c5071b8366c71f9a5c374d8346f1c29425e3b84286c512965910ed7aa6a926e886ddc626b578a7ef9a2afdced2885db4f5c5953f0bebe2c4e5ce2405da32bc2579f44f7b403e5608985624501126e4143161502c97b9d2ee4f4e8a13b52715cc40d365cd8918db8143a5a8c1acf8d143264272ba8779b76d98fce1bb89d91b147eccd26106d2beb74ef5020dd29ec84",
- "nonce" : "0x1d",
- "storage" : {
- }
- },
- "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
- "balance" : "0xd3e4b5453acbfee3",
- "code" : "0x6da51aee682e4234c81890984b0e4b7b41f0e7c796b0bd1cd5f6e5e199baac038263421acbb851aa4c4b1b9f7a9b3b743b2c7f9c4642a2b61b9a55afb602222425e3e03108bf45b97fe81d94d612bd6c5b626248a3530a35dbe19d46044e5b50a38adb316c0febaa766c129cfe93c1461f410a35bf7809701c7efde846604b5f1075effca115d6fba575f6918a83642ae3c735cf58a5a8f5322e751ce466bc92605179f08205d6bb8faaaafe6c619f0204364f0d72561e1bba35f7e0c36bcd0e092e722f150afda0c66b987179c196beec8ae01caa69bff6aaa360fff671757cf9af3eb4fbb5b10330c5e10cbd4d84da6e17dda20b75c62a75a1f959488a4c89d945f2fb0fd62797585d9285634b9dc43b72256256186abb01e4ad78e35eb2ae11a2a472dd7bcb68c0379810f5cc347f5961983375bbadb7034dc615d4933c5b824f6b44287407ef71b438b0f39fcdf17db3ddfb24284cd59458622163965146a446ea6f8bc358fff16222a8d6d00c670633fafe256c51a31675894fa42c335b5b3b239aa98776ba0fcc228b87d5d4ce61c6f77030e85b0a8fb206752d948d9116534991cc7382c04771759c38e322ba9bc4895a60521ba3541967f768231cbc7195aa6eea9ff5ae8850b1702f812f01a13af9668c25c7b46583767c240520e9a31e63589468e2a5bd94659e04cf24b6ec8fbf51497b3a5b0b690c2bdde61fc1ebd12bc2628e8f037da55113486d5da4c1b64e3f0d0a8e79724ef44b4fb9b2eaab7a80375ccd7664ba17b5ee23666fa123abf5c9b9605a6bf55f6ae19c31cbc7362c13738e367f94c076160d0aff92873f678b65431d6f74dbbe5f3f14171a11a53e3b28bb929d71f9c76837fe2f2c39f7fb30791172d462f4127e2b40307a0f69eca60bae7872f4563273a71f52dca2de3e1457e26afbf4ae2d7136d555a5fb5c3361bdcaad6797a591344890676f977e2efe6dd16f70406761701172f778eff46e615579a150c06d09d65328174574c348cecce957c470c38799e56fcc6fc765988233b27667d742612910631d0ad368645ce3bf2f3f78126e02eaf6bdca5e4410a46a311b48f9e3e18224626964b62062cc15728c",
- "nonce" : "0x1d",
- "storage" : {
- }
- },
- "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
- "balance" : "0x09ad523585c698f7",
- "code" : "0x",
- "nonce" : "0x00",
- "storage" : {
- }
- }
- },
- "postStateRoot" : "18347b54b89250d51df639c5633c7d1b1e0a552e6a1b7611896d9266936c2760",
- "pre" : {
- "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
- "balance" : "0x181b2eb1",
- "code" : "0x795be1b1880ba0d1ff0b50d115c416fb7ac36fc9d2bea9f9e7212f75048cdab5287d75095451ab1623b6739fc0b8ca326281557c68443e5185640a16e727e1156afd6dde85dfe895f090e713f5c281b37862dfa4720b60f87ef7cbadac8540d09aed76138387554911aadac3a5a8ebdf110a8fbaf47cab627cb65114dda0080882a9bbbf030996a6bfcce67b166c10f4ae8744f4c25364bedb62f5dc62dbcf737fb65c90032ac39f5bb9a7cc2514e0d24576223d88eb1da8f2b4d662e5a15a20917589492203838bb3da4b917ca7f4db012c632664718f646a961415e56ddd89e36658376506465fec9e7d7c65884f506eb9a9385b971a7aa53f041eded63eee1ba5dfc91027a2b61c7b248926f5d5039d4c105223f40d2d2206e87ffd20ec11f679aad21087997432d0d35f8b338cbc888a01fbaa553e3e3da7bb2c5071b8366c71f9a5c374d8346f1c29425e3b84286c512965910ed7aa6a926e886ddc626b578a7ef9a2afdced2885db4f5c5953f0bebe2c4e5ce2405da32bc2579f44f7b403e5608985624501126e4143161502c97b9d2ee4f4e8a13b52715cc40d365cd8918db8143a5a8c1acf8d143264272ba8779b76d98fce1bb89d91b147eccd26106d2beb74ef5020dd29ec84",
- "nonce" : "0x1d",
- "storage" : {
- }
- },
- "945304eb96065b2a98b57a48a06ae28d285a71b5" : {
- "balance" : "0xd3e4b5453acbfee3",
- "code" : "0x6da51aee682e4234c81890984b0e4b7b41f0e7c796b0bd1cd5f6e5e199baac038263421acbb851aa4c4b1b9f7a9b3b743b2c7f9c4642a2b61b9a55afb602222425e3e03108bf45b97fe81d94d612bd6c5b626248a3530a35dbe19d46044e5b50a38adb316c0febaa766c129cfe93c1461f410a35bf7809701c7efde846604b5f1075effca115d6fba575f6918a83642ae3c735cf58a5a8f5322e751ce466bc92605179f08205d6bb8faaaafe6c619f0204364f0d72561e1bba35f7e0c36bcd0e092e722f150afda0c66b987179c196beec8ae01caa69bff6aaa360fff671757cf9af3eb4fbb5b10330c5e10cbd4d84da6e17dda20b75c62a75a1f959488a4c89d945f2fb0fd62797585d9285634b9dc43b72256256186abb01e4ad78e35eb2ae11a2a472dd7bcb68c0379810f5cc347f5961983375bbadb7034dc615d4933c5b824f6b44287407ef71b438b0f39fcdf17db3ddfb24284cd59458622163965146a446ea6f8bc358fff16222a8d6d00c670633fafe256c51a31675894fa42c335b5b3b239aa98776ba0fcc228b87d5d4ce61c6f77030e85b0a8fb206752d948d9116534991cc7382c04771759c38e322ba9bc4895a60521ba3541967f768231cbc7195aa6eea9ff5ae8850b1702f812f01a13af9668c25c7b46583767c240520e9a31e63589468e2a5bd94659e04cf24b6ec8fbf51497b3a5b0b690c2bdde61fc1ebd12bc2628e8f037da55113486d5da4c1b64e3f0d0a8e79724ef44b4fb9b2eaab7a80375ccd7664ba17b5ee23666fa123abf5c9b9605a6bf55f6ae19c31cbc7362c13738e367f94c076160d0aff92873f678b65431d6f74dbbe5f3f14171a11a53e3b28bb929d71f9c76837fe2f2c39f7fb30791172d462f4127e2b40307a0f69eca60bae7872f4563273a71f52dca2de3e1457e26afbf4ae2d7136d555a5fb5c3361bdcaad6797a591344890676f977e2efe6dd16f70406761701172f778eff46e615579a150c06d09d65328174574c348cecce957c470c38799e56fcc6fc765988233b27667d742612910631d0ad368645ce3bf2f3f78126e02eaf6bdca5e4410a46a311b48f9e3e18224626964b62062cc15728c",
- "nonce" : "0x1d",
- "storage" : {
- }
- },
- "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
- "balance" : "0x09ad523585c698f7",
- "code" : "0x",
- "nonce" : "0x00",
- "storage" : {
- }
- }
- },
- "transaction" : {
- "data" : "0x",
- "gasLimit" : "0x555ad932",
- "gasPrice" : "0x1c",
- "nonce" : "0x00",
- "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
- "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
- "value" : "0x4bb3714f2cb3263d"
- }
- }
-}
diff --git a/tests/files/StateTests/stPrecompiledContractsTransaction.json b/tests/files/StateTests/stPrecompiledContractsTransaction.json
new file mode 100644
index 000000000..afe63ad09
--- /dev/null
+++ b/tests/files/StateTests/stPrecompiledContractsTransaction.json
@@ -0,0 +1,1556 @@
+{
+ "CallEcrecover0" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x989680",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000001" : {
+ "balance" : "0x00",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0x7800",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7638800",
+ "code" : "0x",
+ "nonce" : "0x01",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "65ebea3d5e580a1ea587d73e5f783df701666286a974a3230be0b6530e559f34",
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c000000000000000000000000000000000000000000000000000000000000001c73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549",
+ "gasLimit" : "0x0493e0",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000001",
+ "value" : "0x00"
+ }
+ },
+ "CallEcrecover0_0input" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x989680",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000001" : {
+ "balance" : "0x00",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0x5dc0",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a763a240",
+ "code" : "0x",
+ "nonce" : "0x01",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "476d2eea2fcd5a24716ccfa88be2d668c76e5ba1245ec7d598097cd3c7f93045",
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "0x0493e0",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000001",
+ "value" : "0x00"
+ }
+ },
+ "CallEcrecover0_gas3000" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x989680",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "0x",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "517f2cdf6adb1a644878c390ffab4e130f1bed4b498ef7ce58c5addd98d61018",
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c000000000000000000000000000000000000000000000000000000000000001c73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549",
+ "gasLimit" : "0x0bb8",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000001",
+ "value" : "0x00"
+ }
+ },
+ "CallEcrecover1" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x989680",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000001" : {
+ "balance" : "0x00",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0x7800",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7638800",
+ "code" : "0x",
+ "nonce" : "0x01",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "65ebea3d5e580a1ea587d73e5f783df701666286a974a3230be0b6530e559f34",
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c000000000000000000000000000000000000000000000000000000000000000173b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549",
+ "gasLimit" : "0x0493e0",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000001",
+ "value" : "0x00"
+ }
+ },
+ "CallEcrecover2" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x989680",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000001" : {
+ "balance" : "0x00",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0x7744",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a76388bc",
+ "code" : "0x",
+ "nonce" : "0x01",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "32eb8e38bf1b80b641adb042c1f02d63ce94f9adc137e49ab65a21c5a67fadc5",
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c0073b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549",
+ "gasLimit" : "0x0493e0",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000001",
+ "value" : "0x00"
+ }
+ },
+ "CallEcrecover3" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x989680",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "0x000000000000000000000000e4319f4b631c6d0fcfc84045dbcb676865fe5e13",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000001" : {
+ "balance" : "0x00",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0x7800",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7638800",
+ "code" : "0x",
+ "nonce" : "0x01",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "65ebea3d5e580a1ea587d73e5f783df701666286a974a3230be0b6530e559f34",
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "2f380a2dea7e778d81affc2443403b8fe4644db442ae4862ff5bb3732829cdb9000000000000000000000000000000000000000000000000000000000000001b6b65ccb0558806e9b097f27a396d08f964e37b8b7af6ceeb516ff86739fbea0a37cbc8d883e129a4b1ef9d5f1df53c4f21a3ef147cf2a50a4ede0eb06ce092d4",
+ "gasLimit" : "0x0493e0",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000001",
+ "value" : "0x00"
+ }
+ },
+ "CallEcrecover80" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x989680",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "0x0000000000000000000000003f17f1962b36e491b30a40b2405849e597ba5fb5",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000001" : {
+ "balance" : "0x00",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0x7740",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a76388c0",
+ "code" : "0x",
+ "nonce" : "0x01",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "8a39e97c686803fe972417eccf2876ea9eca2f7ee52482e57660367fb2f6b903",
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "00c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c000000000000000000000000000000000000000000000000000000000000001c00b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f00b940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549",
+ "gasLimit" : "0x0493e0",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000001",
+ "value" : "0x00"
+ }
+ },
+ "CallIdentitiy_0" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x989680",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000004" : {
+ "balance" : "0x00",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0x52da",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a763ad26",
+ "code" : "0x",
+ "nonce" : "0x01",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "c04e2f7920bb9af44403b9abe11dfcc44c8fe94e3a0460c1dc1e01fe5e428578",
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "000000000000000000000000000000000000000000000000000000000000001",
+ "gasLimit" : "0x030d40",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000004",
+ "value" : "0x00"
+ }
+ },
+ "CallIdentitiy_1" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x989680",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "0x",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000004" : {
+ "balance" : "0x00",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0x5217",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a763ade9",
+ "code" : "0x",
+ "nonce" : "0x01",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "d7708ed0b16c93b5c1441ab208f76f7f48ef296e7539c146d3ad22063d9c49de",
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "0x030d40",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000004",
+ "value" : "0x00"
+ }
+ },
+ "CallIdentitiy_1_nonzeroValue" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x989680",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "0x",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000004" : {
+ "balance" : "0x13",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0x5217",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a763add6",
+ "code" : "0x",
+ "nonce" : "0x01",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "53b8792df74157546486804eb0cf115252120c6cf1b79c9fa79dd23ec237efed",
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "0x030d40",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000004",
+ "value" : "0x13"
+ }
+ },
+ "CallIdentitiy_2" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x989680",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "0x0000000000000000000000000000000000000000000000000000000000000000f34578907f",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000004" : {
+ "balance" : "0x00",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0x53f1",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a763ac0f",
+ "code" : "0x",
+ "nonce" : "0x01",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "a9cf0252a1984b4a8618f692c3df1386f2e2f92e9590f4e2397ed3af4ba04d4b",
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "0000000000000000000000000000000000000000000000000000000000000000f34578907f",
+ "gasLimit" : "0x030d40",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000004",
+ "value" : "0x00"
+ }
+ },
+ "CallIdentitiy_3" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x989680",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "0x000000000000000000000000000000000000000000000000000000f34578907f0000000000",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000004" : {
+ "balance" : "0x00",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0x53f1",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a763ac0f",
+ "code" : "0x",
+ "nonce" : "0x01",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "a9cf0252a1984b4a8618f692c3df1386f2e2f92e9590f4e2397ed3af4ba04d4b",
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "000000000000000000000000000000000000000000000000000000f34578907f0000000000",
+ "gasLimit" : "0x030d40",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000004",
+ "value" : "0x00"
+ }
+ },
+ "CallIdentitiy_4" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x989680",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000004" : {
+ "balance" : "0x00",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0x5a9a",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a763a566",
+ "code" : "0x",
+ "nonce" : "0x01",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "26d88956e24488d4aca78adf402dfb7bfc876decb343cbee56dad7042fafae81",
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "gasLimit" : "0x030d40",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000004",
+ "value" : "0x00"
+ }
+ },
+ "CallIdentitiy_4_gas17" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x989680",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "0x",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0x5a88",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a763a578",
+ "code" : "0x",
+ "nonce" : "0x01",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "83ca393c8b9cab5f8c84c31beeb22351796d703a2f03733e420bca97597de906",
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "gasLimit" : "0x5a88",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000004",
+ "value" : "0x00"
+ }
+ },
+ "CallIdentitiy_5" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x989680",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "#35659",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000004" : {
+ "balance" : "0x00",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0x029494",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7616b6c",
+ "code" : "0x",
+ "nonce" : "0x01",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "4989c35b1e3c63ec64b9609233403c5d2801db0b80e67ff0020acce34f87e2dc",
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "gasLimit" : "0x030d40",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000004",
+ "value" : "0x00"
+ }
+ },
+ "CallRipemd160_0" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x989680",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "0x000000000000000000000000ae387fcfeb723c3f5964509af111cf5a67f30661",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000003" : {
+ "balance" : "0x00",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0x5598",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a763aa68",
+ "code" : "0x",
+ "nonce" : "0x01",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "4142e87e6faee33e5cb27673181220b5913f5472b456d4729df97c2c461d5f64",
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "000000000000000000000000000000000000000000000000000000000000001",
+ "gasLimit" : "0x030d40",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000003",
+ "value" : "0x00"
+ }
+ },
+ "CallRipemd160_1" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x989680",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "0x0000000000000000000000009c1185a5c5e9fc54612808977ee8f548b2258d31",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000003" : {
+ "balance" : "0x00",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0x5460",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a763aba0",
+ "code" : "0x",
+ "nonce" : "0x01",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "e024631bdbee5ed624471c7b187275debb777717eb93c67b991fca1eff55f1f3",
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "0x030d40",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000003",
+ "value" : "0x00"
+ }
+ },
+ "CallRipemd160_2" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x989680",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "0x000000000000000000000000dbc100f916bfbc53535573d98cf0cbb3a5b36124",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000003" : {
+ "balance" : "0x00",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0x5724",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a763a8dc",
+ "code" : "0x",
+ "nonce" : "0x01",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "6f0d0f570c3ea3dce57553555b4ef7347692a90c13f6520b36a6b5bf00c1c3ad",
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "0000000000000000000000000000000000000000000000000000000000000000f34578907f",
+ "gasLimit" : "0x030d40",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000003",
+ "value" : "0x00"
+ }
+ },
+ "CallRipemd160_3" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x989680",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "0x000000000000000000000000316750573f9be26bc17727b47cacedbd0ab3e6ca",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000003" : {
+ "balance" : "0x00",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0x5724",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a763a8dc",
+ "code" : "0x",
+ "nonce" : "0x01",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "6f0d0f570c3ea3dce57553555b4ef7347692a90c13f6520b36a6b5bf00c1c3ad",
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "000000000000000000000000000000000000000000000000000000f34578907f0000000000",
+ "gasLimit" : "0x030d40",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000003",
+ "value" : "0x00"
+ }
+ },
+ "CallRipemd160_4" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x989680",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "0x0000000000000000000000001cf4e77f5966e13e109703cd8a0df7ceda7f3dc3",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000003" : {
+ "balance" : "0x00",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0x5d58",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a763a2a8",
+ "code" : "0x",
+ "nonce" : "0x01",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "ae3ed6ba314a058bcae04c9784bae9fb5189c8a587b5faf6f76a9641822721cb",
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "gasLimit" : "0x030d40",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000003",
+ "value" : "0x00"
+ }
+ },
+ "CallRipemd160_5" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x989680",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "0x",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0x030d40",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a760f2c0",
+ "code" : "0x",
+ "nonce" : "0x01",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "b09a08a79e7d94f0f602fd28335abba0a7a9596614c7165508eb829994fdef29",
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "gasLimit" : "0x030d40",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000003",
+ "value" : "0x00"
+ }
+ },
+ "CallSha256_0" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x989680",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "0xec4916dd28fc4c10d78e287ca5d9cc51ee1ae73cbfde08c6b37324cbfaac8bc5",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000002" : {
+ "balance" : "0x00",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0x5310",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a763acf0",
+ "code" : "0x",
+ "nonce" : "0x01",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "eeca38e090fd543d6b0a98b29da4897668a938553f2f0635fd16f18aba9feb6e",
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "000000000000000000000000000000000000000000000000000000000000001",
+ "gasLimit" : "0x0493e0",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000002",
+ "value" : "0x00"
+ }
+ },
+ "CallSha256_1_nonzeroValue" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x989680",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000002" : {
+ "balance" : "0x13",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0x5244",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a763ada9",
+ "code" : "0x",
+ "nonce" : "0x01",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "ee52cd49848866b9ed38c4842f4fbbd1861ba63a7242484d61001737485666fa",
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "0x030d40",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000002",
+ "value" : "0x13"
+ }
+ },
+ "CallSha256_2" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x989680",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "0xcb39b3bde22925b2f931111130c774761d8895e0e08437c9b396c1e97d10f34d",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000002" : {
+ "balance" : "0x00",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0x5430",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a763abd0",
+ "code" : "0x",
+ "nonce" : "0x01",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "ac7b1816d2da72ba4fbb4174393baf50044ec0fd48de527b68c5fe401722094c",
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "0000000000000000000000000000000000000000000000000000000000000000f34578907f",
+ "gasLimit" : "0x030d40",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000002",
+ "value" : "0x00"
+ }
+ },
+ "CallSha256_3" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x989680",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "0x7392925565d67be8e9620aacbcfaecd8cb6ec58d709d25da9eccf1d08a41ce35",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000002" : {
+ "balance" : "0x00",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0x5430",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a763abd0",
+ "code" : "0x",
+ "nonce" : "0x01",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "ac7b1816d2da72ba4fbb4174393baf50044ec0fd48de527b68c5fe401722094c",
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "000000000000000000000000000000000000000000000000000000f34578907f0000000000",
+ "gasLimit" : "0x030d40",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000002",
+ "value" : "0x00"
+ }
+ },
+ "CallSha256_4" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x989680",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "0xaf9613760f72635fbdb44a5a0a63c39f12af30f950a6ee5c971be188e89c4051",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000002" : {
+ "balance" : "0x00",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0x5ad0",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a763a530",
+ "code" : "0x",
+ "nonce" : "0x01",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "558346ba263129da8c829daed548c281c17468424f9e050ffbd4e32f2649f6db",
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "gasLimit" : "0x030d40",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000002",
+ "value" : "0x00"
+ }
+ },
+ "CallSha256_5" : {
+ "env" : {
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x989680",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "0x259911ec9f4b02b7975dfa3f5da78fc58b7066604bdaea66c4485c90f6f55bec",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000002" : {
+ "balance" : "0x00",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0x02bbf4",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a761440c",
+ "code" : "0x",
+ "nonce" : "0x01",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "7aed225ae51cb8558108fe3749adf375b1ee53f5cf2611adc33af187100138f7",
+ "pre" : {
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "0x0de0b6b3a7640000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "gasLimit" : "0x030d40",
+ "gasPrice" : "0x01",
+ "nonce" : "0x00",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "to" : "0000000000000000000000000000000000000002",
+ "value" : "0x00"
+ }
+ },
+ "callTxToPrecompiled_1" : {
+ "env" : {
+ "currentCoinbase" : "aa69d40e4ab383b25fa6c17560dd77b387480dd8",
+ "currentDifficulty" : "0x0100",
+ "currentGasLimit" : "0x0f4240",
+ "currentNumber" : "0x00",
+ "currentTimestamp" : "0x01",
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
+ },
+ "expectOut" : "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "logs" : [
+ ],
+ "out" : "0x",
+ "post" : {
+ "0000000000000000000000000000000000000001" : {
+ "balance" : "0x0a968163f0a57b400001",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "aa69d40e4ab383b25fa6c17560dd77b387480dd8" : {
+ "balance" : "0x0354a6ba7a180000",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "cd2a3d9f938e13cd947ec05abc7fe734df8dd826" : {
+ "balance" : "0x152d02c7e14af6800000",
+ "code" : "0x",
+ "nonce" : "0x32",
+ "storage" : {
+ }
+ }
+ },
+ "postStateRoot" : "8d4497a68edae0264b8f36c9f508f625bd4cf980b1bf2946822287814537df96",
+ "pre" : {
+ "0000000000000000000000000000000000000001" : {
+ "balance" : "0x01",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "aa69d40e4ab383b25fa6c17560dd77b387480dd8" : {
+ "balance" : "0x00",
+ "code" : "0x",
+ "nonce" : "0x00",
+ "storage" : {
+ }
+ },
+ "cd2a3d9f938e13cd947ec05abc7fe734df8dd826" : {
+ "balance" : "0x1fc3878078aaebd80000",
+ "code" : "0x",
+ "nonce" : "0x31",
+ "storage" : {
+ }
+ }
+ },
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "0x09965e",
+ "gasPrice" : "0x09184e72a000",
+ "nonce" : "0x31",
+ "secretKey" : "c85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4",
+ "to" : "0000000000000000000000000000000000000001",
+ "value" : "0x0a968163f0a57b400000"
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/files/VMTests/RandomTests/vm201506052232CPPJIT.json b/tests/files/VMTests/RandomTests/vm201506052232CPPJIT.json
deleted file mode 100644
index 23dff8468..000000000
--- a/tests/files/VMTests/RandomTests/vm201506052232CPPJIT.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "randomVMTest" : {
- "env" : {
- "currentCoinbase" : "2a19049af61869dd2c46a9ee85c6662ab9fb1458",
- "currentDifficulty" : "0xa580ed81be2ef840",
- "currentGasLimit" : "0xf35d3ad90aa14c5c",
- "currentNumber" : "0x7ff6bd68c54c031e",
- "currentTimestamp" : "0x1b3cf4b5c24c6ecf",
- "previousHash" : "2e1533355813afa2f1d0e6dbbd0310aeb0cd36aa66348fff9fbd6eb34c1ecacd"
- },
- "exec" : {
- "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
- "caller" : "a8333c288c297fe274ecc7edd645184521802e53",
- "code" : "0x786e80ee51f42664c295675108206cc067ed31e903b915360ff073ee0fa83f70b122d692e31a01dff3593131db74886741f68e9b67c9e30b678778fe65c891605f7d59771f14031bd5d1617fc5a380fd51f9b0ff0a8e850f030c9e5ee96b717f71d0e54365e9ee8f7ab8a494864c1a837dfab57c12194fa7e8e290cb976f57b2d1ab30edee6a7eba2b1a96717b7f2ada6765fdfea367668c6496cbe2c6bc6b166bf1cc2f16edea7a5a1537764f6eb0d092088df6cbfdc38f21e2e860c857b0643746e573322425fd5ac184b3fcebef7a01478c2687636363753c221569415eef55bee95837c985faff2f8fa63413307c4997f09f3535bae3c945c9048ef4610132d22fab681421b17df4e513b08d686dafc9add05f3c1c9e67aa9026c4c80e9162671ad819b3cb577296703876d00b55f0fe0cdd0397aebbda50d8776a2ab57767cfb29342525ab07db7a61afe3be57ea76387b38358b1a4849bedd12b96ede30fbaa67f917f27857d424f9bc7ec6444384e1b51837d2cf0ad5d9f168ef78c9faf89ab3b23de8561ace07f13a599ffccc1757e625ae802fac4090ea66b1081cd5f3b6368f566b58326439d6a1f7cee083baf4e2b338bff75e0f9df9b6b93b5f4f93e603dec176ae21ed1448737367e6c599af40bc33863dcdde9be9295cafc7d5e3a64d3d48f3bd676c8a5b916a970b4f9e1ce1bfaa9beaee29c156c42d87c027e6f7e825a69ad9f470dc95be137088dff8d3e83470a79181686af7705a21af376ac9212365948ba4b9b4080584d8cb49c5644cce1f7863372787f18084708f611439d3731659377c532a5d57611a0da65876997e113a59a172b089c544743b7295cd9897c79724aca53b2dab706cf0f24978e9248c810efebbb9597e4c84dba56166966d73c50f13b52995d4b7908ef6ccd9989eeed8262326eeb52bfbfefb06f63cd8cfb753c4f7128f85c7982b7274024f44b798ececa14833a746c1f22dd0b0e8b3fac838fb740987c1229beb42cd6657be2444022629f6893d90811f9bdd579b76995d77ab8902b2fed40ca67b021adb6b19a7010a174909136ecb5f288334837d5d3ffece95aba2f4aec886247c70e771ba1bb7b61644fb1820a5920f79c2b7284d649d93aad11526383f25a66660f5c96548ff45fa370e8502ccd980f63493fde0cc1d15140e3a36f8289606c9e969b9d04176a7b9611a6ec557d1bd9ef4a2026b2a984c4059256770b602f863bcc10543f7560fb6da0984e7fa7a7d1dcf42d13106d02af71f80463d4e4644c4e550bdc865cea601ac921e9e97bf4906dd9e3513cdddb479bf49965c1c639de0c5680dbdb66f8cc2d9b6901f0ea0804d48380c901616b626db25146fd8d1849f9ae81e378ba2e768c5544bad7b8f1fa092df1e8eb2c6aa92cfddf3c309f466a165725a98cd034cb19caef9670a16730dc9f35958d087dca07f0a5e743226442de788c4f077f07d7c75ab5dd8173da4c44b9d60a452435c09689706cab8bd8c5cf5c4184cb99722ea485c07c83e1e3b5179ecbfed644e4e1c90d0165847383e380cd61b88a645a849ad91c08",
- "data" : "0x6c9e88e10a667b3c988590b7e4977bfc7c6fe83e72065b12020e88681ef360d8575f9a945e16ea892aead5745552de8c2c0997f98a55b933548bf73fb90c6cefe360387fe0764cf7a3e04d8a90212bb81b487e7d9148a4cf36e968be6686d1433d4bc5a36d313c62c4c210ef894920b1fc2b126beaa7d585feb9e8a332e19d2f77e65f28d3959701e333c005e157bdeba414db2894f19876c1631b7dbde067d64a91a083ec9e376b759f9652a8b2bde23d4c31ba725fa02532b023a4c6480163b9ecdfd1f655b4386886f6a48f4f878b85dd8c656c0c808acaac60fa675643bdf5a7262a9d74889473ede78cffe05a8068de215371508e34c97b2d7fb93550c36bbd4177d74da227ee3e9098aef548287a9fcfc4333d40f87f2f326d787814cbedd3aaae8ecbabee2d4107e6a67a6942c63e788b5b8167f6958156d33952a763121e11ca7d952315ec4124944a72e93ffbeac7f958480ca7d32830c35e510bd1b9bbc567a02dc4c510e7b6e060017c483eeef66d397ed1dfea752c7fd8ceca11059d83cb81191afdef0552c06e42d722d894fa394f64e84628395eef67094b74b4439920828d63beafd6e861903c55614f20714eee5f80e19967ec73ce5d0be3eb47215bed79604303854d69c0d401b04616d6de839011812a14a3b6c8357ac86ab39062a3f13e6da2dd1e837eb2517707baac4a3e54d7bbde47b078e6f444d6cd5a5fbd26ba61ab5153e5c384",
- "gas" : "0xb44b0c6ba708e0d1",
- "gasPrice" : "0x1c",
- "origin" : "567f2d84e28d698cb2a8de521ffe23987de1859c",
- "value" : "0x601add3c"
- },
- "pre" : {
- "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
- "balance" : "0x37b29d44",
- "code" : "0x786e80ee51f42664c295675108206cc067ed31e903b915360ff073ee0fa83f70b122d692e31a01dff3593131db74886741f68e9b67c9e30b678778fe65c891605f7d59771f14031bd5d1617fc5a380fd51f9b0ff0a8e850f030c9e5ee96b717f71d0e54365e9ee8f7ab8a494864c1a837dfab57c12194fa7e8e290cb976f57b2d1ab30edee6a7eba2b1a96717b7f2ada6765fdfea367668c6496cbe2c6bc6b166bf1cc2f16edea7a5a1537764f6eb0d092088df6cbfdc38f21e2e860c857b0643746e573322425fd5ac184b3fcebef7a01478c2687636363753c221569415eef55bee95837c985faff2f8fa63413307c4997f09f3535bae3c945c9048ef4610132d22fab681421b17df4e513b08d686dafc9add05f3c1c9e67aa9026c4c80e9162671ad819b3cb577296703876d00b55f0fe0cdd0397aebbda50d8776a2ab57767cfb29342525ab07db7a61afe3be57ea76387b38358b1a4849bedd12b96ede30fbaa67f917f27857d424f9bc7ec6444384e1b51837d2cf0ad5d9f168ef78c9faf89ab3b23de8561ace07f13a599ffccc1757e625ae802fac4090ea66b1081cd5f3b6368f566b58326439d6a1f7cee083baf4e2b338bff75e0f9df9b6b93b5f4f93e603dec176ae21ed1448737367e6c599af40bc33863dcdde9be9295cafc7d5e3a64d3d48f3bd676c8a5b916a970b4f9e1ce1bfaa9beaee29c156c42d87c027e6f7e825a69ad9f470dc95be137088dff8d3e83470a79181686af7705a21af376ac9212365948ba4b9b4080584d8cb49c5644cce1f7863372787f18084708f611439d3731659377c532a5d57611a0da65876997e113a59a172b089c544743b7295cd9897c79724aca53b2dab706cf0f24978e9248c810efebbb9597e4c84dba56166966d73c50f13b52995d4b7908ef6ccd9989eeed8262326eeb52bfbfefb06f63cd8cfb753c4f7128f85c7982b7274024f44b798ececa14833a746c1f22dd0b0e8b3fac838fb740987c1229beb42cd6657be2444022629f6893d90811f9bdd579b76995d77ab8902b2fed40ca67b021adb6b19a7010a174909136ecb5f288334837d5d3ffece95aba2f4aec886247c70e771ba1bb7b61644fb1820a5920f79c2b7284d649d93aad11526383f25a66660f5c96548ff45fa370e8502ccd980f63493fde0cc1d15140e3a36f8289606c9e969b9d04176a7b9611a6ec557d1bd9ef4a2026b2a984c4059256770b602f863bcc10543f7560fb6da0984e7fa7a7d1dcf42d13106d02af71f80463d4e4644c4e550bdc865cea601ac921e9e97bf4906dd9e3513cdddb479bf49965c1c639de0c5680dbdb66f8cc2d9b6901f0ea0804d48380c901616b626db25146fd8d1849f9ae81e378ba2e768c5544bad7b8f1fa092df1e8eb2c6aa92cfddf3c309f466a165725a98cd034cb19caef9670a16730dc9f35958d087dca07f0a5e743226442de788c4f077f07d7c75ab5dd8173da4c44b9d60a452435c09689706cab8bd8c5cf5c4184cb99722ea485c07c83e1e3b5179ecbfed644e4e1c90d0165847383e380cd61b88a645a849ad91c08",
- "nonce" : "0xdf8278dd31cb2f9f",
- "storage" : {
- }
- }
- }
- }
-}
diff --git a/tests/files/VMTests/RandomTests/vm201506052232PYTHON.json b/tests/files/VMTests/RandomTests/vm201506052232PYTHON.json
deleted file mode 100644
index a7ab156dc..000000000
--- a/tests/files/VMTests/RandomTests/vm201506052232PYTHON.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
- "randomVMTest" : {
- "callcreates" : [
- ],
- "env" : {
- "currentCoinbase" : "0be8022b1ae5972ff97a26cc93a11b3c7a032051",
- "currentDifficulty" : "0x03ee2ae29a756db1",
- "currentGasLimit" : "0x0a2c82c727d04f35",
- "currentNumber" : "0x8ae87d8b161c0815",
- "currentTimestamp" : "0x3c528969",
- "previousHash" : "59b8fbf3daf8e7b0b7861903ccac78df70a3597efc6a83e399df5f1ec66b3fca"
- },
- "exec" : {
- "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
- "caller" : "2f957a4c7c7f0b66c79e12cccae139582a9f151a",
- "code" : "0x7ef2d6d7b79440ef574194a59fed6c1c426b6af9f69da960a15643fdea890eed157e6ff60939c55c7d2888ce86eac4bd5432c79ae0ea7b8f3c9d13a9d76f29cc0b72e939c2be440936dfc4a25ce2f799f7ad3938c19065ce245402fef1547a2bc053a7b89ad18f28dc0ee57b67ec43af5f909b419b37a2bdd1ec7125cf4d08f58748cfde2aea18a0a0c6f5188f07",
- "data" : "0x307b4badfcb3016a9d2b7ef4d134303d26d2e9a2abb1545e307ace7b028d7e65dcdaf6dcac4e47cd198ab2361759e480ec5b38b6a1fc076b055dbe94253261b55a683f20b0e44a6410277967a2e3f80a2b998ff66d99665ecb047566387545faa77e999478cfb57f3979453d4e7988a36dbac16de9ea674fa539b8b5f8aa197d7d2e0d1c03d02e4348a9509e5ee7e12ba09a634ea259c6266c49adae8e0177c51b5ebadea846aa62dc3491f00c8038eb7eaa172fb45f17799ea2e827c4dc525586cc26d2bfdf827a86aace51d3486097d96a6254f68771d0fafcac2feddd943074d5735d5c15805ee484347bab516727e58d4816d0b379b97ab544415fd9c53aee4e330b8806a7d77e685149446c89c4111c98df704476a33d3561a813a1f729b8cb44d395d105500763fabc3f366ce2b4daf22b376437e7514687506b80c077848f8018189676ed2d7c0394716c2a555bf5d66b3e2a121025bacec8714c1787676478d3a907796ce9f4f55f41b2d61210dbaab2c37f37854e1ce5768af80f19a370d843f0175f81629e0c4ea7e8510db964ad3b94c66224f4b286684d8a0b72d1b71ac5e7777096d55e05ed1248e018a72bc3dd22020290c8ad9fae0f5b639decb2db6393ab2f4b6e2a91b4a996844a2b3509e9ceea03026a9d4e5e230440ec3e633429946b7ea3a380537a1e7190ea161368a83aa8662f4aab43112036",
- "gas" : "0x807e02307eb73db4",
- "gasPrice" : "0x1d",
- "origin" : "c034c75a8fbe48573a478426b124bf4b388f86f3",
- "value" : "0xb6bc4cd2ce8fc6cd"
- },
- "gas" : "0x807e02307eb73db4",
- "logs" : [
- ],
- "out" : "0x",
- "post" : {
- "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
- "balance" : "0x55d1d81c",
- "code" : "0x7ef2d6d7b79440ef574194a59fed6c1c426b6af9f69da960a15643fdea890eed157e6ff60939c55c7d2888ce86eac4bd5432c79ae0ea7b8f3c9d13a9d76f29cc0b72e939c2be440936dfc4a25ce2f799f7ad3938c19065ce245402fef1547a2bc053a7b89ad18f28dc0ee57b67ec43af5f909b419b37a2bdd1ec7125cf4d08f58748cfde2aea18a0a0c6f5188f07",
- "nonce" : "0xa10eb3ed88a2d9d7",
- "storage" : {
- }
- }
- },
- "pre" : {
- "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
- "balance" : "0x55d1d81c",
- "code" : "0x7ef2d6d7b79440ef574194a59fed6c1c426b6af9f69da960a15643fdea890eed157e6ff60939c55c7d2888ce86eac4bd5432c79ae0ea7b8f3c9d13a9d76f29cc0b72e939c2be440936dfc4a25ce2f799f7ad3938c19065ce245402fef1547a2bc053a7b89ad18f28dc0ee57b67ec43af5f909b419b37a2bdd1ec7125cf4d08f58748cfde2aea18a0a0c6f5188f07",
- "nonce" : "0xa10eb3ed88a2d9d7",
- "storage" : {
- }
- }
- }
- }
-}
diff --git a/tests/files/VMTests/RandomTests/vm201506060003CPPJIT.json b/tests/files/VMTests/RandomTests/vm201506060003CPPJIT.json
deleted file mode 100644
index 6171276b8..000000000
--- a/tests/files/VMTests/RandomTests/vm201506060003CPPJIT.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "randomVMTest" : {
- "env" : {
- "currentCoinbase" : "0000000000000000000000000000000000000000",
- "currentDifficulty" : "0x02993b26",
- "currentGasLimit" : "0x5cf6486317fdb885",
- "currentNumber" : "0x7d3c9c2de89b2de8",
- "currentTimestamp" : "0xb841e027096ca4e2",
- "previousHash" : "80a7432990555a8058fb2aeeb2c9a87c3fdcc9d8d3fd372cdb07a40fd56991e1"
- },
- "exec" : {
- "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
- "caller" : "7b646fbc38356d7ef9275d8940dcfa08d73951fd",
- "code" : "0x7a6bd87691782526a69d0e8b0660d2d1158903d5b7efc9636ab2ef037ab1ba18347fe3f9a4aec5538e8292a6bccc210453571f02a576eab0556980750dabe791355ade04720c6945461bab9f0146c92541b57ca9dcd1448a79a630fb6d8335571fc733b6f604dd4b9872265f940ac36ee4bb436a780b7ed4dbb81b7e9a28827f2f68b9f03392ac83d0b7e45a814a4b9decf445cac3ccffca647ff87e43453b09609968bd5936225a6196edba626e6a718769bfe5795c4a9ba98c60bb63d52beda40b7cd7ea7e766fe9c9e75bdfb2c5738dcced61111a8258dc764b53d910f7da607403718dfc6c5aa7db8b32d21fcdff0ee87721abc760616dfc91e76b77618207579a7dc31ea97c46d9cf868aaa1ccba2c76d0570c0435896a1a6a0037e82580d2af831d8a2",
- "data" : "0x",
- "gas" : "0x9606430e52c4d31a",
- "gasPrice" : "0x1c",
- "origin" : "14cb9f799b1b93210da7682ef34f28731d041637",
- "value" : "0x23cb9da58e490f35"
- },
- "pre" : {
- "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
- "balance" : "0x496e8fc2",
- "code" : "0x7a6bd87691782526a69d0e8b0660d2d1158903d5b7efc9636ab2ef037ab1ba18347fe3f9a4aec5538e8292a6bccc210453571f02a576eab0556980750dabe791355ade04720c6945461bab9f0146c92541b57ca9dcd1448a79a630fb6d8335571fc733b6f604dd4b9872265f940ac36ee4bb436a780b7ed4dbb81b7e9a28827f2f68b9f03392ac83d0b7e45a814a4b9decf445cac3ccffca647ff87e43453b09609968bd5936225a6196edba626e6a718769bfe5795c4a9ba98c60bb63d52beda40b7cd7ea7e766fe9c9e75bdfb2c5738dcced61111a8258dc764b53d910f7da607403718dfc6c5aa7db8b32d21fcdff0ee87721abc760616dfc91e76b77618207579a7dc31ea97c46d9cf868aaa1ccba2c76d0570c0435896a1a6a0037e82580d2af831d8a2",
- "nonce" : "0x30a3e8694ecb08fe",
- "storage" : {
- }
- }
- }
- }
-}
diff --git a/tests/files/VMTests/RandomTests/vm201506060003PYTHON.json b/tests/files/VMTests/RandomTests/vm201506060003PYTHON.json
deleted file mode 100644
index 5363cbf4d..000000000
--- a/tests/files/VMTests/RandomTests/vm201506060003PYTHON.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
- "randomVMTest" : {
- "callcreates" : [
- ],
- "env" : {
- "currentCoinbase" : "cf90bea4a39ca7a018beb203c84161b27c92813a",
- "currentDifficulty" : "0xca27782e6f34fa0b",
- "currentGasLimit" : "0xedb3a183d3febe2c",
- "currentNumber" : "0xb17ec317aa876050",
- "currentTimestamp" : "0x564ceda9b9662639",
- "previousHash" : "2a778d568763caf8da3a5a243b1aa20bbd9597ee949b787d577e44243ca63136"
- },
- "exec" : {
- "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
- "caller" : "a71dfcc90e7b90a0d9745c586f98f746d1e2790c",
- "code" : "0x7d11f02e17bc84bc6cd96b4772835f489f3d239b32c4a66036f012569e6cfc6d893bfd55b1d2f0eada73b993708267b971033d30c37597724be6bb49508a4a5a3e5acc99c0e1599583cd2f6ddf92b6142fc8a7411082f38d19826d442a16a380c175f9f3b7a388528f6178e77a1e2c9c3fd334e06e3a5cebe5fa374cc7bacaa6b5b9183da85c4ba7799c6d52d857e4acb873d310255f995445d3cc0ac1a696fd4dec047b9eee68350e4c6f46206780eee6faa58911b17140b813f76fd4954f556e5a64beefa3cf9fc4b068a9fd4b9a927710088a9ecfbf32594a7ae942834b3da35f9bb0ddb819b7b072d8050cdba63c5d63646d87082e0c02b990064b75b33313b5d129e2ed35b666b5d09159a6d81aa66a25f47ecfef8f9b22a9be0d929ce9c5a3514689f9ae2a36b014a171191b5077b202d672c16221fe92040ce4acdaec661419675e15f9359e74613291b9bc2c7b98bac3c67fd269c467b97634e1f676d2ca314b1160325dcf51fbe6838016dc209ad3c2b7e0107d8ef1f6d0c74411a1a15cd79c237265d234a6b18dd9eae184c8fca5396ec09164643ed58dd16a7e403cd47f6cb7fdd556c7780431b7d95b5e1bcb854550f0b4a0c86129704d92737596d78b7c29f45f57f4fdf3f53b93958409036cb7fc873839a189a483fa6421035763355e3a6f7b368bad4b8f1b9f57987a46fbfe46a8047e164a3e4a9417036782ccd88560ae659217af196ba66791661ee7044ec0b579b69757e45ebc518c5bee224a4c677cd0312ad49a975c0ff992c26fa4e21409c508c3197feb40e7471e4ff67753c9cff00b0afc96489230708273084569d13930820ac42b7f901ea066121faef9c98e8039130c4eeb4212e4dab6399248b395739de01e9f7964ca5d25f8908760a37e4e4e94cbf378470a1b947f4dbf9fe1ade4e0c15697c6aafccff45520d5e82c6a95d94cea6f212e0fcc344d6ba6846f89d979e289b553aeb676160dc78e467df21bfaa6a55f89be01f726acba9a95b5e46911bb9a5aa8081ac6edb7710eaaf8e87ef307b310d0cb0666541086ee627b72021a9a3647728c2782927eec8a37449a5838f6d1d80f3d98b6e41a74ac98525dba7d24252c3020aab452947d89a671536b6696e7e41c9beeba717c9c19d850c36ff56737eb4a8669ede2dd2268f549138e6a27387bba7bb9400d59082c859d3593296f4f4f80fd24ef80144687590b839fa75876f497d02bf4dc08f675a48d9aadf4a1edd6c7265b88710c79b8d07d14dfacc61e95d2290c32f82a8d58a9b76520fe6afddaef70f797c29ad897f3f8c2bb3e40f7bf8746b48f7feaec9b9cbfb83add0a08ab742cdc4190821b074f1a443e1f4b6e9df0d1f710cb7088beaaa17c21a97965072e19898507d5fc106589fd7fbc08b46e4c75b137dafb7b509fe9a9ff018bbc05",
- "data" : "0x76655643161db5cdec6073fce4e12c9913574503f154c80962cde5cf70921635bf8b0b91deec7f731db8ba0ce18b3744703af0c573d762a25ccc96ef230889018cad60b465aac2670237c568ea0592f6cecc571ed8784a6048707de2010a6356fd6315e6ad44d6a163b2ef4a45df4e7d2be19235b5ce5fbf709201c0065a713834469f80349639a69e4a6881c998614b8b65bcbb1b5b997875eb6c9625098135f3f64faa4a3895227cce74dea82aa76af8897b606c0fe048ae7fa47be9f5fa49a124451d6f5f756d0b91c2271e487e341ad48f1d2007dd3f79e7ee3159989344db2317ee0b28518aca787b056c93c5307105f36bc441a6e35147e1cc0eae204974e811ace43c6b49bd5da71b1f894442bdd18b7b476176d19a55a6f4670da12a60ea0f45c408ee7004d5fa0a37989d647e60c814547cd86623f56c7b9c9e5054a8d33e2eb547964268aeb4b6c7a5ae6a2f62dd6a7b8aabbb34492f75bf2bef79a53e76dd965c46fa6ad1ed4db321cc7232d2bed7157e4d14c6b366d2d26f4d55f8e17870576917ba17085af297fd4cfb6b26e64138cd384730d9313277054b7530c688ebcfc06ef8ad568f92d720b445cb12918c596b65796367c625eb52661d3c4c96",
- "gas" : "0x439ee47c",
- "gasPrice" : "0x1d",
- "origin" : "71134870cb1a7f4e4235d2be6918cf43a68eec35",
- "value" : "0xe74255e5d9cc1cd7"
- },
- "gas" : "0x439ee47c",
- "logs" : [
- ],
- "out" : "0x",
- "post" : {
- "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
- "balance" : "0x04667f01",
- "code" : "0x7d11f02e17bc84bc6cd96b4772835f489f3d239b32c4a66036f012569e6cfc6d893bfd55b1d2f0eada73b993708267b971033d30c37597724be6bb49508a4a5a3e5acc99c0e1599583cd2f6ddf92b6142fc8a7411082f38d19826d442a16a380c175f9f3b7a388528f6178e77a1e2c9c3fd334e06e3a5cebe5fa374cc7bacaa6b5b9183da85c4ba7799c6d52d857e4acb873d310255f995445d3cc0ac1a696fd4dec047b9eee68350e4c6f46206780eee6faa58911b17140b813f76fd4954f556e5a64beefa3cf9fc4b068a9fd4b9a927710088a9ecfbf32594a7ae942834b3da35f9bb0ddb819b7b072d8050cdba63c5d63646d87082e0c02b990064b75b33313b5d129e2ed35b666b5d09159a6d81aa66a25f47ecfef8f9b22a9be0d929ce9c5a3514689f9ae2a36b014a171191b5077b202d672c16221fe92040ce4acdaec661419675e15f9359e74613291b9bc2c7b98bac3c67fd269c467b97634e1f676d2ca314b1160325dcf51fbe6838016dc209ad3c2b7e0107d8ef1f6d0c74411a1a15cd79c237265d234a6b18dd9eae184c8fca5396ec09164643ed58dd16a7e403cd47f6cb7fdd556c7780431b7d95b5e1bcb854550f0b4a0c86129704d92737596d78b7c29f45f57f4fdf3f53b93958409036cb7fc873839a189a483fa6421035763355e3a6f7b368bad4b8f1b9f57987a46fbfe46a8047e164a3e4a9417036782ccd88560ae659217af196ba66791661ee7044ec0b579b69757e45ebc518c5bee224a4c677cd0312ad49a975c0ff992c26fa4e21409c508c3197feb40e7471e4ff67753c9cff00b0afc96489230708273084569d13930820ac42b7f901ea066121faef9c98e8039130c4eeb4212e4dab6399248b395739de01e9f7964ca5d25f8908760a37e4e4e94cbf378470a1b947f4dbf9fe1ade4e0c15697c6aafccff45520d5e82c6a95d94cea6f212e0fcc344d6ba6846f89d979e289b553aeb676160dc78e467df21bfaa6a55f89be01f726acba9a95b5e46911bb9a5aa8081ac6edb7710eaaf8e87ef307b310d0cb0666541086ee627b72021a9a3647728c2782927eec8a37449a5838f6d1d80f3d98b6e41a74ac98525dba7d24252c3020aab452947d89a671536b6696e7e41c9beeba717c9c19d850c36ff56737eb4a8669ede2dd2268f549138e6a27387bba7bb9400d59082c859d3593296f4f4f80fd24ef80144687590b839fa75876f497d02bf4dc08f675a48d9aadf4a1edd6c7265b88710c79b8d07d14dfacc61e95d2290c32f82a8d58a9b76520fe6afddaef70f797c29ad897f3f8c2bb3e40f7bf8746b48f7feaec9b9cbfb83add0a08ab742cdc4190821b074f1a443e1f4b6e9df0d1f710cb7088beaaa17c21a97965072e19898507d5fc106589fd7fbc08b46e4c75b137dafb7b509fe9a9ff018bbc05",
- "nonce" : "0xb75979942880750b",
- "storage" : {
- }
- }
- },
- "pre" : {
- "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
- "balance" : "0x04667f01",
- "code" : "0x7d11f02e17bc84bc6cd96b4772835f489f3d239b32c4a66036f012569e6cfc6d893bfd55b1d2f0eada73b993708267b971033d30c37597724be6bb49508a4a5a3e5acc99c0e1599583cd2f6ddf92b6142fc8a7411082f38d19826d442a16a380c175f9f3b7a388528f6178e77a1e2c9c3fd334e06e3a5cebe5fa374cc7bacaa6b5b9183da85c4ba7799c6d52d857e4acb873d310255f995445d3cc0ac1a696fd4dec047b9eee68350e4c6f46206780eee6faa58911b17140b813f76fd4954f556e5a64beefa3cf9fc4b068a9fd4b9a927710088a9ecfbf32594a7ae942834b3da35f9bb0ddb819b7b072d8050cdba63c5d63646d87082e0c02b990064b75b33313b5d129e2ed35b666b5d09159a6d81aa66a25f47ecfef8f9b22a9be0d929ce9c5a3514689f9ae2a36b014a171191b5077b202d672c16221fe92040ce4acdaec661419675e15f9359e74613291b9bc2c7b98bac3c67fd269c467b97634e1f676d2ca314b1160325dcf51fbe6838016dc209ad3c2b7e0107d8ef1f6d0c74411a1a15cd79c237265d234a6b18dd9eae184c8fca5396ec09164643ed58dd16a7e403cd47f6cb7fdd556c7780431b7d95b5e1bcb854550f0b4a0c86129704d92737596d78b7c29f45f57f4fdf3f53b93958409036cb7fc873839a189a483fa6421035763355e3a6f7b368bad4b8f1b9f57987a46fbfe46a8047e164a3e4a9417036782ccd88560ae659217af196ba66791661ee7044ec0b579b69757e45ebc518c5bee224a4c677cd0312ad49a975c0ff992c26fa4e21409c508c3197feb40e7471e4ff67753c9cff00b0afc96489230708273084569d13930820ac42b7f901ea066121faef9c98e8039130c4eeb4212e4dab6399248b395739de01e9f7964ca5d25f8908760a37e4e4e94cbf378470a1b947f4dbf9fe1ade4e0c15697c6aafccff45520d5e82c6a95d94cea6f212e0fcc344d6ba6846f89d979e289b553aeb676160dc78e467df21bfaa6a55f89be01f726acba9a95b5e46911bb9a5aa8081ac6edb7710eaaf8e87ef307b310d0cb0666541086ee627b72021a9a3647728c2782927eec8a37449a5838f6d1d80f3d98b6e41a74ac98525dba7d24252c3020aab452947d89a671536b6696e7e41c9beeba717c9c19d850c36ff56737eb4a8669ede2dd2268f549138e6a27387bba7bb9400d59082c859d3593296f4f4f80fd24ef80144687590b839fa75876f497d02bf4dc08f675a48d9aadf4a1edd6c7265b88710c79b8d07d14dfacc61e95d2290c32f82a8d58a9b76520fe6afddaef70f797c29ad897f3f8c2bb3e40f7bf8746b48f7feaec9b9cbfb83add0a08ab742cdc4190821b074f1a443e1f4b6e9df0d1f710cb7088beaaa17c21a97965072e19898507d5fc106589fd7fbc08b46e4c75b137dafb7b509fe9a9ff018bbc05",
- "nonce" : "0xb75979942880750b",
- "storage" : {
- }
- }
- }
- }
-}
diff --git a/tests/files/VMTests/RandomTests/vm201506060013CPPJIT.json b/tests/files/VMTests/RandomTests/vm201506060013CPPJIT.json
deleted file mode 100644
index 82a2d5ac9..000000000
--- a/tests/files/VMTests/RandomTests/vm201506060013CPPJIT.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "randomVMTest" : {
- "env" : {
- "currentCoinbase" : "189f58d5ef7bdb2935f8b8a698ef219e35994fe4",
- "currentDifficulty" : "0x84876928e87b41a4",
- "currentGasLimit" : "0x10cae8f1",
- "currentNumber" : "0x76ab7073955627fc",
- "currentTimestamp" : "0x166a82ef",
- "previousHash" : "d07ee68dc9a390888a872f4514886620645d13b85963f7b40dca99d85cd89788"
- },
- "exec" : {
- "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
- "caller" : "56447178c6607f47e0513e4d654e2bd0ec613a19",
- "code" : "0x70f5879c3a83ab5da815c1047edaa5bc22907aac3e4e9fbaeb5638b8c998b8b940675abbc89ed4c047b214f512a1601a3768d07c8d5dbfcc381cbb54745f1c0c9255866cd322f5b9af41893abe83276235517501ecf5a723d3f1fd9bdef48b5232fbfed97171029561651baa3b4bc71773148918649129910c4ca9615a93890fc144f61ab66461cee1e12576d274d5dce2cb206c05952913d7afc397cdc3180f21cf277b858c7c2bd7b821d468d08b6f03abb80fe34e6410c8781271243d3c956db1a20cd1e0e64192dca8213c150d7083ccf229cd085864fe558c6241034cf4637ac3d8f2b81ab24a90a7e93e3318b4e39f02c601b326fed43e41e02c63059b80e870c78e76f59d901014065ae7f8be5a85d210765e9a831b82164ce142b66a2628d6be7a9a8f449983b9c86c9ae88505bfd5130bcdf4c4622b69419017ce7c34a7f563c98e74cb7b55cc61aea40c4494d3e0d65f01962794ec7881784a68fb3f96217484b8aa3c1f605201742d41bc492397e3ae55706943644354df3d1f433028c1074249673a70a2a82c0a9ef15da6731f1d68239f07d20c6a1bc3ea2778f3782a6416957d38dead3c6f2dfb6cd6ed320e51eba8bca67abc2c52f258c695a517d211e86aab95d1bd3adbb69c3fe11e7e9dfdb156fad3d14a05f4e31191fa253893c607a76eda74ddaf54b8a30b0dc4745e8b5b99e822e1c593252bed47c387c232d8f7d88e9767584cabbd6bc265fd6381c9f6547cfd7305a2a371775a32c40df6356c63cfe46accbde2daf2aecc0a03f9c4a16ea895096cd7b30aaa2ac8e24406ddfb758a7db7c49c21fdbae054fda8269018c8cbd7d50c215b7abc10298e7d51509b721708edfcc9af27bcf1f788fcc5f1b52f09c56dd606f0207ac699caa577905a8a457f96a22b3152b27cb2167fec2ca36f84ecd51ca27de671a3bbfc0aed77162771828464a199c252d16ec85521bfc95709b1befcfdba70035f907244b9c945bcd6ea44f8fcfbf28f9c812e1c5f8360a6708eadfb397fe607ca8cfcfe9ed315efcaa56aa190b3c98cc1a785633b376dce0a896b89a29dab2c6e94b7d0a4a37c5bbda4e5a0f7ed1726dab8dedc5dac3d90c375133b72a8ade13819525576024e5b29db3384b30b6bd069187f8f067d1f3ec7c7862a69d2ffde50dffb6e9508b6396c315149de11b60389feb1a8745c7eee7cf11881c6bb47b8ee636c41fbc733017c491d1e7f8bb97d1d891a63262f10",
- "data" : "0x61cb407df7097f4d1829d111eb0926f0528b8452e6cf31a660affb3312ff289bfcbc6da9cdea6d1042b08af8e41225a3bb7d015e50b5d293cbf1b076a13f69c09544bd8857820780113c434fbdbaf298637fde5a7e732c71b043b46d6d73d0caf302761df34706d5e32167825ea37cc3167bd7635bb887a37355a18d8c957ae9a3061b2aa3aaf472ba54fdd6ef729c5d6522ce1d4ed40ac4edd2e4eac82deec3f774a58859461a08d0604da102a898d31b83a2a37f113675ab55413eb7c8906f3c090c383f322be7a19268fe27687d30df96d44b0a570809c0dba50c3b82dd53910c3bcf05c18256d59124c6f56c39dd9b7fca08ec41e1e3dfed3079cdd42869598b7f9dd1254c4b7b2231ffeda4eec8168da157e8586c3c15dcbddd3fbcc20a88be11829e7d30086ee73a1229f1bb5938e01efd193e2fac2301c688449c3f6d8372480f543638",
- "gas" : "0x21df095c",
- "gasPrice" : "0x2d",
- "origin" : "228611f8ccc2a3dd9a67af6a43c8bea945d20f4d",
- "value" : "0x6efa52132846ee54"
- },
- "pre" : {
- "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
- "balance" : "0x6c80e7f0",
- "code" : "0x70f5879c3a83ab5da815c1047edaa5bc22907aac3e4e9fbaeb5638b8c998b8b940675abbc89ed4c047b214f512a1601a3768d07c8d5dbfcc381cbb54745f1c0c9255866cd322f5b9af41893abe83276235517501ecf5a723d3f1fd9bdef48b5232fbfed97171029561651baa3b4bc71773148918649129910c4ca9615a93890fc144f61ab66461cee1e12576d274d5dce2cb206c05952913d7afc397cdc3180f21cf277b858c7c2bd7b821d468d08b6f03abb80fe34e6410c8781271243d3c956db1a20cd1e0e64192dca8213c150d7083ccf229cd085864fe558c6241034cf4637ac3d8f2b81ab24a90a7e93e3318b4e39f02c601b326fed43e41e02c63059b80e870c78e76f59d901014065ae7f8be5a85d210765e9a831b82164ce142b66a2628d6be7a9a8f449983b9c86c9ae88505bfd5130bcdf4c4622b69419017ce7c34a7f563c98e74cb7b55cc61aea40c4494d3e0d65f01962794ec7881784a68fb3f96217484b8aa3c1f605201742d41bc492397e3ae55706943644354df3d1f433028c1074249673a70a2a82c0a9ef15da6731f1d68239f07d20c6a1bc3ea2778f3782a6416957d38dead3c6f2dfb6cd6ed320e51eba8bca67abc2c52f258c695a517d211e86aab95d1bd3adbb69c3fe11e7e9dfdb156fad3d14a05f4e31191fa253893c607a76eda74ddaf54b8a30b0dc4745e8b5b99e822e1c593252bed47c387c232d8f7d88e9767584cabbd6bc265fd6381c9f6547cfd7305a2a371775a32c40df6356c63cfe46accbde2daf2aecc0a03f9c4a16ea895096cd7b30aaa2ac8e24406ddfb758a7db7c49c21fdbae054fda8269018c8cbd7d50c215b7abc10298e7d51509b721708edfcc9af27bcf1f788fcc5f1b52f09c56dd606f0207ac699caa577905a8a457f96a22b3152b27cb2167fec2ca36f84ecd51ca27de671a3bbfc0aed77162771828464a199c252d16ec85521bfc95709b1befcfdba70035f907244b9c945bcd6ea44f8fcfbf28f9c812e1c5f8360a6708eadfb397fe607ca8cfcfe9ed315efcaa56aa190b3c98cc1a785633b376dce0a896b89a29dab2c6e94b7d0a4a37c5bbda4e5a0f7ed1726dab8dedc5dac3d90c375133b72a8ade13819525576024e5b29db3384b30b6bd069187f8f067d1f3ec7c7862a69d2ffde50dffb6e9508b6396c315149de11b60389feb1a8745c7eee7cf11881c6bb47b8ee636c41fbc733017c491d1e7f8bb97d1d891a63262f10",
- "nonce" : "0x0486acc99e8d8e01",
- "storage" : {
- }
- }
- }
- }
-}
diff --git a/tests/files/VMTests/RandomTests/vm201506060035CPPJIT.json b/tests/files/VMTests/RandomTests/vm201506060035CPPJIT.json
deleted file mode 100644
index bc5ff7f33..000000000
--- a/tests/files/VMTests/RandomTests/vm201506060035CPPJIT.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "randomVMTest" : {
- "env" : {
- "currentCoinbase" : "440f21a735f6044e793c82153d442678cab2ce36",
- "currentDifficulty" : "0x6b15fa4d",
- "currentGasLimit" : "0x971ebab58cc2b443",
- "currentNumber" : "0x8d5efc2e7a3c85dc",
- "currentTimestamp" : "0xbec4e74640b38be4",
- "previousHash" : "dc8601afcb064c13fdc1cf5a0391fc65420bd4857953c127a7a7a2cbb20a38e3"
- },
- "exec" : {
- "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
- "caller" : "66bf911d91dc1ba1700804c109efc372301c98e9",
- "code" : "0x6cc926325886186ecf81a653646473ac42f5c61aab60c7b73fbc4d1cb06ec4e31a1f0769fd0398a9e94e1b7b7384f079b46106f98a7b29e4dbca74d94232d4cf0e1c61617d5c732114097cdd54973f3c7d80e0761a27e6a13cbca9a468fb10e6d5ece49842d559b4556d50d24cf381b9bd6ed8cd1cba65657fe44f3bc0fdd47aa58ff410a4a76d17af486081e044ff35132cea133f30224daca0676afebf42d0e7195475e12166f3a944b314cc7957a0312d0666da67ce792b997ef05794f77ec7af6072c624c96d15de4a2a7876cc2e0a270aa5569b26c988ff7969a0a2a45856e1621a6d094178afa92792ae4530a8d0b650f2a875901554352a900184ddf606e799fea503286b9b17f41d7a3aecd3caa13b3356733593d23e4f9918a256cfc3fdbb71953b14036c9d044b487c3ca7d06b990a51497e3102b33087c80807a212ede2caa2f18bcf34a8f3d7113d7cb9872d8bc39744663a9cf57a32d2866225697e6dba301ae30546396651ca9abe615670266bc69fda17e692341a2b4adf9b1950908b",
- "data" : "0x",
- "gas" : "0x47d831c8",
- "gasPrice" : "0x3b",
- "origin" : "472101557e768143135d163cedf9c64855a0b395",
- "value" : "0x2a1965380b144683"
- },
- "pre" : {
- "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
- "balance" : "0x2e35b7f79ae995f8",
- "code" : "0x6cc926325886186ecf81a653646473ac42f5c61aab60c7b73fbc4d1cb06ec4e31a1f0769fd0398a9e94e1b7b7384f079b46106f98a7b29e4dbca74d94232d4cf0e1c61617d5c732114097cdd54973f3c7d80e0761a27e6a13cbca9a468fb10e6d5ece49842d559b4556d50d24cf381b9bd6ed8cd1cba65657fe44f3bc0fdd47aa58ff410a4a76d17af486081e044ff35132cea133f30224daca0676afebf42d0e7195475e12166f3a944b314cc7957a0312d0666da67ce792b997ef05794f77ec7af6072c624c96d15de4a2a7876cc2e0a270aa5569b26c988ff7969a0a2a45856e1621a6d094178afa92792ae4530a8d0b650f2a875901554352a900184ddf606e799fea503286b9b17f41d7a3aecd3caa13b3356733593d23e4f9918a256cfc3fdbb71953b14036c9d044b487c3ca7d06b990a51497e3102b33087c80807a212ede2caa2f18bcf34a8f3d7113d7cb9872d8bc39744663a9cf57a32d2866225697e6dba301ae30546396651ca9abe615670266bc69fda17e692341a2b4adf9b1950908b",
- "nonce" : "0x7b923a23",
- "storage" : {
- }
- }
- }
- }
-}
diff --git a/tests/files/VMTests/RandomTests/vm201506060035PYTHON.json b/tests/files/VMTests/RandomTests/vm201506060035PYTHON.json
deleted file mode 100644
index 5341b598d..000000000
--- a/tests/files/VMTests/RandomTests/vm201506060035PYTHON.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "randomVMTest" : {
- "callcreates" : [
- ],
- "env" : {
- "currentCoinbase" : "fa38b8ec5929d2c24aa648bccdd03a3867871620",
- "currentDifficulty" : "0x3e2bdf94ca6c6349",
- "currentGasLimit" : "0x0920c79d",
- "currentNumber" : "0x157c9ea5",
- "currentTimestamp" : "0x418566bae8925e78",
- "previousHash" : "6a31eea78097b7b5ae2c76f4d678fdbf592715b352dcaa1ffb94686e303fa390"
- },
- "exec" : {
- "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
- "caller" : "5968bf1b59120cb48b85cdcf1850a1765db4fcab",
- "code" : "0x6d3c2e6b765b96c458393353fb22066c1dcddc92d4bfc44054134f93e1136b3dc88daaad669ed199b2d09a621f348b036be8d7782c74499d19ee65ba727218a8631b94849a2443bfcc27edf0ba784bf1780b7c76bacdbe1039bf537aea239e96b13270c335aefcb9ecc8639a62c1b67a6005077b46dac228cf1abb7c17a4b7fdc928fa3fed0dfcc672147181a91e70736a58451c96c8c181d92f768f7f74059e1d978c0f89401984d551ccc5354bf774c754e21a0c9a98c2ba4bd911a87cec3ec02a1c1b5ecaf1041792f86b4588b28752ba9949b5d1d40dab6f0d68a43f28c771ce0be37d7b8a138e4401a5579c17c6aac80507992bf774723f0db4eea2604a9df864217808f50e71aec0f1aee005d541408a6c58dc37c0b90fdd72eac1544372e1633b1ef44a63f452584d952b417d620d7e45d2b7cdbfb020ed0ee3665e368d0a747495bacd037d621e1033e37fd16479ad5a78e3e85b34b89ccff6ef949644c5b5847704fe4a87f2f3012440937cf91ac94b41a73e3181e8e25f580d5effa83439ae5679b8f0c39ea0a25d62ffc50f6d13e867bf91210417096eb058e19565707e56c1e0bc7f85a55d6b9c738f60943d67e8a9340ead3746a0d61f5cf1be9dcc4d01f2a312b17244bce171ef5d7ee012f3208af95e7c90e375649f659a2e29d7505a7a8376277aeebde83e8269425eb7bc751185f9d0aa619d3c241bb26355794418796a577a5c240a51ad751a8887140fe42a240eb9f6ba243468451ff132ab8eb8634269ef8a9923544ecdf3a8e172e2c762d9624574fee7d9d38ab1cf0d2b94a62e83707aaa40c8793b478a50e9e0581ba8692c757ebcf25a24d6f6d7b8b1f32d4d3b56e57673a3e3980a76c185e1017083a3ee466a6345f592a24fccdfe3d2816e9b0665455305f9a5c72d8f20e743e96eb1532828fc3b1e72e042f45d187a57728d81ad8fb98412ff6ffa1cce121878a8b5e6b27218bbbf90916bcb812f987df9b491b11cabcad16547417aa7fb226e4939c4b3070f37b10eb7f7accaee386db2a35ac83c0e2eea5e905097cd8f783382141a1b2e9716f0757e204458107b48bd20fa1d3f284f597e53542e9a66aec0dd8082ebc5249bfa8ec1b2a593a8d3f22f28ab4549da8a4c72cd79ec1828073916448e2d9e4ab2736f3a6baa7b5ac3804e4d6aadab16ed19a0582f7a175c1d9c505a5f145e81dc0eb4692a3534e18857bc925d88654096fca6695c7506d39ed253634790b4b7f2335cb2f81e4020ffacdd2a9f",
- "data" : "0x78e3c689f5b8056f9d0dd109f4050bfb52fa5c532787dba38e1b6bf6b03d47848e896ab6a4d1356860a2a3fa34af8317d97b8cbfcb12357bd3ed72d1537a3dfa8e7e3e4183b34a4eccf8624f5a2b77205ef8085f13272ef155caa09f9aace0d91bafdb79e5b01aa36c2e6172ed576ffd47da0ae9ab717011a2495ceb915faed65af38e79447a6679557d1575ecde5c0c9874315ced476c94db0f64d904e17843afd82cf705f088a577c472a4cc29a3172a72594b7da2e712bbbb98e159897e34360576d46bfb9f2ddd458205ecd505e629f04a090bff0c36d04d35768ac97b60ae05f12b8bf2a1f84b883874bd2aace89dd0bf6834fcc23b68d7d84d207663aaafc9a3be46a23d5cdc6ce304f93486cf4453b0a24d6ba66e62d32e2ce9169193c0957e42b3e6ea2946274b01db1681a72bcdc95224a2611722fc5fe05c7f2c6619fe7285fbd79eeec55d2d98f76a2a24429d69ea6fc978be5763be77fa27f4cebab74a14afea06a916581003c65ef5e96ef647237f82761d6ad637e0e4e549087794363b04656c4746d1d91fe389ad1f2764468395c91baa827c6a9c8da1699a6365fc800db01d917e7682af4e41e95231d3db144c19e689684dbf82d0593320e7157c59216ab30a6c300329ce91b2601f6925a3404d407b529f2b685f29e70c7a745e91c4213e0e5671f0f8d9449d013febb2113887e9f55b78b79f376ab319f72d8a6c8bc85b231e64adf2a1c15065e891b1c572c976b20d4b533aa3de3a7c3e1adb18e36fd902ded6e2fa434560d470850d38beaac27fd64dc28e08c82d93301d658eb3c93790daf1",
- "gas" : "0x08a436a67693cb35",
- "gasPrice" : "0x1d",
- "origin" : "488e0a1a60568f14ea731847716d7364750ad6c7",
- "value" : "0x37ccf98d9e881ba3"
- },
- "gas" : "0x08a436a67693cb35",
- "logs" : [
- ],
- "out" : "0x",
- "post" : {
- "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
- "balance" : "0x436c0a01",
- "code" : "0x6d3c2e6b765b96c458393353fb22066c1dcddc92d4bfc44054134f93e1136b3dc88daaad669ed199b2d09a621f348b036be8d7782c74499d19ee65ba727218a8631b94849a2443bfcc27edf0ba784bf1780b7c76bacdbe1039bf537aea239e96b13270c335aefcb9ecc8639a62c1b67a6005077b46dac228cf1abb7c17a4b7fdc928fa3fed0dfcc672147181a91e70736a58451c96c8c181d92f768f7f74059e1d978c0f89401984d551ccc5354bf774c754e21a0c9a98c2ba4bd911a87cec3ec02a1c1b5ecaf1041792f86b4588b28752ba9949b5d1d40dab6f0d68a43f28c771ce0be37d7b8a138e4401a5579c17c6aac80507992bf774723f0db4eea2604a9df864217808f50e71aec0f1aee005d541408a6c58dc37c0b90fdd72eac1544372e1633b1ef44a63f452584d952b417d620d7e45d2b7cdbfb020ed0ee3665e368d0a747495bacd037d621e1033e37fd16479ad5a78e3e85b34b89ccff6ef949644c5b5847704fe4a87f2f3012440937cf91ac94b41a73e3181e8e25f580d5effa83439ae5679b8f0c39ea0a25d62ffc50f6d13e867bf91210417096eb058e19565707e56c1e0bc7f85a55d6b9c738f60943d67e8a9340ead3746a0d61f5cf1be9dcc4d01f2a312b17244bce171ef5d7ee012f3208af95e7c90e375649f659a2e29d7505a7a8376277aeebde83e8269425eb7bc751185f9d0aa619d3c241bb26355794418796a577a5c240a51ad751a8887140fe42a240eb9f6ba243468451ff132ab8eb8634269ef8a9923544ecdf3a8e172e2c762d9624574fee7d9d38ab1cf0d2b94a62e83707aaa40c8793b478a50e9e0581ba8692c757ebcf25a24d6f6d7b8b1f32d4d3b56e57673a3e3980a76c185e1017083a3ee466a6345f592a24fccdfe3d2816e9b0665455305f9a5c72d8f20e743e96eb1532828fc3b1e72e042f45d187a57728d81ad8fb98412ff6ffa1cce121878a8b5e6b27218bbbf90916bcb812f987df9b491b11cabcad16547417aa7fb226e4939c4b3070f37b10eb7f7accaee386db2a35ac83c0e2eea5e905097cd8f783382141a1b2e9716f0757e204458107b48bd20fa1d3f284f597e53542e9a66aec0dd8082ebc5249bfa8ec1b2a593a8d3f22f28ab4549da8a4c72cd79ec1828073916448e2d9e4ab2736f3a6baa7b5ac3804e4d6aadab16ed19a0582f7a175c1d9c505a5f145e81dc0eb4692a3534e18857bc925d88654096fca6695c7506d39ed253634790b4b7f2335cb2f81e4020ffacdd2a9f",
- "nonce" : "0x3a2068ac",
- "storage" : {
- "0x8376277aeebde83e8269425eb7bc751185f9d0aa619d3c241bb263" : "0x9a2e29d7505a"
- }
- }
- },
- "pre" : {
- "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
- "balance" : "0x436c0a01",
- "code" : "0x6d3c2e6b765b96c458393353fb22066c1dcddc92d4bfc44054134f93e1136b3dc88daaad669ed199b2d09a621f348b036be8d7782c74499d19ee65ba727218a8631b94849a2443bfcc27edf0ba784bf1780b7c76bacdbe1039bf537aea239e96b13270c335aefcb9ecc8639a62c1b67a6005077b46dac228cf1abb7c17a4b7fdc928fa3fed0dfcc672147181a91e70736a58451c96c8c181d92f768f7f74059e1d978c0f89401984d551ccc5354bf774c754e21a0c9a98c2ba4bd911a87cec3ec02a1c1b5ecaf1041792f86b4588b28752ba9949b5d1d40dab6f0d68a43f28c771ce0be37d7b8a138e4401a5579c17c6aac80507992bf774723f0db4eea2604a9df864217808f50e71aec0f1aee005d541408a6c58dc37c0b90fdd72eac1544372e1633b1ef44a63f452584d952b417d620d7e45d2b7cdbfb020ed0ee3665e368d0a747495bacd037d621e1033e37fd16479ad5a78e3e85b34b89ccff6ef949644c5b5847704fe4a87f2f3012440937cf91ac94b41a73e3181e8e25f580d5effa83439ae5679b8f0c39ea0a25d62ffc50f6d13e867bf91210417096eb058e19565707e56c1e0bc7f85a55d6b9c738f60943d67e8a9340ead3746a0d61f5cf1be9dcc4d01f2a312b17244bce171ef5d7ee012f3208af95e7c90e375649f659a2e29d7505a7a8376277aeebde83e8269425eb7bc751185f9d0aa619d3c241bb26355794418796a577a5c240a51ad751a8887140fe42a240eb9f6ba243468451ff132ab8eb8634269ef8a9923544ecdf3a8e172e2c762d9624574fee7d9d38ab1cf0d2b94a62e83707aaa40c8793b478a50e9e0581ba8692c757ebcf25a24d6f6d7b8b1f32d4d3b56e57673a3e3980a76c185e1017083a3ee466a6345f592a24fccdfe3d2816e9b0665455305f9a5c72d8f20e743e96eb1532828fc3b1e72e042f45d187a57728d81ad8fb98412ff6ffa1cce121878a8b5e6b27218bbbf90916bcb812f987df9b491b11cabcad16547417aa7fb226e4939c4b3070f37b10eb7f7accaee386db2a35ac83c0e2eea5e905097cd8f783382141a1b2e9716f0757e204458107b48bd20fa1d3f284f597e53542e9a66aec0dd8082ebc5249bfa8ec1b2a593a8d3f22f28ab4549da8a4c72cd79ec1828073916448e2d9e4ab2736f3a6baa7b5ac3804e4d6aadab16ed19a0582f7a175c1d9c505a5f145e81dc0eb4692a3534e18857bc925d88654096fca6695c7506d39ed253634790b4b7f2335cb2f81e4020ffacdd2a9f",
- "nonce" : "0x3a2068ac",
- "storage" : {
- }
- }
- }
- }
-}
diff --git a/tests/files/VMTests/RandomTests/vm201506060134CPPJIT.json b/tests/files/VMTests/RandomTests/vm201506060134CPPJIT.json
deleted file mode 100644
index c278a4e7f..000000000
--- a/tests/files/VMTests/RandomTests/vm201506060134CPPJIT.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "randomVMTest" : {
- "env" : {
- "currentCoinbase" : "667a4c99d680c975191c982962621915870b4c02",
- "currentDifficulty" : "0x268d8424",
- "currentGasLimit" : "0xbb87562fd8f4c074",
- "currentNumber" : "0x761251e4",
- "currentTimestamp" : "0x0a7acf9a",
- "previousHash" : "cd602c9a0d7e87aad15e07e107cfc1fcd8a64fc9400afee4a66827b94acf3ff3"
- },
- "exec" : {
- "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
- "caller" : "70597f4d60a5a4d7db9e4f0632ee6603b077af81",
- "code" : "0x7f16811f3a270fb6c92e9594ce76e78aeb88d06c12e7d03d8cfa870180b55f14bf69e47694e4d3ea0487d15b706f6d96508fa9a70a884eeea20d6e0c9b1a78bc031365bd1b96948f0bba6615e7c1bf760aad09745d4881d479704625f3a09138f626c01e5c4262d968d52d9825d634a6273dbc6ba015e8c0826216e22332cfe07da284284016ac7ee9b4e70be2e7a705c7e24b80c2d338cb8b3bffbefd9dc06430ddc3cc756c535ff0d3fc1101911f2d32853660526aa04516f4370b31ded4327279d6142eb272358d8b3ac3e573d4dfc8b91514f06eda141fe0feb57ccb0db6ed625f32e8a43a1bf6153709512d7b3e8b6fce2cac3bd94aa22861b49e7b9216ec84cffc1e0a014ba807bd272fab2f769963a3cd770271bf3c766efc90bb95fe348d436bb54762102c127d406c88cc5fcdf915416f7dbe81e2ee4ff71234f5081a5ab02577ed2c15099f737bb4b0d0062420576e57641f39b721b1f399e6f26c532b253d4629dea6a5e818a2327523889f051ffea10609c34c8fe009eac58f2ee9506beb68f7b590972f8fe86fe6789b25da2dcaf90dff52c1a8476b1381a7c4cad3d0248a18ca6263023fc4b77a8487fc0cbec291370bb1c97cd21b1a9c4d359ba58f076b11212c0ef16096753229ab680782f6d4386fec6e5b26d9d572bfe484fb5a0379349c3587b620cba4134809876e79d28aee7c4792b4d6f3d4da22649637ee8821077f0919ffa295605f122ec0a2ae678074aa93277deb3de2c1c0957d2e09b78b151a6040206aa7f05c1a71e552b3ebbcab67e1456b0fb8c88078a0",
- "data" : "0x7b5e7e1696a18f82ec382e6557b86b36e8d8e55e5350ffb0dd5f701f336066a07e960114651da9da852239d33f188e2365b6cc07c065f6a1a89765f144dcb36d807ecbe0ff784c0cb26b58d79e0721ffbc08141b6e8c63b1ff16e062f731d946d266b38e91c46f723e77caff402d1473e1a945e722f37c9b411ad766957cc4b64e1873a9782dc73bd842c97e0db60512a831f37b4cba6a7d7faeb2748de4ffb52de98304417594a89ec86d858ba64942bbc39c1687fa77c74bc94f31886faf24a3d4b5d875b09a056b0125b2acb9777f2bce761cf888b863f0390654ba12b29ad9aa6e813ae2e1c07673c83d0a1a59bc63aad7882d650d01f82e64e976c765b2f68a0791199fae643bf972d2e8f64492fed053957066587cbdd331194f5268eec38620a3204c73908f39d115b19f0e65c95107ebdf340c0b17182b77892ccaffd93aa0db2339ed1b0def1e8fe1e1ccad08ad88f46df69a5204ed5f7d9bc14f5679d2d8762e70c43162e64dce385144912ed2b0c54a052a5b4c1e808e6ae30e9bb98b497edae2894a78693a94c0a71a036793f448d84f747f574cb529a33b5f46633b6caa262c13f078894fc5ca3909f56d43dac40a16761625fc5ad8aca6dd6d5ac0ccb60cc8419aae7d2b1141529373ede65a95351da64ca5c11bbb229c7b5facc791a9635e93f27678aa513a4936c64eae062af8575094226cfde23a1cad96cf9e393777cc7f958dc2fa7a7947b2bf8776c3261ef4195dd1cb3a40ad726615f434e010e77ff1f35d99058807d575af2b65bbcc7681072874e649cf4c16d71dae4a78ffde1512c8439471042001775faf37d9d515574c1637429b8eae30905566a530df1ee1fb62e6dfc17491db6bf33a510aef299805973eaea201c5362f9466621c0a0a79c5ed449fcc7a448d5db2da446911f4b2e11bb01c25ba2cf32a2c79b2054e2adf927ba679cd28e1a14f35ba8a5df97efc5b39c0e73a674d1248373869f39c6499e4a4f8147ac7a44ed49ccff7afc2362fdf4252cbefff96fce329e3eb6e2b85467249b6e52de9d60f3bcf25d99a539f66a373e0767a1d29531b6d27cba56928f19b7df858337de8b0050f132c470c2f796d9a74680adb61c6ff474ca39e4bfc6ad68739cdf0429bacc94f599f6c30c4266438a52ea2e84ea2c13e6121227f6ed215af17025e11598b5c1bc863dcc66b0424d012ad9f5a0270f18d1a657f6c683b5c3268da78c228cb71739560a8a596ad4d75217969951ff80590de6b77f0ee4236b46b1cd2d456cd75714e471f168383b2d4dc5f8a6c19af977583534efbb4610d6b65b2ba396760fc64cb654548047f521d3285d33cadd2ac9079f526d1c618114e0e33237d43e34a0d963b6084944a6987cc01e2075a1261d3337263b3f99cc1f11892f5e4045bedfbfc387d9cf48c77883714915e73b6349be0e2b3474b7fd1c9fb8b016f0758906c7d4bf326662769090f336791076d0771a1a8e10c17f941d4b7aa5c1f6d17dbff1f91e6a222dbce8876e4ed837e72b1139e5285277a23607f73a50dcd52a6aa225889729690eb80ed22f54dc16932930f855f81aa06b83d6e7b9add7b543f6018d34f221585d4646a6e45ba2ef59c71679c1bf36831046738ac0234fc1277f803ee75addc98f6c2caee0997eea715354e877e9389c9e96296c872794b53272a2f93fec7e6634e9fee048bfa6a0ddaf9e4b93f2f1e516f2d2baf327644605d1ec3ac82affeaaf4601f78e5a0fa7db95981f4ed7a9f41e41c9fd1b849f5b6ccbcf42b8d622988647a44f6f00db531c97d425a3715b3435112c26653ebec565572bbdeac9b",
- "gas" : "0x6ad1cb41",
- "gasPrice" : "0x1c",
- "origin" : "89cbee220af96665792cb88e9c5d20e5d402f7bf",
- "value" : "0x40be582c"
- },
- "pre" : {
- "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
- "balance" : "0x76eb64c1377dd218",
- "code" : "0x7f16811f3a270fb6c92e9594ce76e78aeb88d06c12e7d03d8cfa870180b55f14bf69e47694e4d3ea0487d15b706f6d96508fa9a70a884eeea20d6e0c9b1a78bc031365bd1b96948f0bba6615e7c1bf760aad09745d4881d479704625f3a09138f626c01e5c4262d968d52d9825d634a6273dbc6ba015e8c0826216e22332cfe07da284284016ac7ee9b4e70be2e7a705c7e24b80c2d338cb8b3bffbefd9dc06430ddc3cc756c535ff0d3fc1101911f2d32853660526aa04516f4370b31ded4327279d6142eb272358d8b3ac3e573d4dfc8b91514f06eda141fe0feb57ccb0db6ed625f32e8a43a1bf6153709512d7b3e8b6fce2cac3bd94aa22861b49e7b9216ec84cffc1e0a014ba807bd272fab2f769963a3cd770271bf3c766efc90bb95fe348d436bb54762102c127d406c88cc5fcdf915416f7dbe81e2ee4ff71234f5081a5ab02577ed2c15099f737bb4b0d0062420576e57641f39b721b1f399e6f26c532b253d4629dea6a5e818a2327523889f051ffea10609c34c8fe009eac58f2ee9506beb68f7b590972f8fe86fe6789b25da2dcaf90dff52c1a8476b1381a7c4cad3d0248a18ca6263023fc4b77a8487fc0cbec291370bb1c97cd21b1a9c4d359ba58f076b11212c0ef16096753229ab680782f6d4386fec6e5b26d9d572bfe484fb5a0379349c3587b620cba4134809876e79d28aee7c4792b4d6f3d4da22649637ee8821077f0919ffa295605f122ec0a2ae678074aa93277deb3de2c1c0957d2e09b78b151a6040206aa7f05c1a71e552b3ebbcab67e1456b0fb8c88078a0",
- "nonce" : "0x366add988a39a9ad",
- "storage" : {
- }
- }
- }
- }
-}
diff --git a/tests/files/VMTests/RandomTests/vm201506060134PYTHON.json b/tests/files/VMTests/RandomTests/vm201506060134PYTHON.json
deleted file mode 100644
index 1f1313fe6..000000000
--- a/tests/files/VMTests/RandomTests/vm201506060134PYTHON.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "randomVMTest" : {
- "callcreates" : [
- ],
- "env" : {
- "currentCoinbase" : "a1c240ebc8ee9ebdbd972e8edbb7461c380e8794",
- "currentDifficulty" : "0x88a62ea1cc8be328",
- "currentGasLimit" : "0xd43ea089079a926a",
- "currentNumber" : "0x451067bb",
- "currentTimestamp" : "0x18aae452",
- "previousHash" : "14ba1a13166b56cf91cb29cbd3d1dbcf32ebf6066d237e34abb405378ec6a277"
- },
- "exec" : {
- "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
- "caller" : "3616b971536b216fd6710a54ef30e1e3d3bd6c13",
- "code" : "0x6c790eb25b10d55aefcef887e5dd7b0c8d2d3cda55a99a988e563d5ba5cbc54dac1282f775f3b0c43c37306d2212605536f2dca4aa862e6712d774d618146137e0c4ec6f880485707f913173b41181da66866588b4d728766d615e887fa448fada51b5e68b9c0b701a3e97a63d1fe25939a107b74fbeb794a57aa16acee29a63f5235e2c83172b629fd658b122a972568d88735395876ca0349e6f11dfc373bdd6c781556bec6e641bb4e8e5b1ff28401870c2f9de528b6fe37c4c27416974a9032d7e71762ba23122af89eab4961e59bb35f9fee35979c68fff82ef6cb5e66e56119aa924681f274edcfee02c4ce8c1ec7eeb813cc6d453db74a3fe1571627368af27ba22c61eb98cde4272b4ab4cd55a7bd0b5383b1445620b23d3666532f25b93be98efdccf0bdf37f0fecc5e61556370d3ebf3644a4717e604bdee16e1304ffce17ed6b567c70275df1e847cef48b65aa8221bdbb9d0b84a2ece25a72d3632c5ce7e8b03bc43d8093c4d5819acec0178d548094219e9e31e87ed8e02f42099c1c1699703393c0a4b55a33eac9a6f34185783af66a5972c6c1bb607a57af38063d18908367ca79ccdcd11bd5bd13c2703a19e67e36c9f2abc8770a60ecfb2e7b8c24e553070660698d1ec44a2a27fd82a02de187e46cb6a5fbbc7bcf24d593ed016fa07",
- "data" : "0x69040ef607bae332ebef806fa4be76ba43516c5041e54c23976d382776bcdbccd68e29053a023742335c3487ab65fdd26569a1ee7662ed75d61ded9b7abf80fdd34fd054045e95778447aac663aa3593807c599c7bcc3326b1142a372117c4f31bd6c968b90d5d2436bb554835ca5d7b39e22af6bc5cc47aa376338fdc59cba9df637b8fc5ca1c3780a399dc67e29f17538255f3806adc03cd145c224fec14e18863795fa849897e72517a3973f445929a30ea8c82cf043c4cf0b9cb0b4d41f33a44533ff059376916fcff55b5388b440e667a41f4ad614a32778c9c2c12a2801acbe8b62db37556aa3635d8beae62978b417805a470402d1d4537372922e3c0400ab451f231fc8a1682ddb77ec720fa371410e195d02ba072adbd977ca4dea25fdd64e228db91b15771d13a7554da5aa1f6e44de211fea4e1d994f52d1ec5e36221106613c74205fb5f0d79afa459b98cc80740406eebae740b01b44245b1737dfb8ab7bef66a08e35f4e313bc59570e88965ca8f0dfdaac97b4c9929d1b380b8c87dc1965333f51de17367ed0c2e5cbfbcdf2753087c6449c274cebe7e840a673238828171ece98d2e6b14ea58f386467110e6616d8d7142a003290cb7556362081dc7d3a5a02303259d65f7452a91d19666ec5e55707b1fe074667ae446aabf10cfa1d2c42e04e66816e0d1f853a360d2667d5e5c1c1cc7de777af52536f722f9620d9740bc2952846d9021978d5d48e0b86808870ba75603a4777f61985976b20f088ec8fe8184b377aa409951df945f101ece22502a6d43d8e9bb0194945d476078b2b9797232b1812e8b26888d930253593383d57e6c451972db2437ae4e062e3ca19355864176c786dc69df9a663d4584e4baf2357a9d59857729567f57d3573c3d4dfc1bb8cede257c9dd2ca6e1bed0f6da7fb5b3877d067a2f43c90b6ab397bb6789910db655c5abb4ee964c606f126da8d11a46dea65f043f2c47a74aacce8328d25f220874fce72778249b9a4652eeee577728a200c51d6a12219c3abe36adc2d66e6b9f511394dcca46ca30efa46a1c370b92dfa5352246c33f512d7e501128dd572a4b3be68772f912f0dc78feea97f0a2a36c79ebf866931d1d864771c044a2531b493359105f797e70e7acb1a4da660c77033cd9d7045da5c935dcb833ca70735d1b0605d62c9e3af60f38e",
- "gas" : "0x0ced02de",
- "gasPrice" : "0x1d",
- "origin" : "638eec7b45d4b2ea1682dfe5f6e64dfeeaa2d5ed",
- "value" : "0x42aad51cf7f24ad7"
- },
- "gas" : "0x0ced02de",
- "logs" : [
- ],
- "out" : "0x",
- "post" : {
- "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
- "balance" : "0xcbc9411f7d2c1c91",
- "code" : "0x6c790eb25b10d55aefcef887e5dd7b0c8d2d3cda55a99a988e563d5ba5cbc54dac1282f775f3b0c43c37306d2212605536f2dca4aa862e6712d774d618146137e0c4ec6f880485707f913173b41181da66866588b4d728766d615e887fa448fada51b5e68b9c0b701a3e97a63d1fe25939a107b74fbeb794a57aa16acee29a63f5235e2c83172b629fd658b122a972568d88735395876ca0349e6f11dfc373bdd6c781556bec6e641bb4e8e5b1ff28401870c2f9de528b6fe37c4c27416974a9032d7e71762ba23122af89eab4961e59bb35f9fee35979c68fff82ef6cb5e66e56119aa924681f274edcfee02c4ce8c1ec7eeb813cc6d453db74a3fe1571627368af27ba22c61eb98cde4272b4ab4cd55a7bd0b5383b1445620b23d3666532f25b93be98efdccf0bdf37f0fecc5e61556370d3ebf3644a4717e604bdee16e1304ffce17ed6b567c70275df1e847cef48b65aa8221bdbb9d0b84a2ece25a72d3632c5ce7e8b03bc43d8093c4d5819acec0178d548094219e9e31e87ed8e02f42099c1c1699703393c0a4b55a33eac9a6f34185783af66a5972c6c1bb607a57af38063d18908367ca79ccdcd11bd5bd13c2703a19e67e36c9f2abc8770a60ecfb2e7b8c24e553070660698d1ec44a2a27fd82a02de187e46cb6a5fbbc7bcf24d593ed016fa07",
- "nonce" : "0x045d0aa4",
- "storage" : {
- "0xa79ccdcd11bd5bd13c2703a19e67e36c9f2abc8770a60ecfb2e7b8c24e" : "0xd1890836"
- }
- }
- },
- "pre" : {
- "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
- "balance" : "0xcbc9411f7d2c1c91",
- "code" : "0x6c790eb25b10d55aefcef887e5dd7b0c8d2d3cda55a99a988e563d5ba5cbc54dac1282f775f3b0c43c37306d2212605536f2dca4aa862e6712d774d618146137e0c4ec6f880485707f913173b41181da66866588b4d728766d615e887fa448fada51b5e68b9c0b701a3e97a63d1fe25939a107b74fbeb794a57aa16acee29a63f5235e2c83172b629fd658b122a972568d88735395876ca0349e6f11dfc373bdd6c781556bec6e641bb4e8e5b1ff28401870c2f9de528b6fe37c4c27416974a9032d7e71762ba23122af89eab4961e59bb35f9fee35979c68fff82ef6cb5e66e56119aa924681f274edcfee02c4ce8c1ec7eeb813cc6d453db74a3fe1571627368af27ba22c61eb98cde4272b4ab4cd55a7bd0b5383b1445620b23d3666532f25b93be98efdccf0bdf37f0fecc5e61556370d3ebf3644a4717e604bdee16e1304ffce17ed6b567c70275df1e847cef48b65aa8221bdbb9d0b84a2ece25a72d3632c5ce7e8b03bc43d8093c4d5819acec0178d548094219e9e31e87ed8e02f42099c1c1699703393c0a4b55a33eac9a6f34185783af66a5972c6c1bb607a57af38063d18908367ca79ccdcd11bd5bd13c2703a19e67e36c9f2abc8770a60ecfb2e7b8c24e553070660698d1ec44a2a27fd82a02de187e46cb6a5fbbc7bcf24d593ed016fa07",
- "nonce" : "0x045d0aa4",
- "storage" : {
- }
- }
- }
- }
-}
diff --git a/tests/vm/gh_test.go b/tests/vm/gh_test.go
index a95d02576..be9e89d9c 100644
--- a/tests/vm/gh_test.go
+++ b/tests/vm/gh_test.go
@@ -97,7 +97,7 @@ func RunVmTest(p string, t *testing.T) {
obj := StateObjectFromAccount(db, addr, account)
statedb.SetStateObject(obj)
for a, v := range account.Storage {
- obj.SetState(common.HexToHash(a), common.NewValue(helper.FromHex(v)))
+ obj.SetState(common.HexToHash(a), common.HexToHash(v))
}
}
@@ -168,11 +168,11 @@ func RunVmTest(p string, t *testing.T) {
}
for addr, value := range account.Storage {
- v := obj.GetState(common.HexToHash(addr)).Bytes()
- vexp := helper.FromHex(value)
+ v := obj.GetState(common.HexToHash(addr))
+ vexp := common.HexToHash(value)
- if bytes.Compare(v, vexp) != 0 {
- t.Errorf("%s's : (%x: %s) storage failed. Expected %x, got %x (%v %v)\n", name, obj.Address().Bytes()[0:4], addr, vexp, v, common.BigD(vexp), common.BigD(v))
+ if v != vexp {
+ t.Errorf("%s's : (%x: %s) storage failed. Expected %x, got %x (%v %v)\n", name, obj.Address().Bytes()[0:4], addr, vexp, v, vexp.Big(), v.Big())
}
}
}
diff --git a/xeth/types.go b/xeth/types.go
index 3bb1447ca..ed64dc45e 100644
--- a/xeth/types.go
+++ b/xeth/types.go
@@ -22,7 +22,7 @@ func NewObject(state *state.StateObject) *Object {
return &Object{state}
}
-func (self *Object) StorageString(str string) *common.Value {
+func (self *Object) StorageString(str string) []byte {
if common.IsHex(str) {
return self.storage(common.Hex2Bytes(str[2:]))
} else {
@@ -30,12 +30,12 @@ func (self *Object) StorageString(str string) *common.Value {
}
}
-func (self *Object) StorageValue(addr *common.Value) *common.Value {
+func (self *Object) StorageValue(addr *common.Value) []byte {
return self.storage(addr.Bytes())
}
-func (self *Object) storage(addr []byte) *common.Value {
- return self.StateObject.GetStorage(common.BigD(addr))
+func (self *Object) storage(addr []byte) []byte {
+ return self.StateObject.GetState(common.BytesToHash(addr)).Bytes()
}
func (self *Object) Storage() (storage map[string]string) {
diff --git a/xeth/xeth.go b/xeth/xeth.go
index f0ba91ba7..7342be4a9 100644
--- a/xeth/xeth.go
+++ b/xeth/xeth.go
@@ -39,8 +39,14 @@ const (
LogFilterTy
)
-func DefaultGas() *big.Int { return new(big.Int).Set(defaultGas) }
-func DefaultGasPrice() *big.Int { return new(big.Int).Set(defaultGasPrice) }
+func DefaultGas() *big.Int { return new(big.Int).Set(defaultGas) }
+
+func (self *XEth) DefaultGasPrice() *big.Int {
+ if self.gpo == nil {
+ self.gpo = eth.NewGasPriceOracle(self.backend)
+ }
+ return self.gpo.SuggestPrice()
+}
type XEth struct {
backend *eth.Ethereum
@@ -68,6 +74,8 @@ type XEth struct {
// register map[string][]*interface{} // TODO improve return type
agent *miner.RemoteAgent
+
+ gpo *eth.GasPriceOracle
}
func NewTest(eth *eth.Ethereum, frontend Frontend) *XEth {
@@ -80,22 +88,22 @@ func NewTest(eth *eth.Ethereum, frontend Frontend) *XEth {
// 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(eth *eth.Ethereum, frontend Frontend) *XEth {
+func New(ethereum *eth.Ethereum, frontend Frontend) *XEth {
xeth := &XEth{
- backend: eth,
+ backend: ethereum,
frontend: frontend,
quit: make(chan struct{}),
- filterManager: filter.NewFilterManager(eth.EventMux()),
+ filterManager: filter.NewFilterManager(ethereum.EventMux()),
logQueue: make(map[int]*logQueue),
blockQueue: make(map[int]*hashQueue),
transactionQueue: make(map[int]*hashQueue),
messages: make(map[int]*whisperFilter),
agent: miner.NewRemoteAgent(),
}
- if eth.Whisper() != nil {
- xeth.whisper = NewWhisper(eth.Whisper())
+ if ethereum.Whisper() != nil {
+ xeth.whisper = NewWhisper(ethereum.Whisper())
}
- eth.Miner().Register(xeth.agent)
+ ethereum.Miner().Register(xeth.agent)
if frontend == nil {
xeth.frontend = dummyFrontend{}
}
@@ -227,6 +235,7 @@ func (self *XEth) WithState(statedb *state.StateDB) *XEth {
xeth := &XEth{
backend: self.backend,
frontend: self.frontend,
+ gpo: self.gpo,
}
xeth.state = NewState(xeth, statedb)
@@ -479,7 +488,7 @@ func (self *XEth) NumberToHuman(balance string) string {
}
func (self *XEth) StorageAt(addr, storageAddr string) string {
- return common.ToHex(self.State().state.GetState(common.HexToAddress(addr), common.HexToHash(storageAddr)))
+ return self.State().state.GetState(common.HexToAddress(addr), common.HexToHash(storageAddr)).Hex()
}
func (self *XEth) BalanceAt(addr string) string {
@@ -833,7 +842,7 @@ func (self *XEth) Call(fromStr, toStr, valueStr, gasStr, gasPriceStr, dataStr st
}
if msg.gasPrice.Cmp(big.NewInt(0)) == 0 {
- msg.gasPrice = DefaultGasPrice()
+ msg.gasPrice = self.DefaultGasPrice()
}
block := self.CurrentBlock()
@@ -902,7 +911,7 @@ func (self *XEth) Transact(fromStr, toStr, nonceStr, valueStr, gasStr, gasPriceS
}
if len(gasPriceStr) == 0 {
- price = DefaultGasPrice()
+ price = self.DefaultGasPrice()
} else {
price = common.Big(gasPriceStr)
}