В апреле 2018 года команда Waves представила свои не тьюринг-полные смарт-контракты.
Чуть позже, когда был объявлен Waves хакатон я решил что пришло время погрузиться в новую технологию. Под катом вы найдете детальную информацию о смарт-контракте, выигравшем третье место на хакатоне.
Статья будет полезна разработчикам для реализации собственных смарт-контрактов и знакомства с технологией
Идея
Идея проекта заключается в автоматическом распределении зарплат разработчиков программного обеспечения, использующих Github, пропорционально выполненной работе. Главная задача задача которую решает при этом смарт-контракт — избавляет нас от необходимости доверять программе распределяющей деньги, позволяет даже пользователю без навыков программирования проверить правильность распределения средств до передачи денег
Стек технологий
Html и JavaScript (библиотека Node.js Waves), открытый исходный код на GitHub и демонстрация проекта на Firebase Hosting
Процесс
- Пользователь выбирает репозиторий GitHub и определяет общую сумму зарплат
- Пользователь проводит платеж в 0,01 Волны (примерно 0,02 доллара) для сохранения данных в блокчейне и создания смарт-контракта
- Пользователь проверяет правильность данных и затем переводит сумму зарплат на адрес смарт-контракта
- Зарплаты распределяются между разработчиками
Разработка
Лучшей точкой входа для начинающего разработчика является демонстрационная консоль, содержащая готорый пример и консоль для тестирования кода. Во время разработки лучше использовать тестовый блокчейн, где вы можете получить 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 секунд перед передачей зарплат.
Онлайн демонстрация проекта на тестовом блокчейне, доступная здесь
Здесь вы можете увидеть код проекта.
Надеюсь, что статья была информативной и будет полезна Вам для написания Вашего первого смарт-контракта.
Автор: Николай Липневич