Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Open sidebar
savoirfairelinux
jami-daemon
Commits
6b0311f3
Commit
6b0311f3
authored
Jul 09, 2020
by
Adrien Béraud
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
build: use C++17
Change-Id: I94c88a504ae2a98043be8fd201f95227002d99c4
parent
67d8fe9f
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
34 additions
and
160 deletions
+34
-160
configure.ac
configure.ac
+2
-2
m4/ax_cxx_compile_stdcxx.m4
m4/ax_cxx_compile_stdcxx.m4
+7
-38
meson.build
meson.build
+1
-1
src/jamidht/eth/libdevcore/Common.h
src/jamidht/eth/libdevcore/Common.h
+4
-67
src/jamidht/eth/libdevcore/CommonData.cpp
src/jamidht/eth/libdevcore/CommonData.cpp
+1
-29
src/jamidht/eth/libdevcore/CommonData.h
src/jamidht/eth/libdevcore/CommonData.h
+3
-7
src/jamidht/eth/libdevcore/FixedHash.h
src/jamidht/eth/libdevcore/FixedHash.h
+13
-13
src/jamidht/eth/libdevcrypto/Common.cpp
src/jamidht/eth/libdevcrypto/Common.cpp
+1
-1
src/jamidht/eth/libdevcrypto/Common.h
src/jamidht/eth/libdevcrypto/Common.h
+2
-2
No files found.
configure.ac
View file @
6b0311f3
...
...
@@ -155,8 +155,8 @@ DOLT
lt_cv_deplibs_check_method=pass_all
dnl Check for C++1
4
support
AX_CXX_COMPILE_STDCXX(1
4
,[ext],[mandatory])
dnl Check for C++1
7
support
AX_CXX_COMPILE_STDCXX(1
7
,[ext],[mandatory])
dnl Check for header files
AC_FUNC_ALLOCA
...
...
m4/ax_cxx_compile_stdcxx.m4
View file @
6b0311f3
...
...
@@ -33,19 +33,19 @@
# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com>
# Copyright (c) 2015 Paul Norman <penorman@mac.com>
# Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu>
# Copyright (c) 2016 Krzesimir Nowak <qdlacz@gmail.com>
# Copyright (c) 2016, 2018 Krzesimir Nowak <qdlacz@gmail.com>
# Copyright (c) 2019 Enji Cooper <yaneurabeya@gmail.com>
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice
# and this notice are preserved. This file is offered as-is, without any
# warranty.
#serial
7
#serial
11
dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro
dnl (serial version number 13).
AX_REQUIRE_DEFINED([AC_MSG_WARN])
AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl
m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"],
[$1], [14], [ax_cxx_compile_alternatives="14 1y"],
...
...
@@ -61,14 +61,6 @@ AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl
[m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])])
AC_LANG_PUSH([C++])dnl
ac_success=no
AC_CACHE_CHECK(whether $CXX supports C++$1 features by default,
ax_cv_cxx_compile_cxx$1,
[AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
[ax_cv_cxx_compile_cxx$1=yes],
[ax_cv_cxx_compile_cxx$1=no])])
if test x$ax_cv_cxx_compile_cxx$1 = xyes; then
ac_success=yes
fi
m4_if([$2], [noext], [], [dnl
if test x$ac_success = xno; then
...
...
@@ -139,7 +131,6 @@ AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl
[define if the compiler supports basic C++$1 syntax])
fi
AC_SUBST(HAVE_CXX$1)
m4_if([$1], [17], [AC_MSG_WARN([C++17 is not yet standardized, so the checks may change in incompatible ways anytime])])
])
...
...
@@ -199,11 +190,13 @@ namespace cxx11
struct Base
{
virtual ~Base() {}
virtual void f() {}
};
struct Derived : public Base
{
virtual ~Derived() override {}
virtual void f() override {}
};
...
...
@@ -587,20 +580,12 @@ m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[
#error "This is not a C++ compiler"
#elif __cplusplus <
=
201
402
L
#elif __cplusplus < 201
703
L
#error "This is not a C++17 compiler"
#else
#if defined(__clang__)
#define REALLY_CLANG
#else
#if defined(__GNUC__)
#define REALLY_GCC
#endif
#endif
#include <initializer_list>
#include <utility>
#include <type_traits>
...
...
@@ -608,16 +593,12 @@ m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[
namespace cxx17
{
#if !defined(REALLY_CLANG)
namespace test_constexpr_lambdas
{
// TODO: test it with clang++ from git
constexpr int foo = [](){return 42;}();
}
#endif // !defined(REALLY_CLANG)
namespace test::nested_namespace::definitions
{
...
...
@@ -852,12 +833,9 @@ namespace cxx17
}
#if !defined(REALLY_CLANG)
namespace test_template_argument_deduction_for_class_templates
{
// TODO: test it with clang++ from git
template <typename T1, typename T2>
struct pair
{
...
...
@@ -876,7 +854,6 @@ namespace cxx17
}
}
#endif // !defined(REALLY_CLANG)
namespace test_non_type_auto_template_parameters
{
...
...
@@ -890,12 +867,9 @@ namespace cxx17
}
#if !defined(REALLY_CLANG)
namespace test_structured_bindings
{
// TODO: test it with clang++ from git
int arr[2] = { 1, 2 };
std::pair<int, int> pr = { 1, 2 };
...
...
@@ -927,14 +901,10 @@ namespace cxx17
const auto [ x3, y3 ] = f3();
}
#endif // !defined(REALLY_CLANG)
#if !defined(REALLY_CLANG)
namespace test_exception_spec_type_system
{
// TODO: test it with clang++ from git
struct Good {};
struct Bad {};
...
...
@@ -952,7 +922,6 @@ namespace cxx17
static_assert (std::is_same_v<Good, decltype(f(g1, g2))>);
}
#endif // !defined(REALLY_CLANG)
namespace test_inline_variables
{
...
...
@@ -977,6 +946,6 @@ namespace cxx17
} // namespace cxx17
#endif // __cplusplus <
=
201
402
L
#endif // __cplusplus < 201
703
L
]])
meson.build
View file @
6b0311f3
project('jami-daemon', ['c', 'cpp'],
version: '9.2.0',
license: 'GPL3+',
default_options: ['cpp_std=gnu++1
4
', 'buildtype=debugoptimized'],
default_options: ['cpp_std=gnu++1
7
', 'buildtype=debugoptimized'],
meson_version:'>= 0.54'
)
...
...
src/jamidht/eth/libdevcore/Common.h
View file @
6b0311f3
...
...
@@ -47,9 +47,6 @@
#include <chrono>
#include "vector_ref.h"
// CryptoPP defines byte in the global namespace, so must we.
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)
...
...
@@ -66,9 +63,9 @@ extern char const* Version;
extern
std
::
string
const
EmptyString
;
// Binary data types.
using
bytes
=
std
::
vector
<
byte
>
;
using
bytesRef
=
vector_ref
<
byte
>
;
using
bytesConstRef
=
vector_ref
<
byte
const
>
;
using
bytes
=
std
::
vector
<
uint8_t
>
;
using
bytesRef
=
vector_ref
<
uint8_t
>
;
using
bytesConstRef
=
vector_ref
<
uint8_t
const
>
;
template
<
class
T
>
class
secure_vector
...
...
@@ -109,7 +106,7 @@ private:
std
::
vector
<
T
>
m_data
;
};
using
bytesSec
=
secure_vector
<
byte
>
;
using
bytesSec
=
secure_vector
<
uint8_t
>
;
// Map types.
using
StringMap
=
std
::
map
<
std
::
string
,
std
::
string
>
;
...
...
@@ -147,66 +144,6 @@ private:
std
::
function
<
void
(
void
)
>
m_f
;
};
/// Inheritable for classes that have invariants.
class
HasInvariants
{
public:
/// Reimplement to specify the invariants.
virtual
bool
invariants
()
const
=
0
;
virtual
~
HasInvariants
()
=
0
;
};
/// Scope guard for invariant check in a class derived from HasInvariants.
#if ETH_DEBUG
#define DEV_INVARIANT_CHECK ::dev::InvariantChecker __dev_invariantCheck(this, BOOST_CURRENT_FUNCTION, __FILE__, __LINE__)
#define DEV_INVARIANT_CHECK_HERE ::dev::InvariantChecker::checkInvariants(this, BOOST_CURRENT_FUNCTION, __FILE__, __LINE__, true)
#else
#define DEV_INVARIANT_CHECK (void)0;
#define DEV_INVARIANT_CHECK_HERE (void)0;
#endif
/// Simple scope-based timer helper.
class
TimerHelper
{
public:
TimerHelper
(
std
::
string
const
&
_id
,
unsigned
_msReportWhenGreater
=
0
)
:
m_t
(
std
::
chrono
::
high_resolution_clock
::
now
()),
m_id
(
_id
),
m_ms
(
_msReportWhenGreater
)
{}
~
TimerHelper
();
private:
std
::
chrono
::
high_resolution_clock
::
time_point
m_t
;
std
::
string
m_id
;
unsigned
m_ms
;
};
class
Timer
{
public:
Timer
()
{
restart
();
}
std
::
chrono
::
high_resolution_clock
::
duration
duration
()
const
{
return
std
::
chrono
::
high_resolution_clock
::
now
()
-
m_t
;
}
double
elapsed
()
const
{
return
std
::
chrono
::
duration_cast
<
std
::
chrono
::
microseconds
>
(
duration
()).
count
()
/
1000000.0
;
}
void
restart
()
{
m_t
=
std
::
chrono
::
high_resolution_clock
::
now
();
}
private:
std
::
chrono
::
high_resolution_clock
::
time_point
m_t
;
};
#define DEV_TIMED(S) for (::std::pair<::dev::TimerHelper, bool> __eth_t(S, true); __eth_t.second; __eth_t.second = false)
#define DEV_TIMED_SCOPE(S) ::dev::TimerHelper __eth_t(S)
#if defined(_WIN32)
#define DEV_TIMED_FUNCTION DEV_TIMED_SCOPE(__FUNCSIG__)
#else
#define DEV_TIMED_FUNCTION DEV_TIMED_SCOPE(__PRETTY_FUNCTION__)
#endif
#define DEV_TIMED_ABOVE(S, MS) for (::std::pair<::dev::TimerHelper, bool> __eth_t(::dev::TimerHelper(S, MS), true); __eth_t.second; __eth_t.second = false)
#define DEV_TIMED_SCOPE_ABOVE(S, MS) ::dev::TimerHelper __eth_t(S, MS)
#if defined(_WIN32)
#define DEV_TIMED_FUNCTION_ABOVE(MS) DEV_TIMED_SCOPE_ABOVE(__FUNCSIG__, MS)
#else
#define DEV_TIMED_FUNCTION_ABOVE(MS) DEV_TIMED_SCOPE_ABOVE(__PRETTY_FUNCTION__, MS)
#endif
#ifdef _MSC_VER
// TODO.
#define DEV_UNUSED
...
...
src/jamidht/eth/libdevcore/CommonData.cpp
View file @
6b0311f3
...
...
@@ -48,34 +48,6 @@ bool dev::isHex(string const& _s) noexcept
return
std
::
all_of
(
it
,
_s
.
end
(),
[](
char
c
){
return
fromHexChar
(
c
)
!=
-
1
;
});
}
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
;
}
bytes
dev
::
fromHex
(
std
::
string
const
&
_s
,
WhenError
_throw
)
{
unsigned
s
=
(
_s
.
size
()
>=
2
&&
_s
[
0
]
==
'0'
&&
_s
[
1
]
==
'x'
)
?
2
:
0
;
...
...
@@ -97,7 +69,7 @@ bytes dev::fromHex(std::string const& _s, WhenError _throw)
int
h
=
fromHexChar
(
_s
[
i
]);
int
l
=
fromHexChar
(
_s
[
i
+
1
]);
if
(
h
!=
-
1
&&
l
!=
-
1
)
ret
.
push_back
((
byte
)(
h
*
16
+
l
));
ret
.
push_back
((
uint8_t
)(
h
*
16
+
l
));
else
if
(
_throw
==
WhenError
::
Throw
)
throw
std
::
runtime_error
(
"BadHexCharacter"
);
else
...
...
src/jamidht/eth/libdevcore/CommonData.h
View file @
6b0311f3
...
...
@@ -105,7 +105,7 @@ inline std::string asString(bytesConstRef _b)
/// Converts a string to a byte array containing the string's (byte) data.
inline
bytes
asBytes
(
std
::
string
const
&
_b
)
{
return
bytes
((
byte
const
*
)
_b
.
data
(),
(
byte
const
*
)(
_b
.
data
()
+
_b
.
size
()));
return
bytes
((
uint8_t
const
*
)
_b
.
data
(),
(
uint8_t
const
*
)(
_b
.
data
()
+
_b
.
size
()));
}
/// Converts a string into the big-endian base-16 stream of integers (NOT ASCII).
...
...
@@ -123,21 +123,17 @@ inline T fromBigEndian(_In const& _bytes)
{
T
ret
=
(
T
)
0
;
for
(
auto
i
:
_bytes
)
ret
=
(
T
)((
ret
<<
8
)
|
(
byte
)(
typename
std
::
make_unsigned
<
decltype
(
i
)
>::
type
)
i
);
ret
=
(
T
)((
ret
<<
8
)
|
(
uint8_t
)(
typename
std
::
make_unsigned
<
decltype
(
i
)
>::
type
)
i
);
return
ret
;
}
inline
bytes
toCompactBigEndian
(
byte
_val
,
unsigned
_min
=
0
)
inline
bytes
toCompactBigEndian
(
uint8_t
_val
,
unsigned
_min
=
0
)
{
return
(
_min
||
_val
)
?
bytes
{
_val
}
:
bytes
{};
}
// Algorithms for string and string-like collections.
/// Escapes a string into the C-string representation.
/// @p _all if true will escape all characters, not just the unprintable ones.
std
::
string
escaped
(
std
::
string
const
&
_s
,
bool
_all
=
true
);
/// Determines the length of the common prefix of the two collections given.
/// @returns the number of elements both @a _t and @a _u share, in order, at the beginning.
/// @example commonPrefix("Hello world!", "Hello, world!") == 5
...
...
src/jamidht/eth/libdevcore/FixedHash.h
View file @
6b0311f3
...
...
@@ -76,13 +76,13 @@ public:
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
);
}
explicit
FixedHash
(
uint8_t
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
)
{}
/// @returns true iff this is the empty hash.
explicit
operator
bool
()
const
{
return
std
::
any_of
(
m_data
.
begin
(),
m_data
.
end
(),
[](
byte
_b
)
{
return
_b
!=
0
;
});
}
explicit
operator
bool
()
const
{
return
std
::
any_of
(
m_data
.
begin
(),
m_data
.
end
(),
[](
uint8_t
_b
)
{
return
_b
!=
0
;
});
}
// The obvious comparison operators.
bool
operator
==
(
FixedHash
const
&
_c
)
const
{
return
m_data
==
_c
.
m_data
;
}
...
...
@@ -108,9 +108,9 @@ public:
bool
contains
(
FixedHash
const
&
_c
)
const
{
return
(
*
this
&
_c
)
==
_c
;
}
/// @returns a particular byte from the hash.
byte
&
operator
[](
unsigned
_i
)
{
return
m_data
[
_i
];
}
uint8_t
&
operator
[](
unsigned
_i
)
{
return
m_data
[
_i
];
}
/// @returns a particular byte from the hash.
byte
operator
[](
unsigned
_i
)
const
{
return
m_data
[
_i
];
}
uint8_t
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
"
;
}
...
...
@@ -128,25 +128,25 @@ public:
bytesConstRef
ref
()
const
{
return
bytesConstRef
(
m_data
.
data
(),
N
);
}
/// @returns a mutable byte pointer to the object's data.
byte
*
data
()
{
return
m_data
.
data
();
}
uint8_t
*
data
()
{
return
m_data
.
data
();
}
/// @returns a constant byte pointer to the object's data.
byte
const
*
data
()
const
{
return
m_data
.
data
();
}
uint8_t
const
*
data
()
const
{
return
m_data
.
data
();
}
/// @returns begin iterator.
auto
begin
()
const
->
typename
std
::
array
<
byte
,
N
>::
const_iterator
{
return
m_data
.
begin
();
}
auto
begin
()
const
->
typename
std
::
array
<
uint8_t
,
N
>::
const_iterator
{
return
m_data
.
begin
();
}
/// @returns end iterator.
auto
end
()
const
->
typename
std
::
array
<
byte
,
N
>::
const_iterator
{
return
m_data
.
end
();
}
auto
end
()
const
->
typename
std
::
array
<
uint8_t
,
N
>::
const_iterator
{
return
m_data
.
end
();
}
/// @returns a copy of the object's data as a byte vector.
bytes
asBytes
()
const
{
return
bytes
(
data
(),
data
()
+
N
);
}
/// @returns a mutable reference to the object's data as an STL array.
std
::
array
<
byte
,
N
>&
asArray
()
{
return
m_data
;
}
std
::
array
<
uint8_t
,
N
>&
asArray
()
{
return
m_data
;
}
/// @returns a constant reference to the object's data as an STL array.
std
::
array
<
byte
,
N
>
const
&
asArray
()
const
{
return
m_data
;
}
std
::
array
<
uint8_t
,
N
>
const
&
asArray
()
const
{
return
m_data
;
}
/// Populate with random data.
template
<
class
Engine
>
...
...
@@ -179,7 +179,7 @@ public:
static_assert
(
P
*
c_bloomBytes
<=
N
,
"out of range"
);
FixedHash
<
M
>
ret
;
byte
const
*
p
=
data
();
uint8_t
const
*
p
=
data
();
for
(
unsigned
i
=
0
;
i
<
P
;
++
i
)
{
unsigned
index
=
0
;
...
...
@@ -209,7 +209,7 @@ public:
void
clear
()
{
m_data
.
fill
(
0
);
}
private:
std
::
array
<
byte
,
N
>
m_data
;
///< The binary data.
std
::
array
<
uint8_t
,
N
>
m_data
;
///< The binary data.
};
template
<
unsigned
T
>
...
...
@@ -282,7 +282,7 @@ public:
using
FixedHash
<
T
>::
abridgedMiddle
;
bytesConstRef
ref
()
const
{
return
FixedHash
<
T
>::
ref
();
}
byte
const
*
data
()
const
{
return
FixedHash
<
T
>::
data
();
}
uint8_t
const
*
data
()
const
{
return
FixedHash
<
T
>::
data
();
}
static
SecureFixedHash
<
T
>
random
()
{
SecureFixedHash
<
T
>
ret
;
ret
.
randomize
(
s_fixedHashEngine
);
return
ret
;
}
using
FixedHash
<
T
>::
firstBitSet
;
...
...
src/jamidht/eth/libdevcrypto/Common.cpp
View file @
6b0311f3
...
...
@@ -57,7 +57,7 @@ Public dev::toPublic(Secret const& _secret)
// Creation will fail if the secret key is invalid.
if
(
!
secp256k1_ec_pubkey_create
(
ctx
,
&
rawPubkey
,
_secret
.
data
()))
return
{};
std
::
array
<
byte
,
65
>
serializedPubkey
;
std
::
array
<
uint8_t
,
65
>
serializedPubkey
;
size_t
serializedPubkeySize
=
serializedPubkey
.
size
();
secp256k1_ec_pubkey_serialize
(
ctx
,
serializedPubkey
.
data
(),
&
serializedPubkeySize
,
...
...
src/jamidht/eth/libdevcrypto/Common.h
View file @
6b0311f3
...
...
@@ -46,7 +46,7 @@ struct SignatureStruct
{
SignatureStruct
()
=
default
;
SignatureStruct
(
Signature
const
&
_s
)
{
*
(
h520
*
)
this
=
_s
;
}
SignatureStruct
(
h256
const
&
_r
,
h256
const
&
_s
,
byte
_v
)
:
r
(
_r
),
s
(
_s
),
v
(
_v
)
{}
SignatureStruct
(
h256
const
&
_r
,
h256
const
&
_s
,
uint8_t
_v
)
:
r
(
_r
),
s
(
_s
),
v
(
_v
)
{}
operator
Signature
()
const
{
return
*
(
h520
const
*
)
this
;
}
/// @returns true if r,s,v values are valid, otherwise false
...
...
@@ -54,7 +54,7 @@ struct SignatureStruct
h256
r
;
h256
s
;
byte
v
=
0
;
uint8_t
v
=
0
;
};
/// A vector of secrets.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment