aboutsummaryrefslogtreecommitdiffstats
path: root/libdevcore
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2017-09-21 22:56:16 +0800
committerGitHub <noreply@github.com>2017-09-21 22:56:16 +0800
commitbdeb9e52a2211510644fb53df93fb98258b40a65 (patch)
treed8fb917e7dc27b937cb4505029bbc3c8c1bc1a67 /libdevcore
parentd7661dd97460250b4e1127b9e7ea91e116143780 (diff)
parenta14fc5ffa1f03d5aa312396a39633d720b04c90a (diff)
downloaddexon-solidity-bdeb9e52a2211510644fb53df93fb98258b40a65.tar
dexon-solidity-bdeb9e52a2211510644fb53df93fb98258b40a65.tar.gz
dexon-solidity-bdeb9e52a2211510644fb53df93fb98258b40a65.tar.bz2
dexon-solidity-bdeb9e52a2211510644fb53df93fb98258b40a65.tar.lz
dexon-solidity-bdeb9e52a2211510644fb53df93fb98258b40a65.tar.xz
dexon-solidity-bdeb9e52a2211510644fb53df93fb98258b40a65.tar.zst
dexon-solidity-bdeb9e52a2211510644fb53df93fb98258b40a65.zip
Merge pull request #2947 from ethereum/develop
Merge develop into release for 0.4.17.
Diffstat (limited to 'libdevcore')
-rw-r--r--libdevcore/ABI.h100
-rw-r--r--libdevcore/Common.h58
-rw-r--r--libdevcore/CommonData.cpp28
-rw-r--r--libdevcore/CommonData.h3
-rw-r--r--libdevcore/CommonIO.cpp5
-rw-r--r--libdevcore/FixedHash.h148
-rw-r--r--libdevcore/SHA3.cpp5
-rw-r--r--libdevcore/SHA3.h9
-rw-r--r--libdevcore/SwarmHash.cpp4
-rw-r--r--libdevcore/SwarmHash.h4
-rw-r--r--libdevcore/vector_ref.h39
11 files changed, 41 insertions, 362 deletions
diff --git a/libdevcore/ABI.h b/libdevcore/ABI.h
deleted file mode 100644
index 8b9e5c98..00000000
--- a/libdevcore/ABI.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- This file is part of solidity.
-
- solidity 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.
-
- solidity 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 solidity. If not, see <http://www.gnu.org/licenses/>.
-*/
-/** @file ABI.h
- * @author Gav Wood <i@gavwood.com>
- * @date 2014
- */
-
-#pragma once
-
-#include <libdevcore/Common.h>
-#include <libdevcore/FixedHash.h>
-#include <libdevcore/CommonData.h>
-#include <libdevcore/SHA3.h>
-
-namespace dev
-{
-namespace eth
-{
-
-inline string32 toString32(std::string const& _s)
-{
- string32 ret;
- for (unsigned i = 0; i < 32; ++i)
- ret[i] = i < _s.size() ? _s[i] : 0;
- return ret;
-}
-
-template <class T> struct ABISerialiser {};
-template <unsigned N> struct ABISerialiser<FixedHash<N>> { static bytes serialise(FixedHash<N> const& _t) { static_assert(N <= 32, "Cannot serialise hash > 32 bytes."); static_assert(N > 0, "Cannot serialise zero-length hash."); return bytes(32 - N, 0) + _t.asBytes(); } };
-template <> struct ABISerialiser<u256> { static bytes serialise(u256 const& _t) { return h256(_t).asBytes(); } };
-template <> struct ABISerialiser<u160> { static bytes serialise(u160 const& _t) { return bytes(12, 0) + h160(_t).asBytes(); } };
-template <> struct ABISerialiser<string32> { static bytes serialise(string32 const& _t) { bytes ret; bytesConstRef((byte const*)_t.data(), 32).populate(bytesRef(&ret)); return ret; } };
-template <> struct ABISerialiser<std::string>
-{
- static bytes serialise(std::string const& _t)
- {
- bytes ret = h256(u256(32)).asBytes() + h256(u256(_t.size())).asBytes();
- ret.resize(ret.size() + (_t.size() + 31) / 32 * 32);
- bytesConstRef(&_t).populate(bytesRef(&ret).cropped(64));
- return ret;
- }
-};
-
-inline bytes abiInAux() { return {}; }
-template <class T, class ... U> bytes abiInAux(T const& _t, U const& ... _u)
-{
- return ABISerialiser<T>::serialise(_t) + abiInAux(_u ...);
-}
-
-template <class ... T> bytes abiIn(std::string _id, T const& ... _t)
-{
- return keccak256(_id).ref().cropped(0, 4).toBytes() + abiInAux(_t ...);
-}
-
-template <class T> struct ABIDeserialiser {};
-template <unsigned N> struct ABIDeserialiser<FixedHash<N>> { static FixedHash<N> deserialise(bytesConstRef& io_t) { static_assert(N <= 32, "Parameter sizes must be at most 32 bytes."); FixedHash<N> ret; io_t.cropped(32 - N, N).populate(ret.ref()); io_t = io_t.cropped(32); return ret; } };
-template <> struct ABIDeserialiser<u256> { static u256 deserialise(bytesConstRef& io_t) { u256 ret = fromBigEndian<u256>(io_t.cropped(0, 32)); io_t = io_t.cropped(32); return ret; } };
-template <> struct ABIDeserialiser<u160> { static u160 deserialise(bytesConstRef& io_t) { u160 ret = fromBigEndian<u160>(io_t.cropped(12, 20)); io_t = io_t.cropped(32); return ret; } };
-template <> struct ABIDeserialiser<string32> { static string32 deserialise(bytesConstRef& io_t) { string32 ret; io_t.cropped(0, 32).populate(bytesRef((byte*)ret.data(), 32)); io_t = io_t.cropped(32); return ret; } };
-template <> struct ABIDeserialiser<std::string>
-{
- static std::string deserialise(bytesConstRef& io_t)
- {
- unsigned o = (uint16_t)u256(h256(io_t.cropped(0, 32)));
- unsigned s = (uint16_t)u256(h256(io_t.cropped(o, 32)));
- std::string ret;
- ret.resize(s);
- io_t.cropped(o + 32, s).populate(bytesRef((byte*)ret.data(), s));
- io_t = io_t.cropped(32);
- return ret;
- }
-};
-
-template <class T> T abiOut(bytes const& _data)
-{
- bytesConstRef o(&_data);
- return ABIDeserialiser<T>::deserialise(o);
-}
-
-template <class T> T abiOut(bytesConstRef& _data)
-{
- return ABIDeserialiser<T>::deserialise(_data);
-}
-
-}
-}
diff --git a/libdevcore/Common.h b/libdevcore/Common.h
index 9d6dd408..2543855d 100644
--- a/libdevcore/Common.h
+++ b/libdevcore/Common.h
@@ -37,13 +37,7 @@
#pragma warning(disable:3682) //call through incomplete class
#endif
-#include <map>
-#include <unordered_map>
-#include <vector>
-#include <set>
-#include <unordered_set>
-#include <functional>
-#include <string>
+#include <libdevcore/vector_ref.h>
#if defined(__GNUC__)
#pragma warning(push)
@@ -67,14 +61,13 @@
#pragma GCC diagnostic pop
#endif // defined(__GNUC__)
-#include "vector_ref.h"
+#include <map>
+#include <vector>
+#include <functional>
+#include <string>
using byte = uint8_t;
-// Quote a given token stream to turn it into a string.
-#define DEV_QUOTED_HELPER(s) #s
-#define DEV_QUOTED(s) DEV_QUOTED_HELPER(s)
-
namespace dev
{
@@ -85,32 +78,15 @@ using bytesConstRef = vector_ref<byte const>;
// Numeric types.
using bigint = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<>>;
-using u64 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<64, 64, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>>;
-using u128 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<128, 128, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>>;
-using u256 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<256, 256, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>>;
-using s256 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<256, 256, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>>;
-using u160 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<160, 160, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>>;
-using s160 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<160, 160, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>>;
-using u512 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<512, 512, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>>;
-using s512 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<512, 512, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>>;
-using u256s = std::vector<u256>;
-using u160s = std::vector<u160>;
-using u256Set = std::set<u256>;
-using u160Set = std::set<u160>;
+using u256 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<256, 256, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>>;
+using s256 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<256, 256, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>>;
+using u160 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<160, 160, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>>;
// Map types.
using StringMap = std::map<std::string, std::string>;
-// Hash types.
-using StringHashMap = std::unordered_map<std::string, std::string>;
-
// String types.
using strings = std::vector<std::string>;
-// Fixed-length string types.
-using string32 = std::array<char, 32>;
-
-// Null/Invalid values for convenience.
-static const bytes NullBytes;
/// Interprets @a _u as a two's complement signed number and returns the resulting s256.
inline s256 u2s(u256 _u)
@@ -143,16 +119,6 @@ inline std::ostream& operator<<(std::ostream& os, bytes const& _bytes)
return os;
}
-template <size_t n> inline u256 exp10()
-{
- return exp10<n - 1>() * u256(10);
-}
-
-template <> inline u256 exp10<0>()
-{
- return u256(1);
-}
-
/// RAII utility class whose destructor calls a given function.
class ScopeGuard
{
@@ -164,12 +130,4 @@ private:
std::function<void(void)> m_f;
};
-enum class WithExisting: int
-{
- Trust = 0,
- Verify,
- Rescue,
- Kill
-};
-
}
diff --git a/libdevcore/CommonData.cpp b/libdevcore/CommonData.cpp
index 14caf494..db11e61c 100644
--- a/libdevcore/CommonData.cpp
+++ b/libdevcore/CommonData.cpp
@@ -28,34 +28,6 @@
using namespace std;
using namespace dev;
-std::string dev::escaped(std::string const& _s, bool _all)
-{
- static const map<char, char> prettyEscapes{{'\r', 'r'}, {'\n', 'n'}, {'\t', 't'}, {'\v', 'v'}};
- std::string ret;
- ret.reserve(_s.size() + 2);
- ret.push_back('"');
- for (auto i: _s)
- if (i == '"' && !_all)
- ret += "\\\"";
- else if (i == '\\' && !_all)
- ret += "\\\\";
- else if (prettyEscapes.count(i) && !_all)
- {
- ret += '\\';
- ret += prettyEscapes.find(i)->second;
- }
- else if (i < ' ' || _all)
- {
- ret += "\\x";
- ret.push_back("0123456789abcdef"[(uint8_t)i / 16]);
- ret.push_back("0123456789abcdef"[(uint8_t)i % 16]);
- }
- else
- ret.push_back(i);
- ret.push_back('"');
- return ret;
-}
-
int dev::fromHex(char _i, WhenError _throw)
{
if (_i >= '0' && _i <= '9')
diff --git a/libdevcore/CommonData.h b/libdevcore/CommonData.h
index 5df8986a..765707f8 100644
--- a/libdevcore/CommonData.h
+++ b/libdevcore/CommonData.h
@@ -26,11 +26,10 @@
#include <libdevcore/Common.h>
#include <vector>
-#include <algorithm>
-#include <unordered_set>
#include <type_traits>
#include <cstring>
#include <string>
+#include <set>
namespace dev
{
diff --git a/libdevcore/CommonIO.cpp b/libdevcore/CommonIO.cpp
index 52829455..5d47937b 100644
--- a/libdevcore/CommonIO.cpp
+++ b/libdevcore/CommonIO.cpp
@@ -35,6 +35,9 @@
using namespace std;
using namespace dev;
+namespace
+{
+
template <typename _T>
inline _T contentsGeneric(std::string const& _file)
{
@@ -56,6 +59,8 @@ inline _T contentsGeneric(std::string const& _file)
return ret;
}
+}
+
string dev::contentsString(string const& _file)
{
return contentsGeneric<string>(_file);
diff --git a/libdevcore/FixedHash.h b/libdevcore/FixedHash.h
index 141e9ffd..cd6e1da1 100644
--- a/libdevcore/FixedHash.h
+++ b/libdevcore/FixedHash.h
@@ -23,20 +23,18 @@
#pragma once
+#include <libdevcore/CommonData.h>
+
+#include <boost/functional/hash.hpp>
+#include <boost/io/ios_state.hpp>
+
#include <array>
#include <cstdint>
#include <algorithm>
-#include <boost/functional/hash.hpp>
-#include <boost/io/ios_state.hpp>
-#include "CommonData.h"
namespace dev
{
-/// Compile-time calculation of Log2 of constant values.
-template <unsigned N> struct StaticLog2 { enum { result = 1 + StaticLog2<N/2>::result }; };
-template <> struct StaticLog2<1> { enum { result = 0 }; };
-
/// Fixed-size raw-byte array container type, with an API optimised for storing hashes.
/// Transparently converts to/from the corresponding arithmetic type; this will
/// assume the data contained in the hash is big-endian.
@@ -50,9 +48,6 @@ public:
/// The size of the container.
enum { size = N };
- /// A dummy flag to avoid accidental construction from pointer.
- enum ConstructFromPointerType { ConstructFromPointer };
-
/// Method to convert from a string.
enum ConstructFromStringType { FromHex, FromBinary };
@@ -77,9 +72,6 @@ public:
/// Explicitly construct, copying from a byte array.
explicit FixedHash(bytesConstRef _b, ConstructFromHashType _t = FailIfDifferent) { if (_b.size() == N) memcpy(m_data.data(), _b.data(), std::min<unsigned>(_b.size(), N)); else { m_data.fill(0); if (_t != FailIfDifferent) { auto c = std::min<unsigned>(_b.size(), N); for (unsigned i = 0; i < c; ++i) m_data[_t == AlignRight ? N - 1 - i : i] = _b[_t == AlignRight ? _b.size() - 1 - i : i]; } } }
- /// Explicitly construct, copying from a bytes in memory with given pointer.
- explicit FixedHash(byte const* _bs, ConstructFromPointerType) { memcpy(m_data.data(), _bs, N); }
-
/// Explicitly construct, copying from a string.
explicit FixedHash(std::string const& _s, ConstructFromStringType _t = FromHex, ConstructFromHashType _ht = FailIfDifferent): FixedHash(_t == FromHex ? fromHex(_s, WhenError::Throw) : dev::asBytes(_s), _ht) {}
@@ -92,37 +84,16 @@ public:
// The obvious comparison operators.
bool operator==(FixedHash const& _c) const { return m_data == _c.m_data; }
bool operator!=(FixedHash const& _c) const { return m_data != _c.m_data; }
+ /// Required to sort objects of this type or use them as map keys.
bool operator<(FixedHash const& _c) const { for (unsigned i = 0; i < N; ++i) if (m_data[i] < _c.m_data[i]) return true; else if (m_data[i] > _c.m_data[i]) return false; return false; }
- bool operator>=(FixedHash const& _c) const { return !operator<(_c); }
- bool operator<=(FixedHash const& _c) const { return operator==(_c) || operator<(_c); }
- bool operator>(FixedHash const& _c) const { return !operator<=(_c); }
-
- // The obvious binary operators.
- FixedHash& operator^=(FixedHash const& _c) { for (unsigned i = 0; i < N; ++i) m_data[i] ^= _c.m_data[i]; return *this; }
- FixedHash operator^(FixedHash const& _c) const { return FixedHash(*this) ^= _c; }
- FixedHash& operator|=(FixedHash const& _c) { for (unsigned i = 0; i < N; ++i) m_data[i] |= _c.m_data[i]; return *this; }
- FixedHash operator|(FixedHash const& _c) const { return FixedHash(*this) |= _c; }
- FixedHash& operator&=(FixedHash const& _c) { for (unsigned i = 0; i < N; ++i) m_data[i] &= _c.m_data[i]; return *this; }
- FixedHash operator&(FixedHash const& _c) const { return FixedHash(*this) &= _c; }
- FixedHash operator~() const { FixedHash ret; for (unsigned i = 0; i < N; ++i) ret[i] = ~m_data[i]; return ret; }
-
- // Big-endian increment.
- FixedHash& operator++() { for (unsigned i = size; i > 0 && !++m_data[--i]; ) {} return *this; }
- /// @returns true if all one-bits in @a _c are set in this object.
- bool contains(FixedHash const& _c) const { return (*this & _c) == _c; }
+ FixedHash operator~() const { FixedHash ret; for (unsigned i = 0; i < N; ++i) ret[i] = ~m_data[i]; return ret; }
/// @returns a particular byte from the hash.
byte& operator[](unsigned _i) { return m_data[_i]; }
/// @returns a particular byte from the hash.
byte operator[](unsigned _i) const { return m_data[_i]; }
- /// @returns an abridged version of the hash as a user-readable hex string.
- std::string abridged() const { return toHex(ref().cropped(0, 4)) + "\342\200\246"; }
-
- /// @returns a version of the hash as a user-readable hex string that leaves out the middle part.
- std::string abridgedMiddle() const { return toHex(ref().cropped(0, 4)) + "\342\200\246" + toHex(ref().cropped(N - 4)); }
-
/// @returns the hash as a user-readable hex string.
std::string hex() const { return toHex(ref()); }
@@ -147,54 +118,17 @@ public:
/// @returns a constant reference to the object's data as an STL array.
std::array<byte, N> const& asArray() const { return m_data; }
- struct hash
- {
- /// Make a hash of the object's data.
- size_t operator()(FixedHash const& _value) const { return boost::hash_range(_value.m_data.cbegin(), _value.m_data.cend()); }
- };
-
- template <unsigned P, unsigned M> inline FixedHash& shiftBloom(FixedHash<M> const& _h)
- {
- return (*this |= _h.template bloomPart<P, N>());
- }
-
- template <unsigned P, unsigned M> inline bool containsBloom(FixedHash<M> const& _h)
- {
- return contains(_h.template bloomPart<P, N>());
- }
-
- template <unsigned P, unsigned M> inline FixedHash<M> bloomPart() const
- {
- unsigned const c_bloomBits = M * 8;
- unsigned const c_mask = c_bloomBits - 1;
- unsigned const c_bloomBytes = (StaticLog2<c_bloomBits>::result + 7) / 8;
-
- static_assert((M & (M - 1)) == 0, "M must be power-of-two");
- static_assert(P * c_bloomBytes <= N, "out of range");
-
- FixedHash<M> ret;
- byte const* p = data();
- for (unsigned i = 0; i < P; ++i)
- {
- unsigned index = 0;
- for (unsigned j = 0; j < c_bloomBytes; ++j, ++p)
- index = (index << 8) | *p;
- index &= c_mask;
- ret[M - 1 - index / 8] |= (1 << (index % 8));
- }
- return ret;
- }
-
/// Returns the index of the first bit set to one, or size() * 8 if no bits are set.
inline unsigned firstBitSet() const
{
unsigned ret = 0;
for (auto d: m_data)
if (d)
+ {
for (;; ++ret, d <<= 1)
if (d & 0x80)
return ret;
- else {}
+ }
else
ret += 8;
return ret;
@@ -206,21 +140,6 @@ private:
std::array<byte, N> m_data; ///< The binary data.
};
-/// Fast equality operator for h256.
-template<> inline bool FixedHash<32>::operator==(FixedHash<32> const& _other) const
-{
- const uint64_t* hash1 = (const uint64_t*)data();
- const uint64_t* hash2 = (const uint64_t*)_other.data();
- return (hash1[0] == hash2[0]) && (hash1[1] == hash2[1]) && (hash1[2] == hash2[2]) && (hash1[3] == hash2[3]);
-}
-
-/// Fast std::hash compatible hash function object for h256.
-template<> inline size_t FixedHash<32>::hash::operator()(FixedHash<32> const& value) const
-{
- uint64_t const* data = reinterpret_cast<uint64_t const*>(value.data());
- return boost::hash_range(data, data + 4);
-}
-
/// Stream I/O for the FixedHash class.
template <unsigned N>
inline std::ostream& operator<<(std::ostream& _out, FixedHash<N> const& _h)
@@ -234,56 +153,7 @@ inline std::ostream& operator<<(std::ostream& _out, FixedHash<N> const& _h)
}
// Common types of FixedHash.
-using h2048 = FixedHash<256>;
-using h1024 = FixedHash<128>;
-using h520 = FixedHash<65>;
-using h512 = FixedHash<64>;
using h256 = FixedHash<32>;
using h160 = FixedHash<20>;
-using h128 = FixedHash<16>;
-using h64 = FixedHash<8>;
-using h512s = std::vector<h512>;
-using h256s = std::vector<h256>;
-using h160s = std::vector<h160>;
-using h256Set = std::set<h256>;
-using h160Set = std::set<h160>;
-using h256Hash = std::unordered_set<h256>;
-using h160Hash = std::unordered_set<h160>;
-
-/// Convert the given value into h160 (160-bit unsigned integer) using the right 20 bytes.
-inline h160 right160(h256 const& _t)
-{
- h160 ret;
- memcpy(ret.data(), _t.data() + 12, 20);
- return ret;
-}
-
-/// Convert the given value into h160 (160-bit unsigned integer) using the left 20 bytes.
-inline h160 left160(h256 const& _t)
-{
- h160 ret;
- memcpy(&ret[0], _t.data(), 20);
- return ret;
-}
-
-inline std::string toString(h256s const& _bs)
-{
- std::ostringstream out;
- out << "[ ";
- for (auto i: _bs)
- out << i.abridged() << ", ";
- out << "]";
- return out.str();
-}
}
-
-namespace std
-{
- /// Forward std::hash<dev::FixedHash> to dev::FixedHash::hash.
- template<> struct hash<dev::h64>: dev::h64::hash {};
- template<> struct hash<dev::h128>: dev::h128::hash {};
- template<> struct hash<dev::h160>: dev::h160::hash {};
- template<> struct hash<dev::h256>: dev::h256::hash {};
- template<> struct hash<dev::h512>: dev::h512::hash {};
-}
diff --git a/libdevcore/SHA3.cpp b/libdevcore/SHA3.cpp
index 4d82ec85..b0e40ccb 100644
--- a/libdevcore/SHA3.cpp
+++ b/libdevcore/SHA3.cpp
@@ -97,10 +97,9 @@ static const uint64_t RC[24] = \
static inline void keccakf(void* state) {
uint64_t* a = (uint64_t*)state;
uint64_t b[5] = {0};
- uint64_t t = 0;
- uint8_t x, y;
for (int i = 0; i < 24; i++) {
+ uint8_t x, y;
// Theta
FOR5(x, 1,
b[x] = 0;
@@ -110,7 +109,7 @@ static inline void keccakf(void* state) {
FOR5(y, 5,
a[y + x] ^= b[(x + 4) % 5] ^ rol(b[(x + 1) % 5], 1); ))
// Rho and pi
- t = a[1];
+ uint64_t t = a[1];
x = 0;
REPEAT24(b[0] = a[pi[x]];
a[pi[x]] = rol(t, rho[x]);
diff --git a/libdevcore/SHA3.h b/libdevcore/SHA3.h
index 1a561066..d1e2cc98 100644
--- a/libdevcore/SHA3.h
+++ b/libdevcore/SHA3.h
@@ -23,8 +23,9 @@
#pragma once
+#include <libdevcore/FixedHash.h>
+
#include <string>
-#include "FixedHash.h"
namespace dev
{
@@ -47,10 +48,4 @@ inline h256 keccak256(std::string const& _input) { return keccak256(bytesConstRe
/// Calculate Keccak-256 hash of the given input (presented as a FixedHash), returns a 256-bit hash.
template<unsigned N> inline h256 keccak256(FixedHash<N> const& _input) { return keccak256(_input.ref()); }
-/// Calculate Keccak-256 hash of the given input, possibly interpreting it as nibbles, and return the hash as a string filled with binary data.
-inline std::string keccak256(std::string const& _input, bool _isNibbles) { return asString((_isNibbles ? keccak256(fromHex(_input)) : keccak256(bytesConstRef(&_input))).asBytes()); }
-
-/// Calculate Keccak-256 MAC
-inline void keccak256mac(bytesConstRef _secret, bytesConstRef _plain, bytesRef _output) { keccak256(_secret.toBytes() + _plain.toBytes()).ref().populate(_output); }
-
}
diff --git a/libdevcore/SwarmHash.cpp b/libdevcore/SwarmHash.cpp
index 78188668..1c718200 100644
--- a/libdevcore/SwarmHash.cpp
+++ b/libdevcore/SwarmHash.cpp
@@ -24,6 +24,8 @@
using namespace std;
using namespace dev;
+namespace
+{
bytes toLittleEndian(size_t _size)
{
@@ -59,6 +61,8 @@ h256 swarmHashIntermediate(string const& _input, size_t _offset, size_t _length)
return swarmHashSimple(ref, _length);
}
+}
+
h256 dev::swarmHash(string const& _input)
{
return swarmHashIntermediate(_input, 0, _input.size());
diff --git a/libdevcore/SwarmHash.h b/libdevcore/SwarmHash.h
index a5da96f5..a06f7bda 100644
--- a/libdevcore/SwarmHash.h
+++ b/libdevcore/SwarmHash.h
@@ -26,7 +26,7 @@
namespace dev
{
-/// Compute the "swarm hash" of @a _data
-h256 swarmHash(std::string const& _data);
+/// Compute the "swarm hash" of @a _input
+h256 swarmHash(std::string const& _input);
}
diff --git a/libdevcore/vector_ref.h b/libdevcore/vector_ref.h
index 0f543181..b4dcff65 100644
--- a/libdevcore/vector_ref.h
+++ b/libdevcore/vector_ref.h
@@ -23,6 +23,8 @@ public:
using value_type = _T;
using element_type = _T;
using mutable_value_type = typename std::conditional<std::is_const<_T>::value, typename std::remove_const<_T>::type, _T>::type;
+ using string_type = typename std::conditional<std::is_const<_T>::value, std::string const, std::string>::type;
+ using vector_type = typename std::conditional<std::is_const<_T>::value, std::vector<typename std::remove_const<_T>::type> const, std::vector<_T>>::type;
static_assert(std::is_pod<value_type>::value, "vector_ref can only be used with PODs due to its low-level treatment of data.");
@@ -30,18 +32,13 @@ public:
/// Creates a new vector_ref to point to @a _count elements starting at @a _data.
vector_ref(_T* _data, size_t _count): m_data(_data), m_count(_count) {}
/// Creates a new vector_ref pointing to the data part of a string (given as pointer).
- vector_ref(typename std::conditional<std::is_const<_T>::value, std::string const*, std::string*>::type _data): m_data(reinterpret_cast<_T*>(_data->data())), m_count(_data->size() / sizeof(_T)) {}
- /// Creates a new vector_ref pointing to the data part of a vector (given as pointer).
- vector_ref(typename std::conditional<std::is_const<_T>::value, std::vector<typename std::remove_const<_T>::type> const*, std::vector<_T>*>::type _data): m_data(_data->data()), m_count(_data->size()) {}
+ vector_ref(string_type* _data): m_data(reinterpret_cast<_T*>(_data->data())), m_count(_data->size() / sizeof(_T)) {}
/// Creates a new vector_ref pointing to the data part of a string (given as reference).
- vector_ref(typename std::conditional<std::is_const<_T>::value, std::string const&, std::string&>::type _data): m_data(reinterpret_cast<_T*>(_data.data())), m_count(_data.size() / sizeof(_T)) {}
-#if DEV_LDB
- vector_ref(ldb::Slice const& _s): m_data(reinterpret_cast<_T*>(_s.data())), m_count(_s.size() / sizeof(_T)) {}
-#endif
+ vector_ref(string_type& _data): vector_ref(&_data) {}
+ /// Creates a new vector_ref pointing to the data part of a vector (given as pointer).
+ vector_ref(vector_type* _data): m_data(_data->data()), m_count(_data->size()) {}
explicit operator bool() const { return m_data && m_count; }
- bool contentsEqual(std::vector<mutable_value_type> const& _c) const { if (!m_data || m_count == 0) return _c.empty(); else return _c.size() == m_count && !memcmp(_c.data(), m_data, m_count * sizeof(_T)); }
- std::vector<mutable_value_type> toVector() const { return std::vector<mutable_value_type>(m_data, m_data + m_count); }
std::vector<unsigned char> toBytes() const { return std::vector<unsigned char>(reinterpret_cast<unsigned char const*>(m_data), reinterpret_cast<unsigned char const*>(m_data) + m_count * sizeof(_T)); }
std::string toString() const { return std::string((char const*)m_data, ((char const*)m_data) + m_count * sizeof(_T)); }
@@ -50,25 +47,14 @@ public:
_T* data() const { return m_data; }
/// @returns the number of elements referenced (not necessarily number of bytes).
- size_t count() const { return m_count; }
- /// @returns the number of elements referenced (not necessarily number of bytes).
size_t size() const { return m_count; }
bool empty() const { return !m_count; }
- /// @returns a new vector_ref pointing at the next chunk of @a size() elements.
- vector_ref<_T> next() const { if (!m_data) return *this; else return vector_ref<_T>(m_data + m_count, m_count); }
/// @returns a new vector_ref which is a shifted and shortened view of the original data.
/// If this goes out of bounds in any way, returns an empty vector_ref.
/// If @a _count is ~size_t(0), extends the view to the end of the data.
vector_ref<_T> cropped(size_t _begin, size_t _count) const { if (m_data && _begin <= m_count && _count <= m_count && _begin + _count <= m_count) return vector_ref<_T>(m_data + _begin, _count == ~size_t(0) ? m_count - _begin : _count); else return vector_ref<_T>(); }
/// @returns a new vector_ref which is a shifted view of the original data (not going beyond it).
vector_ref<_T> cropped(size_t _begin) const { if (m_data && _begin <= m_count) return vector_ref<_T>(m_data + _begin, m_count - _begin); else return vector_ref<_T>(); }
- void retarget(_T* _d, size_t _s) { m_data = _d; m_count = _s; }
- void retarget(std::vector<_T> const& _t) { m_data = _t.data(); m_count = _t.size(); }
- template <class T> bool overlapsWith(vector_ref<T> _t) const { void const* f1 = data(); void const* t1 = data() + size(); void const* f2 = _t.data(); void const* t2 = _t.data() + _t.size(); return f1 < t2 && t1 > f2; }
- /// Copies the contents of this vector_ref to the contents of @a _t, up to the max size of @a _t.
- void copyTo(vector_ref<typename std::remove_const<_T>::type> _t) const { if (overlapsWith(_t)) memmove(_t.data(), m_data, std::min(_t.size(), m_count) * sizeof(_T)); else memcpy(_t.data(), m_data, std::min(_t.size(), m_count) * sizeof(_T)); }
- /// Copies the contents of this vector_ref to the contents of @a _t, and zeros further trailing elements in @a _t.
- void populate(vector_ref<typename std::remove_const<_T>::type> _t) const { copyTo(_t); memset(_t.data() + m_count, 0, std::max(_t.size(), m_count) - m_count); }
_T* begin() { return m_data; }
_T* end() { return m_data + m_count; }
@@ -81,20 +67,11 @@ public:
bool operator==(vector_ref<_T> const& _cmp) const { return m_data == _cmp.m_data && m_count == _cmp.m_count; }
bool operator!=(vector_ref<_T> const& _cmp) const { return !operator==(_cmp); }
-#if DEV_LDB
- operator ldb::Slice() const { return ldb::Slice((char const*)m_data, m_count * sizeof(_T)); }
-#endif
-
void reset() { m_data = nullptr; m_count = 0; }
private:
- _T* m_data;
- size_t m_count;
+ _T* m_data = nullptr;
+ size_t m_count = 0;
};
-template<class _T> vector_ref<_T const> ref(_T const& _t) { return vector_ref<_T const>(&_t, 1); }
-template<class _T> vector_ref<_T> ref(_T& _t) { return vector_ref<_T>(&_t, 1); }
-template<class _T> vector_ref<_T const> ref(std::vector<_T> const& _t) { return vector_ref<_T const>(&_t); }
-template<class _T> vector_ref<_T> ref(std::vector<_T>& _t) { return vector_ref<_T>(&_t); }
-
}