github.com/ari-anchor/sei-tendermint@v0.0.0-20230519144642-dc826b7b56bb/docs/rfc/rfc-018-bls-agg-exploration.md (about)

     1  # RFC 018: BLS Signature Aggregation Exploration
     2  
     3  ## Changelog
     4  
     5  - 01-April-2022: Initial draft (@williambanfield).
     6  - 15-April-2022: Draft complete (@williambanfield).
     7  
     8  ## Abstract
     9  
    10  ## Background
    11  
    12  ### Glossary
    13  
    14  The terms that are attached to these types of cryptographic signing systems
    15  become confusing quickly. Different sources appear to use slightly different
    16  meanings of each term and this can certainly add to the confusion. Below is
    17  a brief glossary that may be helpful in understanding the discussion that follows.
    18  
    19  * **Short Signature**: A signature that does not vary in length with the
    20  number of signers.
    21  * **Multi-Signature**: A signature generated over a single message
    22  where, given the message and signature, a verifier is able to determine that
    23  all parties signed the message. May be short or may vary with the number of signers.
    24  * **Aggregated Signature**: A _short_ signature generated over messages with
    25  possibly different content where, given the messages and signature, a verifier
    26  should be able to determine that all the parties signed the designated messages.
    27  * **Threshold Signature**: A _short_ signature generated from multiple signers
    28  where, given a message and the signature, a verifier is able to determine that
    29  a large enough share of the parties signed the message. The identities of the
    30  parties that contributed to the signature are not revealed.
    31  * **BLS Signature**: An elliptic-curve pairing-based signature system that
    32  has some nice properties for short multi-signatures. May stand for
    33  *Boneh-Lynn-Schacham* or *Barreto-Lynn-Scott* depending on the context. A
    34  BLS signature is type of signature scheme that is distinct from other forms
    35  of elliptic-curve signatures such as ECDSA and EdDSA.
    36  * **Interactive**: Cryptographic scheme where parties need to perform one or
    37  more request-response cycles to produce the cryptographic material. For
    38  example, an interactive signature scheme may require the signer and the
    39  verifier to cooperate to create and/or verify the signature, rather than a
    40  signature being created ahead of time.
    41  * **Non-interactive**: Cryptographic scheme where parties do not need to
    42  perform any request-response cycles to produce the cryptographic material.
    43  
    44  ### Brief notes on pairing-based elliptic-curve cryptography
    45  
    46  Pairing-based elliptic-curve cryptography is quite complex and relies on several
    47  types of high-level math. Cryptography, in general, relies on being able to find
    48  problems with an asymmetry between the difficulty of calculating the solution
    49  and verifying that a given solution is correct.
    50  
    51  Pairing-based cryptography works by operating on mathematical functions that
    52  satisfy the property of **bilinear mapping**. This property is satisfied for
    53  functions `e` with values `P`, `Q`, `R` and `S` where `e(P, Q + R) = e(P, Q) * e(P, R)`
    54  and `e(P + S, Q) = e(P, Q) * e(S, Q)`. The most familiar example of this is
    55  exponentiation. Written in common notation, `g^P*(Q+R) = g^(P*Q) * g^(P*R)` for
    56  some value `g`.
    57  
    58  Pairing-based elliptic-curve cryptography creates a bilinear mapping using
    59  elliptic curves over a finite field. With some original curve, you can define two groups,
    60  `G1` and `G2` which are points of the original curve _modulo_ different values.
    61  Finally, you define a third group `Gt`, where points from `G1` and `G2` satisfy
    62  the property of bilinearity with `Gt`. In this scheme, the function `e` takes
    63  as inputs points in `G1` and `G2` and outputs values in `Gt`. Succintly, given
    64  some point `P` in `G1` and some point `Q` in `G1`, `e(P, Q) = C` where `C` is in `Gt`.
    65  You can efficiently compute the mapping of points in `G1` and `G2` into `Gt`,
    66  but you cannot efficiently determine what points were summed and paired to
    67  produce the value in `Gt`.
    68  
    69  Functions are then defined to map digital signatures, messages, and keys into
    70  and out of points of `G1` or `G2` and signature verification is the process
    71  of calculating if a set of values representing a message, public key, and digital
    72  signature produce the same value in `Gt` through `e`.
    73  
    74  Signatures can be created as either points in `G1` with public keys being
    75  created as points in `G2` or vice versa. For the case of BLS12-381, the popular
    76  curve used, points in `G1` are represented with 48 bytes and points in `G2` are
    77  represented with 96 bytes. It is up to the implementer of the cryptosystem to
    78  decide which should be larger, the public keys or the signatures.
    79  
    80  BLS signatures rely on pairing-based elliptic-curve cryptography to produce
    81  various types of signatures. For a more in-depth but still high level discussion
    82  pairing-based elliptic-curve cryptography, see Vitalik Buterin's post on
    83  [Exploring Elliptic Curve Pairings][vitalik-pairing-post]. For much more in
    84  depth discussion, see the specific paper on BLS12-381, [Short signatures from
    85   the Weil Pairing][bls-weil-pairing] and
    86  [Compact Multi-Signatures for Smaller Blockchains][multi-signatures-smaller-blockchains].
    87  
    88  ### Adoption
    89  
    90  BLS signatures have already gained traction within several popular projects.
    91  
    92  * Algorand is working on an implementation.
    93  * [Zcash][zcash-adoption] has adopted BLS12-381 into the protocol.
    94  * [Ethereum 2.0][eth-2-adoption] has adopted BLS12-381 into the protocol.
    95  * [Chia Network][chia-adoption] has adopted BLS for signing blocks.
    96  * [Ostracon][line-ostracon-pr], a fork of Tendermint has adopted BLS for signing blocks.
    97  
    98  ### What systems may be affected by adding aggregated signatures?
    99  
   100  #### Gossip
   101  
   102  Gossip could be updated to aggregate vote signatures during a consensus round.
   103  This appears to be of frankly little utility. Creating an aggregated signature
   104  incurs overhead, so frequently re-aggregating may incur a significant
   105  overhead. How costly this is is still subject to further investigation and
   106  performance testing.
   107  
   108  Even if vote signatures were aggregated before gossip, each validator would still
   109  need to receive and verify vote extension data from each (individual) peer validator in 
   110  order for consensus to proceed. That displaces any advantage gained by aggregating signatures across the vote message in the presence of vote extensions.
   111  
   112  #### Block Creation
   113  
   114  When creating a block, the proposer may create a small set of short
   115  multi-signatures and attach these to the block instead of including one
   116  signature per validator.
   117  
   118  #### Block Verification
   119  
   120  Currently, we verify each validator signature using the public key associated
   121  with that validator.  With signature aggregation, verification of blocks would
   122  not verify many signatures individually, but would instead check the (single)
   123  multi-signature using the public keys stored by the validator. This would also
   124  require a mechanism for indicating which validators are included in the
   125  aggregated signature.
   126  
   127  #### IBC Relaying
   128  
   129  IBC would no longer need to transmit a large set of signatures when
   130  updating state. These state updates do not happen for every IBC packet, only
   131  when changing an IBC light client's view of the counterparty chain's state.
   132  General [IBC packets][ibc-packet] only contain enough information to correctly
   133  route the data to the counterparty chain.
   134  
   135  IBC does persist commit signatures to the chain in these `MsgUpdateClient`
   136  message when updating state. This message would no longer need the full set
   137  of unique signatures and would instead only need one signature for all of the
   138  data in the header.
   139  
   140  Adding BLS signatures would create a new signature type that must be
   141  understood by the IBC module and by the relayers. For some operations, such
   142  as state updates, the set of data written into the chain and received by the
   143  IBC module could be slightly smaller.
   144  
   145  ## Discussion
   146  
   147  ### What are the proposed benefits to aggregated signatures?
   148  
   149  #### Reduce Block Size
   150  
   151  At the moment, a commit contains a 64-byte (512-bit) signature for each validator
   152  that voted for the block. For the Cosmos Hub, which has 175 validators in the
   153  active set, this amounts to about 11 KiB per block. That gives an upper bound of
   154  around 113 GiB over the lifetime of the chain's 10.12M blocks. (Note, the Hub has
   155  increased the number of validators in the active set over time so the total
   156  signature size over the history of the chain is likely somewhat less than that).
   157  
   158  Signature aggregation would only produce two signatures for the entire block.
   159  One for the yeas and one for the nays. Each BLS aggregated signature is 48
   160  bytes, per the [IETF standard of BLS signatures][bls-ietf-ecdsa-compare].
   161  Over the lifetime of the same Cosmos Hub chain, that would amount to about 1
   162  GB, a savings of 112 GB. While that is a large factor of reduction it's worth
   163  bearing in mind that, at [GCP's cost][gcp-storage-pricing] of $.026 USD per GB,
   164  that is a total savings of around $2.50 per month.
   165  
   166  #### Reduce Signature Creation and Verification Time
   167  
   168  From the [IETF draft standard on BLS Signatures][bls-ietf], BLS signatures can be
   169  created in 370 microseconds and verified in 2700 microseconds. Our current
   170  [Ed25519 implementation][voi-ed25519-perf] was benchmarked locally to take
   171  13.9 microseconds to produce a signature and 2.03 milliseconds to batch verify
   172  128 signatures, which is slightly fewer than the 175 in the Hub. blst, a popular
   173  implementation of BLS signature aggregation was benchmarked to perform verification
   174  on 100 signatures in 1.5 milliseconds [when run locally][blst-verify-bench]
   175  on an 8 thread machine and pre-aggregated public keys. It is worth noting that
   176  the `ed25519` library verification time grew steadily with the number of signatures,
   177  whereas the bls library verification time remains constant. This is because the
   178  number of operations used to verify a signature does not grow at all with the
   179  number of signatures included in the aggregate signature (as long as the signers
   180  signed over the same message data as is the case in Tendermint).
   181  
   182  It is worth noting that this would also represent a _degredation_ in signature
   183  verification time for chains with small validator sets. When batch verifying
   184  only 32 signatures, our ed25519 library takes .57 milliseconds, whereas BLS
   185  would still require the same 1.5 milliseconds.
   186  
   187  For massive validator sets, blst dominates, taking the same 1.5 milliseconds to
   188  check an aggregated signature from 1024 validators versus our ed25519 library's
   189  13.066 milliseconds to batch verify a set of that size.
   190  
   191  #### Reduce Light-Client Verification Time
   192  
   193  The light client aims to be a faster and lighter-weight way to verify that a 
   194  block was voted on by a Tendermint network. The light client fetches
   195  Tendermint block headers and commit signatures, performing public key
   196  verification to ensure that the associated validator set signed the block.
   197  Reducing the size of the commit signature would allow the light client to fetch
   198  block data more quickly.
   199  
   200  Additionally, the faster signature verification times of BLS signatures mean
   201  that light client verification would proceed more quickly.
   202  
   203  However, verification of an aggregated signature is all-or-nothing. The verifier
   204  cannot check that some singular signer had a signature included in the block.
   205  Instead, the verifier must use all public keys to check if some signature
   206  was included. This does mean that any light client implementation must always
   207  be able to fetch all public keys for any height instead of potentially being
   208  able to check if some singular validator's key signed the block.
   209  
   210  #### Reduce Gossip Bandwidth
   211  
   212  ##### Vote Gossip
   213  
   214  It is possible to aggregate subsets of signatures during voting, so that the
   215  network need not gossip all *n* validator signatures to all *n* validators.
   216  Theoretically, subsets of the signatures could be aggregated during consensus
   217  and vote messages could carry those aggregated signatures. Implementing this
   218  would certainly increase the complexity of the gossip layer but could possibly
   219  reduce the total number of signatures required to be verified by each validator.
   220  
   221  ##### Block Gossip
   222  
   223  A reduction in the block size as a result of signature aggregation would
   224  naturally lead to a reduction in the bandwidth required to gossip a block.
   225  Each validator would only send and receive the smaller aggregated signatures
   226  instead of the full list of multi-signatures as we have them now.
   227  
   228  ### What are the drawbacks to aggregated signatures?
   229  
   230  #### Heterogeneous key types cannot be aggregated
   231  
   232  Aggregation requires a specific signature algorithm, and our legacy signing schemes
   233  cannot be aggregated. In practice, this means that aggregated signatures could
   234  be created for a subset of validators using BLS signatures, and validators
   235  with other key types (such as Ed25519) would still have to be be separately
   236  propagated in blocks and votes.
   237  
   238  #### Many HSMs do not support aggregated signatures
   239  
   240  **Hardware Signing Modules** (HSM) are a popular way to manage private keys.
   241  They provide additional security for key management and should be used when
   242  possible for storing highly sensitive private key material.
   243  
   244  Below is a list of popular HSMs along with their support for BLS signatures.
   245  
   246  * YubiKey
   247    * [No support][yubi-key-bls-support]
   248  * Amazon Cloud HSM
   249    * [No support][cloud-hsm-support]
   250  * Ledger
   251    * [Lists support for the BLS12-381 curve][ledger-bls-announce]
   252  
   253  I cannot find support listed for Google Cloud, although perhaps it exists.
   254  
   255  ## Feasibility of implementation
   256  
   257  This section outlines the various hurdles that would exist to implementing BLS
   258  signature aggregation into Tendermint. It aims to demonstrate that we _could_
   259  implement BLS signatures but that it would incur risk and require breaking changes for a
   260  reasonably unclear benefit.
   261  
   262  ### Can aggregated signatures be added as soft-upgrades?
   263  
   264  In my estimation, yes. With the implementation of proposer-based timestamps, 
   265  all validators now produce signatures on only one of two messages:
   266  
   267  1. A [CanonicalVote][canonical-vote-proto] where the BlockID is the hash of the block or
   268  2. A `CanonicalVote` where the `BlockID` is nil.
   269  
   270  The block structure can be updated to perform hashing and validation in a new
   271  way as a soft upgrade. This would look like adding a new section to the [Block.Commit][commit-proto] structure
   272  alongside the current `Commit.Signatures` field. This new field, tentatively named
   273  `AggregatedSignature` would contain the following structure:
   274  
   275  ```proto
   276  message AggregatedSignature {
   277    // yeas is a BitArray representing which validators in the active validator
   278    // set issued a 'yea' vote for the block.
   279    tendermint.libs.bits.BitArray yeas = 1;
   280  
   281    // absent is a BitArray representing which validators in the active
   282    // validator set did not issue votes for the block.
   283    tendermint.libs.bits.BitArray absent = 2;
   284  
   285    // yea_signature is an aggregated signature produced from all of the vote
   286    // signatures for the block.
   287    repeated bytes yea_signature = 3;
   288  
   289    // nay_signature is an aggregated signature produced from all of the vote
   290    // signatures from votes for 'nil' for this block.
   291    // nay_signature should be made from all of the validators that were both not
   292    // in the 'yeas' BitArray and not in the 'absent' BitArray.
   293    repeated bytes nay_signature = 4;
   294  }
   295  ```
   296  
   297  Adding this new field as a soft upgrade would mean hashing this data structure
   298  into the blockID along with the old `Commit.Signatures` when both are present
   299  as well as ensuring that the voting power represented in the new
   300  `AggregatedSignature` and `Signatures` field was enough to commit the block
   301  during block validation. One can certainly imagine other possible schemes for
   302  implementing this but the above should serve as a simple enough proof of concept.
   303  
   304  ### Implementing vote-time and commit-time signature aggregation separately
   305  
   306  Implementing aggregated BLS signatures as part of the block structure can easily be
   307  achieved without implementing any 'vote-time' signature aggregation.
   308  The block proposer would gather all of the votes, complete with signatures,
   309  as it does now, and produce a set of aggregate signatures from all of the
   310  individual vote signatures.
   311  
   312  Implementing 'vote-time' signature aggregation cannot be achieved without
   313  also implementing commit-time signature aggregation. This is because such
   314  signatures cannot be dis-aggregated into their constituent pieces. Therefore,
   315  in order to implement 'vote-time' signature aggregation, we would need to
   316  either first implement 'commit-time' signature aggregation, or implement both
   317  'vote-time' signature aggregation while also updating the block creation and
   318  verification protocols to allow for aggregated signatures.
   319  
   320  ### Updating IBC clients
   321  
   322  In order for IBC clients to function, they must be able to perform light-client
   323  verification of blocks on counterparty chains. Because BLS signatures are not
   324  currently part of light-clients, chains that transmit messages over IBC
   325  cannot update to using BLS signatures without their counterparties first
   326  being upgraded to parse and verify BLS. If chains upgrade without their
   327  counterparties first updating, they will lose the ability to interoperate with
   328  non-updated chains.
   329  
   330  ### New attack surfaces
   331  
   332  BLS signatures and signature aggregation comes with a new set of attack surfaces.
   333  Additionally, it's not clear that all possible major attacks are currently known
   334  on the BLS aggregation schemes since new ones have been discovered since the ietf
   335  draft standard was written. The known attacks are manageable and are listed below.
   336  Our implementation would need to prevent against these but this does not appear
   337  to present a significant hurdle to implementation.
   338  
   339  #### Rogue key attack prevention
   340  
   341  Generating an aggregated signature requires guarding against what is called
   342  a [rogue key attack][bls-ietf-terms]. A rogue key attack is one in which a
   343  malicious actor can craft an _aggregate_ key that can produce signatures that
   344  appear to include a signature from a private key that the malicious actor
   345  does not actually know. In Tendermint terms, this would look like a Validator
   346  producing a vote signed by both itself and some other validator where the other
   347  validator did not actually produce the vote itself.
   348  
   349  The main mechanisms for preventing this require that each entity prove that it
   350  can can sign data with just their private key. The options involve either
   351  ensuring that each entity sign a _different_ message when producing every
   352  signature _or_ producing a [proof of possession][bls-ietf-pop] (PoP) when announcing
   353  their key to the network.
   354  
   355  A PoP is a message that demonstrates ownership of a private
   356  key. A simple scheme for PoP is one where the entity announcing
   357  its new public key to the network includes a digital signature over the bytes
   358  of the public key generated using the associated private key. Everyone receiving
   359  the public key and associated proof-of-possession can easily verify the
   360  signature and be sure the entity owns the private key.
   361  
   362  This PoP scheme suits the Tendermint use case quite well since
   363  validator keys change infrequently so the associated PoPs would not be onerous
   364  to produce, verify, and store. Using this scheme allows signature verification
   365  to proceed more quickly, since all signatures are over identical data and
   366  can therefore be checked using an aggregated public key instead of one at a
   367  time, public key by public key.
   368  
   369  #### Summing Zero Attacks
   370  
   371  [Summing zero attacks][summing-zero-paper] are attacks that rely on using the '0' point of an
   372  elliptic curve. For BLS signatures, if the point 0 is chosen as the private
   373  key, then the 0 point will also always be the public key and all signatures
   374  produced by the key will also be the 0 point. This is easy enough to
   375  detect when verifying each signature individually.
   376  
   377  However, because BLS signature aggregation creates an aggregated signature and
   378  an aggregated public key, a set of colluding signers can create a pair or set
   379  of signatures that are non-zero but which aggregate ("sum") to 0. The signatures that sum zero along with the
   380  summed public key of the colluding signers will verify any message. This would
   381  allow the colluding signers to sign any block or message with the same signature.
   382  This would be reasonably easy to detect and create evidence for because, in
   383  all other cases, the same signature should not verify more than message. It's
   384  not exactly clear how such an attack would advantage the colluding validators
   385  because the normal mechanisms of evidence gathering would still detect the
   386  double signing, regardless of the signatures on both blocks being identical.
   387  
   388  ### Backwards Compatibility
   389  
   390  Backwards compatibility is an important consideration for signature verification.
   391  Specifically, it is important to consider whether chains using current versions
   392  of IBC would be able to interact with chains adopting BLS.
   393  
   394  Because the `Block` shared by IBC and Tendermint is produced and parsed using
   395  protobuf, new structures can be added to the Block without breaking the
   396  ability of legacy users to parse the new structure. Breaking changes between
   397  current users of IBC and new Tendermint blocks only occur if data that is
   398  relied upon by the current users is no longer included in the current fields.
   399  
   400  For the case of BLS aggregated signatures, a new `AggregatedSignature` field
   401  can therefore be added to the `Commit` field without breaking current users.
   402  Current users will be broken when counterparty chains upgrade to the new version
   403  and _begin using_ BLS signatures. Once counterparty chains begin using BLS
   404  signatures, the BlockID hashes will include hashes of the `AggregatedSignature`
   405  data structure that the legacy users will not be able to compute. Additionally,
   406  the legacy software will not be able to parse and verify the signatures to
   407  ensure that a supermajority of validators from the counterparty chain signed
   408  the block.
   409  
   410  ### Library Support
   411  
   412  Libraries for BLS signature creation are limited in number, although active 
   413  development appears to be ongoing. Cryptographic algorithms are difficult to
   414  implement correctly and correctness issues are extremely serious and dangerous.
   415  No further exploration of BLS should be undertaken without strong assurance of
   416  a well-tested library with continuing support for creating and verifying BLS
   417  signatures.
   418  
   419  At the moment, there is one candidate, `blst`, that appears to be the most
   420  mature and well vetted. While this library is undergoing continuing auditing
   421  and is supported by funds from the Ethereum foundation, adopting a new cryptographic
   422  library presents some serious risks. Namely, if the support for the library were
   423  to be discontinued, Tendermint may become saddled with the requirement of supporting
   424  a very complex piece of software or force a massive ecosystem-wide migration away
   425  from BLS signatures. 
   426  
   427  This is one of the more serious reasons to avoid adopting BLS signatures at this
   428  time. There is no gold standard library. Some projects look promising, but no
   429  project has been formally verified with a long term promise of being supported
   430  well into the future.
   431  
   432  #### Go Standard Library
   433  
   434  The Go Standard library has no implementation of BLS signatures.
   435  
   436  #### BLST
   437  
   438  [blst][blst], or 'blast' is an implementation of BLS signatures written in C
   439  that provides bindings into Go as part of the repository. This library is
   440  actively undergoing formal verification by Galois and previously received an
   441  initial audit by NCC group, a firm I'd never heard of.
   442  
   443  `blst` is [targeted for use in prysm][prysm-blst], the golang implementation of Ethereum 2.0.
   444  
   445  #### Gnark-Crypto
   446  
   447  [Gnark-Crypto][gnark] is a Go-native implementation of elliptic-curve pairing-based
   448  cryptography. It is not audited and is documented as 'as-is', although
   449  development appears to be active so formal verification may be forthcoming.
   450  
   451  #### CIRCL
   452  
   453  [CIRCL][circl] is a go-native implementation of several cryptographic primitives,
   454  bls12-381 among them. The library is written and maintained by Cloudflare and
   455  appears to receive frequent contributions. However, it lists itself as experimental
   456  and urges users to take caution before using it in production.
   457  
   458  ### Added complexity to light client verification
   459  
   460  Implementing BLS signature aggregation in Tendermint would pose issues for the
   461  light client. The light client currently validates a subset of the signatures
   462  on a block when performing the verification algorithm. This is no longer possible
   463  with an aggregated signature. Aggregated signature verification is all-or-nothing.
   464  The light client could no longer check that a subset of validators from some
   465  set of validators is represented in the signature. Instead, it would need to create
   466  a new aggregated key with all the stated signers for each height it verified where
   467  the validator set changed.
   468  
   469  This means that the speed advantages gained by using BLS cannot be fully realized
   470  by the light client since the client needs to perform the expensive operation
   471  of re-aggregating the public key. Aggregation is _not_ constant time in the
   472  number of keys and instead grows linearly. When [benchmarked locally][blst-verify-bench-agg],
   473  blst public key aggregation of 128 keys took 2.43 milliseconds. This, along with
   474  the 1.5 milliseconds to verify a signature would raise light client signature
   475  verification time to 3.9 milliseconds, a time above the previously mentioned 
   476  batch verification time using our ed25519 library of 2.0 milliseconds.
   477  
   478  Schemes to cache aggregated subsets of keys could certainly cut this time down at the
   479  cost of adding complexity to the light client.
   480  
   481  ### Added complexity to evidence handling
   482  
   483  Implementing BLS signature aggregation in Tendermint would add complexity to
   484  the evidence handling within Tendermint. Currently, the light client can submit
   485  evidence of a fork attempt to the chain. This evidence consists of the set of
   486  validators that double-signed, including their public keys, with the conflicting
   487  block.
   488  
   489  We can quickly check that the listed validators double signed by verifying
   490  that each of their signatures are in the submitted conflicting block. A BLS
   491  signature scheme would change this by requiring the light client to submit
   492  the public keys of all of the validators that signed the conflicting block so
   493  that the aggregated signature may be checked against the full signature set.
   494  Again, aggregated signature verification is all-or-nothing, so without all of
   495  the public keys, we cannot verify the signature at all. These keys would be
   496  retrievable. Any party that wanted to create a fork would want to convince a
   497  network that its fork is legitimate, so it would need to gossip the public keys.
   498  This does not hamper the feasibility of implementing BLS signature aggregation
   499  into Tendermint, but does represent yet another piece of added complexity to
   500  the associated protocols.
   501  
   502  ## Open Questions
   503  
   504  * *Q*: Can you aggregate Ed25519 signatures in Tendermint?
   505    * There is a suggested scheme in github issue [7892][suggested-ed25519-agg],
   506  but additional rigor would be required to fully verify its correctness.
   507  
   508  ## Current Consideration
   509  
   510  Adopting a signature aggregation scheme presents some serious risks and costs
   511  to the Tendermint project. It requires multiple backwards-incompatible changes
   512  to the code, namely a change in the structure of the block and a new backwards-incompatible
   513  signature and key type. It risks adding a new signature type for which new attack
   514  types are still being discovered _and_ for which no industry standard, battle-tested
   515  library yet exists.
   516  
   517  The gains boasted by this new signing scheme are modest: Verification time is
   518  marginally faster and block sizes shrink by a few kilobytes. These are relatively
   519  minor gains in exchange for the complexity of the change and the listed risks of the technology.
   520  We should take a wait-and-see approach to BLS signature aggregation, monitoring
   521  the up-and-coming projects and consider implementing it as the libraries and
   522  standards develop.
   523  
   524  ### References
   525  
   526  [line-ostracon-repo]: https://github.com/line/ostracon
   527  [line-ostracon-pr]: https://github.com/line/ostracon/pull/117
   528  [mit-BLS-lecture]: https://youtu.be/BFwc2XA8rSk?t=2521
   529  [gcp-storage-pricing]: https://cloud.google.com/storage/pricing#north-america_2
   530  [yubi-key-bls-support]: https://github.com/Yubico/yubihsm-shell/issues/66
   531  [cloud-hsm-support]: https://docs.aws.amazon.com/cloudhsm/latest/userguide/pkcs11-key-types.html
   532  [bls-ietf]: https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-bls-signature-04
   533  [bls-ietf-terms]: https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-bls-signature-04#section-1.3
   534  [bls-ietf-pop]: https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-bls-signature-04#section-3.3
   535  [multi-signatures-smaller-blockchains]: https://eprint.iacr.org/2018/483.pdf
   536  [ibc-tendermint]: https://github.com/cosmos/ibc/tree/master/spec/client/ics-007-tendermint-client
   537  [zcash-adoption]: https://github.com/zcash/zcash/issues/2502
   538  [chia-adoption]: https://github.com/Chia-Network/chia-blockchain#chia-blockchain
   539  [bls-ietf-ecdsa-compare]: https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-bls-signature-04#section-1.1
   540  [voi-ed25519-perf]: https://github.com/williambanfield/curve25519-voi/blob/benchmark/primitives/ed25519/PERFORMANCE.txt#L79
   541  [blst-verify-bench]: https://github.com/williambanfield/blst/blame/bench/bindings/go/PERFORMANCE.md#L9
   542  [blst-verify-bench-agg]: https://github.com/williambanfield/blst/blame/bench/bindings/go/PERFORMANCE.md#L23
   543  [vitalik-pairing-post]: https://medium.com/@VitalikButerin/exploring-elliptic-curve-pairings-c73c1864e627
   544  [ledger-bls-announce]: https://www.ledger.com/first-ever-firmware-update-coming-to-the-ledger-nano-x
   545  [commit-proto]: https://github.com/tendermint/tendermint/blob/be7cb50bb3432ee652f88a443e8ee7b8ef7122bc/proto/tendermint/types/types.proto#L121
   546  [canonical-vote-proto]: https://github.com/tendermint/tendermint/blob/be7cb50bb3432ee652f88a443e8ee7b8ef7122bc/spec/core/encoding.md#L283
   547  [blst]: https://github.com/supranational/blst
   548  [prysm-blst]: https://github.com/prysmaticlabs/prysm/blob/develop/go.mod#L75
   549  [gnark]: https://github.com/ConsenSys/gnark-crypto/
   550  [eth-2-adoption]: https://notes.ethereum.org/@GW1ZUbNKR5iRjjKYx6_dJQ/Skxf3tNcg_
   551  [bls-weil-pairing]: https://www.iacr.org/archive/asiacrypt2001/22480516.pdf
   552  [summing-zero-paper]: https://eprint.iacr.org/2021/323.pdf
   553  [circl]: https://github.com/cloudflare/circl
   554  [light-client-evidence]: https://github.com/tendermint/tendermint/blob/a6fd1fe20116d4b1f7e819cded81cece8e5c1ac7/types/evidence.go#L245
   555  [suggested-ed25519-agg]: https://github.com/tendermint/tendermint/issues/7892