Нещодавно я заново вивчав 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:
Ми можемо безпосередньо передати посилання на контракт у функції, і потрібно лише змінити тип адреси вищевказаного параметра на ім’я цільового контракту, що краще, ніж OtherContract. У наведеному нижче прикладі реалізовано функцію getX(), яка викликає цільовий контракт.
Ми можемо створити змінну контракту, а потім використовувати її для виклику цільової функції. У наступному прикладі ми зберігаємо посилання на контракт OtherContract для змінної oc:
Якщо функція цільового контракту є платною, то ми можемо перевести гроші на контракт, викликавши його: _Name(_Address).f{value: _Value}(), де _Name - ім’я контракту, _Address - адреса контракту, f - ім’я цільової функції, а _Value - сума ETH, що підлягає передачі (у wei).
Функція setX контракту OtherContract є платною, і в наступному прикладі ми переводимо гроші до та з цільового контракту за допомогою виклику setX.
Після перенесення ми можемо спостерігати зміну балансу ETH цільового контракту через подію Log та функцію getBalance().
У цій доповіді ми покажемо вам, як створити посилання на контракт за допомогою коду цільового контракту (або інтерфейсу) та адреси, щоб викликати функції цільового контракту.