From efd5c566da0990e374c4a7c86afce9421a117aa3 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Tue, 17 Dec 2024 04:29:16 +0000 Subject: [PATCH] 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 --- configure.ac | 2 +- include/dashbls/elements.hpp | 3 ++ include/dashbls/privatekey.hpp | 1 + src/elements.cpp | 28 ++++++++-- src/privatekey.cpp | 7 +++ src/test-bench.cpp | 95 +++++++++++++++++++++------------- 6 files changed, 94 insertions(+), 42 deletions(-) diff --git a/configure.ac b/configure.ac index df411ced0c..815a015b03 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ AC_PREREQ([2.60]) -AC_INIT([libdashbls],[1.3.4]) +AC_INIT([libdashbls],[1.3.5]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_MACRO_DIR([build-aux/m4]) diff --git a/include/dashbls/elements.hpp b/include/dashbls/elements.hpp index 6832b31f3a..95937f62db 100644 --- a/include/dashbls/elements.hpp +++ b/include/dashbls/elements.hpp @@ -59,6 +59,7 @@ public: GTElement Pair(const G2Element &b) const; uint32_t GetFingerprint(bool fLegacy = false) const; std::vector Serialize(bool fLegacy = false) const; + std::array SerializeToArray(bool fLegacy = false) const; G1Element Copy(); friend bool operator==(const G1Element &a, const G1Element &b); @@ -102,6 +103,7 @@ public: G2Element Negate() const; GTElement Pair(const G1Element &a) const; std::vector Serialize(bool fLegacy = false) const; + std::array SerializeToArray(bool fLegacy = false) const; G2Element Copy(); friend bool operator==(G2Element const &a, G2Element const &b); @@ -127,6 +129,7 @@ public: void Serialize(uint8_t *buffer) const; std::vector Serialize() const; + std::array SerializeToArray() const; friend bool operator==(GTElement const &a, GTElement const &b); friend bool operator!=(GTElement const &a, GTElement const &b); diff --git a/include/dashbls/privatekey.hpp b/include/dashbls/privatekey.hpp index beebbb05ab..d02a7d292c 100644 --- a/include/dashbls/privatekey.hpp +++ b/include/dashbls/privatekey.hpp @@ -82,6 +82,7 @@ class PrivateKey { // Serialize the key into bytes void Serialize(uint8_t *buffer) const; std::vector Serialize(bool fLegacy = false) const; + std::array SerializeToArray(bool fLegacy = false) const; G2Element SignG2( const uint8_t *msg, diff --git a/src/elements.cpp b/src/elements.cpp index 278af8cd8f..b0c747af82 100644 --- a/src/elements.cpp +++ b/src/elements.cpp @@ -171,11 +171,16 @@ uint32_t G1Element::GetFingerprint(const bool fLegacy) const } std::vector G1Element::Serialize(const bool fLegacy) const { + const auto arr = G1Element::SerializeToArray(fLegacy); + return std::vector{arr.begin(), arr.end()}; +} + +std::array G1Element::SerializeToArray(const bool fLegacy) const { uint8_t buffer[G1Element::SIZE + 1]; g1_write_bin(buffer, G1Element::SIZE + 1, p, 1); + std::array result{}; if (buffer[0] == 0x00) { // infinity - std::vector result(G1Element::SIZE, 0); result[0] = 0xc0; return result; } @@ -187,7 +192,9 @@ std::vector G1Element::Serialize(const bool fLegacy) const { if (!fLegacy) { buffer[1] |= 0x80; // indicate compression } - return std::vector(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) @@ -386,11 +393,18 @@ G2Element G2Element::Negate() const GTElement G2Element::Pair(const G1Element& a) const { return a & (*this); } std::vector G2Element::Serialize(const bool fLegacy) const { + const auto arr = G2Element::SerializeToArray(fLegacy); + return std::vector{arr.begin(), arr.end()}; +} + +std::array G2Element::SerializeToArray(const bool fLegacy) const { uint8_t buffer[G2Element::SIZE + 1]; g2_write_bin(buffer, G2Element::SIZE + 1, (g2_st*)q, 1); + std::array result{}; + if (buffer[0] == 0x00) { // infinity - std::vector result(G2Element::SIZE, 0); + result.fill(0); result[0] = 0xc0; return result; } @@ -410,7 +424,6 @@ std::vector G2Element::Serialize(const bool fLegacy) const { } } - std::vector result(G2Element::SIZE, 0); if (fLegacy) { std::memcpy(result.data(), buffer + 1, G2Element::SIZE); } else { @@ -551,4 +564,11 @@ std::vector GTElement::Serialize() const return data; } +std::array GTElement::SerializeToArray() const +{ + std::array data{}; + Serialize(data.data()); + return data; +} + } // end namespace bls diff --git a/src/privatekey.cpp b/src/privatekey.cpp index 865507dfc7..d4dd32d116 100644 --- a/src/privatekey.cpp +++ b/src/privatekey.cpp @@ -284,6 +284,13 @@ std::vector PrivateKey::Serialize(const bool fLegacy) const return data; } +std::array PrivateKey::SerializeToArray(bool fLegacy) const +{ + std::array data{}; + Serialize(data.data()); + return data; +} + G2Element PrivateKey::SignG2( const uint8_t *msg, size_t len, diff --git a/src/test-bench.cpp b/src/test-bench.cpp index af351821e5..20bbbb4439 100644 --- a/src/test-bench.cpp +++ b/src/test-bench.cpp @@ -31,21 +31,21 @@ using namespace bls; void benchSigs() { string testName = "Signing"; const int numIters = 5000; - PrivateKey sk = AugSchemeMPL().KeyGen(getRandomSeed()); + PrivateKey sk = BasicSchemeMPL().KeyGen(getRandomSeed()); vector message1 = sk.GetG1Element().Serialize(); auto start = startStopwatch(); for (int i = 0; i < numIters; i++) { - AugSchemeMPL().Sign(sk, message1); + BasicSchemeMPL().Sign(sk, message1); } endStopwatch(testName, start, numIters); } void benchVerification() { string testName = "Verification"; - const int numIters = 10000; - PrivateKey sk = AugSchemeMPL().KeyGen(getRandomSeed()); + const int numIters = 1000; + PrivateKey sk = BasicSchemeMPL().KeyGen(getRandomSeed()); G1Element pk = sk.GetG1Element(); std::vector sigs; @@ -54,7 +54,7 @@ void benchVerification() { uint8_t message[4]; Util::IntToFourBytes(message, i); vector messageBytes(message, message + 4); - sigs.push_back(AugSchemeMPL().Sign(sk, messageBytes)); + sigs.push_back(BasicSchemeMPL().Sign(sk, messageBytes)); } auto start = startStopwatch(); @@ -62,34 +62,36 @@ void benchVerification() { uint8_t message[4]; Util::IntToFourBytes(message, i); vector messageBytes(message, message + 4); - bool ok = AugSchemeMPL().Verify(pk, messageBytes, sigs[i]); + bool ok = BasicSchemeMPL().Verify(pk, messageBytes, sigs[i]); ASSERT(ok); } endStopwatch(testName, start, numIters); } void benchBatchVerification() { - const int numIters = 100000; + const int numIters = 10000; vector> sig_bytes; vector> pk_bytes; vector> ms; + auto start = startStopwatch(); for (int i = 0; i < numIters; i++) { uint8_t message[4]; Util::IntToFourBytes(message, i); vector messageBytes(message, message + 4); - PrivateKey sk = AugSchemeMPL().KeyGen(getRandomSeed()); + PrivateKey sk = BasicSchemeMPL().KeyGen(getRandomSeed()); 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()); ms.push_back(messageBytes); } + endStopwatch("Batch verification preparation", start, numIters); vector pks; pks.reserve(numIters); - auto start = startStopwatch(); + start = startStopwatch(); for (auto const& pk : pk_bytes) { pks.emplace_back(G1Element::FromBytes(Bytes(pk))); } @@ -105,52 +107,71 @@ void benchBatchVerification() { endStopwatch("Signature validation", start, numIters); start = startStopwatch(); - G2Element aggSig = AugSchemeMPL().Aggregate(sigs); + G2Element aggSig = BasicSchemeMPL().Aggregate(sigs); endStopwatch("Aggregation", start, numIters); start = startStopwatch(); - bool ok = AugSchemeMPL().AggregateVerify(pks, ms, aggSig); + bool ok = BasicSchemeMPL().AggregateVerify(pks, ms, aggSig); ASSERT(ok); endStopwatch("Batch verification", start, numIters); } -void benchFastAggregateVerification() { - const int numIters = 5000; - - vector sigs; - vector pks; - vector message = {1, 2, 3, 4, 5, 6, 7, 8}; - vector 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); - } +void benchSerialize() { + const int numIters = 5000000; + PrivateKey sk = BasicSchemeMPL().KeyGen(getRandomSeed()); + G1Element pk = sk.GetG1Element(); + vector message = sk.GetG1Element().Serialize(); + G2Element sig = BasicSchemeMPL().Sign(sk, message); auto start = startStopwatch(); - G2Element aggSig = PopSchemeMPL().Aggregate(sigs); - endStopwatch("PopScheme Aggregation", start, numIters); - + for (int i = 0; i < numIters; i++) { + sk.Serialize(); + } + endStopwatch("Serialize PrivateKey", start, numIters); start = startStopwatch(); for (int i = 0; i < numIters; i++) { - bool ok = PopSchemeMPL().PopVerify(pks[i], pops[i]); - ASSERT(ok); + pk.Serialize(); } - endStopwatch("PopScheme Proofs verification", start, numIters); + endStopwatch("Serialize G1Element", start, numIters); start = startStopwatch(); - bool ok = PopSchemeMPL().FastAggregateVerify(pks, message, aggSig); - ASSERT(ok); - endStopwatch("PopScheme verification", start, numIters); + for (int i = 0; i < numIters; i++) { + sig.Serialize(); + } + endStopwatch("Serialize G2Element", start, numIters); +} + +void benchSerializeToArray() { + const int numIters = 5000000; + PrivateKey sk = BasicSchemeMPL().KeyGen(getRandomSeed()); + G1Element pk = sk.GetG1Element(); + vector 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[]) { benchSigs(); benchVerification(); benchBatchVerification(); - benchFastAggregateVerification(); + benchSerialize(); + benchSerializeToArray(); }