5 changed files with 150 additions and 1 deletions
@ -0,0 +1,81 @@ |
|||||
|
/*
|
||||
|
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 LogFilter.cpp
|
||||
|
* @author Gav Wood <i@gavwood.com> |
||||
|
* @date 2014 |
||||
|
*/ |
||||
|
|
||||
|
#include "LogFilter.h" |
||||
|
|
||||
|
#include <libdevcrypto/SHA3.h> |
||||
|
#include "State.h" |
||||
|
using namespace std; |
||||
|
using namespace dev; |
||||
|
using namespace dev::eth; |
||||
|
|
||||
|
void LogFilter::streamRLP(RLPStream& _s) const |
||||
|
{ |
||||
|
_s.appendList(6) << m_addresses << m_topics << m_earliest << m_latest << m_max << m_skip; |
||||
|
} |
||||
|
|
||||
|
h256 LogFilter::sha3() const |
||||
|
{ |
||||
|
RLPStream s; |
||||
|
streamRLP(s); |
||||
|
return dev::sha3(s.out()); |
||||
|
} |
||||
|
|
||||
|
bool LogFilter::matches(LogBloom _bloom) const |
||||
|
{ |
||||
|
if (m_addresses.size()) |
||||
|
{ |
||||
|
for (auto i: m_addresses) |
||||
|
if (_bloom.containsBloom<3>(dev::sha3(i))) |
||||
|
goto OK1; |
||||
|
return false; |
||||
|
} |
||||
|
OK1: |
||||
|
if (m_topics.size()) |
||||
|
{ |
||||
|
for (auto i: m_topics) |
||||
|
if (_bloom.containsBloom<3>(dev::sha3(i))) |
||||
|
goto OK2; |
||||
|
return false; |
||||
|
} |
||||
|
OK2: |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
bool LogFilter::matches(State const& _s, unsigned _i) const |
||||
|
{ |
||||
|
return matches(_s.receipt(_i)).size() > 0; |
||||
|
} |
||||
|
|
||||
|
LogEntries LogFilter::matches(TransactionReceipt const& _m) const |
||||
|
{ |
||||
|
LogEntries ret; |
||||
|
for (LogEntry const& e: _m.log()) |
||||
|
{ |
||||
|
if (!m_addresses.empty() && !m_addresses.count(e.address)) |
||||
|
continue; |
||||
|
for (auto const& t: m_topics) |
||||
|
if (!std::count(e.topics.begin(), e.topics.end(), t)) |
||||
|
continue; |
||||
|
ret.push_back(e); |
||||
|
} |
||||
|
return ret; |
||||
|
} |
@ -0,0 +1,69 @@ |
|||||
|
/*
|
||||
|
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 LogFilter.h
|
||||
|
* @author Gav Wood <i@gavwood.com> |
||||
|
* @date 2014 |
||||
|
*/ |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include <libdevcore/Common.h> |
||||
|
#include <libdevcore/RLP.h> |
||||
|
#include <libethcore/CommonEth.h> |
||||
|
#include "TransactionReceipt.h" |
||||
|
|
||||
|
namespace dev |
||||
|
{ |
||||
|
namespace eth |
||||
|
{ |
||||
|
|
||||
|
class State; |
||||
|
|
||||
|
class LogFilter |
||||
|
{ |
||||
|
public: |
||||
|
LogFilter(int _earliest = 0, int _latest = -1, unsigned _max = 10, unsigned _skip = 0): m_earliest(_earliest), m_latest(_latest), m_max(_max), m_skip(_skip) {} |
||||
|
|
||||
|
void streamRLP(RLPStream& _s) const; |
||||
|
h256 sha3() const; |
||||
|
|
||||
|
int earliest() const { return m_earliest; } |
||||
|
int latest() const { return m_latest; } |
||||
|
unsigned max() const { return m_max; } |
||||
|
unsigned skip() const { return m_skip; } |
||||
|
bool matches(LogBloom _bloom) const; |
||||
|
bool matches(State const& _s, unsigned _i) const; |
||||
|
LogEntries matches(TransactionReceipt const& _r) const; |
||||
|
|
||||
|
LogFilter address(Address _a) { m_addresses.insert(_a); return *this; } |
||||
|
LogFilter topic(h256 const& _t) { m_topics.insert(_t); return *this; } |
||||
|
LogFilter withMax(unsigned _m) { m_max = _m; return *this; } |
||||
|
LogFilter withSkip(unsigned _m) { m_skip = _m; return *this; } |
||||
|
LogFilter withEarliest(int _e) { m_earliest = _e; return *this; } |
||||
|
LogFilter withLatest(int _e) { m_latest = _e; return *this; } |
||||
|
|
||||
|
private: |
||||
|
AddressSet m_addresses; |
||||
|
h256Set m_topics; |
||||
|
int m_earliest = 0; |
||||
|
int m_latest = -1; |
||||
|
unsigned m_max; |
||||
|
unsigned m_skip; |
||||
|
}; |
||||
|
|
||||
|
} |
||||
|
} |
Loading…
Reference in new issue