Краткое изложение методов оценки и оптимизации газа смарт-контракта
Краткое изложение методов оценки и оптимизации газа смарт-контракта

фон

Хранение 256-битных данных в Ethereum потребляет около 20 тысяч газа. При этом преобразовании только 1 ГБ ресурсов хранения стоит 32 000 ETH, что составляет примерно более 100 миллионов долларов США. Не говоря уже о том, что плата за газ аристократической сети, вероятно, будет продолжать расти. В первые годы ее потребление газа было немалым. Таким образом, оптимизация Ethereum Gas является сложной проблемой при разработке Dapp, а также важным навыком для разработчиков Solidity.

метод оценки газа

Посмотреть газ в etherscan

Просмотрите общую сумму газа и цену, потраченную на транзакцию, просмотрите ее непосредственно в деталях транзакции.

Просмотрите трассировку транзакции и нажмите «Отслеживание четности» в сведениях о транзакции. Вы можете увидеть газ каждой внутренней транзакции, в основном вызова, вызова делегата и т. д.

Выберите geth Trace, чтобы увидеть потребление газа на уровне кода операции.

Посмотреть газ в ремиксе

в ремиксеосновнойсуществовать Результаты выполнения транзакцииconsoleсередина Проверять。

Transaction Cost На основе стоимости отправки данных в блокчейн. Все трансакционные издержки 4 Состав предмета:

  1. Сделка из базовой стоимости (21000 Gas)
  2. Стоимость развертывания контракта (32 000 газа)
  3. торговляиз Каждыйиндивидуальныйнулевой байтданные или кодизрасходы。
  4. торговляиз Каждыйиндивидуальный Нетнулевой байт данных или кода из стоимости.

Execution Cost Стоимость основана на вычислительных операциях, выполненных на EVM в результате транзакции.

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

Посмотреть газ в каске

Печать газа одной транзакции

Hardhat не будет напрямую передавать статус газа. При выполнении контракта развертывания и взаимодействия с контрактом вы обычно можете получить квитанцию ​​через хеш транзакции в обещании и получить результат из квитанции.

Сделки взаимодействия по контракту:

Язык кода:javascript
копировать
  let res = await contract.mint(user.address, 10000);
  let receipt = await hre.ethers.provider.getTransactionReceipt(res.hash);

  console.log("gas used: ", receipt.gasUsed);
  console.log("gas*price: ", receipt.gasUsed.mul(receipt.effectiveGasPrice));

Развертывание транзакции контракта:

Язык кода:javascript
копировать
let res = await contract.deployed();

let receipt = await hre.ethers.provider.getTransactionReceipt(
  res.deployTransaction.hash
);

console.log("gas used: ", receipt.gasUsed);
console.log("gas*price: ", receipt.gasUsed.mul(receipt.effectiveGasPrice));

Расчетный транзакционный газ (Оценочный газ)

Язык кода:javascript
копировать
let ContractFactory = await hre.ethers.getContractFactory("ActivityToken");
let Contract = await ContractFactory.deploy("ActivityToken", "AT");

// Оценивать Развернуть газ, не очень точно, лучшего способа пока нет
console.log(
  "Deploy Estimated gas:",
  await ethers.provider.estimateGas(contractFactory.bytecode)
);

let res = await contract.deployed();

// Расчетный колл-контракт изгаз
console.log(
  "Mint estimated Gas: ",
  await contract.estimateGas.mint(deployer.address, 100000)
);

Создание отчета о газе (под командой тестирования)

существоватькаскасерединаосновнойдаиспользоватьhardhat-gas-reporterплагин,Может существовать при запуске модульных тестов,Одновременно формируется отчет об исполнении газа. В отчете середина вы также можете увидеть средний расход газа в процессе тестирования середина для каждой отдельной функции.,Процесс развертывания потребляет газ.

Hardhat Gas Reporter — это плагин Hardhat, который можно использовать для отображения использования газа каждой функцией контракта в консоли, а также использования газа для всего контракта. Вот шаги по использованию Hardhat Gas Reporter:

  1. Установите Hardhat Gas Reporter: включить
Язык кода:shell
копировать
npm install --save-dev hardhat-gas-reporter
  1. Конфигурация Каска: существовать Hardhat В корневом каталоге проекта откройте hardhat.config.js. файл и добавьте следующий контент:
Язык кода:javascript
копировать
require("hardhat-gas-reporter");
module.exports = {
  gasReporter: {
    currency: 'CHF',
    gasPrice: 21
  }
}

Эффект следующий:

  1. Рассчитывайте цены в режиме реального времени нравиться Заполните результатcoinmarketcapизapikey,Плагин также может получать цену токена в режиме реального времени.,Для конвертации цены в доллары США заполните форму середина
Язык кода:json
копировать
gasReporter: {
    //doc:https://github.com/cgewecke/eth-gas-reporter
    enabled: true,

    currency: "USD", //Евро по умолчанию, Дополнительно доллары США, CNY, HKD
    // Токеном по умолчанию является ETH, Если вы перейдете на другой, вы найдете цену на coinmarketcap в режиме реального времени.
    // token: "MATIC",
    coinmarketcap: "59a52916-XXXX-XXXX-XXXX-2d6f56917aee", //https://coinmarketcap.com/

    // По умолчанию из eth gas station api середина, чтобы получить цену eth. Для других токенов вы можете ввести gasPrice самостоятельно (рекомендуется). Или заполните gasPriceAPI (обратите внимание на ограничения вызова)
    // gasPrice: 30,
    // gasPriceApi:"https://api.etherscan.io/api?module=proxy&action=eth_gasPrice",
  },

https://www.npmjs.com/package/hardhat-gas-reporter

метод оптимизации газа

Основы оптимизации газа

Базовая формула расчета ГАЗ:

gas = txGas + dataGas + opGas Если транзакция не создает новый контракт, txGas 21000, иначе txGas 53000. Каждый нулевой байт данных в транзакции стоит 4 индивидуальный gas,Каждыйиндивидуальный Нетнулевой байт стоит 16 индивидуальный газ. opGas означает работу всех op необходимый gas。

Вообще говоря, у opGas больше возможностей для оптимизации.

Контрактное потребление газа:

  • Транзакционный газ (Транзакционный газ): Каждый контракт на транзакцию стоит изгаза.
  • Развернуть газ (Deployment Gas): При развертывании этого контракта взимается единовременная стоимость газа.

При оценке газа часто приходится идти на компромисс между двумя вышеперечисленными вариантами.

Газ, используемый различными операциями

Язык кода:txt
копировать
Operation         Gas           Description

ADD/SUB           3             Arithmetic operation
MUL/DIV           5             Arithmetic operation
ADDMOD/MULMOD     8             Arithmetic operation
AND/OR/XOR        3             Bitwise logic operation
LT/GT/SLT/SGT/EQ  3             Comparison operation
POP               2             Stack operation 
PUSH/DUP/SWAP     3             Stack operation
MLOAD/MSTORE      3             Memory operation
CALLDATALOAD      3             Calldata operation
JUMP              8             Unconditional jump
JUMPI             10            Conditional jump
SLOAD             100/2100      Storage operation (Горячий доступ/холодный доступ)
SSTORE            5,000/20,000  Storage operation
BALANCE           400           Get balance of an account
CREATE            32,000        Create a new account using CREATE
CALL              25,000        Create a new account using CALL

 
KECCAK256     gas_cost = 30 + 6 * data_size_words + mem_expansion_cost
LOG     gas_cost = 375 + 375 * num_topics + 8 * data_size + mem_expansion_cost

Посмотреть подробности:https://ethereum.org/en/developers/docs/evm/opcodes/

Оптимизатор Solidity (Оптимизатор)

Введение в оптимизатор

На данный момент у Solidity есть два оптимизатора:

  • На основе оптимизатора кода операции: выполнить набор упрощенных правил для кода операции.,Очистите бесполезный код. Работа с ассемблерным кодом,существовать JUMPs и JUMPDESTs Разделите последовательность инструкций на базовые блоки.,Затем выполните анализ оптимизации выражения для каждого отдельного блока.,выражение нравиться можно упростить,Или извлеките общее подвыражение,Просто измените итерацию.
  • По мотивам Юла Оптимизатор IRиз: Можетчерезфункция Работа,сильнеебольшой,Функции могут быть встроенными,Отрегулируйте порядок,Объедините или перепишите, чтобы устранить избыточность. Для оптимизатора yul имеется множество индивидуальных модулей.,Последовательность между несколькими модулями также можно обработать самостоятельно.

ссылка:

https://docs.soliditylang.org/zh/v0.8.19/internals/optimizer.html Документация оптимизатора

https://docs.soliditylang.org/zh/v0.8.19/yul.html# Документация по языку Yul

https://learnblockchain.cn/article/6064 Юл Руководство по началу работы

Как включить оптимизатор

При использовании команды solc:

В настоящее время --optimize запускает оптимизатор на основе опкода для оптимизации байт-кода, а также запускает оптимизатор Yul для оптимизации внутренне сгенерированного кода Yul.

Используйте solc --ir-optimized --optimize для создания оптимизированного Yul IR, соответствующего исходному коду Solidity.

Используйте solc --strict-assembly --optimize, чтобы включить специализированную оптимизацию режима Yul.

При использовании каски:

плагин Поддерживает только Конфигурацияoptimizerодининдивидуальныйвыбирать , то есть вы не можете выбрать такие параметры, как ИК-оптимизация, и в настоящее время это режим оптимизации по умолчанию.

Язык кода:javascript
копировать
module.exports = {
  solidity: {
    version: "0.8.9",
    settings: {
      optimizer: {
        enabled: false,
        runs: 200,
      },
    },
  },
};

Понимание параметров запусков

Количество запусков ( --optimize-runs ) грубо оговаривается, что в течение срока действия договора (под которым можно понимать 1 год), Развернутый код каждого отдельного кода операции выполняется с определенной частотой. Это означает, что это компромиссный параметр между стоимостью выполнения кода (стоимостью развертывания) и стоимостью выполнения кода (стоимостью после развертывания). одининдивидуальный "бегать" Параметры “1” Будет создавать короткие контракты, но дорогой код выполнения. Напротив,одининдивидуальныйсравниватьбольшойиз "бегать" Параметры приведут к увеличению размера контрактов, но к более эффективному использованию кода выполнения. Максимальное значение этого параметра составляет 2^32-1。

Обратите внимание, что количество запусков не означает, что чем больше, тем лучше, и это не означает, сколько выполняется итераций оптимизации.

Простое понимание состоит в том, что прогоны — это эвристический параметр, определяющий, следует ли встраивать их. Чем больше прогонов, тем больше вероятность встраивания.

слой кодаметод оптимизации газа:

Используйте неизменяемые и постоянные

Язык кода:javascript
копировать
uint256 public v1;
uint256 public constant v2 = 1000;
function calculate() returns (uint256 result) {
    return v1 * v2 * 10000
}

В настоящее время v2 и 10000 являются членами байт-кода, а v1 является членом переменной состояния.

Каждое чтение v1 требует дополнительной загрузки, которая будет стоить 200 газа.

Модификатор функции указывает внешний, просмотр, чистый

Для внешнего:

публичная модификация равна внешней+внутренней , нравиться Если только указаноextenral,Эта отдельная функция из параметра не нуждается в хранении в памяти существования середина.,Вместо этого читайте непосредственно из calldataсередина., Напротив, если параметры публичной функции хранятся в памяти.

поэтому,Не используйте public, когда можно использовать external.

Этот метод оптимизации особенно эффективен для функции сравнения параметров.

Для просмотра в чистом виде:

Представление не изменит никакого состояния в блокчейне, но следует отметить, что только функция внешнего просмотра или функция публичного просмотра бесплатны, когда она вызывается извне. При вызове в транзакции по-прежнему требуются обычные вычеты. С чистым ситуация аналогичная.

Используйте сопоставление вместо массива

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

Если логика определяет длину массива, вы также можете использовать массив фиксированной длины.

Тип данных параметра calldata лучше памяти, чем хранилища.

Если содержимое параметра не изменяется и данные только читаются, приоритет отдается calldata. Потребление данных вызова в основном такое же, как и потребление памяти. Однако все входные параметры уже занимают хранилище в виде данных вызова. Если оно указано как память, данные данных вызова будут скопированы, и их индекс будет сохранен в памяти, которая будет сохранена. дополнительные ресурсы в этой части стоят дороже.

Язык кода:solidity
копировать
// calldata
function func2 (uint[] calldata nums) external {
 for (uint i = 0; i < nums.length; ++i) {
    ...
 }
}

// Memory
function func1 (uint[] memory nums) external {
 for (uint i = 0; i < nums.length; ++i) {
    ...
 }
}

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

Язык кода:solidity
копировать
//После оптимизации
uint sum = 0;
 function p3 ( uint x ){
     for ( uint i = 0 ; i < x ; i++)
         sum += i; }

//После оптимизации       
uint sum = 0;
 function p3 ( uint x ){
     uint temp = 0;
     for ( uint i = 0 ; i < x ; i++)
         temp += i; }
     sum += temp;

Удалите неиспользуемые переменные и получите возмещение за газ

Язык кода:solidity
копировать
//Using delete keyword
delete myVariable;

//Or assigning the value 0 if integer
myInt = 0;

//Следующие действия очистят исходное значение переменной состояния середина;
myAddresses = new address[](0);

что такое газ refund 1. Звонок по договору selfdestruct Уничтожить или отменить контракт sstore Вы можете получить его, изменив значение переменной состояния с ненулевого на пустое. gas возвращаться. 2. gas Возврат не означает, что баланс Ethereum на счету увеличится, это просто означает, что стоимость транзакции gas Сумма уменьшится. газ Лимит возврата индивидуален, что не является могу превышает текущую стоимость транзакции gas из 50%, если оно превышает, нажмите 50% Рассчитайте. 3. gas Возврат не означает, что баланс на счету инициатора транзакции может быть уменьшен, и проверка баланса по-прежнему основана на gas price * gas limit。

Эффективное использование целочисленных типов размера

Отдельные индивидуальные переменные должны иметь значение unit256, насколько это возможно,поскольку EVM обрабатывает 32 байта за одну операцию, для uint8иbooliz также необходимо заполнить данные,Необходимо больше газа. (Использование uint256 уменьшит проблемы с преобразованием типов и совместимостью)

толькосуществовать При постоянном хранении,Особенно если поставить структуру середина,Структура действительнаиспользовать Маленький,В это время нужно обратить внимание на выравнивание и порядок памяти.

Язык кода:solidity
копировать
contract Leggo {
  uint128 a;  
  uint128 c;  
  uint256 b; 
}

Понимание: что такое переменная очистка

Очистка переменных (Очистка Up Variables): когдаодининдивидуальныйценитьиз Количество занятых цифр Маленький В32индивидуальныйбайт,Чтосерединабесполезныйизбит будет очищен。无论да加载到Памятьсерединаили естьсуществоватьхранилищесередина,городэтотсделай это, В противном случае это повлияет на расчет.hashили сгенерироватьcalldataи тому подобноеизлогика。

https://docs.soliditylang.org/zh/v0.8.16/internals/variable_cleanup.html

По этой же причине byte[] эффективность также низкая из-за очистки переменных. Попробуйте вместо этого использоватьbytes32 или другие байтыX.

Та же причина в том, что строка нравиться, если ее длина меньше 32, Также рассмотрите возможность использования вместо этого byteX.

Язык кода:solidity
копировать
// 599 gas
function useString() public returns(string memory a) {
  a = "hello world!";
}
// 196 gas
function useByte() public returns(bytes32 a) {
  a = bytes32("hello world!");
}

Обработка ошибок, используйте Error подробнее

Замените require(isOwner(msg.sender), "Unauthorized") на if (!isOwner(msg.sender)){revert Unauthorized();}, чтобы уменьшить количество информации о возврате.

Измените порядок функций*

Поскольку сигнатура функции другая,При вызове функции,EVM должен помочь вам найти функции,Итак, согласно сигнатуре функции из числового значения Большой Маленький,Если вы найдете первым, это будет стоить меньше газа.,После нахождения из, это будет стоить больше газа.,Поэтому для особо часто вызываемых функций,нас Может Рассмотрите корректировки Чтоприоритет。 Также обратите внимание,что общедоступные переменные состояния также участвуют в поисковых вычислениях (т. е. uint256 public a иметьодининдивидуальный a() функция).

в заключение:

  • Сократить количество членов общественности, constantнравиться Внешнее чтение не требуется и может быть установлено наprivate;
  • Часто используемые функции корректируют свой приоритет путем «переименования»;

ссылка:

https://medium.com/joyso/solidity-how-does-function-name-affect-gas-consumption-in-smart-contract-47d270d8ac92

Сжатие входных данных

существовать Сколькоиндивидуальныйinputпараметр, Вклад организации можно увидеть данные представляют собой группу из 32 байтов.

Язык кода:txt
копировать
Function: trade(address tokenGet, uint256 amountGet, address tokenGive, uint256 amountGive, uint256 expires, uint256 nonce, address user, uint8 v, bytes32 r, bytes32 s, uint256 amount) ***
MethodID: 0x0a19b14a
[0]:0000000000000000000000000000000000000000000000000000000000000000
[1]:000000000000000000000000000000000000000000000000006a94d74f430000
[2]:000000000000000000000000a92f038e486768447291ec7277fff094421cbe1c
[3]:0000000000000000000000000000000000000000000000000000000005f5e100
[4]:000000000000000000000000000000000000000000000000000000000024cd39
[5]:00000000000000000000000000000000000000000000000000000000e053cefa
[6]:000000000000000000000000a11654ff00ed063c77ae35be6c1a95b91ad9586e
[7]:000000000000000000000000000000000000000000000000000000000000001c
[8]:caa3a70dd8ab2ea89736d7c12c6a8508f59b68590016ed99b40af0bcc2de8dee
[9]:26e2347abfba108444811ae5e6ead79c7bd0434cf680aa3102596f1ab855c571
[10]:000000000000000000000000000000000000000000000000000221b262dd8000

На данный момент мы можем использовать внутреннее пространство для размещения нескольких человек, таких как uint8, addressэтот Он не займет все местоиз Комбинация параметровсуществоватьодинрост,становитьсяодининдивидуальныйuint256, Внутри контракта данные анализируются через mload.

Для входных данныхсередина каждый дополнительный индивидуальный байт увеличит газ на 68 (если все байты равны 0, он увеличит газ на 4), Для частых звонков, Сжать необходимы вводные данные из.

Другие оптимизации структуры кода

При оценке в первую очередь принимается решение о низкой стоимости (режим короткого замыкания, короткое замыкание rules): нравиться f(x) || g(y) должно облегчить судить оtrueиз Условное освобождениесуществоватьпередний。

Уменьшите ненужные зависимости.

избегатьсуществоватьциклсередина Делайте большое потреблениеиздействие,Merge может объединять циклы,Извлечь инвариант цикла из выражения наружу,Цикл середина позволяет избежать прямого накопления переменных состояния.,избегатьсуществоватьциклсередина Звонил несколько разarr.length。

++i лучше, чем i++, чем i+=1.

Для определения расчета вы можете использовать блок снятия отметки: require(a <= b); unchecked { x = b - a }

Повторное использование кода контракта

Использовать библиотеку ссылок при развертывании

В основном для повторного использования библиотеки, Вообще говоря, внутренние обращения к файлам библиотеки будут стоить дешевле, но встраивание и встраивание библиотеки приведет к увеличению затрат на развертывание; А вызов внешнего метода файла библиотеки увеличит стоимость вызова.,Но размер файла развертывания больше.,поэтомудаодининдивидуальныйскладыватьсередина。

особое внимание: нравиться Если у библиотеки libсередина есть внешние или общедоступные методы, библиотеку необходимо развернуть независимо, и remix автоматически преобразует ее.И каскасередина должна обратить внимание на заполнение информации по ссылке,В противном случае будет сообщено об ошибке.

в ремиксе
  • нравитьсяфруктыиспользовать Зависит отизlibraryизвнутренний метод, Затем компилятор встроит библиотеку в контракт, Для завершения развертывания контракта будет только одна транзакция.

Стоимость транзакции на картинке выше: 115901.

Стоимость звонка в Бариз: 49858, 26973.

  • нравитьсяфрукты Толькоиспользоватьполагатьсяlibraryизвнешний или общедоступный метод,Затем компилятор зарезервирует индивидуальный адрес в байт-коде., Когда remix выполнит развертывание, появятся две отдельные транзакции для развертывания библиотеки и контрактов соответственно. Последующие развертывания Bar приведут только к 1 индивидуальной транзакции, которая будет стоить первое развертывание из Bar Транзакционный развертывание. газ стоит столько же, и Фу не нужно разворачивать.

Две картинки вышеиндивидуальныйторговлятратить отдельно: 122886,146252, Последующее развертывание Бара будет дорогостоящим 146252。

Вызов метода бара изgas: 53650, 30765.

  • Но настоящий моментНе существует функции, позволяющей напрямую указывать и повторно использовать адрес развернутого контракта.

https://ethereum.stackexchange.com/questions/72708/how-to-deploy-library-contract-separate-from-the-main-contract-and-link-it

каскасередина

Развернуть библиотеку

Язык кода:javascript
копировать
let libFactory = await hre.ethers.getContractFactory("IdentityLib");
let lib = await libFactory.deploy();
await lib.deployed();
console.log("library deployed to address: ", lib.address);

Разверните контракт и свяжите библиотеку при развертывании.

Язык кода:javascript
копировать
let contractFactory = await hre.ethers.getContractFactory(
    "CarbonIslandMethodology",
    {
      signer: deployer,
      libraries: {
        IdentityLib: lib.address,
      },
    }
  );

let contract = await contractFactory.deploy();
await contract.deployed();
console.log("contract deployed to address: ", contract.address);

ERC-1167 Минимальный контракт на клонирование агента

Самый маленький агент предоставляет индивидуальный код контракта с самым простым агентом.

использоватьбольшинство Маленькийактерское мастерствоиз На что следует обратить внимание : Самый Маленький агент из реализует адрес контракта не Могу измениться, а это значит, что вы не будете могу обновить свой код.

https://eips.ethereum.org/EIPS/eip-1167

https://mirror.xyz/xyyme.eth/mmUAYWFLfcHGCEFg8903SweY3Sl-xIACZNDXOJ3twz8

Уменьшите использование метода хранения в цепочке оптимизации газа

Использовать журнал

logизgasиспользоватьпараметрнравиться Вниз

Язык кода:txt
копировать
LogDataGas            uint64 = 8     // Per byte in a LOG* operation's data.
LogGas                uint64 = 375   // Per LOG* operation.
LogTopicGas           uint64 = 375   
MemoryGas             uint64 = 3

Его основная формула расчета:

gas_cost = 375 + 375 * num_topics + 8 * data_size + mem_expansion_cost

Пример индивидуального: нравиться - это 2индивидуальная тема + 200 байтизлога, стоимость изгаза:

Язык кода:txt
копировать
375 (static cost)
200 = 200 bytes of memory for log.Data x 3 cost of memory = 600 gas for memory gas
2 x 375 = 750 for topic gas
8 x 200 = 1600 for log.Data cost

Total cost: 375 + 600 + 750 + 1600 = 3,325 gas units

Виден по сравнению схранилищеодининдивидуальныйuint256, Нужно 20000+ gas , чтобы сэкономить много.

краткое содержание:

  • Когда журнал может заменить хранилище (состояние может быть перезаписано без чтения в цепочке), использование журнала более рентабельно.
  • Сокращение ненужных бревен также может сэкономить газ.

Использование MerkleProof

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

Используйте контракты без сохранения состояния

лицо без гражданствадоговорвоспользовалсяторговляданныеи Вызовы событий и другое содержимое полностью сохраняютсясуществовать Блокчейнначальствоизфакт。поэтому,Вам не нужно постоянно менять состояние контракта,而Только需发送один Ручкаторговляи пройти, хочешьхранилищеизценить Вот и все。Зависит от В SSTORE Операции обычно составляют часть транзакционных издержек, поэтому контракты без сохранения состояния потребляют только часть контрактов с сохранением состояния. Gas。

Язык кода:solidity
копировать
contract DataStore {
function save(bytes32 key, string value) {}
}

Затем вы можете использовать Ethereum-input-data-decoder` Чтобы напрямую проанализировать транзакцию из входных данных

npm install ethereum-input-data-decoder ### Используйте источники данных вне сети

нравитьсяipfsждать,Но сохранитесуществоватьбольшойколичество и Нет结构化данные时,Целесообразно использовать метод источника данных вне цепочки. Мы можем передавать данные в IPFS сеть,Тогда соответствующееиз Хэшценитьдержатьсуществоватьдоговорсередина,чтобы позже обратиться к этой информации.

Сокращение методов хранения в цепочке. Краткое содержание:

Index Logs

Stateless Contract

Merkle Proof

Off-chain(IPFS)

Размер данных

Маленький

Маленький

середина Маленький

большой

Экономия газа

Маленький (само полено тоже требует бензина)

середина

большой

большой

Могут ли данные использоваться по договору?

не могу

не могу

Может. (поставляется с путем Меркла)

Это довольно хлопотно и требует наличия оракула или других методов для подачи данных для использования.

нравиться Как изменить данные

Off-chain определяет, что новые данные перезаписывают старые данные.

Off-chain определяет, что новые данные перезаписывают старые данные.

Изменить оффчейн и обновить корневой ончейн

Сложнее, вам нужно реализовать метод модификации самостоятельно.

Применимые сценарии

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

Нет необходимости заключать контракты серединаиспользовать переменные,Самым важным поведением в цепочке является запись, Остальные действия выполняются вне сети.

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

Большой объем данных вне сети,и сохранитьсуществоватьнравитьсякартинаждать Нет结构化данные。основнойиспользовать ВВспомогательныйдоговорхранилищеодин Некоторые несуществоватьдоговорсерединаписатьивычислитьиздополнительные данные

ссылка:

https://mirror.xyz/quentangle.eth/GxmosHtVYZaIkJjM9slpkKtZWfk8fU78FQ8oxoDNuFE

оптимизация газа

https://ethereum.stackexchange.com/questions/28813/how-to-write-an-optimized-gas-cost-smart-contract

https://medium.com/layerx/how-to-reduce-gas-cost-in-solidity-f2e5321e0395

https://medium.com/coinmonks/8-ways-of-reducing-the-gas-consumption-of-your-smart-contracts-9a506b339c0a

https://www.alchemy.com/overviews/solidity-gas-optimization

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 позволяет экспортировать с сохранением двух десятичных знаков.