- PVSM.RU - https://www.pvsm.ru -
В апреле 2018 года команда Waves представила свои не тьюринг-полные смарт-контракты.
Чуть позже, когда был объявлен Waves хакатон я решил что пришло время погрузиться в новую технологию. Под катом вы найдете детальную информацию о смарт-контракте, выигравшем третье место на хакатоне.
Статья будет полезна разработчикам для реализации собственных смарт-контрактов и знакомства с технологией
Идея проекта заключается в автоматическом распределении зарплат разработчиков программного обеспечения, использующих Github, пропорционально выполненной работе. Главная задача задача которую решает при этом смарт-контракт — избавляет нас от необходимости доверять программе распределяющей деньги, позволяет даже пользователю без навыков программирования проверить правильность распределения средств до передачи денег
Html и JavaScript (библиотека [1] Node.js Waves), открытый исходный код [2] на GitHub и демонстрация проекта [3] на Firebase Hosting
Лучшей точкой входа для начинающего разработчика является демонстрационная консоль [4], содержащая готорый пример и консоль для тестирования кода. Во время разработки лучше использовать тестовый блокчейн [5], где вы можете получить 10 бесплатных тестовых волн одним щелчком мыши [6]. И хотя Google пока еще не находит много примеров из-за новизны технологии, но смарт-контракты хорошо документированы [7] и содержат всю необходимую информацию.
Библиотека NodeJs (1.4.0) уже хорошо работает в браузерах (за исключением создания Alias), но, к сожалению, она еще НЕ совместима с Google Functions или React Native (разработчики Waves обещают [8] исправить это в ближайшее время).
Смарт-контракт создается для одной аккаунта и проверяет каждое действие с этим аккаунтом (за исключением входящих денежных переводов):
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 встроенной библиотеки [9] для получения адреса создателя запроса из его публичного ключа.
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]
Здесь [2] вы можете увидеть код проекта.
Надеюсь, что статья была информативной и будет полезна Вам для написания Вашего первого смарт-контракта.
Автор: Николай Липневич
Источник [10]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/293586
Ссылки в тексте:
[1] библиотека: https://github.com/wavesplatform/waves-api
[2] исходный код: https://github.com/Lipnevich/smart-rewarding
[3] демонстрация проекта: https://smart-rewarding.firebaseapp.com/
[4] демонстрационная консоль: http://demo.wavesplatform.com/example/console/
[5] тестовый блокчейн: https://testnet.wavesexplorer.com/
[6] одним щелчком мыши: https://testnet.wavesexplorer.com/faucet
[7] документированы: https://docs.wavesplatform.com/en/technical-details/waves-contracts-language-description.html
[8] обещают: https://github.com/wavesplatform/waves-api/issues/69#issuecomment-408843331
[9] библиотеки: https://docs.wavesplatform.com/en/technical-details/waves-contracts-language-description/standard-library.html
[10] Источник: https://habr.com/post/424111/?utm_source=habrahabr&utm_medium=rss&utm_campaign=424111
Нажмите здесь для печати.