From c3e6682c3b083b17e0f53e2b07a859ecdd742b46 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Tue, 26 Aug 2014 18:41:07 +0200 Subject: [PATCH] Numerous bug fixes. --- CMakeLists.txt | 1 + libethereum/Client.cpp | 1 + libethereum/State.cpp | 12 +++---- libethereum/Transaction.cpp | 2 +- libwhisper/CMakeLists.txt | 66 +++++++++++++++++++++++++++++++++++++ libwhisper/Whisper.cpp | 34 +++++++++++++++++++ libwhisper/Whisper.h | 50 ++++++++++++++++++++++++++++ 7 files changed, 159 insertions(+), 7 deletions(-) create mode 100644 libwhisper/CMakeLists.txt create mode 100644 libwhisper/Whisper.cpp create mode 100644 libwhisper/Whisper.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 34b671502..d8d3dc391 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -339,6 +339,7 @@ if (NOT LANGUAGES) add_subdirectory(secp256k1) add_subdirectory(libethcore) add_subdirectory(libevm) + add_subdirectory(libwhisper) add_subdirectory(libethereum) add_subdirectory(libethereumx) add_subdirectory(test) diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index 2ae0d7de4..6249c370b 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -506,6 +506,7 @@ void Client::work() m_postMine = m_preMine; rsm = true; changeds.insert(PendingChangedFilter); + // TODO: Move transactions pending from m_postMine back to transaction queue. } // returns h256s as blooms, once for each transaction. diff --git a/libethereum/State.cpp b/libethereum/State.cpp index d9d2fdfe8..41f4a6f1b 100644 --- a/libethereum/State.cpp +++ b/libethereum/State.cpp @@ -697,9 +697,10 @@ void State::commitToMine(BlockChain const& _bc) m_lastTx = m_db; - RLPStream uncles; Addresses uncleAddresses; + RLPStream unclesData; + unsigned unclesCount = 0; if (m_previousBlock != BlockChain::genesis()) { // Find great-uncles (or second-cousins or whatever they are) - children of great-grandparents, great-great-grandparents... that were not already uncles in previous generations. @@ -710,18 +711,16 @@ void State::commitToMine(BlockChain const& _bc) { auto us = _bc.details(p).children; assert(us.size() >= 1); // must be at least 1 child of our grandparent - it's our own parent! - uncles.appendList(us.size() - 1); // one fewer - uncles precludes our parent from the list of grandparent's children. for (auto const& u: us) if (!knownUncles.count(BlockInfo::headerHash(_bc.block(u)))) // ignore any uncles/mainline blocks that we know about. We use header-hash for this. { BlockInfo ubi(_bc.block(u)); - ubi.fillStream(uncles, true); + ubi.fillStream(unclesData, true); + ++unclesCount; uncleAddresses.push_back(ubi.coinbaseAddress); } } } - else - uncles.appendList(0); MemoryDB tm; GenericTrieDB transactionReceipts(&tm); @@ -741,7 +740,8 @@ void State::commitToMine(BlockChain const& _bc) } txs.swapOut(m_currentTxs); - uncles.swapOut(m_currentUncles); + + RLPStream(unclesCount).appendRaw(unclesData.out(), unclesCount).swapOut(m_currentUncles); m_currentBlock.transactionsRoot = transactionReceipts.root(); m_currentBlock.sha3Uncles = sha3(m_currentUncles); diff --git a/libethereum/Transaction.cpp b/libethereum/Transaction.cpp index d248ae2fd..5a0fa8eeb 100644 --- a/libethereum/Transaction.cpp +++ b/libethereum/Transaction.cpp @@ -38,7 +38,7 @@ Transaction::Transaction(bytesConstRef _rlpData, bool _checkSender) nonce = rlp[field = 0].toInt(); gasPrice = rlp[field = 1].toInt(); gas = rlp[field = 2].toInt(); - receiveAddress = rlp[field = 3].isEmpty() ? Address() : Address(); + receiveAddress = rlp[field = 3].toHash
(); value = rlp[field = 4].toInt(); data = rlp[field = 5].toBytes(); vrs = Signature{ rlp[field = 6].toInt(), rlp[field = 7].toInt(), rlp[field = 8].toInt() }; diff --git a/libwhisper/CMakeLists.txt b/libwhisper/CMakeLists.txt new file mode 100644 index 000000000..4d633495f --- /dev/null +++ b/libwhisper/CMakeLists.txt @@ -0,0 +1,66 @@ +cmake_policy(SET CMP0015 NEW) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSTATICLIB") + +aux_source_directory(. SRC_LIST) + +set(EXECUTABLE whisper) + +# set(CMAKE_INSTALL_PREFIX ../lib) +if(ETH_STATIC) + add_library(${EXECUTABLE} STATIC ${SRC_LIST}) +else() + add_library(${EXECUTABLE} SHARED ${SRC_LIST}) +endif() + +file(GLOB HEADERS "*.h") + +include_directories(..) + +target_link_libraries(${EXECUTABLE} evm) +target_link_libraries(${EXECUTABLE} lll) +target_link_libraries(${EXECUTABLE} ethential) +target_link_libraries(${EXECUTABLE} secp256k1) +if(MINIUPNPC_LS) +target_link_libraries(${EXECUTABLE} ${MINIUPNPC_LS}) +endif() +target_link_libraries(${EXECUTABLE} ${LEVELDB_LS}) +target_link_libraries(${EXECUTABLE} ${CRYPTOPP_LS}) +target_link_libraries(${EXECUTABLE} gmp) + +if("${TARGET_PLATFORM}" STREQUAL "w64") + target_link_libraries(${EXECUTABLE} boost_system-mt-s) + target_link_libraries(${EXECUTABLE} boost_regex-mt-s) + target_link_libraries(${EXECUTABLE} boost_filesystem-mt-s) + target_link_libraries(${EXECUTABLE} boost_thread_win32-mt-s) + target_link_libraries(${EXECUTABLE} iphlpapi) + target_link_libraries(${EXECUTABLE} ws2_32) + target_link_libraries(${EXECUTABLE} mswsock) + target_link_libraries(${EXECUTABLE} shlwapi) +elseif (APPLE) + # Latest mavericks boost libraries only come with -mt + target_link_libraries(${EXECUTABLE} boost_system-mt) + target_link_libraries(${EXECUTABLE} boost_regex-mt) + target_link_libraries(${EXECUTABLE} boost_filesystem-mt) + target_link_libraries(${EXECUTABLE} boost_thread-mt) + find_package(Threads REQUIRED) + target_link_libraries(${EXECUTABLE} ${CMAKE_THREAD_LIBS_INIT}) +elseif (UNIX) + target_link_libraries(${EXECUTABLE} ${Boost_SYSTEM_LIBRARY}) + target_link_libraries(${EXECUTABLE} ${Boost_REGEX_LIBRARY}) + target_link_libraries(${EXECUTABLE} ${Boost_FILESYSTEM_LIBRARY}) + target_link_libraries(${EXECUTABLE} ${Boost_THREAD_LIBRARY}) + target_link_libraries(${EXECUTABLE} ${Boost_DATE_TIME_LIBRARY}) + target_link_libraries(${EXECUTABLE} ${CMAKE_THREAD_LIBS_INIT}) +else () + target_link_libraries(${EXECUTABLE} boost_system) + target_link_libraries(${EXECUTABLE} boost_regex) + target_link_libraries(${EXECUTABLE} boost_filesystem) + target_link_libraries(${EXECUTABLE} boost_thread) + find_package(Threads REQUIRED) + target_link_libraries(${EXECUTABLE} ${CMAKE_THREAD_LIBS_INIT}) +endif () + +install( TARGETS ${EXECUTABLE} ARCHIVE DESTINATION lib LIBRARY DESTINATION lib ) +install( FILES ${HEADERS} DESTINATION include/${EXECUTABLE} ) + diff --git a/libwhisper/Whisper.cpp b/libwhisper/Whisper.cpp new file mode 100644 index 000000000..905080f4b --- /dev/null +++ b/libwhisper/Whisper.cpp @@ -0,0 +1,34 @@ +/* + 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 Whisper.cpp + * @author Gav Wood + * @date 2014 + */ + +#include "Whisper.h" + +#include +using namespace std; +using namespace eth; + +Whisper::Whisper() +{ +} + +Whisper::~Whisper() +{ +} diff --git a/libwhisper/Whisper.h b/libwhisper/Whisper.h new file mode 100644 index 000000000..7be8a0c49 --- /dev/null +++ b/libwhisper/Whisper.h @@ -0,0 +1,50 @@ +/* + 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 Whisper.h + * @author Gav Wood + * @date 2014 + */ + +#pragma once + +namespace eth +{ +/* +class NetPeer +{ +public: + NetPeer(); + virtual ~NetPeer(); + +protected: + virtual void onIncoming(PeerId); + void send(PeerId); +}; +*/ +/** + */ +class Whisper//: public NetPeer +{ +public: + /// Constructor. + Whisper(); + + /// Destructor. + virtual ~Whisper(); +}; + +}