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

В следующих разделах дается простое руководство по созданию API, который предоставляет данные о ценах для вашего приложения с поддержкой шифрования.

Номинальные и рыночные данные

Чтобы точно знать рыночную цену в любой момент времени, необходимо использовать несколько десятков API-интерфейсов обмена и произвести несколько умных расчетов.

К счастью, уже существует бесплатный сервис, который сделал всю работу за вас.

Познакомьтесь с Nomics, API данных криптовалюты, которому доверяют здесь, в TokenSoft. Настолько, что на самом деле мы стали инвестором в 2018 году.

Nomics поддерживает актуальность цен, пересчитывая каждые 10 секунд и взвешивая 24-часовые объемы на ведущих биржах. Для особо любопытных ознакомьтесь с подробным объяснением методологии ценообразования Nomic.

Вот что мы расскажем

  1. Настройка сервера GraphQL с помощью Node.js и NPM
  2. Получение бесплатного ключа Nomics API
  3. Получение данных о ценах (в долларах США) из Nomics API и кеширование результатов
  4. Предоставление конечной точки GraphQL для запроса данных о ценах

Предпосылки

На вашем компьютере должны быть установлены Node.js и NPM. Предполагается общий опыт работы с JavaScript.

Полный исходный код этого примера можно найти здесь.

1. Настройка сервера GraphQL

Структура проекта

Откройте свой терминал и запустите приведенный ниже фрагмент, чтобы построить структуру своего проекта.

$ mkdir -p crypto-pricefeed/src && cd crypto-pricefeed && touch src/index.js && touch src/NomicsConnector.js && npm init

(следуйте подсказкам командной строки, чтобы настроить файл package.json)

Установка зависимостей

Чтобы быстро приступить к работе, мы воспользуемся несколькими инструментами, чтобы быстро начать разработку. Они включают следующее.

  • Axios, HTTP-клиент на основе обещаний для браузера и Node.js
  • Рюкзак, минималистичная система сборки Node.js
  • Memoizee, полное решение для мемоизирования / кеширования для JavaScript
  • Graphql-yoga, полнофункциональный сервер GraphQL с упором на простую настройку

Установите их с помощью NPM.

$ npm install axios backpack-core memoizee graphql-yoga

Настройка скриптов NPM

Откройте проект в предпочитаемом вами редакторе и добавьте следующие записи сценариев в ваш package.json файл.

{
  "name": "crypto-pricefeed",
  "version": "1.0.0",
  "description": "",
  "scripts": {
    "dev": "backpack dev",
    "build": "backpack build",
    "start": "node ./build/main.js"
  }
}

Вы сможете использовать их для запуска сервера из командной строки.

Запуск сервера

В src/index.js импортируйте шаблонный сервер из graphql-yoga и вставьте определения типов и преобразователи в конечную точку exchangeRate.

Мы будем использовать игровой интерфейс GraphQL Yoga для тестирования нашего API.

import { GraphQLServer } from 'graphql-yoga'
const typeDefs = `
  type Query {
    exchangeRate(currency: String!): Float
  }
`
const resolvers = {
  Query: {
    exchangeRate: (root, variables, context) => {
      return 9000.01
    }
  }
}
const server = new GraphQLServer({ typeDefs, resolvers })
// Go to http://localhost:4000 to test your API
server.start(() => console.log('Server running on :4000'))

В терминале запустите:

$ npm run dev

Теперь посетите http: // localhost: 4000 / в браузере.

Давайте протестируем нашу конечную точку exchangeRate в пользовательском интерфейсе игровой площадки.

2. Получение бесплатного ключа API Nomics

Перейдите на страницу цен Nomics и выберите их уровень бесплатного пользования.

Заполните и отправьте регистрационную форму.

Вскоре вы получите электронное письмо с вашим ключом API!

3. Получение данных о ценах из Nomics API

Класс разъема

В src/NomicsConnector.js импортируйте axios и напишите начальный класс коннектора, который устанавливает экземпляр клиента HTTP и метод получения цен.

import axios from 'axios'
class NomicsConnector {
  constructor (apiKey) {
    this.client = axios.create({
      baseURL: 'https://api.nomics.com/v1',
      method: 'get',
      responseType: 'json',
      params: { key: apiKey }
    }
  }
  
  async getPrices () {
    const res = await this.client('/prices')
    return res.data
  }
}
export default NomicsConnector

Форма ценовых данных

Nomics возвращает все данные о своих ценах (выраженные в долларах США) в виде списка, подобного этому.

[
  {"currency":"0XBTC","price":"0.27487"}, 
  {"currency":"1ST","price":"0.03332"},
  {"currency":"2GIVE","price":"0.00179"},
  {"currency":"ABA","price":"0.02436"},
  {"currency":"ABL","price":"0.00731"},
  {"currency":"ABS","price":"0.00650"},
  {"currency":"ABT","price":"0.08112"},
  {"currency":"ABTC","price":"0.14410"},
  /* ... */
]

Посмотрите сами на https://api.nomics.com/v1/prices?key=YOUR_API_KEY.

Цены по валюте

Давайте добавим к нашему коннектору функцию, которая принимает данные о ценах и связывает цены по символу валюты.

  /* ... */
  async getPricesByCurrency () {
    const prices = await this.getPrices()
    return prices.reduce(
      (pricesByCurrency, { currency, price }) => {
        pricesByCurrency[currency] = price
        return pricesByCurrency
      }, {}
    )
  }
}
export default NomicsConnector

Теперь мы можем написать функцию, которая принимает символ валюты и возвращает цену этой валюты.

  /* ... */
  
  async getPrice (currency) {
    const pricesByCurrency = await this.getPricesByCurrency()
    return pricesByCurrency[currency]
  }
}
export default NomicsConnector

Кеширование ценовых данных с помощью Memoizee

Держать на секунду! Каждый раз, когда мы вызываем getPrice, мы будем делать HTTP-запрос к Nomics API и уменьшать результат, чтобы мы могли найти одну пару "ключ-значение".

Давайте возьмем нашу getPricesByCurrency функцию и кэшируем результат с memoizee в функции-конструкторе.

import axios from 'axios'
import memoize from 'memoizee'
class NomicsConnector {
  constructor (apiKey) {
    this.client = axios.create({
      baseURL: 'https://api.nomics.com/v1',
      method: 'get',
      responseType: 'json',
      params: { key: apiKey }
    }
    this.getPricesByCurrencyCached = memoize(
      this.getPricesByCurrency,
      {
        maxAge: 300000, // 5 minutes til cache expiration
        preFetch: 0.05, // pre-fetch 15s before expiration
        promise: 'then' // handle async
      }
    )
  }
  
  /* ... */

Наконец, обновите функцию getPrice для поиска наших кэшированных данных.

/* ... */
  
  async getPrice (currency) {
    const pricesByCurrency = await this.getPricesByCurrencyCached()
    return pricesByCurrency[currency]
  }
}
export default NomicsConnector

4. Открытие конечной точки GraphQL

Использование NomicsConnector

Вернемся к src/index.js, давайте импортируем наш класс NomicsConnector и сохраним наш ключ API в качестве переменной.

import { GraphQLServer } from 'graphql-yoga'
import NomicsConnector from './NomicsConnector'
const NOMICS_API_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
/* ... */

Когда мы вызываем конструктор нашего сервера, укажите экземпляр класса NomicsConnector в contextoption GraphQL.

/* ... */
const server = new GraphQLServer({
  typeDefs,
  resolvers,
  context: {
    nomics: new NomicsConnector(NOMICS_API_KEY)
  }
})
// Go to http://localhost:4000 to test your API
server.start(() => console.log('Server running on :4000'))

Заключение

Измените преобразователь, чтобы использовать наш экземпляр NomicsConnector и получить кешированную цену валюты.

const resolvers = {
  Query: {
    exchangeRate: (root, variables, context) =>
      context.nomics.getPrice(variables.currency)
  }
}

Последние мысли

Если вы зашли так далеко, поздравляем!

Мы рассмотрели настройку сервера GraphQL с кэшированной конечной точкой обменного курса.

Следующие шаги могут включать поддержку фиатных пар, отличных от долларов США.

Кроме того, конечная точка панели инструментов Nomics - отличное место для расширения вашего API для поддержки таких показателей, как 24-часовой объем или движение цен.

Весь исходный код для приведенного выше примера можно найти здесь.

Если вы заинтересованы в работе с или в TokenSoft Inc, не стесняйтесь обращаться к нам.