Недавно я заново изучал solidity, консолидировал детали и писал “Solidity Minimalist Primer” для начинающих (программисты могут найти другое руководство), обновляемое 1-3 раза в неделю.
Весь код и учебные пособия находятся с открытым исходным кодом по адресу github:github.com/AmazingAng/WTFSolidity
Разработчики пишут смарт-контракты для вызова других контрактов, что позволяет повторно использовать программы в сети Ethereum, тем самым создавая процветающую экосистему. Многие web3-проекты полагаются на обращение к другим контрактам, таким как доходное фермерство. В этом докладе мы покажем вам, как вызвать функцию целевого контракта, когда известны код контракта (или интерфейс) и адрес.
Давайте начнем с написания простого контракта OtherContract, чтобы вызвать его.
Этот контракт содержит переменную состояния x, журнал событий, который запускается при получении ETH, и три функции:
getBalance(): Возвращает баланс ETH контракта.
setX(): внешняя оплачиваемая функция, которая может установить значение x и отправить ETH на контракт.
getX(): Считывает значение x.
Мы можем создать ссылку на контракт, используя адрес контракта и код контракта (или интерфейса): _Name(_Address), где _Name — название контракта, а _Address — адрес контракта. Затем вызовите его функцию со ссылкой на контракт: _Name(_Address).f(), где f() — вызываемая функция.
Вот 4 примера вызова контрактов:
Мы можем передать адрес целевого контракта в функцию, сгенерировать ссылку на целевой контракт, а затем вызвать целевую функцию. Например, мы напишем функцию callSetX в новом контракте, передав адрес развернутого контракта OtherContract _Address и параметр x setX:
Мы можем напрямую передать ссылку на контракт в функции, и нам нужно только изменить тип адреса вышеуказанного параметра на имя целевого контракта, что лучше, чем OtherContract. В следующем примере реализуется функция getX(), которая вызывает целевой контракт.
Мы можем создать переменную контракта, а затем использовать ее для вызова целевой функции. В следующем примере мы сохраняем ссылку на контракт OtherContract для переменной oc:
Если функция целевого контракта является оплачиваемой, то мы можем перевести деньги на контракт, вызвав его: _Name(_Address).f{value: _Value}(), где _Name — название контракта, _Address — адрес контракта, f — имя целевой функции, а _Value — сумма ETH для перевода (в wei).
Функция setX контракта OtherContract является оплачиваемой, и в следующем примере мы переводим деньги в целевой контракт и обратно, вызывая setX.
После переноса мы можем наблюдать изменение баланса ETH целевого контракта через событие Log и функцию getBalance().
В этом докладе мы покажем вам, как создать ссылку на контракт через код (или интерфейс) целевого контракта (или интерфейс) и адрес, чтобы вызывать функции целевого контракта.