From 2111cd4894d421179f46bf8bed13279779f5682c Mon Sep 17 00:00:00 2001 From: chriseth Date: Fri, 24 Apr 2015 17:35:16 +0200 Subject: [PATCH 01/13] Move assembly related files to libevmasm and Params.h/.cpp to libevmcore. --- CMakeLists.txt | 1 + alethzero/CMakeLists.txt | 3 +- evmjit/libevmjit-cpp/Env.cpp | 2 +- libethcore/BlockInfo.cpp | 2 +- libethcore/CMakeLists.txt | 2 +- libethcore/EthashAux.cpp | 2 +- libethereum/Interface.h | 2 +- libethereum/Precompiled.cpp | 2 +- libethereum/State.h | 2 +- libethereum/Transaction.h | 2 +- libevm/VM.h | 2 +- {libevmcore => libevmasm}/Assembly.cpp | 4 +-- {libevmcore => libevmasm}/Assembly.h | 4 +-- {libevmcore => libevmasm}/AssemblyItem.cpp | 0 {libevmcore => libevmasm}/AssemblyItem.h | 2 +- libevmasm/CMakeLists.txt | 33 +++++++++++++++++ .../CommonSubexpressionEliminator.cpp | 4 +-- .../CommonSubexpressionEliminator.h | 4 +-- .../ControlFlowGraph.cpp | 8 ++--- {libevmcore => libevmasm}/ControlFlowGraph.h | 0 libevmasm/Exceptions.h | 36 +++++++++++++++++++ .../ExpressionClasses.cpp | 6 ++-- {libevmcore => libevmasm}/ExpressionClasses.h | 2 +- .../SemanticInformation.cpp | 4 +-- .../SemanticInformation.h | 0 {libevmcore => libevmasm}/SourceLocation.h | 0 libevmcore/CMakeLists.txt | 4 --- libevmcore/Exceptions.h | 7 ++-- {libethcore => libevmcore}/Params.cpp | 2 +- {libethcore => libevmcore}/Params.h | 2 +- liblll/CMakeLists.txt | 3 +- liblll/CodeFragment.h | 2 +- libsolidity/AST.h | 2 +- libsolidity/CMakeLists.txt | 2 +- libsolidity/Compiler.cpp | 2 +- libsolidity/Compiler.h | 2 +- libsolidity/CompilerContext.h | 2 +- libsolidity/Exceptions.h | 2 +- libsolidity/ExpressionCompiler.h | 2 +- libsolidity/LValue.h | 2 +- libsolidity/Parser.cpp | 2 +- libsolidity/Scanner.h | 2 +- libsolidity/SourceReferenceFormatter.h | 2 +- mix/CodeModel.cpp | 2 +- mix/CodeModel.h | 2 +- mix/QBasicNodeDefinition.h | 2 +- test/libsolidity/Assembly.cpp | 6 ++-- test/libsolidity/SolidityOptimizer.cpp | 6 ++-- 48 files changed, 125 insertions(+), 64 deletions(-) rename {libevmcore => libevmasm}/Assembly.cpp (99%) rename {libevmcore => libevmasm}/Assembly.h (98%) rename {libevmcore => libevmasm}/AssemblyItem.cpp (100%) rename {libevmcore => libevmasm}/AssemblyItem.h (98%) create mode 100644 libevmasm/CMakeLists.txt rename {libevmcore => libevmasm}/CommonSubexpressionEliminator.cpp (99%) rename {libevmcore => libevmasm}/CommonSubexpressionEliminator.h (99%) rename {libevmcore => libevmasm}/ControlFlowGraph.cpp (97%) rename {libevmcore => libevmasm}/ControlFlowGraph.h (100%) create mode 100644 libevmasm/Exceptions.h rename {libevmcore => libevmasm}/ExpressionClasses.cpp (99%) rename {libevmcore => libevmasm}/ExpressionClasses.h (99%) rename {libevmcore => libevmasm}/SemanticInformation.cpp (97%) rename {libevmcore => libevmasm}/SemanticInformation.h (100%) rename {libevmcore => libevmasm}/SourceLocation.h (100%) rename {libethcore => libevmcore}/Params.cpp (98%) rename {libethcore => libevmcore}/Params.h (99%) diff --git a/CMakeLists.txt b/CMakeLists.txt index ff8732156..667c2fb73 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -305,6 +305,7 @@ endif() add_subdirectory(libdevcore) add_subdirectory(libevmcore) +add_subdirectory(libevmasm) add_subdirectory(liblll) if (SERPENT) diff --git a/alethzero/CMakeLists.txt b/alethzero/CMakeLists.txt index 9abb3f1a4..41d9ea10f 100644 --- a/alethzero/CMakeLists.txt +++ b/alethzero/CMakeLists.txt @@ -55,8 +55,7 @@ target_link_libraries(${EXECUTABLE} lll) if (SOLIDITY) target_link_libraries(${EXECUTABLE} solidity) endif () -target_link_libraries(${EXECUTABLE} evmcore) -target_link_libraries(${EXECUTABLE} devcore) +target_link_libraries(${EXECUTABLE} evmasm) target_link_libraries(${EXECUTABLE} web3jsonrpc) target_link_libraries(${EXECUTABLE} jsqrc) target_link_libraries(${EXECUTABLE} natspec) diff --git a/evmjit/libevmjit-cpp/Env.cpp b/evmjit/libevmjit-cpp/Env.cpp index b89aca726..2c37412fc 100644 --- a/evmjit/libevmjit-cpp/Env.cpp +++ b/evmjit/libevmjit-cpp/Env.cpp @@ -1,7 +1,7 @@ #pragma GCC diagnostic ignored "-Wconversion" #include -#include +#include #include #include "Utils.h" diff --git a/libethcore/BlockInfo.cpp b/libethcore/BlockInfo.cpp index e9ce070dc..24b108ccb 100644 --- a/libethcore/BlockInfo.cpp +++ b/libethcore/BlockInfo.cpp @@ -23,10 +23,10 @@ #include #include #include +#include #include "EthashAux.h" #include "ProofOfWork.h" #include "Exceptions.h" -#include "Params.h" #include "BlockInfo.h" using namespace std; using namespace dev; diff --git a/libethcore/CMakeLists.txt b/libethcore/CMakeLists.txt index 1adb8428e..4dd626642 100644 --- a/libethcore/CMakeLists.txt +++ b/libethcore/CMakeLists.txt @@ -28,7 +28,7 @@ add_library(${EXECUTABLE} ${SRC_LIST} ${HEADERS}) target_link_libraries(${EXECUTABLE} ethash) target_link_libraries(${EXECUTABLE} devcrypto) -target_link_libraries(${EXECUTABLE} devcore) +target_link_libraries(${EXECUTABLE} evmcore) if (ETHASHCL) target_link_libraries(${EXECUTABLE} ethash-cl) diff --git a/libethcore/EthashAux.cpp b/libethcore/EthashAux.cpp index 19a96f550..36b6f1bd5 100644 --- a/libethcore/EthashAux.cpp +++ b/libethcore/EthashAux.cpp @@ -33,7 +33,7 @@ #include #include #include -#include +#include #include "BlockInfo.h" using namespace std; using namespace chrono; diff --git a/libethereum/Interface.h b/libethereum/Interface.h index 6edd97b4c..e23a70f4c 100644 --- a/libethereum/Interface.h +++ b/libethereum/Interface.h @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include #include "LogFilter.h" #include "Transaction.h" diff --git a/libethereum/Precompiled.cpp b/libethereum/Precompiled.cpp index 62d159418..0fd5cb45b 100644 --- a/libethereum/Precompiled.cpp +++ b/libethereum/Precompiled.cpp @@ -24,7 +24,7 @@ #include #include #include -#include +#include using namespace std; using namespace dev; using namespace dev::eth; diff --git a/libethereum/State.h b/libethereum/State.h index d02521c7a..f71e68eac 100644 --- a/libethereum/State.h +++ b/libethereum/State.h @@ -31,7 +31,7 @@ #include #include #include -#include +#include #include #include "TransactionQueue.h" #include "Account.h" diff --git a/libethereum/Transaction.h b/libethereum/Transaction.h index 7276493c2..675bb9eb7 100644 --- a/libethereum/Transaction.h +++ b/libethereum/Transaction.h @@ -24,7 +24,7 @@ #include #include #include -#include +#include namespace dev { namespace eth diff --git a/libevm/VM.h b/libevm/VM.h index 1cf06b78b..30007e0b3 100644 --- a/libevm/VM.h +++ b/libevm/VM.h @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include "VMFace.h" namespace dev diff --git a/libevmcore/Assembly.cpp b/libevmasm/Assembly.cpp similarity index 99% rename from libevmcore/Assembly.cpp rename to libevmasm/Assembly.cpp index eac946230..6cc09a4bc 100644 --- a/libevmcore/Assembly.cpp +++ b/libevmasm/Assembly.cpp @@ -22,8 +22,8 @@ #include "Assembly.h" #include #include -#include -#include +#include +#include #include using namespace std; using namespace dev; diff --git a/libevmcore/Assembly.h b/libevmasm/Assembly.h similarity index 98% rename from libevmcore/Assembly.h rename to libevmasm/Assembly.h index 4ac873682..b4850f7d0 100644 --- a/libevmcore/Assembly.h +++ b/libevmasm/Assembly.h @@ -25,9 +25,9 @@ #include #include #include -#include #include -#include +#include +#include #include "Exceptions.h" #include diff --git a/libevmcore/AssemblyItem.cpp b/libevmasm/AssemblyItem.cpp similarity index 100% rename from libevmcore/AssemblyItem.cpp rename to libevmasm/AssemblyItem.cpp diff --git a/libevmcore/AssemblyItem.h b/libevmasm/AssemblyItem.h similarity index 98% rename from libevmcore/AssemblyItem.h rename to libevmasm/AssemblyItem.h index 7400954d3..6f2a65de9 100644 --- a/libevmcore/AssemblyItem.h +++ b/libevmasm/AssemblyItem.h @@ -25,8 +25,8 @@ #include #include #include -#include #include +#include #include "Exceptions.h" namespace dev diff --git a/libevmasm/CMakeLists.txt b/libevmasm/CMakeLists.txt new file mode 100644 index 000000000..f8150806f --- /dev/null +++ b/libevmasm/CMakeLists.txt @@ -0,0 +1,33 @@ +cmake_policy(SET CMP0015 NEW) +# this policy was introduced in cmake 3.0 +# remove if, once 3.0 will be used on unix +if (${CMAKE_MAJOR_VERSION} GREATER 2) + # old policy do not use MACOSX_RPATH + cmake_policy(SET CMP0042 OLD) +endif() +set(CMAKE_AUTOMOC OFF) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSTATICLIB") + +aux_source_directory(. SRC_LIST) + +include_directories(BEFORE ${JSONCPP_INCLUDE_DIRS}) +include_directories(BEFORE ..) +include_directories(${Boost_INCLUDE_DIRS}) + +set(EXECUTABLE evmasm) + +file(GLOB HEADERS "*.h") + +if (ETH_STATIC) + add_library(${EXECUTABLE} STATIC ${SRC_LIST} ${HEADERS}) +else() + add_library(${EXECUTABLE} SHARED ${SRC_LIST} ${HEADERS}) +endif() + +target_link_libraries(${EXECUTABLE} evmcore) +target_link_libraries(${EXECUTABLE} devcrypto) + +install( TARGETS ${EXECUTABLE} RUNTIME DESTINATION bin ARCHIVE DESTINATION lib LIBRARY DESTINATION lib ) +install( FILES ${HEADERS} DESTINATION include/${EXECUTABLE} ) + diff --git a/libevmcore/CommonSubexpressionEliminator.cpp b/libevmasm/CommonSubexpressionEliminator.cpp similarity index 99% rename from libevmcore/CommonSubexpressionEliminator.cpp rename to libevmasm/CommonSubexpressionEliminator.cpp index 65305b42a..63524d6f3 100644 --- a/libevmcore/CommonSubexpressionEliminator.cpp +++ b/libevmasm/CommonSubexpressionEliminator.cpp @@ -24,8 +24,8 @@ #include #include #include -#include -#include +#include +#include using namespace std; using namespace dev; diff --git a/libevmcore/CommonSubexpressionEliminator.h b/libevmasm/CommonSubexpressionEliminator.h similarity index 99% rename from libevmcore/CommonSubexpressionEliminator.h rename to libevmasm/CommonSubexpressionEliminator.h index 6001f1780..6156bc81a 100644 --- a/libevmcore/CommonSubexpressionEliminator.h +++ b/libevmasm/CommonSubexpressionEliminator.h @@ -30,8 +30,8 @@ #include #include #include -#include -#include +#include +#include namespace dev { diff --git a/libevmcore/ControlFlowGraph.cpp b/libevmasm/ControlFlowGraph.cpp similarity index 97% rename from libevmcore/ControlFlowGraph.cpp rename to libevmasm/ControlFlowGraph.cpp index ca20a8fb0..cc4367e64 100644 --- a/libevmcore/ControlFlowGraph.cpp +++ b/libevmasm/ControlFlowGraph.cpp @@ -21,11 +21,11 @@ * Control flow analysis for the optimizer. */ -#include +#include #include -#include -#include -#include +#include +#include +#include using namespace std; using namespace dev; diff --git a/libevmcore/ControlFlowGraph.h b/libevmasm/ControlFlowGraph.h similarity index 100% rename from libevmcore/ControlFlowGraph.h rename to libevmasm/ControlFlowGraph.h diff --git a/libevmasm/Exceptions.h b/libevmasm/Exceptions.h new file mode 100644 index 000000000..7cc190e41 --- /dev/null +++ b/libevmasm/Exceptions.h @@ -0,0 +1,36 @@ +/* + This file is part of cpp-ethereum. + + cpp-ethereum is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + cpp-ethereum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with cpp-ethereum. If not, see . +*/ +/** @file Exceptions.h + * @author Christian + * @date 2014 + */ + +#pragma once + +#include + +namespace dev +{ +namespace eth +{ + +struct AssemblyException: virtual Exception {}; +struct OptimizerException: virtual AssemblyException {}; +struct StackTooDeepException: virtual OptimizerException {}; + +} +} diff --git a/libevmcore/ExpressionClasses.cpp b/libevmasm/ExpressionClasses.cpp similarity index 99% rename from libevmcore/ExpressionClasses.cpp rename to libevmasm/ExpressionClasses.cpp index 7c5d9ad72..1e60a7fe8 100644 --- a/libevmcore/ExpressionClasses.cpp +++ b/libevmasm/ExpressionClasses.cpp @@ -21,14 +21,14 @@ * Container for equivalence classes of expressions for use in common subexpression elimination. */ -#include +#include #include #include #include #include #include -#include -#include +#include +#include using namespace std; using namespace dev; diff --git a/libevmcore/ExpressionClasses.h b/libevmasm/ExpressionClasses.h similarity index 99% rename from libevmcore/ExpressionClasses.h rename to libevmasm/ExpressionClasses.h index d5bf8e547..2f720f606 100644 --- a/libevmcore/ExpressionClasses.h +++ b/libevmasm/ExpressionClasses.h @@ -27,7 +27,7 @@ #include #include #include -#include +#include namespace dev { diff --git a/libevmcore/SemanticInformation.cpp b/libevmasm/SemanticInformation.cpp similarity index 97% rename from libevmcore/SemanticInformation.cpp rename to libevmasm/SemanticInformation.cpp index 3abb26dd9..83d59efc7 100644 --- a/libevmcore/SemanticInformation.cpp +++ b/libevmasm/SemanticInformation.cpp @@ -21,8 +21,8 @@ * Helper to provide semantic information about assembly items. */ -#include -#include +#include +#include using namespace std; using namespace dev; diff --git a/libevmcore/SemanticInformation.h b/libevmasm/SemanticInformation.h similarity index 100% rename from libevmcore/SemanticInformation.h rename to libevmasm/SemanticInformation.h diff --git a/libevmcore/SourceLocation.h b/libevmasm/SourceLocation.h similarity index 100% rename from libevmcore/SourceLocation.h rename to libevmasm/SourceLocation.h diff --git a/libevmcore/CMakeLists.txt b/libevmcore/CMakeLists.txt index 2da76882e..83042e65e 100644 --- a/libevmcore/CMakeLists.txt +++ b/libevmcore/CMakeLists.txt @@ -7,11 +7,8 @@ if (${CMAKE_MAJOR_VERSION} GREATER 2) endif() set(CMAKE_AUTOMOC OFF) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSTATICLIB") - aux_source_directory(. SRC_LIST) -include_directories(BEFORE ${JSONCPP_INCLUDE_DIRS}) include_directories(BEFORE ..) include_directories(${Boost_INCLUDE_DIRS}) @@ -22,7 +19,6 @@ file(GLOB HEADERS "*.h") add_library(${EXECUTABLE} ${SRC_LIST} ${HEADERS}) target_link_libraries(${EXECUTABLE} devcore) -target_link_libraries(${EXECUTABLE} devcrypto) install( TARGETS ${EXECUTABLE} RUNTIME DESTINATION bin ARCHIVE DESTINATION lib LIBRARY DESTINATION lib ) install( FILES ${HEADERS} DESTINATION include/${EXECUTABLE} ) diff --git a/libevmcore/Exceptions.h b/libevmcore/Exceptions.h index fa3c19f13..72af277df 100644 --- a/libevmcore/Exceptions.h +++ b/libevmcore/Exceptions.h @@ -28,11 +28,8 @@ namespace dev namespace eth { -struct AssemblyException: virtual Exception {}; -struct InvalidDeposit: virtual AssemblyException {}; -struct InvalidOpcode: virtual AssemblyException {}; -struct OptimizerException: virtual AssemblyException {}; -struct StackTooDeepException: virtual OptimizerException {}; +struct InvalidDeposit: virtual Exception {}; +struct InvalidOpcode: virtual Exception {}; } } diff --git a/libethcore/Params.cpp b/libevmcore/Params.cpp similarity index 98% rename from libethcore/Params.cpp rename to libevmcore/Params.cpp index 655c8a78b..d70cfc379 100644 --- a/libethcore/Params.cpp +++ b/libevmcore/Params.cpp @@ -14,7 +14,7 @@ You should have received a copy of the GNU General Public License along with cpp-ethereum. If not, see . */ -/** @file FeeStructure.cpp +/** @file Params.cpp * @author Gav Wood * @date 2014 */ diff --git a/libethcore/Params.h b/libevmcore/Params.h similarity index 99% rename from libethcore/Params.h rename to libevmcore/Params.h index b957f9737..26f12b37c 100644 --- a/libethcore/Params.h +++ b/libevmcore/Params.h @@ -14,7 +14,7 @@ You should have received a copy of the GNU General Public License along with cpp-ethereum. If not, see . */ -/** @file FeeStructure.h +/** @file Params.h * @author Gav Wood * @date 2014 */ diff --git a/liblll/CMakeLists.txt b/liblll/CMakeLists.txt index d3f465f37..66f32e4d8 100644 --- a/liblll/CMakeLists.txt +++ b/liblll/CMakeLists.txt @@ -21,8 +21,7 @@ file(GLOB HEADERS "*.h") add_library(${EXECUTABLE} ${SRC_LIST} ${HEADERS}) -target_link_libraries(${EXECUTABLE} evmcore) -target_link_libraries(${EXECUTABLE} devcore) +target_link_libraries(${EXECUTABLE} evmasm) install( TARGETS ${EXECUTABLE} RUNTIME DESTINATION bin ARCHIVE DESTINATION lib LIBRARY DESTINATION lib ) install( FILES ${HEADERS} DESTINATION include/${EXECUTABLE} ) diff --git a/liblll/CodeFragment.h b/liblll/CodeFragment.h index 554f90b46..03f812b60 100644 --- a/liblll/CodeFragment.h +++ b/liblll/CodeFragment.h @@ -23,7 +23,7 @@ #include #include -#include +#include #include "Exceptions.h" namespace boost { namespace spirit { class utree; } } diff --git a/libsolidity/AST.h b/libsolidity/AST.h index c9ad6447e..fde0b71b0 100644 --- a/libsolidity/AST.h +++ b/libsolidity/AST.h @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/libsolidity/CMakeLists.txt b/libsolidity/CMakeLists.txt index 3d31331a4..10c7bc2d2 100644 --- a/libsolidity/CMakeLists.txt +++ b/libsolidity/CMakeLists.txt @@ -22,7 +22,7 @@ file(GLOB HEADERS "*.h") add_library(${EXECUTABLE} ${SRC_LIST} ${HEADERS}) target_link_libraries(${EXECUTABLE} ${JSONCPP_LIBRARIES}) -target_link_libraries(${EXECUTABLE} evmcore) +target_link_libraries(${EXECUTABLE} evmasm) target_link_libraries(${EXECUTABLE} devcrypto) install( TARGETS ${EXECUTABLE} RUNTIME DESTINATION bin ARCHIVE DESTINATION lib LIBRARY DESTINATION lib ) diff --git a/libsolidity/Compiler.cpp b/libsolidity/Compiler.cpp index 37b577ccd..0301375fe 100644 --- a/libsolidity/Compiler.cpp +++ b/libsolidity/Compiler.cpp @@ -24,7 +24,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/libsolidity/Compiler.h b/libsolidity/Compiler.h index c3c3b9dcc..106038d1c 100644 --- a/libsolidity/Compiler.h +++ b/libsolidity/Compiler.h @@ -26,7 +26,7 @@ #include #include #include -#include +#include namespace dev { namespace solidity { diff --git a/libsolidity/CompilerContext.h b/libsolidity/CompilerContext.h index 0ca6369dd..933912455 100644 --- a/libsolidity/CompilerContext.h +++ b/libsolidity/CompilerContext.h @@ -26,7 +26,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/libsolidity/Exceptions.h b/libsolidity/Exceptions.h index 0d07c7064..e5f653e1f 100644 --- a/libsolidity/Exceptions.h +++ b/libsolidity/Exceptions.h @@ -24,7 +24,7 @@ #include #include -#include +#include namespace dev { diff --git a/libsolidity/ExpressionCompiler.h b/libsolidity/ExpressionCompiler.h index 35526662a..45a2311ef 100644 --- a/libsolidity/ExpressionCompiler.h +++ b/libsolidity/ExpressionCompiler.h @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/libsolidity/LValue.h b/libsolidity/LValue.h index ad6225162..1617e8167 100644 --- a/libsolidity/LValue.h +++ b/libsolidity/LValue.h @@ -23,7 +23,7 @@ #pragma once #include -#include +#include #include namespace dev diff --git a/libsolidity/Parser.cpp b/libsolidity/Parser.cpp index 43571314a..37c358d3b 100644 --- a/libsolidity/Parser.cpp +++ b/libsolidity/Parser.cpp @@ -22,7 +22,7 @@ #include #include -#include +#include #include #include #include diff --git a/libsolidity/Scanner.h b/libsolidity/Scanner.h index b57b8a189..43fcd133c 100644 --- a/libsolidity/Scanner.h +++ b/libsolidity/Scanner.h @@ -55,7 +55,7 @@ #include #include #include -#include +#include #include namespace dev diff --git a/libsolidity/SourceReferenceFormatter.h b/libsolidity/SourceReferenceFormatter.h index 304e6a273..ba1077ffa 100644 --- a/libsolidity/SourceReferenceFormatter.h +++ b/libsolidity/SourceReferenceFormatter.h @@ -23,7 +23,7 @@ #pragma once #include -#include +#include namespace dev { diff --git a/mix/CodeModel.cpp b/mix/CodeModel.cpp index 357ce88b9..48708ac59 100644 --- a/mix/CodeModel.cpp +++ b/mix/CodeModel.cpp @@ -26,7 +26,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/mix/CodeModel.h b/mix/CodeModel.h index 0572483c0..24ed3dcc5 100644 --- a/mix/CodeModel.h +++ b/mix/CodeModel.h @@ -30,7 +30,7 @@ #include #include #include -#include +#include #include "SolidityType.h" class QTextDocument; diff --git a/mix/QBasicNodeDefinition.h b/mix/QBasicNodeDefinition.h index 9179905eb..6a327b734 100644 --- a/mix/QBasicNodeDefinition.h +++ b/mix/QBasicNodeDefinition.h @@ -23,7 +23,7 @@ #include #include -#include +#include namespace dev { diff --git a/test/libsolidity/Assembly.cpp b/test/libsolidity/Assembly.cpp index 8dcee7fb5..ccc4bf811 100644 --- a/test/libsolidity/Assembly.cpp +++ b/test/libsolidity/Assembly.cpp @@ -17,20 +17,20 @@ /** * @author Lefteris Karapetsas * @date 2015 - * Unit tests for Assembly Items from evmcore/Assembly.h + * Unit tests for Assembly Items from evmasm/Assembly.h */ #include #include #include #include -#include +#include +#include #include #include #include #include #include -#include using namespace std; using namespace dev::eth; diff --git a/test/libsolidity/SolidityOptimizer.cpp b/test/libsolidity/SolidityOptimizer.cpp index ceb9c68d9..9cdaa5886 100644 --- a/test/libsolidity/SolidityOptimizer.cpp +++ b/test/libsolidity/SolidityOptimizer.cpp @@ -26,9 +26,9 @@ #include #include #include -#include -#include -#include +#include +#include +#include using namespace std; using namespace dev::eth; From 8f98d65626586fb3a86666a9770b2fa20df107fa Mon Sep 17 00:00:00 2001 From: chriseth Date: Wed, 29 Apr 2015 16:23:22 +0200 Subject: [PATCH 02/13] Split params into evm-related and mining/block-related. --- libethcore/BlockInfo.cpp | 2 +- libethcore/EthashAux.cpp | 1 - libethcore/Params.cpp | 43 +++++++++++++++++++++++++++++++++ libethcore/Params.h | 42 ++++++++++++++++++++++++++++++++ libethereum/BlockChain.cpp | 1 + libethereum/CanonBlockChain.cpp | 1 + libethereum/Interface.h | 1 - libethereum/State.h | 1 - libevmcore/Params.cpp | 8 ------ libevmcore/Params.h | 8 ------ mix/MixClient.cpp | 1 + 11 files changed, 89 insertions(+), 20 deletions(-) create mode 100644 libethcore/Params.cpp create mode 100644 libethcore/Params.h diff --git a/libethcore/BlockInfo.cpp b/libethcore/BlockInfo.cpp index 24b108ccb..24fc1cb65 100644 --- a/libethcore/BlockInfo.cpp +++ b/libethcore/BlockInfo.cpp @@ -23,7 +23,7 @@ #include #include #include -#include +#include #include "EthashAux.h" #include "ProofOfWork.h" #include "Exceptions.h" diff --git a/libethcore/EthashAux.cpp b/libethcore/EthashAux.cpp index 36b6f1bd5..215d50203 100644 --- a/libethcore/EthashAux.cpp +++ b/libethcore/EthashAux.cpp @@ -33,7 +33,6 @@ #include #include #include -#include #include "BlockInfo.h" using namespace std; using namespace chrono; diff --git a/libethcore/Params.cpp b/libethcore/Params.cpp new file mode 100644 index 000000000..a6107e62b --- /dev/null +++ b/libethcore/Params.cpp @@ -0,0 +1,43 @@ +/* + This file is part of cpp-ethereum. + + cpp-ethereum is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + cpp-ethereum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with cpp-ethereum. If not, see . +*/ +/** @file Params.cpp + * @author Gav Wood + * @date 2014 + */ + +#include "Params.h" + +using namespace std; +namespace dev +{ +namespace eth +{ + +//--- BEGIN: AUTOGENERATED FROM github.com/ethereum/common/params.json +u256 const c_genesisDifficulty = 131072; +u256 const c_maximumExtraDataSize = 1024; +u256 const c_genesisGasLimit = 3141592; +u256 const c_minGasLimit = 125000; +u256 const c_gasLimitBoundDivisor = 1024; +u256 const c_minimumDifficulty = 131072; +u256 const c_difficultyBoundDivisor = 2048; +u256 const c_durationLimit = 8; +//--- END: AUTOGENERATED FROM /feeStructure.json + +} +} + diff --git a/libethcore/Params.h b/libethcore/Params.h new file mode 100644 index 000000000..3520b2f1b --- /dev/null +++ b/libethcore/Params.h @@ -0,0 +1,42 @@ +/* + This file is part of cpp-ethereum. + + cpp-ethereum is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + cpp-ethereum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with cpp-ethereum. If not, see . +*/ +/** @file Params.h + * @author Gav Wood + * @date 2014 + */ + +#pragma once + +#include + +namespace dev +{ +namespace eth +{ + +//--- BEGIN: AUTOGENERATED FROM /feeStructure.json +extern u256 const c_genesisGasLimit; +extern u256 const c_minGasLimit; +extern u256 const c_gasLimitBoundDivisor; +extern u256 const c_genesisDifficulty; +extern u256 const c_minimumDifficulty; +extern u256 const c_difficultyBoundDivisor; +extern u256 const c_durationLimit; +extern u256 const c_maximumExtraDataSize; + +} +} diff --git a/libethereum/BlockChain.cpp b/libethereum/BlockChain.cpp index 2c5e5c01c..eb36fd8e3 100644 --- a/libethereum/BlockChain.cpp +++ b/libethereum/BlockChain.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include "GenesisInfo.h" #include "State.h" diff --git a/libethereum/CanonBlockChain.cpp b/libethereum/CanonBlockChain.cpp index b5c47b653..2cc1d24dc 100644 --- a/libethereum/CanonBlockChain.cpp +++ b/libethereum/CanonBlockChain.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include "GenesisInfo.h" #include "State.h" diff --git a/libethereum/Interface.h b/libethereum/Interface.h index e23a70f4c..ff2c9ad9f 100644 --- a/libethereum/Interface.h +++ b/libethereum/Interface.h @@ -25,7 +25,6 @@ #include #include #include -#include #include #include "LogFilter.h" #include "Transaction.h" diff --git a/libethereum/State.h b/libethereum/State.h index f71e68eac..e3468c24c 100644 --- a/libethereum/State.h +++ b/libethereum/State.h @@ -31,7 +31,6 @@ #include #include #include -#include #include #include "TransactionQueue.h" #include "Account.h" diff --git a/libevmcore/Params.cpp b/libevmcore/Params.cpp index d70cfc379..91b50d0f6 100644 --- a/libevmcore/Params.cpp +++ b/libevmcore/Params.cpp @@ -28,14 +28,6 @@ namespace eth { //--- BEGIN: AUTOGENERATED FROM github.com/ethereum/common/params.json -u256 const c_genesisDifficulty = 131072; -u256 const c_maximumExtraDataSize = 1024; -u256 const c_genesisGasLimit = 3141592; -u256 const c_minGasLimit = 125000; -u256 const c_gasLimitBoundDivisor = 1024; -u256 const c_minimumDifficulty = 131072; -u256 const c_difficultyBoundDivisor = 2048; -u256 const c_durationLimit = 8; u256 const c_stackLimit = 1024; u256 const c_tierStepGas[] = {0, 2, 3, 5, 8, 10, 20, 0}; u256 const c_expGas = 10; diff --git a/libevmcore/Params.h b/libevmcore/Params.h index 26f12b37c..213ff5a2d 100644 --- a/libevmcore/Params.h +++ b/libevmcore/Params.h @@ -29,14 +29,6 @@ namespace eth { //--- BEGIN: AUTOGENERATED FROM /feeStructure.json -extern u256 const c_genesisGasLimit; -extern u256 const c_minGasLimit; -extern u256 const c_gasLimitBoundDivisor; -extern u256 const c_genesisDifficulty; -extern u256 const c_minimumDifficulty; -extern u256 const c_difficultyBoundDivisor; -extern u256 const c_durationLimit; -extern u256 const c_maximumExtraDataSize; extern u256 const c_stackLimit; extern u256 const c_tierStepGas[8]; ///< Once per operation, for a selection of them. diff --git a/mix/MixClient.cpp b/mix/MixClient.cpp index 3fb325bd4..b1d8f889e 100644 --- a/mix/MixClient.cpp +++ b/mix/MixClient.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include "Exceptions.h" using namespace std; From 6d80b0c59b1feff6573ee8ea961064ed9f553701 Mon Sep 17 00:00:00 2001 From: chriseth Date: Thu, 30 Apr 2015 11:41:48 +0200 Subject: [PATCH 03/13] Build fix after merge. --- libsolidity/ASTUtils.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libsolidity/ASTUtils.h b/libsolidity/ASTUtils.h index f2b90ea53..b24a34048 100644 --- a/libsolidity/ASTUtils.h +++ b/libsolidity/ASTUtils.h @@ -22,7 +22,7 @@ #pragma once -#include +#include #include namespace dev From a1c84c7172fab017a82fa93f93e54fc7cb972661 Mon Sep 17 00:00:00 2001 From: arkpar Date: Mon, 4 May 2015 16:23:02 +0200 Subject: [PATCH 04/13] blockchain download and import performance optimizations --- alethzero/DownloadView.cpp | 4 ++-- libdevcore/Guards.h | 13 +++++++++++++ libdevcore/Log.cpp | 4 ++-- libethcore/EthashAux.cpp | 11 +++++------ libethereum/BlockChain.cpp | 10 +++++++--- libethereum/BlockChain.h | 1 - libethereum/DownloadMan.cpp | 2 +- libethereum/DownloadMan.h | 3 ++- libethereum/EthereumHost.cpp | 2 +- libethereum/EthereumPeer.cpp | 19 +++++++++++-------- 10 files changed, 44 insertions(+), 25 deletions(-) diff --git a/alethzero/DownloadView.cpp b/alethzero/DownloadView.cpp index 88a595566..009e2dc83 100644 --- a/alethzero/DownloadView.cpp +++ b/alethzero/DownloadView.cpp @@ -39,13 +39,13 @@ void DownloadView::paintEvent(QPaintEvent*) QPainter p(this); p.fillRect(rect(), Qt::white); - if (!m_man || m_man->chain().empty() || !m_man->subCount()) + if (!m_man || m_man->chainEmpty() || !m_man->subCount()) return; double ratio = (double)rect().width() / rect().height(); if (ratio < 1) ratio = 1 / ratio; - double n = min(16.0, min(rect().width(), rect().height()) / ceil(sqrt(m_man->chain().size() / ratio))); + double n = min(16.0, min(rect().width(), rect().height()) / ceil(sqrt(m_man->chainSize() / ratio))); // QSizeF area(rect().width() / floor(rect().width() / n), rect().height() / floor(rect().height() / n)); QSizeF area(n, n); diff --git a/libdevcore/Guards.h b/libdevcore/Guards.h index 4229428ce..8d2e8961d 100644 --- a/libdevcore/Guards.h +++ b/libdevcore/Guards.h @@ -22,6 +22,7 @@ #pragma once #include +#include #include namespace dev @@ -61,6 +62,18 @@ struct GenericUnguardSharedBool MutexType& m; }; +/** @brief Simple lock that waits for release without making context switch */ +class SpinLock +{ +public: + SpinLock() { lck.clear(); } + void lock() { while (lck.test_and_set(std::memory_order_acquire)) {} } + void unlock() { lck.clear(std::memory_order_release); } +private: + std::atomic_flag lck; +}; +using SpinGuard = std::lock_guard; + /** @brief Simple block guard. * The expression/block following is guarded though the given mutex. * Usage: diff --git a/libdevcore/Log.cpp b/libdevcore/Log.cpp index e086278ec..3dd2b3879 100644 --- a/libdevcore/Log.cpp +++ b/libdevcore/Log.cpp @@ -158,8 +158,8 @@ void dev::setThreadName(string const& _n) void dev::simpleDebugOut(std::string const& _s, char const*) { - static Mutex s_lock; - Guard l(s_lock); + static SpinLock s_lock; + SpinGuard l(s_lock); cerr << _s << endl << flush; diff --git a/libethcore/EthashAux.cpp b/libethcore/EthashAux.cpp index 9cb4d9fad..dd7e92a66 100644 --- a/libethcore/EthashAux.cpp +++ b/libethcore/EthashAux.cpp @@ -87,13 +87,10 @@ ethash_params EthashAux::params(h256 const& _seedHash) { Guard l(get()->x_epochs); unsigned epoch = 0; - try + auto epochIter = get()->m_epochs.find(_seedHash); + if (epochIter == get()->m_epochs.end()) { - epoch = get()->m_epochs.at(_seedHash); - } - catch (...) - { -// cdebug << "Searching for seedHash " << _seedHash; + // cdebug << "Searching for seedHash " << _seedHash; for (h256 h; h != _seedHash && epoch < 2048; ++epoch, h = sha3(h), get()->m_epochs[h] = epoch) {} if (epoch == 2048) { @@ -102,6 +99,8 @@ ethash_params EthashAux::params(h256 const& _seedHash) throw std::invalid_argument(error.str()); } } + else + epoch = epochIter->second; return params(epoch * ETHASH_EPOCH_LENGTH); } diff --git a/libethereum/BlockChain.cpp b/libethereum/BlockChain.cpp index 69078b400..49e73f1bf 100644 --- a/libethereum/BlockChain.cpp +++ b/libethereum/BlockChain.cpp @@ -293,9 +293,14 @@ LastHashes BlockChain::lastHashes(unsigned _n) const Guard l(x_lastLastHashes); if (m_lastLastHashesNumber != _n || m_lastLastHashes.empty()) { - m_lastLastHashes.resize(256); + LastHashes lastHashes(256); + //m_lastLastHashes.resize(256); for (unsigned i = 0; i < 256; ++i) - m_lastLastHashes[i] = _n >= i ? numberHash(_n - i) : h256(); + { + size_t prevIndex = m_lastLastHashesNumber - _n + i; + lastHashes[i] = (prevIndex >= 0 && prevIndex < m_lastLastHashes.size()) ? m_lastLastHashes[prevIndex] : (_n >= i ? numberHash(_n - i) : h256()); + } + m_lastLastHashes = std::move(lastHashes); m_lastLastHashesNumber = _n; } return m_lastLastHashes; @@ -609,7 +614,6 @@ ImportRoute BlockChain::import(bytes const& _block, OverlayDB const& _db, Import } clog(BlockChainNote) << " Imported and best" << td << " (#" << bi.number << "). Has" << (details(bi.parentHash).children.size() - 1) << "siblings. Route:" << route; - noteCanonChanged(); StructuredLogger::chainNewHead( bi.headerHash(WithoutNonce).abridged(), diff --git a/libethereum/BlockChain.h b/libethereum/BlockChain.h index d04bff298..5756d1811 100644 --- a/libethereum/BlockChain.h +++ b/libethereum/BlockChain.h @@ -300,7 +300,6 @@ private: void noteUsed(h256 const& _h, unsigned _extra = (unsigned)-1) const; std::chrono::system_clock::time_point m_lastCollection; - void noteCanonChanged() const { Guard l(x_lastLastHashes); m_lastLastHashes.clear(); } mutable Mutex x_lastLastHashes; mutable LastHashes m_lastLastHashes; mutable unsigned m_lastLastHashesNumber = (unsigned)-1; diff --git a/libethereum/DownloadMan.cpp b/libethereum/DownloadMan.cpp index be33f5187..1b73dca5b 100644 --- a/libethereum/DownloadMan.cpp +++ b/libethereum/DownloadMan.cpp @@ -50,7 +50,7 @@ h256Set DownloadSub::nextFetch(unsigned _n) m_indices.clear(); m_remaining.clear(); - if (!m_man || m_man->chain().empty()) + if (!m_man || m_man->chainEmpty()) return h256Set(); m_asked = (~(m_man->taken() + m_attempted)).lowest(_n); diff --git a/libethereum/DownloadMan.h b/libethereum/DownloadMan.h index d32d0465c..82e0f09e2 100644 --- a/libethereum/DownloadMan.h +++ b/libethereum/DownloadMan.h @@ -143,7 +143,8 @@ public: return ret; } - h256s chain() const { ReadGuard l(m_lock); return m_chain; } + size_t chainSize() const { ReadGuard l(m_lock); return m_chain.size(); } + size_t chainEmpty() const { ReadGuard l(m_lock); return m_chain.empty(); } void foreachSub(std::function const& _f) const { ReadGuard l(x_subs); for(auto i: m_subs) _f(*i); } unsigned subCount() const { ReadGuard l(x_subs); return m_subs.size(); } RangeMask blocksGot() const { ReadGuard l(m_lock); return m_blocksGot; } diff --git a/libethereum/EthereumHost.cpp b/libethereum/EthereumHost.cpp index c98dd7642..340ae417f 100644 --- a/libethereum/EthereumHost.cpp +++ b/libethereum/EthereumHost.cpp @@ -122,7 +122,7 @@ void EthereumHost::noteDoneBlocks(EthereumPeer* _who, bool _clemency) // Done our chain-get. clog(NetNote) << "Chain download complete."; // 1/100th for each useful block hash. - _who->addRating(m_man.chain().size() / 100); + _who->addRating(m_man.chainSize() / 100); m_man.reset(); } else if (_who->isSyncing()) diff --git a/libethereum/EthereumPeer.cpp b/libethereum/EthereumPeer.cpp index f3edaf8ea..249831540 100644 --- a/libethereum/EthereumPeer.cpp +++ b/libethereum/EthereumPeer.cpp @@ -329,9 +329,10 @@ bool EthereumPeer::interpret(unsigned _id, RLP const& _r) case GetTransactionsPacket: break; // DEPRECATED. case TransactionsPacket: { - clog(NetAllDetail) << "Transactions (" << dec << _r.itemCount() << "entries)"; + unsigned itemCount = _r.itemCount(); + clog(NetAllDetail) << "Transactions (" << dec << itemCount << "entries)"; Guard l(x_knownTransactions); - for (unsigned i = 0; i < _r.itemCount(); ++i) + for (unsigned i = 0; i < itemCount; ++i) { auto h = sha3(_r[i].data()); m_knownTransactions.insert(h); @@ -373,21 +374,22 @@ bool EthereumPeer::interpret(unsigned _id, RLP const& _r) } case BlockHashesPacket: { - clog(NetMessageSummary) << "BlockHashes (" << dec << _r.itemCount() << "entries)" << (_r.itemCount() ? "" : ": NoMoreHashes"); + unsigned itemCount = _r.itemCount(); + clog(NetMessageSummary) << "BlockHashes (" << dec << itemCount << "entries)" << (itemCount ? "" : ": NoMoreHashes"); if (m_asking != Asking::Hashes) { cwarn << "Peer giving us hashes when we didn't ask for them."; break; } - if (_r.itemCount() == 0) + if (itemCount == 0) { transition(Asking::Blocks); return true; } unsigned knowns = 0; unsigned unknowns = 0; - for (unsigned i = 0; i < _r.itemCount(); ++i) + for (unsigned i = 0; i < itemCount; ++i) { addRating(1); auto h = _r[i].toHash(); @@ -454,12 +456,13 @@ bool EthereumPeer::interpret(unsigned _id, RLP const& _r) } case BlocksPacket: { - clog(NetMessageSummary) << "Blocks (" << dec << _r.itemCount() << "entries)" << (_r.itemCount() ? "" : ": NoMoreBlocks"); + unsigned itemCount = _r.itemCount(); + clog(NetMessageSummary) << "Blocks (" << dec << itemCount << "entries)" << (itemCount ? "" : ": NoMoreBlocks"); if (m_asking != Asking::Blocks) clog(NetWarn) << "Unexpected Blocks received!"; - if (_r.itemCount() == 0) + if (itemCount == 0) { // Got to this peer's latest block - just give up. transition(Asking::Nothing); @@ -472,7 +475,7 @@ bool EthereumPeer::interpret(unsigned _id, RLP const& _r) unsigned got = 0; unsigned repeated = 0; - for (unsigned i = 0; i < _r.itemCount(); ++i) + for (unsigned i = 0; i < itemCount; ++i) { auto h = BlockInfo::headerHash(_r[i].data()); if (m_sub.noteBlock(h)) From 90d06cb7b33cdad1d4458c221db574119a75ddd2 Mon Sep 17 00:00:00 2001 From: arkpar Date: Mon, 4 May 2015 18:19:41 +0200 Subject: [PATCH 05/13] more performance optimizations --- cmake/EthCompilerSettings.cmake | 16 ++++++++-------- libdevcore/FixedHash.h | 2 +- libethereum/BlockChain.cpp | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/cmake/EthCompilerSettings.cmake b/cmake/EthCompilerSettings.cmake index 416bb3095..9e9ae687e 100644 --- a/cmake/EthCompilerSettings.cmake +++ b/cmake/EthCompilerSettings.cmake @@ -9,14 +9,6 @@ if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU") set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG -DETH_RELEASE") set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -DETH_RELEASE") - if (PROFILING) - set(CMAKE_CXX_FLAGS "-g ${CMAKE_CXX_FLAGS}") - add_definitions(-DETH_PROFILING_GPERF) - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -lprofiler") -# set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} -lprofiler") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lprofiler") - endif () - 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)) @@ -61,6 +53,14 @@ else () message(WARNING "Your compiler is not tested, if you run into any issues, we'd welcome any patches.") endif () +if (PROFILING AND (("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU") OR ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang"))) + set(CMAKE_CXX_FLAGS "-g ${CMAKE_CXX_FLAGS}") + add_definitions(-DETH_PROFILING_GPERF) + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -lprofiler") +# set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} -lprofiler") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lprofiler") +endif () + if (("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU") OR ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")) option(USE_LD_GOLD "Use GNU gold linker" ON) if (USE_LD_GOLD) diff --git a/libdevcore/FixedHash.h b/libdevcore/FixedHash.h index 456365299..e68e2538e 100644 --- a/libdevcore/FixedHash.h +++ b/libdevcore/FixedHash.h @@ -80,7 +80,7 @@ public: operator Arith() const { return fromBigEndian(m_data); } /// @returns true iff this is the empty hash. - explicit operator bool() const { return ((Arith)*this) != 0; } + explicit operator bool() const { return std::any_of(m_data.begin(), m_data.end(), [](byte _b) { return _b != 0; }); } // The obvious comparison operators. bool operator==(FixedHash const& _c) const { return m_data == _c.m_data; } diff --git a/libethereum/BlockChain.cpp b/libethereum/BlockChain.cpp index 49e73f1bf..bc5b89d47 100644 --- a/libethereum/BlockChain.cpp +++ b/libethereum/BlockChain.cpp @@ -298,7 +298,7 @@ LastHashes BlockChain::lastHashes(unsigned _n) const for (unsigned i = 0; i < 256; ++i) { size_t prevIndex = m_lastLastHashesNumber - _n + i; - lastHashes[i] = (prevIndex >= 0 && prevIndex < m_lastLastHashes.size()) ? m_lastLastHashes[prevIndex] : (_n >= i ? numberHash(_n - i) : h256()); + lastHashes[i] = (prevIndex < m_lastLastHashes.size()) ? m_lastLastHashes[prevIndex] : (_n >= i ? numberHash(_n - i) : h256()); } m_lastLastHashes = std::move(lastHashes); m_lastLastHashesNumber = _n; From b9f21a3be29dee5a9cc79fb2bea284efb98b4555 Mon Sep 17 00:00:00 2001 From: arkpar Date: Mon, 4 May 2015 19:54:34 +0200 Subject: [PATCH 06/13] style --- libethereum/BlockChain.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libethereum/BlockChain.cpp b/libethereum/BlockChain.cpp index bc5b89d47..c51188506 100644 --- a/libethereum/BlockChain.cpp +++ b/libethereum/BlockChain.cpp @@ -294,7 +294,6 @@ LastHashes BlockChain::lastHashes(unsigned _n) const if (m_lastLastHashesNumber != _n || m_lastLastHashes.empty()) { LastHashes lastHashes(256); - //m_lastLastHashes.resize(256); for (unsigned i = 0; i < 256; ++i) { size_t prevIndex = m_lastLastHashesNumber - _n + i; From 0ccd98bf90d497f426d825fc3a14e6d7c984ace2 Mon Sep 17 00:00:00 2001 From: Vlad Gluhovsky Date: Tue, 5 May 2015 13:11:32 +0200 Subject: [PATCH 07/13] libp2p test test for requirePeer function --- test/libp2p/peer.cpp | 55 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/test/libp2p/peer.cpp b/test/libp2p/peer.cpp index 727430fc8..2e3320006 100644 --- a/test/libp2p/peer.cpp +++ b/test/libp2p/peer.cpp @@ -118,6 +118,61 @@ BOOST_AUTO_TEST_CASE(save_nodes) BOOST_AUTO_TEST_SUITE_END() +BOOST_FIXTURE_TEST_SUITE(p2pPeer, P2PFixture) + +BOOST_AUTO_TEST_CASE(requirePeer) +{ + auto oldLogVerbosity = g_logVerbosity; + g_logVerbosity = 10; + + const char* const localhost = "127.0.0.1"; + NetworkPreferences prefs1(localhost, 30301, false); + NetworkPreferences prefs2(localhost, 30302, false); + Host host1("Test", prefs1); + host1.start(); + + Host host2("Test", prefs2); + host2.start(); + + auto node2 = host2.id(); + host1.requirePeer(node2, NodeIPEndpoint(bi::address::from_string(localhost), prefs2.listenPort, prefs2.listenPort)); + + this_thread::sleep_for(chrono::seconds(3)); + + auto host1peerCount = host1.peerCount(); + auto host2peerCount = host2.peerCount(); + BOOST_REQUIRE_EQUAL(host1peerCount, 1); + BOOST_REQUIRE_EQUAL(host2peerCount, 1); + + PeerSessionInfos sis1 = host1.peerSessionInfo(); + PeerSessionInfos sis2 = host2.peerSessionInfo(); + + BOOST_REQUIRE_EQUAL(sis1.size(), 1); + BOOST_REQUIRE_EQUAL(sis2.size(), 1); + + Peers peers1 = host1.getPeers(); + Peers peers2 = host2.getPeers(); + BOOST_REQUIRE_EQUAL(peers1.size(), 1); + BOOST_REQUIRE_EQUAL(peers2.size(), 1); + + DisconnectReason disconnect1 = peers1[0].lastDisconnect(); + DisconnectReason disconnect2 = peers2[0].lastDisconnect(); + BOOST_REQUIRE_EQUAL(disconnect1, disconnect2); + + host1.relinquishPeer(node2); + + this_thread::sleep_for(chrono::seconds(1)); + + host1peerCount = host1.peerCount(); + host2peerCount = host2.peerCount(); + BOOST_REQUIRE_EQUAL(host1peerCount, 1); + BOOST_REQUIRE_EQUAL(host2peerCount, 1); + + g_logVerbosity = oldLogVerbosity; +} + +BOOST_AUTO_TEST_SUITE_END() + BOOST_AUTO_TEST_SUITE(peerTypes) BOOST_AUTO_TEST_CASE(emptySharedPeer) From 66c3f1149b04bc2197b4735bf3893acce55707ec Mon Sep 17 00:00:00 2001 From: Vlad Gluhovsky Date: Tue, 5 May 2015 13:17:11 +0200 Subject: [PATCH 08/13] Bugfix: null pointer check is added --- libp2p/Host.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libp2p/Host.cpp b/libp2p/Host.cpp index 030c406c0..78c1102c1 100644 --- a/libp2p/Host.cpp +++ b/libp2p/Host.cpp @@ -464,7 +464,7 @@ void Host::connect(std::shared_ptr const& _p) return; } - if (!m_nodeTable->haveNode(_p->id)) + if (!!m_nodeTable && !m_nodeTable->haveNode(_p->id)) { clog(NetWarn) << "Aborted connect. Node not in node table."; m_nodeTable->addNode(*_p.get()); From 7387a1c250aec34bcc978b9ea48c2d109bb31271 Mon Sep 17 00:00:00 2001 From: arkpar Date: Tue, 5 May 2015 13:29:10 +0200 Subject: [PATCH 09/13] replaces cache maps with hash tables, reverted noteCanonChanged --- libdevcore/FixedHash.h | 3 +++ libdevcore/Guards.h | 8 ++++---- libethereum/BlockChain.cpp | 13 +++++-------- libethereum/BlockChain.h | 18 +++++++++++++----- libethereum/BlockDetails.h | 13 +++++++------ 5 files changed, 32 insertions(+), 23 deletions(-) diff --git a/libdevcore/FixedHash.h b/libdevcore/FixedHash.h index e68e2538e..2cf81cb77 100644 --- a/libdevcore/FixedHash.h +++ b/libdevcore/FixedHash.h @@ -64,6 +64,9 @@ public: /// Convert from the corresponding arithmetic type. FixedHash(Arith const& _arith) { toBigEndian(_arith, m_data); } + /// Convert from unsigned + explicit FixedHash(unsigned _u) { toBigEndian(_u, m_data); } + /// Explicitly construct, copying from a byte array. explicit FixedHash(bytes const& _b, ConstructFromHashType _t = FailIfDifferent) { if (_b.size() == N) memcpy(m_data.data(), _b.data(), std::min(_b.size(), N)); else { m_data.fill(0); if (_t != FailIfDifferent) { auto c = std::min(_b.size(), N); for (unsigned i = 0; i < c; ++i) m_data[_t == AlignRight ? N - 1 - i : i] = _b[_t == AlignRight ? _b.size() - 1 - i : i]; } } } diff --git a/libdevcore/Guards.h b/libdevcore/Guards.h index 8d2e8961d..d060108ef 100644 --- a/libdevcore/Guards.h +++ b/libdevcore/Guards.h @@ -66,11 +66,11 @@ struct GenericUnguardSharedBool class SpinLock { public: - SpinLock() { lck.clear(); } - void lock() { while (lck.test_and_set(std::memory_order_acquire)) {} } - void unlock() { lck.clear(std::memory_order_release); } + SpinLock() { m_lock.clear(); } + void lock() { while (m_lock.test_and_set(std::memory_order_acquire)) {} } + void unlock() { m_lock.clear(std::memory_order_release); } private: - std::atomic_flag lck; + std::atomic_flag m_lock; }; using SpinGuard = std::lock_guard; diff --git a/libethereum/BlockChain.cpp b/libethereum/BlockChain.cpp index c51188506..204203c9d 100644 --- a/libethereum/BlockChain.cpp +++ b/libethereum/BlockChain.cpp @@ -293,13 +293,9 @@ LastHashes BlockChain::lastHashes(unsigned _n) const Guard l(x_lastLastHashes); if (m_lastLastHashesNumber != _n || m_lastLastHashes.empty()) { - LastHashes lastHashes(256); + m_lastLastHashes.resize(256); for (unsigned i = 0; i < 256; ++i) - { - size_t prevIndex = m_lastLastHashesNumber - _n + i; - lastHashes[i] = (prevIndex < m_lastLastHashes.size()) ? m_lastLastHashes[prevIndex] : (_n >= i ? numberHash(_n - i) : h256()); - } - m_lastLastHashes = std::move(lastHashes); + m_lastLastHashes[i] = _n >= i ? numberHash(_n - i) : h256(); m_lastLastHashesNumber = _n; } return m_lastLastHashes; @@ -613,6 +609,7 @@ ImportRoute BlockChain::import(bytes const& _block, OverlayDB const& _db, Import } clog(BlockChainNote) << " Imported and best" << td << " (#" << bi.number << "). Has" << (details(bi.parentHash).children.size() - 1) << "siblings. Route:" << route; + noteCanonChanged(); StructuredLogger::chainNewHead( bi.headerHash(WithoutNonce).abridged(), @@ -770,7 +767,7 @@ void BlockChain::noteUsed(h256 const& _h, unsigned _extra) const m_inUse.insert(id); } -template static unsigned getHashSize(map const& _map) +template static unsigned getHashSize(unordered_map const& _map) { unsigned ret = 0; for (auto const& i: _map) @@ -858,7 +855,7 @@ void BlockChain::garbageCollect(bool _force) } } m_cacheUsage.pop_back(); - m_cacheUsage.push_front(std::set{}); + m_cacheUsage.push_front(std::unordered_set{}); } void BlockChain::checkConsistency() diff --git a/libethereum/BlockChain.h b/libethereum/BlockChain.h index 5756d1811..f69f67a5d 100644 --- a/libethereum/BlockChain.h +++ b/libethereum/BlockChain.h @@ -28,6 +28,8 @@ #include #include +#include +#include #include #include #include @@ -40,6 +42,11 @@ #include "BlockQueue.h" namespace ldb = leveldb; +template <> struct std::hash> +{ + size_t operator()(const pair &x ) const { return std::hash()(x.first) ^ std::hash()(x.second); } +}; + namespace dev { @@ -66,7 +73,7 @@ std::map const& genesisState(); ldb::Slice toSlice(h256 const& _h, unsigned _sub = 0); -using BlocksHash = std::map; +using BlocksHash = std::unordered_map; using TransactionHashes = h256s; using UncleHashes = h256s; using ImportRoute = std::pair; @@ -144,7 +151,7 @@ public: UncleHashes uncleHashes() const { return uncleHashes(currentHash()); } /// Get the hash for a given block's number. - h256 numberHash(unsigned _i) const { if (!_i) return genesisHash(); return queryExtras(h256(u256(_i)), m_blockHashes, x_blockHashes, NullBlockHash).value; } + h256 numberHash(unsigned _i) const { if (!_i) return genesisHash(); return queryExtras(h256(_i), m_blockHashes, x_blockHashes, NullBlockHash).value; } /// Get the last N hashes for a given block. (N is determined by the LastHashes type.) LastHashes lastHashes() const { return lastHashes(number()); } @@ -251,7 +258,7 @@ private: void open(std::string const& _path, WithExisting _we = WithExisting::Trust); void close(); - template T queryExtras(h256 const& _h, std::map& _m, boost::shared_mutex& _x, T const& _n, ldb::DB* _extrasDB = nullptr) const + template T queryExtras(h256 const& _h, std::unordered_map& _m, boost::shared_mutex& _x, T const& _n, ldb::DB* _extrasDB = nullptr) const { { ReadGuard l(_x); @@ -295,11 +302,12 @@ private: using CacheID = std::pair; mutable Mutex x_cacheUsage; - mutable std::deque> m_cacheUsage; - mutable std::set m_inUse; + mutable std::deque> m_cacheUsage; + mutable std::unordered_set m_inUse; void noteUsed(h256 const& _h, unsigned _extra = (unsigned)-1) const; std::chrono::system_clock::time_point m_lastCollection; + void noteCanonChanged() const { Guard l(x_lastLastHashes); m_lastLastHashes.clear(); } mutable Mutex x_lastLastHashes; mutable LastHashes m_lastLastHashes; mutable unsigned m_lastLastHashesNumber = (unsigned)-1; diff --git a/libethereum/BlockDetails.h b/libethereum/BlockDetails.h index 0baacb4da..19e2c7c7a 100644 --- a/libethereum/BlockDetails.h +++ b/libethereum/BlockDetails.h @@ -21,6 +21,7 @@ #pragma once +#include #pragma warning(push) #pragma warning(disable: 4100 4267) #include @@ -114,12 +115,12 @@ struct TransactionAddress static const unsigned size = 67; }; -using BlockDetailsHash = std::map; -using BlockLogBloomsHash = std::map; -using BlockReceiptsHash = std::map; -using TransactionAddressHash = std::map; -using BlockHashHash = std::map; -using BlocksBloomsHash = std::map; +using BlockDetailsHash = std::unordered_map; +using BlockLogBloomsHash = std::unordered_map; +using BlockReceiptsHash = std::unordered_map; +using TransactionAddressHash = std::unordered_map; +using BlockHashHash = std::unordered_map; +using BlocksBloomsHash = std::unordered_map; static const BlockDetails NullBlockDetails; static const BlockLogBlooms NullBlockLogBlooms; From 677eb456b2ded82c1a537fd35800e92454f2f0c8 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Tue, 5 May 2015 15:04:40 +0200 Subject: [PATCH 10/13] Optimisations QString -> string, make AZ snappier by refactoring UI of accounts. --- alethzero/Context.h | 8 +- alethzero/Debugger.cpp | 4 +- alethzero/ExportState.cpp | 4 +- alethzero/Main.ui | 119 ++++++++------ alethzero/MainWin.cpp | 241 ++++++++++++++++------------ alethzero/MainWin.h | 20 ++- alethzero/OurWebThreeStubServer.cpp | 6 +- alethzero/Transact.cpp | 14 +- libdevcore/Common.cpp | 6 + libdevcore/Common.h | 16 ++ libethcore/ICAP.h | 2 - libethereum/Client.cpp | 14 +- libethereum/ClientBase.cpp | 5 + libethereum/ClientBase.h | 2 + libethereum/Interface.h | 2 + libethereum/TransactionQueue.cpp | 1 - libjsqrc/setup.js | 2 +- 17 files changed, 273 insertions(+), 193 deletions(-) diff --git a/alethzero/Context.h b/alethzero/Context.h index 76231d6fd..20c9696f9 100644 --- a/alethzero/Context.h +++ b/alethzero/Context.h @@ -59,10 +59,10 @@ class Context public: virtual ~Context(); - virtual QString pretty(dev::Address _a) const = 0; - virtual QString prettyU256(dev::u256 _n) const = 0; - virtual QString render(dev::Address _a) const = 0; - virtual std::pair fromString(QString const& _a) const = 0; + virtual std::string pretty(dev::Address const& _a) const = 0; + virtual std::string prettyU256(dev::u256 const& _n) const = 0; + virtual std::pair fromString(std::string const& _a) const = 0; virtual std::string renderDiff(dev::eth::StateDiff const& _d) const = 0; + virtual std::string render(dev::Address const& _a) const = 0; }; diff --git a/alethzero/Debugger.cpp b/alethzero/Debugger.cpp index 371630456..a1d246a21 100644 --- a/alethzero/Debugger.cpp +++ b/alethzero/Debugger.cpp @@ -226,7 +226,7 @@ void Debugger::update() QString stack; for (auto i: ws.stack) - stack.prepend("
" + m_context->prettyU256(i) + "
"); + stack.prepend("
" + QString::fromStdString(m_context->prettyU256(i)) + "
"); ui->debugStack->setHtml(stack); ui->debugMemory->setHtml(QString::fromStdString(dev::memDump(ws.memory, 16, true))); assert(m_session.codes.count(ws.code)); @@ -246,7 +246,7 @@ void Debugger::update() ui->debugStateInfo->setText(QString::fromStdString(ss.str())); stringstream s; for (auto const& i: ws.storage) - s << "@" << m_context->prettyU256(i.first).toStdString() << "    " << m_context->prettyU256(i.second).toStdString() << "
"; + s << "@" << m_context->prettyU256(i.first) << "    " << m_context->prettyU256(i.second) << "
"; ui->debugStorage->setHtml(QString::fromStdString(s.str())); } } diff --git a/alethzero/ExportState.cpp b/alethzero/ExportState.cpp index e39b74b76..a8e47ad6a 100644 --- a/alethzero/ExportState.cpp +++ b/alethzero/ExportState.cpp @@ -129,8 +129,8 @@ void ExportStateDialog::fillContracts() ui->contracts->setEnabled(true); for (auto i: ethereum()->addresses(m_block)) { - QString r = m_main->render(i); - (new QListWidgetItem(QString("%2: %1 [%3]").arg(formatBalance(ethereum()->balanceAt(i)).c_str()).arg(r).arg((unsigned)ethereum()->countAt(i)), ethereum()->codeAt(i).empty() ? ui->accounts : ui->contracts)) + string r = m_main->render(i); + (new QListWidgetItem(QString("%2: %1 [%3]").arg(formatBalance(ethereum()->balanceAt(i)).c_str()).arg(QString::fromStdString(r)).arg((unsigned)ethereum()->countAt(i)), ethereum()->codeAt(i).empty() ? ui->accounts : ui->contracts)) ->setData(Qt::UserRole, QByteArray((char const*)i.data(), Address::size)); } } diff --git a/alethzero/Main.ui b/alethzero/Main.ui index ee46017f5..cdd734941 100644 --- a/alethzero/Main.ui +++ b/alethzero/Main.ui @@ -53,23 +53,23 @@ - + - 0 wei + 1 block - + - 0 peers + 0 wei - + - 1 block + 0 peers @@ -160,8 +160,8 @@ - - + + @@ -190,7 +190,6 @@ &View - @@ -218,43 +217,6 @@ - - - QDockWidget::DockWidgetFeatureMask - - - Accounts - - - 2 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Qt::NoFocus - - - QFrame::NoFrame - - - - - - QDockWidget::DockWidgetFeatureMask @@ -595,13 +557,16 @@ QDockWidget::DockWidgetFeatureMask - Contracts + Accounts 2 + + 0 + 0 @@ -614,12 +579,66 @@ 0 + + + + + + Filter... + + + + + + + Basic + + + true + + + + + + + Contracts + + + true + + + true + + + + + + + Only Named + + + true + + + false + + + + + + + Refresh + + + + + Qt::Horizontal - + 0 @@ -633,7 +652,7 @@ QFrame::NoFrame - + 2 @@ -1482,7 +1501,7 @@ font-size: 14pt
- &Export State... + &Export State... diff --git a/alethzero/MainWin.cpp b/alethzero/MainWin.cpp index ff505d5f2..3b89d3398 100644 --- a/alethzero/MainWin.cpp +++ b/alethzero/MainWin.cpp @@ -80,29 +80,29 @@ using namespace dev::p2p; using namespace dev::eth; namespace js = json_spirit; -QString Main::fromRaw(h256 _n, unsigned* _inc) +string Main::fromRaw(h256 _n, unsigned* _inc) { if (_n) { string s((char const*)_n.data(), 32); auto l = s.find_first_of('\0'); if (!l) - return QString(); + return string(); if (l != string::npos) { auto p = s.find_first_not_of('\0', l); if (!(p == string::npos || (_inc && p == 31))) - return QString(); + return string(); if (_inc) *_inc = (byte)s[31]; s.resize(l); } for (auto i: s) if (i < 32) - return QString(); - return QString::fromStdString(s); + return string(); + return s; } - return QString(); + return string(); } QString contentsOfQResource(string const& res) @@ -398,7 +398,7 @@ void Main::onNewBlock() // update blockchain dependent views. refreshBlockCount(); refreshBlockChain(); - refreshAccounts(); + ui->refreshAccounts->setEnabled(true); // We must update balances since we can't filter updates to basic accounts. refreshBalances(); @@ -410,7 +410,7 @@ void Main::onNewPending() // update any pending-transaction dependent views. refreshPending(); - refreshAccounts(); + ui->refreshAccounts->setEnabled(true); } void Main::on_forceMining_triggered() @@ -510,33 +510,33 @@ static Public stringToPublic(QString const& _a) return Public(); } -QString Main::pretty(dev::Address _a) const +std::string Main::pretty(dev::Address const& _a) const { auto g_newNameReg = getNameReg(); if (g_newNameReg) { - QString s = QString::fromStdString(toString(abiOut(ethereum()->call(g_newNameReg, abiIn("getName(address)", _a)).output))); - if (s.size()) - return s; + string n = toString(abiOut(ethereum()->call(g_newNameReg, abiIn("name(address)", _a)).output)); + if (!n.empty()) + return n; } - return QString(); + return string(); } -QString Main::render(dev::Address _a) const +std::string Main::render(dev::Address const& _a) const { - QString p = pretty(_a); - QString n; - try { - n = QString::fromStdString(ICAP(_a).encoded()); - } - catch (...) { - n = QString::fromStdString(_a.abridged()); - } - return p.isEmpty() ? n : (p + " " + n); + string p = pretty(_a); + string n; + if (p.size() == 9 && p.find_first_not_of("QWERYUOPASDFGHJKLZXCVBNM1234567890") == string::npos) + p = ICAP(p, "XREG").encoded(); + else + DEV_IGNORE_EXCEPTIONS(n = ICAP(_a).encoded()); + if (n.empty()) + n = _a.abridged(); + return p.empty() ? n : (p + " " + n); } -pair Main::fromString(QString const& _n) const +pair Main::fromString(std::string const& _n) const { if (_n == "(Create Contract)") return make_pair(Address(), bytes()); @@ -544,7 +544,7 @@ pair Main::fromString(QString const& _n) const auto g_newNameReg = getNameReg(); if (g_newNameReg) { - Address a = abiOut
(ethereum()->call(g_newNameReg, abiIn("addr(bytes32)", ::toString32(_n.toStdString()))).output); + Address a = abiOut
(ethereum()->call(g_newNameReg, abiIn("addr(bytes32)", ::toString32(_n))).output); if (a) return make_pair(a, bytes()); } @@ -552,7 +552,7 @@ pair Main::fromString(QString const& _n) const { try { - return make_pair(Address(fromHex(_n.toStdString(), WhenError::Throw)), bytes()); + return make_pair(Address(fromHex(_n, WhenError::Throw)), bytes()); } catch (BadHexCharacter& _e) { @@ -568,7 +568,7 @@ pair Main::fromString(QString const& _n) const } else try { - return ICAP::decoded(_n.toStdString()).address([&](Address const& a, bytes const& b) -> bytes + return ICAP::decoded(_n).address([&](Address const& a, bytes const& b) -> bytes { return ethereum()->call(a, b).output; }, g_newNameReg); @@ -600,7 +600,7 @@ QString Main::lookup(QString const& _a) const return QString("%1.%2.%3.%4").arg((int)ret[28]).arg((int)ret[29]).arg((int)ret[30]).arg((int)ret[31]); // TODO: support IPv6. else if (ret) - return fromRaw(ret); + return QString::fromStdString(fromRaw(ret)); else return _a; } @@ -817,7 +817,7 @@ void Main::on_exportKey_triggered() if (ui->ourAccounts->currentRow() >= 0 && ui->ourAccounts->currentRow() < m_myKeys.size()) { auto k = m_myKeys[ui->ourAccounts->currentRow()]; - QMessageBox::information(this, "Export Account Key", "Secret key to account " + render(k.address()) + " is:\n" + QString::fromStdString(toHex(k.sec().ref()))); + QMessageBox::information(this, "Export Account Key", "Secret key to account " + QString::fromStdString(render(k.address()) + " is:\n" + toHex(k.sec().ref()))); } } @@ -936,7 +936,7 @@ void Main::refreshBalances() for (auto i: m_myKeys) { u256 b = ethereum()->balanceAt(i.address()); - (new QListWidgetItem(QString("%2: %1 [%3]").arg(formatBalance(b).c_str()).arg(render(i.address())).arg((unsigned)ethereum()->countAt(i.address())), ui->ourAccounts)) + (new QListWidgetItem(QString("%2: %1 [%3]").arg(formatBalance(b).c_str()).arg(QString::fromStdString(render(i.address()))).arg((unsigned)ethereum()->countAt(i.address())), ui->ourAccounts)) ->setData(Qt::UserRole, QByteArray((char const*)i.address().data(), Address::size)); totalBalance += b; @@ -968,24 +968,24 @@ void Main::refreshNetwork() map sessions; for (PeerSessionInfo const& i: ps) ui->peers->addItem(QString("[%8 %7] %3 ms - %1:%2 - %4 %5 %6") - .arg(QString::fromStdString(i.host)) - .arg(i.port) - .arg(chrono::duration_cast(i.lastPing).count()) - .arg(sessions[i.id] = QString::fromStdString(i.clientVersion)) - .arg(QString::fromStdString(toString(i.caps))) - .arg(QString::fromStdString(toString(i.notes))) - .arg(i.socketId) - .arg(QString::fromStdString(i.id.abridged()))); + .arg(QString::fromStdString(i.host)) + .arg(i.port) + .arg(chrono::duration_cast(i.lastPing).count()) + .arg(sessions[i.id] = QString::fromStdString(i.clientVersion)) + .arg(QString::fromStdString(toString(i.caps))) + .arg(QString::fromStdString(toString(i.notes))) + .arg(i.socketId) + .arg(QString::fromStdString(i.id.abridged()))); auto ns = web3()->nodes(); for (p2p::Peer const& i: ns) ui->nodes->insertItem(sessions.count(i.id) ? 0 : ui->nodes->count(), QString("[%1 %3] %2 - ( =%5s | /%4s%6 ) - *%7 $%8") - .arg(QString::fromStdString(i.id.abridged())) - .arg(QString::fromStdString(i.endpoint.address.to_string())) - .arg(i.id == web3()->id() ? "self" : sessions.count(i.id) ? sessions[i.id] : "disconnected") - .arg(i.isOffline() ? " | " + QString::fromStdString(reasonOf(i.lastDisconnect())) + " | " + QString::number(i.failedAttempts()) + "x" : "") - .arg(i.rating()) - ); + .arg(QString::fromStdString(i.id.abridged())) + .arg(QString::fromStdString(i.endpoint.address.to_string())) + .arg(i.id == web3()->id() ? "self" : sessions.count(i.id) ? sessions[i.id] : "disconnected") + .arg(i.isOffline() ? " | " + QString::fromStdString(reasonOf(i.lastDisconnect())) + " | " + QString::number(i.failedAttempts()) + "x" : "") + .arg(i.rating()) + ); } } @@ -994,7 +994,7 @@ void Main::refreshAll() refreshBlockChain(); refreshBlockCount(); refreshPending(); - refreshAccounts(); + ui->refreshAccounts->setEnabled(true); refreshBalances(); } @@ -1007,40 +1007,66 @@ void Main::refreshPending() QString s = t.receiveAddress() ? QString("%2 %5> %3: %1 [%4]") .arg(formatBalance(t.value()).c_str()) - .arg(render(t.safeSender())) - .arg(render(t.receiveAddress())) + .arg(QString::fromStdString(render(t.safeSender()))) + .arg(QString::fromStdString(render(t.receiveAddress()))) .arg((unsigned)t.nonce()) .arg(ethereum()->codeAt(t.receiveAddress()).size() ? '*' : '-') : QString("%2 +> %3: %1 [%4]") .arg(formatBalance(t.value()).c_str()) - .arg(render(t.safeSender())) - .arg(render(right160(sha3(rlpList(t.safeSender(), t.nonce()))))) + .arg(QString::fromStdString(render(t.safeSender()))) + .arg(QString::fromStdString(render(right160(sha3(rlpList(t.safeSender(), t.nonce())))))) .arg((unsigned)t.nonce()); ui->transactionQueue->addItem(s); } } +void Main::on_accountsFilter_textChanged() +{ + ui->refreshAccounts->setEnabled(true); +} + +void Main::on_showBasic_toggled() +{ + ui->refreshAccounts->setEnabled(true); +} + +void Main::on_showContracts_toggled() +{ + ui->refreshAccounts->setEnabled(true); +} + +void Main::on_onlyNamed_toggled() +{ + ui->refreshAccounts->setEnabled(true); +} + +void Main::on_refreshAccounts_clicked() +{ + refreshAccounts(); +} + void Main::refreshAccounts() { -#if ETH_FATDB + DEV_TIMED_FUNCTION; +#if ETH_FATDB || !ETH_TRUE cwatch << "refreshAccounts()"; ui->accounts->clear(); - ui->contracts->clear(); - for (auto n = 0; n < 2; ++n) - for (auto i: ethereum()->addresses()) - { - auto r = render(i); - if (r.contains('(') == !n) - { - if (n == 0 || ui->showAllAccounts->isChecked()) - (new QListWidgetItem(QString("%2: %1 [%3]").arg(formatBalance(ethereum()->balanceAt(i)).c_str()).arg(r).arg((unsigned)ethereum()->countAt(i)), ui->accounts)) - ->setData(Qt::UserRole, QByteArray((char const*)i.data(), Address::size)); - if (ethereum()->codeAt(i).size()) - (new QListWidgetItem(QString("%2: %1 [%3]").arg(formatBalance(ethereum()->balanceAt(i)).c_str()).arg(r).arg((unsigned)ethereum()->countAt(i)), ui->contracts)) - ->setData(Qt::UserRole, QByteArray((char const*)i.data(), Address::size)); - } - } + bool showContract = ui->showContracts->isChecked(); + bool showBasic = ui->showBasic->isChecked(); + bool onlyNamed = ui->onlyNamed->isChecked(); + for (auto const& i: ethereum()->addresses()) + { + bool isContract = (ethereum()->codeHashAt(i) != EmptySHA3); + if (!((showContract && isContract) || (showBasic && !isContract))) + continue; + string r = render(i); + if (onlyNamed && !(r.find('"') != string::npos || r.substr(0, 2) == "XE")) + continue; + (new QListWidgetItem(QString("%2: %1 [%3]").arg(formatBalance(ethereum()->balanceAt(i)).c_str()).arg(QString::fromStdString(r)).arg((unsigned)ethereum()->countAt(i)), ui->accounts)) + ->setData(Qt::UserRole, QByteArray((char const*)i.data(), Address::size)); + } #endif + ui->refreshAccounts->setEnabled(false); } void Main::refreshBlockCount() @@ -1057,6 +1083,7 @@ void Main::on_turboMining_triggered() void Main::refreshBlockChain() { + DEV_TIMED_FUNCTION; cwatch << "refreshBlockChain()"; // TODO: keep the same thing highlighted. @@ -1105,14 +1132,14 @@ void Main::refreshBlockChain() QString s = t.receiveAddress() ? QString(" %2 %5> %3: %1 [%4]") .arg(formatBalance(t.value()).c_str()) - .arg(render(t.safeSender())) - .arg(render(t.receiveAddress())) + .arg(QString::fromStdString(render(t.safeSender()))) + .arg(QString::fromStdString(render(t.receiveAddress()))) .arg((unsigned)t.nonce()) .arg(ethereum()->codeAt(t.receiveAddress()).size() ? '*' : '-') : QString(" %2 +> %3: %1 [%4]") .arg(formatBalance(t.value()).c_str()) - .arg(render(t.safeSender())) - .arg(render(right160(sha3(rlpList(t.safeSender(), t.nonce()))))) + .arg(QString::fromStdString(render(t.safeSender()))) + .arg(QString::fromStdString(render(right160(sha3(rlpList(t.safeSender(), t.nonce())))))) .arg((unsigned)t.nonce()); QListWidgetItem* txItem = new QListWidgetItem(s, ui->blocks); auto hba = QByteArray((char const*)h.data(), h.size); @@ -1256,7 +1283,7 @@ string Main::renderDiff(StateDiff const& _d) const s << "
"; AccountDiff ad = i.second; - s << "" << lead(ad.changeType()) << " " << " " << render(i.first).toStdString() << ""; + s << "" << lead(ad.changeType()) << " " << " " << render(i.first) << ""; if (!ad.exist.to()) continue; @@ -1289,7 +1316,7 @@ string Main::renderDiff(StateDiff const& _d) const s << " * "; s << " "; - s << prettyU256(i.first).toStdString(); + s << prettyU256(i.first); /* if (i.first > u256(1) << 246) s << (h256)i.first; else if (i.first > u160(1) << 150) @@ -1298,11 +1325,11 @@ string Main::renderDiff(StateDiff const& _d) const s << hex << i.first; */ if (!i.second.from()) - s << ": " << prettyU256(i.second.to()).toStdString(); + s << ": " << prettyU256(i.second.to()); else if (!i.second.to()) - s << " (" << prettyU256(i.second.from()).toStdString() << ")"; + s << " (" << prettyU256(i.second.from()) << ")"; else - s << ": " << prettyU256(i.second.to()).toStdString() << " (" << prettyU256(i.second.from()).toStdString() << ")"; + s << ": " << prettyU256(i.second.to()) << " (" << prettyU256(i.second.from()) << ")"; } } return s.str(); @@ -1321,11 +1348,11 @@ void Main::on_transactionQueue_currentItemChanged() auto ss = tx.safeSender(); h256 th = sha3(rlpList(ss, tx.nonce())); s << "

" << th << "

"; - s << "From: " << pretty(ss).toStdString() << " " << ss; + s << "From: " << pretty(ss) << " " << ss; if (tx.isCreation()) - s << "
Creates: " << pretty(right160(th)).toStdString() << " " << right160(th); + s << "
Creates: " << pretty(right160(th)) << " " << right160(th); else - s << "
To: " << pretty(tx.receiveAddress()).toStdString() << " " << tx.receiveAddress(); + s << "
To: " << pretty(tx.receiveAddress()) << " " << tx.receiveAddress(); s << "
Value: " << formatBalance(tx.value()) << ""; s << "   #" << tx.nonce() << ""; s << "
Gas price: " << formatBalance(tx.gasPrice()) << ""; @@ -1413,6 +1440,11 @@ void Main::on_injectBlock_triggered() } } +static string htmlEscaped(string const& _s) +{ + return QString::fromStdString(_s).toHtmlEscaped().toStdString(); +} + void Main::on_blocks_currentItemChanged() { ui->info->clear(); @@ -1442,7 +1474,7 @@ void Main::on_blocks_currentItemChanged() s << "
D/TD: " << info.difficulty << "/" << details.totalDifficulty << " = 2^" << log2((double)info.difficulty) << "/2^" << log2((double)details.totalDifficulty) << "
"; s << "   Children: " << details.children.size() << ""; s << "
Gas used/limit: " << info.gasUsed << "/" << info.gasLimit << "" << "
"; - s << "
Beneficiary: " << pretty(info.coinbaseAddress).toHtmlEscaped().toStdString() << " " << info.coinbaseAddress << "" << "
"; + s << "
Beneficiary: " << htmlEscaped(pretty(info.coinbaseAddress)) << " " << info.coinbaseAddress << "" << "
"; s << "
Seed hash: " << info.seedHash() << "" << "
"; s << "
Mix hash: " << info.mixHash << "" << "
"; s << "
Nonce: " << info.nonce << "" << "
"; @@ -1473,7 +1505,7 @@ void Main::on_blocks_currentItemChanged() s << line << "Hash: " << uncle.hash() << "" << ""; s << line << "Parent: " << uncle.parentHash << "" << ""; s << line << "Number: " << uncle.number << "" << ""; - s << line << "Coinbase: " << pretty(uncle.coinbaseAddress).toHtmlEscaped().toStdString() << " " << uncle.coinbaseAddress << "" << ""; + s << line << "Coinbase: " << htmlEscaped(pretty(uncle.coinbaseAddress)) << " " << uncle.coinbaseAddress << "" << ""; s << line << "Seed hash: " << uncle.seedHash() << "" << ""; s << line << "Mix hash: " << uncle.mixHash << "" << ""; s << line << "Nonce: " << uncle.nonce << "" << ""; @@ -1508,11 +1540,11 @@ void Main::on_blocks_currentItemChanged() TransactionReceipt receipt = ethereum()->blockChain().receipts(h).receipts[txi]; s << "

" << th << "

"; s << "

" << h << "[" << txi << "]

"; - s << "
From: " << pretty(ss).toHtmlEscaped().toStdString() << " " << ss << "" << "
"; + s << "
From: " << htmlEscaped(pretty(ss)) << " " << ss << "" << "
"; if (tx.isCreation()) - s << "
Creates: " << pretty(right160(th)).toHtmlEscaped().toStdString() << " " << right160(th) << "
"; + s << "
Creates: " << htmlEscaped(pretty(right160(th))) << " " << right160(th) << "
"; else - s << "
To: " << pretty(tx.receiveAddress()).toHtmlEscaped().toStdString() << " " << tx.receiveAddress() << "
"; + s << "
To: " << htmlEscaped(pretty(tx.receiveAddress())) << " " << tx.receiveAddress() << "
"; s << "
Value: " << formatBalance(tx.value()) << "" << "
"; s << "   #" << tx.nonce() << "" << ""; s << "
Gas price: " << formatBalance(tx.gasPrice()) << "" << "
"; @@ -1590,10 +1622,10 @@ void Main::debugDumpState(int _add) } } -void Main::on_contracts_currentItemChanged() +void Main::on_accounts_currentItemChanged() { - ui->contractInfo->clear(); - if (auto item = ui->contracts->currentItem()) + ui->accountInfo->clear(); + if (auto item = ui->accounts->currentItem()) { auto hba = item->data(Qt::UserRole).toByteArray(); assert(hba.size() == 20); @@ -1604,16 +1636,16 @@ void Main::on_contracts_currentItemChanged() { auto storage = ethereum()->storageAt(address); for (auto const& i: storage) - s << "@" << showbase << hex << prettyU256(i.first).toStdString() << "    " << showbase << hex << prettyU256(i.second).toStdString() << "
"; + s << "@" << showbase << hex << prettyU256(i.first) << "    " << showbase << hex << prettyU256(i.second) << "
"; s << "

Body Code (" << sha3(ethereum()->codeAt(address)).abridged() << ")

" << disassemble(ethereum()->codeAt(address)); s << Div(Mono) << toHex(ethereum()->codeAt(address)) << ""; - ui->contractInfo->appendHtml(QString::fromStdString(s.str())); + ui->accountInfo->appendHtml(QString::fromStdString(s.str())); } catch (dev::InvalidTrie) { - ui->contractInfo->appendHtml("Corrupted trie."); + ui->accountInfo->appendHtml("Corrupted trie."); } - ui->contractInfo->moveCursor(QTextCursor::Start); + ui->accountInfo->moveCursor(QTextCursor::Start); } } @@ -1645,16 +1677,6 @@ void Main::on_accounts_doubleClicked() } } -void Main::on_contracts_doubleClicked() -{ - if (ui->contracts->count()) - { - auto hba = ui->contracts->currentItem()->data(Qt::UserRole).toByteArray(); - auto h = Address((byte const*)hba.data(), Address::ConstructFromPointer); - qApp->clipboard()->setText(QString::fromStdString(toHex(h.asArray()))); - } -} - static shh::FullTopic topicFromText(QString _s) { shh::BuildTopic ret; @@ -1885,7 +1907,12 @@ void Main::on_killAccount_triggered() if (ui->ourAccounts->currentRow() >= 0 && ui->ourAccounts->currentRow() < m_myKeys.size()) { auto k = m_myKeys[ui->ourAccounts->currentRow()]; - if (ethereum()->balanceAt(k.address()) != 0 && QMessageBox::critical(this, "Kill Account?!", "Account " + render(k.address()) + " has " + QString::fromStdString(formatBalance(ethereum()->balanceAt(k.address()))) + " in it. It, and any contract that this account can access, will be lost forever if you continue. Do NOT continue unless you know what you are doing.\nAre you sure you want to continue?", QMessageBox::Yes, QMessageBox::No) == QMessageBox::No) + if ( + ethereum()->balanceAt(k.address()) != 0 && + QMessageBox::critical(this, "Kill Account?!", + QString::fromStdString("Account " + render(k.address()) + " has " + formatBalance(ethereum()->balanceAt(k.address())) + " in it. It, and any contract that this account can access, will be lost forever if you continue. Do NOT continue unless you know what you are doing.\n" + "Are you sure you want to continue?"), + QMessageBox::Yes, QMessageBox::No) == QMessageBox::No) return; m_myKeys.erase(m_myKeys.begin() + ui->ourAccounts->currentRow()); keysChanged(); @@ -1902,10 +1929,10 @@ void Main::on_go_triggered() web3()->addNode(p2p::NodeId(), Host::pocHost()); } -QString Main::prettyU256(dev::u256 _n) const +std::string Main::prettyU256(dev::u256 const& _n) const { unsigned inc = 0; - QString raw; + string raw; ostringstream s; if (_n > szabo && _n < 1000000 * ether) s << "" << formatBalance(_n) << " (0x" << hex << (uint64_t)_n << ")"; @@ -1916,17 +1943,17 @@ QString Main::prettyU256(dev::u256 _n) const else if ((_n >> 160) == 0) { Address a = right160(_n); - QString n = pretty(a); - if (n.isNull()) + string n = pretty(a); + if (n.empty()) s << "0x" << a << ""; else - s << "" << n.toHtmlEscaped().toStdString() << " (0x" << a.abridged() << ")"; + s << "" << htmlEscaped(n) << " (0x" << a.abridged() << ")"; } else if ((raw = fromRaw((h256)_n, &inc)).size()) - return "\"" + raw.toHtmlEscaped() + "\"" + (inc ? " + " + QString::number(inc) : "") + ""; + return "\"" + htmlEscaped(raw) + "\"" + (inc ? " + " + toString(inc) : "") + ""; else s << "0x" << (h256)_n << ""; - return QString::fromStdString(s.str()); + return s.str(); } void Main::on_post_clicked() diff --git a/alethzero/MainWin.h b/alethzero/MainWin.h index 2a0c1401d..127b174c6 100644 --- a/alethzero/MainWin.h +++ b/alethzero/MainWin.h @@ -80,10 +80,10 @@ public: bool confirm() const; NatSpecFace* natSpec() { return &m_natSpecDB; } - QString pretty(dev::Address _a) const override; - QString prettyU256(dev::u256 _n) const override; - QString render(dev::Address _a) const override; - std::pair fromString(QString const& _a) const override; + std::string pretty(dev::Address const& _a) const override; + std::string prettyU256(dev::u256 const& _n) const override; + std::string render(dev::Address const& _a) const override; + std::pair fromString(std::string const& _a) const override; std::string renderDiff(dev::eth::StateDiff const& _d) const override; QList owned() const { return m_myIdentities + m_myKeys; } @@ -131,6 +131,13 @@ private slots: void on_importKeyFile_triggered(); void on_exportKey_triggered(); + // Account pane + void on_accountsFilter_textChanged(); + void on_showBasic_toggled(); + void on_showContracts_toggled(); + void on_onlyNamed_toggled(); + void on_refreshAccounts_clicked(); + // Tools void on_newTransaction_triggered(); void on_loadJS_triggered(); @@ -140,8 +147,7 @@ private slots: void ourAccountsRowsMoved(); void on_ourAccounts_doubleClicked(); void on_accounts_doubleClicked(); - void on_contracts_doubleClicked(); - void on_contracts_currentItemChanged(); + void on_accounts_currentItemChanged(); void on_transactionQueue_currentItemChanged(); void on_blockChainFilter_textChanged(); void on_blocks_currentItemChanged(); @@ -254,7 +260,7 @@ private: std::unique_ptr m_httpConnector; std::unique_ptr m_server; - static QString fromRaw(dev::h256 _n, unsigned* _inc = nullptr); + static std::string fromRaw(dev::h256 _n, unsigned* _inc = nullptr); NatspecHandler m_natSpecDB; Transact m_transact; diff --git a/alethzero/OurWebThreeStubServer.cpp b/alethzero/OurWebThreeStubServer.cpp index da588ba3e..161bb4926 100644 --- a/alethzero/OurWebThreeStubServer.cpp +++ b/alethzero/OurWebThreeStubServer.cpp @@ -73,7 +73,7 @@ bool OurWebThreeStubServer::showCreationNotice(TransactionSkeleton const& _t, bo bool OurWebThreeStubServer::showSendNotice(TransactionSkeleton const& _t, bool _toProxy) { - return showAuthenticationPopup("Fund Transfer Transaction", "ÐApp is attempting to send " + formatBalance(_t.value) + " to a recipient " + m_main->pretty(_t.to).toStdString() + (_toProxy ? " (this transaction is not executed directly, but forwarded to another ÐApp)" : "") + + return showAuthenticationPopup("Fund Transfer Transaction", "ÐApp is attempting to send " + formatBalance(_t.value) + " to a recipient " + m_main->pretty(_t.to) + (_toProxy ? " (this transaction is not executed directly, but forwarded to another ÐApp)" : "") + ", with additional network fees of up to " + formatBalance(_t.gas * _t.gasPrice) + ".\n\nMaximum total cost is " + formatBalance(_t.value + _t.gas * _t.gasPrice) + "."); } @@ -81,7 +81,7 @@ bool OurWebThreeStubServer::showUnknownCallNotice(TransactionSkeleton const& _t, { return showAuthenticationPopup("DANGEROUS! Unknown Contract Transaction!", "ÐApp is attempting to call into an unknown contract at address " + - m_main->pretty(_t.to).toStdString() + ".\n\n" + + m_main->pretty(_t.to) + ".\n\n" + (_toProxy ? "This transaction is not executed directly, but forwarded to another ÐApp.\n\n" : "") + "Call involves sending " + formatBalance(_t.value) + " to the recipient, with additional network fees of up to " + @@ -137,7 +137,7 @@ bool OurWebThreeStubServer::validateTransaction(TransactionSkeleton const& _t, b // otherwise it's a transaction to a contract for which we have the natspec return showAuthenticationPopup("Contract Transaction", "ÐApp attempting to conduct contract interaction with " + - m_main->pretty(_t.to).toStdString() + + m_main->pretty(_t.to) + ": " + userNotice + ".\n\n" + (_toProxy ? "This transaction is not executed directly, but forwarded to another ÐApp.\n\n" : "") + (_t.value > 0 ? diff --git a/alethzero/Transact.cpp b/alethzero/Transact.cpp index 6f6e47d16..2041bf39d 100644 --- a/alethzero/Transact.cpp +++ b/alethzero/Transact.cpp @@ -110,12 +110,12 @@ void Transact::updateDestination() cwatch << "updateDestination()"; QString s; for (auto i: ethereum()->addresses()) - if ((s = m_context->pretty(i)).size()) + if ((s = QString::fromStdString(m_context->pretty(i))).size()) // A namereg address if (ui->destination->findText(s, Qt::MatchExactly | Qt::MatchCaseSensitive) == -1) ui->destination->addItem(s); for (int i = 0; i < ui->destination->count(); ++i) - if (ui->destination->itemText(i) != "(Create Contract)" && !m_context->fromString(ui->destination->itemText(i)).first) + if (ui->destination->itemText(i) != "(Create Contract)" && !m_context->fromString(ui->destination->itemText(i).toStdString()).first) ui->destination->removeItem(i--); } @@ -142,9 +142,9 @@ void Transact::on_destination_currentTextChanged(QString) { if (ui->destination->currentText().size() && ui->destination->currentText() != "(Create Contract)") { - auto p = m_context->fromString(ui->destination->currentText()); + auto p = m_context->fromString(ui->destination->currentText().toStdString()); if (p.first) - ui->calculatedName->setText(m_context->render(p.first)); + ui->calculatedName->setText(QString::fromStdString(m_context->render(p.first))); else ui->calculatedName->setText("Unknown Address"); if (!p.second.empty()) @@ -347,7 +347,7 @@ void Transact::rejigData() else { // TODO: cache like m_data. - to = m_context->fromString(ui->destination->currentText()).first; + to = m_context->fromString(ui->destination->currentText().toStdString()).first; er = ethereum()->call(s, value(), to, m_data, gasNeeded, gasPrice()); } gasNeeded = (qint64)(er.gasUsed + er.gasRefunded); @@ -434,7 +434,7 @@ void Transact::on_send_clicked() } else // TODO: cache like m_data. - ethereum()->submitTransaction(s, value(), m_context->fromString(ui->destination->currentText()).first, m_data, ui->gas->value(), gasPrice()); + ethereum()->submitTransaction(s, value(), m_context->fromString(ui->destination->currentText().toStdString()).first, m_data, ui->gas->value(), gasPrice()); close(); } @@ -453,7 +453,7 @@ void Transact::on_debug_clicked() State st(ethereum()->postState()); Transaction t = isCreation() ? Transaction(value(), gasPrice(), ui->gas->value(), m_data, st.transactionsFrom(dev::toAddress(s)), s) : - Transaction(value(), gasPrice(), ui->gas->value(), m_context->fromString(ui->destination->currentText()).first, m_data, st.transactionsFrom(dev::toAddress(s)), s); + Transaction(value(), gasPrice(), ui->gas->value(), m_context->fromString(ui->destination->currentText().toStdString()).first, m_data, st.transactionsFrom(dev::toAddress(s)), s); Debugger dw(m_context, this); Executive e(st, ethereum()->blockChain(), 0); dw.populate(e, t); diff --git a/libdevcore/Common.cpp b/libdevcore/Common.cpp index 3defa57b2..72b5543a8 100644 --- a/libdevcore/Common.cpp +++ b/libdevcore/Common.cpp @@ -21,6 +21,7 @@ #include "Common.h" #include "Exceptions.h" +#include "Log.h" using namespace std; using namespace dev; @@ -35,5 +36,10 @@ void HasInvariants::checkInvariants() const BOOST_THROW_EXCEPTION(FailedInvariant()); } +TimerHelper::~TimerHelper() +{ + cdebug << "Timer" << id << t.elapsed() << "s"; +} + } diff --git a/libdevcore/Common.h b/libdevcore/Common.h index 03da4c8aa..aa18baba5 100644 --- a/libdevcore/Common.h +++ b/libdevcore/Common.h @@ -37,6 +37,7 @@ #include #include #include +#include #pragma warning(push) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" @@ -168,6 +169,21 @@ private: #define DEV_INVARIANT_CHECK (void)0; #endif +class TimerHelper +{ +public: + TimerHelper(char const* _id): id(_id) {} + ~TimerHelper(); + +private: + boost::timer t; + char const* id; +}; + +#define DEV_TIMED(S) for (::std::pair<::dev::TimerHelper, bool> __eth_t(#S, true); __eth_t.second; __eth_t.second = false) +#define DEV_TIMED_SCOPE(S) ::dev::TimerHelper __eth_t(S) +#define DEV_TIMED_FUNCTION DEV_TIMED_SCOPE(__PRETTY_FUNCTION__) + enum class WithExisting: int { Trust = 0, diff --git a/libethcore/ICAP.h b/libethcore/ICAP.h index 07e863d8d..b4229e1f5 100644 --- a/libethcore/ICAP.h +++ b/libethcore/ICAP.h @@ -51,8 +51,6 @@ public: ICAP() = default; /// Construct a direct ICAP object for given target address. Must have a zero first byte. ICAP(Address const& _target): m_type(Direct), m_direct(_target) {} - /// Construct an indirect ICAP object for given target name. - ICAP(std::string const& _target): m_type(Indirect), m_client(boost::algorithm::to_upper_copy(_target)), m_asset("ETH") {} /// Construct an indirect ICAP object for given client and institution names. ICAP(std::string const& _client, std::string const& _inst): m_type(Indirect), m_client(boost::algorithm::to_upper_copy(_client)), m_institution(boost::algorithm::to_upper_copy(_inst)), m_asset("XET") {} /// Construct an indirect ICAP object for given client, institution and asset names. You generally don't want to use this. diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index e8ab0ff2f..394b0007e 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -36,12 +36,6 @@ using namespace dev; using namespace dev::eth; using namespace p2p; -namespace dev -{ -struct TimerHelper { TimerHelper(char const* _id): id(_id) {} ~TimerHelper() { cdebug << "Timer" << id << t.elapsed() << "s"; } boost::timer t; char const* id; }; -#define DEV_TIMED(S) for (::std::pair<::dev::TimerHelper, bool> __eth_t(#S, true); __eth_t.second; __eth_t.second = false) -} - VersionChecker::VersionChecker(string const& _dbPath): m_path(_dbPath.size() ? _dbPath : Defaults::dbPath()) { @@ -586,7 +580,9 @@ void Client::onChainChanged(ImportRoute const& _ir) for (auto const& t: m_postMine.pending()) { clog(ClientNote) << "Resubmitting post-mine transaction " << t; - m_tq.import(t, TransactionQueue::ImportCallback(), IfDropped::Retry); + auto ir = m_tq.import(t, TransactionQueue::ImportCallback(), IfDropped::Retry); + if (ir != ImportResult::Success) + onTransactionQueueReady(); } ETH_READ_GUARDED(x_working) DEV_TIMED(post) ETH_WRITE_GUARDED(x_postMine) m_postMine = m_working; @@ -596,6 +592,10 @@ void Client::onChainChanged(ImportRoute const& _ir) onPostStateChanged(); } + // Quick hack for now - the TQ at this point already has the prior pending transactions in it; + // we should resync with it manually until we are stricter about what constitutes "knowing". + onTransactionQueueReady(); + noteChanged(changeds); } diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index eba8dbc67..136239cf3 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -142,6 +142,11 @@ bytes ClientBase::codeAt(Address _a, BlockNumber _block) const return asOf(_block).code(_a); } +h256 ClientBase::codeHashAt(Address _a, BlockNumber _block) const +{ + return asOf(_block).codeHash(_a); +} + map ClientBase::storageAt(Address _a, BlockNumber _block) const { return asOf(_block).storage(_a); diff --git a/libethereum/ClientBase.h b/libethereum/ClientBase.h index 64dc2b6c7..fc0b301ad 100644 --- a/libethereum/ClientBase.h +++ b/libethereum/ClientBase.h @@ -92,12 +92,14 @@ public: using Interface::countAt; using Interface::stateAt; using Interface::codeAt; + using Interface::codeHashAt; using Interface::storageAt; virtual u256 balanceAt(Address _a, BlockNumber _block) const override; virtual u256 countAt(Address _a, BlockNumber _block) const override; virtual u256 stateAt(Address _a, u256 _l, BlockNumber _block) const override; virtual bytes codeAt(Address _a, BlockNumber _block) const override; + virtual h256 codeHashAt(Address _a, BlockNumber _block) const override; virtual std::map storageAt(Address _a, BlockNumber _block) const override; virtual LocalisedLogEntries logs(unsigned _watchId) const override; diff --git a/libethereum/Interface.h b/libethereum/Interface.h index 6edd97b4c..8fb94bdd0 100644 --- a/libethereum/Interface.h +++ b/libethereum/Interface.h @@ -100,12 +100,14 @@ public: u256 countAt(Address _a) const { return countAt(_a, m_default); } u256 stateAt(Address _a, u256 _l) const { return stateAt(_a, _l, m_default); } bytes codeAt(Address _a) const { return codeAt(_a, m_default); } + h256 codeHashAt(Address _a) const { return codeHashAt(_a, m_default); } std::map storageAt(Address _a) const { return storageAt(_a, m_default); } virtual u256 balanceAt(Address _a, BlockNumber _block) const = 0; virtual u256 countAt(Address _a, BlockNumber _block) const = 0; virtual u256 stateAt(Address _a, u256 _l, BlockNumber _block) const = 0; virtual bytes codeAt(Address _a, BlockNumber _block) const = 0; + virtual h256 codeHashAt(Address _a, BlockNumber _block) const = 0; virtual std::map storageAt(Address _a, BlockNumber _block) const = 0; // [LOGS API] diff --git a/libethereum/TransactionQueue.cpp b/libethereum/TransactionQueue.cpp index 1bfdf535a..5aca67a29 100644 --- a/libethereum/TransactionQueue.cpp +++ b/libethereum/TransactionQueue.cpp @@ -36,7 +36,6 @@ ImportResult TransactionQueue::import(bytesConstRef _transactionRLP, ImportCallb h256 h = sha3(_transactionRLP); UpgradableGuard l(m_lock); - // TODO: keep old transactions around and check in State for nonce validity auto ir = check_WITH_LOCK(h, _ik); if (ir != ImportResult::Success) diff --git a/libjsqrc/setup.js b/libjsqrc/setup.js index 78ca2ffad..1423a5cd3 100644 --- a/libjsqrc/setup.js +++ b/libjsqrc/setup.js @@ -21,5 +21,5 @@ */ var web3 = require('web3'); -web3.setProvider(new web3.providers.HttpProvider("http://localhost:8080")); +web3.setProvider(new web3.providers.HttpProvider("http://localhost:8545")); From 82e86eba1bb71abc53f8e6c9df54f4f25f9a117a Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Tue, 5 May 2015 15:16:12 +0200 Subject: [PATCH 11/13] Compile fix. --- libethereum/BlockChain.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libethereum/BlockChain.h b/libethereum/BlockChain.h index f69f67a5d..12e1fc785 100644 --- a/libethereum/BlockChain.h +++ b/libethereum/BlockChain.h @@ -42,10 +42,13 @@ #include "BlockQueue.h" namespace ldb = leveldb; -template <> struct std::hash> +namespace std { - size_t operator()(const pair &x ) const { return std::hash()(x.first) ^ std::hash()(x.second); } +template <> struct hash> +{ + size_t operator()(pair const& _x) const { return hash()(_x.first) ^ hash()(_x.second); } }; +} namespace dev { From b7d560d3e7ad8f5450dd574ae37fb0679b6be2cc Mon Sep 17 00:00:00 2001 From: chriseth Date: Tue, 5 May 2015 17:08:30 +0200 Subject: [PATCH 12/13] Fix for exception if function hashes not requested. --- solc/CommandLineInterface.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/solc/CommandLineInterface.cpp b/solc/CommandLineInterface.cpp index 0d5f47242..e6f03a2ef 100644 --- a/solc/CommandLineInterface.cpp +++ b/solc/CommandLineInterface.cpp @@ -175,6 +175,9 @@ void CommandLineInterface::handleBytecode(string const& _contract) void CommandLineInterface::handleSignatureHashes(string const& _contract) { + if (!m_args.count(g_argSignatureHashes)) + return; + string out; for (auto const& it: m_compiler->getContractDefinition(_contract).getInterfaceFunctions()) out += toHex(it.first.ref()) + ": " + it.second->externalSignature() + "\n"; From ae740583209da59d902d46150d72f9b969c10432 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Tue, 5 May 2015 19:33:59 +0200 Subject: [PATCH 13/13] Windows build fixes. --- alethzero/Main.ui | 2 +- alethzero/MainWin.cpp | 1 - libdevcore/Common.h | 4 ++++ libethereum/BlockChain.cpp | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/alethzero/Main.ui b/alethzero/Main.ui index cdd734941..f28f5b5fc 100644 --- a/alethzero/Main.ui +++ b/alethzero/Main.ui @@ -552,7 +552,7 @@ - + QDockWidget::DockWidgetFeatureMask diff --git a/alethzero/MainWin.cpp b/alethzero/MainWin.cpp index 3b89d3398..de5f149ce 100644 --- a/alethzero/MainWin.cpp +++ b/alethzero/MainWin.cpp @@ -145,7 +145,6 @@ Main::Main(QWidget *parent) : #if !ETH_FATDB delete ui->dockWidget_accounts; - delete ui->dockWidget_contracts; #endif #if ETH_DEBUG diff --git a/libdevcore/Common.h b/libdevcore/Common.h index aa18baba5..e5d746372 100644 --- a/libdevcore/Common.h +++ b/libdevcore/Common.h @@ -182,7 +182,11 @@ private: #define DEV_TIMED(S) for (::std::pair<::dev::TimerHelper, bool> __eth_t(#S, true); __eth_t.second; __eth_t.second = false) #define DEV_TIMED_SCOPE(S) ::dev::TimerHelper __eth_t(S) +#if WIN32 +#define DEV_TIMED_FUNCTION DEV_TIMED_SCOPE(__FUNCSIG__) +#else #define DEV_TIMED_FUNCTION DEV_TIMED_SCOPE(__PRETTY_FUNCTION__) +#endif enum class WithExisting: int { diff --git a/libethereum/BlockChain.cpp b/libethereum/BlockChain.cpp index 204203c9d..2f1e58602 100644 --- a/libethereum/BlockChain.cpp +++ b/libethereum/BlockChain.cpp @@ -47,7 +47,7 @@ using namespace dev::eth; namespace js = json_spirit; #define ETH_CATCH 1 -#define ETH_TIMED_IMPORTS 1 +#define ETH_TIMED_IMPORTS 0 #ifdef _WIN32 const char* BlockChainDebug::name() { return EthBlue "8" EthWhite " <>"; }