В солидности,storage
иmemory
это два разныххранилище Расположение,Они имеют разное использование и функции. Понимание разницы между ними имеет решающее значение для написания эффективного и безопасного смарт-контракта.
storage
Является постоянной зоной хранения смарт-контракта. Объявленные здесь переменные будут сохранены в блокчейне Ethereum.memory
Это временная область хранилища, используемая во время выполнения смарт-контракта. После завершения выполнения функции данные в памяти будут удалены.Ниже приведен простой Примерпоказать, как В солидности Дифференцированное использованиеstorage
иmemory
。
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
середина,Затем произведите расчет и дайте результатхранилищеразstorage
。get
функцияэто просмотрstorage
вценить,и вернулся к звонившему.
storage
середина При чтении данных,Если используется только временно,может бытькопироватьприезжатьmemory
середина Процесс,для улучшения производительности.memory
серединаструктурахорошийвозвращаемое значение и возврат.memory
середина。storage
середина。пониматьstorage
иmemory
разницаиспользовать,Это может помочь нам написать более оптимизированный код смарт-контракта.,В то же время можно лучше управлять расходами на газ.
storage
иmemory
Подходящие сценарии примененияstorage
в Данные постоянны,Даже если исполнение смарт-контракта закончится,Данные все еще существуют в блокчейне.storage
Операции чтения и записи приведут к относительновысокийизgasрасходы,Потому что это связано с изменением состояния блокчейна.storage
из速度相вернопомедленнее,Потому что требуются хэш-вычисления и другие операции с хранилищем.переменные состояния:
Хранит переменные состояния смарт-контрактов, такие как балансы, информацию о собственности, карты и т. д.
Пример:
uint256 public balance;
mapping(address => uint256) public balances;
Карты:
Храните данные пары ключ-значение, такие как балансы счетов, информацию о пользователях и т. д.
Пример:
mapping(address => uint256) public balances;
множество:
Храните данные, которые необходимо сохранять в течение длительного времени, например списки пользователей, записи транзакций и т. д.
Пример:
address[] public users;
Структуры:
Храните сложные структуры данных, требующие постоянного хранения, такие как информация о пользователе, сведения о заказе и т. д.
Пример:
struct User {
address userAddress;
uint256 balance;
bool isActive;
}
User[] public users;
Статус контракта:
Хранит информацию о состоянии контракта, например, активен ли контракт, номер версии контракта и т. д.
Пример:
bool public isActive;
uint256 public version;
memory
в数据是临时из,После исполнения смарт-контракта,Эти данные будут удалены.memory
Сравниватьиспользоватьstorage
расходы Низкий,Потому что никаких постоянных изменений состояния не требуется.memory
из速度相верно Быстрее,Потому что никаких дополнительных вычислений хеша не требуется.параметры функции:
Хранит входные параметры функции, которые обычно используются только во время выполнения функции.
Пример:
function add(uint256 a, uint256 b) public pure returns (uint256) {
return a + b;
}
локальные переменные:
Сохраняйте локальные переменные во время выполнения функции. Эти переменные обычно используются только во время выполнения функции.
Пример:
function multiply(uint256 a, uint256 b) public pure returns (uint256) {
uint256 result = a * b;
return result;
}
возвращаемое значение:
структуравозвращаемое значение,обычно требуетсясуществоватьmemory
середина构建хорошийвозвращаемое Возврат после значения.
Пример:
function getUsers() public view returns (address[] memory) {
address[] memory users = new address[](3);
users[0] = 0x123...;
users[1] = 0x456...;
users[2] = 0x789...;
return users;
}
Промежуточные результаты расчета:
Сохраняет промежуточные результаты вычислений во время выполнения функции. Эти результаты обычно используются только во время выполнения функции.
Пример:
function calculate(uint256 a, uint256 b) public pure returns (uint256) {
uint256 intermediateResult = a + b;
return intermediateResult * 2;
}
временный объект:
Хранит временные объекты или структуры, которые обычно используются только во время выполнения функции.
Пример:
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
Можно не только упомянутьвысокийсмарт-контрактпроизводительность,Это также может снизить затраты на газ.,Тем самым повышая общую эффективность смарт-контракта.