Введение
Сегодня мы будем использовать web3.js (Ethereum JavaScript API) для аутентификации в общедоступной цепочке блоков через смарт-контракт Raindrop на стороне сервера Hydro, используя API Raindrop на стороне сервера. Для взаимодействия со смарт-контрактами Ethereum вы можете использовать популярные сайты, такие как Ethereum Wallet, MyEtherWallet и MyCrypto, или программно взаимодействовать с библиотеками, такими как web3.js, как мы опишем в этой статье. Ознакомьтесь с полным кодом нашего примера приложения здесь!
Обзор процесса
Вот шаги для реализации серверного API Raindrop для аутентификации через блокчейн. В частности, шаг 4 - это то, где мы используем web3.js для программного взаимодействия со смарт-контрактом, за пределами компетенции Raindrop API.
- Получите токен доступа с помощью OAuth API
- Внесите адрес Ethereum в белый список с помощью API Raindrop
- Запросите вызов с помощью API Raindrop
- Выполните транзакцию аутентификации с помощью смарт-контракта Raindrop на стороне сервера
- Подтвердите попытку аутентификации с помощью 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