Глава 4
____________________________________
[ 108 ]
___________________________________
events.watch(function(error, result){
if(!error)
{
console.log(result.args.status);
}
else
{
console.log(error);
}
})
setTimeout(function(){
events.stopWatching();
}, 60000)
Давайте рассмотрим подробнее, как работает этот код:
1.
Сначала мы получаем объект события путем вызова метода, одноименного с эк-
земпляром контракта. Этот метод получает два объекта как аргументы, которые
использует для фильтрации событий:
•
первый объект служит для фильтрации событий по индексированным значе-
ниям — например:
{'valueA': 1, 'valueB': [myFirstAddress, mySecondAddress]}
.
По умолчанию все значения фильтров установлены в
null
. Это означает, что
они будут совпадать со всеми событиями данного типа, поступающими от
этого контракта;
•
второй объект может содержать три свойства:
fromBlock
(самый старый блок,
по умолчанию
"latest"
),
toBlock
(самый новый блок, по умолчанию
"latest"
)
и
address
(список адресов, откуда следует получать логи событий, по умолча-
нию это адрес контракта).
2.
Объект
event
предоставляет нам три метода:
get
,
watch
и
stopWatching
. Метод
get
применяется для получения всех событий в заданном диапазоне блоков. Метод
watch
подобен методу
get
, но следит за изменениями после получения событий.
Метод
stopWatching
прекращает отслеживание изменений.
3.
Далее, у нас есть метод
allEvents
экземпляра контракта. Он служит для извлече-
ния всех событий контракта.
4.
Каждое событие представлено объектом, который имеет следующие свойства:
•
args
— объект аргументов, которые предоставило событие;
•
event
— строка, содержащая имя события;
•
logIndex
— целое число, представляющее позицию индекса (указателя) лога
в блоке;
•
transactionIndex
— целое число, представляющее транзакцию, по которой
был сгенерирован лог;
Учимся работать с web3.js
____________________________________
[ 109 ]
___________________________________
•
transactionHash
— строка, представляющая хеш транзакции, по которой был
сгенерирован данный лог;
•
address
— строка, представляющая адрес, из которого поступил лог;
•
blockHash
— строка, представляющая хеш блока, в котором был данный лог,
и
null
, если блок в ожидании подтверждения;
•
blockNumber
— номер блока, в котором был лог, и
null
, если блок в ожидании
подтверждения.
Пакет web3.js предоставляет API
web3.eth.filter
для извлечения и просмотра
событий. Вы можете использовать этот API, но описанный ранее метод намного
проще. Про это можно прочитать больше по адресу:
https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethfilter
.
Разработка клиентского приложения
для контракта
В
главе 3
мы написали код на языке Solidity, а также на протяжении двух последних
глав мы изучаем web3.js и вызов методов при помощи web3.js. Настало время напи-
сать клиентскую оболочку для нашего смарт-контракта, чтобы пользователям было
легче им пользоваться.
Мы разработаем клиент, в котором пользователь выбирает файл, вводит данные
владельца файла и нажимает кнопку
Submit
(Отправить), чтобы передать в сеть
транзакцию, вызывающую метод
set
c хешем и данными владельца. Когда транзак-
ция успешно передана, мы выведем на дисплей ее хеш. Кроме того, пользователь
сможет выбрать файл и получить для него сведения о владельце из смарт-
контракта. А еще клиент будет показывать последние транзакции
set
, подтвер-
жденные в режиме реального времени.
Мы воспользуемся при разработке следующими фреймворками и модулями:
sha1.js — для получения хеша файла на стороне клиента;
jQuery — для манипуляции объектами DOM;
Bootstrap 4 — для создания адаптивного макета.
На серверной стороне мы задействуем express.js и web3.js. При этом нам надо сде-
лать так, чтобы серверная часть отправляла подтвержденные транзакции клиент-
скому интерфейсу без постоянных запросов со стороны клиента. Для этого мы вос-
пользуемся сервисом
socket.io
.
Пакет web3.js может быть задействован и на клиентской стороне. Но в данном
случае это создаст проблемы с безопасностью. Мы пользуемся счетами, сохра-
ненными в Geth, и раскрываем URL-адрес узла Geth клиентскому интерфейсу,
который создает угрозу для эфира, хранящегося на других счетах.
Do'stlaringiz bilan baham: |