Я начал писать свой первый смарт-контракт для EOS и мне пришлось преодолеть некоторые препятствия. Этого следовало ожидать, потому что EOS еще даже не выпущена, а мы работаем с быстро меняющейся тестовой версией до июня этого года. Кроме того, единственная информация поступает из вики GitHub, остальное задокументировано только в коде. Тем не менее, когда все настроено и работает, я должен сказать, что опыт разработки смарт-контрактов оставляет желать лучшего.
Вот что мне нужно делать каждый раз, когда я начинаю работать над своим проектом EOS:
- Запустите виртуальную машину под управлением Ubuntu 16 с моей установкой EOS.
- Запустите локальную тестовую сеть: запустите службу
eosd
, которая прослушивает и обрабатывает мои транзакции и создает блоки для блокчейна. - Откройте кошелек, содержащий закрытые ключи моих тестовых учетных записей контрактов, с помощью
eosc wallet open -n default
- Разблокируйте этот кошелек с помощью
eosc wallet unlock -n default <<< 'password'
Вот цикл, через который я прохожу при разработке:
- Внесите изменения в файл
.cpp
моего смарт-контракта. - Скомпилируйте его в WebAssembly с помощью
eoscpp -o contract/TestContract.wast contract/TestContract.cpp
- Всякий раз, когда изменяется ABI (публичный интерфейс смарт-контракта), мне нужно перекомпилировать его с помощью
eoscpp -o contract/TestContract.abi contract/TestContract.hpp
- Загрузите измененный смарт-контракт в блокчейн с помощью
eosc set contract test contract/TestContract.wast contract/TestContract.abi
- Вызов смарт-контракта с помощью
eosc push message test actionname '{"key":"value","some":"json"}' --scope test --permission test@active
- Просмотрите
eosd
журнал, чтобы увидетьprint
отладочные заявления моих контрактов.
Я думаю, что большинство разработчиков децентрализованных приложений пришли из сферы веб-разработки, где в настоящее время вы получаете немедленную обратную связь при изменении кода с помощью горячей перезагрузки или через тестировщиков, отслеживающих изменения файлов. . Немедленная обратная связь важна для творческого процесса.
Конечно, разработка блокчейн-децентрализованных приложений все еще находится на очень ранней стадии, и многие инструменты, которые появятся позже, отсутствуют. Но зачем ждать, когда мы можем изменить будущее прямо сейчас. Вот несколько мыслей о том, как упростить разработку смарт-контрактов. Это хорошая идея, чтобы полностью забыть, как обстоят дела прямо сейчас, чтобы изменить перспективу и начать с вопросов:
Как бы это выглядело, если бы это было легко? — Тим Феррис
Как бы выглядела разработка децентрализованных приложений, если бы это было легко?
Это будет выглядеть примерно так:
- Нет начальной фазы настройки. Вы просто создаете проект. (Возможно, какая-то начальная конфигурация для конкретного проекта.)
- Вы меняете код своего смарт-контракта
.cpp
и нажимаете «Сохранить». Он компилируется, и смарт-контракт обновляется в вашей локальной тестовой сети. - Вы запускаете кучу тестов для недавно развернутого смарт-контракта.
Как мы можем этого добиться?
У Ethereum уже есть отличная среда разработки Truffle, которая умеет многое из этого:
Встроенная компиляция смарт-контрактов, связывание, развертывание и управление двоичными файлами. Автоматизированное тестирование контрактов для быстрой разработки.
Truffle также поставляется с Ganache, который представляет собой внутреннюю реализацию Javascript для блокчейна Ethereum, доступную на всех платформах.
Конечной целью EOS должно быть нечто похожее на Truffle. Чтобы быстро создать прототип и поиграть с тестовыми версиями EOS сегодня, мы также могли бы сделать следующее:
- Переместите тестовый блокчейн EOS в облако. Например, мы можем запустить дроплет Digital Ocean с Ubuntu и установить там EOS. Вы можете связаться с удаленным
eosd
, указав хост и порт в командеeosc
:eosc -H <ip> -p 8888
- Используйте eosjs для вызовов API и для написания тестов. EOSjs — это библиотека JavaScript общего назначения для блокчейна EOS. Таким образом, вы можете избавиться от локальной настройки EOS.
const fs = require('fs')
const Eos = require('eosjs')
const {ecc} = Eos.modules
// for CPP -> WASM compilation
const binaryen = require('binaryen')
initaPrivate = '5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3'
// New deterministic key for the currency account. Only use a simple
// seedPrivate in production if you want to give away money.
const testPrivate = ecc.seedPrivate('test')
const testPublic = ecc.privateToPublic(testPrivate)
const keyProvider = [initaPrivate, testPrivate]
const eos = Eos.Localnet({keyProvider, binaryen, httpEndpoint: 'http://127.0.0.1:8888'})
// This is only needed once to set up the account
eos.newaccount({
creator: 'inita',
name: 'test',
owner: testPublic,
active: testPublic,
recovery: 'inita',
deposit: '1000 EOS'
})
const contractDir = `contract`
const wast = fs.readFileSync(`${contractDir}/test.wast`)
const abi = fs.readFileSync(`${contractDir}/test.abi`)
// To publish contract to the blockchain:
eos.setcode('test', 0, 0, wast, abi)
module.exports = {
eos,
}
Чтобы протестировать свой контракт, вы можете использовать любую среду тестирования JavaScript. Я использовал jest
в этом примере:
const { eos } = require('../config')
test('"test" has correct balance upon "test" action', async () => {
const contract = await eos.contract('test')
// you can now call any action defined in the ABI of the contract
// eosc push message test actionname '{"key":"value","some":"json"}' --scope test --permission test@active
const transaction = await contract.test('value', 'json')
const newBalance = (await eos.getAccount('test')).eos_balance
expect(newBalance).toBe('10.0000 EOS')
});
Таким образом, мы решили, как протестировать ваш смарт-контракт EOS. Мы могли бы добавить наблюдатель, который следит за изменением файлов .cpp/.hpp
, а затем запускает скрипт, который перекомпилирует их и развертывает в нашей удаленной тестовой цепочке блоков. Добавления закрытого ключа контрактной учетной записи в массив keyProvider
должно быть достаточно, чтобы подписать транзакцию, а это означает, что мы также можем избавиться от локального запуска нашего разблокированного кошелька. Это приближает нас к цели: вообще не настраивать EOS локально, а просто запускать сценарии NPM для связи с блокчейном EOS.
Это лишь некоторые идеи, которые пришли мне в голову при разработке моего первого смарт-контракта EOS. Я попробую их и улучшу. После того, как рабочий процесс, который мне подходит, я создам последующий пост.
Было бы неплохо услышать, как выглядит ваш рабочий процесс разработки EOS.
Первоначально опубликовано на cmichel.io