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