Основы и базовые концепции


🇬🇧 / 🇷🇺

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

Смарт-контракт («умный контракт») — ключевой элемент, для которого в распределённом реестре Universa может храниться факт его верности (подтверждённости). Это структурированный документ (который можно представить в формах XML/YAML/JSON), который:

  • обладает весьма конкретной и строгой структурой, но при этом достаточную гибкой, чтобы позволять хранить самые разнообразные данные;
  • хранящиеся в котором данные могут быть ограничены всевозможными правилами, наложенными изначальным автором контракта (например, «только текущий владелец контракта может менять право собственности контракта»);
  • который сам по себе не хранится в сети/распределённом реестре Universa (и обычно хранить сам контракт — это обязанность конечного пользователя);
  • … но, если документ верен — сеть Universa может хранить и подтверждать этот факт безопасным и нефальсифицируемым образом;
  • который (мы всё ещё о смарт-контрактах!) можно редактировать, и новые версии (ревизии) которого можно опять-таки регистрировать в Universa (вероятно, отзывая при этом предыдущие, на которых новые версии базируются);
  • любая новая ревизия которого может быть зарегистрирована, только если предыдущая ревизия (на которой новая базируется) подтверждена (approved) сетью Universa, и эта новая ревизия получена из старой посредством какой-то легитимной операции (не противоречащей правилам/разрешениям, уже заданным в контракте).

Это интересно: альтернативные платформы смарт-контрактов могут использовать совершенно другие определения для смарт-контракта, например, «смарт-контракт — это распределённое приложение/Dapp, хранящееся в распределённом реестре и запускаемое каждым узлом сети». Universa не является «виртуальной машиной для запуска распределённых приложений», Universa — это именно что полноценная платформа для «умных контрактов», в которой «ум» таких контрактов не требует от вас писать какие-либо приложения.

Если вы хотите изучить создание смарт-контрактов на Universa, добро пожаловать в наш раздел Smart Contract Designer Central!

Токены

Важный и популярный сценарий использования смарт-контрактов — это создание токенов (tokens) или прочих «монет»/криптовалют (во время всевозможных мероприятий ICO/TGE), и раздача их среди покупателей.

В архитектуре Universa ограничения, накладываемые авторами контрактов, обеспечиваются описанными в смарт-контракте разрешениями (permissions). Одно из таких разрешений — это разрешение «split-join» (разделение/слияние), подразумевающее примерно следующее:

  • во всех контрактах этого семейства имеется поле «значение», содержащее какое-то число;
  • несколько новых ревизий смарт-контракта могут быть легитимно «отделены» (split) от ревизии только в том случае, сумма «значений» в них совпадает со «значением» в базовой ревизии;
  • несколько ревизий смарт-контракта могут быть легитимно объединены (join) в новую (новые), только если итоговое новое «значение» совпадает с суммой «значений» в базовых ревизиях.

Создание «умного контракта» в таком виде и корректная настройка такого разрешения делает смарт-контракт «взаимозаменяемым» (в экономическом смысле слова), создавая таким образом токенообразный смарт-контракт.

Токены Universa

Как вы уже поняли, создавать токены в Universa чрезвычайно легко; а некоторые токены для вас уже предварительно созданы, и плюс к тому они могут иметь некоторое дополнительное значение для функционирования Universa.

Один из самых главных токенов для Universa — это UTN. Это уже заранее созданный токен, предназначенный для использования в сети Universa с целью оплаты операционных издержек/комиссий.

Для более эффективного взаимодействия Universa с уже имеющимися платформами (например, биржами), и чтобы обеспечить для вас возможность фактически приобретать токены для оплаты сетевых комиссий, парный ему токен UTNP был создан в виде ERC20-токена в сети Ethereum. Исторически, это первый из двух токенов, появившийся как «placeholder»-токен (поэтому и название UTNP). Оба токена конвертируются друг в друга по курсу 1:1 (хотя, разумеется, комиссии сетей всё равно придётся оплатить); и вы можете использовать любой из них для оплаты комиссий сети Universa.

graph TD subgraph Сеть Universa utn(Токен UTN) end subgraph Сеть Ethereum utnp(Токен UTNP ERC20) end pay[... оплата комиссий сети Universa ...] utn-->pay utnp-->pay

Общий запас (total supply) каждого из этих токенов составляет 4 997 891 952 (это количество токенов было эмитировано после завершения процесса продажи токенов, token sale). Но надо учесть, что для любого объёма токенов UTN, выпущенных в активное обращение, соответствующее количество UTNP-токенов зарезервировано внутри Universa, и наоборот. Таким образом, 4 997 891 952 — это ещё и инвариантный «оборотный запас» (circulating supply) для обоих токенов UTN и UTNP суммарно; при этом оборотный запас каждого из них может непрерывно варьироваться в этих рамках.

Внимание: не любой токен, который в интерфейсе Universa назван “UTN”, является полноценным UTN-токеном, поддерживаемым Universa! Также как и не любой ERC20-токен в сети Universa, записанный как “UTNP” или “UTN-P”, является полноценным UTNP-токеном, поддерживаемым Universa. Название токена не является уникальным идентификатором. Будьте внимательны и перепроверяйте, какие токены вам дают, чтобы не быть обманутыми.

Больше подробностей об этих токенах (в частности, как их можно приобретать, и как можно отличить официальные поддерживаемые токены Universa от любых других) можно прочитать в статье Universa tokens: UTN/UTNP.

Гипертокены

Другая разновидность уже созданных токенов Universa — это так называемые «Гипертокены» (Hypertokens), а именно (на данный момент) UltraBTC и UltraETH. Они обеспечивают прямое отображение сторонних валют/ценностей в смарт-контракты Universa; и, внутри Universa, они меняются 1:1 (не забывайте про технические комиссии!) с исходным ресурсом, на котором они основаны (UltraBTC базируется на Bitcoin в блокчейне Bitcoin Core; UltraETH основывается на Ether в блокчейне Ethereum).

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

Осторожно! не любой токен, который в интерфейсе Universa назван как “UltraBTC”/“uBTC” или “UltraETH”/“uETH”, является полноценным гипертокеном, поддерживаемым Universa! Название токена не является уникальным идентификатором. Будьте внимательны и перепроверяйте, какие токены вам дают, чтобы не быть обманутыми.

В будущем, могут появиться и другие гипертокены, обеспечивающие Universa-представление для ценностей на других блокчейнах (включая не только родные «монеты/криптовалюты» блокчейнов, но и создаваемые поверх таких блокчейнов токены; как, например, гипертокены для Ethereum-токенов ERC20).

Секретные ключи / публичные ключи / ключевые пары

Модель безопасности и прав доступа Universa базируется на асимметричной криптографии (см. Wikipedia, если хотите узнать больше). Это значит, что, чтобы пользоваться Universa, каждый пользователь должен создать свою собственную ключевую пару (key pair), состоящую из «секретного (закрытого) ключа» (private key) и «открытого (публичного) ключа» (public key), связанных между собой; после чего пользователь сможет использовать их для подписи своих операций.

Секретный ключ (закрытый ключ, private key), как уже можно догадаться из слова «секретный» — это наиболее «потайная» часть вашей ключевой пары. Никогда, никогда не давайте его и даже не предоставляйте возможность доступа к нему никаким третьим лицам! Если кто-то заполучит ваш секретный ключ — он сможет выполнять любые действия в Universa от вашего лица. Хранить ваш секретный ключ надёжно — это исключительно ваша задача; более того, вся функциональность Universa основывается на предположении, что, если какая-то операция подписана вашим секретным ключом — это вы её выполнили. Если вам нужна какая-то ещё более понятная метафора, представьте, что секретный ключ — это ваш маленький личный штемпель, который никто, кроме вас, не может использовать, и который позволяет вам ставить вашу уникальную подпись/штамп на любые документы.

Публичный ключ (открытый ключ, public key) — он, хм… наоборот, открыт для всех. Его можно (и даже нужно) распространять всем тем, с кем вы общаетесь и взаимодействуете в рамках Universa. Его можно записывать во всевозможные поля контракта — например, в поля creator («создатель») или owner («владелец»). Представьте, что публичный ключ — это ваше совершенно уникальное имя (надеюсь, вас зовут не Иван Петров), под которым вас все знают, и по которому вас можно однозначно идентифицировать.

Как в целом всё это используется? Простой пример: типичный токенообразный смарт-контракт имеет поле owner (владелец), в котором может быть записан ваш публичный ключ; и это значит, что только вы — используя парный к этому публичному ключу секретный ключ, можете подписать какую-нибудь операцию, чтобы воспользоваться хранящимися в этом смарт-контракте токенами.

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

Адреса

Адрес — это короткое альтернативное представление вашего публичного ключа, достаточно удобное, чтобы его можно было вводить при заполнении всевозможных форм. Для вашего удобства, вы можете (на ваш выбор) использовать или короткий адрес (short address, длиной в 51 символ) или длинный адрес (long address, 72 символа в длину). Они оба относятся к одному и тому же публичному ключу; при этом длинный адрес обеспечивает максимально возможный уровень безопасности, но даже короткого адреса вполне достаточно для подавляющего большинства случаев.

Регистр символов в адресе — имеет значение, а сами символы принадлежат алфавиту Base58. Если вы хотите узнать про адреса ещё больше, для вас приготовлена статья Key address.

Клиенты

Для сети Universa доступны несколько клиентских приложений.

Большинство пользователей могут начинать знакомство с Веб-клиента (Web Client), доступного по адресу (https://access.universa.io/contracts). Хотите узнать про него больше — читайте статью Web Client.

Более продвинутые пользователи, которым требуется интегрировать Universa с их уже имеющимися решениями, могут использовать консольное приложение Uniclient CLI, которое можно скачать на ваш компьютер и запустить на Windows, macOS, Linux или любой другой платформе, поддерживающей Oracle Java. Больше подробностей — на странице Uniclient.

Кошельки

Некоторые пользователи иногда задают вопрос, «а когда выйдет кошелёк Universa?»

Стоит помнить, что Universa — это не «криптовалюта» и не «монета», чтобы иметь «кошелёк» (как приложение). В первую очередь, это платформа для смарт-контрактов; и хотя в ней можно создать много всевозможных токенов (или даже «криптовалют»/«монет»), но это далеко не единственные возможные применения смарт-контрактов.

«Кошелёк» в Universa — это не то что бы какое-то отдельное «приложение», это всего лишь одна из функциональностей, уже доступная в клиентах Universa. Т.е., например, если у вас есть какие-то токенообразные контракты, в интерфейсе Веб-клиента они автоматически собираются в «кошельки» (Wallets).

Если вы получите токены UTN в вашем веб-клиенте, они будут отображаться в отдельном кошельке. Если, во время любого другого ICO/TGE, проводящегося на платформе Universa, вы получите какие-то ещё токены, они автоматически соберутся в независимый кошелёк, аналогично, всё в том же давно доступном клиентском интерфейсе.

Это любопытно: а вы знаете, что сеть Testnet Universa была запущена 7го ноября 2017го года (в течение второй недели Token Sale); а уже на следующее утро один из участников комьюнити анонсировал в нём пользователя TeddyBear, который раздавал «постучавшимся» к нему пользователям свеже-сделанные (на базе Universa) токены HUGОбнимашки») бесплатно? Бесплатные обнимашки, разве это не прелестно? 💖💖💖

Mainnet/Testnet

Главная сеть, в которой хранится распределённый реестр Universa, так и называется — Mainnet (буквально, «главная сеть»). Это распределённая сеть, работающая между нескольких узлов (nodes, «нод»), часть из которых поддерживаются силами Universa Foundation, а остальные запущены третьими лицами (получающими пропорциональную долю от всех комиссий за регистрации смарт-контрактов, проходящих в сети). (Mainnet был запущен 12-го апреля 2018-го года. Если вам любопытно, вы можете посмотреть текущий статус сети).

В других проектах, сети Mainnet и Testnet («тестовая сеть») часто разделены; в таких случаях сеть Testnet — это аналог основной сети, более дешёвый (или, в каких-то пределах, бесплатный) в использовании и поэтому пригодный для всевозможных задач по разработке/экспериментированию/отладке, но зачастую такая сеть не обладает абсолютной совместимостью с Mainnet или отличается от неё в каких-то важных настройках.

В Universa, даже затраты на регистрацию в основной сети Mainnet чрезвычайно малы (около $0.01 за базовую регистрацию контрактов).

Но Testnet, «тестовая сеть», в Universa также есть. При этом это даже не отдельная и независимая сеть, а скорее режим хранения факта подтверждённости контракта; регистрация контракта в Testnet существенно дешевле, чем в Mainnet, но значительно ограничена во времени хранения. Кроме того, данные, хранящиеся в Testnet, в любой момент могут быть стёрты, в то время как данные в Mainnet хранятся настолько долго, как это необходимо. Testnet был запущен 7-го ноября 2017-го года.

Если вы хотите запустить свой собственный узел сети, добро пожаловать в раздел Node Owner Central.

“U”

Если вы хотите использовать сеть Universa, вам придётся иметь какое-то количество токенов UTN/UTNP, чтобы оплачивать сетевые операции. В целом, все операции на чтение из Universa бесплатны, а все операции «Зарегистрируйте контракт в Universa» — платные. Внутренняя единица сети Universa, соответствующая количеству ресурсов, которые должна потратить сеть на выполнение вашей операции, называется U.

Следовательно, чтобы работать с Universa, вам обычно нужно пополнить ваш «баланс U» (U balance), воспользовавшись пунктом «Зарезервировать ещё U» (“Reserve more U”) в интерфейсе Веб-клиента. При этом вы приобретёте какой-либо «Пакет Universa» (“Universa pack”), который при этом обычно зарезервирует некоторое добавочное количество U для оплаты регистраций в Mainnet, и вдобавок к ним ещё и щедрое количество “тестовых U” (“test U”), для оплаты регистрации в Testnet. Сделать это вы можете с помощью как UTN, так и UTNP-токенов в зависимости от того, какие у вас уже есть.

Регистрация обычной и самой простой транзакции уменьшит ваш баланс всего лишь на 1 U; более сложные комбинации контрактов потратят больше единиц U из вашего баланса.

(Технологически и “U” и “тестовые U” — это просто ещё один особый вид смарт-контрактов Universa).

graph TD subgraph Сеть Universa utn(fa:fa-address-card-o Токен UTN) u(fa:fa-address-card-o Смарт-контракт Universa pack:
пополнение баланса U
пополнение баланса тестовых U) end subgraph Сеть Ethereum utnp(ERC20-токен UTNP) end pay[Приобретаете пакет Universa] utn--платите-->pay utnp--платите-->pay pay--получаете-->u

Крипто-Облако (Crypto Cloud)

Крипто-Облако (Crypto Cloud) — это дополнительная платформа, предоставляемая вам командой Universa, чрезвычайно плотно интегрированная с Веб-Клиентом Universa, но в целом ортогональная (опциональная) для функционирования самой сети Universa.

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

graph LR subgraph Ваш диск subgraph Ваши секретные ключи pk(fa:fa-file-o fa:fa-key Секретный_ключ_1.unikey
fa:fa-file-o fa:fa-key Секретный_ключ_2.unikey
fa:fa-file-o fa:fa-key Секретный_ключ_3.unikey) end subgraph Ваши смарт-контракты c(fa:fa-file-o fa:fa-address-card-o Смарт_контракт_1.unicon
fa:fa-file-o fa:fa-address-card-o Смарт_контракт_2.unicon
fa:fa-file-o fa:fa-address-card-o Смарт_контракт_3.unicon) end end subgraph Сеть Universa uni[Подпись операций в сети Universa] end pk--подписываете контракты-->uni c--отправляете-->uni

Для этих целей Крипто-Облако и создано.

В Веб-клиент его поддержка интегрирована чрезвычайно глубоко; и поэтому, когда вы входите в Веб-клиент с помощью диалога “Log In or Sign Up”, по факту вы входите или регистрируетесь в Крипто-Облаке.

graph LR subgraph Ваш диск pk(fa:fa-file-o fa:fa-key Секретный_ключ.unikey) end subgraph Крипто-Облако subgraph Ваши зашифрованные данные pkC(fa:fa-key Секретный ключ 1
fa:fa-key Секретный ключ 2
fa:fa-key Секретный ключ 3) cC(fa:fa-address-card-o Смарт-контракт 1
fa:fa-address-card-o Смарт-контракт 2
fa:fa-address-card-o Смарт-контракт 3) end end subgraph Сеть Universa uni[Подпись операций в сети Universa] end pk--расшифровываете-->pkC pk--расшифровываете-->cC pk--подписываете контракты-->uni pkC--подписываете контракты-->uni cC--отправляете-->uni
или
graph LR you((fa:fa-user ВЫ)) pwd(fa:fa-key ваш пароль) subgraph Крипто-Облако subgraph Ваши зашифрованные данные pkC(fa:fa-key Секретный ключ 1
fa:fa-key Секретный ключ 2
fa:fa-key Секретный ключ 3) cC(fa:fa-address-card-o Смарт-контракт 1
fa:fa-address-card-o Смарт-контракт 2
fa:fa-address-card-o Смарт-контракт 3) end end subgraph Сеть Universa uni[Подпись операций в сети Universa] end you--вводите-->pwd pwd--расшифровываете-->pkC pwd--расшифровываете-->cC pkC--подписываете контракты-->uni cC--отправляете-->uni

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

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

Чтобы полностью использовать Крипто-Облако, вам нужен ненулевой «Баланс U»; впрочем, сам этот баланс будет уменьшаться исключительно во время обычных операций по регистрации контрактов в сети Universa.

Чаты

Одна из приятных особенностей Крипто-Облака — это функциональность чатов (“Chats”). Вы можете начать диалог с любым другим пользователем Крипто-Облака, посылать друг другу сообщения и даже обмениваться смарт-контрактами или токенами. Чаты Крипто-Облака также шифруют все данные на стороне пользователя, но в ещё более продвинутой степени: вся информация чата попадает в облако исключительно в зашифрованной форме, и только участники чата могут расшифровать её.

Ник/псевдоним (Nick)

Любой пользователь Крипто-Облака может завести себе один или несколько уникальных «ников» (nick, nickname – «псевдонимов»).

В обычных платформах для чатов/мессаджинга, идентификатор/ник/имя пользователя обычно уникальны и единичны, и по ним этого пользователя можно однозначно найти в этой платформе. Например, Иван Петров может завести себе в каком-нибудь мессенджере ник ivanpetrov.

В Крипто-Облаке у этого же самого Ивана Петрова могут быть одновременно ники ivanpetrov, ivan_valeryanovich_petrov и даже _.:= TPOJlJlEU6YC U3 6YXAHKU =:._, одновременно и при этом для различных целей. Нет, ну правда, по-вашему, люди, которые знают человека под именем ivan_valeryanovich_petrov, должны знать, что иногда этот же человек называет себя _.:= TPOJlJlEU6YC U3 6YXAHKU =:._? И более того — стоит ли говорить тем, кто знает этого человека как _.:= TPOJlJlEU6YC U3 6YXAHKU =:._, что на самом деле его зовут ivan_valeryanovich_petrov?

Но обратите внимание: чтобы найти пользователя в Крипто-Облаке (и начать с ним диалог), вам нужно знать его ник точно! Поиск по нику найдёт только «полное совпадение». Благодаря использующимся в основе всего этого механизмам шифрования, в Крипто-Облаке даже нет централизованного списка всех зарегистрированных ников. Но если вы поищете какой-то конкретный ник, вы узнаете, занят он или нет.

Пароль (Password)

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

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

Обратите внимание: эта функциональность — это функциональность исключительно Крипто-Облака; а если вам понадобится работать с самой сетью Universa, без всех удобств Веб-клиента с интегрированной поддержкой Крипто-Облака, вам по-прежнему будут нужны секретные ключи.