HimeraSearchDB
Carding_EbayThief
triada
CrackerTuch
d-shop

НОВОСТИ [recovery mode] Аудит кошельков в CryptoNote

BDFpromo
Оффлайн

BDFpromo

.
.
Регистрация
23.09.18
Сообщения
12.347
Реакции
176
Репутация
0
hof8key466f4lng25pcqotu0soo.png


Аудит криптовалютного кошелька — это возможность для третьей стороны («аудитора») видеть транзакции этого кошелька и рассчитывать его корректный актуальный баланс без права на трату средств.

В статье рассматриваются различные способы обеспечения такой возможности в криптовалютном протоколе CryptoNote 2.0 [ ], где аудит реализован лишь частично: с помощью трекингового ключа можно распознавать входящие транзакции, но для распознавания исходящих нужен полный набор ключей.

Материал рассчитан на читателей, знакомых с темой блокчейна и «классических» криптовалют, а также с основами криптографии на эллиптических кривых.


Содержание

















1. Введение


Что такое CryptoNote?


Как это ни странно, но большинство интересующихся блокчейн-технологиями ничего не слышали о CryptoNote, и это несмотря на то, что эта технология явилась основой для более чем 300 форков, самым известным из которых стал Monero.

В 2014 году в криптовалютной среде появились упоминания [ ] о проекте, который назывался Bytecoin. Проект не являлся форком Bitcoin или другого открытого проекта и имел совершенно новую кодовую базу, что было крайне необычно для того времени. Его основная концепция сводилась к реализации privacy-технологии, которую называли CryptoNote. Приватность обеспечивалась двумя механизмами: стелс-адресами и подмешиванием входов с использованием кольцевой подписи (ее еще называли в то время «микшер на блокчейне»). Поскольку в то время Zcash существовал только в теории, технология оказалась весьма конкурентоспособной и вызвала большой резонанс в крипитовалютном сообществе.

Вскоре группа энтузиастов, проявившая интерес к одному из первых форков этой технологии, а затем и перехватившая инициативу в этом форке, своими энергичными действиями сумела привлечь наибольшее внимание к технологии как среди сообщества так и среди инвесторов. Этот форк назывался BitMonero [ , ], однако довольно скоро он был переименован в Monero.

В дальнейшем оба проекта — Bytecoin и Monero — развивались технологически разными путями: если Bytecoin оставался закрытым анонимным проектом, то Monero превратился в крупный community-driven проект с очень большим количеством участников и разработчиков. Тем не менее, они оба являются развитием CryptoNote технологии.


Понятие аудита и его приложения


В отличие от классического «псевдонимного» блокчейна типа Bitcoin, в котором любой желающий, сканируя блокчейн, может тривиально подсчитать балансы любого адреса, в приватном блокчейне, в частности, в CryptoNote, эта задача едва ли осуществима без дополнительных знаний. Во-первых, благодаря технологии стелс-адресов, в блокчейне вообще отсутствуют упоминания каких-либо адресов (это свойство обычно обозначается как anonymity). Во-вторых, в силу того, что благодаря кольцевой подписи вход транзакции не указывает на один конкретный выход родительской транзакции, а указывает, в общем случае, на множество вероятных выходов, отследить движение средств также не представляется возможным (это свойство называется untraceability).

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

Говоря формально, под аудитом кошельков понимается возможность для третьей стороны («аудитора») видеть транзакции этого кошелька и рассчитывать его корректный актуальный баланс без передачи права на трату средств. В оригинальной версии CryptoNote аудит был реализован лишь частично: с помощью трекингового ключа можно распознавать входящие транзакции, но для распознавания исходящих нужен полный набор ключей.


Об авторе и цели публикации


Автор данного материала является одним из основных разработчиков проекта Zano — проекта, основанного на CryptoNote, который развивался несколько лет теми же руками, которыми был написан оригинальный код технологии.

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


2. Базовые сведения о криптографии на эллиптических кривых


Протокол CrypoNote использует эллиптическую кривую из схемы цифровой подписи с открытым ключом ed25519 [ ].

Напомним основные параметры этой кривой и дадим дополнительные определения.

  1. Зафиксировано большое простое число
    fddc646b1b52ff19dc68de572bb03dd3.svg
    .
    Все операции происходят в целых числах в конечном поле
    1d7f297b58b5454b997022f2f2faaeb4.svg
    вычетов по модулю
    d68cc4926bf74bae8fa3b51ca4a09ec8.svg
    .
  2. Задана эллиптическая кривая над полем
    1d7f297b58b5454b997022f2f2faaeb4.svg
    , обозначаемая
    fa9c829981d6d60ced0ec2ac129af07d.svg
    :
    1984ead4498e6f5af7d6c1cc2995b7ea.svg

    где
    3f287316c553d182dc93390afa3fa702.svg
    (отношение вычисляется в
    1d7f297b58b5454b997022f2f2faaeb4.svg
    и является целым числом).
    Важным является факт ее симметрии относительно
    817b92407f764f57af9226e50cc788fd.svg
    и
    9b34c4da5c757d4982bbd1b6f2e8998a.svg
    .
  3. Над множеством точек кривой геометрически определена операция, для любых двух точек дающая третью:
    09fd0cc8036ed4ef5f994c5e8c9537d4.svg
    , условно называемая «сложением», и задан нейтральный элемент, как точка, лежащая в бесконечности (это подробно рассмотрено в [ ]). Эта операция не выводит за пределы множества, обладает ассоциативностью, коммутативностью и наличием обратного элемента, благодаря чему все точки кривой вкупе с ней образуют абелеву группу, обозначаемую
    3d1c8d29f485b3a5984a6ded38dc6c18.svg
    .
    Порядок этой группы (число всех точек):
    43a4b64b82d75f9b37abe65b0e0c59da.svg
    , где
    08a233ce2d709db624ef1544facca626.svg
    (кофактор) и
    4104d65e0366e1792efd07e26a2f118d.svg
    .
  4. Каждая точка кривой задается своими координатами
    a38eb65b9f6ccdff295a05433949b325.svg
    . Поскольку координаты связаны уравнением кривой, это представление избыточно, и поэтому при реализации криптографических функций для экономии используется только координата
    9b34c4da5c757d4982bbd1b6f2e8998a.svg
    , кодируемая как 256-битное число.
    817b92407f764f57af9226e50cc788fd.svg
    -координата, в соответствии с симметричностью кривой (см. уравнение), может быть только одним из двух вариантов, выбор которого кодируется как старший бит числа, представляющего
    9b34c4da5c757d4982bbd1b6f2e8998a.svg
    -координату.
  5. Зафиксирована специальная точка кривой
    8cff0613946527ec23bc66241f299012.svg
    . Точка задается
    9b34c4da5c757d4982bbd1b6f2e8998a.svg
    -координатой, из двух возможных вариантов x выбирается положительный.
  6. Сложение (см. п. 3) точки
    560bd97f235311a36dff00db005e6ab5.svg
    с самой собой
    08d9faefbe272bdf8fbb80773542e343.svg
    раз определяет операцию умножения (
    abdba9d6e8ce469c813b547409be038a.svg
    , опускается в формулах) на целое число, образующую замкнутую мультипликативную группу
    311bd3267a013af7b90bf0358acc2fac.svg
    , порядок которой меньше, чем
    3d1c8d29f485b3a5984a6ded38dc6c18.svg
    :
    94cdae94b5a71bed1c63b94ba1ee2d33.svg
    ,
    при этом
    4e75b65b5da8fee796696be1dfcb2c3d.svg
    .
  7. Открытый ключ
    6d6a4f78fbacd6edecc018ce8ad3e364.svg
    — это точка эллиптической кривой, принадлежащая группе
    311bd3267a013af7b90bf0358acc2fac.svg
    :
    63d63696fffe6c56d8b793d80370d652.svg
  8. Секретный ключ
    817b92407f764f57af9226e50cc788fd.svg
    , или скаляр, соответствующий открытому ключу
    6d6a4f78fbacd6edecc018ce8ad3e364.svg
    — это такое целое число, что:
    aa79bc57473ebc3159c6fa43c30620d8.svg

    Секретный ключ, также как и открытый (см. выше), кодируется как 256-битное число.
  9. Определена основная хеш-функция
    bd236a859d121c85d92d1acf80ba3597.svg
    (в коде и других источниках обозначается как cn_fast_hash). Она вычисляет 32-байтный хеш по произвольному набору данных:
    13be901b8742044a9192f4c0eb1b979f.svg
  10. Хеш-функция
    0bcbac95e61180d7b6498503f2fe8622.svg
    (
    f9dda26950cb67bd3ecef956c5341c14.svg
    означает scalar) по произвольным данным выдает число, являющееся скаляром, т.е. валидным секретным ключом:
    29b3d578deed7e261f2850aab7bdea59.svg

    0bcbac95e61180d7b6498503f2fe8622.svg
    может быть реализована тривиально через
    bd236a859d121c85d92d1acf80ba3597.svg
    :
    972db408adabda2066b0ab7bbcafe9cd.svg
  11. Хеш-функция
    1559c9d5aa73e57d9c8f5386424c3ddc.svg
    (
    839f25c2746382debd4f08ea25ad5ecf.svg
    означает point — точка кривой) по произвольным данным выдает элемент группы
    311bd3267a013af7b90bf0358acc2fac.svg
    , то есть, валидный открытый ключ:
    d2d23b4a76e7e9cef7bc7c5f0f5a8db4.svg

    Реализация этой хеш-функции представляет определенную сложность по той причине, что во-первых, не любой набор 256 бит можно декодировать в точку эллиптической кривой (см. п. 4), а во-вторых, не любая точка кривой принадлежит группе
    311bd3267a013af7b90bf0358acc2fac.svg
    (см. п. 6).
    Одним из тривиальных способов реализации
    1559c9d5aa73e57d9c8f5386424c3ddc.svg
    является последовательное хеширование данных
    382ec3444f5387daa85e2939ca95a079.svg
    до тех пор, пока результат не станет возможным декодировать в точку
    63d63696fffe6c56d8b793d80370d652.svg
    .
    В CryptoNote используется более сложный и эффективный подход, реализованный в виде функции ge_fromfe_frombytes_vartime, который подробно рассмотрен в работе [ ].
    Определим функцию, детерминированно преобразующую произвольные 256 бит в элемент группы
    311bd3267a013af7b90bf0358acc2fac.svg
    как:
    afc859d81e70923b7fec5bb3632238ab.svg

    В CryptoNote хеш-функция
    1559c9d5aa73e57d9c8f5386424c3ddc.svg
    реализована так:
    a27e3e4983604f5515012f55ff656ce9.svg


3. Учет средств и расчет баланса в CryptoNote


Вспомним, как происходит отправка средств и расчет баланса в оригинальном версии протокола.

Алиса, отправляя деньги Бобу, формирует выходы своей транзакции следующим образом (рис. 3.1).

mjz6bwx78zksvfmmwlbvtdxgc-w.png

[SUB]Рис. 3.1. Алиса формирует выходы транзакции, отправляя деньги Бобу[/SUB]
  1. У Боба есть пара закрытых ключей
    4970741c4155037ee46c1812cfeb2a29.svg
    . Он вычисляет свой адрес как пару соответствующих открытых ключей
    809fd9814fd6ef7fa212007ef0f644d0.svg
    и опубликовывает его или отправляет Алисе.
  2. Алиса выбирает случайный секретный ключ транзакции
    066939a33475dd671b845469b6526972.svg
    и вычисляет открытый ключ
    42c8638ddeb319d08a84053bdecf571e.svg
    , который записывает в специальное поле extra транзакции.
  3. Для каждого выхода Алиса вычисляет стелс-адрес (one-time destination key):
    154633c6131cf03d185a87e91c5805f6.svg
    , где
    bf83b532cd867d34004f8eded8c5c79a.svg
    — порядковый номер выхода.
  4. Алиса подписывает и отправляет транзакцию.

Сторонний наблюдатель, анализируя стелс-адреса
f34fe73bd033523384beb008d4fbd223.svg
, не может сказать, предназначен ли конкретный выход Бобу, и даже не может определить, предназначены ли разные выходы с ключами
f34fe73bd033523384beb008d4fbd223.svg
и
4795f1a17c53c606685c580a6ee89eed.svg
одному получателю.

Чтобы принять деньги, Боб анализирует все транзакции в блокчейне следующим образом (рис. 3.2).

t_p9jchcutbmx6doaw1exxtfw2u.png

[SUB]Рис. 3.2. Боб проверяет выходы транзакции, чтобы определить входящие переводы[/SUB]
5. Используя свой секретный ключ
1c1778187263268cc347012d16da61e2.svg
, Боб вычисляет для каждого выхода
684c0fc1292d78f7d28e00785b691865.svg
(где
bf83b532cd867d34004f8eded8c5c79a.svg
— порядковый номер выхода,
cb6d45cf916546ae1085088c0c5dcd09.svg
— открытый spend-ключ Боба).
Если
7a3fe4042a424437d7dff936b8cfdd60.svg
, то это означает, что он является получателем данного выхода и может его потратить, вычислив соответствующий секретный ключ.Поэтому Боб увеличивает баланса своего кошелька на номинал данного выхода.

Чтобы потратить выход, получателем которого Боб является, и отправить монеты Кэрол, он действует следующим образом.


ja_r0m8cnbkjzqx9zpuztrxprus.png

[SUB]Рис. 3.3. Боб формирует вход для новой транзакции, используя принадлежащий ему выход[/SUB]
6. Боб, используя свои секретные ключи
4970741c4155037ee46c1812cfeb2a29.svg
, вычисляет закрытый ключ
3e11cfc34221f196e5df5fca125c2418.svg
к стелс-адресу
f34fe73bd033523384beb008d4fbd223.svg
, то есть такой, что
d7534c6475422101b90699e65d1c94b9.svg
.

7. Боб рассчитывает key image:
33ded3304647c6f60eddb6067190d035.svg
и записывает его, номинал и ссылку на соответствующий выход во вход своей транзакции для Кэрол.
Следует обратить внимание на то, что, во-первых, вычислить key image может только владелец секретного spend-ключа
f9dda26950cb67bd3ecef956c5341c14.svg
(корректность этого будет удостоверена кольцевой подписью), и во-вторых, третья сторона не сможет связать key image
64beb737a23fb5cb0a455f0e9213f2a4.svg
и соответствующий стелс-адрес
f34fe73bd033523384beb008d4fbd223.svg
.

8. Боб уменьшает баланс своего кошелька на номинал используемого выхода в п. 6.

9. Боб формирует выходы в транзакции для Кэрол в соответствии с п.п. 2-3. После чего подписывает транзакцию и отправляет.

Если предположить, что Боб утратил всю историю своих операций, но по-прежнему владеет своими секретными ключами
4970741c4155037ee46c1812cfeb2a29.svg
, то он сможет восстановить историю транзакций и рассчитать свой текущий баланс следующим образом (рис. 3.4).


cjoymupyh7a-6ggpcxhefdo52oq.png


[SUB]Рис. 3.4. Боб определяет свои входящие и исходящие платежи и рассчитывает баланс[/SUB]
10. Боб сканирует весь блокчейн и анализирует все транзакции на предмет наличия выходов, адресованных ему (см. п. 5).

11. При нахождении такого выхода
f34fe73bd033523384beb008d4fbd223.svg
, Боб увеличивает баланс своего кошелька на величину номинала.
Затем, используя свой секретный spend-ключ
f9dda26950cb67bd3ecef956c5341c14.svg
вычисляет соответствующий секретный ключ выхода
42f173c2992cf2826d484e0dac62fb74.svg
(п. 6) и key image
64beb737a23fb5cb0a455f0e9213f2a4.svg
(п. 7). После чего записывает key image,
f34fe73bd033523384beb008d4fbd223.svg
и другие данные платежа в таблицу.

12. Если при дальнейшем сканировании блокчейна Боб обнаружит во входе некоторой транзакции key image, имеющийся в таблице, это будет означать, что данная транзакция была когда-то сформирована Бобом. Поэтому он уменьшит баланс своего кошелька на величину номинала входа.

Действуя таким образом, Боб восстановит актуальный баланс своего кошелька.

Обратите внимание, что если сторонний аудитор Ден получит от Боба секретный ключ
1c1778187263268cc347012d16da61e2.svg
, то он сможет распознать входящие транзакции Боба в блокчейне, однако, не обладая секретным ключом
f9dda26950cb67bd3ecef956c5341c14.svg
, он не сможет распознать исходящие транзакции Боба, а значит и рассчитать верный баланс. Как будет показано далее, в случае непосредственной траты выхода Бобом без подмешиваний Ден сможет опознать такую транзакцию, как исходящий перевод Боба, однако в общем случае этого сделать нельзя.

Таким образом, для расчета баланса кошелька Боба необходимо знать оба секретных ключа
4970741c4155037ee46c1812cfeb2a29.svg
.


Если Боб передаст аудитору Дену оба своих секретных ключа
4970741c4155037ee46c1812cfeb2a29.svg
, это будет равносильно передаче самих средств, так как Ден, обладая
f9dda26950cb67bd3ecef956c5341c14.svg
, сможет их потратить. Поэтому полноценный аудит кошельков в рамках оригинального протокола CryptoNote невозможен.

В следующих разделах мы рассмотрим варианты модификации протокола, обладающие такой возможностью.

Отметим, что секретный ключ транзакции
066939a33475dd671b845469b6526972.svg
Алисе имеет смысл сохранять (что и происходит в некоторых реализациях протокола). Любой, кто знает
066939a33475dd671b845469b6526972.svg
для некоторой транзакции, может проверить, относится ли выход
bf83b532cd867d34004f8eded8c5c79a.svg
этой транзакции к заданному адресу
809fd9814fd6ef7fa212007ef0f644d0.svg
, просто повторяя вычисления из п.3:

e5a83c746096f37cc48b6c1b2048d2c6.svg


и сравнивая результат с
f34fe73bd033523384beb008d4fbd223.svg
.

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

Вычислить целевой адрес
809fd9814fd6ef7fa212007ef0f644d0.svg
по выходу, даже зная
066939a33475dd671b845469b6526972.svg
, нельзя.


4. Вариант 1/3. Bytecoin Auditable Coins


В момент своего появления Bytecoin был первой и единственной реализацией протокола CryptoNote, поэтому ему были свойственны все особенности и ограничения, рассмотренные в предыдущем разделе.

7 февраля 2019 года разработчики выпустили ([ ]) версию 3.4.0 Amethyst, содержащую ряд улучшений и изменений CryptoNote, которые мы сейчас рассмотрим. Большая часть информации этого раздела была получена путем анализа исходного кода Bytecoin, так как официальной документации не предоставлено.

В рамках тематики этой статьи, наиболее интересным изменением стала возможность для обычных кошельков создавать специальные копии — auditable wallet (AW), обладающие двумя свойствами:

  1. AW не может потратить средства из основного кошелька;
  2. баланс AW всегда совпадает с балансом основного кошелька. Невозможно изменить баланс основного кошелька так, чтобы это не отразилось на балансе AW.

Однако, такой функциональностью обладают только адреса кошельков новых версий, так называемые, amethyst-адреса. С существующими адресами и аккаунтами обеспечивается обратная совместимость, они теперь называются legacy-адреса. Реализация новой функциональности стала возможна только в транзакциях новой версии, поскольку разработчики поменяли формат выходов, поэтому в сети Bytecoin в данный момент циркулируют как транзакции старого формата, так и новые. Транзакции нового формата также поддерживают два типа адресов: amethyst и legacy, поэтому в конечном счете мы имеем три варианта криптографических схем:

  1. tx.version < amethyst, legacy address;
  2. tx.version ≥ amethyst, legacy address;
  3. tx.version ≥ amethyst, amethyst address.

Рассмотрим их более подробно.


4.1. tx.version < amethyst, legacy address


Это оригинальная схема CryptoNote, но с детерминированной генерацией
066939a33475dd671b845469b6526972.svg
.

Аккаунт кошелька представлен секретным ключом
f9dda26950cb67bd3ecef956c5341c14.svg
и хешем
3c606c17ff63fefac1be2ca4728e649e.svg
. Секретный view-ключ
1c1778187263268cc347012d16da61e2.svg
детерминированно генерируется как функция от
3c606c17ff63fefac1be2ca4728e649e.svg
.

Секретный ключ
066939a33475dd671b845469b6526972.svg
транзакции теперь выбирается не случайно, а вычисляется при помощи
3c606c17ff63fefac1be2ca4728e649e.svg
:

73bf79dc5b3bfdac823291893fd6f2ca.svg
, где
41eb294fb67a14d585df00cd48bce388.svg


Таким образом отпадает необходимость хранить секретные ключи
066939a33475dd671b845469b6526972.svg
в локальном хранилище для будущих нужд, так как для любой своей транзакции, когда-либо отправленной в блокчейн, такой ключ может быть вычислен с помощью
3c606c17ff63fefac1be2ca4728e649e.svg
.

Баланс кошелька вычисляется аналогично оригинальному CryptoNote (см. раздел 3), то есть, для учета исходящих платежей необходим секретный spend-ключ
f9dda26950cb67bd3ecef956c5341c14.svg
.

В случае, если в локальном хранилище кошелька будут сохранены все адреса, на которые когда-либо осуществлялся перевод средств, то существует возможность рассчитать верный баланс без привлечения секретного spend-ключа
f9dda26950cb67bd3ecef956c5341c14.svg
следующим образом:

  1. Алиса сканирует транзакции в блокчейне и ведет учет входящих платежей при помощи секретного view-ключа
    1c1778187263268cc347012d16da61e2.svg
    , как было описано в разделе 3, и увеличивает баланс.
  2. Также для каждого выхода каждой транзакции Алиса перебирает все адреса
    809fd9814fd6ef7fa212007ef0f644d0.svg
    на которые когда-либо осуществлялись переводы и вычисляет:
    e5a83c746096f37cc48b6c1b2048d2c6.svg

    Если
    7a3fe4042a424437d7dff936b8cfdd60.svg
    , то данный выход является исходящим платежом Алисы на адрес
    809fd9814fd6ef7fa212007ef0f644d0.svg
    и она уменьшает баланс.

Так Алиса рассчитает баланс используя только
3c606c17ff63fefac1be2ca4728e649e.svg
и
1c1778187263268cc347012d16da61e2.svg
.

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


4.2. tx.version ≥ amethyst


Как уже было отмечено выше, начиная с версии 3.4.0 Amethyst в Bytecoin изменился формат транзакций. Если tx.version ≥ amethyst, то выходы транзакции имеют другой формат.

Теперь каждый выход, помимо номинала amount и открытого ключа P[SUB]i[/SUB], содержит также дополнительный открытый ключ Q[SUB]i[/SUB] (обозначаемый в коде как encrypted_secret) и дополнительный байт, содержащий зашифрованный тип адреса, amethyst или legacy (именуемый в коде encrypted_address_type). Эти структуры схематично показаны на рис. 4.2.


4c60981faff2adfd5707a9fc1170a70e.png


[SUB]Рис. 4.2. Сравнение структуры данных для выходов транзакций CryptoNote и Bytecoin Amethyst[/SUB]
Таким образом, размер каждого выхода увеличился на 33 байта.

Для каждого выхода i тип адреса кодируется и декодируется следующим образом:

encrypted_address_type(i) = (H(o[SUB]i[/SUB]) & 255) xor address_tag

где:

7a344eb4f71c6aa223ae0a6a2ba540db.svg
(обозначается в коде как output_seed),

address_tag равен 0 для legacy-адресов и 1 для ametyst-адресов.


4.3. tx.version ≥ amethyst, legacy address


Аккаунт кошелька также представлен секретным ключом
f9dda26950cb67bd3ecef956c5341c14.svg
и хешем
3c606c17ff63fefac1be2ca4728e649e.svg
, на основе которого детерминированно генерируется секретный view-ключ
1c1778187263268cc347012d16da61e2.svg
.

Алиса, отправляя деньги Бобу на его адрес
809fd9814fd6ef7fa212007ef0f644d0.svg
формирует выходы своей транзакции следующим образом:

  1. Вычисляет
41eb294fb67a14d585df00cd48bce388.svg
, затем для каждого выхода
bf83b532cd867d34004f8eded8c5c79a.svg
:
  2.
c96af71497acb1142167cf21666c4197.svg
(в коде обозначается как output_shared_secret)
  3.
7b3ff212ce3017eb5f98022e2555cf52.svg

  4.
e9399744325b83aec46e676979cb3d40.svg
(при этом
123e780d28ee216c82a2edf017beff93.svg
, однако view-ключ
1c1778187263268cc347012d16da61e2.svg
получателя неизвестен)
  5. Пара
52413cc092e3bcd649453582d5203204.svg
— открытые ключи выхода
bf83b532cd867d34004f8eded8c5c79a.svg
.

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

  6. Для каждой транзакции вычисляет
41eb294fb67a14d585df00cd48bce388.svg
, затем для каждого выхода
bf83b532cd867d34004f8eded8c5c79a.svg
:
  7.
cb83509cd8ad489cd5cd49dbe710bf40.svg

  8.
04e1bf930107a975826ffb95eaee63bd.svg

  9. Если
25874e8526ce683376933842c0ea0058.svg
совпадает с открытым ключом
cb6d45cf916546ae1085088c0c5dcd09.svg
Боба, то этот выход предназначен ему и он увеличивает баланс своего кошелька на соответствующий номинал.

Чтобы потратить выход, получателем которого Боб является, и отправить монеты Кэрол, он действует следующим образом.

  10. Используя свои секретные ключи
1c1778187263268cc347012d16da61e2.svg
и
f9dda26950cb67bd3ecef956c5341c14.svg
, вычисляет секретную часть
f34fe73bd033523384beb008d4fbd223.svg
:
   
cb83509cd8ad489cd5cd49dbe710bf40.svg

   
b779a0e700a54dfbbad7e266d1a4659b.svg
, при этом легко видеть, что
d7534c6475422101b90699e65d1c94b9.svg
(см. п. 3).
  11. Боб рассчитывает key image:
33ded3304647c6f60eddb6067190d035.svg
и записывает его, номинал и ссылку на соответствующий выход во вход своей транзакции для Кэрол.
  12. Боб уменьшает баланс своего кошелька на номинал используемого выхода.
  13. Боб формирует выходы в транзакции для Кэрол в соответствии с п.п. 1-5. После чего подписывает транзакцию и отправляет.

Особенностью данной схемы, в отличии от CryptoNote, является то, что любой, кому Алиса передаст свой секретный хеш
3c606c17ff63fefac1be2ca4728e649e.svg
, сможет вычислить адрес получателя
809fd9814fd6ef7fa212007ef0f644d0.svg
для любой транзакции Алисы:

  14.
c96af71497acb1142167cf21666c4197.svg

  15.
4c1a776dd8e69561d5a64a1128519c3b.svg

  16.
ac299bb631efa2bb66b9aa54911aee82.svg


Однако проблемой в данном случае является задача определения, какие транзакции сформировала и отправила Алиса. Без этой информации в п.п. 14-16 для произвольных транзакций будут получатся произвольные бесполезные данные, неотличимые от настоящих адресов
809fd9814fd6ef7fa212007ef0f644d0.svg
. Некоторую помощь в этом может оказать алгоритм кодирования encrypted_address_type, так как для транзакций Алисы это поле после декодирования будет иметь только допустимые значения
0bb45950d4655c3f3be8486e02084853.svg
. Но, к сожалению, допустимые значения также могут получится и произвольно, и такой случай нельзя будет отличить.

Поскольку в данной схеме вычисление key image также требует знания секретного spend-ключа
f9dda26950cb67bd3ecef956c5341c14.svg
, то проблема аудита, то есть, вычисления точного баланса кошелька без передачи прав на трату средств, остается не решенной.


4.4. tx.version ≥ amethyst, amethyst address


Константа H


Для работы этой криптографической схемы требуется введение новой константы — точки
bd236a859d121c85d92d1acf80ba3597.svg
, элемента группы
311bd3267a013af7b90bf0358acc2fac.svg
, причем порядок точки
bd236a859d121c85d92d1acf80ba3597.svg
неизвестен. Иными словами, это некоторый зафиксированный открытый ключ, секретная часть которого гарантировано неизвестна и вероятность ее нахождения пренебрежимо мала:

9b5196e19505153ab36ab2bd22e65229.svg
, где
9b34c4da5c757d4982bbd1b6f2e8998a.svg
— неизвестное число.

Например, можно задать
bd236a859d121c85d92d1acf80ba3597.svg
так, как предлагается в [ ]:

a1bb6d7cea694beea1ba487414e45721.svg


Разработчики Bytecoin не вычисляют константу, а задают ее численно, без каких-либо указаний на природу ее происхождения:


constexpr P3 H{ge_p3{{7329926, -15101362, 31411471, 7614783, 27996851, -3197071, -11157635, -6878293, 466949, -7986503}, {5858699, 5096796, 21321203, -7536921, -5553480, -11439507, -5627669, 15045946, 19977121, 5275251}, {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {23443568, -5110398, -8776029, -4345135, 6889568, -14710814, 7474843, 3279062, 14550766, -7453428}}};

Однако поиск этой числовой последовательности показал ([ ]), что ими используется та же константа, что и в Monero для RingCT, способ вычисления которой и его обоснование рассмотрены в [ ].

Поскольку
bd236a859d121c85d92d1acf80ba3597.svg
принадлежит группе
311bd3267a013af7b90bf0358acc2fac.svg
, то можно сказать, что
bd236a859d121c85d92d1acf80ba3597.svg
так же порождает группу
311bd3267a013af7b90bf0358acc2fac.svg
, как и базовая точка
560bd97f235311a36dff00db005e6ab5.svg
.

Это означает, что
b7548a4e3f3ffdfd956bde8817ff0470.svg



Множественные несвязываемые адреса (unlinkable addresses)


В оригинальном CryptoNote с каждым кошельком (то есть, набором секретных ключей) был ассоциирован один публичный адрес, который и использовался для перевода средств на него.

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

  1. адреса генерируются детерминированно из первоначального набора секретов;
  2. эти адреса не могут быть связаны между собой, т.е. сторонний наблюдатель не сможет вычислить, что они принадлежат одному аккаунту;
  3. проверка входящих транзакций и учет баланса для
    1e80c3b3087c0a57b68ad11261a9ec2b.svg
    множественных адресов будет вычислительно проще, чем проверка
    1e80c3b3087c0a57b68ad11261a9ec2b.svg
    аккаунтов в обычной схеме.

Аккаунт кошелька представлен секретным ключом
f9dda26950cb67bd3ecef956c5341c14.svg
и хешем
3c606c17ff63fefac1be2ca4728e649e.svg
, также, как и в предыдущей схеме. Однако на основе хеша
3c606c17ff63fefac1be2ca4728e649e.svg
теперь детерминированно генерируется не только секретный view-ключ
1c1778187263268cc347012d16da61e2.svg
, но и дополнительный секретный audit-ключ
372e18546a3b7abb94c2672708bc5dfe.svg
.

Процесс генерации i-го адреса происходит следующим образом (рис. 4.4.2).

fszsmmq8ssss2a29wachfgumom8.png

[SUB]Рис. 4.4.2. Генерация amethyst-адресов для аккаунта Bytecoin (желтым цветом обведены предрассчитанные величины, раскрытие которых не угрожает раскрытию секретных ключей
1c1778187263268cc347012d16da61e2.svg
,
f9dda26950cb67bd3ecef956c5341c14.svg
и
3c606c17ff63fefac1be2ca4728e649e.svg
)[/SUB]
  1. Вычисляется
9fd2519cc2004d7f0216503a485d84bd.svg
и
090680849c11cf0ebe052752a7d245a8.svg

  2.
a21fb7725e0c772abc8a595e819dffbe.svg

  3.
1b30ebfb9c54152ef73393297e010da8.svg

  4. пара
870bdfb17de29c83579042e3242ed2a8.svg
является
bf83b532cd867d34004f8eded8c5c79a.svg
-ым публичным адресом данного аккаунта.

Заметим, что для расчета достаточно знать следующие величины:
  •
493c1c008018df9bed4910321f29ff00.svg

  •
836e59247dee9dc566df40f0f1d606e8.svg

  •
8cb0e6489f4c4a24af0ec68f4aa4a9f8.svg

  •
8635e07e93ca44702ff456d1d17d57c5.svg


Величины
8cb0e6489f4c4a24af0ec68f4aa4a9f8.svg
и
8635e07e93ca44702ff456d1d17d57c5.svg
предрассчитываются при создании аккаунта и рассматриваются как безопасные в том смысле, что зная их, нельзя вычислить
f9dda26950cb67bd3ecef956c5341c14.svg
или
1c1778187263268cc347012d16da61e2.svg
.

Сгенерированные адреса хранятся локально в контейнере, оптимизированном для поиска по полю
cb6d45cf916546ae1085088c0c5dcd09.svg
.


Формирование выходов при отправке средств


Алиса, отправляя деньги Бобу на его адрес
809fd9814fd6ef7fa212007ef0f644d0.svg
формирует выходы своей транзакции следующим образом (рис. 4.4.3).

ih1mp2wrtbc8lw_vibkzoxoumqa.png


[SUB]Рис. 4.4.3. Формирование выходов транзакции при отправке средств на Amethyst-адрес[/SUB]
  1. Вычисляет
41eb294fb67a14d585df00cd48bce388.svg
, затем для каждого выхода
bf83b532cd867d34004f8eded8c5c79a.svg
:
  2.
20c68227b38fab8fcd4b59f5c6228506.svg

  3.
9cc9672a80d21fff7aa7f09570dbe2b5.svg

  4. Пара
52413cc092e3bcd649453582d5203204.svg
— открытые ключи выхода
bf83b532cd867d34004f8eded8c5c79a.svg
.


Учет входящих платежей


Чтобы принять деньги, Боб анализирует все транзакции следующим образом (рис. 4.4.4.).


ero1xd3psrxhdsq16kaxiyva3f0.png

[SUB]Рис. 4.4.4. Анализ выходов транзакции на предмет входящих переводов[/SUB]
  1. Для каждого выхода
    bf83b532cd867d34004f8eded8c5c79a.svg
    , используя секретный view-ключ
    1c1778187263268cc347012d16da61e2.svg
    , Боб вычисляет:
    dd25404f3f8be95b611cacf3cc008915.svg
    (output_shared_secret в коде)
  2. d0670b63e3ec4c53347c8461b468d0e3.svg
  3. После чего пытается найти
    25874e8526ce683376933842c0ea0058.svg
    в списке своих адресов. Если находит, то это означает, что данный выход переводит деньги Бобу. Он увеличивает баланс для соответствующего адреса.

Это означает, что для того, чтобы правильно учитывать входящие платежи, в данной схеме, помимо списка адресов или ключей для их генерации, необходимо знать секретный view-ключ
1c1778187263268cc347012d16da61e2.svg
.


Формирование исходящих платежей


Чтобы потратить выход
bf83b532cd867d34004f8eded8c5c79a.svg
, получателем которого Боб является, и отправить монеты Кэрол, он действует следующим образом.

  1. dd25404f3f8be95b611cacf3cc008915.svg
    (output_shared_secret в коде)
  2. 9e3c1370b19169175d4e918e120d483f.svg
  3. 395bf6ec30a0d5fa03a95ec517986aa0.svg
  4. Вычисляет key image
    cb55b00bd1b16647a91f9f891ca34ccd.svg
  5. Боб уменьшает баланс, относящийся к его адресу
    b62848a4130b25e740aabb5c3f4004fe.svg
    на величину номинала соответствующего выхода.
  6. Боб формирует выходы транзакций, подписывает ее и отправляет.

Видно, что для вычисления key image требуется знание не только секретного view-ключа
1c1778187263268cc347012d16da61e2.svg
, но и
372e18546a3b7abb94c2672708bc5dfe.svg
.

Важной особенностью данной схемы является возможность вычисления key image (а значит, и учета своих исходящих платежей, следовательно — расчет баланса) без использования секретного spend-ключа
f9dda26950cb67bd3ecef956c5341c14.svg
.


Раскрытие адресов получателей для аудита


Также, как и предыдущая, данная криптографическая схема позволяет извлекать из выходов транзакций адреса получателей в случае, если известен секретный хеш отправителя
3c606c17ff63fefac1be2ca4728e649e.svg
.

Происходит это следующим образом (рис. 4.4.5).

anmr07uvnutogvzorjoxdb2k-jw.png


[SUB]Рис. 4.4.5. Аудитор, обладая
3c606c17ff63fefac1be2ca4728e649e.svg
, восстанавливает информацию о входящих/исходящих платежах, балансе и адресах получателей[/SUB]
Предположим, что Алиса передала
3c606c17ff63fefac1be2ca4728e649e.svg
и
8cb0e6489f4c4a24af0ec68f4aa4a9f8.svg
Кэрол. Тогда Кэрол:

  1. Восстановит секретные ключи
    1c1778187263268cc347012d16da61e2.svg
    и
    372e18546a3b7abb94c2672708bc5dfe.svg
    , восстановит список адресов Алисы.
  2. Будет сканировать блокчейн и для каждого выхода
    bf83b532cd867d34004f8eded8c5c79a.svg
    каждой транзакции будет определять, является ли он входящим платежом, пытаясь найти
    c0eceb32a950260ee1d5c0c6acc8a933.svg

    среди адресов Алисы.
  3. Если найдет, то Кэрол увеличит баланс соответствующего адреса и, при помощи
    372e18546a3b7abb94c2672708bc5dfe.svg
    и
    1c1778187263268cc347012d16da61e2.svg
    , вычислит key image (см. выше) и сохранит его локально.
  4. Если среди входов транзакций встретится key image Алисы, то это будет означать, что данная транзакция — исходящий платеж Алисы. Кэрол восстановит адреса получателей для всех выходов этой транзакции:
    9a4c559f563aac4486fd81228c81c3f3.svg

    fdbcec9d08f8852b4403094f0e455053.svg

    и уменьшит баланс соответствующего адреса Алисы на величину номинала входа.

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

Чтобы сгенерировать список своих адресов:
  •
493c1c008018df9bed4910321f29ff00.svg

  •
836e59247dee9dc566df40f0f1d606e8.svg

  •
8cb0e6489f4c4a24af0ec68f4aa4a9f8.svg

  •
8635e07e93ca44702ff456d1d17d57c5.svg


Чтобы распознать только входящие платежи:
  •
493c1c008018df9bed4910321f29ff00.svg

  •
1c1778187263268cc347012d16da61e2.svg

  •
8cb0e6489f4c4a24af0ec68f4aa4a9f8.svg


Чтобы произвести аудит, т.е. рассчитать баланс по своим адресам, без раскрытия адресов получателей:
  •
372e18546a3b7abb94c2672708bc5dfe.svg

  •
1c1778187263268cc347012d16da61e2.svg

  •
8cb0e6489f4c4a24af0ec68f4aa4a9f8.svg


Чтобы произвести аудит, т.е. рассчитать баланс по своим адресам, и раскрыть при этом адреса получателей:
  •
3c606c17ff63fefac1be2ca4728e649e.svg

  •
8cb0e6489f4c4a24af0ec68f4aa4a9f8.svg



4.5. Сравнение подписей транзакций CryptoNote и Bytecoin Amethyst


Структуры данных и размеры подписей


Как было отмечено выше, реализация возможности проводить аудит кошельков, не раскрывая секретный spend-ключ, потребовала от разработчиков Bytecoin Amethyst увеличения размера данных, передаваемых в каждом выходе транзакции: по сравнению с оригинальным протоколом передается один открытый ключ и 1 байт для идентификации типа адреса. Итого, 33 байта на выход.

В CryptoNote у транзакции подписывается отдельно каждый ее вход. Для каждого открытого ключа
f34fe73bd033523384beb008d4fbd223.svg
некоторого выхода, на который ссылается данный вход, в подпись записывается пара скаляров
b64b30b9227f209380e5288d55d66d1a.svg
общим размером 64 байта. (Вход может ссылаться на несколько выходов, лишь один из которых — настоящий, а остальные служат для анонимизации перевода.)

Таким образом, если в транзакции
55979b81aae80da6d53d88ac03cd82b9.svg
входов, каждый из которых ссылается на
73128c4c34e50872289ed5f5b73b31b8.svg
выходов, то общий размер подписи в байтах можно выразить как:

8a93a08b86282b36b53c35a329c5504a.svg


Минимальный размер подписи для транзакции составляет 64 байта (один вход, который тратит один выход напрямую).

В Bytecoin Amethyst подписывается вся транзакция целиком, и соответствующая структура данных усложнена (рис. 4.5.1).

9ay0i3bxfsdc8csebgj1qwiokcc.png


[SUB]Рис. 4.5.1. Сравнение структуры подписи транзакции в CryptoNote и Bytecoin[/SUB]
Для каждого входа транзакции в подпись записывается точка, два скаляра и еще
73128c4c34e50872289ed5f5b73b31b8.svg
скаляров. Ко всей подписи также добавляется еще один скаляр. Итого, общий размер подписи в байтах можно выразить как:

512630d803ac095cddf7c54833cd825d.svg


Минимальный размер подписи для транзакции составляет 160 байт (один вход, который тратит один выход напрямую).

Видно, что обе функции растут пропорционально произведению
b2370f4e8537e7d55c9420c38e8972ec.svg


Чтобы сравнить различие размеров подписи транзакции более наглядно, рассчитаем их для наиболее характерных величин
73128c4c34e50872289ed5f5b73b31b8.svg
и
55979b81aae80da6d53d88ac03cd82b9.svg
и составим таблицу (рис. 4.5.2).

eogd49lmdbfd-slomfutofqayl8.png


[SUB]Рис. 4.5.2. Различие в размере подписи транзакции Bytecoin по сравнению с CryptoNote (в процентах относительно размера подписи CryptoNote; зеленым отмечен выигрыш в размере подписи Bytecoin)[/SUB]
Как легко можно видеть, в ситуации, когда подмешивание выходов отсутствует и происходит прямая трата средств (
1912822cc62d5785a6d2ae7ba1fc3989.svg
), либо когда подмешивается один выход (
8534e4a350317a5fd780c1ebb561364e.svg
), размер подписи Bytecoin больше, чем CryptoNote до 150%.

При подмешивание двух выходов (
af7b4cd2ac430a41c75fa7c621a11de6.svg
) размеры подписей в той и другой схемах практически совпадают.

При дальнейшем увеличении числа подмешиваемых выходов, размер подписи Bytecoin оказывается меньше.

Стоит отметить, что разработчики Bytecoin с выходом версии 3.4.0 Amethyst в целях увеличения анонимности установили минимальное число подмешиваемых выходов равным 3 [ ]. В таких условиях подпись Bytecoin будет обладать меньшим размером.


Трудоемкость проверки подписи


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

Трудоемкость проверки подписи для CryptoNote и Bytecoin можно было бы легко сравнить практически, просто написав тест, генерирующий, а затем проверяющий большое число подписей с заданными
73128c4c34e50872289ed5f5b73b31b8.svg
и
55979b81aae80da6d53d88ac03cd82b9.svg
, однако, поскольку далее в статье будут рассмотрены еще не реализованные на практике, а лишь предлагаемые в теории схемы, будет логично трудоемкость и этих схем оценивать эмпирически, по числу используемых криптографических операций.

В CryptoNote и Bytecoin используется несколько основных примитивов (см. раздел 2). В таблице на рис. 4.5.3. приведено характерное время выполнения самых часто используемых примитивов на современном middle-end компьютере с процессором Core i5-6500 (для сравнения использовался оригинальный исходный код, скомпилированный в Microsoft Visual Studio 2017 со всеми возможными оптимизациями по скорости).

s2wmbiwsgvn1qt5sgsywvazr5xs.png


[SUB]Рис. 4.5.3. Характерное время основных криптографических операций[/SUB]
Результаты, полученные из тестов в Bytecoin и CryptoNote хорошо согласуются между собой. Легко видеть, что наибольший вклад будет давать операция умножения скаляра на точку, и, в меньшей степени, процедура вычисления хеш-функции
1559c9d5aa73e57d9c8f5386424c3ddc.svg
, при этом операции сложения двух точек и вычисления хеш-функции
0bcbac95e61180d7b6498503f2fe8622.svg
не будут существенно влиять на сложность.

Рассмотрим процедуру проверки кольцевой подписи CryptoNote (рис. 4.5.4, процедура генерации подписи подробно рассмотрена в [ ] и здесь рассматриваться не будет).

ftmjhlnbs7t5gbuqjaxw9-so4ym.png

[SUB]Рис. 4.5.4. Схема проверки кольцевой подписи CryptoNote[/SUB]
Как уже было отмечено, в CryptoNote подписывается отдельно каждый вход транзакции, соответственно, и проверяется также каждый вход отдельно. Поэтому, проверяющий для каждого входа транзакции проверяет соответствующую строку (на рисунке) подписи следующим образом.

  1. Для каждой пары значений
    80d487147d59774316d21671eb1a4a51.svg
    и
    94fa41fb6c6b7e8c461156916befaa85.svg
    при помощи key-image входа
    64beb737a23fb5cb0a455f0e9213f2a4.svg
    и открытого ключа
    4795f1a17c53c606685c580a6ee89eed.svg
    очередного выхода, на который ссылается данный вход, вычисляются величины:
    4901b9b2b27f5013be301a2517c5aeaa.svg

    f3a32b820b16b7a267090c54f4ba9691.svg

    (при этом индекс j пробегает значение от 0 до
    73128c4c34e50872289ed5f5b73b31b8.svg
    )
  2. Вычисляется сумма
    e1a229081e8db6ee98dfb79797b987dd.svg
    всех
    94fa41fb6c6b7e8c461156916befaa85.svg
    .
  3. Вычисляется хеш
    b096f15badcf23a6e5cf973f013cfa76.svg
    )
    где tx_prefix_hash — хеш префиксной части транзакции (без подписи).
  4. Проверяется равенство
    c1581a891224fccf83dffdfe5e751516.svg
    . Если оно выполняется, то кольцевая подпись считается действительной.

Оценим число операций умножения скаляра на точку и вычисления хеша
1559c9d5aa73e57d9c8f5386424c3ddc.svg
.

Каждое вычисление
5a6a7b5aa0e0577141ad6753c5f846dc.svg
и
55831529b7a48d46d812f87db39c5a3a.svg
требует по два скалярных умножения. Число пар
ba062c076778a1e345c9415b432a2f52.svg
соответствует числу подмешиваемых выходов
73128c4c34e50872289ed5f5b73b31b8.svg
для каждого входа. Поэтому имеем:

23ec5c45138257476a7cf9548b714aaf.svg


При этом хеш-функция
1559c9d5aa73e57d9c8f5386424c3ddc.svg
используется однократно при каждом вычислении
55831529b7a48d46d812f87db39c5a3a.svg
, следовательно:

750e6a4b0776ae24b6a41553aca9f815.svg


Теперь рассмотрим алгоритм проверки кольцевой подписи в Bytecoin Amethyst (рис. 4.5.5).

g-f_2wjgyllduo0y9zwqlwosdsu.png


[SUB]Рис. 4.5.5. Схема проверка кольцевой подписи в Bytecoin Amethyst[/SUB]
Проверяется целиком вся подпись, для всех входов сразу. Происходит это так:

  1. В хеш-буфер записывается префиксный хеш транзакции (без подписи).
  2. Для каждого входа
    bf83b532cd867d34004f8eded8c5c79a.svg
    (строка подписи на рисунке):
  3. Вычисляется
    0bcbac95e61180d7b6498503f2fe8622.svg
    по всем данным хеш-буфера и результат сравнивается с величиной
    20600c422160c10dc3d3b3348a973c94.svg
    .Подпись считается действительной, если равенство соблюдается.

Оценим число операций умножения скаляра на точку и вычисления хеша
1559c9d5aa73e57d9c8f5386424c3ddc.svg
.

Каждое вычисление
c23a944bb7dee89b085bd79269e0ccce.svg
и
bf4722135d0d40c08762402a919c4fd9.svg
требует по два скалярных умножения, плюс вычисление
6d6a4f78fbacd6edecc018ce8ad3e364.svg
требует трех скалярных умножений. Число пар
858b940227a1ecf85d892ed57d7a11ce.svg
соответствует числу подмешиваемых выходов
73128c4c34e50872289ed5f5b73b31b8.svg
для каждого входа. Поэтому имеем:

4f07f9d30cfe88a88096ed5d14a5469b.svg


При этом хеш-функция
1559c9d5aa73e57d9c8f5386424c3ddc.svg
используется однократно при каждом вычислении
bf4722135d0d40c08762402a919c4fd9.svg
и однократно для вычисления
20d8caec693d8d8eaf70885e408419f6.svg
для каждого из входов, следовательно:

9d5a1c11c9840424487250cbe1a004cf.svg


Чтобы наглядно сравнить вычислительную сложность обоих алгоритмов на типовых данных, введем следующую метрику. Сложим число операций скалярного умножения и операций вычисления
1559c9d5aa73e57d9c8f5386424c3ddc.svg
с весами, пропорциональными характерному времени выполнения этих операций:

6dd0f2543c0b326960b529d63aa347a9.svg


Затем сравним относительные результаты для CryptoNote и Byteсoin в процентах (рис. 4.5.6).

l4dnoideiqiud7hzhvjm8ruofqo.png


[SUB]Рис. 4.5.6. Вычислительная сложность проверки кольцевой подписи Bytecoin Amethyst по сравнению с CryptoNote (зависимость от
55979b81aae80da6d53d88ac03cd82b9.svg
отсутствует)[/SUB]
Как видно, проверка подписи Bytecoin является значительно более трудоемкой операцией.

Однако, как уже было отмечено выше, в Bytecoin с версии 3.4.0 Amethyst в целях увеличения анонимности установлено минимальное число подмешиваемых выходов равным 3 [ ], поэтому худшее практическое значение не превысит 25% (в теории).

Подытожим:

  1. Размер каждого выхода увеличивается на открытый ключ
    eb904b678aba503fe98f5759398e5ee0.svg
    — 32 байта.
  2. Размер кольцевой подписи варьирует в сравнении с размером подписи CryptoNote в зависимости от числа подмешиваемых выходов (при большом их числе оказывается меньше):
    512630d803ac095cddf7c54833cd825d.svg
  3. Вычислительная сложность выше, чем в CryptoNote и значительно зависит от числа подмешиваемых выходов:
    4f07f9d30cfe88a88096ed5d14a5469b.svg

    9d5a1c11c9840424487250cbe1a004cf.svg



5. Вариант 2/3. Исследования аудита в CryptoNote от Anton Sokolov


Осенью 2019 года на площадке Medium.com была опубликована серия эссе [ , , , , , ] о проблеме аудита в CryptoNote и возможных способах ее решения под авторством Anton Sokolov. В ней с теоретических позиций рассматриваются несколько вариантов модификации оригинального протокола таким образом, чтобы решить задачу аудита для третьей стороны.

Рассмотрим последнюю из них [ ] как наиболее оптимизированную. Будем сокращенно обозначать ее как «AS».

Примечание: для единообразия изложения spend-ключи и далее будут обозначаться буквами
f9dda26950cb67bd3ecef956c5341c14.svg
и
cb6d45cf916546ae1085088c0c5dcd09.svg
, view-ключи — буквами
1c1778187263268cc347012d16da61e2.svg
и
836e59247dee9dc566df40f0f1d606e8.svg
, несмотря на то, что в оригинальных работах используются
302c7204ea9987e698a70307646abd71.svg
,
20d8caec693d8d8eaf70885e408419f6.svg
и
372e18546a3b7abb94c2672708bc5dfe.svg
,
493c1c008018df9bed4910321f29ff00.svg
соответственно.


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


Аккаунт кошелька представлен набором не двух, как в CryptoNote, а трех секретных ключей
6a063d27106d14e791e7279c54abf338.svg
: view-, spend- и audit-ключи соответственно.

Совокупность трех открытых ключей
1877941bd14b2bf92d44caa8c608a58c.svg
представляет публичный адрес этого аккаунта.

Алиса, отправляя деньги бобу, действует следующим образом (рис. 5.1).

zgomi1yqmbjun5gni7zxl7atohw.png


[SUB]Рис. 5.1. Формирование выходов транзакций в схеме AS[/SUB]
  1. Боб опубликовывает свой адрес, поэтому Алиса знает его открытые ключи
    836e59247dee9dc566df40f0f1d606e8.svg
    ,
    cb6d45cf916546ae1085088c0c5dcd09.svg
    и
    c5e2ea3b63d255f7a483773fe1d664b2.svg
    .
  2. Так же, как и в CryptoNote, Алиса выбирает случайный секретный ключ транзакции
    066939a33475dd671b845469b6526972.svg
    и вычисляет открытый ключ
    42c8638ddeb319d08a84053bdecf571e.svg
    , который записывает в специальное поле extra транзакции.
  3. Для каждого выхода Алиса вычисляет не один, а два стелс-адреса
    c3d2f2c44fc42edea27de7f8f67b4829.svg
    и
    175f98839ab732db76d5f20cd6ce2ce9.svg
    . Первый рассчитывается аналогично CryptoNote:
    2f348672cd65459e2626dee115c6d2ef.svg

    Второй иначе:
    2f3eeff4f45a6001ffaa205475b875cf.svg

    Порядковый номер выхода в оригинальной работе здесь не используется, однако, разумно предположить, что это сделано для упрощения и на практике он будет одним из аргументов функции
    0bcbac95e61180d7b6498503f2fe8622.svg
    по аналогии с CryptoNote (см. раздел 3).
  4. Алиса подписывает и отправляет транзакцию.

Сторонний наблюдатель не сможет связать
c3d2f2c44fc42edea27de7f8f67b4829.svg
и
175f98839ab732db76d5f20cd6ce2ce9.svg
с адресом Боба.


Распознавание входящих платежей и формирование входов


Чтобы принять и потратить деньги, Боб действует следующим образом (рис. 5.2).

jgnrn5ch7oj8i5midkbzzeoe_eu.png


[SUB]Рис. 5.2. Определение входящих переводов и формирование входов для тратящей их транзакции[/SUB]
  1. Используя свой секретный view-ключ
    1c1778187263268cc347012d16da61e2.svg
    , Боб стелс-адрес
    c3d2f2c44fc42edea27de7f8f67b4829.svg
    каждого выхода сравнивает с точкой:
    ac2b4a4f005f00eb7861e9cfbf3f996d.svg

    (этот шаг аналогичен CryptoNote)
  2. В случае, если равенство выполняется, это означает, что данный выход адресован Бобу. Он увеличивает свой баланс на величину номинала выхода.
  3. При необходимости перевести полученные средства Кэрол, Боб, используя свои секретные spend- и audit-ключи
    f9dda26950cb67bd3ecef956c5341c14.svg
    и
    35ea8536b3e6152e60442ccecbc46812.svg
    , вычисляет два key image:
    64beb737a23fb5cb0a455f0e9213f2a4.svg
    и
    ee69c6c7d19425ce7ae3622d5fa34b8d.svg
    . Первый — аналогично CryptoNote:
    cfb8fb83883fc3a973c8cbd452c622d6.svg

    и дополнительный:
    30d5ef04050147d7b5c85e372bef2fc6.svg

    7eff63b7b67cac8c8fd58207639c7aec.svg

    Затем записывает их, номинал и ссылку на соответствующий выход во вход своей транзакции для Кэрол.
  4. Затем Боб формирует выходы транзакции для Кэрол, уменьшает свой баланс пропорционально потраченным выходам, подписывает транзакцию и отправляет.

Как видно, здесь так же, как и в CryptoNote третья сторона — Аудитор — обладая только секретным view-ключом
1c1778187263268cc347012d16da61e2.svg
, сможет распознать только входящие переводы.


Аудит


Если же Аудитор располагает также секретным audit-ключом
35ea8536b3e6152e60442ccecbc46812.svg
, то он сможет распознать исходящие платежи Боба и рассчитать его баланс следующим образом:

  1. Для каждого входящего платежа Аудитор будет рассчитывать и запоминать дополнительный key image
    ee69c6c7d19425ce7ae3622d5fa34b8d.svg
    в локальном хранилище:
    30d5ef04050147d7b5c85e372bef2fc6.svg

    7eff63b7b67cac8c8fd58207639c7aec.svg

  2. Если во входах какой-либо из транзакций блокчейна дополнительный key image
    95e8807c71b695e4b122a008d1d43073.svg
    совпадёт с одним из сохраненных, то это будет означать, что данная транзакция является исходящим платежом Боба. Аудитор уменьшит баланс на номинал соответствующего входа.

Таким образом, Аудитор, обладая набором ключей
622fde9e56d4645a2e83685a19db4aa9.svg
сможет распознать в блокчейне входящие и исходящие переводы Боба и восстановить его корректный баланс. При этом потратить средства Аудитор не сможет, т.к. без секретного spend-ключа
f9dda26950cb67bd3ecef956c5341c14.svg
он не сможет вычислить основной key image
64beb737a23fb5cb0a455f0e9213f2a4.svg
.

Задача решена.


Кольцевая подпись


Применив идеи из работы [ ], автору удалось уменьшить размер подписи по сравнению с CryptoNote: теперь, для каждого входа в подписи хранится только
29c2c34018e8b2102ff5feeebaec0028.svg
скаляр (рис. 5.3).

knyp961pqt2-r-noc4amogiuuia.png


[SUB]Рис. 5.3. Сравнение размеров кольцевой подписи в схеме AS и CryptoNote[/SUB]
Таким образом, размер подписи уменьшается почти вдвое.

Рассмотрим вычислительную сложность ее проверки. Схема проверки подписи представлена на рис. 5.4.

eh4qlbaalytl00hc1r8xwutdzog.png


[SUB]Рис. 5.4. Схема проверки кольцевой подписи в AS[/SUB]
Этот алгоритм очень похож по структуре на используемый в CryptoNote (см. рис. 4.5.4). Проверка осуществляется раздельно для каждого входа и состоит в последовательном вычислении значений
6718fe9a33566f7a997e520830d5a4d9.svg
,
5a6a7b5aa0e0577141ad6753c5f846dc.svg
,
55831529b7a48d46d812f87db39c5a3a.svg
,
94fa41fb6c6b7e8c461156916befaa85.svg
для всех выходов, использованных для подмешивания в данном входе. В результате, цикл из
94fa41fb6c6b7e8c461156916befaa85.svg
должен замкнуться и величина
d61d31c85cae6d67bdc4b21e5a4a7b27.svg
должна совпасть с
20600c422160c10dc3d3b3348a973c94.svg
, в этом случае подпись считается действительной.

Вычислительная сложность алгоритма определяется шестью операциями скалярного умножения и одним вычислением хеш-фукнции
1559c9d5aa73e57d9c8f5386424c3ddc.svg
на итерацию, число который есть произведение
90ab40c0c3a12d9e1ecfc36eeb1f780f.svg
.


Сравнение с CryptoNote по данным и вычислительной нагрузке


  1. Размер адреса увеличивается на 50%, т.к. адрес теперь представляет совокупность трех открытых ключей:
    1877941bd14b2bf92d44caa8c608a58c.svg
    , а не двух
    403744dae628277b6d528cf9a77c3483.svg
    .
    Кодированное представление адреса увеличится примерно на столько же: например, стандартный Zano-адрес, содержащий два открытых ключа, занимает 97 символов:

    ZxD5UBX5PM3RTsEtTRd9ATUFxXyocoQzDRk3baVBahuWQJRK8QHTUT9GQM7jk7GoedK5B2nP4HxSPDpuLHvizpwj2q99bmz7t

    Аналогичный Zano-адрес, содержащий три открытых ключа будет иметь длину порядка 141 символа:

    ZxD5UBX5PM3RTsEtTRd9ATUFxXyocoQzDRk3baVBahuWQJRK8QHTUT9GQM7jk7GoedK5B2nP4HxSPDpuLHvizpwjcenhnGbhpJFLk8vkhJywHCcht4d9EKA7CHHav1H6QPpB1cLsTvPfj
  2. Размер каждого выхода увеличивается на дополнительный стелс-адрес
    175f98839ab732db76d5f20cd6ce2ce9.svg
    — 32 байта.
  3. Размер каждого входа увеличивается на дополнительный key image
    ee69c6c7d19425ce7ae3622d5fa34b8d.svg
    — 32 байта.
  4. Размер кольцевой подписи меньше, чем в CryptoNote:
    59063b8c08dd57658a391a040dec656d.svg
  5. Вычислительная сложность выше, чем в CryptoNote:
    439c8dd323643174df6ad26fd16da50d.svg

    750e6a4b0776ae24b6a41553aca9f815.svg



6. Вариант 3/3. Аудит через ограничение на подмешивание выходов


Рассмотрим еще один способ реализации аудита в CryptoNote.

Атрибут выхода mix_attr


В проекте Zano, являющимся наследником CryptoNote, у выхода транзакции появился дополнительный атрибут mix_attr размером 8 бит, и правило ядра, ограничивающее использование выходов в подмешивании, в зависимости от его значения.

Структуру выходов CryptoNote и Bytecoin (рис. 4.2) мы можем теперь дополнить таким образом (рис. 6.1.).

8y-o-mltqzfep_cq-kpo3ocrnfy.png


[SUB]Рис. 6.1. Сравнение структуры данных для выходов транзакций CryptoNote, Zano и Bytecoin Amethyst[/SUB]
Правило ядра, ограничивающее подмешивание в зависимости от mix_attr, таково:

  1. Если mix_attr = 0, то ограничений нет. Данный выход может использоваться для подмешивания с другими выходами в любых комбинациях. Это — значение по-умолчанию.
  2. Если mix_attr = 1, то данный выход может быть потрачен только непосредственно, без подмешивания, и не может быть использован для подмешивания к другим выходам.
  3. Если mix_attr ≥ 2, то данный выход может быть потрачен только при подмешивании других, при этом общее число использованных выходов не должно быть меньше величины mix_attr.

Главной особенностью этого нововведения является п. 3, что позволяет увеличить untraceability (неотслеживаемость связей) за счет исключения ситуаций, когда выход, уже использованный в подмешивании, тратится его владельцем непосредственно (это подробно рассмотрено в [ ]).

Однако, в контексте данной статьи, нас будет интересовать п. 2, то есть ситуация, когда mix_attr = 1 и выход, помеченный таким образом, может быть потрачен только непосредственно. Это ограничение проиллюстрировано на рис. 6.2.

taqs_cs2drhdbvgpou1eq_jjkya.png


[SUB]Рис. 6.2. Иллюстрация ограничения. Сверху: input #0 ссылается только на output #0 с mix_attr = 1 (непосредственная трата) — допустимая ситуация.Снизу: input #1 ссылается на три выхода: output #2 с mix_attr = 1 и еще на output #1 и output #3 — недопустимая ситуация[/SUB]
Так как output #2 имеет mix_attr = 1, то он не может быть смешан с другими выходами, вне зависимости от их значений атрибута mix_attr. Он может быть только потрачен непосредственно, как output #0.

Эту особенность можно использовать для организации аудита.


Аудит при помощи mix_attr = 1


Как было отмечено в разделе 3, если в рамках оригинального протокола CryptoNote аудитор Ден получит от Боба секретный ключ
1c1778187263268cc347012d16da61e2.svg
, он сможет распознать входящие транзакции, но не сможет распознать исходящие, поэтому точный расчет баланса невозможен.

Тем не менее, поскольку Ден будет обладать полной информацией о не потраченных выходах (UTXO) Боба, то он сможет отследить тот факт, что какая-то транзакция в своих входах ссылается на UTXO Боба. При использовании подмешивания других выходов Ден не сможет определить, тратит ли данная транзакция именно выход Боба, что достигается благодаря использованию кольцевой подписи. Однако, если подмешивания нет и UTXO Боба тратится непосредственно, то аудитор Ден может быть уверен, что данная транзакция является исходящим платежом Боба. В этом и состоит идея данной схемы.

Предположим, что Алиса отправляет Бобу транзакцию, и Боб хочет, чтобы аудитор Ден мог видеть факт прихода средств от Алисы и факт их траты, когда Боб решит их потратить.

Схема работы будет выглядеть следующим образом (рис. 6.3).

wo7nbw8y-xgvkddpnx6lyyntsos.png


[SUB]Рис. 6.3. Аудитор с помощью секретного view-ключа
1c1778187263268cc347012d16da61e2.svg
Боба определяет входящие и исходящие транзакции[/SUB]
  1. Боб сообщает Алисе свой публичный адрес
    809fd9814fd6ef7fa212007ef0f644d0.svg
    , а также просит ее во всех выходах, адресованных ему, поставить атрибут mix_attr в значение 1 (ниже рассмотрим, как это можно реализовать технически).
  2. Боб передает аудитору Дену свой секретный view-ключ
    1c1778187263268cc347012d16da61e2.svg
    .
  3. Алиса отправляет Бобу транзакцию по обычной схеме CryptoNote. В выходах, адресованных Бобу она ставит mix_attr = 1.
  4. Ден сканирует все транзакции в блокчейне и с помощью секретного view-ключа Боба проверяет для каждого выхода
    e9a670e7a4d95c4974ae87da53a2e9dc.svg
    (где
    bf83b532cd867d34004f8eded8c5c79a.svg
    — порядковый номер выхода,
    cb6d45cf916546ae1085088c0c5dcd09.svg
    — открытый spend-ключ Боба). Если равенство выполняется, то данный выход адресован Бобу.
    Ден убеждается, что mix_attr == 1, добавляет данный выход в список и увеличивает баланс на величину номинала выхода.
  5. Ден также проверяет все входы всех транзакций, и если один из входов ссылается на UTXO Боба из списка, то это означает, что данная транзакция — исходящий платеж Боба. Благодаря ограничению mix_attr = 1, данных вход не может подмешивать другие выходы, а значит он тратит выход Боба непосредственно, и Ден может быть уверен, что это исходящий платеж Боба.Ден уменьшает баланс на величину номинала входа.

Таким образом, Ден сможет рассчитать корректный баланс кошелька Боба, не получая доступа к его секретному spend-ключу
f9dda26950cb67bd3ecef956c5341c14.svg
.


Особенности схемы


Особенность 1. Важно, чтобы отправляющая сторона (Алиса) поставила mix_attr в значение 1 при отправке транзакции. Если Алиса этого не сделает, то средства придут Бобу, однако в дальнейшем Ден не сможет однозначно сказать, потратил их Боб или нет, так как любой другой пользователь сможет использовать данных выход для подмешивания.

Один из вариантов решения — введение адресов особого типа, содержащих те же два открытых ключа
809fd9814fd6ef7fa212007ef0f644d0.svg
, но упакованных отличным от стандартного образом. Алиса, отправляя средства на адрес такого типа, будет знать о необходимости установить mix_attr = 1 для соответствующих выходов.

Особенность 2. Использование адресов особого типа не обязывает Алису устанавливать нужное значение атрибута для выходов. Она может отправить средства не сделав этого, однако, это будет сразу же выявлено как Бобом, так и аудитором Деном.

Особенность 3. В данной схеме возможность аудита достигается ценой предельного уменьшения untraceability (неотслеживаемости связей). Это не представляет особой проблемы в случае, если возможность аудита предоставлена неограниченному кругу лиц. Например, благотворительный фонд может опубликовать адрес для пожертвований вместе с секретным view-ключом, благодаря чему любой желающий сможет выступить в качестве аудитора и рассчитать актуальный баланс его кошелька. Важно, что при этом анонимность входящих переводов остается стандартной для CryptoNote (можно использовать большое число
73128c4c34e50872289ed5f5b73b31b8.svg
). Однако, анонимность исходящих платежей будет ограничена невозможностью подмешивать произвольные выходы.

Стоит отметить, что в случае, когда возможность аудита предоставляется узкому кругу лиц, в отличии от примера выше, уменьшение untraceability может быть нежелательным эффектом.

Большими достоинствами этого варианта являются простота реализации и отсутствие дополнительной нагрузки по вычислениям и данным.


7. Заключение


Мы рассмотрели три варианта добавления возможности проведения аудита в протокол CryptoNote: Bytecoin Amethyst, теоретическая схема AS от Anton Sokolov и использование mix_attr (обозначим как MA).

Относительное изменение размера кольцевой подписи для всех вариантов, кроме Bytecoin (BCN), не зависит от
55979b81aae80da6d53d88ac03cd82b9.svg
, поэтому рассмотрим
6d869715eb0c208e590704715de9e604.svg
(минимальный) и
b878da558d091ed653c24bf29c02bd05.svg
(рис. 7.1).

x8s9pmx4mx3nilyi-lsto5ufsu4.png


[SUB]Рис. 7.1. Сравнение размеров кольцевой подписи при
6d869715eb0c208e590704715de9e604.svg
и
b878da558d091ed653c24bf29c02bd05.svg
для всех рассмотренных вариантов[/SUB]
Примечание.
55979b81aae80da6d53d88ac03cd82b9.svg
— число входов в транзакции,
73128c4c34e50872289ed5f5b73b31b8.svg
— число выходов, ассоциированных с каждым входом транзакции. Если
cb179e1a943b544c881654baafca3f4e.svg
то это означает, что для увеличения untraceability каждый вход ссылается более чем на один выход какой-то другой транзакции и при этом нельзя установить, какой из них реальный.


Лучший результат показывает схема AS, давая уменьшение размера кольцевой подписи в широком диапазоне числа подмешиваемых выходов (
73128c4c34e50872289ed5f5b73b31b8.svg
). Bytecoin также дает хороший результат при
1bd12446317893bc25e52962abc90f43.svg
(как уже было отмечено, в Bytecoin Amethyst для повышения untraceability было введено ограничение на минимальное число
73128c4c34e50872289ed5f5b73b31b8.svg
равное 3).

Схема MA никаких улучшений в части размера кольцевой подписи не предлагает.

Сравним теперь трудоемкость процедуры проверки кольцевой подписи. Для этого будем использовать метрику, упоминавшуюся выше, а именно возьмем сумму операций скалярного произведения и вычисления хеш-функции
1559c9d5aa73e57d9c8f5386424c3ddc.svg
с весами, пропорциональными их времени выполнения на типичном современном процессоре:

6dd0f2543c0b326960b529d63aa347a9.svg


Имеем следующую картину (рис. 7.2).

pdgg-yalim14da-t8qaszwz2hvq.png


[SUB]Рис. 7.2. Сравнение увеличения вычислительной сложности проверки кольцевой подписи (
6d869715eb0c208e590704715de9e604.svg
)[/SUB]
При прямой трате средств (
1912822cc62d5785a6d2ae7ba1fc3989.svg
) схемы AS и Bytecoin требуют существенно большего объема вычислений для проверки подписи.

При подмешивании выходов (
cb179e1a943b544c881654baafca3f4e.svg
) схема Bytecoin Amethyst выглядит предпочтительнее AS, однако последний рассмотренный вариант MA остается непревзойденным.

Подведем окончательный итог, приняв во внимание такие факторы, как увеличение размера адреса, входов и выходов транзакций (рис. 7.3).

pytajbdn3ggbshximbjt7dzhl7m.png


[SUB]Рис. 7.3. Сравнение всех рассмотренных схем[/SUB]
Bytecoin сохраняет удобную для конечного пользователя длину адреса, в то время как схема Anton Sokolov увеличивает его на 50%. Это не влияет непосредственно на размер блокчейна (хотя адрес отправителя в зашифрованном виде может передаваться в extra транзакции при желании последнего, например) и вычислительную сложность, однако незначительно влияет на удобство использования. В схеме MA размер адреса остается равным 64 байтам, однако требуется способ отличать адреса, предназначенные для аудита, от обычных.

Варианты реализации аудита Bytecoin и AS подразумевают добавление одной точки (32 байт) к каждому выходу транзакции, однако, размер входа остается неизменным только для Bytecoin.

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

Схема AS, напротив, описана строго и предложена к обсуждению в криптосообществе [ ].

Схема MA не имеет строго описанного формального доказательства, однако, в силу ее крайней простоты, оно представляется излишним.


Литература


1. Nicolas van Saberhagen, «CryptoNote v 2.0»


2. Анонс Bytecoin на форуме bitcointalk.org


3. Анонс Bitmonero на форуме bitcointalk.org


4. Репозиторий Bitmonero в Github


5. Bernstein et al. «Ed25519: high-speed high-security signatures»


6. «Доступно о криптографии на эллиптических кривых»


7. Shen Noether, «Understanding ge_fromfe_frombytes_vartime»


8. Shen Noether, MRL, «Ring confidential transactions»


9. Коммит, задающий численно константу H в коде Monero:


10. Bytecoin blog — Auditable coins


11. Anton Sokolov, «Cryptonote auditability. How to append a wallet balance audit.»


12. Anton Sokolov, «Discussion for the auditable wallets Variant 1 and 2»


13. Anton Sokolov, «The unlinkable auditable Variant 3»


14. Anton Sokolov, «The auditable variant 4. Memory efficiency and security question.»


15. Anton Sokolov, «Multi-signature with LSAG. One more memory efficient approach to auditable wallets.»


16. Abe, Ohkubo, Suzuki, «1-out-of-n Signatures from a Variety of Keys» (AOS).


17. Anton Sokolov, «Cryptonote auditability and efficient scheme for anonymous key vector proof»


18. Anton Sokolov, «Practical approach for appending auditable wallets to the Cryptonote»


19. «Boolberry Solves CryptoNote Issues»


20. «Bytecoin Amethyst Stable Release Extended Technical Description»
 
Сверху Снизу