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 на момент старта).
Более подробно о конкурсе можно прочитать в этой статье.