image

В апреле 2018 года команда Waves представила свои не тьюринг-полные смарт-контракты.

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

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

Идея


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

Стек технологий


Html и JavaScript (библиотека Node.js Waves), открытый исходный код на GitHub и демонстрация проекта на Firebase Hosting

Процесс


  1. Пользователь выбирает репозиторий GitHub и определяет общую сумму зарплат
  2. Пользователь проводит платеж в 0,01 Волны (примерно 0,02 доллара) для сохранения данных в блокчейне и создания смарт-контракта
  3. Пользователь проверяет правильность данных и затем переводит сумму зарплат на адрес смарт-контракта
  4. Зарплаты распределяются между разработчиками

Разработка


Лучшей точкой входа для начинающего разработчика является демонстрационная консоль, содержащая готорый пример и консоль для тестирования кода. Во время разработки лучше использовать тестовый блокчейн, где вы можете получить 10 бесплатных тестовых волн одним щелчком мыши. И хотя Google пока еще не находит много примеров из-за новизны технологии, но смарт-контракты хорошо документированы и содержат всю необходимую информацию.

Библиотека NodeJs (1.4.0) уже хорошо работает в браузерах (за исключением создания Alias), но, к сожалению, она еще НЕ совместима с Google Functions или React Native (разработчики Waves обещают исправить это в ближайшее время).

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


Смарт-контракт создается для одной аккаунта и проверяет каждое действие с этим аккаунтом (за исключением входящих денежных переводов):

let signature = base58’${currentWallet.keyPair.publicKey}’;
match tx {
case tx:TransferTransaction =>
{
  let employerAddress = addressFromPublicKey(tx.senderPk);
  let dateKey = toBase58String(addressFromRecipient(tx.recipient).bytes);
  let salary = extract(getLong(employerAddress, dateKey));
  if((salary == tx.amount) && sigVerify(tx.bodyBytes, tx.proofs[0], signature)) then true else false
}
case _ => false }

Построчный разбор смарт-контракта


let signature = base58’${currentWallet.keyPair.publicKey}’;

Здесь мы сохраняем открытый ключ кошелька (ваш JavaScript должен содержать переменную currentWallet созданную при помощи команды Waves.Seed.create()), для того, чтобы только сам аккаунт смарт-контракта кошелька (Smart Rewarding Project в нашем случае) мог перечислять средства.

match tx { case tx:TransferTransaction => {some validations}
case _ => false }

Это основная конструкция любого смарт-контракта Waves говорит нам, что этот контракт запрещает любую деятельность, кроме перевода средств (TransferTransaction). Таким образом, после создания контракта невозможно изменить данные о разработчиках (DataTransaction) или изменить сам смарт-контракт (SetScript).

let employerAddress = addressFromPublicKey(tx.senderPk);

Здесь используется базовый метод addressFromPublicKey встроенной библиотеки для получения адреса создателя запроса из его публичного ключа.

let dateKey = toBase58String(addressFromRecipient(tx.recipient).bytes);

Базовый метод addressFromRecipient получает адрес получателя средств

let salary = extract(getLong(employerAddress, dateKey));

Базовый метод getLong дает нам данные, хранящиеся в блокчейне по адресу создателя запроса, которые являются суммой зарплаты разработчика. Контракт может получить доступ к данным, сохраненным в блокчейне Waves (и НЕ может получить доступ к данным, расположенным на каком-либо веб-сайте или стороннем сервере).

if((salary == tx.amount) && sigVerify(tx.bodyBytes, tx.proofs[0], signature)) 
then true else false

Здесь происходит проверка правильности суммы и подписи. True означает, что транзакция будет разрешена, а false означает, что транзакция будет запрещена. Таким образом, при любой передаче денег с этого счета проверяется, что деньги будут отправлены только на кошелек разработчика и в сумму, уже сохраненную в блок-цепочке, в формате легко читаемой пары ключей (адрес как ключ и сумма как значение), что позволяет без доверия к программе, проверить все данные самостоятельно за 5-10 секунд перед передачей зарплат.

Онлайн демонстрация проекта на тестовом блокчейне, доступная здесь
Здесь вы можете увидеть код проекта.

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

Комментарии (3)


  1. ioppoi
    23.09.2018 13:08

    спасибо


  1. TimsTims
    23.09.2018 17:40
    +1

    автоматическом распределении зарплат разработчиков программного обеспечения
    Что? Зарплате, которой никто не доверяет, которая распеределяется «по честному»? Какой-то возврат к социализму. А как она учитывает сложность и качество кода? Зарплата зависит от количества символов?

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

    Главная задача которую решает при этом смарт-контракт — избавляет нас от необходимости доверять программе распределяющей деньги
    Вообще не понял. Ты же сам указываешь кому сколько переслать. Ты не доверяешь самому Wallet'у, который вместо адреса 1111 отправит их на 2222, думая что она деньги отправит не туда? Но это же бред.

    Единственный вариант, который я себе представляю когда такое будет использоваться — это когда есть некий заказчик ПО, который заказал разработку за N денег, и не хочет знать кто что будет делать. И собираются несколько разных разработчиков, каждый делая разную часть программы. Никто никому не доверяет(ага. и заказчик не разбирается в коде который ему прислали). Один Вася написал на 100 строк крутейший ИИ, а второй Йохан в 10 000 строк обработку текста, парсинг новостей(который тут не нужен), добавил виджет погоды, и получил в 100 раз больше Васи. Всё честно!


  1. rPman
    24.09.2018 00:11

    Дико странно видеть справочную статью для проекта, децентрализация которого (а это единственный смысл и причина смартконтрактов) находится под большим сомнением.
    golos.io/waves/@hultqvist/pochemu-waves-nelxzya-nazyvatx-deczentralizovannoij-birzheij-razoblachenie-lzhi-seo-waves-alesandra-ivanova

    Но спасибо, даже для этой платформы, пусть будут русскоязычные туториалы.