SHiNE Test Publisher
Автономный publisher заранее подготовленных постов в существующий канал SHiNE.
Что делает
- публикует следующий элемент
queue/jokes.jsonчерез случайный интервал; - создаёт настоящий SHiNE Frame v1 + подписанный Ed25519 ANS-104 DataItem;
- отправляет его обычной операцией
AddBlockна SHiNE-server; - хранит прогресс в
state.jsonи продолжает после рестарта; - перед отправкой сохраняет
pending, поэтому падение между отправкой и записью state не должно съедать или дублировать элемент очереди; - при расхождении head цепочки с state останавливается вместо создания форка;
- очередь по умолчанию НЕ зациклена.
В комплекте 60 заранее подготовленных нейтральных коротких анекдотов/шуток.
Требования
Python 3.11+.
python3 -m venv .venv
. .venv/bin/activate
pip install -r requirements.txt
Настройка
cp config.example.json config.json
Заполнить:
server_ws— WebSocket SHiNE-server;blockchain_name— активная цепочка тестового пользователя;channel_name— имя существующего канала (его canonical slug = lowercase);channel_root_block_number— номер CREATE_CHANNEL этого канала;key_file— Solana JSON blockchain key пользователя;- интервалы публикации.
Ключ должен соответствовать owner активной blockchain. Реальный ключ не класть в git, права рекомендуется chmod 600.
При первом запуске state.json отсутствует: publisher читает head цепочки и последний POST канала с сервера и создаёт state автоматически.
Проверка
.venv/bin/python publisher/publisher.py status --config config.json
status при первом запуске также инициализирует state.
Принудительно опубликовать следующий пост:
.venv/bin/python publisher/publisher.py publish-now --config config.json
Обычный режим:
.venv/bin/python publisher/publisher.py run --config config.json
systemd
Скопировать каталог в /opt/shine-test-publisher, создать venv и настроить config.json, затем:
sudo cp systemd/shine-test-publisher.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now shine-test-publisher
journalctl -u shine-test-publisher -f
Service предполагает пользователя shine; поменяйте User= при необходимости.
state.json
Не редактировать при запущенном publisher. В нём сохраняются:
- следующий индекс очереди;
- последний global block/hash;
- последний line number/hash канала;
- время следующей публикации;
pendingдля crash recovery;- общее число опубликованных элементов.
Если очередь закончилась и loop_queue=false, новые посты не создаются. Можно дописать новые элементы в JSON; next_index продолжит движение дальше.