#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
контракта по новому адресу). Вы создаете экземпляр вспомогательного объекта, описанного выше, передавая ему адрес внешнего контракта.
Зачем все это делать, когда вызов магазина на самом экземпляре без просмотра адресов работает.
Я не знаю намерений лектора, стоящих за этим кодом. Возможно, они используют его позже в курсе для описания какой-то оптимизации или в качестве моста, чтобы показать какую-то другую тему. Но работают оба способа.