Смартконтракти Waves. Перший досвід

У квітні 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 обіцяють виправити це найближчим часом).

Читайте також  Azure DevOps для Commodore 64?

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

Смарт-контракт створюється для одного аккаунта і перевіряє кожну дію з цим обліковим записом (за винятком вхідних грошових переказів):

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 false else
}
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)) 
true then else false

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

Читайте також  Думку розробників про Steam: максимум доходів і мінімум відповідальності для Valve

Сподіваюся, що стаття була інформативною і буде корисна Вам для написання Вашого першого смарт-контракту.

Степан Лютий

Обожнюю технології в сучасному світі. Хоча частенько і замислююся над тим, як далеко вони нас заведуть. Не те, щоб я прям і знаюся на ядрах, пікселях, коллайдерах і інших парсеках. Просто приходжу в захват від того, що може в творчому пориві вигадати людський розум.

Вам також сподобається...

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *