Последние нападения были основаны на заполнение блоков с транзакциями.
Это происходит из-за предел размера блока. (Правило консенсуса, что размер_блок ниже 1 Мб)
Но есть еще пределы блока, которые не могут быть изменены без жесткой вилки.
Существует предел SIGOPS в операциях, включенных в блок.
consensus.h
Код:
/ ** Максимально допустимый размер для сериализованном блока в байтах (правило сети) * /
Статическая сопзЬ неподписанных INT MAX_BLOCK_SIZE = 1000000;
/ ** Максимально допустимое число проверочных операций подписи в блоке (правило сети) * /
статические Const беззнаковое INT MAX_BLOCK_SIGOPS = MAX_BLOCK_SIZE / 50;
Статическая сопзЬ неподписанных INT MAX_BLOCK_SIZE = 1000000;
/ ** Максимально допустимое число проверочных операций подписи в блоке (правило сети) * /
статические Const беззнаковое INT MAX_BLOCK_SIGOPS = MAX_BLOCK_SIZE / 50;
Так, MAX_BLOCK_SIGOPS 20000
Как клиент рассчитать количество SIGOPS? Давайте посмотрим на источники.
main.cpp
Код:
если (fStrictPayToScriptHash)
{
// Добавить в sigops сделанного оплаты за скрипт-хэш входы;
// это, чтобы предотвратить "изгоев шахтер" от создания
// невероятно дорогой к Validate блок.
nSigOps + = GetP2SHSigOpCount (ТХ, вид);
если (nSigOps > MAX_BLOCK_SIGOPS)
вернуться state.DoS (100, ошибка ("ConnectBlock (): слишком много sigops"),
REJECT_INVALID, "плохо-BLK-sigops");
}
{
// Добавить в sigops сделанного оплаты за скрипт-хэш входы;
// это, чтобы предотвратить "изгоев шахтер" от создания
// невероятно дорогой к Validate блок.
nSigOps + = GetP2SHSigOpCount (ТХ, вид);
если (nSigOps > MAX_BLOCK_SIGOPS)
вернуться state.DoS (100, ошибка ("ConnectBlock (): слишком много sigops"),
REJECT_INVALID, "плохо-BLK-sigops");
}
Miner узел включает в себя операции на блоке в то время как nSigOps не превышает 20000.
Блок с nSigOps > 20000 будет недействительным (правило консенсуса) и будет отвергнута всеми другими узлами.
Теперь давайте посмотрим на сделку
https://blockchain.info/tx/6766e75d6166a0a14bd814921d0f903285e15779e648d7ec52a4f7c0868ec07d
и вычислить количество SIGOPS в нем
Все входные скрипты дорожа из p2sh-выходов с внутренними скриптами построить на одном шаблоне:
Код:
OP_0
OP_IF
OP_15
OP_CHECKMULTISIG
OP_ENDIF
OP_SMALLINTEGER
Количество SIGOPS в этом небольшом сценарии 15 (это максимальное значение, чтобы передать IsStandard)OP_IF
OP_15
OP_CHECKMULTISIG
OP_ENDIF
OP_SMALLINTEGER
А общее количество SIGOPS в 6766e75d6166a0a14bd814921d0f903285e15779e648d7ec52a4f7c0868ec07d 15 * 15 = 225
Таким образом, максимальное количество таких операций в одном блоке только 88 (потому что пол (20000/225) = 88)
И вставляя 88 таких операций в одном блоке оставляет только 200 SIGOPS для регулярных сделок.
Который выходит из комнаты только для ~ 100 операций в блоке для других лиц
Вектор атаки должен быть:
1) создать и финансировать большое число таких p2sh-utxo
2) выкупить их OP_RETURN или обычный вывод
Каждая такая операция стоит 0,00045 для нечестных атакующего (может быть даже меньше)
88 сделок (атаковать один блок) будет стоить всего 0,0396 BTC
Ежедневная атака 5,7024 BTC - не большая сделка
Хотите нанять меня для этой грязной работы?