Как стать автором
Обновить
0

«Автономные Агенты» или исполняем код в открытой криптоплатформе Obyte

Время на прочтение9 мин
Количество просмотров2.1K


Obyte — это открытая крипто платформа, использующая в качестве реестра транзакций Directed Acyclic Graph (DAG, направленный граф без циклов) вместо блокчейна, со свободным равным доступом к реестру для всех участников. DAG, в отличие от привычного всем блокчейна, даёт возможность отправлять данные в распределённый реестр напрямую без участия майнеров за счёт отказа от блоков и от строгой упорядоченности транзакций. По сравнению с блокчейнами, DAG архитектура не нуждается в привилегированных классах пользователей, таких как майнеры, форджеры или блокпродюсеры, поэтому в сети нет посредников между пользователем и реестром, и каждый имеет равный и прямой доступ на добавление транзакций в реестр.

В этой статье я бы хотел рассказать о Obyte, Автономных Агентах и сравнить всё это с Ethereum.

Что такое Автономные Агенты? 


Это программа, исходный код которой хранится в реестре (DAG) и имеющая собственный адрес, аналогичный адресам любых других участников сети. В программе описаны действия, которые будут выполнены в ответ на отправку монет и данных на этот адрес. Если вам знакомы смарт-контракты Ethereum, Автономные Агенты очень близки по смыслу с ними.

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

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

Выполнение кода АА начинается после того, как триггер-транзакция стабилизировалась (то есть наступил консенсус по транзакции и double spend точно отсутствует). Каждая full-нода будет исполнять код AA на своей копии реестра, и записывает результат исполнения только в свою базу. Нет необходимости ретранслировать результат исполнения другим нодам, т.к. состояние всех участником сети одинаково и результат исполнения тоже детерминирован и одинаков для всех. Финальное состояние реестра определено только правилами исполнения АА, и не контролируется ни майнерами, ни голосующими, ни кем другим.

Зачем они нужны?


АА позволяют в децентрализованном режиме создавать  такие вещи как

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

И многое другое…

Прозрачность для пользователя


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

Несмотря на тот факт, что Oscript – язык программирования, и создан для восприятия машиной и программистами, а не обычными людьми, мы старались не отходить от наших принципов. Поэтому для людей, не знакомых с программированием, GUI кошелёк попытается до совершения транзакции интерпретировать код АА и показать человеку результат в понятной ему форме:



Oscript — язык автономных агентов


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

Сначала хотелось бы разобрать особенности. 

AA срабатывает только на инициирующие транзакции. Это может быть или просто платёж, или передача данных АА. Например, вы передаёте данные {foo: ‘bar’, value: 100} и они будут получены АА как input, и на основе этого выполнены действия.

К чему есть доступ у АА


  • к любым переменным, описывающим текущее состояние DAG
  • суммы, полученные в trigger транзакции
  • данные из trigger транзакции
  • кто отправил trigger транзакцию
  • переменные состояний нашего и других АА
  • доступ к различным публичным данным из DAG, таким как data_feed от ораклов, real name attestations, etc.
  • балансы нашего и других АА
  • информация об активах (asset)

Возможности Oscript


Oscript — НЕ Тьюринг полный язык, тем не менее, в его арсенале имеются:

  • арифметические операции
  • логические операции (и, или и т.д.)
  • сравнения
  • конкатенация строк
  • некоторые математические функции
  • криптографические функции (создание hash, проверка подписей)
  • ветвления (if/else)
  • нет циклов и функций (для предотвращения бесконечных рекурсий). Более подробно можно узнать в справочнике по этой ссылке

Для контроля использования ресурсов и предотвращения вредоносных сценариев, АА ограничены максимумом в 100 трудоёмких операций, таких как крипто-функции или доступы к базе данных. Проверка происходит в момент деплоя кода Агента.

Зато нет никаких сложных формул для вычисления стоимости исполнения АА. Таких формул вообще нет, исполнение кода является бесплатным, пользователи, как и сам АА, платят только за добавление данных в реестр DAG, как и любые другие участники сети – 1 byte в валюте Obyte на каждый байт данных, добавленных в DAG. Однако АА должен поддерживать свой баланс в байтах не меньше, чем размер всех хранимых им переменных состояния.

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

Автономные агенты в действии


Теперь мы напишем простейший ping-pong сценарий. Мы отправляем AA деньги, он оставляет какую-то сумму себе и отправляет остальное назад. Мы решим одну и ту же задачу на двух платформах — Obyte и Ethereum, и сравним. В Ethereum аналогичные AA сущности обычно называются смарт контрактами (хотя Ethereum white paper один раз называет их автономными агентами).

Ethereum


Я всё буду делать через geth. Запустим ноду в light режиме и дождёмся синхронизации.

geth --testnet --ws --wsapi "admin,db,eth,net,web3,personal" --syncmode "light" --allow-insecure-unlock

Теперь у нас два варианта развития событий:

  1. дождаться пока пиры будут обнаружены, и начнётся синхронизация
  2. добавить пиров вручную

Я выбрал второй вариант. И в этом на помощь приходит rfikki и его готовый список команд. Подключаемся к ноде и добавляем пиров:

geth attach ws://127.0.0.1:8546
admin.addPeer("enode://bc827e035cf3a42c249374be7ddc9c2fb819765c440116cf01aa6a8d70d03043d29ccd42b32a283f5ab08294467eb3b92fc40111e9af1770c84bc116edae89c0@104.248.199.52:30303");
admin.addPeer("enode://2d86877fbb2fcc3c27a4fa14fa8c5041ba711ce9682c38a95786c4c948f8e0420c7676316a18fc742154aa1df79cfaf6c59536bd61a9e63c6cc4b0e0b7ef7ec4@13.83.92.81:30303");
admin.addPeer("enode://053d2f57829e5785d10697fa6c5333e4d98cc564dbadd87805fd4fedeb09cbcb642306e3a73bd4191b27f821fb442fcf964317d6a520b29651e7dd09d1beb0ec@79.98.29.154:30303");
admin.addPeer("enode://690c93ac2f6e6f711a175cc6a73a3cf3b649eea83c458ce34364c69d1b557bb408693f06bdf6fc31538a744d5c231fdd904cce5665d04ce165032c0fc009a208@104.248.199.160:30303");

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

personal.newAccount();

В консоли мы увидим адрес, скопируем его и перейдём на faucet. Вставляем в поле и жмём отправить. 
Теперь проверим синхронизацию:

eth.syncing # должно быть false
eth.blockNumber # должен быть равен номеру самого верхнего блока https://ropsten.etherscan.io/

И проверим баланс:

eth.getBalance(eth.accounts[0]) # будет равен 1000000000000000000

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

Создадим файл, например pingPong.sol и напишем в него наш контракт:

pragma solidity ^0.5.10;

contract PingPong{
    function deposit() payable public {
        msg.sender.transfer(msg.value - 20000);
    }
    
    function getBalance() public view returns(uint256){
        return address(this).balance;
    }
}

В данном контракте мы создаём две публичные функции:
deposit — вызываем пополнением и возвращаем за вычетом 20000.
getBalance — просто показывает нам баланс адреса контракта.

Далее нам его нужно скомпилировать, для этого я использую npm модуль solc:

solcjs -o . --bin --abi pingPong.sol

Теперь подготовим скомпилированные файлы к быстрой загрузке в geth клиенте. Изменим abi файл до вида
var pingPongContract = eth.contract([{"constant":true,"inputs":[],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"deposit","outputs":[],"payable":true,"stateMutability":"payable","type":"function"}]);

И bin до вида

personal.unlockAccount(eth.accounts[0])
var pingPong = pingPongContract.new(
{ from: eth.accounts[0],
data:
"0x608060405234801561001057600080fd5b5060fb8061001f6000396000f3fe60806040526004361060265760003560e01c806312065fe014602b578063d0e30db0146053575b600080fd5b348015603657600080fd5b50603d605b565b6040518082815260200191505060405180910390f35b6059607a565b005b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b3373ffffffffffffffffffffffffffffffffffffffff166108fc614e2034039081150290604051600060405180830381858888f1935050505015801560c3573d6000803e3d6000fd5b5056fea265627a7a723058207e0b24d2e575e02b188c16b22c5849ff30ecbd61dbdd0eabae34c43ba1522c6064736f6c634300050a0032",
gas: 500000});

Переходим в клиент geth и подключаем эти скрипты

loadScript('sol2/pingPong_sol_PingPong.abi')
loadScript('sol2/pingPong_sol_PingPong.bin')

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

Далее пишем `pingPong`. Если в результате вы видите, что адрес не пустой — контракт опубликовался, если нет — нужно немного подождать и попробовать ещё раз. 

После этого мы выполним функцию deposit, отправив деньги, и проверим как всё прошло.

personal.unlockAccount(eth.accounts[0]) 
pingPong.deposit({from: eth.accounts[0], value: 500000});

На выходе мы можем увидеть id транзакции. Скопируйте его, он нам понадобится позже. Перед этим вызовем функцию getBalance и увидим там 20000, которые мы вычитаем.

pingPong.getBalance()

Теперь перейдём на etherscan. Там будет видно в «Internal Transactions» обратный платёж на 48.000. У меня получилось так — https://ropsten.etherscan.io/tx/0xc3fab9f39f2ec32eadffc54608a61c3c77c4ac0f3630037b5c312d3b66ee85f8#internal

Obyte


Для публикации мы будем использовать Oscript editor

Очистите шаблон, который он нам предлагает. Мы будет писать с нуля. Минимальный АА – это объект с массивом messages.

{
messages: []
}

Так как мы будем отправлять платёж, нам нужно добавить в сообщения объект с указывающими на это свойствами:

{
messages: [
        {
            app: 'payment',
            payload: {
                asset: 'base',
                outputs: [
                    {address: "{trigger.address}", amount: "{trigger.output[[asset=base]] - 20000}"}
                ]
            }
        }
    ]
}

Здесь мы видим стандартные метаданные для платежа. Изменяются они с помощью "{}" в строках. Для передачи значений используется объект trigger, он хранит в себе информацию о полученном платеже. Более подробно познакомиться с синтаксисом можно в документации.

Вставляем этот код в редактор и после чего нажимаем Deploy. Всё!
АА опубликован и снизу мы видим адрес. Теперь нам понадобится testnet GUI кошелек, установим его и запустим. Далее, чтобы получить немного тестовых монет, переходим в «чат», там выбираем «Bot Store» и добавляем «Faucet Bot». У нас откроется чат, жмём меню слева и выбираем «Вставить мой адрес»


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

Всё, что нам остаётся, – это перейти в «получить», вставить адрес АА, вписать сумму «500000» и нажать «отправить». Теперь нам необходимо подождать, пока транзакция стабилизируется (проверяя историю). Это нужно, чтобы сработал trigger. Проверим, пришли ли нам обратно деньги:



Вот и всё, всё работает. Перейдя в explorer по адресу АА мы можем увидеть, что его баланс увеличился на 20000 минус комиссия за платёж нам. В Obyte Автономные Агенты сами платят комиссию за совершаемые ими действия.

Выводы


Как мы можем увидеть из сравнения выше, у Obyte гораздо проще публикация, написание и контроль того, что произойдёт. Например, в Ethereum далеко не всегда мы можем правильно подобрать gas исходящей транзакции, из-за чего она может подтверждаться очень долго. Из преимуществ Ethereum можно выделить его быструю публикацию и подтверждение (около одной минуты, зависит от выставленного газа). В то время как в Obyte публикация происходит сразу, а время подтверждения зависит от нагрузки сети, при слабой нагрузке – около 10-15 минут, при большой – менее трёх минут.

В следующих статьях мы разберём несколько интересных и живых примеров, например как можно c помощью AA реализовать simple DAO и ответим на ваши вопросы.

Конкурс


В связи с нововведением, приглашаем разработчиков присоединиться к участию в конкурсе на самое интересное и впечатляющее применение Автономных Агентов. Конкурс уже идёт и продлится до середины октября. В качестве примеров из уже полученных заявок есть несколько краудфандинговых АА, две биржи, разнообразные «реестры» и трекеры репутаций, лотереи, игры и т.д. Каждые две недели жюри из членов команды Obyte объявляют лучшие заявки.

Общий бюджет конкурса – $38,000 (по курсу GB на момент старта).

Более подробно о конкурсе можно прочитать в этой статье.
Теги:
Хабы:
+7
Комментарии5

Публикации

Изменить настройки темы

Информация

Сайт
obyte.org
Дата регистрации
Дата основания
Численность
Неизвестно

Истории