В предыдущей статье о версии 1.2.0 рассказывалось об исправлении ошибок и первом рабочем Docker-образе. Нода начала запускаться не только из исходников на Linux, но и в docker-контейнере.
Новая версия 1.2.1 представляет Graphene уже на Windows. Теперь, чтобы поднять свою ноду вам не нужен ни Linux, ни Docker: достаточно скачать архив, распаковать его и открыть приложение Graphene Node. Оно само запускает ноду, показывает ход синхронизации блокчейна, делает корректную остановку и перезапуск.
Статья состоит из двух частей:
- Часть 1. Graphene Node GUI для Windows: как скачать, запустить и пользоваться приложением, со скриншотами.
- Часть 2. Список исправлений и дополнений в graphene-core 1.2.1: все коммиты релиза с кратким описанием на русском и версии компонентов. Это технические подробности: чтобы просто запустить ноду, вторую часть можно пропустить.
Часть 1. Graphene Node GUI для Windows
Приложение работает на 64-битной Windows 10 и 11 в виде двух программ:
- Graphene Node (
graphene-node-gui.exe): графическое приложение с панелью мониторинга и значком в трее. Оно запускает ноду, показывает ход синхронизации, корректно её останавливает и перезапускает после сбоя. Большинству пользователей нужно именно это. - witness_node (
witness_node.exe): сама нода, та же программа, что и в Linux. Graphene Node запускает её за вас. С ней также можно работать полноценно и самостоятельно из командной строки или PowerShell.

Где взять
Скачайте graphene-node-win64-<версия>.zip из последнего релиза в разделе Assets:
https://github.com/carbon-witness/graphene-core/releases
Если лень искать, вот прямая ссылка:
И распакуйте в отдельную папку, например C:\graphene-core.
В папке будут файлы:
graphene-node-gui.exe: Graphene Node - графическое приложение, которое вы запускаете;witness_node.exe: нода (cli-приложение);WebView2Loader.dll: библиотека, которая отрисовывает окно приложения; держите его рядом сgraphene-node-gui.exe;LICENSE.txt: лицензия MIT.

Установка не требуется: программы лежат в одной папке, а нода хранит блокчейн в каталоге witness_node_data_dir рядом с ними. Выберите диск с запасом свободного места: блокчейн занимает более 9 гигабайт и растёт.
Окно приложения использует Microsoft Edge WebView2, который входит в состав Windows 10 и 11.
Первый запуск
Запустите graphene-node-gui.exe.
Предупреждение безопасности. Программы не подписаны, а Windows помечает файлы, скачанные из интернета, поэтому при первом запуске может появиться предупреждение. Если включён SmartScreen, вы увидите окно «Windows protected your PC» («Система Windows защитила ваш компьютер»): нажмите More info («Подробнее»), затем Run anyway («Выполнить в любом случае»).


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

Приложение сразу запускает ноду, которая создаёт каталог witness_node_data_dir с настройками в файле config.ini, подключается к сид-нодам и начинает загружать блокчейн с первого блока. Панель показывает прогресс и оценку оставшегося времени; полная синхронизация занимает около 10 часов, в зависимости от компьютера и сети.
Значки в трее показывают состояние ноды:
жёлтая точка: нода запускается или синхронизируется;
зелёный «play»: нода работает и синхронизирована;
сине-голубая стрелка: нода перезапускается;
пауза: нода остановлена;
красный крест: сбой, смотрите панель.
Окно приложения

- Sync: насколько нода продвинулась, по времени, с оценкой оставшегося времени, пока она догоняет сеть.
- Block и Irreversible: головной блок ноды и последний блок, который уже не может измениться.
- Behind: насколько отстаёт последний скачанный блок. Синхронизированная нода отстаёт на несколько секунд.
- Blocks per minute: скорость синхронизации. Синхронизированная нода получает блоки по мере их создания сетью, несколько десятков в минуту.
- Time to sync: сколько времени нужно ноде, чтобы догнать сеть, при текущей скорости; прочерк - когда она синхронизирована.
- RPC: локальный адрес API ноды для кошельков и программ на этом компьютере. copy копирует его в буфер обмена.
- Data folder: где лежат блокчейн,
config.iniи логи. open открывает папку в Проводнике. - Peers: с каким количеством узлов держит соединение нода.
Journal (журнал)

Полноценный лог ноды, заполняется по мере выполнения. Раскрашен по уровням, как в консоли Linux: предупреждения жёлтым, ошибки голубым, блоки белым. Фильтр по уровню и поиск сужают вывод; Blocks показывает полученные блоки таблицей. Open log открывает сам файл лога.
Seeds and Peers (сиды и пиры)

Default seeds — встроенный список сидов, у которых нода в первую очередь запрашивает адреса других узлов. А так же те, что добавили в config.ini. Для каждого сида показан статус: connected (подключено), was connected (было подключение), connection failed (не удалось подключиться), rejected us (нас отклонили), handshake failed (ошибка рукопожатия) или not tried yet (ещё не пробовали). При наведении курсора на статус ошибки, можно увидеть причину ошибки.
Add seed добавляет ноду в видеhost:port. Она записывается в config.ini в папке данных как seed-node = host:port и сразу передаётся работающей ноде. У сидов, добавленных таким образом есть ссылка remove (удалить).
Peers — узлы, к которым нода подключена сейчас, с указанием их релиза и сборки. Нода поддерживает до 20 подключений; сколько их будет, зависит от того, сколько узлов сейчас доступно.
Settings (настройки)

- Path to witness_node.exe и Data folder: пути на диске в файлу ноды и каталогу с данными. Значения по умолчанию следуют за приложением, поэтому всю папку можно перемещать или копировать; если очистить поле, вернётся значение по умолчанию.
- RPC address: по умолчанию
127.0.0.1:8090, доступен только с этого компьютера. Любой другой адрес открывает API ноды в сеть. - Start the node with the app и Start with Windows: запускать ноду вместе с приложением, добавить в автозагрузку (запуск в трее).
- Language: языки - английский или русский.
Самая нижняя строка: версия приложения и сборка ноды.
Версии также указаны на вкладке «Подробно» в свойствах каждого exe-файла.

Параметры ноды, которых нет на странице настроек, например ключ витнеса или P2P-порт, находятся в config.ini в папке данных. Они вступают в силу при следующем запуске ноды (Restart).
Закрытие и остановка
При закрытии окна - приложение спрашивает: остановить ноду и выйти или оставить ноду работать в фоне (а приложение в трее).

Меню значка в трее (правой кнопкой мыши) показывает состояние ноды, а так же: открывает панель, запускает, останавливает и перезапускает ноду; копирует адрес RPC; открывает папку данных или лог; и выходит из приложения.

Нода всегда останавливается корректно: сначала она сохраняет на диск базу данных, что занимает несколько секунд. Следующий запуск продолжается с того места, где нода остановилась, без обработки всей цепочки. Это проверено для любого способа остановки:
- Stop, Restart и Quit (stop the node) в приложении;
- выключение, перезагрузка или выход из Windows: приложение останавливает ноду до того, как выключится Windows;
- Ctrl+C или закрытие окна консоли, когда нода работает в cli-режиме.
Если графическое приложение упадёт или закроется, нода продолжит работу. При следующем запуске gui-приложение снова её найдёт.
Подключение RuDEX-UI (Graphene-UI) к своей локальной ноде
UI-приложение может работать через вашу собственную ноду вместо публичной: так оно будет общаться с сетью через ваш компьютер, с малой задержкой локального подключения. Как это сделать в приложении RuDEX:
- Дождитесь, пока нода синхронизируется (зелёный значок): нода, которая ещё догоняет сеть будет либо не доступна, либо будет помечаться как не синхронизированная.
- Откройте Settings, затем Nodes, затем вкладку Personal и нажмите Add node.
- Задайте любое имя и введите адрес из строки RPC на панели (copy копирует его в буфер обмена):
ws://127.0.0.1:8090. Далее Confirm. - После нажмите на значок соединения напротив вашего узла.

UI должен подключиться к вашей ноде, которая перейдёт в режим Active Node с задержкой в несколько миллисекунд; панель внизу показыважет её имя и блок. Оставьте Automatically select node выключенным, иначе приложение может переключиться на публичную ноду.

UI-приложению нужна работающая нода: если вы её останавливаете, выберите другую ноду в списке или включите Automatically select node.
Работа с witness_node.exe
witness_node.exe — консольная программа, которая принимает все те же параметры, что и нода в Linux. Пример:
witness_node.exe --data-dir C:\Graphene\witness_node_data_dir --rpc-endpoint 127.0.0.1:8090
witness_node.exe --version выводит релиз и сборку. Ctrl+C корректно её останавливает.
Каталог с данными блокируется при старте ноды. Если запустить копию, она откажется работать с сообщением «Another witness_node (PID …) is already using the data directory» и завершится с кодом 3.
Если что-то не так
- «No blocks from the network», нет пиров. Нода не может связаться с другими нодами. Проверьте брандмауэр и антивирус: они должны разрешать
witness_node.exeисходящие подключения. В корпоративной сети обратитесь к администратору; некоторые сети обрывают подключения к нодам за рубежом. Добавьте доступную ноду через Add seed. Включите VPN, в RU-сегменте зарубежные ноды могут быть не доступны. В следующих версиях это планируется исправить. - Сиды остаются в статусе handshake failed. Подключение открывается, но затем обрывается, обычно связано с блокировкой трафика в антивирусе или корпоративном шлюзе. Требуется разрешить работу
witness_node.exeили добавить доступные сиды. - «Data folder in use by another node». Ту же папку использует другой
witness_node.exe. Не запускайте более 1 копии ноды в папке. - «The node's API has not answered» на вкладке Seeds and Peers. Нода занята обработкой блоков во время синхронизации. Сообщение пропадёт, когда нода полностью синхронизируется.
- Нода постоянно падает. Причину показывают журнал и Last event на панели.
Если хотите сообщить о проблеме, приложите:
logs\default\default.logиlogs\p2p\p2p.logиз папки данных;%APPDATA%\org.graphene.node-gui\gui.log, в котором фиксируются выключения Windows.
Файлы и папки
witness_node_data_dir\: блокчейн,config.ini,logs\;witness_node_data_dir\config.ini: параметры ноды, включая добавленные сиды;witness_node_data_dir\witness_node.lock: блокировка рабочего каталога, удерживается работающей нодой; не удаляйте;witness_node_data_dir\graphene-node-gui.lock: сведения о ноде, которую запустило приложение: её PID, адрес RPC и пароль приложения к API. По ним приложение после перезапуска находит уже работающую ноду;witness_node_data_dir\graphene-node-gui-api.json: права доступа к API ноды, которые записывает приложение: обычный анонимный доступ плюс учётная запись приложения, которой разрешён API сети. Через эту учётную запись приложение получает списки сидов и пиров. Файл появляется, только еслиconfig.iniне задаёт свойapi-access;%APPDATA%\org.graphene.node-gui\settings.json: настройки приложения;%APPDATA%\org.graphene.node-gui\gui.log: что делало приложение при выключениях Windows;HKCU\Software\Microsoft\Windows\CurrentVersion\Run,Graphene Node: запись в реестре, по которой Windows при входе в систему запускает приложение в трее. Она появляется, когда включена настройка «Start with Windows», и удаляется, когда её выключают.
Сборка
Готовый архив из релиза собирать не нужно. Этот раздел — для тех, кто хочет скомпилировать программы из исходников самостоятельно.
Оба приложения собираются на Linux (проверено на Ubuntu) кросс-компиляцией, Windows для сборки не нужна.
witness_node.exeсобирается компилятором MinGW-w64 в один статический файл, которому нужны только DLL из состава Windows. Сначалаcontrib/win64/build-deps.shодин раз собирает зависимости (Boost 1.90, OpenSSL 3.5, zlib, curl), это около 30 минут. Затемcontrib/win64/build.shсобирает саму ноду. Wine нужен только чтобы запускать вспомогательные программы сборки. Подробно: contrib/win64/README.md.- Graphene Node (
graphene-node-gui.exe) написан на Rust с Tauri 2 и собирается командойcargo build --release --target x86_64-pc-windows-gnuв папкеgui/. Рядом с ним в архив кладётсяWebView2Loader.dll. Тесты приложения выполняются под Wine. Подробно: gui/README.md. - Архив
graphene-node-win64-<версия>.zipсобирает workflowwindowsна GitHub: при каждом пуше и pull request он собирает обе программы, прогоняет тесты, проверяет запускwitness_node.exe --versionпод Wine и сохраняет архив как артефакт. При теге релизаgraphene-X.Y.Zархив прикрепляется к релизу.
Команды сборки и то, как устроена кросс-сборка, описаны в разделе «Сборка под Windows» второй части.
Часть 2. Список исправлений и дополнений в graphene-core 1.2.1
Компоненты
- carbon-witness/graphene-core: ветка
graphene,graphene-1.2.1; - carbon-witness/graphene-fc: ветка
graphene,f592269; - carbon-witness/websocketpp: ветка
graphene,571a7b0; - carbon-witness/editline: ветка
graphene,224e256; - carbon-witness/secp256k1-zkp: ветка
graphene,bd06794.
websocketpp, editline и secp256k1-zkp не менялись.
Коммиты
graphene-core
265d67cawitness_node: add --shutdown-event and --parent-pid on Windows — опции для Windows, чтобы приложение могло корректно остановить ноду: по именованному событию и при завершении родительского процесса.f9fbd272contrib/win64: cross-build witness_node.exe with MinGW-w64 — скрипты кросс-сборкиwitness_node.exeна Linux компилятором MinGW-w64.deafaf2econtrib/win64: add the MinGW-w64 toolchain file — файл toolchain для CMake: компиляторы MinGW-w64 с-posix, статическая линковка, Wine как эмулятор.96b9a3f8contrib/win64: keep the fc fixes as a patch — исправления библиотеки fc для MinGW сохранены отдельным патчем.0db8e60afc: build with MinGW-w64 for 64-bit Windows — подмодуль fc переведён на версию, которая собирается MinGW-w64 под 64-битную Windows.30f5cabewitness_node: exit cleanly when the console window is closed on Windows — нода корректно останавливается при закрытии окна консоли.e9cb6290app: refuse P2P blocks during shutdown and let applied ones finish — во время остановки нода не принимает новые блоки из P2P и дожидается применения уже принятых; исправляет падение при остановке во время синхронизации.bf3be87cwitness: keep private keys out of private-key parse errors — приватные ключи больше не попадают в сообщения об ошибках разбора записиprivate-key.e67fa481gui: tray supervisor and dashboard for witness_node on Windows — первая версия приложения: супервизор ноды в трее и панель мониторинга.8eabcc73gui: languages, Linux-coloured journal, close dialog, second-node guard — языки интерфейса, журнал с раскраской как в консоли Linux, диалог при закрытии окна, защита от второй ноды.3bc569e5Stop the node quickly from the GUI; log each shutdown step — быстрая остановка ноды из приложения; нода пишет в лог каждый шаг остановки.8cfd0956gui: node and data paths follow the app's folder — пути к ноде и папке данных по умолчанию следуют за папкой приложения.97a33742gui: an error box with OK when the node cannot start — окно с ошибкой и кнопкой OK, если нода не может запуститься.f7c6755cgui: check for a conflicting node before the window opens — проверка на конфликтующую ноду до открытия окна.434a6541witness_node: refuse to start on a data directory another node is using — нода отказывается запускаться на папке данных, которую уже использует другая нода, и завершается с кодом 3.90d7c2b9gui: a node refused for a data folder in use is not a crash — отказ ноды из-за занятой папки данных не считается падением.5da5c17cwitness_node: keep the window open on a startup error after a double-click — окно консоли не закрывается при ошибке запуска, если ноду запустили двойным щелчком.9769c15bgui: graphene-node-gui.exe, player glyphs, start with Windows — исполняемый файл названgraphene-node-gui.exe, значки как у проигрывателя, запуск вместе с Windows.e24ffd79witness_node: end the process right after a clean shutdown on Windows — на Windows процесс ноды завершается сразу после корректной остановки, а не зависает.65d9659egui: end a node that logged its shutdown but did not exit — приложение завершает ноду, которая записала в лог окончание остановки, но не завершилась.f09c18b4gui: larger tray glyphs; a plain yellow disc while starting or syncing — значки в трее крупнее; во время запуска и синхронизации показывается жёлтый круг.4e889b31gui: restart glyph during a restart; the window shows the tray's glyph — во время перезапуска показывается значок перезапуска; окно показывает тот же значок, что и трей.7ae59024gui: the syncing glyph is a yellow dot inside the white circle — значок синхронизации стал жёлтой точкой внутри белого круга.5749bcdfgui: remove the tray icon before the app exits — значок убирается из трея до выхода из приложения, а не висит там до наведения мыши.e6cfb6d6gui: bound the journal's blocks table like the raw feed — таблица блоков в журнале ограничена по числу строк, как и сам лог.948743d0gui: stop the node cleanly when Windows shuts down, restarts or logs off — корректная остановка ноды при выключении, перезагрузке и выходе из Windows.d9f066a8witness_node: ask Windows to end the node last at shutdown — нода просит Windows завершать её последней при выключении.0549560agui: stop the node on WM_QUERYENDSESSION; log the session end — приложение останавливает ноду по сигналу о завершении сеанса Windows и записывает каждый шаг вgui.log.40801f47gui: update the tray tooltip and menu only when they change — подсказка и меню трея обновляются, только когда меняются.a0f241dcdocs: release notes for 1.2.1 — описание релиза 1.2.1.141fbe84version: 1.2.1 — версия ноды поднята до 1.2.1.beb85c68ci: cross-build the Windows package — CI собирает пакет для Windows.31cce138ci: save the Windows build caches even when a later step fails — кэши сборки для Windows сохраняются, даже если следующий шаг упал.d38074a3gui: Peers tab; 0 % for a fresh node; say when no blocks arrive — вкладка пиров; 0 % для новой ноды; сообщение, когда блоки из сети не приходят.286e080cgui: the peers table is as tall as its rows — высота таблицы пиров по числу строк.d80c6afeShow each peer's release: build string in the user agent, Version column — релиз каждого пира: строка сборки в user agent ноды и колонка Version в таблице пиров.9827b115gui: Seeds and Peers tab; seeds added to config.ini; Build column — вкладка Seeds and Peers; добавленные сиды записываются вconfig.ini; колонка Build.d6149ef9gui: show why a seed failed, not just "unspecified"; seed form in one row — причина ошибки сида вместо «unspecified»; форма добавления сида в одну строку.8f5f6a6dgui: the seeds table's header no longer floats over the peers table — заголовок таблицы сидов больше не наезжает на таблицу пиров.ff7fea71gui: split a stalled handshake into columns in the seeds table — сведения о зависшем рукопожатии разнесены по колонкам таблицы сидов.3f96c8d3gui: a seed in the middle of its handshake is not a failed one — сид, у которого идёт рукопожатие, не считается ошибочным.8df4f189gui: seeds table ends at Last attempt for now — таблица сидов пока заканчивается колонкой Last attempt.1dbd49c7gui: recognise the 1.1 carbon build (fc a108c380) — приложение распознаёт carbon-сборку 1.1 (fca108c380).435e8c5fdocs: the 1.1 carbon build in the 1.2.1 notes — carbon-сборка 1.1 упомянута в описании релиза 1.2.1.47885942gui: fewer false "API has not answered" alerts — меньше ложных предупреждений «API has not answered».169eed6egui: show d5a98f9a as the 1.2.0 carbon build — сборкаd5a98f9aпоказывается как carbon-сборка 1.2.0.116d9710gui: days in full; estimated time to sync — дни пишутся словом, а не буквой d; показывается расчётное время до синхронизации.4d74cee4gui: the "API has not answered" alert only on the Seeds and Peers tab — предупреждение «API has not answered» показывается только на вкладке Seeds and Peers.79abf5cbWindows version resources: witness_node 1.2.1, Graphene Node 1.0.0 — версии в свойствах файлов Windows: witness_node 1.2.1, Graphene Node 1.0.0.3e1e4f3ewitness_node: Graphene contributors in the version resource's copyright — Graphene contributors в строке авторских прав в свойствахwitness_node.exe.480f4ca9LICENSE: add the Graphene contributors; ship LICENSE.txt in the Windows zip — Graphene contributors добавлены в лицензию;LICENSE.txtвходит в zip-архив для Windows.b7759766docs: wording of the Windows zip contents — уточнено описание состава архива для Windows.5d9e91bedocs: list every commit of the branch in the 1.2.1 notes — в описание релиза 1.2.1 внесены все коммиты ветки.75360026ci: a failed upload to the build cache no longer fails the Docker build — сбой загрузки в кэше сборки больше не ломает сборку Docker-образа.
graphene-fc
ac00004Build with MinGW-w64 for 64-bit Windows — библиотека fc собирается MinGW-w64 под 64-битную Windows.9706c96log: write the level into file appender lines — в строках файлового лога указан уровень сообщения.f592269websocket: a server shutdown no longer hangs or touches a destroyed server — остановка websocket-сервера больше не зависает и не обращается к уже уничтоженному серверу.
Заключение
С выходом версии 1.2.1 персональная нода Graphene перестаёт быть задачей только для тех, у кого есть Linux-сервер. На Windows вам достаточно скачать архив из релиза, распаковать его и запустить Graphene Node: приложение само синхронизирует ноду, следит за ней и корректно останавливает её, в том числе при выключении компьютера. А подключив к ней UI-приложение, вы будете работать с сетью через собственную ноду, вместо публичных.
Пользователям Linux и Docker сборок, версия 1.2.1 тоже полезна. Нода больше не падает и не зависает при остановке, приватные ключи не попадают в лог, а две ноды теперь не могут одновременно работать с одной папкой данных и повредить её базу.
Приглашаю всех желающих к тестированию. Если что-то не работает, пишите в комментариях.
Работа на этом не заканчивается, следующая версия уже готовится.




