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

CryptoKitties – это игра по созданию криптовалюты, в основании которой лежит технология блокчейн со всеми вытекающими.

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

Итак, суть котиков в том, чтобы их покупать, продавать и размножать эту “криптовалюту”. У каждого кота есть свои параметры, которые передаются на генном уровне при скрещивании. Чтобы получить большую сумму от продажи животного – нужно заполучить редкую породу и заняться скрещиванием двух котов.

Криптовалюта и крипто-котики

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

Таким образом, KittyCore – это основной контракт, который наследует все методы и субконтракты всего приложения. Переходим к рассмотрению всех наследуемых субконтрактов.

Этот контракт предназначен для управления и вообще не связан с игровой механикой. В основном это методы “сеттера” для CEO, COO и CFO, которые являются адресами Ethereum, которые имеют особое владение и контроль над конкретными функциями контракта. KittyAccessControl имеет модификаторы функций по ролям, и позволяет выполнять такие действия, как пауза, отказ от договора или вывод средств.

pause() – это фича для разработчиков, которая позволяет остановить всякие операции с котами по любым причинам.

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

Блокчейн и крипто-котики-3

Сначала описывается котенок как структура:

Рассмотрим отдельно каждый параметр.

  • genes – 256-битное целое, которое описывает гены котенка. Этот ключевой параметр отвечает за то, как будет выглядеть животное.
  • birthTime – timestamp для ДР кошечки.
  • cooldownEndBlock – минимальное время, через которое можно снова размножаться.
  • matronId & sireId – ID отца и матери.
  • siringWithId – установлен ID отца, если мать беременна, а так обычно 0.
  • cooldownIndex – как долго кошка должна ждать следующей возможности забеременеть.
  • generation – коты от первого окота имеют поколение 0, а все последующие будут +1.

После этого объявляется массив всех кошек:

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

Этот контракт имеет еще одну особенность – mapping, что помогает контролировать, кто хозяин котика:

Если кошка перемещается к другому хозяину, mapping обновляется:

Теперь, рассмотрим, что происходит, когда котик создается:

Эта функция передает идентификаторы матери и отца, номер поколения котенка, 256-битный генетический код и адрес владельца. Затем информация о котенке заносится в массив Kitty[] , и вызывается transfer () , чтобы назначить его новому владельцу.

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

Блокчейн и крипто-котики-1

Вот так в контракте реализовано наследование спецификации ERC721:

Все токены ERC721 соответствуют определенному стандарту, поэтому в контракте KittyOwnership реализованы следующие функции:

Поскольку эти методы являются общедоступными, это обеспечивает стандартный способ взаимодействия пользователей с токенами CryptoKitties таким же образом, как они взаимодействуют с любым другим токеном ERC721. Вы можете передать свои токены кому-то другому, напрямую взаимодействуя с контрактом CryptoKitties на блокчейне Ethereum без использования веб-интерфейса.

KittyBreeding содержит метод для CEO, который устанавливает адрес этого внешнего контракта:

Это было сделано для того, чтобы игра не была слишком легкой – если бы вы могли заранее узнать ДНК котенка, было бы намного легче понять, какие кошки размножаются, чтобы получить «причудливую породу».

Блокчейн и крипто-котики-2

Этот внешний контракт geneScience позже используется в функции giveBirth() , чтобы определить ДНК новой кошки.

Теперь посмотрим на процесс размножения:

Таким образом, эта функция принимает идентификатор матери и отца, просматривает их в массиве kitties и устанавливает идентификатор отца siringWithId на мать. (Когда siringWithId отличен от нуля, это указывает на то, что мать беременна).

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

Затем у нас есть функция giveBirth() , которая создает новую кошку:

Сначала выполняются некоторые проверки, чтобы узнать, готова ли мать рожать. Затем определяются гены ребенка, используя geneScience.mixGenes() , котенок назначается владельцу матери, затем вызывается функция _createKitty() , которую мы рассмотрели в KittyBase.

Функциональность блока аукциона также разделена на мелкие контракты. Таким образом, KittyAuctions содержит функции setSaleAuctionAddress() и setSaleAuctionAddress() , которые, как и setGeneScienceAddress() , могут быть вызваны только CEO, и которые задают адрес внешнего контракта, обрабатывающего эти функции.

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

Есть возможность сделать до 5000 “промо-кошек”, которые можно отдать (особенно важно, когда сообщество новое), а все остальные могут быть созданы, а затем немедленно выставлены на аукцион с помощью алгоритмически определенной стартовой цены. Независимо от того, как они созданы, существует жесткий предел 50k gen0 кошек. После этого все сообщество должно размножаться.

Количество “промо-кошек” и кошек gen0 , которые может создать контракт, жестко закодировано здесь:

А тут COO может создавать “промо-кошек” и кошек gen0 :

Таким образом, при помощи createPromoKitty() COO может создать нового котенка с любыми генами, которые он хочет, и отправить его абсолютно всем (до 5000 котиков). Скорее всего, что это используется для ранних бета-тестеров, друзей и семьи, чтобы раздавать бесплатных котят для продвижения по службе и т. д.

Но это также означает, что ваша кошка может быть не такой уникальной, как вы думаете, так как COO может напечатать 5000 одинаковых копий!

Это основной контракт CryptoKitty, который скомпилирован и запущен в Ethereum. Такой контракт связывает все вместе.

Этот общедоступный метод возвращает все данные для конкретного котенка из блокчейна. Данные передаются на веб-сервер разработчиков, для отрисовки кошек на сайте. Как видно из приведенного выше кода, «котенок» в основном сводится к 256-битному беззнаковому целому, представляющему его генетический код.

В коде контракта Solidity нет ничего, что бы содержало изображение кошки или его описание или определяло то, что на самом деле означает это 256-битное целое. Интерпретация этого генетического кода происходит на веб-сервере CryptoKitty.

Данная демонстрация создания “фабрики криптовалюты” на базе блокчейна, на самом деле, не на 100% основана на блокчейне. Если веб-сайт CryptoKitty внезапно упадет, и резервное копирование выполнено не будет, вам останется только бесполезное 256-битное целое число. Можно накодить отличный продукт, который будет походить на любую криптовалюту, но популярности и долговечности достичь не получится. Перевод на русский осуществлен Библиотекой Программиста.

Вы пропустили

AEGIS Algorithms Android Angular Apache Airflow Apache Druid Apache Flink Apache Spark API API Canvas AppSec Architecture Artificial Intelligence Astro Authentication Authorization AutoGPT AWS AWS Aurora AWS Boto3 AWS EC2 AWS Lambda Azure Babylon.js Backend bash Beautiful Soup Bento UI Big Data Binary Tree Browser API Bun Career Cassandra Charts ChatGPT Chrome Extension Clean Code CLI ClickHouse Coding Codux Combine Compose Computer Context Fusion Copilot Cosmo Route CProgramming cron Cryptography CSS CTF Cypress DALL-E Data Analysis Data science Database dbt dbt Cloud deno Design Design Patterns Detekt Development Distributed Systems Django Docker Docker Hub Drizzle DRY DuckDB Express FastAPI Flask Flutter For Beginners Front End Development Game Development GCN GCP Geospatial Git GitHub Actions GitHub Pages Gitlab GMS GoFr Golang Google Google Sheets Google Wire GPT-3 GPT3 Gradio Gradle Grafana Graphic Design GraphQL gRPC Guidance HMS Hotwire HTML Huawei HuggingFace IndexedDB InfoSec Interview iOS Jackknife Java JavaScript Jetpack Compose JSON Kafka Kotlin Kubernetes LangChain Laravel Linux LlaMA LLM localStorage Logging Machine Learning Magento Math Mermaid Micro Frontends Mobile Mobile App Development mondayDB MongoDB Mongoose MySQL Naming NestJS NET NetMock Networks NextJS NLP Node.js Nodejs NoSQL NPM OOP OpenAI OTP Pandas PDF PHP Playwright Plotly Polars PostgreSQL Prefect Productivity Programming Prometheus Puppeteer Pushover Python Pytorch Quarkus Rabbitmq RAG Ramda Raspberry Pi React React Native Reactor Redis REST API Revolut Riverpod RProgramming Ruby Ruby on Rails Rust Scalene SCDB ScyllaDB Selenium Servers Sklearn SLO SnowFlake Snowkase Software Architecture Software Development Solara Solid Spring Boot SQL SQLite Streamlit SudoLang Supabase Swift SwiftUI Tailwind CSS Taipy Terraform Testing Transformers TURN TypeScript Ubuntu UI Design Unix UX UX Design Vim Vite VSCode Vue Web Architecture Web Components Web Development Web Frameworks Web Scraping Web-разработка Webassembly Websocket Whisper Widgets WordPress YAML YouTube Zed Наука о данных Разное Тренды

Современный подход к разработке с использованием Next.js