Введение

Сегодня мы будем использовать web3.js (Ethereum JavaScript API) для аутентификации в общедоступной цепочке блоков через смарт-контракт Raindrop на стороне сервера Hydro, используя API Raindrop на стороне сервера. Для взаимодействия со смарт-контрактами Ethereum вы можете использовать популярные сайты, такие как Ethereum Wallet, MyEtherWallet и MyCrypto, или программно взаимодействовать с библиотеками, такими как web3.js, как мы опишем в этой статье. Ознакомьтесь с полным кодом нашего примера приложения здесь!

Обзор процесса

Вот шаги для реализации серверного API Raindrop для аутентификации через блокчейн. В частности, шаг 4 - это то, где мы используем web3.js для программного взаимодействия со смарт-контрактом, за пределами компетенции Raindrop API.

  1. Получите токен доступа с помощью OAuth API
  2. Внесите адрес Ethereum в белый список с помощью API Raindrop
  3. Запросите вызов с помощью API Raindrop
  4. Выполните транзакцию аутентификации с помощью смарт-контракта Raindrop на стороне сервера
  5. Подтвердите попытку аутентификации с помощью Raindrop API

Настройка среды

Прежде чем мы начнем, убедитесь, что на вашем компьютере установлен Node.js. Вы можете найти подробную информацию о настройке нашего сервера в образце приложения, которое построено на node v10.4.1, npm 6.1.0 и web3.js 1.0.0-beta.35.

Давайте погрузимся в код! Сначала мы инициализируем наш сервер Node / Express.

const express = require('express');
const cors = require('cors');
const app = express();
const morgan = require('morgan');
const chalk  = require('chalk');
const bodyParser = require('body-parser');
const request = require('request-promise');
const path = require('path');
const nodeModulesPath = path.join(__dirname, '../node_modules');
app.use(cors());
app.use(morgan('dev'));
app.use(express.static(nodeModulesPath));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
//we can execute our logic here!
function main() {
...
}
//global error handling
app.use(function (err, req, res, next) {
});
//our server listens on port 3000
app.listen(3000, function() {
    main();
});

В рамках настройки мы также создаем экземпляр web3, передавая поставщика сети Ethereum. В этом примере мы используем тестовую сеть Rinkeby, поэтому нам не нужно запускать собственный узел Ethereum для взаимодействия со смарт-контрактом.

const Web3 = require('web3');
const web3 = new Web3('wss://rinkeby.infura.io/ws');

Теперь мы создаем экземпляр контракта, используя interface.json, который содержит ABI (двоичный интерфейс приложения) или то, что является просто представлением нашего контракта в формате JSON.

const contractAddress = '0x4959c7f62051D6b2ed6EaeD3AAeE1F961B145F20';
const abi = require('../interface.json');
const HydroContract = new web3.eth.Contract(abi, contractAddress);

Мы можем выполнить следующие шаги внутри функции main в начальном блоке кода.

Шаг 1. Получите токен доступа с помощью OAuth API

Давайте вызовем OAuth API с учетными данными client_id и client_secret. Разработчики могут получить доступ к этим учетным данным при регистрации на Платформе Hydrogen.

const auth = new Buffer.from(`${client_id}:${client_secret}`).toString('base64')

Мы будем использовать заголовок 'Authorization': `Basic ${auth}`. Вот пример запроса на завиток ниже.

curl -X POST https://sandbox.hydrogenplatform.com/authorization/v1/oauth/token?grant_type=client_credentials \   
-H "Authorization: Basic aHlkcm9nZW5faWQ6aHlkcm9nZW5fc2VjcmV0"

Мы получаем access_token из ответа API, который сохраняем в переменной, как показано ниже.

let access_token = '<OAuth Token>';

Шаг 2. Внесите адрес Ethereum в белый список с помощью API Raindrop

Затем мы создаем учетную запись Ethereum, используя web3, которая предоставляет нам address и privateKey для нашей учетной записи.

let account = web3.eth.accounts.create();
let { address, privateKey } = account;

В качестве одноразового шага давайте внесем адрес Ethereum в белый список с помощью Raindrop API. Это может занять ~ 30 секунд, так как адрес сохраняется в блокчейне и, таким образом, распространяется изменение состояния в сети Ethereum. На этот раз мы будем использовать заголовок 'Authorization': `Bearer ${access_token}`. Вот пример запроса на завиток ниже.

curl -X POST -H "Authorization: Bearer ac6b8213-2a77-4ecc-89fd-68c9f2aff256" \      
-H "Content-Type: application/json" 
-H \      
-d '{           "address": "0xWY81621928g5454415154354ac82cd2F266181G7"        }' "https://sandbox.hydrogenplatform.com/hydro/v1/whitelist"

Мы получаем hydro_address_id из ответа API, который сохраняем в переменной, как показано ниже.

let hydro_address_id = '<hydro_address_id>';

Шаг 3. Запросите вызов с помощью API Raindrop

Затем мы запрашиваем подробную информацию о вызове через Raindrop API - это параметры транзакции, которые нам нужно будет удовлетворить в цепочке для аутентификации. Это возвращает значения для amount, challenge и partner_id. Давайте также сохраним их в переменных.

let amount = '<amount>';
let challenge = '<challenge>';
let partner_id = '<partner_id>';

Шаг 4. Выполните транзакцию аутентификации с помощью смарт-контракта Raindrop на стороне сервера

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

Шаг 5. Подтвердите попытку аутентификации с помощью Raindrop API.

Наконец, мы проверяем, была ли транзакция успешно выполнена в блокчейне, отправив еще один запрос в API Raindrop. Вот пример запроса на завиток ниже.

curl -X GET -H "Authorization: Bearer ac6b8213-2a77-4ecc-89fd-68c9f2aff256" \   "https://api.hydrogenplatform.com/hydro/v1/authenticate?hydro_address_id=cbcd0758-1314-11e8-b642-0ed5f89f718b"

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

Спасибо за прочтение! Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь писать комментарии ниже.

Ресурсы

Найдите пример приложения с web3.js здесь: https://github.com/hydrogen-dev/Hydro-Auth

Документацию по API Hydro Raindrop можно найти здесь: https://www.hydrogenplatform.com/docs/hydro/v1/#Raindrop

Инструкции по вызову контракта с Hydro Raindrop можно найти здесь: https://www.hydrogenplatform.com/docs/hydro/v1/#Smart-Contract

Запросите учетные данные Sandbox API здесь: https://www.hydrogenplatform.com