From 2111cd4894d421179f46bf8bed13279779f5682c Mon Sep 17 00:00:00 2001 From: chriseth Date: Fri, 24 Apr 2015 17:35:16 +0200 Subject: [PATCH 01/32] 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/32] 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/32] 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 468a06d35af9244fee8661129362eaac3299a822 Mon Sep 17 00:00:00 2001 From: Patrick Salami Date: Fri, 1 May 2015 23:12:29 -0700 Subject: [PATCH 04/32] adding --network-id option to eth cli --- eth/main.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/eth/main.cpp b/eth/main.cpp index d4ad08529..985e74e59 100644 --- a/eth/main.cpp +++ b/eth/main.cpp @@ -146,6 +146,7 @@ void help() << " --listen Listen on the given port for incoming connections (default: 30303)." << endl << " -r,--remote (:) Connect to remote host (default: none)." << endl << " --port Connect to remote port (default: 30303)." << endl + << " --network-id Only connect to other hosts with this network id (default:0)." << endl << " --upnp Use UPnP for NAT (default: on)." << endl #if ETH_JSONRPC || !ETH_TRUE << "Work farming mode:" << endl @@ -515,6 +516,7 @@ int main(int argc, char** argv) unsigned short remotePort = 30303; unsigned peers = 5; bool bootstrap = false; + unsigned networkId = 0; /// Mining params unsigned mining = 0; @@ -668,6 +670,15 @@ int main(int argc, char** argv) return -1; } } + else if (arg == "--network-id" && i + 1 < argc) + try { + networkId = stol(argv[++i]); + } + catch (...) + { + cerr << "Bad " << arg << " option: " << argv[i] << endl; + return -1; + } else if (arg == "--benchmark-warmup" && i + 1 < argc) try { benchmarkWarmup = stol(argv[++i]); @@ -1034,6 +1045,7 @@ int main(int argc, char** argv) c->setForceMining(forceMining); c->setTurboMining(minerType == MinerType::GPU); c->setAddress(coinbase); + c->setNetworkId(networkId); } cout << "Transaction Signer: " << sigKey.address() << endl; From 1aa1950d75ba6414d3cf43c28f6368535a32244c Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Sun, 3 May 2015 20:45:23 +0100 Subject: [PATCH 05/32] Invariant utilities. --- libdevcore/Common.cpp | 8 +++++++- libdevcore/Common.h | 37 +++++++++++++++++++++++++++++++++++-- libdevcore/Exceptions.h | 1 + libethereum/BlockQueue.cpp | 26 ++++++++------------------ libethereum/BlockQueue.h | 8 +++++--- libethereum/Client.cpp | 3 +-- 6 files changed, 57 insertions(+), 26 deletions(-) diff --git a/libdevcore/Common.cpp b/libdevcore/Common.cpp index b3d70c538..3defa57b2 100644 --- a/libdevcore/Common.cpp +++ b/libdevcore/Common.cpp @@ -20,7 +20,7 @@ */ #include "Common.h" - +#include "Exceptions.h" using namespace std; using namespace dev; @@ -29,5 +29,11 @@ namespace dev char const* Version = "0.9.14"; +void HasInvariants::checkInvariants() const +{ + if (!invariants()) + BOOST_THROW_EXCEPTION(FailedInvariant()); +} + } diff --git a/libdevcore/Common.h b/libdevcore/Common.h index b2d48da98..03da4c8aa 100644 --- a/libdevcore/Common.h +++ b/libdevcore/Common.h @@ -128,14 +128,46 @@ inline N diff(N const& _a, N const& _b) } /// RAII utility class whose destructor calls a given function. -class ScopeGuard { +class ScopeGuard +{ public: ScopeGuard(std::function _f): m_f(_f) {} ~ScopeGuard() { m_f(); } + private: std::function m_f; }; +/// Inheritable for classes that have invariants. +class HasInvariants +{ +public: + /// Check invariants are met, throw if not. + void checkInvariants() const; + +protected: + /// Reimplement to specify the invariants. + virtual bool invariants() const = 0; +}; + +/// RAII checker for invariant assertions. +class InvariantChecker +{ +public: + InvariantChecker(HasInvariants* _this): m_this(_this) { m_this->checkInvariants(); } + ~InvariantChecker() { m_this->checkInvariants(); } + +private: + HasInvariants const* m_this; +}; + +/// Scope guard for invariant check in a class derived from HasInvariants. +#if ETH_DEBUG +#define DEV_INVARIANT_CHECK ::dev::InvariantChecker __dev_invariantCheck(this) +#else +#define DEV_INVARIANT_CHECK (void)0; +#endif + enum class WithExisting: int { Trust = 0, @@ -145,7 +177,8 @@ enum class WithExisting: int } -namespace std { +namespace std +{ inline dev::WithExisting max(dev::WithExisting _a, dev::WithExisting _b) { diff --git a/libdevcore/Exceptions.h b/libdevcore/Exceptions.h index 219047827..36c624a71 100644 --- a/libdevcore/Exceptions.h +++ b/libdevcore/Exceptions.h @@ -53,6 +53,7 @@ struct BadRoot: virtual Exception {}; struct FileError: virtual Exception {}; struct Overflow: virtual Exception {}; struct InterfaceNotSupported: virtual Exception { public: InterfaceNotSupported(std::string _f): Exception("Interface " + _f + " not supported.") {} }; +struct FailedInvariant: virtual Exception {}; // error information to be added to exceptions using errinfo_invalidSymbol = boost::error_info; diff --git a/libethereum/BlockQueue.cpp b/libethereum/BlockQueue.cpp index 0cccf8e6b..43d2b4cb8 100644 --- a/libethereum/BlockQueue.cpp +++ b/libethereum/BlockQueue.cpp @@ -74,7 +74,7 @@ ImportResult BlockQueue::import(bytesConstRef _block, BlockChain const& _bc, boo } UpgradeGuard ul(l); - invariants_WITH_LOCK(); + DEV_INVARIANT_CHECK; // Check it's not in the future (void)_isOurs; @@ -86,7 +86,6 @@ ImportResult BlockQueue::import(bytesConstRef _block, BlockChain const& _bc, boo if (strftime(buf, 24, "%X", localtime(&bit)) == 0) buf[0] = '\0'; // empty if case strftime fails cblockq << "OK - queued for future [" << bi.timestamp << "vs" << time(0) << "] - will wait until" << buf; - invariants_WITH_LOCK(); return ImportResult::FutureTime; } else @@ -96,7 +95,6 @@ ImportResult BlockQueue::import(bytesConstRef _block, BlockChain const& _bc, boo { m_knownBad.insert(bi.hash()); // bad parent; this is bad too, note it as such - invariants_WITH_LOCK(); return ImportResult::BadChain; } else if (!m_readySet.count(bi.parentHash) && !m_drainingSet.count(bi.parentHash) && !_bc.isKnown(bi.parentHash)) @@ -106,7 +104,6 @@ ImportResult BlockQueue::import(bytesConstRef _block, BlockChain const& _bc, boo m_unknown.insert(make_pair(bi.parentHash, make_pair(h, _block.toBytes()))); m_unknownSet.insert(h); - invariants_WITH_LOCK(); return ImportResult::UnknownParent; } else @@ -115,7 +112,6 @@ ImportResult BlockQueue::import(bytesConstRef _block, BlockChain const& _bc, boo cblockq << "OK - ready for chain insertion."; m_ready.push_back(make_pair(h, _block.toBytes())); m_readySet.insert(h); - invariants_WITH_LOCK(); noteReady_WITH_LOCK(h); m_onReady(); @@ -127,7 +123,7 @@ ImportResult BlockQueue::import(bytesConstRef _block, BlockChain const& _bc, boo bool BlockQueue::doneDrain(h256s const& _bad) { WriteGuard l(m_lock); - invariants_WITH_LOCK(); + DEV_INVARIANT_CHECK; m_drainingSet.clear(); if (_bad.size()) { @@ -146,8 +142,6 @@ bool BlockQueue::doneDrain(h256s const& _bad) } } m_knownBad += _bad; - // GAA!!!! NEVER EMPTY?!?!?! TODO: remove items from readySet! - invariants_WITH_LOCK(); return !m_readySet.empty(); } @@ -169,12 +163,11 @@ void BlockQueue::tick(BlockChain const& _bc) { UpgradeGuard l2(l); - invariants_WITH_LOCK(); + DEV_INVARIANT_CHECK; auto end = m_future.lower_bound(t); for (auto i = m_future.begin(); i != end; ++i) todo.push_back(move(i->second)); m_future.erase(m_future.begin(), end); - invariants_WITH_LOCK(); } } cblockq << "Importing" << todo.size() << "past-future blocks."; @@ -207,7 +200,7 @@ QueueStatus BlockQueue::blockStatus(h256 const& _h) const void BlockQueue::drain(std::vector& o_out, unsigned _max) { WriteGuard l(m_lock); - invariants_WITH_LOCK(); + DEV_INVARIANT_CHECK; if (m_drainingSet.empty()) { o_out.resize(min(_max, m_ready.size())); @@ -224,17 +217,16 @@ void BlockQueue::drain(std::vector& o_out, unsigned _max) // swap(o_out, m_ready); // swap(m_drainingSet, m_readySet); } - invariants_WITH_LOCK(); } -void BlockQueue::invariants_WITH_LOCK() const +bool BlockQueue::invariants() const { - assert(m_readySet.size() == m_ready.size()); + return m_readySet.size() == m_ready.size(); } void BlockQueue::noteReady_WITH_LOCK(h256 const& _good) { - invariants_WITH_LOCK(); + DEV_INVARIANT_CHECK; list goodQueue(1, _good); while (!goodQueue.empty()) { @@ -250,12 +242,11 @@ void BlockQueue::noteReady_WITH_LOCK(h256 const& _good) } m_unknown.erase(r.first, r.second); } - invariants_WITH_LOCK(); } void BlockQueue::retryAllUnknown() { - invariants_WITH_LOCK(); + DEV_INVARIANT_CHECK; for (auto it = m_unknown.begin(); it != m_unknown.end(); ++it) { m_ready.push_back(it->second); @@ -264,5 +255,4 @@ void BlockQueue::retryAllUnknown() m_readySet.insert(newReady); } m_unknown.clear(); - invariants_WITH_LOCK(); } diff --git a/libethereum/BlockQueue.h b/libethereum/BlockQueue.h index 1b1612fb7..d9cb0ed53 100644 --- a/libethereum/BlockQueue.h +++ b/libethereum/BlockQueue.h @@ -30,6 +30,7 @@ namespace dev { + namespace eth { @@ -60,7 +61,7 @@ enum class QueueStatus * Sorts them ready for blockchain insertion (with the BlockChain::sync() method). * @threadsafe */ -class BlockQueue +class BlockQueue: HasInvariants { public: /// Import a block into the queue. @@ -87,7 +88,7 @@ public: std::pair items() const { ReadGuard l(m_lock); return std::make_pair(m_ready.size(), m_unknown.size()); } /// Clear everything. - void clear() { WriteGuard l(m_lock); invariants_WITH_LOCK(); m_readySet.clear(); m_drainingSet.clear(); m_ready.clear(); m_unknownSet.clear(); m_unknown.clear(); m_future.clear(); invariants_WITH_LOCK(); } + void clear() { WriteGuard l(m_lock); DEV_INVARIANT_CHECK; m_readySet.clear(); m_drainingSet.clear(); m_ready.clear(); m_unknownSet.clear(); m_unknown.clear(); m_future.clear(); } /// Return first block with an unknown parent. h256 firstUnknown() const { ReadGuard l(m_lock); return m_unknownSet.size() ? *m_unknownSet.begin() : h256(); } @@ -102,7 +103,8 @@ public: private: void noteReady_WITH_LOCK(h256 const& _b); - void invariants_WITH_LOCK() const; + + bool invariants() const override; mutable boost::shared_mutex m_lock; ///< General lock. std::set m_drainingSet; ///< All blocks being imported. diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index 8d049d404..befebd765 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -582,7 +582,6 @@ void Client::onChainChanged(ImportRoute const& _ir) m_preMine = newPreMine; DEV_TIMED(working) ETH_WRITE_GUARDED(x_working) m_working = newPreMine; -// Transactions ts = m_postMine.pending(); ETH_READ_GUARDED(x_postMine) for (auto const& t: m_postMine.pending()) { @@ -663,7 +662,7 @@ void Client::doWork() bool t = true; if (m_syncBlockQueue.compare_exchange_strong(t, false)) - syncBlockQueue(); // GAAA!!!!! CALLED TOO OFTEN!!! + syncBlockQueue(); t = true; if (m_syncTransactionQueue.compare_exchange_strong(t, false) && !m_remoteWorking) From 84ecbaff9e2540d06a5c1fccf547a528158dd0b1 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Sun, 3 May 2015 22:50:21 +0100 Subject: [PATCH 06/32] Condition variables rather than polling FTW. --- libethereum/Client.cpp | 7 ++++--- libethereum/Client.h | 7 +++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index befebd765..e8ab0ff2f 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -658,8 +658,6 @@ void Client::noteChanged(h256Set const& _filters) void Client::doWork() { - // TODO: Use condition variable rather than this rubbish. - bool t = true; if (m_syncBlockQueue.compare_exchange_strong(t, false)) syncBlockQueue(); @@ -671,7 +669,10 @@ void Client::doWork() tick(); if (!m_syncBlockQueue && !m_syncTransactionQueue) - this_thread::sleep_for(chrono::milliseconds(20)); + { + std::unique_lock l(x_signalled); + m_signalled.wait_for(l, chrono::seconds(1)); + } } void Client::tick() diff --git a/libethereum/Client.h b/libethereum/Client.h index 90273968c..946825828 100644 --- a/libethereum/Client.h +++ b/libethereum/Client.h @@ -22,6 +22,7 @@ #pragma once #include +#include #include #include #include @@ -258,10 +259,10 @@ private: void syncTransactionQueue(); /// Magically called when m_tq needs syncing. Be nice and don't block. - void onTransactionQueueReady() { m_syncTransactionQueue = true; } + void onTransactionQueueReady() { m_syncTransactionQueue = true; m_signalled.notify_all(); } /// Magically called when m_tq needs syncing. Be nice and don't block. - void onBlockQueueReady() { m_syncBlockQueue = true; } + void onBlockQueueReady() { m_syncBlockQueue = true; m_signalled.notify_all(); } /// Called when the post state has changed (i.e. when more transactions are in it or we're mining on a new block). /// This updates m_miningInfo. @@ -309,6 +310,8 @@ private: ActivityReport m_report; // TODO!!!!!! REPLACE WITH A PROPER X-THREAD ASIO SIGNAL SYSTEM (could just be condition variables) + std::condition_variable m_signalled; + Mutex x_signalled; std::atomic m_syncTransactionQueue = {false}; std::atomic m_syncBlockQueue = {false}; }; From f0e9f6e0801e6351312200af91242ec592dcf392 Mon Sep 17 00:00:00 2001 From: subtly Date: Mon, 4 May 2015 02:25:23 +0100 Subject: [PATCH 07/32] Allow 9x ingress connections so non-nat clients can connect and use the network. To be reduced after greedy go is updated to discontinue filling up the network's connection capacity by accepting connections beyond the ones it didn't make and not connecting to every node on the entire network. --- libp2p/Host.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libp2p/Host.cpp b/libp2p/Host.cpp index 09802e445..030c406c0 100644 --- a/libp2p/Host.cpp +++ b/libp2p/Host.cpp @@ -226,7 +226,7 @@ void Host::startPeerSession(Public const& _id, RLP const& _rlp, RLPXFrameIO* _io return; } - if (peerCount() > 2 * m_idealPeerCount) + if (peerCount() > 9 * m_idealPeerCount) { ps->disconnect(TooManyPeers); return; @@ -341,7 +341,7 @@ void Host::runAcceptor() auto socket = make_shared(new bi::tcp::socket(m_ioService)); m_tcp4Acceptor.async_accept(socket->ref(), [=](boost::system::error_code ec) { - if (peerCount() > 2 * m_idealPeerCount) + if (peerCount() > 9 * m_idealPeerCount) { clog(NetConnect) << "Dropping incoming connect due to maximum peer count (2 * ideal peer count): " << socket->remoteEndpoint(); socket->close(); From 1e6ff441fe88ee5fc3ef1a9110184f1e983a76ba Mon Sep 17 00:00:00 2001 From: chriseth Date: Mon, 4 May 2015 10:16:10 +0200 Subject: [PATCH 08/32] Fix for broken continue in for loop. Fixes #1789. --- libsolidity/Compiler.cpp | 5 ++- test/libsolidity/SolidityEndToEndTest.cpp | 46 +++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/libsolidity/Compiler.cpp b/libsolidity/Compiler.cpp index 37b577ccd..d57f30c12 100644 --- a/libsolidity/Compiler.cpp +++ b/libsolidity/Compiler.cpp @@ -431,7 +431,8 @@ bool Compiler::visit(ForStatement const& _forStatement) CompilerContext::LocationSetter locationSetter(m_context, _forStatement); eth::AssemblyItem loopStart = m_context.newTag(); eth::AssemblyItem loopEnd = m_context.newTag(); - m_continueTags.push_back(loopStart); + eth::AssemblyItem loopNext = m_context.newTag(); + m_continueTags.push_back(loopNext); m_breakTags.push_back(loopEnd); if (_forStatement.getInitializationExpression()) @@ -449,6 +450,8 @@ bool Compiler::visit(ForStatement const& _forStatement) _forStatement.getBody().accept(*this); + m_context << loopNext; + // for's loop expression if existing if (_forStatement.getLoopExpression()) _forStatement.getLoopExpression()->accept(*this); diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp index 24e5f7b4e..f168ad454 100644 --- a/test/libsolidity/SolidityEndToEndTest.cpp +++ b/test/libsolidity/SolidityEndToEndTest.cpp @@ -300,6 +300,52 @@ BOOST_AUTO_TEST_CASE(for_loop_simple_init_expr) testSolidityAgainstCppOnRange("f(uint256)", for_loop_simple_init_expr_cpp, 0, 5); } +BOOST_AUTO_TEST_CASE(for_loop_break_continue) +{ + char const* sourceCode = R"( + contract test { + function f(uint n) returns (uint r) + { + uint i = 1; + uint k = 0; + for (i *= 5; k < n; i *= 7) + { + k++; + i += 4; + if (n % 3 == 0) + break; + i += 9; + if (n % 2 == 0) + continue; + i += 19; + } + return i; + } + } + )"; + compileAndRun(sourceCode); + + auto breakContinue = [](u256 const& n) -> u256 + { + u256 i = 1; + u256 k = 0; + for (i *= 5; k < n; i *= 7) + { + k++; + i += 4; + if (n % 3 == 0) + break; + i += 9; + if (n % 2 == 0) + continue; + i += 19; + } + return i; + }; + + testSolidityAgainstCppOnRange("f(uint256)", breakContinue, 0, 10); +} + BOOST_AUTO_TEST_CASE(calling_other_functions) { char const* sourceCode = "contract collatz {\n" From 0f0b33284841374e6b78f9856b2deace57e88465 Mon Sep 17 00:00:00 2001 From: arkpar Date: Mon, 4 May 2015 11:21:05 +0200 Subject: [PATCH 09/32] fixed debugging into base contracts --- mix/ClientModel.cpp | 14 +++--- mix/CodeModel.cpp | 94 +++++++++++++++++++++++++++++++++----- mix/CodeModel.h | 20 ++++++-- mix/qml/StateDialog.qml | 2 +- mix/qml/html/codeeditor.js | 5 +- mix/qml/js/Debugger.js | 3 +- 6 files changed, 115 insertions(+), 23 deletions(-) diff --git a/mix/ClientModel.cpp b/mix/ClientModel.cpp index 61a3dee1f..717757c70 100644 --- a/mix/ClientModel.cpp +++ b/mix/ClientModel.cpp @@ -422,7 +422,7 @@ void ClientModel::showDebuggerForTransaction(ExecutionResult const& _t) //try to resolve contract for source level debugging auto nameIter = m_contractNames.find(code.address); CompiledContract const* compilerRes = nullptr; - if (nameIter != m_contractNames.end() && (compilerRes = m_codeModel->tryGetContract(nameIter->second))) + if (nameIter != m_contractNames.end() && (compilerRes = m_codeModel->tryGetContract(nameIter->second))) //returned object is guaranteed to live till the end of event handler in main thread { eth::AssemblyItems assemblyItems = !_t.isConstructor() ? compilerRes->assemblyItems() : compilerRes->constructorAssemblyItems(); codes.back()->setDocument(compilerRes->documentId()); @@ -467,9 +467,9 @@ void ClientModel::showDebuggerForTransaction(ExecutionResult const& _t) { //track calls into functions AssemblyItem const& prevInstruction = codeItems[s.codeIndex][prevInstructionIndex]; - auto functionIter = contract->functions().find(LocationPair(instruction.getLocation().start, instruction.getLocation().end)); - if (functionIter != contract->functions().end() && ((prevInstruction.getJumpType() == AssemblyItem::JumpType::IntoFunction) || solCallStack.empty())) - solCallStack.push_front(QVariant::fromValue(functionIter.value())); + QString functionName = m_codeModel->resolveFunctionName(instruction.getLocation()); + if (!functionName.isEmpty() && ((prevInstruction.getJumpType() == AssemblyItem::JumpType::IntoFunction) || solCallStack.empty())) + solCallStack.push_front(QVariant::fromValue(functionName)); else if (prevInstruction.getJumpType() == AssemblyItem::JumpType::OutOfFunction && !solCallStack.empty()) solCallStack.pop_front(); } @@ -521,11 +521,13 @@ void ClientModel::showDebuggerForTransaction(ExecutionResult const& _t) prevInstructionIndex = instructionIndex; + // filter out locations that match whole function or contract SourceLocation location = instruction.getLocation(); - if (contract->contract()->location() == location || contract->functions().contains(LocationPair(location.start, location.end))) + QString source = QString::fromUtf8(location.sourceName->c_str()); + if (m_codeModel->isContractOrFunctionLocation(location)) location = dev::SourceLocation(-1, -1, location.sourceName); - solState = new QSolState(debugData, move(storage), move(solCallStack), move(locals), location.start, location.end, QString::fromUtf8(location.sourceName->c_str())); + solState = new QSolState(debugData, move(storage), move(solCallStack), move(locals), location.start, location.end, source); } states.append(QVariant::fromValue(new QMachineState(debugData, instructionIndex, s, codes[s.codeIndex], data[s.dataIndex], solState))); diff --git a/mix/CodeModel.cpp b/mix/CodeModel.cpp index 357ce88b9..515123de5 100644 --- a/mix/CodeModel.cpp +++ b/mix/CodeModel.cpp @@ -51,30 +51,31 @@ const std::set c_predefinedContracts = namespace { using namespace dev::solidity; -class CollectDeclarationsVisitor: public ASTConstVisitor + +class CollectLocalsVisitor: public ASTConstVisitor { public: - CollectDeclarationsVisitor(QHash* _functions, QHash* _locals): - m_functions(_functions), m_locals(_locals), m_functionScope(false) {} + CollectLocalsVisitor(QHash* _locals): + m_locals(_locals), m_functionScope(false) {} + private: LocationPair nodeLocation(ASTNode const& _node) { return LocationPair(_node.getLocation().start, _node.getLocation().end); } - virtual bool visit(FunctionDefinition const& _node) + virtual bool visit(FunctionDefinition const&) { - m_functions->insert(nodeLocation(_node), QString::fromStdString(_node.getName())); m_functionScope = true; return true; } - virtual void endVisit(FunctionDefinition const&) + virtual void endVisit(FunctionDefinition const&) override { m_functionScope = false; } - virtual bool visit(VariableDeclaration const& _node) + virtual bool visit(VariableDeclaration const& _node) override { SolidityDeclaration decl; decl.type = CodeModel::nodeType(_node.getType().get()); @@ -87,11 +88,38 @@ private: } private: - QHash* m_functions; QHash* m_locals; bool m_functionScope; }; +class CollectLocationsVisitor: public ASTConstVisitor +{ +public: + CollectLocationsVisitor(SourceMap* _sourceMap): + m_sourceMap(_sourceMap) {} + +private: + LocationPair nodeLocation(ASTNode const& _node) + { + return LocationPair(_node.getLocation().start, _node.getLocation().end); + } + + virtual bool visit(FunctionDefinition const& _node) override + { + m_sourceMap->functions.insert(nodeLocation(_node), QString::fromStdString(_node.getName())); + return true; + } + + virtual bool visit(ContractDefinition const& _node) override + { + m_sourceMap->contracts.insert(nodeLocation(_node), QString::fromStdString(_node.getName())); + return true; + } + +private: + SourceMap* m_sourceMap; +}; + QHash collectStorage(dev::solidity::ContractDefinition const& _contract) { QHash result; @@ -132,7 +160,7 @@ CompiledContract::CompiledContract(const dev::solidity::CompilerStack& _compiler if (contractDefinition.getLocation().sourceName.get()) m_documentId = QString::fromStdString(*contractDefinition.getLocation().sourceName); - CollectDeclarationsVisitor visitor(&m_functions, &m_locals); + CollectLocalsVisitor visitor(&m_locals); m_storage = collectStorage(contractDefinition); contractDefinition.accept(visitor); m_assemblyItems = *_compiler.getRuntimeAssemblyItems(name); @@ -243,6 +271,7 @@ void CodeModel::releaseContracts() for (ContractMap::iterator c = m_contractMap.begin(); c != m_contractMap.end(); ++c) c.value()->deleteLater(); m_contractMap.clear(); + m_sourceMaps.clear(); } void CodeModel::runCompilationJob(int _jobId) @@ -253,13 +282,17 @@ void CodeModel::runCompilationJob(int _jobId) try { cs.addSource("configUser", R"(contract configUser{function configAddr()constant returns(address a){ return 0xf025d81196b72fba60a1d4dddad12eeb8360d828;}})"); + std::vector sourceNames; { Guard l(x_pendingContracts); for (auto const& c: m_pendingContracts) + { cs.addSource(c.first.toStdString(), c.second.toStdString()); + sourceNames.push_back(c.first.toStdString()); + } } cs.compile(false); - collectContracts(cs); + collectContracts(cs, sourceNames); } catch (dev::Exception const& _exception) { @@ -281,11 +314,20 @@ void CodeModel::runCompilationJob(int _jobId) emit stateChanged(); } -void CodeModel::collectContracts(dev::solidity::CompilerStack const& _cs) +void CodeModel::collectContracts(dev::solidity::CompilerStack const& _cs, std::vector const& _sourceNames) { Guard pl(x_pendingContracts); Guard l(x_contractMap); ContractMap result; + SourceMaps sourceMaps; + for (std::string const& sourceName: _sourceNames) + { + dev::solidity::SourceUnit const& source = _cs.getAST(sourceName); + SourceMap sourceMap; + CollectLocationsVisitor collector(&sourceMap); + source.accept(collector); + sourceMaps.insert(QString::fromStdString(sourceName), std::move(sourceMap)); + } for (std::string n: _cs.getContractNames()) { if (c_predefinedContracts.count(n) != 0) @@ -326,6 +368,7 @@ void CodeModel::collectContracts(dev::solidity::CompilerStack const& _cs) } releaseContracts(); m_contractMap.swap(result); + m_sourceMaps.swap(sourceMaps); emit codeChanged(); emit compilationComplete(); } @@ -431,3 +474,32 @@ SolidityType CodeModel::nodeType(dev::solidity::Type const* _type) return r; } +bool CodeModel::isContractOrFunctionLocation(dev::SourceLocation const& _location) +{ + if (!_location.sourceName) + return false; + Guard l(x_contractMap); + auto sourceMapIter = m_sourceMaps.find(QString::fromStdString(*_location.sourceName)); + if (sourceMapIter != m_sourceMaps.cend()) + { + LocationPair location(_location.start, _location.end); + return sourceMapIter.value().contracts.contains(location) || sourceMapIter.value().functions.contains(location); + } + return false; +} + +QString CodeModel::resolveFunctionName(dev::SourceLocation const& _location) +{ + if (!_location.sourceName) + return QString(); + Guard l(x_contractMap); + auto sourceMapIter = m_sourceMaps.find(QString::fromStdString(*_location.sourceName)); + if (sourceMapIter != m_sourceMaps.cend()) + { + LocationPair location(_location.start, _location.end); + auto functionNameIter = sourceMapIter.value().functions.find(location); + if (functionNameIter != sourceMapIter.value().functions.cend()) + return functionNameIter.value(); + } + return QString(); +} diff --git a/mix/CodeModel.h b/mix/CodeModel.h index 0572483c0..3c6c3abdf 100644 --- a/mix/CodeModel.h +++ b/mix/CodeModel.h @@ -97,7 +97,6 @@ public: /// @returns contract source Id QString documentId() const { return m_documentId; } - QHash const& functions() const { return m_functions; } QHash const& locals() const { return m_locals; } QHash const& storage() const { return m_storage; } @@ -110,7 +109,6 @@ private: QString m_documentId; eth::AssemblyItems m_assemblyItems; eth::AssemblyItems m_constructorAssemblyItems; - QHash m_functions; QHash m_locals; QHash m_storage; @@ -119,6 +117,17 @@ private: using ContractMap = QMap; //needs to be sorted +/// Source map +using LocationMap = QHash; + +struct SourceMap +{ + LocationMap contracts; + LocationMap functions; +}; + +using SourceMaps = QMap; //by source id + /// Code compilation model. Compiles contracts in background an provides compiled contract data class CodeModel: public QObject { @@ -153,6 +162,10 @@ public: Q_INVOKABLE void reset() { reset(QVariantMap()); } /// Convert solidity type info to mix type static SolidityType nodeType(dev::solidity::Type const* _type); + /// Check if given location belongs to contract or function + bool isContractOrFunctionLocation(dev::SourceLocation const& _location); + /// Get funciton name by location + QString resolveFunctionName(dev::SourceLocation const& _location); signals: /// Emited on compilation state change @@ -182,11 +195,12 @@ private: void runCompilationJob(int _jobId); void stop(); void releaseContracts(); - void collectContracts(solidity::CompilerStack const& _cs); + void collectContracts(dev::solidity::CompilerStack const& _cs, std::vector const& _sourceNames); std::atomic m_compiling; mutable dev::Mutex x_contractMap; ContractMap m_contractMap; + SourceMaps m_sourceMaps; std::unique_ptr m_codeHighlighterSettings; QThread m_backgroundThread; BackgroundWorker m_backgroundWorker; diff --git a/mix/qml/StateDialog.qml b/mix/qml/StateDialog.qml index 3a3a060c3..13d01d474 100644 --- a/mix/qml/StateDialog.qml +++ b/mix/qml/StateDialog.qml @@ -158,7 +158,7 @@ Dialog { id: importJsonFileDialog visible: false title: qsTr("Select State File") - nameFilters: [qsTr("JSON files (*.json)", "All files (*)")] + nameFilters: Qt.platform.os === "osx" ? [] : [qsTr("JSON files (*.json)", "All files (*)")] //qt 5.4 segfaults with filter string on OSX onAccepted: { var path = importJsonFileDialog.fileUrl.toString() var jsonData = fileIo.readFile(path) diff --git a/mix/qml/html/codeeditor.js b/mix/qml/html/codeeditor.js index e8504fee0..d398151f9 100644 --- a/mix/qml/html/codeeditor.js +++ b/mix/qml/html/codeeditor.js @@ -126,7 +126,10 @@ highlightExecution = function(start, end) { executionMark.clear(); if (debugWarning) debugWarning.clear(); - executionMark = editor.markText(editor.posFromIndex(start), editor.posFromIndex(end), { className: "CodeMirror-exechighlight" }); + if (start >0 && end > start) { + executionMark = editor.markText(editor.posFromIndex(start), editor.posFromIndex(end), { className: "CodeMirror-exechighlight" }); + editor.scrollIntoView(editor.posFromIndex(start)); + } } var changeId; diff --git a/mix/qml/js/Debugger.js b/mix/qml/js/Debugger.js index 3f5742fde..f6900489a 100644 --- a/mix/qml/js/Debugger.js +++ b/mix/qml/js/Debugger.js @@ -183,7 +183,8 @@ function selectState(stateIndex) function highlightSelection(index) { - statesList.positionViewAtRow(index, ListView.Center); + if (statesList.visible) + statesList.positionViewAtRow(index, ListView.Visible); statesList.selection.clear(); statesList.selection.select(index); } From a5d700f1f709682ed1a2e0bd6305117d722d0bd2 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Mon, 4 May 2015 11:54:14 +0200 Subject: [PATCH 10/32] Change RPC port to same as go. --- libweb3jsonrpc/WebThreeStubServerBase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libweb3jsonrpc/WebThreeStubServerBase.cpp b/libweb3jsonrpc/WebThreeStubServerBase.cpp index 2a1427b16..b5f212f7d 100644 --- a/libweb3jsonrpc/WebThreeStubServerBase.cpp +++ b/libweb3jsonrpc/WebThreeStubServerBase.cpp @@ -54,7 +54,7 @@ const unsigned dev::SensibleHttpThreads = 1; #else const unsigned dev::SensibleHttpThreads = 4; #endif -const unsigned dev::SensibleHttpPort = 8080; +const unsigned dev::SensibleHttpPort = 8545; static Json::Value toJson(dev::eth::BlockInfo const& _bi) { From e712ade6e2c9337f2424979f70ffc95242dc5577 Mon Sep 17 00:00:00 2001 From: arkpar Date: Mon, 4 May 2015 11:47:35 +0200 Subject: [PATCH 11/32] style --- mix/qml/html/codeeditor.js | 2 +- mix/test/qml/js/TestTutorial.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mix/qml/html/codeeditor.js b/mix/qml/html/codeeditor.js index d398151f9..d25fbd091 100644 --- a/mix/qml/html/codeeditor.js +++ b/mix/qml/html/codeeditor.js @@ -126,7 +126,7 @@ highlightExecution = function(start, end) { executionMark.clear(); if (debugWarning) debugWarning.clear(); - if (start >0 && end > start) { + if (start > 0 && end > start) { executionMark = editor.markText(editor.posFromIndex(start), editor.posFromIndex(end), { className: "CodeMirror-exechighlight" }); editor.scrollIntoView(editor.posFromIndex(start)); } diff --git a/mix/test/qml/js/TestTutorial.js b/mix/test/qml/js/TestTutorial.js index 7f366f23b..895b5c9c1 100644 --- a/mix/test/qml/js/TestTutorial.js +++ b/mix/test/qml/js/TestTutorial.js @@ -52,7 +52,7 @@ function test_tutorial() transactionDialog.selectFunction("setRating"); clickElement(transactionDialog, 200, 310); ts.typeString("Titanic", transactionDialog); - clickElement(transactionDialog, 200, 350); + clickElement(transactionDialog, 200, 330); ts.typeString("2", transactionDialog); transactionDialog.acceptAndClose(); mainApplication.projectModel.stateDialog.acceptAndClose(); From da309c3853bdaff02aad2d7eecd227b3d41ed4df Mon Sep 17 00:00:00 2001 From: Liana Husikyan Date: Thu, 30 Apr 2015 18:06:04 +0200 Subject: [PATCH 12/32] created secondarySoureLocation error type added additional information to error msgs --- libsolidity/AST.cpp | 18 ++++++++-- libsolidity/DeclarationContainer.cpp | 42 ++++++++++++++---------- libsolidity/DeclarationContainer.h | 4 ++- libsolidity/Exceptions.h | 17 ++++++++++ libsolidity/NameAndTypeResolver.cpp | 12 +++++-- libsolidity/SourceReferenceFormatter.cpp | 33 ++++++++++++++++--- libsolidity/SourceReferenceFormatter.h | 2 ++ 7 files changed, 100 insertions(+), 28 deletions(-) diff --git a/libsolidity/AST.cpp b/libsolidity/AST.cpp index 09f98dca3..be64c698f 100644 --- a/libsolidity/AST.cpp +++ b/libsolidity/AST.cpp @@ -140,12 +140,22 @@ void ContractDefinition::checkDuplicateFunctions() const map> functions; for (ASTPointer const& function: getDefinedFunctions()) functions[function->getName()].push_back(function.get()); + if (functions[getName()].size() > 1) + { + SecondarySourceLocation ssl; + auto it = functions[getName()].begin(); + ++it; + for(; it != functions[getName()].end(); ++it) + ssl.append("Another declaration is here:", (*it)->getLocation()); + BOOST_THROW_EXCEPTION( DeclarationError() << - errinfo_sourceLocation(getLocation()) << - errinfo_comment("More than one constructor defined.") + errinfo_sourceLocation(getConstructor()->getLocation()) << + errinfo_comment("More than one constructor defined.") << + errinfo_secondarySourceLocation(ssl) ); + } for (auto const& it: functions) { vector const& overloads = it.second; @@ -155,7 +165,9 @@ void ContractDefinition::checkDuplicateFunctions() const BOOST_THROW_EXCEPTION( DeclarationError() << errinfo_sourceLocation(overloads[j]->getLocation()) << - errinfo_comment("Function with same name and arguments already defined.") + errinfo_comment("Function with same name and arguments already defined.") << + errinfo_secondarySourceLocation(SecondarySourceLocation().append( + "The previous declaration is here:", overloads[i]->getLocation())) ); } } diff --git a/libsolidity/DeclarationContainer.cpp b/libsolidity/DeclarationContainer.cpp index 2130f3a01..c836663c7 100644 --- a/libsolidity/DeclarationContainer.cpp +++ b/libsolidity/DeclarationContainer.cpp @@ -28,6 +28,28 @@ using namespace std; using namespace dev; using namespace dev::solidity; +Declaration const* DeclarationContainer::conflictingDeclaration(Declaration const& _declaration) const +{ + ASTString const& name(_declaration.getName()); + solAssert(!name.empty(), ""); + vector declarations; + if (m_declarations.count(name)) + declarations += m_declarations.at(name); + if (m_invisibleDeclarations.count(name)) + declarations += m_invisibleDeclarations.at(name); + if (dynamic_cast(&_declaration)) + { + // check that all other declarations with the same name are functions + for (Declaration const* declaration: declarations) + if (!dynamic_cast(declaration)) + return declaration; + } + else if (!declarations.empty()) + return declarations.front(); + + return nullptr; +} + bool DeclarationContainer::registerDeclaration(Declaration const& _declaration, bool _invisible, bool _update) { ASTString const& name(_declaration.getName()); @@ -40,24 +62,8 @@ bool DeclarationContainer::registerDeclaration(Declaration const& _declaration, m_declarations.erase(name); m_invisibleDeclarations.erase(name); } - else - { - vector declarations; - if (m_declarations.count(name)) - declarations += m_declarations.at(name); - if (m_invisibleDeclarations.count(name)) - declarations += m_invisibleDeclarations.at(name); - if (dynamic_cast(&_declaration)) - { - // check that all other declarations with the same name are functions - - for (Declaration const* declaration: declarations) - if (!dynamic_cast(declaration)) - return false; - } - else if (!declarations.empty()) - return false; - } + else if (conflictingDeclaration(_declaration)) + return false; if (_invisible) m_invisibleDeclarations[name].insert(&_declaration); diff --git a/libsolidity/DeclarationContainer.h b/libsolidity/DeclarationContainer.h index 35a6ea077..9ae25880a 100644 --- a/libsolidity/DeclarationContainer.h +++ b/libsolidity/DeclarationContainer.h @@ -34,7 +34,7 @@ namespace solidity { /** - * Container that stores mappings betwee names and declarations. It also contains a link to the + * Container that stores mappings between names and declarations. It also contains a link to the * enclosing scope. */ class DeclarationContainer @@ -51,6 +51,8 @@ public: std::set resolveName(ASTString const& _name, bool _recursive = false) const; Declaration const* getEnclosingDeclaration() const { return m_enclosingDeclaration; } std::map> const& getDeclarations() const { return m_declarations; } + /// @returns weather declaration is valid, and if not also returns previous declaration. + Declaration const* conflictingDeclaration(Declaration const& _declaration) const; private: Declaration const* m_enclosingDeclaration; diff --git a/libsolidity/Exceptions.h b/libsolidity/Exceptions.h index 0d07c7064..51106c2b6 100644 --- a/libsolidity/Exceptions.h +++ b/libsolidity/Exceptions.h @@ -23,6 +23,7 @@ #pragma once #include +#include #include #include @@ -38,7 +39,23 @@ struct CompilerError: virtual Exception {}; struct InternalCompilerError: virtual Exception {}; struct DocstringParsingError: virtual Exception {}; +using errorSourceLocationInfo = std::pair; + +class SecondarySourceLocation +{ +public: + //SecondarySourceLocation(){} + SecondarySourceLocation& append(std::string const& _errMsg, SourceLocation const& _sourceLocation) + { + infos.push_back(std::make_pair(_errMsg, _sourceLocation)); + return *this; + } + + std::vector infos; +}; + using errinfo_sourceLocation = boost::error_info; +using errinfo_secondarySourceLocation = boost::error_info; } } diff --git a/libsolidity/NameAndTypeResolver.cpp b/libsolidity/NameAndTypeResolver.cpp index a286934a9..56e81e372 100644 --- a/libsolidity/NameAndTypeResolver.cpp +++ b/libsolidity/NameAndTypeResolver.cpp @@ -354,8 +354,16 @@ void DeclarationRegistrationHelper::closeCurrentScope() void DeclarationRegistrationHelper::registerDeclaration(Declaration& _declaration, bool _opensScope) { if (!m_scopes[m_currentScope].registerDeclaration(_declaration, !_declaration.isVisibleInContract())) - BOOST_THROW_EXCEPTION(DeclarationError() << errinfo_sourceLocation(_declaration.getLocation()) - << errinfo_comment("Identifier already declared.")); + { + solAssert(m_scopes[m_currentScope].conflictingDeclaration(_declaration), ""); + BOOST_THROW_EXCEPTION(DeclarationError() + << errinfo_sourceLocation(_declaration.getLocation()) + << errinfo_comment("Identifier already declared.") + << errinfo_secondarySourceLocation(SecondarySourceLocation().append( + "The previous declaration is here:", + m_scopes[m_currentScope].conflictingDeclaration(_declaration)->getLocation()))); + } + //@todo the exception should also contain the location of the first declaration _declaration.setScope(m_currentScope); if (_opensScope) diff --git a/libsolidity/SourceReferenceFormatter.cpp b/libsolidity/SourceReferenceFormatter.cpp index b5e83b8c9..a30621a1e 100644 --- a/libsolidity/SourceReferenceFormatter.cpp +++ b/libsolidity/SourceReferenceFormatter.cpp @@ -64,28 +64,53 @@ void SourceReferenceFormatter::printSourceLocation(ostream& _stream, << "Spanning multiple lines.\n"; } +void SourceReferenceFormatter::printSourceName(ostream& _stream, + SourceLocation const& _location, + Scanner const& _scanner) +{ + int startLine; + int startColumn; + tie(startLine, startColumn) = _scanner.translatePositionToLineColumn(_location.start); + _stream << *_location.sourceName << ":" << (startLine + 1) << ":" << (startColumn + 1) << ": "; +} + void SourceReferenceFormatter::printExceptionInformation(ostream& _stream, Exception const& _exception, string const& _name, CompilerStack const& _compiler) { SourceLocation const* location = boost::get_error_info(_exception); + auto secondarylocation = boost::get_error_info(_exception); Scanner const* scanner; if (location) { scanner = &_compiler.getScanner(*location->sourceName); - int startLine; - int startColumn; - tie(startLine, startColumn) = scanner->translatePositionToLineColumn(location->start); - _stream << *location->sourceName << ":" << (startLine + 1) << ":" << (startColumn + 1) << ": "; + printSourceName(_stream, *location, *scanner); } + _stream << _name; if (string const* description = boost::get_error_info(_exception)) _stream << ": " << *description << endl; if (location) + { + solAssert(scanner, ""); printSourceLocation(_stream, *location, *scanner); + } + + if (secondarylocation && !secondarylocation->infos.empty()) + { + for(auto info: secondarylocation->infos) + { + scanner = &_compiler.getScanner(*info.second.sourceName); + _stream << info.first << " "; + printSourceName(_stream, info.second, *scanner); + _stream << endl; + printSourceLocation(_stream, info.second, *scanner); + } + _stream << endl; + } } } diff --git a/libsolidity/SourceReferenceFormatter.h b/libsolidity/SourceReferenceFormatter.h index 304e6a273..43d3882e8 100644 --- a/libsolidity/SourceReferenceFormatter.h +++ b/libsolidity/SourceReferenceFormatter.h @@ -42,6 +42,8 @@ public: static void printSourceLocation(std::ostream& _stream, SourceLocation const& _location, Scanner const& _scanner); static void printExceptionInformation(std::ostream& _stream, Exception const& _exception, std::string const& _name, CompilerStack const& _compiler); +private: + static void printSourceName(std::ostream& _stream, SourceLocation const& _location, Scanner const& _scanner); }; } From 7b72aa68be391f7a0f83a0beed38f5670650eedd Mon Sep 17 00:00:00 2001 From: Liana Husikyan Date: Mon, 4 May 2015 14:46:52 +0200 Subject: [PATCH 13/32] fixed the order of error msgs --- libsolidity/NameAndTypeResolver.cpp | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/libsolidity/NameAndTypeResolver.cpp b/libsolidity/NameAndTypeResolver.cpp index 56e81e372..a81c82380 100644 --- a/libsolidity/NameAndTypeResolver.cpp +++ b/libsolidity/NameAndTypeResolver.cpp @@ -355,16 +355,29 @@ void DeclarationRegistrationHelper::registerDeclaration(Declaration& _declaratio { if (!m_scopes[m_currentScope].registerDeclaration(_declaration, !_declaration.isVisibleInContract())) { + SourceLocation firstDeclarationLocation; + SourceLocation secondDeclarationLocation; + + if (_declaration.getLocation().start < m_scopes[m_currentScope].conflictingDeclaration(_declaration)->getLocation().start) + { + firstDeclarationLocation = _declaration.getLocation(); + secondDeclarationLocation = m_scopes[m_currentScope].conflictingDeclaration(_declaration)->getLocation(); + } + else + { + firstDeclarationLocation = m_scopes[m_currentScope].conflictingDeclaration(_declaration)->getLocation(); + secondDeclarationLocation = _declaration.getLocation(); + } solAssert(m_scopes[m_currentScope].conflictingDeclaration(_declaration), ""); BOOST_THROW_EXCEPTION(DeclarationError() - << errinfo_sourceLocation(_declaration.getLocation()) + << errinfo_sourceLocation(secondDeclarationLocation) << errinfo_comment("Identifier already declared.") << errinfo_secondarySourceLocation(SecondarySourceLocation().append( "The previous declaration is here:", - m_scopes[m_currentScope].conflictingDeclaration(_declaration)->getLocation()))); + firstDeclarationLocation + ))); } - //@todo the exception should also contain the location of the first declaration _declaration.setScope(m_currentScope); if (_opensScope) enterNewSubScope(_declaration); From 0702c5836810839bff6ccec7f290da88f076ea4b Mon Sep 17 00:00:00 2001 From: Liana Husikyan Date: Mon, 4 May 2015 15:03:15 +0200 Subject: [PATCH 14/32] fixed warrning --- libsolidity/SourceReferenceFormatter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libsolidity/SourceReferenceFormatter.cpp b/libsolidity/SourceReferenceFormatter.cpp index a30621a1e..87796aa32 100644 --- a/libsolidity/SourceReferenceFormatter.cpp +++ b/libsolidity/SourceReferenceFormatter.cpp @@ -95,7 +95,7 @@ void SourceReferenceFormatter::printExceptionInformation(ostream& _stream, if (location) { - solAssert(scanner, ""); + scanner = &_compiler.getScanner(*location->sourceName); printSourceLocation(_stream, *location, *scanner); } From 04048bad93b6bc876cbb3735fb014a575457ee67 Mon Sep 17 00:00:00 2001 From: chriseth Date: Mon, 4 May 2015 16:21:44 +0200 Subject: [PATCH 15/32] Feature for commandline compiler to output the function signature hashes. --- solc/CommandLineInterface.cpp | 23 +++++++++++++++++++++++ solc/CommandLineInterface.h | 1 + 2 files changed, 24 insertions(+) diff --git a/solc/CommandLineInterface.cpp b/solc/CommandLineInterface.cpp index d5ff7b297..0b5e046d0 100644 --- a/solc/CommandLineInterface.cpp +++ b/solc/CommandLineInterface.cpp @@ -55,6 +55,7 @@ namespace solidity // extensions and other attributes would be a better choice here? static string const g_argAbiStr = "json-abi"; static string const g_argSolAbiStr = "sol-abi"; +static string const g_argSignatureHashes = "hashes"; static string const g_argAsmStr = "asm"; static string const g_argAsmJsonStr = "asm-json"; static string const g_argAstStr = "ast"; @@ -96,6 +97,7 @@ static bool needsHumanTargetedStdout(po::variables_map const& _args) return humanTargetedStdout(_args, g_argAbiStr) || humanTargetedStdout(_args, g_argSolAbiStr) || + humanTargetedStdout(_args, g_argSignatureHashes) || humanTargetedStdout(_args, g_argNatspecUserStr) || humanTargetedStdout(_args, g_argAstJson) || humanTargetedStdout(_args, g_argNatspecDevStr) || @@ -173,6 +175,24 @@ void CommandLineInterface::handleBytecode(string const& _contract) handleBinary(_contract); } +void CommandLineInterface::handleSignatureHashes(string const& _contract) +{ + string out; + for (auto const& it: m_compiler->getContractDefinition(_contract).getInterfaceFunctions()) + out += toHex(it.first.ref()) + ": " + it.second->externalSignature() + "\n"; + + auto choice = m_args[g_argSignatureHashes].as(); + if (outputToStdout(choice)) + cout << "Function signatures: " << endl << out; + + if (outputToFile(choice)) + { + ofstream outFile(_contract + ".signatures"); + outFile << out; + outFile.close(); + } +} + void CommandLineInterface::handleMeta(DocumentationType _type, string const& _contract) { std::string argName; @@ -254,6 +274,8 @@ bool CommandLineInterface::parseArguments(int argc, char** argv) "Request to output the contract's JSON ABI interface.") (g_argSolAbiStr.c_str(), po::value()->value_name("stdout|file|both"), "Request to output the contract's Solidity ABI interface.") + (g_argSignatureHashes.c_str(), po::value()->value_name("stdout|file|both"), + "Request to output the contract's functions' signature hashes.") (g_argNatspecUserStr.c_str(), po::value()->value_name("stdout|file|both"), "Request to output the contract's Natspec user documentation.") (g_argNatspecDevStr.c_str(), po::value()->value_name("stdout|file|both"), @@ -516,6 +538,7 @@ void CommandLineInterface::actOnInput() } handleBytecode(contract); + handleSignatureHashes(contract); handleMeta(DocumentationType::ABIInterface, contract); handleMeta(DocumentationType::ABISolidityInterface, contract); handleMeta(DocumentationType::NatspecDev, contract); diff --git a/solc/CommandLineInterface.h b/solc/CommandLineInterface.h index 459f17d3e..7d3a067cd 100644 --- a/solc/CommandLineInterface.h +++ b/solc/CommandLineInterface.h @@ -58,6 +58,7 @@ private: void handleBinary(std::string const& _contract); void handleOpcode(std::string const& _contract); void handleBytecode(std::string const& _contract); + void handleSignatureHashes(std::string const& _contract); void handleMeta(DocumentationType _type, std::string const& _contract); From a1c84c7172fab017a82fa93f93e54fc7cb972661 Mon Sep 17 00:00:00 2001 From: arkpar Date: Mon, 4 May 2015 16:23:02 +0200 Subject: [PATCH 16/32] 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 25f269feecc5bc8d8997bebab04df298b284fcd6 Mon Sep 17 00:00:00 2001 From: chriseth Date: Mon, 4 May 2015 16:50:30 +0200 Subject: [PATCH 17/32] Removed layouting space. --- solc/CommandLineInterface.cpp | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/solc/CommandLineInterface.cpp b/solc/CommandLineInterface.cpp index 0b5e046d0..0d5f47242 100644 --- a/solc/CommandLineInterface.cpp +++ b/solc/CommandLineInterface.cpp @@ -51,20 +51,18 @@ namespace dev namespace solidity { -// LTODO: Maybe some argument class pairing names with -// extensions and other attributes would be a better choice here? -static string const g_argAbiStr = "json-abi"; -static string const g_argSolAbiStr = "sol-abi"; +static string const g_argAbiStr = "json-abi"; +static string const g_argSolAbiStr = "sol-abi"; static string const g_argSignatureHashes = "hashes"; -static string const g_argAsmStr = "asm"; -static string const g_argAsmJsonStr = "asm-json"; -static string const g_argAstStr = "ast"; -static string const g_argAstJson = "ast-json"; -static string const g_argBinaryStr = "binary"; -static string const g_argOpcodesStr = "opcodes"; -static string const g_argNatspecDevStr = "natspec-dev"; +static string const g_argAsmStr = "asm"; +static string const g_argAsmJsonStr = "asm-json"; +static string const g_argAstStr = "ast"; +static string const g_argAstJson = "ast-json"; +static string const g_argBinaryStr = "binary"; +static string const g_argOpcodesStr = "opcodes"; +static string const g_argNatspecDevStr = "natspec-dev"; static string const g_argNatspecUserStr = "natspec-user"; -static string const g_argAddStandard = "add-std"; +static string const g_argAddStandard = "add-std"; /// Possible arguments to for --combined-json static set const g_combinedJsonArgs{ From 1c6fcca6e2453152ae7d73d7231551f31b8587d1 Mon Sep 17 00:00:00 2001 From: Liana Husikyan Date: Mon, 4 May 2015 15:46:46 +0200 Subject: [PATCH 18/32] small fix --- libsolidity/AST.cpp | 6 ++--- libsolidity/DeclarationContainer.h | 2 +- libsolidity/Exceptions.h | 1 - libsolidity/NameAndTypeResolver.cpp | 30 ++++++++++++++---------- libsolidity/SourceReferenceFormatter.cpp | 30 ++++++++++++++---------- libsolidity/SourceReferenceFormatter.h | 8 +++++-- 6 files changed, 45 insertions(+), 32 deletions(-) diff --git a/libsolidity/AST.cpp b/libsolidity/AST.cpp index be64c698f..50184fa5a 100644 --- a/libsolidity/AST.cpp +++ b/libsolidity/AST.cpp @@ -151,7 +151,7 @@ void ContractDefinition::checkDuplicateFunctions() const BOOST_THROW_EXCEPTION( DeclarationError() << - errinfo_sourceLocation(getConstructor()->getLocation()) << + errinfo_sourceLocation(functions[getName()].front()->getLocation()) << errinfo_comment("More than one constructor defined.") << errinfo_secondarySourceLocation(ssl) ); @@ -165,9 +165,9 @@ void ContractDefinition::checkDuplicateFunctions() const BOOST_THROW_EXCEPTION( DeclarationError() << errinfo_sourceLocation(overloads[j]->getLocation()) << - errinfo_comment("Function with same name and arguments already defined.") << + errinfo_comment("Function with same name and arguments defined twice.") << errinfo_secondarySourceLocation(SecondarySourceLocation().append( - "The previous declaration is here:", overloads[i]->getLocation())) + "Other declaration is here:", overloads[i]->getLocation())) ); } } diff --git a/libsolidity/DeclarationContainer.h b/libsolidity/DeclarationContainer.h index 9ae25880a..94545eefb 100644 --- a/libsolidity/DeclarationContainer.h +++ b/libsolidity/DeclarationContainer.h @@ -51,7 +51,7 @@ public: std::set resolveName(ASTString const& _name, bool _recursive = false) const; Declaration const* getEnclosingDeclaration() const { return m_enclosingDeclaration; } std::map> const& getDeclarations() const { return m_declarations; } - /// @returns weather declaration is valid, and if not also returns previous declaration. + /// @returns whether declaration is valid, and if not also returns previous declaration. Declaration const* conflictingDeclaration(Declaration const& _declaration) const; private: diff --git a/libsolidity/Exceptions.h b/libsolidity/Exceptions.h index 51106c2b6..a0031ba7e 100644 --- a/libsolidity/Exceptions.h +++ b/libsolidity/Exceptions.h @@ -44,7 +44,6 @@ using errorSourceLocationInfo = std::pair; class SecondarySourceLocation { public: - //SecondarySourceLocation(){} SecondarySourceLocation& append(std::string const& _errMsg, SourceLocation const& _sourceLocation) { infos.push_back(std::make_pair(_errMsg, _sourceLocation)); diff --git a/libsolidity/NameAndTypeResolver.cpp b/libsolidity/NameAndTypeResolver.cpp index a81c82380..813e04526 100644 --- a/libsolidity/NameAndTypeResolver.cpp +++ b/libsolidity/NameAndTypeResolver.cpp @@ -357,25 +357,26 @@ void DeclarationRegistrationHelper::registerDeclaration(Declaration& _declaratio { SourceLocation firstDeclarationLocation; SourceLocation secondDeclarationLocation; + Declaration const* conflictingDeclaration = m_scopes[m_currentScope].conflictingDeclaration(_declaration); + solAssert(conflictingDeclaration, ""); - if (_declaration.getLocation().start < m_scopes[m_currentScope].conflictingDeclaration(_declaration)->getLocation().start) + if (_declaration.getLocation().start < conflictingDeclaration->getLocation().start) { firstDeclarationLocation = _declaration.getLocation(); - secondDeclarationLocation = m_scopes[m_currentScope].conflictingDeclaration(_declaration)->getLocation(); + secondDeclarationLocation = conflictingDeclaration->getLocation(); } else { - firstDeclarationLocation = m_scopes[m_currentScope].conflictingDeclaration(_declaration)->getLocation(); + firstDeclarationLocation = conflictingDeclaration->getLocation(); secondDeclarationLocation = _declaration.getLocation(); } - solAssert(m_scopes[m_currentScope].conflictingDeclaration(_declaration), ""); - BOOST_THROW_EXCEPTION(DeclarationError() - << errinfo_sourceLocation(secondDeclarationLocation) - << errinfo_comment("Identifier already declared.") - << errinfo_secondarySourceLocation(SecondarySourceLocation().append( - "The previous declaration is here:", - firstDeclarationLocation - ))); + + BOOST_THROW_EXCEPTION( + DeclarationError() << + errinfo_sourceLocation(secondDeclarationLocation) << + errinfo_comment("Identifier already declared.") << + errinfo_secondarySourceLocation( + SecondarySourceLocation().append("The previous declaration is here:", firstDeclarationLocation))); } _declaration.setScope(m_currentScope); @@ -456,8 +457,11 @@ bool ReferencesResolver::visit(Identifier& _identifier) { auto declarations = m_resolver.getNameFromCurrentScope(_identifier.getName()); if (declarations.empty()) - BOOST_THROW_EXCEPTION(DeclarationError() << errinfo_sourceLocation(_identifier.getLocation()) - << errinfo_comment("Undeclared identifier.")); + BOOST_THROW_EXCEPTION( + DeclarationError() << + errinfo_sourceLocation(_identifier.getLocation()) << + errinfo_comment("Undeclared identifier.") + ); else if (declarations.size() == 1) _identifier.setReferencedDeclaration(**declarations.begin(), m_currentContract); else diff --git a/libsolidity/SourceReferenceFormatter.cpp b/libsolidity/SourceReferenceFormatter.cpp index 87796aa32..e66851358 100644 --- a/libsolidity/SourceReferenceFormatter.cpp +++ b/libsolidity/SourceReferenceFormatter.cpp @@ -32,9 +32,11 @@ namespace dev namespace solidity { -void SourceReferenceFormatter::printSourceLocation(ostream& _stream, - SourceLocation const& _location, - Scanner const& _scanner) +void SourceReferenceFormatter::printSourceLocation( + ostream& _stream, + SourceLocation const& _location, + Scanner const& _scanner +) { int startLine; int startColumn; @@ -64,9 +66,11 @@ void SourceReferenceFormatter::printSourceLocation(ostream& _stream, << "Spanning multiple lines.\n"; } -void SourceReferenceFormatter::printSourceName(ostream& _stream, - SourceLocation const& _location, - Scanner const& _scanner) +void SourceReferenceFormatter::printSourceName( + ostream& _stream, + SourceLocation const& _location, + Scanner const& _scanner +) { int startLine; int startColumn; @@ -74,14 +78,16 @@ void SourceReferenceFormatter::printSourceName(ostream& _stream, _stream << *_location.sourceName << ":" << (startLine + 1) << ":" << (startColumn + 1) << ": "; } -void SourceReferenceFormatter::printExceptionInformation(ostream& _stream, - Exception const& _exception, - string const& _name, - CompilerStack const& _compiler) +void SourceReferenceFormatter::printExceptionInformation( + ostream& _stream, + Exception const& _exception, + string const& _name, + CompilerStack const& _compiler +) { SourceLocation const* location = boost::get_error_info(_exception); auto secondarylocation = boost::get_error_info(_exception); - Scanner const* scanner; + Scanner const* scanner = nullptr; if (location) { @@ -101,7 +107,7 @@ void SourceReferenceFormatter::printExceptionInformation(ostream& _stream, if (secondarylocation && !secondarylocation->infos.empty()) { - for(auto info: secondarylocation->infos) + for (auto info: secondarylocation->infos) { scanner = &_compiler.getScanner(*info.second.sourceName); _stream << info.first << " "; diff --git a/libsolidity/SourceReferenceFormatter.h b/libsolidity/SourceReferenceFormatter.h index 43d3882e8..ed2564f31 100644 --- a/libsolidity/SourceReferenceFormatter.h +++ b/libsolidity/SourceReferenceFormatter.h @@ -40,8 +40,12 @@ struct SourceReferenceFormatter { public: static void printSourceLocation(std::ostream& _stream, SourceLocation const& _location, Scanner const& _scanner); - static void printExceptionInformation(std::ostream& _stream, Exception const& _exception, - std::string const& _name, CompilerStack const& _compiler); + static void printExceptionInformation( + std::ostream& _stream, + Exception const& _exception, + std::string const& _name, + CompilerStack const& _compiler + ); private: static void printSourceName(std::ostream& _stream, SourceLocation const& _location, Scanner const& _scanner); }; From f4b836dab3950506ad7f2a83aa7c7adb1d51ecc3 Mon Sep 17 00:00:00 2001 From: Liana Husikyan Date: Mon, 4 May 2015 17:18:01 +0200 Subject: [PATCH 19/32] some more style fixes --- libsolidity/AST.cpp | 13 +++++++------ libsolidity/SourceReferenceFormatter.cpp | 19 +++++++++++-------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/libsolidity/AST.cpp b/libsolidity/AST.cpp index 50184fa5a..da34f3ab9 100644 --- a/libsolidity/AST.cpp +++ b/libsolidity/AST.cpp @@ -95,9 +95,10 @@ void ContractDefinition::checkTypeRequirements() { FixedHash<4> const& hash = it.first; if (hashes.count(hash)) - BOOST_THROW_EXCEPTION(createTypeError( - std::string("Function signature hash collision for ") + - it.second->externalSignature())); + BOOST_THROW_EXCEPTION( + createTypeError( + string("Function signature hash collision for ") + it.second->externalSignature()) + ); hashes.insert(hash); } } @@ -311,12 +312,12 @@ void ContractDefinition::checkExternalTypeClashes() const )); } -std::vector> const& ContractDefinition::getInterfaceEvents() const +vector> const& ContractDefinition::getInterfaceEvents() const { if (!m_interfaceEvents) { set eventsSeen; - m_interfaceEvents.reset(new std::vector>()); + m_interfaceEvents.reset(new vector>()); for (ContractDefinition const* contract: getLinearizedBaseContracts()) for (ASTPointer const& e: contract->getEvents()) if (eventsSeen.count(e->getName()) == 0) @@ -956,7 +957,7 @@ void Identifier::overloadResolution(TypePointers const& _argumentTypes) solAssert(!m_referencedDeclaration, "Referenced declaration should be null before overload resolution."); solAssert(!m_overloadedDeclarations.empty(), "No candidates for overload resolution found."); - std::vector possibles; + vector possibles; if (m_overloadedDeclarations.size() == 1) m_referencedDeclaration = *m_overloadedDeclarations.begin(); diff --git a/libsolidity/SourceReferenceFormatter.cpp b/libsolidity/SourceReferenceFormatter.cpp index e66851358..77805efc8 100644 --- a/libsolidity/SourceReferenceFormatter.cpp +++ b/libsolidity/SourceReferenceFormatter.cpp @@ -48,11 +48,11 @@ void SourceReferenceFormatter::printSourceLocation( { string line = _scanner.getLineAtPosition(_location.start); _stream << line << endl; - std::for_each(line.cbegin(), line.cbegin() + startColumn, - [&_stream](char const& ch) - { - _stream << (ch == '\t' ? '\t' : ' '); - }); + for_each( + line.cbegin(), + line.cbegin() + startColumn, + [&_stream](char const& ch) { _stream << (ch == '\t' ? '\t' : ' '); } + ); _stream << "^"; if (endColumn > startColumn + 2) _stream << string(endColumn - startColumn - 2, '-'); @@ -61,9 +61,12 @@ void SourceReferenceFormatter::printSourceLocation( _stream << endl; } else - _stream << _scanner.getLineAtPosition(_location.start) << endl - << string(startColumn, ' ') << "^\n" - << "Spanning multiple lines.\n"; + _stream << + _scanner.getLineAtPosition(_location.start) << + endl << + string(startColumn, ' ') << + "^\n" << + "Spanning multiple lines.\n"; } void SourceReferenceFormatter::printSourceName( From e25c6beb274c752b586d0c5a097aebf2e10bfc00 Mon Sep 17 00:00:00 2001 From: Liana Husikyan Date: Mon, 4 May 2015 17:21:59 +0200 Subject: [PATCH 20/32] Update AST.cpp --- libsolidity/AST.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libsolidity/AST.cpp b/libsolidity/AST.cpp index da34f3ab9..4e87e68f0 100644 --- a/libsolidity/AST.cpp +++ b/libsolidity/AST.cpp @@ -147,7 +147,7 @@ void ContractDefinition::checkDuplicateFunctions() const SecondarySourceLocation ssl; auto it = functions[getName()].begin(); ++it; - for(; it != functions[getName()].end(); ++it) + for (; it != functions[getName()].end(); ++it) ssl.append("Another declaration is here:", (*it)->getLocation()); BOOST_THROW_EXCEPTION( From abab0a744efb8d4c22e67d60043b1742ffa5f9e1 Mon Sep 17 00:00:00 2001 From: Liana Husikyan Date: Mon, 4 May 2015 17:28:28 +0200 Subject: [PATCH 21/32] Update AST.cpp --- libsolidity/AST.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/libsolidity/AST.cpp b/libsolidity/AST.cpp index 4e87e68f0..2f98ce4f6 100644 --- a/libsolidity/AST.cpp +++ b/libsolidity/AST.cpp @@ -95,10 +95,9 @@ void ContractDefinition::checkTypeRequirements() { FixedHash<4> const& hash = it.first; if (hashes.count(hash)) - BOOST_THROW_EXCEPTION( - createTypeError( - string("Function signature hash collision for ") + it.second->externalSignature()) - ); + BOOST_THROW_EXCEPTION(createTypeError( + string("Function signature hash collision for ") + it.second->externalSignature() + )); hashes.insert(hash); } } From 3cfe1cabda16fa8fd9ca8a466643dce62dc1172a Mon Sep 17 00:00:00 2001 From: Liana Husikyan Date: Mon, 4 May 2015 17:30:28 +0200 Subject: [PATCH 22/32] Update NameAndTypeResolver.cpp --- libsolidity/NameAndTypeResolver.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libsolidity/NameAndTypeResolver.cpp b/libsolidity/NameAndTypeResolver.cpp index 813e04526..9aebbf054 100644 --- a/libsolidity/NameAndTypeResolver.cpp +++ b/libsolidity/NameAndTypeResolver.cpp @@ -376,7 +376,9 @@ void DeclarationRegistrationHelper::registerDeclaration(Declaration& _declaratio errinfo_sourceLocation(secondDeclarationLocation) << errinfo_comment("Identifier already declared.") << errinfo_secondarySourceLocation( - SecondarySourceLocation().append("The previous declaration is here:", firstDeclarationLocation))); + SecondarySourceLocation().append("The previous declaration is here:", firstDeclarationLocation) + ) + ); } _declaration.setScope(m_currentScope); From 90d06cb7b33cdad1d4458c221db574119a75ddd2 Mon Sep 17 00:00:00 2001 From: arkpar Date: Mon, 4 May 2015 18:19:41 +0200 Subject: [PATCH 23/32] 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 24/32] 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 25/32] 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 26/32] 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 27/32] 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 28/32] 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 29/32] 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 30/32] 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 31/32] 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 " <>"; } From d69b2badcf085cc1d2f27431dfe7a6f7450ba6a2 Mon Sep 17 00:00:00 2001 From: arkpar Date: Wed, 6 May 2015 10:33:30 +0200 Subject: [PATCH 32/32] Fixed accessing deleted widgets --- alethzero/MainWin.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/alethzero/MainWin.cpp b/alethzero/MainWin.cpp index de5f149ce..42951279b 100644 --- a/alethzero/MainWin.cpp +++ b/alethzero/MainWin.cpp @@ -143,10 +143,6 @@ Main::Main(QWidget *parent) : // ui->log->addItem(QString::fromStdString(s)); }; -#if !ETH_FATDB - delete ui->dockWidget_accounts; -#endif - #if ETH_DEBUG m_servers.append("127.0.0.1:30300"); #endif @@ -203,6 +199,9 @@ Main::Main(QWidget *parent) : // QWebEngineInspector* inspector = new QWebEngineInspector(); // inspector->setPage(page); readSettings(); +#if !ETH_FATDB + removeDockWidget(ui->dockWidget_accounts); +#endif installWatches(); startTimer(100);