как узнать адрес контракта токена eth
inaword
Блог о разработке и современных технологиях
Пишем смарт-контракт Ethereum — это просто: Часть 7 — ICO
В сегодняшнем уроке вы узнаете как быстро создать смарт-контракт ico на ethereum. Конечно быстрый подход не лучший вариант когда вы работаете с деньгами. Но в учебных целях подойдет. Наш первый пример контракта ico на Solidity для Ethereum будет очень простым. А впоследствии мы будем его дополнять полезными фичами. Итак, приступим.
ICO — Initial Coin Offering. Первичное предложение токенов. Если вы вообще не знакомы с этим понятием, то сперва загляните на википедию. Вкратце на примере.
Допустим у группы людей появилась идея, но на ее реализацию нужны деньги. Тогда они рекламируют свою идею и призывают вложиться. Взамен они дают токены — валюту своего проекта. И как правило владельцам этих токенов что-то обещают. Например разделить между владельцами токенов какую-то часть прибыли проекта.
Жизненный цикл ICO может состоять из следующих стадий:
Мы сосредоточимся на второй части. Технически процесс прост. Инвестор отправляет эфир на контракт, отвечающий за распродажу. А контракт распродажи отдает команду выпустить токены и зачислить на ваш баланс.
Итак ICO состоит из двух контрактов:
В предыдущем уроке мы уже реализовали свой токен ERC20. И он был создан с применением шаблонам MintableToken. Т.е. он уже содержит функцию, которая выпускает новые токены на адрес владельца. Нам осталось только написать контракт распродажи!
Давайте условимся что распродажа токенов будет начинаться 18 июля 2017 года в 15 часов по Москве и длиться будет 30 дней. В solidity дата представляется в UNIX формате. Это количество секунд с 1 января 1970 года (можно воспользоваться сервисом перевода тут). При этом время должно быть указано не местное, а относительно Гринвичевского меридиана GMT. Итак разница между Москвой и GMT у нас + 3 часа. Тогда время начал распродажи по GMT — 18 июля 2017 года 12.00. Теперь воспользуемся сервисом перевода в UNIX формат и получим — 1500379200. Эта дата актуальна момент написания статьи. Поскольку дальше мы будем тестировать наш контракт, то лучше указать дату вчерашнего дня.
Итак в нашем контракте Сrowdsale буду следующие переменные
Когда пользователь нам пришлет деньги мы проверим что текущая дата больше чем дата начала распродажи и меньше чем дата конца распродажи. Если так, то эфир, который нам прислал пользователь мы мы переведем на счет владельца контракта. А затем выполним выпуск токенов на счет пользователя посредством вызова mint. Давайте запишем условие проверки:
Как узнать, является ли адрес Ethereum контрактом?
Адрес в Solidity может быть учетной записью или контрактом (или другими вещами, например транзакцией). Когда у меня есть переменная x, содержащая адрес, как я могу проверить, контракт это или нет?
(Да, я прочитал в документе главу о типах)
6 ответов
Изменить: твердость изменилась с тех пор, как этот ответ был впервые написан, @ manuel-aráoz имеет правильный ответ.
Я знаю, что в большинстве контрактов может использоваться код @Manuel Aráoz, который в большинстве случаев работает. Но если вы вызываете функцию в конструкторе контракта, extcodesize вернет 0, что не пройдёт проверку isContract.
ПРИМЕЧАНИЕ: НЕ используйте tx.origin при других обстоятельствах, если вы не понимаете, что он представляет, потому что.
Что вы можете сделать, если у вас есть информация под рукой. Если адрес отправителя транзакции был нулевым или незанятым, вы можете определить, является ли адрес учетной записью контракта или EOA (внешней учетной записью). то есть при отправке транзакции создания контракта в сети адрес приема в транзакции является нулевым / не используется.
Надеюсь это поможет.
Функция вернет false, если она вызывается из конструктора контракта (поскольку контракт еще не развернут).
Код следует использовать очень осторожно, чтобы избежать взлома системы безопасности, например:
Не используйте проверку EXTCODESIZE, чтобы смарт-контракты не вызывали функцию. Это не является надежным, это может быть нарушено вызовом конструктора, потому что пока конструктор работает, EXTCODESIZE для этого адреса возвращает 0.
См. образец кода для контракта, который обманом EXTCODESIZE возвращает 0.
К этому нужно будет вернуться, когда будет реализована абстракция учетной записи.
Это не то, что вы можете запросить из контракта с помощью Solidity, но если вы просто хотели узнать, содержит ли адрес код контракта или нет, вы можете проверить с помощью консоли geth или аналогичного, например:
С шестнадцатеричной строкой (здесь 0xbfb2e296d9cf3e593e79981235aed29ab9984c0f ) в качестве адреса, который вы хотите запросить. Это вернет байт-код, хранящийся по этому адресу.
Да, вы можете, используя некоторый ассемблерный код EVM, чтобы получить размер кода адреса:
Как добавить кастомный токен в MEW web
3 минут на чтение
Любой токен ERC20 можно добавить в локальный интерфейс MEW, следуя этим инструкциям.
Убедитесь, что он уже не установлен в постоянном списке токенов
Сначала вы должны убедиться, что вашего токена нет в нашем интерфейсе по умолчанию.
Шаг 2. Чтобы найти необходимый токен, выполните поиск по нашему списку токенов по умолчанию.
Шаг 3. Если вы не видите ваш токен, продолжайте следовать инструкциям в данной статье.
Поиск информации о токене
Для добавления токена в наш интерфейс вам понадобятся три параметра: адрес контракта, число десятичных знаков и символ. Всю эту информацию можно найти с помощью проводника блокчейна Ethereum, например Etherscan.io или Ethplorer.io. Мы покажем, как ее найти через Etherscan.io.
Шаг 1. Направляйтесь на Etherscan.
Шаг 2. Если у вас есть баланс токена, который вы хотите добавить, выполните поиск вашего публичного адреса (0x…) в поисковом поле.
Шаг 3. Найдите ваш токен в выпадающем списке балансов токенов. Выберите токен, и вы попадете на экран информации о токене.
Шаг 4. Здесь вы найдете адрес контракта токена и количество десятичных знаков в правой части интерфейса. Запомните число десятичных знаков, а затем нажмите на адрес договора, чтобы перейти на главный экран токена.
Шаг 5. Скопируйте этот адрес и вернитесь на MEW. В верхней части списка токенов нажмите «+ Кастомные токены», чтобы открыть экран добавления своих токенов.
Шаг 6. Вставьте адрес контракта в верхнее поле, укажите символ токена (аббревиатуру) во втором поле и введите количество десятичных знаков в последнее поле. Затем нажмите «Сохранить». Все готово!
Распространенные проблемы
«Токен уже существует!»
Если вы увидите эту ошибку, то ее можно легко исправить. Введите информацию о своем токене еще раз, но поставьте «2» после символа. Например, если символ токена — «XYZ», то укажите «XYZ2».
Если вы все еще видите эту ошибку после сохранения токена с измененным символом, то возможно, что ваш токен уже находится в списке токенов по умолчанию. Попробуйте снова поискать его символ в списке токенов. Если он отображается с нулевым балансом, но на etherscan.io есть положительный баланс, то вам, возможно, придется поменять узел ETH в верхнем правом углу.
Мои добавленные токены исчезают!
Если токены, которые вы добавили, исчезают при каждом доступе к нашему интерфейсу, убедитесь, что у вас не установлено программное обеспечение для очистки кэша (например, CCleaner). Ваша пользовательская информация о токене хранится локально в вашем браузере, поэтому эта программа удалит эту информацию, и вам нужно будет добавлять токен при каждом доступе к кошельку.
Как определить адрес смарт-контракта до деплоя: использование CREATE2 для криптобиржи
Тема блокчейна не перестает быть источником не только всяческого хайпа, но и весьма ценных с технологической точки зрения идей. Посему не обошла она стороной и жителей солнечного города. Присматриваются люди, изучают, пытаются переложить свою экспертизу в традиционном инфобезе на блокчейн-системы. Пока что точечно: одна из разработок «Ростелеком-Солар» умеет проверять безопасность софта на базе блокчейна. А попутно возникают некоторые мысли по решению прикладных задач блокчейн-сообщества. Одним из таких лайфхаков – как определить адрес смарт-контракта до деплоя с помощью CREATE2 – сегодня хочу с вами поделиться под катом.
Опкод CREATE2 был добавлен в хард-форке Константинополь 28 февраля этого года. Как указано в EIP, этот опкод был введен в основном для каналов состояний (state channels). Однако, мы использовали его для решения другой проблемы.
На бирже есть пользователи с балансами. Каждому пользователю мы должны предоставить Ethereum-адрес, на который кто угодно сможет отправлять токены, тем самым пополняя свой аккаунт. Давайте назовем эти адреса «кошельками». Когда токены приходят на кошельки, мы должны отправить их на единый кошелек (hotwallet).
В следующих разделах я анализирую варианты решения этой задачи без CREATE2 и рассказываю, почему мы отказались от них. Если вам интересен только конечный результат, вы можете найти его в разделе «Итоговое решение».
Ethereum-адреса
Самое простое решение — генерировать новые ethereum-адреса для новых пользователей. Эти адреса и будут кошельками. Чтобы перевести токены из кошелька в hotwallet, необходимо подписать транзакцию вызовом функции transfer() с приватным ключом кошелька из бэкенда.
Этот подход имеет следующие преимущества:
Создавать отдельный смарт-контракт для каждого пользователя
Развертывание отдельного смарт-контракта для каждого пользователя позволяет не хранить приватные ключи от кошельков на сервере. Биржа вызовет этот умный контракт для передачи токенов в hotwallet.
От этого решения мы тоже отказались, поскольку пользователю нельзя показать адрес его кошелька без развертывания смарт-контракта (это на самом деле возможно, но довольно сложным образом с другими недостатками, которые мы не будем здесь обсуждать). На бирже пользователь может создать столько аккаунтов, сколько ему нужно, и каждому нужен собственный кошелек. Это означает, что нам нужно тратить деньги на деплой контракта, даже не будучи уверенными, что пользователь будет использовать эту учетную запись.
Опкод CREATE2
Чтобы устранить проблему предыдущего способа, мы решили использовать опкод CREATE2. CREATE2 позволяет заранее определить адрес, по которому будет развернут смарт-контракт. Адрес рассчитывается по следующей формуле:
Больше улучшений
Предыдущее решение все еще имеет один недостаток: вам нужно платить за развертывание умного контракта. Тем не менее, вы можете избавиться от этого. Для этого вы можете вызвать функцию transfer(), а затем selfdestruct() в конструкторе кошелька. И тогда газ за развертывание смарт-контракта будет возвращен.
Вопреки распространенному заблуждению, вы можете развернуть смарт-контракт по одному и тому же адресу несколько раз с опкодом CREATE2. Это связано с тем, что CREATE2 проверяет, что nonce целевого адреса равен нулю (ему присваивается значение «1» в начале конструктора). При этом функция selfdestruct() каждый раз сбрасывает nonce адреса. Таким образом, если вы снова вызовете CREATE2 с теми же аргументами, проверка на nonce пройдет.
Обратите внимание, что это решение аналогично варианту с ethereum-адресами, но без необходимости хранить приватные ключи. Стоимость перевода денег с кошелька на hotwallet примерно равна стоимости вызова функции transfer(), поскольку мы не платим за развертывание смарт-контракта.
Итоговое решение
Когда пользователь переводит токены на соответствующий адрес кошелька, наш бэкэнд видит событие Transfer с параметром _to, равным адресу кошелька. На этот момент уже возможно увеличить баланс пользователя на бирже до развертывания кошелька.
Когда на адресе кошелька накапливается достаточное количество токенов, мы можем перевести их все сразу в hotwallet. Для этого бекенд вызывает функцию фабрики смарт-контрактов, которая выполняет следующие действия:
Таким образом, вызывается конструктор смарт-контракта кошелька, который передает все свои токены на адрес hotwallet и затем самоуничтожается.
Полный код можно найти здесь. Обратите внимание, что это не наш продакшн-код, так как мы решили оптимизировать байт-код кошелька и записали его в опкодах.
Автор Павел Кондратенков, специалист в области Ethereum
Как добавить любой токен в кошелек MetaMask: сети ERC20, BEP20?
После завершения установки кошелька MetaMask по умолчанию отображается только ETH (Ethereum). В вашей учетной записи не будут отображаться другие токены BEP20.
Также некоторые новые и малоизвестные токены могут даже не отображаться в результатах поиска. Вам придется вручную добавлять такие токены в свой кошелек.
Добавить токен очень просто, и это займет у Вас всего несколько секунд.
В этом руководстве мы расскажем Вам как добавить токены ERC20 (Ethereum Chain) и BEP20 (Binance Smart Chain) в кошелек MetaMask.
Как добавить токены в кошелек MetaMask
Перед добавлением токенов в свою учетную запись MetaMask убедитесь, что вы выбрали правильную сеть. То есть; если вы хотите добавить токен ERC20, выберите «Ethereum Mainnet». Если вы хотите добавить токен BEP20, выберите «Binance Smart Chain».
Теперь давайте добавим токены в учетную запись MetaMask.
Попробуйте строку поиска:
Примечание. Функция поиска работает только в сети «Ethereum Mainnet». То есть MetaMask отображает только стандартные токены ERC20 в результатах поиска. Чтобы добавить токены BEP20, вам необходимо использовать параметр пользовательского токена, который мы объяснили ниже.
Как мы уже говорили, на вкладке поиска будут отображаться только самые распространенные и популярные токены. Если токен, который вы ищете, не отображается, используйте опцию пользовательского токена.
Добавление пользовательских токенов в MetaMask
Чтобы добавить токен, нам нужен только адрес контракта соответствующего токена.
Какой адрес токена (адрес контракта) и где их найти?
Зайдите на Etherscan.io, чтобы узнать номер контракта токена ERC20.
Используйте BscScan, чтобы найти детали контракта токена BEP20.
Используйте соответствующие блок эксплореры, найдите имя токена и скопируйте номер контракта. Вы увидите детали адреса контракта под сводкой профиля.
Шаги по добавлению пользовательского токена ERC20 в MetaMask
Пример адреса контракта токена RSR: 0x8762db106b2c2a0bccb3a80d1ed41273552616e8
Как только информация получена; нажмите «Далее» и добавьте токен. Пользовательский токен ERC20 теперь добавлен в ваш кошелек.
Шаги по добавлению пользовательского токена BEP20 в MetaMask
Процедура добавления токенов BEP20 такая же, как указано выше. За исключением того, что вам нужно будет использовать BscScan, чтобы найти адрес контракта BEP20.
Чтобы это сработало, убедитесь, что вы выбрали смарт-цепочку Binance и подключились к ней. Только тогда кошелек может получить информацию о токене BEP20.
Вот и все. Вы успешно добавили свой любимый токен ERC20 и BEP20. Ваш недавно добавленный токен будет отображаться на главном экране в списке токенов.
Где я могу разместить свои токены ERC20?
Для каждого токена не существует отдельного адреса. Просто отправьте токены на свой адрес MetaMask Ethereum, и токены появятся.
Адреса ERC20 и BEP20 начинаются с 0x.
Вы можете использовать ту же процедуру для добавления любых пользовательских токенов ERC20 или BEP20. Просто убедитесь, что вы переключились на правильную сеть.
Для ERC20 вы должны быть в основной сети Ethereum. Для токенов BEP20 вам следует перейти на Binance Smart Chain.
Теперь вы можете подключить свой кошелек и торговать токенами на Uniswap.
Спасибо за прочтение. Если вам нравится это руководство, подпишитесь на нас в Telegram чате и в YouTube канале, чтобы получать больше обновлений.