Если один смарт-контракт считывает данные из другого смарт-контракта, стоит ли это платить за газ?

Когда функция одного контракта считывает данные из функции второго контракта (то есть состояние второго контракта не изменяется). Он потребляет газ?


person ankur    schedule 21.01.2020    source источник


Ответы (1)


1) Запросы

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

2) Сделки

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

3) Запросы внутри транзакций

Я думал, ваш первоначальный вопрос был о том, стоит ли запрашивать внутри транзакции. Это потребляет дополнительный газ. Я пробовал этот эксперимент в Remix с Solidity 0.6.1 (большая часть кода опущена для ясности):

   // Gas used = 24,656
   function SetSomethingInAnotherContract_WithoutCall() public
   {
       anotherContract.SetSomething(4);
   }

   // Gas used = 28,124
   function SetSomethingInAnotherContract_WithCall() public
   {
       uint temp = anotherContract.GetSomething(); // in a query this would be free
       anotherContract.SetSomething(4);
   }

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

person K S    schedule 21.01.2020
comment
Я просто хочу получить некоторые данные из другого контракта, ничего не меняя в этом контракте. Это будет бесплатно или будет стоить немного газа? - person ankur; 23.01.2020
comment
Я неправильно понял ваш вопрос, я уточнил ответ. - person K S; 23.01.2020
comment
И могу ли я запросить любое количество раз? Потому что мой контракт будет часто делать звонки на чтение другого контракта. - person ankur; 24.01.2020
comment
Если вы в случае 1 выше (отправка запросов), то есть как минимум следующие ограничения: a) Есть ограничения на размер контракта, которые ограничивают максимальное количество кода надежности для каждого контракта. б) Узел, к которому вы выполняете запрос, может иметь ограничения на частоту вызовов. Если вы запускаете собственный узел, вы можете контролировать это ограничение. - person K S; 24.01.2020