О данном ресурсе


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

На wiki.xmr.ru мы пытаемся собрать воедино самую различную информацию в ключе работы криптовалюты Monero.

К сожалению, вся доступная информация на текущий момент разбросана по самым различным источникам - сообщения на Reddit канале Monero, git-комментарии, в вопросах и ответах на Monero Stack Exchange и журналах встреч рабочих групп и разработчиков, что затрудняет поиск простых ответов на сложные вопросы.

Цель данного проекта состоит в том, чтобы как можно быстрее дать ответы на возникшие вопросы и помочь всем пользователям без исключения.

Форма обратной связи

Если вы хотите внести свой вклад или поспособствовать развитию данного проекта, пожалуйста, сделайте коммит с изменениями в соответствующий репозиторий по данному адресу https://github.com/xmr-ru/moneropedia или свяжитесь напрямую с участниками Monero Russian Community, причастными к созданию данного ресурса:

Не забывайте посетить наш форум xmr.ru, где вас ждут не менее интересные материалы, новости, переводы и руководства о Monero.

В дополнении, вы можете заглянуть на наш YouTube канал, где сможете найти еженедельные выпуски новостей, руководства и инструкции.

Также вы можете оказать финансовую поддержку в Monero на развитие данного проекта.

QR-код: QR-код:

Адрес Monero: 8AxxoJGkcYs8juLSkk32TsSh96U9XMYxwJhLyugJP3RN2QnsCcszmBEBfdZftXdGTe3CRj17YYymSNu7Yf83H2kH76PoRJe


Основные тезисы



Что такое Monero (XMR)?


Что же вам нужно знать

Monero является ведущей криптовалютой с акцентом на приватные и устойчивые к цензуре транзакции.

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

Транзакции в Monero конфиденциальны и не подлежат отслеживанию.

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

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

Monero - это огромное сообщество, которое объединяет лучшие таланты со всего мира в области исследований аспектов анонимности и создания криптовалют.

Более 500 разработчиков, в том числе 30 ключевых разработчиков которые уже внесли свой вклад в развитие проекта Monero. Форумы и каналы всегда активны, и приглашают в свои ряды новых пользователей.

Исследовательская лаборатория Monero, разработчики и участники сообщества постоянно меняют границы того, что возможно с точки зрения конфиденциальности и безопасности криптовалют.

Monero - это электронные деньги, которые позволяют осуществлять быстрые и недорогие платежи в любую точку мира.

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

Краткая история создания

Monero был запущен в апреле 2014 года. Это был честный, заранее анонсированный запуск эталонного кода CryptoNote. На момент запуска не было никакого премайнинга, инстамайнинга или того, что какая-то часть награды за блок уходила разработчикам на развитие проекта (cмотрите оригинальную ветку на форуме Bitcointalk). Основатель, thankful_for_today, предложил спорные изменения, с которыми сообщество не согласилось. С тех пор образовался отдельный костяк, группа - Monero Core, которая взяла контроль над Monero в свои руки.

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

Принципы

Monero - это не просто технология. Это и есть технология. Некоторые из важных руководящих принципов перечислены ниже.

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

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

Децентрализация
Monero стремится обеспечить максимальную децентрализацию. С Monero вам не нужно доверять никому в сети, ведь она не управляется какой-либо группой пользователей. Алгоритм "доказательство работы" позволяет майнить Monero на обычных компьютерах, что затрудняет доминацию при покупке большого количества майнинговых мощностей. Узлы соединяются друг с другом при помощи протокола I2P, чтобы снизить риски раскрытия конфиденциальной информации о транзакциях. Решения в области дальшейшего развития предельно ясны и открыты для общественного обсуждения. Журналы собраний разработчиков публикуются в интернете и доступны для прочтения всем желающим.


Загрузка Monero


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

Мы рекомендуем скачивать двоичные файлы Monero напрямую с GitHub:

GUI является графическим десктоп-кошельком.

CLI является десктоп-кошельком с поддержкой командной строки.

Если вам требуется более подробное руководство по загрузке файлов, перейдите в соответствующий раздел веб-сайта getmonero.

Запомните! Очень важно проверять подпись и хеш-сумму скачанного архива.

Какую версию скачивать?

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

CLI версия кошелька кошелька скорее подходит для использования опытным пользователям.

GUI версия кошелька содержит как CLI, так и GUI файлы. И именно GUI кошелек подходит для использования всем, без исключения пользователям.

Все версии кошельков содержат файлы для создания полного узла и кошелька Monero.

Почему GitHub, а не getmonero.org?

Двоичные файлы сначала публикуются на GitHub.

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


Проверка целостности файлов


Проверку следует проводить до распаковки архива и начала использования кошельком / демоном Monero.

Инструкции были проверены для Linux. С небольшими изменениями они также должны работать с macOS.

1. Импорт PGP ключа ведущего разработчика

Это единоразовое действие (при проверке последующих (новых) версий файлов (архива кошелька) Monero этот шаг можно пропустить).

Ведущие разработчики Monero подписывают список хешей для двоичных файлов.

binaryFate является одним из ведущих разработчиков Monero, подписывающим публикуемые версии файлов. Публичный ключ binaryFate доступен на GitHub в исходном коде проекта. Необходимо импортировать публичный ключ binaryFate в ваш набор ключей:

curl https://raw.githubusercontent.com/monero-project/monero/master/utils/gpg_keys/binaryfate.asc | gpg --import

Публичному ключу binaryFate можно доверять (отпечаток будет таким):

gpg --edit-key '81AC591FE9C4B65C5806AFC3F0AF4D462A0BDF92'
trust
4

Если ключ с таким отпечатком не был найден, следует немедленно удалить импортированный ключ (gpg --delete-keys …), так как это будет означать, что ключ был изменён (вероятно, взломан).

2. Проверка подписи списка хешей (hashes.txt)

Список двоичных файлов и соответствующих хешей публикуется на getmonero.org и в нескольких других источниках, например, в примечаниях к новым версиям на r/monero.

Следует отметить, что канал публикации не имеет значения при условии, что подпись проверяется надлежащим образом! u

Чтобы проверить хеши (их легитимность), следует выполнить:

curl https://www.getmonero.org/downloads/hashes.txt | gpg --verify

Полученный результат должен содержать следующую строку:

gpg: Good signature from "binaryFate <binaryfate@getmonero.org>"

3. Проверка хеша

На этом этапе проверяется легитимность опубликованных хешей.

Последний шаг заключается в сравнении опубликованного хеша с хешем SHA-256 скаченного архива.

Если вы ещё не сделали этого, скачайте архив с файлами Monero (но не распаковывайте его).

Замените пример имени файла скачанным архивом:

file_name=monero-gui-linux-x64-v0.16.0.0.tar.bz2

file_hash=`sha256sum $file_name | cut -c 1-64`

curl https://www.getmonero.org/downloads/hashes.txt > /tmp/reference-hashes.txt

# verify the signature (previous step is repeated here for completeness)
gpg --verify /tmp/reference-hashes.txt

# grep must print the hash (output cannot be empty)
grep $file_hash /tmp/reference-hashes.txt

Внимание!

Если выход grep будет пустым, то следует всё проверить дважды, поскольку, очевидно, что хеши не будут совпадать.

Если grep выведет имя и хеш, значит, всё в порядке!


Взаимодействие с Monero


Вы можете пользоваться Monero посредством десктоп GUI кошелька или кошелька с поддержкой командной строки (CLI) и программируемого API.

Помимо этого, узлы Monero взаимодействуют друг с другом в составе одноранговой сети.

Обзор установочной директории

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

Проект Monero отделяет логическую часть сетевых узлов от логической части кошельков. Логическая часть кошельков обеспечивается тремя независимыми пользовательскими интерфейсами: GUI, CLI и HTTP API.

# cd monero-gui-v0.16.0.0

# ---- guide to Monero GUI ----

monero-gui-wallet-guide.pdf

# ---- main executable files -----------

monerod

monero-wallet-cli
monero-wallet-gui
monero-wallet-rpc

# ---- extra executable files -----------

extra/monero-wallet-cli
extra/monero-wallet-rpc
extra/monero-blockchain-prune
extra/monero-gen-trusted-multisig
extra/monero-gen-ssl-cert
extra/monero-blockchain-export
extra/monero-blockchain-import

# ---- don't bother with these ----------

extra/monero-blockchain-stats
extra/monero-blockchain-mark-spent-outputs
extra/monero-blockchain-prune-known-spent-data
extra/monero-blockchain-usage
extra/monero-blockchain-ancestry
extra/monero-blockchain-depth

Исполняемые файлы

Исполняемый файлОписание
monerodДемон полного узла. Не требует наличия кошелька. См. раздел
Документация.
monero-wallet-guiЛогическая часть кошелька и графический пользовательский интерфейс.
Требует наличия запущенного демона monerod.
monero-wallet-cliЛогическая часть кошелька и пользовательский интерфейс с поддержкой командной строки.
Требует наличия запущенного демона monerod.
monero-wallet-rpcЛогическая часть кошелька и HTTP API (протокол JSON-RPC).
Требует наличия запущенного демона monerod.
monero-blockchain-pruneОбрезание существующего локального блокчейна. Позволяет сэкономить до 2/3 дискового пространства (по состоянию на июнь 2020 года сократить занимаемое место с 85 Гб до 28 Гб). Лучше использовать эту опцию, а не monerod --prune-blockchain, которая только логически освобождает место внутри файла, в то время как сам файл остаётся большим. При использовании monero-blockchain-prune создаётся сжатая копия файла блокчейна. См. tutorial1, tutorial2.
monero-gen-ssl-certСоздание 4096-битного приватного ключа RSA и самоподписанного сертификата TLS для использования с RPC интерфейсом monerod. См. pull request.
monero-gen-trusted-multisigСоздание multisig-кошелька.
См. главу Мультиподпись.
monero-blockchain-exportЭкспорт блокчейна в файл blockchain.raw.
monero-blockchain-importИмпорт файла blockchain.raw, в идеале — вашей собственной копии.

Унаследованные исполняемые файлы

Скорее всего, вам никогда не придётся пользоваться унаследованными инструментами.

Исполняемый файлОписание
monero-blockchain-statsВыводит статистику, такую как количество транзакции (за сутки), блоков (за сутки) и байт (за сутки) на основе вашей локальной цепочки блоков.
monero-blockchain-mark-spent-outputsПродвинутый инструмент, позволяющий избежать проблем, связанных с анонимностью, которые могут возникнуть вследствие форка Monero. Как правило, таких ситуаций не возникает.
См. соответствующий коммит и пул реквест.
monero-blockchain-prune-known-spent-dataБолее ранняя опция ограниченного обрезания, позволяющая удалять известные потраченные выходы транзакций (использовалась до реализации RCT). Сегодня рекомендуется использовать monero-blockchain-prune. Позволяет сэкономить всего около 200 Мб. См. коммит.
monero-blockchain-usageПродвинутый инструмент, позволяющий избежать проблем, связанных с анонимностью, которые могут возникнуть вследствие форка Monero.
См. соответствующий коммит и пул реквест.
monero-blockchain-ancestryПродвинутый исследовательский инструмент, позволяющий узнать исходную транзакцию, блок или блокчейн. Не используется большинством пользователей.
См. соответствующий пул реквест.
monero-blockchain-depthПродвинутый исследовательский инструмент, позволяющий узнать глубину транзакции, блока или блокчейна. Не используется большинством пользователей.
См. соответствующий коммит.

Взаимодействие

Существует всего несколько способов взаимодействия с программным обеспечением Monero. Вероятно, наиболее удивительным для новичков станет тот факт, что демон monerod принимает команды, вводимые с интерактивной клавиатуры, будучи уже запущенным.

Также следует отметить, что HTTP API разбит между monerod и monero-wallet-rpc. Чтобы пользоваться полным API, необходимо запустить и задействовать оба демона. Это соответствует разбиению логических частей кошельков и узлов, о которых говорилось выше.

Все варианты реализации кошельков зависят от запущенного демона monerod.

Исполняемый файлp2p сетьКоманды узла, вводимые посредством клавиатурыHTTP API узлаКоманды кошелька, вводимые посредством клавиатурыHTTP API кошелькаИспользование кошелька посредством GUI
monerod
monero-wallet-cli
monero-wallet-rpc
monero-wallet-gui

Директория данных

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

  • $HOME/.bitmonero/ (Linux и macOS);
  • C:\ProgramData\bitmonero\ (Windows).

Следует помнить о том, что:

  • директория данных скрыта в соответствии с правилами ОС;
  • название директории bitmonero является историческим «артефактом», существовавшим ещё до появления Monero в результате форка Bitmonero, то есть примерно 2000 лет до н. э.

Директория данных содержит:

  • lmdb/ (директорию базы данных блокчейна);
  • p2pstate.bin (сохранённые в памяти данные о найденных одноранговых узлах);
  • bitmonero.log (файл журнала).

Директория также может содержать поддиректории для отладочной (stagenet) и тестовой (testnet) сетей, отражающие одну и ту же структуру:

  • stagenet/ (директория данных отладочной сети);
  • testnet/ (директория данных тестовой сети).

monerod


Демон Monero называется monerod и поддерживает синхронизацию вашего компьютера с сетью Monero.

Эта программа загружает блокчейн через p2p сеть и подтверждает его правильность.

Программе не известны ваши приватные ключи

monerod никак не связан с вашим кошельком.

monerod не имеет доступа к вашим приватным ключам, программе не известно ничего о ваших транзакциях и вашем балансе.

Что позволяет использовать monerod как на отдельном компьютере, так и в облаке.

Фактически вы можете подсоединиться к удалённому monerod, доступ к которому будет обеспечивать полудоверенная третья сторона. У такой стороны не получится похитить ваши средства. Это очень удобно с точки зрения обучения и проведения экспериментов.

Тем не менее использование удалённого (не доверенного) узла подразумевает возможные осложнения с точки зрения приватности и надёжности. Если у вас свой бизнес, то обязательно используйте собственный полный узел.

Синтаксис

./monerod [options] [command]

Работа демона определяется опциями. Их названия соответствуют шаблону --option-name.

Команды обеспечивают доступ к определённым сервисам демона. Их названия соответствуют шаблону command_name.

Запуск

Перейдите в директорию, в которую были распакованы файлы Monero.

Для обучения и экспериментов следует использовать отладочную сеть.

./monerod --stagenet --detach                # run as a daemon in background
tail -f ~/.bitmonero/stagenet/bitmonero.log  # watch the logs
./monerod --stagenet exit                    # ask daemon to exit gracefully

Основная сеть используется для реальных XMR.

./monerod --detach                           # run as a daemon in background
tail -f ~/.bitmonero/bitmonero.log           # watch the logs
./monerod exit                               # ask daemon to exit gracefully

Опции​

Опции определяют работу демона. Их названия соответствуют шаблону --option-name.

Опции сгруппированы для простоты понимания. Сам демон не группирует опции каким бы то ни было образом.

Помощь и версия:

ОпцияОписание
--helpВыводит список доступных опций.
--versionПоказывает версию monerod в stdout. Пример:
OS: Linux #1 SMP PREEMPT Wed, 27 May 2020 23:42:26 +0000 5.6.15-arch1-1.
--check-updatesОдин из вариантов: отключить обновления disabled | уведомлять об обновлениях notify | скачивать обновление download (по умолчанию кошелёк находится в режиме уведомления об обновлениях). Проверяет на наличие новых версий Monero и загружает их при необходимости. Возможно, лучше будет настроить менеджер пакетов ОС, чтобы он производил обновление, если это, конечно, возможно. Также существует опция нереализованных обновлений, которая отображается в меню помощи системы.

Выбор сети:

ОпцияОписание
(missing)По умолчанию monerod выбирает основную сеть.
--stagenetЗапускает monerod в отладочной сети. Следует помнить, что кошелёк также следует запускаеть при помощи флага --stagenet.
--testnetЗапускает monerod в тестовой сети. Следует помнить, что кошелёк также следует запускаеть при помощи флага --testnet.

Журнал регистрации:

ОпцияОписание
--log-fileПолный путь к регистрационному файлу журнала. Пример (следует помнить о разрешениях для файла):
./monerod --log-file=/var/log/monero/mainnet/monerod.log
--log-levelОт 0 до 4, где 0 обозначает минимальную регистрацию данных в журнале, а 4 запись всех регистрационных данных. По умолчанию имеет значение 0. Это общие предварительные настройки, которые не связаны напрямую с уровнями сложности. Например, при минимальном значении 0, можно увидеть только некоторые важные данные INFO. Временное изменение значения на 1 позволяет лучше понять, как работает полный узел. Пример:
./monerod --log-level=1
--max-log-file-sizeЗапрограммированный и выраженный в байтах размер для регистрационного файла (по умолчанию равен 104850000, что составляет менее 100 Мб). Как только размер регистрационного файла вырастет сверх этого предела, monerod создаст следующий регистрационный файл с постфиксной временной меткой в формате UTC -YYYY-MM-DD-HH-MM-SS.

В реальных условиях, вы скорее всего предпочтёте использовать проверенные решения, такие как logrotate. В этом случае вам следует установить флаг --max-log-file-size 0, чтобы запретить возможность управлять файлами журнала.
--max-log-filesПредельное количество регистрационных файлов (50 по умолчанию). Старые файлы журнала удаляются автоматически. Вероятно, что вместо этого параметра вы предпочтёте использовать проверенные решения, такие как logrotate.

Серверная часть:

Настройки, используемые monerod по умолчанию, можно корректировать, чтобы периодически запускать программу на том же компьютере, на котором установлен кошелёк Monero.

Следующие опции помогут, если вы хотите, чтобы у вас был постоянно работающий узел (наиболее вероятно, на удалённом сервере или на вашем отдельном ПК).

ОпцияОписание
--config-fileПолный путь к файлу конфигурации. По умолчанию monerod ищет bitmonero.conf в директории данных Monero.
--data-dirПолный путь к директории данных. Это место, где хранится копия блокчейна, регистрационные файлы журнала и находится известные p2p сети. Информацию по настройкам, используемым по умолчанию, и другую соответствующую информацию можно найти в разделе директория данных.
--pidfileПолный путь к PID файлу. Работает только с --detach. Пример:
./monerod --detach --pidfile=/run/monero/monerod.pid
--detachПереход к работе в фоновом режиме (отсоединение от оконечного устройства). Эта опция полезна с точки зрения долгосрочных сценариев и сценариев с использованием сервера. Возможно, что вам хочется управлять демоном monerod, используя systemd или подобный инструмент. По умолчанию monerod работает в интерактивном режиме.
--non-interactiveНе требует tty в интерактивном режиме. Полезная опция при работе в составе контейнера. По умолчанию monerod работает в интерактивном режиме и открывает stdin для чтения, который нарушает контейнеризацию, поскольку не происходит назначения tty, и процесс monerod завершается с ошибкой. monerod можно запустить в фоновом режиме, используя --detach, но это неудобно при работе в контейнере, так как каноническое использование подразумевает, что контейнер ждёт ответ от основного процесса (а разветвление всё усложняет).
--no-zmqОтключение ZMQ RPC сервера. Эту опцию следует использовать, чтобы ограничить возможность атаки и количество без надобности открытых портов (работа над ZMQ сервером продолжается, и вряд ли вы когда-либо будете использовать его).
--no-igdОтключение распределения UPnP порта маршрутизатора (протокол Internet Gateway Device). Эта опция добавляется для повышения уровня безопасности, если вы не пользуетесь NAT (вы можете привязаться напрямую к публичному IP или использовать Tor).
--max-txpool-weightЗадаёт максимальный размер пула транзакций (в байтах). По умолчанию этот размер составляет 648000000 (~618 Мб). Это транзакции, ожидающие подтверждения (ещё не включённые в какой-либо блок).
--enforce-dns-checkpointingАктивирует экстренные контрольные точки, устанавливаемые операторами MoneroPulse. Такую опцию стоит применять к не сопровождаемым (автоматическим) узлам.

Если встречается хеш блока, не соответствующий определённой контрольной точке, произойдёт «откат» локального блокчейна на несколько блоков, в результате чего, текущее направление будет заблокировано операторами MoneroPulse и они сочтут его недействительным форком. В журнале появится запись: ERROR Local blockchain failed to pass a checkpoint, rolling back! (ОШИБКА Локальный блокчейн не прошёл контрольную точку, откат!). В конечном счёте альтернативный («исправленный») форк станет актуальным направлением, и узел переключится на него, переключившись с «недействительного» форка.

По умолчанию при такой расстановке контрольных точек в журнале только появляется следующее уведомление о расхождении: ERROR WARNING: local blockchain failed to pass a MoneroPulse checkpoint, and you could be on a fork. You should either sync up from scratch, OR download a fresh blockchain bootstrap, OR enable checkpoint enforcing with the --enforce-dns-checkpointing command-line option (ПРЕДУПРЕЖДЕНИЕ ОБ ОШИБКЕ: локальный блокчейн не прошёл контрольную точку MoneroPulse, и вы можете находиться в форке. Вам необходимо либо синхронизироваться с самого начала, ЛИБО активировать контрольную точку, используя опцию командной строки --enforce-dns-checkpointing).

Ссылка: исходный код.
--disable-dns-checkpointsКонтрольные точки MoneroPulse, заданные разработчиками, будут сброшены. Тем не менее, очевидно, что контрольные точки будут по-прежнему активны.

P2P cеть:

TСледующие опции определяют участие вашего узла в одноранговой сети Monero. Данные опции отвечают за связь между узлами и не влияют на интерфейс между кошельком и узлом.

Слово «узел» (node) и словосочетание «одноранговый узел» (peer) в данном контексте равнозначны и взаимозаменяемы.

ОпцияОписание
--p2p-bind-ipIPv4 сетевой интерфейс p2p сети. Значение 0.0.0.0, используемое по умолчанию, позволяет связаться со всеми сетевыми интерфейсами.

Если же вам необходимо ограничить какую-то сеть, например, чтобы сконфигурировать соединение Tor посредством torsocks, то необходимо изменить это значение:
DNS_PUBLIC=tcp://1.1.1.1 TORSOCKS_ALLOW_INBOUND=1 torsocks ./monerod --p2p-bind-ip 127.0.0.1 --no-igd --hide-my-port
--p2p-bind-portTCP порт «отслеживает» соединения p2p сети. По умолчанию используются следующие значения: 18080 для основной сети (mainnet), 28080 для тестовой сети (testnet) и 38080 для отладочной сети (stagenet). Как правило, эти значения не изменяются. Это позволяет запустить на вашей машине несколько узлов, моделируя приватную p2p сеть Monero (что подобно использованию тестовой сети). Пример:
./monerod --p2p-bind-port=48080
--p2p-external-portTCP порт «отслеживает» соединения p2p сети через ваш маршрутизатор. Опция актуальна, если вы используете NAT, но вам требуется отслеживать входящие соединения. Для этого необходимо установить соответствующий порт на вашем маршрутизаторе. Это делается для того, чтобы monerod знал, что необходимо слушать из вашей сети. Значение, используемое по умолчанию, — 0
--p2p-use-ipv6Включение IPv6 для p2p (по умолчанию отключено)
--p2p-bind-ipv6-addressПривязка сетевого интерфейса IPv6 к сетевому протоколу p2p. Значение, используемое по умолчанию :: привязывает его ко всем сетевым интерфейсам
--p2p-ignore-ipv4Игнорировать неудачную привязку IPv4 к p2p. Эта опция пригодится только в том случае, если вы захотите использовать IPv6.
--igdНастройка распределения портов UPnP на маршрутизаторе («Шлюз интернет-устройства»). Один из вариантов: отключён disabled | подключён enabled | с задержкой delayed (по умолчанию установлен режим задержки). Используется, если вы работаете за NAT и хотите принимать входящие P2P соединения. Задержка означает, что подключение входящих соединений будет ожидаться в надежде, что UPnP не понадобится. Через некоторое время, если входящие соединения обнаружены не будут, будет осуществлена попытка распределить порты посредством UPnP. Если вы уверены в том, что вам необходим UPnP, подключите его, чтобы ускорить процесс.
--hide-my-portmonerod по-прежнему будет открыт и будет отслеживать p2p порт. Тем не менее он не будет заявлять о себе как о кандидате для попадания в список одноранговых узлов. Технически он вернёт порту нулевое значение в ответ на попытку сопряжения (node_data.my_port = 0 в функции get_local_node_data). В сущности, узлы, к которым вы подключаетесь, не будут сообщать ваш IP-адрес другим одноранговым узлам (это не совсем «сокрытие», скорее, это «неразглашение»).
--seed-nodeСоединение с узлом с целью получения адресов других узлов и последующее разъединение. При отсутствии заданных узлов monerod в первую очередь будет использовать предварительно закодированные начальные узлы, а также одноранговые узлы, сохраненные на диске.
--add-peerРучное добавление узла в список одноранговых.
--add-priority-nodeУказывает список узлов, к которым следует подключатся, и затем попытаться держать соединения открытым.

Чтобы добавить несколько узлов, следует использовать опцию несколько раз. Пример:
./monerod --add-priority-node=178.128.192.138:18081 --add-priority-node=144.76.202.167:18081
--add-exclusive-nodeУказывает список только тех узлов, к которым следует подключатся. Если задана эта опция, опции --add-priority-node и --seed-node игнорируются.

Чтобы добавить несколько узлов, следует использовать опцию несколько раз. Пример:
./monerod --add-exclusive-node=178.128.192.138:18081 --add-exclusive-node=144.76.202.167:18081
--out-peersЗадаёт максимальное количество исходящих соединений с другими узлами. Значение, используемое по умолчанию, — 8. Значение -1 указывает на ошибку в коде.
--in-peersЗадаёт максимальное количество входящих соединений с другими узлами. По умолчанию значение не ограничено. Значение -1 указывает на ошибку в коде.
--limit-rate-upЗадаёт лимит скорости передачи исходящих данных [Кбайт/с]. По умолчанию значение составляет 2048 Кбайт/с. Значение -1 указывает на ошибку в коде.
--limit-rate-downЗадаёт лимит скорости передачи входящих данных [Кбайт/с]. По умолчанию значение составляет 8192 Кбайт/с. Значение -1 указывает на ошибку в коде.
--limit-rateЗадаёт одно и то же предельное значение для передачи входящих и исходящих данных. Во избежание путаницы лучше использовать --limit-rate-up и --limit-rate-down.
--offlineНе принимать данные от одноранговых узлов и запретить исходящие подключения. Полезная опция для работы с локальной копией блокчейна.
--allow-local-ipПозволяет добавить локальный IP в список одноранговых узлов. Полезная опция с точки зрения отладки, если вам захочется запустить множество узлов на одном компьютере.

Tor/I2P

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

ОпцияОписание
--tx-proxyОтправляет ваши локальные транзакции через прокси-сервер SOCKS5 (Tor или I2P). Формат:
<network-type>,<socks-ip:port>[,max_connections][,disable_noise]

Example:
./monerod --tx-proxy "tor,127.0.0.1:9050,10,disable_noise"

Эта опция была введена, чтобы упростить публикацию транзакций через Tor (отсутствие необходимости в torsocks), и в то же время обеспечить возможность одновременной передачи блоков (несмотря на то, что torsocks повлияли на всё).

Следует отметить, что ретранслируемые транзакции (не те, что были отправлены подключённым кошельком) будут по-прежнему передаваться через клирнет.

Требуется несколько --add-peer. См. коммит и руководство.
--anonymous-inboundОбеспечивает возможность подключения анонимных входящих соединений к вашему луковому P2P интерфейсу. Формат:
<hidden-service-address>,<[bind-ip:]port>[,max_connections]

Example:
./monerod --anonymous-inbound "rveahdfho7wo4b2m.onion:18083,127.0.0.1:18083,100".

Очевидно, что сначала нужно настроить сервис в вашей конфигурации Tor. См. руководство.
--pad-transactionsЗаполняет ретранслируемые транзакции до следующих 1024 байт с целью защиты от анализа объёма трафика. Использовать эту опцию имеет смысл только в том случае, если вы используете Tor или I2P. См. коммит.

RPC API узла

Узел monerod имеет вариативный API, который служит 3 целям:

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

Этот API обычно называют RPC, поскольку он основан на стандарте JSON/RPC.

Поведение API определяется следующими опциями:

ОпцияОписание
--public-nodeСообщает другим пользователям, что они могут использовать этот узел как удалённый для подключения своих кошельков. Требует использования --restricted-rpc, --rpc-bind-ip и --confirm-external-bind. Без --public-node узел всё ещё может оставаться публичным (при условии, что установлены другие соответствующие опции), но он не будет виден другим как таковой в P2P сети. Эта опция позволяет кошелькам автоматически обнаруживать публичные узлы (то есть, пользователю не приходится искать их «вручную»).
--rpc-bind-ipIP, от которого следует принимать данные. По умолчанию используется 127.0.0.1, поскольку API даёт все административные возможности в отношении узла. Можно установить 0.0.0.0, чтобы получать информацию по всем интерфейсам, но только в сочетании с опциями *-restricted-* и --confirm-external-bind.
--rpc-bind-portTCP порт, от которого следует принимать данные. По умолчанию 18081 основная сеть (mainnet), 28081 тестовая сеть (testnet) и 38081 отладочная сеть (stagenet).
--rpc-bind-ipv6-addressУказывает IPv6, который нужно отслеживать. По умолчанию ::1 (localhost). В данном случае применимы все те же примечания, что и к `--rpc-bind-ip.
--rpc-use-ipv6Включает IPv6 для RPC сервера (по умолчанию отключено).
--rpc-ignore-ipv4Игнорирует неудачную попытку привязки IPv4 к RPC. Эта опция пригодится только в том случае, если вы захотите использовать IPv6.
--rpc-restricted-bind-portTCP порт, от которого следует принимать данные ограниченной версией API. Ограниченную версию API можно использовать для создания общедоступного узла. Как вариант, можно ограничить доступ к полному API, используя брандмауэр, и по-прежнему использовать локальные запросы или заниматься локальным администрированием.
--confirm-external-bindПодтверждает, что вы сознательно установили --rpc-bind-ip как IP не локального хоста и вы понимаете возможные последствия.
--restricted-rpcОграничивает API таким образом, что он слушает только команды и не выдаёт чувствительной или конфиденциальной информации. Следует отметить, что это не имеет работает вместе с опцией --rpc-restricted-bind-port, поскольку в конечном счёте у вас будет два ограниченных API.
--rpc-sslВключает протокол TLS для RPC соединений. Один из вариантов: включён enabled | отключён disabled | автоматическое обнаружение autodetect (по умолчанию установлен режим автоматического обнаружения). Эту опцию следует включать, если вы подключаете удалённый кошелёк.
--rpc-ssl-private-keyУказывает путь к приватному ключу сервера в формате PEM. Генерируется при помощи инструмента monero-gen-ssl-cert. Это облегчает аутентификацию на сервере клиентом.
--rpc-ssl-certificateУказывает путь к сертификату сервера в формате PEM. Генерируется при помощи инструмента monero-gen-ssl-cert. Это облегчает аутентификацию на сервере клиентом.
--rpc-ssl-allowed-fingerprintsПоказывает идентификационные метки сертификатов, которые нужно принять. Это способ аутентификации клиентов.
--rpc-ssl-allow-any-certРазрешает использовать любой сертификат для подключающегося клиента.
--rpc-ssl-ca-certificatesУказывает путь к файлу, содержащему объединённые сертификаты формата PEM для замены системных CA.
--rpc-ssl-allow-chainedПозволяет использовать пользовательские объединённые сертификаты. Опция применима только в том случае, если у пользователя есть «настоящий» сертификат CA.
--rpc-loginУказывает username[:password] required to connect to API.
--rpc-access-control-originsЗадаёт список источников (разделённых запятыми), которым разрешено совместное использование ресурсов. Эта опция будет полезна, если вы захотите использовать monerod напрямую в браузере, посредством JavaScript (скажем так, используя сценарий чистого сетевого приложения). Эта опция позволяет monerod создавать надлежащие заголовки ответов HTTP CORS. При использовании этой опции также будет необходимо установить rpc-login. Тем не менее обычно API используется конечным приложением напрямую, поэтому необходимость в этой опции отсутствует.

Получение Monero

Это сетевые уведомления, которые выводит monerod. Существуют также уведомления кошелька, такие как --tx-notify, которые выводит monero-wallet-rpc, как описано здесь.

ОпцияОписание
--block-notify <arg>Запуск информации для каждого нового блока. <arg> должен содержать полный путь. Если <arg> содержит %s, он будет заменён хешем блока. Пример:
./monerod --block-notify="/usr/bin/echo %s"

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

Также следует помнить о реорганизации блокчейна. Уведомления блоков могут относиться к одной и той же высоте. Небольшая реорганизация является естественным процессом и происходит ежедневно.
--block-rate-notify <arg>Запуск программы в том случае, если количество полученных блоков за последнее время будет сильно отличаться от ожидаемого. <arg> должен содержать полный путь. <arg> может содержать любой из символов %t, %b, %e, где:

%t будет означать количество минут в текущем окне;

%b будет означать количество блоков в текущем окне;

%e будет идеальным количеством блоков, ожидаемым в текущем окне.

Данная опция позволяет узнать о серьёзном падении хешрейта сети. Например, это может свидетельствовать о том, что значительная часть майнеров, присутствовавших в сети, перешла в тестовую сеть. Следует отметить, что такое событие не будет неопровержимым доказательством того, что это происходит на самом деле. Это может быть случайностью. Чем шире окно (параметр %t) и чем больше разница между фактическим и ожидаемым количеством блоков, тем вероятнее, что это будет свидетельствовать о возможной подготовке к реорганизации блокчейна посредством атаки двойной траты.

Рекомендация: если вы не управляете экономически важной биржей Monero или являетесь оператором, не руководствуйтесь этими данными. Их трудно проверить и легко неверно истолковать. В случае реальной атаки её целью будут высоколиквидные предприятия, а не малый бизнес.
--reorg-notify <arg>Запуск программы в случае реорганизации сети (то есть, если по крайней мере один блок будет убран из цепочки блокчейна). <arg> должен содержать полный путь. <arg> может содержать любой из символов %t, %b, %e, где:

%s означает высоту, на которой происходит разветвление;

%h означает высоту нового блокчейна;

%d указывает количество блоков, которое будет выброшено из старого блокчейна;

%nуказывает количество блоков, которое будет добавлено.

Эта опция позволяет узнать, когда из блокчейна убирается один блок и заменяется другими. Это происходит при проведении атаки 51%, но небольшая реорганизация может произойти и при обычных обстоятельствах. Параметр %d устанавливается в значение количества блоков, которое удаляется из старого блокчейна (таким образом, если это количество будет больше, чем количество ожидаемых подтверждений по входящим платежам, то платёж может быть отменён). Параметр %n устанавливается в значение количества блоков в новом блокчейне (таким образом, если это количество будет больше, чем количество ожидаемых подтверждений по входящим платежам, то любой входящий платёж в первом блоке будет автоматически исполнен на вашей платформе).

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

Рабочие параметры (опции)

Эти продвинутые опции позволяют оптимизировать работу узла monerod (зачастую за счёт надёжности).

ОпцияОписание
--prune-blockchainОбрезание позволяет сэкономить до 2/3 дискового пространства без какого-либо ущерба для функциональности. Для максимальной эффективности опцию следует использовать уже при первой синхронизации. Если добавить эту опцию позже, прошлые данные будут обрезаны только логически, но размер файла не уменьшится, и улучшения не произойдёт.

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

Недостаток этой опции заключается в том, что вы будете вносить меньший вклад в поддержку P2P сети Monero с точки зрения помощи в синхронизации новых узлов (до 1/8 от обычного вашего обычного вклада). Тем не менее, вы всё ещё будете приносить пользу в отношении ретрансляции новых транзакций и блоков.
--sync-pruned-blocksДелает возможной синхронизацию с узлами, поддерживающими только обрезанные блоки.
--db-sync-modeУказывает опции синхронизации, используя формат:
`[safe
--max-concurrencyМаксимальное количество используемых при работе потоков. При нулевом значении (0), заданным по умолчанию, используется общее количество потоков CPU.
--prep-blocks-threadsМаксимальное количество потоков, используемое при вычислении хешей блоков (PoW) в группах. По умолчанию значение составляет 4. Задайте меньшее значение, если не хотите, чтобы monerod излишне перегрузил ваш компьютер при синхронизации.
--fast-block-syncСинхронизация большую часть времени происходит при помощи «известных» хешей блоков. Значение 1 передаётся для включения, значение 0 для выключения. По умолчанию установлено в 1. Обычно для каждого блока узел должен вычислить соответствующий хеш, чтобы проверить доказательство работы майнера. Поскольку алгоритм доказательства работы протокола CryptoNight, используемый Monero, довольно затратен (даже с точки зрения верификации), monerod предлагает пропустить эти вычисления для старых блоков. Другими словами, это механизм доверия двоичному файлу monerod в отношении действительности PoW старых блоков, повышающий скорость синхронизации.
--block-sync-sizeУказывает, сколько блоков обрабатывается в одной группе во время синхронизации блокчейна. По умолчанию это количество составляет 20 блоков (сейчас) и составляло 100 блоков (ранее, то есть до версии v4). Значение, используемое по умолчанию, — 0. Интуитивно чем больше блоков имеется, тем больший размер группы вы будете использовать. Пример:
./monerod --block-sync-size=500
--bootstrap-daemon-addresshost:port «начального узла загрузки», который подсоединённые к нему кошельки могут использовать, даже пока этот узел ещё не до конца синхронизирован. Пример:
./monerod --bootstrap-daemon-address=opennode.xmr-tw.org:18089. Узел будет перенаправлять запросы на RPC загрузочного узла и кошелёк будет обрабатывать их автоматически. Очевидно, такая фаза загрузки влияет на анонимность, как и в случае, когда удалённый узел используется напрямую.
--bootstrap-daemon-loginУказывает username:password учётной записи демона начальной загрузки (если это требуется). Обычно открытые узлы не требуют какой-либо регистрации.
--no-syncОстанавливает синхронизацию. Вместо этого продолжает использовать демон начальной загрузки (если таковой установлен). См. коммит.

Майнинг

Следующие опции используются для конфигурирования соло-майнинга посредством CPU со стандартным программным стеком monerod. Эти опции будут по большей части полезны в следующих случаях:

  • для получения монет в отладочной сети или тестовой сети;
  • для проведения экспериментов и обучения;
  • если у вас есть дешёвый доступ к ресурсам CPU.

Тем не менее помните о том, что реальный майнинг происходит в пулах и при помощи высокопроизводительных GPU и CPU.

ОпцияОписание
--start-miningУказывает адрес кошелька, для которого будет происходить майнинг. Этот адрес должен быть стандартным! Ни подадрес, ни интегрированный адрес использоваться не могут.
--mining-threadsУказывает количество потоков CPU для майнинга. По умолчанию используется только один поток CPU. Для получения наилучших результатов следует указывать количество потоков, равное количеству физических ядер вашего CPU.
--extra-messages-fileУказывает файл для включения дополнительных сообщений в coinbase-транзакцию.
--bg-mining-enableОбеспечивает возможность «скромного» майнинга. В этом режиме для майнинга будет использоваться небольшой процент ваших системных ресурсов, и работа вашего компьютера не будет замедляться. Эта опция должна мотивировать людей к майнингу и как следствие, повысить уровень децентрализации. К слову, шансы найти блок при соло-майнинге посредством CPU довольно низки, но выше, чем при использовании этой «скромной» версии. Вы можете улучшить компромисс между «скромным» майнингом и мощностью, используя опцию --bg-*, описание которой приводятся ниже.
--bg-mining-ignore-batteryВ значении true предполагает работу при отсутствии информации о питании системы.
--bg-mining-min-idle-intervalУказывает интервал опроса в секундах для определения состояния системных ресурсов.
--bg-mining-idle-thresholdУказывает минимальный средний процент состояния системных ресурсов за интервал обратного опроса.
--bg-mining-miner-targetУказывает максимальный процент использования CPU майнером (майнерами).

Тестирование

Эти опции предназначены для разработчиков и тестировщиков проекта Monero. Обычным пользователям эти опции не нужны.

ОпцияОписание
--keep-alt-blocksСохраняет альтернативные блоки при перезагрузке. Может помочь при рассмотрении возможности реорганизации и т. д. Коммит. Исследовательский проект www.noncesense.org.
--test-drop-downloadОпция предназначена для тестирования сети: загрузки, быстрого сброса ВСЕХ блоков вместо их проверки/сохранения.
--test-drop-download-heightРаботает так же, как --test-drop-download, но после достижения определённой высоты блока. Значение, используемое по умолчанию, — 0.
--regtestЗапуск в режиме регрессивного тестирования.
--keep-fakechainНе даёт удалить существующую базу данных в режиме fakechain.
--fixed-difficultyЗадаёт фиксированную сложность тестирования. Значение, используемое по умолчанию, — 0.
--test-dbg-lock-sleepВремя до ухода в «спящий» режим. Значение, используемое по умолчанию, — 0. Используется для отладки до/после блокировки компьютера. Для тестирования хорошо подходят значения от 100 до 1000.
--save-graphСохранение всех данных в директорию Monero.

Унаследованные опции

Необходимость в этих опциях уже отсутствует. Они сохраняются в monerod исключительно в целях обратной совместимости.

ОпцияОписание
--fluffy-blocksРетранслирует «пушистые» блоки. Используется по умолчанию. Пушистый блок включает в себя только заголовок и список идентификаторов (ID) транзакций.
--no-fluffy-blocksРетранслирует классические полные блоки. Классический блок включает в себя все транзакции.
--show-time-statsВ официальной документации написано: «Показывает временную статистику при обработке блоков/транзакций и синхронизации диска», но не даёт никакого результата при обычной синхронизации блокчейна.
--zmq-rpc-bind-ipIP-адрес, который будет отслеживать ZMQ RPC сервером. По умолчанию устанавливается как 127.0.0.1. Пока эта опция не получила широкого распространения, так как интерфейс ZMQ не обеспечивает значимого преимущества в сравнении с классическим интерфейсом JSON-RPC.
--zmq-rpc-bind-portПорт, который будет отслеживать ZMQ RPC сервер. По умолчанию устанавливается как 18082 для основной сети (mainnet), 38082 для отладочной сети (stagenet) и 28082 для тестовой сети (testnet).
--db-typeУказывает тип базы данных. По умолчанию используется lmdb (он же и является единственном доступным типом базы данных).

Команды​

Команды обеспечивают доступ к определённым сервисам демона. Команды выполняются при работающей программе. Их названия соответствуют шаблону command_name.

Команды сгруппированы для простоты понимания. Сам демон не группирует команды каким бы то ни было образом.

Пример использования приводится в разделе, посвящённом первому запуску Monero. Команды также можно вводить посредством командной строки работающего monerod (если программа будет доступна).

Помощь, версионирование, состояние:

ОпцияОписание
help [<command>]Помощь по .
versionИнформация о версии ПО. Пример:
Monero 'Boron Butterfly' (v0.14.0.0-release)
statusИнформация о текущем состояния. Пример:
Height: 186754/186754 (100.0%) on stagenet, not mining, net hash 317 H/s, v9, up to date, 8(out)+0(in) connections, uptime 0d 3h 48m 47s

P2P сеть:

ОпцияОписание
print_plВыводит полный список одноранговых узлов.
print_pl_statsОтображает статистику по полному списку одноранговых узлов (отношение белых и серых узлов). Белые узлы находятся онлайн и доступны. Серые узлы находятся оффлайн, но monerod запоминает их для организации последующих сессий.
print_cnПоказывает подключенные узлы и состояние соединения (входящее/исходящее), а также другую статистику.
ban <IP> [<seconds>]Блокирует определённый <IP> (IP-адрес) на заданное количество <seconds> (секунд). По умолчанию время блокировки составляет 24 часа. Пример:
./monerod ban 187.63.135.161.
unban <IP>Снятие блокировки с заданного <IP> (IP-адреса).
bansПоказывает заблокированные на данный момент <IP> (IP-адреса). Пример:
187.63.135.161 banned for 86397 seconds.
in_peers <max_number>Устанавливает <max_number> (максимальное количество) входящие соединения от других одноранговых узлов.
out_peers <max_number>Устанавливает <max_number> (максимальное количество) исходящих соединений к другим одноранговым узлам.
limit [<kB/s>]Устанавливает общий лимит скорости загрузки / передачи данных.
limit_down [<kB/s>]Устанавливает лимит скорости передачи данных.
limit_up [<kB/s>]Устанавливает лимит скорости на передачу данных.

Пул транзакций

ОпцияОписание
flush_txpool [<txid>]Исключает указанную транзакцию из пула транзакций или очищает весь пул транзакций, если отдельная транзакция не была указана.
print_poolОтображает информацию о пуле транзакций в полном формате.
print_pool_shОтображает информацию о пуле транзакций в кратком формате.
print_pool_statsОтображает статистические данные пула транзакций (количество транзакций, объём памяти, комиссии, попытки двойной траты и так далее).

Транзакции

ОпцияОписание
print_coinbase_tx_sum <start_height> [<block_count>]Показывает сумму всех выпущенных монет и уплаченных комиссии в заданном диапазоне. Пример:
./monerod print_coinbase_tx_sum 0 1000000000000
print_tx <transaction_hash> [+hex] [+json]Показывает указанную транзакцию в формате JSON и/или HEX.
relay_tx <txid>Запускает ретрансляцию транзакции. Полезная опция, если вы по какой-то причине пожелаете ретранслировать транзакцию или же, если транзакция была ранее создана с параметром do_not_relay:true.

Блокчейн

ОпцияОписание
print_heightПоказывает высоту локального блокчейна.
sync_infoПоказывает прогресс синхронизации блокчейна и подсоединённые одноранговые узлы вместе со статистикой скачивания/загрузки.
print_bc <begin_height> [<end_height>]Показывает блоки в диапазоне от <begin_height> до <end_height>. Отображаемая информация включает в себя идентификатор блока, высоту, временную метку, версию, размер, вес, количество транзакций, не являющихся coinbase-транзакциями, сложность, нонс и вознаграждение.
print_block <block_hash> / <block_height>Показывает информацию в ключе указанного блока.
hard_fork_infoПоказывает текущую версию алгоритма консенсуса и высоту блока, на котором произойдёт следующий хардфорк, если таковой планируется.
is_key_image_spent <key_image>Проверяет, был ли потрачен указанный образ ключа. Образ ключа является хешем.

Управление демоном

ОпцияОписание
exit, stop_daemonЗапрос надлежащего отключения демона. Опции exit и stop_daemon идентичны (одна является альтернативой для другой).
set_log <level>/<{+,-,}categories>Устанавливает уровень детализации журнала собрытий/категорий, где <level> число от 0 до 4.
print_statusПоказывает, запущен ли демон.
update (check/download)Показывает, доступно ли обновление, и при необходимости позволяет загрузите его (hash обозначает SHA-256). В операционых системах по типу Linux для верификации воспользуйтесь командной sha256sum. Пример:
Update available: v0.13.0.4: https://downloads.getmonero.org/cli/monero-linux-x64-v0.13.0.4.tar.bz2, hash 693e1a0210201f65138ace679d1ab1928aca06bb6e679c20d8b4d2d8717e50d6
Update downloaded to: /opt/monero-v0.13.0.2/monero-linux-x64-v0.13.0.4.tar.bz2

Майнинг

ОпцияОписание
show_hrЗапрос демона monerod об остановке отображения текущего хешрейта. Используется только в том случае, если monerod находится в режиме майнинга.
hide_hrЗапрос демона monerod об отображении текущего хешрейта. Используется только в том случае, если monerod находится в режиме майнинга.
start_mining <addr> [<threads>] [do_background_mining] [ignore_battery]Запрос демона monerod о запуске майнинга. Вознаграждение за вычисление блока будет направлено на <addr>.
stop_miningЗапрос демона monerod об остановке майнинга.

Тестирование Monero

ОпцияОписание
start_save_graphЗапуск сохранения данных в директорию Monero.
stop_save_graphОстановка сохранения данных в директорию Monero.

Унаследованные опции

ОпцияОписание
saveСброс данных блокчейна на диск. Как правило, этого не требуется, поскольку monerod сохраняет блокчейн автоматически при выходе.
output_histogram [@<amount>] <min_count> [<max_count>]Показывает количество выходов для каждой суммы. Опция использовалась только до реализации RingCT. Старый кошелёк использовал эту опцию, чтобы определить, какие выходы можно использовать для смешивания. После введения RingCT размер сумм стал не важен, поскольку сами суммы теперь скрывались. Больше информации можно найти здесь в разделе ответов на monero.stackexchange.com.

Кошелёк Monero CLI


Обзор

Кошелёк с поддержкой командной строки

«Официальный» кошелёк Monero с поддержкой командной строки. Доступны версии для Linux, MacOS и Windows.

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

Тем не менее кошелёк не хранит копию блокчейна и не участвует напрямую в p2p сети.

CLI-кошелёк является самым надёжным и полным с точки зрения имеющихся функций кошельком Monero.

Зависимость от полного узла

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

Полный узел может быть как локальным (тот же компьютер), так и удалённым.

Как правило, полный узел запускается на том же компьютере, на который установлен кошелёк (или в пределах вашей домашней сети).

Соединение происходит через HTTP и использует этот API.

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

Тем не менее подсоединение к удалённому узлу связано с другими нюансами и компромиссами, которые являются темой отдельной статьи.

Синтаксис

./monero-wallet-cli [options] [command]

Пример:

./monero-wallet-cli --stagenet

Запуск

Перейдите в директорию, в которую были распакованы файлы Monero.

Запустите полный узел и подождите, пока он не синхронизируется с сетью (это может занять до нескольких дней):

./monerod --stagenet

Запустите кошелёк в отдельном окне:

./monero-wallet-cli --stagenet --generate-new-wallet MoneroExampleStagenetWallet

Опции

Помощь и версия

ОпцияОписание
--helpВыводит список доступных опций.
--versionПоказывает версию monero-wallet-cli в stdout. Пример:
Monero 'Boron Butterfly' (v0.14.0.0-release)

Выбор сети

ОпцияОписание
(отсутствует)По умолчанию кошелёк выбирает основную сеть.
--stagenetЗапускает кошелёк в отладочной сети. Следует помнить, что демон также запускается в --stagenet.
--testnetЗапускает кошелёк в тестовой сети. Следует помнить, что демон также запускается в --testnet.

Журнал регистрации

ОпцияОписание
--log-file <arg>Полный путь к файлу журнала.
--log-level <arg>От 0 до 4, где 0 обозначает минимальную регистрацию данных в журнале, а 4 запись всех регистрационных данных. По умолчанию имеет значение 0. Это общие предварительные настройки, которые не связаны напрямую с уровнями сложности. Например, при минимальном значении 0, можно увидеть только некоторые важные данные INFO.
--max-log-file-size <arg>Запрограммированный и выраженный в байтах размер для регистрационного файла (по умолчанию равен 104850000, что составляет менее 100 Мб). Как только размер регистрационного файла вырастет сверх этого размера, Monero создаст следующий регистрационный файл с постфиксной временной меткой в формате -YYYY-MM-DD-HH-MM-SS.

В реальных условиях, вы скорее всего предпочтёте использовать проверенные решения, такие как logrotate. В этом случае вам следует установить флаг --max-log-file-size 0, чтобы запретить возможность управлять файлами журнала.
--max-log-files <arg>Предельное количество регистрационных файлов (50 по умолчанию). Старые файлы журнала удаляются автоматически. Вероятно, что вместо этого параметра вы предпочтёте использовать проверенные решения, такие как logrotate.

Соединение с полным узлом

При совершении всех нелокальных операций кошелёк зависит от полного узла. Следующие опции определяют, как подсоединиться к monerod:

ОпцияОписание
--daemon-address <arg>Использовать monerod на адресе <host>:<port>. Пример:
./monero-wallet-cli --daemon-address monero-stagenet.exan.tech:38081 --stagenet
--daemon-host <arg>Использовать monerod на хосте <arg>, а не на локальном хосте (localhost).
--daemon-port <arg>Использовать monerod на порте <arg>, вместо 18081.
--daemon-login <arg>Указать username[:password] для monerod RPC API. Опция основана на схеме базовой аутентификации HTTP. Следует помнить о том, что соединения являются незашифрованными по умолчанию. Аутентификация имеет смысл только в том случае, если вы создаёте безопасное соединение (возможно, посредством Tor, SSH туннеля или обратного прокси-сервера с TLS).
--trusted-daemonПозволяет использовать команды и типы поведения, рассчитанные на доверенный monerod. Используется по умолчанию для соединения localhost. Доверие в этом контексте является вопросом вашей анонимности. Этот флаг можно использовать только в том случае, если вы контролируете monerod. Доверенный демон позволяет использовать такие команды, как rescan_spent, start_mining, import_key_images, и типы поведения не такие, как предупреждение о возможной атаке по средствам отправки транзакций.
--untrusted-daemonОтключает команды и типы поведения, рассчитанные на доверенный monerod. Используется по умолчанию для соединений не с локальным хостом. См. подробную информацию в пункте --trusted-daemon.
--do-not-relayТолько что созданная транзакция не будет передана в сеть Monero. Вместо этого она будет сброшена в файл в необработанном шестнадцатеричном формате. Опция полезна в том случае, если вы желаете пропустить транзакцию через такой шлюз, как https://xmrchain.net/rawtx. Её проще использовать с Tor, а не кошельком Monero.
--allow-mismatched-daemon-versionПозволяет связываться с monerod, использующим другую версию RPC.

Создание нового кошелька

ОпцияОписание
--generate-new-wallet <arg>Создание нового кошелька Monero и его сохранение в файл <arg>. Предварительно у вас попросят задать пароль. Пароль используется для шифрования файла кошелька, но он не связан с вашим главным ключом траты или мнемонической фразой. Следует создать очень сложный пароль, воспользовавшись вашим менеджером паролей (энтропия должна составлять ~256 бит). Пример:

./monero-wallet-cli --stagenet --generate-new-wallet $HOME/.bitmonero/stagenet/wallets/MoneroExampleStagenetWallet
--kdf-rounds <arg>CКасается шифрования файла кошелька. Файл кошелька шифруется при помощи поточного шифра ChaCha. Ключ шифрования выводится на основе предоставленного пользователем пароля путём хеширования этого пароля при помощи. Эта опция определяет, сколько раз будет использовано хеширование CryptoNight. По умолчанию хеширование происходит 1 раз.

Следует отметить, что это не связано с генерированием ключа траты.

Чем больше раз будет производиться хеширование, тем больше времени вы будете ждать открытия кошелька или проведения транзакции. Но при этом злоумышленнику будет сложнее подобрать пароль к вашему кошельку методом перебора.

Примечание: Вам будет необходимо запомнить и вводить одни и те же kdf-rounds при каждом получении доступа к вашему кошельку!

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

Открытие существующего кошелька

ОпцияОписание
--wallet-file <arg>Открывает существующий кошелёк. Пример:

./monero-wallet-cli --stagenet --wallet-file $HOME/.bitmonero/stagenet/wallets/MoneroExampleStagenetWallet

Применяется только к файлам кошелька, созданного при помощи инструментов monero-wallet-cli, monero-wallet-gui или monero-wallet-rpc. Если вы используете другой тип кошелька, то вам необходимо ознакомиться с опциями переноса.
--password <arg>Позволяет использовать пароль в качестве параметра, а не интерактивно. Не забывайте использовать пробелы / кавычки при такой необходимости.

Не рекомендуется использовать эту опцию, так как пароль останется в вашей истории команд, а также будет виден в таблице процессов. В целях автоматизации лучше использовать опцию --password-file.

Опция также работает в сочетании с --generate-new-wallet.
--password-file <arg>Позволяет использовать пароль в качестве файла, а не интерактивно. Конечные \n отбрасываются при считывании файла пароля.

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

Опция также работает в сочетании с --generate-new-wallet.

Восстановление кошелька

ОпцияОписание
--generate-from-device <arg>Восстановление/создание специального кошелька для аппаратного устройства, такого как Ledger или Trezor, и его сохранения в файле <arg>. Например:

./monero-wallet-cli --stagenet --generate-from-device MoneroExampleDeviceWallet --subaddress-lookahead 5:20

Это одноразовое действие. В следующий раз просто откроете кошелёк.

По умолчанию команда ожидает подсоединения устройства Ledger. В случае использования аппаратного кошелька Trezor - --hw-device Trezor (expected ~May 2019).

При настройках, используемых по умолчанию, это занимает до 25 минут. Причина состоит в том, что аппаратные устройства медленно генерируют подадреса. Во избежание этого следует использовать --subaddress-lookahead 5:20.

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

См. полное руководство по настройке аппаратного кошелька.
--generate-from-view-key <arg>Восстановление версии кошелька, предназначенной только для просмотра, позволяющей отслеживать входящие транзакции, и её сохранение в файле <arg>. TКошелёк создаётся на основе секретного ключа просмотра и стандартного адреса. Секретный ключ просмотра представляется в шестнадцатеричном формате.
--generate-from-spend-key <arg>Восстановление кошелька на основе секретного ключа траты и его сохранение в <arg>. Секретный ключ просмотра представляется в шестнадцатеричном формате.
--restore-deterministic-walletВосстановление кошелька на основе секретной мнемонической фразы. Используется для восстановления кошелька с использованием 25 мнемонических слов.

Для шифрования самого файла кошелька (после восстановления) будет запрошен пароль. Мнемонические фразы, генерируемые кошельками Monero, являются открытыми.
--restore-height <arg>Сканирование на наличие транзакций после определённой высоты блока. Значение, используемое по умолчанию, — 0. Увеличение этого значения делает восстановление кошелька гораздо более быстрым. Оптимальное значение должно соответствовать тому дню, когда был создан кошелёк (не рекомендуется использовать более поздний интервал дат). Соответствие высоты блока дате/времени можно определить при помощи блок-эксплореров, таких как https://xmrchain.net. Если кошелёк был создан, например, в 2019 году или позже, следует использовать высоту блока, равную 1730000.

Multisig кошелёк

ОпцияОписание
--generate-from-multisig-keys <arg>Создание стандартного кошелька на основе multisig ключей. Полезно объединять все секретные multisig ключи в стандартном кошельке (когда у вас более нет необходимости в использовании multisig). После этого кошелёк получает контроль над средствами. Он поддерживает все секретные ключи, даже если схема multisig использует ограничение (только N/N, но не N/M).
--restore-multisig-walletВосстановление multisig кошелька на основе секретной мнемонической фразы. , которая была ранее экспортирована при помощи интерактивной команды seed. Эта опция просто восстанавливает вашу часть кошелька. Другим участникам схемы multisig по-прежнему понадобится подписывать транзакции.

Конфигурационный файл

ОпцияОписание
--config-file <arg>Указывает полный путь к конфигурационному файлу. Следует отметить, что это должен быть отдельный конфигурационный файл, используемый monerod, поскольку эти инструменты принимают различные наборы опций.

Рабочие параметры

ОпцияОписание
--subaddress-lookahead <arg>Устанавливает значения m:n (по умолчанию 50:200). Первое значение указывает количество счетов, а второе — количество подадресов на счёт.

Кошелёк не проверяет платежи, приходящие на подадреса, сверх значения n, начиная с последнего полученного платежа. Это может произойти, если вы создали уникальные подадреса для n клиентов, но ни на один из них не поступил платёж.

С другой стороны, чем больше адресов вы указываете, тем больше времени займёт создание кошелька, поскольку их необходимо предварительно вычислить. Как правило, это не является проблемой, за исключением случаев использования аппаратных кошельков. При использовании Ledger и значении 50:200, используемом по умолчанию, это может занять 20 минут (только для создания кошелька)!
--max-concurrency <arg>Максимальное количество используемых при работе потоков. При значении 0, заданном по умолчанию, используется общее количество потоков CPU.

Интернационализация (Локализация)

ОпцияОписание
--mnemonic-language <arg>Устанавливает язык для слов, входящих в состав мнемонической фразы. Возможен выбор одного из следующих языков: english, english_old, esperanto, french, german, italian, japanese, lojban, portuguese, russian, spanish.

Лучше всего пользовать английский язык, установленный по умолчанию, так как он является самым популярным и проверенным. Также это позволит избежать ошибок, связанных с использованием символов не в формате ASCII.
--use-english-language-namesЕсли ваш дисплей зависает, выйдите «вслепую», используя ^C, а затем зайдите снова при помощи --use-english-language-names. Это может случиться, если Monero предлагает выбрать язык, отображая названия языков и их родных алфавитов.

Унаследованные опции

Следующие опции либо являются унаследованными, либо устаревшими.

ОпцияОписание
--non-deterministicГенерирует унаследованный не детерминированный кошелёк. Ключ просмотра не выводится на основе ключа траты. Также вам придётся создать резервную копию *.keys. Чтобы восстановить не детерминированный кошелёк (стандартный адрес), следует использовать --generate-from-keys. Чтобы восстановить всё полностью, понадобится файл *.keys.
--generate-from-keys <arg>Восстановление унаследованного не детерминированного кошелька путём предоставления ключей траты и просмотра, а также стандартного адреса.
--shared-ringdb-dir <arg>Задаёт путь к общей базе данных колец. Использование опции более нецелесообразно.
--create-address-fileНи на что не влияет. Файл *.address.txt создаётся независимо от этой опции.
--electrum-seed <arg>Предлагает использовать мнемоническую фразу в качестве опции командной строки для --restore-deterministic-wallet, а не интерактивно. Не рекомендуется использовать, поскольку мнемоническая фраза сохранится в истории команд, а также будет видна в таблице процессов.
--generate-from-json <arg>Для использования этой опции будет необходимо запустить monero-wallet-rpc. Кажется, эта опция появилась в monero-wallet-cli случайно.
--tx-notify <arg>Для использования этой опции будет необходимо запустить monero-wallet-rpc. Кажется, эта опция появилась в monero-wallet-cli случайно.

Параметры, установленные по умолчанию

Файлы кошелька создаются и находятся в текущей директории. Едва ли это то, что вам нужно. Для того чтобы изменить ситуацию, следует использовать --wallet-file и подобные опции.

Файл журнала создается в той же директории, что и двоичный файл monero-wallet-cli. Чтобы указать другое местоположение, следует использовать опцию --log-file.

Команды

Команды вводятся интерактивно в командной строке monero-wallet-cli.

Вы также можете использовать одноразовую команду, указав её в качестве параметра командной строки. Тем не менее этот вариант используется редко. Для автоматизации лучше использовать monero-wallet-rpc.

CLI-кошелёк имеет возможность вывода справки для отдельных команд. Мы не станем воспроизводить её. Вместо этого мы сфокусируемся на группировке команд, чтобы вы могли быстро найти именно то, что вам нужно. Воспользуйтесь help command_name, чтобы узнать больше.

Помощь и версия

help - список всех команд

help command_name - показать помощь по отдельной команде

version - вывод информации о версии двоичного файла monero-wallet-cli

Статус сети

status - показать, до какой высоты синхронизирован блокчейн

fee - показывает текущую комиссию за байт и mempool узла (отставание транзакций в зависимости от приоритета)

wallet_info - показывает путь к файлу кошелька, адрес, тип и статус сети

Баланс

account - общий баланс; список счетов с соответствующим балансом

balance detail - список адресов для текущего счёта с соответствующим балансом

refresh - принудительно обновить баланс и транзакции (автообновление срабатывает только один раз в 90 секунд)

Управление счетами

account

account new

account switch

account label

Управление адресами

address all

address new

address label

Просмотр транзакций

show_transfers - показывает все транзакции для текущего счёта. Есть возможность опционально применить фильтр: входящие (in) | исходящие (out) | в очереди (pending) | не удавшиеся (failed) | в пуле (pool) | coinbase; также опционально выдаёт индекс подадреса для подбора выходов

show_transfer <txid> - показывает подробную информацию по конкретной транзакции

incoming_transfers [available|unavailable] [verbose] [index=<N1>[,<N2>[,...]]] - показывает входящие транзакции — все или отфильтрованные по доступности и индексу адреса в пределах текущего счёта. Отображаются только подтверждённые транзакции — вы не увидите транзакций, ожидающих своей очереди в пуле

get_tx_note <txid> - получение строки уведомления с идентификатором транзакции

Ключи и пароли

Секретная мнемоническая фраза

seed - показывает необработанную мнемоническую фразу

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

Секретные ключи

spendkey - показывает секретный ключ траты

viewkey - показывает секретный и публичный ключи просмотра

Пароль кошелька

password - изменяет пароль кошелька. Этот пароль используется для шифрования локальных файлов кошелька. Секретные ключи или резервные копии не изменяются.

Доказательства

get_reserve_proof -> check_reserve_proof - доказательство баланса

get_spend_proof -> check_spend_proof - доказательство платежа

sign <file> -> verify <filename> <address> <signature> - доказательство владения адресом; позволяет проверить, был ли файл подписан владельцем определённого адреса Monero

get_tx_proof -> check_tx_proof

Multisig

Настройка

prepare_multisig

make_multisig

finalize_multisig

Обновление

export_multisig_info

import_multisig_info

Прочие

submit_multisig

exchange_multisig_keys

export_raw_multisig_tx

sign_multisig <filename>

Аппаратный кошелёк

hw_reconnect - переподключить аппаратный кошелёк

Майнинг

start_mining

stop_mining

Дополнительные

Выходы

unspent_outputs - показывает список и гистограмму непотраченных выходов (неделимых частей вашего баланса)

export_outputs <file> -> import_outputs <file> - помогает при осуществлении холодных трат. Экспортирует выходы из кошелька просмотра в холодный кошелёк, чтобы тот знал, что было ему отправлено

mark_output_spent <amount>/<offset> | <filename> [add]

mark_output_unspent <amount>/<offset>

is_output_spent <amount>/<offset>

Образ ключа

export_key_images <file> -> import_key_images <file> - используется, чтобы проинформировать кошелёк, предназначенный только для просмотра, о текущих транзакциях, чтобы он мог вычислить реальный баланс; как правило, кошелькам, предназначенным только для просмотра, известно только о входящих транзакциях, но не об исходящих

Приватный ключ транзакции

Позволяет узнать и верифицировать приватный ключ транзакции r. Опция была полезно с точки зрения создания подтверждения платежа но она была заменена на get_spend_proof

get_tx_key <txid>

check_tx_key <txid> <txkey> <address>

set_tx_key <txid> <tx_key>

Устранение ошибок

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

Косметика

donate <amount> - пожертвовать <amount> команде разработчиков

address_book [(add ((<address> [pid <id>])|<integrated address>) [<description possibly with whitespaces>])|(delete <index>)]

set_description [free text note] -> get_description - управление описанием кошелька (информация является локальной)

Наследственные

save - сейчас это происходит автоматически

save_bc - сейчас это происходит автоматически

bc_height - показывает высоту блокчейна (заменена на status)

sweep_unmixable - относится только к очень старым кошелькам (до 2016); отправляет все несмешиваемые выходы вам же при размере кольца, равном 10

locked_sweep_all

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

ЧТО ОСТАЛОСЬ?

Задокументировать остающиеся команды:

payment_id

payments <PID_1> [<PID_2> ... <PID_N>]

print_ring <key_image> | <txid>

save_known_rings

save_watch_only

set <option> [<value>]

set_daemon <host>[:<port>] [trusted|untrusted]

set_log <level>|{+,-,}<categories>

set_ring <filename> | ( <key_image> absolute|relative <index> [<index>...])

set_tx_note <txid> [free text note]

sign_transfer [export_raw]

submit_transfer

locked_sweep_all

sweep_all [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] [outputs=<N>] <address> [<payment_id>]

sweep_below <amount_threshold> [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] <address> [<payment_id>]

sweep_single [<priority>] [<ring_size>] [outputs=<N>] <key_image> <address> [<payment_id>]

transfer [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] (<URI> | <address> <amount>) [<payment_id>]

locked_transfer [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] (<URI> | <addr> <amount>) <lockblocks> [<payment_id>]


Кошелёк Monero GUI


Обзор

Десктоп GUI-кошелёк

«Официальный» десктоп кошелёк Monero, доступный для Linux, macOS и Windows.

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

Зависимость от полного узла

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

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

Как правило, полный узел запускается на том же компьютере, на котором установлен кошелёк (или же в пределах домашней сети).

Соединение осуществляется посредством HTTP и использует этот API.

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

Тем не менее соединение с удалённым узлом предполагает наличие некоторых других компромиссов, которые являются темой отдельной статьи.

Руководство пользователя в формате PDF

В каталоге, в который были распакованы файлы архива кошелька Monero, имеется прекрасное руководство в формате PDF. Обязательно ознакомьтесь с ним!

Также есть и онлайн версия, доступная по данной ссылке:
https://github.com/monero-ecosystem/monero-GUI-guide/blob/master/monero-GUI-guide.md

Синтаксис

./monero-wallet-gui [options]

Пример:

./monero-wallet-gui --log-file=/dev/null

Запуск

Необходимо перейти в директорию, в которую были распакованы файлы Monero.

Затем следует запустить полный узел и подождать, пока не будет закончена синхронизация с сетью (процесс может занять до нескольких дней):

./monerod

В отдельном окне необходимо запустить кошелёк:

./monero-wallet-gui

Опции

Опции немногочисленны, поскольку всё настраивается посредством самого Monero GUI.

ОпцияОписание
--helpВыводит список доступных опций.
--log-fileУказывает полный путь к файлу журнала. Пример (следует помнить о разрешениях, устанавливаемых для файла):
./monerod --log-file=/var/log/monero/mainnet/monerod.log

Параметры, используемые по умолчанию

Кошелёк создаётся в директории $HOME/Monero/wallets/. Чтобы все файлы, связанные с Monero, хранились в одном месте, директорию можно изменить на $HOME/.bitmonero/wallets/. Это настраивается посредством соответствующего пункта настроек при создания кошелька.

Файл журнала создаётся напрямую в домашней директории $HOME/monero-wallet-gui.log. Директория может быть изменена при помощи опции --log-file=$HOME/.bitmonero/monero-wallet-gui.log.


Экспорт блокчейна Monero | monero-blockchain-export


Сегодня экспорт/импорт необработанных данных блокчейна используется редко. Раньше загрузка блокчейна посредством p2p сети происходила довольно медленно. И для ускорения процесса автоматической загрузки узла использовался файл blockchain.raw.

Обзор

Инструмент, позволяющий выгрузить блокчейн в необработанном формате, известен как файл blockchain.raw.

Он может пригодиться, если вы решите эффективно обработать данные блокчейна, используя собственные инструменты, так как с такими данными работать проще, чем со специализированной lmdb базой данных Monero. Файл используется с локальной копией блокчейна и не требует наличия запущенного демона monerod.

Синтаксис

./monero-blockchain-export [options]

Пример:

./monero-blockchain-export --help

Запуск

Необходимо перейти в директорию, в которую были распакованы файлы Monero.

./monero-blockchain-export --stagenet --output-file=/tmp/blockchain.raw

Опции

Помощь

ОпцияОписание
--helpВыводит список доступных опций.

Выбор сети

ОпцияОписание
(missing)По умолчанию monero-blockchain-export использует основную сеть.
--stagenetЭкспорт блокчейна в отладочную сеть.
--testnetЭкспорт блокчейна в тестовую сеть.

Журнал регистрации

Указание пути к файлу журнала не поддерживается.

ОпцияОписание
--log-levelОт 0 до 4, где 0 обозначает минимальную регистрацию данных в журнале, а 4 запись всех регистрационных данных. По умолчанию имеет значение 0. Это общие предварительные настройки, которые не связаны напрямую с уровнями сложности. Например, при минимальном значении 0, можно увидеть только некоторые важные данные INFO. Пример:
./monero-blockchain-export --log-level=1

Вводимые данные

ОпцияОписание
--data-dirПолный путь к директории данных. Здесь хранятся данные блокчейна, регистрационные файлы и данные p2p сети. Настройки, используемые по умолчанию, и более подробная информация приводятся в разделе Директория данных.
--database, --db-typeЕдинственным действительным значением и используемым по умолчанию, является lmdb.

Выводимые данные

ОпцияОписание
--output-fileУказывает путь к файлу выводимых данных. По умолчанию используется $DATA_DIR/export/blockchain.raw. Пример:
./monero-blockchain-export --output-file=/tmp/blockchain.raw
--blocksdatВывод данных в формате blocks.dat.
--block-stopЭкспорт данных только до указанного номера блока. По умолчанию осуществляется экспорт всех данных (значение, используемое по умолчанию, — 0).

Ссылки


Импорт блокчейна Monero | monero-blockchain-import


Сегодня экспорт/импорт необработанных данных блокчейна используется редко. Раньше загрузка блокчейна посредством p2p сети происходила довольно медленно. И для ускорения процесса автоматической загрузки узла использовался файл blockchain.raw.

Обзор

Инструмент, позволяющий импортировать файл автоматической загрузки blockchain.raw на ваш полный узел.

Он может пригодиться, если вы по какой-либо причине решите разделить загрузку и верификацию (например, чтобы провести изолированное тестирование). В этом случае файл blockchain.raw можно загрузить по этой ссылке: https://downloads.getmonero.org/blockchain.raw.

Тем не менее в идеале следует использовать собственный проверенный файл blockchain.raw, который был экспортирован вами ранее.

Необходимо отметить, что импорт файла blockchain.raw will не ускорит процесса синхронизации посредством p2p сети. Причиной служат ограничения в возможностях ввода/вывода данных диском и ограничения, связанные с верификацией, но не загрузкой.

Инструмент используется с вашей локальной версией файлов и не требует наличия запущенного демона monerod.

Синтаксис

./monero-blockchain-import [options]

Пример:

./monero-blockchain-import --help

Запуск

Необходимо перейти в директорию, в которую были распакованы файлы Monero.

./monero-blockchain-import --stagenet --output-file=/tmp/blockchain.raw

Опции

Помощь

ОпцияОписание
--helpВыводит список доступных опций.

Выбор сети

ОпцияОписание
(missing)По умолчанию monero-blockchain-export использует основную сеть.
--stagenetЭкспорт блокчейна в отладочную сеть.
--testnetЭкспорт блокчейна в тестовую сеть.

Журнал регистрации

Указание пути к файлу журнала не поддерживается.

ОпцияОписание
--log-levelОт 0 до 4, где 0 обозначает минимальную регистрацию данных в журнале, а 4 запись всех регистрационных данных. По умолчанию имеет значение 0. Это общие предварительные настройки, которые не связаны напрямую с уровнями сложности. Например, при минимальном значении 0, можно увидеть только некоторые важные данные INFO. Пример:
./monero-blockchain-export --log-level=1

Вводимые данные

ОпцияОписание
--input-fileПолный путь к файлу с необработанными данными блокчейна. По умолчанию используется следующий: $DATA_DIR/export/blockchain.raw.
--block-stopЭкспорт данных только до указанного номера блока. По умолчанию осуществляется экспорт всех данных (значение, используемое по умолчанию, — 0).
--pop-blocksСброс указанного количества блоков от конца загруженного блокчейна. По умолчанию не сбрасывается ничего (значение, используемое по умолчанию, — 0).

Выводимые данные

ОпцияОписание
--data-dirПолный путь к директории данных. Здесь хранятся данные блокчейна, регистрационные файлы и данные p2p сети. Настройки, используемые по умолчанию, и более подробная информация приводятся в разделе Директория данных.
--count-blocksОсуществляет подсчёт блоков в загруженном файле.
--drop-hard-forkСбрасывает данные хардфорка. По умолчанию не сбрасывается ничего (значение, используемое по умолчанию, — 0).
--databaseЕдинственным действительным значением и используемым по умолчанию, является lmdb.

Рабочие параметры

OptionDescription
--dangerous-unverified-importПо умолчанию безопаснее всего использовать верификацию (значение, используемое по умолчанию, — 0). Если вы импортируете собственный файл blockchain.raw (подразумевается, что он уже был верифицирован), то можно использовать команду --dangerous-unverified-import. «Опасный» режим значительно ускорит процесс загрузки.
--batchИспользуется для сохранения всех данных на диск на непрерывной основе (значение, используемое по умолчанию, — 1) или, возможно, для хранения всех данных в ОЗУ и в конечном счёте их сохранения на диск (значение, используемое по умолчанию, — 0). Отсутствие пакетирования эффективно только при отсутствии верификации (--dangerous-unverified-import). См. также --batch-size.
--batch-sizeЧастота сохранения данных на диск, выраженная в блоках. По умолчанию значение составляет 5000 блоков (при наличии верификации) или 20000 блоков (при отсутствии верификации). Большие пакеты обрабатываются быстрее, но требуют больше ОЗУ.
--resumeВосстановление с текущей высоты, если исходящая база данных уже существует (значение, используемое по умолчанию, — 1). Если изменить значение на --resume=0, измениться следующее — существующие блоки будут пропущены, и процесс возобновится.

Ссылки


Конфигурационный файл Monero


Применимость

По умолчанию Monero ищет конфигурационный файл bitmonero.conf в директории данных Monero.

Чтобы использовать определённый конфигурационный файл, следует применить опцию --config-file:

./monerod --config-file=/etc/monerod.conf

Опция --config-file используется для:

  • monerod
  • monero-wallet-cli
  • monero-wallet-rpc
  • monero-gen-trusted-multisig

Синтаксис

  • option-name=value
  • valueless-option-name=1 (для опций, не требующих значения)
  • # comment
  • пробелы игнорируются

Ссылки

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

Пропустите -- для --option-name.

Пример:

./monerod --log-level=4 --stagenet

трансформируется в:

log-level=4
stagenet=1     # use value "1" to enable the value-less options like --stagenet

Примеры

monerod.conf

Этот конфигурационный файл адаптирован для использования сервером.

# /etc/monero/monerod.conf

# Data directory (blockchain db and indices)
data-dir=/home/monero/.monero  # Remember to create the monero user first

# Log file
log-file=/var/log/monero/monerod.log
max-log-file-size=0            # Prevent monerod from managing the log files; we want logrotate to take care of that

# P2P full node
p2p-bind-ip=0.0.0.0            # Bind to all interfaces (the default)
p2p-bind-port=18080            # Bind to default port

# RPC open node
rpc-bind-ip=0.0.0.0            # Bind to all interfaces
rpc-bind-port=18081            # Bind on default port
confirm-external-bind=1        # Open node (confirm)
restricted-rpc=1               # Prevent unsafe RPC calls
no-igd=1                       # Disable UPnP port mapping

# Slow but reliable db writes
db-sync-mode=safe

# Emergency checkpoints set by MoneroPulse operators will be enforced to workaround potential consensus bugs
# Check https://monerodocs.org/infrastructure/monero-pulse/ for explanation and trade-offs
enforce-dns-checkpointing=1

out-peers=64              # This will enable much faster sync and tx awareness; the default 8 is suboptimal nowadays
in-peers=1024             # The default is unlimited; we prefer to put a cap on this

limit-rate-up=1048576     # 1048576 kB/s == 1GB/s; a raise from default 2048 kB/s; contribute more to p2p network
limit-rate-down=1048576   # 1048576 kB/s == 1GB/s; a raise from default 8192 kB/s; allow for faster initial sync

monero-wallet-cli.conf

Этот конфигурационный файл адаптирован для использования десктоп кошельком в stagenet.

# $HOME/.bitmonero/stagenet/monero-wallet-cli.conf

# Pick network
stagenet=1

# Connect to a remote full node    
daemon-address=monero-stagenet.exan.tech:38081
untrusted-daemon=1

# Log file
log-file=/tmp/monero-wallet-cli.log

# wallet-file=/home/YOUR-USER/.bitmonero/stagenet/wallets/MoneroExampleStagenetWallet

Технические характеристики и спецификации Monero


Активность (жизненный цикл)

  • Блокчейн Monero активен с 18 апреля 2014 года по текущее время.

Отсутствие премайнинга, инстамайнинга, ICO и токенизации

  • В случае с Monero премайнинг или инстамайнинг отсутствует.
  • Проект Monero не продавал никакого токена.
  • Предварительная продажа Monero не осуществлялась ни в каком виде.

Алгоритм доказательства работы

  • CryptoNight
    • версия v0, начиная с высоты блока 0;
    • версия v1, начиная с высоты блока 1546000 (дата форка: 06.04.2018);
    • версия v2, начиная с высоты блока 1685555 (дата форка: 18.10.2018);
    • версия v3, начиная с высоты блока 1788000 (дата форка: 09.03.2019); "CryptonightR"
  • RandomX
    • версия v0, начиная с высоты блока 1978433 (дата форка: 30.11.2019)

Перенастройка сложности

  • Каждый блок.
  • В зависимости от последних 720 блоков (24 ч.), за исключением 20%, выходящих за пределы временных меток.

Время блока

  • 2 минуты.
  • Может измениться в будущем, поскольку кривая эмиссии сохраняется.

Вознаграждение за блок

  • Постепенно снижается и является предметом наложения штрафов, если размер блока превышает средний размер последних 100 блоков (M100).
  • По состоянию на июнь 2020 г. составляло примерно ~1,6 XMR. Чтобы узнать текущий размер, следует посмотреть coinbase-транзакцию последнего блока.

Размер блока

  • Динамический.
  • Максимум в два раза больше среднего размера последних 100 блоков (2 * M100).
  • По состоянию на февраль 2019 г. составил примерно ~50 Кбайт. Последний размер блока можно узнать здесь.

Эмиссии

Основная эмиссия

  • Как ожидается, объём первой основной эмиссии должен составить примерно 18,132 монет к концу мая 2022 г.
  • По состоянию на июнь 2020 г. объём эмиссии составит примерно 8 XMR каждые 10 минут.
  • См. графики и подробную информацию.

Хвостовая эмиссия

  • Дополнительная эмиссия начнётся, как только закончится основная.
  • Объём дополнительной эмиссии составит 0,6 XMR на 2-минутный блок.
  • Со временем это приведёт к снижению инфляции до <1%.

Максимальный объём

  • Примерно 18,132 миллиона XMR + 0,6 XMR каждые 2 минуты.
  • Технически бесконечен, но на практике подвержен дефляции, если учитывать потерянные монеты.

Делимость

  • Monero делима до 12 разрядов.
  • Самая меньшая единица называется piconero (пиконеро) и равна 1e-12 XMR или 0,000000000001 XMR.

Анонимность отправителя

  • Кольцевые подписи:
    • размер подписи равен 11 (10 ложных выходов).
  • Гарантия: вероятностная / правдоподобное отрицание.

Анонимность получателя

  • Скрытые адреса.
    • Гарантия: надёжная.

Анонимность суммы

  • Кольцевые конфиденциальные транзакции.
    • Гарантия: надёжная.

Анонимность IP-адреса

Для полного узла (monerod):

  • Dandelion++
    • Гарантии: не защитит от провайдера ISP / VPN, не защитит от самого первого удалённого узла в протоколе Dandellion ++
  • Для обеспечения полной защиты пользователь должен вручную настроить monerod для использования с Tor

Для кошелька (monero-wallet-gui или monero-wallet-cli):

  • Как правило, кошелёк используется на той же машине, на которой запущен полный узел, поэтому риск отсутствует
  • Если кошелек подключается к удалённому полному узлу, то защита IP отсутствует по умолчанию
    • Пользователь должен вручную настроить кошелёк для использования с Tor

Криптография в Monero



Введение


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

В сравнении с другими альткоинами криптография Monero считается консервативной, надёжной и устойчивой.

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


Асимметричная криптография в Monero​



Введение

Перед тем как мы перейдём непосредственно к специфичным для Monero вещам, добавим немного контекста. В нашем случае мы говорим об асимметричной криптографии. «Асимметричная» означает просто то, что используются два ключа:

  • приватный ключ (используется в первую очередь для подписания данных и для дешифровки данных);
  • публичный ключ (используется в первую очередь для верификации подписи и для шифрования данных).

Это контрастирует с симметричной криптографией, предполагающей использование одного ключа, являющегося секретом, совместно используемым сторонами.

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

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


Использование приватных ключей в Monero


В случае с Monero корневой приватный ключ генерируется случайным образом. Другие приватные ключи детерминировано выводятся на основе корневого приватного ключа.

Приватный ключ необходимо хранить в секрете.

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

Приватный ключ имеет длину 256 бит.

Приватный ключ — скалярная величина, а это значит, что он однозначен.

В уравнениях скалярные величины представлены строчными буквами.

Связь с Ed25519​

Будучи просто случайным целым числом, приватный ключ не является чем-то специфическим для какой-либо определённой схемы в асимметричной криптографии.

В контексте криптографии на эллиптических кривых, используемой Monero, приватный ключ является числом, на которое умножается базовая точка G. Результатом умножения является публичный ключ P (ещё одна точка на кривой). Умножение точки на число имеет специальное определение в криптографии на эллиптических кривых. Подробную информацию можно найти в этом руководстве.

Надёжность ключа​

Перед выведением публичного ключа приватный ключ обрабатывается по модулю 1, где 1 является максимальной скалярной величиной, допустимой для кривой edwards25519.

1 является числом порядка 2^252, таким образом, эффективная надёжность ключа составляет 252 бита, а не 256 бит. Это стандартная ситуация для криптографии на эллиптических кривых, и, скорее, является косметическим нюансом, а не проблемой.

Шифрование​

В контексте, в котором с этим вопросом сталкивается пользователь, целое число приватного ключа:

  1. Берётся по модулю 1 во избежание поделки.
  2. Выражается как массив из 32 байт в формате следования, начиная с младшего (первый байт является наименее значимым).
  3. Преобразуется в шестнадцатеричную форму, например: b3588a87056fb21dc4d052d59e83b54293882e646b543c29478e4cf45c28a402

Приватный ключ траты​

Приватный ключ траты используется для траты Monero.

Если конкретнее, он используется для построения одноразовых приватных ключей, позволяющих тратить соответствующие выходы.

Приватный ключ просмотра​

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

Одноразовые приватные ключи​

Одноразовые приватные ключи как конструкция используются в скрытых адресах.


Использование публичных ключей в Monero​


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

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

Публичный ключ является точкой (x, y) на эллиптической кривой.

В уравнениях точки представлены прописными буквами.

В контексте, в котором с публичными ключами сталкивается пользователь, они шифруются в шестнадцатеричном формате, где байты следуют, начиная с младшего, например: 016a941812293cf9a86071060fb090ab38d67945e659968cb8cf30e1bc725683

Выведение публичного ключа​

Допустим:

  • P является публичным ключом;
  • x является приватным ключом;
  • G является «базовой точкой»; это просто константа, специфичная для edwards25519; эта точка находится на эллиптической кривой.

Тогда:

P = xG

Публичный ключ является просто базовой точкой (G), умноженной на приватный ключ (x). Умножение точки представляет собой добавление точки к себе самой некоторое количество раз.

Тем не менее такое сложение не является простым векторным сложением. Существует довольно конкретное определение, хорошо описанное в этой статье. Важно то, что результатом сложения всегда будет точка на эллиптической кривой. Например, G + G уже будет другой точкой на кривой.

Варианты использования​

Адрес Monero состоит из публичного ключа траты и публичного ключа просмотра. Эти ключи используются для построения скрытых адресов для получения платежей.


Эллиптическая кривая Edwards25519


В свою очередь, сама кривая основана на схеме подписи Ed25519. Несмотря на то, что используется не изменённая версия кривой, в остальном Monero не совсем следует схеме Ed25519.

Кривая edwards25519 ирационально эквивалентна кривой Curve25519.

Определение

Это стандартное определение кривой edwards25519, и тут нет ничего специфичного для Monero, кроме согласованных названий. Согласованные названия взяты из документа CryptoNote и широко используются в литературе по Monero.

Уравнение кривой

−x^2 + y^2 = 1 − (121665/121666) * x^2 * y^2

Примечание:

  • Кривая является двумерной (ничего особенного, как и все кривые, которые изучались в средней школе).

  • Кривая отражается ниже оси y из-за y^2 части уравнения (не является полиномом).

Базовая точка: G

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

Следует отметить, что в данном случае достаточно указать значение y и знак значения x, так как определённый x может быть вычислен при помощи уравнения кривой.

G = (x, 4/5)  # берётся точка с положительным x

# Шестнадцатеричное представление базовой точки:
5866666666666666666666666666666666666666666666666666666666666666    

Порядок базовой точки, равный целому числу: l

С точки зрения расположения «полотно», на котором рисуется кривая, должно иметь конечное «разрешение», таким образом, координаты точки должны «обёртываться» в некоторой точке. Это достигается за счёт значения по модулю l (L в нижнем регистре). Другими словами, l определяет максимальную скалярную величину, которую мы можем использовать.

l = 2^252 + 27742317777372353535851937790883648493
# => 7237005577332262213973186563042994240857116359379907606001950938285454250989

l является простым числом, которое указывают авторы кривой.

На практике оно обозначает надёжность приватного ключа.

Общее количество точек на кривой

Общее количество точек на кривой также обозначается простым числом:

q = 2^255 - 19

На практике не все точки являются «полезными», поэтому надёжность приватного ключа ограничивается l, как было указано выше.

Реализация

Monero использует (очевидно, изменённый) вариант реализации Ref10, предложенный Дэниелом Дж. Бернштейном (Daniel J. Bernstein).

Ссылки


Образ приватного ключа Monero​


Образ приватного ключа служит для обнаружения попыток двойной траты.

В случае с Monero средства всегда отправляются на одноразовый публичный ключ P. Соответствующий одноразовый приватный ключ x специфичен для не потраченного выхода.

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

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

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

Определение​

I = x*Hp(P)

Где:

  • I - является образом приватного ключа (или «образом ключа» для краткости);
  • x - является одноразовым приватным ключом, используемым для разблокировки не потраченного выхода;
  • P - является одноразовым публичным ключом не потраченного выхода;
  • Hp() - является хеш-функцией, принимающей точку на эллиптической кривой в качестве аргумента.

P мы вычисляем следующим образом:

P = xG

где G является базовой точкой на кривой edwards25519.

Заменяем P на xG и получаем:

I = x*Hp(xG)

Образ ключа I является одноразовой функцией приватного ключа x.

Ссылки


Base58


Base58 является схемой шифрования из двоичного в текстовый формат. Она подобна схеме Base64, но была изменена во избежание одновременного использования не алфавитно-числовых символов и букв, которые могут выглядеть схоже при печати. Для этого из схемы Base64 были исключены следующие символы: IOl0+/

Base58 требует строгого указания формата. Это приводит к тому, что одни варианты реализации несовместимы с другими, например, с точки зрения алфавитного порядка.

С подробностями можно ознакомиться в Wikipedia.

Base58 в Monero​

Monero использует собственный вариант Base58.

В случае с Monero шифрование Base58 происходит в 8-байтовых блоках, за исключением последнего блока, который составляют оставшиеся (8 или меньшее количество) байтов.

8-байтовый блок преобразуется в 11 или меньше символов Base58. Если блок преобразуется менее чем в 11 символов, выход дополняется единицами (1) (0 в Base58). Конечный блок также дополняется до нужного максимального размера в байтах, закодированного в Base58.

Преимуществом варианта реализации Monero является то, что выход имеет фиксированный размер, что не так в случае с простой схемой Base58. А недостаток состоит в том, что библиотеки, используемые по умолчанию, не работают.

Подробную информацию можно найти по следующим ссылкам для базового варианта реализации Base58 на C++ и для неофициального варианта реализации Base58 на Python.


Генератор псевдослучайных чисел Monero​


Monero использует PRNG на базе хеш-функции Keccak. По сути, в данном случае результат предыдущего раунда хеширования является вводом для следующего.

Начальное число берётся из источников энтропии, обеспечиваемых операционной системой. В случае с Linux и MacOS начальное число берётся из /dev/urandom. В случае с Windows для получения начального числа используется вызов WinAPI CryptGenRandom.

Повторного извлечения начального числа не происходит.

Предостережение​

  • Это касается исходного варианта реализации на C++ для Monero. Следует отметить, что существует множество альтернативных вариантов реализации для создания приватного ключа, включая JavaScript, Python, Android/Java, но их необходимо исследовать на предмет правильности от случая к случаю.

  • В исходном коде Monero вы также можете найти генератор случайных байтов на базе lipsodium. Он является частью встроенной библиотеки и, очевидно, не используется в фактическом коде Monero.

Ссылки


Хеш-функция Keccak-256


В качестве хеш-функции Monero использует Keccak. В частности, в большинстве случаев используется функция Keccak-256, обеспечивающая 32-байтовые хеши.

Keccak является лучшей хеш-функцией, разработанной специалистами не из АНБ. Функция Keccak победила в конкурсе NIST (Национальный институт науки и техники), став официальной функцией SHA3.

Варианты использования

Monero не использует функцию Keccak для доказательства работы. Он используется:

  • генератором случайных чисел;
  • для хеширования блоков;
  • для хеширования транзакций;
  • с образами приватных ключей скрытых адресов (для защиты от двойной траты);
  • с контрольной суммой публичных адресов;
  • в RingCT;
  • в multisig
  • в Bulletproofs

...и, вероятно, для многих других вещей.

Keckack-256 и SHA3-256

SHA3-256 является функцией Keccak-256, но с изменённым NIST заполнением. Поэтому оригинальная версия Keccak-256 выдаёт значение хеша отличное от того, которое выдаёт функция SHA3-256 c изменённым NIST.

Monero использует оригинальную версию Keccak-256. Стандарт NIST был опубликован только в августе 2015, в то время как Monero появилась 18 апреля 2014.

Ссылки


Адреса в Monero


Публичный адрес Monero — это та информация, которую вы публикуете, чтобы вам заплатили.

Адрес может быть сгенерирован оффлайн и бесплатно. Всё сводится к генерированию большого случайного числа, которое представляет собой ваш приватный ключ траты.

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

В Monero существует несколько типов публичных адресов:

  • стандартный адрес — основной тип адреса, также называемый «сырым» адресом;
  • подадрес (субадрес)​ — то, что вы будете использовать по умолчанию;
  • интегрированный адрес — необходим биржам, предпринимателям и прочим коммерсантам, принимающим Monero в полностью автоматизированном режиме.

Стандартный адрес


Исторически «сырой» адрес был единственной опцией. Поэтому он наиболее распространён и является самым поддерживаемым типом адреса.

Его сила в простоте. Тем не менее сегодня пользователи предпочитают принимать средства на подадреса, а не на стандартный адрес.

Технически «сырой» адрес также служит основой для создания подадресов и интегрированных адресов.

Сырой адрес полезен по следующим причинам::

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

«Сырой» адрес Monero состоит из двух публичных ключей:

  • публичного ключа траты;
  • публичного ключа просмотра.

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

Структура данных

ИндексРазмер в байтахОписание
01Указывает тип сети и тип адреса; 18 - основной блокчейн; 53 - тестовая сеть
132Публичный ключ траты
3332Публичный ключ просмотра
654Контрольная сумма (хеш Keccak-f[1600] предыдущих 65 байтов, урезанная до первых 4 байт)

Всего размер адреса составляет 69 байт. Затем байты шифруются (src) в соответствии со специфическим для Monero форматом Base58, и в результате получается строка из 95 символов. Пример стандартного адреса:

4AdUndXHHZ6cfufTMvppY6JwXNouMBzSkbLYfpAV5Usx3skxNgYeYTRj5UzqtReoS44qo9mtmXCqY45DJ852K5Jv2684Rge

См. исходный код.

Как генерируется​

Стандартный адрес выводится на основе корневого приватного ключа.

Источник


Подадрес (Субадрес)​


Подадрес — это то, что вы используете по умолчанию для получения Monero.

Узнайте, за что вам заплатили.

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

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

Не позволяйте связывать ваши платежи

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

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

Групповое перечисление средств на счета​

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

Вы можете пожелать организовать ваши средства в такие счета, как «наличные», «работа», «трейдинг», «майнинг», «пожертвования» и т. д.

Так как счета являются просто группами подадресов, у самих них нет адреса.

Счета детерминировано выводятся на основе корневого приватного ключа вместе с подадресами.

Счета подобны подсчетам вашего классического банковского счёта. Тем не менее тут есть одно важное отличие. В случае с Monero средства на самом деле находятся не на счетах и не по публичным адресам. Концептуально публичные адреса являются шлюзом или механизмом маршрутизации. Средства находятся в непотраченных выходах транзакций. Таким образом, в одной транзакции, в принципе, могут накапливаться и тратиться выходы с множества адресов (и при расширении — с множества счетов). CLI или GUI-кошелёк может напрямую не поддерживать создание таких транзакций из соображений простоты.

Если говорить коротко, то рассматривайте счета в качестве мягкой группировки ваших средств.

А почему просто не использовать множество кошельков?​

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

Кроме того, довольно удобно управлять своими подадресами, пользуясь одним интерфейсом пользователя.

Свойство на уровне кошелька​

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

Структура данных​

Подадрес имеет выделенный «сетевой байт»:

ИндексРазмер в байтахОписание
01Указывает тип сети и тип адреса 42 - основная сеть; 36 - отладочная сеть; 63 - тестовая сеть

В ином случае структура данных будет той же, что и у стандартного адреса.

Как генерируется​

Концептуально у каждого подадреса есть:

  • индекс счёта (также известен как «основной» индекс);
  • индекс подадреса в самом счёте (также известен как «младший» индекс).

Индексы имеют нулевую основу. По умолчанию кошельки используют индекс счёта с нулевым значением.

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

Приватный ключ просмотра​

Скаляр для подадреса m выводится следующим образом:

m = Hs("SubAddr" || a || account_index || subaddress_index_within_account)

Где:

  • Hs является хеш-функцией Keccak-256, интерпретированной как целое число и модуль 1 (максимальная скалярная величина edwards25519);
  • || является операцией конкатенации множества байтов;
  • SubAddr является фиксированной строкой с 0 на конце (всего 8 байт);
  • a является приватным ключом просмотра стандартного адреса (неподписанным 32-байтовым целым числом с обратным порядком байтов);
  • account_index является индексом счёта (неподписанным 32-байтовым целым числом с обратным порядком байтов);
  • subaddress_index_within_account является индексом подадреса внутри счёта (неподписанным 32-байтовым целым числом с обратным порядком байтов).

Выведение «подключей просмотра» из основного ключа просмотра позволяет создавать кошелёк, предназначенный только для просмотра, который отслеживает весь кошелёк, включая подадреса.

Публичный ключ траты​

Публичный ключ траты D для подадреса выводится следующим образом:

D = B + m*G

Где:

  • B является публичным ключом траты для стандартного адреса;
  • m является скаляром для каждого подадреса, полученным из приватного ключа траты;
  • G является «базовой точкой» - это просто специфическое для edwards25519 константное значение.

Публичный ключ просмотра​

Публичный ключ просмотра C для подадреса выводится следующим образом:

C = a*D

Где:

  • a является приватным ключом просмотра стандартного адреса;
  • D является публичным ключом траты для подадреса.

Особый случай для (0, 0)

Подадрес #0 счёта #0 является стандартным адресом. Так как стандартный адрес генерируется по другим правилам, он реализуется просто посредством оператора if.

Построение адресной строки​

Процедура та же, что и в случае со стандартным адресом.

Внимание!​

  • Не рекомендуется переводить весь баланс с подадреса на стандартный адрес в рамках одной транзакции. В результате такого действия подадреса связываются в блокчейне. Тем не менее это угрожает анонимности только в случае с определённым отправителем, и ситуация едва ли будет хуже, как если бы подадреса не использовались вовсе. Если вам необходимо объединить средства и сохранить максимальную анонимность, то это следует делать отдельными транзакциями (по одной на подадрес).
  • Ярлыки, используемые для удобства, не сохраняются при повторном создании на основе мнемонической фразы.

Ссылки


Интегрированный адрес


Интегрированные адреса идеальны с точки зрения автоматизированного приёма Monero, например, онлайн магазинами и биржами.

Интегрированный адрес Monero использует идентификатор (ID) платежа. Это позволяет узнать, за что вам заплатили.

Пожалуйста, отметьте, что это в большей степени технические ID платежей Monero, и их не следует путать с коммерческими идентификаторами, такими как номер заказа или номер счёта.

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

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

Структура данных (src):

ИндексРазмер в байтахОписание
01Указывает тип сети и тип адреса; 19 - основной блокчейн; 54 - тестовая сеть
132Публичный ключ траты
3332Публичный ключ просмотра
658Компактный ID платежа, представляющий собой 8 случайно сгенерированных получателем байт. Следует отметить, что он не требует шифрования в самом адресе, но он скрывается в транзакции, которая проводится на интегрированный адрес, что не позволяет внешним наблюдателям связать платёж с адресом.
734Контрольная сумма (хеш Keccak-f[1600] предыдущих 65 байтов, урезанный до первых 4 байт)

Всего 77 байт. Затем байты шифруются (src) в соответствии со специфическим для Monero форматом Base58, и в результате получается строка из 106 символов. Пример интегрированного адреса:

4LL9oSLmtpccfufTMvppY6JwXNouMBzSkbLYfpAV5Usx3skxNgYeYTRj5UzqtReoS44qo9mtmXCqY45DJ852K5Jv2bYXZKKQePHES9khPK

Сравнение интегрированных и подадресов

Оба типа адресов позволяют вам узнать, за что вам было заплачено.

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

Коммерческие организации, принимающие платежи автоматически, скорее, будут пользоваться интегрированными адресами. Рациональным обоснованием может служить следующее:

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

  • Чтобы сгенерировать интегрированный адрес не требуется никаких приватных ключей. Это даёт сильное преимущество с точки зрения безопасности, поскольку службам, генерирующим интегрированные адреса, не требуется доступа к кошельку. И наоборот, чтобы сгенерировать подадрес, необходим приватный ключ просмотра.

  • Чтобы сгенерировать интегрированный адрес не требуется общего счётчика. Это позволяет отдельным службам независимо генерировать интегрированные адреса, не синхронизируясь с общей последовательностью. И наоборот, подадреса генерируются последовательно, и поэтому последовательность (счётчик или индекс) является связующей точкой между кошельком и всеми службами, которым необходимо сгенерировать адрес. Возвращаясь к интегрированным адресам, следует отметить, что размер встроенных ID платежей составляет 64 бита. Это означает достаточное количество места, чтобы любой мог надёжно сгенерировать их случайным образом, и при этом будет гарантирована уникальность адреса.

  • В очень редких случаях попытка отслеживания очень большого количества подадресов может стать проблемой. Подробную информацию можно найти в этом треде на reddit.

Внимание!

Существуют некоторые сложности:

  • платёж на множество интегрированных адресов не может быть проведён одной транзакцией;

  • физические лица предпочитают использовать подадреса, тем не менее если вы используете интегрированные адреса, вы должны позволить Monero сгенерировать такие интегрированные адреса для вас (а не делать самостоятельно, используя свои ID платежей).

Ссылки


Что такое доказательство работы (POW)?


Доказательство работы (PoW) является механизмом легитимизации не являющейся доверенной стороны

Как именно работает доказательство?

Доказательство работы — это криптографическое доказательство того, что не являющаяся доверенной сторона потратила значительные вычислительные ресурсы на решение искусственной задачи.

Технически «доказательством» является решение имеющейся задачи.

Всё сводится к легитимизации не являющейся доверенной стороны

Как не являющаяся доверенной сторона в сети интернет может добиться какого-либо уровня доверия?

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

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

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

В противном случае работа была бы бесполезной

Работа над решением и само решение «вычислительно сложной задачи» не имели бы никакого смысла без доказательства по использованию соответствующих ресурсов.

Если ваша работа приносит пользу где-то ещё, то это не является доказательством использования вами определённых вычислительных ресурсов.

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

Строгая асимметрия

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

Работа должна быть сложной. В то же самое время верификация доказательства должна обходиться без особых затрат (с точки зрения вычислительных ресурсов).

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


Доказательство работы в криптовалютах


Доказательство работы является защитным механизмом, не позволяющим произвести атаку Сивиллы

Доказательство работы защищает от атаки Сивиллы

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

Если было применено пороговое голосование, работа схемы будет тут же нарушена, так как ничто не мешает отдельно взятому пользователю создать произвольное количество псевдонимов и решить таким образом результат голосования. В случае с распределёнными системами такое явление известно как «атака Сивиллы».

Во избежание подобного сценария криптовалютами используется доказательство работы. Для реализации схемы PoW неважно количество участников. Важен объём задействованных вычислительных ресурсов.

Такую схему, безусловно, гораздо сложнее обойти: чтобы нарушить её, злоумышленнику придётся контролировать большую часть (более 50%) таких вычислительных ресурсов. На практике подобный контроль будет необходимо удерживать в течение длительного периода времени.

Доказательство работы — механизм выбора победителя

В распределённых системах «выбор лидера» является процессом определения, какой из узлов отвечает за координирование (временное) системы.

В случае с криптовалютами PoW используется для определения узла, являющегося «победителем» по очередному блоку.

Применение PoW, в случае с выбором лидера, стало одним из ключевых решений, реализованных Bitcoin.

Конкурирующие узлы (называемые «майнерами») работают над решением искусственной задачи. Время от времени один из них находит решение. Шансы линейно пропорциональны задействованной вычислительной мощи.

Победитель использует своё решение, чтобы «подписать» собранный блок. Сетью принимаются только блоки с правильными решениями.

За свою работу победитель также получает вознаграждение. Вознаграждение представляет собой определённую сумму в криптовалюте, созданную «из воздуха» и для себя. Победитель также получает все комиссии с транзакций, входящих в этот блок.

Сложность задачи PoW динамически регулируется сетью. Цель состоит в том, чтобы блоки открывались с постоянной частотой (обычно каждую пару минут).


CryptoNight


CryptoNight является хеш-функцией, требующей задействования большого объёма памяти.

Основы

Алгоритм CryptoNight был разработан примерно в 2013 году в рамках протокола CryptoNote.

Изначально цель состояла в том, чтобы алгоритм могли использовать обычные серийные CPU. Это достигалось путём:

  • использования «родного» AES шифрования;
  • использования быстрых 64-битных мультипликаторов;
  • использования блокнотной памяти, точно подходящей под размер кэша третьего уровня (L3) для каждого ядра на CPU Intel (примерно 2 Мб).

Более амбициозная цель разработки заключалась в том, чтобы сделать вычисления посредством схем ASIC неэффективным. Цель достигнута не была, как и в случае со всеми другими алгоритмами, направленными на противодействие использованию ASIC. Эффективная схема ASIC, работающая с CryptoNight, была разработана в 2017 году компанией Bitmain.

Проект Monero начал использовать CryptoNight в качестве алгоритма доказательства работы в 2014. С тех пор алгоритм постепенно развивался, при этом намеренно сводилась к нулю какая-либо совместимость данного алгоритма с выпускаемыми ASIC. В настоящее время Monero использует версию CryptoNight v2. Это третья итерация оригинального алгоритма CryptoNight (v0, v1, v2).

Цель: найти хеш с достаточно малым значением

В случае с алгоритмами доказательства работы, в основе которых лежит хеширование, цель состоит в нахождении хеша с достаточно малым значением.

Хеш представляет собой целое число (как правило, это довольно большое число). Большинство хеш-функций выдаёт 256-битные хеши (целые числа от 0 до 2^256). Так обстоит и в случае с двойным хешем SHA-256, используемым Bitcoin, и CryptoNight у Monero.

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

Так как хеш-функции являются необратимыми (односторонними), вводные данные не подаются аналитическому вычислению, что позволило бы получить хеш с достаточно малым значением. Решение достигается путём прямого перебора, обработки данных и многократного вычисления хешей. Майнеры не так уж и много могут сделать с входящими данными, но, что самое важное, они могут итеративно искать значение нонса. Также они могут решать, какие транзакции будут включены в блок и как они будут «укладываться» в дерево Меркла.

Криптографические примитивы

В основе CryptoNight лежат:

  • AES шифрование;
  • 5 хеш-функций, каждая из которых стала «финалистом» конкурса SHA-3, проводимого Национальным институтом науки и техники США (NIST):
    • Keccak (основная функция)
    • BLAKE
    • Groestl
    • JH
    • Skein

Входные данные

В случае с Monero входные данные представляют собой совокупность, состоящую из:

  • упорядоченного заголовка блока (примерно 46 байтов; могут быть в формате varint-представления);
  • корня дерева Меркла (32 байта);
  • ряда транзакций, включённых в блок (примерно 1-2 байта; могут быть в формате varint-представления).

Для получения дополнительной информации см. функцию get_block_hashing_blob() function to dig further.

Алгоритм

Внимание!
Настоящая статья призвана дать читателю глубокое понимание алгоритма CryptoNight. Чтобы ещё глубже понять аспекты реализации, следует ознакомиться со Стандартом CryptoNote и исходным кодом Monero. В конце статьи приводятся соответствующие ссылки.

Обзор

CryptoNight пытается сделать доступ к памяти «узким местом», ограничивающим производительность («ограничение по памяти»). Цель достигается в три этапа:

  1. Инициализация большой области памяти при помощи псевдослучайных данных. Этот вид памяти известен как блокнотная память.
  2. Выполнения множества операций чтения/записи по псевдослучайным (но детерминированным) адресам блокнотной памяти.
  3. Хеширование всей блокнотной памяти для получения итогового значения.

Этап 1. Инициализация блокнотной памяти

Сначала входные данные хешируются при помощи Keccak-1600. В результате получаются 200 байт псевдослучайных данных (1600 бит = 200 байт).

Эти 200 байт становятся начальным числом, на основе которого при помощи 256-AES шифрования генерируется больший буфер псевдослучайных данных размером 2 Мб.

Первые 0..31 байт хеша Keccak-1600 используются в качестве ключа AES.

128 байт полезной информации шифруются до тех пор, пока не будет достигнут размер, составляющий 2 Мб. Первой полезной информацией являются байты 66..191 хеша Keccak-1600. Следующей полезной информацией являются результаты шифрования предшествующей полезной информации.

Каждые 128 байт полезной информации шифруются 10 раз.

Более подробно со всеми нюансами проблема описана в разделе «Инициализация блокнотной памяти» Стандарта CryptoNote.

Этап 2. Цикл с жёстким использованием памяти

Второй этап предполагает 524 288 итераций простого stateful-алгоритма.

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

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

Среди прочих есть такие специфические операции, как AES, XOR, 8byte_mul, 8byte_add, которые отлично подходят для CPU (то есть они предельно оптимизированы для использования с современными CPU).

В данном случае цель состоит в том, чтобы сделать время ожидания памяти «узким местом», позволяющим свести на нет разницу между потенциальным использованием схем ASIC и CPU общего назначения.

Этап 3. Хеширование

На последнем этапе (этапе упрощения) происходит следующее:

  • результат применения оригинального хеша Keccak-1600 объединяется со всей блокнотной памятью;
  • берётся алгоритм хеширования, основанный на 2 битах низкого порядка:
    • 0=BLAKE-256
    • 1=Groestl-256
    • 2=JH-256
    • 3=Skein-256
  • результат хешируется при помощи выбранной функции.

Полученный 256-битный хеш является окончательным результатом использования алгоритма CryptoNight.

Специфичные для Monero модификации

CryptoNight v0

Так сообщество Monero называет оригинальную версию алгоритма CryptoNight.

CryptoNight v1

См. отличие от исходного кода.

CryptoNight v2

См. обоснование и отличие от исходного кода.

CryptoNight v3 aka CryptoNightR

См. обоснование и отличие от исходного кода.

Критика

  • Хеш CryptoNight относительно сложен для верификации. Это создаёт риск с точки зрения возможности проведения DoS атаки на узлы с использованием недействительных доказательств процесса. См. требование к строгой асимметрии.
  • Хеш-функция была разработана с нуля и прошла ограниченный независимый анализ. Несмотря на то, что CryptoNight состоит из доказавших свою надёжность и прошедших независимый анализ примитивов, но объединение безопасных примитивов вовсе не означает создания безопасной криптосистемы.
  • В конечном счёте CryptoNight не обеспечил должного уровня противодействия ASIC.
  • Сложность CryptoNight сводит на нет его конкурентоспособность относительно производства ASIC.

Доказательство работы CryptoNight остаётся одним из самых противоречивых аспектов Monero.

Ссылки


RandomX


RandomX — это алгоритм доказательства работы, разработанный контрибьюторами Monero и используемый Monero начиная с версии 0.15.

Данный инновационный алгоритм оптимизирован под CPU, а в основе его работы лежит выполнение случайного кода и применение других технологий, требующих большого объёма памяти. Задача RandomX состоит в том, чтобы исключить возможность использования специализированного оборудования (например, ASIC) для майнинга Monero. RandomX был создан с целью поддержания децентрализации майнинга и более эгалитарного распределения вознаграждений за вычисление блоков.

Спецификации и информацию о разработке RandomX можно найти в репозитории GitHub, а также в статье, посвященной RandomX, написанной рабочей группой Monero Outreach. Указанная статья содержит больше сведений об истории RandomX и о связи этого алгоритма с Monero.


Мультиподпись


В случае с криптовалютами мультиподпись (multisig) позволяет подписывать транзакции, используя более одного приватного ключа. Средства, защищённые мультиподписью, могут быть потрачены, только если для подписания имеется «M из N» ключей.

Вот некоторые примеры использования этой схемы:

  • совместно используемый счёт (1 из 2; муж и жена — оба обладают полным доступом к средствам);
  • согласованно используемый счёт (2 из 2; муж и жена должны согласовать трату средств);
  • «пороговый» счёт (2 из 3; в качестве независимой третьей стороны привлекается эскроу-служба, которая подписывает транзакцию либо вместе с продавцом, либо с покупателем, если продавцу и покупателю не удаётся договориться);
  • безопасный счёт (2 из 3; один владелец контролирует все три ключа, но обеспечивает их безопасность различными средствами, чтобы диверсифицировать риски);
  • произвольный пороговый счёт (M из N; некоторые криптовалюты обеспечивают совершенную гибкость с точки зрения количества подписантов).

Мультиподпись Monero

Monero не использует мультиподписи напрямую (по крайней мере в классическом понимании этой схемы). В данном случае схема multisig имитируется путём секретного разделения.

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

Давайте рассмотрим схему «2 из 3». У нас есть три участника. Каждый из участников получает по два приватных ключа, при этом пары не повторяются между участниками. Таким образом, пара участников вместе обладает всеми тремя приватными ключами, необходимыми для создания приватного ключа траты.

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

Также стоит отметить, что в случае Monero multisig-адреса отсутствуют как таковые. Структура адреса никак не зависит от того, как был создан лежащий в её основе приватный ключ траты.

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

Настройка multisig-кошелька

Схема multisig может использоваться только при использовании кошелька с поддержкой командной строки (CLI). Перед тем как вы решите воспользоваться мультиподписью, следует изучить, как работает CLI-кошелёк.

Давайте возьмём в качестве примера схему «2 из 3», поскольку она представляет собой универсальный случай.

0. Откройте кошелёк

Зайдите в свой кошелёк (в отладочной (stagenet) сети):

./monerod --stagenet --daemon                     # Запустите полный узел; убедитесь в том, что он полностью синхронизирован.  
./monero-wallet-cli --stagenet --wallet-file=...  # Запустите ваш кошелёк; убедитесь, что в нём есть доступные средства.  

1. Подготовка к созданию multisig-кошелька

Каждый из участников независимо генерирует данные инициализации, не являющиеся адресом.

Каждый участник по безопасному каналу «вручную» отправляет свои данные инициализации всем остальным участникам.

2. Создание multisig-кошелька

Каждый участник использует данные инициализации, полученные от других участников. В результате происходит второй раунд задействования данных инициализации. Но по-прежнему это ещё не адрес.

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

3. Окончание создания multisig-кошелька

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

Следует отметить, что действия всех участников симметричны. Даже несмотря на то, что в качестве примера нами была рассмотрена схема «2 из 3», каждый участник сотрудничает со всеми остальными участниками. Разделение секрета производится внутри кошелька.

Участники вручную безопасно совместно используют данные инициализации. Сам по себе кошелёк не обеспечивает какого-либо безопасного канала связи. Такая задача не ставится.

Получение средств

Адрес, созданный при настройке multisig-кошелька, будет таким же, как и любой другой адрес.

На его основе вы можете сгенерировать интегрированные адреса и подадреса.

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

Для просмотра входящих платежей при использовании CLI-кошелька следует использовать следующие команды:

address
refresh
show_transfers

Трата средств

Данный материал находится в процессе написания.

Ссылки


Основная сеть, отладочная сеть и тестовая сеть


У Monero есть три отдельные сети и три блокчейна: основная сеть (mainnet), отладочная сеть (stagenet) и тестовая сеть (testnet). В каждом блокчейне имеется собственный генезис-блок, и он полностью изолирован от остальных. Также отдельными являются и соответствующие p2p сети.

Основная сеть (mainnet)​

Основная сеть является «производственным» и основным блокчейном.

Основная сеть — это единственный блокчейн, в котором XMR имеют ценность.

Основная сеть — это именно та сеть, которую люди имеют в виду по умолчанию.

По умолчанию также используются следующие TCP порты:

  • 18080 — p2p сеть;
  • 18081 — JSON-RPC сервер;
  • 18082 — ZMQ сервер.

Отладочная сеть (stagenet)​

Отладочная сеть — это то, что необходимо, чтобы безопасно изучать Monero.

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

Чтобы начать пользоваться отладочной сетью, необходимо сделать следующее:

По умолчанию используются следующие TCP порты:

  • 38080 — p2p сеть;
  • 38081 — JSON-RPC сервер;
  • 38082 — ZMQ сервер.

Отладочная сеть появилась в марте 2018 года как часть версии Monero 0.12.0.0.

Тестовая сеть (testnet)​

Обычному пользователю вместо этой сети следует пользоваться отладочной сетью. Тестовая сеть предназначена для разработчиков.

Тестовая сеть — это «экспериментальная» сеть и блокчейн, где всё появляется ещё до того, как попадёт в основную сеть.

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

Чтобы начать пользоваться тестовой сетью, необходимо сделать следующее:

По умолчанию используются TCP порты:

  • 28080 — p2p сеть;
  • 28081 — JSON-RPC сервер;
  • 28082 — ZMQ сервер.

Приватная тестовая сеть

Вы также можете создать собственную приватную версию тестовой сети.

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

Ознакомьтесь с руководством по созданию приватной тестовой сети.

Почему монеты в отладочной и тестовой сети не имеют никакой ценности?​

Если основная сеть и отладочная эквивалентны, то почему только монеты из основной сети имеют ценность?

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


MoneroPulse


Что такое MoneroPulse?​

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

Таким образом, MoneroPulse, по сути, позволяет избежать разветвлений блокчейна в результате ошибок в протоколе консенсуса (как в этом случае, произошедшем в 2014).

Фактически, операторы MoneroPulse могут указывать, какой форк они считают действительным. Технически указываемой ими «контрольной точкой» являются хеш и высота блока.

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

Пользователи также могут установить автоматическую проверку контрольных точек в monerod, используя опцию --enforce-dns-checkpointing. В случае несоответствия monerod «откатит» локальный блокчейн на несколько блоков. В конечном счёте альтернативный («исправленный») форк станет «тяжелее» и узел последует ему, оставив «недействительный» форк. Данную опцию рекомендуется использовать с автоматическими полными узлами.

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

DNS как основа MoneroPulse

Контрольные точки сохраняются как TXT-записи DNS в доменах, контролируемых операторами.

Вот как можно получить доступ к контрольным точкам, используя любой DNS-клиент:

Пример:

dig -t txt checkpoints.moneropulse.net +dnssec

В результате получаем:

(cut)

;; ANSWER SECTION:
checkpoints.moneropulse.net. 299 IN  TXT  "1288616:875ac1bc7aa6c5eedc5410abb9c694034f9e7f79dce4c60698baf37009cb6365"
checkpoints.moneropulse.net. 299 IN  TXT  "375000:c80c23e387585e12ffb6649d678e9ba328181797b9583a6d8911b77e25375737"
checkpoints.moneropulse.net. 299 IN  TXT  "325000:4260d56368267bc2a70dd58d73c5ecf23b4e4d96e63c29a868e4a679b0741c7f"
checkpoints.moneropulse.net. 299 IN  TXT  "233000:4f69bec2af6c0852412bdd10c19e6af10c8d738fe2618b5511a98efd03ab477e"
checkpoints.moneropulse.net. 299 IN  TXT  "450000:4d098b511ca97723e81737c448343cfd4e6dadb3d8a0e757c6e4d595e6e48357"
checkpoints.moneropulse.net. 299 IN  TXT  "250000:f59d31839bd909ec8830b4f7f66ff213f0bd006334c8523daee452725e5c7a79"
checkpoints.moneropulse.net. 299 IN  TXT  "550000:c2e80a636438bd9f7a7ab432a6ad297e35540d80ff5b868bca098124cad2ff8c"
checkpoints.moneropulse.net. 299 IN  TXT  "650000:1d567f2b491324375a825895c5e7b52857b38e4fed0e42c40909c2d52240b4e0"
checkpoints.moneropulse.net. 299 IN  TXT  "800000:2ced10aa85357ab6c14bb12b6b56d1dde28940820dda30911b73a5cc9a301760"
checkpoints.moneropulse.net. 299 IN  TXT  "850000:00e2b557dde9fd4a9e2e3dd7ddac962f5ca475eb1095bc50aa757fd1218ab0a5"
checkpoints.moneropulse.net. 299 IN  TXT  "900000:d9958d0e7dcf91a5a7b11de225927bf7efc6eb26240315ce12372be902cc1337"
checkpoints.moneropulse.net. 299 IN  TXT  "913193:5292d5d56f6ba4de33a58d9a34d263e2cb3c6fee0aed2286fd4ac7f36d53c85f"
checkpoints.moneropulse.net. 299 IN  TXT  "913269:f8302e6b8ba1c49aad9a854b8d6c79d8272c6239dcbba5a75ed0784c1d4f56a1"
checkpoints.moneropulse.net. 299 IN  TXT  "350000:74da79f6a136969abd6364bd3d37af273c408d6471e8ab598e80569b42415f86"
checkpoints.moneropulse.net. 299 IN  TXT  "400000:1b2b0e7a30e59691491529a3d506d1ba3d6052d0f6b52198b7330b28a6f1b6ac"
checkpoints.moneropulse.net. 299 IN  TXT  "500000:2428f0dbe49796be05ed81b347f53e1f7f44aed0abf641446ec2b94cae066b02"
checkpoints.moneropulse.net. 299 IN  TXT  "600000:f5828ebf7d7d1cb61762c4dfe3ccf4ecab2e1aad23e8113668d981713b7a54c5"
checkpoints.moneropulse.net. 299 IN  TXT  "700000:12be9b3d210b93f574d2526abb9c1ab2a881b479131fd0d4f7dac93875f503cd"
checkpoints.moneropulse.net. 299 IN  TXT  "300000:0c1cd46df6ccff90ec4ab493281f2583c344cd62216c427628990fe9db1bb8b6"
checkpoints.moneropulse.net. 299 IN  RRSIG  TXT 13 3 300 20180922151845 20180920131845 35273 moneropulse.net. 8CyqtsM2f9o6OHZYqtGPVf+8gcFM+eUyoMi29LlkcLtK1AXbZlKqCcdN NvdvB+4OzepmpTanSc+TbLWbz/sIzA==

Следует отметить наличие подписи DNSSEC в конце.

Контрольные точки дублируются на нескольких DNS-серверах:

Основная сеть (Mainnet):

checkpoints.moneropulse.se
checkpoints.moneropulse.org
checkpoints.moneropulse.net
checkpoints.moneropulse.co

Отладочная сеть (Stagenet):

stagenetpoints.moneropulse.se
stagenetpoints.moneropulse.org
stagenetpoints.moneropulse.net
stagenetpoints.moneropulse.co

Тестовая сеть (Testnet):

testpoints.moneropulse.se
testpoints.moneropulse.org
testpoints.moneropulse.net
testpoints.moneropulse.co

MoneroPulse как вектор атаки

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

В случае удачного взлома MoneroPulse злоумышленник сможет остановить работу всех автоматических узлов, выдавая им фальшивые контрольные точки. Этому частично препятствуют DNSSEC и использование множества доменов. Monero предполагает соответствие всех контрольных точек во всех доменах. Таким образом, взлом одного домена или регистратора не повлечёт за собой какого-либо сбоя.

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

Кто является оператором MoneroPulse?

Операторами MoneroPulse являются выбранные ведущие разработчики.

«ВНИМАНИЕ! Не было получено двух действительных DNS записей контрольных точек MoneroPulse» (WARNING: no two valid MoneroPulse DNS checkpoint records were received). Что делать в этом случае?​

Это означает, что используемый вами DNS-сервер не подтверждает флаг +dnssec, необходимый для безопасного запроса контрольных точек.

По умолчанию операционная система использует DNS-сервер вашего поставщика интернет-услуг (ISP).

Чтобы исправить положение, вам необходимо либо изменить DNS-сервер в целом в сетевых настройках вашей системы, либо только для monerod.

Многие предпочитают использовать DNS-серверы Google или Cloudfare, а не те, что предлагаются ISP.

DNS-сервер Google:

DNS_PUBLIC=tcp://8.8.8.8 ./monerod

DNS-сервер Cloudfare:

DNS_PUBLIC=tcp://1.1.1.1 ./monerod

Ссылки