Начало работы с Solidity|Лекция 21: Вызов других контрактов

律动

Недавно я заново изучал solidity, консолидировал детали и писал “Solidity Minimalist Primer” для начинающих (программисты могут найти другое руководство), обновляемое 1-3 раза в неделю.

Весь код и учебные пособия находятся с открытым исходным кодом по адресу github:github.com/AmazingAng/WTFSolidity

Вызов развернутого контракта

Разработчики пишут смарт-контракты для вызова других контрактов, что позволяет повторно использовать программы в сети Ethereum, тем самым создавая процветающую экосистему. Многие web3-проекты полагаются на обращение к другим контрактам, таким как доходное фермерство. В этом докладе мы покажем вам, как вызвать функцию целевого контракта, когда известны код контракта (или интерфейс) и адрес.

Целевой контракт

Давайте начнем с написания простого контракта OtherContract, чтобы вызвать его.

Этот контракт содержит переменную состояния x, журнал событий, который запускается при получении ETH, и три функции:

getBalance(): Возвращает баланс ETH контракта.

setX(): внешняя оплачиваемая функция, которая может установить значение x и отправить ETH на контракт.

getX(): Считывает значение x.

Вызов контракта OtherContract

Мы можем создать ссылку на контракт, используя адрес контракта и код контракта (или интерфейса): _Name(_Address), где _Name — название контракта, а _Address — адрес контракта. Затем вызовите его функцию со ссылкой на контракт: _Name(_Address).f(), где f() — вызываемая функция.

Вот 4 примера вызова контрактов:

1. Передайте адрес договора

Мы можем передать адрес целевого контракта в функцию, сгенерировать ссылку на целевой контракт, а затем вызвать целевую функцию. Например, мы напишем функцию callSetX в новом контракте, передав адрес развернутого контракта OtherContract _Address и параметр x setX:

2. Передача переменных контракта

Мы можем напрямую передать ссылку на контракт в функции, и нам нужно только изменить тип адреса вышеуказанного параметра на имя целевого контракта, что лучше, чем OtherContract. В следующем примере реализуется функция getX(), которая вызывает целевой контракт.

3. Создание переменной контракта

Мы можем создать переменную контракта, а затем использовать ее для вызова целевой функции. В следующем примере мы сохраняем ссылку на контракт OtherContract для переменной oc:

4. Звоните контракту и отправляйте ETH

Если функция целевого контракта является оплачиваемой, то мы можем перевести деньги на контракт, вызвав его: _Name(_Address).f{value: _Value}(), где _Name — название контракта, _Address — адрес контракта, f — имя целевой функции, а _Value — сумма ETH для перевода (в wei).

Функция setX контракта OtherContract является оплачиваемой, и в следующем примере мы переводим деньги в целевой контракт и обратно, вызывая setX.

После переноса мы можем наблюдать изменение баланса ETH целевого контракта через событие Log и функцию getBalance().

Резюме

В этом докладе мы покажем вам, как создать ссылку на контракт через код (или интерфейс) целевого контракта (или интерфейс) и адрес, чтобы вызывать функции целевого контракта.

Отказ от ответственности: Информация на этой странице может поступать от третьих лиц и не отражает взгляды или мнения Gate. Содержание, представленное на этой странице, предназначено исключительно для справки и не является финансовой, инвестиционной или юридической консультацией. Gate не гарантирует точность или полноту информации и не несет ответственности за любые убытки, возникшие от использования этой информации. Инвестиции в виртуальные активы несут высокие риски и подвержены значительной ценовой волатильности. Вы можете потерять весь инвестированный капитал. Пожалуйста, полностью понимайте соответствующие риски и принимайте разумные решения, исходя из собственного финансового положения и толерантности к риску. Для получения подробностей, пожалуйста, обратитесь к Отказу от ответственности.
комментарий
0/400
Нет комментариев