Создание гипотетического денежного приложения на EOS.

Сегодня мы рады поделиться с Вами первым представлением о том, как работает EOS, и как разработчики создают на нем приложения.

Высокоуровневое описание

EOS структурирован как группа людей и/или сценариев (ботов), которые обмениваются между собой сообщениями. Это можно представить как систему электронной почты, где у каждого бота или пользователя есть свой аккаунт.

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

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

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

Публикуется код, а не бинарники

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

Структура приложения

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

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

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

Пример денежного приложения

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

Дисклеймер

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

Базовый денежный контракт

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

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

  to      AccountName
  from    AccountName
  amount  UInt64

struct Init

table Balance
  owner   AccountName
  balance UInt64

on Init action
   precondition:
     eos.requireAuthority( eos.thisAccount() )
     eos.require( !Balance.find( eos.thisAccount() ) ) /// only call once

   apply:
     self         = Balance.new()
     self.owner   = eos.thisAccount()
     self.balance = 100000  /// maximum currency supply
     Balance.save(self)
on Transfer action
   validate:
     // static validation, verifies action is internally consistent
     // no access to database tables
     eos.require( action.amount > 0 ) 
     eos.require( action.to != action.from ) 
     eos.requireNotify( action.to ) 

   precondition:
     // identify possible precondition check that can 
     // be executed with readonly access
     eos.require( Balance[action.from].balance >= action.amount )
     eos.requireAuthority( action.from )

   apply:
     // assuming all prior steps pass, perform the state transition
     // that updates balances and/or creates a new account for receiver
     var from = Balance[message.from]
     var to   = Balance.find( action.to )

     if( !to ) {
        to         = Balance.new()
        to.owner   = action.to
     }

     from.balance = from.balance - action.amount
     to.balance   = to.balance   + action.amount

    Balance.save(to)

    if( from.balance > 0 )
        Balance.save(from)
    else if( from != eos.thisAccount() ) 
        Balance.delete(from)

На заметку

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

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


follow me


Переведено @finch

Оригинал поста: ЗДЕСЬ

иСТОЧНИК https://steemit.com/ru/@blockchained/sozdanie-gipo...

golosboardОтветил finch
3 года назад

@finch Поздравляю! Вы добились некоторого прогресса на Голосе и были награждены следующими новыми бейджами:

Награды за количество постов, опубликованных

Вы можете нажать на любой бейдж, чтобы увидеть свою страницу на Доске Почета. Чтобы увидеть больше информации о Доске Почета, нажмите здесь

Если вы больше не хотите получать уведомления, ответьте на этот комментарий словом стоп

Голосуя за это уведомление, вы помогаете всем пользователям Голоса. Узнайте, как здесь.

Ответить
cheetahОтветил finch
3 года назад

Привет! Я робот. Я только что проголосовала за Ваш пост! Я нашла похожий контент, в котором могут быть заинтересованы читатели: https://steemit.com/ru/@blockchained/sozdanie-gipoteticheskogo-denezhnogo-prilozheniya-na-eos

Ответить
everythinkОтветил finch
3 года назад

Перевод нормальный, но причем тут Mapala?)

Ответить
primusОтветил everythink
3 года назад

Именно.

К тому же этот текст уже был тут опубликован 3 дня назад и в авторах перевода указан @rusteemitblog

Так что считаю необходимым поставить флаг на эту запись.

Ответить
finchОтветил primus
3 года назад

Понятно

Ответить
blockchainedОтветил finch
3 года назад

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

Ответить
kulturagolosaОтветил finch
3 года назад

Привет! :)

Мы - проект на Голосе, который направлен на борьбу с плагиатом, копипастой и кражей личности.

Репост скопированного контента не несет в себе никакой ценности и вредит развитию сообщества Голос, поэтому данный вид постов не приветствуется и рассматривается как неуважительное отношение к сообществу.

Как Вы можете поделиться понравившимся контентом, найденном на просторах интернета? Вот несколько советов:

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

  • Вы можете приводить цитаты в рамках своей авторской статьи, при этом всегда давайте ссылку на оригинал, а цитату оформляйте в кавычки или воспользуйтесь форматированием Markdown. При этом цитаты составляют не более ~20% от всего текста статьи.

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

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

Спасибо за сотрудничество!

Ответить