Я начал писать свой первый смарт-контракт для EOS и мне пришлось преодолеть некоторые препятствия. Этого следовало ожидать, потому что EOS еще даже не выпущена, а мы работаем с быстро меняющейся тестовой версией до июня этого года. Кроме того, единственная информация поступает из вики GitHub, остальное задокументировано только в коде. Тем не менее, когда все настроено и работает, я должен сказать, что опыт разработки смарт-контрактов оставляет желать лучшего.

Вот что мне нужно делать каждый раз, когда я начинаю работать над своим проектом EOS:

  1. Запустите виртуальную машину под управлением Ubuntu 16 с моей установкой EOS.
  2. Запустите локальную тестовую сеть: запустите службу eosd, которая прослушивает и обрабатывает мои транзакции и создает блоки для блокчейна.
  3. Откройте кошелек, содержащий закрытые ключи моих тестовых учетных записей контрактов, с помощью eosc wallet open -n default
  4. Разблокируйте этот кошелек с помощью eosc wallet unlock -n default <<< 'password'

Вот цикл, через который я прохожу при разработке:

  1. Внесите изменения в файл .cpp моего смарт-контракта.
  2. Скомпилируйте его в WebAssembly с помощью eoscpp -o contract/TestContract.wast contract/TestContract.cpp
  3. Всякий раз, когда изменяется ABI (публичный интерфейс смарт-контракта), мне нужно перекомпилировать его с помощью eoscpp -o contract/TestContract.abi contract/TestContract.hpp
  4. Загрузите измененный смарт-контракт в блокчейн с помощью eosc set contract test contract/TestContract.wast contract/TestContract.abi
  5. Вызов смарт-контракта с помощью eosc push message test actionname '{"key":"value","some":"json"}' --scope test --permission test@active
  6. Просмотрите eosd журнал, чтобы увидеть print отладочные заявления моих контрактов.

Я думаю, что большинство разработчиков децентрализованных приложений пришли из сферы веб-разработки, где в настоящее время вы получаете немедленную обратную связь при изменении кода с помощью горячей перезагрузки или через тестировщиков, отслеживающих изменения файлов. . Немедленная обратная связь важна для творческого процесса.

Конечно, разработка блокчейн-децентрализованных приложений все еще находится на очень ранней стадии, и многие инструменты, которые появятся позже, отсутствуют. Но зачем ждать, когда мы можем изменить будущее прямо сейчас. Вот несколько мыслей о том, как упростить разработку смарт-контрактов. Это хорошая идея, чтобы полностью забыть, как обстоят дела прямо сейчас, чтобы изменить перспективу и начать с вопросов:

Как бы это выглядело, если бы это было легко? — Тим Феррис

Как бы выглядела разработка децентрализованных приложений, если бы это было легко?

Это будет выглядеть примерно так:

  1. Нет начальной фазы настройки. Вы просто создаете проект. (Возможно, какая-то начальная конфигурация для конкретного проекта.)
  2. Вы меняете код своего смарт-контракта .cpp и нажимаете «Сохранить». Он компилируется, и смарт-контракт обновляется в вашей локальной тестовой сети.
  3. Вы запускаете кучу тестов для недавно развернутого смарт-контракта.

Как мы можем этого добиться?

У Ethereum уже есть отличная среда разработки Truffle, которая умеет многое из этого:

Встроенная компиляция смарт-контрактов, связывание, развертывание и управление двоичными файлами. Автоматизированное тестирование контрактов для быстрой разработки.

Truffle также поставляется с Ganache, который представляет собой внутреннюю реализацию Javascript для блокчейна Ethereum, доступную на всех платформах.

Конечной целью EOS должно быть нечто похожее на Truffle. Чтобы быстро создать прототип и поиграть с тестовыми версиями EOS сегодня, мы также могли бы сделать следующее:

  1. Переместите тестовый блокчейн EOS в облако. Например, мы можем запустить дроплет Digital Ocean с Ubuntu и установить там EOS. Вы можете связаться с удаленным eosd, указав хост и порт в команде eosc: eosc -H <ip> -p 8888
  2. Используйте 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