Gav Wood
10 years ago
7 changed files with 2 additions and 162 deletions
@ -1,81 +0,0 @@ |
|||||
/*
|
|
||||
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 MessageFilter.cpp
|
|
||||
* @author Gav Wood <i@gavwood.com> |
|
||||
* @date 2014 |
|
||||
*/ |
|
||||
|
|
||||
#include "MessageFilter.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; |
|
||||
} |
|
@ -1,69 +0,0 @@ |
|||||
/*
|
|
||||
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 MessageFilter.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