Трюфельные уловки для разработки Ethereum: развеивание 8 мифов и первые впечатления

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

Миф №1: вы должны использовать папки, предоставленные вам в каталоге `app`

Когда вы запускаете `truffle init` и получаете каталог приложения с« javascripts »,« таблицами стилей »и« изображениями »внутри, вы можете подумать, что вам нужно использовать эти каталоги, чтобы воспользоваться преимуществами Процесс сборки Трюфеля. Нет. Вы можете удалить эти папки, добавить новые или переименовать их по своему усмотрению. Вот пример конфигурации сборки, в которой файлы были переименованы (обратите внимание на каталог без изображений):

Directory structure: 
/app
 — pages
 — controls
 — vendor
App configuration:
{
  “build”: {
    "app.js": [
      "vendor/react.js",       // structure is up to you
      "controls/button.js",
      "pages/page_one.jsx", 
      "pages/page_two.jsx" 
    ]
  },
  // ...
}

Миф № 2: зависимости должны находиться в каталоге приложения

Пути указываются относительно каталога приложения, но это не означает, что зависимости должны существовать в нем. Вот пример, в котором процесс сборки относится к зависимостям, существующим вне «приложения», что позволяет вам использовать менеджеры пакетов, такие как npm:

{
  “build”: {
    "app.js": [
      "../node_modules/jquery/dist/jquery.min.js",
      // ...
    ]
  },
  // ...
}

Миф № 3: Truffle может создавать только веб-приложения

Неверно. Вот отличный пример того, как Truffle создает библиотеку, создавая как распространяемую, так и уменьшенную версию.

Миф №4: у трюфеля не может быть нескольких зависимых целей сборки

О, но может. Взято из того же примера, что и миф № 3, вы можете использовать цели сборки по мере их создания, поскольку каждая цель сборки в app.json создается в следующем порядке:

{
  “build”: { 
    // The main library file. 
    “hooked-web3-provider.js”: “hooked-web3-provider.es6”, 
    // Note, the first one will be processed before this one, 
    // so we can refer to the built file. 
    “hooked-web3-provider.min.js”: { 
      “files”: [ 
        “../build/hooked-web3-provider.js” 
      ], 
      “post-process”: [ 
        “uglify” 
      ] 
    }
  },
  // ...
}

Миф № 5: Нравится вам это или нет, но вы должны использовать процесс сборки Truffle.

Нет - это, пожалуй, самый большой миф . Просто удалите конфигурацию сборки из файла app.json, если вам нужно что-то более сложное (или если процесс сборки вообще не нужен). Вы по-прежнему можете использовать Truffle для компиляции, тестирования и развертывания контрактов.

Миф № 6: Код контракта требует много копировать макароны

Это не столько миф, сколько менее известная функция, которую мы добавили в Truffle. Оператор import в Solidity оставляет желать лучшего, поэтому мы написали свой собственный. Если вы хотите включить один контракт как зависимость от другого, просто импортируйте его в том порядке, в котором вы хотите, чтобы он был включен; Об остальном позаботится Truffle.

import "Permissioned"; // Looks for ./contracts/Permissioned.sol
contract MyContract is Permissioned {
  // ..
}

Вы даже можете импортировать вложенные файлы контрактов:

import "tools/Hammer"; // Looks for ./contracts/tools/Hammer.sol

И альт! Управляемое, поддерживаемое разделение кода, без пасты.

Миф № 7: Truffle не поддерживает различные блокчейны, такие как разработка, постановка и производство, или тестовая сеть, олимпийская и пограничная)

Наоборот. У Truffle есть концепция сред, взятых из Rails, которые вы можете использовать для настройки различных цепочек блоков и контрактов, развернутых в этих цепочках. По умолчанию вам доступны разработка, стадия, продакшн и тест, но они не требуются. Если он вам не нужен, просто удалите его, и Truffle ответит соответствующим образом. Если вы хотите, чтобы среда была адаптирована под вас, переименуйте ее. Вот пример файловой структуры с именами сред, адаптированными к контексту, в котором будет развернуто приложение:

Directory structure:
/config
 — development
 — consensys-testnet
 — ethereum-mainnet
 - app.json

Каждый из каталогов в config должен содержать файл config.json, который как минимум определяет сеть, к которой они подключаются. Вы также можете использовать этот файл конфигурации, чтобы перезаписать конфигурацию по умолчанию любого значения в app.json:

{
  "rpc": {
    "host": "xx.xx.xx.xx", 
    "port": "1234"
  }
}

После этого вы можете создать свое приложение, а также скомпилировать и развернуть контракты для использования указанных вами сред:

// Both compile and deploy will write a contracts.json file to the
// environment specified:
$ truffle compile -e consensys-testnet 
$ truffle deploy -e consensys-testnet
// Building will hook up the contracts in the specified environment
// to the frontend for use. If you keep the production environment,
// `truffle dist` will create a `dist` folder you can commit to
// your respository.
$ truffle build -e consensys-testnet
$ truffle dist                                        

Миф № 8: Truffle не поддерживает сложные процессы развертывания

Truffle не высказался по поводу идеального процесса развертывания контракта, поэтому вы не увидите никаких дополнительных вариантов развертывания, если глубоко погрузитесь в код. Но сложные процессы развертывания возможны и могут быть легко написаны с помощью скрипта truffle exec. Команда Truffle `exec` позволяет вам запускать скрипт Node в указанной вами среде (подробности ниже), взаимодействуя с вашими контрактами так же, как при написании вашего интерфейса или ваших тестов.

Вот пример сценария, который можно запустить после `truffle deploy ', который подключает контракт AppStore к AppFactory:

File Name: register_factories.js
-----------------------------------------------------
var store = AppStore.at(AppStore.deployed_address);
store.registerFactory(“app”, AppFactory.deployed_address)
.then(function(tx) {
  console.log(“Registered AppFactory successfully.”);
  process.exit(0)
}).catch(function(e) {
  console.log(e);
  process.exit(1);
});

Чтобы запустить этот сценарий, просто запустите следующее. В этом примере truffle exec будет использовать контракты, которые уже были развернуты в среде «consnsys-testnet», созданной выше:

$ truffle exec ./register_factories.js -e consensys-testnet

Плавник.

Truffle все еще активно развивается, и ему предстоит еще многое сделать, прежде чем он решит все проблемы разработки и развертывания в молодой Ethereum Frontier. Однако мы надеемся, что с помощью описанных выше приемов вы сможете стать на шаг ближе к управляемому и поддерживаемому проекту. Мы приветствуем ваши отзывы, и не стесняйтесь выражать любые проблемы, отзывы и запросы функций в нашем Gitter, а также в системе отслеживания проблем Github. Ура и счастливого развития!