Блокчейн
BLS подписи и агрегация
Представьте: 1 000 000 валидаторов Ethereum каждые 12 секунд голосуют за блок. Если каждый голос - отдельная подпись в 65 байт, сеть утонет в мегабайтах подписей. Но что если любое количество подписей можно сжать в одну, размером 48 байт? BLS подписи превращают невозможную задачу масштабирования Proof-of-Stake в реальность.
- **Ethereum Beacon Chain** - каждый слот агрегирует подписи 128+ валидаторов в одну 48-байтную подпись, экономя ~99.9% трафика
- **Sync Committees** - 512 BLS подписей агрегируются для лёгких клиентов, позволяя проверять блоки на телефоне без скачивания всей цепи
- **Zcash Sapling** - BLS12-381 используется для zero-knowledge proofs, обеспечивая приватные транзакции с эффективными pairing-based доказательствами
Предварительные знания
BLS подписи: точка на кривой
В уроке про ECC мы узнали, что приватный ключ - это число `sk`, а публичный ключ - точка `pk = sk * G` на эллиптической кривой. **BLS** (Boneh-Lynn-Shacham, 2001) идёт дальше: подпись тоже становится точкой на кривой.
Идея: берём сообщение `m`, хешируем его **прямо в точку на кривой** `H(m)`, а затем умножаем на приватный ключ: `σ = sk * H(m)`. Результат - одна точка. Вот и вся подпись.
**Сравнение размеров подписей:** ECDSA (secp256k1) - 64 байта + 1 байт recovery, EdDSA (Ed25519) - 64 байта, **BLS - 48 байт**. BLS подпись самая короткая, потому что это одна сжатая точка на кривой, а не пара чисел (r, s) как в ECDSA.
| Параметр | ECDSA | EdDSA | BLS |
|---|---|---|---|
| Размер подписи | 65 байт | 64 байта | 48 байт |
| Размер публичного ключа | 33 байта | 32 байта | 96 байт |
| Верификация | Быстрая | Быстрая | Медленная (pairing) |
| Агрегация | Нет | Нет | Да |
| Детерминированность | Нет (нужен nonce k) | Да | Да |
**Ключевой trade-off**: BLS подпись короче, но верификация одной подписи в ~10 раз медленнее, чем ECDSA. Выигрыш BLS проявляется именно при агрегации - когда проверяем сотни подписей разом.
Почему BLS подпись занимает всего 48 байт, в то время как ECDSA - 65 байт?
Агрегация: N подписей -> одна
Самое мощное свойство BLS - **агрегация**. Если у нас есть N подписей σ₁, σ₂, ..., σₙ от разных людей на разные (или одинаковые) сообщения, мы можем **сложить** их в одну подпись: `σ_agg = σ₁ + σ₂ + ... + σₙ`.
Результат - одна точка на кривой, те же 48 байт. Не важно, агрегировали мы 2 подписи или 200 000 - размер один и тот же.
**Batch verification**: при проверке агрегированной подписи мы делаем N+1 pairings вместо 2N. Но есть ещё более быстрый способ - **random linear combination**. Выбираем случайные коэффициенты r₁...rₙ и проверяем: `e(G, Σrᵢσᵢ) == Πe(rᵢ·pkᵢ, H(mᵢ))`. Это снижает вероятность ложного срабатывания до пренебрежимо малой.
Агрегация работает благодаря **линейности** операции умножения точки на скаляр. Если `σᵢ = skᵢ * H(mᵢ)`, то сумма подписей `σ₁ + σ₂ = sk₁ * H(m₁) + sk₂ * H(m₂)`. Bilinear pairing позволяет проверить это равенство, не зная приватных ключей.
**Rogue key attack**: злоумышленник может выбрать свой публичный ключ как `pk' = pk_злоумышленника - pk_жертвы`, и тогда агрегированная подпись будет верифицироваться, хотя жертва ничего не подписывала. Защита: **proof of possession** (PoP) - каждый участник должен доказать, что знает свой приватный ключ, подписав свой публичный ключ.
В блоке Ethereum содержится 128 аттестаций валидаторов. Сколько байт занимают подписи при использовании BLS агрегации?
Bilinear Pairings: математика за кулисами
Всё, что мы описали - короткие подписи, агрегация, верификация без приватного ключа - работает благодаря математической конструкции под названием **bilinear pairing** (билинейное спаривание).
Pairing - это функция `e: G₁ × G₂ → G_T`, которая берёт две точки из двух разных групп на эллиптической кривой и отображает их в элемент третьей группы (мультипликативной). Ключевое свойство - **билинейность**.
Интуиция: pairing работает как «двухвходовой смеситель». Вы кладёте в него две точки с кривой и получаете число. Фокус в том, что если одну из точек умножить на скаляр `a`, результат смешивания изменится ровно так же, как если бы вы умножили на `a` другую точку. Это позволяет проверять подписи: мы видим `σ` и `pk`, но не знаем `sk` - а pairing всё равно подтверждает связь.
**Кривая BLS12-381**: стандарт для BLS подписей в блокчейнах. Число 12 - степень embedding degree (определяет как строится pairing), 381 - размер базового поля в битах. Разработана Шоном Бау (Sean Bowe) в 2017 году специально для эффективных pairing-based протоколов.
| Операция | Время (BLS12-381) | Сравнение |
|---|---|---|
| Scalar multiplication G₁ | ~0.5 мс | Сопоставимо с ECDSA |
| Scalar multiplication G₂ | ~1.5 мс | В 3 раза медленнее G₁ |
| Pairing e(P, Q) | ~1.5 мс | Самая дорогая операция |
| Агрегация (сложение точек) | ~0.01 мс | Почти бесплатно |
| Verify 1 BLS подписи | ~3 мс | 2 pairings |
| Verify 128 агрегированных | ~5 мс | 129 pairings, но с оптимизациями |
Какое свойство bilinear pairing делает возможной верификацию BLS подписи без знания приватного ключа?
BLS в Ethereum Beacon Chain
Ethereum перешёл на Proof-of-Stake (The Merge, сентябрь 2022), и BLS подписи стали **критической инфраструктурой** сети. На момент 2025 года в сети ~1 000 000 валидаторов. Каждые 12 секунд (один slot) случайный валидатор предлагает блок, а комитет из 128+ валидаторов должен его подтвердить (аттестовать).
**Bitfield** - битовая маска, где каждый бит показывает, подписал ли соответствующий валидатор из комитета. Это нужно, чтобы знать *кто именно* аттестовал, ведь агрегированная подпись не содержит информации об отдельных подписантах.
**Sync Committee** - ещё одно применение BLS в Ethereum. 512 валидаторов выбираются на ~27 часов и подписывают заголовки блоков. Их агрегированная подпись позволяет **лёгким клиентам** (телефоны, браузеры) проверять блоки без скачивания всей цепочки. Без BLS агрегации лёгкие клиенты были бы невозможны при таком количестве валидаторов.
Масштаб: за одну эпоху (32 слота) создаётся ~32 агрегированных аттестации. Каждая включает подписи от десятков тысяч валидаторов. Без BLS агрегации Beacon Chain потребовал бы в сотни раз больше пропускной способности - и Proof-of-Stake с миллионом валидаторов был бы практически нереализуем.
**Оптимизация при одинаковом сообщении**: когда все валидаторы подписывают одно и то же сообщение (аттестацию), верификация упрощается до 2 pairings вместо N+1. Мы агрегируем не только подписи, но и публичные ключи: `e(G, σ_agg) == e(pk_agg, H(m))`. Именно поэтому Ethereum группирует валидаторов в комитеты с одинаковым голосом.
BLS подписи всегда быстрее ECDSA, поэтому Ethereum перешёл на них
Верификация одной BLS подписи медленнее ECDSA в ~10 раз. Преимущество BLS - в агрегации: проверка сотен подписей одним вычислением
Если бы в Ethereum было 100 валидаторов, ECDSA работал бы быстрее. BLS окупается при масштабе: 1 000 000 валидаторов делают сотни тысяч подписей за эпоху, и без агрегации сеть не справилась бы с нагрузкой. BLS выбрали не за скорость отдельной подписи, а за O(1) размер агрегата.
Почему Ethereum группирует валидаторов в комитеты, где все подписывают одно и то же сообщение (аттестацию)?
Ключевые идеи
- **BLS подпись** - это точка на эллиптической кривой: `σ = sk * H(m)`, размер 48 байт. Короче ECDSA (65 байт), но медленнее в верификации (~10x)
- **Агрегация** - N подписей складываются в одну: `σ_agg = σ₁ + σ₂ + ... + σₙ`. Размер O(1) вместо O(N). Это ключевое преимущество над ECDSA и EdDSA
- **Bilinear pairing** `e(G₁, G₂) → G_T` - математическая основа BLS. Свойство `e(a·P, Q) = e(P, a·Q)` позволяет проверять подписи без знания приватного ключа
- **Ethereum Beacon Chain** агрегирует подписи комитетов валидаторов, превращая задачу «проверить миллион подписей» в «проверить одну». Именно BLS делает Proof-of-Stake с 1 000 000 валидаторов возможным - ту самую задачу из hook, которая казалась невозможной
Связанные темы
BLS подписи стоят на пересечении криптографии эллиптических кривых и протоколов консенсуса:
- Эллиптические кривые (ECC) — BLS строится поверх ECC - приватный/публичный ключ, скалярное умножение, группы точек
- Proof-of-Stake — BLS агрегация делает возможным PoS с миллионом валидаторов без взрыва трафика
- Gasper: консенсус Ethereum 2.0 — Gasper использует BLS для аттестаций в Casper FFG и LMD-GHOST fork choice
- The Merge — Переход Ethereum на PoS (сентябрь 2022) сделал BLS центральным элементом сети
Вопросы для размышления
- Если BLS позволяет агрегировать подписи, почему Bitcoin до сих пор использует ECDSA/Schnorr вместо BLS? Какие факторы помимо агрегации влияют на выбор схемы подписи?
- Pairing-based криптография считается уязвимой к квантовым компьютерам. Как Ethereum может мигрировать на пост-квантовые подписи, если вся архитектура Beacon Chain построена вокруг BLS агрегации?
- Rogue key attack показывает, что агрегация подписей порождает новые векторы атак. Какие ещё криптографические примитивы могут «ломаться» при переходе от одиночного использования к агрегированному?
Связанные уроки
- bc-07-ecc — BLS uses pairing-friendly elliptic curves; ECC fundamentals are required
- bc-06-digital-signatures — BLS is a signature scheme; classical signature concepts are prerequisite
- bc-09-threshold-crypto — BLS aggregation and threshold signatures are closely related; threshold concepts enrich BLS understanding
- bc-16-bft — Modern BFT protocols (Ethereum Casper, Hotstuff) use BLS to aggregate validator votes efficiently
- crypto-26-ecc-math