# BLS Signature Aggregation
## BLS Signature
Digital signature được sử dụng rỗng rãi trong blockchain để đảm bảo tính xác thực và toàn vẹn của dữ liệu (VD: Ethereum sử dụng [ECDSA](https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm "ECDSA Wikipedia") signature để xác thực giao dịch). BLS signature cũng là một dạng digital signature, bên cạnh những tính chất cơ bản như những digital signature khác, BLS signature cũng có những tính chất riêng như khả năng tổng hợp chữ ký (signature aggregation), xác thực theo lô (batch verification), threshold signature,... có thể được ứng dụng để cải thiện và nâng cấp blockchain.
Digital signature trong blockchain thường dựa trên các elliptic curve. BLS signature sử dụng một số elliptic curve nhất định cùng với tính chất pairing của chúng (những triển khai phổ biến hiện nay chủ yếu sử dụng [BLS12-381](https://hackmd.io/@benjaminion/bls12-381 "BLS12-381 For The Rest Of Us") elliptic curve). Chính tính chất pairing này giúp BLS signature có được những khả năng đặc biệt như đã nói ở trên.
### Các thành phần chính
1. Secret key hay private key: key được sử dụng để ký các message và cần được giữ bí mật (tương tự như private key của Ethereum).
2. Public key: được tạo ra từ private key (tương tự như public key của Ethereum).
3. Message: dữ liệu cần được ký, là một chuỗi các byte.
4. Signature: Message sau khi được ký bởi secret key. Một chữ ký sau đó có thể được xác thực được nếu có đủ signature, message và public key.
### Cặp khóa
Một cặp khóa bao gồm một secret key cùng với public key tương ứng của nó. Secret key được tạo ngẫu nhiên trong môi trường an toàn và public key được xác định duy nhất từ secret key. Các cặp khóa thường được lưu trữ trong các file keystore được bảo vệ bằng mật khẩu. [EIP-2335](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-2335.md "EIP-2335") xác định định dạng JSON để lưu trữ và trao đổi các secret key của BLS12-381.
### API
Một lược đồ BLS signature thường cung cấp các API:
- KeyGen(IKM) -> SK: tạo secret key, input là một octet string và output là secret key SK.
- SkToPk(SK) -> PK: input là secret key và output là public key tương ứng.
- Sign(SK, message) -> signature: ký một message với secret key.
- Verify(PK, message, signature) -> VALID hoặc INVALID: xác thực một chữ ký tương ứng với public key và message.
- Aggregate(signatures) -> signature: tổng hợp một tập hợp các signature thành một signature duy nhất.
- AggregateVerify(PKs, messages, signature) -> VALID hoặc INVALID: xác thực chữ ký tổng hợp của nhiều message.
- AggregatePublicKeys(PKs) -> PK: tổng hợp một tập public key thành một public key duy nhất.
## Aggregation
Nhiều chữ ký của BLS signature có thể được tổng hợp thành một chữ ký duy nhất. Chữ ký tạo ra có cùng kích thước và không thể phân biệt được so với chữ ký thông thường.Hai ứng dụng tiêu biểu của tổng hợp chữ ký là multisig verification và batch verification.
### Multisig verification
Nhiều chữ ký của một message được ký bởi nhiều người có thể được tổng hợp để xác thực trong một thao tác duy nhất.
Để xác thực multsig với BLS signature ta thực hiện:
1. Thu thập và tổng hợp các chữ ký của message thành một chữ ký duy nhất sử dụng `Aggregate(signatures) -> signature`.
2. Tổng hợp public key của những người đã ký message thành một public key sử dụng `AggregatePublicKeys(PKs) -> PK`.
3. Sử dụng chữ ký và public key đã tổng hợp để xác thực message với `Verify(PK, message, signature)`.
### Batch verification
Nhiều message khác nhau với nhiều chữ ký có thể tổng hợp thành một chữ ký duy nhất và ta có thể xác nhận những message đó đã được ký chỉ với chữ ký tổng hợp duy nhất đó.
Với batch verification ta thực hiện:
1. Thu thập và tổng hợp chữ ký của các message với `Aggregate(signatures) -> signature`.
2. Sử dụng chữ ký đã tổng hợp cùng với tập message và tập public key của ngưởi ký để xác thực với `AggregateVerify(PKs, messages, signature)`.