mirror of
https://github.com/dashpay/dash.git
synced 2024-12-24 11:32:46 +01:00
Squashed 'src/dashbls/' changes from 7e747e8a07..0bb5c5b032
0bb5c5b032 Merge pull request #107 from kwvg/bump_1.3.5 3170e82074 Merge pull request #106 from UdjinM6/bench_chore 6091f5c056 chore: bump version to 1.3.5 90fd986fa5 chore: drop irrelevant PopSchemeMPL benchmark ba391e681e bench: use BasicSchemeMPL instead of AugSchemeMPL bcc6cf9cda bench: add benchmars for Serialize/SerializeToArray cc649f38ee feat: serialize on the stack (#75) git-subtree-dir: src/dashbls git-subtree-split: 0bb5c5b03249c463debb5cef5f7e52ee66f3aaab
This commit is contained in:
parent
62fa66524c
commit
efd5c566da
@ -1,5 +1,5 @@
|
|||||||
AC_PREREQ([2.60])
|
AC_PREREQ([2.60])
|
||||||
AC_INIT([libdashbls],[1.3.4])
|
AC_INIT([libdashbls],[1.3.5])
|
||||||
AC_CONFIG_AUX_DIR([build-aux])
|
AC_CONFIG_AUX_DIR([build-aux])
|
||||||
AC_CONFIG_MACRO_DIR([build-aux/m4])
|
AC_CONFIG_MACRO_DIR([build-aux/m4])
|
||||||
|
|
||||||
|
@ -59,6 +59,7 @@ public:
|
|||||||
GTElement Pair(const G2Element &b) const;
|
GTElement Pair(const G2Element &b) const;
|
||||||
uint32_t GetFingerprint(bool fLegacy = false) const;
|
uint32_t GetFingerprint(bool fLegacy = false) const;
|
||||||
std::vector<uint8_t> Serialize(bool fLegacy = false) const;
|
std::vector<uint8_t> Serialize(bool fLegacy = false) const;
|
||||||
|
std::array<uint8_t, SIZE> SerializeToArray(bool fLegacy = false) const;
|
||||||
G1Element Copy();
|
G1Element Copy();
|
||||||
|
|
||||||
friend bool operator==(const G1Element &a, const G1Element &b);
|
friend bool operator==(const G1Element &a, const G1Element &b);
|
||||||
@ -102,6 +103,7 @@ public:
|
|||||||
G2Element Negate() const;
|
G2Element Negate() const;
|
||||||
GTElement Pair(const G1Element &a) const;
|
GTElement Pair(const G1Element &a) const;
|
||||||
std::vector<uint8_t> Serialize(bool fLegacy = false) const;
|
std::vector<uint8_t> Serialize(bool fLegacy = false) const;
|
||||||
|
std::array<uint8_t, G2Element::SIZE> SerializeToArray(bool fLegacy = false) const;
|
||||||
G2Element Copy();
|
G2Element Copy();
|
||||||
|
|
||||||
friend bool operator==(G2Element const &a, G2Element const &b);
|
friend bool operator==(G2Element const &a, G2Element const &b);
|
||||||
@ -127,6 +129,7 @@ public:
|
|||||||
|
|
||||||
void Serialize(uint8_t *buffer) const;
|
void Serialize(uint8_t *buffer) const;
|
||||||
std::vector<uint8_t> Serialize() const;
|
std::vector<uint8_t> Serialize() const;
|
||||||
|
std::array<uint8_t, SIZE> SerializeToArray() const;
|
||||||
|
|
||||||
friend bool operator==(GTElement const &a, GTElement const &b);
|
friend bool operator==(GTElement const &a, GTElement const &b);
|
||||||
friend bool operator!=(GTElement const &a, GTElement const &b);
|
friend bool operator!=(GTElement const &a, GTElement const &b);
|
||||||
|
@ -82,6 +82,7 @@ class PrivateKey {
|
|||||||
// Serialize the key into bytes
|
// Serialize the key into bytes
|
||||||
void Serialize(uint8_t *buffer) const;
|
void Serialize(uint8_t *buffer) const;
|
||||||
std::vector<uint8_t> Serialize(bool fLegacy = false) const;
|
std::vector<uint8_t> Serialize(bool fLegacy = false) const;
|
||||||
|
std::array<uint8_t, PrivateKey::PRIVATE_KEY_SIZE> SerializeToArray(bool fLegacy = false) const;
|
||||||
|
|
||||||
G2Element SignG2(
|
G2Element SignG2(
|
||||||
const uint8_t *msg,
|
const uint8_t *msg,
|
||||||
|
@ -171,11 +171,16 @@ uint32_t G1Element::GetFingerprint(const bool fLegacy) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::vector<uint8_t> G1Element::Serialize(const bool fLegacy) const {
|
std::vector<uint8_t> G1Element::Serialize(const bool fLegacy) const {
|
||||||
|
const auto arr = G1Element::SerializeToArray(fLegacy);
|
||||||
|
return std::vector<uint8_t>{arr.begin(), arr.end()};
|
||||||
|
}
|
||||||
|
|
||||||
|
std::array<uint8_t, G1Element::SIZE> G1Element::SerializeToArray(const bool fLegacy) const {
|
||||||
uint8_t buffer[G1Element::SIZE + 1];
|
uint8_t buffer[G1Element::SIZE + 1];
|
||||||
g1_write_bin(buffer, G1Element::SIZE + 1, p, 1);
|
g1_write_bin(buffer, G1Element::SIZE + 1, p, 1);
|
||||||
|
|
||||||
|
std::array<uint8_t, G1Element::SIZE> result{};
|
||||||
if (buffer[0] == 0x00) { // infinity
|
if (buffer[0] == 0x00) { // infinity
|
||||||
std::vector<uint8_t> result(G1Element::SIZE, 0);
|
|
||||||
result[0] = 0xc0;
|
result[0] = 0xc0;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -187,7 +192,9 @@ std::vector<uint8_t> G1Element::Serialize(const bool fLegacy) const {
|
|||||||
if (!fLegacy) {
|
if (!fLegacy) {
|
||||||
buffer[1] |= 0x80; // indicate compression
|
buffer[1] |= 0x80; // indicate compression
|
||||||
}
|
}
|
||||||
return std::vector<uint8_t>(buffer + 1, buffer + 1 + G1Element::SIZE);
|
|
||||||
|
std::copy_n(buffer + 1, G1Element::SIZE, result.begin());
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator==(const G1Element & a, const G1Element &b)
|
bool operator==(const G1Element & a, const G1Element &b)
|
||||||
@ -386,11 +393,18 @@ G2Element G2Element::Negate() const
|
|||||||
GTElement G2Element::Pair(const G1Element& a) const { return a & (*this); }
|
GTElement G2Element::Pair(const G1Element& a) const { return a & (*this); }
|
||||||
|
|
||||||
std::vector<uint8_t> G2Element::Serialize(const bool fLegacy) const {
|
std::vector<uint8_t> G2Element::Serialize(const bool fLegacy) const {
|
||||||
|
const auto arr = G2Element::SerializeToArray(fLegacy);
|
||||||
|
return std::vector<uint8_t>{arr.begin(), arr.end()};
|
||||||
|
}
|
||||||
|
|
||||||
|
std::array<uint8_t, G2Element::SIZE> G2Element::SerializeToArray(const bool fLegacy) const {
|
||||||
uint8_t buffer[G2Element::SIZE + 1];
|
uint8_t buffer[G2Element::SIZE + 1];
|
||||||
g2_write_bin(buffer, G2Element::SIZE + 1, (g2_st*)q, 1);
|
g2_write_bin(buffer, G2Element::SIZE + 1, (g2_st*)q, 1);
|
||||||
|
|
||||||
|
std::array<uint8_t, G2Element::SIZE> result{};
|
||||||
|
|
||||||
if (buffer[0] == 0x00) { // infinity
|
if (buffer[0] == 0x00) { // infinity
|
||||||
std::vector<uint8_t> result(G2Element::SIZE, 0);
|
result.fill(0);
|
||||||
result[0] = 0xc0;
|
result[0] = 0xc0;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -410,7 +424,6 @@ std::vector<uint8_t> G2Element::Serialize(const bool fLegacy) const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<uint8_t> result(G2Element::SIZE, 0);
|
|
||||||
if (fLegacy) {
|
if (fLegacy) {
|
||||||
std::memcpy(result.data(), buffer + 1, G2Element::SIZE);
|
std::memcpy(result.data(), buffer + 1, G2Element::SIZE);
|
||||||
} else {
|
} else {
|
||||||
@ -551,4 +564,11 @@ std::vector<uint8_t> GTElement::Serialize() const
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::array<uint8_t, GTElement::SIZE> GTElement::SerializeToArray() const
|
||||||
|
{
|
||||||
|
std::array<uint8_t, GTElement::SIZE> data{};
|
||||||
|
Serialize(data.data());
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
} // end namespace bls
|
} // end namespace bls
|
||||||
|
@ -284,6 +284,13 @@ std::vector<uint8_t> PrivateKey::Serialize(const bool fLegacy) const
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::array<uint8_t, PrivateKey::PRIVATE_KEY_SIZE> PrivateKey::SerializeToArray(bool fLegacy) const
|
||||||
|
{
|
||||||
|
std::array<uint8_t, PRIVATE_KEY_SIZE> data{};
|
||||||
|
Serialize(data.data());
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
G2Element PrivateKey::SignG2(
|
G2Element PrivateKey::SignG2(
|
||||||
const uint8_t *msg,
|
const uint8_t *msg,
|
||||||
size_t len,
|
size_t len,
|
||||||
|
@ -31,21 +31,21 @@ using namespace bls;
|
|||||||
void benchSigs() {
|
void benchSigs() {
|
||||||
string testName = "Signing";
|
string testName = "Signing";
|
||||||
const int numIters = 5000;
|
const int numIters = 5000;
|
||||||
PrivateKey sk = AugSchemeMPL().KeyGen(getRandomSeed());
|
PrivateKey sk = BasicSchemeMPL().KeyGen(getRandomSeed());
|
||||||
vector<uint8_t> message1 = sk.GetG1Element().Serialize();
|
vector<uint8_t> message1 = sk.GetG1Element().Serialize();
|
||||||
|
|
||||||
auto start = startStopwatch();
|
auto start = startStopwatch();
|
||||||
|
|
||||||
for (int i = 0; i < numIters; i++) {
|
for (int i = 0; i < numIters; i++) {
|
||||||
AugSchemeMPL().Sign(sk, message1);
|
BasicSchemeMPL().Sign(sk, message1);
|
||||||
}
|
}
|
||||||
endStopwatch(testName, start, numIters);
|
endStopwatch(testName, start, numIters);
|
||||||
}
|
}
|
||||||
|
|
||||||
void benchVerification() {
|
void benchVerification() {
|
||||||
string testName = "Verification";
|
string testName = "Verification";
|
||||||
const int numIters = 10000;
|
const int numIters = 1000;
|
||||||
PrivateKey sk = AugSchemeMPL().KeyGen(getRandomSeed());
|
PrivateKey sk = BasicSchemeMPL().KeyGen(getRandomSeed());
|
||||||
G1Element pk = sk.GetG1Element();
|
G1Element pk = sk.GetG1Element();
|
||||||
|
|
||||||
std::vector<G2Element> sigs;
|
std::vector<G2Element> sigs;
|
||||||
@ -54,7 +54,7 @@ void benchVerification() {
|
|||||||
uint8_t message[4];
|
uint8_t message[4];
|
||||||
Util::IntToFourBytes(message, i);
|
Util::IntToFourBytes(message, i);
|
||||||
vector<uint8_t> messageBytes(message, message + 4);
|
vector<uint8_t> messageBytes(message, message + 4);
|
||||||
sigs.push_back(AugSchemeMPL().Sign(sk, messageBytes));
|
sigs.push_back(BasicSchemeMPL().Sign(sk, messageBytes));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto start = startStopwatch();
|
auto start = startStopwatch();
|
||||||
@ -62,34 +62,36 @@ void benchVerification() {
|
|||||||
uint8_t message[4];
|
uint8_t message[4];
|
||||||
Util::IntToFourBytes(message, i);
|
Util::IntToFourBytes(message, i);
|
||||||
vector<uint8_t> messageBytes(message, message + 4);
|
vector<uint8_t> messageBytes(message, message + 4);
|
||||||
bool ok = AugSchemeMPL().Verify(pk, messageBytes, sigs[i]);
|
bool ok = BasicSchemeMPL().Verify(pk, messageBytes, sigs[i]);
|
||||||
ASSERT(ok);
|
ASSERT(ok);
|
||||||
}
|
}
|
||||||
endStopwatch(testName, start, numIters);
|
endStopwatch(testName, start, numIters);
|
||||||
}
|
}
|
||||||
|
|
||||||
void benchBatchVerification() {
|
void benchBatchVerification() {
|
||||||
const int numIters = 100000;
|
const int numIters = 10000;
|
||||||
|
|
||||||
vector<vector<uint8_t>> sig_bytes;
|
vector<vector<uint8_t>> sig_bytes;
|
||||||
vector<vector<uint8_t>> pk_bytes;
|
vector<vector<uint8_t>> pk_bytes;
|
||||||
vector<vector<uint8_t>> ms;
|
vector<vector<uint8_t>> ms;
|
||||||
|
|
||||||
|
auto start = startStopwatch();
|
||||||
for (int i = 0; i < numIters; i++) {
|
for (int i = 0; i < numIters; i++) {
|
||||||
uint8_t message[4];
|
uint8_t message[4];
|
||||||
Util::IntToFourBytes(message, i);
|
Util::IntToFourBytes(message, i);
|
||||||
vector<uint8_t> messageBytes(message, message + 4);
|
vector<uint8_t> messageBytes(message, message + 4);
|
||||||
PrivateKey sk = AugSchemeMPL().KeyGen(getRandomSeed());
|
PrivateKey sk = BasicSchemeMPL().KeyGen(getRandomSeed());
|
||||||
G1Element pk = sk.GetG1Element();
|
G1Element pk = sk.GetG1Element();
|
||||||
sig_bytes.push_back(AugSchemeMPL().Sign(sk, messageBytes).Serialize());
|
sig_bytes.push_back(BasicSchemeMPL().Sign(sk, messageBytes).Serialize());
|
||||||
pk_bytes.push_back(pk.Serialize());
|
pk_bytes.push_back(pk.Serialize());
|
||||||
ms.push_back(messageBytes);
|
ms.push_back(messageBytes);
|
||||||
}
|
}
|
||||||
|
endStopwatch("Batch verification preparation", start, numIters);
|
||||||
|
|
||||||
vector<G1Element> pks;
|
vector<G1Element> pks;
|
||||||
pks.reserve(numIters);
|
pks.reserve(numIters);
|
||||||
|
|
||||||
auto start = startStopwatch();
|
start = startStopwatch();
|
||||||
for (auto const& pk : pk_bytes) {
|
for (auto const& pk : pk_bytes) {
|
||||||
pks.emplace_back(G1Element::FromBytes(Bytes(pk)));
|
pks.emplace_back(G1Element::FromBytes(Bytes(pk)));
|
||||||
}
|
}
|
||||||
@ -105,52 +107,71 @@ void benchBatchVerification() {
|
|||||||
endStopwatch("Signature validation", start, numIters);
|
endStopwatch("Signature validation", start, numIters);
|
||||||
|
|
||||||
start = startStopwatch();
|
start = startStopwatch();
|
||||||
G2Element aggSig = AugSchemeMPL().Aggregate(sigs);
|
G2Element aggSig = BasicSchemeMPL().Aggregate(sigs);
|
||||||
endStopwatch("Aggregation", start, numIters);
|
endStopwatch("Aggregation", start, numIters);
|
||||||
|
|
||||||
start = startStopwatch();
|
start = startStopwatch();
|
||||||
bool ok = AugSchemeMPL().AggregateVerify(pks, ms, aggSig);
|
bool ok = BasicSchemeMPL().AggregateVerify(pks, ms, aggSig);
|
||||||
ASSERT(ok);
|
ASSERT(ok);
|
||||||
endStopwatch("Batch verification", start, numIters);
|
endStopwatch("Batch verification", start, numIters);
|
||||||
}
|
}
|
||||||
|
|
||||||
void benchFastAggregateVerification() {
|
void benchSerialize() {
|
||||||
const int numIters = 5000;
|
const int numIters = 5000000;
|
||||||
|
PrivateKey sk = BasicSchemeMPL().KeyGen(getRandomSeed());
|
||||||
vector<G2Element> sigs;
|
G1Element pk = sk.GetG1Element();
|
||||||
vector<G1Element> pks;
|
vector<uint8_t> message = sk.GetG1Element().Serialize();
|
||||||
vector<uint8_t> message = {1, 2, 3, 4, 5, 6, 7, 8};
|
G2Element sig = BasicSchemeMPL().Sign(sk, message);
|
||||||
vector<G2Element> pops;
|
|
||||||
|
|
||||||
for (int i = 0; i < numIters; i++) {
|
|
||||||
PrivateKey sk = PopSchemeMPL().KeyGen(getRandomSeed());
|
|
||||||
G1Element pk = sk.GetG1Element();
|
|
||||||
sigs.push_back(PopSchemeMPL().Sign(sk, message));
|
|
||||||
pops.push_back(PopSchemeMPL().PopProve(sk));
|
|
||||||
pks.push_back(pk);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto start = startStopwatch();
|
auto start = startStopwatch();
|
||||||
G2Element aggSig = PopSchemeMPL().Aggregate(sigs);
|
for (int i = 0; i < numIters; i++) {
|
||||||
endStopwatch("PopScheme Aggregation", start, numIters);
|
sk.Serialize();
|
||||||
|
}
|
||||||
|
endStopwatch("Serialize PrivateKey", start, numIters);
|
||||||
|
|
||||||
start = startStopwatch();
|
start = startStopwatch();
|
||||||
for (int i = 0; i < numIters; i++) {
|
for (int i = 0; i < numIters; i++) {
|
||||||
bool ok = PopSchemeMPL().PopVerify(pks[i], pops[i]);
|
pk.Serialize();
|
||||||
ASSERT(ok);
|
|
||||||
}
|
}
|
||||||
endStopwatch("PopScheme Proofs verification", start, numIters);
|
endStopwatch("Serialize G1Element", start, numIters);
|
||||||
|
|
||||||
start = startStopwatch();
|
start = startStopwatch();
|
||||||
bool ok = PopSchemeMPL().FastAggregateVerify(pks, message, aggSig);
|
for (int i = 0; i < numIters; i++) {
|
||||||
ASSERT(ok);
|
sig.Serialize();
|
||||||
endStopwatch("PopScheme verification", start, numIters);
|
}
|
||||||
|
endStopwatch("Serialize G2Element", start, numIters);
|
||||||
|
}
|
||||||
|
|
||||||
|
void benchSerializeToArray() {
|
||||||
|
const int numIters = 5000000;
|
||||||
|
PrivateKey sk = BasicSchemeMPL().KeyGen(getRandomSeed());
|
||||||
|
G1Element pk = sk.GetG1Element();
|
||||||
|
vector<uint8_t> message = sk.GetG1Element().Serialize();
|
||||||
|
G2Element sig = BasicSchemeMPL().Sign(sk, message);
|
||||||
|
|
||||||
|
auto start = startStopwatch();
|
||||||
|
for (int i = 0; i < numIters; i++) {
|
||||||
|
sk.SerializeToArray();
|
||||||
|
}
|
||||||
|
endStopwatch("SerializeToArray PrivateKey", start, numIters);
|
||||||
|
|
||||||
|
start = startStopwatch();
|
||||||
|
for (int i = 0; i < numIters; i++) {
|
||||||
|
pk.SerializeToArray();
|
||||||
|
}
|
||||||
|
endStopwatch("SerializeToArray G1Element", start, numIters);
|
||||||
|
|
||||||
|
start = startStopwatch();
|
||||||
|
for (int i = 0; i < numIters; i++) {
|
||||||
|
sig.SerializeToArray();
|
||||||
|
}
|
||||||
|
endStopwatch("SerializeToArray G2Element", start, numIters);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char* argv[]) {
|
int main(int argc, char* argv[]) {
|
||||||
benchSigs();
|
benchSigs();
|
||||||
benchVerification();
|
benchVerification();
|
||||||
benchBatchVerification();
|
benchBatchVerification();
|
||||||
benchFastAggregateVerification();
|
benchSerialize();
|
||||||
|
benchSerializeToArray();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user