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