arkpar
10 years ago
109 changed files with 1742 additions and 712 deletions
@ -0,0 +1,194 @@ |
|||
/*
|
|||
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 <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
/** @file StructuredLogger.h
|
|||
* @author Lefteris Karapetsas <lefteris@ethdev.com> |
|||
* @date 2015 |
|||
* |
|||
* A simple helper class for the structured logging |
|||
*/ |
|||
|
|||
#include "StructuredLogger.h" |
|||
|
|||
#include <ctime> |
|||
#include <json/json.h> |
|||
#include "Guards.h" |
|||
|
|||
using namespace std; |
|||
|
|||
namespace dev |
|||
{ |
|||
|
|||
string StructuredLogger::timePointToString(chrono::system_clock::time_point const& _ts) |
|||
{ |
|||
// not using C++11 std::put_time due to gcc bug
|
|||
// http://stackoverflow.com/questions/14136833/stdput-time-implementation-status-in-gcc
|
|||
|
|||
char buffer[64]; |
|||
time_t time = chrono::system_clock::to_time_t(_ts); |
|||
tm* ptm = localtime(&time); |
|||
if (strftime(buffer, sizeof(buffer), get().m_timeFormat.c_str(), ptm)) |
|||
return string(buffer); |
|||
return ""; |
|||
} |
|||
|
|||
void StructuredLogger::outputJson(Json::Value const& _value, std::string const& _name) const |
|||
{ |
|||
Json::Value event; |
|||
static Mutex s_lock; |
|||
Guard l(s_lock); |
|||
event[_name] = _value; |
|||
cout << event << endl << flush; |
|||
} |
|||
|
|||
void StructuredLogger::starting(string const& _clientImpl, const char* _ethVersion) |
|||
{ |
|||
if (get().m_enabled) |
|||
{ |
|||
Json::Value event; |
|||
event["client_impl"] = _clientImpl; |
|||
event["eth_version"] = std::string(_ethVersion); |
|||
event["ts"] = timePointToString(std::chrono::system_clock::now()); |
|||
|
|||
get().outputJson(event, "starting"); |
|||
} |
|||
} |
|||
|
|||
void StructuredLogger::stopping(string const& _clientImpl, const char* _ethVersion) |
|||
{ |
|||
if (get().m_enabled) |
|||
{ |
|||
Json::Value event; |
|||
event["client_impl"] = _clientImpl; |
|||
event["eth_version"] = std::string(_ethVersion); |
|||
event["ts"] = timePointToString(std::chrono::system_clock::now()); |
|||
|
|||
get().outputJson(event, "stopping"); |
|||
} |
|||
} |
|||
|
|||
void StructuredLogger::p2pConnected( |
|||
string const& _id, |
|||
bi::tcp::endpoint const& _addr, |
|||
chrono::system_clock::time_point const& _ts, |
|||
string const& _remoteVersion, |
|||
unsigned int _numConnections) |
|||
{ |
|||
if (get().m_enabled) |
|||
{ |
|||
std::stringstream addrStream; |
|||
addrStream << _addr; |
|||
Json::Value event; |
|||
event["remote_version_string"] = _remoteVersion; |
|||
event["remote_addr"] = addrStream.str(); |
|||
event["remote_id"] = _id; |
|||
event["num_connections"] = Json::Value(_numConnections); |
|||
event["ts"] = timePointToString(_ts); |
|||
|
|||
get().outputJson(event, "p2p.connected"); |
|||
} |
|||
} |
|||
|
|||
void StructuredLogger::p2pDisconnected(string const& _id, bi::tcp::endpoint const& _addr, unsigned int _numConnections) |
|||
{ |
|||
if (get().m_enabled) |
|||
{ |
|||
std::stringstream addrStream; |
|||
addrStream << _addr; |
|||
Json::Value event; |
|||
event["remote_addr"] = addrStream.str(); |
|||
event["remote_id"] = _id; |
|||
event["num_connections"] = Json::Value(_numConnections); |
|||
event["ts"] = timePointToString(chrono::system_clock::now()); |
|||
|
|||
get().outputJson(event, "p2p.disconnected"); |
|||
} |
|||
} |
|||
|
|||
void StructuredLogger::minedNewBlock( |
|||
string const& _hash, |
|||
string const& _blockNumber, |
|||
string const& _chainHeadHash, |
|||
string const& _prevHash) |
|||
{ |
|||
if (get().m_enabled) |
|||
{ |
|||
Json::Value event; |
|||
event["block_hash"] = _hash; |
|||
event["block_number"] = _blockNumber; |
|||
event["chain_head_hash"] = _chainHeadHash; |
|||
event["ts"] = timePointToString(std::chrono::system_clock::now()); |
|||
event["block_prev_hash"] = _prevHash; |
|||
|
|||
get().outputJson(event, "eth.miner.new_block"); |
|||
} |
|||
} |
|||
|
|||
void StructuredLogger::chainReceivedNewBlock( |
|||
string const& _hash, |
|||
string const& _blockNumber, |
|||
string const& _chainHeadHash, |
|||
string const& _remoteID, |
|||
string const& _prevHash) |
|||
{ |
|||
if (get().m_enabled) |
|||
{ |
|||
Json::Value event; |
|||
event["block_hash"] = _hash; |
|||
event["block_number"] = _blockNumber; |
|||
event["chain_head_hash"] = _chainHeadHash; |
|||
event["remote_id"] = _remoteID; |
|||
event["ts"] = timePointToString(chrono::system_clock::now()); |
|||
event["block_prev_hash"] = _prevHash; |
|||
|
|||
get().outputJson(event, "eth.chain.received.new_block"); |
|||
} |
|||
} |
|||
|
|||
void StructuredLogger::chainNewHead( |
|||
string const& _hash, |
|||
string const& _blockNumber, |
|||
string const& _chainHeadHash, |
|||
string const& _prevHash) |
|||
{ |
|||
if (get().m_enabled) |
|||
{ |
|||
Json::Value event; |
|||
event["block_hash"] = _hash; |
|||
event["block_number"] = _blockNumber; |
|||
event["chain_head_hash"] = _chainHeadHash; |
|||
event["ts"] = timePointToString(chrono::system_clock::now()); |
|||
event["block_prev_hash"] = _prevHash; |
|||
|
|||
get().outputJson(event, "eth.miner.new_block"); |
|||
} |
|||
} |
|||
|
|||
void StructuredLogger::transactionReceived(string const& _hash, string const& _remoteId) |
|||
{ |
|||
if (get().m_enabled) |
|||
{ |
|||
Json::Value event; |
|||
event["tx_hash"] = _hash; |
|||
event["remote_id"] = _remoteId; |
|||
event["ts"] = timePointToString(chrono::system_clock::now()); |
|||
|
|||
get().outputJson(event, "eth.tx.received"); |
|||
} |
|||
} |
|||
|
|||
|
|||
} |
@ -0,0 +1,104 @@ |
|||
/*
|
|||
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 <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
/** @file StructuredLogger.h
|
|||
* @author Lefteris Karapetsas <lefteris@ethdev.com> |
|||
* @date 2015 |
|||
* |
|||
* A simple helper class for the structured logging |
|||
* The spec for the implemented log events is here: |
|||
* https://github.com/ethereum/system-testing/wiki/Log-Events
|
|||
*/ |
|||
|
|||
#pragma once |
|||
|
|||
#include <string> |
|||
#include <chrono> |
|||
#include <libp2p/Network.h> |
|||
|
|||
namespace Json { class Value; } |
|||
|
|||
namespace dev |
|||
{ |
|||
|
|||
// TODO: Make the output stream configurable. stdout, stderr, file e.t.c.
|
|||
class StructuredLogger |
|||
{ |
|||
public: |
|||
/**
|
|||
* Initializes the structured logger object |
|||
* @param _enabled Whether logging is on or off |
|||
* @param _timeFormat A time format string as described here: |
|||
* http://en.cppreference.com/w/cpp/chrono/c/strftime
|
|||
* with which to display timestamps |
|||
*/ |
|||
void initialize(bool _enabled, std::string const& _timeFormat) |
|||
{ |
|||
m_enabled = _enabled; |
|||
m_timeFormat = _timeFormat; |
|||
} |
|||
|
|||
static StructuredLogger& get() |
|||
{ |
|||
static StructuredLogger instance; |
|||
return instance; |
|||
} |
|||
|
|||
static void starting(std::string const& _clientImpl, const char* _ethVersion); |
|||
static void stopping(std::string const& _clientImpl, const char* _ethVersion); |
|||
static void p2pConnected( |
|||
std::string const& _id, |
|||
bi::tcp::endpoint const& _addr, |
|||
std::chrono::system_clock::time_point const& _ts, |
|||
std::string const& _remoteVersion, |
|||
unsigned int _numConnections |
|||
); |
|||
static void p2pDisconnected(std::string const& _id, bi::tcp::endpoint const& _addr, unsigned int _numConnections); |
|||
static void minedNewBlock( |
|||
std::string const& _hash, |
|||
std::string const& _blockNumber, |
|||
std::string const& _chainHeadHash, |
|||
std::string const& _prevHash |
|||
); |
|||
static void chainReceivedNewBlock( |
|||
std::string const& _hash, |
|||
std::string const& _blockNumber, |
|||
std::string const& _chainHeadHash, |
|||
std::string const& _remoteID, |
|||
std::string const& _prevHash |
|||
); |
|||
static void chainNewHead( |
|||
std::string const& _hash, |
|||
std::string const& _blockNumber, |
|||
std::string const& _chainHeadHash, |
|||
std::string const& _prevHash |
|||
); |
|||
static void transactionReceived(std::string const& _hash, std::string const& _remoteId); |
|||
private: |
|||
// Singleton class. Private default ctor and no copying
|
|||
StructuredLogger() = default; |
|||
StructuredLogger(StructuredLogger const&) = delete; |
|||
void operator=(StructuredLogger const&) = delete; |
|||
|
|||
/// @returns a string representation of a timepoint
|
|||
static std::string timePointToString(std::chrono::system_clock::time_point const& _ts); |
|||
void outputJson(Json::Value const& _value, std::string const& _name) const; |
|||
|
|||
bool m_enabled = false; |
|||
std::string m_timeFormat = "%Y-%m-%dT%H:%M:%S"; |
|||
}; |
|||
|
|||
} |
@ -0,0 +1,46 @@ |
|||
/*
|
|||
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 <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
/** @file UndefMacros.h
|
|||
* @author Lefteris <lefteris@ethdev.com> |
|||
* @date 2015 |
|||
* |
|||
* This header should be used to #undef some really evil macros defined by |
|||
* windows.h which result in conflict with our libsolidity/Token.h |
|||
*/ |
|||
#pragma once |
|||
|
|||
#if defined(_MSC_VER) || defined(__MINGW32__) |
|||
|
|||
#undef DELETE |
|||
#undef IN |
|||
#undef VOID |
|||
#undef THIS |
|||
#undef CONST |
|||
|
|||
// Conflicting define on MinGW in windows.h
|
|||
// windows.h(19): #define interface struct
|
|||
#ifdef interface |
|||
#undef interface |
|||
#endif |
|||
|
|||
#elif defined(DELETE) || defined(IN) || defined(VOID) || defined(THIS) || defined(CONST) || defined(interface) |
|||
|
|||
#error "The preceding macros in this header file are reserved for V8's "\ |
|||
"TOKEN_LIST. Please add a platform specific define above to undefine "\ |
|||
"overlapping macros." |
|||
|
|||
#endif |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -0,0 +1,42 @@ |
|||
/* |
|||
This file is part of ethereum.js. |
|||
|
|||
ethereum.js is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU Lesser General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
ethereum.js is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU Lesser General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU Lesser General Public License |
|||
along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
/** @file signature.js |
|||
* @authors: |
|||
* Marek Kotewicz <marek@ethdev.com> |
|||
* @date 2015 |
|||
*/ |
|||
|
|||
var web3 = require('./web3'); |
|||
var c = require('./const'); |
|||
|
|||
/// @param function name for which we want to get signature
|
|||
/// @returns signature of function with given name
|
|||
var functionSignatureFromAscii = function (name) { |
|||
return web3.sha3(web3.fromAscii(name)).slice(0, 2 + c.ETH_SIGNATURE_LENGTH * 2); |
|||
}; |
|||
|
|||
/// @param event name for which we want to get signature
|
|||
/// @returns signature of event with given name
|
|||
var eventSignatureFromAscii = function (name) { |
|||
return web3.sha3(web3.fromAscii(name)); |
|||
}; |
|||
|
|||
module.exports = { |
|||
functionSignatureFromAscii: functionSignatureFromAscii, |
|||
eventSignatureFromAscii: eventSignatureFromAscii |
|||
}; |
|||
|
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue