Подробное объяснение функций хранения и памяти в смарт-контрактах.
Подробное объяснение функций хранения и памяти в смарт-контрактах.

В солидности,storageиmemoryэто два разныххранилище Расположение,Они имеют разное использование и функции. Понимание разницы между ними имеет решающее значение для написания эффективного и безопасного смарт-контракта.

Основные понятия

Хранилище
  • определение: storage Является постоянной зоной хранения смарт-контракта. Объявленные здесь переменные будут сохранены в блокчейне Ethereum.
  • использовать: Используется для данных, которые необходимо сохранять в течение длительного времени, например данных контракта. состояния、Карты、множествождать。
  • Скорость доступа: по сравнению с памятью,Медленный доступ к хранилищу,Потому что для этого требуется вычисление хэша и операции чтения и записи хранилища в блокчейне.
  • расходы: Операции чтения и записи в хранилище повлекут за собой более высокие затраты на газ, поскольку они предполагают изменения состояния в блокчейне.
Память
  • определение: memory Это временная область хранилища, используемая во время выполнения смарт-контракта. После завершения выполнения функции данные в памяти будут удалены.
  • использовать: Используется для промежуточных данных во время выполнения функции хранилища, таких как параметры. функции、локальные переменные、возвращаемое значениеждать。
  • Скорость доступа: Доступ к памяти происходит быстрее, поскольку не требует дополнительных хэш-вычислений.
  • расходы: Использование памяти дешевле, чем использование хранилища, поскольку оно не требует постоянных изменений состояния.
Пример

Ниже приведен простой Примерпоказать, как В солидности Дифференцированное использованиеstorageиmemory

Язык кода:javascript
копировать
contract Example {
    uint256 public storedValue; // хранилище Переменные в хранилище

    function set(uint256 value) public {
        uint256 memory v = value * 2; // хранилищесуществоватьmemoryвлокальные переменные
        storedValue = v; // Сохраните результаты расчета в хранилище
    }

    function get() public view returns (uint256) {
        return storedValue; // Возвращает значение хранилища в хранилище.
    }
}

В этом примере,storedValueэтохранилищесуществоватьstorageвобщественныйпеременные состояния。setфункцияполучить параметрvalue,Этот параметркопироватьприезжатьmemoryсередина,Затем произведите расчет и дайте результатхранилищеразstoragegetфункцияэто просмотрstorageвценить,и вернулся к звонившему.

На что следует обратить внимание
  • Когда изstorageсередина При чтении данных,Если используется только временно,может бытькопироватьприезжатьmemoryсередина Процесс,для улучшения производительности.
  • При возврате сложных типов, таких как множество или структуры,Обычно необходимо сначаласуществоватьmemoryсерединаструктурахорошийвозвращаемое значение и возврат.
  • Если переменную необходимо использовать только во время выполнения функции,тогда его надо выпуститьсуществоватьmemoryсередина。
  • Для переменных состояний (то есть постоянных данных контракта),должен быть освобожденсуществоватьstorageсередина。

пониматьstorageиmemoryразницаиспользовать,Это может помочь нам написать более оптимизированный код смарт-контракта.,В то же время можно лучше управлять расходами на газ.

storageиmemoryПодходящие сценарии применения

Хранилище
Функции
  • упорство: хранилищесуществоватьstorageв Данные постоянны,Даже если исполнение смарт-контракта закончится,Данные все еще существуют в блокчейне.
  • высокийрасходы: верноstorageОперации чтения и записи приведут к относительновысокийизgasрасходы,Потому что это связано с изменением состояния блокчейна.
  • медленный доступ: доступstorageиз速度相вернопомедленнее,Потому что требуются хэш-вычисления и другие операции с хранилищем.
Применимые сценарии

переменные состояния:

Хранит переменные состояния смарт-контрактов, такие как балансы, информацию о собственности, карты и т. д.

Пример:

Язык кода:javascript
копировать
uint256 public balance;
mapping(address => uint256) public balances;

Карты:

Храните данные пары ключ-значение, такие как балансы счетов, информацию о пользователях и т. д.

Пример:

Язык кода:javascript
копировать
mapping(address => uint256) public balances;

множество:

Храните данные, которые необходимо сохранять в течение длительного времени, например списки пользователей, записи транзакций и т. д.

Пример:

Язык кода:javascript
копировать
address[] public users;

Структуры:

Храните сложные структуры данных, требующие постоянного хранения, такие как информация о пользователе, сведения о заказе и т. д.

Пример:

Язык кода:javascript
копировать
struct User {
    address userAddress;
    uint256 balance;
    bool isActive;
}
User[] public users;

Статус контракта:

Хранит информацию о состоянии контракта, например, активен ли контракт, номер версии контракта и т. д.

Пример:

Язык кода:javascript
копировать
bool public isActive;
uint256 public version;
Память
Функции
  • Временный: хранилищесуществоватьmemoryв数据是临时из,После исполнения смарт-контракта,Эти данные будут удалены.
  • Низкийрасходы: использоватьmemoryСравниватьиспользоватьstorageрасходы Низкий,Потому что никаких постоянных изменений состояния не требуется.
  • высокоскоростной доступ: доступmemoryиз速度相верно Быстрее,Потому что никаких дополнительных вычислений хеша не требуется.
Применимые сценарии

параметры функции:

Хранит входные параметры функции, которые обычно используются только во время выполнения функции.

Пример:

Язык кода:javascript
копировать
function add(uint256 a, uint256 b) public pure returns (uint256) {
    return a + b;
}

локальные переменные:

Сохраняйте локальные переменные во время выполнения функции. Эти переменные обычно используются только во время выполнения функции.

Пример:

Язык кода:javascript
копировать
function multiply(uint256 a, uint256 b) public pure returns (uint256) {
    uint256 result = a * b;
    return result;
}

возвращаемое значение:

структуравозвращаемое значение,обычно требуетсясуществоватьmemoryсередина构建хорошийвозвращаемое Возврат после значения.

Пример:

Язык кода:javascript
копировать
function getUsers() public view returns (address[] memory) {
    address[] memory users = new address[](3);
    users[0] = 0x123...;
    users[1] = 0x456...;
    users[2] = 0x789...;
    return users;
}

Промежуточные результаты расчета:

Сохраняет промежуточные результаты вычислений во время выполнения функции. Эти результаты обычно используются только во время выполнения функции.

Пример:

Язык кода:javascript
копировать
function calculate(uint256 a, uint256 b) public pure returns (uint256) {
    uint256 intermediateResult = a + b;
    return intermediateResult * 2;
}

временный объект:

Хранит временные объекты или структуры, которые обычно используются только во время выполнения функции.

Пример:

Язык кода:javascript
копировать
struct Order {
    uint256 id;
    address buyer;
    uint256 price;
}

function createOrder(uint256 id, address buyer, uint256 price) public pure returns (Order memory) {
    Order memory order = Order(id, buyer, price);
    return order;
}
Подвести итог
  • storage Подходит для данных, которые необходимо сохранить, например переменные. состояния、картографирование、множество、Структура и т. д.
  • memory Подходит для временных данных хранилища, таких как параметры. функции、локальные переменные、возвращаемое значение、Промежуточные результаты расчетаждать。

В целом правильноиспользоватьstorageиmemoryМожно не только упомянутьвысокийсмарт-контрактпроизводительность,Это также может снизить затраты на газ.,Тем самым повышая общую эффективность смарт-контракта.

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.