Ссылки подписи
Ссылка подписи открывает транзакцию Hive в Hivesigner. Человек смотрит её, одобряет своим ключом, и Hivesigner отправляет её в сеть прямо из его браузера. Затем Hivesigner может вернуть человека в ваше приложение с идентификатором транзакции. Ссылкам подписи не нужны ни аккаунт приложения, ни токен. Они охватывают все 41 операцию, которые поддерживает Hivesigner, включая переводы и другие действия, где нужен активный ключ.
Как работает ссылка подписи
- Ваше приложение собирает ссылку, которая несёт одну или несколько операций.
- Человек открывает ссылку. Hivesigner показывает каждую операцию понятными словами на экране «Подтверждение транзакции» вместе с ключом, который ей нужен.
- Человек одобряет. Hivesigner подписывает транзакцию прямо в браузере ключом аккаунта, выбранного в Hivesigner. Затем отправляет транзакцию в сеть Hive.
- Если в ссылке указан адрес возврата, Hivesigner отправляет туда человека с идентификатором транзакции.
Ваше приложение никогда не видит ключ. Ссылку подписи может создать любой сайт: никакого client_id отправлять не нужно.
Виды ссылок
Hivesigner читает два вида ссылок подписи: закодированные и старые.
Закодированные ссылки
Закодированная ссылка несёт операции в формате JSON, закодированном в base64url. Она использует формат hive://sign/... из пакета hive-uri, где вместо hive:// стоит https://hivesigner.com/.
| Вид | Что содержит B64U |
|---|---|
https://hivesigner.com/sign/op/B64U |
Одну операцию: ["vote", {...}] |
https://hivesigner.com/sign/ops/B64U |
Список операций: [["transfer", {...}], ["transfer", {...}]] |
https://hivesigner.com/sign/tx/B64U |
Целую транзакцию, с собственным заголовком |
B64U — это текст JSON, закодированный в UTF-8, а затем в base64, где + заменён на -, / на _, а заполнение = на ..
Для op и ops Hivesigner собирает транзакцию вокруг операций. Он заполняет опорный блок и срок действия.
Для tx Hivesigner сохраняет собственные ref_block_num, ref_block_prefix и expiration транзакции. Он сохраняет и подписи, которые уже есть в транзакции. Благодаря этому несколько аккаунтов могут по очереди подписать одну транзакцию — для аккаунта, которым управляют несколько человек. Транзакцию, у которой список extensions не пуст, Hivesigner отклоняет.
Примечание: Перед подписью Hivesigner приводит некоторые значения к единому виду, например суммы и поля, оставленные со значениями по умолчанию. Тогда у подписанной транзакции может оказаться другой идентификатор, не тот, что вы собрали. Читайте идентификатор с адреса возврата.
Старые ссылки
Старая ссылка называет одну операцию в пути, а её поля помещает в строку запроса:
https://hivesigner.com/sign/vote?author=AUTHOR&permlink=PERMLINK&weight=10000
https://hivesigner.com/sign/transfer?to=RECIPIENT&amount=1.000%20HIVE&memo=MEMO
https://hivesigner.com/sign/transfer-to-vesting?amount=10.000%20HIVE
- Пишите имя операции в стиле snake case (
transfer_to_vesting), camel case (transferToVesting) или kebab case (transfer-to-vesting). - Каждое поле передавайте параметром запроса с именем этого поля. Кодируйте каждое значение для адреса.
- Списки и объекты записывайте в JSON, например
required_posting_auths=["alice"]. Список идентификаторов или имён можно разделить и запятыми:proposal_ids=379,380. - Логические значения пишите как
trueилиfalse.
Старая ссылка несёт одну операцию. Для нескольких используйте закодированную ссылку.
Значения полей
Эти правила действуют для всех видов:
- Значения по умолчанию. Пропущенное поле принимает своё значение по умолчанию. Аккаунт, который действует (
voter,from,ownerи похожие поля), по умолчанию тот, который подписывает.weightголоса по умолчанию равен10000(100%). - Суммы — это число и обозначение:
1.000 HIVE,0.500 HBDили100.000000 VESTS. Hivesigner пишет HIVE и HBD с 3 знаками после запятой, а VESTS с 6. - Hive Power. Поле, которое принимает VESTS, принимает и сумму в HP, например
100 HP. Hivesigner переводит её в VESTS по текущему курсу, прежде чем человек сможет одобрить. __signerв любом значении превращается в имя аккаунта, который подписывает. Например,custom_jsonдля подписки может назвать__signerподписчиком внутри своегоjson.- Целые числа должны быть целыми и лежать в диапазоне, который принимает сеть, например от
-10000до10000дляweightголоса.
Hivesigner отклоняет всю ссылку, когда значение не подходит своему полю, когда операция неизвестна или когда в ссылке нет ни одной операции. Человек видит «Упс, что-то пошло не так. Переданные данные некорректны.», и ничего не подписывается.
Параметры
Добавляйте их в строку запроса любой ссылки подписи:
| Параметр | Значение |
|---|---|
cb |
Адрес возврата, закодированный в base64url. Именно это записывает hive-uri для своей настройки callback. |
redirect_uri |
Адрес возврата обычным текстом, закодированным для адреса. Его используют старые ссылки. Закодированная ссылка использует его, когда у неё нет cb. |
nb |
Только подпись. Hivesigner подписывает транзакцию, не отправляя её в сеть. Поместите {{sig}} в адрес возврата, чтобы получить подпись (смотрите Подстановки в адресе возврата). Подойдёт любое значение, даже пустое (nb=). |
s |
Аккаунт, который должен подписать. Если выбран другой аккаунт, Hivesigner просит человека переключиться на этот. Никаким другим аккаунтом он не подписывает. |
Используйте адрес возврата на https://. Адрес, который не является http или https, Hivesigner не учитывает и остаётся на собственном экране результата.
Hivesigner выбирает ключ по операциям. Параметра для его выбора нет: в ссылках подписи Hivesigner не учитывает authority (и параметр a из hive-uri). Смотрите Какой ключ нужен ссылке.
Подстановки в адресе возврата
После одобрения Hivesigner заполняет в адресе возврата эти подстановки:
| Подстановка | Значение |
|---|---|
{{id}} |
Идентификатор транзакции |
{{sig}} |
Подпись, для ссылки только с подписью (nb) |
{{block}} |
Остаётся пустой |
{{txn}} |
Остаётся пустой |
{{data}} |
Остаётся пустой |
Адрес возврата без единой такой подстановки получает идентификатор транзакции, добавленный как id, после ? или &:
https://YOUR_APP/done becomes https://YOUR_APP/done?id=TRANSACTION_ID
https://YOUR_APP/done?step=2 becomes https://YOUR_APP/done?step=2&id=TRANSACTION_ID
https://YOUR_APP/tx/{{id}} becomes https://YOUR_APP/tx/TRANSACTION_ID
Hivesigner перенаправляет, как только узел Hive принял транзакцию. Она может ещё не попасть в блок. Найдите её по идентификатору, когда вам нужно знать, что она включена.
Ваш адрес возврата не вызывается, когда сеть отклоняет транзакцию (человек видит ошибку) и когда человек уходит, не одобрив.
Соберите ссылку
С помощью hive-uri
Пакет hive-uri (https://www.npmjs.com/package/hive-uri) кодирует операции в ссылки. Используйте версию 0.2.8 или новее, которая правильно кодирует любой текст Unicode.
npm install hive-uri
import { encodeOp, encodeOps } from 'hive-uri';
// One vote. __signer becomes the account that signs.
const vote = encodeOp(
['vote', { voter: '__signer', author: 'AUTHOR', permlink: 'PERMLINK', weight: 10000 }],
{ callback: 'https://YOUR_APP/voted?tx={{id}}' },
);
// Two transfers in one transaction.
const payout = encodeOps(
[
['transfer', { from: '__signer', to: 'RECIPIENT_1', amount: '1.000 HIVE', memo: 'MEMO' }],
['transfer', { from: '__signer', to: 'RECIPIENT_2', amount: '2.000 HIVE', memo: 'MEMO' }],
],
{ callback: 'https://YOUR_APP/paid' },
);
const voteLink = vote.replace('hive://', 'https://hivesigner.com/');
const payoutLink = payout.replace('hive://', 'https://hivesigner.com/');
Объект настроек принимает callback (записывается как cb), no_broadcast: true (записывается как nb) и signer (записывается как s). Для целой транзакции то же самое делает encodeTx.
С помощью SDK для JavaScript
В пакете hivesigner есть sendOperation, sendOperations и sendTransaction. Они принимают те же аргументы, что и кодировщики hive-uri, и возвращают ссылку https://hivesigner.com/sign/...:
import { sendOperation } from 'hivesigner';
const link = sendOperation(
['transfer', { from: '__signer', to: 'RECIPIENT', amount: '1.000 HIVE', memo: 'MEMO' }],
{ callback: 'https://YOUR_APP/paid' },
);
В TypeScript типы требуют третий аргумент: передайте undefined, чтобы получить ссылку. В браузере функция, переданная третьим аргументом, заставляет их открыть ссылку в новой вкладке вместо возврата. Смотрите SDK.
Без кода
Страница https://hivesigner.com/signs («Подписать транзакцию») перечисляет каждую поддерживаемую операцию с формой для её полей. Она собирает ссылку /sign/op/ и открывает её.
Какой ключ нужен ссылке
Каждой операции нужен один ключ: постинг, активный или владельца. Таблица ниже их перечисляет. Три операции зависят от своих значений:
custom_jsonнужен активный ключ, когда вrequired_authsназван аккаунт. Иначе нужен постинг-ключ.account_updateнужен ключ владельца, когда она задаётowner. Иначе нужен активный ключ.account_update2нужен ключ владельца, когда она задаётowner. Активный ключ нужен, когда она задаётactive,posting,memo_keyилиjson_metadata. Только сposting_json_metadataнужен постинг-ключ.
Hivesigner подписывает ссылку одним ключом, поэтому всем операциям в одной ссылке должен требоваться один и тот же. Ссылку, где они смешаны, Hivesigner подписывать отказывается и объясняет человеку почему. Такие операции отправляйте отдельными ссылками.
Если у выбранного аккаунта нет этого ключа на устройстве, Hivesigner говорит, какого ключа не хватает, и предлагает его добавить. Смотрите Когда ключа нет.
Что видит человек
- Экран с заголовком «Подтверждение транзакции» и карточкой на каждую операцию: краткое описание понятными словами, нужный ключ и значения, которые она несёт.
- «Вы будете перенаправлены на HOST.», когда у ссылки есть адрес возврата. Используйте адрес на своём сайте, чтобы люди узнавали хост.
- Предупреждение, когда операция действует от имени аккаунта, отличного от подписывающего.
- Одобрить или Подписать для ссылки только с подписью. Заблокированный аккаунт сначала спрашивает код доступа.
- После отправки «Транзакция успешно отправлена в сеть» с идентификатором транзакции. Затем перенаправление на ваш адрес возврата.
Просмотр и подпись описывает этот экран для людей.
Поддерживаемые операции
Hivesigner подписывает эти 41 операцию, по их именам в сети. Всё остальное отклоняется. Имя — то, которое Hivesigner показывает на экране подтверждения.
| Операция | Ключ | Название |
|---|---|---|
transfer |
Активный | Перевод |
recurrent_transfer |
Активный | Регулярный перевод |
delegate_vesting_shares |
Активный | Делегирование Hive Power |
transfer_to_vesting |
Активный | Перевод в Hive Power (power up) |
set_withdraw_vesting_route |
Активный | Настройка маршрута вывода из Hive Power |
withdraw_vesting |
Активный | Вывод из Hive Power (power down) |
transfer_to_savings |
Активный | Перевод в сейф |
transfer_from_savings |
Активный | Перевод из сейфа |
cancel_transfer_from_savings |
Активный | Отмена перевода из сейфа |
convert |
Активный | Конвертация HBD в HIVE |
collateralized_convert |
Активный | Конвертация HIVE в HBD |
account_witness_vote |
Активный | Голос за свидетеля |
witness_update |
Активный | Обновление свидетеля |
witness_set_properties |
Активный | Установка параметров свидетеля |
account_witness_proxy |
Активный | Прокси для голосования |
claim_account |
Активный | Получение кредита на аккаунт |
account_create |
Активный | Создание аккаунта |
create_claimed_account |
Активный | Создание аккаунта за счёт кредитов на аккаунты |
vote |
Постинг | Голос |
limit_order_create |
Активный | Создание лимитного ордера |
limit_order_create2 |
Активный | Создание лимитного ордера |
limit_order_cancel |
Активный | Отмена лимитного ордера |
claim_reward_balance |
Постинг | Получение наград |
comment |
Постинг | Пост или комментарий |
comment_options |
Постинг | Параметры поста или комментария |
custom_json |
Постинг, либо Активный, когда задан required_auths |
Пользовательская операция |
delete_comment |
Постинг | Удаление комментария |
account_update |
Активный, либо Владелец, когда задан owner |
Изменение аккаунта (активный) |
account_update2 |
Постинг, Активный или Владелец, в зависимости от поля | Изменение аккаунта (постинг) |
change_recovery_account |
Владелец | Смена аккаунта восстановления |
create_proposal |
Активный | Создание предложения |
remove_proposal |
Активный | Удаление предложения |
update_proposal_votes |
Активный | Изменение голосов за предложения |
update_proposal |
Активный | Изменение предложения |
escrow_transfer |
Активный | Эскроу-перевод |
escrow_approve |
Активный | Одобрение эскроу |
escrow_dispute |
Активный | Спор по эскроу |
escrow_release |
Активный | Выплата из эскроу |
account_create_with_delegation |
Активный | Создание аккаунта с делегированием |
request_account_recovery |
Активный | Запрос на восстановление аккаунта |
recover_account |
Владелец | Восстановление аккаунта |