Почему одни данные в смарт-контракте дорогие, а другие почти ничего не стоят
В Solidity часто встречаются три слова:
storage, memory и calldata.
Они описывают, где находятся данные во время работы смарт-контракта.
И от этого сильно зависит стоимость операции.
Storage — постоянная память контракта.
Если контракт записал туда значение, оно остаётся в состоянии Ethereum после завершения транзакции. Например, баланс пользователя, владелец объекта или параметр протокола.
Это самая дорогая память, потому что изменение storage влияет на состояние блокчейна и его должны учитывать узлы сети. Официальная документация Ethereum отдельно отмечает высокую стоимость постоянного хранения.
Memory — временная рабочая память.
Контракт использует её только во время выполнения конкретного вызова. После завершения операции эти данные исчезают.
Можно представить лист бумаги, на котором программа делает промежуточные расчёты.
Calldata — входные данные вызова.
Например, когда пользователь вызывает функцию transfer, адрес получателя и сумма приходят контракту как входные параметры. Calldata предназначена прежде всего для чтения во время выполнения и не превращается автоматически в постоянное состояние.
Зачем вообще знать эту разницу?
Потому что грамотный контракт не должен сохранять навсегда всё, что ему попадается.
Представим калькулятор.
Чтобы посчитать 17 × 24, ему не нужно навечно записывать числа 17 и 24 в глобальную базу. Они нужны только во время расчёта.
Если каждое временное значение Ethereum сохранял бы навсегда, состояние сети росло бы гораздо быстрее.
Поэтому разработчики стараются использовать постоянный storage только там, где информация действительно должна пережить текущую транзакцию.
Можно провести аналогию с офисом.
Storage — архив компании.
Memory — рабочий стол сотрудника.
Calldata — документ, который ему дали прочитать для выполнения текущей задачи.
Если совсем просто, Ethereum делает постоянную память дорогой именно потому, что она становится долгосрочным грузом для сети.
#КартаEthereum #Ethereum #Solidity #Storage #смартконтракты
В Solidity часто встречаются три слова:
storage, memory и calldata.
Они описывают, где находятся данные во время работы смарт-контракта.
И от этого сильно зависит стоимость операции.
Storage — постоянная память контракта.
Если контракт записал туда значение, оно остаётся в состоянии Ethereum после завершения транзакции. Например, баланс пользователя, владелец объекта или параметр протокола.
Это самая дорогая память, потому что изменение storage влияет на состояние блокчейна и его должны учитывать узлы сети. Официальная документация Ethereum отдельно отмечает высокую стоимость постоянного хранения.
Memory — временная рабочая память.
Контракт использует её только во время выполнения конкретного вызова. После завершения операции эти данные исчезают.
Можно представить лист бумаги, на котором программа делает промежуточные расчёты.
Calldata — входные данные вызова.
Например, когда пользователь вызывает функцию transfer, адрес получателя и сумма приходят контракту как входные параметры. Calldata предназначена прежде всего для чтения во время выполнения и не превращается автоматически в постоянное состояние.
Зачем вообще знать эту разницу?
Потому что грамотный контракт не должен сохранять навсегда всё, что ему попадается.
Представим калькулятор.
Чтобы посчитать 17 × 24, ему не нужно навечно записывать числа 17 и 24 в глобальную базу. Они нужны только во время расчёта.
Если каждое временное значение Ethereum сохранял бы навсегда, состояние сети росло бы гораздо быстрее.
Поэтому разработчики стараются использовать постоянный storage только там, где информация действительно должна пережить текущую транзакцию.
Можно провести аналогию с офисом.
Storage — архив компании.
Memory — рабочий стол сотрудника.
Calldata — документ, который ему дали прочитать для выполнения текущей задачи.
Если совсем просто, Ethereum делает постоянную память дорогой именно потому, что она становится долгосрочным грузом для сети.
#КартаEthereum #Ethereum #Solidity #Storage #смартконтракты