Использование функции адреса внутри конструктора контракта?

#blockchain #ethereum #solid

Вопрос:

Интересно, может ли кто-нибудь это объяснить. Я следую в «Курсе солидности, блокчейна и смарт — контрактов-от новичка до эксперта по Python» от freeCodeCamp.org.

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

Вот как он это сделал: SimpleStorage(address(simpleStorages[_simpleStorageIndex])).store(_simpleStorageNumber)

Я не понимаю части SimpleStorage(адрес (…)). Я понимаю индексирование в массив и получение хранилища, но я протестировал его, и это работает так же: simpleStorages[_simpleStorageIndex].store(_simpleStorageNumber)

Что это за адресная функция? Я предполагаю, что он получает адрес экземпляра контракта. Тогда почему мы передаем его конструктору(?) SimpleStorage? Зачем все это делать, когда вызов магазина на самом экземпляре без просмотра адресов работает.

Спасибо!!

ИЗМЕНИТЬ: Весь контракт:

 // SPDX-License-Identifier: MIT  pragma solidity ^0.6.0;  import "./SimpleStorage.sol";  contract StorageFactory is SimpleStorage { // is SimpleStorgae = inheritance    SimpleStorage[] public simpleStorages;   function createSimpleStorageContract() public {  SimpleStorage simpleStorage = new SimpleStorage();  simpleStorages.push(simpleStorage);  }   function sfStore(uint256 _simpleStorageIndex, uint256 _simpleStorageNumber) public {  // Anytime you interact with a contract you need two things:  // Address  // ABI - Application Binary Interface  return simpleStorages[_simpleStorageIndex].store(_simpleStorageNumber);  //return SimpleStorage(address(simpleStorages[_simpleStorageIndex])).store(_simpleStorageNumber);  }   function sfGet(uint256 _simpleStorageIndex) public view returns(uint256) {  return SimpleStorage(address(simpleStorages[_simpleStorageIndex])).retrieve();  } }  

Комментарии:

1. Можете ли вы приложить весь текст контракта?

2. Обновлено с полным контрактом

Ответ №1:

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

Итак, чтобы ответить на ваши вопросы:

Что это за адресная функция? Я предполагаю, что он получает адрес экземпляра контракта.

Правильный. Даже если simpleStorages[_simpleStorageIndex] в нем не хранится фактический SimpleStorage экземпляр. В вашем контракте он хранит только вспомогательный объект, содержащий указатель на адрес внешнего контракта, а также определение интерфейса SimpleStorage (но не фактический экземпляр внешнего контракта).

Приведение вспомогательного объекта к типу an address возвращает адрес внешнего контракта.

Тогда почему мы передаем его конструктору(?) SimpleStorage

Вы не передаете его SimpleStorage конструктору — это будет new SimpleStorage(lt;constructor_paramsgt;) с new ключевым словом (эффективное развертывание SimpleStorage контракта по новому адресу). Вы создаете экземпляр вспомогательного объекта, описанного выше, передавая ему адрес внешнего контракта.

Зачем все это делать, когда вызов магазина на самом экземпляре без просмотра адресов работает.

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