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
Теперь у нас два варианта развития событий:
- дождаться пока пиры будут обнаружены, и начнётся синхронизация
- добавить пиров вручную
Я выбрал второй вариант. И в этом на помощь приходит 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 на момент старта).
Более подробно о конкурсе можно прочитать в этой статье.
Комментарии (4)
Jetmanman
16.09.2019 06:51Раньше достаточно долго следил за Byteball, но потом понял, что он не предлагает ни большего масштабирования по сравнению с эфириумом или биткоином, не имеет даже децентрализации, а в будущем будет всего 12 валидаторов, которые еще 1.5 года назад так и не были распределены и управлялись основателем. Монеты также не имеют закона распределения и до сих пор до конца не распределены, т.е. централизовано всё. Сейчас так и осталось 15 транзакций в секунду? Опыт EOS показал, что сговор 15-20 блокпродюссеров легко осуществим, а у вас только 12 валидаторов и при этом никакого выбора валидаторов на основе PoS, DPoS, PoW, т.е. у вас модель PoA что-ли я так и не понял этого, т.к. выбор валидаторов осуществлялся насколько помню простым голосованием через кошельки при отправке транзакций, т.е. затраты на голосование только на околонулевую комиссию, так еще в каких-то случаях и одобрение большинства валидаторов необходимо для принятия нового валидатора, где здесь защита от атаки сибиллы непонятно, где децентрализация. Какие стимулы вообще кому-то переходить на Obyte? Какие стимулы запускать полный узел или становится валидатором? Да и зачем это все, если нет сильной децентрализации уже по умолчанию, 12 валидаторов, серьёзно?
obyte
17.09.2019 14:18Вопрос не относится к данной статье, но похоже, что вы, как и многие, совершаете очень распространенную ошибку — применяете шаблоны, работающие в блокчейнах, к другой архитектуре, в которой те же шаблоны не обязательно имеют тот же смысл.
Валидаторов не 12, каждая полная нода является валидатором и чтобы стать валидатором, нужно всего лишь запустить полную ноду. Доступ в реестр абсолютно открытый и равный для всех, в этом смысл выбора DAG. Никакого PoA нет, более того — никакого proof-of тоже нет, снова неприменимый шаблон. Вы правильно указали на EOS как доказательство степени контроля, который блок продюсеры имеют над сетью, в Obyte никто не решает о допуске или не-допуске транзакции, никто не может остановить добавление транзакции в реестр.
А транзакций в секунду теперь 30, что по-прежнему мало. Но есть решение, о котором мы ещё не объявили.
aleks_raiden
Вот про деривативы заманчиво, это наша специализация. Но отсутствие функций и циклов, думаеться, затруднит реализацию. Все же финансовые расчеты очень часто полагаються именно на циклы или расчет временных рядов.
То есть, иницировать выплату купонов всем держателям будет сложнее?
obyte
Деривативы это действительно тема для которой хорошо подходит DLT. Пространство для фантазии огромное, для реализации новых продуктов нужны всего лишь данные и токены, которые есть на DLT, а регуляторные ограничения неприменимы к автономным агентам, у которых нет владельцев.
Однако во всех задачах, что мы решали, до сих пор удавалось обходиться без циклов. Деривативы это обычно токены с конечным сроком обращения. Держатель посылает токен на AA и получает что-то в обмен. Каждый держатель делает это сам отдельной транзакцией, циклы не нужны.
С купонами сложнее (хотя купоны относятся к бондам, не к деривативам). Можно прибавлять купоны к стоимости бонда и выплачивать при погашении. Соответственно, накопленный купонный доход будут учитываться в текущей цене бондов, по которой они торгуются на рынке. Другой вариант, если хочется выплачивать купоны не дожидаясь погашения, это предложить держателям хранить их на специальном AA, с которого держатель может в любой момент вывести купоны, накопленные с момента предыдущего вывода.