Детерминированные комиссии за транзакции
В настоящее время транзакции включают поле комиссии, которое указывает максимальное поле комиссии, которое лидер слота может взимать за обработку транзакции. Кластер, с другой стороны, соглашается на минимальную плату. Если сеть перегружена, слот-лидер может отдавать приоритет транзакциям, предлагающим более высокие комиссии. Это означает, что клиент не будет знать, сколько было собрано, пока кластер не подтвердит транзакцию и не проверит остаток. Пахнет именно тем, что нам не нравится в «газе» Эфириума, недетерминизмом.
Плата за перегрузку
Каждый валидатор использует сигнатур на слот (SPS) для оценки перегрузки сети и цель SPS для оценки желаемой вычислительной мощности кластера. Валидатор узнает цель SPS из конфигурации генезиса, тогда как он вычисляет SPS из недавно обработанных транзакций. Конфигурация генезиса также определяет цель lampports_per_signature
, которая представляет собой плату, взимаемую за подпись, когда кластер работает с целью SPS.
Расчет сборов
Клиент использует JSON RPC API, чтобы запросить у кластера текущие параметры платы. Эти параметры помечены хэшем блока и остаются в силе до тех пор, пока этот хэш блока не станет достаточно старым, чтобы быть отклоненным лидером слота.
Прежде чем отправить транзакцию в кластер, клиент может отправить данные транзакции и счета комиссии в модуль SDK, называемый калькулятором комиссии. Пока версия SDK клиента совпадает с версией лидера слота, клиент может быть уверен, что его учетная запись будет изменена точно на такое же количество лампортов, которое было возвращено калькулятором комиссий.
Параметры платы
В первой реализации этого дизайна единственным платным параметром является lampports_per_signature
. Чем больше подписей необходимо проверить кластеру, тем выше плата. Точное количество лампортов определяется отношением SPS к целевому значению SPS. В конце каждого слота кластер снижает значение lampports_per_signature
, когда SPS ниже целевого значения, и повышает его, когда оно превышает целевое значение. Минимальное значение для lamports_per_signature
составляет 50% от целевого значения lamports_per_signature
, а максимальное значение в 10 раз превышает целевое значение `lamports_per_signature'.
Будущие параметры могут включать:
lampports_per_pubkey
- стоимость загрузки аккаунтаlampports_per_slot_distance
- более высокая стоимость загрузки очень старых учетных записейlampports_per_byte
- стоимость загруженного размера учетной записиlampports_per_bpf_instruction
- стоимость запуска программы
Атаки
Перехват цели SPS
Группа валидаторов может централизовать кластер, если им удастся убедить его поднять цель SPS выше точки, за которой остальные валидаторы могут не отставать. Повышение целевого показателя приведет к снижению комиссий, что, по-видимому, создаст больший спрос и, следовательно, более высокий TPS. Если у валидатора нет оборудования, способного обрабатывать такое количество транзакций с такой скоростью, его голоса подтверждения в конечном итоге станут такими длинными, что кластер будет вынужден загрузить его.