Смартконтракты Waves. Первый опыт

в 5:55, , рубрики: blockchain, first steps, smartcontracts, Waves, Криптовалюты, Программирование

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 секунд перед передачей зарплат.

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

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

Автор: Николай Липневич

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js