Как найти смарт контракт монеты

Как узнать смарт-контракт токена?

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

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

1. Используем известные сервисы

Этот способ самый простой, но таким образом не получится найти смарт-контракт любого токена. Если токен, достаточно известный, то вероятнее всего он находится в базе таких сервисов, как CoinMarketCap и CoinGecko. Достаточно просто найти в них этот токен и на странице описания взять необходимой контракт.

Пример с токеном MATIC на CoinMarketCap:

Пример с токеном MATIC на CoinMarketCap

Пример с токеном AURORA на CoinGecko:

Пример с токеном AURORA на CoinGecko

В некоторых случаях понадобятся оба сервиса, так как в каждом по отдельности может существовать не полная информация и может не хватать контрактов в определенных сетях, если токен существует не только в одной сети.

2. Официальный сайт проекта

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

Чаще всего, адрес контракта токена бывает опубликован в документах проекта (Docs) или в белой бумаге проекта (WhitePaper).

Пример с токеном BSW децентрализованной биржи Biswap:

Как найти смарт-контракт токена?

3. Как узнать контракт токена, находящегося в вашем кошельке?

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

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

Если вы уверены на 100%, что токен находящийся на вашем кошельке настоящий и необходимо узнать его смарт-контракт, то потребуется обозреватель блоков в той сети, в которой находится токен в вашем кошельке. В каждой сети существуют свои обозреватели блоков, вот несколько примеров для популярных сетей:

  • Ethereum — https://etherscan.io/
  • BNB Chain — https://bscscan.com/
  • Polygon — https://polygonscan.com/
  • Fantom — https://ftmscan.com/
  • Avalanche — https://snowtrace.io/

Пример с токеном NMX децентрализованной биржи Nomiswap в сети BNB Chain:

1. Перейдите в обозреватель блоков BSCScan (для сети BNB Chain) и введите адрес своего кошелька в строку поиска:

Обозреватель блоков BSCScan

2. Нажмите BEP-20 Token Txns, если вы хотите узнать адрес контракта обычного токена или нажмите ERC-721 Token Txns, если вы хотите узнать адрес контракта NFT-токена:

BEP-20 Token Txns

3. В списке появятся все входящие и исходящие транзакции токенов, которые совершались в вашем кошельке. Найдите необходимой токен и нажмите на него:

Токен NMX

4. Откроется страница смарт-контракта необходимого токена, где мы и можем увидеть его адрес:

Контракт токена NMX

С другими сетями процесс аналогичный и визуально ничем не отличается, поэтому нет смысла показывать отдельно.

Читайте также:

  • Token Pocket — защита кошелька при работе с Web3 и NFT
  • Как снять апрувы (Approve) со своего кошелька?

Оглавление

  • 1 Основы мира DeFi
  • 2 Интерфейс ERC 20/BEP 20 как основа контракта токена, разбор функций контракта
  • 3 Что происходит под капотом при работе с контрактом / Пример использования функций
  • 4 Разбор основных типов скама: рагпул, ханипот, свистоперделки. Где и как искать в контракте.
  • 5 Заключение

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

Учимся читать смарт контракты и обходить скам: Часть 1

Поэтому в данной работе многие понятия сознательно сокращены (впрочем без потери их адекватности и применимости) для лучшего усвоения материала без излишних технических подробностей.

Основы мира defi

Смарт-контракты

  • Смарт-контракт это программный код, который выполняется на нодах блокчейна, а результат выполнения (если это прописано в программе) сохраняется в блокчейне в специальном хранилище. Назовем данные, сохраняемые в блокчейне – персистент данными.
  • Код смарт-контракта после заливки в блокчейн дополнительно заливается сверху слоем эпоксидки, чтобы предотвратить любое случайное или намеренное изменение кода.
  • Функции смарт контракта могут быть вызваны извне (с кошелька пользователя или из другого контракта) и делятся на две большие группы:

– Не меняющие состояние персистент данных (только чтение из блокчейна)

– Меняющие состояние  персистент данных

Вызов функций первой группы не стоит газа и денег и не уходит дальше ближайшей ноды, к которой мы подцеплены (пример: Balance Of, TotalSupply, Allowance). В BSC scan эти функции перечислены во вкладке “READ”

Вызов функций второй группы превращается в полноценную транзакцию, которая майнится, включается в блок и результат которой записывается в блокчейн. (пример: Approve, Transfer, TransferFrom). В BSC scan эти функции перечислены во вкладке “WRITE”

Блокчейны состояния

  • Etherium и блокчейны, построенные на его основе (Polygon/Matic, BSC, и т.д.), относятся к блокчейнам состояния.
  • Каждый адрес хранит в блокчейне значение своего баланса в нативной монете блокчейна (ETH, bnb, MATIC)
  • Каждый смарт-контракт хранит в блокчейне значения своих персистент переменных
  • На текущий момент времени (Блок Х) состояние блокчейна описывается балансом всех существующих адресов в сети и текущими значениями персистент переменных всех смарт-контрактов в блокчейне.

Аккаунты

  • Сид-фраза (12 слов) которую вы записали при первом создании вашего кошелька, при помощи протокола BIP 39 превращается в приватный ключ, который при помощи алгоритма ECDSA (Elliptic Curve Digital Signature Algorithm) превращается в публичный ключ, который при помощи хеширования и обрезания превращается в ваш адрес в блокчейне. То есть:

Сид-Фраза -> Приватный ключ -> Публичный ключ -> Адрес

  • И это превращение совершенно однозначное. Из одной и той же сид фразы вы всегда получите один и тот же адрес со своим балансом.
  • Поэтому чтобы перенести свой аккаунт на другой кошелек (MetaMask, trust wallet, SafePal, Coin98. …) Вам всего лишь надо восстановить ваш аккаунт на новом кошельке используя сохраненную сид фразу.
  • Отсюда следует, что сид фразу надо хранить как зеницу ока, поскольку она дает полный доступ к вашему аккаунту.

А где же наши токены?

  • Для каждого аккаунта (адреса) в блокчейне хранится только баланс этого адреса в нативной монете блокчейна и все. А где же токены, которые мы купили?
  • Баланс вашего адреса в каждом купленном токене хранится в смарт-контракте этого токена в таблице (условно) balances, состоящей из двух столбцов – адрес и его баланс в токенах.

В BSC scan эта таблица отображается на вкладке “HOLDERS”

  • Именно поэтому чтобы баланс токена появился в вашем кошельке токен надо в него (кошелек) добавить. После добавления кошелек запрашивает смарт-контракт токена на предмет текущего баланса своего аккаунта и радостно отображает это в интерфейсе.

Один адрес – множество сетей

  • ethereum был первым блокчейн (спасибо Виталий!) построенным вокруг идеологии смарт-контрактов. Первым и настолько успешным, что породил множество клонов, различающихся между собой порой только алгоритмом консенсуса и стоимостью транзакций.
  • Поэтому вы можете использовать (и используете) один и тот же адрес в сетях BSC, Polygon. Ethereum, и т.д. Когда вы находитесь внутри кошелька (хорошо что не чайника, да?) представьте что вы стоите на вокзале с билетом на поезд с номером 0хbc12….dd, вокруг вас множество дверей, на них написано Ethereum, BSC, Polygon,,, За дверями разные железные дороги и поезда, кто-то на угле, кто-то на ядерном реакторе, кого-то вообще еще лошади тянут. Но все они стоят на рельсах, везде есть локомотив и вагоны. И ваш билет всегда соответствует месту в одном из таких вагонов какую бы дверь вы ни открыли.

***

Итак:

  • Ключом к вашему аккаунту является сид-фраза или секретный ключ, однозначно определяющая ваш адрес в сети и дающая полный доступ к аккаунту
  • Ваш баланс какого-то токена лежит в смарт-контракте этого токена
  • Вы можете использовать один адрес для всех Ethernet-based блокчейнов
  • Смарт-Контракт это неизменяемая программа плюс изменяемые данные, которые хранятся в блокчейне
  • У смарт-контракта есть две группы функций, которые можно вызвать извне – не изменяющие состояние блокчейна (READ) и изменяющие (WRITE)

Интерфейс ERC 20/BEP 20 как основа контракта токена, разбор функций контракта

Что такое Интерфейс

  • Интерфейс – (грубо, но нам подойдет) это описание внешних воздействий (органов управления) каким-либо объектом и однозначных реакций объекта на это управление.
  • Пример – вождение автомобиля. Интерфейсом является набор органов управления (руль, три педали, рычаг переключения передач) и описание однозначных реакций автомобиля на использование этих органов.
  • Осознав этот интерфейс вы, с той или иной степенью успешности и эффективности, сможете управлять и Окой и Белазом.

Интерфейс ERC-20

  • На текущий момент уже создано и каждый день создается множество токенов. Но с любым токеном мы можем взаимодействовать единообразно – пересылать, свапать, апрувить и т.д. За счет чего же достигается подобная унификация?
  • Чтобы токен мог называться токеном, он должен “реализовывать” интерфейс ERC 20/BEP 20. Реализовывать означает, что смарт контракт токена должен содержать вполне определенный набор функций и параметров с однозначно прописанной реакцией (что смарт контракт должен сделать) на вызов каждой из этих функций.

Interface of the erc20 standard as defined in the EIP.

FUNCTIONS

  • totalSupply()
  • balanceOf(account)
  • transfer(recipient, amount)
  • transferFrom(sender, recipient, amount)
  • allowance(owner, spender)
  • approve(spender, amount)

EVENTS

  • Transfer(from, to, value)
  • Approval(owner, spender, value)
  • Также не забываем, что при вызове каждой функции у нас незримо присутствуют еще два параметра (на самом деле их больше, но не будем усложнять):

msg.sender – адрес с которого прилетела транзакция (кто вызвал функцию)

msg.value – количество денег (нативных монет – ETH/BNB) пересланных с транзакцией

  • EVENT – способ передать информацию из смарт-контракта наружу, в web3 программу, вызвавшую контракт. Как флажок о том, что выполнена такая-то операция. Подробно рассматривать не будем, просто запомните.

Описание функций ERC-20

Разобьем наши 6 функций на две группы:

Группа READ (только читаем из блокчейна):

  • totalSupply() – возвращает общую эмиссию токена
  • balance Of(account)– возвращает баланс адреса account
  • allowance(owner, spender)– возвращает количество токенов, которое owner разрешил списать со своего аккаунта spender (см также approve)

Группа WRITE (меняем состояние блокчейна):

  • transfer(recipient, amount)– передает amount токенов от msg.sender к recipient
  • transferFrom(sender, recipient, amount)– передает amount токенов от sender к recipient
  • approve(spender, amount)– выдает разрешение spender списать amount токенов с баланса msg.sender.  (см также allowance)

***

  • Существует стандарт ERC-20 описывающий интерфейс (функции, их параметры и возвращаемые значения), который должен реализовывать смарт-контракт, чтобы называться токеном.
  • Если смарт-контракт реализует интерфейс ERC-20, то мы можем его использовать везде, где возможно использование токена – свапать его на dex, пересылать друг другу, сжигать и т.д. И совершенно неважно что на самом деле представляет собой этот контракт.
  • Помните – если что-то выглядит как утка, ходит как утка и крякает как утка, то мы можем ее использовать как утку, КАКАЯ РАЗНИЦА ЧТО ЭТО ТАКОЕ НА САМОМ ДЕЛЕ )

Что происходит под капотом при работе с контрактом / Пример использования функций

Давайте рассмотрим на примере:

  • Вася решает создать свой токен. Он берет самую стандартную реализацию ERC20, меняет название, количество (1000), прописывает что при создании контракта ему должны быть намечены (переданы) все 1000 токенов и деплоит смарт-контракт в блокчейн.

Смарт контракт выполняет функцию конструктора (специальная функция выполняющаяся один раз при деплое контракта), которая инициализирует внутренние переменные, в частности создает две пустые таблицы – balances и allowances, затем вызывает функцию mint, которая создает первую строчку в таблице balances:

Вася – 1000

И завершает работу. Контракт готов.

  • Вася решает подарить своим друзьям Коле и Борису по 100 токенов

Кошелек Васи инициирует две транзакции к смарт-контракту токена: transfer(Коля, 100) и transfer(Борис, 100). В данном случае с кого надо списать монеты определяется тем, кто послал транзакцию, т.е. с баланса Васи (msg.sender, помните?).

Смарт-контракт просто меняет таблицу balances добавляя в нее две новые строчки и меняя сумму у Васи:

Вася – 800

Коля – 100

Борис – 100

  • Вася решает вывести токен на биржу, для этого он идет на панкейк и создает пару ликвидности Token-BNB. (800 токенов – 2 BNB)

Панкейк роутер создает пару ликвидности, Вася заливает в нее 800 токенов и 2 BNB, в результате где-то в другой вселенной в контракте BNB появляется строчка CAKE-LP-Token – 2, а в контракте токена таблица balances теперь выглядит так:

Вася – 0

Коля – 100

Борис – 100

CAKE-LP-Token/Pancake Router – 800   (В BSC scan мы можем увидеть ликвидность в таблице holders)

* для простоты рассказа считаем, что Pancake Router и CAKE-LP-Token с точки зрения контракта токена это одно и то же. На самом деле нет, там все хитрее, но не будем усложнять, для наших целей такое упрощение вполне допустимо.

  • Коля решает прикупить еще 100 токенов, он идет на Панкейк, говорит “Хочу купить 100 токенов за BNN, почем нынче овес?”

Панкейк рутер запрашивает у пары ликвидности текущий курс токена к BNB (по алгоритму AMM) и говорит Коле – Это будет тебе стоить 0.25 BNB + комиссия.

  • Договорились, Коля отправляет Панкейку 0.25 BNB и ждет свои токены.

Панкейк рутер видит, что деньги пришли и создает транзакцию на смарт-контракт токена: transfer(Коля, 100) от имени LP пары.

Смарт контракт выполняет запрошенное, дебетуя счет пары и кредитуя счет Коли. В результате:

Вася – 0

Коля – 200

Борис – 100

CAKE-LP-Token – 700 

Панкейк роутер отправляет 0.25 BNB на другой конец вселенной и на другом плече LP пары в контракте BNB значение баланса пары CAKE-LP-Token увеличивается с 2 до 2.25

  • В это время Борис решает продать все токены и купить на все Binamon (БИНАМООН :). Он идет на панкейк и говорит: “Хочу продать 100 токенов, почем возьмешь?”

Панкейк рутер запрашивает у пары ликвидности текущий курс токена к BNB (по алгоритму AMM) и говорит Коле – Это будет тебе стоить 0.37 BNB + комиссия.

Одновременно с этим панкейк запрашивает у смарт-контракта токена а разрешил ли Борис ему(Панкейку) списывать токены со своего счета, для этого он запрашивает у смарт-контракта результат функции: allowance(Борис, Панкейк-рутер).

* Панкейк рутер вполне логично никому не доверяет, поэтому все транзакции списания денег происходят от его имени, именно поэтому смарт-контракту токена Борис должен сказать, что он доверяет Панкейку списать с его баланса токены.

Борис до этого ничего не продавал, результат выполнения функции = 0. Панкейк видит это и в интерфейсе свопа рисует для Бориса кнопку “APPROVE”.

  • Борис нажимает на кнопку “APPROVE”

Кошелек Бориса инициирует транзакцию к смарт-контракту токена: approve(Панкейк-рутер, 99999999999999999), позволяя роутеру списывать со своего счета столько токенов, сколько ему (рутеру) надо.

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

Смарт-контракт токена выполняем операцию, добавляя в таблицу allowance строчку:

Борис – (Панкейк-рутер, 999999999) и генерирует событие Approval

Панкейк роутер видит это событие и перезапрашивает у смарт-контракта результат функции: allowance(Борис, Панкейк-рутер).

Если смарт-контракт возвращает 9999999999 и это значение больше или равно сумме текущей транзакции, то рутер убирает кнопку “APPROVE” из интерфейса и включает кнопку “swap”. Если возвращается 0, то кнопка “APPROVE” не исчезает, кнопка “SWAP” все еще неактивна.

  • Борис нажимает на кнопку “SWAP”

Панкейк рутер дает команду BNB-шному плечу LP пары отправить 0.37 BNB Борису и создает транзакцию на смарт-контракт токена вызывая функцию transferFrom(Борис, Панкейк-рутер, 100)

Смарт-контракт проверяет наличие в таблице allowance строчки, разрешающей Панкейку списывать монеты с адреса Бориса, находит ее и выполняет операцию.

Таблица balances теперь имеет вид:

Вася – 0

Коля – 200

Борис – 0

CAKE-LP-Token – 800 

  • Все получилось, все довольны, все операции проведены, время пить кофе )

***

  • Токены пересылаются с баланса отправителя транзакции (обычно это кошелек пользователя) на любой другой адрес с помощью функции transfer.
  • Токены могут пересылаться с любого адреса на любой адрес, только если есть разрешение через функцию approve списывать деньги с адреса дебитора.
  • Функция approve вызывается владельцем адреса, который выдает разрешение другому адресу списать токены с его баланса.
  • Наличие разрешения можно посмотреть через функцию allowance.
  • При любых трансферах токены просто переезжают из одной строчки таблицы balances в другую, никогда не покидая пределов своего смарт-контракта.
  • Если вы хотите заранее апрувить продажу токена, вы заходите в смарт-контракт ТОКЕНА, вкладка WRITE, ищете там функцию APPROVE и вставляете адрес смарт-контракта РУТЕРА той свалки где хотите свапать. В нашем случае это адрес Панкейк-рутера: 0x10ED43C718714eb63d5aA57B78B54704E256024E

Разбор основных типов скама: рагпул, ханипот, свистоперделки. Где и как искать в контракте.

A) Рагпул – Ситуация, когда в токене на свалке внезапно (или очень быстро) исчезает вся ликвидность и вы остаетесь с кучей токенов, которые невозможно продать.

Заключение

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

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

Удачи!

  • https://t.me/ak74lab
  • https://t.me/Kruegger
  • Учимся читать смарт контракты и обходить скам: Часть 1
  • Расширенная работа со Смарт-контрактами. Основы языка “Solidity”. Учимся обходить скам: Часть 2
  • Опасно ли аппрувить что-либо на PancakeSwap? Учимся обходить скам: Часть 3
  • Трехуровневая схема работы DeFi или сам себе DApp. Учимся обходить скам: Часть 4
  • Как хомяку выжить в DeFi? Учимся обходить скам: Часть 5

— ПОДПИСЫВАЙТЕСЬ НА НАШ КАНАЛ В ТЕЛЕГРАМЕ @WHATTONEWS

И почему вы хотите сделать это в первую очередь прежде чем совершать покупки и иные виды транзакций.

Чтение смарт-контракта дает вам представление о популярности проекта, о том, насколько распределено владение (ownership) внутри него и на что он способен, то есть его функционал.

Кроме того, вы можете исследовать детали каждой транзакции. Большое преимущество в web3.

Когда-нибудь такого рода информацию, вероятно, будут преподавать в школах.

1. Во-первых, что такое смарт-контракт?

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

Это может быть что угодно, от отправки денег другу до дробления (fractionalization) NFT.

2. Как найти смарт-контракт?

Контракты, транзакции и кошельки Ethereum доступны для просмотра на Etherscan.

Чтобы найти контракт NFT, перейдите к списку на OpenSea и нажмите «Подробности». Это показывает ссылку «Контрактный адрес». Нажмите на нее.

Адрес контракта должен быть у любой NFT коллекции, назависимо от того есть она на OpenSea или где-то еще
Адрес контракта должен быть у любой NFT коллекции, назависимо от того есть она на OpenSea или где-то еще

Здесь есть на что посмотреть, так что давайте разберемся.

Balance + Value: Это показывает, сколько монет содержится в контракте.

My name tag: Если вы вошли в систему, вы можете создавать личные заметки для себя здесь.

Creator: Кошелек, создавший контракт, и ссылка на исходный txn. Нажмите на него.

Как читать смарт-контракты NFT-коллекций и проектов?

Здесь у нас есть подробная информация о транзакции, которая создала контракт.

Мы можем видеть:

Подтверждение сделки (Transaction confirmation)

Временная метка (Timestamp)

Количество отчеканенных каждого токена (Quantity minted of each token)

Создатель контракта (Contract creator)

Сборы уплачены (Fees paid)

Хорошая вещь. Теперь вернемся к основному контракту.

3. Трекер

Как читать смарт-контракты NFT-коллекций и проектов?

Нажмите, чтобы узнать:

Минимальная стоимость токена (minimum token value)

Максимальное общее количество токена (если установлен максимум) (max total supply of the token)

Сколько кошельков держат токен (how many wallets hold the token)

Сколько перемещений произошло (how many transfers have occurred)

Очень ценная информация. Но есть еще одна интересная вещь, о которой большинство людей не знает.

4. Нажмите «Holders» в списке вкладок.

Это отображает рейтинг тех, у кого больше всего токенов в контракте.

Как читать смарт-контракты NFT-коллекций и проектов?

Если вы нажмете «Token holders chart», вы даже сможете увидеть диаграмму.

Хорошо, вернемся на главную страницу контракта.

5. Переходим во вкладку «Transactions»

Столбец 1 представляет собой хронологический список всех транзакций. На каждую можно нажать.

Далее идет «Метод». Это функции, выполняемые через контракт. Каждый контракт уникален, но общие для большинства контрактов методы включают mint, transfer и approval.

Как читать смарт-контракты NFT-коллекций и проектов?

6. Теперь давайте исследуем вкладку «Contracts»

Code: отображает исходный код контракта.

Reading contract: отображение функций.

Write Contract: позволяет инициировать функции (если у вашего кошелька есть разрешение), такие как сжигание токенов, предоставление ролей, приостановка и многое другое.

7. Наконец, давайте проверим «Analytics»

Здесь мы находим графики, демонстрирующие транзакции, комиссии, баланс ETH и многое другое. На приведенной ниже диаграмме показан рост Cryptopunks.

Я также рекомендую @nansen_ai для получения более подробной информации об объеме, перекрытиях кошельков проектов, известных держателях токенов и многом другом.

Автор: Chris Cantino

Время на прочтение
4 мин

Количество просмотров 8.6K

Тема блокчейна не перестает быть источником не только всяческого хайпа, но и весьма ценных с технологической точки зрения идей. Посему не обошла она стороной и жителей солнечного города. Присматриваются люди, изучают, пытаются переложить свою экспертизу в традиционном инфобезе на блокчейн-системы. Пока что точечно: одна из разработок «Ростелеком-Солар» умеет проверять безопасность софта на базе блокчейна. А попутно возникают некоторые мысли по решению прикладных задач блокчейн-сообщества. Одним из таких лайфхаков – как определить адрес смарт-контракта до деплоя с помощью CREATE2 – сегодня хочу с вами поделиться под катом.

image
Опкод CREATE2 был добавлен в хард-форке Константинополь 28 февраля этого года. Как указано в EIP, этот опкод был введен в основном для каналов состояний (state channels). Однако, мы использовали его для решения другой проблемы.

На бирже есть пользователи с балансами. Каждому пользователю мы должны предоставить Ethereum-адрес, на который кто угодно сможет отправлять токены, тем самым пополняя свой аккаунт. Давайте назовем эти адреса «кошельками». Когда токены приходят на кошельки, мы должны отправить их на единый кошелек (hotwallet).

В следующих разделах я анализирую варианты решения этой задачи без CREATE2 и рассказываю, почему мы отказались от них. Если вам интересен только конечный результат, вы можете найти его в разделе «Итоговое решение».

Ethereum-адреса

Самое простое решение — генерировать новые ethereum-адреса для новых пользователей. Эти адреса и будут кошельками. Чтобы перевести токены из кошелька в hotwallet, необходимо подписать транзакцию вызовом функции transfer() с приватным ключом кошелька из бэкенда.

Этот подход имеет следующие преимущества:

  • это просто
  • стоимость переноса токенов с кошелька на hotwallet равна цене вызова функции transfer()

Тем не менее, мы отказались от этого подхода, поскольку он имеет один существенный недостаток: вам нужно где-то хранить приватные ключи. И дело не только в том, что они могут быть потеряны, но ещё и в том, что вам необходимо тщательно управлять доступом к этим ключам. Если хотя бы один из них скомпрометирован, то токены определенного пользователя не достигнут горячего кошелька.

image

Создавать отдельный смарт-контракт для каждого пользователя

Развертывание отдельного смарт-контракта для каждого пользователя позволяет не хранить приватные ключи от кошельков на сервере. Биржа вызовет этот умный контракт для передачи токенов в hotwallet.

От этого решения мы тоже отказались, поскольку пользователю нельзя показать адрес его кошелька без развертывания смарт-контракта (это на самом деле возможно, но довольно сложным образом с другими недостатками, которые мы не будем здесь обсуждать). На бирже пользователь может создать столько аккаунтов, сколько ему нужно, и каждому нужен собственный кошелек. Это означает, что нам нужно тратить деньги на деплой контракта, даже не будучи уверенными, что пользователь будет использовать эту учетную запись.

Опкод CREATE2

Чтобы устранить проблему предыдущего способа, мы решили использовать опкод CREATE2. CREATE2 позволяет заранее определить адрес, по которому будет развернут смарт-контракт. Адрес рассчитывается по следующей формуле:

keccak256 (0xff ++ address ++ salt ++ keccak256 (init_code)) [12:]


, где:

  • address — адрес смарт-контракта, который будет вызывать CREATE2
  • salt — случайное значение
  • init_code — байт-код смарт-контракта для развертывания

Таким образом гарантируется, что адрес, который мы предоставляем пользователю, действительно будет содержать желаемый байт-код. Кроме того, этот смарт-контракт может быть развернут, когда нам нужно. Например, когда пользователь решит впервые использовать свой кошелек.
image
Более того, вы можете рассчитывать адрес смарт-контракта каждый раз вместо того, чтобы хранить его, так как:

  • address в формуле является постоянным, так как это адрес нашей фабрики кошельков
  • salt — хеш user_id
  • init_code является постоянным, так как мы используем один и тот же кошелек

Больше улучшений

Предыдущее решение все еще имеет один недостаток: вам нужно платить за развертывание умного контракта. Тем не менее, вы можете избавиться от этого. Для этого вы можете вызвать функцию transfer(), а затем selfdestruct() в конструкторе кошелька. И тогда газ за развертывание смарт-контракта будет возвращен.

Вопреки распространенному заблуждению, вы можете развернуть смарт-контракт по одному и тому же адресу несколько раз с опкодом CREATE2. Это связано с тем, что CREATE2 проверяет, что nonce целевого адреса равен нулю (ему присваивается значение «1» в начале конструктора). При этом функция selfdestruct() каждый раз сбрасывает nonce адреса. Таким образом, если вы снова вызовете CREATE2 с теми же аргументами, проверка на nonce пройдет.

Обратите внимание, что это решение аналогично варианту с ethereum-адресами, но без необходимости хранить приватные ключи. Стоимость перевода денег с кошелька на hotwallet примерно равна стоимости вызова функции transfer(), поскольку мы не платим за развертывание смарт-контракта.

Итоговое решение

image

Изначально подготовлено:

  • функция для получения соли по user_id
  • умный контракт, который будет вызывать опкод CREATE2 с соответствующей солью (т.е. фабрика кошельков)
  • байт-код кошелька, соответствующий контракту со следующим конструктором:

constructor () {
    address hotWallet = 0x…;
    address token = 0x…;
    token.transfer (hotWallet, token.balanceOf (address (this)));
    selfdestruct (address (0));
}


Для каждого нового пользователя мы показываем его / ее адрес кошелька путем расчета

keccak256 (0xff ++ address ++ salt ++ keccak256 (init_code)) [12:]


Когда пользователь переводит токены на соответствующий адрес кошелька, наш бэкэнд видит событие Transfer с параметром _to, равным адресу кошелька. На этот момент уже возможно увеличить баланс пользователя на бирже до развертывания кошелька.

Когда на адресе кошелька накапливается достаточное количество токенов, мы можем перевести их все сразу в hotwallet. Для этого бекенд вызывает функцию фабрики смарт-контрактов, которая выполняет следующие действия:

function deployWallet (соль uint256) {
    bytes memory walletBytecode =…;
    // invoke CREATE2 with wallet bytecode and salt
}


Таким образом, вызывается конструктор смарт-контракта кошелька, который передает все свои токены на адрес hotwallet и затем самоуничтожается.

Полный код можно найти здесь. Обратите внимание, что это не наш продакшн-код, так как мы решили оптимизировать байт-код кошелька и записали его в опкодах.

Автор Павел Кондратенков, специалист в области Ethereum

Уровень риска

Проверка контракта

Этот сканер можно использовать для проверки контракта на ханипот и раг пул. Учтите, что выданный результат не дает 100% гарантию.

Ханипот



Владение контрактом





Черный список





Изменение макс. TX





Изменение макс. продажи





Изменение комиссии





Отключение торговли



Раг Пул



Риск





Ликвидность





Холдеры





Топ 5 Холдеров





Минт





Разблокировано



Результат проверки на ханипот

Продажи открыты с высокой комиссией (20-50%)

Продажи открыты с высокой комиссией (50-99%)

Проверка на ханипот:
Продажи открыты

Проверка на ханипот:
Продажи закрыты

Уязвимости обнаруженные в коде контракта:

Добавить комментарий