Поднимемся как пишется поднимемся или

Продолжаем цикл статей, посвящнный основам django rest framework. в предыдущей статье мы подробно рассмотрели, как сериалайзер валидирует входные данные. в

Продолжаем цикл статей, посвящённый основам Django Rest Framework. В предыдущей статье мы подробно рассмотрели, как сериалайзер валидирует входные данные.

В этой статье мы закрепим теорию на простом примере, а также затронем те вопросы, которые не успели рассмотреть раньше:

  • какое поле сериалайзера выбрать для ForeignKey-поля модели;
  • как сериалайзер работает с датами;
  • как устроен метод save сериалайзера.

А ещё мы напишем контроллер, который будет обрабатывать запросы к API на создание записи в БД.

image

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

Исходный код учебного проекта для этой статьи доступен в GitHub.

Объявляем класс сериалайзера

from rest_framework import serializers

class WriterSerializer(serializers.Serializer):
    pass

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

class Writer(models.Model):
    firstname = models.CharField(max_length=100...)
    lastname = models.CharField(max_length=100...)
    patronymic = models.CharField(max_length=100...)
    birth_place = models.ForeignKey(to=Town...)
    birth_date = models.DateField(...)

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

Подбираем корреспондирующие поля сериалайзера

Каждое поле сериалайзера мы назовём так же, как поле модели, которое оно обслуживает. Это позволит не указывать дополнительный атрибут source.

Поля firstname, lastname и patronymic

Одноимённые поля модели ожидают обычные строковые значения, поэтому для корреспондирующих полей сериалайзера выберем класс serializers.Charfield.

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

def __init__(self, **kwargs):
    self.allow_blank = kwargs.pop('allow_blank', False)
    self.trim_whitespace = kwargs.pop('trim_whitespace', True)
    self.max_length = kwargs.pop('max_length', None)
    self.min_length = kwargs.pop('min_length', None)
    ...

  • allow_blank трогать не будем — нам нужны данные, поэтому пусть остаётся дефолтный False.
  • trim_whitespace обрежет пробелы перед текстом и после него. Нам это подходит, поэтому атрибут тоже не трогаем и оставляем дефолтный True.
  • max_length нам нужен, потому что такой же валидатор стоит у каждого текстового поля модели Writer. Поскольку по дефолту он не задан, объявим его явно и приведём лимит по количеству символов — такой же, как и в модели.
  • min_length нам не потребуется, потому что у нас нет ограничений по минимальному количеству символов для полей модели.

Получаем следующий код:

class WriterSerializer(serializers.Serializer):
    firstname = serializers.CharField(max_length=100)
    patronymic = serializers.CharField(max_length=100)
    lastname = serializers.CharField(max_length=100)

Поле birth_place

Одноимённое поле модели относится к классу ForeignKey и связано с моделью Town.

class Writer(models.Model):
    ...
    birth_place = models.ForeignKey(to=Town...)

class Town(models.Model):
    name = models.CharField(max_length=100, unique=True, ...)

Тут нам нужно не просто передать какое-то значение (тот же текст), которое сразу запишется в базу: нам нужно, чтобы по этому значению был извлечён объект записи из модели Town.

DRF предоставляет несколько классов полей для работы с полями отношений. Нам подходит класс SlugRelatedField. Вот его описание из исходного кода: A read-write field that represents the target of the relationship by a unique 'slug' attribute. Слово slug может немного путать: под ним здесь понимается любое уникальное поле модели с любым названием. И совсем необязательно, чтобы оно называлось slug или относилось к классу SlugField.

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

def to_internal_value(self, data):
    queryset = self.get_queryset()
    try:
        return queryset.get(**{self.slug_field: data})
    except ObjectDoesNotExist:
        self.fail('does_not_exist', slug_name=self.slug_field, value=smart_str(data))
    except (TypeError, ValueError):
        self.fail('invalid')

Код показывает, какие атрибуты нам следует передать, а именно:

  • queryset — набор записей (разумеется, из связанной модели);
  • slug_field — имя уникального поля в связанной модели, которое будет использоваться для ORM-запроса .get. Всегда можно указать pk или id, но у нас есть уникальное поле name, поэтому выберем его.

Что касается набора записей, мы будем искать объект Town по всем записям, поэтому передадим Town.objects.all(). Но можно сократить его до Town.objects, потому что all() будет вызван под капотом.

Итог:

class WriterSerializer(serializers.Serializer):
    ...
    birth_place = serializers.SlugRelatedField(slug_field='name', queryset=Town.objects)

Поле birth_date

В django-модели поле birth_date относится к классу DateField. Одноимённый класс предусмотрен и среди полей сериалайзера.

При объявлении поля DateField можно передать два необязательных аргумента:

  • format — формат, в котором дата будет возвращаться при работе сериалайзера на чтение;
  • input_formats — список или кортеж допустимых форматов передачи даты при работе сериалайзера на запись.

Поскольку сейчас мы акцентируемся на работе сериалайзера на запись, рассмотрим подробнее второй аргумент. Если его не передать, то применится настройка из-под капота DATE_INPUT_FORMATS. Она позволяет передать дату в формате iso-8601 — проще говоря, строкой вида YYYY-MM-DD.

Чтобы глобально переопределить это поведение, нужно прописать в настройках DRF собственные форматы. Они должны отвечать требованиям Python-модуля datetime.

Все настройки DRF прописываются в settings.py django-проекта, а именно в словаре REST_FRAMEWORK. Перенастроим формат передачи строки с датой:

# settings.py
REST_FRAMEWORK = {
    'DATE_INPUT_FORMATS': [
        '%d.%m.%Y',  # '25.10.2021'
        '%d.%m.%y',  # '25.10.21'
    ]
}

Для большей выразительности примера мы переопределим формат ввода/вывода даты не глобально, а прямо в поле сериалайзера.

birth_date = serializers.DateField(
    format='%d.%m.%Y', # из базы дата будет вытаскиваться в формате "25.10.2021"
    input_formats=['%d.%m.%Y', 'iso-8601',] # в том же виде сериалайзер ожидает дату «на вход», но можно и дефолтный формат
)

Под капотом DateField переданная строка превратится в объект класса datetime.date с помощью datetime.datetime.strptime.

Собираем все поля вместе и проверяем работу сериалайзера

Код нашего сериалайзера получился таким:

class WriterSerializer(serializers.Serializer):
    firstname = serializers.CharField(max_length=100)
    patronymic = serializers.CharField(max_length=100)
    lastname = serializers.CharField(max_length=100)
        birth_place = serializers.SlugRelatedField(
        slug_field='name',
        queryset = Town.objects
    )
    birth_date = serializers.DateField(
        format='%d.%m.%Y',
        input_formats=['%d.%m.%Y']
    )

Сериалайзер может работать и на запись, и на чтение — read only или write only полей нет. Проверим.

Сначала задействуем сериалайзер на чтение. Нам понадобится запись из базы и аргумент instance (в каких случаях нужен тот или иной аргумент при создании сериалайзера, мы подробно рассматривали в предыдущей статье).

instance = Writer.objects.first()
serializer_for_reading = WriterSerializer(instance=instance)
print(serializer_for_reading.data)

Результат:

{
    'firstname': 'Константин',
    'patronymic': 'Николаевич',
    'lastname': 'Батюшков',
    'birth_place': 'Вологда',
    'birth_date': '29.05.1787'
}

Теперь посмотрим, как наш сериалайзер работает на запись. Понадобится словарь с входными данными и аргумент data.

data = {
    'firstname': 'Иван',
    'patronymic': 'Алексеевич',
    'lastname': 'Бунин',
    'birth_place': 'Воронеж',
    'birth_date': '22.10.1870'
}
serializer_for_writing = WriterSerializer(data=data)
# валидируем входные данные
print(serializer_for_writing.is_valid())  # True
print(serializer_for_writing.errors)  # ожидаемо пустой словарь {}

Посмотрим на обработанные сериалайзером данные, готовые к записи в БД, которые находятся в validated_data:

# serializer_for_writing.validated_data
OrderedDict(
    [
        ('firstname', 'Иван'),
        ('patronymic', 'Алексеевич'),
        ('lastname', 'Бунин'),
        ('birth_place', <Town: Воронеж>),
        ('birth_date', datetime.date(1870, 10, 22))
    ]
)

В поле birth_place находится не строка «Воронеж», а объект модели Town, готовый для записи в поле с внешним ключом birth_place. А в поле birth_date — не строка с датой, а объект класса datetime.date.

Попробуем передать невалидные данные: например, для поля birth_date придёт строка в неправильном формате (допустим, 22/10/1870). В этом случае is_valid вернёт False, а словарь errors будет таким:

{
    'birth_date': [
        ErrorDetail(string='Неправильный формат date. Используйте один из этих форматов: DD.MM.YYYY.', 
                    code='invalid')
    ]
}

Все поля сериалайзера отработали штатно. Ура!

Усиливаем валидацию

В предыдущей статье мы говорили о многоступенчатой системе валидации в DRF-сериалайзере. Попрактикуемся в создании валидаторов на разных этапах проверки входных данных.

Валидатор для конкретного поля. Допустим, нас интересуют только писатели, которые родились не позднее XX века. Для проверки этого условия добавим аргумент validators в поле birthdate.

from datetime import date
from django.core.validators import MaxValueValidator
...
class WriterSerializer(serializers.Serializer):
    ...
    birth_date = serializers.DateField(..., validators=[MaxValueValidator(date(1999, 12, 31))])

Метавалидатор. Мы хотим, чтобы сочетание «имя – отчество – фамилия» было уникальным. Здесь пригодится UniqueTogetherValidator, который следует объявить в классе Meta сериалайзера, а до этого — импортировать из rest_framework.validators.

class WriterSerializer(serializers.Serializer):
    ...
    class Meta:
        validators = [
            UniqueTogetherValidator(
                queryset=Writer.objects,
                fields=['firstname', 'patronymic', 'lastname']
            ) 
        ]  

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

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

class WriterSerializer(serializers.Serializer):
    ...
    class Meta:
        ...
    def validate(self, attrs):
        set_attrs = set(
            [attrs['firstname'], attrs['patronymic'], attrs['lastname']]
        )
        if len(set_attrs) != 3:
            raise ValidationError(
                'Имя, отчество и фамилия не могут совпадать между собой',
                code='duplicate values'
            )
        return attrs 

Добавляем сериалайзеру возможность записывать валидированные данные в БД

DRF-класс Serializer наследует от класса BaseSerializer, у которого есть метод `save`. Но вызвать его напрямую мы пока не можем. Чтобы метод заработал, внутри класса нашего сериалайзера нужно описать два метода:

  • create с логикой сохранения в БД новой записи;
  • update с логикой обновления в БД существующей записи.

Примеры этих методов есть в документации.

Сейчас нам достаточно записывать в БД лишь новые данные, поэтому определим только метод create:

class WriterSerializer(serializers.Serializer):
    # тут следуют определения полей сериалайзера, класс Meta, метод validate — пропускаем их для краткости

    def create(self, validated_data):
       return Writer.objects.create(**validated_data)

Теперь при вызове у экземпляра сериалайзера метода .save() без аргументов он вернёт новую запись. Вызывать метод save можно только после получения валидированных данных — другими словами, после вызова is_valid.

Разработчики DRF отмечают: логика save абсолютно не исчерпывается созданием или обновлением записи в БД. Можно вообще не описывать методы create и update, а целиком переопределить сам save. Например, чтобы при его вызове валидированные данные отправлялись по электронной почте.

Контроллер и Browsable API

В первой статье, где демонстрировался пример работы DRF на чтение, мы использовали самый простой контроллер на основе класса APIView. Задействуем его и в этот раз — понадобится лишь дописать логику метода post.

Для работы с POST-запросами в Browsable API есть удобная вкладка HTML form, которая предоставляет отдельное поле в форме для каждого поля сериалайзера. Чтобы эта вкладка отрендерилась в шаблоне, в контроллере должен присутствовать атрибут get_serializer или serializer_class. Для высокоуровневых контроллеров, начиная с GenericAPIView, эти атрибуты есть под капотом.

Поскольку мы используем «голый» APIView, то допишем необходимый атрибут самостоятельно.

from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView

from .models import Writer
from .serializers import WriterSerializer

class WriterInfoView(APIView):
    serializer_class = WriterSerializer
    model = Writer

    def get(self, request):
        ... # полный код не приводим — он аналогичен коду из первой статьи о работе API на чтение

    def post(self, request):
        serializer_for_writing = self.serializer_class(data=request.data)
        serializer_for_writing.is_valid(raise_exception=True)
        serializer_for_writing.save()
        return Response(data=serializer_for_writing.data, status=status.HTTP_201_CREATED)

Посмотрим на представление нашего API в браузере:

74jfilcvd fnhit1g ljadz2g10

Сверху видим ответ на GET-запрос: в базе пока нет записи ни об одном писателе. Ниже есть удобная форма для отправки POST-запроса. Заполним и отправим её. Результат:


Итак, мы разобрались, как создать API для валидации входных данных с последующей их записью в базу данных. В следующей статье мы поднимемся на один уровень абстракции вверх и рассмотрим, как устроен класс ModelSerializer.

Им дают «вкусные» названия, например, Cookie Coin. Или «космические», например, Pluto Coin. Или «космические» и «вкусные», например, AstroCake, который описывается так: «Создал койн 5 минут назад. НАДЁЖНЫЙ».

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

Несмотря на статистику, хайп-койны стали предметом инвестиций для миллионов людей. Чаще всего это мужчины тридцати лет или моложе, убеждённые, что экономика в целом заточена против них. Некоторые из них — те самые трейдеры, которые покупали акции GameStop и AMC Entertainment. Для них крипта является и источником надежды (на мгновенное обогащение), и кругом общения (у многих токенов есть чаты в Telegram, чем-то похожие на религиозные группы поддержки).

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

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

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

Однажды в мае я создал собственную криптовалюту. Мне удалось сделать это во время беседы по Zoom с 36-летним жителем Тайваня Дэном Арреола, опубликовавшим в YouTube руководство по созданию и продвижению «скам-койна». Оно собрало больше 240 тысяч просмотров.

Во время беседы он сказал: «Минимальная цена выпуска токена — 8 долларов».

Это если вы используете сайт для знающих технологии. Для всех остальных есть Cointool. Покопавшись несколько минут в настройках и заплатив 300 долларов, я нажал на кнопку. Мгновенно был создан 21 миллион койнов.

Я дал им название Idiot Coins.

Название стало одним из первых тревожных звоночков для потенциальных держателей (так называют инвесторов в крипту). Я не особо стремился к тому, чтобы этот койн вырос в цене. На самом деле, я хотел, чтобы он с треском провалился. Смысл заключался в том, чтобы показать, что для создания хайп-койна не требуется опыта и многие из них неустойчивы и опасны. Idiot Coin станет испытательным манекеном, предназначенным для подтверждения мудрости использования ремней безопасности. И хотя законодательство обеспечивает защиту таких инвестиций, чаще всего его игнорируют. Разработчики редко заглядывают вперёд.

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

Я создал веб-сайт с разделом «Как купить», предупреждающий не делать этого. («Шаг 1. Не покупайте Idiot Coin».) Я написал объявление в CryptoMoonShots — странице Reddit с информацией о новорожденных криптовалютах. Обычно заявляется, что койны неизбежно взлетят по траектории к Луне. Я выбрал другой подход.

В моём объявлении было написано «Мы ТОЧНО не летим до Луны. Возможно, не поднимемся и на дюйм от земли!»

Я выпустил это честное рекламное объявление 2 июля, а потом замер и начал надеяться на худшее. В идеале уровень энтузиазма не превзойдёт уровень у человека, оставившего под объявлением в CryptoMoonShots такое сообщение: «Больше всего мне нравится болливудский фильм „Три идиота“. Поэтому я куплю три Idiot coin» (Стоит заметить что половина топа в CryptoMoonShots занимают коины, которые манипулируют голосами с помощью разных компаний, который полно в Гугл по запросу Buy Reddit upvotes, поэтому стоит обращать внимание на комментарии, они чаще всего выдают манипулятивных пост).

Копов не видать

image

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

Теперь это криптовалюты. Непосвящённый может считать, что их всего пара дюжин. Однако по данным сайта Token Sniffer, количество приближается к 70 тысячам. Ежедневно создаётся примерно сотня криптовалют.

Большинство из них не имеет ценности, однако почти 80 криптовалют имеют рыночную капитализацию выше 1 миллиарда долларов и привлекли внимание не только мелких коллег-инвесторов. По данным PitchBook, в этом году венчурные капиталисты США вложили 4,2 миллиарда в не менее чем 280 криптовалютных сделок. В конце июня фирма венчурного капитала Andreessen Horowitz вложила в фонд криптовалют 2,2 миллиарда долларов — треть от всех своих средств.

Было ещё несколько внезапных звёзд. Самой примечательной из них оказалась DogeCoin, которая с начала этого года взлетела за пять месяцев на 14 тысяч процентов и сейчас имеет рыночную капитализацию 26 миллиардов долларов.

Однако большинство хайп-койнов заканчиваются «вытягиванием ковра из-под ног» (rug pulls) — манёвром разработчиков и их союзников, обналичивающих свои токены в момент пиковой стоимости и рекламной кампании. Цена обрушивается, торги завершаются. На веб-сайте Coinopsy есть список из нескольких тысяч «мёртвых койнов». Самые распространённые причины смерти — «скам» и «прекращение поддержки».

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

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

Лихорадочное продвижение койна онлайн называется «shilling», все в сфере крипты знают людей, которые вечером проводили shilling, а на утро обогащались. Например, Джайшил Толиа, 31-летний студент-стоматолог с севера Англии. За считанные часы после дебюта хайп-койна Bonfire 18 апреля он инвестировал 30000 тысяч долларов, в основном потому, что ему понравился логотип и энергичность сообщества в Telegram. Они с другими держателями начали оставлять по всему вебу #BonfireToken и другие теги о Bonfire.

Когда Толиа проснулся утром, график стоимости Bonfire «пошёл по параболе», как говорят в кругах любителей крипты. Его койны стоили 1,4 миллиона долларов.

«Я уже зарабатывал миллион долларов раньше, но за три или четыре дня», — рассказывал он в майском интервью. «Я никогда не зарабатывал миллион за ночь».

Этот путь к богатству заполнен опасностями, и не только из-за постоянно присутствующей опасности rug pull и других вариаций механики «накачать стоимость и обналичить средства» (pump and dump). Мир крипты часто сравнивают с Диким Западом, но это сравнение несправедливо по отношению к Дикому Западу. На нём были шерифы, суды и патрульные отряды. А в мире крипты о копах и не слышно. Если кто-то украдёт твою крипту, то это твои проблемы.

В мире крипты необходимы друзья и союзники. Своих я встретил в мае, когда присоединился в WhatsApp к чату энтузиастов, живущих в лондонском районе Чингфорд. Каждый день примерно 200 людей из этой Crypto Crew обменивались подсказками и советами. Они служили отделом техподдержки для тех, кого пугала архитектура и терминология вселенной крипты. Они радовались когда койны росли и призывали к терпению, когда они падали.

До нынешнего спада примерно раз в неделю кто-нибудь из Crew упоминал название нового хайп-койна и спрашивал что-то типа: «Ребята, что вы о нём думаете?»

В начале мая это был Bonfire. Незадолго до этого он взлетел на 700 процентов. Пара участников чата впала в экстаз, но были и скептики.

«Можно ли как-то использовать Bonfire?», — спросил один из участников.

«Ага, чтобы сжечь свои деньги», — ответил другой (bonfire — «костёр»).

Когда в чате упоминают хайп-койн, возникает вопрос: «Кто-нибудь знает, как его купить? Я решил попробовать».

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

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

Сложно оценить потери жителей Криптолэнда, ежегодно они составляют примерно от сотен миллионов до 1 миллиарда долларов. Начальник отдела безопасности занимающейся управлением криптовалютами компании MyCrypto Гарри Денли говорит, что каждый день с ним связывается от 30 до 50 человек, ищущих помощи в возврате от 500 долларов до 1,2 миллиона. Почти никогда он ничем не может помочь.

«Если вы попытаетесь найти помощь у тех людей, которые продали вам койн, то они назовут вас идиотом за то, что вы его купили», — рассказывает Денли.

Первый из множества встреченных мной в Криптолэнде мошенников появился ближе к концу моего квеста по покупке Bonfire. К тому времени я проделал уже больше десятка шагов и наконец оказался на PancakeSwap — децентрализованной финансовой бирже (defi), где крипту можно обменивать без посредников.

Когда я наконец нажал кнопку «Обменять», мой Bonfire, казалось, исчез. Прошёл час, потом второй.

Поэтому я нажал на ссылку Telegram-аккаунта на главной странице PancakeSwap. Там я встретил администратора, называвшего себя Cake Johnson.

Я рассказал о проблеме. Он ответил, что волноваться не стоит.

«Проблема возникла в вашей строке in-node», — объяснил он и предоставил ссылку, которая позволит её «исправить».

Ссылка привела меня на страницу, запрашивающую пароль из 12 слов к моему криптокошельку. Эти пароли, называемые seed phrase, являются стандартной и необходимой мерой защиты в Криптолэнде. Урок первый: никогда и никому не сообщайте этих слов.

«Вводимая вами информация видна только вам», — написал Cake, когда я вернулся к нему со скептическими вопросами. «Для защиты конфиденциальности мы используем шифрование 365».

Ага, конечно. Я сообщил, что являюсь репортёром New York Times и спросил адрес электронной почты пресс-службы PancakeSwap. Больше Cake не ответил ни слова.

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

Chef Hops написал, что Cake — не настоящий администратор, а только им притворялся.

«К сожалению, так часто происходит», — сообщил он.

Как оказалось, мои койны Bonfire просто задержались из-за проблем с переводом. Путь с PancakeSwap в мой криптокошелёк занял четыре с половиной часа. И это выявило ещё одну неожиданную сторону Криптолэнда — он абсурдно медленный.

Вскоре после поступления койнов взлёт Bonfire закончился. Стоимость койна и всех остальных криптовалют начала обваливаться.

Хайп — это другие люди

На самом деле это был второй предсмертный опыт Bonfire. Первый случился спустя несколько дней после его рождения в апреле, когда стало очевидно, что разработчик придумал койн как схему pump and dump. После первоначального роста Bonfire этот разработчик продал почти все свои койны. Однако Толиа и команда держателей-единомышленников решила, что попытается спасти койн от забвения. Никому за это не заплатят сейчас, но это неважно. Это была миссия.

На тот момент Bonfire имел рыночную капитализацию более 26 миллионов долларов и всего за несколько недель получил около 200 тысяч держателей. Толиа был с ними откровенен. В YouTube и Telegram он объяснил, что все они купились на скам. Однако теперь, заявил он, Bonfire может превратиться в сообщество, а при наличии достаточного терпения и концентрации — и в процветающий бизнес. Он продвигал идею того, что койн может стать основой альтернативы Facebook, только с конфиденциальностью и без рекламы.

Большинство держателей было в восторге. Telegram-аккаунте Bonfire Толиа прославляли как героя и святого. Он был в экстазе. Годами он изучал стоматологию, отчасти из-за того, что многие члены его семьи занимались этой профессией, но никогда не считал это своим призванием.

«Я всегда хотел делать что-то важное, что-то с заделом на будущее», — рассказывал Толиа в майском интервью.

Для него Bonfire стал и потрясающей сказкой, криптоответом на возможность реанимации трупа. Он считает, что из этого может получиться отличная документалка.

Если и так, то главный поворот сюжета был ещё впереди. Действия Китая против крипты привели к свободному падению цен на Bonfire. К июню многие держатели Bonfire уже продавали его. Часто их обвиняли в распространении «fud» (fear, uncertainty, doubt — «страха, неопределённости, сомнений»). В Telegram-аккаунтах многократно распространявших fud выгоняли из сообществ.

К июню за 1 доллар можно было купить примерно 7,7 миллиона койнов Bonfire. Хотя эта цена стала жестоким ударом для изначальных держателей Bonfire, крошечная стоимость сделала его привлекательной для многих фанатов хайп-койнов. Первые проданные биткойны стоили доли цента. Если цена Bonfire когда-нибудь достигнет цента, держатели станут сказочно богатыми.

К сожалению, достичь отметки в 1 цент невозможно, потому что обычно печатается огромное количество токенов — в случае Bonfire 650 триллионов. Если бы за каждый платили пенни, рыночная капитализация Bonfire намного бы превысила суммарную капитализацию Apple и Amazon. Плюс Walmart.

Однако основную аудиторию хайп-койнов это, похоже, не волнует.

«Я купил больше по этой цене, получил 35 миллиардов токенов», — сказал некто под ником Hodler в Telegram Bonfire в июне.

«Ты герой, покупай ещё», — ответила Rosie.

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

Этот оптимизм было трудно понять. Но он стал гораздо понятнее, когда несколько недель назад я наткнулся на Telegram-аккаунт токена FEG. (Аббревиатура расшифровывается «Feed Every Gorilla» — «накормить каждую гориллу». В названиях койнов гориллы так же популярны, как собаки.) Одним июльским днём в групповом голосовом чате Telegram было больше ста человек.

Они пугающе походили на сторонников Bonfire. Они страстно обсуждали сообщество FEG. Они были убеждены, что FEG изменит мир. (Среди его обещаний была и бОльшая по сравнению с другими обменниками defi безопасность.) Они считали, что из истории койна может выйти отличный документальный фильм.

Цена FEG обвалилась с майского максимума. К началу июля за 1 доллар можно было купить 148 миллионов FEG, но его поклонников это не пугало. По данным Coinmarketcap.com, FEG по-прежнему имеет рыночную капитализацию 176 миллионов долларов и около 600 тысяч держателей. Многие в чате в тот день сохраняли энтузиазм.

«Я бы хотел побыстрее заработать больше денег, но это настоящий проект, который совершит революцию в defi и повысит безопасность», — сказал один из участников.

«Говорят, что есть дорожная карта на десять лет», — сказал другой.

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

Зачем инвестировать в крипту? Человек под ником Bogdan Danci ответил так: «Я живу в Нидерландах, банки и вся централизованной система в 2008 году рухнула и мы потеряли кучу денег. Зачем нам платить кучке азартных игроков из банковской системы? Они облапошили всю страну. Поэтому я пришёл в мир крипты».

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

«Нужно посмотреть на неравенство, чтобы понять, почему молодёжь покупается на крипту», — рассказывает Трэвис Клинг из управляющей крипторесурсами фирмы Ikigai (Остин, штат Техас). «Особенно после Covid, когда богатые стали ещё богаче. Эти люди чувствуют, что финансовая система работает не на них. Политики подкуплены. Big Tech собирает их данные. Это реакция на всю ситуацию».

Кроме того, крипта предлагает нечто более глубокое и приятное, чем обычные инвестиции. Она предлагает смысл. Чем больше времени ты проводишь в криптовалютном чате, тем больше общего находишь с религиозной сектой. Требуется вера. Еретики наподобие раскольников из Telegram устраняются. А если оставаться там достаточно долго, начинается обращение в свою веру.

«Как только ты начинаешь видеть потенциал этого проекта для мира, ты начинаешь хотеть продвигать его самостоятельно, потому что он действительно меняет правила игры», — сказал мне Danci во время чата через Telegram.

«Сопротивление бесполезно!», — со смехом пропел кто-то.

Инвестиции в крипту содержат в себе перспективы джекпота и шанс объединиться вокруг общего верования. Это как церковный кружок в казино. Один из участников сказал, что проводит в чате FEG примерно по десять часов в день.

«Я общаюсь с этими людьми больше, чем с друзьями, с которыми вырос», — поделился он.

Печатаем барахло

image

Прежде чем создавать собственный хайп-койн, я должен был ответить на вопрос: не нарушает ли это закон? Я собирался создать нечто, похожее на ценные бумаги и выставить на продажу для всей планеты. Казалось, подобное предприятие может привлечь нежеланное внимание Комиссии по ценным бумагам и биржам США или регулирующих органов Британии, в которой я живу.

Комиссия предприняла некие принудительные меры, направленные против криптомошенничества, однако во вторник её председатель Гари Генслер запросил у Конгресса больших полномочий для надзора за данным сектором. Пока ни один из бизнесов на хайп-койнах не волнуют юридические преграды. Член команды Bonfire Эндрю Каннингем сказал, что компания наняла юристов, но только для изучения таких вопросов, как нарушение торговых марок.

Я посоветовался с двумя юристами, имеющими опыт в этой области: с Филипом Мустакисом (Манхэттан) и с Дэном Хайдом (Лондон). Хайд написал книгу о международном законодательстве, касающемся крипты. Оба юриста сообщили, что на создателей койнов могут подать в суд в обеих странах. В США проблемы начнутся, если койн будет соответствовать юридическому определению «инвестиционного договора», то есть если он будет иметь обещание прибыли, и прибыль возникнет благодаря усилиям основателя.

Мудрее всего, сказали юристы — обеспечить полную безнадёжность Idiot Coin.

С этим никаких проблем. Мой койн станет настоящим фиаско.

Но ещё один совет дал и ветеран этой области. Арреола, создавший видео «Let’s Make a Scam Coin», записывал его не для мошенников. Это предупреждение для инвесторов, доказательство того, что для создания новой крипты достаточно компьютера и чуть-чуть отваги.

После короткой переписки с Тайванем по электронной почте мы решили общаться через Zoom.

«Кажется, Dummy Coin, уже существует», — сказал Арреола, когда мы придумывали варианты названий.

Я перевёл семь из 21 миллиона Idiot Coin на продажу в обменнике defi под названием BakerySwap. Чего они стоят? Это уже решать было мне. В пул ликвидности Idiot Coin я влил крипты под названием BNB на сумму 30 долларов. Это деньги, которые покупатели будут использовать для обмена своих BNB на Idiot Coins. После каждого обмена цена Idiot Coin будет расти.

По крайней мере, в теории. Большинство разработчиков вливают в пул ликвидности от 10 тысяч долларов и более. Внеся такую жалкую сумму, я обрёк койн на провал. Это походило на машину, у которой слишком мало бензина, чтобы завестись.

Тем не менее, я всё равно хотел выполнить все действия по рекламе хайп-койна, и все они облегчаются благодаря богатому выбору фриланс-поставщиков и веб-сайтов. Сначала я создал впечатление, что несколько инвесторов уже обменяло Idiot Coins, эту хитрость легко реализовать при помощи Cointool. Кнопка «Batch Wallet Generate» мгновенно создаёт 100 криптокошельков, каждый из которых имеет собственную фразу безопасности из 12 слов. Примерно за 70 долларов я поместил в каждый из кошельков по 100 Idiot Coin. Нет никакой возможности определить, что все эти кошельки были созданы тем же человеком, который создал койн.

Теперь мне нужно было продвигать это барахло среди покупателей крипты. Для этого я должен нанять пользователя TikTok, чтобы он опубликовал видео, прославляющее Idiot Coin. Через сайт Collabstr я нашёл тиктокера моей мечты, Samuel Malki, который записывает видео под ником Malki Means King и имеет 5 миллионов подписчиков. Он читает рэп, обмахиваясь пачкой фальшивых стодолларовых купюр, в вызывающих очках, золотой короне и с мультяшными накладными зубами. Его видео — это пародия на роскошь, дополненная бутафорией и пафосом.

«На самом деле я живу с родителями», — рассказал он мне во время видеозвонка в Instagram.

Я нанял веб-дизайнера для создания веб-сайта Idiot Coin. В разделе «Команда проекта» я добавил фото бультерьера моих друзей. На сайте был и раздел «White Paper». В нём я должен был рассказать, почему именно этот койн нужен миру и инвесторам. Однако в своём тексте я умолял инвесторов остановиться.

Наконец, я написал то объявление о рождении валюты для CryptoMoonShots. На веб-сайте под названием Fiverr я нашёл человека, известного мне как Expert Troll, чтобы он за плату опубликовал объявление. (Мне не хватало кармы на Reddit, чтобы запостить его самому.) Чтобы объявление отображалось среди верхних постов, я купил 100 «лайков» Reddit на сайте Soar.

В сумме койн и искусственный ажиотаж вокруг него обошлись мне примерно в 1000 долларов. Чтобы гарантировать невозможность взлома койна, его проверила украинская аудиторская фирма Zokyo. Наконец, в назначенный час, 2 июля появилось объявление в CryptoMoonShots. Malki опубликовал свой TikTok. Ожил сайт Coinforidiots.com.

Ничего не произошло. Или почти ничего. Четыре человека или бота — сложно определить — купили в сумме 73 Idiot Coin, то есть продажи составили небольшую долю пенни. К счастью, это был полный провал.

Никто не понёс финансового урона, но одна из групп оказалась разочарованной. Я нанял ещё одного фрилансера из Нигерии для публикации ссылок на Telegram-аккаунт Idiot Coin в соцсетях. По ним перешло примерно 300 людей со всего света. Многие казались сбитыми с толку. Другие походили на последователей, отчаянно ищущих проповедника. Они желали услышать проповедь о неизбежно надвигающемся изобилии.

«Почему вы так пессимистично настроены относительно этого койна?», — спросил кто-то под ником Dylan.

Я разочаровал этих людей тем, что не пообещал им богатства.

«Так надо покупать, или нет?», — спросил Pro Developer_1.

Я ответил: «Нет».

«OMG», — написал Geogae Mike. «Я ошибся группой?»

Готовься, целься, поджигай

В интервью в начале июля Толиа имел подавленный вид человека, три дня катавшегося на автодроме. Происходила ротация кадров в неоплачиваемой команде руководства Bonfire — маркетологов, графических дизайнеров, разработчиков приложений и так далее. Однако сделка с возможным инвестором провалилась. Из-за тошноты, вызванной рефлюксом, врач назначил ему лечение. Недовольные ценой койна держатели угрожали самому крупному инвестору в Bonfire (подробности не раскрываются) и Толиа считал, что другие потребуют от него, чтобы он потратил больше собственных средств на маркетинг.

«Кучка психов», — расстроенно сказал он.

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

Неделю спустя в YouTube Толиа с видимым удовольствием заявил, что член команды Bonfire Каннингем станет новым исполнительным директором Bonfire Token. Тем же вечером эти двое рассказали о первом продукте Bonfire под названием Firestarter.

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

Несколько комментаторов в YouTube поставили Firestarter дизлайки. Возможно, они увидели изъян в этой заманчивой новой платформе, спроектированной для оценки заманчивых новых койнов. Кто будет тратить деньги на сертификацию в бизнесе, где доминируют мошенники?

Однако это было мнение меньшинства. Большинство людей было в восторге.

Кто-то под ником G тем же вечером написал в Telegram-чате Bonfire: «Знаю только то, что я в любом случае буду держать койн до конца».

  • Поднимаешься как пишется правильно
  • Подлое коварство рассказ на дзен
  • Подлинник как пишется правильно и почему
  • Подлечиться как пишется правильно
  • Подкованный жеребец как пишется правильно