# Блок
Блок — звено цепочки блокчейна. Блок содержит транзакции, а также заголовок — поля, которые относятся к блоку в целом.
Заголовок блока содержит корневой хеш транзакций, который является доказательством того, что все транзакции присутствуют в блоке в заданном порядке. Заголовок блока также содержит хеш заголовка предыдущего блока в цепочке. Таким образом, все блоки в цепочке связаны с помощью криптографии. Это гарантирует целостность данных блокчейна: подмена данных в любом из блоков в истории сделала бы невалидными все последующие блоки, поэтому участники сети блокчейна отклонят подобные изменения.
# Генерация блоков
Генератором блоков может стать любая нода сети с балансом от 1000 WAVES — собственных или полученных в лизинг. Выбор генератора очередного блока осуществляется алгоритмом консенсуса Leased Proof of Stake (LPoS).
Новые блоки появляются на блокчейне Waves в среднем раз в минуту, однако транзакция попадает на блокчейн в среднем через 2 секунды благодаря уникальному механизму Waves-NG. Генератор текущего блока продолжает добавлять в него транзакции из UTX pool — пула транзакций, ожидающих попадания в блок, — до тех пор, пока не появится следующий блок (или не будет достигнуто ограничение на размер и сложность блока).
# Ограничения
Максимальный размер блока — 1 Мбайт.
Максимальная суммарная сложность скриптов в транзакциях блока — 2 500 000. Учитывается сложность всех исполняемых скриптов: скриптов dApp, аккаунтов и ассетов. (До активации фичи № 16 “Ride V5, dApp-to-dApp invocations” максимальная суммарная сложность скриптов составляла 1 000 000.)
# JSON-представление блока
REST API ноды предоставляет данные блока в формате JSON.
Пример JSON-представления:
{
"version": 5,
"timestamp": 1684931016547,
"reference": "7sG6CU6ZS38V9VEDW5bgrCVcPeF9zFpoC6PNV7guRfp1",
"nxt-consensus": {
"base-target": 167,
"generation-signature": "qm7dYre31XLfQtnKiF5PL2MYmyYvn3ZrqcdH94TkUkfBdVgTW5BxMAiwfHmywXX9yMhZE7H67snGiXq4LQaezPt5JV291Z9MTvPbNEDjtyHBxG216Xv69PcEug2Wpao7KyT"
},
"transactionsRoot": "6dxKpvH6mSXAXuyd2we3BhDoqDWRn7jpyP8kt1JcwncT",
"id": "27b4mbGgxYe8bcqPQy1ddwcg2DoYKaeX356QpZjkrhAM",
"features": [],
"desiredReward": -1,
"generator": "3PA1KvFfq9VuJjg45p2ytGgaNjrgnLSgf4r",
"generatorPublicKey": "EFgn12TgFqn3cRthHnLAPr11g7urqchXEpjGspgLYskc",
"stateHash": "Diz914FQYj6QUUhUoWByUyLrQKE8BaKCmtoiNZBzvbUu",
"signature": "22m2xEzPgh1E29nKJJwJ6h7hoRxoLEQnE4Eh4Mcfyx4sTn3DEeBHMZ4Rda7jhGeTBUgcnNdtUmm3dzzMXb8aVsMg",
"blocksize": 15265,
"transactionCount": 25,
"height": 3657525,
"totalFee": 8900000,
"reward": 600000000,
"rewardShares": {
"3PA1KvFfq9VuJjg45p2ytGgaNjrgnLSgf4r": 600000000
},
"VRF": "9YyxDdJdzGJ3aSPSZ2BP3HXU3JAj2wR2B9znGT7g5rre",
"fee": 8900000,
"transactions": [
...
]
]
}
Поле | Описание |
---|---|
version | Версия блока: 5 для всех блоков с момента активации фичи № 15 “Ride V4, VRF, Protobuf, Failed transactions” |
timestamp | Временная метка блока: Unix-время в миллисекундах. Когда нода получает новый блок из сети блокчейна, она проверяет, что временная метка блока не опережает текущее время более чем на 100 миллисекунд |
reference | Идентификатор предыдущего блока |
nxt-consensus.base-target | Параметр, который регулирует среднее время между блоками, приближая его к 60 секундам. Подробнее в разделе Leased Proof-of-Stake |
nxt-consensus.generation-signature | Параметр, используемый при расчете времени, которое генератор должен выждать после предыдущего блока, прежде чем получит право выпустить свой блок. Подробнее в разделе Leased Proof-of-Stake |
transactionsRoot | Корневой хеш транзакций блока (Merkle Root Hash). Является доказательством того, что все транзакции присутствуют в блоке в заданном порядке, поэтому достаточно подписывать только заголовок блока. Подробнее в разделе Корневой хеш транзакций |
id | Идентификатор блока: хеш BLAKE2b-256 заголовка блока |
features | Список идентификаторов фич, поддерживаемых генератором блока. Подробнее в разделе Протокол активации |
desiredReward | Желаемый размер вознаграждения за блок, установленный генератором блока, в WAVELET. Если значение больше текущего размера вознаграждения, то блок голосует за увеличение вознаграждения; если меньше — за уменьшение. Значение по умолчанию -1 соответствует голосу за сохранение текущего размена вознаграждения. Подробнее в разделе Монетарная политика, управляемая сообществом |
generator | Адрес генератора блока: байты в кодировке base58 |
generatorPublicKey | Открытый ключ генератора блока: байты в кодировке base58 |
signature | Цифровая подпись байтов заголовка блока, сформированная с использованием закрытого ключа генератора блока |
blocksize | Размер блока в байтах |
transactionCount | Количество транзакций в блоке |
height | Высота (порядковый номер) блока |
totalFee | Суммарная комиссия за транзакции в блоке, включая комиссию, указанную в спонсорских ассетах, в пересчете на WAVELET |
reward | Вознаграждение за блок в WAVELET |
rewardShares | Адреса получателей вознаграждения за блок и полученные суммы в WAVELET |
VRF | Параметр, используемый при расчете времени, которое генератор должен выждать после предыдущего блока, прежде чем получит право выпустить свой блок. Подробнее в разделе Leased Proof-of-Stake |
fee | Комиссия за транзакции в блоке без учета комиссии в спонсорских ассетах |
transactions | Список транзакций, включенных в блок. Описание полей см. в разделе Транзакция |
stateHash | Хеш изменений состояния блокчейна, порожденных транзакциями блока. Подробнее в разделе Waves 1.5: легкая нода. Поле доступно с момента активации фичи № 22 “Light Node” |
challenged_header | Поля заголовка оспоренного блока, в случае если данный блок оспаривает другой. Подробнее в разделе Waves 1.5: легкая нода. Поле доступно с момента активации фичи № 22 “Light Node” |
# Получение данных блока
Получить заголовок блока или блок целиком можно по его идентификатору или высоте (порядковому номеру):
- В Waves Explorer.
- С помощью методов REST API ноды.
# Бинарный формат блока
См. раздел Бинарный формат блока.