Смартконтракти Waves. Перший досвід
У квітні 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 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 секунд перед передачею зарплат.
Сподіваюся, що стаття була інформативною і буде корисна Вам для написання Вашого першого смарт-контракту.